/* =============================================================
   桌面端（Web）视觉层：严格对齐微信官方站点设计语言
   参考：mp.weixin.qq.com / developers.weixin.qq.com
   -------------------------------------------------------------
   微信官方站点视觉特征（本文件按此实现）：
   · 主色：微信绿 #07c160；链接色：微信蓝灰 #576b95
   · 页面底色：#f7f7f7；卡片/面板：纯白 + 1px #e7e7eb 边框 + 8px 圆角
   · 无渐变、无玻璃拟态、无位移悬浮动效（扁平、克制）
   · 文字：#191919 / #888888 / #b2b2b2 三级
   · 表格：表头 #f7f7f7，行分隔线 #ededed
   · 圆角：小件 4px，卡片 8px；按钮高 40px
   本文件只在桌面端加载（移动端走 WeUI），且不改变任何布局结构。
   ============================================================= */

:root {
  --wx-green: #07c160;
  --wx-green-d: #06ad56;
  --wx-green-soft: #e8f8ee;
  --wx-link: #576b95;
  --wx-text: #191919;
  --wx-text-2: #888888;
  --wx-text-3: #b2b2b2;
  --wx-line: #e7e7eb;
  --wx-line-2: #ededed;
  --wx-bg: #f7f7f7;
  --wx-white: #fff;
  --wx-radius: 8px;
  --wx-radius-sm: 4px;
}

/* ---------- 全局 ---------- */
/* ⚠️ 必须显式覆盖 app.css 的这三条 body 全局规则，否则桌面端会错位：
   app.css: body{padding:1.3rem}                     → 整页被内缩 21px，导航不贴边、卡片错位
   app.css: body{overflow-x:hidden!important}        → 会让 position:sticky 的导航失效（滚动容器被改）
   app.css: body{background-image:三层蓝色渐变}        → 已由下面的 background 覆盖
   app.css 是 Tailwind 产物且后于本文件之前的加载顺序无关（本文件最后加载），
   因此这三条都要在这里显式声明回正常值。 */
body {
  margin: 0;
  padding: 0;
  background: var(--wx-bg);
  background-image: none;
  color: var(--wx-text);
  font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}
/* overflow-x 交给 html（保留防横向滚动），body 上不设，避免 sticky 失效 */
html { overflow-x: hidden; }
body { overflow-x: visible !important; }
a { color: var(--wx-link); text-decoration: none; }
a:hover { color: var(--wx-green); }
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { color: var(--wx-text); font-weight: 600; }
hr { border: 0; border-top: 1px solid var(--wx-line); margin: 1rem 0; }
.text-muted { color: var(--wx-text-2) !important; }
.small, small { font-size: 12px; }

/* ---------- 顶部导航（白底 + 底部细线，去玻璃拟态） ---------- */
.navbar,
.navbar.navbar-dark,
.navbar.bg-primary {
  background: var(--wx-white) !important;
  background-image: none !important;
  color: var(--wx-text) !important;
  border-bottom: 1px solid var(--wx-line) !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  padding: .55rem 0;
}
.navbar-brand { color: var(--wx-text) !important; font-weight: 600; font-size: 16px; }
.navbar-brand span[aria-hidden] { background: var(--wx-green) !important; box-shadow: none !important; }
.navbar .nav-link,
.navbar-nav .nav-link { color: #4b4b4b !important; font-size: 14px; border-radius: var(--wx-radius-sm); padding: .35rem .7rem !important; }
.navbar-nav .nav-link:hover { color: var(--wx-green) !important; background: var(--wx-green-soft) !important; }
.navbar-toggler-icon {
  background-image: linear-gradient(#4b4b4b 0 2px, transparent 2px 5px, #4b4b4b 5px 7px, transparent 7px 10px, #4b4b4b 10px 12px) !important;
}
.navbar .dropdown-item { color: var(--wx-text) !important; font-size: 14px; }
.navbar .dropdown-item:hover { color: var(--wx-green) !important; background: var(--wx-green-soft) !important; }
.dropdown-menu { border: 1px solid var(--wx-line); border-radius: var(--wx-radius); box-shadow: 0 4px 16px rgba(0, 0, 0, .06); padding: .25rem; }
.nav-wrap { gap: .1rem .35rem; }

/* ---------- 卡片 / 面板：WeUI 语言「通栏白底 + 0.5px 细线」 ----------
   ⚠️ 全站 37 个页面用 .card 承载区块，这里只做「视觉换语言」，不改任何 HTML 结构：
      去掉边框 / 圆角 / 阴影 → 通栏白底 + 细线，与首页 .weui-panel 同一套数值口径：
        · 内容文字左右 32px / 上下 16px → .card 自身 padding: 16px 32px
        · 主标题（card-header）上下 16px，底部 0.5px 细线（左右内缩 32px）
        · 内容行距 8px              → .card-body > * + * { margin-top: 8px }（margin 折叠兜底）
        · 区块之间 16px             → .card { margin-bottom: 16px }
      ⚠️ .card-header / .card-footer 不再用负 margin：它们的宽度就是卡片内容宽
         （卡宽 − 64px），所以底部/顶部那条 1px 细线天然左右各内缩 32px = 与文字左缘对齐。 */
.card {
  background: var(--wx-white) !important;
  background-image: none !important;
  border: 0 !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  transition: none !important;
  padding: 16px 32px;
  margin: 0 0 16px;
  max-width: 100%;
}
.card:hover { transform: none !important; box-shadow: none !important; }
.card:last-child { margin-bottom: 0; }

/* 同元素双类 <div class="card card-body">：父级 padding 已给 32px，不再叠加 */
.card.card-body { padding: 16px 32px; }
/* 有 card-body 时，内边距交给父级 → 内容区不再二次内缩 */
.card-body { padding: 0; }
.card > .card-body { padding: 0; }

/* 主标题：上下 32px + 底部 0.5px 细线（对应首页 .weui-panel__hd） */
.card > .card-header,
.card-header {
  margin: 0 0 16px;
  padding: 0 0 16px;
  background: var(--wx-white);
  border: 0;
  border-bottom: .5px solid var(--wx-line);
  border-radius: 0;
  font-size: 14px;
  font-weight: 400;
  color: var(--wx-text-2);
}
.card > .card-header { margin: 0 0 16px; padding: 0 0 16px; }

.card > .card-footer,
.card-footer {
  background: var(--wx-white);
  border: 0;
  border-top: .5px solid var(--wx-line);
  border-radius: 0;
  padding: 16px 0 0;
  margin: 16px 0 0;
}
.card > .card-footer { margin: 16px 0 0; padding: 16px 0 0; }

/* 内容行距 12px（与首页 media-box / badge 的 margin-top:12px 同口径） */
.card > .card-body > * + *,
.card.card-body > * + * { margin-top: 8px; }

/* 表格类内容保持通栏：单元格自带内边距，与 WeUI 列表一致，不再叠 32px */
.card > .table-responsive { margin: 0 -32px; }

.list-group-item { border-color: var(--wx-line-2); padding: 8px 0; background: transparent; }


/* ---------- 按钮（扁平、无阴影、无动效） ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .35rem;
  min-height: 40px;
  padding: .45rem .95rem;
  font-size: 14px;
  font-weight: 400;
  line-height: 1.4;
  border-radius: var(--wx-radius-sm);
  border: 1px solid transparent;
  box-shadow: none !important;
  transition: none !important;
  cursor: pointer;
}
.btn:hover, .btn:active { transform: none !important; box-shadow: none !important; }
.btn-sm { min-height: 32px; padding: .28rem .7rem; font-size: 13px; }
.btn-lg { min-height: 46px; padding: .6rem 1.2rem; font-size: 16px; }
.btn-primary { background: var(--wx-green) !important; border-color: var(--wx-green) !important; color: #fff !important; }
.btn-primary:hover { background: var(--wx-green-d) !important; border-color: var(--wx-green-d) !important; }
.btn-outline-primary { background: #fff !important; border-color: var(--wx-green) !important; color: var(--wx-green) !important; }
.btn-outline-primary:hover { background: var(--wx-green-soft) !important; }
.btn-secondary, .btn-light { background: #f2f2f2 !important; border-color: #f2f2f2 !important; color: var(--wx-text) !important; }
.btn-secondary:hover, .btn-light:hover { background: #e9e9e9 !important; }
.btn-outline-secondary { background: #fff !important; border-color: #d9d9d9 !important; color: var(--wx-text) !important; }
.btn-outline-secondary:hover { background: #f7f7f7 !important; }
.btn-danger { background: #fa5151 !important; border-color: #fa5151 !important; color: #fff !important; }
.btn-outline-danger { background: #fff !important; border-color: #fa5151 !important; color: #fa5151 !important; }
.btn-warning { background: #ffc300 !important; border-color: #ffc300 !important; color: #191919 !important; }
.btn-info { background: #10aeff !important; border-color: #10aeff !important; color: #fff !important; }
.btn-success { background: var(--wx-green) !important; border-color: var(--wx-green) !important; color: #fff !important; }
.btn-link { color: var(--wx-link) !important; min-height: auto; padding: .2rem .35rem; }
.btn-link:hover { color: var(--wx-green) !important; }
.btn:disabled, .btn.disabled { opacity: .5; }

/* ---------- 表单 ---------- */
.form-control, .form-select {
  min-height: 40px;
  padding: .45rem .75rem;
  font-size: 14px;
  color: var(--wx-text);
  background: #fff;
  border: 1px solid #d9d9d9;
  border-radius: var(--wx-radius-sm);
  box-shadow: none !important;
  transition: border-color .15s;
}
.form-control:focus, .form-select:focus { border-color: var(--wx-green); background: #fff; }
.form-control::placeholder { color: var(--wx-text-3); }
.form-control-sm { min-height: 32px; font-size: 13px; padding: .3rem .6rem; }
.form-label { font-size: 14px; color: var(--wx-text); margin-bottom: .35rem; }
.form-text { font-size: 12px; color: var(--wx-text-2); }
.input-group-text { background: #f7f7f7; border: 1px solid #d9d9d9; color: var(--wx-text-2); font-size: 14px; }
.form-check-input:checked { background-color: var(--wx-green); border-color: var(--wx-green); }

/* ---------- 表格（微信后台风格） ---------- */
.table { background: #fff; font-size: 14px; }
.table > :not(caption) > * > * { padding: .6rem .75rem; border-bottom: 1px solid var(--wx-line-2); }
.table thead th, .table > thead > tr > th {
  background: #f7f7f7 !important;
  color: #4b4b4b !important;
  font-weight: 600;
  white-space: nowrap;
  border-bottom: 1px solid var(--wx-line) !important;
}
.table-hover > tbody > tr:hover > * { background: #fafafa !important; }
.table-striped > tbody > tr:nth-of-type(odd) > * { background: #fcfcfc; }

/* ---------- 提示条 ---------- */
.alert {
  position: relative;
  padding: 16px 32px;
  margin-bottom: 1rem;
  font-size: 14px;
  line-height: 1.6;
  border-radius: var(--wx-radius-sm);
  border: 1px solid transparent;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
.alert-success { background: #e8f8ee !important; border-color: #b7ebd2 !important; color: #06ad56 !important; }
.alert-danger { background: #fdecec !important; border-color: #f9c9c9 !important; color: #c22c2c !important; }
.alert-warning { background: #fff9e6 !important; border-color: #ffe9a8 !important; color: #9a6b00 !important; }
.alert-info { background: #eaf6fe !important; border-color: #c3e6fb !important; color: #0d7dc4 !important; }
.alert-secondary { background: #f7f7f7 !important; border-color: var(--wx-line) !important; color: #4b4b4b !important; }
.alert-link { font-weight: 600; }

/* ---------- 徽章 ---------- */
.badge {
  display: inline-block;
  padding: .22em .55em;
  font-size: 12px;
  font-weight: 400;
  line-height: 1.5;
  border-radius: var(--wx-radius-sm);
  white-space: nowrap;
}
.badge.bg-primary { background: var(--wx-green-soft) !important; color: var(--wx-green-d) !important; }
.badge.bg-success { background: var(--wx-green-soft) !important; color: var(--wx-green-d) !important; }
.badge.bg-warning { background: #fff9e6 !important; color: #9a6b00 !important; }
.badge.bg-danger { background: #fdecec !important; color: #c22c2c !important; }
.badge.bg-info { background: #eaf6fe !important; color: #0d7dc4 !important; }
.badge.bg-secondary, .badge.bg-light { background: #f2f2f2 !important; color: #4b4b4b !important; }

/* ---------- 分页 ---------- */
.page-link { color: var(--wx-link); border-color: var(--wx-line); padding: .35rem .65rem; font-size: 14px; }
.page-link:hover { color: var(--wx-green); background: #fafafa; }
.page-item.active .page-link { background: var(--wx-green); border-color: var(--wx-green); color: #fff; }
.page-item.disabled .page-link { color: var(--wx-text-3); }

/* ---------- 其他小件 ---------- */
.progress { background: #f2f2f2; border-radius: var(--wx-radius-sm); height: 6px; }
.progress-bar { background: var(--wx-green); }
.modal-content { border: 0; border-radius: var(--wx-radius); box-shadow: 0 8px 32px rgba(0, 0, 0, .12); }
.modal-header, .modal-footer { border-color: var(--wx-line); padding: .8rem 1.15rem; }
.modal-title { font-size: 16px; font-weight: 600; }
.dropdown-divider { border-top-color: var(--wx-line); margin: .25rem 0; }
main { padding-bottom: 2.5rem; }
footer { color: var(--wx-text-3) !important; font-size: 12px; border-top: 1px solid var(--wx-line); margin-top: 1.5rem; }
.nav-tabs .nav-link { color: #4b4b4b; border: 0; border-bottom: 2px solid transparent; border-radius: 0; padding: .55rem .9rem; }
.nav-tabs .nav-link.active { color: var(--wx-green); border-bottom-color: var(--wx-green); background: transparent; }

/* =============================================================
   资料页（个人管理）专用：单栏字段布局
   每个字段独占一行，label 左置恒宽；不再使用两栏并排
   ============================================================= */
.wx-section {
  border: 0;
  border-radius: 0;
  background: #fff;
  margin-bottom: 16px;
  overflow: hidden;
}
.wx-section__hd {
  padding: 16px 32px;
  background: #fff;
  border: 0;
  border-bottom: .5px solid var(--wx-line);
  font-size: 14px;
  font-weight: 400;
  color: var(--wx-text-2);
}
.wx-section__bd { padding: 16px 32px; }

.wx-field {
  display: flex;
  align-items: flex-start;
  gap: 1rem;
  padding: 8px 0;
  border-bottom: .5px solid var(--wx-line-2);
}
.wx-field:last-child { border-bottom: 0; }
.wx-field__label {
  flex: 0 0 100px;
  width: 100px;
  padding-top: .55rem;
  font-size: 14px;
  color: #4b4b4b;
  line-height: 1.4;
}
.wx-field__body { flex: 1 1 auto; min-width: 0; }
.wx-field__body > .form-control,
.wx-field__body > .form-select { max-width: 480px; }
.wx-field__body .form-text { max-width: 480px; }
.wx-field__text { padding-top: .5rem; font-size: 14px; color: var(--wx-text); overflow-wrap: anywhere; }
.wx-field--stack .wx-field__label { padding-top: 0; }
.wx-field__hint { font-size: 12px; color: var(--wx-text-2); margin-top: .3rem; }

/* 资料页顶部：头像 + 姓名 + 身份（一行） */
.wx-profile-head {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 16px 32px;
  border-bottom: 1px solid var(--wx-line-2);
  flex-wrap: wrap;
}
.wx-profile-head__meta { min-width: 0; flex: 1 1 240px; }
.wx-profile-head__name { font-size: 18px; font-weight: 600; color: var(--wx-text); line-height: 1.35; }
.wx-profile-head__sub { margin-top: .25rem; font-size: 13px; color: var(--wx-text-2); overflow-wrap: anywhere; }
.wx-profile-head__badges { margin-top: .4rem; display: flex; flex-wrap: wrap; gap: .35rem; align-items: center; }
.wx-actions { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; padding: 0 32px; }

/* =============================================================
   统一搜索选择组件（.lk）：部门 / 岗位 / 设计师
   ============================================================= */
.lk { position: relative; }
.lk-menu {
  position: absolute;
  left: 0;
  right: 0;
  top: calc(100% + 2px);
  z-index: 60;
  background: #fff;
  border: 1px solid var(--wx-line);
  border-radius: var(--wx-radius-sm);
  box-shadow: 0 6px 20px rgba(0, 0, 0, .10);
  max-height: 260px;
  overflow: auto;
  display: none;
}
.lk-item {
  display: block;
  padding: .5rem .75rem;
  color: var(--wx-text);
  text-decoration: none;
  border-bottom: 1px solid #f5f5f5;
}
.lk-item:last-child { border-bottom: 0; }
.lk-item:hover { background: var(--wx-green-soft); }
.lk-item b { display: block; font-weight: 600; font-size: 14px; line-height: 1.35; }
.lk-item span { display: block; margin-top: 2px; color: var(--wx-text-2); font-size: 12px; }
.lk-tip { padding: .5rem .75rem; color: var(--wx-text-2); font-size: 13px; }

/* ---------- 多选（2026-10-23 · 试卷组卷人可多位）----------
   已选项以 chips 呈现（每个 chip 内含一个同名隐藏域，lookup.js 的 data-multi 负责增删） */
.lk-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 6px; }
.lk-chips:empty { display: none; }
.lk-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 4px 2px 10px;
  border-radius: 999px;
  background: var(--wx-green-soft);
  color: var(--wx-text);
  font-size: 13px;
  line-height: 1.7;
}
.lk-chip__x {
  border: 0;
  background: transparent;
  color: var(--wx-text-2);
  font-size: 15px;
  line-height: 1;
  padding: 0 4px;
  cursor: pointer;
}
.lk-chip__x:hover { color: #d33; }

/* ---------- 登录页 · 微信扫码登录 ---------- */
.qr-login { text-align: center; padding: 2px 0 6px; }
.qr-login__box {
  display: inline-block;
  padding: 10px;
  background: #fff;
  border: 1px solid #e7e7eb;
  border-radius: 8px;
  line-height: 0;
}
.qr-login__box img,
.qr-login__box canvas { display: block; }
.qr-login__tip { margin: 8px 0 0; font-size: 13px; color: #888888; }
.qr-login__tip.is-warn { color: #fa5151; }
.qr-login__help { margin: 10px 0 0; font-size: 13px; color: #888888; }
.qr-login__help a { color: var(--wx-link); text-decoration: none; }
.qr-login__help a:hover { text-decoration: underline; }

.auth-sep { margin: 20px 0 16px; border-color: #ededed; }
.auth-more > summary {
  cursor: pointer;
  font-size: 13px;
  color: var(--wx-link);
  text-align: center;
  list-style: none;
  outline: none;
}
.auth-more > summary::-webkit-details-marker { display: none; }
.auth-more > summary::after { content: ' ▾'; }
.auth-more[open] > summary::after { content: ' ▴'; }
.auth-more[open] > summary { margin-bottom: 4px; }

/* ---------- 分享链接（个人页「邀请同事加入」） ---------- */
.wx-share { display: flex; flex-wrap: wrap; gap: 14px; align-items: flex-start; }
.wx-share__qr {
  flex: 0 0 auto;
  padding: 6px;
  background: #fff;
  border: 1px solid #e7e7eb;
  border-radius: 8px;
  line-height: 0;
}
.wx-share__qr img,
.wx-share__qr canvas { display: block; width: 148px; height: 148px; }
/* .wx-share__link 已随「复制链接」改版移除：链接改用 .wx-share__url（textarea），按钮排在文字下方 */

/* 认领页：选中的名字 */
.claim-pick.is-picked {
  background: var(--wx-green);
  border-color: var(--wx-green);
  color: #ffffff;
}

/* ===== 座位票（桌面端基础版）=====
   手机端是拟物「演出票」（weui-fix.css 第 36 节）；桌面端沿用同样的文字层级与配色，
   但不做半圆缺口 / 高光等拟物细节（桌面版式更宽，这些细节反而显得花）。 */
.wx-ticket {
  background: linear-gradient(135deg, #1b3f86 0%, #2f6fe0 100%);
  color: #fff;
  border-radius: 14px;
  margin: 12px 16px;
  padding: 18px;
  box-shadow: 0 14px 30px -16px rgba(27, 63, 134, .65);
  overflow: hidden;
}
.wx-ticket > * { margin: 0; }
.wx-ticket__title { font-size: 12px; font-weight: 600; line-height: 1.4; color: rgba(255, 255, 255, .92); }
.wx-ticket__meta { margin-top: 5px; font-size: 14px; line-height: 1.4; color: rgba(255, 255, 255, .74); }
.wx-ticket__seat {
  margin-top: 8px;
  font-size: 38px;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: .05em;
  color: #fff;
  text-shadow: 0 2px 8px rgba(0, 0, 0, .22);
}
.wx-ticket__gap { height: 12px; }
.wx-ticket__owner { font-size: 13px; line-height: 1.4; color: rgba(255, 255, 255, .84); }
.wx-ticket__dept { margin-top: 6px; font-size: 12px; line-height: 1.4; color: rgba(255, 255, 255, .62); }

/* =============================================================
   补齐：app.css（Tailwind 产物）里仍残留的「旧设计」在本层覆盖
   旧设计包括：玻璃拟态、深蓝遮罩、蓝色系答题选项、深海蓝边框强调。
   微信官网不使用渐变/毛玻璃/位移悬浮动效，统一为扁平克制风格。
   ============================================================= */

/* 玻璃拟态 → 白底细边框（微信官网无此效果） */
.glass-surface {
  background: var(--wx-white) !important;
  border: 1px solid var(--wx-line) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* 全屏加载遮罩：深蓝 + 毛玻璃 → 中性浅遮罩 + 微信绿 spinner */
#loadingOverlay {
  background: rgba(0, 0, 0, .28) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}
#loadingOverlay .spinner-border { color: var(--wx-green) !important; }

/* 答题选项（考试作答页）：去动效；选中态用微信绿 */
.quiz-option {
  border: 1px solid var(--wx-line) !important;
  border-radius: var(--wx-radius-sm) !important;
  background: #fff;
  transition: none !important;
}
.quiz-option:hover { background: #fafafa !important; transform: none !important; }
.quiz-option.selected {
  border-color: var(--wx-green) !important;
  background: var(--wx-green-soft) !important;
  box-shadow: none !important;
}

/* 边框强调色：深海蓝主题 → 微信语义色 */
.border-primary   { border-color: var(--wx-green) !important; }
.border-success   { border-color: #06ad56 !important; }
.border-danger    { border-color: #fa5151 !important; }
.border-warning   { border-color: #fa9d3b !important; }
.border-info      { border-color: #10aeff !important; }
.border-secondary { border-color: var(--wx-line) !important; }

/* 其余零星蓝色残留 */
.progress-bar { background-color: var(--wx-green) !important; }

/* =============================================================
   桌面端：WeUI 组件的「微信官网视觉」覆盖（方案 C）
   -------------------------------------------------------------
   首页（dashboard_user）与「我的活动」「注册审批」「微信绑定」等页面是用
   WeUI 组件构建的（weui-panel / weui-grids / weui-media-box / weui-cell …）。
   桌面端现已加载 weui.min.css 让这些组件可见，但 WeUI 默认外观偏移动端
   （通栏块级按钮、10px 外距、系统字号）。本节按微信官网风格统一为：
   白底 + 1px #e7e7eb 边框 + 8px 圆角、无阴影、无位移动效、扁平克制。

   ⚠️ 桌面端不会渲染 weui-tabbar / weui-half-screen-dialog（它们在
      layout.php 的 $isMini 分支内），故无需处理。
   ============================================================= */

/* ---------- 区块：严格按 WeUI 规范（通栏白底 + 上下 1px 细线）----------
   WeUI 的「克制」= **不用边框、不用圆角**，只用：
     · 通栏白底（左右不留边距，内容靠组件内部 padding 撑开）
     · `:before/:after` 的 1px 线（WeUI 自身已用 transform:scaleY(.5) 画成 0.5px）
   之前这里把这些原生细线 `display:none` 掉、又补了 1px 边框 + 8px 圆角，
   属于「卡片化过度」——现按 WeUI 原样恢复。 */
.weui-panel,
.weui-grids,
.weui-cells {
  background: var(--wx-white) !important;
  border: 0 !important;
  border-radius: 0 !important;
  margin: 0 0 1rem !important;
  /* ⚠️ 必须保留 WeUI 的 overflow:hidden —— 九宫格内部是 float 布局，
     一旦改成 visible，父容器会高度塌陷（实测 .weui-grids 高度变 0）。 */
  overflow: hidden;
}
.weui-panel::before, .weui-panel::after { display: block !important; }
.weui-panel__hd {
  padding: 16px 32px;
  background: transparent;
  border-bottom: 0;
  font-size: 14px;
  font-weight: 600;
  color: var(--wx-text);
}
/* 主标题下的 1px 细线：用 WeUI 原生 ::after（自带 scaleY(.5)），
   左右各内缩 32px → 与文字左缘对齐，不贴区块边沿。 */
.weui-panel__hd::after { display: block !important; left: 32px !important; right: 32px !important; }
.weui-panel__bd { padding: 0; }

/* ---------- 媒体盒（头像 + 姓名 + 描述）---------- */
.weui-media-box { padding: 16px 32px; }
/* ⚠️ WeUI 的 .weui-media-box 没有定义 display，而项目里它是 <a> 标签（inline）。
   inline 盒内放块级子元素（h4 / p / span）会形成「匿名块盒」，padding-left 不作用于
   内容起点 —— 实测 title / desc 的 offsetLeft 全为 0、rect.left 与 media-box 相同
   （即内容紧贴左边缘；右侧因行末不越界而看起来正常）。
   这里显式改为块级；.weui-media-box_appmsg（首页头像行）保持 WeUI 的 flex 不变。 */
a.weui-media-box { display: block; }
a.weui-media-box.weui-media-box_appmsg { display: flex; }
/* 列表项之间的分隔线：用 WeUI 原生的 :before（不再禁用） */
.weui-media-box::before { display: block !important; }
/* ⚠️ 但 WeUI 原生还有 `.weui-media-box:first-child:before{display:none}`（**第一项不画上边线**），
   上面那条 !important 会把它压掉 —— 结果是「第一个内容块的上边线」与
   「.weui-panel__hd::after 的下边线」落在同一个像素上，看起来像两根线重叠、发虚。
   这里用「同等 !important + 更高特异性」把 WeUI 的排除规则还原。 */
.weui-media-box:first-child::before { display: none !important; }
.weui-media-box__hd { width: auto; margin-right: 1rem; align-items: center; }
.weui-media-box__title { font-size: 15px; font-weight: 600; color: var(--wx-text); }
.weui-media-box__desc { margin-top: 8px; font-size: 13px; color: var(--wx-text-2); line-height: 1.6; }
.weui-media-box__info { margin-top: 8px; padding-bottom: 0; font-size: 12px; line-height: 1.8; color: var(--wx-text-2); }
.weui-media-box__info__meta { font-size: 12px; color: var(--wx-text-2); }
.weui-media-box__info__meta::after { display: none !important; }

/* ---------- 图标网格（入口九宫格）----------
   通栏白底 + 去边框去圆角 已由上面的区块统一规则处理；
   这里只保留九宫格内部细节与 WeUI 原生的上下细线。 */
.weui-grids::before, .weui-grids::after { display: block !important; }
.weui-grid { padding: 1rem .5rem; background: transparent; }
.weui-grid::before, .weui-grid::after { border-color: var(--wx-line-2) !important; }
.weui-grid:active { background: #fafafa; }
.weui-grid__icon { width: auto; height: auto; margin: 0 auto .4rem; text-align: center; }
.weui-grid__icon svg { display: block; width: 26px; height: 26px; margin: 0 auto; color: var(--wx-green); }
.weui-grid__label { margin-top: 0; font-size: 13px; color: var(--wx-text); }

/* ---------- 单元格列表（通栏白底 + WeUI 原生细线）---------- */
.weui-cells { font-size: 14px; }
.weui-cells::before, .weui-cells::after { display: block !important; }
.weui-cell { padding: 16px; font-size: 14px; }
.weui-cell::before { border-top-color: var(--wx-line-2); }
/* 同理：.weui-cells 容器自己已有上边线时，第一个 cell 不再画，避免叠成双线 */
.weui-cell:first-child::before { display: none !important; }
.weui-cell__desc { margin-top: .2rem; font-size: 12px; color: var(--wx-text-2); line-height: 1.7; }
.weui-cells__title { padding: 16px 16px 8px; font-size: 13px; color: var(--wx-text-2); }
.weui-cells__tips { padding: 8px 16px 16px; font-size: 12px; color: var(--wx-text-2); line-height: 1.7; }

/* ---------- 按钮（WeUI 默认是通栏块级，桌面端改为行内）---------- */
.weui-btn { min-height: 40px; padding: .45rem .95rem; font-size: 14px; font-weight: 400; border-radius: var(--wx-radius-sm); box-shadow: none; }
.weui-btn_primary { background: var(--wx-green) !important; color: #fff !important; }
.weui-btn_primary:active { background: var(--wx-green-d) !important; }
.weui-btn_default { background: #f7f7f7 !important; color: var(--wx-text) !important; border: 1px solid var(--wx-line); }
.weui-btn_default:active { background: #f0f0f0 !important; }
.weui-btn_warn { background: #fa5151 !important; color: #fff !important; }
.weui-btn_warn:active { background: #e04848 !important; }
.weui-btn_success { background: var(--wx-green) !important; color: #fff !important; }
/* block 按钮必须真的铺满（2026-09-18 实测踩坑）：
   WeUI 的 .weui-btn_block 只写 width:auto —— `<a>` 会铺满，但 **`<button>` 的 width:auto 是"收缩到内容宽度"**
   （实测点名页 <button> 只有 104px，而 <a> 是 936px）⇒ 这里显式 width:100%。 */
.weui-btn_block { display: block; width: 100%; }
/* 按钮行（2026-09-18）：与手机端同口径 —— WeUI 标准按钮宽 184px，仅补「不收缩 / 不换行 / 无外边距」 */
.wx-btnbar { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
.wx-btnbar > .weui-btn { flex: 0 0 auto; margin: 0; white-space: nowrap; }
.weui-btn_mini { min-height: 30px; padding: .25rem .7rem; font-size: 13px; }
.weui-btn_area, .weui-btn-area { margin: 0 0 1rem; }

/* ---------- 徽章 ---------- */
.weui-badge { padding: .2em .5em; font-size: 12px; border-radius: var(--wx-radius-sm); }

/* ---------- 表单控件 ---------- */
.weui-input, .weui-textarea { font-size: 14px; color: var(--wx-text); background: transparent; }
.weui-label { width: auto; min-width: 4.5em; margin-right: .75rem; font-size: 14px; color: var(--wx-text); }

/* ---------- 勾选行 ---------- */
.weui-check__label:active { background: #fafafa; }

/* ---------- 消息页（提示/空状态）---------- */
.weui-msg { padding: 16px 32px; }
.weui-msg__title { font-size: 20px; font-weight: 600; color: var(--wx-text); }
.weui-msg__desc { font-size: 14px; color: var(--wx-text-2); line-height: 1.7; }

/* ---------- 加载提示 ---------- */
.weui-loadmore { width: auto; margin: 1rem auto; }
.weui-loadmore__tips { font-size: 13px; color: var(--wx-text-2); }

/* ---------- WeUI 区块内边距兜底（与 weui-fix.css 第 32 节对应）----------
   实测首页的「我的活动」「我的讲师行程」区块标题会贴到左右边缘，
   说明有上游规则把 padding 清零。这里显式声明并加 !important。
   ⚠️ 数值按「区块内间距规范」：文字左右各 32px、主标题上下各 16px。 */
.weui-panel__hd { padding: 16px 32px !important; }
.weui-media-box { padding: 16px 32px !important; }
.weui-cell { padding: 8px 32px !important; }
.weui-cells__title { padding: 16px 16px 8px !important; }
.weui-cells__tips { padding: 8px 16px 16px !important; }
.weui-panel__hd .weui-cell__ft { margin-left: .5rem; }

/* ---------- 通用间距工具类（与 weui-fix.css 第 34 节对应）----------
   这些类替代了原先散落在视图里的内联 style（如 padding:12px 16px）。
   手机端取 12px 紧凑值；桌面端保持 rem 比例（1rem = 16px）。 */
.wx-pad-x { padding-left: 1rem; padding-right: 1rem; }
.wx-opr-flat { display: flex; flex-wrap: wrap; gap: .5rem; padding: 16px 32px; }
.wx-center-y { text-align: center; padding: 1rem 0; }

/* ---------- 我的资料页：头像点击更换 + 区块折叠（与 weui-fix.css 第 35 节对应）---------- */

/* 头像可点击更换（原先是一个独立的「头像」上传行，已移除） */
.wx-avatar-pick {
  position: relative;
  display: block;
  padding: 0;
  margin: 0;
  border: 0;
  background: none;
  border-radius: 6px;   /* 与 .wx-avatar-hd > * 的圆角一致（方形圆角，非圆形） */
  cursor: pointer;
  line-height: 0;
}
.wx-avatar-pick::after {
  content: '换';
  position: absolute;
  right: -2px;
  bottom: -2px;
  width: 18px;
  height: 18px;
  line-height: 18px;
  font-size: 11px;
  text-align: center;
  color: #fff;
  background: var(--wx-green);
  border: 2px solid #fff;
  border-radius: 50%;
}
/* 隐藏原生 file 控件（改由点击头像触发） */
.wx-avatar-input { display: none; }

/* 「邀请同事加入」默认折叠：用原生 <details>，无需 JS */
.wx-section--fold > summary.wx-section__hd {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .5rem;
  cursor: pointer;
  list-style: none;
}
.wx-section--fold > summary.wx-section__hd::-webkit-details-marker { display: none; }
/* 「展开 / 收起」+ 方向箭头（与 weui-fix.css 第 35 节对应；移动端另有覆盖） */
.wx-fold__t { flex: 1 1 auto; min-width: 0; }
/* 折叠标题：上下内边距相等 16px（桌面端同样保持均衡） */
.wx-section--fold > summary.wx-section__hd { padding: 16px 32px; }
.wx-fold__act {
  flex: none;
  display: inline-flex;
  align-items: center;
  gap: 8px;                /* 「展开 / 收起」与箭头间距 8px */
  font-size: 12px;
  font-weight: 400;
  line-height: 1;
  color: var(--wx-link);
}
.wx-fold__txt::after { content: '展开'; }
.wx-section--fold[open] .wx-fold__txt::after { content: '收起'; }
/* 箭头：CSS 细 chevron，折叠↓ / 展开↑（同 weui-fix.css 第 35 节，勿改成 <svg>）
   含光学居中补偿（v 形偏低 2.3px / ^ 形偏高 2.3px） */
.wx-fold__ic {
  display: block;
  flex: none;
  width: 7px;
  height: 7px;
  border-right: 1.5px solid currentColor;
  border-bottom: 1.5px solid currentColor;
  transform: translateY(-2px) rotate(45deg);
  transition: transform .2s ease;
}
.wx-section--fold[open] .wx-fold__ic { transform: translateY(2px) rotate(-135deg); }

/* ---------- 标签（微信「编辑标签」配色，与 weui-fix.css 第 38 节对应） ----------
   未选中：浅灰底灰字；选中：浅绿底绿字。桌面端 .wx-tagbar 用于培训列表的分类筛选。 */
.wx-tagbar {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  padding: 16px 32px;
  margin-bottom: 16px;
  background: #fff;
  border: 0;
  border-bottom: .5px solid var(--wx-line);
}
.wx-tag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 10px;
  border-radius: 4px;
  background: #f2f2f2;
  color: #7f7f7f;
  font-size: 13px;
  line-height: 1.4;
  white-space: nowrap;
  text-decoration: none;
}
.wx-tag:hover { background: #ebebeb; color: #7f7f7f; }
.wx-tag.is-on,
.wx-tag.is-on:hover { background: #e6f7ec; color: #07c160; }

/* ---------- 表单标题行（与 weui-fix.css 第 37 节对应） ----------
   「＋ 添加时段 / ＋ 添加课程」按钮：标题靠左、按钮靠右，按钮不折行 */
.wx-form-hd {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .5rem;
  margin-bottom: .5rem;
}
.wx-form-hd .form-label { flex: 1 1 auto; min-width: 0; margin-bottom: 0; }
.wx-form-hd .btn { flex: none; margin-left: auto; white-space: nowrap; }

/* ---------- 我的资料页首块（微信「我」样式，与 weui-fix.css 第 39 节对应） ---------- */
.wx-me {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1rem;
  margin-bottom: 1rem;
  background: #fff;
  border: 1px solid var(--wx-line);
  border-radius: var(--wx-radius);
}
.wx-me__avatar { flex: none; width: 4rem; height: 4rem; }
.wx-me__avatar > * { width: 100%; height: 100%; }
.wx-me__meta { flex: 1 1 auto; min-width: 0; }
.wx-me__name { font-size: 18px; font-weight: 600; color: var(--wx-text); line-height: 1.35; overflow-wrap: anywhere; }
.wx-me__sub { margin-top: .25rem; font-size: 13px; color: var(--wx-text-2); overflow-wrap: anywhere; }
.wx-me__tags { margin-top: .4rem; display: flex; flex-wrap: wrap; gap: .35rem; align-items: center; }

/* ---------- 「添加与会人员」面板（与 weui-fix.css 第 40 节对应） ---------- */
.ra-results { max-height: 360px; overflow: auto; }

/* ---------- 可编辑字段（与 weui-fix.css 第 41 节对应） ----------
   桌面端直接用原生输入框编辑，不显示手机端的「值 + 右箭头」展示层。 */
.wx-edit__view { display: none; }

/* ---------- 区块空态（与 weui-fix.css 第 39 节对应） ---------- */
.wx-section__empty { padding: 16px 32px; text-align: center; font-size: 14px; color: var(--wx-text-2); }

/* ---------- 分享链接（DOM 已改为 textarea + 下方按钮；桌面端排在二维码右侧） ---------- */
.wx-share__url {
  flex: 1 1 260px;
  min-width: 0;
  font-size: 12px;
  line-height: 1.5;
  resize: vertical;
  text-align: center;          /* 分享链接文字居中（与 weui-fix.css 第 42 节对应） */
}

/* ---------- 我的活动：签到情况（与 weui-fix.css 第 43 节对应） ---------- */
.wx-subfold { border-top: 1px solid var(--wx-line-2); }
.wx-subfold > summary.wx-subfold__hd {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  padding: 1rem; cursor: pointer; list-style: none;
  font-size: 14px; color: var(--wx-text);
}
.wx-subfold > summary.wx-subfold__hd::-webkit-details-marker { display: none; }
.wx-subfold__bd { padding: 0 1rem 1rem; }

.wx-sign-me { margin-bottom: .75rem; }
.wx-sign-me__row { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-bottom: .5rem; }
.wx-sign-me__tip { font-size: 12px; color: var(--wx-text-2); }
.wx-sign-me__tip.is-warn { color: #fa5151; }

.wx-slot-tabs { display: flex; flex-wrap: wrap; gap: .5rem; margin-bottom: .75rem; }
.wx-slot-tab {
  padding: 4px 10px; border-radius: 4px;
  background: #f2f2f2; color: #7f7f7f; font-size: 13px; text-decoration: none;
}
.wx-slot-tab.is-on, .wx-slot-tab.is-on:hover { background: #e6f7ec; color: #07c160; }

.wx-course-sign { padding: 1rem; border-top: 1px solid var(--wx-line-2); }
.wx-course-sign:first-of-type { border-top: 0; }
.wx-course-sign__title { margin: 0; font-size: 16px; font-weight: 600; color: var(--wx-text); }
.wx-course-sign__sub { margin: .25rem 0 .75rem; font-size: 13px; color: var(--wx-text-2); }

.wx-sign-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: .5rem; margin-top: .5rem; }
/* ⚠️ 2026-09-18 实测踩坑：格子元素是 `<button>`，Chrome 下 button 作为 grid item **不会自动 stretch**
   （width:auto 解析成内容宽，实测 244px 的网格单元里只有 52px）⇒ 显式 width:100%。
   用**后代选择器**（不是 `>`）：若将来又给格子套了 wrapper，这条仍能命中。 */
.wx-sign-grid .wx-sign-cell { width: 100%; }
.wx-sign-cell {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  min-height: 52px; padding: 6px 4px;
  border: 1px solid var(--wx-line-2); border-radius: 8px;
  background: #fff; color: var(--wx-text);
  font-size: 14px; line-height: 1.25; text-align: center; overflow-wrap: anywhere;
}
.wx-sign-cell__s { font-size: 11px; color: var(--wx-text-2); }
/* 岗位行（2026-10-14 业务方要求）：夹在「姓名」与「状态」之间，字号与状态行一致（11px）、50% 灰
   （--wx-text-2 = #888888）；⚠️ 实色底两态（n4 绿 / n5 红）与状态行同口径转白，与手机端同一口径 */
.wx-sign-cell__p { font-size: 11px; color: var(--wx-text-2); }
.wx-sign-cell.is-me { border-color: rgba(7, 193, 96, .55); font-weight: 600; }
/* ---- 签到格配色（2026-09-18 统一 n1~n6，与手机端 weui-fix.css 第 43 节同口径）---- */
/* n1 未签到：灰框白底 + 黑字姓名 + 灰字「未签到」 */
.wx-sign-cell.is-todo { background: #ffffff; border-color: #d9d9d9; }
.wx-sign-cell.is-todo .wx-sign-cell__n { color: var(--wx-text); }
.wx-sign-cell.is-todo .wx-sign-cell__s { color: var(--wx-text-2); }
/* n6 已过时间未签到 / n7 请假（`status='leave'` 也映射到本类）：浅灰底 + 蓝灰字（#618ea5，2026-09-23 业务方指定） */
.wx-sign-cell.is-overdue { background: #f2f2f2; border-color: #e5e5e5; }
.wx-sign-cell.is-overdue .wx-sign-cell__n { color: #618ea5; }
.wx-sign-cell.is-overdue .wx-sign-cell__s { color: #618ea5; }
/* n2 已签到未确认（按时）：浅黄底 + 黑字姓名 + 灰字签到时间 */
.wx-sign-cell.is-pending { background: #fff7e6; border-color: #ffe0a3; }
.wx-sign-cell.is-pending .wx-sign-cell__n { color: var(--wx-text); }
.wx-sign-cell.is-pending .wx-sign-cell__s { color: var(--wx-text-2); }
/* n3 已签到未确认（迟到）：浅黄底 + 红字姓名 + 红字签到时间 */
.wx-sign-cell.is-pending-late { background: #fff7e6; border-color: #ffe0a3; }
.wx-sign-cell.is-pending-late .wx-sign-cell__n { color: #fa5151; }
.wx-sign-cell.is-pending-late .wx-sign-cell__s { color: #fa5151; }
/* n4 已签到已确认（按时）：绿底 + 白字 */
.wx-sign-cell.is-done { background: #07c160; border-color: #07c160; }
.wx-sign-cell.is-done .wx-sign-cell__n { color: #ffffff; }
.wx-sign-cell.is-done .wx-sign-cell__s { color: #ffffff; }
.wx-sign-cell.is-done .wx-sign-cell__p { color: #ffffff; }
/* n5 已签到已确认（迟到）：红底 + 白字 */
.wx-sign-cell.is-late { background: #fa5151; border-color: #fa5151; }
.wx-sign-cell.is-late .wx-sign-cell__n { color: #ffffff; }
.wx-sign-cell.is-late .wx-sign-cell__s { color: #ffffff; }
.wx-sign-cell.is-late .wx-sign-cell__p { color: #ffffff; }
.wx-sign-cell[disabled] { cursor: default; opacity: .9; }
/* 考勤人徽章（2026-09-18）：格子右上角小胶囊 —— 与手机端 weui-fix 第 43 节同口径 */
.wx-sign-cell { position: relative; }
.wx-sign-cell__badge {
  position: absolute; top: 2px; right: 2px;
  padding: 0 4px; border-radius: 6px;
  font-size: 9px; line-height: 14px; font-weight: 400;
  background: rgba(25, 25, 25, .06); color: var(--wx-text-2);
}
.wx-sign-cell.is-done .wx-sign-cell__badge,
.wx-sign-cell.is-late .wx-sign-cell__badge { background: rgba(255, 255, 255, .28); color: #ffffff; }

/* 面板标题右侧的次要信息 /「全部」链接（替代视图里的 inline style） */
.wx-panel-hd__ft { float: right; font-size: 12px; font-weight: 400; color: var(--wx-text-2); text-decoration: none; }
a.wx-panel-hd__ft { color: var(--wx-link); }
a.wx-panel-hd__ft:hover { color: var(--wx-green); }

/* 入口九宫格里的数字（微信开放社区的数据网格风格：居中、绿色、无单位干扰）
   替代原来视图里的 inline style，两端各自给字号 */
.wx-grid-num { font-size: 20px; font-weight: 600; color: var(--wx-green); line-height: 1; text-align: center; }

/* =============================================================
   区块内间距规范（用户指定 · 全局统一）
   -------------------------------------------------------------
   以「区块」（内容板块）边缘为界：
   ① 所有文字元素：左右各留 **32px**
   ② 主标题：上边距 **16px**、下边距（到分隔线）**16px**（左右 32px）
   ③ 相关内容文字（标题 / 时间 / 说明等小字）视为**一个整体**：
      整体外部上下 **16px** / 左右 **32px**，文字之间行距统一 **8px**
   ④ 宫格：「上绿色图标 + 下文字」视为**一个整体**（绿色数字等同图标），
      与外框上下各 **64px**；图标与文字行距 **8px**
   ============================================================= */

/* ① + ② 区块主标题（面板头）：左右 32、上下 32 */
.weui-panel__hd { padding: 16px 32px; }
.weui-panel__hd .wx-panel-hd__ft { font-size: 13px; }

/* ③ 内容文字整体：外部 32px；内部行距 12px */
.weui-media-box { padding: 16px 32px; }
.weui-media-box__title { font-size: 15px; line-height: 1.5; }
.weui-media-box__desc { margin-top: 8px; line-height: 1.6; }
.weui-media-box__info { margin-top: 8px; }
/* 徽章 / 状态标签也是「内容文字整体」的一员 → 与上一行保持 12px 行距 */
.weui-media-box > .weui-badge,
.weui-media-box__bd > .weui-badge { display: inline-block; margin-top: 8px; }

/* ④ 宫格：图标 + 文字为一个整体，与外框上下各 64px；图标与文字行距 8px
   ⚠️ 这里刻意用 `.weui-grids .weui-grid …` 提高特异性：
   WeUI 原生有 `.weui-grid__label{margin-top:4px}`，同特异性下实测仍会胜出
   （会与图标的 12px 叠加成 16px），所以用更高优先级显式压掉。 */
.weui-grid { padding: 64px 16px; }
/* ⚠️ 图标容器实际是「撑满的块」（571 行把 WeUI 原生的 28px 定宽改成了 width:auto），
   对块级 auto 宽来说 `margin: 0 auto` 是无效的 → SVG 会贴左。
   所以居中必须靠：① 容器 text-align:center（管 inline 的 svg）② svg display:block + margin:auto。 */
.weui-grids .weui-grid .weui-grid__icon { margin: 0 0 8px; text-align: center; }
.weui-grids .weui-grid .weui-grid__label { margin-top: 0; line-height: 1.5; }

/* 首页首块（头像 + 姓名 + 身份标签）：同样按「内容文字整体」处理 */
.wx-me { padding: 16px 32px; }
.wx-me__sub { margin-top: 8px; }
.wx-me__tags { margin-top: 8px; }

body.page-home main.container {
  max-width: 1000px;
  margin-left: auto;
  margin-right: auto;
  padding-left: 0;
  padding-right: 0;
}
/* 通栏后，夹在区块之间的提示条需要自己留边距，免得贴屏幕边 */
body.page-home main.container > .alert { margin-left: 1rem; margin-right: 1rem; }

/* 首块（头像 + 姓名 + 身份）：WeUI 通栏白底 + 上下 0.5px 细线，无边框无圆角
   padding 由上面的「区块内间距规范」统一给到 16px 32px */
body.page-home .wx-me,
.wx-me {
  border: 0;
  border-radius: 0;
  margin-bottom: 1rem;
  padding: 16px 32px;
  position: relative;
}
.wx-me::before, .wx-me::after {
  content: ' ';
  position: absolute;
  left: 32px;   /* 细线左右内缩 32px，与文字左缘对齐 */
  right: 32px;
  height: 1px;
  background: var(--wx-line);
  transform: scaleY(.5);
  pointer-events: none;
}
.wx-me::before { top: 0; }
.wx-me::after { bottom: 0; }

/* ---------- 助理多选（共同助理，与 weui-fix.css 第 46 节对应） ---------- */
.wx-pick-chips {
  display: flex; flex-wrap: wrap; gap: .5rem;
  margin-top: .75rem; padding-top: .75rem;
  border-top: 1px solid var(--wx-line-2);
}
.wx-pick-chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 4px 10px; border-radius: 4px;
  background: #e6f7ec; color: #07c160; font-size: 13px;
}
.wx-pick-chip__x { font-style: normal; font-size: 15px; padding: 0 2px; color: #999999; cursor: pointer; }
.wx-pick-chips__tip { font-size: 12px; color: var(--wx-text-2); }

/* ---------- 47. 全站内容区统一：限宽 1000px 居中 + 页面级内容左右 32px ----------
   首页此前已单独限宽，这里推广到**所有** web 页面，
   让全站的区块左缘、文字左缘都对齐到同一条线（= 首页口径）。
   · 区块（.card / .weui-panel / .weui-grids / .wx-section / .wx-me）仍「通栏白底」，
     它们自己带 32px 内边距，所以这里不再给它们任何 padding。
   · 本节的 32px 只作用于「main 直系、且不是区块」的内容：
     页面主标题、筛选工具条、提示条、说明文字。 */
main.container,
main.container-fluid {
  max-width: 1000px;
  margin-left: auto;
  margin-right: auto;
  padding-left: 0;
  padding-right: 0;
}

/* ⚠️ 刻意不写 .row / .col-*：避免栅格里的 .card 被二次内缩成 64px。 */
main > h1, main > h2, main > h3, main > h4, main > h5, main > h6,
main > p,
main > .alert,
main > .notice,
main > .d-flex,
main > .text-muted,
main > .table-responsive {
  padding-left: 32px;
  padding-right: 32px;
}

/* ⚠️ <form> 必须区分两种角色，否则内容会二次内缩（32 + 32 = 64px）：
   ① 筛选 / 操作工具条（<form class="row …">、<form class="d-flex …">）：本体就要 32px；
   ② 内容容器（如资料页 <form> 把 wx-section / wx-me 整个包住）：本体不加 padding，
      只把「非区块」的直接子元素对齐到 32px —— 区块自带 32px 内边距，保持通栏。 */
main > form { padding-left: 0; padding-right: 0; }
main > form.row,
main > form.d-flex { padding-left: 32px; padding-right: 32px; }
main > form > h1, main > form > h2, main > form > h3,
main > form > h4, main > form > h5, main > form > h6,
main > form > p,
main > form > .alert,
main > form > .notice,
main > form > .d-flex,
main > form > .text-muted { padding-left: 32px; padding-right: 32px; }

/* 首页提示条原来靠 margin 让位 → 改用与全站同一左缘（32px） */
body.page-home main.container > .alert { margin-left: 0; margin-right: 0; }

/* ---------- 48. 排座页「选人区」：一行工具栏 + 按部门分组的卡片网格 ----------
   对应片段 app/views/_roster_add.php（手机端样式见 weui-fix.css 第 40 节）。
   卡片信息只三行：姓名 / 部门·岗位（小字）/ 座位号 —— 刻意不显示账号和电话。 */

/* ① 工具栏：搜索框 + 全选 / 全不选 / 加新人 + 统计 + 提交 */
.ra-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding-bottom: 12px;
  border-bottom: .5px solid var(--wx-line);
  margin-bottom: 12px;
}
.ra-bar__kw { max-width: 240px; }
/* 统计靠右：右侧动作按钮有两个（移出 / 加入），所以自动留白加在统计上 */
.ra-bar__stat { margin-left: auto; font-size: 13px; color: var(--wx-text-2); }
.ra-bar__stat b { color: var(--wx-text); font-weight: 600; }

/* ② 部门分组（用原生 <details>，无 JS 也能折叠） */
.ra-group { border: 0; }
.ra-group__hd {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 0;
  border-bottom: .5px solid var(--wx-line);
  font-size: 14px;
  color: var(--wx-text-2);
  cursor: pointer;
  list-style: none;
}
.ra-group__hd::-webkit-details-marker { display: none; }
.ra-group__hd::before { content: '▸'; font-size: 12px; color: var(--wx-text-3); }
.ra-group[open] > .ra-group__hd::before { content: '▾'; }
.ra-group__cnt { margin-left: auto; font-size: 13px; }

/* ③ 卡片网格：web 每行 4 个 */
.ra-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
  padding: 12px 0;
}
.ra-card {
  position: relative;
  display: block;
  margin: 0;
  min-width: 0;
  padding: 8px 12px 8px 34px;
  background: #fff;
  border: 1px solid var(--wx-line);
  border-radius: 4px;
  cursor: pointer;
}
.ra-card:hover { border-color: var(--wx-green); }
.ra-card.is-sel { border-color: var(--wx-green); background: var(--wx-green-soft); }
.ra-card.is-in { background: #fafafa; }
/* 已在名单 + 被取消勾选 = 待移出（提交前可再勾回来） */
.ra-card.is-out { border-color: #fa5151; background: #fff5f5; }
.ra-card.is-out .ra-card__seat { color: #fa5151; text-decoration: line-through; }
.ra-card__cb { position: absolute; left: 10px; top: 10px; margin: 0; }
.ra-card__name {
  font-size: 14px;
  font-weight: 600;
  color: var(--wx-text);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ra-card__tag {
  margin-left: 4px;
  padding: 0 4px;
  font-size: 11px;
  font-weight: 400;
  color: var(--wx-green);
  border: 1px solid currentColor;
  border-radius: 2px;
  vertical-align: 1px;
}
/* 已离职标记（2026-11-07）：这些人只在「已进本场名单」时出现，仅允许移出，不进成绩报表 */
.ra-card__tag--dep {
  color: #c0392b;
}
.ra-card__meta {
  margin-top: 2px;
  font-size: 12px;
  color: var(--wx-text-2);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.ra-card__seat {
  display: block;
  margin-top: 2px;
  padding: 0;
  border: 0;
  background: none;
  font-family: inherit;
  font-size: 12px;
  line-height: 1.4;
  color: var(--wx-green);
  text-align: left;
}
.ra-card__seat.is-none { color: var(--wx-text-3); }
button.ra-card__seat { cursor: pointer; text-decoration: underline dotted; }
.ra-empty { padding: 24px 0; text-align: center; font-size: 13px; color: var(--wx-text-2); }

/* ④ 弹窗（「加新人」与「导入排座」共用） */
.ra-modal {
  position: fixed;
  inset: 0;
  z-index: 1080;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
  background: rgba(0, 0, 0, .4);
}
.ra-modal[hidden] { display: none; }
.ra-modal__box { width: 100%; max-width: 380px; background: #fff; border-radius: 8px; overflow: hidden; }
.ra-modal__hd { padding: 12px 16px; font-size: 15px; font-weight: 600; border-bottom: .5px solid var(--wx-line); }
.ra-modal__bd { padding: 16px; }
.ra-modal__ft { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 16px; border-top: .5px solid var(--wx-line); }
.ra-modal__msg { margin-top: 12px; font-size: 12px; line-height: 1.6; color: var(--wx-text-2); }
.ra-modal__msg.is-err { color: #fa5151; }

/* 窄屏（主内容 1000px 限宽以下）降为 2 列 */
@media (max-width: 860px) {
  .ra-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}








/* ---------- 49. 认领弹窗：设置密码输入框（与 weui-fix.css 第 50 节对应） ----------
   WeUI 的 .weui-input 自身没有边框（靠 .weui-cell 提供下划线），
   放进弹窗后必须补一条下划线，否则输入框看起来是一片空白。 */
#claimDlg .weui-input {
  padding: 8px 0;
  border-bottom: 1px solid var(--wx-line);
}

/* =============================================================
   50. 微信后台（weuiDesktop）视觉语言 —— 桌面端统一皮肤
   -------------------------------------------------------------
   来源：mp.weixin.qq.com 公众平台后台前端样式表的 `--weuiDesktop_*` 变量体系
        （实测导出见工作区 `css-dump/out-wxamp/combined.css`）。
   令牌：全部取自 `design-tokens.css` 第六节（--dt-desk-*），本节点不写字面值。

   ⚠️ 三条前提（务必遵守，否则会踩历史坑）
   1. **只换外观，不动任何 HTML 结构**：全站 37+ 个页面的 .card / .weui-* 结构不变。
   2. 本节**追加在文件末尾**，靠后置 + 同等 `!important` 压过前面各节的官网口径
      （前文有 111 处 !important，凡是被压不过的规则都在此补齐 !important）。
   3. 上一节（第 47 节）的网格口径**保持不变**：内容区 1000px 居中、文字左右 32px、
      区块之间 16px、细线内缩 32px。本节只改「颜色 / 圆角 / 阴影 / 描边 / 按钮形态」。
   ============================================================= */

/* ---------- 50.1 令牌重定向：官网口径 → 后台口径 ----------
   只需重定义变量，前文所有 `var(--wx-*)` 会自动跟随到后台色板。 */
:root {
  --wx-green:      var(--dt-desk-theme);        /* #07c160（后台 themeColor，同值） */
  --wx-green-d:    #06ad56;                     /* 主按钮按下（后台是叠加蒙层，此处用深绿等价表达） */
  --wx-green-soft: var(--dt-desk-theme-soft);   /* rgba(7,193,96,.1)（后台 Color_Theme_2） */
  --wx-link:       var(--dt-desk-link);         /* #576b95 */
  --wx-text:       var(--dt-desk-fg-0);         /* #1a1b1c ← 原 #191919 */
  --wx-text-2:     var(--dt-desk-fg-1);         /* #7e8081 ← 原 #888888 */
  --wx-text-3:     var(--dt-desk-fg-2);         /* #b1b2b3 ← 原 #b2b2b2 */
  --wx-line:       var(--dt-desk-line);         /* #e3e4e5 ← 原 #e7e7eb */
  --wx-line-2:     var(--dt-desk-line-soft);    /* rgba(0,0,0,.05) ← 原 #ededed */
  --wx-bg:         var(--dt-desk-bg-global);    /* #f6f7f8 ← 原 #f7f7f7 */
  --wx-white:      var(--dt-desk-bg-card);
  --wx-radius:     var(--dt-desk-radius-lg);    /* 8px */
  --wx-radius-sm:  var(--dt-desk-radius-sm);    /* 4px */
  /* 后台补充令牌（前文没有的语义） */
  --wx-desk-shadow: var(--dt-desk-shadow-card);
  --wx-desk-fg-hover: var(--dt-desk-link-hover);   /* 链接 hover 变深蓝，不是变绿 */
}

/* ---------- 50.2 页面与排版 ---------- */
body {
  background: var(--wx-bg);
  font-family: var(--dt-desk-font);
  font-size: 14px;
  line-height: var(--dt-desk-leading);
  color: var(--wx-text);
}
/* 后台的链接 hover 是「加深」而非变绿；按下再深一档 */
a:hover { color: var(--dt-desk-link-hover); }
a:active { color: var(--dt-desk-link-active); }
/* 后台标题一律中字重 500（不是 600） */
h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
  color: var(--wx-text);
  font-weight: var(--dt-desk-weight-medium);
}
/* 页脚：后台是居中细灰字 + 顶部分隔线（与页面底色同深度的白） */
footer {
  color: var(--wx-text-2) !important;
  border-top: 1px solid var(--wx-line);
  background: transparent;
}

/* ---------- 50.3 卡片 / 区块：通栏白底 → 白卡片 + 8px 圆角 + 阴影 ----------
   ⚠️ 这是与上一轮「通栏白底 + 细线（无圆角无阴影）」最大的视觉差异。
   卡片宽度与内边距**保持第 47 节口径不变**（内容区 1000px、文字左右 32px），
   只补上后台的圆角与投影。 */
.card {
  background: var(--wx-white) !important;
  border: 0 !important;
  border-radius: var(--dt-desk-radius-lg) !important;
  box-shadow: var(--dt-desk-shadow-card) !important;
  /* ⚠️ 刻意不写 overflow:hidden —— 卡片里的 .dropdown-menu / .lk-menu 是
     absolute 定位，一旦裁剪就会「点不开」或半截消失。圆角靠子元素自己跟随。 */
}
.card:hover { transform: none !important; box-shadow: var(--dt-desk-shadow-card) !important; }

/* 卡片标题：后台是深色中字重（不是中性灰细字），分隔线为 1px 实线 */
.card > .card-header,
.card-header {
  color: var(--wx-text);
  font-weight: var(--dt-desk-weight-medium);
  border-bottom: 1px solid var(--wx-line);
}
.card > .card-footer,
.card-footer { border-top: 1px solid var(--wx-line); }

/* 卡内「通栏表格」（.card > .table-responsive 是负 margin 通栏）：
   让它跟随卡片圆角，否则表格直角会压在圆角上 */
.card > .table-responsive {
  border-radius: 0 0 var(--dt-desk-radius-lg) var(--dt-desk-radius-lg);
}
.card > .table-responsive:first-child { border-radius: var(--dt-desk-radius-lg); }

/* 非 .card 的区块（资料页 .wx-section、首页 .weui-panel/.weui-grids/表单 .weui-cells）
   同样卡片化；overflow 保持前文既有值（.weui-grids 必须 hidden，见第 510 行注释） */
.wx-section,
.weui-panel,
.weui-grids,
.weui-cells {
  background: var(--wx-white) !important;
  border: 0 !important;
  border-radius: var(--dt-desk-radius-lg) !important;
  box-shadow: var(--dt-desk-shadow-card) !important;
}
/* 区块标题：深色 + 中字重（原 .wx-section__hd 是灰色 400） */
.wx-section__hd,
.weui-panel__hd {
  color: var(--wx-text) !important;
  font-weight: var(--dt-desk-weight-medium) !important;
}
/* 列表分组标题 / 说明：后台用 descColor(#7e8081) 12px */
.weui-cells__title,
.weui-cells__tips { color: var(--wx-text-2); }
/* 通用区块（.list-group 等小件）跟随后台分隔线 */
.list-group-item { border-color: var(--wx-line-2); }

/* ---------- 50.4 按钮：后台口径（8px 圆角 / 默认底色 rgba(0,0,0,.03) / 描边 #e4e8eb） ----------
   ⚠️ 刻意不套用后台的 `min-width:120px`（那是后台整行表单的宽按钮），
   本项目工具条里全是小按钮，套上会把布局撑坏。 */
.btn { border-radius: var(--dt-desk-radius-lg); }
.btn-secondary, .btn-light {
  background: var(--dt-desk-btn-bg) !important;
  border-color: var(--dt-desk-btn-line) !important;
  color: var(--wx-text) !important;
}
.btn-secondary:hover, .btn-light:hover {
  background: var(--dt-desk-btn-bg-hover) !important;
  border-color: var(--dt-desk-btn-line-hl) !important;
}
.btn-outline-secondary {
  background: var(--wx-white) !important;
  border-color: var(--dt-desk-btn-line) !important;
  color: var(--wx-text) !important;
}
.btn-outline-secondary:hover {
  background: var(--dt-desk-btn-bg) !important;
  border-color: var(--dt-desk-btn-line-hl) !important;
}
/* 文字按钮：后台链接 hover 是「变深蓝」 */
.btn-link { color: var(--wx-link) !important; }
.btn-link:hover { color: var(--dt-desk-link-hover) !important; }
/* WeUI 按钮（登录页等）同口径 */
.weui-btn { border-radius: var(--dt-desk-radius-lg); }
.weui-btn_default {
  background: var(--dt-desk-btn-bg) !important;
  border: 1px solid var(--dt-desk-btn-line) !important;
  color: var(--wx-text) !important;
}
.weui-btn_default:active { background: var(--dt-desk-btn-bg-hover) !important; }

/* ---------- 50.5 表单：输入框 40px / 4px 圆角 / 描边 #e3e4e5 ---------- */
.form-control, .form-select {
  border-color: var(--wx-line);
  border-radius: var(--dt-desk-radius-sm);
  color: var(--wx-text);
  background: var(--wx-white);
}
.form-control:focus, .form-select:focus {
  border-color: var(--wx-green);
  box-shadow: none !important;
}
.form-control::placeholder { color: var(--dt-desk-fg-2); }
.form-select:disabled, .form-control:disabled {
  background: var(--dt-desk-bg-area);
  color: var(--dt-desk-fg-disabled);
}
.form-label { color: var(--wx-text); font-weight: 400; }
.form-text { color: var(--wx-text-2); }
.input-group-text {
  background: var(--dt-desk-bg-area);
  border-color: var(--wx-line);
  color: var(--wx-text-2);
}
.form-check-input:checked {
  background-color: var(--wx-green);
  border-color: var(--wx-green);
}
/* WeUI 输入（放弹窗/单元格里的那种）跟随同一描边口径 */
.weui-input, .weui-textarea { color: var(--wx-text); }
.weui-textarea { border-color: var(--wx-line); border-radius: var(--dt-desk-radius-sm); }

/* ---------- 50.6 表格：表头 #f6f7f8 / 表头文字 #7e8081 / 行线 OpBlack_5 ---------- */
.table { background: var(--wx-white); color: var(--wx-text); }
.table > :not(caption) > * > * { border-bottom-color: var(--wx-line-2); }
.table thead th,
.table > thead > tr > th {
  background: var(--dt-desk-bg-area) !important;   /* #f6f7f8 */
  color: var(--dt-desk-fg-1) !important;           /* #7e8081 */
  font-weight: 400;                                /* 后台表头不加粗 */
  border-bottom: 1px solid var(--wx-line) !important;
}
.table-hover > tbody > tr:hover > * { background: var(--dt-desk-bg-area) !important; }
.table-striped > tbody > tr:nth-of-type(odd) > * { background: var(--dt-desk-bg-hover-2); }

/* ---------- 50.7 提示条 / 徽章 / 分页：后台色板（soft 底 10% + 同色系文字） ---------- */
.alert { border-radius: var(--dt-desk-radius-sm); }
.alert-success {
  background: var(--dt-desk-theme-soft) !important;
  border-color: rgba(7, 193, 96, .3) !important;
  color: #06ad56 !important;
}
.alert-danger {
  background: var(--dt-desk-error-soft) !important;
  border-color: rgba(250, 81, 81, .3) !important;
  color: var(--dt-desk-error) !important;
}
/* ⚠️ 后台的 warningColor 是 #ffc300，作为文字在浅黄底上对比度不足
   （WCAG 约 1.9:1）→ 文字改用同色系深值，保持可读。 */
.alert-warning {
  background: var(--dt-desk-warning-soft) !important;
  border-color: rgba(255, 195, 0, .35) !important;
  color: #8a6a00 !important;
}
.alert-info {
  background: var(--dt-desk-info-soft) !important;
  border-color: rgba(16, 174, 255, .3) !important;
  color: #0d7dc4 !important;
}
.alert-secondary {
  background: var(--dt-desk-bg-area) !important;
  border-color: var(--wx-line) !important;
  color: var(--wx-text-2) !important;
}

/* 徽章：圆角 2px（后台 minBorderRadius）+ soft 底 */
.badge { border-radius: var(--dt-desk-radius-xs); }
.badge.bg-primary,
.badge.bg-success { background: var(--dt-desk-theme-soft) !important; color: #06ad56 !important; }
.badge.bg-warning { background: var(--dt-desk-warning-soft) !important; color: #8a6a00 !important; }
.badge.bg-danger  { background: var(--dt-desk-error-soft) !important; color: var(--dt-desk-error) !important; }
.badge.bg-info    { background: var(--dt-desk-info-soft) !important; color: #0d7dc4 !important; }
.badge.bg-secondary,
.badge.bg-light   { background: var(--dt-desk-bg-area) !important; color: var(--wx-text-2) !important; }
.weui-badge { border-radius: var(--dt-desk-radius-xs); }

/* 分页：后台默认按钮 hover 是 #fbfbfb（取近似值 #fafafa） */
.page-link {
  color: var(--wx-link);
  border-color: var(--wx-line);
  border-radius: var(--dt-desk-radius-sm);
}
.page-link:hover {
  color: var(--dt-desk-link-hover);
  background: var(--dt-desk-bg-hover-2);
}
.page-item.active .page-link {
  background: var(--wx-green);
  border-color: var(--wx-green);
  color: #fff;
}
.progress { background: var(--dt-desk-bg-area); }

/* ---------- 50.8 弹窗 / 下拉 / 弹层：8px 圆角 + BoxShadow_0 + 蒙层 50% ---------- */
.modal-content {
  border: 0;
  border-radius: var(--dt-desk-radius-lg);
  box-shadow: var(--dt-desk-shadow-pop);
}
.modal-header, .modal-footer { border-color: var(--wx-line); }
.modal-title { font-size: var(--dt-desk-text-h3); font-weight: var(--dt-desk-weight-medium); }
.modal-backdrop { background: var(--dt-desk-mask); }   /* 后台 BG_maskBgColor */
.dropdown-menu {
  border: 1px solid var(--wx-line);
  border-radius: var(--dt-desk-radius-sm);
  box-shadow: var(--dt-desk-shadow-pop);
}
.dropdown-item { color: var(--wx-text); }
.dropdown-item:hover, .dropdown-item:focus {
  background: var(--dt-desk-bg-hover);
  color: var(--wx-text);
}
.dropdown-divider { border-top-color: var(--wx-line); }
/* 排座页自研弹窗（.ra-modal）与后台弹窗同口径 */
.ra-modal { background: var(--dt-desk-mask); }
.ra-modal__box {
  border-radius: var(--dt-desk-radius-lg);
  box-shadow: var(--dt-desk-shadow-pop);
}
.ra-modal__hd, .ra-modal__ft { border-color: var(--wx-line); }
/* 资料页首块（.wx-me）：由「白底细边框」改为后台卡片 */
.wx-me {
  border: 0;
  border-radius: var(--dt-desk-radius-lg);
  box-shadow: var(--dt-desk-shadow-card);
}

/* ---------- 50.9 顶部导航：后台顶栏口径（白底 / 76px / 底部 1px 线） ----------
   后台的「当前项」是左侧 4px 绿条（.weui-desktop-menu__link_current），
   本项目导航在顶部、且 HTML 里没有 current 标记，故只做 hover 与字色统一；
   若将来要加当前项高亮，照后台做法用 4px 主题色条即可，勿改成背景填充。 */
.navbar {
  min-height: 76px;
  padding: .75rem 0;
  background: var(--wx-white) !important;
  border-bottom: 1px solid var(--wx-line) !important;
}
.navbar-brand {
  color: var(--wx-text) !important;
  font-size: var(--dt-desk-text-h3);
  font-weight: var(--dt-desk-weight-medium);
}
.navbar-nav .nav-link {
  color: var(--wx-text) !important;                 /* 原 #4b4b4b → 后台 globalColor #1a1b1c */
  border-radius: var(--dt-desk-radius-lg);
  padding: .4rem .85rem !important;
}
/* ⚠️ 原规则是 hover 变「绿字 + 浅绿底」，后台菜单 hover 是「浅灰底 + 字色不变」 */
.navbar-nav .nav-link:hover {
  color: var(--wx-text) !important;
  background: var(--dt-desk-bg-hover) !important;   /* #f6f7f8 */
}
.navbar .dropdown-item { color: var(--wx-text) !important; }
.navbar .dropdown-item:hover {
  color: var(--wx-text) !important;
  background: var(--dt-desk-bg-hover) !important;
}
/* 页内标签页（.nav-tabs）：后台的标题页签是「下划线 + 主题色」 */
.nav-tabs .nav-link { color: var(--wx-text-2); }
.nav-tabs .nav-link:hover { color: var(--wx-text); }
.nav-tabs .nav-link.active { color: var(--wx-text); border-bottom-color: var(--wx-green); }

/* ---------- 50.10 WeUI 组件桌面化对齐（与 50.3 呼应的小件） ---------- */
.weui-media-box__title { font-weight: var(--dt-desk-weight-medium); }
.weui-msg__title { font-weight: var(--dt-desk-weight-medium); }
.weui-cell__desc { color: var(--wx-text-2); }
/* 标签（培训列表分类筛选）：后台标签圆角 2px */
.wx-tag { border-radius: var(--dt-desk-radius-xs); }
.wx-tag:hover { background: var(--dt-desk-bg-hover); }
.wx-tag.is-on,
.wx-tag.is-on:hover { background: var(--dt-desk-theme-soft); color: var(--wx-green); }

/* =============================================================
   50.11 本节覆盖清单（供后续维护速查）
   · 变量层：--wx-* 全部重定向到 design-tokens.css 第六节的 --dt-desk-*（50.1）
   · 页面：底色 #f6f7f8、字体栈、正文 14px/1.6、链接 hover 变深蓝（50.2）
   · 卡片：白底 + 8px 圆角 + 0 2px 8px rgba(0,0,0,.13)；标题深色 500（50.3）
   · 按钮：8px 圆角；次要按钮 rgba(0,0,0,.03) 底 + #e4e8eb 描边（50.4）
   · 表单：输入框 4px 圆角 + #e3e4e5 描边 + focus 主题绿（50.5）
   · 表格：表头 #f6f7f8 / 文字 #7e8081 / 行线 rgba(0,0,0,.05)（50.6）
   · 提示条与徽章：后台 soft 色板（10% 底 + 同色系文字）（50.7）
   · 弹窗与下拉：8px 圆角 + 0 2px 8px rgba(0,0,0,.15) + 蒙层 50%（50.8）
   · 顶部导航：白底 76px、hover 浅灰底（不再是绿底）（50.9）
   未做（刻意保留原状，需要时再评估）：
   · 后台的左侧 230px 竖排菜单（要改 layout.php 结构，属另一件事）
   · 后台按钮的 min-width:120px（会把工具条小按钮撑坏）
   · 第 47 节的 1000px 限宽与 32px 内边距口径（用户上一轮刚验收）
   ============================================================= */

/* =============================================================
   51. 微信后台「页面骨架」：顶部 76px 顶栏 + 左侧 230px 竖排菜单
   -------------------------------------------------------------
   对应改动：`app/views/layout.php` 桌面分支（原 `.navbar` 顶栏 → `.wx-desk` 三层骨架）。
   尺寸取自 mp.weixin.qq.com 后台实测（见工作区 `css-dump/out-wxamp/`）：
     · 顶栏   `#header { height:76px; background:#fff; padding:0 32px }`
     · 侧栏   `.weui-desktop-layout_global > .weui-desktop-layout__side { width:225px }`
     · 主体   `.weui-desktop-page_base .weui-desktop-layout__main { margin-left:230px }`
     · 菜单项 `.weui-desktop-menu__item>.weui-desktop-menu__link { padding:15px; margin:0 46px 0 32px;
              border-left:4px solid transparent }`，当前项 `border-left-color:#07c160` + 字重 500
     · 账号区 `.weui-desktop-account__thumb { width:40px;height:40px;border-radius:50% }`

   ⚠️ 两点约定
   1. 手机端**不加载**本文件 ⇒ 骨架只影响桌面端；`<body>` 里的 WeUI 分支完全没变。
   2. 第 50.9 节的 `.navbar` 规则保留为历史（顶栏已换成 `.wx-desk__hd`），不要再往那儿加东西。
   ============================================================= */

/* ---------- 51.1 骨架容器（body 底色已是 #f6f7f8） ---------- */
.wx-desk { min-height: 100vh; }

/* 顶栏：白底 / 76px / 底部 1px 线 / 吸顶 */
.wx-desk__hd {
  height: 76px;
  padding: 0 32px;
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: space-between;
  background: var(--wx-white);
  border-bottom: 1px solid var(--wx-line);
  position: sticky;
  top: 0;
  z-index: 1030;                    /* 高于 dropdown(1000)，低于 bootstrap modal(1055) */
}
.wx-desk__brand {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 17px;
  font-weight: var(--dt-desk-weight-medium);
  color: #4c4d4e;                   /* 后台 header_logo 色 */
  text-decoration: none;
}
.wx-desk__brand:hover { color: #4c4d4e; }
.wx-desk__logo {
  display: inline-block;
  width: .55rem;
  height: .55rem;
  border-radius: var(--dt-radius-full);
  background: var(--wx-green);
}

/* ---------- 51.2 顶栏右侧：待确认提示 + 账号（40px 圆形头像） ---------- */
.wx-desk__hd-side { display: flex; align-items: center; gap: 16px; }
.wx-desk__tip {
  font-size: 12px;
  color: #9a6b00;
  background: var(--dt-desk-warning-soft);
  padding: 2px 8px;
  border-radius: var(--dt-desk-radius-xs);
}
.wx-desk__account {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 4px 8px;
  border-radius: var(--dt-desk-radius-lg);
  text-decoration: none;
  color: var(--dt-desk-fg-0);
}
.wx-desk__account:hover { background: var(--dt-desk-bg-hover); color: var(--dt-desk-fg-0); }
.wx-desk__account::after { margin-left: 2px; vertical-align: middle; }
.wx-desk__avatar {
  flex: none;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--dt-desk-bg-area);
  color: var(--dt-desk-fg-1);
  font-size: 16px;
  line-height: 40px;
  text-align: center;
}
.wx-desk__who { display: flex; flex-direction: column; line-height: 1.25; }
.wx-desk__nick { font-size: 14px; color: var(--dt-desk-fg-0); }
.wx-desk__role { font-size: 12px; color: var(--dt-desk-fg-1); }

/* ---------- 51.3 左侧菜单：固定 230px / 白底 / 当前项 4px 绿条 ---------- */
.wx-desk__side {
  position: fixed;
  top: 76px;
  left: 0;
  bottom: 0;
  width: 230px;
  box-sizing: border-box;
  padding: 16px 0;
  background: var(--wx-white);
  border-right: 1px solid var(--wx-line);
  overflow-y: auto;
  z-index: 1020;
}
.wx-desk__menu { display: block; }
.wx-desk__menu-link {
  display: block;
  padding: 12px 20px 12px 28px;
  border-left: 4px solid transparent;
  font-size: 15px;
  line-height: 1.5;
  color: var(--dt-desk-fg-0);
  text-decoration: none;
  word-break: break-all;
}
.wx-desk__menu-link:hover { background: var(--dt-desk-bg-hover); color: var(--dt-desk-fg-0); }
/* 当前项：后台只有「4px 绿条 + 字重 500」，**不加背景**（背景是 hover 的语义） */
.wx-desk__menu-link.is-on {
  border-left-color: var(--wx-green);
  font-weight: var(--dt-desk-weight-medium);
}

/* ---------- 51.4 内容区：整体让位 230px（= 后台 main margin-left:230px） ----------
   main.container 的「1000px 居中」仍由第 47 节负责，这里只做偏移。 */
.wx-desk__main {
  margin-left: 230px;
  padding: 16px 0 0;
  min-height: calc(100vh - 76px);
  box-sizing: border-box;
}

/* ---------- 51.5 响应式：≤900px 侧栏转为顶部横向滚动条（后台在窄屏也收起侧栏） ---------- */
@media (max-width: 900px) {
  .wx-desk__hd { padding: 0 16px; }
  .wx-desk__side {
    position: static;
    width: auto;
    bottom: auto;
    padding: 0;
    border-right: 0;
    border-bottom: 1px solid var(--wx-line);
    overflow-y: visible;
  }
  .wx-desk__menu { display: flex; gap: 4px; overflow-x: auto; padding: 8px 16px; }
  .wx-desk__menu-link {
    flex: none;
    padding: 8px 12px;
    border-left: 0;
    border-bottom: 3px solid transparent;
    white-space: nowrap;
  }
  .wx-desk__menu-link.is-on {
    border-left-color: transparent;
    border-bottom-color: var(--wx-green);
  }
  .wx-desk__main { margin-left: 0; min-height: 0; }
}

/* ---------- 51.6 本节清单（维护速查） ----------
   · 顶栏  .wx-desk__hd   76px / padding 0 32px / 白底 / sticky / z-index 1030
   · 品牌  .wx-desk__brand 17px 500 (#4c4d4e) + .wx-desk__logo 绿点
   · 账号  .wx-desk__account（40px 圆形头像 + 昵称 14px + 角色 12px 灰）
   · 侧栏  .wx-desk__side   fixed / top 76px / 230px / 白底 / 右边 1px 线
   · 菜单  .wx-desk__menu-link  padding 12px 20px 12px 28px / 4px 透明左边条 / 15px
           当前项 .is-on   左边条转主题绿 + font-weight 500
   · 内容  .wx-desk__main   margin-left 230px（main.container 的 1000px 居中不变）
   · 窄屏  ≤900px：侧栏转顶部横向滚动，当前项改「底部 3px 绿条」，主体 margin-left 归零
   · 分组 / 二级菜单见第 56 节（.wx-desk__group-title + .wx-desk__menu-link.is-sub）
   ============================================================= */

/* =============================================================
   52. 「我的活动」页（`?p=my_seat`）：签到状态「标签」—— 桌面端补齐
   -------------------------------------------------------------
   背景（是「补齐」而不是「改坏」）：
   同一份 HTML 里签到状态有两种写法：
     · 座位票右下角   <span class="wx-ticket__badge is-todo|is-pending|is-done">
     · 签到区         <span class="wx-state wx-state--todo|pending|done">
   但这两种样式**只写在手机端**（`weui-fix.css` 第 49 节 + 664~675 行，规则全带 `.is-mini`）
   ⇒ 桌面端它们没有任何底色/圆角；座位票的状态文案还因为 `.wx-ticket` 没有
   `position:relative` 而失去定位参照，挤在票面左下角。

   本节口径 = 桌面端后台色板（`design-tokens.css` 第六节 `--dt-desk-*`）：
     浅底 + 同色系文字 + 4px 圆角（`--dt-desk-radius-sm`）。
   文案由 `my_seat.php` 依 `sign_state_view()` 给出，本节点只负责外观。

   ⚠️ 作用域刻意收紧（用户明确要求「其它页先不管」）：
     · `.wx-ticket*` 只出现在本页；
     · `.wx-state` 用 `.wx-sign-me` / `.wx-sign-grid` 限定
     ⇒ 成绩 / 用户管理 / 考试管理 / 组织架构等页面的 `.wx-state` **不受本节影响**。
   ============================================================= */

/* ---------- 52.1 座位票：右下角签到状态标签 + 整卡热区 ---------- */
.wx-ticket { position: relative; }            /* 标签绝对定位的参照（票面 padding 18px） */
.wx-ticket__badge {
  position: absolute;
  right: 18px;
  bottom: 16px;
  z-index: 2;
  display: inline-flex;
  align-items: center;
  padding: 3px 8px;
  border-radius: var(--dt-desk-radius-sm);
  font-size: 12px;
  font-weight: var(--dt-desk-weight-medium);
  line-height: 1.4;
  white-space: nowrap;
}
/* 未签到：白底 + 票面主色字（最醒目，引导点击；语义同手机端第 49 节） */
.wx-ticket__badge.is-todo {
  background: #fff;
  color: #1b3f86;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .18);
}
.wx-ticket__badge.is-pending {
  background: var(--dt-desk-warning-soft);
  color: #8a6a00;
}
.wx-ticket__badge.is-done,
.wx-ticket__badge.is-late {
  background: rgba(255, 255, 255, .92);
  color: var(--dt-desk-theme);
}
/* 最后一行（部门 · 岗位）右侧给标签留位：长文本提前折行，不会压到标签下面 */
.wx-ticket__dept { padding-right: 168px; }

/* 整卡热区（仅未签到）：桌面端同样可点 → 确认后签到（JS 见 my_seat.php 末尾，
   桌面端无 window.wxConfirm 时自动回退到浏览器 confirm） */
.wx-ticket--ck { cursor: pointer; }
.wx-ticket--ck:hover { filter: brightness(1.05); }
.wx-ticket--ck.is-busy { opacity: .72; pointer-events: none; }

/* ---------- 52.2 签到区状态标签（限定在本页签到块内） ---------- */
.wx-sign-me .wx-state,
.wx-sign-grid .wx-state {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  border-radius: var(--dt-desk-radius-sm);
  font-size: 12px;
  font-weight: var(--dt-desk-weight-medium);
  line-height: 1.4;
  white-space: nowrap;
}
.wx-sign-me .wx-state--todo,
.wx-sign-grid .wx-state--todo { background: var(--dt-desk-error-soft); color: var(--dt-desk-error); }
.wx-sign-me .wx-state--pending,
.wx-sign-grid .wx-state--pending { background: var(--dt-desk-warning-soft); color: #8a6a00; }
.wx-sign-me .wx-state--done,
.wx-sign-grid .wx-state--done { background: var(--dt-desk-theme-soft); color: #06ad56; }
.wx-sign-me .wx-state--closed,
.wx-sign-grid .wx-state--closed { background: var(--dt-desk-bg-area); color: var(--dt-desk-fg-1); }

/* 签到格配色：已在基础节统一为 n1~n6（`.wx-sign-cell.is-*`，2026-09-18 口径，
   见 app/helpers.php sign_state_view）——这里不再重复覆盖，
   否则会把「n4 绿底白字 / n5 红底白字」压回旧的 soft 色板。 */

/* ---------- 52.3 「立即签到」按钮的「已过期仍可点」态 + 折叠区说明文字 ---------- */
.wx-sign-me .wx-ck-btn.is-past {
  background: var(--dt-desk-btn-bg) !important;   /* 过期后变浅灰，但仍可点（活动不验证时间） */
  border: 1px solid var(--dt-desk-btn-line);
  color: var(--dt-desk-fg-1) !important;
}
.wx-subfold__bd .wx-panel-tips {
  margin: 8px 0;
  font-size: 12px;
  line-height: 1.7;
  color: var(--dt-desk-fg-1);
}

/* ---------- 52.4 本节清单 ----------
   · 座位票状态标签  .wx-ticket__badge 右下角 18/16px、12px、4px 圆角
                     is-todo 白底 #1b3f86 ｜ is-pending 浅橙 #8a6a00 ｜ is-done/late 浅白 + 主题绿
   · 整卡热区        .wx-ticket--ck / :hover / .is-busy
   · 签到区标签      .wx-sign-me|.wx-sign-grid .wx-state--todo|pending|done|closed
   · 签到格          .wx-sign-grid .wx-sign-cell.is-done|pending|late（底 + 线 + 状态文字）
   · 按钮 / 说明     .wx-sign-me .wx-ck-btn.is-past ｜ .wx-subfold__bd .wx-panel-tips
   ============================================================= */

/* ---------- 54. 「开始考试 / 结束考试」按钮行（活动列表 · 讲师行程共用） ----------
   片段：app/views/_exam_buttons.php（手机端样式见 weui-fix.css 第 51 节）
   规则：未开放 → 绿色「开始考试」；已开放未结束 → 描边红「结束考试」；已结束/无权 → 不渲染。 */
.wx-exam-ops {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 8px 32px;
}
.wx-exam-ops__t { font-size: 12px; color: var(--wx-text-2); }
.wx-exam-ops .btn { flex: none; }
.wx-exam-ops__hint { font-size: 12px; color: var(--dt-desk-fg-1); }

/* =============================================================
   53. 表格「名称」列左对齐
   -------------------------------------------------------------
   背景：`exam/manage.php`（考试管理）与 `library/papers.php`（试卷管理）的表格
   挂了**整表居中**的 Bootstrap 工具类 `text-center`（`text-align:center !important`），
   连第一列「考试名称 / 试卷名称」也被居中 —— 而考试名称那一格有多行内容
   （名称 + 灰色描述 + 📎 关联培训），居中后左右参差、难以扫读。

   做法：在表格上加标记类 `.wx-name-left`，只把**数据行（tbody）的第一列**改左对齐：
        ① **表头（thead th）保持居中** —— 表头是说明性文字，居中更整齐（用户明确要求）；
        ② 其余列（试卷 / 开放时间 / 进度 / 创建人 / 操作）保持居中不变；
        ③ 空态行（`<td colspan="6">暂无…`）用 `:not([colspan])` 排除，仍居中。

   ⚠️ 必须 `!important`：`text-center` 来自 `bootstrap-utilities.min.css`（自带 !important），
      本文件在它之后加载、同为 !important ⇒ 本规则胜出。
   ⚠️ 手机端**不加载**本文件 ⇒ 手机端这两张表保持原样（整表居中）。
   ============================================================= */
.wx-name-left > tbody > tr > td:first-child:not([colspan]) {
  text-align: left !important;
}


/* ---------- 55. 未登录入口页：两个入口按钮的间距（桌面端）----------
   scan.php 的两个 .weui-btn-area 同处一个 .weui-msg__opr-area，而 weui.min.css 有
   `.weui-msg__opr-area .weui-btn-area{margin:0}`（权重 0,2,0，压过本文件第 596 行的
   `.weui-btn-area{margin:0 0 1rem}`）⇒ 桌面上两个入口按钮同样是 0 间距。
   这里用 0,3,0 的权重只给「第二个」按钮区补 1rem，其余页面（opr-area 里只有
   一个按钮区的）不受影响。手机端同位置见 weui-fix.css 第 52 节。 */
.weui-msg__opr-area .weui-btn-area + .weui-btn-area { margin-top: 1rem; }

/* =============================================================
   56. 桌面侧栏：分组标题 + 二级菜单（2026-09-16 业务方指定结构）
   片段：app/views/layout.php（.wx-desk__group / .wx-desk__group-title / .is-sub）
   口径：
     · 一级项沿用第 51.3 节（padding 12px 20px 12px 28px，文字起点 28px）
     · 分组标题：12px、descColor（--dt-desk-fg-1）、左对齐 28px，与一级文字同一起点
     · 二级项：文字起点 44px（28 + 16 缩进），其余与一级一致（4px 左边条 → 主题绿）
   层级关系（业务方指定，勿自行调整顺序）：
     首页 / 我的活动 / 我的资料 / 培训 · 活动 / 考试管理（题库·试卷·考试）/ 人员管理（用户·组织）/ 日志管理
   ============================================================= */
.wx-desk__menu .wx-desk__group { display: block; }
.wx-desk__menu .wx-desk__group-title {
  display: block;
  padding: 16px 20px 4px 28px;
  font-size: 12px;
  line-height: 1.4;
  color: var(--dt-desk-fg-1);
}
.wx-desk__menu .wx-desk__menu-link.is-sub { padding-left: 44px; }

/* ---------- 56.1 窄屏（≤900px）：侧栏转顶部横向条时的分组表现 ----------
   规则只在本断点内覆盖：分组标题作为「小标签」紧跟其子项横排，整组可换行。 */
@media (max-width: 900px) {
  .wx-desk__menu { flex-wrap: wrap; row-gap: 2px; }
  .wx-desk__menu .wx-desk__group { display: flex; align-items: center; gap: 4px; }
  .wx-desk__menu .wx-desk__group-title { padding: 8px 2px 8px 12px; white-space: nowrap; }
  .wx-desk__menu .wx-desk__menu-link.is-sub { padding: 8px 12px; }
}

/* ---------- 56.2 本节清单（维护速查） ----------
   · 分组标题  .wx-desk__group-title  12px / #7e8081 / padding 16px 20px 4px 28px
   · 二级项    .wx-desk__menu-link.is-sub  左内边距 44px（缩进 16px）
   · 当前项    .is-on  4px 左边条转 --wx-green（与一级项同一套）
   · 窄屏      ≤900px 分组标题与子项横排；组间靠 gap 分隔
   ============================================================= */


/* =============================================================
   57. 打印 / 存为 PDF：隐藏桌面骨架，让正文占满纸面
   -------------------------------------------------------------
   桌面骨架 = 顶部 76px 顶栏 .wx-desk__hd
             + 左侧 230px 侧栏 .wx-desk__side
             + 内容区 .wx-desk__main（有 margin-left:230px）
   打印时不隐藏骨架 ⇒ PDF 顶部多一条、左边一大片空白，
   表格被挤到右侧并被裁掉（培训汇总表就踩到这个）。
   「培训汇总表」另用横向 A4：11 列且全部 nowrap，竖版放不下。
   ============================================================= */
@media print {
  .wx-desk__hd, .wx-desk__side { display: none !important; }
  .wx-desk__main { margin-left: 0 !important; padding: 0 !important; }
}

/* 培训汇总表：横向 A4（命名页 summary，只影响这一页） */
body.summary-page { page: summary; }
@page summary { size: A4 landscape; margin: 12mm; }

/* 备注列「打印时显示完整文字」+「空白行不进 PDF」（2026-10-10 业务方要求）
   —— 屏幕端隐藏打印专用元素（打印态规则见下面 §65 的 @media print 块）：
   · `.wx-print-only`：仅打印可见（备注文字镜像 / 分段人数）；
   · `tr.wx-row-blank` / `.weui-cell.wx-row-blank`：没签到、没请假、没考试的人 —— 屏幕照常显示，打印时整行不输出。 */
body.summary-page .wx-print-only { display: none; }
/* 考试成绩报表的「打印专用两栏版式」：屏幕端不渲染（屏幕只看上面那张单表，见 `wx-print-hide`） */
body.summary-page .wx-print-report { display: none; }
/* 考试成绩报表 · 屏幕端列宽（2026-11-05 业务方要求「尽量给所属部门留更宽」）：
   学员 / 成绩 两列按内容最窄（auto 布局下 1% = 不抢宽度），剩余宽度全部由「所属部门」吃掉；
   `text-nowrap` 由视图加在单元格上，长部门名「汉口店设计二中心（刘建华）」不折行。
   （打印态列宽另有规定，见下面 §65 的 @media print —— 14% / 60% / 26%） */
@media screen {
  body.summary-page table.exam-report-table thead th:nth-child(1),
  body.summary-page table.exam-report-table thead th:nth-child(3) { width: 1%; }
}

/* ===== 65. 培训汇总表「A4 打印整行完整显示」（2026-09-23 业务方反馈右侧被遮） =====
   两个根因：
     ① 表格外层 `.table-responsive` 是 overflow 容器 ⇒ 打印时右侧被裁掉；
     ② app.css 的 @media print 给 tr/td/th 加了 `white-space:nowrap` ⇒ 表格总宽超出 A4。
   ⇒ 打印时放开滚动容器 + 允许单元格内换行；单元格内的 `.text-nowrap`（如「上午✓」）仍不受影响。
   纸张仍是 A4（命名页 summary 为横向 A4，见上）。
   **列宽（2026-10-10 追加）**：学员 11% / 所属部门 30% / 签到情况 26% / 成绩·补考成绩 14% / 备注 19%
   —— 业务方要求「学员、成绩、备注收窄，所属部门加宽，文字不要择行」；
   同轮把打印字号锁为 8pt（`!important`）并隐藏备注列 placeholder（原先灰字会印满整列）。 */
@media print {
  body.summary-page .table-responsive { overflow: visible !important; }
  body.summary-page table { width: 100% !important; table-layout: fixed; font-size: 8pt !important; }
  body.summary-page tr, body.summary-page td, body.summary-page th { white-space: normal !important; }
  body.summary-page th { word-break: keep-all; }
  /* 列宽（2026-10-10 业务方要求）：学员 / 成绩·补考成绩 / 备注 收窄、所属部门加宽，
     目标是打印时单元格文字不折行（**竖向 A4** 可用宽仅约 703px，比横向的 1032px 更紧）。
     依据 = Chrome 无头渲染真实报表页实测（#77 204 人 / #61 512 人 / #75 45 人）：
       竖向下单列需求：学员 ≈66px（最长名「卡萨帝吴浩然」）、所属部门 140.6px（「汉口店设计二中心（刘建华）」）、
       签到情况 4 场次约 184px、成绩表头「成绩/补考成绩」71px、备注 6.5px。
     按 8pt 与 9pt（app.css 打印口径）两种字号**取大者**留富余，横竖两版纸张都不折行。
     table-layout:fixed ⇒ 列宽由 thead 第一行决定，改这里就够（分段行 colspan=5 不受影响）。 */
  body.summary-page table thead th:nth-child(1) { width: 11%; }   /* 学员 */
  body.summary-page table thead th:nth-child(2) { width: 30%; }   /* 所属部门（加宽） */
  body.summary-page table thead th:nth-child(3) { width: 26%; }   /* 签到情况 */
  body.summary-page table thead th:nth-child(4) { width: 14%; }   /* 成绩/补考成绩（表头 7 字，需够宽） */
  body.summary-page table thead th:nth-child(5) { width: 19%; }   /* 备注（收窄） */
  /* 备注列：打印时只输出文字，不要输入框的框线/底色（2026-09-23 业务方要求） */
  body.summary-page input.form-control,
  body.summary-page input.weui-input {
    border: 0 !important; box-shadow: none !important; background: transparent !important;
    padding: 0 !important; color: inherit !important; font-size: inherit !important;
  }
  /* 备注列 placeholder 不打印（2026-10-10）：原本「人工备注，如：请假 / 病」会灰字印满整列 */
  body.summary-page input.form-control::placeholder,
  body.summary-page input.weui-input::placeholder { color: transparent !important; }
  body.summary-page input.form-control::-webkit-input-placeholder { color: transparent !important; }
  /* 备注列「打印时显示完整内容 —— 自动换行」（2026-10-10 业务方要求）：
     屏幕端的备注是**单行** <input>（控件本身不能换行）⇒ 打印时隐藏输入框，
     改由视图里的镜像文字 `<span class="wx-print-only">` 输出（无框线、可换行、内容完整）。 */
  body.summary-page input.form-control,
  body.summary-page input.weui-input { display: none !important; }
  body.summary-page .wx-print-only { display: inline !important; white-space: normal !important; word-break: break-word; overflow-wrap: anywhere; }
  body.summary-page .wx-screen-only { display: none !important; }
  /* 「没签到、没请假、也没考试」的人不进 PDF（2026-10-10 业务方要求）：
     行标记 ca_blank 见 course_attendance_data()；屏幕端照常显示全部（便于编辑备注 / 查看缺考名单）。
     2026-11-05 起：**有关联考试的培训只留有考试记录的人**（标记仍叫 ca_blank，口径见该函数注释）。 */
  body.summary-page .wx-row-blank { display: none !important; }
  /* 店面分段各起一页（2026-11-05 业务方要求）：「武昌店」「汉口店」「非店面」每段另起一页。
     类名由视图打在第 2 个起的**分段标题行**上（两个报表都打：培训汇总 / 考试成绩报表）；
     Chrome 实测 `tr { break-before:page }` 打印生效（60 行跨页 + 该行分页 = 3 页）。
     段内自然续页，`thead` 每页自动重复。 */
  body.summary-page tr.wx-group-start { break-before: page; page-break-before: always; }
  /* 报表底部「未参加考试」姓名行（2026-11-05 业务方要求）：
     屏幕隐藏（见上方 `body.summary-page .wx-print-only` 规则），打印时独立成段 ——
     一行列出名单里没考的人，不再每人占一行。两种报表共用：培训汇总 + 考试成绩报表。 */
  body.summary-page .wx-print-foot {
    display: block !important;
    margin-top: 4mm;
    font-size: 9pt;
    white-space: normal !important;
    word-break: break-word;
    overflow-wrap: anywhere;
  }
  /* 考试成绩报表列宽（3 列：学员 / 所属部门 / 成绩 · 补考成绩 —— 2026-11-05 业务方要求
     把「成绩」「补考成绩」合并成一列，腾出的宽度全部给「所属部门」，且单元格**不折行**）
     —— 覆盖本块上方培训报表的 nth-child 列宽（那边是 5 列口径，第 3 列是「签到情况」）。
     实测（8pt / 打印）：学员最长「卡萨帝吴浩然」≈14mm、部门最长「汉口店设计二中心（刘建华）」≈39mm、
     分数最长「100.0 / 100.0」≈21mm；两栏版式每表可用宽 ≈134mm
     ⇒ 部门列按 60%（≈80mm）留超过一倍余量，学员 14% / 分数 26% 也都够，故强制 nowrap 也不会溢出。 */
  body.summary-page table.exam-report-table thead th:nth-child(1) { width: 14%; }   /* 学员（收窄） */
  body.summary-page table.exam-report-table thead th:nth-child(2) { width: 60%; }   /* 所属部门（尽量宽） */
  body.summary-page table.exam-report-table thead th:nth-child(3) { width: 26%; }   /* 成绩 / 补考成绩 */
  /* 「不要择行」（业务方口径）：本块上方 `tr/td/th { white-space: normal }` 会把长部门名折行，
     考试成绩报表这里强制 nowrap —— 列宽已按最长内容留足余量，不会压到相邻列。 */
  body.summary-page table.exam-report-table th,
  body.summary-page table.exam-report-table td { white-space: nowrap !important; }

  /* 考试成绩报表：PDF 走「每店完整成篇 + 段内两栏」（2026-11-05 引入，2026-11-06 按业务方口径改造）
     · 屏幕那张单表加 `.wx-print-hide` ⇒ PDF 里不输出（否则两套表都印）；
       **屏幕上的总标题 / 全场汇总也加了 `.wx-print-hide`** —— PDF 从每店自己的标题开始；
     · `.wx-print-report` 是打印专用容器（屏幕端 display:none，见本文件上方）；
     · 分页打在每个 `.wx-print-page`（一整页一个块，块级元素分页最可靠），第 2 个起 break；
     · 两栏用 flex 平分，表格宽度交给 flex（覆盖本块的 `table { width:100% }`），
       **不做跨页排版** —— 每页最多 `$rowsPerCol × 2` 行，由视图 array_chunk 切好（Chrome 里表格跨页不可控）。 */
  body.summary-page .wx-print-hide { display: none !important; }
  body.summary-page .wx-print-report { display: block !important; }
  body.summary-page .wx-print-page + .wx-print-page { break-before: page; page-break-before: always; }
  /* 2026-11-06 业务方要求「每个店完整成篇」（覆盖 2026-11-05 的「只在头尾汇总一次」）：
     每页顶部 = 标题「<考试名> · <店面>（共 N 人） · 成绩报表」+ 本店汇总，
     底部 = 本店「未参加考试」名单；段内需要续页时**每页重复**这三块（由视图逐页输出）。
     高度预算：A4 横向可用高 ≈186mm；每栏 28 行 × ~5mm ≈ 140mm + 标题 6 + 汇总 5 + 名单 4~10 ≈ 165mm。 */
  body.summary-page .wx-print-title { font-weight: 700; font-size: 11pt; text-align: center; margin: 0 0 1.5mm; }
  body.summary-page .wx-print-sum {
    font-size: 8pt; line-height: 1.35; margin: 0 0 1.5mm;
    white-space: normal !important; word-break: break-word;
  }
  body.summary-page .wx-print-empty { font-size: 8pt; color: #666; margin: 0 0 1.5mm; }
  body.summary-page .wx-print-segfoot {
    font-size: 7.5pt; line-height: 1.3; margin-top: 1.5mm;
    white-space: normal !important; word-break: break-word; overflow-wrap: anywhere;
  }
  body.summary-page .wx-print-cols { display: flex; gap: 5mm; align-items: flex-start; }
  body.summary-page .wx-print-cols > table { flex: 1 1 0; width: auto !important; min-width: 0; }
  /* 两栏表格要「一行一人、尽量紧凑」：默认 td padding（0.75rem）在打印里会把每行撑到 ~7.7mm，
     32 行就超出 A4 横向可用高（≈180mm）⇒ 每页只放得下 8 行。这里压到 ~5mm/行（8pt 字 + 1.25 行高）。
     2026-11-07 再压到 0.6mm / 1.2（实测行高 14.75pt → 14.25pt）：业务方要求「武昌店 62 人不要拆成 2 页」，
     原口径每页只放 60 人（每栏 30 行）⇒ 62 人硬生生多出一页只有 2 人的空白页。
     压行高后 30 行页面余 47pt，**每栏 32 行仍余 18.5pt（≈6.5mm）**，故视图把每栏上限提到 32 行
     （容量按段动态算，见 `app/views/exam/scores_report.php` 的 $capFor()）。 */
  body.summary-page .wx-print-report td,
  body.summary-page .wx-print-report th { padding: 0.6mm 1.2mm !important; line-height: 1.2 !important; }
  body.summary-page .wx-print-report .table-sm > :not(caption) > * > * { padding: 0.6mm 1.2mm !important; }
}

/* ===== 66. 首页改造（2026-09-23）：可点用户块 / 多徽章统一样式 ===== */
/* ① 顶部用户信息块**整块可点 → 我的资料**（去掉 <a> 默认的链接色与下划线） */
a.wx-me, a.wx-me:hover, a.wx-me:focus { color: inherit; text-decoration: none; }
.wx-me__arrow { display: flex; align-items: center; flex: none; color: var(--wx-text-3); margin-left: 8px; }
/* ② 签到徽章：多个徽章一行、间距一致（**样式统一，仅用颜色区分状态**） */
.wx-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.wx-badges .weui-badge { margin-top: 0; }

/* ===== 58. 已过期的活动 / 课程列表项：浅色（2026-09-19 业务口径） =====
   「未过期在前（日期升序 → 最接近发生的置顶）、已过期置底」由 SQL 排序保证；
   这里只管"看起来是过去的"。用 `.is-past *` + !important 统一压掉内部各种颜色
   （表格 td 的 text-muted/fw-semibold/text-primary、媒体盒的标题/描述、badge 等）。 */
.is-past,
.is-past * { color: var(--wx-text-3) !important; }
.is-past .weui-media-box__title { font-weight: 400; }

/* ===== 59. 签到名单内的「部门筛选」条（2026-09-19） =====
   复用 .wx-tagbar / .wx-tag 的标签外观，但去掉"页面级筛选条"的 padding 与下边框
   —— 它是嵌在「签到情况」名单里的一行轻量筛选，不占整屏宽度节奏。 */
.wx-deptfilter {
  padding: 0;
  margin: 0 0 10px;
  background: transparent;
  border-bottom: 0;
}
.wx-deptfilter .wx-tag { cursor: pointer; }

/* ===== 60. 区块标题行「标题 + 右上操作按钮」（2026-09-22，点名页顶部） =====
   标题占满、超出省略；右侧按钮组**小尺寸**且不参与压缩；
   窄屏（标题太长）时按钮组整体换到下一行、仍右对齐。 */
.wx-hd-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.wx-hd-row__t { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wx-hd-row .wx-btnbar { flex: 0 0 auto; justify-content: flex-end; margin-left: auto; }
.wx-hd-row .weui-btn {
  display: inline-flex; align-items: center; justify-content: center;   /* 严格居中：<a> 与 <button> 一致（<a> 默认 block 会偏上） */
  width: auto; min-width: 0; margin: 0; padding: 5px 12px; font-size: 13px; line-height: 1.5;
}

/* ===== 61. `<a>` 当按钮用时的文字严格居中（2026-09-22，全项目统一） =====
   `.weui-btn` 是 `display:block`，桌面端又给了 `min-height:40px` ⇒ **`<a>` 里的文字会偏上**
   （CDP 实测：「返回培训」上空隙 7 / 下空隙 17，而 `<button>` 是 11/13 —— button 的文字天然垂直居中）。
   只针对 `<a>`（不影响 `<button>` 的既有表现）：改成 flex 居中 ⇒ 与 `<button>` 完全一致。
   项目里 61 个 `<a class="weui-btn">`（返回 / 新增 / 导出等）一次性生效，无需逐个改视图。
   ⚠️ 第二条：将来若把 `weui-btn_block`（整行铺满）用在 `<a>` 上，仍保证铺满 + 居中。 */
a.weui-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
a.weui-btn.weui-btn_block { display: flex; width: 100%; }

/* ===== 62. 「测试」二维码弹层（2026-09-22，考试列表页） ===== */
.wx-qrmask { position: fixed; left: 0; top: 0; right: 0; bottom: 0; background: rgba(0,0,0,.5); z-index: 4998; }
.wx-qrmask[hidden], .wx-qrbox[hidden] { display: none; }
.wx-qrbox {
  position: fixed; left: 50%; top: 50%; transform: translate(-50%,-50%);
  width: min(92vw, 340px); max-height: 88vh; overflow-y: auto;
  background: #fff; border-radius: 12px; padding: 18px 16px; z-index: 4999;
  box-shadow: 0 8px 32px rgba(0,0,0,.18); text-align: center;
}
.wx-qrbox__hd { font-size: 15px; font-weight: 600; color: var(--wx-text-1, #191919); margin-bottom: 12px; }
.wx-qrbox__code { display: flex; justify-content: center; margin: 2px 0 10px; }
.wx-qrbox__code img, .wx-qrbox__code canvas { width: 190px !important; height: 190px !important; }
.wx-qrbox__tip { font-size: 12px; color: var(--wx-text-2, #7f7f7f); line-height: 1.6; margin: 0 0 12px; }
.wx-qrbox__sub { font-size: 12px; color: var(--wx-text-3, #b2b2b2); text-align: left; border-top: 1px solid var(--wx-line, #ededed); padding-top: 10px; margin-bottom: 6px; }
.wx-qrbox__list { text-align: left; max-height: 128px; overflow-y: auto; margin-bottom: 10px; }
.wx-qrbox__item { display: block; font-size: 13px; color: var(--wx-text-1, #191919); line-height: 1.9; }
.wx-qrbox__item b { color: var(--wx-green, #07c160); }
.wx-qrbox__item em { font-style: normal; color: var(--wx-text-3, #b2b2b2); font-size: 12px; }
.wx-qrbox__none { font-size: 12px; color: var(--wx-text-3, #b2b2b2); }
.wx-qrbox__url { font-size: 11px; color: var(--wx-text-3, #b2b2b2); word-break: break-all; margin-bottom: 12px; }
.wx-qrbox__opr .weui-btn { width: 100% !important; margin: 0; }

/* ===== 63. 错题标红 & 测试成绩明细入口（2026-09-23） ===== */
/* 测试弹层：自己的那条成绩可点，进该次错题明细（别人的记录不带链接 ⇒ 权限不变） */
.wx-qrbox__item--link { display: block; color: inherit; text-decoration: none; }
.wx-qrbox__item--link:hover { opacity: .75; }
.wx-qrbox__go { color: var(--wx-green, #07c160); }
/* 正式结果页的错题标红用 bootstrap `border-danger`（bootstrap-utilities 已含），此处无需样式 */

/* ===== 64. 桌面端「交卷失败」提示条：WeUI toptips 显示态（2026-10-13） ===== */
/* 考试页（exam/take）交卷失败的提示改由 JS 注入 .weui-toptips.weui-toptips_warn ——
   不再用 alert：电脑版微信小程序 web-view（MiniProgramEnv/Windows）会静默吞掉
   原生 alert/confirm，学生点「交卷」完全没反应（生产访问日志可证：0 条 exam_submit）。 */
/* WeUI 只给了 .weui-toptips{display:none}，显示态 _show 仅在手机端补丁层
   （weui-fix.css 第 39 节）定义过；这里给桌面端补同一条，使同一份 DOM 两端都能显示。
   web-wx.css 在 weui.min.css 之后加载 ⇒ 同权重后置覆盖，无需 !important。 */
.weui-toptips_show { display: block; }
/* WeUI 官方只给了 .weui-toptips_warn 的底色，其它类型会落到「白字 + 无底色」⇒ 看不见；
   与手机端补丁层（weui-fix.css 第 39 节）保持同一套色值，使同一份 DOM 两端观感一致。 */
.weui-toptips_success { background-color: #07c160; }
.weui-toptips_danger  { background-color: #fa5151; }
.weui-toptips_info    { background-color: #10aeff; }


/* ===== 67. 「培训简介」Markdown 排版 + 底部固定签到按钮（2026-10-13 扫码签到改版 · 桌面端） =====
   与手机端补丁层（weui-fix.css 第 70 节）同一份 DOM、同一套类名，只是容器换成桌面卡片：
   · .wx-md          培训简介（courses.description ⇒ md_to_html()）的排版；
   · .wx-bottombar   底部固定操作条（未签 =「去签到」｜已签 / 待确认 =「已签到」置灰）；
   · .wx-bottombar-gap 内容让位占位。
   ⚠️ 桌面端左侧有 230px 固定侧栏（第 51 节）⇒ 操作条从 230px 起、不压侧栏；
      ≤900px 时侧栏转为顶部横向导航（第 51.5 节）⇒ 操作条改为贴左 0。 */
.wx-md {
  padding: 16px 24px;
  font-size: 14px;
  line-height: 1.75;
  color: var(--wx-text);
  word-break: break-word;
}
.wx-md > :first-child { margin-top: 0; }
.wx-md > :last-child  { margin-bottom: 0; }
.wx-md h1, .wx-md h2 { margin: 16px 0 8px; font-size: 18px; font-weight: 600; line-height: 1.4; }
.wx-md h3, .wx-md h4, .wx-md h5, .wx-md h6 { margin: 12px 0 8px; font-size: 15px; font-weight: 600; line-height: 1.4; }
.wx-md p { margin: 0 0 8px; }
.wx-md ul, .wx-md ol { margin: 0 0 8px; padding-left: 20px; }
.wx-md li { margin: 0; line-height: 1.75; list-style: disc; }
.wx-md ol li { list-style: decimal; }
.wx-md a { color: var(--wx-link); text-decoration: none; word-break: break-all; }
.wx-md a:hover { text-decoration: underline; }
.wx-md strong { font-weight: 600; }
.wx-md del { color: var(--wx-text-3); }
.wx-md code { padding: 1px 5px; border-radius: 4px; background: var(--wx-bg); font-size: 13px; }
.wx-md pre { margin: 0 0 8px; padding: 12px; border-radius: 4px; background: var(--wx-bg); overflow-x: auto; }
.wx-md pre code { padding: 0; background: none; font-size: 13px; line-height: 1.6; }
.wx-md blockquote { margin: 0 0 8px; padding: 8px 12px; border-left: 3px solid var(--wx-green); background: var(--wx-bg); color: var(--wx-text-2); }
.wx-md hr { margin: 16px 0; border: 0; border-top: 1px solid var(--wx-line-2); }

/* 底部固定操作条 */
.wx-bottombar-gap { height: 88px; }                      /* 内容让位（栏高 72px + 下边距） */
.wx-bottombar {
  position: fixed;
  left: 230px;
  right: 0;
  bottom: 0;
  z-index: 1015;                                         /* 低于顶栏 / 侧栏（1030） */
  display: flex;
  justify-content: center;
  padding: 12px 16px;
  background: var(--wx-white);
  border-top: 1px solid var(--wx-line-2);
}
.wx-bottombar__btn { width: 320px; max-width: 100%; margin: 0; }
.wx-bottombar__btn.is-done { background: var(--wx-bg); color: var(--wx-text-2); }
@media (max-width: 900px) {
  .wx-bottombar { left: 0; }
}
/* 打印 / 存为 PDF 时不输出操作条（第 57 节同口径） */
@media print {
  .wx-bottombar, .wx-bottombar-gap { display: none !important; }
}

/* ===== 68. 接单报备子系统（2026-10-15，独立模块 · 桌面端） ===== */
.wx-br-desc { font-size: 12px; color: var(--wx-text-2); line-height: 1.4; }
.wx-br-name { color: var(--wx-link); text-decoration: none; }
.wx-br-name:hover { color: var(--wx-green); }
.wx-br-slot { color: var(--wx-text-2); font-size: 12px; }
.wx-br-v { line-height: 1.6; white-space: normal; max-width: 720px; }

/* ===== 69. 接单报备 · 录入口重做（2026-10-16 · 桌面端）=====
   同一份 HTML（app/views/dispatch/form.php），桌面端单独排版：卡片描边 + 控件放宽 + 只读/可编辑一致。
   2026-10-16 二次修订：可编辑时表单永远空白（不预填已存记录）+ 事由框浅灰占位符
   + 去掉「必选 / 必填 ≥5 字 / 至少 1 项」徽标与「N 字」计数（.br-req / .br-opt / .br-count 已删） */
#brForm { max-width: 820px; }
.br-head { margin-bottom: 16px; }
.br-head__t { margin: 0 0 8px; font-size: 17px; font-weight: 600; line-height: 1.4; color: var(--wx-text); }
.br-head__s { margin: 0; font-size: 13px; line-height: 1.5; color: var(--wx-text-2); }
.br-card { margin-bottom: 16px; padding: 16px 20px; background: var(--wx-white); border: 1px solid var(--wx-line); border-radius: var(--wx-radius); }
.br-card__hd { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
.br-card__t { margin: 0; font-size: 15px; line-height: 1.4; color: var(--wx-text); }
.br-flag { flex: none; margin-left: 8px; padding: 2px 8px; font-size: 12px; color: #fff; background: var(--wx-green); border-radius: 10px; }
.br-field { margin-bottom: 16px; }
.br-field:last-child { margin-bottom: 0; }
.br-label { margin: 0 0 8px; font-size: 14px; line-height: 1.4; color: var(--wx-text); }
.br-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.br-chip { position: relative; display: inline-block; }
.br-chip input { position: absolute; top: 0; left: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
.br-chip > span { display: inline-block; padding: 6px 16px; font-size: 14px; line-height: 1.4; color: var(--wx-text); background: var(--wx-white); border: 1px solid var(--wx-line); border-radius: var(--wx-radius-sm); }
.br-chip:hover > span { border-color: var(--wx-green); color: var(--wx-green); }
.br-chip input:checked + span { color: #fff; background: var(--wx-green); border-color: var(--wx-green); }
.br-chip input:disabled + span { opacity: .5; }
.br-ta { display: block; width: 100%; max-width: 640px; box-sizing: border-box; min-height: 72px; padding: 10px 12px; font-size: 14px; line-height: 1.6; color: var(--wx-text); background: var(--wx-white); border: 1px solid var(--wx-line); border-radius: var(--wx-radius-sm); }
.br-ta:focus { border-color: var(--wx-green); outline: none; }
/* 未填写时只显示浅灰占位符（点击即消失、清空即复现） */
.br-ta::placeholder { color: var(--wx-text-3); opacity: 1; }
.br-timerow { display: flex; align-items: center; margin-bottom: 8px; }
.br-timerow__k { flex: none; width: 56px; font-size: 13px; color: var(--wx-text-2); }
.br-time { display: inline-flex; align-items: center; }
.br-time__sep { margin: 0 5px; color: var(--wx-text-3); }
.br-sel { min-width: 76px; padding: 6px 8px; font-size: 14px; color: var(--wx-text); background: var(--wx-white); border: 1px solid var(--wx-line); border-radius: var(--wx-radius-sm); }
.br-tip { margin: 8px 0 0; font-size: 12px; line-height: 1.5; color: var(--wx-text-2); }
.br-slot { display: flex; align-items: center; margin-bottom: 8px; }
.br-slot__sep { margin: 0 8px; color: var(--wx-text-3); }
.br-slot-del { flex: none; margin-left: auto; padding: 5px 12px; font-size: 13px; color: var(--wx-link); background: var(--wx-white); border: 1px solid var(--wx-line); border-radius: var(--wx-radius-sm); }
.br-slot-del:hover { color: var(--wx-green); border-color: var(--wx-green); }
.br-add { display: inline-block; margin-top: 8px; padding: 6px 16px; font-size: 13px; color: var(--wx-link); background: var(--wx-white); border: 1px dashed var(--wx-line); border-radius: var(--wx-radius-sm); }
.br-add:hover { color: var(--wx-green); border-color: var(--wx-green); }
.br-foot { margin-top: 16px; }
.br-missing { margin: 0 0 8px; font-size: 12px; line-height: 1.5; color: var(--wx-text-2); }
.br-submit { min-width: 160px; }
.br-submit[disabled] { opacity: .45; }

/* ============================================================
   70. hover 只允许「变色」（2026-10-16 业务方口径）
   ------------------------------------------------------------
   业务方反馈：「鼠标经过列表每一项时，文字大小 / 底色变化很生硬」。
   根因 = 历史遗留的 `app.css`（Tailwind 产物，桌面端仍在加载）里有一批
   hover 规则带 transform / padding-left / 渐变底色，而 `web-wx.css` 只覆盖了
   `.card:hover` / `.btn:hover` / `.quiz-option:hover` 三条，下面这几条**从未覆盖**：
     · .table-hover 行 hover 的 transform: scale(1.002)     ← 整行缩放 ⇒ 文字变大 + 亚像素发虚（真凶）
     · .table-hover 行 hover 的 background: linear-gradient  ← 底色是渐变，不是纯色
     · .navbar-nav .nav-link hover 的 transform: translateY(-1px) ← 菜单项上移 1px
     · .dropdown-item hover 的 padding-left: 1rem           ← 文字右移 2.4px（基础 .85rem）
   口径：**hover 只允许改 color / background-color / border-color / opacity**；
   禁止 transform / font-* / padding / margin / width / height / letter-spacing。
   手机端（WeUI）没有 hover，不受影响；`weui.min.css` 不动。
   查漏命令（不带花括号，免得干扰样式表的括号平衡检查）：
     grep -n "hover" public/assets/css/app.css | grep -E "transform|scale|translate|padding-left|font-size"
   ------------------------------------------------------------ */
.table-hover > tbody > tr { transition: background-color .12s ease; }
.table-hover > tbody > tr:hover,
.table-hover > tbody > tr:hover > td,
.table-hover > tbody > tr:hover > th { transform: none !important; }
/* 行底色改用「表格行专用」那一档（比区块底更浅）：--dt-desk-bg-hover-2 = #fafafa */
.table-hover > tbody > tr:hover > * {
  background: var(--dt-desk-bg-hover-2) !important;
  transition: background-color .12s ease;
}
/* 下拉菜单：只变色 + 只过渡颜色类属性（app.css 的基础 padding-left 是 .85rem） */
.navbar .dropdown-item,
.dropdown-item { transition: color .12s ease, background-color .12s ease; }
.navbar .dropdown-item:hover,
.navbar .dropdown-item:focus,
.dropdown-item:hover,
.dropdown-item:focus { transform: none !important; padding-left: .85rem !important; }



/* ===== 71. 接单报备 · 报表「几点开始」小字 + 红字提示（2026-10-17 业务方口径） ===== */
/* ⚠️ 2026-10-17 二次改版：「今日接单报表」改为板块 + 格子（见 §72），
   `.wx-br-begin`（姓名下方「HH:MM 起」）/`.wx-br-deptcol`（「设计部」列）已弃用 ——
   整半天可接单的人不显示时间，只有「其它时段」的人在格子里显示 `HH:MM-HH:MM`（`.wx-br-cell__t`）。 */
/* 半天「不在公司」> 1h 提示 / ≥ 2.5h 锁定文案；事由与去向矛盾；其它时段重叠 */
.br-warn { margin: 8px 0 0; font-size: 12px; line-height: 1.5; color: var(--dt-desk-error); }
/* 权限页归口花名册：设计部列宽（原来写在内联 style 里） */
.br-deptcol { min-width: 200px; }

/* ===== 72. 接单报备 · 今日接单报表板块化（2026-10-17 业务方要求 · 桌面端）=====
   ① 去掉「全天 / 其它时段」行 —— 全部并入 上午 / 下午；
   ② 去掉「设计部」列 —— 每个设计部一个板块（板块之间一条分割线，紧凑排版）；
   ③ 每人一个格子：时间满 = 绿底实色（＝点名页「已签到」），没满 = 线框白底（＝点名页「未签到」）；
   ④ 桌面放得下 ⇒ **每行 4 个**（2026-10-17 第 3 轮；手机端 `weui-fix.css` §75 是每行 3 个）；
   ⑤ **所有格子等高** —— 没时间的格子也占一行「时间位」（`__t` 空 span + `min-height:1.3em`）。 */
.wx-br-dept { padding: 16px; border-top: 1px solid var(--wx-line); }
.wx-br-dept:first-child { padding-top: 0; border-top: 0; }
.wx-br-dept__hd { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; margin-bottom: 12px; }
.wx-br-dept__t { font-size: 15px; font-weight: 600; line-height: 1.4; color: var(--wx-text); }
.wx-br-dept__s { font-size: 12px; line-height: 1.4; color: var(--wx-text-2); }
.wx-br-half { display: flex; align-items: baseline; gap: 5px; margin: 0 0 8px; font-size: 13px; line-height: 1.4; font-weight: 600; color: var(--wx-text); }
.wx-br-half__s { font-size: 12px; font-weight: 400; color: var(--wx-text-2); }
.wx-br-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin: 0 0 14px; }
.wx-br-grid:last-child { margin-bottom: 0; }
.wx-br-cell {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 4px;                              /* 与 WeUI `.weui-cell__desc` 的上间距（4px）同口径 */
  box-sizing: border-box;
  width: 100%;
  min-height: 42px;
  padding: 8px;
  font-size: 14px;
  line-height: 1.25;
  text-align: center;
  color: var(--wx-text);
  background: var(--wx-white);
  border: 1px solid #d9d9d9;              /* 没满 = 线框（与点名页「未签到」同色） */
  border-radius: 8px;
  overflow-wrap: anywhere;
  text-decoration: none;
}
/* hover 只允许变色（§70 口径） */
.wx-br-cell:hover { color: var(--wx-green); border-color: var(--wx-green); }
.wx-br-cell.is-full { background: var(--wx-green); border-color: var(--wx-green); }
.wx-br-cell.is-full .wx-br-cell__n,
.wx-br-cell.is-full .wx-br-cell__t { color: #fff; }
.wx-br-cell.is-full:hover { background: var(--wx-green-d); border-color: var(--wx-green-d); }
.wx-br-cell__n { font-size: 14px; line-height: 1.25; }
/* 等高关键：没时间的格子也占一行（空 span ⇒ 靠 min-height 撑起，与有时间的格子等高） */
.wx-br-cell__t { display: block; min-height: 1.3em; font-size: 11px; line-height: 1.3; color: var(--wx-text-2); }
.wx-br-empty { margin: 0 0 14px; font-size: 12px; line-height: 1.4; color: var(--wx-text-2); }

/* ===== 73. 接单报备 · 报表现图切换（「按时间」/「按团队」顶部标签页 · 桌面端，2026-10-17 第 3 轮）=====
   组件 = **WeUI 官方** `.weui-navbar`（`position:relative`，非悬浮）。桌面端只做两件小事：
   ① 字号 / 内边距按桌面尺度（15px / 12px，与 `web-wx.css` 里其他 WeUI 组件的桌面取值一致）；
   ② 去掉 item 之间的竖分隔线（卡片内不需要）与 navbar 自带的下细线（卡片自身有分割）。
   两个视图的卡片结构完全一致（`.wx-br-dept` / `.wx-br-half` / `.wx-br-grid`），无需额外样式。 */
.wx-br-nav { margin: 0 0 8px; }
.wx-br-nav.weui-navbar:after { display: none; }
.wx-br-nav .weui-navbar__item { padding: 12px 0; font-size: 15px; font-weight: 600; color: var(--wx-text-2); }
.wx-br-nav .weui-navbar__item:after { display: none; }
.wx-br-nav .weui-navbar__item.weui-bar__item_on { color: var(--wx-text); }

/* ===== 74. 接单报备 · 权限页「一行多个勾选框」（2026-10-17 第 4 轮 · 桌面端）=====
   同手机端：组件是 WeUI 原生勾选框（`weui-cells_checkbox` + `weui-check` + `weui-icon-checked`），
   这里只补横向排列的布局。 */
.wx-br-picks { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px 16px; max-width: 100%; }
.wx-br-pick { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; line-height: 1.4; color: var(--wx-text); }
.wx-br-pick .weui-icon-checked { flex: none; }


/* ===== 75. 接单报备 · 今日报备情况 + 考勤统计（2026-10-21 业务方要求 · 桌面端）=====
   与手机端同源：表头浅绿 `#E2F0D9` = 系统出数 / 浅蓝 `#DAE3F3` = 管理手工填写（WeUI `.weui-switch`）。
   桌面端只把字号与内边距调到桌面尺度，并给横向滚动兜底（窗口很窄时表格不被压扁）。 */
.wx-br-red { color: #fa5151; }                               /* = WeUI `--weui-RED` */
.wx-br-att-wrap { margin: 0 0 16px; overflow-x: auto; }
.wx-br-att { border-collapse: collapse; width: 100%; min-width: 1120px; font-size: 12px; line-height: 1.5; color: var(--wx-text); }
.wx-br-att th,
.wx-br-att td { padding: 8px 12px; border: 1px solid var(--wx-line); text-align: center; white-space: nowrap; }
.wx-br-att thead th { font-weight: 600; background: #f7f7f7; }
.wx-br-att th.is-auto { background: #E2F0D9; }
.wx-br-att th.is-manual { background: #DAE3F3; }
.wx-br-att td.is-manual .weui-switch { vertical-align: middle; }
.wx-br-att__dept { text-align: left; }
.wx-br-att__zero { color: var(--wx-text-3); }
.wx-br-att__off { color: var(--wx-text-3); }
.wx-br-att__empty { padding: 16px; text-align: center; color: var(--wx-text-2); }


/* ===== 76. 扫码直达（2026-10-17 · 桌面端，随 m4 分支并入 2026-10-22）=====
   管理员专属页：固定二维码 + 当日 / 即将开始的活动与考试专属码。
   卡片式网格，随宽度自适应；二维码 160px。 */
.wx-qrhub__sec { margin: 0 0 22px; }
.wx-qrhub__hd { margin: 0 0 4px; font-size: 16px; font-weight: 600; line-height: 1.4; color: var(--wx-text); }
.wx-qrhub__tip { margin: 0 0 12px; font-size: 12px; line-height: 1.5; color: var(--wx-text-2); }
.wx-qrhub__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 16px; }
.wx-qrhub__card { min-width: 0; padding: 16px 12px; text-align: center; background: var(--wx-white); border: 1px solid var(--wx-line); border-radius: var(--wx-radius); }
.wx-qrhub__code { display: flex; justify-content: center; margin: 0 0 10px; }
.wx-qrhub__box { width: 160px; max-width: 100%; }
.wx-qrhub__box canvas,
.wx-qrhub__box img,
.wx-qrhub__img { width: 160px !important; max-width: 100%; height: auto !important; display: block; }
.wx-qrhub__t { margin: 0; font-size: 14px; line-height: 1.4; color: var(--wx-text); overflow-wrap: anywhere; }
.wx-qrhub__d { margin: 4px 0 0; font-size: 12px; line-height: 1.4; color: var(--wx-text-2); overflow-wrap: anywhere; }
.wx-qrhub__empty { margin: 0; padding: 20px 0; text-align: center; font-size: 13px; color: var(--wx-text-2); }


/* ===== 77. 接单报备 · 权限页三标签 / 部门折叠 / 新增部门（2026-10-22 第 8 轮 · 桌面端）=====
   与手机端同构：标签复用 `.wx-br-nav`（已有），设计部折叠用原生 `<details>`。
   桌面端 `.weui-cell` 左右内边距是 32px（见「WeUI 区块内边距兜底」节）⇒ summary 与之对齐。 */
.wx-br-pane[hidden] { display: none; }
.wx-br-tabs { margin-bottom: 8px; }
.wx-br-fold { background: var(--wx-white); }
.wx-br-fold__hd { display: flex; align-items: center; gap: 12px; padding: 8px 32px; cursor: pointer; list-style: none; border-bottom: 1px solid var(--wx-line-2); }
.wx-br-fold__hd:hover { background: #fafafa; }
.wx-br-fold[open] > .wx-br-fold__hd { border-bottom-color: transparent; }   /* 展开后由 cells 自己的上边线分隔 */
.wx-br-fold__hd::-webkit-details-marker { display: none; }
.wx-br-fold__t { flex: none; font-size: 14px; line-height: 1.4; font-weight: 600; color: var(--wx-text); }
.wx-br-fold__s { flex: 1 1 auto; font-size: 12px; line-height: 1.4; color: var(--wx-text-2); }
.wx-br-fold__chev {
  flex: none; width: 8px; height: 8px; margin-right: 4px;
  border-right: 2px solid var(--wx-text-3); border-bottom: 2px solid var(--wx-text-3);
  transform: rotate(45deg); transition: transform .2s;
}
.wx-br-fold[open] > .wx-br-fold__hd .wx-br-fold__chev { transform: rotate(-135deg); }
.wx-br-fold > .weui-cells { margin-top: 0; }
.wx-br-adddept .weui-cell__ft { padding-left: 8px; }
.wx-br-adddept .weui-btn_mini { margin: 0; white-space: nowrap; }

/* ===== 78. 接单报备 · 报备情况按团队 / 标签绿字 / 格子姓名居中 / 详情页考勤核实（2026-10-22 第 9 轮 · 桌面端）=====
   与手机端同源（`.wx-br-fill__*` / `.wx-br-chip` / `.wx-br-person*` / `.wx-br-mk*`），桌面端只调尺度：
   ① 标签活跃 = 绿字（去掉原来的深色）；② 姓名居中；③ 团队卡片浅灰底、胶囊 12px；
   ④ 详情页核实开关在**右侧一行**（桌面宽度够，不需要横向滚动）。 */
.wx-br-nav .weui-navbar__item.weui-bar__item_on { color: var(--wx-green); }

.wx-br-cell { gap: 0; }
.wx-br-cell__n { flex: 1 1 auto; display: flex; align-items: center; justify-content: center; }
.wx-br-cell__t:empty { display: none; }

.wx-br-fill__teams { display: flex; flex-direction: column; gap: 8px; }
.wx-br-fill__team { padding: 12px; background: #fafafa; border-radius: var(--wx-radius-sm); }
.wx-br-fill__hd { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; margin: 0 0 8px; }
.wx-br-fill__t { font-size: 14px; font-weight: 600; line-height: 1.4; color: var(--wx-text); }
.wx-br-fill__hd.is-done .wx-br-fill__t { color: var(--wx-green); }
.wx-br-fill__s { font-size: 12px; line-height: 1.4; color: var(--wx-text-2); }
.wx-br-fill__chips { display: flex; flex-wrap: wrap; gap: 8px; }
.wx-br-chip { padding: 5px 8px; font-size: 12px; line-height: 1.4; color: var(--wx-text-2); background: var(--wx-line-2); border-radius: 4px; text-decoration: none; }
.wx-br-chip:hover { color: var(--wx-green); }
.wx-br-chip.is-done { color: #fff; background: var(--wx-green); }
.wx-br-chip.is-done:hover { color: #fff; background: var(--wx-green-d); }

.wx-br-person { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin: 0 0 8px; }
.wx-br-person__t { font-size: 14px; line-height: 1.4; color: var(--wx-text-2); }
.wx-br-person__back { flex: none; padding: 5px 12px; font-size: 13px; line-height: 1.4; color: var(--wx-green); background: var(--wx-white); border: 1px solid var(--wx-line); border-radius: 16px; text-decoration: none; }
.wx-br-person__back:hover { border-color: var(--wx-green); }

.wx-br-pr .weui-cell__ft { min-width: 0; margin-left: 16px; }
.wx-br-mk { display: flex; align-items: center; justify-content: flex-end; gap: 12px; }
.wx-br-mk__set,
.wx-br-mk__sw { display: inline-flex; align-items: center; gap: 5px; margin: 0; }
.wx-br-mk__lab { font-size: 11px; line-height: 1.4; color: var(--wx-text-2); white-space: nowrap; }
.wx-br-mk__b { padding: 5px 8px; font-size: 12px; line-height: 1.4; color: var(--wx-text-2); background: var(--wx-white); border: 1px solid #d9d9d9; border-radius: 4px; white-space: nowrap; cursor: pointer; }
.wx-br-mk__b:hover { color: var(--wx-green); border-color: var(--wx-green); }
.wx-br-mk__b.is-on { color: #fff; background: var(--wx-green); border-color: var(--wx-green); }


/* ===== 79. 接单报备 · 不能接单区块 / 考勤核实点按手感（2026-10-22 第 10 轮）=====
   与手机端 weui-fix §82 同口径（同一套 DOM，只是换色板）：
   外出 / 另一家公司 = 浅黄底 + 深黄字；休息 / 请假 = 50% 灰底 + 白字；人在公司但整体不接单 = 白底线框。 */
.wx-br-cell.is-no-warn { color: #9a6b00; background: #fff9e6; border-color: #ffe9a8; }
.wx-br-cell.is-no-warn .wx-br-cell__n,
.wx-br-cell.is-no-warn .wx-br-cell__t { color: #9a6b00; }
.wx-br-cell.is-no-warn:hover { color: #9a6b00; background: #fff3cc; border-color: #ffd166; }
.wx-br-cell.is-no-off { color: #fff; background: rgba(0, 0, 0, .5); border-color: transparent; }
.wx-br-cell.is-no-off .wx-br-cell__n,
.wx-br-cell.is-no-off .wx-br-cell__t { color: #fff; }
.wx-br-cell.is-no-off:hover { color: #fff; background: rgba(0, 0, 0, .6); border-color: transparent; }
.wx-br-cell.is-no-in { color: var(--wx-text-2); }

.wx-br-sub { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; margin: 24px 0 12px; }
.wx-br-sub__t { font-size: 15px; font-weight: 600; line-height: 1.4; color: var(--wx-text); }
.wx-br-sub__s { font-size: 12px; line-height: 1.4; color: var(--wx-text-2); }

.wx-br-mk { flex-wrap: wrap; }
.wx-br-mk__b { touch-action: manipulation; }
.wx-br-mk.is-busy { opacity: .55; }



/* ===== 80. 接单报备 · 「只提示不阻断」的提示色（2026-10-22 第 11 轮）=====
   与手机端 weui-fix §83 同口径：外出时间很长但仍选「可以接单」的只提示、仍可保存。
   · `.br-warn`（默认，红 `--dt-desk-error`）= 阻断保存的硬错误；
   · `.br-warn.is-tip` = 不阻断保存的提示（在公司时间不足 1.5h / 你可能不在公司）。
   黄字取报表「不能接单 · 外出」同色（`#9a6b00`）。 */
.br-warn.is-tip { color: #9a6b00; }


/* ===== 81. 点名 · 全屏两栏（左 35% 签到码 / 右 65% 名单，2026-10-23 业务方要求）=====
   口径：搜索框那一行右侧的「全屏」按钮 → 整屏投屏，现场学员扫左栏的签到码、点名人在右栏点名单。
   · `.rc-full` = fixed 覆盖层（默认 display:none，加 `.is-on` 才显示，避免与 [hidden] 打架）；
   · 左栏 35%（严格按屏宽比例，不设 min-width，否则窄屏会破坏比例）：签到码居中，图随栏宽自适应；
   · 右栏 65%：把 `#rcLive`（搜索行 + 名单网格）整体挪进来 ⇒ 点名规则 / 事件 / 8s 轮询全都不变；
   · 全屏时名单列数加密（桌面 6 列、手机 3 列），格子略高，远距离也能看清状态色。
   ⚠️ 只加样式、不改结构；退出全屏时 JS 把 `#rcLive` 插回原位，页面恢复原样。 */
.rc-full {
  display: none;
  position: fixed; left: 0; top: 0; right: 0; bottom: 0; z-index: 6000;
  background: var(--wx-bg, #f5f6f7);
}
.rc-full.is-on { display: flex; flex-direction: column; }
.rc-full__hd {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 10px 16px; background: #fff; border-bottom: 1px solid var(--wx-line-2, #ededed);
}
.rc-full__t {
  min-width: 0; font-size: 16px; font-weight: 600; color: var(--wx-text, #191919);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.rc-full__x { flex: 0 0 auto; width: auto; margin: 0; padding: 6px 14px; font-size: 13px; line-height: 1.4; }
.rc-full__bd { flex: 1 1 auto; display: flex; min-height: 0; }
.rc-full__left {
  flex: 0 0 35%; width: 35%; min-width: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px;
  padding: 16px; background: #fff; border-right: 1px solid var(--wx-line-2, #ededed); text-align: center;
}
.rc-full__lab { margin: 0; font-size: 18px; font-weight: 600; color: var(--wx-text, #191919); }
.rc-full__qr { display: flex; align-items: center; justify-content: center; width: 100%; min-height: 160px; }
.rc-full__qr img, .rc-full__qr canvas {
  display: block; width: 100% !important; height: auto !important; max-width: 420px; aspect-ratio: 1 / 1;
}
.rc-full__tip { margin: 0; font-size: 14px; line-height: 1.6; color: var(--wx-text-2, #888); }
.rc-full__none { font-size: 13px; color: var(--wx-text-2, #888); }
.rc-full__right { flex: 1 1 auto; min-width: 0; overflow: auto; padding: 12px 16px 24px; }
/* 名单列数自适应屏宽（每格 ≥150px）：1440 宽约 6 列、1920 宽约 8 列，投屏时字不会被压成两行 */
.rc-full__right .wx-sign-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: .6rem; margin-top: .6rem; }
.rc-full__right .wx-sign-cell { min-height: 68px; font-size: 15px; }
.rc-full__right #rcFilter { max-width: 320px !important; }
body.rc-full-open { overflow: hidden; }
/* 搜索行右侧的「全屏」按钮：比工具栏里的其它按钮小一号，`margin-left:auto` 让它靠右 */
.rc-full-btn { flex: 0 0 auto; width: auto; margin: 0 0 0 auto; padding: 6px 14px; font-size: 13px; line-height: 1.4; }
/* 已经在全屏里 ⇒ 右栏不再重复显示「全屏」按钮（退出用顶栏「退出全屏」或 Esc） */
.rc-full__right .rc-full-btn { display: none; }
