/* 爱好者员工工作台 —— 深色 FUI 科技风（PC + 手机双端）
 * =====================================================================
 * 设计系统结构（20260924e 重组）
 *   1. Tokens   —— :root 设计变量（颜色 / 字号 --fs-* / 间距 --sp-* / 圆角 / 阴影）
 *   2. Base     —— reset / body / 滚动条
 *   3. 登录      —— .login-*
 *   4. 布局      —— .app / .side / .nav / .main / .topbar / .content
 *   5. 通用组件   —— .card / .btn / .tag / table / .seg / .stat / .toast / .modal 等
 *   6. 看板      —— .board / .col / .tcard / .prog
 *   7. 图表      —— .chart-row / .donut / .line-wrap / .pf-grid
 *   8. 移动端    —— @media(max-width:768px) + .mtab / .drawer
 *   9. 业务区块   —— 日历 / 任务表 / 台账 / 老师窗口 / 命令面板 / 驾驶舱
 *  10. 日间模式   —— body.light（整体翻转 token）
 * 规则：token 只在 :root / body.light 定义；组件一律 var() 引用，
 *       禁止硬编码色值 / 字号 / 间距（改样式先改 token）。
 * ===================================================================== */
:root{
  --bg:#080d15; --bg2:#0c131f; --panel:#101a29; --panel2:#16223a;
  --line:rgba(0,229,255,.14); --line2:rgba(0,229,255,.28);
  --cyan:#00e5ff; --cyan-d:#00a8bd;
  --text:#dbe7f3; --muted:#7d90a8;
  --danger:#ff4d6d; --warn:#ffb020; --ok:#22e6a0; --purple:#8b7cff;
  --track:#0a121d; /* 图表轨道/输入框底等「凹陷面」：20260924a 起禁止硬编码，日间模式随主题切换 */
  --card:var(--panel); --bd:var(--line); --accent:var(--cyan); /* P0-1：补全 .tpl-card/.mdd/多选下拉弹层引用的未定义 token（兼修暗色下多选弹层白底） */
  --r:10px; --sh:0 0 0 1px rgba(0,229,255,.06), 0 8px 24px rgba(0,0,0,.35);
  color-scheme: dark; /* 整体暗色 scheme：浏览器原生下拉/滚动条/表单全部用深色 */
  /* ===== 字号规模 --fs-*（20260924e）：与 DESIGN.md 字阶表对应 ===== */
  --fs-1:10px; --fs-2:11px; --fs-3:12px; --fs-4:13px; --fs-5:14px;
  --fs-6:15px; --fs-7:16px; --fs-8:18px; --fs-9:20px; --fs-10:22px;
  --fs-11:24px; --fs-12:26px; --fs-13:28px; --fs-14:36px;
  --fs-15:9px; --fs-16:17px; /* 规模外精确值 token（20260924f 全量收口，值不变） */
  /* ===== 间距规模 --sp-*（20260924e 起）：主步 4/6/8/10/12/14/16/18/20/24/30/36/40px ===== */
  --sp-1:4px; --sp-2:6px; --sp-3:8px; --sp-4:10px; --sp-5:12px;
  --sp-6:14px; --sp-7:16px; --sp-8:18px; --sp-9:20px; --sp-10:24px;
  --sp-11:30px; --sp-12:36px; --sp-13:40px;
  --sp-14:5px; --sp-15:7px; --sp-16:9px; --sp-17:11px; --sp-18:13px; --sp-19:15px;
  --sp-20:26px; --sp-21:76px; --sp-22:1px; --sp-23:2px; --sp-24:3px; /* 规模外精确值 token（20260924f 全量收口，值不变） */
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  background:
    radial-gradient(1200px 600px at 80% -10%, rgba(0,229,255,.07), transparent 60%),
    radial-gradient(900px 500px at -10% 110%, rgba(139,124,255,.06), transparent 60%),
    var(--bg);
  color:var(--text); font:var(--fs-5)/1.6 "Microsoft YaHei","PingFang SC",-apple-system,sans-serif;
}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:rgba(0,229,255,.22);border-radius:8px}
::-webkit-scrollbar-track{background:transparent}

/* ===== 无障碍：键盘焦点环（20260924e） =====
   仅 Tab 键聚焦时显示，鼠标点击不显示；青色描边统一可见，便于键盘操作。 */
.btn:focus-visible,.nav a:focus-visible,.drawer a:focus-visible,
.stat.click:focus-visible,.tcard:focus-visible,.pf-card:focus-visible,
.chip:focus-visible,.item:focus-visible,.tpl-card:focus-visible,
.cmdk-i:focus-visible,.led .fix .s:focus-visible,.umj-ro-link:focus-visible,
.umj-tch:focus-visible,.rt-item:focus-visible,.rv-item:focus-visible,
.tag:focus-visible,.ms-option:focus-visible,
.uf-blk-new:focus-visible{
  outline:2px solid var(--cyan);outline-offset:2px}

/* ---------- 登录 ---------- */
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:var(--sp-9)}
.login-card{
  width:100%;max-width:400px;background:linear-gradient(160deg,var(--panel),var(--bg2));
  border:1px solid var(--line);border-radius:16px;padding:var(--sp-12) var(--sp-10);box-shadow:var(--sh);
  position:relative;overflow:hidden;
}
.login-card::before{content:'';position:absolute;inset:0 0 auto 0;height:2px;
  background:linear-gradient(90deg,transparent,var(--cyan),transparent)}
.logo{font-size:var(--fs-10);font-weight:700;letter-spacing:2px;text-align:center;margin-bottom:var(--sp-2)}
.logo span{color:var(--cyan);text-shadow:0 0 14px rgba(0,229,255,.6)}
.sub{text-align:center;color:var(--muted);font-size:var(--fs-3);margin-bottom:var(--sp-20);letter-spacing:1px}

/* ---------- 布局 ---------- */
.app{display:flex;min-height:100vh}
.side{width:220px;flex:0 0 220px;background:var(--bg2);border-right:1px solid var(--line);
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh}
.brand{padding:var(--sp-8) var(--sp-8) var(--sp-6);border-bottom:1px solid var(--line)}
.brand b{font-size:var(--fs-7);letter-spacing:1px}
.brand b span{color:var(--cyan)}
.brand small{display:block;color:var(--muted);font-size:var(--fs-2);margin-top:var(--sp-23)}
.nav{flex:1;overflow:auto;padding:var(--sp-4) var(--sp-4) var(--sp-9)}
.nav-grp{color:var(--muted);font-size:var(--fs-2);padding:var(--sp-5) var(--sp-4) var(--sp-2);letter-spacing:1px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;user-select:none}
.nav-grp.collapsed{opacity:.65}
.nav-grp-caret{font-size:var(--fs-1);transition:transform .12s}
/* 20260925z：常用组管理按钮 + 侧栏底部常驻「管理常用」入口 */
.nav-grp-act{cursor:pointer;opacity:.55;font-size:12px;padding:0 2px;transition:.15s}
.nav-grp-act:hover{opacity:1;transform:scale(1.15)}
.nav-manage-fav{display:flex;align-items:center;gap:var(--sp-16);padding:var(--sp-16) var(--sp-5);border-radius:8px;
  color:var(--muted);text-decoration:none;font-size:var(--fs-3);margin-top:var(--sp-23);cursor:pointer;
  border:1px dashed var(--line);opacity:.75;transition:.15s}
.nav-manage-fav:hover{opacity:1;background:rgba(0,229,255,.06)}
.nav-manage-fav .ic{width:18px;text-align:center;font-size:var(--fs-4)}
.nav a{display:flex;align-items:center;gap:var(--sp-16);padding:var(--sp-16) var(--sp-5);border-radius:8px;
  color:var(--text);text-decoration:none;font-size:var(--fs-4);margin-bottom:var(--sp-23);cursor:pointer;
  border:1px solid transparent;transition:.15s}
.nav a:hover{background:rgba(0,229,255,.06);border-color:var(--line)}
.nav a.on{background:linear-gradient(90deg,rgba(0,229,255,.16),rgba(0,229,255,.02));
  border-color:var(--line2);color:#fff;box-shadow:inset 2px 0 0 var(--cyan)}
.nav a.dis{color:var(--muted);cursor:not-allowed}
.nav a.dis:hover{background:none;border-color:transparent}
.nav a .ic{width:18px;text-align:center;color:var(--cyan);font-size:var(--fs-5)}
.nav a.dis .ic{color:var(--muted)}
.nav a .tag{margin-left:auto;font-size:var(--fs-1);color:#5a6b80;border:1px solid var(--line);
  border-radius:4px;padding:0 var(--sp-14)}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{height:56px;display:flex;align-items:center;gap:var(--sp-5);padding:0 var(--sp-9);
  border-bottom:1px solid var(--line);background:rgba(12,19,31,.7);backdrop-filter:blur(8px);
  position:sticky;top:0;z-index:20}
.topbar h1{font-size:var(--fs-7);font-weight:600}
.topbar .right{margin-left:auto;display:flex;align-items:center;gap:var(--sp-4)}
.user-chip{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-14) var(--sp-4);border:1px solid var(--line);
  border-radius:20px;font-size:var(--fs-3);color:var(--muted)}
.user-chip b{color:var(--text);font-weight:600}
.content{padding:var(--sp-8) var(--sp-9) var(--sp-13);flex:1}

/* ---------- 通用组件 ---------- */
.card{background:linear-gradient(180deg,var(--panel),var(--bg2));border:1px solid var(--line);
  border-radius:var(--r);padding:var(--sp-7);margin-bottom:var(--sp-6)}
.card h3{font-size:var(--fs-5);margin-bottom:var(--sp-5);display:flex;align-items:center;gap:var(--sp-3)}
.card h3::before{content:'';width:3px;height:14px;background:var(--cyan);
  box-shadow:0 0 8px var(--cyan);border-radius:2px}
.row{display:flex;gap:var(--sp-5);flex-wrap:wrap;align-items:center}
.grow{flex:1;min-width:0}
.grid{display:grid;gap:var(--sp-5)}
.g2{grid-template-columns:repeat(2,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}
.g5{grid-template-columns:repeat(5,1fr)}
.g6{grid-template-columns:repeat(6,1fr)}
.g7{grid-template-columns:repeat(7,1fr)}

label{display:block;font-size:var(--fs-3);color:var(--muted);margin-bottom:var(--sp-14)}
label .req{color:var(--danger);margin-left:var(--sp-23)}
/* E7（2026-09-11）：字段级必填红框提示 —— 漏填时把校验错误定位到具体字段 */
.field.err input,.field.err select,.field.err textarea{
  border-color:var(--danger);box-shadow:0 0 0 3px rgba(255,77,109,.12)}
.field.err>label{color:var(--danger)}
input,select,textarea{
  width:100%;background:var(--track);border:1px solid var(--line);color:var(--text);
  border-radius:8px;padding:var(--sp-3) var(--sp-4);font-size:var(--fs-4);font-family:inherit;outline:none;transition:.15s;
  -webkit-appearance:none;appearance:none;box-sizing:border-box}
input::placeholder,textarea::placeholder{color:var(--muted);opacity:.6}
input:focus,select:focus,textarea:focus{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(0,229,255,.1);background:#0e1828}
input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus{
  -webkit-text-fill-color:var(--text);-webkit-box-shadow:0 0 0 1000px var(--track) inset;box-shadow:0 0 0 1000px var(--track) inset;caret-color:var(--text)}
input[type=date],input[type=month],input[type=time],input[type=datetime-local]{color-scheme:dark}
textarea{min-height:70px;resize:vertical}
/* select：深色背景 + 自定义青色箭头（避免系统默认箭头看不清） */
select{
  padding-right:var(--sp-11);
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path fill='%2300e5ff' d='M5 6L0 0h10z'/></svg>");
  background-repeat:no-repeat;background-position:right 10px center;background-size:10px 6px;background-color:var(--track)}
select option{background:var(--track);color:var(--text)}
select option:checked{background:#0e1828 linear-gradient(0deg,#0e1828,#0e1828);color:var(--cyan)}
/* 隐藏 number input 的上下箭头，统一风格 */
input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{
  -webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}
/* checkbox / radio 跟随主题 */
input[type=radio]{accent-color:var(--cyan);width:16px;height:16px;cursor:pointer}
/* 复选统一「方框 + 打勾」（2026-09-23 老张口径：这个选项控件要用打勾显示）。
   原先依赖浏览器原生复选框 —— 不同端渲染成圆角/圆形/胶囊，勾态不明显；
   现自绘方框 + ✓，尺寸沿用 16px，与各处既有的 width/height 覆盖规则不冲突。 */
input[type=checkbox]{appearance:none;-webkit-appearance:none;position:relative;flex:none;
  width:16px;height:16px;border:1.5px solid var(--line2);border-radius:3px;
  background:transparent;cursor:pointer;transition:.15s;margin:0;vertical-align:-3px}
input[type=checkbox]:hover{border-color:var(--cyan)}
input[type=checkbox]:checked{background:var(--cyan);border-color:var(--cyan);
  box-shadow:0 0 6px rgba(0,229,255,.35)}
input[type=checkbox]:checked::after{content:'';position:absolute;left:50%;top:47%;
  width:4px;height:8px;border:solid #04212a;border-width:0 2px 2px 0;
  transform:translate(-50%,-52%) rotate(45deg)}
input[type=checkbox]:disabled{opacity:.45;cursor:not-allowed}

/* ---------- 权限分组（员工表单） ---------- */
.perm-group{margin-top:var(--sp-6);padding:var(--sp-5) var(--sp-6);background:rgba(0,229,255,.03);
  border:1px solid var(--line);border-radius:8px}
.perm-group-title{font-size:var(--fs-3);color:var(--cyan);font-weight:600;margin-bottom:var(--sp-4);
  display:flex;align-items:center;gap:var(--sp-3);letter-spacing:.5px}
.perm-group-title::before{content:'';width:3px;height:12px;background:var(--cyan);
  border-radius:2px;box-shadow:0 0 6px var(--cyan)}
.perm-hint{font-size:var(--fs-2);color:var(--muted);font-weight:400;letter-spacing:0}
.perm-row{display:flex;gap:var(--sp-8);flex-wrap:wrap;align-items:center}
.perm-item{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-4);color:var(--text);
  margin:0;cursor:pointer;user-select:none}
.perm-item input{width:16px;height:16px;cursor:pointer;margin:0}

.btn{border:1px solid var(--line2);background:transparent;color:var(--text);
  padding:var(--sp-3) var(--sp-7);border-radius:8px;cursor:pointer;font-size:var(--fs-4);font-family:inherit;
  transition:.15s;white-space:nowrap}
.btn:hover{background:rgba(0,229,255,.08)}
.btn.pri{background:linear-gradient(135deg,var(--cyan),var(--cyan-d));color:#04212a;
  border-color:transparent;font-weight:600;box-shadow:0 0 16px rgba(0,229,255,.28)}
.btn.pri:hover{filter:brightness(1.1)}
.btn.dan{border-color:rgba(255,77,109,.5);color:var(--danger)}
.btn.dan:hover{background:rgba(255,77,109,.12)}
.btn.sm{padding:var(--sp-14) var(--sp-4);font-size:var(--fs-3)}
.btn:disabled{opacity:.45;cursor:not-allowed}

.tag{display:inline-block;padding:var(--sp-23) var(--sp-3);border-radius:20px;font-size:var(--fs-2);
  border:1px solid var(--line);color:var(--muted);white-space:nowrap}
.tag.cyan{color:var(--cyan);border-color:var(--line2);background:rgba(0,229,255,.08)}
.tag.ok{color:var(--ok);border-color:rgba(34,230,160,.4);background:rgba(34,230,160,.1)}
.tag.warn{color:var(--warn);border-color:rgba(255,176,32,.4);background:rgba(255,176,32,.1)}
.tag.dan{color:var(--danger);border-color:rgba(255,77,109,.45);background:rgba(255,77,109,.12)}
.tag.pur{color:var(--purple);border-color:rgba(139,124,255,.4);background:rgba(139,124,255,.1)}
.tag.info{color:#4da3ff;border-color:rgba(77,163,255,.4);background:rgba(77,163,255,.1)}
.tag.teal{color:#2fd6c8;border-color:rgba(47,214,200,.4);background:rgba(47,214,200,.1)}
.tag.gray{color:var(--muted);border-color:var(--line);background:rgba(125,144,168,.08)}
/* 第72批：员工管理表格里的多值标签，横向排列不换行挤压 */
.tagrow{display:flex;flex-wrap:wrap;gap:var(--sp-1)}

table{width:100%;border-collapse:collapse;font-size:var(--fs-4)}
th{text-align:left;color:var(--muted);font-weight:500;font-size:var(--fs-3);padding:var(--sp-4);
  border-bottom:1px solid var(--line2);white-space:nowrap;position:sticky;top:0;background:var(--panel)}
td{padding:var(--sp-4);border-bottom:1px solid rgba(0,229,255,.07)}
tbody tr:hover{background:rgba(0,229,255,.04)}
.tbl-wrap{overflow:auto;max-height:70vh}

.seg{display:inline-flex;background:var(--track);border:1px solid var(--line);border-radius:8px;padding:var(--sp-23)}
.seg button{border:none;background:transparent;color:var(--muted);padding:var(--sp-14) var(--sp-5);
  border-radius:6px;cursor:pointer;font-size:var(--fs-3);font-family:inherit}
.seg button.on{background:rgba(0,229,255,.16);color:var(--cyan);font-weight:600}
/* 第P1批：日报保存/提交栏（桌面端正常流，移动端在 @media 内吸底） */
.dp-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:14px}

.stat{background:linear-gradient(160deg,var(--panel2),var(--bg2));border:1px solid var(--line);
  border-radius:var(--r);padding:var(--sp-6) var(--sp-7)}
.stat .k{color:var(--muted);font-size:var(--fs-3)}
.stat .v{font-size:var(--fs-12);font-weight:700;margin-top:var(--sp-1);letter-spacing:1px}
.stat .v.cyan{color:var(--cyan);text-shadow:0 0 16px rgba(0,229,255,.4)}
.stat .v.dan{color:var(--danger)}
.stat .v.warn{color:var(--warn)}
.stat .v.ok{color:var(--ok)}

.empty{text-align:center;padding:var(--sp-13) var(--sp-9);color:var(--muted)}
.empty .ic{font-size:var(--fs-14);opacity:.35;margin-bottom:var(--sp-3)}

/* ---------- 6. 看板 ---------- */
.board{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sp-5);align-items:start}
.col{background:var(--bg2);border:1px solid var(--line);border-radius:var(--r);
  min-height:200px;display:flex;flex-direction:column;max-height:72vh;overflow:hidden}
.col h4{padding:var(--sp-17) var(--sp-6);font-size:var(--fs-4);border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:var(--sp-3)}
.col h4 .n{margin-left:auto;font-size:var(--fs-2);color:var(--muted)}
.col .body{padding:var(--sp-4);flex:1;min-height:80px;overflow-y:auto;
  scrollbar-width:thin;scrollbar-color:var(--line2) transparent}
.col .body::-webkit-scrollbar{width:6px}
.col .body::-webkit-scrollbar-thumb{background:var(--line2);border-radius:3px}
.col .body::-webkit-scrollbar-track{background:transparent}
.col.drop{background:rgba(0,229,255,.06);border-color:var(--line2)}
.tcard{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:var(--sp-4) var(--sp-5);
  margin-bottom:var(--sp-16);cursor:grab;transition:.15s}
.tcard:hover{border-color:var(--line2);transform:translateY(-1px)}
.tcard.overdue{border-color:rgba(255,77,109,.45);background:rgba(255,77,109,.06)}
.tcard .t{font-size:var(--fs-4);font-weight:600;margin-bottom:var(--sp-2);line-height:1.4}
.tcard .m{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center;font-size:var(--fs-2);color:var(--muted)}
.tcard .prog{height:3px;background:var(--track);border-radius:2px;margin-top:var(--sp-3);overflow:hidden}
.tcard .prog i{display:block;height:100%;background:linear-gradient(90deg,var(--cyan),var(--purple))}
/* 第93批：通用进度条（看板卡片等非 .tcard 场景） */
.prog{height:6px;background:var(--line);border-radius:3px;overflow:hidden}
.prog i{display:block;height:100%;background:linear-gradient(90deg,var(--cyan),var(--purple))}

/* ---------- 弹窗 ---------- */
.mask{position:fixed;inset:0;background:rgba(4,8,14,.72);backdrop-filter:blur(3px);
  display:none;align-items:center;justify-content:center;z-index:100;padding:var(--sp-7)}
.mask.on{display:flex}
.modal{background:linear-gradient(180deg,var(--panel),var(--bg2));border:1px solid var(--line2);
  border-radius:14px;width:100%;max-width:620px;box-shadow:var(--sh);display:flex;flex-direction:column;
  max-height:90vh}
.modal .mh{padding:var(--sp-19) var(--sp-8);border-bottom:1px solid var(--line);display:flex;align-items:center}
.modal .mh b{font-size:var(--fs-6)}
.modal .mh .x,.helpwin .mh .x{margin-left:auto;cursor:pointer;color:var(--muted);font-size:var(--fs-9);line-height:1;
  display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;margin-right:-10px;
  border-radius:10px;transition:background .15s,color .15s;touch-action:manipulation;user-select:none}
.modal .mh .x:active,.helpwin .mh .x:active{background:rgba(255,255,255,.14);color:#fff}
.modal .mb{padding:var(--sp-8);overflow:auto;flex:1}
.modal .mf{padding:var(--sp-5) var(--sp-8);border-top:1px solid var(--line);display:flex;gap:var(--sp-4);justify-content:flex-end}
/* 第85批：大弹窗 + 月度活动表格（小字体/列宽按字段长度） */
.modal.lg{max-width:900px}
.modal.xl{max-width:1240px}
.modal.full{max-width:min(1600px,96vw)}
.gm-tbl{font-size:var(--fs-3);min-width:1120px;table-layout:fixed}
.gm-tbl th{padding:var(--sp-2) var(--sp-2);font-size:var(--fs-3);line-height:1.3}
.gm-tbl td{padding:var(--sp-14) var(--sp-2);vertical-align:top}
.gm-tbl input,.gm-tbl select{font-size:var(--fs-3);padding:var(--sp-14) var(--sp-2);width:100%;box-sizing:border-box}
.gm-tbl input[type=date]{padding:var(--sp-1) var(--sp-14)}
.gm-tbl .gm-opt{font-weight:400;font-size:var(--fs-1);color:var(--muted);margin-top:var(--sp-23)}
.gm-tbl th .req,th .req{color:var(--danger);margin-left:var(--sp-23)}
.gm-tbl input.err,.gm-tbl select.err{border-color:var(--danger);box-shadow:0 0 0 2px rgba(255,77,109,.12)}
.field{margin-bottom:var(--sp-6)}

/* ---------- 5. 通用组件 / Toast（换行支持已并入基础定义 · 20260924e） ---------- */
.toast{position:fixed;top:20px;left:50%;transform:translateX(-50%) translateY(-20px);
  background:var(--panel2);border:1px solid var(--line2);color:var(--text);padding:var(--sp-4) var(--sp-9);
  border-radius:8px;z-index:200;opacity:0;transition:.25s;font-size:var(--fs-4);pointer-events:none;
  white-space:pre-line;max-width:70vw;text-align:left}
.toast.on{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.ok{border-color:rgba(34,230,160,.5);box-shadow:0 0 20px rgba(34,230,160,.15)}
.toast.err{border-color:rgba(255,77,109,.5);box-shadow:0 0 20px rgba(255,77,109,.15)}

.chips{display:flex;gap:var(--sp-2);flex-wrap:wrap}
.chip{padding:var(--sp-1) var(--sp-4);border:1px solid var(--line);border-radius:16px;font-size:var(--fs-3);
  cursor:pointer;color:var(--muted);user-select:none}
.chip.on{border-color:var(--cyan);color:var(--cyan);background:rgba(0,229,255,.12)}

/* ---------- 第69批：多选下拉控件 MultiSelect ---------- */
.ms{position:relative;display:block;min-width:160px}
.ms-input{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-1);min-height:36px;
  padding:var(--sp-14) var(--sp-3);border:1px solid var(--line);border-radius:8px;background:var(--panel2);
  cursor:pointer;transition:.15s}
.ms-input:hover,.ms.open .ms-input{border-color:var(--cyan)}
.ms-input .ms-tag{display:inline-flex;align-items:center;gap:var(--sp-1);padding:var(--sp-24) var(--sp-3);
  border:1px solid var(--cyan);border-radius:14px;background:rgba(0,229,255,.12);
  color:var(--cyan);font-size:var(--fs-3);line-height:1;max-width:100%}
.ms-input .ms-tag .ms-x{cursor:pointer;font-weight:700;font-size:var(--fs-4);padding:0 var(--sp-23);
  border-radius:50%;line-height:1}
.ms-input .ms-tag .ms-x:hover{background:rgba(0,229,255,.25)}
.ms-input .ms-placeholder{color:var(--muted);font-size:var(--fs-4);padding:var(--sp-24) var(--sp-1)}
.ms-input .ms-caret{margin-left:auto;padding:0 var(--sp-1);font-size:var(--fs-2);line-height:1;
  color:var(--muted);transition:transform .15s,color .15s;flex-shrink:0}
.ms.open .ms-input .ms-caret{transform:rotate(180deg);color:var(--cyan)}
/* 共享：多选组件弹层定位基类（实际打开时由 positionMSPanel 改 fixed） */
.ms-panel{position:absolute;left:0;right:0;top:calc(100% + 4px)}
.ms-panel{z-index:150;
  background:var(--panel);border:1px solid var(--line2);border-radius:8px;
  box-shadow:0 6px 22px rgba(0,0,0,.18);max-height:280px;display:none;overflow:hidden}
.ms.open .ms-panel{display:flex;flex-direction:column}
.ms-search{padding:var(--sp-3);border-bottom:1px solid var(--line);flex-shrink:0}
.ms-search input{width:100%;padding:var(--sp-2) var(--sp-4);border:1px solid var(--line);border-radius:6px;
  background:var(--panel2);color:var(--text);font-size:var(--fs-4);outline:none}
.ms-search input:focus{border-color:var(--cyan)}
.ms-list{flex:1;overflow-y:auto;padding:var(--sp-1) 0;min-height:36px}
.ms-empty{padding:var(--sp-6);text-align:center;color:var(--muted);font-size:var(--fs-4)}
.ms-option{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-4) var(--sp-5);cursor:pointer;
  font-size:var(--fs-4);min-height:44px;color:var(--text);transition:.1s}
.ms-option:hover{background:var(--panel2)}
.ms-option.on{color:var(--cyan)}
.ms-option input[type="checkbox"]{width:16px;height:16px;cursor:pointer;accent-color:var(--cyan)}
.ms-option .ms-meta{color:var(--muted);font-size:var(--fs-2);margin-left:auto}
.ms-hint{font-size:var(--fs-2);color:var(--muted);margin-top:var(--sp-1);padding:0 var(--sp-23)}
.ms-hint.err{color:#ff4d6d}

.item{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:var(--sp-5) var(--sp-6);
  margin-bottom:var(--sp-16);display:flex;gap:var(--sp-5);align-items:flex-start}
.item.od{border-color:rgba(255,77,109,.45);background:rgba(255,77,109,.06)}
.item .tt{flex:1;min-width:0}
.item .tt b{font-size:var(--fs-4);font-weight:600}
.item .tt p{color:var(--muted);font-size:var(--fs-3);margin-top:var(--sp-24)}
.item .act{display:flex;gap:var(--sp-2);flex-wrap:wrap}

/* ---------- 可点击统计卡（下钻明细） ---------- */
.stat.click{cursor:pointer;position:relative;transition:.15s}
.stat.click:hover{border-color:var(--line2);transform:translateY(-2px);box-shadow:0 6px 18px rgba(0,229,255,.08)}
.stat.click .go{position:absolute;right:10px;top:10px;font-size:var(--fs-2);color:var(--muted);opacity:0;transition:.15s}
.stat.click:hover .go{opacity:1;color:var(--cyan)}
.stat.click .s{font-size:var(--fs-2);color:var(--muted);margin-top:var(--sp-24)}

/* ---------- 图表 ---------- */
.chart-row{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-5);margin-bottom:var(--sp-5)}
.chart-row .card{margin-bottom:0}
.donut-wrap{display:flex;align-items:center;gap:var(--sp-8);flex-wrap:wrap}
.donut{width:120px;height:120px;flex:0 0 120px}
.donut .dv{fill:var(--text);font-size:var(--fs-9);font-weight:700}
.donut .dl{fill:var(--muted);font-size:var(--fs-1)}
.legend{flex:1;min-width:150px}
.legend .lg{display:flex;align-items:center;gap:var(--sp-3);font-size:var(--fs-3);color:var(--text);margin-bottom:var(--sp-2)}
.legend .lg i{width:9px;height:9px;border-radius:2px;flex:0 0 9px}
.legend .lg b{margin-left:auto;color:var(--cyan);font-weight:600}
.line-wrap{width:100%}
.line-wrap svg{width:100%;height:auto;display:block}
.pf-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--sp-4)}
.pf-card{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:var(--sp-5) var(--sp-6);cursor:pointer;transition:.15s}
.pf-card:hover{border-color:var(--line2);background:var(--panel2)}
.pf-card .pn{font-weight:600;font-size:var(--fs-4);display:flex;align-items:center;gap:var(--sp-2)}
.pf-card .nums{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-3);font-size:var(--fs-2);color:var(--muted)}
.pf-card .nums b{color:var(--text);font-weight:600}
.pf-card .nums .up{color:var(--ok)}
.pf-empty{grid-column:1/-1;text-align:center;color:var(--muted);padding:var(--sp-10)}

/* 费用规则提示卡片（看板列滚动已并入上方「6. 看板」区块 · 20260924e 去重） */
.tcard .fee-tip{display:flex;align-items:center;gap:var(--sp-2);margin-top:var(--sp-2);padding:var(--sp-14) var(--sp-3);
  border-radius:6px;font-size:var(--fs-2);font-weight:500}
.tcard .fee-tip.lock{background:rgba(255,77,109,.10);color:var(--danger);border:1px solid rgba(255,77,109,.3)}
.tcard .fee-tip.free{background:rgba(80,200,120,.10);color:#5acb86;border:1px solid rgba(80,200,120,.3)}
.tcard .fee-tip.dim{color:var(--muted);background:var(--bg2);border:1px solid var(--line)}
.tcard .fee-lock{margin-left:auto;font-size:var(--fs-1);padding:var(--sp-22) var(--sp-2);background:rgba(255,77,109,.2);border-radius:8px;color:var(--danger);font-weight:700}
.tcard .fee-free{margin-left:auto;font-size:var(--fs-1);padding:var(--sp-22) var(--sp-2);background:rgba(80,200,120,.2);border-radius:8px;color:#5acb86;font-weight:700}
.tcard.overdue .fee-tip{opacity:.85}

/* ---------- 组织架构树 ---------- */
.tree{font-size:var(--fs-4)}
.tnode{margin:var(--sp-24) 0}
.tnode-row{
  display:inline-flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) var(--sp-5);
  border-radius:8px;cursor:pointer;background:var(--panel);
  border:1px solid var(--line);transition:.12s;min-width:220px;user-select:none}
.tnode-row:hover{border-color:var(--line2);background:var(--panel2)}
.tcaret{
  display:inline-block;width:12px;text-align:center;color:var(--cyan);
  font-size:var(--fs-15);transition:transform .15s}
.tcaret.empty{color:var(--muted);cursor:default}
.tnode:not(.open)>.tnode-row>.tcaret{transform:rotate(90deg)}
.tnode:not(.open)>.tnode-children{display:none}
.tnode-children{margin-left:var(--sp-6);padding-left:var(--sp-7);border-left:1px dashed rgba(0,229,255,.22);margin-top:var(--sp-1);padding-top:var(--sp-23);padding-bottom:var(--sp-23)}
.tname{font-weight:600;color:var(--text)}
.troot-sep{font-size:var(--fs-2);color:var(--muted);margin:var(--sp-5) 0 var(--sp-1);letter-spacing:1px}

/* ---------- 移动端 ---------- */
.mtab{display:none}
/* 🔄 刷新按钮：仅移动端显示（桌面用 F5），第P0批 HCI 修复①——员工提交后能看到新数据 */
.m-refresh{display:none}
@media(max-width:860px){
  .m-refresh{display:inline-flex;align-items:center;justify-content:center;min-width:40px;min-height:40px;font-size:16px}
  .app{flex-direction:column}
  .side{display:none}
  .content{padding:var(--sp-5) var(--sp-5) var(--sp-21)}
  .topbar{height:50px;padding:0 var(--sp-6)}
  .topbar h1{font-size:var(--fs-6)}
  .g2,.g3,.g4,.g5,.g6,.g7{grid-template-columns:1fr}
  .board{grid-template-columns:1fr}
  .chart-row{grid-template-columns:1fr}
  .pf-grid{grid-template-columns:1fr}
  .tbl-wrap{overflow-x:auto;max-height:none}
  table{min-width:640px}
  /* ===== 包D-D6（2026-09-11）：表格转卡片列表 =====
     JS 会在渲染后自动从 thead 为每个 td 补 data-label，
     因此这一套 CSS 对全部页面生效，页面本身零改动。
     排除 .cal（待办日历，属网格布局，卡片化会破坏语义）。 */
  .tbl-wrap table:not(.cal){min-width:0;display:block}
  .tbl-wrap table:not(.cal) thead{display:none}
  .tbl-wrap table:not(.cal) tbody{display:block}
  .tbl-wrap table:not(.cal) tr{display:block;border:1px solid var(--line);
    border-radius:8px;padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-4);background:rgba(0,229,255,.02)}
  .tbl-wrap table:not(.cal) tr:hover{background:rgba(0,229,255,.05)}
  .tbl-wrap table:not(.cal) td{display:flex;gap:var(--sp-4);align-items:flex-start;
    padding:var(--sp-14) 0;border-bottom:1px dashed rgba(0,229,255,.1);font-size:var(--fs-4);white-space:normal}
  .tbl-wrap table:not(.cal) td:last-child{border-bottom:none}
  .tbl-wrap table:not(.cal) td::before{content:attr(data-label);flex:0 0 84px;
    color:var(--muted);font-size:var(--fs-3);line-height:1.6}
  .tbl-wrap table:not(.cal) td:not([data-label])::before,
  .tbl-wrap table:not(.cal) td[colspan]::before{display:none}
  .tbl-wrap table:not(.cal) td[colspan]{justify-content:center;text-align:center}
  .tbl-wrap table:not(.cal) th{position:static}
  table.cal{min-width:0}
  .mtab{display:flex;position:fixed;bottom:0;left:0;right:0;height:60px;background:rgba(12,19,31,.96);
    backdrop-filter:blur(10px);border-top:1px solid var(--line);z-index:50}
  .mtab a{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:var(--sp-23);color:var(--muted);text-decoration:none;font-size:var(--fs-2)}
  .mtab a.on{color:var(--cyan)}
  .mtab a .ic{font-size:var(--fs-8)}
  .modal{max-width:100%;max-height:92vh}
  .card{padding:var(--sp-5)}
  .drawer{position:fixed;inset:0;background:var(--bg2);z-index:80;overflow:auto;padding:var(--sp-7);display:none}
  .drawer.on{display:block}
}

/* ===== 待办日历视图 ===== */
table.cal{table-layout:fixed;min-width:0}
table.cal th,table.cal td{border:1px solid var(--line)}
table.cal th{padding:var(--sp-3);font-size:var(--fs-3);color:var(--muted);text-align:center;font-weight:600}
td.cc{height:92px;vertical-align:top;padding:var(--sp-1);cursor:pointer;background:var(--bg)}
td.cc:hover{background:rgba(0,229,255,.05)}
td.cc.td{background:rgba(0,229,255,.08)}
td.out{background:var(--bg);border:1px solid var(--line)}
.cd{width:22px;height:22px;line-height:22px;text-align:center;border-radius:6px;font-size:var(--fs-3);color:var(--muted);margin-bottom:var(--sp-24)}
.cd.td{background:var(--cyan);color:#001018;font-weight:700}
.ci{font-size:var(--fs-2);color:var(--text);margin:var(--sp-23) 0;padding:var(--sp-23) var(--sp-14);background:var(--panel);border-radius:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}
.ci:hover{background:rgba(0,229,255,.12)}
.cm{font-size:var(--fs-2);color:var(--cyan);margin-top:var(--sp-23);cursor:pointer}

/* ===== 第82批：任务智能表格（列式 / 排序 / 批量） ===== */
.tk-grid{min-width:980px;border-collapse:separate;border-spacing:0}
.tk-grid th,.tk-grid td{padding:var(--sp-3) var(--sp-4);border-bottom:1px solid var(--line);text-align:left;
  font-size:var(--fs-4);white-space:nowrap}
.tk-grid thead th{position:sticky;top:0;z-index:2;background:#0d1626;color:var(--muted);
  font-weight:600;font-size:var(--fs-3)}
.tk-grid tbody tr:hover{background:rgba(0,229,255,.05)}
.tk-grid tr.tk-od{background:rgba(255,77,109,.07)}
.tk-grid tr.tk-od:hover{background:rgba(255,77,109,.13)}
.tk-th{cursor:pointer;user-select:none}
.tk-th:hover{color:var(--cyan)}
.tk-title{cursor:pointer;color:var(--text);font-weight:600}
/* 第84批：任务分组 */
.tk-grp{margin-bottom:var(--sp-5);border:1px solid var(--line);border-radius:10px;overflow:hidden;background:var(--panel)}
.tk-grp-h{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-4) var(--sp-5);cursor:pointer;font-weight:600;font-size:var(--fs-4);
  background:var(--panel2);border-bottom:1px solid var(--line);position:relative}
.tk-grp-h:hover{background:rgba(0,229,255,.06)}
.tk-grp-h .caret{color:var(--muted);font-size:var(--fs-2);width:10px}
.tk-grp-h .n{background:var(--cyan);color:#04121f;border-radius:9px;padding:0 var(--sp-15);font-size:var(--fs-2);font-weight:700}
.tk-grp-bar{position:absolute;left:0;bottom:0;height:2px;width:100%;background:rgba(255,255,255,.06)}
.tk-grp-bar i{display:block;height:100%;background:var(--ok)}
.tk-grp-b{padding:0}
.tk-mini-h{font-size:var(--fs-2);color:var(--muted);padding:var(--sp-2) var(--sp-3);margin:var(--sp-2) 0 var(--sp-1);background:rgba(255,255,255,.04);
  border-radius:5px;font-weight:600;letter-spacing:.2px}
.tk-mini-h b{color:var(--cyan);margin-left:var(--sp-1)}
/* 第84批：日报折叠板块 + 日常打卡 */
.fold summary{cursor:pointer;font-weight:600;font-size:var(--fs-5);padding:var(--sp-23) 0;list-style:none;display:flex;align-items:center;gap:var(--sp-3)}
.fold summary::-webkit-details-marker{display:none}
.fold summary::before{content:'▸';color:var(--muted);font-size:var(--fs-2)}
.fold[open] summary::before{content:'▾'}
.fold[open] summary{margin-bottom:var(--sp-3)}
.rt-list{display:flex;flex-wrap:wrap;gap:var(--sp-3)}
.rt-item{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-15) var(--sp-17);border:1px solid var(--line);
  border-radius:20px;font-size:var(--fs-4);background:var(--panel2);min-height:36px}
.rt-item:hover{border-color:var(--cyan)}
.rt-item.on{background:rgba(34,230,160,.12);border-color:rgba(34,230,160,.45)}
.rt-item.on .rt-n{color:var(--ok);font-weight:600}
.rt-item input[type=checkbox]{width:15px;height:15px;accent-color:var(--cyan);cursor:pointer}
.rt-lb{display:flex;align-items:center;gap:var(--sp-2);cursor:pointer;margin:0}
.rt-item .btn.sm{padding:var(--sp-23) var(--sp-3);font-size:var(--fs-2);min-height:auto;border-radius:12px}
/* 第86批：日常打卡核实面板 */
.rv-user{border:1px solid var(--line);border-radius:8px;padding:var(--sp-3) var(--sp-4);margin-bottom:var(--sp-3);background:var(--panel2)}
.rv-hd{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;margin-bottom:var(--sp-2)}
.rv-list{display:flex;flex-wrap:wrap;gap:var(--sp-2)}
.rv-item{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-14) var(--sp-4);border:1px solid var(--line);
  border-radius:16px;font-size:var(--fs-3);background:var(--panel);cursor:pointer}
.rv-item:hover{border-color:var(--cyan)}
.rv-item.warn{border-color:rgba(255,176,32,.5);background:rgba(255,176,32,.08)}
.rv-item.bad{border-color:rgba(255,77,109,.55);background:rgba(255,77,109,.10)}
.rv-item input[type=checkbox]{width:15px;height:15px;accent-color:var(--cyan);cursor:pointer}
.rv-item .btn.sm{padding:var(--sp-22) var(--sp-15);font-size:var(--fs-2);min-height:auto;border-radius:10px}
/* 第86批：漏交看板 · 部门分组 */
.ms-gh{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) var(--sp-4);margin-bottom:var(--sp-2);
  background:var(--panel2);border:1px solid var(--line);border-radius:8px;font-size:var(--fs-4)}
.ms-gl{display:flex;flex-wrap:wrap;gap:var(--sp-3);padding-left:var(--sp-2)}
.ms-gl .item{margin:0;min-width:220px;flex:1 1 220px}
/* 第86批⑤：安全提示条（危险 / 安全双态，醒目且贴合暗色 UI） */
.alert{display:flex;align-items:flex-start;gap:var(--sp-4);margin-bottom:var(--sp-5);padding:var(--sp-17) var(--sp-6);
  border-radius:8px;font-size:var(--fs-4);line-height:1.7;border:1px solid transparent;border-left-width:4px}
.alert .ai{font-size:var(--fs-7);line-height:1.4}
.alert .ad{color:var(--muted);font-size:var(--fs-3);margin-top:var(--sp-23)}
.alert>div:first-of-type{flex:1}
.alert-dan{background:rgba(255,77,109,.10);border-color:rgba(255,77,109,.45);
  box-shadow:0 0 0 1px rgba(255,77,109,.10),0 0 18px rgba(255,77,109,.12)}
.alert-dan b{color:var(--danger)}
.alert-dan .ad b{color:var(--danger)}
.alert-ok{background:rgba(34,230,160,.10);border-color:rgba(34,230,160,.42)}
.alert-ok b{color:var(--ok)}
/* 注：.alert-info 真定义在下方（rgba(0,229,255,.08)），此处旧引用 --info-* 为死代码，已删（20260924e） */
.tpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--sp-4);margin:var(--sp-2) 0}
.tpl-card{border:1px solid var(--bd);border-radius:10px;padding:var(--sp-4) var(--sp-5);cursor:pointer;transition:.15s;background:var(--card)}
.tpl-card:hover{border-color:var(--accent)}
.tpl-card.sel{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent) inset}
.tpl-name{font-weight:700;margin-bottom:var(--sp-1)}
.tpl-desc{font-size:var(--fs-3);color:var(--muted);margin-bottom:var(--sp-3);line-height:1.4}
.tpl-flags{display:flex;flex-wrap:wrap;gap:var(--sp-1)}
.tpl-manual{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--sp-2);max-height:220px;overflow:auto;margin-top:var(--sp-3)}
.alert-info{background:rgba(0,229,255,.08);border-color:rgba(0,229,255,.38)}
.alert-info b{color:var(--cyan)}
.alert .btn.sm{margin-top:var(--sp-23)}
/* 密码安全列：风险 / 安全 双态标签 */
.pwd-risk{display:inline-block;padding:var(--sp-24) var(--sp-16);border-radius:12px;font-size:var(--fs-2);font-weight:700;
  background:rgba(255,77,109,.16);color:var(--danger);border:1px solid rgba(255,77,109,.55);white-space:nowrap}
.pwd-safe{display:inline-block;padding:var(--sp-24) var(--sp-16);border-radius:12px;font-size:var(--fs-2);font-weight:600;
  background:rgba(34,230,160,.12);color:var(--ok);border:1px solid rgba(34,230,160,.42);white-space:nowrap}
.tk-title:hover{color:var(--cyan);text-decoration:underline}
.mini-prog{height:5px;background:var(--track);border-radius:3px;overflow:hidden;margin-bottom:var(--sp-24)}
.mini-prog i{display:block;height:100%;background:linear-gradient(90deg,var(--cyan-d),var(--cyan))}
.tk-grid td input[type=checkbox]{width:15px;height:15px;accent-color:var(--cyan);cursor:pointer}

/* ===== 第91批：俱乐部经营数据报表 ===== */
.stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:var(--sp-4)}
.stat-grid .stat{padding:var(--sp-17) var(--sp-18)}
.stat-grid .stat .v{font-size:var(--fs-9);letter-spacing:0}
.biz-g2{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-6)}
@media(max-width:1100px){.biz-g2{grid-template-columns:1fr}}
/* 转化漏斗 */
.fnl-row{display:flex;align-items:center;gap:var(--sp-4);margin-bottom:var(--sp-16)}
.fnl-lb{width:44px;font-size:var(--fs-3);color:var(--muted);flex:none}
.fnl-track{flex:1;height:26px;background:rgba(255,255,255,.04);border-radius:6px;overflow:hidden}
.fnl-bar{height:100%;display:flex;align-items:center;justify-content:flex-end;padding-right:var(--sp-16);
  border-left:3px solid;border-radius:0 6px 6px 0;transition:width .4s ease}
.fnl-bar b{font-size:var(--fs-3);color:var(--text)}
.fnl-rate{width:46px;text-align:right;font-size:var(--fs-3);color:var(--cyan);flex:none}
/* 目标达成进度条 */
.pg-track{height:8px;background:var(--track);border-radius:4px;overflow:hidden}
.pg-bar{height:100%;border-radius:4px;transition:width .4s ease}

/* ===== 第83批：活动群聊（员工侧弹窗） ===== */
.ac-body{height:340px;overflow-y:auto;padding:var(--sp-4) var(--sp-5);background:var(--bg2);
  border:1px solid var(--line);border-radius:10px}
.ac-msg{margin-bottom:var(--sp-5);display:flex;flex-direction:column;align-items:flex-start}
.ac-msg .who{font-size:var(--fs-2);color:var(--muted);margin-bottom:var(--sp-1)}
.ac-msg .badge{display:inline-block;margin-left:var(--sp-14);padding:0 var(--sp-2);border-radius:8px;font-size:var(--fs-1);
  background:rgba(139,124,255,.18);color:#b3a9ff}
.ac-msg .badge.c{background:rgba(0,229,255,.14);color:var(--cyan)}
.ac-msg .bubble{display:inline-block;max-width:84%;padding:var(--sp-3) var(--sp-5);border-radius:12px;
  font-size:var(--fs-4);line-height:1.6;word-break:break-word;white-space:pre-wrap;
  background:var(--panel2);border:1px solid var(--line)}
.ac-msg.mine{align-items:flex-end}
.ac-msg.mine .bubble{background:rgba(139,124,255,.14);border-color:rgba(139,124,255,.32)}
.ac-msg.sys{align-items:center}
.ac-msg.sys .bubble{background:transparent;border:none;color:var(--muted);font-size:var(--fs-3);
  max-width:92%;text-align:center}
@media (max-width:860px){
  .tk-grid{min-width:760px}
  .tk-grid thead{display:none}
  #tk-body{overflow-x:auto;-webkit-overflow-scrolling:touch}
  /* 第P0批：分段控件横向滚动，修复自媒体15tab/报告按钮在窄屏溢出截断 */
  .seg{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;flex-wrap:nowrap}
  .seg button{flex:0 0 auto;white-space:nowrap}
  /* 第P1批：日报提交栏吸底，长表单不用滚到底 */
  .dp-actions{position:fixed;left:0;right:0;bottom:60px;z-index:60;display:flex;gap:8px;
    padding:10px 12px;background:var(--bg2);border-top:1px solid var(--line);box-shadow:0 -4px 16px rgba(0,0,0,.35)}
  .dp-actions .btn{flex:1}
  /* 第P2批：表格卡片内小控件放大，提升手机触控命中率 */
  .tbl-wrap table:not(.cal) td button{min-height:34px;padding:6px 10px;font-size:13px}
  .tbl-wrap table:not(.cal) td input[type=checkbox]{width:20px;height:20px;accent-color:var(--cyan);cursor:pointer}
  .rt-item input[type=checkbox],.rv-item input[type=checkbox]{width:20px;height:20px}
  /* 第P2批：裸 table.tbl（含弹窗内审核列表/考核排行/明细）也卡片化，不依赖 .tbl-wrap 包裹 */
  table.tbl:not(.cal){min-width:0;display:block}
  table.tbl:not(.cal) thead{display:none}
  table.tbl:not(.cal) tbody{display:block}
  table.tbl:not(.cal) tr{display:block;border:1px solid var(--line);border-radius:8px;padding:6px 10px;margin-bottom:10px;background:rgba(0,229,255,.02)}
  table.tbl:not(.cal) td{display:flex;gap:10px;align-items:flex-start;padding:5px 0;border-bottom:1px dashed rgba(0,229,255,.1);font-size:14px;white-space:normal}
  table.tbl:not(.cal) td:last-child{border-bottom:none}
  table.tbl:not(.cal) td::before{content:attr(data-label);flex:0 0 84px;color:var(--muted);font-size:12px;line-height:1.6}
  table.tbl:not(.cal) td:not([data-label])::before,table.tbl:not(.cal) td[colspan]::before{display:none}
  table.tbl:not(.cal) td[colspan]{justify-content:center;text-align:center}
}

/* ===== 第150批：高校资料台账（一校一行 · 两级表头 · 冻结首列 · 单元格直改） ===== */
.led-bar{display:flex;gap:var(--sp-3);flex-wrap:wrap;align-items:center;margin-bottom:var(--sp-4)}
.led-dist{display:flex;gap:var(--sp-2);align-items:center;font-size:var(--fs-3);flex-wrap:wrap}
.led-dist .d{padding:var(--sp-24) var(--sp-4);border-radius:14px;border:1px solid var(--line);
  cursor:pointer;color:var(--muted);user-select:none;transition:.12s}
.led-dist .d:hover{border-color:var(--line2);color:var(--text)}
.led-dist .d.on{border-color:var(--cyan);background:rgba(0,229,255,.12);color:var(--cyan);font-weight:600}
.led-dist .d b{margin-left:var(--sp-1);font-weight:700}
.led-wrap{overflow:auto;max-height:calc(100vh - 306px);border:1px solid var(--line);
  border-radius:10px;background:var(--panel);position:relative}
.led{border-collapse:separate;border-spacing:0;font-size:var(--fs-3);white-space:nowrap}
.led th,.led td{padding:var(--sp-14) var(--sp-3);border-bottom:1px solid var(--line);
  border-right:1px solid rgba(0,229,255,.08);text-align:left;vertical-align:middle}
.led thead th{position:sticky;background:#0d1626;color:var(--muted);font-weight:600;z-index:2;
  font-size:var(--fs-2);letter-spacing:.2px}
.led thead tr.gth th{top:0;height:28px;text-align:center;background:var(--track);
  border-bottom:1px solid var(--line2);font-weight:700;letter-spacing:1px}
.led thead tr.gth th.g0{color:var(--muted)}
.led thead tr.gth th.g1{color:#4da3ff}
.led thead tr.gth th.g2{color:var(--cyan)}
.led thead tr.gth th.g3{color:#2fd6c8}
.led thead tr.gth th.g4{color:var(--warn)}
.led thead tr.gth th.g5{color:#b3a9ff}
.led thead tr.gth th.g6{color:var(--ok)}
.led thead tr.cth th{top:28px;border-bottom:1px solid var(--line2)}
.led tbody td{background:var(--panel)}
.led tbody tr:hover td{background:#0e1a2b}
.led tbody tr:nth-child(even) td{background:#0d1725}
.led tbody tr:nth-child(even):hover td{background:#101e30}
/* 冻结首列：学校名 */
.led .fix{position:sticky;left:0;z-index:1;border-right:1px solid var(--line2)}
.led thead .fix{z-index:4;background:var(--track)}
.led tbody .fix{background:var(--panel)}
.led tbody tr:nth-child(even) .fix{background:#0d1725}
.led tbody tr:hover .fix{background:#0e1a2b}
.led .fix .s{font-weight:600;color:var(--text);cursor:pointer;display:block;
  max-width:180px;overflow:hidden;text-overflow:ellipsis}
.led .fix .s:hover{color:var(--cyan);text-decoration:underline}
.led .fix .sub{font-size:var(--fs-1);color:var(--muted);margin-top:var(--sp-23)}
/* 单元格内联编辑 */
.led td .ed{width:100%;min-width:52px;padding:var(--sp-24) var(--sp-14);font-size:var(--fs-3);color:var(--text);
  background:transparent;border:1px solid transparent;border-radius:5px;transition:.12s}
.led td .ed:hover{border-color:var(--line2);background:var(--track)}
.led td .ed:focus{border-color:var(--cyan);background:#0e1828;outline:none;
  box-shadow:0 0 0 2px rgba(0,229,255,.1)}
.led td select.ed{-webkit-appearance:none;appearance:none;cursor:pointer;padding-right:var(--sp-6)}
.led td select.ed option{background:var(--panel);color:var(--text)}
.led td.dirty{background:rgba(255,176,32,.1)!important;box-shadow:inset 0 0 0 1px rgba(255,176,32,.4)}
.led td .ro{color:var(--muted);display:block;max-width:200px;overflow:hidden;text-overflow:ellipsis}
.led td .nil{color:#4a5a70}
.led td .q{color:var(--warn);font-size:var(--fs-1);margin-left:var(--sp-24)}
.led .tagx{display:inline-block;padding:var(--sp-22) var(--sp-15);border-radius:10px;font-size:var(--fs-2);font-weight:600}
.led .lv-S{background:rgba(255,77,109,.16);color:#ff8fa3;border:1px solid rgba(255,77,109,.4)}
.led .lv-A{background:rgba(255,176,32,.14);color:#ffc75e;border:1px solid rgba(255,176,32,.38)}
.led .lv-B{background:rgba(0,229,255,.12);color:var(--cyan);border:1px solid rgba(0,229,255,.32)}
.led .lv-C{background:rgba(125,144,168,.12);color:#9fb0c4;border:1px solid rgba(125,144,168,.3)}
.led .lv-D{background:rgba(255,255,255,.05);color:#6b7c92;border:1px solid rgba(125,144,168,.2)}
/* 底部浮动保存条 */
.led-savebar{position:sticky;bottom:0;left:0;right:0;z-index:6;display:flex;align-items:center;gap:var(--sp-4);
  padding:var(--sp-4) var(--sp-6);margin-top:var(--sp-4);border-radius:10px;
  background:linear-gradient(90deg,rgba(255,176,32,.14),rgba(0,229,255,.1));
  border:1px solid rgba(255,176,32,.45);backdrop-filter:blur(8px)}
.led-savebar .n{font-size:var(--fs-4);font-weight:600;color:var(--warn)}
.led-savebar .g{flex:1}
@media (max-width:860px){
  .led-wrap{max-height:none}
  .led{font-size:var(--fs-2)}
}

/* ===== 第151批：学校专业表（学校→二级学院→专业 · 合并单元格）+ 专业字典 ===== */
/* ⚠️ 第164批：老张「把数据表扩大一些，能看到更多所学校」——
   原 320px 扣减（旧版表下有 7 行 .umj-foot 说明 + 表格上方一行 chips），
   本批把说明条 / 筛选行整块删掉后，扣减收到 214px（表格高 +≈106px，多显示 3~4 行学校）。
    ⚠️ 第165批：老张「3可以」→ 又把「最高专业级别」chips 行挪回工具条（占 ≈30px），
       扣减相应从 214 调到 **244px**（保持表高不变）。以后增删表外元素都要跟着调这个数。 */
.umj-wrap{max-height:calc(100vh - 244px)}
.umj .gth{color:var(--cyan)}
.umj td{padding:var(--sp-1) var(--sp-15);vertical-align:middle}
.umj td.fix .ed{width:calc(100% - 34px);display:inline-block;vertical-align:middle}
.umj-addc{margin-left:var(--sp-1);padding:0 var(--sp-14);height:20px;line-height:18px;font-size:var(--fs-2);flex:none}
.umj-flex{display:flex;align-items:center;gap:var(--sp-24);min-width:0}
.umj-flex>.ed{flex:1 1 auto;min-width:0;width:auto}
.umj-del{color:#ff6b6b;border-color:rgba(255,107,107,.35)}
.umj-del:hover{background:rgba(255,107,107,.15);color:#ff8f8f}
.umj-ro-link{cursor:pointer;color:var(--cyan);border-bottom:1px dashed rgba(0,229,255,.45);white-space:nowrap}
.umj-ro-link:hover{color:#7defff;border-bottom-color:#7defff}

/* ===== 第152批：资料台账三层展开 + 老师/影像官页签 ===== */
.umj-bar{flex-wrap:wrap;row-gap:var(--sp-2)}
.umj-dist-row{flex:0 0 100%;display:flex;align-items:center;flex-wrap:wrap;gap:var(--sp-2);
  padding-top:var(--sp-2);border-top:1px dashed var(--line);font-size:var(--fs-3)}
.umj-dl{color:var(--muted);white-space:nowrap}
.umj-dist-row .d{font-size:var(--fs-3)}
/* 学校行最左的「最高专业级别」色块（点击即按该级别筛选） */
.umj-mlv{flex:none;display:inline-flex;align-items:center;justify-content:center;
  width:20px;height:20px;border-radius:5px;font-size:var(--fs-2);font-weight:700;cursor:pointer;
  background:rgba(255,255,255,.06);color:var(--muted);border:1px solid var(--line)}
.umj-mlv.lv-S{background:rgba(168,85,247,.22);color:#c9a3ff;border-color:rgba(168,85,247,.5)}
.umj-mlv.lv-A{background:rgba(0,229,255,.16);color:#7defff;border-color:rgba(0,229,255,.45)}
.umj-mlv.lv-B{background:rgba(255,193,7,.16);color:var(--warn);border-color:rgba(255,193,7,.45)}
.umj-mlv:hover{filter:brightness(1.25)}
/* 老师/影像官页签的布尔开关 */
.umj-flag{display:inline-block;min-width:20px;text-align:center;cursor:pointer;font-weight:700;
  color:var(--muted);border-radius:4px;padding:0 var(--sp-1)}
.umj-flag.on{color:#4ade80;background:rgba(74,222,128,.14)}
.umj-flag:hover{background:rgba(255,255,255,.08)}
.led td select.ed,.led td input.ed{width:100%;min-width:0}
.led td.ro{background:rgba(255,255,255,.02)}
.umj-lv{display:inline-block;padding:var(--sp-22) var(--sp-15);border-radius:10px;font-size:var(--fs-2);font-weight:600}
.umj-ld{display:block;max-width:170px;overflow:hidden;text-overflow:ellipsis;color:var(--text)}
.umj-foot{font-size:var(--fs-3);color:var(--muted);padding:var(--sp-3) var(--sp-23);line-height:1.7}
.umj-chk{font-size:var(--fs-3);color:var(--muted);display:flex;align-items:center;gap:var(--sp-1);cursor:pointer}
.umj-chk input{accent-color:var(--cyan)}
.umj-add-bar{align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-4);padding:var(--sp-3) var(--sp-4);background:var(--panel);
  border:1px solid var(--line);border-radius:8px;font-size:var(--fs-3)}
.umj-add-bar>span{color:var(--muted);white-space:nowrap}
.umj-tip{font-size:var(--fs-3);color:var(--muted);line-height:1.6;max-width:680px;white-space:normal}
.umj-pick{max-height:44vh;overflow:auto;border:1px solid var(--line);border-radius:8px;padding:var(--sp-1)}
.umj-pick-i{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-14) var(--sp-3);border-radius:6px;
  cursor:pointer;font-size:var(--fs-3);border-bottom:1px solid rgba(255,255,255,.04)}
.umj-pick-i:hover{background:#0e1a2b}
.umj-pick-i input{accent-color:var(--cyan);flex:none}
.umj-pick-i b{color:var(--text);font-weight:600;min-width:152px}
.umj-pick-i i{color:var(--muted);font-style:normal;min-width:72px}
.umj-pick-i em{color:#6b7c92;font-style:normal;font-size:var(--fs-2)}
.umj-dict-wrap{max-height:52vh}
.umd td{padding:var(--sp-24) var(--sp-2)}


/* ===== 第153批：台账列集重做 + 院长/副院长录入 + 活动·销售登记 ===== */
.umj-none { color: var(--muted); font-size:var(--fs-3); }
.umj-ld-link { display: block; cursor: pointer; border-bottom: 1px dashed transparent; }
.umj-ld-link:hover { color: var(--cyan); border-bottom-color: var(--cyan); }
.umj-ld-link:hover .umj-none { color: var(--cyan); }
.umj-flex .umj-none { margin-right:var(--sp-1); white-space: nowrap; }
.led-savebar { position: sticky; bottom: 0; }

/* ========== 第154批：台账 9 列（单层表头 + 列头配色；列序层级交错，合并表头已不可用） ========== */
.led.umj thead tr.cth th{top:0}
.led.umj thead th.umj-th{text-align:center;white-space:nowrap;letter-spacing:.3px}
.umj-th.g1{color:#4da3ff;background:#0a1424}
.umj-th.g2{color:var(--cyan);background:#091722}
.umj-th.g3{color:#2fd6c8;background:#081a1c}
.umj-th.fix{background:var(--track)}
.umj-lg{font-weight:700}
.umj-lg.g1{color:#4da3ff}
.umj-lg.g2{color:var(--cyan)}
.umj-lg.g3{color:#2fd6c8}
/* 专业级别下拉：按当前值着色（用专属类，别复用 .lv-S 标签样式） */
.led td select.lv-sel{font-weight:600}
.led td select.lv-sel.lvs-S{color:#c9a3ff}
.led td select.lv-sel.lvs-A{color:#7defff}
.led td select.lv-sel.lvs-B{color:var(--warn)}
/* 刚需专业列：⚡ 一键按 S 级专业填入 */
.umj-bolt{flex:none;padding:0 var(--sp-2);line-height:1.35}
.led td .ed::placeholder{color:#4a5a70;font-style:italic}

/* ========== 第155批：台账 11 列只读表（学校 × 二级学院） + 专业多选下拉 ========== */
/* 只读单元格 */
.led.umj td.umj-tdu,.led.umj td.umj-tdc,.led.umj td.umj-tdm{vertical-align:middle}
.umj-nm{font-weight:600;white-space:normal;word-break:break-all;line-height:1.35}
.umj-cn{color:#cfe4f5;white-space:normal;word-break:break-all}
.umj-mj{color:var(--cyan);white-space:normal;word-break:break-all;line-height:1.35}
.umj-scnt{color:#c9a3ff;font-style:normal;margin-left:var(--sp-1);font-size:var(--fs-2)}
.umj-caret{color:var(--muted);font-size:var(--fs-1);margin-left:var(--sp-1)}
/* 第⑥列：专业多选入口（整块可点，像下拉框） */
.umj-pickbox{display:block;cursor:pointer;border:1px dashed #24384f;border-radius:4px;
  padding:var(--sp-24) var(--sp-2);min-height:22px;background:#091320;transition:.12s}
.umj-pickbox:hover{border-color:var(--cyan);background:#0b1a2a}
.umj-pickbox:hover .umj-caret{color:var(--cyan)}
/* 第⑦列：刚需专业 */
.umj-rig{color:#ffd479;white-space:normal;word-break:break-all;line-height:1.35}
.umj-rig.on{font-weight:600}
/* 第⑨⑩⑪列：自动取数，可点回源页签 */
.umj-auto{color:#9fe8c8;white-space:normal;word-break:break-all;line-height:1.35}
.umj-more{color:var(--muted);font-style:normal;font-size:var(--fs-2);margin-left:var(--sp-24)}
.umj-tdu.fix .umj-flex{gap:var(--sp-14)}
.umj-tdu.fix .btn.sm{padding:0 var(--sp-2);line-height:1.35;flex:none}

/* ---- 第⑥项专业「多选下拉」：基于通用 .ms 引擎（第190批）----
 * 面板内仍用 .mdd-vw/.mdd-bar/.mdd-cnt/.mdd-foot 渲染 own/dict 标签、全选/清空、计数、注脚；
 * 选项列表与弹层定位复用通用 .ms-panel/.ms-list/.ms-option。 */
.ms-ph,.ms-pf{flex-shrink:0}
.mdd-bar{display:flex;gap:var(--sp-2);align-items:center;padding:var(--sp-15);border-bottom:1px solid var(--line)}
.mdd-foot{padding:var(--sp-2) var(--sp-3);border-top:1px solid var(--line);color:var(--muted);font-size:var(--fs-2);line-height:1.5}
/* 专业级别徽标（画进 .ms-option 内） */
.umj-lv.lv-S{background:rgba(168,85,247,.22);color:#c9a3ff;border-color:rgba(168,85,247,.5)}
/* 表单里的「一个二级学院 + 它的专业」块 */
.uf-blk{border:1px solid var(--line);border-radius:6px;padding:var(--sp-3) var(--sp-4) var(--sp-23);margin-bottom:var(--sp-3);background:var(--track)}
.uf-more{margin-top:var(--sp-4)}
.uf-more>summary{cursor:pointer;color:var(--muted);font-size:var(--fs-3);padding:var(--sp-2) 0;user-select:none}
.uf-more>summary:hover{color:var(--cyan)}

/* ===== 第156批：列宽自适应（单元格不换行，列宽 = 该列最长数据）===== */
.led.umj .umj-nm,.led.umj .umj-cn,.led.umj .umj-mj,
.led.umj .umj-auto,.led.umj .umj-th{white-space:nowrap;word-break:keep-all;overflow-wrap:normal}
.led.umj .umj-th{overflow:hidden;text-overflow:ellipsis}
.led.umj .umj-tdc,.led.umj .umj-tdm{white-space:nowrap}


/* ========== 第157批：台账 13 列 + 紧凑列宽（老张：「我需要紧凑一些」） ========== */
/* 13 列要排得下 → 全局收紧台账表的内边距与字号，并把单元格改为「超限省略号」。
   列宽上限在 app.js 的 LED_MAXW；这里负责不换行 + 截断 + 悬停看全文。 */
.led.umj{font-size:11.5px;table-layout:fixed}
.led.umj th,.led.umj td{padding:var(--sp-1) var(--sp-14)}
.led.umj thead th.umj-th{font-size:10.5px;padding:var(--sp-14) var(--sp-1);letter-spacing:0}
/* 文本类单元格：一律单行 + 省略号（title 里有全文） */
.led.umj .umj-nm,.led.umj .umj-cn,.led.umj .umj-mj,.led.umj .umj-rig,
.led.umj .umj-auto,.led.umj .umj-club{
  white-space:nowrap;word-break:keep-all;overflow-wrap:normal;
  overflow:hidden;text-overflow:ellipsis;line-height:1.4}
/* 单元格本身也裁切（含 .umj-flex / .umj-pickbox 这类容器） */
.led.umj td.umj-tdu,.led.umj td.umj-tdc,.led.umj td.umj-tdm{overflow:hidden}
.led.umj td.umj-tdu.fix{overflow:visible}
/* 首列：级别色块 + 校名 + ✏️/× 一行排下 */
.umj-tdu.fix .umj-flex{gap:var(--sp-1);flex-wrap:nowrap}
.umj-tdu.fix .umj-nm{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}
.umj-tdu.fix .btn.sm{padding:0 var(--sp-14);font-size:var(--fs-2)}
/* 第⑥列专业入口也跟着紧凑 */
.umj-pickbox{padding:var(--sp-23) var(--sp-14);min-height:20px;display:flex;align-items:center;gap:var(--sp-1)}
.umj-pickbox .umj-mj{flex:1 1 auto;min-width:0}
.umj-pickbox .umj-caret{flex:none;margin-left:0}
.umj-pickbox .umj-scnt{flex:none;margin-left:0}
/* 第⑦列刚需：学院级，单行省略 */
.umj-rig.on{font-weight:600}
/* 第⑫⑬列：社团名称 / 负责人 */
.umj-club{color:#d7e9ff}
/* 自动取数列里的「等N人」跟紧一点 */
.umj-more{margin-left:var(--sp-23)}
/* 页脚说明紧凑些 */
.umj-foot{font-size:11.5px;line-height:1.75}

/* ========== 第158批：列宽「完整显示优先」 ========== */
/* 老张反馈：「我需要的是能显示完整的字段内容，学校名称都不显示了」——
   157 批的「列宽上限 + 省略号」把长校名也一并截断了。本批改为：
     ① 短列不设上限：内容单行完整显示，列宽由内容撑开（宁可宽，不可截）
     ② 长拼接列折行：专业 / 主要老师 / 社团名 这类多值串折成多行，完整可见
   以下规则靠「后置同权重覆盖」+「提高权重」撤掉 157 批的截断行为。 */
.led.umj{table-layout:auto}
.led.umj td,.led.umj th{white-space:nowrap;overflow:visible;text-overflow:clip}
/* 长拼接列：折行完整显示（覆盖上面的 nowrap） */
.led.umj td.umj-w,.led.umj th.umj-w{
  white-space:normal;word-break:break-word;overflow-wrap:anywhere;line-height:1.4}
/* 撤销 157 批加在文本类 span 上的 overflow:hidden + 省略号；none 为占位符 */
.led.umj .umj-nm,.led.umj .umj-cn,.led.umj .umj-mj,.led.umj .umj-rig,
.led.umj .umj-auto,.led.umj .umj-club{
  overflow:visible;text-overflow:clip;white-space:inherit;word-break:inherit}
/* 单元格重新允许溢出（157 批设了 overflow:hidden，需同权重后置覆盖） */
.led.umj td.umj-tdu,.led.umj td.umj-tdc,.led.umj td.umj-tdm,
.led.umj th.umj-th{overflow:visible}
.led.umj td.umj-tdu.fix{overflow:visible}
/* 首列：校名完整显示，✏️ / × 不再把它挤没（列宽已按「校名 + 104」算足） */
.umj-tdu.fix .umj-flex{gap:var(--sp-1);flex-wrap:nowrap;align-items:center}
.umj-tdu.fix .umj-mlv{flex:none}
.umj-tdu.fix .umj-nm{
  flex:0 1 auto;min-width:0;white-space:nowrap;
  overflow:visible;text-overflow:clip}
.umj-tdu.fix .btn.sm{flex:none}
/* 第⑥列：专业串折行，▾ 与 ⭐N 固定在右侧 */
.umj-pickbox{flex-wrap:nowrap;align-items:flex-start}
.umj-pickbox .umj-mj{flex:1 1 auto;min-width:0;white-space:inherit;word-break:inherit;text-align:left}
.umj-pickbox .umj-caret,.umj-pickbox .umj-scnt{flex:none}
/* 「等N人」跟在人名串尾部，不单独折行 */
.umj-more{white-space:nowrap}
/* 折行后单元格垂直居中对齐 */
.led.umj td{vertical-align:middle}

/* ========== 第159批：列序重排 + 表头折行 + 学院块 ========== */
/* ① 表头**允许折行**（最多 2 行）。
   老张要「每个字段的宽度以最长的字符为标准，比如城市只要放得下长沙」——
   要对短列生效，表头就不能再撑着列宽。app.js 把列宽算成
   max(该列最长数据, ceil(表头宽 / 2))，这里负责让表头真的折成 2 行。
   选择器权重 (0,3,1) 高于第158批的 `.led.umj td,.led.umj th`(0,2,1) → 必定生效。 */
.led.umj thead th.umj-th{
  white-space:normal;word-break:break-word;overflow-wrap:anywhere;
  line-height:1.15;padding:var(--sp-1) var(--sp-14);vertical-align:middle;text-align:center;
  overflow:visible;text-overflow:clip}
/* 折行列（多值拼接列）的表头同样正常折行 */
.led.umj thead th.umj-th.umj-w{white-space:normal}

/* ② 第③列「专业（多选）」面板：本校已有 / 专业字典 双视图 + 已选计数 */
.mdd-vw{display:flex;border-bottom:1px solid var(--line);background:var(--track)}
.mdd-vw b{flex:1;text-align:center;padding:var(--sp-2) var(--sp-1);cursor:pointer;font-size:var(--fs-3);
  color:var(--muted);font-weight:600;border-bottom:2px solid transparent;user-select:none}
.mdd-vw b:hover{color:var(--text)}
.mdd-vw b.on{color:var(--cyan);border-bottom-color:var(--cyan);background:rgba(0,229,255,.06)}
.mdd-cnt{padding:var(--sp-1) var(--sp-3);font-size:var(--fs-2);color:var(--muted);border-bottom:1px dashed var(--line)}
.mdd-cnt b{color:var(--cyan)}

/* ③ 高校表单：一个二级学院 = 一块（块头带序号 + 学院名 + 删院） */
.uf-blk-hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3);
  padding-bottom:var(--sp-2);border-bottom:1px dashed var(--line)}
.uf-blk-no{flex:none;font-size:var(--fs-2);font-weight:700;color:var(--panel2);background:var(--cyan);
  border-radius:3px;padding:var(--sp-23) var(--sp-15);letter-spacing:.5px;white-space:nowrap}
.uf-blk-nm{flex:1 1 auto;min-width:0;font-weight:600}
.uf-blk-new{border-color:rgba(0,229,255,.45);background:#0b1622}
.uf-blk .field label{font-size:var(--fs-3)}
.uf-blk .grid{margin-bottom:0}

/* ========== 第161批：③专业列改只读 + 表单注释精简 ==========
   老张：「专业在数据表里面也是不可修改的」→ 去掉虚线框与 hover 的可点击暗示，
   改为纯文本展示（仍可 hover 看 title 完整内容）。
   ⚠️ .umj-pickbox 的旧规则**保留不删** —— umjOpenPick 面板仍在源码里，
   将来若要恢复行内改专业，接线即可复用。 */
.umj-mjbox{display:flex;align-items:flex-start;gap:var(--sp-1);padding:var(--sp-23) var(--sp-14);min-height:20px}
.umj-mjbox .umj-mj{flex:1 1 auto;min-width:0;white-space:inherit;word-break:inherit;text-align:left}
.umj-mjbox .umj-scnt{flex:none;margin-left:0}

/* ===== 第164批：⑩主要老师 / ⑧影像官 长串自动换行 =====
   老张 2026-09-18 截图 3：「如果显示的老师过多，是否可以自动换行」。
   根因：上面第 607 行 `.umj-ro-link{...white-space:nowrap}` 包住了里面的 `.umj-auto`，
   外层 nowrap 把 `td.umj-w` 的 white-space:normal 又压回单行 → 长串溢出单元格、
   压到相邻列（截图里人名串叠在「影像官」列上）。
   修法：把「折行列内部」的包裹层一并放开；权重 (0,3,1) > (0,2,0)，必定生效。
   ⚠️ `.umj-more`（「等N人」）不在此列表 → 仍保持 nowrap，不单独折行。 */
.led.umj td.umj-w .umj-ro-link,
.led.umj td.umj-w .umj-auto,
.led.umj td.umj-w .umj-club,
.led.umj td.umj-w .umj-cn,
.led.umj td.umj-w .umj-mj{
  white-space:normal;word-break:break-word;overflow-wrap:anywhere;
}

/* ===== 第172批 ⭐：台账 ⑥主要领导 / ⑦主要老师 人名可点 =====
   老张：「点对应的老师，也要出现刚新做的老师窗口」。
   · .umj-tch     可点的老师名（绿色 + 青色虚线底 —— 与整格可点区分开，看得出「点这里有东西」）
   · .umj-tch-ro  id 缺失时的退化纯文本（老后端），同色但无下划线
   · .umj-tch-td  整格也可点（点空白 /「待录」→ 打开该校老师窗口）
   ⚠️ 名字用 nowrap：**人名内部绝不拆行**；换行只发生在名字之间的「、」处
      （td.umj-w 是 normal，第 158/164 批已定，别改）。 */
.led.umj td.umj-tch-td{cursor:pointer}
.umj-tch{color:#9fe8c8;border-bottom:1px dashed rgba(0,229,255,.5);white-space:nowrap}
.umj-tch:hover{color:#7defff;border-bottom-color:#7defff}
.umj-tch-ro{color:#9fe8c8;white-space:nowrap}
/* 第173批：「待录」也要看得出可点 —— 点一下直接开老师窗口、进新增模式（档位预置到本行学院） */
.umj-tch-new{cursor:pointer;border-bottom:1px dashed rgba(0,229,255,.45)}
.umj-tch-new:hover{color:#7defff;border-bottom-color:#7defff}

/* ===== 第166批：老师选择窗口 ===== */
.tch-wrap{max-height:calc(100vh - 682px);overflow:auto;margin-top:var(--sp-2)}
.tch-tab{width:100%;font-size:var(--fs-4)}
.tch-tab th{white-space:normal;word-break:break-word;line-height:1.2;padding:var(--sp-14) var(--sp-2);font-weight:400}
.tch-tab td{padding:var(--sp-14) var(--sp-2);vertical-align:middle;border-bottom:1px solid var(--line)}
.tch-tab tr.tch-on{background:rgba(0,229,255,.06)}
.tch-tab .tch-nm{font-weight:500;white-space:nowrap}
.tch-tab .tch-nm i{display:block;font-style:normal;font-size:var(--fs-2);color:var(--muted);font-weight:400}
.tch-tab input.ed,.tch-tab select{width:100%;min-width:0}
/* 职责分工：点一下切换的小方块 */
.tch-tab .dc{display:inline-block;margin:var(--sp-22) var(--sp-24) var(--sp-22) 0;padding:var(--sp-22) var(--sp-15);border-radius:4px;
  border:1px solid var(--line);color:var(--muted);font-size:var(--fs-3);cursor:pointer;user-select:none;
  white-space:nowrap;line-height:1.6}
.tch-tab .dc:hover{border-color:var(--cyan);color:var(--cyan)}
.tch-tab .dc.on{background:rgba(0,229,255,.16);border-color:var(--cyan);color:var(--cyan)}
.tch-duties{margin-top:var(--sp-2)}
.tch-duties span{display:inline-block;margin:var(--sp-23) var(--sp-1) var(--sp-23) 0;padding:var(--sp-23) var(--sp-16);border-radius:4px;
  border:1px solid var(--line);color:var(--muted);font-size:var(--fs-3);cursor:pointer;user-select:none}
.tch-duties span:hover{border-color:var(--cyan);color:var(--cyan)}
/* 只读输入框（⑨⑩ 选人结果）——看得出不可手打 */
input[readonly]{opacity:.72;cursor:pointer}

/* ===== 第167批：老师窗口「回访到期」标记 ===== */
.tch-tab td .tch-due{display:inline-block;margin-left:var(--sp-14);padding:0 var(--sp-14);border-radius:8px;
  font-size:var(--fs-2);font-style:normal;line-height:16px;background:rgba(230,126,34,.16);
  color:#c8720c;border:1px solid rgba(230,126,34,.34)}
.tch-tab td .tch-due.od{background:rgba(231,76,60,.16);color:#c0392b;border-color:rgba(231,76,60,.4)}

/* ===== 第169批：老师窗口「上方输入项 + 下方只读表格」 ===== */
/* 老张：「把新增老师按钮打开的窗口里面对应项目改成下面数据表里的内容输入项，
         下面的表格做成只读，不能修改」*/
.tch-ed{border:1px solid var(--line);border-radius:8px;padding:var(--sp-4) var(--sp-5) var(--sp-23);margin-top:var(--sp-4);
  background:rgba(255,255,255,.02)}
.tch-ed .grid{margin-bottom:0}
.tch-ed-hd{display:flex;align-items:center;gap:var(--sp-3);margin-bottom:var(--sp-3);font-size:var(--fs-4)}
.tch-ed-hd b{color:var(--cyan);font-weight:600}
.tch-sub{color:var(--muted);font-size:var(--fs-2);font-weight:400}
.tch-ed-hd i.tch-sub{font-style:normal}
.tch-ed-idle{padding:var(--sp-5);color:var(--muted);font-size:var(--fs-4);display:flex;align-items:center;gap:var(--sp-3);
  flex-wrap:wrap}
/* 输入区里的职责方块（表格里的 .dc 是只读展示，这里是可点的） */
.tch-duty-box{display:flex;flex-wrap:wrap;gap:var(--sp-1);margin-top:var(--sp-24)}
.tch-duty-box .dc{display:inline-block;padding:var(--sp-24) var(--sp-4);border-radius:4px;border:1px solid var(--line);
  color:var(--muted);font-size:var(--fs-3);cursor:pointer;user-select:none;white-space:nowrap}
.tch-duty-box .dc:hover{border-color:var(--cyan);color:var(--cyan)}
.tch-duty-box .dc.on{background:rgba(0,229,255,.16);border-color:var(--cyan);color:var(--cyan)}
.tch-ro-hd{margin-top:var(--sp-5);font-size:var(--fs-3);color:var(--muted)}
/* 只读表格：整行可点（= 载入上方输入区），行内没有任何输入控件 */
.tch-tab tbody tr{cursor:pointer}
.tch-tab tbody tr:hover{background:rgba(255,255,255,.035)}
.tch-tab tbody tr.cur{background:rgba(0,229,255,.10);box-shadow:inset 3px 0 0 var(--cyan)}
.tch-tab tbody tr.dirty .tch-nm::after{content:'●';color:#e67e22;font-size:var(--fs-1);margin-left:var(--sp-14);
  vertical-align:middle}
.tch-tab td.tch-ro{color:var(--text)}
.tch-nil{color:#4a5a70}
.tch-ed-hd .tch-due{margin-left:0}

/* ===== 第170批：👨‍🏫 老师页签改「只读表格 + 窗口编辑」 =====
   老张：「把新增老师这个按钮打开的窗口里面对应项目改成下面数据表里的内容输入项，
          下面的表格做成只读，不能修改」
   → 整表只读（teCell 里已无任何 input/select），**点一行打开「👥 老师窗口」**。
   ⚠️ 这里只加「可点」的观感；真正禁止修改靠的是 teCell 不再渲染输入控件，
      样式禁止不了任何事（别靠 CSS 当权限）。 */
.led tbody tr.te-row{cursor:pointer}
.led tbody tr.te-row:hover{background:rgba(255,255,255,.035)}
.led tbody tr.te-row:active{background:rgba(0,229,255,.08)}

/* ===== 第P0批 F2：移动端「全部功能」抽屉（全局默认隐藏，仅 .on 显示） ===== */
.drawer{display:none}
.drawer.on{display:block}
@media(max-width:860px){
  .drawer{position:fixed;inset:0;background:var(--bg2);z-index:80;overflow:auto;padding:var(--sp-7)}
}
.drawer .drawer-bar{display:flex;align-items:center;gap:var(--sp-4);padding:var(--sp-6) var(--sp-7);border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--bg2);z-index:2}
.drawer .drawer-bar b{font-size:var(--fs-7);flex:1}
.drawer .nav-grp{color:var(--muted);font-size:var(--fs-3);padding:var(--sp-6) var(--sp-7) var(--sp-3);letter-spacing:1px}
.drawer a{display:flex;align-items:center;gap:var(--sp-5);padding:var(--sp-18) var(--sp-8);border-radius:8px;color:var(--text);text-decoration:none;font-size:var(--fs-6);margin:0 var(--sp-4) var(--sp-14);border:1px solid transparent}
.drawer a:hover{background:rgba(0,229,255,.06);border-color:var(--line)}
.drawer a .ic{width:22px;text-align:center;color:var(--cyan);font-size:var(--fs-8)}

/* ===== 第P0批 F10：⌘K 全局命令面板 ===== */
.cmdk-mask{position:fixed;inset:0;background:rgba(4,8,14,.72);backdrop-filter:blur(3px);z-index:300;display:none;align-items:flex-start;justify-content:center;padding-top:12vh}
.cmdk{width:100%;max-width:560px;background:linear-gradient(180deg,var(--panel),var(--bg2));border:1px solid var(--line2);border-radius:14px;box-shadow:var(--sh);overflow:hidden;max-height:70vh;display:flex;flex-direction:column}
.cmdk-input{width:100%;border:none;background:transparent;border-bottom:1px solid var(--line);color:var(--text);padding:var(--sp-7) var(--sp-8);font-size:var(--fs-6);outline:none;border-radius:0}
.cmdk-input::placeholder{color:var(--muted)}
.cmdk-list{overflow:auto;padding:var(--sp-3);flex:1}
.cmdk-i{display:flex;align-items:center;gap:var(--sp-5);padding:var(--sp-17) var(--sp-6);border-radius:8px;cursor:pointer;font-size:var(--fs-5)}
.cmdk-i:hover,.cmdk-i.on{background:rgba(0,229,255,.12)}
.cmdk-i .ic{width:22px;text-align:center;font-size:var(--fs-16)}
.cmdk-i .grow{flex:1}
.cmdk-k{font-size:var(--fs-2);color:var(--muted);border:1px solid var(--line);border-radius:10px;padding:var(--sp-22) var(--sp-3)}
.cmdk-empty{text-align:center;color:var(--muted);padding:var(--sp-11)}
.cmdk-foot{font-size:var(--fs-2);color:var(--muted);padding:var(--sp-4) var(--sp-7);border-top:1px solid var(--line);text-align:center;letter-spacing:.3px}

/* ===== 20260924a ⑥：驾驶舱折叠区 summary ===== */
details.ck-more{margin-top:var(--sp-6)}
details.ck-more>summary{cursor:pointer;list-style:none;padding:var(--sp-17) var(--sp-7);border:1px solid var(--line);
  border-radius:10px;background:var(--panel);font-size:var(--fs-4);color:var(--muted);user-select:none;transition:.15s}
details.ck-more>summary::-webkit-details-marker{display:none}
details.ck-more>summary:hover{border-color:var(--line2);color:var(--text)}
details.ck-more[open]>summary{border-bottom-left-radius:0;border-bottom-right-radius:0;margin-bottom:-1px}

/* ===== 20260924a ④：日间模式（门店强光环境可读性）=====
   顶栏 🌓 切换，localStorage('wb_theme') 持久化。变量整体翻转为浅色系，
   cyan 转深商务蓝保证浅底对比；霓虹光晕由 body.light 统一压掉。 */
body.light{
  --bg:#eef2f7; --bg2:#ffffff; --panel:#ffffff; --panel2:#f2f6fb;
  --line:rgba(20,50,90,.14); --line2:rgba(20,50,90,.30);
  --cyan:#0072c3; --cyan-d:#005a9c;
  --text:#17273b; --muted:#5f6e82;
  --danger:#d81b53; --warn:#b06f00; --ok:#0a9e6f; --purple:#6a58e8;
  --track:#dfe7f0;
  --card:#ffffff; --bd:rgba(20,50,90,.18); --accent:#0072c3; /* P0-1 浅色主题对应值 */
  --sh:0 0 0 1px rgba(20,50,90,.05), 0 8px 24px rgba(30,50,80,.10);
  color-scheme: light;
}
body.light{background:var(--bg)} /* 覆盖暗色的霓虹径向渐变 */
body.light .topbar{background:rgba(255,255,255,.86)}
body.light .nav a:hover{background:rgba(0,114,195,.08)}
body.light .nav a.on{background:linear-gradient(90deg,rgba(0,114,195,.13),rgba(0,114,195,.02));color:#0b2c4d;
  box-shadow:inset 2px 0 0 var(--cyan)}
body.light .logo span,body.light .brand b span{text-shadow:none}
body.light ::-webkit-scrollbar-thumb{background:rgba(0,114,195,.28)}
body.light .cmdk-i:hover,body.light .cmdk-i.on{background:rgba(0,114,195,.10)}
body.light .drawer a:hover{background:rgba(0,114,195,.08)}
body.light .login-card{background:linear-gradient(160deg,var(--panel),var(--bg2))}
/* 20260924b：页面副标题（层级说明）+ 报告未交红点 + 分组折叠 */
.pg-sub{font-size:var(--fs-3);color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:var(--sp-3) var(--sp-5);margin-bottom:var(--sp-5);line-height:1.5}
.nav a,.mtab a{position:relative}
.nav-badge{position:absolute;top:-3px;right:4px;min-width:16px;height:16px;line-height:16px;padding:0 var(--sp-1);background:var(--danger);color:#fff;font-size:var(--fs-1);border-radius:9px;text-align:center;font-weight:700;box-shadow:0 0 0 2px var(--bg);z-index:2}
.mtab a .nav-badge{top:-4px;right:50%;transform:translateX(14px)}


/* ============================================================
 * 20261002al 全局「? 窗口说明」按钮
 * ------------------------------------------------------------
 * 问号挂在弹窗标题栏（× 左边）与页面标题右边；点击展开本窗口说明。
 * .off = 该窗口还没写说明，置灰但仍可点（点了给"暂无说明"而不是消失）。
 * ============================================================ */
.help-q{
  display:inline-flex;align-items:center;justify-content:center;
  width:17px;height:17px;min-width:17px;border-radius:50%;
  border:1px solid var(--warn);color:var(--warn);
  background:rgba(255,176,32,.08);
  font-size:11px;font-weight:700;line-height:1;cursor:pointer;
  user-select:none;flex:0 0 auto;transition:.12s;
}
.help-q:hover{color:var(--warn);border-color:var(--warn);background:rgba(255,176,32,.20)}
/* 未写说明的窗口：黄色淡出，仍可点开看提示 */
.help-q.off{opacity:.38;border-color:var(--line2);color:var(--muted);background:transparent}
.help-q.off:hover{opacity:.62}
/* 弹窗标题栏里紧贴 × 按钮 */
.modal .mh .help-q{margin-left:auto;margin-right:8px}
.modal .mh .help-q + .x{margin-left:0}
/* 页面标题栏：跟在 h1 右侧 */
.help-q.page{width:18px;height:18px;min-width:18px;font-size:12px;margin-left:8px;vertical-align:2px}
.help-q.off{opacity:.42}
/* 说明文档排版 */
.help-doc h5{margin:14px 0 4px;font-size:13px;color:var(--cy);font-weight:600}
.help-doc h5:first-child{margin-top:0}
.help-doc p{margin:0 0 9px;line-height:1.8}
.help-doc p:last-child{margin-bottom:0}
.help-doc b{color:var(--fg)}
/* 20261005cr：「？」说明抽屉（独立层，z-index 高于 #mask 的 100，压在主弹窗之上） */
.helpmask{position:fixed;inset:0;background:rgba(4,8,14,.5);z-index:150;display:none;justify-content:flex-end}
.helpmask.on{display:flex}
.helpwin{width:min(600px,94vw);height:100%;background:linear-gradient(180deg,var(--panel),var(--bg2));
  border-left:1px solid var(--line2);display:flex;flex-direction:column;box-shadow:-8px 0 28px rgba(0,0,0,.35);
  animation:helpin .18s ease}
@keyframes helpin{from{transform:translateX(26px);opacity:.35}to{transform:none;opacity:1}}
.helpwin .mh{padding:var(--sp-19) var(--sp-8);border-bottom:1px solid var(--line);display:flex;align-items:center}
.helpwin .mh b{font-size:var(--fs-6)}
.helpwin .mh .x{margin-left:auto;touch-action:manipulation}
.helpwin .mb{padding:var(--sp-8);overflow:auto;flex:1}
.helpwin .mf{padding:var(--sp-5) var(--sp-8);border-top:1px solid var(--line);display:flex;justify-content:flex-end}
/* 窗口内的极简提示条：一行搞定的留这，长说明一律进「？」抽屉 */
.mini-tip{font-size:11px;line-height:1.7;color:var(--muted)}
