/* ===== 博奥体育运营管理系统 全局样式 =====
   依赖 element-plus.css（先于本文件加载）
   配色: 主色 #409eff / 成功 #67c23a / 警告 #e6a23c / 危险 #f56c6c
   布局: .sidebar(220 深色) + .main(.topbar 56 + .content) */

* { box-sizing: border-box; }
html, body, #app { height: 100%; margin: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif; color: #1f2d3d; background: #eef1f5; font-size: 14px; }

/* ---------- 布局骨架 ---------- */
.layout { display: flex; height: 100vh; overflow: hidden; }
.sidebar { width: 236px; background: #1c2b3a; color: #cbd5e1; display: flex; flex-direction: column; flex-shrink: 0; }
.sidebar .brand { height: 56px; display: flex; align-items: center; justify-content: center; font-size: 18px; font-weight: 700; color: #fff;
  border-bottom: 1px solid #2c3e50; border-right: 1px solid #2c3e50; background: linear-gradient(135deg,#16222f,#1e3448); flex-shrink: 0; }
.sidebar .brand small { display: none; }
.sidebar nav { flex: 1; overflow-y: auto; overflow-x: hidden; padding: 10px 0; }
.sidebar .nav-g { padding: 6px 0 2px; }
.sidebar .nav-g-title { padding: 4px 20px 2px; font-size: 11px; color: #5d7d99; letter-spacing: 1px; cursor: pointer; user-select: none; }
.sidebar .nav-g-title:hover { color: #8fb4d6; }
.sidebar .nav-g-title.fold { color: #7a94ab; }
.sidebar .nav-g-title .arr { display: inline-block; width: 14px; color: #6a87a3; font-size: 10px; }
.sidebar .nav-g a { padding-left: 32px; }
.sidebar nav a { display: flex; align-items: center; padding: 12px 20px; color: #cbd5e1; text-decoration: none; cursor: pointer;
  font-size: 14px; border-left: 3px solid transparent; transition: all .15s; user-select: none; }
.sidebar nav a:hover { background: #24384c; color: #fff; }
.sidebar nav a.on { background: #24384c; color: #fff; font-weight: 600; border-left-color: #4fc3f7; }
.sidebar .roleline { flex-shrink: 0; padding: 12px 16px; font-size: 12px; color: #7f9bb3; border-top: 1px solid #2c3e50; line-height: 1.7; }
/* R720（馆方 2026-10-04 拍板「抽屉甲」）：R624 挪进抽屉的那两颗方按钮（改密码 / 退出）
   收成一行小字链 —— 右靠、exit 红字，与下面「当前角色」连成一块账户区。
   纯显示层：点它走的还是 pwdDlg / logout。 */
.sidebar .acct-link-row { flex-shrink: 0; display: flex; align-items: center; justify-content: flex-end; gap: 6px;
  padding: 6px 14px 0; font-size: 12px; color: #8a97a5; }
.sidebar .acct-link-row a { cursor: pointer; color: #606266; }
.sidebar .acct-link-row a.out { color: #c45656; }
.sidebar .acct-link-row a:hover { color: #fff; }
.sidebar .acct-link-row a.out:hover { color: #e06c6c; }
.main { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; }
.topbar { min-height: 56px; background: #fff; border-bottom: 1px solid #e5e9f0; display: flex; align-items: center; justify-content: space-between;
  padding: 8px 18px; flex-shrink: 0; gap: 10px; row-gap: 6px;
  /* R257 手机端修复: 不再固定高/不压缩子项 —— 窄屏时分校页签整行落到第二行, 不再冲出顶栏压住日期 */
  flex-wrap: wrap; }
.topbar .t-title { font-size: 17px; font-weight: 700; color: #1f2d3d; display: flex; align-items: center; gap: 4px; min-width: 0;
  flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.topbar .t-user { display: flex; align-items: center; gap: 10px; font-size: 13px; color: #3d4d5f; white-space: nowrap;
  flex-wrap: wrap; justify-content: flex-end; row-gap: 6px; }
/* R257: 分校页签/按钮一律不参与压缩（被压就会两个按钮挤成竖排、撑破顶栏） */
.topbar .t-user .el-radio-group { flex: 0 0 auto; }
.topbar .t-user > * { flex: 0 0 auto; }
.topbar .t-user .el-button { flex: 0 0 auto; }
/* R637（2026-10-02 馆方拍板 ①③⑤）：待办中心搬进顶栏的三样件 ——「N 项待办」标签 / ⓘ /「刷新」。
   一律**不参与压缩**（R257 同样的坑：被压就挤成竖排、撑破顶栏）；「刷新」推到这一行最右。 */
.topbar .t-title > .el-tag { flex: 0 0 auto; }
.topbar .t-title .hint-link { flex: 0 0 auto; }
.topbar .t-title > .el-button.t-hubref { flex: 0 0 auto; margin-left: auto; }
/* R720（馆方 2026-10-04 拍板「顶栏甲」）：顶栏那排「博奥｜诺高」＝两排（能切馆角色的分档 / 订场页前台那颗只读入口）
   统一加 .t-branch ⇒ 从两颗方按钮收成一枚圆角胶囊：浅灰底、选中那档白底蓝字带一点投影。
   只作用带 .t-branch 的这一档；flex:0 0 auto＝**不参与压缩**（R257 那条铁律，被压会挤成竖排撑破顶栏）。
   闸门 / v-model / @change / 选项来源一个字未动。 */
.topbar .t-title > .el-radio-group.t-branch { flex: 0 0 auto; display: inline-flex; gap: 2px;
  background: #f2f3f5; border-radius: 999px; padding: 2px; margin-left: 8px; }
.topbar .t-title > .el-radio-group.t-branch .el-radio-button__inner { border: 0 !important; background: transparent;
  box-shadow: none !important; border-radius: 999px !important; font-size: 12px; padding: 3px 12px; line-height: 1.4; color: #606266; }
.topbar .t-title > .el-radio-group.t-branch .is-active .el-radio-button__inner { background: #fff; color: #409eff;
  font-weight: 600; box-shadow: 0 1px 3px rgba(0,0,0,.10) !important; }
/* R639（2026-10-02 馆方拍板「方案B」）：消课考勤「一个下拉装全部」—— 参考按钮 + 下拉卡片里的行 */
/* R640（馆方 2026-10-02 拍板）：「消课考勤」工具栏那排按钮 —— R639 的下拉再拆回一排，
   各自一个颜色（当前态＝蓝实心、查已考勤＝绿）。按 390px 真机量过：4 个控件＋ⓘ 必须**一行**放得下，
   所以按钮用紧凑内边距、日期框收窄到 112px。 */
.board-q.el-button { flex: 0 0 auto; padding: 0 8px; font-size: 13px; height: 30px; }
/* R716（馆方 2026-10-04「动2/3」）：原来「今天」按钮 ＋「选日期」框**并成一颗「日期」键**
   （点开＝弹层里一份月历，el-calendar 自带「今天」键）。R640 那支 .board-q-date（92px 日期框）
   连同它下面几条规则**整块撤掉** —— 这一页已经没有那个控件了（见 app-training.js PG.board 工具条）。 */
.board-q-datebtn.el-button { display: inline-flex; align-items: center; gap: 3px; }
.board-q-datebtn .bdp-caret { font-size: 10px; line-height: 1; opacity: .75; }
/* 弹层里那份月历压扁一点（默认格子太高，工具条弹出的东西别像一整页日历） */
.board-date-pop .el-calendar__header { display: flex; align-items: center; gap: 6px; padding: 0 0 6px; border-bottom: 0; }
.board-date-pop .el-calendar__title { display: none; }
.board-date-pop .bdp-hd { font-size: 13px; font-weight: 600; }
.board-date-pop .bdp-nav { cursor: pointer; color: #409eff; font-size: 16px; line-height: 1; padding: 0 3px; }
.board-date-pop .bdp-nav.off { color: #c8ced6; cursor: default; }
.board-date-pop .bdp-today { cursor: pointer; color: #409eff; font-size: 12px; padding: 1px 6px; border: 1px solid #a0cfff; border-radius: 4px; }
.board-date-pop .el-calendar__body { padding: 0; }
.board-date-pop .el-calendar-table th { padding: 2px 0; font-size: 11px; }
.board-date-pop .el-calendar-table .el-calendar-day { height: 32px; padding: 0; }
.board-date-pop .bdp-day { display: flex; align-items: center; justify-content: center; height: 100%; font-size: 12px; cursor: pointer; border-radius: 4px; }
.board-date-pop .bdp-day:hover { background: #ecf5ff; color: #409eff; }
.board-date-pop .bdp-day.on { background: #409eff; color: #fff; }
.board-date-pop .bdp-day.off { color: #c8ced6; cursor: default; }
.board-date-pop .bdp-day.off:hover { background: transparent; color: #c8ced6; }
/* R640：每行「明细」弹窗里的名单行 */
/* R735（馆方 2026-10-05「明细上最上一行字只显示一半的字」）：原来把上边距写成了**负 4 像素** ——
   这行被提到弹窗内容区上沿之外（实测 top=94 / 内容区 top=98）⇒ 第一行字的上半截被切掉。
   改：① 上边距归零（顶格放，不再越界）；② 加行高，两行也读得清；
   ③ 每段 `.ds-i` 不许从中间断行（否则会断成「…· 当」/「天 4 人」），改用段间分隔。 */
.det-sub { font-size: 12px; margin: 0 0 8px; line-height: 1.6; }
.det-sub .ds-i { display: inline-block; white-space: nowrap; }
.det-sub .ds-i:not(:last-child)::after { content: '·'; color: #c0c4cc; margin: 0 6px 0 2px; }
.det-line { display: flex; align-items: center; gap: 8px; padding: 8px 0; border-top: 1px solid #f5f7fa; }
.det-line:first-child { border-top: 0; }
.det-name { flex: 1 1 auto; min-width: 0; font-size: 14px; color: #303133; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.det-ded { flex: 0 0 auto; width: 60px; text-align: right; font-size: 12px; color: #8a97a5; }
.det-sum { margin-top: 10px; padding-top: 8px; border-top: 1px solid #ebeef5; font-size: 12px; color: #8a97a5; line-height: 1.6; }
/* R641（馆方 2026-10-02 拍板「用这个」）：区间卡的**周历**（一行 7 格 ＋ 翻周）。
   前缀用 cw-（R534 规矩：新类名先查重 —— wk- 前缀已被「订场周视图」占用，撞名会互相带坏样式）。 */
.cw-head { display: flex; align-items: center; margin-bottom: 8px; }
.cw-head b { font-size: 13px; color: #303133; }
.cw-nav { flex: 0 0 auto; font-size: 13px; color: #409eff; cursor: pointer; margin-left: 12px; }
.cw-dow { display: flex; margin-bottom: 4px; }
.cw-dow > div { flex: 1 1 0; min-width: 0; text-align: center; font-size: 11px; color: #8a97a5; }
.cw-cells { display: flex; }
.cw-cell { flex: 1 1 0; min-width: 0; margin: 0 2px; padding: 7px 0; text-align: center; cursor: pointer;
           border: 1px solid #e9edf2; background: #f7f8fa; border-radius: 8px; }
.cw-cell .cw-dn { font-size: 15px; font-weight: 700; color: #c0c4cc; }
.cw-cell .cw-cnt { font-size: 10px; color: #8a97a5; margin-top: 2px; white-space: nowrap; }
.cw-cell.done { border-color: #b7e0a4; background: #eef8ea; }
.cw-cell.done .cw-dn { color: #4b8b2b; }
.cw-cell.pend { border-color: #f0c78a; background: #fdf3e6; }
.cw-cell.pend .cw-dn { color: #b8791a; }
/* R658：未来那几天灰掉、点不动（跟日期框同一把尺：没发生的日子不给做考勤） */
.cw-cell.fut { opacity: .38; cursor: not-allowed; }
.cw-cell.fut .cw-dn, .cw-cell.fut .cw-cnt { color: #c0c4cc; }
.cw-nav.off { color: #c0c4cc; cursor: not-allowed; }
.burger { display: none; cursor: pointer; font-size: 19px; line-height: 1; padding: 5px 9px; border-radius: 6px; background: #f2f4f8; color: #1f2d3d; }
.burger:active { background: #dfe6ee; }
.mask { display: none; }
.content { flex: 1; overflow-y: auto; padding: 18px; background: #f4f6f8; }

/* ---------- 通用组件 ---------- */
.card { background: #fff; border-radius: 10px; padding: 16px; margin-bottom: 14px; box-shadow: 0 1px 2px rgba(16,24,40,.035); }
.card > .card { box-shadow: none; }
.page-title { font-size: 17px; font-weight: 700; color: #1f2d3d; }
.toolbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.grow { flex: 1; }
.flex { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.muted { color: #8a97a5; font-size: 12px; }
.red { color: #d93026; }
.green { color: #67c23a; }
.num { font-size: 30px; font-weight: 700; }
.amount { color: #1f6feb; font-weight: 600; }
.empty-tip { text-align: center; color: #98a4b3; padding: 44px 12px; font-size: 13.5px; line-height: 1.9; }
.tag-line { display: inline-block; padding: 1px 8px; border-radius: 10px; font-size: 12px; line-height: 18px; white-space: nowrap; }
.legend { display: flex; align-items: center; gap: 14px; font-size: 12px; color: #3d4d5f; margin: 8px 2px; flex-wrap: wrap; }
.legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 4px; vertical-align: -1px; }

/* ---------- 统计卡 ---------- */
.stat-cards { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 12px; margin-bottom: 14px; }
.stat { background: #fff; border-radius: 10px; padding: 14px 16px; box-shadow: 0 1px 2px rgba(16,24,40,.035); min-width: 0; }
.stat .t { font-size: 12px; color: #8a97a5; margin-bottom: 6px; }
.stat .n { font-size: 26px; font-weight: 700; color: #1f2d3d; line-height: 1.1; word-break: break-all; }

/* ---------- 登录页 ---------- */
.login-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg,#1c2b3a,#24435e); padding: 20px; }
.login-box { width: 380px; max-width: 94vw; background: #fff; border-radius: 14px; padding: 34px 32px 26px; box-shadow: 0 18px 50px rgba(0,0,0,.25); }
.login-box h1 { margin: 0 0 4px; font-size: 21px; text-align: center; color: #1f2d3d; }
.login-box .sub { text-align: center; color: #8a97a5; font-size: 13px; margin-bottom: 22px; }
.footer-note { color: #8a97a5; font-size: 12px; }
/* R427（2026-09-24）：ICP 备案号合规展示（页脚 + 侧栏底部），点进工信部备案系统 */
.beian { color: inherit; text-decoration: none; }
.beian:hover { text-decoration: underline; }
.sidebar .beian-line { flex-shrink: 0; padding: 0 16px 12px; font-size: 11px; color: #5b7690; text-align: center; }
.sidebar .beian-line .beian { color: #5b7690; }

/* ---------- 场地订场 30分钟格网日视图 (v87) ---------- */
.cal-wrap { overflow-x: auto; padding-bottom: 4px; }
.cal-grid { min-width: 880px; background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }
.cal-row { display: flex; border-bottom: 1px solid #eef1f5; }
.cal-row:last-child { border-bottom: 0; }
.cal-row-head { background: #f6f8fb; border-bottom: 1px solid #e2e8f0; }
.cal-time { flex: 0 0 76px; display: flex; align-items: center; justify-content: center; font-size: 12px; color: #52667a; background: #fafbfd; border-right: 1px solid #eef1f5; font-variant-numeric: tabular-nums; }
.cal-time .t00 { font-weight: 700; color: #334e68; }
.cal-time .t30 { font-weight: 400; color: #aeb9c6; }
.cal-pair { flex: 1 1 0; display: flex; min-width: 0; }
/* R361（馆方 2026-09-21 补口径）：「我说错了，是高和宽，适当收」＋「但你收的情况来看，太窄了」——
   上一版 130px/半场收过头了，改成**适当收**：每半场列 ≤200px（一片场两半场 ≤400px），
   原来宽屏下每格近 300px，200px 是收掉约 1/3，读字不憋屈。手机本来就窄，不受影响。
   R362（同日续，馆方「可以再加宽一些」）：上限抬到 **240px/半场**（一片场 480px），
   仍明显窄于原来的 290px+，但比 200px 松一档。 */
.cal-pair { max-width: 480px; }
.cal-hd { flex: 1 1 0; min-width: 0; text-align: center; padding: 7px 2px; font-size: 12px; font-weight: 700; color: #334e68; border-right: 1px solid #eef1f5; white-space: nowrap; }
.cal-hd:last-child { border-right: 0; }
.cal-cell { flex: 1 1 0; min-width: 0; height: 38px; display: flex; align-items: center; justify-content: center; padding: 0 4px; cursor: pointer; border-right: 1px solid #f2f5f9; user-select: none; position: relative; box-sizing: border-box; }
.cal-pair .cal-cell:last-child { border-right: 0; }
.cal-cell .ct { font-size: 11px; line-height: 1.25; max-width: 100%; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.c-cell-free { background: #fff; color: #67c23a; }
.c-cell-free:hover { background: #ecf9ee; box-shadow: inset 0 0 0 2px #95d475; }
.c-cell-past { background: #f2f4f7; color: #c0c8d2; cursor: not-allowed; }
/* R474：已过时段**但已被占用**的格 —— 照画占用色（看得见客户名），只压暗一点，仍可点开查看/结账 */
.c-past-blk { opacity: .62; cursor: pointer; }
.c-cell-book { background: #409eff; color: #fff; }
/* R359（馆方 2026-09-21 报「日视图和周简图中每一次的订场要做一个区分，全混在一起看不清」）：
   原来两单挨着时**同色、无分界**，日视图 4 格「测试1」+ 3 格「测试」连成一条 7 格的蓝条，只有第一格有字
   ⇒ 看着就是一整块。修法：① 同一场地当天按时间排序，**第 2/4/6 块换深一档底色**（相邻两单必然不同色）；
   ② 每单**起始那一格**画一条白色粗线（`.c-new`），两单的分界一眼可见。 */
.c-cell-book.alt { background: #2a7fd1; }
.c-cell-train.alt { background: #52a92b; }
.c-cell-event.alt { background: #cd8b28; }
.c-cell-book.c-new, .c-cell-train.c-new, .c-cell-event.c-new { box-shadow: inset 0 2px 0 rgba(255, 255, 255, .95); }
.c-cell-book.arr { background: #8fc6ff; }
.c-cell-train { background: #67c23a; color: #fff; }
.c-cell-event { background: #e6a23c; color: #fff; }
.c-cell-book:hover, .c-cell-train:hover, .c-cell-event:hover { filter: brightness(1.06); }
/* 可拼全场: 同排两半场均绿虚线框 */
.cal-pair.can-full { background: #f4fbf5; }
.cal-pair.can-full .c-cell-free { border: 1.5px dashed #67c23a; background: #ecf9ee; }
.cal-pair.can-full .c-cell-free:hover { box-shadow: inset 0 0 0 2px #67c23a; }

/* ---------- 场地订场时间轴 ---------- */
.court-cal { display: flex; gap: 10px; overflow-x: auto; padding-bottom: 4px; }
.court-col { flex: 1; min-width: 150px; }
.cc-head { background: #1c2b3a; color: #fff; text-align: center; font-size: 13px; font-weight: 600; padding: 7px 4px; border-radius: 6px 6px 0 0; }
.cc-body { position: relative; background: #fff; border: 1px solid #e5e9f0; border-top: 0; border-radius: 0 0 6px 6px; }
.tl-hour { position: absolute; left: 4px; font-size: 10px; color: #b6c0cd; transform: translateY(-50%); background: #fff; padding: 0 2px; z-index: 1; }
.occ-block { position: absolute; left: 4px; right: 4px; border-radius: 4px; padding: 3px 6px; color: #fff; font-size: 11px;
  overflow: hidden; cursor: pointer; box-shadow: 0 1px 2px rgba(0,0,0,.12); z-index: 2; line-height: 1.4; }
.occ-block .ob-t { font-weight: 600; font-size: 12px; }
.occ-booking { background: #409eff; }
.occ-booking.occ-arrived { background: #8fc6ff; }
.occ-training { background: #67c23a; }
.occ-released { background: #909399; border: 1px dashed #c0c4cc; opacity: .95; }
.occ-event { background: #e6a23c; }

/* ---------- 表格通用微调 ---------- */
.el-table { --el-table-border-color: #f2f5f9; }
/* R258: 列太多装不下时，让「可以横滑」看得见 —— EP 默认把原生滚动条藏了(--hidden-default),
   这里放出一条细滚动条。不超宽的表本来就不会出现滚动条, 不受影响。 */
.el-table .el-scrollbar__wrap--hidden-default { scrollbar-width: thin; scrollbar-color: #c3ccd8 #f2f4f7; }
.el-table .el-scrollbar__wrap--hidden-default::-webkit-scrollbar { display: block; height: 9px; width: 9px; }
.el-table .el-scrollbar__wrap--hidden-default::-webkit-scrollbar-thumb { background: #c3ccd8; border-radius: 5px; }
.el-table .el-scrollbar__wrap--hidden-default::-webkit-scrollbar-thumb:hover { background: #a8b3c2; }
.el-table .el-scrollbar__wrap--hidden-default::-webkit-scrollbar-track { background: #f2f4f7; border-radius: 5px; }

/* ===== R260 手机点名卡片（消课考勤页 ≤760px 用） ===== */
.att-mlist { margin-top: 4px; }
.att-mrow { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 0; border-bottom: 1px solid #eef1f5; }
.att-mrow:last-child { border-bottom: 0; }
/* R552（馆方 2026-09-30 拍板 Q3A）：点名页「点完一眼看得出来」——
   已点的行整行变浅 + 左侧绿条；核验过的再灰一档。链不动（未核验仍可点别的按钮改）。 */
.att-mrow-done { background: #f4fbf5; box-shadow: inset 3px 0 0 #67c23a; }
.att-mrow-done.att-locked { background: #f5f7fa; box-shadow: inset 3px 0 0 #c0c4cc; }
/* R590（馆方 2026-10-01 拍板）：核验中心·消课确认「点名 → 变色」（选中态，防误点）
   新类名先查重（R534）：att-mrow-sel / sel-name 全站此前 0 处 */
.att-mrow-sel { background: #eef5ff; box-shadow: inset 3px 0 0 #409eff; }
/* R610（馆方 2026-10-01 拍板）：前台「消课确认」**整条配色** —— 到课＝绿、请假＝红；
   被标记的那条另加一圈蓝框（蓝框走 outline，不盖掉红绿底色）。
   类名先查重（R534）：att-row-ok / att-row-leave / att-pick-sel 全站此前 0 处 */
.att-row-ok { background: #f0f9eb; box-shadow: inset 4px 0 0 #67c23a; }
.att-row-leave { background: #fef0f0; box-shadow: inset 4px 0 0 #f56c6c; }
.att-row-ok .att-mname b, .att-row-leave .att-mname b { font-weight: 700; }
.att-pick-sel { outline: 2px solid #409eff; outline-offset: -2px; }
/* 桌面表格：row-class-name 加在 <tr> 上，底色要落到 td 才看得见 */
.el-table tr.att-row-ok > td.el-table__cell { background: #f0f9eb !important; }
.el-table tr.att-row-leave > td.el-table__cell { background: #fef0f0 !important; }
.el-table tr.att-pick-sel > td.el-table__cell { box-shadow: inset 0 2px 0 #409eff, inset 0 -2px 0 #409eff; }
.sel-name { color: #1d63b8; }
.att-mrow-l { min-width: 0; flex: 1 1 auto; }
.att-mname { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; }
.att-mname b { font-size: 15px; }
.att-msub { font-size: 12px; margin-top: 2px; }
.att-mbtn { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
/* ===== R261 手机待办中心卡片（≤760px 用） ===== */
.tb-mlist { margin-top: 2px; }
.tb-mrow { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; padding: 10px 0; border-bottom: 1px solid #eef1f5; }
.tb-mrow:last-child { border-bottom: 0; }
.tb-mrow-l { min-width: 0; flex: 1 1 auto; }
.tb-mtitle { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; }
.tb-mtitle b { font-size: 15px; }
.tb-msub { font-size: 12px; margin-top: 2px; }
.tb-mbtn { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; padding-top: 4px; }
.tb-mempty { font-size: 13px; color: #8a97a5; padding: 6px 0 2px; }
/* R447：宽表格的**横向滚动兜底** —— el-table 列宽合计大于容器时，默认 `overflow:hidden` 会把
   最右几列**静默裁掉**（表头也一起裁，DOM 里却还在 ⇒ 老的「表体/页面是否溢出」探针量不出来）。
   规则表 8 列合计 952px，套一层 auto 就不会再出现「操作列看不见、按钮点不到」。
   ≤1024px 走手机端「一行一卡」，不受此影响（那边永远不横滑）。 */
.tbl-scroll { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
/* 表格本身给一个「列宽合计」级别的最小宽度 ⇒ 容器放不下时**外层滚动**（而不是内部静默裁掉） */
.tbl-scroll .el-table { min-width: 960px; }
/* R446：规则表按对象分段 —— 每段一行标题（对象名 + 筛选 + 小结：几条 / 哪几条还是 0 没设）
   R448：标题行里加了「全部 / 启用 / 停用」筛选（默认档控件）⇒ 用 center 对齐，别让 32px 控件顶歪基线 */
.cr-ghead { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; border-bottom: 1px solid #ebeef5; padding-bottom: 4px; }
.cr-gname { font-weight: 600; color: #303133; font-size: 14px; }
.cr-gname::before { content: ''; display: inline-block; width: 3px; height: 13px; background: #409eff; border-radius: 2px; margin-right: 6px; vertical-align: -1px; }
/* ===== R262 手机+平板(≤1024px) 班级名单一行一卡 ===== */
.cls-mlist { margin-top: 2px; }
.cls-mrow { padding: 10px 0; border-bottom: 1px solid #eef1f5; }
.cls-mrow:last-child { border-bottom: 0; }
.cls-mname { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; }
.cls-mname b { font-size: 15px; }
.cls-msub { font-size: 12px; color: #6b7a8c; margin-top: 3px; line-height: 1.75; }
.cls-msub b { color: #303133; }
.cls-msub .el-tag { margin: 1px 2px; }
.cls-dot { margin: 0 4px; color: #c0c4cc; }
.cls-mbtn { display: flex; align-items: center; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
.cls-mbtn .el-button { min-height: 42px; padding: 0 12px; }
/* R699④（馆方 2026-10-03 截图「上课名单、排课这些按钮太大」＋「按钮行不齐」）——
   **只作用在「班级管理 → 班级」那一列手机卡片上**（容器加 cls-mcards，别的卡片列表/弹窗一字未动）：
   ① 动作键 **42px → 34px**（内边距 12 → 10、字号 13px）；
   ② 一行里的键**均分**（grid 等宽列）—— 两键的卡（临时班：上课名单 ｜ 更多 ⋯）与三键的卡
      （固定班：上课名单 ｜ 排课 ｜ 更多 ⋯）左边缘就此对齐，不再「有的从 139 起、有的从 210 起」；
      原来「更多 ⋯」外面套着 el-dropdown 的 div，用 flex 分不均（实测 117/117/95）⇒ 改 grid 等宽列。
   ③ 选择器写成三段（.cls-mcards .cls-mbtn .el-button）是为了压过手机端那条
      `.card .el-button{min-height:42px}`（同权重、位置更靠后，否则高度会被顶回 42px）。 */
.cls-mcards .cls-mbtn { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 6px; align-items: center; }
.cls-mcards .cls-mbtn > * { min-width: 0; }
.cls-mcards .cls-mbtn .el-button { min-height: 34px; height: 34px; padding: 0 10px; font-size: 13px;
                                    width: 100%; margin-left: 0 !important; }
/* ===== R688（馆方 2026-10-03「页面太乱、入口太多、挤在左边右边空」）班级管理两弹窗版式 ===== */
/* 拉入学员弹窗顶部：本班上课日 —— 压成一行（原来是一整段话，手机上占三行把工具栏往下顶） */
.daybanner { display: flex; align-items: center; flex-wrap: wrap; gap: 6px;
             background: #f0f9eb; border: 1px solid #c2e7b0; color: #3f7a1f;
             border-radius: 6px; padding: 9px 11px; font-size: 13px; margin-bottom: 8px; }
.daybanner .lb { font-weight: 700; }
.daybanner b { font-weight: 600; }
.daybanner .slot { color: #4b8b2b; }
/* R708（2026-10-03「本班上课日这一段精减，周二17:00 周六09:00 周日09:00，稍粗一点」）：
   精减后的「周几＋开课时间」比旁边那个标签稍加粗一点；条目之间靠间距分开（原来靠「、」）。 */
.daybanner b.dayslot { font-weight: 700; font-size: 13px; }
.daybanner .dsi { margin-right: 10px; }
.daybanner .dsi:last-child { margin-right: 0; }
/* 名单卡片姓名行：左＝姓名+状态标签，右＝剩余节数 —— 把整行撑满，右边不再空着 */
.cls-mhead { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.cls-mhead b { font-size: 15px; }
.cls-mrem { margin-left: auto; font-size: 12px; color: #6b7a8c; white-space: nowrap; }
.cls-mrem b { font-size: 13px; }
/* 卡片底部动作键靠右（原来贴左边缘，右边一大片空） */
.cls-mrow > .cls-mbtn { justify-content: flex-end; }
@media (max-width: 1024px) {
  /* 弹窗工具栏按键排布：主键占整行、次要键各占半行（原来一行一个往下堆、右边全空） */
  .toolbar.dlg-actions { gap: 8px; }
  .toolbar.dlg-actions > .el-button { flex: 1 1 calc(50% - 4px); margin-left: 0 !important; }
  .toolbar.dlg-actions > .el-button.btn-full { flex: 1 1 100%; }
}
/* ===== R357 手机/平板(≤1024px) 订场单「一行一卡」 =====
   原来那张表真实宽度 1090px，手机卡片只有 285px，「操作」列（结账/到场/取消/挂账）
   被整列裁到屏幕外、滚动条又是隐藏的 ⇒ 前台在手机上等于**没有取消订场的入口**。
   改成一单一张卡，动作按钮直接摆出来（触控 42px，与 R262/R292/R308 同款）。 */
.bk-mlist { margin-top: 2px; }
.bk-mrow { padding: 10px 0; border-bottom: 1px solid #eef1f5; }
.bk-mrow:last-child { border-bottom: 0; }
/* R649（馆方 2026-10-02「订场页面用表格，不用卡片」）：手机端「订场单」= 紧凑表格。
   表头 + 一行一单 + 4 列对齐（场地/时段 ｜ 客户 ｜ 金额 ｜ 状态），动作按钮走下面整行 —— 不横滑、按钮全露。
   列宽合计：88 + 86 + 56 + 间隙 18 = 248，剩下全给「客户」；390px 内容区约 342px，够用。 */
.bk-tbl { margin-top: 2px; border: 1px solid #e6eaf0; border-radius: 6px; overflow: hidden; }
.bk-tbl-hd, .bk-tbl-tr { display: grid; grid-template-columns: 88px minmax(0, 1fr) 86px 56px; gap: 6px; align-items: start; }
.bk-tbl-hd { padding: 7px 8px; background: #f5f7fa; color: #5a6b7d; font-size: 12px; font-weight: 600; border-bottom: 1px solid #e6eaf0; }
.bk-tbl-tr { padding: 8px; border-bottom: 1px solid #eef1f5; font-size: 13px; line-height: 1.45; }
.bk-tbl-tr:last-child { border-bottom: 0; }
.bk-tbl .bt1 b { display: block; }
.bk-tbl .bt1 i, .bk-tbl .bt2 i, .bk-tbl .bt3 i { display: block; font-style: normal; color: #8492a6; font-size: 12px; }
.bk-tbl .bt3 .amount { font-weight: 600; }
.bk-tbl .bt4 { text-align: right; }
.bk-tbl .bt-ops { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; margin-top: 6px; }
.bk-mname { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.bk-mname b { font-size: 15px; }
.bk-msub { font-size: 12px; color: #6b7a8c; margin-top: 3px; line-height: 1.7; }
.bk-msub b { color: #303133; }
.bk-msub .amount { color: #303133; font-weight: 600; }
.bk-msub .el-tag { margin-left: 4px; }
.bk-mbtn { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.bk-mbtn .el-button { min-height: 42px; padding: 0 14px; }
/* ===== R260-C 工作台「今日点名」 ===== */
.att-today { margin-top: 4px; }
.att-today-row { display: flex; align-items: center; gap: 8px; padding: 8px 0; border-bottom: 1px solid #eef1f5; }
.att-today-row:last-child { border-bottom: 0; }
.el-table th.el-table__cell { background: #f7f9fb !important; color: #3d4d5f; }
.el-table td, .el-table th { padding: 8px 0 !important; }
.table-tip { font-size: 12px; color: #8a97a5; margin: 4px 0 10px; }

/* ---------- 排课: 星期 chips + 逐天行 ---------- */
.week-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; }
.week-chips .wc { display: inline-flex; align-items: center; justify-content: center; min-width: 44px; padding: 4px 10px;
  border-radius: 14px; border: 1px solid #d9e0ea; background: #fff; color: #3d4d5f; font-size: 13px; cursor: pointer; transition: all .15s; }
.week-chips .wc.on { background: #1c2b3a; border-color: #1c2b3a; color: #fff; font-weight: 600; }
/* R119 拉人弹窗「来上哪几天」小 chips */
.wc-mini { display: inline-flex; align-items: center; justify-content: center; min-width: 24px; padding: 1px 5px; margin: 1px;
  border-radius: 10px; border: 1px solid #d9e0ea; background: #fff; color: #3d4d5f; font-size: 11px; cursor: pointer; transition: all .15s; }
.wc-mini.on { background: #409eff; border-color: #409eff; color: #fff; font-weight: 600; }   /* R507：原近黑 #1c2b3a，用户「黑色不美观」→ 改系统主色蓝 */
/* R124 拉人弹窗：不可拉入者（缴费未审批 / 课包不符）整行置灰、点不动 */
.wc-mini.off { opacity: .35; cursor: not-allowed; }
.el-table .rc-off { color: #b6bec8; background: #fafbfc; }
.el-table .rc-off:hover > td { background: #fafbfc !important; }
.el-table .rc-off .el-tag { opacity: .8; }
.el-table .rc-off .el-checkbox__input.is-disabled .el-checkbox__inner { background-color: #f2f4f7; }
/* R243: 拉入弹窗「待提交名单」—— 提交前逐人核对、可改天/类型、可移除 */
.pnd-wrap { margin-top: 10px; border: 1px solid #dcdfe6; border-radius: 6px; overflow: hidden; }
.pnd-hd { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; background: #f5f7fa; border-bottom: 1px solid #ebeef5; padding: 6px 10px; font-size: 12px; }
.pnd-empty { padding: 10px; font-size: 12px; color: #909399; }
.pnd-tbl { width: 100%; border-collapse: collapse; font-size: 12px; }
.pnd-tbl th, .pnd-tbl td { border-top: 1px solid #ebeef5; padding: 5px 8px; text-align: left; vertical-align: middle; }
.pnd-tbl th { background: #fafcff; color: #606266; font-weight: 500; white-space: nowrap; }
.pnd-tbl td { color: #303133; }
.pnd-tbl tbody tr:hover > td { background: #f7fbff; }
.dc-legend { font-style: normal; font-size: 12px; }
.dc-legend.g { color: #67c23a; }
.dc-legend.r { color: #d93026; }
.dc-legend.b { color: #409eff; }
.day-rows { display: flex; flex-direction: column; gap: 8px; max-height: 40vh; overflow-y: auto; padding-right: 4px; }
.day-row { border: 1px solid #e5e9f0; border-radius: 8px; background: #fff; }
.day-row-head { display: flex; align-items: center; gap: 6px; padding: 6px 8px 0; flex-wrap: wrap; }
.day-row-head b { font-size: 13px; color: #1f2d3d; }
.dstat { font-size: 12px; padding: 2px 8px; border-radius: 10px; white-space: nowrap; }
.dstat.ok { color: #2f7d1b; background: #f0f9eb; }
.dstat.wait { color: #8a97a5; background: #f4f6f8; }
.dstat.bad { color: #d93026; background: #fef0f0; }
.dunits { display: flex; flex-wrap: wrap; gap: 6px; padding: 6px 8px 8px; }
.dcell { display: inline-flex; align-items: center; gap: 4px; min-width: 56px; justify-content: center; padding: 3px 8px;
  border-radius: 6px; border: 1px solid #e5e9f0; font-size: 12px; color: #3d4d5f; background: #fafbfc; cursor: pointer; white-space: nowrap; transition: all .12s; }
.dcell em { font-style: normal; font-size: 11px; opacity: .85; max-width: 68px; overflow: hidden; text-overflow: ellipsis; }
.dcell.free { background: #f0f9eb; border-color: #b3e19d; }
.dcell.free.sel { background: #67c23a; border-color: #67c23a; color: #fff; font-weight: 600; }
.dcell.busy { background: #fef0f0; border-color: #fbc4c4; color: #d93026; cursor: not-allowed; }
.dcell.own { background: #ecf5ff; border-color: #a0cfff; color: #409eff; cursor: not-allowed; }
.dcell.off { background: #fff; border-style: dashed; }
.dcell.off.sel { background: #1c2b3a; border-color: #1c2b3a; color: #fff; }

/* ---------- 平板窄栏 (761-900px): 168px 纯文字侧栏 ---------- */
@media (max-width: 900px) {
  .sidebar { width: 168px; }
  .sidebar .brand { font-size: 15px; }
  .sidebar nav a { padding: 10px 14px; font-size: 13px; }
  .stat-cards { grid-template-columns: repeat(2, minmax(0,1fr)); }
}

/* ---------- 手机 (<=760px): ☰ 悬浮抽屉 + 近全屏弹窗 + 表格横滑 ---------- */
@media (max-width: 760px) {
  .layout { flex-direction: column; }
  .burger { display: inline-block; margin-right: 6px; }
  .mask { display: block; position: fixed; left: 0; top: 0; right: 0; bottom: 0; background: rgba(15,25,38,.5); z-index: 1999; }
  .sidebar { position: fixed; left: 0; top: 0; bottom: 0; width: 250px; max-width: 84vw; height: 100vh; z-index: 2000;
             flex-direction: column; align-items: stretch; transform: translateX(-105%);
             transition: transform .22s ease; box-shadow: none; }
  .sidebar.open { transform: translateX(0); box-shadow: 4px 0 28px rgba(0,0,0,.35); }
  .sidebar .brand { display: flex; flex-direction: column; align-items: flex-start; justify-content: center; white-space: normal;
                    padding: 14px 18px; font-size: 16px; height: auto; border-bottom: 1px solid #2c3e50; border-right: 0; flex-shrink: 0; }
  .sidebar .brand small { display: block; font-size: 12px; color: #7f9bb3; margin-top: 3px; }
  .sidebar nav { display: flex; flex-direction: column; overflow-y: auto; overflow-x: hidden; padding: 8px 0; flex: 1; height: auto; }
  .sidebar nav a { flex: 0 0 auto; display: flex; align-items: center; justify-content: flex-start; padding: 13px 18px;
                   font-size: 14px; height: auto; border-left: 3px solid transparent; border-bottom: 0; }
  .sidebar nav a.on { border-bottom: 0; border-left-color: #4fc3f7; background: #24384c; }
  .roleline { display: block; flex-shrink: 0; border-top: 1px solid #2c3e50; }
  .main { min-height: 0; }
  .topbar { min-height: 48px; padding: 6px 10px; row-gap: 6px; }
  .topbar .t-title { font-size: 15px; }
  /* R637（2026-10-02 追加）：待办中心那行件（N 项待办 / ⓘ / 刷新）搬进标题行后，390px 上「馆档」会把
     标题行顶成两行（实测高 32→64）⇒ 只把**这一行**的件收紧一点；t-user 那份、别的地方一个字不动。 */
  .topbar .t-title > .el-tag { font-size: 11px; padding: 0 5px; }
  .topbar .t-title .el-radio-group { flex-wrap: nowrap; }
  .topbar .t-title .el-radio-button__inner { padding: 6px 8px; }
  .topbar .t-title > .el-button.t-hubref { padding: 0 10px; }
  /* R257: 手机端顶栏＝两行 —— 第一行 ☰+页面名, 第二行 左=分校页签 / 右=改密码·退出 */
  .topbar .t-user { flex: 1 1 100%; gap: 6px; justify-content: space-between; }
  .topbar .t-user .el-radio-group { margin-right: auto; }
  /* R312: 触控线铁律 ≥42px —— 顶栏两颗按钮（改密码/退出）原来只有 28px、分校页签 28px，
     是**全角色全页面**都在犯的那条；顶栏高度自适应，加高不影响两行布局。 */
  .topbar .t-user .el-button { padding: 0 12px; height: auto; min-height: 42px; }
  .topbar .t-user .el-radio-button__inner { padding: 13px 12px; }
  /* R257: 原写法 `> span:first-child` 在分校页签插到最前后已失效 —— 日期一直没被隐藏,
     119px 把「退出」挤到第三行。改为隐藏 t-user 里全部裸 span 与标签 */
  .topbar .t-user > span, .topbar .t-user .el-tag { display: none; }
  .content { padding: 10px 10px 30px; }
  .card { padding: 12px; margin-bottom: 10px; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  /* R259: 手机端表格不再被强制撑到 680px —— 否则整张卡片(含工具栏/说明文字)会被一起滑走,
     看着像"内容被切掉"。去掉保底宽后由 EP 自己的内部滚动条接管横滑, 只有表格动、页面不动。 */
  .el-table { min-width: 0; }
  /* R259: 手机端标签允许折行 —— 长提示语（如「您以授课教练…身份提交…确认后扣节」）放在 el-tag 里
     时 tag 默认 nowrap, 单个标签 508px 把整张卡片撑横滑（实测溢出 160px）。短标签不受影响。 */
  .el-tag { max-width: 100%; white-space: normal; height: auto; padding: 3px 8px; line-height: 1.45; }
  .stat-cards { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .court-cal { display: flex; gap: 10px; min-width: 650px; }
  .court-col { flex: 0 0 150px; }
  .el-dialog { width: calc(100vw - 14px) !important; max-width: none !important; margin: 3vh auto 20px !important; }
  .el-dialog__body { max-height: 68vh; overflow-y: auto; -webkit-overflow-scrolling: touch; }
  .el-message-box { width: calc(100vw - 44px) !important; max-width: none !important; }
  .toolbar .grow, .toolbar .muted { display: none; }
  /* 数据表格横滑: EP fit 模式窄容器不会滚 → 给表保底宽, 由 .card 容器滚动 */
  .el-table.el-table--small .cell { white-space: nowrap; }
  .el-tabs__content { overflow-x: auto; }
  .day-row-head { padding-top: 8px; }
  .day-row-head b { width: auto; }
  .dcell { min-width: 50px; padding: 3px 6px; }
}

/* ---------- R264: 手机+平板 (≤1024px) 卡片式列表的触摸友好规则 ----------
   原先只在 ≤760px 块里；点名页/待办中心断点提到 1024 后必须跟着提，
   否则 768~1024 区间卡片渲染出来了、但按钮只有 28px 高、行距发挤。 */
@media (max-width: 1024px) {
  /* R260-D: 手机端触摸友好 —— 点名/工具栏/卡片底部按钮加大到 ≥42px
     （表格行内按钮不动，否则行高会炸开） */
  .att-mbtn .el-button, .toolbar .el-button, .card > .flex .el-button, .att-today-row .el-button { min-height: 42px; }
  /* R312: 手机端全面体检（72 格：8 角色 × 各自菜单）后补齐的触控面 ——
     ① 卡片区内**所有非表格行内**按钮 ≥42px；② 弹窗 / 确认框底部按钮 ≥42px。
     表格行内按钮维持 24px（尺寸两档铁律），否则行高会炸开。 */
  .card .el-button { min-height: 42px; }
  .card .el-table .el-button { min-height: 24px; }
  .el-dialog__footer .el-button, .el-message-box__btns .el-button { min-height: 42px; padding: 0 16px; }
  /* R312: 顶栏两颗按钮在 768~1024（平板）也提到 42px —— 断点统一 ≤1024，触控线一套口径。
     桌面 >1024 一个字不动（实测 1280/1025 改动前后零差异）。 */
  .topbar .t-user .el-button { min-height: 42px; }
  .att-mrow { padding: 12px 0; }
  .att-mrow-l { padding-right: 4px; }
  /* R268: 消课看板的工具栏写了 flex-wrap:nowrap —— 手机上它**不会横向溢出**，
     而是把「消课看板 · 单日/区间明细」压成一列竖排字（整张卡被撑到 ~470px 高）。
     ⇒ 老探针只看 scrollWidth 查不出来（barOver 一直是 0），必须放开来换行。
     用属性选择器只打这一个工具栏，桌面端一个字都不动。 */
  .card .toolbar[style*="nowrap"] { flex-wrap: wrap !important; row-gap: 6px; }
  .card .toolbar[style*="nowrap"] .page-title { flex: 1 1 100%; }
  /* R266: 一行一卡里按钮多的（教练培训一行三颗）要能换行，别把文字挤没 */
  .att-mbtn { gap: 5px; flex-wrap: wrap; justify-content: flex-end; }
  .att-mbtn .el-button { padding: 0 10px; }
  .att-today-row { flex-wrap: wrap; row-gap: 6px; }
  /* R261-B: 待办中心手机卡片按钮加大到 ≥42px, 行距加大防误触 */
  .tb-mrow { padding: 12px 0; }
  .tb-mbtn { gap: 5px; }
  .tb-mbtn .el-button { min-height: 42px; padding: 0 10px; }
  /* R518: 学员详情「课时包」卡在 390px 下**本来就溢出** —— .tb-mrow/.tb-mbtn 都是 nowrap，
     ⇒ 右侧按钮组永不换行（实测：4 颗按钮 371px 已超 344px 容器；加第 5 颗「调整剩余」后 466px）。
     手机/平板让卡片与按钮组都能换行，桌面 >1024 一个字不动。 */
  .tb-mrow { flex-wrap: wrap; row-gap: 6px; }
  .tb-mbtn { flex-wrap: wrap; justify-content: flex-end; max-width: 100%; }
  /* R271: 待办中心「分类页签条」—— 手机端最长的标签 6 个字, 原来挤成 3~4 行,
     每块只有 32px 高（低于 42px 触控线）。只对这一个页面收口（.hub-pg）：
     配合后端下发的短标签 + 纵向内边距 13px ⇒ 每块 42px 高、块更宽,
     页签条从 3 行压到 2 行。桌面 >1024 一个字都不动。 */
  .hub-pg .el-radio-group .el-radio-button__inner { padding: 13px 8px; }
}
/* ===== 订场周视图(4半场 × 7天, v56) ===== */
.wk-wrap { overflow-x: auto; }
.wk-grid { min-width: 860px; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }
.wk-row { display: flex; }
.wk-u { flex: 0 0 84px; display: flex; align-items: center; justify-content: center; font-weight: 600; background: #f6f8fb; border-right: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; font-size: 13px; }
.wk-gp { flex: 2 2 0; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 13px; color: #334e68; background: #eef3f8; border-right: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; min-height: 30px; }
.wk-td { flex: 1 1 0; min-height: 84px; max-height: 220px; overflow-y: auto; border-right: 1px solid #eef1f5; border-bottom: 1px solid #eef1f5; padding: 3px 4px; cursor: pointer; }
.wk-td.wk-th { min-height: 30px; max-height: 30px; cursor: default; white-space: pre-line; text-align: center; font-size: 12px; font-weight: 600; color: #52667a; background: #fafbfd; border-bottom: 1px solid #e2e8f0; overflow: hidden; line-height: 1.35; }
.wk-row.wk-head .wk-u { color: #8a97a5; font-weight: 500; }
.wk-u.wk-date { font-size: 12px; font-weight: 600; white-space: pre-line; line-height: 1.4; }
.wk-seg { font-size: 11px; line-height: 1.5; margin: 2px 0; padding: 1px 5px; border-radius: 3px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.wk-booking { background: #ecf5ff; color: #337ecc; border: 1px solid #b3d8ff; }
.wk-training { background: #f0f9eb; color: #5a9441; border: 1px solid #c2e7b0; }
.wk-event { background: #fdf6ec; color: #b25e09; border: 1px solid #f5dab1; }
.wk-released { background: #f4f4f5; color: #8a97a5; }
.wk-free { background: #fff; color: #a0a8b4; border: 1px dashed #c9d2dc; }
.wk-full { color: #2f7d1b; background: #f0f9eb; border: 1.5px solid #67c23a; font-weight: 600; }
.wk-full:hover { box-shadow: inset 0 0 0 2px #67c23a; }
.wk-td:hover { background: #fafcff; }
.wk-empty { font-size: 11px; color: #b8c0cc; text-align: center; padding: 30px 0; border: 1px dashed #e6ebf1; border-radius: 4px; }
/* R468（馆方 2026-09-25「时间已过还能点订场」）：周视图里**已过去的日子**整行按「已过」呈现
   （与周简图 .wd-dpast 同款灰度），看着就知道不能点；真点了也会被闸门拦下。 */
.wk-row-past .wk-td { background-color: #f2f4f7; cursor: default; }
.wk-row-past .wk-td:hover { background-color: #f2f4f7; }
.wk-row-past .wk-u.wk-date { color: #8a94a1; font-weight: 500; }
@media (max-width: 420px) {
  .topbar .t-user b { display: none; }
  .stat-cards { grid-template-columns: repeat(2, minmax(0,1fr)); gap: 8px; }
  .stat { padding: 10px; }
  .stat .n { font-size: 21px; }
}

/* ===== 打印服务(前台) ===== */
.pt-table { width: 100%; border-collapse: collapse; background: #fff; }
.pt-table th, .pt-table td { border: 1px solid #555; padding: 6px 8px; font-size: 13px; text-align: left; }
.pt-table th { background: #f2f6fc; font-weight: 600; }
.sign-cell { height: 30px; }
/* R312: 打印页「月出勤汇总」是天然宽表（一行一天）—— 手机端让它自己在容器里横滑，
   别把整张卡片（含选择班级/月份/打印按钮）一起推走；打印时放开，避免裁掉内容。 */
.print-scroll { overflow: visible; }
@media (max-width: 1024px) { .print-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; } }
@media print { .print-scroll { overflow: visible !important; } }

@media print {
  body * { visibility: hidden !important; }
  .print-area.print-active, .print-area.print-active * { visibility: visible !important; }
  .print-area.print-active { position: absolute !important; left: 0; top: 0; width: 100%; margin: 0; padding: 8mm; background: #fff; border: none !important; }
  .no-print { display: none !important; }
  .sidebar, header, .toolbar .el-button, .grow { display: none !important; }
}
/* ⑪ 教练培训 */
.ct-row{display:flex;align-items:center;padding:6px 2px;border-bottom:1px dashed #ebeef5}
.ct-name{width:130px;font-weight:600}
.ct-mk{color:#e6a23c;font-size:12px}
/* R285: 别馆教练/别馆计划的馆别标注（灰、小号，跟在名字后） */
.ct-other{color:#909399;font-size:12px;margin-left:4px}

/* ⑫ R25 周简图 (高峰档 18:30-22:30): 行=半小时, 列=7天×4半场 */
.wc-wrap { overflow-x: auto; }
.wc-grid { min-width: 1180px; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }
.wc-row { display: flex; }
.wc-u { flex: 0 0 62px; display: flex; align-items: center; justify-content: center; font-weight: 600; background: #f6f8fb; border-right: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; font-size: 12px; color: #52667a; }
.wc-u.wc-time { font-size: 12px; }
.wc-day { flex: 4 4 0; text-align: center; font-weight: 700; font-size: 12px; color: #334e68; background: #eef3f8; border-right: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; min-height: 28px; line-height: 28px; }
.wc-day:nth-child(n+3) { border-left: 1px solid #dfe6ee; }
.wc-md { color: #8a97a5; font-weight: 500; font-size: 11px; margin-left: 4px; }
.wc-hc { flex: 1 1 0; text-align: center; font-size: 11px; font-weight: 600; color: #52667a; background: #fafbfd; border-right: 1px solid #eef1f5; border-bottom: 1px solid #e2e8f0; min-height: 26px; line-height: 26px; }
.wc-hc:nth-child(4n+2) { border-left: 1px solid #dfe6ee; }
.wc-td { flex: 1 1 0; height: 30px; display: flex; align-items: center; justify-content: center; border-right: 1px solid #eef1f5; border-bottom: 1px solid #eef1f5; cursor: pointer; font-size: 11px; color: #a0a8b4; }
.wc-td:nth-child(4n+2) { border-left: 1px solid #dfe6ee; }
.wc-td.wc-past { background: #f2f4f7; cursor: default; color: #c4ccd6; }
.wc-td.wc-b { color: #fff; font-weight: 600; }
.wc-td.wc-book { background: #409eff; }
.wc-td.wc-train { background: #67c23a; }
.wc-td.wc-event { background: #e6a23c; }
.wc-td.wc-free { background: #fff; }
.wc-td.wc-free:hover { background: #fafcff; }
.wc-td.wc-full { background: #f0f9eb; color: #2f7d1b; font-weight: 600; box-shadow: inset 0 0 0 1.5px #67c23a; }
.wc-td.wc-full:hover { box-shadow: inset 0 0 0 2px #67c23a; }
.wc-txt { white-space: nowrap; }
/* ===== R356 终版 周简图：照搬周视图骨架，每格只画 18:30–22:30，背景每半小时一条刻度线 ===== */
.wd-wrap { overflow-x: auto; }
.wd-hrow, .wd-day { display: flex; align-items: stretch; }
.wd-lbl { flex: 0 0 86px; display: flex; flex-direction: column; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 600; color: #52667a; background: #f6f8fb;
  border-right: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; }
.wd-lbl-sm { font-size: 10px; color: #8a94a1; letter-spacing: -.2px; }
.wd-daylbl i { font-style: normal; font-size: 11px; font-weight: 400; color: #8a94a1; }
.wd-daylbl.on { background: #eef6ff; color: #2f6fd0; }
.wd-cg { flex: 2 1 0; min-width: 0; text-align: center; font-weight: 600; font-size: 12px; color: #52667a;
  padding: 5px 2px; background: #f6f8fb; border-right: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; }
.wd-c { flex: 1 1 0; min-width: 74px; text-align: center; font-size: 11px; color: #52667a; padding: 5px 2px;
  background: #fafbfd; border-right: 1px solid #e2e8f0; border-bottom: 1px solid #e2e8f0; }
.wd-cell { position: relative; flex: 1 1 0; min-width: 74px; height: 128px;
  border-right: 1px solid #eef1f5; border-bottom: 1px solid #e2e8f0; cursor: pointer;
  background-image:
    repeating-linear-gradient(to bottom, #d9e2ec 0 1px, transparent 1px 32px),
    repeating-linear-gradient(to bottom, #eef1f5 0 1px, transparent 1px 16px); }
.wd-cell.wd-dpast { background-color: #f2f4f7; cursor: default; }
.wd-blk { position: absolute; left: 1px; right: 1px; border-radius: 3px; overflow: hidden;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  color: #fff; line-height: 1.15; padding: 1px 2px; cursor: pointer; }
.wd-blk b { font-size: 11px; font-weight: 600; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wd-blk span { font-size: 9.5px; font-weight: 400; opacity: .92; }
/* R358（馆方 2026-09-21 报「18:30–20:30 有两个订场，另外一个被挤走」）：
   真因 —— 占用条只有 16px 高时（例：17:00–19:00 的单只落在窗口内的 18:30–19:00 这一截 ＝ 12.5% × 128px ＝ 16px），
   .wd-blk 是 flex-column + overflow:hidden，子元素默认可压缩 ⇒ 客户名被压成 **3px 高**（11px 的字只剩 3px）
   ⇒ **等于看不见**，看着就像那一单不存在 / 被挤走了（实测：<b> 高 3px、<span> 11px 正常）。
   修法：① 子元素一律不许压缩；② 条高不够两行（<22% ≈ 28px）时改成**一行横排「名字 时间」**，16px 也放得下。
   ⚠️ 故意**没有**用「给条子设最小高度」——那会让条子盖住紧挨着的下一单，图上的时间比例就不诚实了。 */
.wd-blk > b, .wd-blk > span { flex: 0 0 auto; }
.wd-blk.wd-1line { flex-direction: row; align-items: center; justify-content: center; gap: 3px; padding: 0 2px; white-space: nowrap; }
.wd-blk.wd-1line > b { font-size: 10.5px; }
.wd-blk.wd-1line > span { font-size: 9px; opacity: .95; }
/* R407（馆方 2026-09-24 点②）：周简图条子上补回**收款状态**短标记（未收 / 已收 / 月结 / 会员卡）。
   放在名字后当小徽标：未收＝红底（一眼看出还没收钱）、月结＝橙、会员卡＝紫、已收＝半透明白。
   周简图条子本来就窄，标记只占 9px、不换行；名字过长时先截名字，标记不丢。 */
.wd-pay { display: inline-block; margin-left: 3px; padding: 0 3px; border-radius: 2px;
  font-size: 9px; font-style: normal; line-height: 11px; font-weight: 600;
  background: rgba(255, 255, 255, .82); color: #303133; vertical-align: 1px; }
.wd-pay:empty { display: none; }
.wd-blk .wd-pay { background: rgba(255,255,255,.85); color: #b02020; }
.wd-blk.wd-book { background: #409eff; }
/* R359：周简图同理 —— 相邻两单同色时看不出是两单。① 第 2/4/6 块换深一档；
   ② 每条占用块描一圈半透明白边（相邻两条之间自然形成一条白线做分界）。 */
.wd-blk.wd-book.wd-alt { background: #2a7fd1; }
.wd-blk.wd-train.wd-alt { background: #52a92b; }
.wd-blk.wd-event.wd-alt { background: #cd8b28; }
.wd-blk.wd-released.wd-alt { background: #b6dba8; }
.wd-blk.wd-book, .wd-blk.wd-train, .wd-blk.wd-event { box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .5); }
.wd-blk.wd-train { background: #67c23a; }
.wd-blk.wd-released { background: #cdebc0; color: #2f7d1b; }
.wd-blk.wd-event { background: #e6a23c; }
/* R360/R361（馆方 2026-09-21）「格子太宽，可适当收窄」：宽屏下每半场列被拉到 290px+。
   R362（同日续）馆方「可以再加宽一些」⇒ 上限从 200px 抬到 **240px**（一片场 480px，
   与日视图同宽）；手机本来就窄，不受影响。 */
.wd-cell, .wd-c { max-width: 240px; }
.wd-cg { max-width: 480px; }
/* R361 第2张（周视图）：馆方「第2张适当收宽，加高 —— 一天的量比较大」。
   收宽：每半场列 ≤240px（R362 由 200px 再放宽一档）；
   加高：原来 min-height 84 / max-height 220 —— 一天十几场根本装不下，只能在小格子里上下滚，
   这里放到 min 130 / max 480，一天的量基本能一屏看全。 */
.wk-td { max-width: 240px; min-height: 130px; max-height: 480px; }
.wd-blk.wd-free { background: transparent; color: #b9c3cf; font-weight: 400; }
.wd-blk.wd-free.wd-full { background: #fff; box-shadow: inset 0 0 0 1.5px #b3e19d; color: #52a12f; }
/* R364①：维护「常用商品」的平铺格子 —— 勾上的显示绿框 + 浅绿底 + 打勾 */
.gp-tile.gp-on { box-shadow: inset 0 0 0 2px #67c23a; background: #f0f9eb; color: #2f7d1b; font-weight: 600; }
@media (max-width: 1024px) {
  .wd-lbl { flex: 0 0 62px; }
  .wd-c, .wd-cell { min-width: 64px; }
}
}

/* R356 周简图：占用格写名字（可截断）+ 表底 22:30 收尾刻度条 */
.wc-td.wc-b .wc-txt { text-shadow: 0 0 2px rgba(0,0,0,.25); }
.wc-row.wc-ruler { height: 16px; }
.wc-row.wc-ruler .wc-u.wc-time { border-bottom: none; border-top: 2px solid #dfe6ee; color: #8a94a1; font-size: 11px; font-weight: 600; background: #fbfcfe; }

/* ⑬ R35~R39 合并容器页: 隐藏被内嵌原子页的自带标题(避免与 tab 名重复) */
.hub-embed .page-title { display: none; }
/* R677（馆方 2026-10-03「修一批注释图标占位」）：PG.team（馆内班·馆外班）顶部那行只有标题＋一颗说明 ⓘ，
   而标题在核验中心里是隐藏的 ⇒ 整行只剩一颗孤零零的图标占位。这一页**只能从核验中心进**（team 不在任何菜单里），
   所以把这行整块收掉；说明文字已原样并进「待前台核验」页签的 ⓘ。独立页（若日后挂回菜单）不受影响。 */
.hub-embed .team-pagehead { display: none; }

/* ⑭ R148 430 配置体检条 + ①→④ 配置链分段 */
.cfg-health { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px dashed #e4e8ee; }
.cfg-health-hd { font-size: 12px; color: #909399; margin-right: 2px; }
.chip { font-size: 12px; padding: 3px 9px; border-radius: 12px; background: #f4f6f9; color: #606266; border: 1px solid #e4e8ee; cursor: pointer; user-select: none; }
.chip b { font-weight: 600; }
.chip.ok { background: #f0f9eb; color: #2e8b57; border-color: #c2e7b0; }
.chip.miss { background: #fdf6ec; color: #b88230; border-color: #f5dab1; }
.chip:hover { filter: brightness(0.97); }
.cfg-sec { border: 1px solid #e4e8ee; border-radius: 6px; padding: 10px 12px; margin-bottom: 10px; background: #fff; }
.cfg-sec.miss { border-color: #f5dab1; background: #fffdf9; }
.cfg-sec-hd { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.cfg-no { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: 50%; background: #1f3b5c; color: #fff; font-size: 12px; font-weight: 600; }
.cfg-day-row { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; }

/* R150 设置中心·产品/渠道：分组折叠头 + 子页签 */
.grp-head { display: flex; align-items: center; gap: 8px; padding: 8px 10px; margin: 10px 0 6px; background: #f5f7fa; border-left: 3px solid #1f3b5c; border-radius: 3px; cursor: pointer; user-select: none; }
.grp-head:hover { background: #ebeef5; }
.grp-head .caret { width: 12px; color: #8a97a5; font-size: 12px; }
.grp-head b { font-weight: 600; color: #303133; }

/* R206 平铺选品页（收支表 → 商品销售登记 → 选商品）：商品多了以后用网格挑，比下拉好找 */
.gp-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(146px, 1fr)); gap: 8px; }
.gp-tile { border: 1px solid #e4e7ed; border-radius: 6px; padding: 8px 10px; cursor: pointer; background: #fff; transition: all .15s; }
.gp-tile:hover { border-color: #409eff; box-shadow: 0 2px 8px rgba(64,158,255,.18); }
.gp-tile:active { background: #ecf5ff; }
.gp-tile .gp-name { font-size: 13px; color: #303133; font-weight: 600; line-height: 1.4; word-break: break-all; }
.gp-tile .gp-price { font-size: 12px; color: #e6a23c; margin-top: 4px; }
@media (max-width: 640px) { .gp-grid { grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); } }

/* R373/R374 员工报销 / 请假单：一行一卡（电脑/手机同一套，清爽不花哨） */
.row-card { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1px solid #ebeef5; border-radius: 8px; margin-bottom: 8px; background: #fff; }
.row-card .rc-main { flex: 1 1 auto; min-width: 0; }
.row-card .rc-1 { font-size: 14px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; line-height: 1.6; }
.row-card .rc-2 { font-size: 12px; margin-top: 2px; overflow: hidden; text-overflow: ellipsis; }
.row-card .rc-btns { flex: 0 0 auto; display: flex; gap: 6px; }
/* R373：支出/报销台账的状态标签 —— 手机上不挤 */
.row-card .el-tag { flex: 0 0 auto; }
@media (max-width: 1024px) {
  .row-card { flex-wrap: wrap; }
  .row-card .rc-main { flex: 1 1 100%; }
  .row-card .rc-btns { width: 100%; justify-content: flex-end; }
  .row-card .rc-btns .el-button { min-height: 42px; }
}

/* ---------- R402（馆方 2026-09-23 拍板选②）手机端订场日视图：单场纵向时间表 ---------- */
/* 电脑端（>1024px）：这几样一律不出现，日视图仍是原来的 30 分钟 × 各半场格网（.cal-grid 880px 不动）。 */
.legend-toggle { display: none; }
.mb-day { display: none; }
.mb-units { display: flex; flex-wrap: wrap; gap: 8px; margin: 2px 0 10px; }
.mb-unit { min-width: 46px; height: 42px; padding: 0 8px; font-size: 12.5px; color: #334e68; background: #fff; border: 1px solid #d7dee8; border-radius: 8px; cursor: pointer; }
.mb-unit.on { color: #fff; background: #409eff; border-color: #409eff; font-weight: 700; }
/* R649：第一级「场」按钮（本馆有多片场才出现）—— 比第二级略宽、加粗，看得出是上一层 */
.mb-unit.mb-court { min-width: 68px; font-weight: 600; }
.mb-list { background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }
.mb-row { display: flex; border-bottom: 1px solid #eef1f5; }
.mb-row:last-child { border-bottom: 0; }
.mb-time { flex: 0 0 58px; display: flex; align-items: center; justify-content: center; font-size: 12px; color: #52667a; background: #fafbfd; border-right: 1px solid #eef1f5; font-variant-numeric: tabular-nums; }
.mb-time .t00 { font-weight: 700; color: #334e68; }
.mb-time .t30 { font-weight: 400; color: #aeb9c6; }
.mb-cell { flex: 1 1 0; min-width: 0; height: 44px; display: flex; align-items: center; padding: 0 10px; box-sizing: border-box; cursor: pointer; }
.mb-cell .mb-ct { font-size: 12.5px; line-height: 1.3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 1024px) {
  .mb-day { display: block; }
  .daypc { display: none; }
  /* R402：留给列表的高度＝一屏减掉顶栏与工具栏 —— 场地按钮常驻可见，只有列表自己滚 */
  .mb-list { max-height: 62vh; overflow-y: auto; -webkit-overflow-scrolling: touch; }
  .mb-hide { display: none; }
  .legend-toggle { display: inline-flex; align-items: center; height: 30px; padding: 0 12px; margin: 2px 0 0; font-size: 12px; color: #52667a; background: #f4f7fb; border: 1px solid #e2e8f0; border-radius: 8px; cursor: pointer; }
  .legend { display: none; }
  .legend.mb-open { display: flex; }
}

/* ===== R464（馆方 2026-09-25 拍板 B）：长说明默认收起 —— 点「说明」弹层看全文（桌面+手机一致） ===== */
.hint-link{color:#909399;cursor:pointer;font-size:13px;user-select:none;white-space:nowrap;margin-left:4px;vertical-align:middle}
.hint-link:hover{color:#337ecc}
.hint-link:hover{color:#1d63b8}
.hint-pop{width:auto!important;min-width:240px;max-width:min(560px,calc(100vw - 24px))}
.hint-pop .hint-body{line-height:1.7;font-size:13px;color:#5c6270;white-space:normal;word-break:break-word;max-height:min(60vh,420px);overflow:auto}
.hint-pop .hint-body b{color:#303133}
.hint-pop .hint-body .muted{color:#8a8f99}

/* ===== R498（2026-09-28）：桌面(≥1025px)宽表「外层横滑兜底」 =====
   R447 只在个别表外套了 .tbl-scroll（min-width:960px），但 1280 笔记本上卡片内容区常有 992px，
   壳里的 960 比容器还小 ⇒ 套了也不滚。而 el-table 自身 max-width:100% + 内部 overflow-x:hidden，
   列宽合计 > 容器时**最右一列（多半是「操作」列/按钮）被静默裁掉、且滚不动、看不见**。
   实测（1280×900，8 角色 × 全菜单）：修前 42 页有裁切，修后 0 页。
   这里统一成一条规则：**卡片当横向滚动容器，表格按「列宽合计」的自然宽度铺开**（不缩、不裁），
   装不下时整张表（表头+表体一起）在卡片内横滑，一个字都不切。
   为什么必须动 .el-tabs__content：它默认 overflow:hidden，会把溢出**在卡片之前**就吃掉。
   手机端 ≤1024px 走「一行一卡」，不受此规则影响（媒体查询挡住）。
   注：:has() 在旧浏览器不支持时整条规则自动失效 ⇒ 退回现状，不会更糟。 */
@media (min-width: 1025px) {
  .card:has(.el-table__inner-wrapper) { overflow-x: auto; }
  .card:has(.el-table__inner-wrapper) .el-tabs__content { overflow: visible !important; }
  .card .el-table { width: max-content !important; min-width: 100% !important; max-width: none !important; }
  /* ===== R753（2026-10-06）：要「填满卡片」的表 —— 撤掉上面的 max-content =====
     R498 的 max-content 对「列宽全写死」的表是对的（装不下就让卡片横滑）。
     但**带弹性列**（只写 min-width、不写 width 的列）的表会出事：el-table 算弹性列用的是**自身 clientWidth**，
     而 max-content 下这个值就等于「列宽合计」⇒ **自己量自己**、正反馈发散
     （实测前台报表「班级」列一度涨到 9739px，9 列合计 10496px ⇒ 最右 6 列被推出屏幕）。
     另一头：若干脆把列全写死（R752 曾这么修），又会出现**表格右边一大块空白**（列不再拉伸）。
     正解＝这类的表加 class="tbl-fill"：明确按**容器宽**铺满 —— 弹性列正常拉伸、且不再自反馈。
     容器真的窄到装不下时，退回 el-table 自带的行内横滑（比卡片级横滑难发现，但不会静默裁列）。 */
  .card .el-table.tbl-fill { width: 100% !important; min-width: 100% !important; max-width: 100% !important; }
}

/* ===== R756（2026-10-06 · 电脑端屏幕适应）：桌面卡片左右留白 16→8 =====
   实测依据（8 角色 × 全菜单 × 1280/1366/1440/1920 四档，每档 490 次页面访问）：
   桌面表格按「列宽合计」自然铺开（R498），1280 下 34 页溢出，其中 22 页只多 12~20px ——
   病根＝**列宽合计比卡片内容区多一点点**。
   · 收紧单元格内边距**无效**（列宽写死，实测 990→990 一动不动）；
   · 把表格宽度限住**更糟**（el-table 表头容器 overflow:hidden ⇒ 最后一列静默裁掉，
     实测「静默裁切」0→110，已回退）。
   · 正解＝**给内容区多让 16px**：卡片左右 padding 16→8（一处改、全站生效、列宽观感不变）。
   实测：场地订场 14→0、设置中心/特殊日 12→0、产品线 58→42、商品管理 54→38；静默裁切恒 0。
   只在桌面生效（≤1024px 手机端走「一行一卡」，不受影响）。 */
@media (min-width: 1025px) {
  .card { padding-left: 8px; padding-right: 8px; }
}

/* ===== R499：收支表（12 列）桌面下收紧单元格内边距 =====
   表的列多（日期 + 9 个金额列 + 支出 + 结余），1280 下一屏放下必须省宽度。
   内边距 12→4 ⇒ 每列多出 16px **可用**宽度：列宽可以更小，金额反而更不容易被截。
   只作用于这一张表（class="tbl-narrow"），手机端 ≤1024px 一行一卡、用不到。 */
@media (min-width: 1025px) {
  .el-table.tbl-narrow .cell { padding-left: 4px; padding-right: 4px; }
}

/* R522：新增/编辑学员弹窗「预热」期间把遮罩藏起来 —— 挂载照做、用户看不见 */
.stu-warm{visibility:hidden !important;}

/* ===== R532（2026-09-29）课程一览 · 周日历 =====
   横＝周一~周日（带日期），纵＝钟点；块从上课钟点开始、**块高＝时长**（1 小时 44px —— 与
   app-training.js 的 CAL_HOUR_H 必须一致，改一处要改两处）。
   R535（2026-09-30 馆方）：纵轴「半小时一格」—— 一行 30 分钟＝22px（CAL_SLOT_H = CAL_HOUR_H/2），
   默认 8:00 显示到 21:00；整点横向线深一点、半点浅一点，方便对格线看开始时间。
   七列**等分自适应**：手机端（≤1024px）列自动收窄，**不横滑**（与 R497「一行一卡」同一取向）。
   底部**没有**任何动作条（新增/剪切/复制/删除一律不放）；块是**只读**入口，点开只看详情。 */
.wkcal-wrap{border:1px solid #ebeef5;border-radius:6px;background:#fff;overflow:hidden}
.wkcal-grid{display:flex;align-items:stretch}
.wkcal-axis{width:38px;flex:none;background:#fafafa;border-right:1px solid #ebeef5}
.wkcal-col{flex:1 1 0;min-width:0;border-right:1px solid #ebeef5}
.wkcal-col:last-child{border-right:0}
.wkcal-hd{height:34px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#f7f8fa;border-bottom:1px solid #ebeef5;font-size:12px;color:#606266;line-height:1.15}
.wkcal-ahd{background:#f2f3f5}
.wkcal-hdw{font-weight:600}
.wkcal-hdd{font-size:10px;color:#909399}
/* R535 半小时一格（22px/行）：半点线浅、整点线深 */
.wkcal-acell,.wkcal-cell{height:22px;border-bottom:1px solid #f5f7fa}
.wkcal-acell.wkcal-hourline,.wkcal-cell.wkcal-hourline{border-bottom-color:#e4e7ed}
/* 纵轴标签贴着自己那条格线（顶部对齐），读「8:00」＝这行从 8:00 开始 */
.wkcal-acell{font-size:10px;color:#a8abb2;text-align:center;line-height:1;padding-top:3px}
.wkcal-body{position:relative}
.wkcal-todayc{background:#f5faff}
.wkcal-todayh{background:#ecf5ff;color:#2b6cb0}
.wkcal-blk{position:absolute;left:2px;width:calc(100% - 4px);background:#409eff;color:#fff;border-radius:4px;font-size:11px;line-height:1.2;padding:2px 3px;overflow:hidden;cursor:pointer;word-break:break-all}
.wkcal-blk:hover{background:#337ecc}
@media (max-width:1024px){
  .wkcal-axis{width:30px}
  .wkcal-acell{font-size:9px;line-height:1;padding-top:2px}
  .wkcal-hd{height:30px;font-size:11px}
  .wkcal-hdd{font-size:9px}
  .wkcal-blk{font-size:10px;left:1px;width:calc(100% - 2px);padding:1px 2px}
}
/* ===== R516 手机+平板(≤1024px) 场地订场 › 周视图「一天一卡」 =====
   原栅格 .wk-grid min-width 860px、容器只有 346px ⇒ 手机上要靠横滑才看得全（表头还常被裁）。
   现改：一张卡＝一天，只列当天各场地的占用；点一条＝与点原格同动作（查看/结账）。
   空档下单走「日视图」的手机时间表（.mb-day）。桌面端两个都不受影响：本块只在 ≤1024px 显示。 */
.mb-week { display: none; }
.mb-wday { padding: 8px 0; border-bottom: 1px solid #eef1f5; }
.mb-wday:last-of-type { border-bottom: 0; }
.mb-wdayh { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-bottom: 4px; }
.mb-wdayh b { font-size: 14px; }
.mb-wdate { font-size: 12px; color: #8a97a5; }
.mb-wseg { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; min-height: 42px; padding: 7px 9px;
           margin: 3px 0; border-radius: 4px; font-size: 12.5px; background: #f5f9ff; border-left: 3px solid #409eff; cursor: pointer; }
.mb-wseg:active { background: #e9f2ff; }
.mb-wseg b { font-size: 12.5px; }
.mb-wunit { display: inline-block; min-width: 26px; padding: 0 4px; border-radius: 3px; background: #ecf5ff; color: #337ecc; text-align: center; }
.mb-wname { flex: 1; color: #303133; }
.mb-wpay { color: #b25e09; }
.mb-wrel { color: #8a97a5; }
.mb-wempty { font-size: 12px; padding: 2px 0 4px; }
.mb-wseg-train { background: #f2fbf3; border-left-color: #67c23a; }
.mb-wseg-train .mb-wunit { background: #eaf7eb; color: #3f8c46; }
.mb-wseg-event { background: #fff8ee; border-left-color: #e6a23c; }
.mb-wseg-event .mb-wunit { background: #fdf1e0; color: #b25e09; }
/* R562（2026-09-30）：周简图手机端也用「一天一卡」（.wd-mb），桌面端仍是栅格（.wd-wrap）。 */
.wd-mb { display: none; }
@media (max-width: 1024px) {
  .mb-week { display: block; margin-top: 4px; }
  .wk-wrap { display: none; }
  .wd-mb { display: block; margin-top: 4px; }
  .wd-wrap { display: none; }
}

/* ===== R577（馆方 2026-09-30「可参考班级拉人」）外出比赛拉人「搜索结果」整行可点 =====
   原来每行 = 勾选框 + 「加入」按钮（没打勾按钮就是灰的）⇒ 两步。
   现在**点整行＝加入 / 再点一下＝移除**，与班级拉人同一手感；触控目标＝整行（远超 42px）。
   类名先查重（R534 教训）：全库 grep `sr-row` 无同名。 */
.cls-mrow.sr-row { cursor: pointer; border-radius: 4px; }
.cls-mrow.sr-row:hover { background: #f7fbff; }
.cls-mrow.sr-row:active { background: #eef5ff; }


/* ===== R584/R586（馆方 2026-10-01）：周日历的例外角标 + 顶部「筛选」按钮 + 页签不再独占一张卡 ===== */
.wkcal-blk.wkcal-off{background:#d8dbe0;color:#6b7280;border:1px dashed #b9bec7}
.wkcal-blk.wkcal-chg{background:#e6a23c}
.wkcal-mk{position:absolute;right:1px;top:1px;background:rgba(255,255,255,.92);color:#c0392b;border-radius:3px;font-size:9px;line-height:1.1;padding:0 2px}
.wkcal-off .wkcal-mk{color:#6b7280}
.wkcal-tail{display:block;font-size:9px;opacity:.9;line-height:1.1}
.wkcal-br{position:absolute;left:1px;bottom:1px;background:rgba(255,255,255,.92);color:#337ecc;border-radius:3px;font-size:9px;line-height:1.1;padding:0 2px}
.wkcal-hdnt{font-size:9px;color:#c0392b;line-height:1.1}
.wkcal-offh{background:#fdf0f0}
.filter-dot{display:inline-block;margin-left:4px;min-width:15px;height:15px;line-height:15px;text-align:center;border-radius:8px;background:#e6a23c;color:#fff;font-size:11px}
/* R586：页签条不再单独占一张卡（原来「两个卡片」的第一张）—— 去掉卡底与内边距，只留一行 */
.hub-tabs{padding:0 0 8px}
.hub-tabs .el-radio-group{flex-wrap:wrap}
/* R714（馆方 2026-10-04「外出比赛和几项按钮同行」）：核验中心那 4 段页签在 ≤1024px 收窄一档 ——
   360px 窄屏可用宽 340px，4 颗按默认内边距要 349px ⇒ 差 9px 会折行；收窄后 ≈288px，一行稳落。
   只作用在核验中心那一组（.vh-tabs），别处 .hub-tabs 一个字不动。 */
@media (max-width: 1024px){
  .hub-tabs .vh-tabs .el-radio-button__inner { padding: 8px 9px; font-size: 13px; }
}
/* R618A（馆方 2026-10-01）：页签行改「一行」—— 左边页签、右边放「+ 新建班级」这类按钮，省掉一整行 */
.hub-tabs-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;row-gap:6px}
.hub-tabs-row .el-radio-group{flex-shrink:0;flex-wrap:nowrap}
.hub-tabs-row .hub-coachsel .el-select__wrapper{min-width:0}
.hub-tabs-row .hub-coachsel input{min-width:0;width:100%}
.hub-tabs-row > .grow{flex:1 1 0;min-width:0}
/* R697（馆方 2026-10-03 第②条）：「‹ 上一周 ｜ 本周 ｜ 下一周 ›」搬到**菜单栏（页签行）右角**。
   margin-left:auto ＝ 贴右；放不下时（手机端 3~4 个页签 + 这三颗）整行折行、这三颗独占第二行靠右。 */
.wknav{display:inline-flex;align-items:center;gap:6px;margin-left:auto}
.wknav .el-button+.el-button{margin-left:0}
/* R691（馆方 2026-10-03 拍板「1」）：三段切换 + 带班教练 + 新建班级 并成一行。
   390px 实测：三段 232 ＋ 教练 140 ＋ 「+ 新建班级」100 = 496 > 行宽 370 ⇒ 手机端把后两件收窄：
   教练下拉 96px（占位字显示「带班…」，控件本体可点开完整列表）、新建班级收成一颗 ＋。
   桌面端（>1024px）行宽 1184，一个字不用缩，按钮仍是「+ 新建班级」。 */
.hub-tabs-row .hub-coachsel{flex:0 1 150px;min-width:88px}
/* R693/R694（馆方 2026-10-03）：顶栏那颗「新建班级」——
   R693 从页签行搬进顶栏（与 R637「刷新」同一排）；R694 再往右推成**这一行的最右端**、字面收成一颗「＋」。
   margin-left:auto ＝ 独占剩余空间 ⇒ 不管左边是页名、馆档还是别的，它都贴在右上角。 */
.t-newcls{flex:0 0 auto;margin-left:auto;font-size:17px;line-height:1;font-weight:700;
  width:34px;height:34px;padding:0;display:inline-flex;align-items:center;justify-content:center}
@media (max-width:1024px){
  /* R694：手机/平板顶栏略收（与同排的件同一档高），仍是最右端一颗圆按钮。 */
  .t-newcls{width:32px !important;height:32px !important;font-size:16px}
}
@media (max-width:1024px){
  /* R691-补（2026-10-03 馆方手机实测截图）：390 上勉强一行，384/360 的机器上多出来的那件会被挤到**第二行**。
     R693 把「+ 新建班级」搬去顶栏后，这一行只剩 三段 + 带班教练，更宽松：
     三段字 12px / 内边距 6px / 行内间距 6px；教练下拉 flex 基准 150px、最小 88px（按剩余宽度自适应，
     总教练那一档能显示全「带班教练」四字）。实测 360 / 375 / 384 / 390 / 412 都稳落**一行**。 */
  .hub-tabs-row .el-radio-button__inner{padding:8px 6px;font-size:12px}
  .hub-tabs-row{gap:6px}
  .hub-tabs-row .hub-coachsel{flex:0 1 150px;min-width:88px}
  /* R715（馆方 2026-10-04「前台·班级管理：教练选择移到班级/让场同一行」）：
     前台这一档多一颗「让场」⇒ 4 段 207px ＋ 下拉基准 150px ＋两个间隙 = 369px > 行宽
     （384px 屏可用 364px，差 5px；360px 差 25px）⇒ 下拉被挤到第二行。
     只给这一档（.hub-4seg）把下拉基准宽收到 118px ⇒ 337px 一行落定（360/384/412 都稳）。
     表外别处不动：总教练那 3 段档、我的班级都还是 150px。 */
  .hub-tabs-row.hub-4seg .hub-coachsel{flex:0 1 118px;min-width:96px}
  /* R697：菜单栏右角那三颗周次键在手机上收一档（高 28 / 内边距 8 / 字 12），
     好跟左上的页签挤在同一行；实在挤不下就整行折行、它们独占第二行靠右。 */
  .wknav{gap:4px}
  .wknav .el-button{height:28px;padding:0 8px;font-size:12px}
  /* R697：顶栏那颗「教练查询」—— 手机端收窄一点，不跟页名抢位置 */
  .topbar .t-title > .el-select.t-catcoach{width:104px}
}
/* R697（馆方 2026-10-03 第①条）：顶栏右端的「教练查询」（课程一览那颗「看谁」上来的）——
   与 R693/R694 那颗「＋」同一排、同一个 margin-left:auto 规则；两者互斥出现（＋ 只在「班级」段、
   这颗只在「课程一览」段），不会同时占位。 */
.topbar .t-title > .el-select.t-catcoach{flex:0 0 auto;margin-left:auto;width:132px}
.topbar .t-title > .el-select.t-catcoach .el-select__wrapper{min-height:30px}
/* R586：手机端筛选控件不再「一个控件占一行」——允许收缩并给宽度上限 */
.toolbar > *{min-width:0}
@media (max-width:1024px){
  .toolbar .el-select,.toolbar .el-input,.toolbar .el-input-number{flex:1 1 120px;max-width:46%}
}
/* R719（馆方 2026-10-04 拍板「4 全都算」：「工资核算 / 经营财务」手机端两个日期框**竖着叠、还老高**）——
   根因：R589 把这两个框改成**竖排**之后，上面那条 .toolbar .el-input 的 flex:1 1 120px
   在**竖排**容器里把 flex-basis 当成了**高度**用 ⇒ 每个框被撑到 120px+、像两座高塔。
   这里给那一段单独挂 .fin-dates：日期框恢复自然高度（32px）、整行铺满，不再吃 .toolbar 那条。 */
.fin-dates { display: flex; flex-direction: column; gap: 6px; width: 100%; }
.fin-dates .el-date-editor.el-input { flex: 0 0 auto !important; width: 100% !important; max-width: none !important; }
.fin-dates .el-input__wrapper { min-height: 32px; }

/* R599/Q3①（馆方 2026-10-01）：手机端「提交考勤」**吸底常驻** ——
   原来它排在整张名单之后，学员一多要一路滑到底才看得见。 */
.att-submit-bar { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
.att-submit-bar.is-fixed {
  position: sticky; bottom: 0; z-index: 6;
  background: #fff; padding: 8px 10px; margin: 10px -4px 0;
  border-top: 1px solid #e4e7ed;
  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06);
}

/* ===== R659（馆方 2026-10-02「周简图，要这个，只是 18:30-20:30 / 20:30-22:30」）=====
   周简图从「按时间比例画的竖条 + 半小时刻度」改成**两档格子表**（形态＝馆方那张手工订场登记表）：
   行＝星期一~日，列＝各半场，每晚两档＝上下两行；格内直接写谁占的，空的写「空场」。
   手机端先选片场（一张场两个半场并排），一屏两列、不横滑。 */
.wgt { width: 100%; border-collapse: collapse; table-layout: fixed; }
.wgt th, .wgt td { border: 1px solid #dbe3ec; font-size: 12px; padding: 5px 4px; text-align: center; vertical-align: middle; }
.wgt th { background: #eef2f7; font-weight: 700; color: #303133; }
.wgt .wgt-lb { background: #f7f9fc; color: #5a6a7a; width: 62px; white-space: nowrap; }
.wgt .wgt-band { width: 82px; }
.wgt .wgt-day { font-weight: 700; color: #1f2d3d; }
.wgt .wgt-day i { display: block; font-style: normal; font-size: 10px; color: #8a97a5; font-weight: 400; }
.wgt .wgt-day.on { color: #409eff; }
.wgt .wgt-c { padding: 3px; }
.wgt .wgt-past { background: #fafbfc; }
.wgt .wgt-full { box-shadow: inset 0 0 0 1px #b7e0a4; }   /* 同档两半场都空 ⇒「可拼全场」（1px 浅绿，别太吵） */
.wgt .wgt-it { border-radius: 5px; padding: 3px 2px; color: #fff; line-height: 1.25; cursor: pointer; }
.wgt .wgt-it + .wgt-it { margin-top: 2px; }
.wgt .wgt-it b { font-size: 12px; font-weight: 700; }
.wgt .wgt-it span { display: block; font-size: 10px; opacity: .9; }
.wgt .wgt-it .wgt-pay { font-style: normal; font-size: 10px; margin-left: 3px; opacity: .95; }
.wgt .wgt-it.wgt-book { background: #409eff; }
.wgt .wgt-it.wgt-book.alt { background: #2a7fd1; }
.wgt .wgt-it.wgt-train { background: #67c23a; }
.wgt .wgt-it.wgt-train.alt { background: #52a92b; }
.wgt .wgt-it.wgt-event { background: #e6a23c; }
.wgt .wgt-it.wgt-event.alt { background: #cd8b28; }
.wgt .wgt-it.rel { box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .85); }   /* 已释放场地（让场） */
.wgt .wgt-free { color: #a8b3bf; font-size: 12px; padding: 4px 0; cursor: pointer; }
.wgt .wgt-more { font-size: 10px; color: #8a97a5; }
.wgt-wrap { overflow-x: auto; }
.wgt-mb { display: none; }
.wgt-mb .mb-units { margin-bottom: 8px; }
/* R661：手机端周视图＝格子表（一行一天）—— 「可订」空档用绿虚线小块（与占用块一眼分开） */
.wk-mb { display: none; }
.wk-mb .mb-units { margin-bottom: 8px; }
.wgt .wgt-it.wgt-freei { background: #fff; border: 1px dashed #b3e19d; color: #4b8b2b; text-align: center; }
.wgt .wgt-it.wgt-freei.full { border-style: solid; border-color: #67c23a; font-weight: 700; }
.wgt .wgt-it.wgt-rel { background: #52a92b; box-shadow: inset 0 0 0 2px rgba(255, 255, 255, .85); }
@media (max-width: 1024px) {
  /* R659：手机端只出「两档格子（所选片场两列）」，桌面端只出四列栅格 —— 与 R562 那套同一做法 */
  .wgt-mb { display: block; margin-top: 4px; }
  .wgt-wrap { display: none; }
  /* R661：手机端周视图出格子表、桌面那张栅格照旧隐掉（.wk-wrap 在 R516 那一段已经隐了） */
  .wk-mb { display: block; margin-top: 4px; }
  /* 手机：一屏放「时段 + 该片场两个半场」，不用横滑 */
  .wgt-mb .wgt-lb { width: 46px; font-size: 11px; }
  .wgt-mb .wgt-band { width: 82px; font-size: 11px; }
  .wgt-mb .wgt-it b { font-size: 12px; }
  .wk-mb .wgt-lb { width: 56px; font-size: 11px; }
}
/* ===== R675（馆方 2026-10-03「日视图用甲」）手机端订场日视图＝两列半场 · 时段段 =====
   只在 ≤1024px 出现（整块挂在 .mb-day 里，电脑端 .daypc 那张 880px 栅格一个字没动）。
   配色与周视图/周简图同一套（订场蓝 / 培训绿 / 赛事橙），深浅交替用 .alt 区分相邻两单。 */
.daym { width: 100%; table-layout: fixed; border-collapse: collapse; background: #fff; }
.daym th, .daym td { border: 1px solid #edf1f6; padding: 4px; vertical-align: top; }
.daym thead th { background: #f7f9fc; color: #5a6a7a; font-size: 12px; font-weight: 600; padding: 7px 4px; }
.daym .daym-t { width: 80px; background: #f7f9fc; color: #5a6a7a; text-align: center; white-space: nowrap; }
.daym .daym-band { font-size: 11px; font-weight: 700; color: #1f2d3d; }
.daym .daym-c { padding: 3px; }
.daym .daym-it { border-radius: 5px; padding: 4px 3px; color: #fff; line-height: 1.25; cursor: pointer; }
.daym .daym-it b { display: block; font-size: 12px; font-weight: 700; }
.daym .daym-it span { display: block; font-size: 10px; opacity: .92; }
.daym .daym-it .daym-pay { font-style: normal; font-size: 10px; margin-left: 3px; opacity: .95; }
.daym .daym-it.daym-book { background: #409eff; }
.daym .daym-it.daym-book.alt { background: #2a7fd1; }
.daym .daym-it.daym-train { background: #67c23a; }
.daym .daym-it.daym-train.alt { background: #52a92b; }
.daym .daym-it.daym-event { background: #e6a23c; }
.daym .daym-it.daym-event.alt { background: #cd8b28; }
.daym .daym-free { border: 1px dashed #b3e19d; border-radius: 5px; color: #4b8b2b; text-align: center;
                   font-size: 12px; padding: 7px 2px; cursor: pointer; }
.daym .daym-free.past { border-style: solid; border-color: #e4e7ed; background: #fafbfc;
                        color: #a8b3bf; cursor: default; }

/* ===== R700（馆方 2026-10-03，场地订场 · 顶部工具区整理）=====
   馆方原话：「整理这上面的菜单来」→「图例展开不要，上一周、本周、下一周，和8号场、24号场、一行」
   ① 撤「图例 ▾ 展开」那颗（手机端；颜色含义已并进各视图表下的 ⓘ，信息不丢）；
   ② 三颗周次键收成一组（键间无缝，像一格分段控件），顺序摆正为 上一周｜本周｜下一周；
   ③ 手机端周简图的「片场」两键从表内搬到工具行、靠右贴边 —— 与周次同一行；
   ④「只读：本页仅供查看」不再蹲在按钮行里，改画在表下一行小灰字。
   实测 360 / 384 / 412 三档：同一行成立、横溢出 0；工具区 3 行 136px → 2 行 76px。
   全部只作用在 ≤1024px；桌面（>1024px）除「本周」按钮顺序外一个字不动。 */
.bk-courts { display: none; }   /* 桌面端不出现（那里本来就没有这一级选择器） */
.bk-roline { display: none; }   /* 桌面端「只读」照旧写在工具行里 */
/* R713：视图三档那层壳 —— 手机端整行占满（见下面媒体查询）；桌面端不参与布局，三键照旧原样一件。 */
.bk-vrow { display: inline-flex; align-items: center; gap: 8px; }

@media (max-width: 1024px) {
  /* R713（馆方 2026-10-04「新增订场移到日视图/周视图/周简图一行」）：
     视图三键 ＋「＋新增订场」并成一行 —— 用 .bk-vrow 这层壳整行占满
     （原来只给 .el-radio-group flex:1 1 100% 是为了 412px 下周次不窜到第一行；壳换过来后同样成立）。 */
  .card .toolbar.bk-tb { row-gap: 8px; align-items: center; }
  .card .toolbar.bk-tb > .bk-vrow { flex: 1 1 100%; display: flex; align-items: center; gap: 8px; }
  .card .toolbar.bk-tb > .bk-vrow > .el-radio-group { flex: 0 0 auto; }
  /* 工具行里的按钮统一 34px（原手机端那条 `.card .el-button{min-height:42px}` 权重更低，被这条盖住） */
  .card .toolbar.bk-tb .el-button,
  .card .toolbar.bk-tb .el-radio-button__inner {
    min-height: 34px; height: 34px; line-height: 32px; font-size: 13px;
    padding: 0 7px; box-sizing: border-box;
  }
  .card .toolbar.bk-tb .el-button + .el-button { margin-left: 0; }
  /* 周次三键 / 日次三键 = 一组（R701 起两者同一套规则） */
  .card .toolbar.bk-tb .bk-wknav,
  .card .toolbar.bk-tb .bk-daynav { display: inline-flex; flex: 0 0 auto; }
  .card .toolbar.bk-tb .bk-wknav .el-button,
  .card .toolbar.bk-tb .bk-daynav .el-button { border-radius: 0; }
  .card .toolbar.bk-tb .bk-wknav .el-button:first-child,
  .card .toolbar.bk-tb .bk-daynav .el-button:first-child { border-radius: 6px 0 0 6px; }
  .card .toolbar.bk-tb .bk-wknav .el-button:last-child,
  .card .toolbar.bk-tb .bk-daynav .el-button:last-child { border-radius: 0 6px 6px 0; }
  .card .toolbar.bk-tb .bk-wknav .el-button + .el-button,
  .card .toolbar.bk-tb .bk-daynav .el-button + .el-button { margin-left: -1px; }
  /* R701（馆方 2026-10-03「日视图（删选择日期）」）：手机端撤掉日视图那个「选择日期」框
     —— 它在手机上只剩半行宽、孤零零一格；跳日期改靠 前一天 / 今天 / 后一天 或切周视图。
     电脑端（>1024px）保留，前台常用来跳某一天。本页另一个工具栏（订场单）不叫 bk-tb，不受影响。 */
  .card .toolbar.bk-tb > .el-date-editor { display: none; }
  /* 片场两键：与周次同一行、靠右贴边 */
  .card .toolbar.bk-tb .bk-courts { display: flex; margin: 0 0 0 auto; flex-wrap: nowrap; gap: 6px; }
  .card .toolbar.bk-tb .bk-courts .mb-unit {
    height: 34px; min-width: 0; padding: 0 8px; font-size: 13px; line-height: 32px;
  }
  /* 只读：表下一行小灰字 */
  .bk-roline { display: flex; align-items: center; gap: 6px; margin: 8px 2px 0;
               font-size: 12px; color: #909399; }
  .card .toolbar.bk-tb .bk-rotag { display: none; }
}

/* ===== R702（馆方 2026-10-03，名单管理 · 上课名单）=====
   馆方原话：「年卡字样出现在特训课内，另外每个人名字行太高」
   ① 「缴费 / 移出」从独占一行 → 挪到「上课日」那一行的右侧（一人省 ≈50px，一屏多看两个人）；
   ② 名单卡片里的动作键 42px → 34px（与班级卡片 R699 同一把尺）；
   ③ 行内间距收紧。只作用在名单管理那张卡（.cls-roster），别处 .cls-mbtn 仍 42px。 */
.cls-roster .cls-mrow { padding: 8px 0; }
.cls-roster .cls-mwd { display: flex; align-items: center; gap: 8px; }
.cls-roster .cls-mwd .cls-msub { flex: 1 1 auto; min-width: 0; margin-top: 2px; }
.cls-roster .cls-mwd .cls-mbtn { flex: 0 0 auto; margin: 0 0 0 auto; flex-wrap: nowrap; }
.cls-roster .cls-mbtn .el-button { min-height: 34px; height: 34px; padding: 0 12px; font-size: 13px; }

/* ===== R703（馆方 2026-10-03，名单管理工具栏）=====
   馆方原话：「这三个按钮，用三个简标，如+正，+临，+试，一行显示」
   三颗长名键（＋ 拉入学员 / 拉入试课学员 / 临时调班）⇒ 三个简标一行：＋正 ｜ ＋临 ｜ ＋试。
   全名与口径仍在每颗的悬停提示里 ＋ 旁边那颗 ⓘ（手机不靠悬停）。
   手机端三格等分、末格 20px 留给 ⓘ；只作用在这一个弹窗（.dlg-actions 全站只此一处）。 */
/* R836（馆方 2026-11-02 选「3」）：名单管理工具栏「多选」小开关 —— 平时只是一颗小字链，
   点开才出勾选框与「移出所选（N）」；手机端也压成 12px，不占一整行。 */
.multi-tg { font-size: 12px !important; padding: 0 2px !important; height: 22px !important; margin-left: 4px; }
.multi-go { font-size: 12px !important; height: 26px !important; padding: 0 8px !important; }
@media (max-width: 1024px) {
  /* R836②：这颗键在 r3btn 行里等分，不再单独拉伸 */
  .toolbar.dlg-actions .r3btn > .multi-tg { font-size: 13px !important; height: 34px !important; }
}
.r3btn { display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }
.r3btn .el-button + .el-button { margin-left: 0 !important; }
@media (max-width: 1024px) {
  /* R836②：原来是「三格等分 + 20px ⓘ」的写死网格；现在这一行会多出「移出 / 确认」那颗，
     颗数不定（3 颗或 4 颗）⇒ 改 flex 等分，来几颗分几颗，ⓘ 固定 20px。 */
  .toolbar.dlg-actions .r3btn {
    flex: 1 1 100%; display: flex; gap: 6px; align-items: center;
  }
  .toolbar.dlg-actions .r3btn > .el-button { flex: 1 1 0; min-width: 0; }
  .toolbar.dlg-actions .r3btn > .hint-link { flex: 0 0 20px; text-align: center; }
  .toolbar.dlg-actions .r3btn .el-button { min-height: 34px; height: 34px; padding: 0 10px; font-size: 13px; }
  /* R704：原来这里还有一条「同一行里那颗『保存上课日』也跟着 34px」—— 那颗键已撤（改为关窗自动提交），
     规则没有对象了，删掉。见文件末尾的 R704 块。 */
}

/* ===== R704（馆方 2026-10-03 拍板选「2️⃣ 干脆不要那颗键（关闭就自动提交）」）=====
   撤掉名单管理工具栏里那颗「保存上课日（N）」—— 它没改动时一直灰着、整行白占 h34（工具栏 76px）。
   改为**关这个窗时自动提交**（右上 ✕ / ESC / 点窗外 / 底部「关闭」四条路都拦，逻辑见 wdClose/wdFlush）。
   这里只留**一行小字**把口径写在脸上（不然点了圆片像没反应）：
     · 平时灰字：点学员后面的「周几」圆片＝他来／不来那天 · 关窗时自动提交；
     · 有改动时变蓝加粗：已改 N 人 · 关窗时自动提交（免审核 / 交总教练审核）。
   只作用在这个弹窗的工具栏（.dlg-actions 全站只此一处）。 */
.toolbar.dlg-actions .wd-hint { flex: 1 1 100%; font-size: 11px; color: #909399; line-height: 1.6; }
.toolbar.dlg-actions .wd-hint.dirty { color: #409eff; font-weight: 600; }
.toolbar.dlg-actions .wd-hint b { font-size: 12.5px; }
@media (max-width: 1024px) {
  .toolbar.dlg-actions .wd-hint { margin-top: 2px; }
}

/* ===== R705（馆方 2026-10-03「这个拉人的界面很别扭，优化一下」）=====
   拉入学员弹窗（班级管理 / 我的班级 → 上课名单 → ＋正）：
   ① 顶部 5 行 → 3 行：ⓘ 挪进绿色「本班上课日」条右端、撤掉与默认值等价的整行灰键、计数收成一行小字；
   ② 候选卡 6 行 → 3 行（姓名行右端＝剩余节数；已在班级/课包/归属馆并一行；来上哪几天＋类型并一行）；
   ③ 勾选框放大到触控尺寸、勾中的整张卡染绿。
   ⚠️ 只作用在这个弹窗（.rc-mlist / .rc-find / .rc-i），别处的 .cls-mlist 一字不动。 */
.daybanner .hint-link.rc-i { margin-left: auto; }
.rc-find { margin-bottom: 6px; }
.rc-count { font-size: 11.5px; line-height: 1.7; }
.rc-mlist .cls-mrow { padding: 8px 0; border-radius: 6px; }
.rc-mlist .cls-mrow.rc-on { background: #f0f9eb; box-shadow: inset 3px 0 0 #67c23a; }
.rc-mlist .cls-mhead { gap: 5px; }
.rc-mlist .cls-mwd { display: flex; align-items: center; gap: 8px; }
.rc-mlist .cls-mwd .cls-msub { flex: 1 1 auto; min-width: 0; margin-top: 3px; }
.rc-mlist .cls-mwd .rc-kind { flex: 0 0 auto; margin: 0 0 0 auto; white-space: nowrap; }
@media (max-width: 1024px) {
  /* 勾选框放大 —— 原来那个 14px 小方框在手机上很难点，底部却写着「请先点行勾选学员」 */
  .rc-mlist .cls-mhead .el-checkbox__inner { width: 20px; height: 20px; }
  .rc-mlist .cls-mhead .el-checkbox__inner::after { width: 4px; height: 10px; left: 7px; top: 2px; }
  /* 类型下拉也收一档，别比圆片高一截 */
  .rc-mlist .cls-mwd .el-select .el-input__wrapper { min-height: 32px; }
}

/* ===== R706（馆方 2026-10-03「选择后，在下面的就只显示名字」）=====
   「拉入学员」弹窗最下面那块「待提交名单」：原来手机端**每人一张卡**
   （姓名+年级 / 家长·电话 / 剩余节数 / 来上哪几天 / 类型 / 移除，≈150px 一人），
   5 个人就把弹窗下半屏占满 —— 这些信息在上方候选卡上已经写全、还能直接改 ⇒ 收成**一行一个人（≈34px）**：
     左＝名字（＋试课小标＋「不是全部上课日」时的周几圆片），右＝「移除」。
   桌面那张表同样只留「学员 / 操作」两列（列宽自适应，不再挤半屏）。
   ⚠️ 只作用在这块（.pnd-mlist / .pnd-row），别处一字不动。
   （R707 起：这颗 per-row「移除」键已收成标题右边一颗**模式键**，见文件末段 R707 那节。） */
.pnd-mlist .pnd-row { display: flex; align-items: center; flex-wrap: wrap; gap: 4px 6px;
                      padding: 4px 8px; border-bottom: 1px solid #eef1f5; }
.pnd-mlist .pnd-row:last-child { border-bottom: 0; }
.pnd-mlist .pnd-row > b { font-size: 14px; }
.pnd-mlist .pnd-row .pnd-odd { display: inline-flex; align-items: center; flex-wrap: wrap; }
.pnd-tbl .el-table__cell { padding: 2px 0; }

/* ===== R707（馆方 2026-10-03「全屏，上下一分为二，满屏，上下屏分别可滑动」＋
   「在待提交名单后，做一个按钮移除，点击移除后，名字前方出现-，点击名字移除」）=====
   「拉入学员」弹窗（班级管理 / 我的班级 → 上课名单 → ＋正），**只作用于手机 / 平板（≤1024px）**：
     ① 弹窗**全屏**（:fullscreen="mobile" ⇒ 桌面上仍是原来那个 880px 普通弹窗，一字未动）；
     ② 弹窗体竖排 flex：上屏＝搜索出的候选（.rc-top）、下屏＝待提交名单（.rc-bot）各占一半，
        **两屏各自的滚动条独立**（都是 min-height:0 + overflow-y:auto）；标题栏与底栏「取消/确认」固定不动；
     ③ 下屏改**两列**（grid）：一个名字 ＋ 它「来上周几」的圈码（①=周一 … ⑦=周日，如②＝周二）；
     ④ 标题右边一颗「移除」＝**模式键**：按下去 ⇒ 每个名字前出现「−」、**点名字即撤下** ⇒ 再按「完成」退出。
   ⚠️ 全部只挂在 .rc-dlg / .rc-split / .rc-top / .rc-bot / .pnd-mlist / .pnd-rmbtn / .wc-cir / .pnd-minus
      这几个本弹窗专用名上，其余页面与弹窗一字未动。 */
@media (max-width: 1024px) {
  /* ① 全屏：标题 / 表体 / 底栏三段 —— 用 **grid** 行高 auto/1fr/auto 定死，
        比 flex 稳（实测 flex 下 /body 拿到 612 而对话框高 900，底下空出 168px 白）。
     ⚠️ margin 必须带 !important —— Element Plus 把 :top 写成**行内** style（3vh），
        不吃掉它弹窗就比视口矮 27px（实测 900 的屏上弹窗 27→927）。
     ⚠️ padding 归零 —— 对话框自带 16px 内边距，留着四周一圈白边，就不叫「满屏」了。 */
  .rc-dlg.el-dialog { display: grid !important; grid-template-rows: auto 1fr auto;
                      margin: 0 !important; padding: 0 !important; border-radius: 0; overflow: hidden; }
  .rc-dlg .el-dialog__header { padding: 10px 14px; margin-right: 0; border-bottom: 1px solid #ebeef5; }
  /* ⚠️ max-height 必须打掉 —— 全站手机端那条 `.el-dialog__body { max-height: 68vh }`（style.css 早段）
        会把这个弹窗的表体卡在 68vh（900 的屏上＝612px），底栏下面空出一截白。 */
  .rc-dlg .el-dialog__body { min-height: 0; max-height: none !important; display: flex; flex-direction: column; overflow: hidden; padding: 8px 12px 0; }
  .rc-dlg .el-dialog__footer { padding: 8px 12px; border-top: 1px solid #ebeef5; }
  /* ② 上下两屏各占一半、各自滚 */
  .rc-split { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }
  .rc-top { flex: 1 1 0; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
  .rc-top .daybanner, .rc-top .rc-find { flex: 0 0 auto; }
  .rc-top .rc-mlist { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }
  /* 下屏＝**六行**的位置（表头 ≈37 ＋ 6×34 ≈ 204 ＋ 边框 2 ⇒ 250），其余全部留给上屏。
     行高实测 33-34px；给 6px 余量，免得第 6 行只露半截。 */
  .rc-bot { flex: 0 0 auto; max-height: 250px; display: flex; flex-direction: column; margin-top: 8px; }
  .rc-bot .pnd-hd { flex: 0 0 auto; }
  .rc-bot .pnd-mlist { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch;
                       display: grid; grid-template-columns: 1fr 1fr; align-content: start; padding: 0 2px; }
  /* ③ 下屏一行：名字 ＋ 周几圈码（可点改） */
  .pnd-mlist .pnd-row { min-width: 0; padding: 6px 4px; }
  .pnd-mlist .pnd-days { display: inline-flex; align-items: center; gap: 2px; flex: 0 0 auto; }
  .wc-cir { display: inline-flex; align-items: center; justify-content: center; width: 21px; height: 21px;
            border-radius: 50%; font-size: 12px; line-height: 1; border: 1px solid #dcdfe6;
            color: #a8abb2; background: #fff; cursor: pointer; }
  .wc-cir.on { background: #409eff; border-color: #409eff; color: #fff; font-weight: 600; }
  /* ④ 移除模式：名字前一条「−」，点名字即撤下 */
  .pnd-hd .pnd-rmbtn { margin-left: 2px; height: 28px; padding: 0 10px; font-size: 12px; }   /* 不许 size="small"（R106），尺寸走 CSS */
  .pnd-mlist .pnd-row.pnd-rm { cursor: pointer; }
  .pnd-mlist .pnd-row.pnd-rm > b { color: #c45656; }
  .pnd-minus { color: #f56c6c; font-weight: 700; font-size: 15px; line-height: 1; }
}

/* R711（2026-10-04 馆方拍板）：「学员管理」页工具条收拾 —— 两段式
   （第一段＝搜索＋共 N 人；第二段＝三颗简标勾选 ｜ ＋新增 ｜ 更多 ⋯）。
   电脑端两段并成一行；手机端各占一行。尺寸走 CSS，不写 size="small"（R106 铁律）。 */
/* R712（馆方 2026-10-04 拍板）：学员管理页工具条再收一遍 —— 搜索 ｜ 筛选 ｜ 更多 **一行**。
   （R711 的「两段式 .stu-line」撤掉；尺寸走 CSS，不写 size="small"（R106 铁律）。） */
.stu-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 8px; }
.stu-q { width: 220px; }
.stu-caret { font-size: 10px; }
.stu-flt { display: flex; flex-direction: column; gap: 8px; }
.stu-flt-cap { font-size: 12px; color: #909399; line-height: 1.6; }
.stu-flt-sep { height: 1px; background: #f0f0f0; }
.stu-empty { border: 1px dashed #dcdfe6; border-radius: 6px; background: #fafafa; padding: 46px 16px; text-align: center; }
.stu-empty-t { font-size: 14px; color: #606266; margin-bottom: 8px; }
.stu-empty-s { font-size: 12px; color: #909399; line-height: 1.8; }
@media (max-width: 1024px) {
  .stu-q { width: 92px; }
  /* R712d（馆方 2026-10-04「搜索/更多这一行的图标缩小一点」）：这一行的件统一收小一档 ——
     高度 42→34、字号 13、内边距 0 8（原 42px 来自 `.card .el-button{min-height:42px}`，
     这里用 `.card .stu-bar .el-button` 更高权重盖住）。搜索框 104→92px，为一行摆下 5 颗腾地方。 */
  .card .stu-bar .el-button { min-height: 34px !important; height: 34px !important;
    padding: 0 8px !important; font-size: 13px !important; line-height: 32px !important; }
  .card .stu-bar .el-input__wrapper { min-height: 30px !important; padding: 0 8px !important; }
  .card .stu-bar .el-input__inner { font-size: 13px !important; }
  .card .stu-bar .stu-caret { font-size: 9px !important; }
}

/* ===== R720（馆方 2026-10-04 拍板「订场会员页：2/3 一起收 + 6丙」，二轮「用甲」）=====
   ① 工具条**手机端收成一整行**：搜索框吃剩余宽度，「查询」收成放大镜图标、「+ 新建订场会员」
      收成「＋新建」、状态下拉收窄 —— 一排排齐，不折行。
   ② 卡片那 5 颗按钮（缴费/调整次数/明细/编辑/停用）收成**一行小字链** ——
      原来 5 颗在 390 屏塞不下、「停用」被挤到第二行孤零零右靠。
      字号收到 13px 但每个链接 min-height:42px —— 守住 R312 触控线。
   ⚠️ **电脑端一个像素不变**：两段用 display:contents 展开、再用 order 把视觉顺序还原成改前那样；
      图标/短标只在手机端顶替文字（桌面仍是「查询」「+ 新建订场会员」原字面）。
   ⚠️ .att-mbtn 本体**不动**（消课考勤那几张卡还在用同名类）。 */
.mbr-bar > .mbr-g1, .mbr-bar > .mbr-g2 { display: contents; }
/* DOM 顺序是「搜索段 → 新增段」（手机要的读法）；桌面靠 order 还原改前的视觉顺序：
   新建 ⋯ 全部 ｜ 搜索 查询 ⓘ */
.mbr-bar .mbr-add { order: 1; }
.mbr-bar .grow { order: 2; }
.mbr-bar .mbr-st { order: 3; }
.mbr-bar .mbr-q { order: 4; width: 200px; }
.mbr-bar .mbr-ic { order: 5; }
.mbr-bar .hint-link { order: 6; }
/* 短标：默认（桌面）不显示，手机端才顶替文字；图标那套走全局 .ic-btn */
.mbr-bar .mbr-mini { display: none; }
.att-mlk { display: flex; align-items: center; flex-wrap: wrap; gap: 0 5px; font-size: 13px; }
.att-mlk a { display: inline-flex; align-items: center; min-height: 42px; cursor: pointer; color: #337ecc; }
.att-mlk a.off { color: #c45656; }
.att-mlk a.on { color: #4a9d5f; }
/* 分隔符用 CSS 生成（只在「两个可见链接之间」出现）—— 停用状态的卡没有缴费/调整次数，
   写成固定 <span>·</span> 会在行首留一个孤零零的点。 */
.att-mlk a + a::before { content: '·'; color: #c8ced6; margin-right: 5px; }
@media (max-width: 1024px) {
  /* ⚠️ 分组在手机端也保持 display:contents —— 否则 order 只在组内生效，
     排出来是「搜索 🔍 ⓘ 全部 ＋新建」。展开后 5 件都是 .mbr-bar 的直接子项，全局 order 才管用。 */
  .toolbar.mbr-bar { flex-wrap: nowrap; }
  .mbr-bar .grow { display: none !important; }
  .mbr-bar .mbr-q { order: 1; flex: 1 1 auto !important; width: auto !important;
    min-width: 0 !important; max-width: none !important; }
  .mbr-bar .mbr-ic { order: 2; flex: 0 0 auto; }
  .mbr-bar .mbr-full { display: none; }
  .mbr-bar .mbr-mini { display: inline; }
}

/* ===== R721（馆方 2026-10-04「做一次版面的全部优化」）：全局版面统一 =====
   纯样式层 —— 不动任何结构、取数、权限。
   ① 圆角统一（按钮/输入框 8px，卡片/弹窗 12px，标签 6px）
   ③ 左侧菜单字体（字号 14 / 行高加大 / 分组字距 / 选中＝圆角色块＋左蓝条）
   ④ 顶栏层级（页名 16 / 日期·角色弱化）
   ⑤ 表头（浅底 12.5px 600）
   ⑥ 分段控件（今日·当月·年、日视图·周视图·周简图 那类）两端收圆，跟顶栏胶囊同一语言
   ⚠️ **没动按钮高度**：现有各页高度是按「一行放得下」量出来的（.board-q 30px、.stu-bar 34px 等），
      全局抬高度会连带折行 —— 要统一高度档另开一批做。 */
/* ① 圆角 */
.el-button { border-radius: 8px; font-weight: 500; }
.el-input__wrapper, .el-select__wrapper, .el-textarea__inner { border-radius: 8px; }
.card { border-radius: 12px; box-shadow: 0 1px 4px rgba(16, 32, 64, .06); }
.el-dialog, .el-popover.el-popper, .el-message-box { border-radius: 12px; }
.el-tag { border-radius: 6px; }
/* ③ 左侧菜单 */
.sidebar nav a { font-size: 14px; padding: 12px 18px; }
.sidebar .brand { font-size: 17px; letter-spacing: .5px; }
.sidebar .nav-g-title { font-size: 11.5px; letter-spacing: 1.5px; color: #6f8db0; padding: 8px 20px 3px; }
.sidebar nav a.on { background: #24384c; border-radius: 8px; margin: 0 8px; border-left: 0;
  box-shadow: inset 3px 0 0 #4fc3f7; padding-left: 15px; }
.sidebar .roleline { font-size: 12.5px; }
.sidebar .acct-link-row { font-size: 12.5px; }
/* ④ 顶栏层级 */
.topbar .t-title { font-size: 16px; }
.topbar .t-user { font-size: 12.5px; color: #5a6b7d; }
/* ⑤ 表头 / 卡片小标题 */
.el-table th { background: #f7f9fc; font-size: 12.5px; font-weight: 600; }
/* ⑥ 分段控件两端收圆（不碰顶栏那枚 999px 胶囊：它权重更高） */
.el-radio-group .el-radio-button:first-child .el-radio-button__inner { border-radius: 8px 0 0 8px !important; }
.el-radio-group .el-radio-button:last-child .el-radio-button__inner { border-radius: 0 8px 8px 0 !important; }
/* 表格「操作」列的一行小字链（R721 随全局一起收：原来 5 颗小按钮在 280px 列里也会折行） */
.tbl-mlk { display: flex; align-items: center; flex-wrap: wrap; gap: 0 4px; font-size: 12.5px; }
.tbl-mlk a { display: inline-flex; align-items: center; min-height: 30px; cursor: pointer; color: #337ecc; }
.tbl-mlk a.off { color: #c45656; }
.tbl-mlk a.on { color: #4a9d5f; }
.tbl-mlk a + a::before { content: '·'; color: #c8ced6; margin-right: 4px; }
/* 通用动作「图标代字」：手机端把「查询/搜索」收成放大镜，桌面仍留文字 */
.ic-btn .ic-svg { display: none; }
@media (max-width: 1024px) {
  .ic-btn .ic-svg { display: inline-block; width: 15px; height: 15px; flex: 0 0 auto;
    fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; }
  .ic-btn .ic-txt { display: none; }
  .ic-btn { padding: 0 !important; width: 42px !important; }
}

/* ===== R723（馆方 2026-10-04 拍板「落」）：按钮高度档统一（A 项）=====
   桌面标准 38 ／ 手机 42 ／ 小号（表格行内）32；按钮字重统一 500。
   改前基线：桌面标准 32（Element 默认）、小号 24；手机端本就是 42/34（不动）。
   专项（.cls-mcards .cls-mbtn .el-button 34、.toolbar .el-button 42、工作台 .board-q 30 等）
   因选择器权重更高，一律不受影响 —— 只兜底「没被专门量过的那些按钮」。 */
.el-button { min-height: 38px; font-weight: 500; }
.el-button--small { min-height: 32px; }
@media (max-width: 1024px) {
  .el-button { min-height: 42px; }
}

/* ===== R724（馆方 2026-10-04 拍板 BCDEFGH）===== */
/* E 表格斑马纹：偶数行浅底（考勤/停课那些带颜色的状态行是 !important，优先级更高 ⇒ 不受影响） */
.el-table tbody tr:nth-child(even) > td.el-table__cell { background: #fafbfd; }
/* H 下拉里的危险动作统一红字（停用 / 取消班级 等） */
.dd-danger { color: #c45656 !important; }

/* R729 预演（甲）：工作台工具条收口 —— 营收维度下拉 / 教学看板日期下拉 */
.card .toolbar .biz-scope { flex: 0 0 auto !important; width: 132px !important; max-width: none !important; }
.card .toolbar .team-scope { flex: 0 0 auto !important; width: 118px !important; max-width: none !important; }
.card .toolbar .team-range { font-size: 12px; color: #8a97a5; white-space: nowrap; }
.card .toolbar .team-dt.el-input { flex: 0 0 auto !important; width: 142px !important; max-width: none !important; }
@media (max-width:1024px){
  .card .toolbar .biz-scope { width: 118px !important; }
  .card .toolbar .team-scope { width: 108px !important; }
  .card .toolbar .team-dt.el-input { width: 134px !important; }
  .card .toolbar .team-range { display: none; }
}

/* R730：财务「两馆合并 · 按人发放」工具行里的提交状态 / 待发统计。
   ⚠️ 通用规则 第 467 行 `.toolbar .grow, .toolbar .muted { display: none; }` 会把它藏掉（手机上只剩标题＋按钮）
   ⇒ 这两处**不能用 class="muted"**，用 .mg-note；手机端各自独占一行，别跟标题挤。 */
.mg-note { font-size: 12px; color: #909399; }
@media (max-width:1024px){
  .card .toolbar .mg-note { flex: 1 1 100% !important; line-height: 1.7; }
}
/* R732：消课明细里「另一馆」是异馆（跨馆那条）时标黄 —— 两馆交叉一眼可辨 */
.br-other { color: #e6a23c; font-weight: 600; }

/* R733：跨馆两向 —— 一屏两块（上＝对方馆课包在本馆消课；下＝本馆课包在别馆上课），各一张表各带合计 */
.cross-blk { margin-bottom: 18px; }
.cross-blk:last-child { margin-bottom: 0; }
.cross-hd { display: flex; flex-wrap: wrap; gap: 2px 10px; align-items: baseline; margin-bottom: 6px; font-size: 13px; }
.cross-tt { font-weight: 600; color: #303133; }
.cross-n { color: #e6a23c; }
@media (max-width:1024px){ .cross-blk { margin-bottom: 14px; } }

/* ===== R758：工资核算 · 行首展开「应发明细」 =====
   桌面主表收成 8 列汇总，细项（含原缺列的「购课提成」）搬进行展开。
   金额一字未改，仍是原来的字段值。 */
.sal-exp { padding: 4px 10px 8px 10px; }
.sal-exp-h { font-size: 12px; color: #5c6370; margin-bottom: 6px; }
.sal-exp-h .muted { font-size: 11px; color: #a8abb2; }
.sal-exp-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 2px 18px; }
.sal-exp-it { display: flex; align-items: baseline; gap: 6px; font-size: 12px; border-bottom: 1px dashed #eef2f7; padding: 3px 0; min-width: 0; }
.sal-exp-it.is-sum { border-bottom-color: #dbe6f5; }
.sal-exp-k { color: #5c6370; flex: none; }
.sal-exp-v { margin-left: auto; font-variant-numeric: tabular-nums; white-space: nowrap; }
.sal-exp-v.orange { color: #e6a23c; font-weight: 700; }
.sal-exp-v.green { color: #67c23a; font-weight: 700; }
.sal-exp-v.red { color: #f56c6c; }
.sal-exp-n { flex: none; font-size: 10px; color: #a8abb2; }
@media (max-width:1400px){ .sal-exp-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

/* ============================================================
   R763（馆方 2026-10-07 拍板）两个显示问题，全站一次收口
   ------------------------------------------------------------
   ①「注释占行」：说明 ⓘ 不再自己占一行。
      做法＝把 ⓘ 搬进它说明的那一行（标题行 / 标签行 / 页签行行尾），
      代码见 scripts/fix_r763_hint_rows.py（文字一字未改，只换位置）。
      这里只管一件事：长标题里并进 ⓘ 之后，给 ⓘ 让出位置，
      否则标题把整行占满、ⓘ 又被顶到下一行（384px 实测就是差这十几像素）。
   ②「按钮/页签太大、有用信息挤在一起」：全站按钮统一收小一档
      桌面 38 → 32（回到 Element 标准档）、手机 42 → 36；字号 14 → 13；
      页签 / 分段按钮内边距各收一档（手机 13px → 9px）。
      尺寸一律走 CSS，不写 size="small"（守 R106 铁律）。
   ============================================================ */
.page-title:has(> .hint-link) { padding-right: 20px; }
.page-title > .hint-link { vertical-align: middle; }

.el-button { min-height: 32px; font-size: 13px; }
.el-button--small { min-height: 28px; }

@media (max-width: 1024px) {
  .el-button,
  .card .el-button,
  .att-mbtn .el-button, .att-today-row .el-button,
  .tb-mbtn .el-button,
  .row-card .rc-btns .el-button,
  .cls-mbtn .el-button, .bk-mbtn .el-button,
  .toolbar .el-button, .card > .flex .el-button,
  .el-dialog__footer .el-button, .el-message-box__btns .el-button { min-height: 36px; }
  .card .el-button, .toolbar .el-button, .el-dialog__footer .el-button,
  .el-message-box__btns .el-button { font-size: 13px; }
  .el-radio-button__inner { padding: 9px 10px; }
  .hub-pg .el-radio-group .el-radio-button__inner { padding: 9px 8px; }
  .el-tabs__item { height: 36px; line-height: 36px; font-size: 13px; }
}

/* ===== R777（馆方 2026-10-10：「小屏手机点进『拉人』就放大页面、很难操作」）=====
   根因**不是**拉人页撑爆（实测 360/375 横向溢出 0px，弹窗是好的）——
   是 **iOS Safari 的固定行为**：聚焦**字号小于 16px** 的输入框时，自动把整页放大，
   而且失焦**不缩回**。全站输入框实测 13–14px（拉人页「搜索姓名/家长电话」框、日期框都是 14px），
   而拉人弹窗 R601 起不预列名单、**必须先点搜索框**才出人 ⇒ 教练一进去点搜索就被放大。

   这里只把 **手机/平板(≤1024px) 会弹键盘的输入框**提到 16px —— 字号够 16 了 iOS 就不再自动放大；
   桌面端一个字不动；readonly（只读日期格）不动；下拉框外壳与固定宽度的格子不受影响。

   ⚠️ 全站对拍实测（24 个页面 × 375/1024 两档 = 60 组合，改前/改后逐条比对）：
      横向溢出一律 0px、页面高度不变、无文字被挤 —— 与改前完全一致。 */
@media (max-width: 1024px) {
  .el-input__inner:not([readonly]),
  .el-textarea__inner,
  .el-select__input { font-size: 16px !important; }

  /* 收尾：16px 的「2026-10-10」需要 ≈84px，而日期框里被日历图标占掉一截 ⇒
     财务/前台「收银台 · 收支表」那对齐的两个日期框（实测框 123px、文字区只有 79px）
     末尾会被切 3px。把日期框内边距收窄一点补回来 —— **外框尺寸一点不动**，
     所以不会顶出新换行/新横向滚动；其余控件不受影响。 */
  .el-date-editor .el-input__wrapper { padding-left: 6px; padding-right: 6px; }

  /* ⚠️ 漏网补丁：学员管理页的搜索栏早先被**单独压到 13px**（`.card .stu-bar .el-input__inner`，
     选择器比我上面那条更重、同带 !important ⇒ 上面盖不住它）。那是全站**最常点**的搜索框，
     不补这条 iOS 照样一聚焦就放大。写在同一段里、**排在它后面**，同权重靠后者胜。 */
  .card .stu-bar .el-input__inner { font-size: 16px !important; }
}

/* R779（2026-10-10 馆方「订场单每条要加个日期」）：手机端订场单每条第一格里多一行日期（MM-DD）。
   往上一行就是「8B」，往下一行是「20:30–22:30」，日期夹在中间 —— 跨日期看列表时一眼认出是哪天。
   ⚠️ 只加**一行 12px 灰字**：栅格四列宽度（88px / 1fr / 86px / 56px）一个字都不动，
      所以不会顶出横向滚动、也不会把「客户 / 金额 / 状态」三列挤窄。桌面端那格同样只多一行灰字，
      表格总宽仍 992px（1280 屏刚好装下，实测不变）。 */
.bk-tbl .bt1 i.bk-dt { color: #5a6b7d; font-weight: 600; }
