/* 带营前端样式。只加不改：不覆盖 styles.css 的任何选择器，全部 camp- 前缀。
   颜色一律取 :root 变量，跟随现有主题（浅色）。 */

/* ---------- 班级切换条 ---------- */
.camp-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.camp-bar-l{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.camp-bar-name{font-size:15px;font-weight:700;letter-spacing:-.2px;color:var(--ink)}
.camp-bar-r{margin-left:auto;font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums}
.camp-chip{display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 13px;border-radius:10px;
  border:1.5px solid var(--line);background:#fff;font-size:12.5px;color:var(--ink2);cursor:pointer;
  font-family:inherit;transition:border-color .15s,color .15s,background .15s;white-space:nowrap}
.camp-chip:hover{border-color:#CFDCF2;color:var(--ink)}
.camp-chip.on{background:var(--brand-l);border-color:#C9DAFF;color:var(--brand-d);font-weight:700}
.camp-dot{width:6px;height:6px;border-radius:50%;background:var(--ok);flex:none}

/* ---------- 四张指标卡 ---------- */
.camp-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.camp-kpi{padding:15px 16px}
.camp-kpi-t{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink2);font-weight:500;min-height:20px}
.camp-kpi-v{font-size:30px;font-weight:800;letter-spacing:-1.2px;line-height:1.15;margin:7px 0 3px;font-variant-numeric:tabular-nums}
.camp-kpi-f{font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.camp-est{font-size:10px;padding:2px 6px;cursor:help}

/* ---------- 卡片与表格 ---------- */
.camp-card{padding:16px 16px 8px;margin-bottom:14px}
.camp-tbl{width:100%}
.camp-tbl td{padding:10px}
.camp-td-d{font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.camp-td-d em{display:block;font-style:normal;font-size:11px;color:var(--ink3);font-weight:500;margin-top:1px}
.camp-td-t{color:var(--ink2);font-variant-numeric:tabular-nums;white-space:nowrap}
.camp-td-n{white-space:normal;min-width:140px}
.camp-td-a{font-variant-numeric:tabular-nums;color:var(--ink2)}
.camp-td-a b{color:var(--ink);font-size:14px}
.camp-tr-today{background:var(--brand-l)}
.camp-tr-today:hover{background:#E3ECFF}
.camp-mono{font-variant-numeric:tabular-nums;color:var(--ink2)}

/* 课表筛选（待点名 / 全部）：比 .seg 小一号，塞在卡片标题行里 */
.camp-hseg{display:inline-flex;background:var(--surface-2);border-radius:9px;padding:2px;gap:2px;margin-left:6px}
.camp-hseg button{border:none;background:none;font-size:12px;color:var(--ink2);padding:5px 11px;border-radius:7px;
  cursor:pointer;font-family:inherit;font-weight:500;transition:background .15s,color .15s}
.camp-hseg button:hover{color:var(--ink)}
.camp-hseg button.on{background:#fff;color:var(--ink);font-weight:700;box-shadow:0 1px 3px rgba(19,39,79,.12)}

/* ---------- 点名弹层 ---------- */
.camp-mh{display:flex;align-items:flex-start;gap:12px;padding:18px 18px 12px}
.camp-mt{font-size:15.5px;font-weight:800;letter-spacing:-.2px}
.camp-md{font-size:12px;color:var(--ink3);margin-top:4px;line-height:1.6}
.camp-mh>.btn{margin-left:auto;flex:none}
/* 弹窗右上角关闭：旧版是文字按钮「关闭」，太弱。改成图标 ✕，hover 浅底，更明显（2026-11-04） */
/* 弹窗右上角关闭：旧版是文字按钮「关闭」，太弱。改成图标 ✕，hover 浅底，更明显（2026-11-04）。
   通用选择器，兼容 camp-mh / camp-dw-h 等各类 header（都是 flex，margin-left:auto 自动推到最右）。 */
.modal-x{margin-left:auto;flex:none;width:34px;height:34px;padding:0;border-radius:10px;
  border:1.5px solid var(--line);background:#fff;display:inline-flex;align-items:center;justify-content:center;
  cursor:pointer;color:var(--ink3);transition:.15s}
.modal-x:hover{background:#F2F5FB;border-color:#CFDCF2;color:var(--ink)}
.modal-x svg{width:18px;height:18px;display:block}
.camp-mbar{display:flex;align-items:center;gap:8px;padding:0 18px 10px;flex-wrap:wrap}
.camp-cal{font-size:12.5px;color:var(--ink2);font-variant-numeric:tabular-nums}
.camp-cal b{font-size:16px;color:var(--brand-d);font-weight:800}
.camp-rlist{max-height:min(52vh,420px);overflow:auto;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.camp-p{display:flex;align-items:center;gap:10px;padding:10px 18px;cursor:pointer;
  border-bottom:1px solid var(--line2);transition:background .12s}
.camp-p:last-child{border-bottom:none}
.camp-p:hover{background:var(--hover)}
.camp-p input{width:17px;height:17px;accent-color:var(--brand);cursor:pointer;flex:none}
.camp-pn{font-size:13.5px;font-weight:600;min-width:70px}
.camp-pp{font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums;min-width:96px}
.camp-pc{font-size:11.5px;color:var(--ink3);margin-left:auto}
.camp-mf{display:flex;align-items:center;gap:8px;padding:14px 18px 16px}
.camp-mbody{padding:0 18px 6px}
.camp-p-note{font-size:13px;color:var(--ink2);line-height:1.75;margin:0 0 12px}
.camp-p-note b{color:var(--ink);font-size:15px}
.camp-prev{border:1px solid var(--line);border-radius:12px;overflow:hidden;max-height:230px;overflow-y:auto}
.camp-pv{display:flex;align-items:center;gap:10px;padding:8px 12px;font-size:12.5px;border-bottom:1px solid var(--line2)}
.camp-pv:last-child{border-bottom:none}
.camp-pv b{font-variant-numeric:tabular-nums;min-width:74px;color:var(--ink)}
.camp-pv span{color:var(--ink2);font-variant-numeric:tabular-nums;min-width:44px}
.camp-pv em{font-style:normal;color:var(--ink3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.camp-pv-more{padding:9px 12px;font-size:12px;color:var(--ink3)}

/* ---------- 窄屏 ---------- */
@media (max-width:900px){
  .camp-kpis{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:560px){
  .camp-kpi-v{font-size:25px}
  .camp-bar-r{margin-left:0;width:100%}
  .camp-p{padding:10px 14px}
  .camp-pp{min-width:0}
  .camp-pc{display:none}
}

/* ================= W1 开营数据总览 ================= */
/* 4 张卡：在营排期 / 在营班级 / 在营学员 / 在营老师，点卡片切维度 */
.camp-ov-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:12px}
.camp-ov-kpi{padding:16px 18px;cursor:pointer;transition:border-color .15s,box-shadow .15s;position:relative}
.camp-ov-kpi:hover{border-color:#C9DAFF;box-shadow:0 2px 10px rgba(91,140,255,.1)}
.camp-ov-kpi::after{content:'';position:absolute;right:15px;top:50%;width:6px;height:6px;
  border-right:1.6px solid var(--ink3);border-bottom:1.6px solid var(--ink3);
  transform:translateY(-50%) rotate(-45deg);opacity:0;transition:opacity .15s}
.camp-ov-kpi:hover::after{opacity:1}
.camp-ov-kt{font-size:12.5px;color:var(--ink2);font-weight:500}
.camp-ov-kv{font-size:32px;font-weight:800;letter-spacing:-1.3px;line-height:1.1;margin:6px 0 2px;
  font-variant-numeric:tabular-nums;color:var(--ink)}
.camp-ov-kf{font-size:11.5px;color:var(--ink3)}

/* 三个率的汇总条 */
.camp-ov-metrics{display:flex;align-items:center;gap:26px;flex-wrap:wrap;padding:13px 18px;margin-bottom:14px}
.camp-ov-m{display:flex;align-items:baseline;gap:7px;font-size:12.5px;color:var(--ink2)}
.camp-ov-m b{font-size:17px;font-weight:800;letter-spacing:-.4px;font-variant-numeric:tabular-nums;color:var(--ink)}
.camp-ov-note{margin-left:auto;font-size:11.5px;color:var(--ink3)}

/* 说明文字紧跟标题，别被 .card-tip 的 margin-left:auto 推到中间 */
.camp-ov-card .card-tip{margin-left:0}

/* 面包屑 + 维度切换 */
.camp-ov-seg{margin-left:auto;flex:none}
.camp-crumb{display:flex;align-items:center;gap:7px;flex-wrap:wrap;
  padding:0 2px 10px;font-size:12.5px;border-bottom:1px solid var(--line2);margin-bottom:2px}
.camp-crumb-a{color:var(--brand-d);cursor:pointer;font-weight:600}
.camp-crumb-a:hover{text-decoration:underline}
.camp-crumb-sep{font-style:normal;color:var(--ink3);opacity:.6}
.camp-crumb-cur{color:var(--ink);font-weight:700}

/* 三级下钻表 */
.camp-ov-card{padding:16px 16px 4px}
.camp-ov-body{overflow:visible}
.camp-ov-tbl{width:100%;table-layout:auto}
.camp-ov-tbl th{font-size:12px;font-weight:600;color:var(--ink2);white-space:nowrap;padding:9px 8px;
  border-bottom:1px solid var(--line);text-align:left}
.camp-ov-tbl th.num,.camp-ov-tbl td.num{text-align:right}
.camp-ov-tbl td{padding:11px 8px;font-variant-numeric:tabular-nums;white-space:nowrap;
  border-bottom:1px solid var(--line2);font-size:13px}
.camp-ov-tbl tbody tr:last-child td{border-bottom:none}
.camp-ov-row{cursor:pointer;transition:background .12s}
.camp-ov-row:hover{background:var(--hover)}
.camp-ov-sub{font-style:normal;font-size:11.5px;color:var(--ink3);font-weight:400;margin-left:6px}
.camp-ov-date{color:var(--ink2);font-size:12.5px}
.camp-ov-na{color:var(--ink3)}

/* 当前入口的卡：描边 + 底色，别只靠箭头提示 */
.camp-ov-kpi.on{border-color:#B9CDF7;background:var(--brand-l);box-shadow:0 2px 10px rgba(91,140,255,.12)}
.camp-ov-kpi.on .camp-ov-kt{color:var(--brand-d);font-weight:700}

/* 筛选器（项目 / 期 / 搜索） */
.camp-flt{margin-left:auto;display:flex;align-items:center;gap:8px;flex:none}
.camp-sel,.camp-inp{height:32px;border:1px solid var(--line);background:#fff;border-radius:9px;
  font-size:12.5px;color:var(--ink);font-family:inherit;padding:0 9px;outline:none;max-width:190px}
.camp-sel:focus,.camp-inp:focus{border-color:#B9CDF7;box-shadow:0 0 0 3px rgba(91,140,255,.12)}
.camp-inp{width:150px}

/* 排期分组：一期一个小标题，下面直接是这期的班级表 */
.camp-grp{margin-bottom:16px}
.camp-grp:last-child{margin-bottom:4px}
.camp-grp-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;padding:6px 4px 8px}
.camp-grp-h b{font-size:14px;color:var(--ink);letter-spacing:-.2px}
.camp-grp-d{font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums}
.camp-grp-s{margin-left:auto;font-size:12px;color:var(--ink2);font-variant-numeric:tabular-nums}

/* ================= W3 班级工作区：菜单排一排 ================= */
/* 2026-11-08 方案 A：主 Tab 改成「浏览器标签页」——
   浅蓝底 + 粗体 + 2.5px 下划线，圆角只留上两角；整排的底边线同时是
   「主导航 / 子导航」之间那条浅灰分隔线，选中的下划线正好压在线上。 */
/* overflow-y:hidden 必须显式写：只写 overflow-x:auto 时 y 轴的 visible 会被算成 auto，而
   .camp-tab 的 top:1px（为了把下划线压到分隔线上）正好让内容溢出 1px → 页签那一条变成可
   纵向滚动，Windows 上滚动条只剩末尾两个上下小箭头（2026-11-09 用户报）。 */
.camp-tabs{display:flex;align-items:flex-end;gap:1px;background:none;border-radius:0;padding:0;
  border-bottom:1px solid var(--line);overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;margin:4px 0 0}
.camp-tab{position:relative;top:1px;flex:none;border:none;background:none;font-family:inherit;font-size:13.5px;
  color:var(--ink2);padding:9px 16px 10px;border-radius:9px 9px 0 0;cursor:pointer;white-space:nowrap;
  font-weight:500;transition:background .15s,color .15s}
.camp-tab:hover{color:var(--ink);background:var(--hover)}
.camp-tab.on{background:var(--brand-l);color:var(--brand-d);font-weight:800}
.camp-tab.on::after{content:'';position:absolute;left:0;right:0;bottom:-1px;height:2.5px;
  background:var(--brand);border-radius:2px 2px 0 0}
.camp-tab i{font-style:normal;font-size:11px;color:var(--ink3);margin-left:4px}
/* 选中前后不加宽：每个标签里藏一份粗体副本，宽度按粗体算，切页签时整排不抖 */
.cp-tl{display:inline-grid;white-space:nowrap;flex:none}
.cp-tl::after{content:attr(data-t);font-weight:800;grid-area:1/1;height:0;overflow:hidden;visibility:hidden}
/* 每个栏目都带图标（2026-11-05 用户要求） */
.camp-tab{display:inline-flex;align-items:center;gap:6px}
.cp-ti{width:15px;height:15px;flex:none;opacity:.8}
.camp-tab.on .cp-ti,.camp-subtab.on .cp-ti{opacity:1}
/* 「更多」下拉：菜单用 fixed，避免被 .camp-tabs 的横向滚动裁掉 */
.cp-tabdrop{position:relative;flex:none;display:inline-flex}
.cp-dropar{width:11px;height:11px;flex:none;opacity:.55;margin-left:-1px;transition:transform .16s}
.cp-tabdrop.open .cp-dropar{transform:rotate(180deg);opacity:.9}
.cp-dropmenu{position:fixed;z-index:120;display:none;flex-direction:column;gap:2px;
  background:#fff;border:1px solid var(--line);border-radius:11px;padding:5px;
  box-shadow:0 10px 28px rgba(19,39,79,.14),0 2px 6px rgba(19,39,79,.08)}
.cp-tabdrop.open .cp-dropmenu{display:flex}
.cp-dropitem{display:flex;align-items:center;gap:7px;border:0;background:none;cursor:pointer;
  font-family:inherit;font-size:13px;color:var(--ink2);padding:8px 11px;border-radius:8px;
  text-align:left;white-space:nowrap;transition:background .14s,color .14s}
.cp-dropitem:hover{background:var(--surface-2);color:var(--ink)}
.cp-dropitem.on{background:var(--brand-l);color:var(--brand-d);font-weight:600}
/* 「班级学员」下的四个子页签：一级用「线」、二级用「底」——
   这里去掉描边，只留无边框药丸，选中是浅蓝底 + 深蓝粗体，不画下划线，
   这样两层不会看起来像两个同级页签（2026-11-08 方案 A） */
.camp-subtabs{display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin:10px 0 13px}
.camp-subtab{display:inline-flex;align-items:center;gap:6px;border:1px solid transparent;background:none;
  font-family:inherit;font-size:12.5px;color:var(--ink2);padding:6px 11px;border-radius:8px;cursor:pointer;
  transition:background .15s,color .15s}
.camp-subtab:hover{background:var(--hover);color:var(--ink)}
.camp-subtab.on{background:var(--brand-l);color:var(--brand-d);font-weight:700}

/* 详情抽屉（志愿者 / 学员） */
.camp-dw-h{display:flex;align-items:flex-start;gap:12px;padding:18px 20px 14px;border-bottom:1px solid var(--line2)}
.camp-dw-n{font-size:17px;font-weight:800;letter-spacing:-.3px;color:var(--ink);display:flex;align-items:center;gap:8px}
.camp-dw-m{font-size:12.5px;color:var(--ink3);margin-top:5px;display:flex;gap:14px;flex-wrap:wrap;
  font-variant-numeric:tabular-nums}
.camp-dw-b{padding:4px 20px 18px;max-height:min(64vh,560px);overflow:auto}
.camp-dw-s{margin:14px 0 8px;font-size:12.5px;font-weight:700;color:var(--ink);display:flex;align-items:center;gap:8px}
.camp-dw-s em{font-style:normal;font-weight:500;color:var(--ink3);font-size:11.5px}
.camp-kv{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px 18px}
.camp-kv div{font-size:12.5px;color:var(--ink3);display:flex;flex-direction:column;gap:3px}
.camp-kv b{color:var(--ink);font-size:13px;font-weight:600}
.camp-mini{width:100%;border-collapse:collapse;font-size:12.5px}
.camp-mini th{text-align:left;font-weight:600;color:var(--ink2);padding:6px 8px;border-bottom:1px solid var(--line);
  font-size:11.5px;white-space:nowrap}
.camp-mini td{padding:7px 8px;border-bottom:1px solid var(--line2);font-variant-numeric:tabular-nums;white-space:nowrap}
.camp-mini tr:last-child td{border-bottom:none}
.camp-mini th.num,.camp-mini td.num{text-align:right}
.camp-mini .camp-mono{font-size:12px}

/* 概览：战队指标表 + 待办 + 参考资料 */
.camp-panes{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.camp-todo{display:flex;align-items:flex-start;gap:9px;padding:9px 2px;border-bottom:1px solid var(--line2);font-size:13px}
.camp-todo:last-child{border-bottom:none}
.camp-todo i{font-style:normal;flex:none;width:16px;height:16px;border-radius:5px;border:1.5px solid var(--line);
  background:#fff;margin-top:1px;display:inline-flex;align-items:center;justify-content:center;font-size:11px;color:#fff}
.camp-todo.done i{background:var(--ok);border-color:var(--ok)}
.camp-todo.done span{color:var(--ink3);text-decoration:line-through}
.camp-todo em{font-style:normal;margin-left:auto;font-size:11.5px;color:var(--ink3);flex:none;
  font-variant-numeric:tabular-nums}
.camp-ref{display:flex;align-items:center;gap:9px;padding:9px 2px;border-bottom:1px solid var(--line2);font-size:13px}
.camp-ref:last-child{border-bottom:none}
.camp-ref .tag{flex:none}
.camp-ref a{color:var(--brand-d);text-decoration:none;font-weight:600}
.camp-ref a:hover{text-decoration:underline}

/* 概览顶部：当前阶段 */
.camp-stage-bar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:11px 16px;margin-bottom:14px;
  background:var(--brand-l);border:1px solid #D7E3FF;border-radius:12px;font-size:13px;color:var(--ink2)}
.camp-stage-bar b{color:var(--ink);font-size:13.5px}
.camp-stage-bar em{font-style:normal;color:var(--ink3);font-size:12px}

/* 战队 / 小组 树 */
.camp-tree-wrap{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;padding:4px 0 14px}
.camp-tree{border:1px solid var(--line);border-radius:11px;padding:10px 12px;background:var(--surface-2)}
.camp-tree-r{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:13px}
.camp-tree-r b{color:var(--ink);font-size:13px}
.camp-tree-r em{font-style:normal;margin-left:auto;font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.camp-tree-s{padding:5px 0 0 12px;font-size:12.5px;color:var(--ink2);border-top:1px dashed var(--line);
  margin-top:7px}
.camp-tree-s:first-of-type{margin-top:6px}
.camp-tr-total{background:var(--surface-2)}
.camp-tr-total td{border-top:1px solid var(--line);border-bottom:none}

@media (max-width:900px){
  .camp-panes{grid-template-columns:1fr}
  .camp-flt{margin-left:0;width:100%;flex-wrap:wrap}
}


/* ================= 流程管理（S2） ================= */
.tag-lib{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 9px;border-radius:7px;
  background:var(--ink);color:#fff;font-size:11px;font-weight:700;letter-spacing:.4px;white-space:nowrap}
.fl-row{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;align-items:stretch}
.fl-col{background:var(--surface-2);border:1px solid var(--line);border-radius:14px;display:flex;flex-direction:column;overflow:hidden}
.fl-col-h{display:flex;align-items:center;gap:8px;padding:10px 13px;background:#fff;border-bottom:1px solid var(--line)}
.fl-col-h b{font-size:13px;font-weight:700;letter-spacing:-.1px}
.fl-col-h span{font-size:11px;color:var(--ink2);background:var(--surface-2);border-radius:7px;padding:1px 7px;font-variant-numeric:tabular-nums}
.fl-col-h em{margin-left:auto;font-style:normal;font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.fl-col-b{display:flex;flex-direction:column;gap:10px;padding:12px 13px 13px;flex:1}
.fl-list{display:flex;flex-direction:column;gap:17px}
.fl-item{border:1px solid var(--line);border-radius:11px;padding:9px 10px;background:#fff;display:flex;gap:6px;
  align-items:flex-start;box-shadow:0 1px 2px rgba(19,39,79,.04)}
.fl-i-m{min-width:0;flex:1}
.fl-i-n{font-size:13px;font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  color:var(--ink);letter-spacing:-.1px}
.fl-i-sub{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:5px}
.fl-i-d{font-size:11px;font-weight:600;color:var(--ink2);background:var(--surface-2);
  border-radius:6px;padding:1px 6px;font-variant-numeric:tabular-nums}
.fl-i-t{font-size:12px;color:var(--ink2);margin-top:5px;line-height:1.6}
.fl-i-u{font-size:11px;color:var(--ink3);font-variant-numeric:tabular-nums}
.fl-i-a{display:flex;gap:2px;flex:none;align-items:flex-start}
.fl-btn{width:24px;height:24px;border-radius:7px;border:1px solid var(--line);background:#fff;color:var(--ink3);
  font-size:12px;line-height:1;cursor:pointer;padding:0;font-family:inherit}
.fl-btn:hover:not(:disabled){border-color:#CFDCF2;color:var(--ink);background:var(--hover)}
.fl-btn:disabled{opacity:.3;cursor:not-allowed}
.fl-btn-no{margin-left:4px}
.fl-btn-no:hover:not(:disabled){color:#C0243C;border-color:#FFD3DC;background:var(--danger-l)}
.fl-add{margin-top:auto;height:32px;border-radius:9px;border:1px dashed #CFDCF2;background:#fff;color:var(--ink2);
  font-size:12px;cursor:pointer;font-family:inherit}
.fl-add:hover{border-color:var(--brand);color:var(--brand);background:var(--brand-l)}
.fl-empty{padding:16px 4px;text-align:center;font-size:12px;color:var(--ink3)}
.fl-note{background:#FFF6E8;border:1px solid #FFE2BC;color:#8A5A12;font-size:12.5px;padding:9px 13px;border-radius:10px;margin-bottom:12px}
.fl-foot{margin-top:14px;font-size:11.5px;color:var(--ink3);line-height:1.8}
.fl-warn{background:var(--surface-2);border-radius:10px;padding:11px 13px;font-size:12.5px;color:var(--ink2);line-height:1.75}
.fl-warn-q{background:var(--ok-l);color:#0B7A5C}
@media(max-width:1200px){.fl-row{grid-template-columns:repeat(2,1fr)}}
@media(max-width:720px){.fl-row{grid-template-columns:1fr}}

/* ================= 项目流程设置（P1） ================= */
.pf-top{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap;margin-bottom:10px}
.pf-sel{display:flex;flex-direction:column;gap:5px;min-width:200px}
.pf-sel label{font-size:11.5px;font-weight:600;color:var(--ink3)}
.pf-sel select{height:34px;font-size:13px}
.pf-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px;
  background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:9px 12px}
.pf-bar b{color:var(--ink)}
.pf-who{display:inline-flex;align-items:center;gap:6px;padding-right:10px;border-right:1px solid var(--line);
  font-size:12.5px;font-weight:700;color:var(--ink);white-space:nowrap;letter-spacing:-.1px}
.pf-who i{width:9px;height:9px;border-radius:3px;flex:none;display:block}
.pf-date{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:5px;
  font-size:14px;font-weight:600;color:var(--ink);letter-spacing:-.2px;font-variant-numeric:tabular-nums}
.pf-date-no{color:#B4761A;font-size:12.5px}
.pf-days{font-size:11px;font-weight:600;color:var(--ink3);background:var(--surface-2);
  border-radius:6px;padding:1px 6px;letter-spacing:0}
.pf-meta{margin-top:3px;font-size:11px;color:var(--ink3);font-variant-numeric:tabular-nums}
.pf-unset{border-style:dashed;border-color:#F0D9B4;background:#FFFCF6}
.pf-need{color:#B4761A!important}
.pf-two{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.pf-hint{margin-top:-2px;margin-bottom:12px;font-size:12px;line-height:1.65;color:var(--ink2);
  background:var(--surface-2);border-radius:9px;padding:8px 11px;min-height:34px}
.pf-pick-list{max-height:320px;overflow:auto;display:flex;flex-direction:column;gap:7px;
  margin-top:4px;padding-right:2px}
.pf-pick{display:flex;gap:9px;align-items:flex-start;border:1px solid var(--line2);
  border-radius:10px;padding:9px 11px;background:#fff;cursor:pointer}
.pf-pick:hover{border-color:#CFDCF2;background:var(--hover)}
.pf-pick.off{background:var(--surface-2);cursor:default;opacity:.72}
.pf-pick input{margin-top:2px;flex:none}
.pf-pick-m{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
.pf-pick-m b{font-size:13px;font-weight:600;color:var(--ink)}
.pf-pick-m i{font-style:normal;font-size:10.5px;color:var(--ink3)}
.pf-pick-m em{font-style:normal;font-size:11.5px;color:var(--ink2);line-height:1.5}
.pf-pick-t{flex:none;font-size:10.5px;color:var(--ink3);background:var(--surface-2);
  border-radius:6px;padding:1px 6px;align-self:center}
.pf-sum{display:inline-block;padding:1px 7px;border-radius:6px;background:#fff;
  border:1px solid var(--line);font-size:11px;font-weight:700;color:var(--ink2);font-variant-numeric:tabular-nums}
.pf-nt{font-size:12px;line-height:1.6;color:var(--ink3)}
.pf-nt b{color:var(--ink2)}

/* ===== 基础配置 · 项目管理（cfgProject） ===== */
.pj-card{padding:16px 18px}
.pj-hd{display:flex;align-items:flex-start;gap:16px;margin-bottom:14px}
.pj-hd>.btn{margin-left:auto;flex:none}
.pj-t{font-size:15px;font-weight:700;letter-spacing:-.2px}
.pj-d{font-size:12px;color:var(--ink3);line-height:1.75;margin-top:5px}
.pj-tbl{border-top:1px solid var(--line)}
.pj-row{display:grid;grid-template-columns:minmax(150px,1.4fr) 74px 104px 104px 96px 92px 132px 52px;
  gap:10px;align-items:center;padding:9px 0;border-bottom:1px solid var(--line2)}
.pj-row.pj-head{font-size:12px;color:var(--ink3);font-weight:600;padding:8px 0}
.pj-row.off{background:var(--surface-2)}
.pj-name{display:flex;align-items:center;gap:8px;min-width:0}
.pj-dot{width:9px;height:9px;border-radius:3px;flex:none}
.pj-in{height:30px;font-size:12.5px;padding:0 9px}
.pj-na{font-size:12px;color:var(--ink3);padding-left:2px}
.pj-camp{display:flex;align-items:center;gap:8px;min-width:0}
.pj-chip{font-size:11px;padding:3px 8px;border-radius:20px;white-space:nowrap}
.pj-chip.on{background:var(--brand-l);color:var(--brand-d);font-weight:600}
.pj-cnt{font-size:11.5px;color:var(--ink3);white-space:nowrap;font-variant-numeric:tabular-nums}
.pj-del{background:none;border:none;color:#E0344F;font-size:12px;cursor:pointer;padding:2px 4px}
.pj-del:hover{text-decoration:underline}
.pj-foot{font-size:12px;color:var(--ink3);margin-top:12px}
.pj-sel{height:34px;font-size:13px}
.pj-st{text-align:center;font-variant-numeric:tabular-nums;padding:0 4px}
.pj-st::-webkit-inner-spin-button,.pj-st::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
.pj-st{-moz-appearance:textfield;appearance:textfield}
/* 窄屏：站号列挤进来后，收紧各列宽度，避免横向滚动条 */
@media(max-width:1200px){
  .pj-row{grid-template-columns:minmax(104px,1fr) 54px 80px 80px 76px 84px 96px 38px;gap:7px}
  .pj-in{padding:0 6px;font-size:12px}
}

/* ===== 基础配置 · 指标管理（cfgMetric） ===== */
.mt-card{padding:16px 18px}
.mt-row{display:grid;grid-template-columns:150px minmax(220px,1fr) 92px 50px;
  gap:10px;align-items:center;padding:9px 0;border-bottom:1px solid var(--line2)}
.mt-row.mt-head{font-size:12px;color:var(--ink3);font-weight:600;padding:8px 0;border-top:1px solid var(--line);margin-top:4px}
.mt-name{height:32px;font-size:13px;font-weight:600;padding:0 9px}
.mt-desc{height:32px;font-size:12.5px;padding:0 9px}
.mt-used{font-size:11.5px;color:var(--ink3);text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.mt-del{background:none;border:none;color:#E0344F;font-size:12px;cursor:pointer;padding:2px 4px}
.mt-del:hover{text-decoration:underline}

/* ===== 项目配置 · 排期设置（pmTerm） ===== */
.tm-card{padding:2px 18px}
.tm-row{padding:14px 0;border-bottom:1px solid var(--line2)}
.tm-row:last-child{border-bottom:none}
.tm-hd{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.tm-nm{display:flex;align-items:baseline;gap:8px;min-width:172px}
.tm-nm b{font-size:14px;letter-spacing:-.2px}
.tm-no{font-size:11.5px;color:var(--ink3)}
.tm-span{font-size:12.5px;color:var(--ink2);font-variant-numeric:tabular-nums}
.tm-cnt{font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums}
.tm-act{margin-left:auto;display:flex;gap:8px}
.tm-tchs{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.tm-tch{display:inline-flex;align-items:center;gap:7px;padding:5px 6px 5px 11px;border-radius:9px;
  background:var(--surface-2);font-size:12.5px}
.tm-tch b{font-weight:600}
.tm-tch em{font-style:normal;color:var(--ink3);font-size:11px;font-variant-numeric:tabular-nums}
.tm-rm{cursor:pointer;color:var(--ink3);font-style:normal;font-weight:700;padding:0 4px}
.tm-rm:hover{color:#E0344F}
.tm-none{font-size:12px;color:var(--ink3)}
.tm-empty{padding:26px 0;text-align:center;color:var(--ink3);font-size:13px}
.tm-foot{font-size:12px;color:var(--ink3);line-height:1.85;margin:10px 2px 0}
.tm-picks{max-height:340px;overflow:auto;margin-top:10px}
.tm-pick{display:flex;align-items:center;gap:10px;padding:9px 12px;border:1px solid var(--line2);
  border-radius:10px;margin-bottom:8px;cursor:pointer}
.tm-pick:hover{border-color:#C9DAFF}
.tm-pick input{width:16px;height:16px;accent-color:var(--brand);cursor:pointer;flex:none}
.tm-pick b{font-size:13px;min-width:72px}
/* 选中列表里标身份：小组成长师 / 项目负责人（2026-11-02 起这两种身份也能带营） */
.tm-pr{font-style:normal;font-size:10.5px;font-weight:600;padding:1px 7px;border-radius:6px;
  background:#EAF0FF;color:#3A66C8;white-space:nowrap}
.tm-pick em{font-style:normal;font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.tm-pick span{font-size:11.5px;color:var(--ink3);margin-left:auto;min-width:0;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}

/* ===== 项目配置 · 指标设置（pmMetric） ===== */
.im-card{padding:2px 18px}
.im-row{display:grid;grid-template-columns:minmax(220px,1fr) 84px 108px 66px;
  gap:10px;align-items:center;padding:11px 0;border-bottom:1px solid var(--line2)}
.im-row:last-child{border-bottom:none}
.im-row.im-head{font-size:12px;color:var(--ink3);font-weight:600;padding:9px 0}
.im-nm b{font-size:13.5px;display:block;letter-spacing:-.1px}
.im-nm em{font-style:normal;font-size:11.5px;color:var(--ink3);display:block;margin-top:2px}
.im-row.off .im-nm b{color:var(--ink3)}
.im-ck{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink2);cursor:pointer}
.im-ck input{width:16px;height:16px;accent-color:var(--brand);cursor:pointer}
.im-mv{display:flex;gap:4px}
.im-mv button{width:26px;height:26px;border:1px solid var(--line);background:#fff;border-radius:7px;
  cursor:pointer;color:var(--ink2);font-size:12px;line-height:1}
.im-mv button:hover:not(:disabled){border-color:#C9DAFF;color:var(--brand)}
.im-mv button:disabled{opacity:.35;cursor:default}

/* ===== 四栏：序号 / 同色四档（浅 → 深，与时间推进同向）/ 卡片之间的推进箭头 =====
   流程管理与项目流程设置两页共用。四栏是一条时间轴的四段，
   所以用「同一蓝色由浅到深」表示先后，不引第二种颜色。 */
.fl-col{border-top-width:3px}
.fl-col[data-flow=pre]{border-top-color:rgba(47,107,255,.3)}
.fl-col[data-flow=ing]{border-top-color:rgba(47,107,255,.5)}
.fl-col[data-flow=before_end]{border-top-color:rgba(47,107,255,.72)}
.fl-col[data-flow=after]{border-top-color:var(--brand)}

/* 列头跟着同一条梯度：底色越晚越蓝，标题越晚越深，四段一眼能分开 */
.fl-col[data-flow=pre] .fl-col-h{background:rgba(47,107,255,.045);color:#6F86BE}
.fl-col[data-flow=ing] .fl-col-h{background:rgba(47,107,255,.10);color:#4E6AA8}
.fl-col[data-flow=before_end] .fl-col-h{background:rgba(47,107,255,.17);color:#33508F}
.fl-col[data-flow=after] .fl-col-h{background:rgba(47,107,255,.25);color:#1E3573}
.fl-col-h b{color:inherit}
.fl-col-h span{background:rgba(255,255,255,.92);border:1px solid rgba(47,107,255,.14);color:inherit}
.fl-col-h em{color:inherit;opacity:.7}

.fl-no{width:16px;height:16px;flex:none;border-radius:5px;background:rgba(255,255,255,.92);
  border:1px solid rgba(47,107,255,.16);color:inherit;font-size:10.5px;font-weight:700;
  font-style:normal;display:flex;align-items:center;justify-content:center;
  font-variant-numeric:tabular-nums}

/* 同一栏内相邻两张卡片之间的小箭头：上下方向就是先后 */
.fl-item{position:relative}
.fl-item + .fl-item::before{content:'';position:absolute;left:50%;top:-12px;width:6px;height:6px;
  margin-left:-3px;border-right:1.5px solid rgba(47,107,255,.5);
  border-bottom:1.5px solid rgba(47,107,255,.5);transform:rotate(45deg)}

/* ============ 订单管理 / 学员名单（2026-11-02） ============
   新增两块页面：订单（od- 前缀）和人员（pp- 前缀）。只加不改，不动上面任何规则。 */

/* ---------- 统计卡 ---------- */
.od-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.od-card{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;box-shadow:var(--sh)}
.od-card-l{font-size:12.5px;color:var(--ink2)}
.od-card-v{font-size:27px;font-weight:800;letter-spacing:-1px;margin-top:5px;font-variant-numeric:tabular-nums}
.od-card-s{font-size:11.5px;color:var(--ink3);margin-top:2px}
.od-card.warn{border-color:#FFE4BE}.od-card.warn .od-card-v{color:#C97B05}
.od-card.ok .od-card-v{color:var(--ok-d)}
.od-card.bad{border-color:#FFD6E4}.od-card.bad .od-card-v{color:#E0344F}

/* ---------- 筛选条 ---------- */
.od-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* 注意：styles.css 里 `select.input{width:100%}` 是「标签+类」，特异性比单个类高，
   所以这里必须也用 `select.od-sel` / `input.od-search`，否则下拉会各占一整行。 */
select.od-sel{width:auto;min-width:118px;height:34px;font-size:12.5px;padding:0 8px;flex:0 0 auto}
input.od-search{width:196px;height:34px;font-size:12.5px;flex:0 0 auto}
/* 老师姓名查询：窄一点，跟关键字框并排 */
input.od-kw{width:150px}
.od-gap{flex:1;min-width:8px}

/* ---------- 表格 ---------- */
.od-table td{font-size:12.5px;vertical-align:middle}
.od-ck{width:32px;text-align:center}
.od-p{font-size:12.5px;color:var(--ink);line-height:1.35}
.od-sub{font-size:11px;color:var(--ink3);margin-top:1px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.od-t{font-size:11.5px;color:var(--ink2);max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.od-miss{color:#C97B05;font-size:11.5px;font-weight:600}
.od-lock{font-size:11.5px;color:var(--ink3)}
.od-mini{height:28px;font-size:11.5px;padding:0 6px;width:auto;min-width:96px}
select.od-mini{height:28px;font-size:11.5px;padding:0 6px;width:auto;min-width:96px}
.od-table tr.od-virtual{background:#FFFCF3}
.od-table tr.od-refund{background:#FFF7F9}
.od-table tr.od-virtual td:first-child{border-left:3px solid #F5B851}
.od-pager{display:flex;align-items:center;gap:10px;justify-content:flex-end;padding:12px 4px 2px;
  font-size:12px;color:var(--ink2)}
.od-pager b{color:var(--ink)}
/* 没有数据时分页那一行整块收掉，不然会白占一条高 */
.od-pager:empty{display:none}

/* ---------- 导入卡片 ---------- */
.od-imps{display:grid;grid-template-columns:repeat(auto-fill,minmax(310px,1fr));gap:12px}
.od-imp{border:1px solid var(--line);border-radius:14px;padding:14px 15px;background:var(--surface);
  display:flex;flex-direction:column;gap:6px}
.od-imp-h{font-size:13.5px;font-weight:700;color:var(--ink);display:flex;align-items:center;gap:8px}
.od-need{font-size:10.5px;font-weight:600;color:#C97B05;background:var(--warn-l);padding:2px 6px;border-radius:6px}
.od-imp-d{font-size:12px;color:var(--ink2);line-height:1.6}
.od-imp-tip{font-size:11px;color:var(--ink3);line-height:1.55}
.od-imp-act{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:4px}
.od-fname{font-size:11px;color:var(--ink3);max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.od-wait{display:flex;align-items:center;gap:9px;font-size:12px;color:var(--ink2);padding:10px 0}
.od-res{margin-top:6px;border-top:1px dashed var(--line);padding-top:10px}
.od-res-grid{display:flex;flex-wrap:wrap;gap:14px;font-size:12px;color:var(--ink2)}
.od-res-grid span{margin-right:5px}
.od-res-grid b{color:var(--ink);font-variant-numeric:tabular-nums}
.od-bad{margin-top:8px;font-size:11.5px;color:var(--ink2)}
.od-bad summary{cursor:pointer;color:#C97B05}
.od-bad div{margin-top:6px;max-height:120px;overflow:auto;line-height:1.75;background:#fff;border-radius:8px;padding:8px 10px}
.od-res-foot{display:flex;align-items:center;gap:10px;margin-top:10px}
.od-res-foot span{font-size:11.5px;color:var(--ink3)}
.od-done{color:var(--ok-d)!important;font-weight:600}

/* ---------- 人员名单 ---------- */
.pp-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
input.pp-search{width:180px;height:34px;font-size:12.5px;flex:0 0 auto}
.pp-gap{flex:1}
.pp-total{font-size:12px;color:var(--ink2)}
.pp-total b{color:var(--ink);font-variant-numeric:tabular-nums}
.pp-zero{color:var(--ink3)}
/* 备注列（2026-11-03）：允许换行、限宽；命中「不合格 / 重大投诉 / 疑似同行 / 拉黑」整格转红 */
.pp-ntd{white-space:normal;min-width:150px;max-width:280px}
.pp-note{display:inline-block;color:var(--ink2);line-height:1.6}
.pp-note.bad{color:#E0344F;font-weight:600;background:var(--danger-l);border-radius:7px;padding:2px 7px}
.tag.t-bad{background:var(--danger);color:#fff}
.pp-row{cursor:pointer}
.pp-row:hover{background:var(--hover)}

.pp-head{display:flex;align-items:center;gap:14px;padding-bottom:14px;border-bottom:1px solid var(--line);margin-bottom:16px}
.pp-avatar{width:46px;height:46px;border-radius:14px;background:var(--brand-l);color:var(--brand-d);
  display:grid;place-items:center;font-size:18px;font-weight:700;flex:none}
.pp-id{flex:1;min-width:0}
.pp-name{font-size:16px;font-weight:700;color:var(--ink)}
.pp-meta{font-size:12px;color:var(--ink3);margin-top:2px}
/* 2026-11-03：详情弹窗改用通用分块卡片 .m-sec（styles.css）+ modalSec()（app.js）。
   原来的 .pp-sec / .pp-scroll 已废弃：每个表 230px 各自滚动，弹窗里出现好几条滚动条。
   以后弹窗里放表格一律不写 max-height / overflow。 */

.pp-quick{max-width:660px}
.pp-quick-t{font-size:15px;font-weight:700;color:var(--ink)}
.pp-quick-d{font-size:12.5px;color:var(--ink2);margin-top:5px;line-height:1.7}
.pp-quick-bar{display:flex;gap:9px;margin-top:14px}
input.pp-quick-in{flex:1;height:38px;width:auto}
.pp-hits{margin-top:14px;display:flex;flex-direction:column;gap:8px}
.pp-hit{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 14px;
  border:1px solid var(--line);border-radius:12px;cursor:pointer;transition:.15s}
.pp-hit:hover{border-color:#C9DAFF;background:var(--hover)}
.pp-hit b{font-size:13.5px;color:var(--ink)}
.pp-hit span{font-size:12px;color:var(--ink3);margin-left:9px}
.pp-hit-r{font-size:12px;color:var(--ink2)}

@media(max-width:1100px){
  .od-cards{grid-template-columns:repeat(2,1fr)}
  input.od-search{width:150px}
}

/* 服务单里没有学员真名时先存昵称，标一下免得被当成真名 */
.pp-nick{display:inline-block;margin-left:5px;font-size:10px;font-weight:600;color:#8A5A05;
  background:var(--warn-l);padding:1px 5px;border-radius:5px;vertical-align:1px}

/* 名单表列宽固定前三列，否则「姓名」会被拉伸到半屏、数字列全挤在右边 */
.pp-table th:first-child,.pp-table td:first-child{width:190px;max-width:190px}
.pp-table th:nth-child(2),.pp-table td:nth-child(2){width:140px}
.pp-table th:nth-child(3),.pp-table td:nth-child(3){width:100px}
.pp-table th:last-child{width:80px}

/* ============ 数据导入（2026-11-02 改版：横向选项卡，imx- 前缀） ============
   只加不改：上面 od- 那套导入卡片已经被这版取代，规则留着不动（旧页面可能还有用），
   新页面一律用 imx-。层次是「页头 → 页签 → 页内三步 → 结果」，卡片不做套娃。 */

/* ---------- 页头 ---------- */
.imx-hd{margin:0 0 12px}
.imx-hd-t{font-size:19px;font-weight:800;letter-spacing:-.4px;color:var(--ink)}
.imx-hd-d{font-size:12.5px;color:var(--ink2);margin-top:4px}

/* ---------- 页签 ---------- */
.imx-tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin-bottom:14px;overflow-x:auto}
.imx-tabs::-webkit-scrollbar{height:0}
.imx-tab{display:inline-flex;align-items:center;gap:7px;height:42px;padding:0 15px;border:none;background:none;
  color:var(--ink2);font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;white-space:nowrap;
  border-bottom:2.5px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s}
.imx-tab:hover{color:var(--ink)}
.imx-tab.on{color:var(--brand-d);border-bottom-color:var(--brand)}
.imx-tab.on .imx-i{color:var(--brand)}
.imx-i{flex:none;color:currentColor}

/* ---------- 页内主体 ---------- */
.imx-pane{background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh);padding:18px 20px 20px}
.imx-pane-hd{display:flex;align-items:flex-start;gap:12px;padding-bottom:16px;border-bottom:1px solid var(--line2)}
.imx-pane-ic{width:40px;height:40px;border-radius:12px;background:var(--brand-l);color:var(--brand-d);
  display:grid;place-items:center;flex:none}
.imx-pane-t{font-size:15.5px;font-weight:800;letter-spacing:-.3px;color:var(--ink)}
.imx-pane-d{font-size:12.5px;color:var(--ink2);margin-top:5px;line-height:1.65;max-width:840px}

/* ---------- 三步流程 ---------- */
.imx-flow{display:flex;align-items:stretch;gap:10px;margin-top:16px;flex-wrap:wrap}
.imx-step{flex:1;min-width:210px;display:flex;gap:10px;padding:13px 14px;border:1px solid var(--line);
  border-radius:14px;background:var(--surface);transition:border-color .15s,background .15s}
.imx-step.wide{flex:1 1 100%;max-width:none}
.imx-step.off{opacity:.62}
.imx-n{width:22px;height:22px;border-radius:50%;background:var(--brand);color:#fff;font-size:12px;font-weight:700;
  display:grid;place-items:center;flex:none;font-variant-numeric:tabular-nums}
.imx-step.off .imx-n{background:#C7D2E4}
.imx-sb{flex:1;min-width:0;display:flex;flex-direction:column;gap:7px}
.imx-sl{font-size:12px;font-weight:700;color:var(--ink2);letter-spacing:.2px}
.imx-ar{display:flex;align-items:center;color:#C7D2E4;flex:none}
select.imx-sel{width:100%;height:36px;font-size:12.5px;padding:0 9px}
select.imx-sel2{width:auto;min-width:170px;height:36px;font-size:12.5px;padding:0 9px}
.imx-act{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.imx-fn{font-size:11px;color:var(--ink3);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------- 图标按钮 ---------- */
.imx-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:36px;padding:0 13px;
  border-radius:10px;border:1px solid var(--line);background:#fff;color:var(--ink);font-size:12.5px;
  font-weight:600;cursor:pointer;font-family:inherit;transition:.15s;white-space:nowrap}
.imx-btn:hover:not(:disabled){border-color:#C9DAFF;color:var(--brand-d);background:var(--hover)}
.imx-btn:disabled{opacity:.45;cursor:not-allowed}
.imx-btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.imx-btn.primary:hover:not(:disabled){background:var(--brand-d);border-color:var(--brand-d);color:#fff}
.imx-ibtn{width:30px;height:30px;border-radius:9px;border:1px solid var(--line);background:#fff;color:var(--ink2);
  display:inline-grid;place-items:center;cursor:pointer;transition:.15s}
.imx-ibtn:hover{border-color:#F3C6C6;background:#FFF6F6;color:#D14343}

/* ---------- 提示与列清单 ---------- */
.imx-tip{display:flex;align-items:flex-start;gap:8px;margin-top:12px;padding:10px 12px;border-radius:11px;
  background:var(--warn-l);color:#8A5A05;font-size:11.5px;line-height:1.6}
.imx-tip .imx-i{margin-top:1px;flex:none}
.imx-cols{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin-top:10px}
.imx-cols-t{font-size:11.5px;color:var(--ink3);font-weight:600;margin-right:2px}
.imx-col{font-size:11.5px;color:var(--ink2);background:var(--surface-2);border-radius:7px;padding:3px 8px;
  font-variant-numeric:tabular-nums}

/* ---------- 导入结果 ---------- */
.imx-res{margin-top:16px;border:1px solid #D7E3FF;border-radius:14px;background:var(--brand-l);padding:14px 16px}
.imx-res-h{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:700;color:var(--brand-d)}
.imx-res-h em{font-style:normal;font-size:11.5px;color:var(--ink3);font-weight:500;
  max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.imx-res-grid{display:flex;flex-wrap:wrap;gap:22px;margin-top:12px}
.imx-res-grid>div{font-size:12px;color:var(--ink2);display:flex;flex-direction:column;gap:3px}
.imx-res-grid>div>span{font-size:11px;color:var(--ink3)}
.imx-res-grid b{font-size:19px;font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:-.4px}
.imx-res-foot{display:flex;align-items:center;gap:10px;margin-top:13px;padding-top:12px;
  border-top:1px dashed #C9DAFF;flex-wrap:wrap}
.imx-res-foot>span{font-size:11.5px;color:var(--ink2)}
.imx-ok{color:var(--ok-d)}
.imx-bad{color:#D14343}
.imx-dim{color:var(--ink3)}
.imx-done{color:var(--ok-d)!important;font-weight:700}

/* ---------- 手工添加单条 ---------- */
.imx-manual{margin-top:16px;border:1px dashed #C9DAFF;border-radius:14px;padding:14px 16px;background:var(--surface)}
.imx-manual-h{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:700;color:var(--ink)}
.imx-manual-h .imx-i{color:var(--brand)}
.imx-manual-h span{font-size:11.5px;font-weight:500;color:var(--ink3);margin-left:4px}
.imx-manual-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px}
input.imx-min{width:150px;height:36px;font-size:12.5px;flex:0 0 auto}

/* ---------- 日志 ---------- */
.imx-filter{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:16px;padding:12px 14px;
  background:var(--surface);border:1px solid var(--line);border-radius:13px}
.imx-fl{font-size:12px;font-weight:600;color:var(--ink2)}
.imx-to{font-size:11.5px;color:var(--ink3)}
input.imx-date{width:150px;height:34px;font-size:12.5px;flex:0 0 auto}
.imx-tbl-wrap{margin-top:14px;border:1px solid var(--line);border-radius:13px;overflow:auto;max-height:62vh}
.imx-tbl{width:100%;border-collapse:collapse}
.imx-tbl thead th{position:sticky;top:0;background:#fff;z-index:2;text-align:left;font-size:11.5px;
  color:var(--ink3);font-weight:600;padding:10px 12px;box-shadow:inset 0 -1px 0 var(--line)}
.imx-tbl td{font-size:12.5px;padding:10px 12px;border-bottom:1px solid var(--line2);vertical-align:middle}
.imx-tbl tr:last-child td{border-bottom:none}
.imx-tbl tbody tr:hover{background:var(--hover)}
.imx-tnum{font-size:11.5px;color:var(--ink2);font-variant-numeric:tabular-nums;white-space:nowrap}
.imx-file{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink2);font-size:12px}
.imx-op{text-align:right;width:56px}

@media(max-width:900px){
  .imx-step{min-width:100%}
  .imx-ar{display:none}
  .imx-res-grid{gap:16px}
}

/* ============ 订单管理改版（2026-11-02，od2- 前缀；上面 od- 的规则一律不动） ============
   四张多数字统计卡 + 12 列紧凑表格 + 行内 4 个图标动作 + 学员详情抽屉式弹窗。 */

.od2-cards{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
.od2-card{background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh);padding:14px 16px}
.od2-card-l{font-size:11.5px;font-weight:700;color:var(--ink3);letter-spacing:.3px;margin-bottom:11px}
.od2-kvs{display:flex;align-items:flex-end;gap:18px;flex-wrap:wrap}
.od2-kv{display:flex;flex-direction:column;gap:2px;min-width:0}
.od2-kv b{font-size:22px;font-weight:800;letter-spacing:-.6px;font-variant-numeric:tabular-nums;color:var(--ink);line-height:1.1}
.od2-kv span{font-size:11.5px;color:var(--ink3);white-space:nowrap}
.od2-kv.ok b{color:var(--ok-d)}
.od2-kv.warn b{color:#C77700}
.od2-kv.bad b{color:#D14343}
.od2-kv.dim b{color:var(--ink3)}

/* ---------- 表格 ---------- */
.od2-table{min-width:1336px}
.od2-table thead th{font-size:11.5px;white-space:nowrap}
.od2-table td{font-size:12.5px;padding:9px 10px;vertical-align:middle}
.od2-tel{white-space:nowrap;font-variant-numeric:tabular-nums}
.od2-city{color:var(--ink2);white-space:nowrap;max-width:76px;overflow:hidden;text-overflow:ellipsis}
.od2-course{font-size:13px;font-weight:600;color:var(--ink);line-height:1.35;max-width:260px}
.od2-term{font-size:11px;color:var(--ink3);margin-top:2px;line-height:1.3;max-width:260px}
.od2-type,.od2-svc{white-space:nowrap;color:var(--ink2);font-size:12px}
.od2-svc{font-variant-numeric:tabular-nums;color:var(--ink3)}
.od2-dim{color:var(--ink3)}
.od2-link{color:var(--brand-d);cursor:pointer;font-weight:600;text-decoration:none;border-bottom:1px dashed transparent}
.od2-link:hover{border-bottom-color:var(--brand)}
.od2-tel .od2-link{font-weight:500;font-variant-numeric:tabular-nums}
.od2-name{font-weight:700}
.od2-off td{opacity:.62}
.od2-offtag{display:inline-block;margin-left:5px;font-size:10.5px;color:#8A5A05;background:var(--warn-l);border-radius:5px;padding:1px 5px}

/* ---------- 行内 3 个动作（图标 + 文字，2026-11-03） ---------- */
.od2-ops{text-align:right;white-space:nowrap}
.od2-ib{height:28px;padding:0 8px;border-radius:7px;border:1px solid var(--line);background:#fff;color:var(--ink2);
  display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-family:inherit;line-height:1;cursor:pointer;
  margin-left:5px;transition:.15s;vertical-align:middle;white-space:nowrap}
.od2-ib svg{flex:0 0 auto}
.od2-ib:hover:not(:disabled){border-color:#C9DAFF;background:var(--brand-l);color:var(--brand-d)}
.od2-ib:disabled{opacity:.35;cursor:not-allowed}
.od2-danger{border-color:#F3C6C6;background:#FFF8F8;color:#C0392B}
.od2-danger:hover:not(:disabled){border-color:#E7A9A9;background:#FFF1F1;color:#B03030}

/* ---------- 学员详情弹窗 ---------- */
.od2-sec{font-size:12px;font-weight:700;color:var(--ink2);margin:16px 0 8px;padding-left:8px;border-left:3px solid var(--brand)}
.od2-scroll{max-height:230px;overflow:auto;border:1px solid var(--line2);border-radius:10px;background:var(--surface)}
.od2-log{display:flex;align-items:baseline;gap:10px;padding:7px 11px;border-bottom:1px solid var(--line2);font-size:12px}
.od2-log:last-child{border-bottom:none}
.od2-logt{flex:none;width:84px;color:var(--ink3);font-variant-numeric:tabular-nums;font-size:11px}
.od2-logf{flex:none;width:110px;color:var(--ink);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.od2-logv{flex:1;min-width:0;color:var(--ink2);word-break:break-all}
.od2-logv b{color:var(--ink)}
.od2-logo{flex:none;color:var(--ink3);font-size:11px;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

@media(max-width:1180px){
  .od2-cards{grid-template-columns:repeat(2,1fr)}
}
@media(max-width:680px){
  .od2-cards{grid-template-columns:1fr}
}

/* 志愿者详情里的证书链接（2026-11-03，只加不改） */
.pp-link{color:var(--brand-d);text-decoration:none;font-size:12.5px;font-weight:600}
.pp-link:hover{text-decoration:underline}

/* ---------- 志愿者异常行为（2026-11-03） ---------- */
.ab-tabs{margin-bottom:14px}
.ab-tip{font-size:12.5px;color:var(--ink2);background:var(--brand-l);border-radius:12px;
  padding:11px 14px;line-height:1.75}
.ab-tip b{color:var(--brand-d)}
.ab-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:15px 16px;margin-top:16px}
.ab-f{display:flex;flex-direction:column;gap:6px;min-width:0}
.ab-f.full{grid-column:1 / -1}
.ab-f>label{font-size:12px;font-weight:600;color:var(--ink2)}
.ab-f>label i{color:var(--danger);font-style:normal;margin-left:2px}
.ab-f .input{width:100%}
textarea.ab-ta{width:100%;min-height:92px;height:auto;padding:10px 12px;line-height:1.7;
  resize:vertical;font-family:inherit;font-size:13px;border:1px solid var(--line);border-radius:10px;outline:none}
textarea.ab-ta:focus{border-color:var(--brand)}
.ab-foot{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}
.ab-sum{margin-top:10px;font-size:12px;color:var(--ink3)}
.ab-sub{font-size:11px;color:var(--ink3);margin-top:2px}
@media (max-width:720px){.ab-form{grid-template-columns:1fr}}

/* ---------- 志愿者承担记录管理（2026-11-03，仅管理员） ---------- */
.vr-who{display:flex;align-items:center;gap:14px;padding-bottom:14px;border-bottom:1px solid var(--line);margin-bottom:10px}
.vr-none{padding:34px 12px;text-align:center;color:var(--ink3);font-size:13px;line-height:1.9}
.vr-none b{color:var(--ink)}
.vr-none-s{font-size:12px;margin-top:4px;color:var(--ink3)}
/* 异常行为审核页的两个筛选下拉（必须写 select.input.ab-sel：styles.css 里
   select.input 的 width:100% 特异性比单个类高，只写 .ab-sel 压不住，下拉会占满一整行） */
select.input.ab-sel{width:auto;min-width:110px;height:34px;font-size:12.5px;flex:0 0 auto;padding:0 30px 0 11px}
.ab-ar{display:inline-flex;flex-direction:column;align-items:flex-end;gap:2px}

/* 操作列两颗按钮之间留缝，避免贴在一起误点 */
.vr-table .btn+.btn{margin-left:6px}

/* ================= 我的班级 · 首屏重做（2026-11-03） ================= */
/* 顶部大标题里的当前班级（2026-11-04）：跟在「我的班级」后面，淡蓝底 + 主色字，
   和下面一排操作控件分得开，扫一眼就知道现在看的是哪个班。 */
.pg-tt-cls{display:inline-flex;align-items:center;max-width:min(46vw,420px);margin-left:10px;
  padding:1px 10px;border-radius:8px;background:var(--brand-l);color:var(--brand-d);
  border:1px solid #DCE6FF;font-size:13.5px;font-weight:700;letter-spacing:0;
  vertical-align:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 2026-11-06：自己带的班绿色、其他老师的班蓝色（管理员/负责人会跨班看） */
.pg-tt-cls.is-mine{background:#E9F9F2;color:#0E9F6E;border-color:#C6EEDD}
.pg-tt-cls.is-other{background:#EEF6FF;color:#1890FF;border-color:#D6E9FF}
@media (max-width:900px){.pg-tt-cls{max-width:40vw;font-size:12px;padding:0 7px;margin-left:7px}}

/* ---- 标题行一行式（2026-11-08 方案 A）----
   原来「大标题」在顶栏、「班级下拉 + 项目/排期按钮」在下面单独一行，
   中间还夹着一条灰说明。现在并成一行：
   我的班级 ｜ [班级名 ▾] ............ 开营进度 · 课表。
   下面 .cp-bar* 那套（select 外壳 / 更多班级按钮）已不再使用，留着不删，
   免得别处还有引用；真要清理时整段一起删。 */
.pg-hwrap{flex:1;min-width:0}
.pg-hrow{display:flex;align-items:center;gap:12px;min-width:0}
.pg-hrow .pg-h-t{font-size:19px;font-weight:800;letter-spacing:-.3px;white-space:nowrap;flex:none}
.cp-headsel{position:relative;display:inline-flex;min-width:0}
.cp-headbtn{display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 10px;border-radius:9px;
  border:1px solid #D6E2FF;background:var(--brand-l);color:var(--brand-d);font-family:inherit;
  font-size:13px;font-weight:700;cursor:pointer;max-width:340px;min-width:0;
  transition:background .13s,border-color .13s}
.cp-headbtn:hover{background:#E1EAFF;border-color:#B9CDF7}
.cp-headbtn .vdiv{width:1px;height:14px;background:currentColor;opacity:.28;border-radius:1px;flex:none}
.cp-headbtn .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-headbtn .ar{width:11px;height:11px;flex:none;opacity:.75;transition:transform .16s}
.cp-headsel.open .cp-headbtn .ar{transform:rotate(180deg)}
/* 自己带的班绿色、别人的班蓝色（沿用 2026-11-06 的区分） */
.cp-headbtn.is-mine{border-color:#BFEFDD;background:#E9FBF3;color:var(--ok-d)}
.cp-headbtn.is-mine:hover{background:#DEF8EE;border-color:#A5E7CE}
.cp-headmenu{display:none;position:absolute;left:0;top:calc(100% + 6px);z-index:130;
  min-width:280px;max-width:430px;
  background:#fff;border:1px solid var(--line);border-radius:12px;padding:5px;
  box-shadow:0 12px 30px rgba(19,39,79,.14),0 2px 6px rgba(19,39,79,.07)}
/* 班级列表单独滚动，底部「按项目/排期选班…」固定在菜单里，不用滚到最下面才看得见 */
.cp-hmlist{max-height:272px;overflow-y:auto}
.cp-headsel.open .cp-headmenu{display:block}
.cp-hmlbl{font-size:11px;color:var(--ink3);padding:7px 10px 4px}
.cp-hmitem{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:none;background:none;
  font-family:inherit;font-size:12.5px;color:var(--ink);padding:8px 10px;border-radius:8px;cursor:pointer}
.cp-hmitem:hover{background:var(--hover)}
.cp-hmitem .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-hmitem.on{background:var(--brand-l);color:var(--brand-d);font-weight:700}
.cp-hmitem .tick{margin-left:auto;flex:none;font-size:12px;color:var(--brand)}
.cp-hmitem.act{color:var(--brand-d);font-weight:600}
.cp-hmsep{height:1px;background:var(--line2);margin:5px 8px}
.cp-headpills{margin-left:auto;display:flex;align-items:center;gap:9px;flex:none}
.cp-headpills .cp-pill{height:30px;padding:0 12px;font-size:12px}
/* 窄屏：两枚 pill 先让位（它们是补充信息），班级下拉保留 */
@media (max-width:1080px){
  .cp-headpills{display:none}
  .cp-headbtn{max-width:260px}
}

.cp-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.cp-bar-l{display:flex;align-items:center;gap:9px;min-width:0;flex-wrap:wrap}
.cp-bar-r{margin-left:auto;display:flex;align-items:center;gap:14px;flex-wrap:wrap}
select.cp-cls{height:34px;max-width:360px;border:1px solid var(--line);background:#fff;border-radius:10px;
  padding:0 30px 0 11px;font-family:inherit;font-size:13px;font-weight:600;color:var(--ink);
  appearance:none;cursor:pointer;outline:none;
  background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394A1B8' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 10px center}
select.cp-cls:focus{border-color:#B9CDF7;box-shadow:0 0 0 3px rgba(91,140,255,.12)}
/* 带项目名的那版下拉更宽：项目 · 排期 · 张立玲（开营中/123人） */
select.cp-cls.wide{max-width:470px}
select.cp-cls:disabled{background:#F7F9FC;color:var(--ink3);cursor:not-allowed;font-weight:500}
.cp-prog{min-width:180px}
.cp-prog-t{font-size:12px;color:var(--ink2);text-align:right;font-variant-numeric:tabular-nums}
.cp-prog-bar{height:4px;border-radius:3px;background:var(--surface-2);margin-top:5px;overflow:hidden}
.cp-prog-bar i{display:block;height:100%;background:var(--brand);border-radius:3px;transition:width .3s}
.cp-prog-after .cp-prog-bar i,.cp-prog-none .cp-prog-bar i{background:var(--ink3)}

/* ---- 顶栏重做（2026-11-04）：左边一个「带图标的班级下拉」，右边两枚轻量 pill ----
   下拉外壳自己画（图标 + 原生 select + 箭头），原生 select 只留透明背景，
   这样既能保持可访问性，又不会露出浏览器默认的方块箭头。 */
.cp-selwrap{display:inline-flex;align-items:center;gap:9px;height:40px;padding:0 10px 0 12px;
  border:1px solid var(--line);border-radius:12px;background:#fff;
  box-shadow:0 1px 2px rgba(19,39,79,.04);transition:border-color .12s,box-shadow .12s}
.cp-selwrap:hover{border-color:#CFDCF2}
.cp-selwrap:focus-within{border-color:#B9CDF7;box-shadow:0 0 0 3px rgba(91,140,255,.12)}
.cp-selico{display:inline-flex;color:var(--brand);flex:none}
.cp-selico svg{width:16px;height:16px}
.cp-selwrap select.cp-cls{height:auto;padding:0;border:none;background:none;box-shadow:none;
  font-size:13.5px;font-weight:700;max-width:340px;border-radius:0}
.cp-selwrap select.cp-cls:focus{box-shadow:none}
.cp-selwrap select.cp-cls.wide{max-width:400px}
.cp-selarrow{display:inline-flex;color:var(--ink3);flex:none}
.cp-selarrow svg{width:14px;height:14px}
.cp-morebtn{height:32px;padding:0 11px;border:1px solid var(--line);border-radius:9px;background:#fff;
  font-family:inherit;font-size:12.5px;color:var(--ink2);cursor:pointer;white-space:nowrap;
  transition:border-color .12s,color .12s,background .12s}
.cp-morebtn:hover{border-color:#B9CDF7;color:var(--brand-d);background:#F7FAFF}

/* 轻量标签：一枚 pill 只放一件事，圆角全圆，点开才有内容 */
.cp-pill{display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 14px;border-radius:999px;
  background:#fff;border:1px solid var(--line);font-size:12.5px;color:var(--ink2);
  font-variant-numeric:tabular-nums;white-space:nowrap;box-shadow:0 1px 2px rgba(19,39,79,.04)}
.cp-pill-dot{width:6px;height:6px;border-radius:50%;background:var(--ok);flex:none}
.cp-pl-before .cp-pill-dot{background:var(--brand)}
.cp-pl-in .cp-pill-dot{background:var(--ok);box-shadow:0 0 0 3px rgba(18,184,134,.16)}
.cp-pl-after .cp-pill-dot,.cp-pl-none .cp-pill-dot{background:var(--ink3)}
.cp-pl-before{color:var(--brand-d);border-color:#D6E2FF;background:#F7FAFF}
.cp-pl-none{color:var(--ink3)}
.cp-pill-btn{font-family:inherit;cursor:pointer;transition:border-color .12s,color .12s,background .12s}
.cp-pill-btn svg{width:14px;height:14px;color:var(--ink3);flex:none}
.cp-pill-btn:hover{border-color:#B9CDF7;color:var(--brand-d);background:#F7FAFF}
.cp-pill-btn:hover svg{color:var(--brand)}

/* 时间轴（2026-11-08 三次改版：只画营期 + 营期外压缩显示）
   ① 主轴长度 = 开营日 → 结营日，「第 N 天 / 共 N 天」仍按营期算，进度感才对；
   ② 开营前 / 结营后不进主轴，退成左右两个胶囊，宽度按「轴外 1 天 = 营期 1/3 天」压缩，
      虚线框是提示：这里不是等比例，是压缩过的；
   ③ 营期内两段是并行的（开营中覆盖全营期、结营前覆盖最后 N 天），所以用淡紫叠加而不是拼接，
      拼成互斥区间是假的；
   ④ 只走品牌蓝渐变，不掺红黄绿，避免和「达标 / 落后」的语义色打架；绿点=开营、红点=结营。 */
.cp-axis{background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px 18px 13px;margin-bottom:14px}
.cp-axis-h{display:flex;align-items:baseline;gap:10px;margin-bottom:28px}
.cp-axis-h b{font-size:13px;font-weight:700;color:var(--ink)}
.cp-dg{font-size:12px;color:var(--ink2)}
.cp-dg i{font-style:normal;font-weight:700;color:var(--brand-d);font-variant-numeric:tabular-nums}
.cp-rest{font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums}
.cp-axis-h .cp-axis-rg{margin-left:auto;font-style:normal;font-size:11.5px;color:var(--ink3);
  font-variant-numeric:tabular-nums;white-space:nowrap}

.cp-ax-row{display:flex;align-items:center;gap:6px}
.cp-ax-out{flex:0 0 auto;height:11px;line-height:1;border-radius:999px;display:flex;
  align-items:center;justify-content:center;font-size:10.5px;font-weight:600;color:#374767;
  background:linear-gradient(180deg,#DFE7F4,#D3DDEC);border:1px dashed #9DB2D4;
  overflow:hidden;white-space:nowrap;font-variant-numeric:tabular-nums;padding:0 2px}
.cp-ax-out.s{min-width:52px}
.cp-ax-out.e{min-width:70px}
.cp-ax-out .n{display:none}

.cp-ax-track{position:relative;flex:1;height:12px;border-radius:999px;
  background:linear-gradient(180deg,#E5EBF6,#EDF1FA);
  box-shadow:inset 0 1px 3px rgba(15,26,46,.11),inset 0 0 0 1px rgba(15,26,46,.035)}
/* 顶部压一层柔光，渐变才有厚度，不然像一块平色 */
.cp-ax-track::before{content:"";position:absolute;inset:0;border-radius:999px;z-index:2;
  pointer-events:none;opacity:.5;
  background:linear-gradient(180deg,rgba(255,255,255,.85),rgba(255,255,255,0) 56%)}
.cp-ax-fill{position:absolute;left:0;top:0;bottom:0;border-radius:999px;
  background:linear-gradient(90deg,#7AA6FF 0%,#3E77FB 42%,#1B4BD6 100%);
  box-shadow:0 2px 8px rgba(47,107,255,.28),inset 0 1px 0 rgba(255,255,255,.5),
    inset 0 -1px 0 rgba(9,35,110,.16)}
.cp-ax-rest{position:absolute;top:0;bottom:0;right:0;border-radius:0 999px 999px 0;
  background:linear-gradient(180deg,#DAE3F6,#E7EEFB)}
/* 结营前：叠在轨道右段的淡紫区，表示「这段时间同时属于结营前」 */
.cp-ax-be{position:absolute;top:0;bottom:0;border-radius:0 999px 999px 0;z-index:3;
  background:linear-gradient(90deg,rgba(124,92,255,.24),rgba(109,76,240,.44) 50%,rgba(88,60,214,.38));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.3),inset 0 0 0 1px rgba(124,92,255,.38)}
.cp-ax-nd{position:absolute;top:50%;width:9px;height:9px;border-radius:50%;background:#fff;
  transform:translate(-50%,-50%);z-index:4;box-shadow:0 0 0 2px #fff,0 1px 3px rgba(15,26,46,.18)}
.cp-ax-nd.s{left:0;border:2px solid #12B886}
.cp-ax-nd.e{left:100%;border:2px solid #FF4D6D}
.cp-ax-today{position:absolute;top:50%;width:13px;height:13px;border-radius:50%;background:#fff;
  border:3px solid var(--brand);transform:translate(-50%,-50%);z-index:5;
  box-shadow:0 0 0 3px rgba(47,107,255,.11),0 0 0 6px rgba(47,107,255,.05),
    0 2px 7px rgba(47,107,255,.32)}
.cp-ax-today em{position:absolute;left:50%;bottom:17px;transform:translateX(-50%);
  background:#0F1A2E;color:#fff;font-size:10px;font-weight:600;line-height:1;padding:3px 7px;
  border-radius:6px;white-space:nowrap;font-style:normal;box-shadow:0 4px 10px rgba(15,26,46,.2)}
.cp-ax-today em::after{content:"";position:absolute;left:50%;bottom:-3px;margin-left:-3.5px;
  width:0;height:0;border:3.5px solid transparent;border-top-color:#0F1A2E;border-bottom:0}
/* 贴到两端时气泡改成单侧对齐，别被卡片切掉 */
.cp-ax-today.start em{left:-3px;transform:none}
.cp-ax-today.start em::after{left:9px}
.cp-ax-today.end em{left:auto;right:-3px;transform:none}
.cp-ax-today.end em::after{left:auto;right:9px}

.cp-ax-lg{display:flex;flex-wrap:wrap;gap:6px 18px;margin-top:11px;font-size:11px;color:#6B7A93}
.cp-ax-lg span{display:inline-flex;align-items:center;gap:6px;min-width:0;white-space:nowrap}
.cp-ax-lg i{width:15px;height:6px;border-radius:3px;flex:none}
.cp-ax-lg i.c1{background:linear-gradient(90deg,#7AA6FF,#1B4BD6)}
.cp-ax-lg i.c2{background:linear-gradient(90deg,rgba(124,92,255,.16),rgba(109,76,240,.45));
  box-shadow:inset 0 0 0 1px rgba(124,92,255,.4)}
.cp-ax-lg i.c3{background:linear-gradient(180deg,#DFE7F4,#D3DDEC);border:1px dashed #9DB2D4}
.cp-ax-lg span.on{color:var(--ink);font-weight:600}

.cp-subs{display:flex;flex-wrap:wrap;gap:8px 16px;margin-top:12px;padding-top:11px;border-top:1px dashed var(--line)}
.cp-sub{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--ink3);min-width:0}
.cp-sub i{width:6px;height:6px;border-radius:50%;background:#D3D1C7;flex:none}
.cp-sub.on{color:var(--ink);font-weight:600}
.cp-sub.on i{background:var(--brand);box-shadow:0 0 0 3px rgba(47,107,255,.14)}
.cp-sub em{font-style:normal;font-size:11px;color:#B4B2A9;font-variant-numeric:tabular-nums}
.cp-axis-none{font-size:12px;color:var(--ink3);line-height:1.9}

/* 窄屏：日期让位，胶囊只留天数，图例收起；非当前阶段的紫色区淡下去，只突出当前段 */
@media (max-width:1100px){
  .cp-ax-out .w{display:none}
  .cp-ax-out .n{display:inline}
  .cp-ax-out.s{min-width:40px}
  .cp-ax-out.e{min-width:40px}
  .cp-ax-be.off{opacity:.32}
}
@media (max-width:620px){
  .cp-axis-h .cp-axis-rg{display:none}
  .cp-ax-lg{display:none}
  .cp-ax-out{font-size:10px;padding:0 1px}
  .cp-ax-today em{font-size:9.5px;padding:2px 5px}
}

/* 四张指标卡 */
.cp-cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:14px}
@media (max-width:1100px){.cp-cards{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:620px){.cp-cards{grid-template-columns:1fr}}
.cp-card{background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px 15px;min-width:0;
  display:flex;flex-direction:column;min-height:158px}
.cp-card-t{font-size:12px;font-weight:700;color:var(--ink2);margin-bottom:12px}
/* 用等宽网格排数字：两个各占一半、三个各占三分之一，标签和数字永远上下对齐 */
.cp-card-b{display:grid;grid-template-columns:repeat(auto-fit,minmax(74px,1fr));gap:14px 10px;align-items:start}
.cp-kv{min-width:0}
.cp-kv-v{font-size:19px;font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums;line-height:1.25}
.cp-kv-v em{font-style:normal;font-size:11.5px;font-weight:500;color:var(--ink3);margin-left:2px}
.cp-kv.strong .cp-kv-v{font-size:26px;color:var(--brand-d)}
.cp-kv.warn .cp-kv-v{color:var(--danger)}
.cp-kv-l{font-size:11.5px;color:var(--ink3);margin-top:3px}
.cp-kv-s{font-size:11px;color:var(--ink3);margin-top:2px;line-height:1.5}
.cp-na{color:var(--ink3);font-weight:500}
.cp-worst{margin-top:auto;padding-top:10px;border-top:1px dashed var(--line)}
.cp-worst-t{font-size:11.5px;color:var(--ink3);margin-bottom:6px}
.cp-worst-r{display:flex;align-items:center;gap:8px;font-size:12px;padding:3px 0}
.cp-worst-r i{font-style:normal;width:15px;height:15px;border-radius:5px;background:var(--surface-2);
  color:var(--ink3);font-size:10px;display:flex;align-items:center;justify-content:center;flex:none}
.cp-worst-r span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink2)}
.cp-worst-r b{color:var(--danger);font-variant-numeric:tabular-nums}

/* 率卡（2026-11-08 第二次改版，对齐 ov6 样张）：
   四张率卡挤成一条白底带，卡之间一条竖线，不再是四张各自带边框的卡。
   每张只剩「名称 / 27px 大数字 / 20 点点阵 / 分子分母」——
   去掉了「最差 14 组」和「达标 / 偏慢 / 落后」两行文字，信息密度降下来。 */
.cp-cards.cp-band{display:grid;grid-template-columns:repeat(var(--n,4),minmax(0,1fr));gap:0;
  background:#fff;border:1px solid var(--line);border-radius:14px;overflow:hidden}
.cp-bd{padding:15px 18px;border-right:1px solid var(--line2);min-width:0}
.cp-band>.cp-bd:last-child{border-right:0}
.cp-bd-alone{background:#fff;border:1px solid var(--line);border-radius:14px}
.cp-bd-go{cursor:pointer;transition:background .12s}
.cp-bd-go:hover{background:var(--hover)}
.cp-bd-t{font-size:12px;color:var(--ink3);margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cp-bd-v{font-size:27px;font-weight:600;line-height:1.05;letter-spacing:-.3px;font-variant-numeric:tabular-nums}
.cp-bd-v em{font-style:normal;font-size:12px;font-weight:500;margin-left:2px;opacity:.75}
/* 20 点点阵：一点 5%，填了几个一眼就数得出来 */
.cp-bd-d{display:flex;gap:4px;margin:11px 0 8px;overflow:hidden}
.cp-bd-d i{width:6px;height:6px;border-radius:50%;background:#EDF0F5;flex:none}
.cp-bd-s{font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 窄屏点阵和数字挤不下：点缩小一点，保证 20 个点都还在 */
@media (max-width:1240px){.cp-bd{padding:14px 14px}.cp-bd-d{gap:3px}.cp-bd-d i{width:5px;height:5px}}
@media (max-width:760px){
  .cp-cards.cp-band{grid-template-columns:repeat(2,minmax(0,1fr))}
  .cp-band>.cp-bd{border-bottom:1px solid var(--line2)}
  .cp-band>.cp-bd:nth-child(2n){border-right:0}
  .cp-band>.cp-bd:nth-last-child(-n+2){border-bottom:0}
}
/* 旧版率卡样式保留给「对练次数」这类数字卡（cp-card-rate 已不再生成，留样式不动） */
.cp-card-rate{min-height:0;padding:12px 14px 13px;gap:0;cursor:pointer;transition:border-color .12s,box-shadow .12s}
.cp-card-rate:hover{border-color:var(--brand);box-shadow:0 2px 10px rgba(91,140,255,.12)}
.cp-rt-h{display:flex;align-items:baseline;justify-content:space-between;gap:8px;min-width:0}
.cp-rt-t{font-size:12px;color:var(--ink3);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cp-rt-v{font-size:21px;font-weight:700;letter-spacing:-.6px;line-height:1.1;
  font-variant-numeric:tabular-nums;flex:none}
.cp-rt-v em{font-size:11px;font-style:normal;font-weight:600;margin-left:1px;opacity:.6}
.cp-rt-bar{height:4px;border-radius:2px;background:#E9EDF3;margin:11px 0 9px;overflow:hidden}
.cp-rt-bar i{display:block;height:100%;border-radius:2px;min-width:2px}
.cp-rt-s{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--ink3);
  font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden}
.cp-rt-s em{font-style:normal;font-weight:600;font-size:11px;margin-left:auto;flex:none}
.cp-rt-s>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 最差那一行贴卡底：四张卡被拉成等高时不至于中间空一大块 */
.cp-rt-w{margin-top:auto;padding-top:8px;border-top:1px dashed var(--line);font-size:11.5px;color:var(--ink3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cp-rt-w[data-worst-team]:not([data-worst-team=""]){cursor:pointer}
.cp-rt-w[data-worst-team]:not([data-worst-team=""]):hover{color:var(--brand-d)}
/* 数字卡片（对练次数这类不是百分比的）也收一收 */
.cp-card-rate .cp-num-v{font-size:26px;margin:8px 0 4px}

/* 战队卡（2026-11-08 第二次改版，对齐 ov6 样张）：左边 52px 大环显示第一个指标，
   右边三条 4px 细线显示其余指标。以前是「四个 24px 小环横排」，圆圈抢眼却看不出高低。 */
.cp-squads{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;padding:4px 0 10px}
.cp-sq{display:flex;align-items:center;gap:13px;text-align:left;background:#fff;border:1px solid var(--line);
  border-radius:12px;padding:12px 13px;cursor:pointer;font-family:inherit;
  transition:border-color .15s,box-shadow .15s,transform .15s}
.cp-sq:hover{border-color:#C9DAFF;box-shadow:0 4px 14px rgba(19,39,79,.07);transform:translateY(-1px)}
.cp-sq.sm{padding:10px 11px;background:var(--surface)}
.cp-sq-ring{position:relative;width:52px;height:52px;flex:none}
.cp-sq-ring svg{width:52px;height:52px;display:block}
.cp-sq-rv{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:15px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.2px}
.cp-sq-rv i{font-style:normal;font-size:9px;font-weight:500;margin-left:1px}
.cp-sq-rv.sm{font-size:12px;letter-spacing:-.4px}
.cp-sq.sm .cp-sq-ring,.cp-sq.sm .cp-sq-ring svg{width:44px;height:44px}
.cp-sq.sm .cp-sq-rv{font-size:13px}
/* 小组卡环更小（44px），带小数的值（92.3%）必须再收一档，否则会压在圆环上 */
.cp-sq.sm .cp-sq-rv.sm{font-size:10px;letter-spacing:-.6px}
.cp-sq.sm .cp-sq-rv i{font-size:8px;margin-left:0}
.cp-sq-r{flex:1;min-width:0}
.cp-sq-row{display:grid;grid-template-columns:40px 1fr 34px;align-items:center;gap:8px;margin-bottom:5px}
.cp-sq-row:last-child{margin-bottom:0}
.cp-sq-row span{font-size:11px;color:var(--ink3);white-space:nowrap}
.cp-sq-row b{font-size:11.5px;text-align:right;font-variant-numeric:tabular-nums}
.cp-trk{height:4px;border-radius:2px;background:#DDE4EF;overflow:hidden}
.cp-trk i{display:block;height:4px;border-radius:2px;min-width:3px}
.cp-sq-h{display:flex;align-items:baseline;gap:8px;min-width:0;margin-bottom:9px}
.cp-sq-h b{font-size:13.5px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-sq-h em{font-style:normal;font-size:11.5px;color:var(--ink3);flex:none;margin-left:auto}
.cp-sq-m{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:9px}
.cp-chip{display:inline-flex;align-items:baseline;gap:5px;min-width:0}
.cp-chip em{font-style:normal;font-size:11.5px;color:var(--ink3);white-space:nowrap}
.cp-chip b{font-size:13px;font-variant-numeric:tabular-nums}
.cp-crumb{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink3);margin-bottom:10px}
.cp-crumb button{border:none;background:none;color:var(--brand-d);cursor:pointer;font:inherit;padding:0}
.cp-crumb i{font-style:normal;color:var(--line)}
.cp-crumb b{color:var(--ink);font-weight:600}
.cp-team-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding:2px 0 12px;border-bottom:1px solid var(--line2);margin-bottom:12px}
.cp-team-head b{font-size:15px;color:var(--ink)}
.cp-team-head em{font-style:normal;font-size:12px;color:var(--ink3);margin-left:8px}

/* 选班器：项目 → 排期 → 班级 */
.cp-pick{display:flex;gap:10px;flex-wrap:wrap;padding:6px 0 12px;align-items:center}
.cp-pick select.cp-cls{min-width:200px;max-width:320px}
.cp-pick select.cp-cls:disabled{background:#F7F9FC}

/* 指标说明页 */
.cp-gap{margin-top:14px;padding:12px 14px;background:var(--surface-2);border-radius:12px}
.cp-gap-t{font-size:12px;font-weight:700;color:var(--ink2);margin-bottom:7px}
.cp-gap-r{font-size:12px;color:var(--ink2);line-height:1.95}
.cp-gap-r b{color:var(--ink)}

/* ================= 我的班级 · 志愿者（2026-11-03 W3c） ================= */
.cv-wrap{display:flex;flex-direction:column;gap:16px}
.cv-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:10px 14px}
.cv-bar .btn{flex:0 0 auto}
.cv-sep{width:1px;height:20px;background:var(--line);margin:0 2px}
.cv-tip{font-size:12px;color:var(--ink3);margin-left:auto}

.cv-sq-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;padding:14px}
.cv-sq{border:1px solid var(--line);border-radius:13px;background:var(--surface);padding:11px 13px}
.cv-sq-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cv-sq-h b{font-size:13.5px;color:var(--ink)}
.cv-sq-h em{font-style:normal;font-size:11.5px;color:var(--ink3)}
.cv-sq-act{margin-left:auto;display:flex;gap:8px;opacity:.45;transition:opacity .15s}
.cv-sq:hover .cv-sq-act,.cv-tm:hover .cv-sq-act{opacity:1}
.cv-lnk{background:none;border:0;padding:0;font-size:11.5px;color:var(--brand);cursor:pointer}
.cv-lnk:hover{text-decoration:underline}
.cv-lnk.danger{color:var(--danger)}
.cv-tm{display:flex;align-items:center;gap:8px;margin-top:8px;padding:7px 9px;
  background:var(--surface-2,#f6f8fb);border-radius:9px;font-size:12.5px;color:var(--ink2)}
.cv-tm em{font-style:normal;font-size:11.5px;color:var(--ink3)}
.cv-tm-none{font-size:11.5px;color:var(--ink3);margin-top:8px;padding-left:2px}

.cv-bad-row td{background:rgba(226,74,74,.05)}
.cv-bad-row{opacity:.92}
.cv-yes{color:var(--ok);font-weight:700}
.cv-why{font-size:12px;color:var(--ink2);line-height:1.6;max-width:280px}
.cv-tbl th,.cv-tbl td{padding:8px 9px}

.cv-file{padding:9px 11px;border:1px dashed var(--line);border-radius:11px;width:100%;
  background:var(--surface);font-size:12.5px;color:var(--ink2)}
.cv-prev-note{font-size:12px;color:var(--ink3);margin-top:8px;min-height:18px}
.cv-act{display:flex;align-items:center;justify-content:flex-end;gap:12px;margin-top:14px}
.cv-sel-tip{font-size:12.5px;color:var(--ink2);margin-right:auto}
.cv-fmt{margin:0 0 10px;padding:10px 12px;background:var(--surface);border:1px solid var(--line);
  border-radius:11px;font-size:12px;color:var(--ink2);line-height:1.9;white-space:pre-wrap}
.cv-ta{width:100%;min-height:150px;height:auto;padding:10px 12px;line-height:1.75;
  font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px}
.cv-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:13px}
.cv-form label{display:flex;flex-direction:column;gap:6px;font-size:12px;font-weight:600;color:var(--ink2)}
.cv-form .input{width:100%}

/* 审核页 / 消息页共用的小筛选条 */
.vr-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.vr-bar2{margin-top:11px;padding-top:11px;border-top:1px dashed var(--line)}
.vr-sp{flex:1}
.vr-f{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--ink2)}
.vr-f .input{width:auto;min-width:190px}
.vr-time{font-size:11px;color:var(--ink3);line-height:1.6}
.vr-note{font-size:12px;color:var(--ink2);max-width:220px;line-height:1.6}

.ab-grp{display:inline-flex;gap:6px;background:var(--surface);border:1px solid var(--line);
  border-radius:11px;padding:3px}
.ab-chip{border:0;background:none;font-size:12.5px;color:var(--ink2);padding:6px 13px;
  border-radius:8px;cursor:pointer;white-space:nowrap}
.ab-chip.on{background:var(--brand);color:#fff;font-weight:600}

/* 消息 */
.msg-unread{font-size:12.5px;color:var(--ink2)}
.msg-unread b{color:var(--brand);font-size:14px}
.msg-dot{width:16px;text-align:center}
.msg-dot i{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--brand)}
.msg-unread-row td{font-weight:600}
.msg-unread-row .msg-prev{color:var(--ink)}
.msg-prev{font-size:12px;color:var(--ink3);max-width:380px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.msg-body{font-size:13px;color:var(--ink);line-height:1.95;white-space:normal}

/* 体检表：固定列宽，宁可换行也不横向滚动（弹窗内不出现二级滚动条） */
.cv-tbl{table-layout:fixed;width:100%}
.cv-tbl th,.cv-tbl td{white-space:normal;word-break:break-word;vertical-align:middle}
.cv-nm{font-weight:600;color:var(--ink);line-height:1.45}
.cv-ln{font-size:10.5px;color:var(--ink3);line-height:1.4}
.cv-ph{font-size:11.5px;letter-spacing:-.2px}
.cv-rs{display:block;font-size:11.5px;color:var(--ink3);line-height:1.55;margin-top:3px}
.cv-why .tag{white-space:nowrap}

/* 审核页第二行：关键词输入框不能占满整行（styles.css 的 .input{width:100%} 会把它拉满，
   把「查询」按钮挤到下一行）。跟 select 一样，必须用 input.input.ab-sel 提特异性。 */
input.input.ab-sel{width:240px;min-width:180px;height:34px;font-size:12.5px;flex:0 0 240px;padding:0 11px}
.vr-bar2{align-items:center}
.vr-bar2 .btn{flex:0 0 auto;height:34px}
/* 名单行操作列：详情 / 编辑 / 删除 三个小按钮，别挤成两行 */
.cv-row-act{white-space:nowrap}
.cv-row-act .btn+.btn{margin-left:6px}
/* 名单筛选下拉（2026-11-09）：.camp-flt 是 flex，select.input 的 width:100% 会把头部撑开 */
select.input.cv-flt-sel{width:auto;min-width:104px;height:32px;padding:0 30px 0 10px;font-size:13px;border-radius:9px}
@media(max-width:640px){select.input.cv-flt-sel{flex:1;min-width:0}}

/* 体检说明里的「已关闭订单可重导」——是放行信息，别用灰色警示色 */
.cv-rs-ok{color:var(--ink2);opacity:.85}

/* ================= 我的班级 · 志愿者改成分页（2026-11-03 晚） =================
   用户要求：四个功能用分页装，不要再拿弹窗当主界面。
   三个分页：志愿者名单（战队小组 + 名单）/ 导入虚拟订单（工具 + 已导入）/ 添加志愿者。 */
.cv-page{display:flex;flex-direction:column;gap:14px}
/* 分页条自己不一定占满整行，三个页签靠左就够 */
.cv-tabs{display:inline-flex;align-self:flex-start}
.cv-imp,.cv-add{padding-bottom:4px}
/* 名单 / 虚拟订单表里的姓名：蓝字可点，点开是学员/志愿者详情 */
.cv-nm-lnk{background:none;border:0;padding:0;font-family:inherit;font-size:12.5px;font-weight:700;
  color:var(--brand);cursor:pointer;text-align:left;line-height:1.5}
.cv-nm-lnk:hover{text-decoration:underline}
/* 体检 / 导入结果 / 检查结果：页内区块，不再塞进弹窗 */
.cv-prev-box{margin-top:14px;padding-top:13px;border-top:1px dashed var(--line)}
.cv-prev-h{font-size:12.5px;font-weight:800;color:var(--ink2);margin-bottom:8px}
.cv-prev-h em{font-style:normal;font-weight:500;color:var(--ink3);margin-left:6px}
/* 确认 / 改名弹窗：m-sec 没有标题栏时上边距太小，补一点 */
.cv-dlg{padding:14px 15px 4px}

/* 消息：未读加粗深色 + 圆点，已读一律降一档，扫一眼就知道哪条没看 */
.msg-t{font-weight:700;color:var(--ink)}
.msg-unread-row .msg-t{color:var(--ink)}
.msg-read-row .msg-t{font-weight:500;color:var(--ink3)}
.msg-read-row .msg-prev{color:#B4BFD0}
.msg-read-row .tag{opacity:.75}
/* 名单里「本班订单已被关掉」的提示：跟在姓名下面，别撑高整行 */
.cv-row-tag{margin-top:4px;font-size:10.5px;padding:1px 6px}

/* ================= 我的班级 · 战队与小组（2026-11-03 W4） =================
   战队卡 → 小组卡 → 学员卡 三级下钻；战队/小组的卡片沿用概览的 .cp-sq，
   这里只补指标胶囊、下钻提示、学员卡。 */
.tm-wrap{display:flex;flex-direction:column;gap:14px}
.tm-tabs{display:inline-flex;align-self:flex-start}

/* 指标胶囊：第一个是当前阶段的重点，加深一档 */
.tm-chip{display:flex;flex-direction:column;gap:1px;padding:4px 9px;border-radius:8px;background:var(--surface-2)}
.tm-chip em{font-style:normal;font-size:10.5px;color:var(--ink3)}
.tm-chip b{font-size:14px;font-variant-numeric:tabular-nums;font-weight:700}
.tm-chip.on{background:#EEF4FF}
.tm-chip.on em{color:var(--brand-d);font-weight:600}

/* 卡里右下角的「看小组 →」，别抢卡片的点击区 */
.tm-go{margin-top:9px;font-size:11.5px;color:var(--brand);opacity:.9}

/* 学员卡网格 */
.tm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:12px;padding:2px 0 6px}
.tm-stu{border:1px solid var(--line);border-radius:12px;padding:12px 13px;background:#fff;
  display:flex;flex-direction:column;gap:9px}
.tm-stu-h{display:flex;align-items:center;gap:9px;min-width:0}
.tm-stu-n{min-width:0;display:flex;flex-direction:column;gap:1px}
.tm-stu-n b{font-size:13.5px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tm-stu-n em{font-style:normal;font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.tm-stu-go{margin-left:auto;flex:none}

/* 三个数：到课 / 对练 / 转化 */
.tm-stu-k{display:flex;gap:16px;padding:7px 10px;background:var(--surface-2);border-radius:9px}
.tm-stu-k span{display:flex;align-items:baseline;gap:4px;font-size:11px;color:var(--ink3)}
.tm-stu-k span em{font-style:normal}
.tm-stu-k span b{font-size:14.5px;color:var(--ink);font-variant-numeric:tabular-nums}
.tm-stu-k span i{font-style:normal;font-size:11px;color:var(--ink3)}

/* 到课 / 对练明细一行 */
.tm-stu-d{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:11.5px;color:var(--ink2);min-height:18px}
.tm-stu-d>em{font-style:normal;color:var(--ink3);flex:none;font-size:11px}
.tm-dot{display:inline-block;width:14px;height:14px;border-radius:4px;background:#E6EAF2}
.tm-dot.ok{background:#2FA37C}
.tm-last{color:var(--ink3);font-size:10.5px;margin-left:2px}
.tm-duel{display:inline-block;padding:1px 6px;border-radius:6px;background:#EEF4FF;color:var(--brand-d);
  font-size:10.5px;font-variant-numeric:tabular-nums}
.tm-none{color:var(--ink3);font-size:11px}

/* ================= 战队与小组 · 小组名单导入（2026-11-03 W5） =================
   一张卡搞定：上面贴名单、中间体检表、下面导入结果；打卡头右侧导出全班分组。 */
.tm-imp{display:flex;flex-direction:column;gap:10px;padding:2px 0 4px}
/* 名单是「一行一个人」的结构化文本，用等宽字体看得清列 */
.tm-ta{min-height:134px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:12.5px;line-height:1.8;letter-spacing:.2px}
/* 体检表里「原名 / 原小组」压一行、划掉，右边是改后的值 */
.tm-old{font-size:11px;color:var(--ink3);text-decoration:line-through;text-decoration-color:#C9D3E2}
/* 只改小组的行：姓名原样显示（不划掉，因为根本没动） */
.cv-keep{color:var(--ink2)}

/* ================= 我的班级 → 学员清单（W9，2026-11-03 晚） =================
   14 列在 1080 宽的窗口里放不下，所以两头钉住：复选框 + 姓名列 sticky 在左、
   操作列 sticky 在右，中间随便横滚 —— 老师永远看得见「这个人」和「这几个按钮」。
   这一轮加了：筛选条、批量条、联系状态配色、志愿者列（显示本战队 / 本小组的志愿者）。 */
.su-wrap{margin:0;border-top:1px solid var(--line2);
  max-height:min(calc(var(--rows,11) * var(--rh,64px) + var(--hh,46px)),max(320px,calc(100vh - 366px)))}
.su-tbl{table-layout:fixed;min-width:1556px}
.su-tbl th{padding:0 8px;font-size:11.5px;font-weight:600;letter-spacing:.2px;color:var(--ink3);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:46px}
.su-tbl td{padding:8px;vertical-align:middle;overflow:hidden}
/* 行高只在这里定一次（2026-11-04 用户要求「调高表格行高」）：
   64px 刚好放下「姓名 + 电话」两行、也放得下 30px 的按钮，不用每条 td 各写一遍。 */
.su-tbl tbody td{height:64px}

/* ---- 列宽（fixed 布局，宽度写在表头上；不写就会被压成「复盘」「购课…」）----
   2026-11-04 重排：姓名 / 战队小组 / 双志愿者 / 操作四类给了更多宽度，
   文字不再折行；操作列从 6 个按钮收成 4 个，宽度反而更松。 */
.su-ck-th,.su-ck-td{width:32px}
.su-th-name{width:142px}
.su-th-train{width:74px}
.su-th-cs{width:104px}
.su-th-vf{width:72px}
.su-th-grp{width:196px}
.su-th-vol{width:112px}
.su-th-rate{width:84px}
/* 对练率原来没写宽度，而其余列的宽度加起来刚好等于 min-width，
   fixed 布局下它被压成 0 宽，百分比和「6/12」直接叠到旁边两列上（2026-11-08 修） */
.su-th-duel{width:84px}
.su-th-rv{width:62px}
.su-th-cv{width:106px}
.su-th-gp{width:62px}
.su-th-wx{width:80px}
.su-th-ops{width:236px}

/* ---- 钉住的列：复选框在最左，姓名紧随其后；操作列钉在最右 ----
   横滚时老师永远看得见「这个人」和「这几个按钮」。 */
.su-tbl th.su-ck-th,.su-tbl td.su-ck-td{position:sticky;left:0;z-index:4;background:#fff}
.su-tbl th.su-th-name,.su-tbl td.su-name-td{position:sticky;left:32px;z-index:3;background:#fff;
  box-shadow:14px 0 16px -14px rgba(16,24,40,.2)}
.su-tbl th.su-th-ops,.su-tbl td.su-ops{position:sticky;right:0;z-index:3;background:#fff;
  box-shadow:-14px 0 16px -14px rgba(16,24,40,.26)}
/* hover 整行浅蓝（2026-11-04 用户要求）：钉住的三列背景要跟着走，否则一条白缝 */
.su-tbl tbody tr:hover td{background:var(--hover)}
.su-tbl tbody tr.on td{background:#F6FAFF}
.su-tbl tbody tr.on td.su-ck-td,.su-tbl tbody tr.on td.su-name-td,
.su-tbl tbody tr.on td.su-ops{background:#EEF4FF}
.su-tbl tbody tr{transition:background .1s}

.su-ck{width:14px;height:14px;margin:0;cursor:pointer;accent-color:var(--brand)}

/* ---- 姓名稍大在上、电话稍小在下，电话完整显示（用户明确要求不打码） ----
   2026-11-08：姓名点进详情；改名 / 复制电话改成右边的小按钮，电话本身不再可点 */
.su-nm-line,.su-ph-line{display:flex;align-items:center;gap:5px;min-width:0}
.su-ph-line{margin-top:2px}
.su-name{display:block;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:13.5px;font-weight:600;color:var(--ink);line-height:1.25;cursor:pointer;
  border-bottom:1px dashed transparent}
.su-name:hover{color:var(--brand-d);border-bottom-color:currentColor}
.su-phone{font-size:11px;color:var(--ink3);font-variant-numeric:tabular-nums;
  white-space:nowrap;letter-spacing:0}
/* 虚拟订单的蓝色「虚」小标 */
.su-virtual{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;
  margin-left:4px;border-radius:4px;background:var(--brand-l);color:var(--brand-d);
  font-size:9.5px;font-weight:700;line-height:1;vertical-align:1px}

.su-dash{color:#C3CCDB}
.su-sub{font-style:normal;font-size:10.5px;color:var(--ink3);margin-left:3px;font-weight:400}
.su-more{font-size:10.5px;color:var(--ink3);margin-left:2px}
.su-cv{max-width:92px;display:inline-flex;overflow:hidden;text-overflow:ellipsis;
  vertical-align:middle;margin-right:3px}
.su-tag{padding:2px 6px;font-size:10.5px;border-radius:6px}

/* ---- 状态胶囊（2026-11-04 统一）：已核销 / 已加群 = 主色绿，未加 = 浅黄，其余中性。
   以前核销、加群各用各的 .tag 变体，同一列里深浅不一；现在一个 .su-pill 走到底。 ---- */
.su-pill{display:inline-flex;align-items:center;gap:5px;height:24px;padding:0 9px;border-radius:7px;
  background:var(--surface-2);color:var(--ink2);font-size:11.5px;font-weight:600;white-space:nowrap}
.su-pill::before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.75;flex:none}
.su-pill.ok{background:var(--ok-l);color:var(--ok-d)}
.su-pill.warn{background:var(--warn-l);color:#946300}
.su-pill.brand{background:var(--brand-l);color:var(--brand-d)}

/* ---- 联系状态配色（用户 2026-11-03 指定）----
   确认上课=绿、失联=浅红、申请改班/改期/退费=黄，其余保持中性。
   select 本身带底色，选中项一眼能看出来，不用点开。 */
/* 选择器带上 .su-sel，特异性才压得住下面 .su-sel 的 background:transparent */
.su-sel.su-cs-ok{background:var(--ok-l);color:var(--ok-d);font-weight:600}
.su-sel.su-cs-bad{background:#FDECEC;color:#C2413B;font-weight:600}
.su-sel.su-cs-warn{background:#FEF5DF;color:#946300;font-weight:600}
.su-sel.su-cs-idle{color:var(--ink2)}
.su-sel.su-cs-idle,.su-sel.su-cs-ok,.su-sel.su-cs-bad,.su-sel.su-cs-warn{
  transition:background .12s,color .12s}
.su-sel.su-cs-ok:hover,.su-sel.su-cs-bad:hover,.su-sel.su-cs-warn:hover{border-color:currentColor}

/* ---- 志愿者列：显示本战队的大志愿者 / 本小组的小志愿者（姓名 + 电话）---- */
.su-vol{display:flex;flex-direction:column;line-height:1.25;max-width:106px}
.su-vol b{font-size:12px;font-weight:600;color:var(--ink);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.su-vol span{font-size:10.5px;color:var(--ink3);font-variant-numeric:tabular-nums;margin-top:1px}
.su-vol.me{background:var(--brand-l);border-radius:6px;padding:2px 5px}
.su-vol.me b{color:var(--brand-d)}
.su-vol.me span{color:var(--brand)}

/* ---- 单元格里的下拉：静默态无边框，hover / focus 才像输入框 ---- */
.su-sel{height:26px;max-width:84px;padding:0 2px;font-size:11.5px;color:var(--ink);
  border:1px solid transparent;border-radius:7px;background:transparent;cursor:pointer;
  transition:border-color .12s,background .12s}
.su-sel:hover{background:#fff;border-color:var(--line)}
.su-sel:focus{outline:none;background:#fff;border-color:#B9CDF7;box-shadow:0 0 0 3px rgba(91,140,255,.12)}
.su-sel-contact{max-width:84px;font-weight:600}
.su-grp{display:flex;align-items:center;gap:6px;flex-wrap:nowrap}

/* ---- 加老师微信：一个小开关，点一下就切 ---- */
.su-yn{height:23px;padding:0 8px;border-radius:7px;border:1px solid var(--line);background:#fff;
  font-size:10.5px;color:var(--ink3);cursor:pointer;transition:all .12s;white-space:nowrap}
.su-yn:hover{border-color:#B9CDF7;color:var(--brand-d)}
.su-yn.on{background:var(--ok-l);border-color:transparent;color:var(--ok-d);font-weight:600}

/* ---- 操作区：高频（改组 / 改班 / 备注）留在面上，低频（核销 / 大 / 小志愿者）进「更多」 ----
   2026-11-04：6 个按钮 2 行 3 列的排法太吵，改成一行 4 个，右边钉住也不占宽度。 */
.su-ops{white-space:nowrap}
.su-ibox{display:flex;align-items:center;gap:6px;justify-content:flex-end}
.su-ib{display:inline-flex;align-items:center;justify-content:center;gap:4px;
  height:30px;padding:0 8px;border-radius:8px;border:1px solid var(--line);
  background:#fff;font-size:11.5px;line-height:1;color:var(--ink2);cursor:pointer;
  transition:border-color .12s,background .12s,color .12s;white-space:nowrap}
.su-ib svg{width:13px;height:13px;flex:none;stroke-width:1.8}
.su-ib:hover{border-color:#B9CDF7;background:#F7FAFF;color:var(--brand-d)}
.su-ib.on{background:var(--brand-l);border-color:transparent;color:var(--brand-d);font-weight:600}
/* 「更多」是次要入口：虚线边、灰字，不跟主操作抢 */
.su-ib-more{width:32px;padding:0;border-style:dashed;color:var(--ink3)}
.su-ib-more svg{width:16px;height:16px;stroke-width:3.4}
.su-ib-more:hover{border-style:solid}

/* ---- 「更多」浮层：挂在 body 上（表格是 overflow 滚动，放格子里会被裁） ---- */
.su-menu{position:fixed;z-index:80;min-width:186px;padding:6px;border-radius:12px;background:#fff;
  border:1px solid var(--line);box-shadow:0 10px 30px rgba(16,24,40,.14),0 2px 6px rgba(16,24,40,.06);
  animation:suMenuIn .12s ease-out}
@keyframes suMenuIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.su-menu-t{padding:6px 10px 8px;font-size:11.5px;color:var(--ink3);font-weight:600;
  border-bottom:1px solid var(--line2);margin-bottom:4px;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;max-width:210px}
.su-mi{display:flex;align-items:center;gap:9px;width:100%;padding:8px 10px;border:none;border-radius:8px;
  background:none;text-align:left;font-family:inherit;font-size:12.5px;color:var(--ink);cursor:pointer;
  transition:background .1s}
.su-mi i{display:inline-flex;color:var(--ink3);flex:none}
.su-mi svg{width:14px;height:14px;stroke-width:1.8}
.su-mi span{flex:1;white-space:nowrap}
.su-mi em{font-style:normal;font-size:10.5px;color:var(--brand);font-weight:600}
.su-mi:hover{background:var(--hover)}
.su-mi:hover i{color:var(--brand-d)}
.su-mi.on{color:var(--brand-d)}
.su-mi.on i{color:var(--brand)}

/* ---- 筛选行：搜索框 + 5 个下拉 + 重置，一行放下，间距 10px（2026-11-04 用户要求） ---- */
.su-filters{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:0 2px 12px}
.su-search{display:inline-flex;align-items:center;gap:7px;width:236px;height:36px;padding:0 11px;
  border:1px solid var(--line);border-radius:10px;background:#fff;
  transition:border-color .12s,box-shadow .12s}
.su-search:focus-within{border-color:#B9CDF7;box-shadow:0 0 0 3px rgba(91,140,255,.12)}
.su-search svg{width:15px;height:15px;color:var(--ink3);flex:none}
.su-inp{flex:1;min-width:0;height:100%;border:none;outline:none;background:none;
  font-family:inherit;font-size:13px;color:var(--ink)}
.su-inp::placeholder{color:var(--ink3)}
/* 搜索框和下拉之间那道细竖线，把「找人」和「筛人」分开 */
.su-fsep{width:1px;height:20px;background:var(--line);margin:0 2px}
.su-fsel{height:36px;padding:0 26px 0 11px;border:1px solid var(--line);border-radius:10px;
  background:#fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2394A1B8' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M7 10l5 5 5-5'/%3E%3C/svg%3E") no-repeat right 8px center/14px;
  -webkit-appearance:none;appearance:none;font-family:inherit;font-size:12.5px;color:var(--ink);
  cursor:pointer;outline:none;min-width:116px;max-width:190px;transition:border-color .12s,box-shadow .12s}
.su-fsel:hover{border-color:#CFDCF2}
.su-fsel:focus{border-color:#B9CDF7;box-shadow:0 0 0 3px rgba(91,140,255,.12)}
/* 重置故意弱化：灰字、无边框，点在最后 */
.su-reset{height:32px;margin-left:auto;padding:0 10px;border:none;border-radius:8px;background:none;
  font-family:inherit;font-size:12.5px;color:var(--ink3);cursor:pointer;transition:color .12s,background .12s}
.su-reset:hover{color:var(--brand-d);background:var(--brand-l)}

/* ---- 批量操作行：浅底横条 + 左侧「批量操作」标签，和上面的筛选行视觉分开 ---- */
.su-batchbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  margin:0 0 12px;padding:9px 12px;border-radius:12px;background:var(--surface);
  border:1px solid var(--line2)}
.su-batchlab{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:700;
  color:var(--ink3);letter-spacing:.3px;flex:none}
.su-batchlab::before{content:'';width:3px;height:12px;border-radius:2px;background:var(--brand);opacity:.5}
.su-bn{font-size:12.5px;color:var(--ink2);font-weight:600;font-variant-numeric:tabular-nums;min-width:56px}
.su-batchline{width:1px;height:18px;background:var(--line);margin:0 2px}
.su-bb{height:30px;padding:0 13px;border-radius:8px;border:1px solid var(--line);
  background:#fff;font-family:inherit;font-size:12.5px;color:var(--ink2);cursor:pointer;
  white-space:nowrap;transition:border-color .12s,color .12s,background .12s}
.su-bb:hover:not(:disabled){border-color:#B9CDF7;color:var(--brand-d);background:#F7FAFF}
.su-bb:disabled{opacity:.5;cursor:not-allowed}
.su-bb-x{margin-left:auto;border-color:transparent;background:none;color:var(--ink3)}
.su-bb-x:hover:not(:disabled){background:none;border-color:transparent;color:var(--ink)}

/* ---- 学员卡片的头部：标题 + 统计，跟着筛选行一起缩进 ---- */
.su-card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--sh);padding:18px 18px 4px;margin-bottom:14px}
.su-head{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.su-head-t{font-size:15.5px;font-weight:800;letter-spacing:-.2px;color:var(--ink)}
.su-head-tip{font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums}
/* 「锁定状态修改」开关（2026-11-08 W34）：靠右一个胶囊按钮，锁上时橙色底 */
.su-lock{margin-left:auto;align-self:center;display:inline-flex;align-items:center;gap:6px;
  height:30px;padding:0 12px;border-radius:999px;border:1px solid var(--line2);
  background:#fff;color:var(--ink2);font-size:12.5px;font-weight:600;cursor:pointer;
  transition:background .15s,color .15s,border-color .15s}
.su-lock svg{width:14px;height:14px;flex:none}
.su-lock:hover{border-color:var(--mint);color:var(--ink)}
.su-lock.on{background:#fff5e8;border-color:#f2c58a;color:#a9671c}
.su-lock[disabled]{opacity:.6;cursor:default}

/* ---- 改组 / 改班 / 批量弹窗里的表单 ---- */
.su-form{display:flex;gap:14px;flex-wrap:wrap}
.su-form label{display:flex;flex-direction:column;gap:6px;flex:1;min-width:170px;
  font-size:12px;color:var(--ink2);font-weight:600}

/* ================= 项目配置 → 任务资料配置（2026-11-04 W13） =================
   一个页面两个页签：任务配置 / 资料配置。样式全部跟其他带营页面一套：
   卡片 var(--card) + 圆角 var(--r)，表格沿用 camp-tbl，按钮沿用 btn。 */
.td-head{padding:14px 16px;margin-bottom:14px}
.td-hrow{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
/* 注意：styles.css 的 `select.input{width:100%}` 是「元素+类」，特异性比单类高，
   这几个下拉必须写成元素+类，否则会各占一整行（跟 od-sel 踩过的坑同一个）。 */
select.td-psel{width:auto;min-width:210px;max-width:300px;flex:0 0 auto}
.td-tabs{display:inline-flex;gap:4px;background:var(--surface-2);border-radius:11px;padding:4px}
.td-tab{display:inline-flex;align-items:center;gap:6px;border:none;background:none;font-family:inherit;
  font-size:13px;color:var(--ink2);padding:7px 15px;border-radius:8px;cursor:pointer;font-weight:500;
  white-space:nowrap;transition:background .15s,color .15s}
.td-tab svg{width:15px;height:15px;flex:none}
.td-tab:hover{color:var(--ink)}
.td-tab.on{background:#fff;color:var(--brand-d);font-weight:700;box-shadow:0 1px 3px rgba(19,39,79,.12)}
.td-count{font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums}

.td-main{padding:16px}
.td-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:12px}
select.td-sel{width:auto;min-width:132px;height:36px;font-size:12.5px;flex:0 0 auto}
.td-search{display:inline-flex;align-items:center;gap:7px;width:250px;height:36px;padding:0 11px;
  border:1px solid var(--line);border-radius:10px;background:#fff;transition:border-color .12s,box-shadow .12s}
.td-search:focus-within{border-color:#B9CDF7;box-shadow:0 0 0 3px rgba(91,140,255,.12)}
.td-search svg{width:15px;height:15px;color:var(--ink3);flex:none}
.td-search .input{flex:1;min-width:0;height:100%;border:none;outline:none;background:none;padding:0;box-shadow:none}
.td-addbtn{height:36px;padding:0 14px}
.td-addbtn svg{width:14px;height:14px}

.td-tbl{min-width:940px}
.td-tbl th{font-size:11.5px;font-weight:600;color:var(--ink3);letter-spacing:.2px;padding:0 12px;height:42px}
.td-tbl td{padding:11px 12px;vertical-align:middle;border-top:1px solid var(--line2)}
.td-tbl tbody tr:hover td{background:var(--hover)}
.td-t{font-size:13px;font-weight:600;color:var(--ink);line-height:1.5}
.td-d{font-size:11.5px;color:var(--ink3);line-height:1.6;margin-top:2px;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.td-time{font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums;white-space:nowrap}
.td-na{font-size:11.5px;color:#B3BDCC}
.td-danger{color:#E0344F;border-color:#F6D2D8}
.td-danger:hover{background:#FFF5F6;border-color:#EFB3BC;color:#C62641}

/* 流程：大流程一枚浅色小签 + 小流程名，读起来是「开营前 / 志愿者招募」 */
.td-flow{display:inline-block;font-size:11px;font-weight:600;color:var(--brand-d);
  background:var(--brand-l);border-radius:6px;padding:2px 7px;margin-right:5px;white-space:nowrap}
.td-stage{font-size:12.5px;color:var(--ink2)}

/* 任务列表里的「N 条资料」——点开就是任务详情 */
.td-chip{height:24px;min-width:44px;padding:0 9px;border-radius:7px;border:1px solid var(--line);
  background:#fff;font-family:inherit;font-size:11.5px;color:var(--ink3);cursor:pointer}
.td-chip.on{background:var(--brand-l);border-color:#DCE6FF;color:var(--brand-d);font-weight:700}
.td-chip:hover{border-color:#B9CDF7;color:var(--brand-d)}

/* 资料预览 */
.td-pv{font-size:12px;color:var(--ink2);line-height:1.6;max-width:420px;word-break:break-all}
.td-pv a{color:var(--brand-d)}
.td-img{display:inline-flex;align-items:center;gap:8px;color:var(--brand-d)}
.td-img img{width:34px;height:34px;object-fit:cover;border-radius:7px;border:1px solid var(--line)}
.td-file{display:inline-flex;align-items:center;gap:5px;color:var(--brand-d);font-size:12px}
.td-file svg{width:13px;height:13px;flex:none}
.td-fico{display:inline-flex;vertical-align:-2px;margin-right:4px;color:var(--ink3)}
.td-fico svg{width:12px;height:12px}

/* ---- 弹窗里的表单 ---- */
.td-form{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px 14px}
.td-fi{display:flex;flex-direction:column;gap:6px;font-size:12px;color:var(--ink2);font-weight:600}
.td-fi.full{grid-column:1 / -1}
.td-fi .input,.td-fi textarea{font-weight:400}
.td-ro{padding:8px 12px;border-radius:10px;background:var(--surface-2);font-size:13px;
  color:var(--ink2);font-weight:600}
.td-kv{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 18px}
.td-kv>div{display:flex;gap:10px;font-size:12.5px;line-height:1.7}
.td-kv>div.full{grid-column:1 / -1}
.td-kv span{color:var(--ink3);flex:none;min-width:56px}
.td-kv b{color:var(--ink);font-weight:600}

/* ---- 资料行编辑器 ---- */
.td-row{border:1px solid var(--line);border-radius:11px;padding:10px 11px;margin-bottom:9px;background:#fff}
.td-row-h{display:flex;align-items:center;gap:8px}
select.td-rk{width:112px;height:32px;flex:none;padding:0 8px;font-size:12px}
input.td-rt{flex:1;min-width:0;height:32px;font-size:12.5px}
.td-rowx{width:26px;height:26px;flex:none;border:none;background:none;color:var(--ink3);
  font-size:17px;line-height:1;cursor:pointer;border-radius:7px}
.td-rowx:hover{background:var(--danger-l);color:#E0344F}
.td-row-b{margin-top:8px}
.td-cx{width:100%;font-size:12.5px;line-height:1.6}
textarea.td-cx{resize:vertical;min-height:46px}
.td-pick{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.td-pick .btn{flex:0 0 auto;white-space:nowrap;height:32px;padding:0 11px;font-size:12px}
.td-pick .btn svg{width:14px;height:14px;flex:none}
.td-pick .td-cx{flex:1;min-width:220px}
.td-fname{font-size:11.5px;color:var(--ink3);max-width:230px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.td-flink{font-size:11.5px;color:var(--brand-d)}
.td-lnk{border:none;background:none;font-family:inherit;font-size:11.5px;color:var(--brand-d);
  cursor:pointer;padding:0 2px}
.td-lnk:hover{text-decoration:underline}
.td-pv-img{margin-top:8px}
.td-pv-img img{max-height:120px;border-radius:8px;border:1px solid var(--line)}
.td-rowadd{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:4px}
.td-hint{font-size:11px;color:var(--ink3);line-height:1.7}
.td-rownone{padding:14px 4px;color:var(--ink3);font-size:12px}
.td-ck{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink);font-weight:600;
  padding:6px 0;cursor:pointer}
.td-ck input{width:15px;height:15px}

/* ================= 考试配置 / 项目考试配置（2026-11-04 W14） =================
   两页都复用任务资料配置的 .td-* 骨架（页头 + 工具条 + camp-tbl），这里只补考试自己的小件：
   题型标签、选项摘要、分值输入、挑题清单、成绩汇总。 */
.td-form.one{grid-template-columns:1fr}
.td-tbl .ex-opts{margin-top:3px;font-size:11px;color:var(--ink3);line-height:1.6;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ex-ans{font-size:12.5px;font-weight:700;color:var(--ok-d);letter-spacing:.5px}
.ex-sc{width:78px;height:30px;text-align:center;font-variant-numeric:tabular-nums}
.ex-mv{white-space:nowrap}
.ex-mv .btn{height:26px;padding:0 8px;font-size:11.5px;margin-right:2px}
.ex-mv .btn svg{width:12px;height:12px}

/* 结果页：应到 / 已参加 / 分数 */
.ex-joined{font-weight:700;color:var(--brand-d);font-variant-numeric:tabular-nums}
.ex-sub{font-size:11px;color:var(--ink3);margin-left:3px;font-variant-numeric:tabular-nums}
.ex-drill{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:0 16px 12px;font-size:13px}
.ex-drill b{font-size:13.5px}
.ex-drill .td-hint{margin:0}

/* 导入结果 */
.ex-sum{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
.ex-sum div{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:14px;text-align:center}
.ex-sum b{display:block;font-size:24px;font-weight:800;color:var(--brand-d);font-variant-numeric:tabular-nums}
.ex-sum span{font-size:11.5px;color:var(--ink3)}

/* 挑题清单：一行一道题，勾选即加 */
.ex-picklist{max-height:min(52vh,520px);overflow:auto;border:1px solid var(--line);border-radius:12px;
  padding:4px;background:var(--surface)}
.ex-row{display:flex;align-items:center;gap:9px;padding:9px 10px;border-radius:9px;cursor:pointer;
  background:#fff;margin:3px;border:1px solid transparent;transition:border-color .12s,background .12s}
.ex-row:hover{border-color:#D6E2FB;background:#F8FBFF}
.ex-row input{width:15px;height:15px;flex:none;accent-color:var(--brand)}
.ex-row .tag{flex:none;font-size:10.5px;padding:2px 7px}
.ex-rowt{flex:1;min-width:0;font-size:12.5px;line-height:1.5;overflow:hidden;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.ex-rowq{flex:none;font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.ex-rowx{flex:none;font-size:10.5px;color:var(--ink3);background:var(--line2);border-radius:6px;padding:2px 6px}
.ex-row.off{opacity:.62;cursor:default}
.ex-row.off:hover{border-color:transparent;background:#fff}

/* 考试三张表的宽度：内容区大约 860px（1080 屏减侧边栏），超过就横滚。
   列宽压到刚好放得下，别让「删除」被推到滚动区外面。 */
/* fixed 布局是必须的：选项摘要 nowrap，auto 布局会把「题目」列越撑越宽，
   最后把「删除」推到滚动区外面（W14 第一次截图就是这样）。 */
.td-tbl.ex-tbl,.td-tbl.ex-tbl2,.td-tbl.ex-tbl3{table-layout:fixed}
.td-tbl.ex-tbl{min-width:820px}
.td-tbl.ex-tbl2{min-width:838px}
.td-tbl.ex-tbl3{min-width:900px}
.td-tbl.ex-tbl td,.td-tbl.ex-tbl2 td,.td-tbl.ex-tbl3 td{overflow:hidden}

/* ================= 富文本编辑器（public/rich.js） =================
   只用于「答案解析」这类短文本；不要套 table-layout/overflow 之类，
   编辑器自带一条内滚，弹窗整体还是整窗滚动。 */
.riche{border:1px solid #DFE6F2;border-radius:11px;background:#fff;overflow:hidden}
.riche:focus-within{border-color:#9CB8FF;box-shadow:0 0 0 3px rgba(47,107,255,.12)}
.riche-bar{display:flex;align-items:center;flex-wrap:wrap;gap:2px;padding:5px 7px;
  background:#F8FAFF;border-bottom:1px solid #EDF1F8}
.riche-bar button{width:28px;height:28px;padding:0;border:none;border-radius:7px;background:transparent;
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--ink2);
  font-size:13.5px;line-height:1;transition:background .12s,color .12s}
.riche-bar button:hover{background:#E9F0FF;color:var(--brand-d)}
.riche-bar button svg{width:15px;height:15px;display:block}
.riche-bar .riche-tx{font-size:12px;font-weight:700;letter-spacing:-.3px}
.riche-sp{width:1px;height:16px;background:#E2E9F5;margin:0 4px}
.riche-size{height:26px;border:1px solid #E2E9F5;border-radius:7px;background:#fff;color:var(--ink2);
  font-size:12px;padding:0 4px;cursor:pointer;font-family:inherit}
.riche-bar .riche-color{width:22px;height:22px;border-radius:6px}
.riche-bar .riche-color i{width:14px;height:14px;border-radius:4px;display:block;border:1px solid rgba(15,26,46,.12)}
.riche-bar .riche-color.on{background:#E9F0FF;box-shadow:0 0 0 1.5px var(--brand) inset}
.riche-body{min-height:96px;max-height:340px;overflow:auto;padding:10px 12px;outline:none;
  font-size:14px;font-weight:400;line-height:1.72;color:var(--ink);word-break:break-word}
.riche-body:empty::before{content:attr(data-ph);color:var(--ink3);pointer-events:none}
.riche-body p,.riche-body div{margin:0 0 6px}
.riche-body p:last-child,.riche-body div:last-child{margin-bottom:0}
.riche-body ul,.riche-body ol{margin:4px 0 6px;padding-left:22px}
.riche-body li{margin:2px 0}

/* 批量生成链接弹窗 */
.bl-term{display:flex;align-items:center;gap:8px;padding:9px 11px;border:1px solid #E7EDF7;border-radius:10px;
  margin-bottom:7px;cursor:pointer;font-size:13.5px;color:var(--ink)}
.bl-term:hover{background:#F8FAFF;border-color:#C9D9FF}
.bl-term input{width:15px;height:15px;accent-color:var(--brand);flex:none}
.bl-term .bl-sub{margin-left:auto;font-size:12px;color:var(--ink3)}
.bl-out{max-height:320px;overflow:auto;border:1px solid #EDF1F8;border-radius:10px}

/* 文字资料（富文本）：默认 5 行资料，每行都带工具栏 —— 压矮压紧，
   否则一个「添加任务」弹窗要滚好几屏 */
.td-cx-rich .riche-body{min-height:58px;padding:7px 10px;font-size:13.5px}
.td-cx-rich .riche-bar{padding:3px 5px;gap:1px}
.td-cx-rich .riche-bar button{width:26px;height:26px}
.td-cx-rich .riche-size{height:24px;font-size:11.5px}
.td-cx-rich .riche-sp{margin:0 3px}
/* 查看详情时按原格式渲染，超长给一条内滚，别把弹窗顶长 */
.td-rich{font-size:13px;font-weight:400;line-height:1.75;color:var(--ink2);
  word-break:break-word;max-height:260px;overflow:auto}
.td-rich p,.td-rich div{margin:0 0 5px}
.td-rich p:last-child,.td-rich div:last-child{margin-bottom:0}
.td-rich ul,.td-rich ol{margin:4px 0;padding-left:20px}
.td-rich b,.td-rich strong{color:var(--ink)}

/* ================= 考试统计 / 答题详情（W16） =================
   统计分析页签的汇总卡与「题目 × 排期」矩阵，以及考试结果里点开的逐题答题详情。
   两处共用 .st-sum（数字卡）；矩阵每格是「对 / 错」两个数字，
   左绿右红，扫一眼就知道哪题是普遍不会、哪题是普遍会。 */
.st-sum{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;margin-bottom:14px}
.st-sum>div{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:12px 10px;text-align:center}
.st-sum b{display:block;font-size:22px;font-weight:800;color:var(--brand-d);font-variant-numeric:tabular-nums;line-height:1.25}
.st-sum span{font-size:11.5px;color:var(--ink3)}

.st-blk{margin-bottom:16px}
.st-blk:last-child{margin-bottom:0}
.st-blk-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;font-weight:700;
  color:var(--ink);padding:0 2px 8px}
.st-blk-h .td-hint{margin:0;font-weight:400}

.st-tbl{table-layout:auto}
.st-tbl th.st-c,.st-tbl td.st-c{text-align:center;font-variant-numeric:tabular-nums;white-space:nowrap}
.st-tbl th.st-c i{display:block;font-style:normal;font-size:10px;font-weight:500;color:var(--ink3);margin-top:2px}
.st-tbl .st-no{width:44px;text-align:center;color:var(--ink3);font-variant-numeric:tabular-nums}
.st-qt{font-size:12.5px;line-height:1.55;color:var(--ink);display:-webkit-box;-webkit-line-clamp:2;
  -webkit-box-orient:vertical;overflow:hidden}
.st-qm{font-size:11px;color:var(--ink3);margin-top:2px}
.st-r{color:#0B7A5C;font-weight:700}
.st-w{color:#C0243C;font-weight:700}
.st-tbl .st-c i{margin:0 3px;color:#C7D2E4;font-style:normal}

/* 逐题答题详情 */
.rv-list{display:flex;flex-direction:column;gap:10px}
.rv-q{border:1px solid var(--line);border-left:3px solid var(--line);border-radius:12px;
  padding:11px 13px;background:#fff}
.rv-q.ok{border-left-color:#2FA37C}
.rv-q.bad{border-left-color:#E0344F}
.rv-q.pend{border-left-color:#E9A23B}
.rv-qh{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:7px}
.rv-no{width:22px;height:22px;border-radius:7px;background:var(--line2);color:var(--ink2);
  font-size:11.5px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex:none}
.rv-badge{font-size:11px;font-weight:700;padding:2px 8px;border-radius:999px;margin-left:auto}
.rv-badge.ok{background:#E8F8F1;color:#0B7A5C}
.rv-badge.bad{background:#FDECEF;color:#C0243C}
.rv-badge.pend{background:#FDF3E3;color:#9A6A12}
.rv-title{font-size:13px;font-weight:600;line-height:1.6;color:var(--ink);margin-bottom:8px}
.rv-o{display:flex;align-items:flex-start;gap:8px;padding:6px 10px;border-radius:8px;
  border:1px solid transparent;margin-bottom:5px;font-size:12.5px;line-height:1.6;color:var(--ink2)}
.rv-o b{flex:none;color:var(--ink3);font-weight:700}
.rv-o.right{background:#E8F8F1;border-color:#CBEFE2;color:#0B7A5C}
.rv-o.right b{color:#0B7A5C}
.rv-o.wrong{background:#FDECEF;border-color:#FFD3DC;color:#C0243C}
.rv-o.wrong b{color:#C0243C}
.rv-o i{margin-left:auto;flex:none;font-style:normal;font-size:10.5px;font-weight:700;opacity:.9;padding-left:8px}
.rv-txt{display:flex;gap:8px;font-size:12.5px;line-height:1.7;margin-top:4px;color:var(--ink2)}
.rv-txt span{flex:none;color:var(--ink3);min-width:62px}
.rv-txt b{font-weight:600;color:var(--ink);word-break:break-word}
.rv-an{margin-top:9px;border-top:1px dashed var(--line);padding-top:9px}
.rv-an-h{font-size:11.5px;font-weight:700;color:var(--ink3);margin-bottom:5px;letter-spacing:.2px}
.rv-an-b{font-size:12.5px;line-height:1.78;color:var(--ink2);word-break:break-word}
.rv-an-b p,.rv-an-b div{margin:0 0 5px}
.rv-an-b p:last-child,.rv-an-b div:last-child{margin-bottom:0}
.rv-an-b ul,.rv-an-b ol{margin:4px 0;padding-left:20px}

/* 志愿者考试：答错名单用一排小胶囊，22 个人也排得下，不用再点开弹窗 */
.ve-names{display:flex;flex-wrap:wrap;gap:4px}
.ve-chip{display:inline-block;padding:1px 7px;border-radius:999px;background:#FDECEF;color:#C0243C;
  font-size:11px;font-weight:600;line-height:1.6}
.ve-ck{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink2);cursor:pointer}
.ve-ck input{width:14px;height:14px;accent-color:var(--brand)}

/* 答题详情里的口径提示：只在「存的分 ≠ 按当前题库重算的分」时出现 */
.rv-note{margin:0 0 12px;padding:9px 12px;border-radius:10px;background:#FDF6E7;border:1px solid #F3E2BD;
  color:#8A6415;font-size:12px;line-height:1.7}
.rv-note b{color:#7A5510}

/* ===== 任务清单（2026-11-04 W18）：概览与「任务」页签共用一套行 =====
   勾选框是自己画的：原生 checkbox 没法做成「未完成=空框、完成=绿底白勾」，
   也不用 .camp-todo i（那是旧待办清单的静态方块）。 */
.ct-row{align-items:center;gap:10px;padding:10px 2px}
.ct-ck{position:relative;flex:none;width:20px;height:20px;cursor:pointer;display:block}
.ct-ck input{position:absolute;inset:0;width:100%;height:100%;opacity:0;margin:0;cursor:pointer;z-index:1}
.ct-ck i{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:6px;
  border:1.6px solid var(--line);background:#fff;color:#fff;transition:background .15s,border-color .15s}
.ct-ck i svg{width:13px;height:13px;opacity:0;transform:scale(.6);transition:.15s}
.ct-ck input:checked + i{background:var(--ok);border-color:var(--ok)}
.ct-ck input:checked + i svg{opacity:1;transform:none}
.ct-ck input:focus-visible + i{box-shadow:0 0 0 3px var(--ok-l)}
.ct-row.done{background:var(--ok-l);border-radius:8px;padding-left:8px;padding-right:8px}
/* .camp-todo.done span 会给整行加删除线（.ct-t 正好是 span），
   这里只让标题划掉，说明和勾选人保留原样 */
.ct-row.done .ct-t{text-decoration:none}
.ct-row.done .ct-t b{color:var(--ink2);text-decoration:line-through;text-decoration-color:rgba(0,0,0,.22)}
.ct-t{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.ct-t b{font-size:13px;font-weight:600;color:var(--ink);line-height:1.5}
/* .camp-todo em 有 margin-left:auto（旧待办清单用来把日期顶到右边），
   这里必须覆盖掉，否则说明文字会被推到行尾 */
.ct-t em{font-style:normal;font-size:11.5px;color:var(--ink3);line-height:1.5;margin-left:0}
.ct-t em.ct-done-by{color:var(--ok-d);font-weight:600}
.ct-m{flex:none;font-size:11.5px;color:var(--ink3);white-space:nowrap}
.ct-exp{flex:none;border:0;background:none;padding:2px 2px;color:var(--brand-d);font-size:12px;
  font-weight:600;cursor:pointer;white-space:nowrap}
.ct-exp:hover{text-decoration:underline}
.ct-group{margin-bottom:8px}
.ct-group:last-child{margin-bottom:0}
.ct-gh{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:700;color:var(--ink2);
  padding:12px 2px 5px;border-bottom:1px solid var(--line)}
.ct-gh span{margin-left:auto;font-weight:600;color:var(--ink3);font-variant-numeric:tabular-nums}

/* 资料清单：标题占满中间，右边一个动作（下载 / 打开链接 / 查看） */
.ct-doc{gap:10px}
.ct-doc-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct-doc-t em{font-style:normal;color:var(--ink3);font-size:11.5px;margin-left:8px}
.ct-doc-a{flex:none;border:1px solid var(--line);background:#fff;border-radius:8px;padding:3px 10px;
  font-size:12px;color:var(--brand-d);cursor:pointer;text-decoration:none;font-weight:600;line-height:1.5}
.ct-doc-a:hover{border-color:#CFDCF2;background:#F7FAFF}

/* ===== 经验（W18）：列表卡片 / 详情正文 / 编辑器字段 ===== */
.exp-list{display:flex;flex-direction:column;gap:10px}
.exp-card{border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:#fff;
  cursor:pointer;transition:border-color .15s,box-shadow .15s}
.exp-card:hover{border-color:#CFDCF2;box-shadow:0 4px 14px rgba(31,63,120,.06)}
.exp-h{display:flex;align-items:center;gap:8px}
.exp-h b{flex:1;min-width:0;font-size:13.5px;font-weight:700;color:var(--ink)}
.exp-m{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px;font-size:11.5px;color:var(--ink3)}
.exp-t{margin-left:auto;font-variant-numeric:tabular-nums}
.exp-acts{display:flex;gap:8px;margin-top:10px}
.exp-note{margin-top:8px;padding:6px 10px;border-radius:8px;background:var(--danger-l);color:#E0344F;
  font-size:12px;line-height:1.7}
.exp-meta{display:flex;align-items:center;gap:10px;margin-bottom:10px;font-size:12px;color:var(--ink3)}
.exp-body{font-size:13.5px;line-height:1.85;color:var(--ink);word-break:break-word}
.exp-body p{margin:0 0 8px}
.exp-body ul,.exp-body ol{margin:0 0 8px 20px}
.exp-body img{max-width:100%;border-radius:10px;display:block;margin:8px 0}
.cp-field{margin-bottom:14px}
.cp-field>label{display:block;margin-bottom:6px;font-size:12px;font-weight:600;color:var(--ink2)}
.cp-field>label i{font-style:normal;color:#E0344F}
.cp-hint{margin-top:6px;font-size:11.5px;color:var(--ink3);line-height:1.7}

/* ===== 我的班级 → 上课（2026-11-05 W22）：课次列表 + 核对弹窗 ===== */
.cl-top{display:flex;gap:16px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;margin-bottom:14px}
.cl-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;flex:1 1 520px}
.cl-stat{border:1px solid var(--line);border-radius:12px;padding:12px 14px;background:var(--surface)}
.cl-stat-v{font-size:21px;font-weight:700;line-height:1.2;font-variant-numeric:tabular-nums;color:var(--ink)}
.cl-stat-l{font-size:12.5px;color:var(--ink2);margin-top:3px}
.cl-stat-s{font-size:11.5px;color:var(--ink3);margin-top:3px;line-height:1.5}
.cl-acts{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.cl-card{padding:0}
.cl-tbl{table-layout:fixed}
.cl-tbl th,.cl-tbl td{padding:9px 10px}
/* 兜底：fixed 布局下列宽是定死的，一旦单元格内容变宽（比例条 + 标签 + 人数），
   多出来的部分会压到右隔壁列上（复盘挤到对练就是这样）。这里直接裁掉，
   宁可截断也不要两列文字叠在一起。 */
.cl-tbl td{overflow:hidden}
.cl-tbl .cl-cell{min-width:0}
.cl-tbl .cl-th-seq{width:52px}
.cl-tbl th:nth-child(2){width:74px}
.cl-tbl th:nth-child(3){width:78px}
.cl-tbl th:nth-child(5){width:112px}
.cl-tbl th:nth-child(6){width:104px}
.cl-tbl th:nth-child(7){width:112px}
.cl-tbl th:nth-child(8){width:104px}
.cl-tbl th:nth-child(9){width:74px}
.cl-td-seq{text-align:center;color:var(--ink3);font-variant-numeric:tabular-nums}
.cl-td-code{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cl-code{font-family:var(--mono,ui-monospace,SFMono-Regular,Menlo,monospace);font-size:12px;color:var(--ink2);
  background:var(--surface-2);border-radius:6px;padding:2px 6px}
.cl-num{font-variant-numeric:tabular-nums;white-space:nowrap}
.cl-num b{font-size:14px}
.cl-num i{font-style:normal;color:var(--ink3);margin-left:2px}
.cl-num-i{font-style:normal;font-size:11.5px;color:var(--ink3);margin-left:5px}
.cl-lv{display:block;font-style:normal;font-size:11px;color:var(--warn,#C7861A);margin-top:1px;white-space:nowrap}
.cl-tr-future td{color:var(--ink2)}
.cl-foot{margin-top:10px;font-size:11.5px;color:var(--ink3);line-height:1.7}
/* 弹窗 */
.cl-mb{padding-top:4px}
.cl-sum{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:12px}
.cl-sum>div{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--surface-2)}
.cl-sum b{font-size:20px;font-variant-numeric:tabular-nums;color:var(--ink)}
.cl-sum em{display:block;font-style:normal;font-size:11.5px;color:var(--ink3);margin-top:2px}
.cl-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
.cl-bar-tip{flex:1;min-width:200px;font-size:11.5px;color:var(--ink3);line-height:1.6}
/* 保存按钮和批量按钮同一排（2026-11-08）：原来挂在名单最底下的 .cl-savebar，
   一百多人要滚到底才点得到。汇总文字放按钮左边，保存按钮永远在最右。 */
.cl-bar-sum{font-size:11.5px;color:var(--ink2);white-space:nowrap;font-variant-numeric:tabular-nums}
.cl-bar-sum:empty{display:none}
.cl-bar .cl-save{height:30px;padding:0 14px;margin-left:2px;white-space:nowrap}
.cl-r-tbl{table-layout:fixed;width:100%}
.cl-r-tbl th:nth-child(1){width:34px}
.cl-r-tbl th:nth-child(2){width:96px}
.cl-r-tbl th:nth-child(3){width:152px}
.cl-r-tbl th:nth-child(4){width:126px}
.cl-r-tbl th:nth-child(5){width:104px}
.cl-r-tbl th:nth-child(6){width:104px}
.cl-r-tbl th:nth-child(7){width:72px}
.cl-r-tbl td{padding:6px 10px}
.cl-ck-n{font-weight:600}
.cl-nm{background:none;border:0;padding:0;font-family:inherit;font-size:12.5px;font-weight:600;
  color:var(--brand-d);cursor:pointer;text-align:left;max-width:100%;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.cl-nm:hover{text-decoration:underline}
.cl-ck-g{color:var(--ink2);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cl-ck-p{font-size:12px;color:var(--ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cl-ck-src{font-size:11px;color:var(--ink3)}
select.input.cl-st{width:84px;padding:4px 6px;font-size:12.5px;font-weight:600}
/* 状态两态上色（2026-11-05 用户要求）：到课 / 已参加 / 已完成 = 绿，未到 / 未参加 / 未完成 = 红 */
select.input.cl-st.cl-st-present,select.input.cl-st.cl-st-in{color:var(--ok-d);background:var(--ok-l);border-color:#CBEFE2}
select.input.cl-st.cl-st-absent,select.input.cl-st.cl-st-out{color:var(--danger);background:var(--danger-l);border-color:#FFD3DD}
input.input.cl-min{width:58px;padding:4px 6px;text-align:right;font-variant-numeric:tabular-nums}
.cl-min-u{font-size:11.5px;color:var(--ink3);margin-left:2px}
/* 复盘 / 对练早先用 chips + 九宫格，2026-11-05 起统一成名册表格，旧的 .cl-chip / .cl-duel* 已删。
   .cl-sw（复盘开关）/ .cl-rv-*（复盘链接与要点）/ .cl-skip（没勾就提示仍然记录）同日一并删掉：
   页签由建课勾选决定，没勾就不出现，这些兜底件没有落点了。 */
@media(max-width:900px){
  .cl-stats,.cl-sum{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* ===== 上课改版（2026-11-05）：加课表单 / 筛选条 / 批量条 ===== */
.btn.btn-xs{height:26px;padding:0 9px;border-radius:7px;font-size:12px;line-height:1;gap:4px}
.cl-tbl th:nth-child(9){width:112px}
.cl-td-op{white-space:nowrap}
.cl-td-op .btn+.btn{margin-left:4px}
/* 会议列表四个按钮：小图标 + 文字（2026-11-09） */
.cl-td-op .vm-ib{display:inline-flex;align-items:center;gap:4px}
.cl-td-op .vm-ib svg{width:13px;height:13px;flex:none}
.cl-tools{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
.cl-tools-line{width:1px;height:18px;background:var(--line);margin:0 2px}
select.input.cl-f{width:auto;min-width:104px;height:30px;padding:0 8px;font-size:12.5px}
input.input.cl-q{width:152px;height:30px;padding:0 10px;font-size:12.5px}
.cl-bulk{display:none;gap:6px;align-items:center;flex-wrap:wrap;padding:8px 10px;margin-bottom:10px;
  border:1px solid var(--line);border-radius:10px;background:var(--brand-weak,rgba(43,108,246,.06))}
.cl-bulk.show{display:flex}
.cl-bulk-n{font-size:12px;color:var(--ink2);margin-right:2px}
.cl-bulk-n b{color:var(--brand);font-variant-numeric:tabular-nums}
.cl-th-chk,.cl-td-chk{text-align:center;padding-left:4px!important;padding-right:4px!important}
.cl-chk-all{display:inline-flex;align-items:center;cursor:pointer}
.cl-chk-all input,.cl-rowchk{width:15px;height:15px;accent-color:var(--brand);cursor:pointer;margin:0}
.cl-form{display:grid;grid-template-columns:1.2fr .95fr .95fr;gap:12px}
.cl-form.cl-form2{grid-template-columns:1.7fr 1fr}
.cl-form .cp-field{margin-bottom:12px}
.cl-form input.input{padding-left:10px;padding-right:8px;min-width:0}
.cl-radio{display:flex;gap:10px;flex-wrap:wrap}
.cl-radio label{flex:1 1 200px;display:flex;gap:9px;align-items:flex-start;padding:10px 12px;
  border:1.5px solid var(--line);border-radius:10px;cursor:pointer;transition:border-color .15s,background .15s}
.cl-radio label.on{border-color:var(--brand);background:var(--brand-weak,rgba(43,108,246,.05))}
.cl-radio input{margin-top:2px;accent-color:var(--brand)}
.cl-radio span{font-size:13px;font-weight:600;color:var(--ink);line-height:1.5}
.cl-radio span i{display:block;font-style:normal;font-weight:400;font-size:11.5px;color:var(--ink3);margin-top:2px}
.cl-checks{display:flex;gap:18px;flex-wrap:wrap;padding-top:2px}
.cl-chk{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--ink);cursor:pointer;user-select:none}
.cl-chk input{width:15px;height:15px;accent-color:var(--brand);cursor:pointer;margin:0}
@media(max-width:760px){
  .cl-form{grid-template-columns:1fr}
  input.input.cl-q{width:120px}
}

/* ===== 课程页（2026-11-05 晚）：列表点行下钻，到课 / 对练 / 复盘三个页签 ===== */
.cl-tbl tbody tr[data-open]{cursor:pointer}
.cl-tbl tbody tr[data-open]:hover{background:var(--surface-2)}
.cl-link{color:var(--brand-d);font-weight:600}
.cl-tbl tbody tr[data-open]:hover .cl-link{text-decoration:underline}
.cl-dh{padding:14px 16px;margin-bottom:12px}
.cl-dh-top{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.cl-back{display:inline-flex;align-items:center;gap:4px;border:none;background:none;padding:0;
  cursor:pointer;font-family:inherit;font-size:12.5px;color:var(--ink2);font-weight:600}
.cl-back:hover{color:var(--brand)}
.cl-back svg{width:14px;height:14px}
.cl-dh-acts{margin-left:auto;display:flex;gap:8px}
.cl-dh-row{display:flex;gap:16px;align-items:center;flex-wrap:wrap}
.cl-dh-main{flex:1 1 300px;min-width:0}
.cl-dh-t{font-size:15px;font-weight:700;color:var(--ink);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.cl-dh-m{font-size:12px;color:var(--ink3);margin-top:5px;line-height:1.7}
.cl-dh-nums{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;flex:none}
/* 只勾了复盘 / 只勾了对练的课，页头数字少两个，按实际个数铺（2026-11-05） */
.cl-dh-nums.cl-dh-n2{grid-template-columns:repeat(2,minmax(0,1fr))}
.cl-dh-nums.cl-dh-n3{grid-template-columns:repeat(3,minmax(0,1fr))}
.cl-dh-nums>div{border:1px solid var(--line);border-radius:10px;padding:7px 12px;background:var(--surface-2);min-width:98px}
.cl-dh-nums b{font-size:15px;font-variant-numeric:tabular-nums;color:var(--ink);white-space:nowrap}
.cl-dh-nums em{display:block;font-style:normal;font-size:11px;color:var(--ink3);margin-top:2px}
.cl-htabs{margin:0 0 12px;padding:3px}
.cl-htabs button{padding:6px 18px;font-size:13px}
.cl-tabpanel{padding:16px}
.cl-savebar{display:flex;align-items:center;gap:12px;margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.cl-save-tip{flex:1;font-size:11.5px;color:var(--ink3);line-height:1.6}
@media(max-width:900px){
  .cl-dh-nums{grid-template-columns:repeat(2,minmax(0,1fr));width:100%}
}

/* ===== 2026-11-06 导入与资料可见性 ===== */
/* 导入页签的工具行：示例下载 / 切文本粘贴 */
.cv-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0 12px}
.cv-filebtn{position:relative;cursor:pointer}
/* 添加课程：会议号独占一行，右边跟一颗「自动创建会议」 */
.cl-code-row{display:flex;align-items:center;gap:8px}
.cl-code-row .input{flex:1;min-width:0}
.cl-code-row .btn{flex:none;white-space:nowrap}
/* 资料「允许志愿者查看」：列表里的小勾选 */
.td-vis{display:inline-flex;align-items:center;gap:6px;cursor:pointer;font-size:12.5px;color:var(--ink3);
  padding:3px 8px;border-radius:7px;border:1px solid var(--line);background:#fff;white-space:nowrap}
.td-vis input{margin:0;cursor:pointer}
.td-vis.on{color:#0E9F6E;border-color:#C6EEDD;background:#F1FBF7}
.td-vis-row{margin-left:8px;font-size:12px}
/* 资料页签的批量条 */
.td-batch{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:9px 12px;margin-bottom:10px;
  background:#FAFBFE;border:1px solid var(--line);border-radius:10px}
.td-batch-n{font-size:12.5px;color:var(--ink2)}
.td-batch-n b{color:#1890ff}
.td-batch-tip{font-size:11.5px;color:var(--ink3)}

/* ===== 到课同步确认弹窗（2026-11-06 W23） ===== */
.sy-head{border:1px solid #E7EBF3;/* 同步弹窗的「还没开始拉」的说明块（2026-11-09：点弹窗不再自动同步） */
.sy-intro{border:1px dashed #DCE3EF;border-radius:10px;padding:13px 15px;background:#FBFCFE}
.sy-intro p{margin:0 0 7px;font-size:12.5px;line-height:1.85;color:var(--ink2)}
.sy-intro p:last-child{margin-bottom:0}
.sy-intro .sy-intro-q{color:var(--ink3)}
border-radius:10px;padding:10px 12px;background:#FAFBFD;margin-bottom:10px}
.sy-h1{font-size:13.5px;color:#0F1A2E;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.sy-h1 b{font-size:15px;letter-spacing:.5px}
.sy-ed{font-size:11px;color:#5B6B85;background:#EEF2F8;border-radius:4px;padding:1px 6px}
.sy-sub{font-size:12px;color:#5B6B85;max-width:420px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sy-win{margin-top:4px;font-size:11.5px;color:#8A94A6;line-height:1.5}
.sy-h2{font-size:12px;color:#5B6B85;margin-top:6px}
.sy-h2 b{color:#0F1A2E}
.sy-bar{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap}
.sy-only{font-size:12px;color:#5B6B85;display:flex;align-items:center;gap:4px;cursor:pointer}
.sy-hint{font-size:11.5px;color:#98A2B3;margin-left:auto}
.sy-wrap{max-height:none}
.sy-tbl{width:100%;table-layout:fixed}
.sy-tbl th,.sy-tbl td{padding:7px 8px;font-size:12.5px;vertical-align:middle}
.sy-tbl th:nth-child(1),.sy-tbl td:nth-child(1){width:34px}
.sy-tbl th:nth-child(2),.sy-tbl td:nth-child(2){width:auto}
.sy-tbl th:nth-child(3),.sy-tbl td:nth-child(3){width:96px}
.sy-tbl th:nth-child(4),.sy-tbl td:nth-child(4){width:210px}
.sy-tbl th:nth-child(5),.sy-tbl td:nth-child(5){width:62px;text-align:right}
.sy-nick{color:#0F1A2E;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sy-min{display:flex;align-items:center;gap:3px}
.sy-min input{width:56px;padding:3px 6px;font-size:12px;text-align:right}
.sy-min em{font-style:normal;font-size:11px;color:#98A2B3}
.sy-who b{font-weight:600;color:#0F1A2E}
.sy-who i{font-style:normal;font-size:11px;color:#8A94A6;margin-left:6px}
.sy-how{font-style:normal;font-size:10.5px;color:#12B886;background:#E9F9F2;border-radius:3px;padding:0 4px;margin-left:6px}
.sy-man{font-style:normal;font-size:10.5px;color:#2F6BFF;background:#EDF3FF;border-radius:3px;padding:0 4px;margin-left:6px}
.sy-amb{font-size:11.5px;color:#FF9F1C}
.sy-none{font-size:11.5px;color:#FF4D6D}
.sy-un{background:#FFFBFA}
.sy-pick td{background:#F7F9FC;padding:8px}
.sy-q{width:180px;margin-right:8px;padding:4px 8px;font-size:12px;display:inline-block}
.sy-sel{padding:4px 8px;font-size:12px;display:inline-block;width:auto;min-width:240px;max-width:360px}
.sy-tip{font-size:12px;color:#5B6B85;margin-right:auto}
.sy-tip b{color:#0F1A2E}

/* ===== 志愿者会议（W25，2026-11-07；2026-11-08 改成与「上课安排」同一套骨架） ===== */
/* 列表复用 .cl-top / .cl-stats / .cl-card / .cl-foot，只有表格列宽要单独定 */
.vm-tbl{table-layout:fixed}
.vm-tbl th:nth-child(1){width:74px}
.vm-tbl th:nth-child(2){width:78px}
.vm-tbl th:nth-child(4){width:112px}
.vm-tbl th:nth-child(5){width:56px}
.vm-tbl th:nth-child(6){width:56px}
.vm-tbl th:nth-child(7){width:76px}
.vm-tbl th:nth-child(8){width:340px}
/* 2026-11-09 操作列装了 4 个「图标+文字」按钮，实测内容要 326px，原来 150px 装不下，
   多出来的 176px 溢出到 .table-wrap 上撑出横向滚动条；标题列又把富余空间全吃掉。
   这里按内容给足列宽，窄屏再折行兜底，两种情况下都不溢出。 */
.vm-tbl .cl-td-op{white-space:normal}
.vm-tbl .cl-td-op .btn{margin:0 4px 4px 0}
/* 标题列：超长无断点的串也强制换行，不再撑宽整表 */
.vm-tbl .camp-td-n{overflow-wrap:anywhere;min-width:0}
@media(max-width:1180px){.vm-tbl th:nth-child(8){width:200px}}
@media(max-width:900px){.vm-tbl th:nth-child(8){width:120px}}
.vm-tbl tbody tr[data-open]{cursor:pointer}
/* 结束时间另起一行，跟日期列的周几一样是小灰字（上课安排那张表是连写的，这里只作用于本表） */
.vm-tbl .camp-td-t em{display:block;font-style:normal;font-size:11px;color:var(--ink3);font-weight:500;margin-top:1px}
.vm-sub{font-size:11px;color:var(--ink3);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.vm-out{font-size:12px;color:var(--ink3);margin-top:10px}

/* 名单里的「会议到会」列：日期 / 对勾 / 分钟数，横向排 */
.cv-mt-td{min-width:120px}
.cv-mt{display:flex;gap:4px;flex-wrap:nowrap}
.cv-mt-c{flex:none;width:40px;text-align:center;border-radius:6px;background:#F4F6FA;padding:3px 0 2px}
.cv-mt-c span{display:block;font-size:10px;color:var(--ink3);line-height:1.2;letter-spacing:-.2px}
.cv-mt-c i{display:block;width:16px;height:16px;line-height:15px;margin:2px auto 0;border-radius:4px;
  font-style:normal;font-size:10px;color:#fff;background:#D6DBE5;text-align:center}
.cv-mt-c em{display:block;font-style:normal;font-size:10px;color:var(--ink3);margin-top:1px}
.cv-mt-c.on{background:#EAF8F2}
.cv-mt-c.on i{background:#12B586}
.cv-mt-c.on em{color:#0B8A66}
.cv-mt-none{color:var(--ink3)}
/* 到会率（2026-11-09）：名单里那条百分比细线，宽度 = 到会次数 / 应到次数 */
.cv-rate-td{min-width:112px}
.cv-rate{position:relative;width:104px;height:20px;border-radius:10px;background:#EEF2F8;overflow:hidden}
.cv-rate i{position:absolute;left:0;top:0;bottom:0;border-radius:10px;opacity:.22}
.cv-rate span{position:relative;display:block;text-align:center;font-size:11px;line-height:20px;color:var(--ink2);letter-spacing:-.2px}
.cv-rate span b{font-weight:700}

/* 志愿者手机端入口条（2026-11-07）：名单最上面那一条，带复制按钮 */
/* 2026-11-09 用户要求压成一行：左边标题、中间地址（长了省略号）、右边复制按钮 */
.cv-entry{display:flex;align-items:center;gap:12px;background:linear-gradient(135deg,#F2FBFA,#EEF8F6);
  border:1px solid #D8EFEB;border-radius:10px;padding:11px 14px;margin-bottom:14px}
.cv-entry > b{flex:none;font-size:13.5px;color:#2C5F50;white-space:nowrap}
.cv-entry > code{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:12.5px;color:#2B8F86;background:#fff;border:1px solid #D8EFEB;border-radius:6px;
  padding:5px 9px;font-family:ui-monospace,Menlo,Consolas,monospace}
.cv-entry > .btn{flex:none}

/* 认领未到课（2026-11-07）：课程列表里的认领弹窗 */
.cl-claim-tbl td{vertical-align:middle}
.cl-src{display:flex;align-items:center;justify-content:space-between;gap:12px;
  margin-bottom:9px;padding:0 2px;font-size:12.5px;color:var(--muted);line-height:1.5}
.cl-claim-tbl .cl-claim-in{height:30px;font-size:13px;width:100%;min-width:110px}
.cl-claim-done{background:#F6FCF9}
.btn-off,.btn[disabled]{opacity:.45;cursor:not-allowed}

/* ============================================================
   2026-11-07 全部图形化 + 备注日志 + 阶段指标配置
   ============================================================ */
:root{--ring-bg:#E8EEF7}

/* 环形指标卡（概览） */
.cp-card-ring{display:flex;flex-direction:column}
.cp-ring-wrap{position:relative;width:104px;height:104px;margin:2px auto 6px}
.cp-ring{width:100%;height:100%;display:block}
.cp-ring-v{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:22px;font-weight:800;letter-spacing:-.8px;font-variant-numeric:tabular-nums}
.cp-ring-v em{font-size:11px;font-style:normal;font-weight:600;margin-left:1px;opacity:.75}
.cp-ring-s{text-align:center;font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums;margin-bottom:8px}
.cp-num-v{font-size:34px;font-weight:800;letter-spacing:-1.2px;margin:10px 0 6px;font-variant-numeric:tabular-nums}
.cp-num-v em{font-size:12px;font-style:normal;font-weight:600;margin-left:2px;opacity:.7}

/* 战队 / 小组卡上的迷你环：环在左，名称与数值在右 */
.tm-chip{display:grid;grid-template-columns:auto 1fr;grid-template-rows:auto auto;
  column-gap:7px;align-items:center;padding:4px 10px 4px 5px}
.tm-chip .tm-ring{grid-row:1/3;width:26px;height:26px;display:block}
.tm-chip em{grid-column:2;font-size:10px;line-height:1.2}
.tm-chip b{grid-column:2;font-size:13px;line-height:1.25}

/* 上课安排：到课环形 + 复盘 / 对练比例条 */
.cl-cell{display:flex;align-items:center;gap:7px}
.cl-ring{width:28px;height:28px;flex:none;display:block}
.cl-ratio{display:block;width:38px;height:6px;border-radius:99px;background:var(--ring-bg);overflow:hidden;flex:none}
.cl-ratio i{display:block;height:100%;border-radius:99px}
.cl-cell .cl-num b{font-size:13px}
.cl-cell .cl-num i{font-size:10.5px}
.cl-cell .tag{font-size:10.5px;padding:1px 6px}

/* 备注日志弹窗 */
.nt-add{background:var(--surface-2);border-radius:12px;padding:12px;margin-bottom:14px}
.nt-ta{width:100%;min-height:76px;resize:vertical;line-height:1.6;font-family:inherit}
.nt-act{display:flex;align-items:center;gap:12px;margin-top:10px;flex-wrap:wrap}
.nt-gl{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink2);cursor:pointer}
.nt-gl em{font-style:normal;font-size:11px;color:var(--ink3)}
.nt-act .btn{margin-left:auto}
.nt-list{display:flex;flex-direction:column;gap:10px}
.nt-row{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:#fff}
.nt-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12.5px}
.nt-h b{font-size:13px}
.nt-h em{font-style:normal;font-size:11.5px;color:var(--ink3);font-variant-numeric:tabular-nums}
.nt-del{margin-left:auto;border:0;background:transparent;color:var(--danger);font-size:12px;
  cursor:pointer;font-family:inherit;padding:2px 4px}
.nt-c{margin-top:6px;font-size:13px;line-height:1.65;color:var(--ink);white-space:pre-wrap;word-break:break-word}
.nt-empty{padding:22px 0;text-align:center;color:var(--ink3);font-size:13px}

/* 本项目指标：四个阶段各选一套 */
.im-flows-card{margin-top:14px}
.im-flows{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;padding-bottom:6px}
@media (max-width:980px){.im-flows{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:620px){.im-flows{grid-template-columns:1fr}}
.im-flow{border:1px solid var(--line);border-radius:12px;padding:11px 12px}
.im-flow-t{display:flex;align-items:center;justify-content:space-between;font-size:12.5px;
  font-weight:700;color:var(--ink2);margin-bottom:9px}
.im-flow-t em{font-style:normal;font-size:11px;color:var(--ink3);font-weight:500}
.im-flow-b{display:flex;flex-direction:column;gap:6px}
.im-fmk{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink2);cursor:pointer;padding:3px 0}
.im-fmk.on{color:var(--brand-d);font-weight:600}
.im-fmk input{margin:0}

/* 5 张卡时排一行 5 列，别让第二行只挂一张 */
.cp-cards[data-n="5"]{grid-template-columns:repeat(5,minmax(0,1fr))}
@media (max-width:1280px){.cp-cards[data-n="5"]{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:1100px){.cp-cards[data-n="5"]{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:620px){.cp-cards[data-n="5"]{grid-template-columns:1fr}}

/* 学员表里的到课率迷你环 */
/* 到课率 / 对练率：环形 + 右边两行（百分比在上、「已上/总场」在下）
   2026-11-08：原来是「百分比 分数」挤一行，一列只有 74px 放不下，
   分数会越过列边界压到隔壁列上。改成两行后宽度只要 60px 左右。 */
.su-rate{display:flex;align-items:center;gap:7px}
.su-rate>span{display:flex;flex-direction:column;line-height:1.2;min-width:0}
.su-rate .su-sub{display:block;margin-left:0;white-space:nowrap}
.su-ring{width:22px;height:22px;flex:none;display:block}

/* ===== 作业导入（W28，我的班级 → 更多 → 作业导入） ===== */
.cp-hw{padding:16px 18px}
.cp-hw-h{font-size:16px;font-weight:700;color:var(--deep);margin-bottom:4px}
.cp-hw-sub{font-size:12.8px;color:var(--muted);line-height:1.75;margin-bottom:12px}
.cp-hw-sub b{color:var(--ink);font-weight:600}
.cp-hw-pick{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.cp-hw-name{font-size:12.5px;color:var(--muted)}
.cp-hw-stat{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin:6px 0 14px}
.cp-hw-stat>div{border:1px solid var(--line);border-radius:10px;padding:9px 11px;background:var(--bg-soft,#f7f9f9)}
.cp-hw-stat b{display:block;font-size:19px;line-height:1.3;color:var(--deep)}
.cp-hw-stat em{font-style:normal;font-size:11.5px;color:var(--muted)}
.cp-hw-stat .warn b{color:var(--warn)}
.cp-hw-tbl{width:100%}
.cp-hw-uns{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px}
.cp-hw-unh{font-size:12.5px;color:var(--warn);margin-bottom:6px}
.cp-hw-un{display:flex;gap:10px;font-size:12.5px;padding:3px 0;color:var(--muted)}
.cp-hw-un i{font-style:normal;color:var(--ink);min-width:72px}
.cp-hw-un em{font-style:normal;min-width:110px}
.cp-hw-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:14px;border-top:1px solid var(--line);padding-top:12px}
.cp-hw-foot span{font-size:12px;color:var(--muted)}
.cp-hw-err{color:var(--danger);font-size:13px;padding:10px 0}
@media (max-width:900px){.cp-hw-stat{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ================= 学员名单分页（2026-11-08）：一页 300 条 =================
   分页条跟在表格下面，不放进 .su-wrap（那是横向 + 纵向滚动的容器，放进去会跟着滚走）。 */
.su-page{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:10px 12px 2px;flex-wrap:wrap}
.su-page-i{font-size:12.5px;color:var(--muted);letter-spacing:.2px}
.su-page-i b{font-weight:600;color:var(--ink)}
.su-page-b{display:flex;gap:6px;flex-wrap:wrap}
@media (max-width:640px){
  .su-page{justify-content:center}
  .su-page-b{justify-content:center;width:100%}
}

/* 姓名 / 电话 旁边的小按钮（2026-11-08）：
   用 .btn.btn-xs 的底子，尺寸压到 18px 高，免得把名单行撑开或挤掉姓名 */
.su-tbl .su-mini.btn{flex:none;height:18px;min-width:0;padding:0 5px;border-radius:5px;
  font-size:10px;font-weight:500;line-height:1;letter-spacing:0;gap:0;
  color:var(--ink3);background:#fff;border:1px solid #E1E6F0;box-shadow:none}
.su-tbl .su-mini.btn:hover{color:var(--brand-d);background:var(--brand-l);border-color:var(--brand)}

/* ---- 指标胶囊 + 阈值面板（2026-11-08 方案 C）----
   到课率 / 对练率 / 未购课 三个胶囊可以同时点亮，亮 = 这个条件生效 */
.su-mfs{display:inline-flex;align-items:center;gap:6px;flex:none}
.su-mf{display:inline-flex;align-items:center;gap:4px;height:30px;padding:0 9px;border-radius:999px;
  font-size:12px;font-weight:500;color:var(--ink3);background:#fff;border:1px solid var(--line,#E3E6EE);
  cursor:pointer;white-space:nowrap;user-select:none;transition:background .12s,color .12s,border-color .12s}
.su-mf:hover{border-color:var(--brand);color:var(--brand-d)}
.su-mf.on{background:#FCEBEB;border-color:#F3C9C9;color:#A32D2D}
.su-mf.on:hover{background:#F9DEDE}
.su-mf b{font-weight:700;font-variant-numeric:tabular-nums}
.su-mf-ar{width:0;height:0;border-left:3.5px solid transparent;border-right:3.5px solid transparent;
  border-top:4px solid currentColor;opacity:.55;margin-left:1px}
.su-mf-tog.on{background:#EAF3FF;border-color:#C6DDFC;color:#185FA5}

.su-mfp{position:absolute;z-index:9999;width:216px;padding:10px;border-radius:12px;background:#fff;
  box-shadow:0 12px 32px rgba(16,24,40,.18),0 0 0 1px rgba(16,24,40,.06);font-size:12.5px}
.su-mfp-t{font-size:11.5px;color:var(--ink3);margin:0 0 6px 4px}
.su-mfp-b{display:block;width:100%;text-align:left;padding:7px 9px;border:0;border-radius:8px;
  background:none;color:var(--ink);font-size:12.5px;cursor:pointer}
.su-mfp-b:hover{background:var(--hover,#F4F6FA)}
.su-mfp-b.on{background:var(--brand-l,#EAF1FF);color:var(--brand-d,#185FA5);font-weight:600}
.su-mfp-c{display:flex;align-items:center;gap:4px;margin:8px 0 4px;padding:7px 6px;border-top:1px solid var(--line,#EDF0F5)}
.su-mfp-c span{font-size:11.5px;color:var(--ink3);flex:none}
.su-mfp-c input{width:52px;height:26px;padding:0 6px;border:1px solid var(--line,#E3E6EE);border-radius:7px;
  font-size:12.5px;font-variant-numeric:tabular-nums;text-align:right}
.su-mfp-c em{font-style:normal;font-size:11.5px;color:var(--ink3)}
.su-mfp-c .btn{margin-left:auto}
.su-mfp-x{display:block;width:100%;text-align:center;padding:6px;border:0;background:none;
  color:var(--ink3);font-size:11.5px;cursor:pointer;border-radius:8px}
.su-mfp-x:hover{background:var(--hover,#F4F6FA);color:var(--danger,#A32D2D)}
/* ===== 排期设置（2026-11-09 改版：排期列表 + 分组管理 两个 Tab） ===== */
/* 列表比原来的卡片紧凑：一行一个排期，老师数 / 学员数只给数字，名单要点「管理老师」才看 */
.tm-tabs2{margin:2px 0 12px}
.tm-flt{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 2px 12px}
select.input.tm-sel{width:auto;min-width:132px;height:34px;padding:0 30px 0 11px;font-size:13px;border-radius:9px}
.tm-flt-tip{margin-left:auto;font-size:12.5px;color:var(--ink3)}
.tm-flt-tip b{color:var(--ink);font-variant-numeric:tabular-nums}
.tm-tcard{padding:0}
.tm-tbl{table-layout:fixed}
.tm-tbl th:nth-child(2){width:130px}
.tm-tbl th:nth-child(3),.tm-tbl th:nth-child(4){width:104px}
.tm-tbl th:nth-child(5),.tm-tbl th:nth-child(6){width:64px}
.tm-tbl th:nth-child(7){width:236px}
.tm-tbl th,.tm-tbl td{padding:11px 12px}
.tm-td-n{white-space:normal;min-width:0;overflow-wrap:anywhere}
.tm-td-n b{font-size:13.5px;font-weight:700;letter-spacing:-.2px}
.tm-td-n .tm-no{margin-left:7px}
.tm-pj{font-style:normal;font-size:10.5px;color:var(--ink3);background:var(--surface-2);
  border-radius:5px;padding:1px 6px;margin-left:7px;white-space:nowrap}
.tm-gtag{display:inline-block;font-size:11.5px;color:#2B8F86;background:#EAF7F5;border-radius:6px;
  padding:2px 8px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tm-op{white-space:nowrap;text-align:right}
.tm-op .btn+.btn{margin-left:5px}
.tm-pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:12px 2px 0}
.tm-pg-tip{font-size:12.5px;color:var(--ink3);margin-right:auto}
.tm-pg-tip b{color:var(--ink);font-variant-numeric:tabular-nums}
.tm-pager .btn{min-width:34px}
/* 分组管理：左边分组、右边这组的排期 */
.tm-gwrap{display:flex;gap:14px;align-items:flex-start}
.tm-glist{width:296px;flex:none;display:flex;flex-direction:column;gap:8px}
.tm-gi{padding:11px 13px;border:1px solid var(--line2);border-radius:10px;background:#fff;cursor:pointer;transition:.15s}
.tm-gi:hover{border-color:#C9DAFF}
.tm-gi.on{border-color:var(--brand);background:#F5F8FF;box-shadow:0 2px 10px rgba(47,107,255,.10)}
.tm-gi-t{display:flex;align-items:center;font-size:13.5px;font-weight:700}
.tm-gi-s{font-size:11.5px;color:var(--ink3);margin-top:4px;font-variant-numeric:tabular-nums}
.tm-gi-op{display:flex;gap:6px;margin-top:9px}
.tm-gbox{flex:1;min-width:0;border:1px solid var(--line2);border-radius:10px;background:#fff;padding:14px 16px}
.tm-gbox-h{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.tm-gbox-h b{font-size:14px}
.tm-gbox-s{font-size:12px;color:var(--ink3);font-variant-numeric:tabular-nums}
.tm-gbox-h .btn{margin-left:auto}
.tm-gbox-empty{display:flex;align-items:center;justify-content:center;color:var(--ink3);font-size:13px;min-height:220px}
.tm-tbl2{table-layout:fixed}
.tm-tbl2 th:nth-child(2),.tm-tbl2 th:nth-child(3){width:100px}
.tm-tbl2 th:nth-child(4),.tm-tbl2 th:nth-child(5){width:64px}
.tm-tbl2 th:nth-child(6){width:72px}
.tm-tbl2 th,.tm-tbl2 td{padding:10px 12px}
/* 管理老师弹窗：上面已指派、下面可添加 */
.tm-mh{font-size:12px;color:var(--ink3);margin-bottom:8px}
.tm-mh b{color:var(--ink);font-size:13px}
.tm-mcur{display:flex;flex-wrap:wrap;gap:8px}
@media(max-width:1100px){
  .tm-tbl th:nth-child(7){width:200px}
  .tm-tbl th:nth-child(3),.tm-tbl th:nth-child(4){width:92px}
}
@media(max-width:900px){
  .tm-gwrap{flex-direction:column}
  .tm-glist{width:100%}
}
