:root {
  --bg: #F4F6F9;
  --panel: #FFFFFF;
  --line: #E4E8EE;
  --line-2: #EFF2F6;
  --text: #1D2129;
  --text-2: #4E5969;
  --muted: #86909C;
  --brand: #1F5AE0;
  --brand-weak: #EDF3FF;
  --brand-line: #B9CDFB;
  --ok: #0E9F6E;
  --warn: #C77700;
  --danger: #E5484D;
  --danger-weak: #FDECEC;
  --radius: 12px;
  --shadow: 0 1px 2px rgba(16, 24, 40, .04), 0 6px 16px -8px rgba(16, 24, 40, .12);
  --font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Microsoft YaHei", "PingFang SC", sans-serif;
}

* { box-sizing: border-box; }

html, body { margin: 0; padding: 0; }

body {
  background: var(--bg);
  color: var(--text);
  font: 14px/1.6 var(--font);
  -webkit-font-smoothing: antialiased;
}

button { font: inherit; cursor: pointer; }

/* ---------- 登录页 ---------- */
.login-wrap {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 40px 24px;
}
.login-card {
  width: 400px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 16px;
  padding: 32px;
  box-shadow: var(--shadow);
}
.login-brand { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
.mark {
  width: 40px; height: 40px; border-radius: 11px;
  background: var(--brand); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 19px; font-weight: 500; flex: none;
}
.login-card h1 { font-size: 18px; font-weight: 500; margin: 0; letter-spacing: .3px; }
.login-card .slogan { font-size: 12px; color: var(--muted); margin: 0 0 24px 52px; }
.field { margin-bottom: 14px; }
.field label { display: block; font-size: 13px; color: var(--text-2); margin-bottom: 6px; }
.field input, .field select {
  width: 100%; height: 40px; padding: 0 12px;
  border: 1px solid var(--line); border-radius: 8px;
  font: 14px var(--font); color: var(--text); background: #fff;
  outline: none; transition: border-color .15s, box-shadow .15s;
}
.field select { appearance: none; -webkit-appearance: none; }
.field input:focus, .field select:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }

.tabs { display: flex; gap: 4px; margin: 0 0 20px; border-bottom: 1px solid var(--line); }
.tabs button {
  border: 0; background: none; padding: 8px 4px; margin-right: 18px;
  font-size: 14px; color: var(--muted); border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.tabs button.on { color: var(--brand); border-bottom-color: var(--brand); font-weight: 500; }

.modal-mask {
  position: fixed; top: 0; right: 0; bottom: 0; left: 0; background: rgba(20, 24, 32, .35);
  display: flex; align-items: flex-start; justify-content: center; padding-top: 12vh; z-index: 60;
}
.modal-card {
  width: 380px; background: var(--panel); border-radius: 14px; padding: 22px 24px;
  box-shadow: 0 12px 40px -12px rgba(16, 24, 40, .35);
}
.modal-card h3 { margin: 0 0 16px; font-size: 15px; font-weight: 500; }
.modal-btns { display: flex; align-items: center; justify-content: flex-end; gap: 10px; margin-top: 6px; }
/* .btn-primary 默认 width:100%（表单里要占满一行），放进弹窗底部按钮条后会
   把左边的「取消」挤成竖排的两个字，这里统一改成自适应宽度 */
.modal-btns > .btn-primary { width: auto; min-width: 120px; margin-top: 0; }
.modal-btns > .btn-ghost { flex: none; white-space: nowrap; height: 34px; padding: 0 16px; }
.btn-primary {
  width: 100%; height: 42px; margin-top: 8px;
  background: var(--brand); color: #fff; border: 0; border-radius: 8px;
  font-size: 15px; font-weight: 500; transition: filter .15s;
}
.btn-primary:hover { filter: brightness(1.06); }
.btn-danger {
  width: 100%; height: 42px; margin-top: 8px;
  background: var(--danger); color: #fff; border: 0; border-radius: 8px;
  font-size: 15px; font-weight: 500; transition: filter .15s; cursor: pointer; font-family: inherit;
}
.btn-danger:hover { filter: brightness(1.06); }
.login-err { color: var(--danger); font-size: 13px; min-height: 20px; margin-top: 8px; }
.demo-box { margin-top: 22px; border-top: 1px dashed var(--line); padding-top: 16px; }
.demo-box .t { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
.demo-row {
  display: flex; align-items: center; gap: 8px; padding: 6px 8px;
  border-radius: 8px; font-size: 13px; cursor: pointer;
  width: 100%; text-align: left; border: 0; background: none; color: inherit; font-family: var(--font);
}
.demo-row:hover { background: var(--brand-weak); }
.demo-row b { font-weight: 500; min-width: 58px; }
.demo-row .role { color: var(--muted); font-size: 12px; margin-left: auto; }
.proto-note {
  margin-top: 14px; font-size: 12px; line-height: 1.7; color: var(--muted);
  background: #FAFBFC; border: 1px solid var(--line-2); border-radius: 8px; padding: 10px 12px;
}

/* ---------- 顶栏 ---------- */
.topbar {
  height: 64px; background: var(--panel);
  border-bottom: 1px solid var(--line);
  display: flex; align-items: center; gap: 14px;
  padding: 0 24px; position: sticky; top: 0; z-index: 20;
}
.topbar .brand { display: flex; align-items: center; gap: 10px; }
.topbar .brand .mark { width: 36px; height: 36px; border-radius: 10px; font-size: 18px; }
.topbar .brand .name { font-size: 20px; font-weight: 700; letter-spacing: .5px; }
.topbar .right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.who { display: flex; flex-direction: column; align-items: flex-end; gap: 0; font-size: 12px; line-height: 1.45; color: var(--text-2); }
.who b { font-weight: 500; color: var(--text); }
/* 顶栏身份胶囊（2026-10-26 方案 A）：头像 + 名字 + 角色徽章一行。
   限定 .topbar 作用域，别影响「数据分析与沟通」里那套 .who 人员条（app.css:1194 有自己的覆盖）。 */
.topbar .who {
  flex-direction: row; align-items: center; gap: 9px;
  background: var(--brand-weak); border: 1px solid var(--brand-line);
  border-radius: 999px; padding: 4px 14px 4px 5px;
  font-size: 13px; line-height: 1.4; color: var(--text);
}
.topbar .who .ava {
  width: 28px; height: 28px; border-radius: 999px; background: var(--brand); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 700; flex: none;
}
.topbar .who .nm { font-weight: 600; font-size: 13px; color: var(--text); }
.topbar .who .role {
  font-size: 11px; font-weight: 500; color: var(--brand); background: #fff;
  border: 1px solid var(--brand-line); border-radius: 999px;
  padding: 1px 8px; white-space: nowrap;
}
.chip {
  display: inline-flex; align-items: center; gap: 5px;
  height: 24px; padding: 0 9px; border-radius: 6px;
  font-size: 12px; background: var(--brand-weak); color: var(--brand);
}
.chip.gray { background: #F2F4F7; color: var(--text-2); }
.chip.green { background: #E8F7F1; color: var(--ok); }
.btn-ghost {
  height: 30px; padding: 0 12px; border-radius: 7px;
  border: 1px solid var(--line); background: #fff; color: var(--text-2); font-size: 13px;
}
.btn-ghost:hover { border-color: var(--brand-line); color: var(--brand); }
.btn-link { border: 0; background: none; color: var(--brand); font-size: 13px; padding: 0; }

/* ---------- 页面 ---------- */
.page { max-width: 1180px; margin: 0 auto; padding: 24px 24px 56px; }
/* 首页工作台：居中对称（方案一）—— 标题 / 副标题 / 同步状态都居中 */
.page-head { text-align: center; margin-bottom: 34px; }
.page-head h2 { font-size: 26px; font-weight: 600; letter-spacing: 1px; margin: 0 0 6px; }
.page-head p { margin: 0 0 12px; font-size: 13px; color: var(--muted); }

/* 卡片网格：整体居中，卡片少时也居中不歪 */
.grid { display: flex; flex-wrap: wrap; justify-content: center; gap: 18px; }
.card {
  width: 256px; background: var(--panel); border: 1px solid var(--line); border-radius: 16px;
  padding: 32px 24px 24px; text-align: center; display: flex; flex-direction: column;
  align-items: center; gap: 14px; position: relative;
  transition: border-color .16s, box-shadow .16s, transform .16s; color: inherit;
}
.card:hover { border-color: var(--brand-line); box-shadow: var(--shadow); transform: translateY(-3px); }
.card .ic { width: 56px; height: 56px; border-radius: 16px; display: flex; align-items: center; justify-content: center; }
.card .nm { font-size: 16px; font-weight: 600; }
.card .sub { font-size: 13px; color: var(--muted); line-height: 1.5; }
.card .foot { margin-top: auto; font-size: 12px; color: var(--muted); display: flex; align-items: center; gap: 6px; }
.dot { width: 6px; height: 6px; border-radius: 50%; background: var(--muted); flex: none; }
.dot.todo { background: #F0A020; }
.dot.live { background: var(--ok); }

.tone-blue { background: #EDF3FF; color: #1F5AE0; }
.tone-teal { background: #E6F7F3; color: #0E8A72; }
.tone-amber { background: #FFF4E6; color: #C77700; }
.tone-violet { background: #F1EEFE; color: #6A4FE0; }
.tone-rose { background: #FFEDEF; color: #D9455A; }
.tone-gray { background: #F2F4F7; color: #5A6472; }
.tone-green { background: #E9F7EE; color: #1D8A4E; }
.tone-cyan { background: #E4F4FB; color: #0B7A9E; }

/* ---------- 模块页 ---------- */
.mhead { display: flex; align-items: center; gap: 12px; margin-bottom: 16px; }
.mhead h2 { font-size: 17px; font-weight: 500; margin: 0; }
.mhead .sub { font-size: 12px; color: var(--muted); }
.panel {
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 20px 22px; margin-bottom: 16px;
}
.panel > h3 { font-size: 14px; font-weight: 500; margin: 0 0 4px; }
.panel > .hint { font-size: 12px; color: var(--muted); margin: 0 0 14px; }

/* 权限设置面板头：左边标题、右边功能总闸（目前是 AI 助手）。
   标题不再是 .panel 的直接子元素了，所以字号/边距得在这里补一份，
   否则会掉回浏览器默认的 h3 大小。 */
.perm-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 14px; flex-wrap: wrap; margin: 0 0 4px;
}
.perm-head > h3 { font-size: 14px; font-weight: 500; margin: 0; }
.perm-feat { display: flex; align-items: center; gap: 10px; }
.perm-feat .pf-lab {
  display: flex; flex-direction: column; align-items: flex-end;
  font-size: 13px; color: var(--text); line-height: 1.35;
}
.perm-feat .pf-lab small { font-size: 11.5px; color: var(--muted); }
.empty {
  border: 1px dashed var(--line); border-radius: 10px;
  padding: 34px 20px; text-align: center; color: var(--muted); font-size: 13px; background: #FCFDFE;
}
.empty .big { color: var(--text-2); font-size: 14px; margin-bottom: 4px; }

table { width: 100%; border-collapse: collapse; font-size: 13px; }
th, td { text-align: left; padding: 11px 12px; border-bottom: 1px solid var(--line-2); vertical-align: middle; }
th { font-weight: 500; color: var(--text-2); font-size: 12px; background: #FAFBFC; }
th:first-child, td:first-child { padding-left: 14px; }
tbody tr:last-child td { border-bottom: 0; }
tbody tr:first-child td { border-top: 0; }
td.center, th.center { text-align: center; }

/* ---------- 交接人员：按区域分组的行 ---------- */
.group-row td {
  background: #F7F9FC;
  font-size: 12.5px;
  font-weight: 500;
  color: var(--text-2);
  padding-top: 9px;
  padding-bottom: 9px;
  border-top: 1px solid var(--line);
}
.group-row .cnt { margin-left: 10px; font-weight: 400; font-size: 12px; color: var(--muted); }
.sub-acc { margin-left: 3px; font-size: 12px; color: var(--muted); }
.tag-ok { font-size: 12px; color: var(--ok); }
.tag-todo { font-size: 12px; color: var(--warn); }
.tag-rej { font-size: 12px; color: var(--danger); }
.tag-off { font-size: 12px; color: var(--muted); }
.newuser-note { margin-top: 10px; font-size: 12px; color: var(--muted); }
.mname { font-weight: 500; }
.mname small { display: block; font-weight: 400; font-size: 12px; color: var(--muted); margin-top: 2px; }
.lock { font-size: 12px; color: var(--muted); display: inline-flex; align-items: center; gap: 5px; }

/* ---------- 通用小件 ---------- */
.muted { color: var(--muted); }
.nowrap { white-space: nowrap; }
.btn-inline { width: auto; height: 36px; padding: 0 16px; font-size: 13px; margin-top: 0; }

/* ---------- 工具栏 / 筛选 ---------- */
.toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.toolbar > h3 { margin: 0; flex: none; }
.filters { display: inline-flex; gap: 2px; background: #F2F4F7; padding: 3px; border-radius: 8px; flex: none; }
.pf {
  border: 0; background: none; height: 26px; padding: 0 12px; border-radius: 6px;
  font-size: 12px; color: var(--text-2); transition: background .15s, color .15s;
}
.pf:hover { color: var(--text); }
.pf.on { background: #fff; color: var(--brand); font-weight: 500; box-shadow: 0 1px 2px rgba(16, 24, 40, .08); }

.search {
  height: 32px; width: 220px; padding: 0 12px; margin-left: auto;
  border: 1px solid var(--line); border-radius: 8px;
  font: 13px var(--font); color: var(--text); background: #fff; outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.search:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }

/* ---------- 表格内操作 ---------- */
.btn-mini {
  height: 26px; padding: 0 10px; margin-right: 6px;
  border: 1px solid var(--line); border-radius: 6px;
  background: #fff; color: var(--text-2); font-size: 12px; white-space: nowrap;
}
.btn-mini:hover { border-color: var(--brand-line); color: var(--brand); }
.btn-mini.on { border-color: var(--brand-line); background: var(--brand-weak); color: var(--brand); }
.btn-mini:last-child { margin-right: 0; }

.mini-select {
  height: 28px; min-width: 108px; padding: 0 8px;
  border: 1px solid var(--line); border-radius: 6px;
  font: 12.5px var(--font); color: var(--text); background: #fff; outline: none;
  appearance: none; -webkit-appearance: none;
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%2386909C' stroke-width='1.4' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 8px center; padding-right: 24px;
}
.mini-select:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }

/* ---------- 账号名单里的区域：就地可改 ---------- */
/* 平时看起来像普通文字，鼠标移上去才显出输入框，聚焦时高亮 */
.region-input {
  width: 100%; height: 28px; padding: 0 8px;
  border: 1px solid transparent; border-radius: 6px;
  font: 12.5px var(--font); color: var(--text); background: transparent; outline: none;
  transition: border-color .12s, background .12s, box-shadow .12s;
}
.region-input:hover { border-color: var(--line); background: #fff; }
.region-input:focus {
  border-color: var(--brand); background: #fff;
  box-shadow: 0 0 0 3px var(--brand-weak);
}
.region-input::placeholder { color: var(--muted); }

/* ---------- 状态徽标 ---------- */
.st { display: inline-flex; align-items: center; height: 22px; padding: 0 9px; border-radius: 5px; font-size: 12px; }
.st-ok { background: #E8F7F1; color: var(--ok); }
.st-wait { background: #FFF4E6; color: var(--warn); }
.st-off { background: #F2F4F7; color: var(--muted); }

/* ---------- 新建账号表单 ---------- */
.newuser {
  border: 1px solid var(--brand-line); background: #FAFCFF;
  border-radius: 10px; padding: 14px 16px; margin-bottom: 14px;
}
.newuser-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }
.newuser-row label { display: flex; flex-direction: column; gap: 5px; font-size: 12px; color: var(--text-2); }
.newuser-row input, .newuser-row select {
  height: 34px; padding: 0 10px;
  border: 1px solid var(--line); border-radius: 7px;
  font: 13px var(--font); color: var(--text); background: #fff; outline: none;
  appearance: none; -webkit-appearance: none;
}
.newuser-row input:focus, .newuser-row select:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.newuser .modal-btns { margin-top: 14px; }

/* ---- 批量开通账号（2026-10-27 方案 A：逐行编辑） ---- */
.nu-bar { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
.nu-bar b { font-size: 14px; }
.nu-tip { font-size: 12px; color: var(--muted); }
.nu-grid { display: flex; flex-direction: column; gap: 6px; }
.nu-row {
  display: grid; grid-template-columns: 26px 1fr 1fr 108px 1.15fr 110px 30px;
  gap: 8px; align-items: center;
}
.nu-row-head { font-size: 12px; color: var(--text-2); padding: 0 0 2px; }
.nu-row-head span { padding-left: 2px; }
.nu-idx { text-align: center; font-size: 12px; color: var(--muted); }
.nu-row input, .nu-row select {
  height: 34px; padding: 0 10px; width: 100%; min-width: 0;
  border: 1px solid var(--line); border-radius: 7px;
  font: 13px var(--font); color: var(--text); background: #fff; outline: none;
  appearance: none; -webkit-appearance: none;
}
.nu-row input:focus, .nu-row select:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.nu-row select {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%239AA4B2'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center; padding-right: 26px;
}
.nu-del {
  border: 0; background: none; color: #C9CFD8; font-size: 18px; line-height: 1;
  cursor: pointer; padding: 0; border-radius: 6px; height: 30px;
}
.nu-del:hover { color: var(--danger); background: #FDF3F3; }
.nu-add {
  margin-top: 10px; width: 100%; padding: 8px; cursor: pointer;
  border: 1px dashed var(--brand-line); border-radius: 8px;
  background: #fff; color: var(--brand); font: 13px var(--font);
}
.nu-add:hover { background: var(--brand-weak); }
.nu-foot { display: flex; align-items: center; gap: 14px; margin-top: 12px; flex-wrap: wrap; }
.nu-pwd { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-2); }
.nu-pwd input { height: 32px; width: 110px; padding: 0 10px; border: 1px solid var(--line); border-radius: 7px; font: 13px var(--font); outline: none; }
.nu-pwd input:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.nu-grow { flex: 1; }
.nu-res { margin-top: 12px; border-top: 1px dashed var(--line); padding-top: 10px; }
.nu-res-line { font-size: 12.5px; line-height: 1.9; }
.nu-res-line.good { color: var(--ok); }
.nu-res-line.bad { color: var(--danger); }
/* tab 上的人数 */
.pf-n { margin-left: 5px; font-size: 11px; opacity: .72; font-variant-numeric: tabular-nums; }
.pf.on .pf-n { opacity: .95; }

/* 座谈题库：分组标签上的删除 ×（2026-10-28） */
.pf.hasx { display: inline-flex; align-items: center; gap: 5px; }
.pf-x {
  display: inline-flex; align-items: center; justify-content: center;
  width: 15px; height: 15px; margin-right: -4px; border-radius: 50%;
  font-size: 13px; line-height: 1; color: var(--text-2); opacity: .45;
  transition: background .15s, color .15s, opacity .15s;
}
.pf-x:hover { opacity: 1; color: var(--danger); background: rgba(16, 24, 40, .08); }
.pf.on .pf-x { opacity: .65; }
.pf.on .pf-x:hover { opacity: 1; color: #fff; background: rgba(255, 255, 255, .3); }

/* ---------- 每日日志：横向四段漏斗 ---------- */
.funnel {
  display: flex;
  align-items: stretch;
  gap: 8px;
  padding: 2px 0 4px;
  overflow-x: auto;
}
.fseg {
  position: relative;
  flex: 1 1 0;
  min-width: 120px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 20px 16px 16px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--panel);
  text-align: left;
  overflow: hidden;
  transition: border-color .16s, transform .16s, box-shadow .16s;
}
/* 顶部色条：四段各一色，从左到右逐级收窄的视觉锚点 */
.fseg::before {
  content: '';
  position: absolute; left: 0; right: 0; top: 0;
  height: 3px;
  background: var(--seg, var(--brand));
}
.fseg:hover {
  border-color: var(--seg, var(--brand));
  transform: translateY(-2px);
  box-shadow: var(--shadow);
}
.fseg .fname {
  display: flex; align-items: center; gap: 6px;
  font-size: 12.5px; font-weight: 500; color: var(--muted); letter-spacing: .3px;
}
.fseg .fnum {
  font-size: 30px; font-weight: 500; line-height: 1;
  color: var(--seg, var(--brand));
  font-variant-numeric: tabular-nums;
}
.fseg .fnum > i {
  font-style: normal; font-size: 12px; font-weight: 400;
  color: var(--muted); margin-left: 4px;
}
.fseg .fbar { display: block; height: 6px; border-radius: 3px; background: var(--line-2); overflow: hidden; }
.fseg .fbar > i {
  display: block; height: 100%; border-radius: 3px;
  background: var(--seg, var(--brand));
  transition: width .28s ease;
}
.fseg .ffoot {
  display: flex; align-items: center; justify-content: flex-end; gap: 8px;
  min-height: 15px;
}
.fseg .fgo {
  font-size: 11.5px; color: var(--seg, var(--brand));
  opacity: 0; transform: translateX(-3px); white-space: nowrap;
  transition: opacity .16s, transform .16s;
}
.fseg:hover .fgo { opacity: 1; transform: none; }
.farr { display: flex; align-items: center; flex: 0 0 auto; color: #C3CAD4; }

/* 四段配色（--seg 供顶部色条 / 数字 / 进度条共用） */
.fseg.tone-blue   { background: var(--panel); color: inherit; --seg: #1F5AE0; }
.fseg.tone-teal   { background: var(--panel); color: inherit; --seg: #0E8A72; }
.fseg.tone-violet { background: var(--panel); color: inherit; --seg: #6A4FE0; }
.fseg.tone-green  { background: var(--panel); color: inherit; --seg: #1D8A4E; }

/* 子页顶部的四段步骤条 */
.fsteps {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  margin: 4px 0 16px;
}
.fsmini {
  border: 1px solid var(--line); background: #fff; color: var(--muted);
  border-radius: 999px; padding: 5px 14px;
  font: 12.5px var(--font);
  transition: border-color .14s, color .14s, background .14s;
}
.fsmini:hover { border-color: var(--brand-line); color: var(--text-2); }
.fsmini-arr { color: #C3CAD4; font-size: 12px; }
.fsmini.on.fsm-blue   { color: #1F5AE0; background: #EDF3FF; border-color: #B9CDFB; font-weight: 500; }
.fsmini.on.fsm-teal   { color: #0E8A72; background: #E6F7F3; border-color: #9FDCCE; font-weight: 500; }
.fsmini.on.fsm-violet { color: #6A4FE0; background: #F1EEFE; border-color: #C9BDF7; font-weight: 500; }
.fsmini.on.fsm-green  { color: #1D8A4E; background: #E9F7EE; border-color: #A6DCBF; font-weight: 500; }

@media (max-width: 860px) {
  .funnel { flex-wrap: wrap; }
  .fseg { flex: 1 1 42%; }
  .farr { display: none; }
}

/* ---------- 每日日志改版（2026-10-22）：入口四卡 + 三段勾选流转 ---------- */

/* 入口页四张卡：只要一个标题 + 一个大数字 */
.dcards {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  padding: 4px 0 2px;
}
.dcard {
  position: relative;
  display: flex; flex-direction: column; gap: 14px;
  padding: 22px 18px 20px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--panel);
  text-align: left;
  overflow: hidden;
  transition: border-color .16s, transform .16s, box-shadow .16s;
}
.dcard::before {
  content: '';
  position: absolute; left: 0; right: 0; top: 0;
  height: 3px; background: var(--seg, var(--brand));
}
.dcard:hover {
  border-color: var(--seg, var(--brand));
  transform: translateY(-2px);
  box-shadow: var(--shadow);
}
.dcard-nm { font-size: 13px; font-weight: 500; color: var(--muted); letter-spacing: .3px; }
/* 右上角一个淡箭头，hover 时才明显：暗示「这张卡点得进去」 */
.dcard::after {
  content: '›';
  position: absolute; right: 15px; top: 14px;
  font-size: 18px; line-height: 1; color: #C3CAD4; opacity: .5;
  transition: color .16s, opacity .16s, transform .16s;
}
.dcard:hover::after { color: var(--seg, var(--brand)); opacity: 1; transform: translateX(2px); }
.dcard-big {
  font-size: 34px; font-weight: 500; line-height: 1;
  color: var(--seg, var(--brand));
  font-variant-numeric: tabular-nums;
}
.dcard-big > em {
  font-style: normal; font-size: 12px; font-weight: 400;
  color: var(--muted); margin-left: 5px;
}
.dcard.dc-blue   { --seg: #1F5AE0; }
.dcard.dc-teal   { --seg: #0E8A72; }
.dcard.dc-violet { --seg: #6A4FE0; }
.dcard.dc-green  { --seg: #1D8A4E; }

/* 四张卡下面居中的入口按钮（阶段数据 / 每日总结 / AI 助手） */
.dquick {
  display: flex; justify-content: center; gap: 12px;
  margin: 20px 0 4px;
}
.dqbtn {
  display: inline-flex; align-items: center; gap: 8px;
  min-width: 168px; padding: 11px 18px;
  border: 1px solid var(--line); border-radius: 10px;
  background: var(--panel);
  font: 14px var(--font); color: var(--text);
  transition: border-color .14s, background .14s, box-shadow .14s;
}
.dqbtn:hover { border-color: var(--brand-line); box-shadow: var(--shadow); }
.dqbtn > i { font-style: normal; color: #C3CAD4; margin-left: auto; }
.dqi {
  width: 22px; height: 22px; border-radius: 6px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 13px; font-style: normal;
}
.dqi-blue { background: #EDF3FF; color: #1F5AE0; }
.dqi-gray { background: #F1F3F6; color: #6B7280; }
/* 每日总结入口（2026-10-24 复原，和大区端 / 组长端 / 总后台三处共用） */
.dqi-note { background: #FFF4E6; color: #C77700; }
/* 每日总结未写时的红点：跟着按钮内容排，不顶开布局 */
.dqbtn .card-dot { position: static; margin-left: 2px; }
/* 组长端总览里「每日总结」按钮上的条数 */
.mgr-mini-cnt {
  font-size: 11px; color: var(--brand); background: var(--brand-weak);
  border: 1px solid var(--brand-line);
  border-radius: 20px; padding: 0 6px; margin-left: 2px; line-height: 16px;
}

/* 三段名单表：勾选列 + 逐级累加的字段列 */
table.flowtable { width: 100%; border-collapse: collapse; margin: 0; }
table.flowtable th, table.flowtable td {
  padding: 9px 12px; text-align: left; vertical-align: middle;
  border-bottom: 1px solid var(--line);
}
table.flowtable thead th {
  background: #FBFCFE; font-size: 12.5px; font-weight: 500; color: var(--muted);
  white-space: nowrap;
}
table.flowtable tbody tr:hover { background: #FAFBFD; }
table.flowtable tr.picked { background: #F2F7FF; }
table.flowtable tr.picked:hover { background: #EAF1FF; }
table.flowtable td.pickcell, table.flowtable th.pickcell { width: 44px; text-align: center; }

/* 勾选框 */
.ckbox { display: inline-flex; align-items: center; cursor: pointer; }
.ckbox input { width: 16px; height: 16px; accent-color: var(--brand); cursor: pointer; margin: 0; }
.ckbox span { display: none; }

/* 「已勾选 N 人」计数 */
.fpicked { font-size: 12.5px; color: var(--muted); }
.fpicked b { color: var(--brand); font-size: 14px; }

/* 加盟成功库（加盟页下半部分） */
.jblock { margin-top: 22px; border-top: 1px solid var(--line); padding-top: 14px; }
.jhead { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; }
.jhead h4 { margin: 0; font-size: 14.5px; font-weight: 500; }
/* 成功库的筛选条（快捷段 + 加盟时间区间）自己占一行，在标题下面。
   日期框给足宽度 —— 默认 auto 宽度下 2026/10/18 会贴到日历图标上。 */
.jblock .resdate input[type="date"],
.joined-card .resdate input[type="date"] { width: 132px; }

/* 流转弹窗：顶部「日期自动」灰条 */
.autoline {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin: 2px 0 14px; padding: 9px 12px;
  border-radius: 8px; background: #F4F6F9;
  font-size: 13px; color: var(--text-2);
}
.autoline b { color: var(--text); font-variant-numeric: tabular-nums; }
.autoline span { color: var(--muted); font-size: 12px; }
.modal-card.flow-card { width: 720px; max-width: 94vw; }
.modal-card.flow-card table.flist { margin-bottom: 4px; }
.modal-card.flow-card table.flist th,
.modal-card.flow-card table.flist td { padding: 8px 10px; }
/* 加盟成功库 9~10 列，720px 排不下，单独放宽 */
.modal-card.joined-card { width: 1060px; max-width: 96vw; max-height: 84vh; overflow: auto; }
.modal-card.joined-card .toolbar .btn-ghost { margin-left: auto; flex: none; }
.modal-card.joined-card .resfilter { margin: 0 0 12px; }

/* 弹窗里的录音上传区 */
.dsec {
  display: flex; align-items: center; gap: 6px;
  margin: 12px 0 8px;
  font-size: 13.5px; font-weight: 500;
}
.dsec .req { color: var(--danger); margin-left: 2px; }
.dsec .n { font-weight: 400; font-size: 12px; color: var(--muted); margin-left: 6px; }
.upzone {
  display: flex; align-items: center; justify-content: center;
  padding: 18px; margin-bottom: 6px;
  border: 1px dashed var(--brand-line); border-radius: 10px;
  background: #F8FAFF; color: var(--brand);
  font-size: 13px; cursor: pointer;
  transition: background .14s, border-color .14s;
}
.upzone:hover { background: #EEF4FF; border-color: var(--brand); }
.upzone input { display: none; }
.fnote {
  margin: 12px 0 4px; padding: 9px 12px;
  border-radius: 8px; background: #F7F8FA;
  font-size: 12.5px; color: var(--muted);
}

@media (max-width: 860px) {
  .dcards { grid-template-columns: repeat(2, 1fr); }
  .dquick { flex-wrap: wrap; }
  .dqbtn { min-width: 0; flex: 1 1 40%; justify-content: center; }
}

/* ---------- 简历库：新增表单 / 批量导入 / 筛选条 ---------- */

/* 日期控件保留浏览器自带的「小日历」，别被 .newuser-row 的 appearance:none 干掉 */
.newuser-row input[type="date"] {
  -webkit-appearance: auto;
  appearance: auto;
  color-scheme: light;
}
.newuser-row input[type="date"]::-webkit-calendar-picker-indicator {
  cursor: pointer;
  opacity: .6;
}
.newuser-row input[type="date"]::-webkit-calendar-picker-indicator:hover { opacity: 1; }

.resacts { margin-left: auto; display: inline-flex; gap: 8px; }
.resacts .btn-primary { height: 30px; font-size: 13px; padding: 0 14px; }

/* 筛选条：简历库（筛「获取日期」）和面试页（筛「面试日期」）**共用这一份样式**。
   两处要长得一模一样、用起来也一模一样，所以不各写一套。页面里复用同一批类名：
   .resfilter 容器 / .filters 快捷段 / .pf 快捷按钮 / .resdate「从…到…」/ .search 搜索框。
   改这里 = 两处一起改。 */
.resfilter {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 2px 0 14px;
}
.resdate {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12.5px; color: var(--text-2);
}
.resdate input[type="date"] {
  height: 30px; padding: 0 8px;
  border: 1px solid var(--line); border-radius: 7px;
  font: 12.5px var(--font); color: var(--text); background: #fff; outline: none;
  color-scheme: light;
}
.resdate input[type="date"]:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.resfilter .search { height: 30px; width: 200px; }

/* 「今天」小标。
   ⚠ 这个类名只此一处，别的组件别再起名叫 .dchip —— 面试日期筛选曾经自建过同名类，
   把这里顶成了一个带边框的大方块，简历库和面试两页一起错位。
   现在面试页直接复用简历库那一整条筛选条，不再自建类名了。 */
.dchip {
  display: inline-block; margin-left: 6px; padding: 0 6px;
  height: 18px; line-height: 18px; border-radius: 4px;
  font-size: 11px; font-weight: 400; background: var(--brand-weak); color: var(--brand);
}

/* ---------- 简历凭证 ---------- */
.revouch {
  display: grid; grid-template-columns: 250px minmax(0, 1fr); gap: 14px;
  margin-top: 14px; padding: 12px 14px;
  border: 1px solid var(--brand-line); background: #FAFCFF; border-radius: 10px;
}
.vpick { display: flex; flex-direction: column; gap: 6px; font-size: 12px; color: var(--text-2); }
.vpick .req {
  font-size: 11px; font-weight: 500; color: var(--danger);
  background: #FDECEC; border-radius: 4px; padding: 1px 5px; margin-left: 2px;
}
.vpick input[type="file"] { font-size: 12px; color: var(--text-2); }
.vpick small { font-size: 11.5px; color: var(--muted); line-height: 1.55; }

.vprev {
  display: flex; align-items: center; gap: 12px;
  border: 1px dashed var(--line); border-radius: 9px;
  background: #fff; padding: 10px 12px; min-height: 78px;
}
.vprev img {
  width: 58px; height: 58px; object-fit: cover;
  border-radius: 7px; border: 1px solid var(--line); flex: none;
}
.vprev .vmeta { flex: 1; min-width: 0; font-size: 12px; color: var(--text-2); }
.vprev .vname {
  font-size: 12.5px; color: var(--text); margin-bottom: 3px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.vprev.vempty { border-style: dashed; color: var(--muted); font-size: 12.5px; }
.vprev.vempty .vph {
  width: 58px; height: 58px; flex: none; border-radius: 7px;
  border: 1px dashed var(--line); background: var(--bg);
  display: flex; align-items: center; justify-content: center;
  font-size: 11px; color: var(--muted);
}

/* ---------- 约面试 · 新增简历弹窗（PC 端宽版） ----------
   .modal-card 默认 380px，那是给「一句话确认」那种小弹窗用的。
   新增简历是 5 个字段 + 凭证上传的完整表单，塞进 380px 会整个塌掉：
   三列字段被截断、凭证区「250px + 1fr」里右边只剩几十像素，
   提示文字被挤成竖排。所以这里单独开一个宽版：760px，
   5 个字段分两行（上 3 下 2），凭证区左右分栏。 */
.modal-mask.wide-mask { align-items: flex-start; padding: 6vh 16px 5vh; overflow-y: auto; }
.modal-card.res-card { width: 760px; max-width: 94vw; max-height: 88vh; overflow-y: auto; }
.modal-card.res-card .toolbar { margin-bottom: 16px; flex-wrap: nowrap; align-items: center; }
.modal-card.res-card .toolbar h3 { margin: 0; font-size: 15.5px; }
.modal-card.res-card .toolbar .sub {
  font-size: 12.5px; color: var(--muted); margin-left: 10px; white-space: nowrap;
}
.modal-card.res-card .toolbar .btn-ghost { margin-left: auto; flex: none; }

/* 5 个字段：第一行三个等宽，第二行两个各占一半，不留半格空位 */
.modal-card.res-card .newuser-row { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 14px 16px; }
.modal-card.res-card .newuser-row > label:nth-child(-n+3) { grid-column: span 2; }
.modal-card.res-card .newuser-row > label:nth-child(n+4) { grid-column: span 3; }

/* 凭证：左边选图，右边回显缩略图 */
.modal-card.res-card .revouch {
  grid-template-columns: 250px minmax(0, 1fr);
  align-items: stretch; margin-top: 16px;
}
.modal-card.res-card .vprev { min-height: 104px; }
.modal-card.res-card .vprev img { width: 76px; height: 76px; border-radius: 9px; }
.modal-card.res-card .vprev.vempty {
  flex-direction: column; justify-content: center; gap: 7px; text-align: center;
}
.modal-card.res-card .vprev.vempty .vph { width: 42px; height: 42px; border-radius: 11px; }
.modal-card.res-card .vprev.vempty .muted { line-height: 1.6; }

/* 原生 file 控件太粗糙：把「选择文件」做成一个像样的按钮 */
.vpick input[type="file"] { font: 12.5px var(--font); color: var(--text-2); max-width: 100%; }
.vpick input[type="file"]::file-selector-button {
  font: 12.5px var(--font); margin-right: 10px; padding: 7px 14px;
  border: 1px solid var(--line); border-radius: 8px; background: #fff;
  color: var(--text); cursor: pointer;
  transition: border-color .14s, color .14s, background .14s;
}
.vpick input[type="file"]::file-selector-button:hover {
  border-color: var(--brand); color: var(--brand); background: var(--brand-weak);
}

.modal-card.res-card .newuser-note { margin-top: 12px; line-height: 1.7; }
.modal-card.res-card .modal-btns { margin-top: 16px; }
.modal-card.res-card .modal-btns .btn-primary { min-width: 132px; }

.modal-card.vcard { max-width: 720px; width: 92vw; }
.modal-card.vcard .toolbar { margin-bottom: 12px; align-items: center; }
.modal-card.vcard .toolbar .sub {
  font-size: 12.5px; color: var(--muted); margin-left: 8px;
}
.modal-card.vcard .toolbar .btn-ghost { margin-left: auto; }
.vbig {
  display: block; max-width: 100%; max-height: 68vh;
  margin: 0 auto; border-radius: 8px; border: 1px solid var(--line);
}

@media (max-width: 860px) {
  .revouch { grid-template-columns: minmax(0, 1fr); }
  .resacts { margin-left: 0; width: 100%; }
  .resfilter .search { margin-left: 0; width: 100%; }
  /* 窗口拖窄时新增简历弹窗退回单列，不然 6 栏栅格会挤成一团 */
  .modal-card.res-card .revouch { grid-template-columns: minmax(0, 1fr); }
  .modal-card.res-card .newuser-row { grid-template-columns: minmax(0, 1fr); }
  .modal-card.res-card .newuser-row > label:nth-child(n) { grid-column: auto; }
}

select { font-family: var(--font); }

@media (max-width: 860px) {
  .newuser-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .search { width: 100%; margin-left: 0; }
}

/* ---------- 开关 ---------- */
.switch {
  position: relative; width: 40px; height: 22px; border-radius: 11px;
  background: #D5DAE2; border: 0; padding: 0; transition: background .18s; vertical-align: middle;
}
.switch::after {
  content: ""; position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;
  border-radius: 50%; background: #fff; transition: transform .18s;
  box-shadow: 0 1px 2px rgba(0, 0, 0, .18);
}
.switch[data-on="1"] { background: var(--brand); }
.switch[data-on="1"]::after { transform: translateX(18px); }
.switch[disabled] { opacity: .4; cursor: not-allowed; }

.radio-row { display: flex; gap: 22px; flex-wrap: wrap; }
.radio-row label { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; cursor: pointer; }
.radio-row input { margin: 4px 0 0; }
.radio-row small { display: block; color: var(--muted); font-size: 12px; }

.bar {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  background: #FAFBFC; border: 1px solid var(--line-2); border-radius: 10px;
  padding: 12px 14px; font-size: 13px; color: var(--text-2);
}
.bar b { font-weight: 500; color: var(--text); }

.kv { display: grid; grid-template-columns: 132px 1fr; gap: 10px 16px; font-size: 13px; }
.kv dt { color: var(--muted); margin: 0; }
.kv dd { margin: 0; }

.toast {
  position: fixed; left: 50%; bottom: 28px; transform: translateX(-50%) translateY(8px);
  background: #1D2129; color: #fff; font-size: 13px; padding: 10px 18px;
  border-radius: 8px; opacity: 0; pointer-events: none; transition: opacity .18s, transform .18s; z-index: 99;
}
.toast[data-show="1"] { opacity: 1; transform: translateX(-50%) translateY(0); }

.sync { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted); }

@media (max-width: 1100px) { .grid { gap: 16px; } }
@media (max-width: 860px) {
  .grid { gap: 14px; }
  .topbar { padding: 0 16px; }
  .page { padding: 18px 16px 40px; }
  .who .acct { display: none; }
}

/* ---------- 面试：按约面日期归类 + 当天录音 + 面试库 ---------- */

.small { font-size: 12px; }
.warn { color: var(--warn); }

/* 面试日期筛选：**不自己造样式，直接用上面简历库那一整套**
   （.resfilter / .filters / .pf / .resdate / .search）。
   以前这里自建过一批 .dtab/.dc-* 卡片，还因为类名撞上「今天」小标炸过两个页面，
   现在整段删掉 —— 两处共用一套类名，以后永远不会跑偏。
   默认快捷段落在「今天」，所以通常还是一屏只看当天那一场。 */

/* 表头里和下面三个框一一对应的标签。
   宽度写死成和控件一样，位置才对得上 —— 见 modules.js 的 itvHead() */
.hc {
  display: inline-block; box-sizing: border-box;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.hc + .hc { margin-left: 8px; }

.igroup {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  margin-bottom: 16px;
  overflow: hidden;
  background: var(--panel);
}
.igroup:last-child { margin-bottom: 0; }

.ghead {
  display: flex; align-items: center; justify-content: space-between;
  gap: 14px; padding: 12px 16px;
  background: #FAFBFD; border-bottom: 1px solid var(--line-2);
}
.gdate { display: inline-flex; align-items: baseline; gap: 8px; }
.gdate b { font-size: 15px; font-weight: 600; letter-spacing: .2px; }
.gdate i {
  font-style: normal; font-size: 11px; padding: 1px 7px; border-radius: 20px;
  border: 1px solid var(--line); color: var(--muted); background: #fff;
}
.gdate.tone-on b { color: var(--brand); }
.gdate.tone-on i { color: var(--brand); border-color: var(--brand-line); background: var(--brand-weak); }
.gdate.tone-past b { color: var(--warn); }
.gdate.tone-past i { color: var(--warn); border-color: #F0D9B0; background: #FFF8EC; }
.gdate.tone-future b { color: var(--text-2); }
.gstat { font-size: 12px; color: var(--muted); }
.gstat b { color: var(--text); font-weight: 600; }

table.itvtable { margin: 0; }
table.itvtable th, table.itvtable td { padding: 10px 16px; }
table.itvtable thead th { background: #fff; }
tr.dirty > td:first-child { box-shadow: inset 3px 0 0 var(--brand-line); }
tr.dirty { background: #FBFCFE; }

.itvsel, .itvin {
  height: 32px; border: 1px solid var(--line); border-radius: 8px;
  padding: 0 8px; font: inherit; font-size: 13px; background: #fff;
  color: var(--text); vertical-align: middle;
}
.itvin { width: 172px; margin-left: 8px; }
.itvdate { width: 146px; }
.itvsel { width: 82px; }
/* 排在中间的 select 也要和左边的框隔开 8px（第一个不隔）。
   .itvin 本来就带 margin-left，这条是补「input 后面的 select」——
   培训页的「培训结果」下拉就是这种情况，不补会贴在一起。 */
.itvin + .itvsel { margin-left: 8px; }
.itvsel:focus, .itvin:focus { outline: none; border-color: var(--brand-line); box-shadow: 0 0 0 3px var(--brand-weak); }
.itvin.need, .itvsel.need { border-color: #EBD2A8; background: #FFFDF7; }
.itvin:disabled { background: var(--line-2); color: var(--muted); cursor: not-allowed; }

.btn-sm { height: 30px; padding: 0 12px; font-size: 13px; margin-right: 6px; }

/* 当天录音那一块 */
.abox { border-top: 1px dashed var(--line); padding: 12px 16px 14px; background: #FCFDFE; }
/* 加盟那一环没有录音区，只留一行淡提示，不要整块灰底 */
.abox.abox-plain { background: none; padding: 12px 2px 0; border-top: 1px dashed var(--line); }
.atip { font-size: 12.5px; color: var(--muted); }
.ahead { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 10px; }
.atitle { font-size: 13px; color: var(--text-2); }
.atitle b { color: var(--brand); font-weight: 600; margin: 0 3px; }
.apick { display: inline-flex; }
.apick input[type=file] { display: none; }
.apick span {
  display: inline-flex; align-items: center; height: 30px; padding: 0 12px;
  border: 1px solid var(--brand-line); color: var(--brand); background: var(--brand-weak);
  border-radius: 8px; font-size: 13px; cursor: pointer;
}
.apick span:hover { background: #E3EDFF; }

.aitem {
  display: flex; align-items: center; gap: 12px;
  padding: 8px 10px; border: 1px solid var(--line); border-radius: 10px;
  background: #fff; margin-bottom: 8px;
}
.aitem:last-child { margin-bottom: 0; }
.ameta { min-width: 0; flex: 1; display: flex; flex-direction: column; line-height: 1.35; }
.aname {
  font-size: 13px; color: var(--text); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; max-width: 320px;
}
.aitem audio { height: 34px; max-width: 320px; flex: none; }
.aempty {
  font-size: 13px; color: var(--muted); padding: 10px 12px;
  border: 1px dashed var(--line); border-radius: 10px; background: #fff; text-align: center;
}
/* 下载按钮是 <a> 不是 <button>，补回按钮观感 */
a.btn-mini {
  display: inline-flex; align-items: center; justify-content: center;
  height: 26px; text-decoration: none;
}

/* ---------- 历史录音（面试 / 培训过了当天也能回听） ----------
   录音按「提交那天」归档、不绑具体司机，所以按日期分组，
   每组先写当天提交的人，再挂那天的录音。 */
.ahist {
  margin-top: 16px; border: 1px solid var(--line);
  border-radius: 10px; background: #FCFDFE; overflow: hidden;
}
.ahist-hd {
  display: flex; align-items: center; gap: 10px;
  padding: 11px 14px; background: #fff; border-bottom: 1px solid var(--line);
}
.ahist-hd .ht { font-size: 13.5px; font-weight: 500; }
.ahist-hd .hn { font-size: 12px; color: var(--muted); }
.ahist-hd .hexp {
  margin-left: auto; padding: 4px 11px; cursor: pointer;
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 12.5px; color: var(--brand); background: var(--brand-weak);
  border: 1px solid var(--brand-line); border-radius: 7px;
}
.ahist-hd .hexp:hover { background: #E4ECFF; }
/* 三角用 border 画，不依赖 ▸/▾ 字形（这些码位在部分字体里缺字会渲染成点） */
.ahist-hd .hexp .hchev {
  width: 0; height: 0; font-style: normal;
  border: 4px solid transparent; border-right: 0;
  border-left-color: var(--brand);
  transition: transform .15s;
}
.ahist-hd .hexp .hchev.up { transform: rotate(-90deg); }
.ahist-body { padding: 8px 12px 12px; }
.ahist-empty { padding: 16px; text-align: center; font-size: 12.5px; color: var(--muted); }

.aday {
  border: 1px solid var(--line); border-radius: 9px;
  background: #fff; margin-top: 8px; overflow: hidden;
}
.aday:first-child { margin-top: 2px; }
.aday-hd {
  display: flex; align-items: center; gap: 9px;
  padding: 10px 12px; cursor: pointer; user-select: none;
}
.aday-hd:hover { background: #FAFBFD; }
.aday-chev {
  width: 0; height: 0; flex: none;
  border: 4px solid transparent; border-right: 0;
  border-left-color: #C3CAD4;
  transition: transform .16s;
}
.aday.open .aday-chev { transform: rotate(90deg); }
.aday-d { font-size: 13px; font-weight: 500; font-variant-numeric: tabular-nums; }
.aday-w { font-size: 11.5px; color: var(--muted); }
.aday-n { margin-left: auto; font-size: 11.5px; color: var(--muted); }
.aday-people {
  padding: 0 12px 9px; font-size: 12px; color: var(--text-2);
  border-bottom: 1px dashed var(--line);
}
.aday-people b { color: var(--text); font-weight: 500; }
.aday-body { padding: 10px 12px 4px; }
.aday:not(.open) .aday-people,
.aday:not(.open) .aday-body { display: none; }

/* ---------- 每日总结（漏斗页底部入口 + 三问自评） ---------- */
.notes-entry { text-align: center; margin-top: 16px; }
.notes-entry .btn-primary {
  width: auto; height: 42px; padding: 0 48px; margin-top: 0;
  font-size: 14px; letter-spacing: 2px;
}

.nform {
  border: 1px solid var(--line); border-radius: 10px; background: #fff;
  padding: 16px; margin-bottom: 18px;
}
.nq { font-size: 13px; color: var(--text); margin-bottom: 12px; }
.nq:last-child { margin-bottom: 0; }
.nlabel { display: block; font-size: 13px; color: var(--text-2); margin-bottom: 8px; }
.nopts { display: inline-flex; gap: 4px; background: #F2F4F7; padding: 3px; border-radius: 8px; }
.nopts .pf { height: 28px; padding: 0 16px; font-size: 13px; }
.nform textarea {
  width: 100%; box-sizing: border-box; min-height: 64px; padding: 9px 12px;
  border: 1px solid var(--line); border-radius: 8px; resize: vertical;
  font: 13px/1.5 var(--font); color: var(--text); background: #fff; outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.nform textarea:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.nsave { margin-top: 14px; display: flex; align-items: center; gap: 12px; }
.nsave .hint { margin: 0; }

.nlist .nitem {
  border: 1px solid var(--line); border-radius: 10px; background: #fff;
  padding: 12px 14px; margin-bottom: 10px;
}
.nhead { display: flex; align-items: center; gap: 10px; margin-bottom: 8px; }
.ntag {
  font-size: 12px; padding: 1px 10px; border-radius: 99px; white-space: nowrap;
}
.ntag.ok { background: #E7F6EC; color: #12805C; }
.ntag.warn { background: #FFF1E7; color: #B25E09; }
.ntag.today { background: var(--brand-weak); color: var(--brand); }
.nans { font-size: 13px; color: var(--text); line-height: 1.55; margin: 2px 0; }
.nans b { font-weight: 500; color: var(--text-2); margin-right: 4px; }

/* ---------- 区域经理端 · 每日日志 ---------- */
.mgr-card {
  background: var(--panel); border: 1px solid var(--line); border-radius: 12px;
  padding: 16px 18px; margin-bottom: 14px;
}
.mgr-head { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.mgr-ava {
  width: 40px; height: 40px; border-radius: 10px; background: var(--brand-weak); color: var(--brand);
  display: flex; align-items: center; justify-content: center; font-size: 16px; font-weight: 700; flex: none;
}
.mgr-id { min-width: 0; }
.mgr-name { font-size: 15px; font-weight: 600; }
.mgr-title { display: inline-block; margin-left: 8px; padding: 1px 8px; border-radius: 999px;
  font-size: 11px; font-weight: 500; line-height: 18px; vertical-align: 1px;
  background: var(--chip-bg, #eef2f7); color: var(--muted); }
.mgr-name.sm .mgr-title { font-size: 11px; }

/* 暂代标注（2026-10-30）：账号管理姓名旁 + 批量开通提示。琥珀色，跟正式/待启用区分开 */
.act-tag { display: inline-block; margin-left: 6px; padding: 1px 8px; border-radius: 999px;
  font-size: 10.5px; font-weight: 600; line-height: 17px; vertical-align: 2px;
  background: #FDF6E7; color: #A97611; border: 1px solid #F1E2C4; }
.mgr-meta { color: var(--muted); font-size: 12px; }
.mgr-right { margin-left: auto; }
.mgr-badge {
  display: inline-flex; align-items: center; gap: 5px; font-size: 12px; padding: 2px 12px; border-radius: 99px; white-space: nowrap;
}
.mgr-badge::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.mgr-badge.wait { background: var(--brand-weak); color: var(--brand); }
.mgr-badge.ok { background: #E7F6EC; color: #12805C; }
.mgr-badge.drop { background: #FFF1E7; color: #B25E09; }
.mgr-badge.audit { background: #FFF7E0; color: #B8860B; }

.mgr-five { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; }
.mgr-entry {
  border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; text-align: left;
  cursor: pointer; background: #fff; font-family: inherit; transition: border-color .15s, box-shadow .15s;
  display: flex; flex-direction: column; gap: 1px; color: var(--text);
}
.mgr-entry:hover { border-color: var(--brand-line); box-shadow: 0 0 0 3px var(--brand-weak); }
.mgr-entry .k { font-size: 12px; color: var(--text-2); }
.mgr-entry .n { font-size: 22px; font-weight: 700; color: var(--text); }
.mgr-entry .n i { font-size: 12px; font-weight: 400; color: var(--muted); font-style: normal; margin-left: 1px; }
.mgr-entry .go { font-size: 12px; color: var(--brand); }
.mgr-entry.mtone-blue .n { color: #1F5AE0; }
.mgr-entry.mtone-teal .n { color: #0E8A72; }
.mgr-entry.mtone-violet .n { color: #6A4FE0; }
.mgr-entry.mtone-green .n { color: #1D8A4E; }
.mgr-entry.mtone-amber .n { color: #C77700; }

.mgr-foot { display: flex; align-items: center; gap: 12px; margin-top: 14px; padding-top: 12px; border-top: 1px dashed var(--line); }
.mgr-acts { margin-left: auto; display: flex; align-items: center; gap: 8px; }

/* 审核中提示条（组长端卡片） */
.mgr-audit-strip {
  display: flex; align-items: center; gap: 10px; margin-top: 12px;
  background: #FFF7E0; border: 1px solid #F0DFA8; color: #8a6d1a;
  border-radius: 10px; padding: 10px 14px; font-size: 13px;
}
.mgr-audit-strip .btn-mini { margin-left: auto; }

.mgr-sel {
  height: 32px; border: 1px solid var(--line); border-radius: 8px; padding: 0 10px;
  font-size: 13px; color: var(--text); background: #fff; outline: none; font-family: inherit;
}
.mgr-sel:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }

/* 子页：只读 */
.mgr-strip { display: flex; align-items: center; gap: 4px; margin-bottom: 16px; flex-wrap: wrap; }
.mgr-sm {
  border: 0; background: none; padding: 6px 12px; border-radius: 8px;
  font-size: 13px; color: var(--text-2); cursor: pointer; font-family: inherit;
}
.mgr-sm.on { background: var(--brand); color: #fff; font-weight: 500; }
.mgr-sm-arr { color: var(--muted); }

/* 弹窗 */
.modal-card.mgr-modal { width: 560px; max-width: 92vw; max-height: 84vh; overflow: auto; }
.mgr-modal .msub { font-size: 12px; color: var(--muted); margin: -8px 0 16px; }
.row2 { display: flex; gap: 12px; }
.row2 .field { flex: 1; }
.mgr-modal textarea {
  width: 100%; box-sizing: border-box; min-height: 64px; padding: 9px 12px;
  border: 1px solid var(--line); border-radius: 8px; resize: vertical;
  font: 13px/1.5 var(--font); color: var(--text); background: #fff; outline: none;
}
.mgr-modal textarea:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.mgr-modal .btn-primary { width: auto; height: 36px; margin-top: 0; padding: 0 16px; font-size: 13px; }

/* 状态审核弹窗（总后台） */
.modal-card.adm-review { width: 560px; max-width: 92vw; max-height: 84vh; overflow: auto; }
.adm-review .msub { font-size: 12px; color: var(--muted); margin: -8px 0 16px; }
.adm-review textarea {
  width: 100%; box-sizing: border-box; min-height: 64px; padding: 9px 12px;
  border: 1px solid var(--line); border-radius: 8px; resize: vertical;
  font: 13px/1.5 var(--font); color: var(--text); background: #fff; outline: none;
}
.adm-review textarea:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.adm-review .btn-primary, .adm-review .btn-danger { width: auto; height: 36px; margin-top: 0; padding: 0 16px; font-size: 13px; }
.adm-req-reason {
  border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px;
  background: #F2F4F7; font-size: 13px;
}
.adm-review .mgr-attach-img { max-width: 100%; max-height: 180px; }

.mgr-upload {
  display: block; border: 1px dashed var(--brand-line); border-radius: 10px; background: var(--brand-weak);
  padding: 16px; text-align: center; color: var(--brand); font-size: 13px; cursor: pointer;
}
.mgr-upload:hover { background: #E1EBFF; }
.mgr-upload input { display: none; }
.mgr-attach-done {
  border: 1px solid var(--line); border-radius: 10px; background: #FAFBFC; padding: 12px;
}
.mgr-attach-done .aname { display: block; font-size: 13px; color: var(--text); margin-bottom: 4px; }
.mgr-attach-done .muted { display: block; margin-bottom: 8px; }
.mgr-attach-done audio { height: 32px; max-width: 100%; }
.mgr-attach-img { max-width: 100%; max-height: 180px; border-radius: 8px; display: block; margin-bottom: 8px; border: 1px solid var(--line); }
.mgr-attach-done .btn-mini { margin-top: 8px; }

.mgr-hist-title { font-size: 13px; color: var(--text-2); margin: 18px 0 8px; font-weight: 500; }
.mgr-hist { border-left: 2px solid var(--brand-line); padding: 2px 0 14px 14px; position: relative; }
.mgr-hist::before { content: ""; position: absolute; left: -6px; top: 5px; width: 10px; height: 10px; border-radius: 50%; background: var(--brand); }
.mgr-hist .t { color: var(--muted); font-size: 12px; }
.mgr-hist .c { font-size: 13px; margin-top: 2px; }
.mgr-hist .tag { font-size: 11px; padding: 1px 8px; border-radius: 99px; background: #F2F4F7; color: var(--text-2); margin-right: 6px; }
.mgr-hist audio { height: 30px; max-width: 100%; margin-top: 6px; }
.mgr-hist .mgr-attach-img { margin-top: 6px; }

/* Excel 凭证：页面里没法预览表格，给一条带图标的下载链接 */
.mgr-xls { display: inline-flex; align-items: center; gap: 6px; margin-top: 6px; font-size: 13px;
  color: var(--brand); background: #F0F5FF; border: 1px solid var(--brand-line);
  border-radius: 8px; padding: 6px 12px; text-decoration: none; max-width: 100%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mgr-xls:hover { background: #E1EBFF; }

/* ---------- 总后台 · 每日日志（按区域经理归集） ---------- */
.adm-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 14px 20px; }
.adm-toolbar h3 { font-size: 16px; font-weight: 600; margin: 0; }
.adm-toolbar .sub { color: var(--muted); font-size: 13px; }
.adm-toolbar-right { margin-left: auto; }

.adm-stats { display: grid; grid-template-columns: repeat(6, 1fr); gap: 12px; margin-bottom: 16px; }
.adm-stat { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 14px 16px; }
.adm-stat .k { font-size: 12px; color: var(--text-2); }
.adm-stat .v { font-size: 26px; font-weight: 700; margin-top: 2px; color: var(--text); }
.adm-stat .v i { font-size: 13px; font-weight: 400; color: var(--muted); font-style: normal; margin-left: 2px; }
.adm-stat .v.trio { font-size: 18px; }
.adm-stat.blue .v { color: var(--brand); }
.adm-stat.green .v { color: #12805C; }

/* 经理分组块：可折叠展开 */
.mgr-block { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; margin-bottom: 16px; overflow: hidden; }
.mgr-block .mgr-head { padding: 16px 20px; cursor: pointer; margin-bottom: 0; }
.mgr-block .mgr-head:hover { background: #FAFBFD; }
.mgr-block .mgr-right { display: flex; align-items: center; gap: 14px; }
.mgr-chev { color: var(--muted); font-size: 13px; width: 14px; flex: none; }
.mgr-body { border-top: 1px solid var(--line); padding: 16px 20px; display: none; }
.mgr-block.open .mgr-body { display: block; }

.mgr-stat { text-align: center; min-width: 56px; }
.mgr-stat .n { font-size: 20px; font-weight: 700; color: var(--text); }
.mgr-stat .k { font-size: 11px; color: var(--muted); }
.mgr-stat.blue .n { color: var(--brand); }
.mgr-stat.green .n { color: #12805C; }

.adm-sec { font-size: 13px; font-weight: 600; color: var(--text-2); margin: 4px 0 10px; display: flex; align-items: center; gap: 6px; }
.adm-sec b { color: var(--text); }
.adm-table th, .adm-table td { vertical-align: top; }
.adm-table td .mgr-attach-img { max-width: 120px; max-height: 64px; margin: 0; }

/* 助理缩略行 */
.asst-row { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1px solid var(--line); border-radius: 10px; margin-bottom: 8px; }
.asst-row:last-child { margin-bottom: 0; }
.mgr-ava.sm { width: 32px; height: 32px; font-size: 13px; border-radius: 8px; }
.mgr-name.sm { font-size: 14px; }
.adm-cnts { margin-left: auto; display: flex; gap: 10px; font-size: 12px; color: var(--text-2); }
.adm-cnts b { color: var(--text); font-weight: 600; }
.cnts { margin-left: auto; font-size: 12px; color: var(--text-2); white-space: nowrap; }
.cnts b { color: var(--text); font-weight: 600; }
.adm-fold-all { text-align: center; color: var(--muted); font-size: 12px; padding: 6px; cursor: pointer; }
.adm-fold-all:hover { color: var(--brand); }

/* ---------- 申请审核面板（总后台每日日志 · 组长块内） ---------- */
.audit-panel { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; margin-bottom: 16px; }
.audit-tabs { display: flex; align-items: center; gap: 4px; padding: 8px 12px 0; background: #FAFBFD; border-bottom: 1px solid var(--line); }
.atab { border: 0; background: none; padding: 8px 14px; font-size: 13px; color: var(--text-2); cursor: pointer; border-radius: 8px 8px 0 0; border-bottom: 2px solid transparent; font-family: inherit; }
.atab.on { color: var(--brand); font-weight: 600; border-bottom-color: var(--brand); background: #fff; }
.atab .n { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 99px; background: var(--danger); color: #fff; font-size: 11px; font-weight: 700; margin-left: 5px; }
.atab:not(.on) .n { background: #D6DBE3; color: #fff; }
.audit-tip { margin-left: auto; font-size: 12px; color: var(--muted); padding-bottom: 8px; }

.alist { display: none; padding: 4px 12px 12px; background: #fff; }
.alist.on { display: block; }
.audit-panel .arow { display: flex; align-items: center; gap: 12px; padding: 12px 8px; border-bottom: 1px solid var(--line); }
.audit-panel .arow:last-child { border-bottom: 0; }
.audit-panel .when { width: 74px; flex: none; }
.audit-panel .when .d { font-weight: 600; font-size: 13px; }
.audit-panel .when .t { font-size: 11px; color: var(--muted); }
.audit-panel .who { display: flex; align-items: center; gap: 8px; width: 180px; flex: none; }
.audit-panel .who .ava { width: 28px; height: 28px; border-radius: 7px; background: var(--brand-weak); color: var(--brand); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 12px; flex: none; }
.audit-panel .who .nm { font-weight: 600; font-size: 13px; }
.audit-panel .who .mt { font-size: 11px; color: var(--muted); }
.audit-panel .flow { color: var(--muted); font-size: 12px; flex: none; }
.audit-panel .tag { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; padding: 2px 10px; border-radius: 99px; white-space: nowrap; flex: none; }
.audit-panel .tag.ok { background: #E7F6EC; color: #12805C; }
.audit-panel .tag.drop { background: #FFF1E7; color: #B25E09; }
.audit-panel .tag.pass { background: #E7F6EC; color: #12805C; }
.audit-panel .tag.rej { background: #FDECEC; color: var(--danger); }
.audit-panel .tag.direct { background: #F2F4F7; color: var(--text-2); }
.audit-panel .reason { flex: 1; min-width: 0; }
.audit-panel .reason .rt { font-size: 13px; }
.audit-panel .reason .op { font-size: 12px; color: var(--text-2); margin-top: 2px; }
.audit-panel .reason .op b { color: var(--danger); font-weight: 500; }
.audit-panel .reason .op b.pass { color: #12805C; }
.audit-panel .file { flex: none; display: inline-flex; align-items: center; max-width: 180px; }
.audit-panel .file .mgr-attach-img { max-width: 120px; max-height: 48px; margin: 0; }
.audit-panel .file .mgr-xls { margin-top: 0; max-width: 180px; }
.audit-panel .file audio { height: 32px; }
.audit-panel .ops { display: flex; gap: 8px; flex: none; }
.audit-panel .btn-ok { background: #12805C; color: #fff; border: 0; border-radius: 7px; height: 30px; padding: 0 14px; font-size: 13px; cursor: pointer; font-family: inherit; white-space: nowrap; }
.audit-panel .btn-ok:hover { filter: brightness(1.06); }
.audit-panel .btn-no { background: #fff; border: 1px solid #EFC5C0; color: var(--danger); border-radius: 7px; height: 30px; padding: 0 14px; font-size: 13px; cursor: pointer; font-family: inherit; white-space: nowrap; }
.audit-panel .btn-no:hover { background: #FDECEC; }
.audit-empty { padding: 24px 8px; text-align: center; color: var(--muted); font-size: 13px; }

/* 凭证图片点击放大（小缩略图 → 大图弹窗） */
.imgzoom { display: inline-flex; cursor: zoom-in; max-width: 100%; }
.imgzoom:hover .mgr-attach-img { filter: brightness(.94); }
.imgzoom-modal { max-width: 760px; width: auto; }
.imgzoom-big {
  display: block; max-width: 100%; max-height: 72vh;
  border-radius: 8px; border: 1px solid var(--line); background: #fff;
}

/* 区域座谈：平铺座谈卡（横版：左信息 右双二维码）+ 题目自建 / 数据汇总 */
.symp-list { display: flex; flex-direction: column; gap: 14px; margin-bottom: 16px; }
/* 座谈汇总紧凑表（组长端 / 总后台组长块内共用）：一人一行约 40px，
   人多也不用一路往下拉；只在 .symp-tbl 作用域内生效，不影响别的表格 */
.symp-tbl { width: 100%; border-collapse: collapse; font-size: 13px; }
.symp-tbl thead th {
  text-align: left; font-weight: 600; color: var(--text-2); font-size: 12px;
  padding: 7px 12px; background: var(--brand-weak, #F4F8FF);
  border-bottom: 1px solid var(--line); white-space: nowrap;
}
.symp-tbl tbody td { padding: 8px 12px; border-bottom: 1px solid var(--line); vertical-align: middle; }
.symp-tbl tbody tr:last-child td { border-bottom: 0; }
.symp-tbl tbody tr:hover { background: #FAFBFF; }
.symp-tbl td.nm { display: flex; align-items: center; gap: 8px; white-space: nowrap; }
.symp-tbl td.nm .nm-t { font-weight: 600; color: var(--text); }
.symp-tbl td.num { text-align: center; width: 64px; font-variant-numeric: tabular-nums; }
.symp-tbl th.num { text-align: center; }
.symp-tbl td.go { text-align: right; width: 78px; white-space: nowrap; }
.symp-tbl .symp-tt {
  display: inline-block; padding: 1px 7px; border-radius: 5px;
  background: #EEF3FB; color: #3D5A80; font-size: 12px; white-space: nowrap;
}
.symp-card {
  display: flex; gap: 18px; align-items: stretch;
  background: var(--panel); border: 1px solid var(--line); border-radius: 12px;
  padding: 14px 16px;
}
.symp-card:hover { border-color: var(--brand-line); }
.symp-info { flex: 1; min-width: 0; }
.symp-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.symp-time { font-weight: 600; font-size: 14.5px; }
.symp-reason { color: var(--text-2); font-size: 13px; margin: 6px 0 12px; }
.symp-meta {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  border-top: 1px dashed var(--line); padding-top: 10px;
  font-size: 12.5px; color: var(--muted);
}
.symp-meta b { color: var(--text); font-size: 14px; font-weight: 600; }
.symp-meta .go { margin-left: auto; }
.rec-ok { color: var(--ok); } .rec-no { color: var(--muted); }
/* 录音行：在线播放 + 下载（明细页复用） */
.symp-audrow {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 10px;
}
.symp-audrow audio { height: 34px; }
.symp-audname {
  font-size: 12px; color: var(--muted); max-width: 200px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.symp-audrow .btn-mini { text-decoration: none; display: inline-flex; align-items: center; }

/* 右侧双二维码：点击放大 */
.symp-qrs { flex: none; display: flex; gap: 12px; align-items: stretch; }
.symp-qrblock {
  width: 116px; border: 1px solid var(--line-2); border-radius: 10px;
  background: #FBFCFE; padding: 10px 8px; text-align: center; cursor: zoom-in;
}
.symp-qrblock:hover { border-color: var(--brand-line); }
.symp-qrbox {
  width: 88px; height: 88px; border: 1px solid var(--line); border-radius: 6px;
  background: #fff; padding: 4px; margin: 0 auto 6px;
}
.symp-qr { width: 100%; height: 100%; display: block; }
.symp-qlabel { font-size: 12.5px; font-weight: 600; color: var(--text); }
.symp-qhint { font-size: 11px; color: var(--muted); }

/* 二维码放大弹窗 */
.symp-qrmodal { max-width: 420px; text-align: center; }
.symp-qr-warn {
  background: var(--danger-weak); border: 1px solid #F7C5C7; color: var(--danger);
  border-radius: 10px; padding: 9px 12px; font-size: 15px; font-weight: 700;
  letter-spacing: 1px; margin-bottom: 12px;
}
.symp-qr-bigwrap { padding: 8px 0; }
.symp-qr-big { width: 320px; height: 320px; max-width: 100%; }
.symp-qr-code { font-size: 13px; color: var(--text-2); margin-top: 4px; }
.symp-qr-code b { font-size: 18px; letter-spacing: 3px; color: var(--text); font-family: Consolas, monospace; }

/* 新建座谈 · 签到基准点（10-23：整块蓝底撤掉，只留提示文字那一层） */
.symp-loc { margin-top: 8px; }
.symp-loc-err { margin-top: 6px; font-size: 12.5px; color: var(--danger); }
.symp-loc-acc { margin-top: 6px; font-size: 12.5px; color: var(--ok); }
.symp-loc-hint { margin-top: 6px; font-size: 11.5px; color: var(--muted); line-height: 1.7; }
/* 纬度 / 经度：前置小标 + 等宽数字，右边一个次要按钮。
   注意特异性：下面那条通用 input 规则（.modal-card.symp-card-modal input[type=text]，
   带 padding:0 12px）优先级更高，会把这个 padding-left 冲掉 —— 冲掉之后「纬度」二字
   就和数字叠在一起（10-23 用户截图反馈）。所以这里必须带上同样的前缀。 */
.symp-crow { display: flex; align-items: center; gap: 10px; }
.symp-cfield { position: relative; flex: 1; min-width: 0; }
.symp-cfield > span {
  position: absolute; left: 11px; top: 50%; transform: translateY(-50%);
  font-size: 11px; color: var(--muted); pointer-events: none;
}
/* 特异性（0,4,1）故意比对上面的通用 input 规则高一级：两条会打平，
   通用规则又写在后面，靠顺序赢不稳 —— 加一层 .symp-crow 让它无论放在哪都赢。 */
.modal-card.symp-card-modal .symp-crow .symp-cfield input {
  padding-left: 46px; padding-right: 10px; font-size: 13px;
  font-family: Consolas, "SF Mono", monospace;
}
.symp-locbtn {
  height: 38px; padding: 0 14px; border-radius: 9px; flex: none; white-space: nowrap;
  border: 1px solid var(--line); background: #fff; color: var(--text-2); font-size: 13px;
}
.symp-locbtn:hover { border-color: var(--brand-line); color: var(--brand); background: var(--brand-weak); }
.symp-locbtn[disabled] { color: var(--muted); background: #F7F8FA; cursor: default; }

/* 区域座谈 · 答题题目自建 + 数据汇总（入口页下半区，两栏） */
.symp-split { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 16px; }
.symp-panel { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 18px 20px; }
.symp-sec-title { font-size: 14px; font-weight: 600; margin-bottom: 12px; }
.symp-qlist { list-style: none; margin: 0; padding: 0; }
.symp-qitem { display: flex; align-items: flex-start; gap: 10px; padding: 10px 0; border-bottom: 1px solid var(--line-2); }
.symp-qitem:last-child { border-bottom: 0; }
.symp-qnum {
  width: 22px; height: 22px; border-radius: 50%; flex: none; margin-top: 1px;
  background: var(--brand-weak); color: var(--brand);
  display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600;
}
.symp-qbody { flex: 1; min-width: 0; }
.symp-qtitle { font-size: 14px; color: var(--text); line-height: 1.5; }
.symp-qopts { font-size: 12px; color: var(--muted); margin-top: 3px; line-height: 1.6; }
.symp-qtype {
  display: inline-block; padding: 0 7px; border-radius: 999px; font-size: 11px; margin-right: 6px;
  background: var(--brand-weak); color: var(--brand);
}
.symp-qtype.text { background: #FFF4E6; color: var(--warn); }
.symp-qitem .btn-mini { flex: none; }
.symp-qactions { margin-top: 14px; display: flex; gap: 10px; }
.symp-sumgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.symp-sum { background: #FAFBFC; border: 1px solid var(--line-2); border-radius: 10px; padding: 12px 14px; text-align: center; }
.symp-sum .n { font-size: 22px; font-weight: 600; color: var(--text); }
.symp-sum .l { font-size: 12px; color: var(--muted); margin-top: 2px; }
.symp-sumfoot { margin-top: 14px; font-size: 12px; color: var(--muted); }

/* ==================== 区域座谈改版（2026-10-23） ====================
   入口页只派发两个动作；新建座谈 / 新增题目 / 新建分组 / 导出报表都改成弹窗。
   symp-acts / symp-act / symp-actsub / symp-card-modal / symp-frow / symp-lb /
   symp-msec / symp-imp / symp-chk / symp-miss 都是这里新起的（grep 过无同名）。 */

/* 入口页两张大卡：只做入口，不放表单不放列表 */
.symp-acts { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 4px; }
.symp-act {
  display: flex; align-items: center; gap: 14px; text-align: left; cursor: pointer;
  background: var(--panel); border: 1px solid var(--line); border-radius: 14px;
  padding: 22px 24px; transition: border-color .15s, box-shadow .15s, transform .15s;
}
.symp-act:hover { border-color: var(--brand-line); box-shadow: 0 6px 18px -10px rgba(16, 24, 40, .28); transform: translateY(-1px); }
.symp-act .ic {
  flex: none; width: 44px; height: 44px; border-radius: 12px; font-size: 22px;
  display: flex; align-items: center; justify-content: center;
}
.symp-act .tx { flex: 1; min-width: 0; }
.symp-act .tx h4 { margin: 0; font-size: 16px; font-weight: 600; color: var(--text); }
.symp-act .tx p { margin: 5px 0 0; font-size: 12.5px; color: var(--muted); line-height: 1.6; }
.symp-act .arrow { flex: none; font-size: 20px; color: var(--muted); }
.symp-act.primary .ic { background: #EEF3FF; color: var(--brand); }
.symp-act.primary .tx h4 { color: var(--brand); }
.symp-act.plain .ic { background: #F2F4F7; color: var(--text-2); }
/* 入口页底部那行题库入口 */
.symp-actsub {
  margin-top: 16px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  border: 1px dashed var(--line); border-radius: 12px; padding: 12px 16px;
  font-size: 13px; color: var(--text-2);
}
.symp-actsub b { color: var(--text); }
.symp-actsub .lnk {
  margin-left: auto; flex: none; background: none; border: 0; cursor: pointer;
  font-size: 13px; color: var(--brand); padding: 0;
}
.symp-actsub .lnk:hover { text-decoration: underline; }

/* 座谈系列弹窗：比默认 380px 宽，内容多要能滚 */
.modal-card.symp-card-modal {
  width: 720px; max-width: 94vw; max-height: 88vh; overflow-y: auto;
}
.modal-card.symp-card-modal.narrow { width: 520px; }
.modal-card.symp-card-modal .toolbar { flex-wrap: nowrap; align-items: center; }
.modal-card.symp-card-modal .toolbar h3 { margin: 0; font-size: 15.5px; }
.modal-card.symp-card-modal .toolbar .sub { margin-left: 10px; }
.modal-card.symp-card-modal .toolbar .btn-ghost { margin-left: auto; flex: none; }

/* 座谈弹窗里的输入控件（10-23 补，漏搬的一次补齐）
   项目没有全局 input 样式 —— 只有 .field input 那一套，裸 input / textarea 拿到的是
   浏览器默认外观（矮一截、方角、聚焦是一圈丑阴影），跟设计稿对不上。
   作用域压在 .symp-card-modal 内（只有座谈这一串弹窗用），别污染全站别的表单。 */
.modal-card.symp-card-modal input[type=text],
.modal-card.symp-card-modal input[type=datetime-local],
.modal-card.symp-card-modal textarea,
.modal-card.symp-card-modal select {
  width: 100%; height: 38px; padding: 0 12px;
  border: 1px solid var(--line); border-radius: 9px;
  font: 14px var(--font); color: var(--text); background: #fff;
  outline: none; transition: border-color .15s, box-shadow .15s;
}
.modal-card.symp-card-modal select { appearance: none; -webkit-appearance: none; cursor: pointer; }
.modal-card.symp-card-modal textarea {
  height: auto; min-height: 68px; padding: 10px 12px; resize: vertical; line-height: 1.6;
}
.modal-card.symp-card-modal input::placeholder,
.modal-card.symp-card-modal textarea::placeholder { color: #AEB5BF; }
.modal-card.symp-card-modal input:focus,
.modal-card.symp-card-modal textarea:focus,
.modal-card.symp-card-modal select:focus {
  border-color: var(--brand); box-shadow: 0 0 0 3px rgba(31, 90, 224, .12);
}

/* 新建座谈弹窗（10-23 版式重做）：头 / 身 / 脚三段，
   中间那一段滚动，按钮条钉在底部 —— 以前要把表单滚到底才点得到「创建座谈」。
   只给 .symp-new 加，题目 / 分组 / 导出那些弹窗还是老三段（它们内容短）。 */
.modal-card.symp-card-modal.symp-new {
  padding: 0; display: flex; flex-direction: column; overflow: hidden;
  border-radius: 16px; box-shadow: 0 24px 64px -16px rgba(16, 24, 40, .32);
}
.symp-mhead { flex: none; padding: 20px 26px 14px; border-bottom: 1px solid var(--line-2); }
.modal-card.symp-card-modal.symp-new .toolbar { margin-bottom: 0; align-items: flex-start; }
/* 头部按设计稿：标题 19px + 下面一行灰字说明，右上角一个 ✕ 图标（原来是 15.5px 标题 + 「关闭」文字按钮） */
.modal-card.symp-card-modal.symp-new .symp-htitle { min-width: 0; }
.modal-card.symp-card-modal.symp-new .symp-htitle h3 {
  margin: 0; font-size: 19px; font-weight: 600; line-height: 1.3; letter-spacing: -.2px;
}
.modal-card.symp-card-modal.symp-new .symp-htitle .sub {
  display: block; margin: 3px 0 0; font-size: 12.5px; color: var(--muted);
}
.symp-x {
  margin-left: auto; flex: none; width: 30px; height: 30px; padding: 0;
  border: 1px solid var(--line); border-radius: 8px; background: #fff;
  color: var(--muted); font-size: 15px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
}
.symp-x:hover { background: #F7F8FA; color: var(--text-2); }
.symp-form { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.symp-mbody { flex: 1 1 auto; min-height: 0; padding: 18px 26px 20px; overflow: auto; }
.symp-mfoot { flex: none; margin-top: 0; padding: 13px 26px; border-top: 1px solid var(--line-2); }
.symp-footnote { margin-right: auto; font-size: 11.5px; color: var(--muted); }

/* 头顶进度：六项填了几项 */
.symp-prog { display: flex; align-items: center; gap: 10px; margin-top: 14px; }
.symp-prog-bar { flex: 1; height: 4px; border-radius: 3px; background: var(--line-2); overflow: hidden; }
.symp-prog-bar i { display: block; height: 100%; background: var(--brand); border-radius: 3px; transition: width .25s; }
.symp-prog-txt { flex: none; font-size: 12px; color: var(--muted); }
.symp-prog-txt b { color: var(--brand); font-weight: 600; }

/* 弹窗内表单行：一行两项 / 一行一项 */
.symp-frow { margin-bottom: 18px; }
.symp-frow2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 18px; }
.symp-lb {
  display: flex; align-items: center; gap: 6px; font-weight: 500;
  font-size: 12.5px; color: var(--text-2); margin-bottom: 7px;
}
.symp-req { color: var(--danger); font-size: 13px; line-height: 1; }
.symp-lbhint { margin-left: auto; font-weight: 400; font-size: 11.5px; color: var(--muted); }
/* 表单块脚下的小字说明（跟设计稿的 .subhint 对齐：11.5px / 1.7） */
.symp-tipsub { margin-top: 8px; font-size: 11.5px; color: var(--muted); }
.symp-msec { font-size: 13px; font-weight: 600; color: var(--text); margin-bottom: 8px; }
.symp-mnote { font-weight: 400; font-size: 12px; color: var(--muted); margin-left: 6px; }
.symp-qgrp { margin-top: 4px; }

/* 答题分组：给 chips 一个容器，只有一个分组时也不显得空 */
.symp-chips {
  display: flex; flex-wrap: wrap; gap: 8px;
  border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; background: #FCFDFE;
}
.symp-chip {
  display: inline-flex; align-items: center; gap: 7px; height: 32px; padding: 0 13px;
  border: 1px solid var(--line); background: #fff; border-radius: 999px;
  font-size: 13px; color: var(--text-2);
}
.symp-chip:hover { border-color: var(--brand-line); }
.symp-chip.on {
  background: var(--brand-weak); border-color: var(--brand-line);
  color: var(--brand); font-weight: 500;
}
.symp-tick {
  width: 14px; height: 14px; border-radius: 50%; border: 1.5px solid #C9D0DA;
  display: flex; align-items: center; justify-content: center;
  font-size: 9px; line-height: 1; color: transparent;
}
.symp-chip.on .symp-tick { background: var(--brand); border-color: var(--brand); color: #fff; }
.symp-chipn { font-size: 11.5px; font-weight: 400; color: var(--muted); }
.symp-chip.on .symp-chipn { color: #5E86E8; }

.symp-need {
  border-left: 3px solid var(--danger); padding-left: 9px; margin-left: -12px;
  border-radius: 3px;
}
.symp-need > .symp-lb, .symp-need > .symp-msec { color: var(--danger); }
.symp-reqlink {
  background: none; border: 0; padding: 0; cursor: pointer;
  font-size: 12.5px; color: var(--brand); text-decoration: underline;
}

/* 名单导入块（10-23：里面那张上传卡换成一条线的版式） */
.symp-imp { border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }
.symp-imp.done { border-color: var(--brand-line); background: #FBFCFF; }
.symp-imp-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
/* 上传卡：图标 + 主副文案 + 状态徽标 + 按钮，一条线放完 */
.symp-up { display: flex; align-items: center; gap: 12px; }
.symp-up-ic {
  width: 38px; height: 38px; border-radius: 9px; background: var(--brand-weak);
  display: flex; align-items: center; justify-content: center; flex: none;
}
.symp-up-ic svg {
  width: 19px; height: 19px; fill: none; stroke: var(--brand);
  stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round;
}
.symp-up-tx { flex: 1; min-width: 0; }
.symp-up-t1 { font-size: 13.5px; font-weight: 500; }
.symp-up-t2 { font-size: 12px; color: var(--muted); margin-top: 1px; }
.symp-badge {
  display: inline-flex; align-items: center; gap: 5px; flex: none;
  height: 22px; padding: 0 9px; border-radius: 999px;
  font-size: 11.5px; background: #F2F4F7; color: var(--muted);
}
.symp-badge.ok { background: #E8F7F1; color: #0B7D57; }
.symp-badge b { font-size: 13px; }
/* 前 3 人预览：够抽查就行，不再摆一整张表 */
.symp-imp-peek { margin-top: 9px; font-size: 12px; color: var(--text-2); }
.symp-pick {
  display: inline-flex; align-items: center; cursor: pointer;
  height: 32px; padding: 0 14px; border-radius: 8px;
  border: 1px solid var(--brand-line); background: #EEF3FF; color: var(--brand);
  font-size: 13px;
}
.symp-pick:hover { filter: brightness(.97); }
.symp-imp-cnt { font-size: 13px; color: var(--text-2); }
.symp-imp-cnt b { color: var(--brand); font-size: 15px; }
/* 徽标里的数字：绿色底配蓝字太扎眼，压回同色系 */
.symp-badge.ok b { color: #0B7D57; font-size: 13px; font-weight: 600; }
.symp-imp-clr {
  background: none; border: 0; cursor: pointer; font-size: 12.5px;
  color: var(--muted); text-decoration: underline; padding: 0;
}

/* ---------- 座谈名单下发（2026-11-02）---------- */
/* 未读圆点：入口卡 / 面板标题 / 列表行通用的小红点 */
.ds-dot {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;
  background: #E5484D; color: #fff; font-style: normal;
  font-size: 11px; font-weight: 600; vertical-align: 2px; margin-left: 6px;
}
.symp-badge.wait { background: #FFF4E0; color: #9A6200; }
.symp-badge.drop { background: #FDEBEC; color: #C03538; }
/* 收到的名单列表：未读高亮 */
.ds-row { position: relative; }
.ds-row.unread { background: #FFF8F0; border-color: #F5D9B8; }
.ds-row .ds-meta {
  font-style: normal; font-size: 12px; color: var(--muted);
  margin-left: 8px; font-weight: 400;
}
/* 组长端下发记录表：已走回未看的行淡黄底 */
tr.ds-unread > td { background: #FFF8F0; }
/* 未到原因行内输入（收到的名单详情页） */
.ds-reason { width: 100%; }
/* 面板副标题里带图标时对齐 */
.symp-act .ic { flex: none; }
.symp-imp-tip { margin-top: 8px; font-size: 11.5px; color: var(--muted); line-height: 1.7; }
.symp-imp-tip b { color: var(--text-2); }
/* 识别结果回显：告诉用户认的是哪两列，认错了能立刻看出来 */
.symp-imp-rec {
  margin-top: 8px; font-size: 12px; color: var(--brand);
  background: #EEF3FF; border-radius: 6px; padding: 5px 10px; display: inline-block;
}
.symp-imp-more { margin-top: 6px; font-size: 11.5px; color: var(--muted); }
.symp-imp table { margin-top: 12px; }
.symp-imp table th, .symp-imp table td { padding: 7px 10px; }

/* 导出弹窗的勾选行 */
.symp-chk {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: 13.5px; color: var(--text); padding: 7px 0; cursor: pointer;
}
.symp-chk input { width: 15px; height: 15px; accent-color: var(--brand); }
.symp-chk-d { font-size: 12px; color: var(--muted); }

/* 明细页「未到」行标红 */
tr.symp-miss td { background: #FFF7F7; color: var(--danger); }
.adm-stat.red .v { color: var(--danger); }
/* 答题情况里的「答题内容」：一人多题串成一串，限宽换行免得把表格撑爆 */
.ans-txt { max-width: 360px; white-space: normal; line-height: 1.55; word-break: break-word; }

/* ==================== 阶段数据（按简历获取时间的区间汇总） ====================
   三个指标卡 + 口径说明。大区岗位子页和组长/总后台弹窗共用同一套。
   kpi- 前缀是这里新起的（起名前 grep 过 app.css，无同名）。 */
.kpi-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.kpi-card {
  border: 1px solid var(--line); border-radius: 12px; padding: 16px 18px 14px;
  background: var(--panel); position: relative; overflow: hidden;
}
.kpi-card::before {
  content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
  background: var(--kc, var(--brand));
}
.kpi-t { font-size: 13px; color: var(--muted); margin-bottom: 6px; }
.kpi-big { font-size: 32px; font-weight: 700; line-height: 1.15; color: var(--kc, var(--brand)); }
.kpi-frac { font-size: 12px; color: var(--muted); margin-top: 4px; }
.kpi-bar { height: 6px; border-radius: 4px; background: #EEF1F5; margin-top: 12px; overflow: hidden; }
.kpi-bar i { display: block; height: 100%; border-radius: 4px; background: var(--kc, var(--brand)); }
.kpi-note {
  font-size: 12px; color: var(--muted); margin-top: 14px;
  background: #F2F4F7; border-radius: 8px; padding: 8px 12px;
}
.modal-card.kpi-modal { width: 640px; max-width: 92vw; max-height: 84vh; overflow: auto; }
.kpi-modal .toolbar h3 { font-size: 14px; }
@media (max-width: 860px) { .kpi-row { grid-template-columns: 1fr; } }

/* ==================== 红色提醒角标（每天 12 点后的待办提醒） ====================
   工作台「每日日志」卡片右上角一个，漏斗页「每日总结」按钮上一个。
   口径由后端 /bootstrap 的 badges 下发：大区岗位 = 今天没写总结；
   运营组长 = 今天没进过每日日志。card-dot 起名前 grep 过无同名。 */
.card-dot {
  position: absolute; top: 10px; right: 10px; width: 10px; height: 10px;
  border-radius: 50%; background: var(--danger);
  box-shadow: 0 0 0 3px #FDEBEC; z-index: 1;
}
.notes-entry .btn-primary { position: relative; }
.card-dot-btn { top: -5px; right: -5px; }

/* ==================== Bug 反馈（事件驱动数字角标 + 页面样式） ====================
   card-count 是工作台「Bug 反馈」卡片右上角的数字角标（总后台 = 未读新 Bug，
   两端 = 未读回复条数），口径由后端 /bootstrap 的 bugBadge.unread 下发。
   bug-reply 给「回复」按钮加定位，好让未读红点挂右上角。
   bug-q 是回复弹窗里回显的原始 Bug 内容块。起名前 grep 过无同名。 */
.card-count {
  position: absolute; top: 10px; right: 10px; min-width: 20px; height: 20px;
  padding: 0 6px; border-radius: 99px; background: var(--danger); color: #fff;
  font-size: 12px; font-weight: 600; line-height: 20px; text-align: center;
  box-shadow: 0 0 0 3px #FDEBEC; z-index: 1;
}
.bug-reply { position: relative; }
.bug-q {
  background: #F7F9FC; border: 1px solid var(--line); border-radius: 8px;
  padding: 10px 12px; font-size: 13px; color: var(--text); line-height: 1.6;
  margin: 8px 0; white-space: pre-wrap; word-break: break-word;
}
.adm-stat.rose .v { color: var(--danger); }

/* ==================== 首页工作台 · 方案C 蓝白仪表盘 ====================
   浅蓝统计砖一排 + 两列蓝侧条横卡 + 品牌页脚。
   起名前 grep 过 app.css：hgrid / hcard / tiles / tile / home-head /
   home-sec / home-foot / del-warn 均无同名。 */

.home { max-width: 1060px; }
.home-head { text-align: center; margin-bottom: 24px; }
.home-head h2 { font-size: 24px; font-weight: 700; letter-spacing: 1px; margin: 0 0 4px; }
.home-head p { margin: 0; font-size: 13px; color: var(--muted); }

/* 浅蓝统计砖 */
.tiles { display: flex; justify-content: center; gap: 12px; flex-wrap: wrap; margin-bottom: 28px; }
.tile {
  flex: 0 1 108px; min-width: 88px;
  background: linear-gradient(160deg, #fff, #F0F5FE);
  border: 1px solid var(--line); border-radius: 10px; padding: 9px 10px; text-align: center;
  box-shadow: 0 1px 2px rgba(23, 67, 159, .04);
}
.tile .v { font-size: 16px; font-weight: 700; color: var(--brand); line-height: 1.2; }
.tile .v i { font-style: normal; font-size: 11px; font-weight: 400; color: var(--muted); margin-left: 2px; }
.tile .k { font-size: 11px; color: var(--muted); margin-top: 1px; }

/* 「功能入口」分隔线 */
.home-sec {
  display: flex; align-items: center; justify-content: center; gap: 14px;
  margin: 0 0 20px; color: var(--muted); font-size: 13px; letter-spacing: 2px;
}
.home-sec::before, .home-sec::after { content: ""; width: 64px; height: 1px; background: var(--brand-line); }

/* 两列蓝侧条横卡 */
.hgrid { display: flex; flex-wrap: wrap; justify-content: center; gap: 18px; }
.hcard {
  width: calc(50% - 9px); max-width: 480px; min-width: 320px;
  background: var(--panel); border: 1px solid var(--line); border-radius: 16px;
  display: flex; align-items: stretch; overflow: hidden; cursor: pointer; text-align: left;
  transition: transform .15s, box-shadow .15s, border-color .15s; position: relative; padding: 0; color: inherit;
}
.hcard:hover { transform: translateY(-3px); box-shadow: var(--shadow); border-color: var(--brand-line); }
.hcard .side {
  width: 86px; flex: none; background: linear-gradient(160deg, #1F5AE0, #4A7CF0);
  display: flex; align-items: center; justify-content: center; color: #fff;
}
.hcard .side svg { width: 30px; height: 30px; }
.hcard .bd {
  flex: 1; padding: 16px 20px 14px; display: flex; flex-direction: column; justify-content: center; gap: 3px;
}
.hcard .nm { font-size: 15.5px; font-weight: 600; }
.hcard .sub { font-size: 12.5px; color: var(--muted); line-height: 1.5; }
.hcard .meta { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.hcard .st {
  font-size: 11.5px; color: var(--brand); background: var(--brand-weak);
  border: 1px solid var(--brand-line); border-radius: 99px; padding: 1px 10px;
}
.hcard .more { font-size: 12px; color: var(--brand); margin-left: auto; }

/* 品牌页脚 */
.home-foot { text-align: center; padding: 30px 0 8px; color: var(--muted); font-size: 12.5px; letter-spacing: 1px; }
.home-foot b { color: var(--brand); font-weight: 600; }

@media (max-width: 760px) {
  .hcard { width: 100%; min-width: 0; }
}

/* ---------- 删除账号：红色确认按钮 + 弹窗警示条 ---------- */
.btn-mini.danger { color: var(--danger); border-color: #F3C9CC; }
.btn-mini.danger:hover { color: var(--danger); border-color: var(--danger); background: #FDECEC; }
.del-warn {
  background: #FDECEC; border: 1px solid #F3C9CC; color: var(--danger);
  border-radius: 8px; padding: 10px 12px; font-size: 12.5px; line-height: 1.6; margin: -6px 0 14px;
}
.del-warn b { font-weight: 600; }

/* ---------- 接单率查看 ---------- */
.adm-stat.violet .v { color: #7A5AF8; }
.adm-stat.amber .v { color: #C77700; }
.rate-stats { grid-template-columns: repeat(5, 1fr); }
.rate-lbl { font-size: 13px; color: var(--text-2); }
.rate-update { margin-left: auto; font-size: 12px; color: var(--muted); white-space: nowrap; }

table.rate-tbl th.num, table.rate-tbl td.num { text-align: right; font-variant-numeric: tabular-nums; }
.rate-date { font-variant-numeric: tabular-nums; color: var(--text-2); }
.rate { font-weight: 700; font-variant-numeric: tabular-nums; }
.rate.hi { color: var(--ok); }
.rate.mid { color: var(--warn); }
.rate.low { color: var(--danger); }
.rate-pending { color: var(--muted); font-size: 12.5px; }
tr.rate-total td { background: #F7F9FC; font-weight: 700; border-top: 1px solid var(--line); }
.rate-trend { font-size: 12px; color: var(--muted); white-space: nowrap; font-variant-numeric: tabular-nums; }
.rate-trend.up { color: var(--ok); }
.rate-trend.down { color: var(--danger); }

.rate-chart {
  background: var(--panel); border: 1px solid var(--line); border-radius: 12px;
  padding: 16px 18px 12px; margin-top: 16px;
}
.rate-chart-head { display: flex; align-items: center; gap: 18px; margin-bottom: 8px; font-size: 12px; }
.rate-chart-head b { font-size: 14px; }
.rate-lg { display: inline-flex; align-items: center; gap: 6px; color: var(--text-2); }
.rate-lg .sw { width: 10px; height: 10px; border-radius: 3px; display: inline-block; }
.rate-chart-empty { padding: 24px 0; text-align: center; color: var(--muted); font-size: 13px; }

/* ---------- 接单率查看：二级 tab + 司机级视图 ---------- */
.rate-tabs { display: flex; gap: 4px; margin-bottom: 14px; border-bottom: 1px solid var(--line); }
.rate-tab {
  border: 0; background: none; height: 40px; padding: 0 18px; font-size: 14px;
  color: var(--text-2); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.rate-tab:hover { color: var(--brand); }
.rate-tab.on { color: var(--brand); font-weight: 600; border-bottom-color: var(--brand); }

.rate-drv-stats { grid-template-columns: repeat(4, 1fr); }
.rd-bar { display: flex; height: 12px; border-radius: 6px; overflow: hidden; margin-top: 6px; }
.rd-bar i { display: block; height: 100%; }
.rd-legend { display: flex; gap: 20px; margin-top: 8px; font-size: 12.5px; color: var(--text-2); flex-wrap: wrap; }
.rd-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; }
.rd-legend b { color: var(--text); }
.rd-code { color: var(--brand); font-family: Consolas, Monaco, monospace; font-size: 12.5px; }
.rate-warn { font-size: 11px; color: var(--danger); background: var(--danger-weak); border-radius: 4px; padding: 1px 6px; margin-left: 4px; }

/* 雨天：按天视图横幅（当天雨天不计考核）+ 月/区间「已剔除 N 个雨天」提示 */
.rate-rain-tag {
  display: inline-block; font-size: 11px; font-weight: 600; color: #fff;
  background: #378ADD; border-radius: 4px; padding: 1px 8px; margin-right: 8px; vertical-align: 1px;
}
.rate-rain-banner {
  padding: 10px 14px; margin-bottom: 14px; border: 1px solid #BFD8EF; border-left: 4px solid #378ADD;
  border-radius: 8px; background: #EAF3FB; color: var(--text); font-size: 13px; line-height: 1.7;
}
.rate-rain-banner b { color: #185FA5; }
.rate-rain-banner .muted { margin-left: 8px; }
.rate-rain-banner .btn-mini { margin-left: 10px; }
.rate-rain-note {
  padding: 9px 14px; margin-bottom: 14px; border: 1px solid #BFD8EF; border-radius: 8px;
  background: #F0F6FC; color: var(--text-2); font-size: 12.5px; line-height: 1.6;
}
.rate-rain-note b { color: #185FA5; }
.rate-rain-row td { background: #F0F6FC; }

/* ---------- 每日复盘（分析 / 沟通） + 缺报看板 ---------- */
/* 缺报提醒横幅（大区岗位）：总后台一键提醒后，被提醒的人打开每日日志顶部看到
   醒目红条；填完总结或产生漏斗数据后后端重算 missing 自动消。daily-remind 起名 grep 过无同名。 */
.daily-remind {
  padding: 12px 16px; border: 1px solid var(--brand-line); border-left: 4px solid var(--danger);
  border-radius: 8px; background: var(--danger-weak); color: var(--danger);
  font-size: 13.5px; font-weight: 600; margin-bottom: 14px;
}

.rv-panel { margin-top: 16px; }
.rv-head { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.rv-head h3 { margin: 0; font-size: 16px; font-weight: 600; }
.rv-head .sub { color: var(--muted); font-size: 13px; flex: 1; min-width: 200px; }
.rv-form {
  margin-top: 14px; padding: 14px 16px; border: 1px solid var(--brand-line);
  border-radius: 10px; background: #FBFCFE;
}
/* 「存在问题 / 改善措施」的 textarea 此前是裸的（浏览器默认小方框）。
   2026-10-28 与 .field input 同款：白底、8px 圆角、聚焦蓝描边；3 行高、只许纵向拉伸。 */
.rv-form textarea {
  width: 100%; min-height: 92px; padding: 10px 12px; resize: vertical;
  border: 1px solid var(--line); border-radius: 8px;
  font: 14px/1.6 var(--font); color: var(--text); background: #fff;
  outline: none; transition: border-color .15s, box-shadow .15s;
}
.rv-form textarea::placeholder { color: #AEB5BF; }
.rv-form textarea:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.rv-form-head { font-weight: 600; font-size: 14px; margin-bottom: 12px; }
.rv-list-title { font-size: 13px; color: var(--muted); margin: 16px 0 8px; }

.rv-card { border: 1px solid var(--line); border-radius: 10px; margin-bottom: 12px; overflow: hidden; }
.rv-card.locked { opacity: .62; }
.rv-card-head {
  display: flex; align-items: center; gap: 12px; padding: 10px 14px;
  background: #FAFBFC; border-bottom: 1px solid var(--line-2); flex-wrap: wrap;
}
.rv-who b { font-size: 14px; }
.rv-mgr { color: var(--muted); font-size: 12px; }
.rv-date { margin-left: auto; color: var(--muted); font-size: 12px; }
.rv-body { padding: 12px 14px; }
.rv-txt { font-size: 13.5px; white-space: pre-wrap; }
.rv-body .mgr-attach-img, .rv-body audio { margin-top: 8px; display: block; }
.rv-attach { margin-top: 8px; }
/* 录音凭证：播放器和「转写概括」同一行（2026-10-28，原来转写控件独占一行还带蓝竖线） */
.rv-attach-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.rv-attach-row audio { flex: none; }
.rv-attach-row .trans { margin-top: 0; border-left: 0; background: none; padding: 0; border-radius: 0; flex: none; }
.rv-attach-row .trans-meta { margin-top: 0; text-align: left; }
.rv-attach-row .trans-done { justify-content: flex-start; gap: 6px; }
.rv-attach-name { display: block; font-size: 12px; color: var(--muted); margin-bottom: 4px; }
.rv-attach .mgr-attach-img, .rv-attach audio { display: block; max-width: 260px; }

.rv-comms { border-top: 1px dashed var(--line); margin: 0 14px; padding: 10px 0; }
.rv-msg { padding: 8px 12px; background: #FCFDFE; border: 1px solid var(--line-2); border-radius: 8px; margin-bottom: 8px; }
.rv-msg-meta { font-size: 12px; color: var(--muted); margin-bottom: 4px; }
.rv-msg-meta b { color: var(--text); }
.rv-msg-txt { font-size: 13px; white-space: pre-wrap; }
.rv-msg.rv-empty { color: var(--muted); }
.rv-msg audio { margin-top: 6px; }
.rv-card > .btn-mini { margin: 0 0 12px 14px; }

.rv-comm-form { padding: 0 14px 12px; }
.rv-comm-form textarea { min-height: 56px; }

.rv-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin: 14px 0; }
/* 复盘报告导出的自选区间（2026-10-28）：两个日期输入横排 */
.an-export-pick { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.an-export-pick .resdate { margin: 0; }
.rv-stat { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 14px 16px; }
.rv-stat .n { font-size: 26px; font-weight: 600; line-height: 1.2; }
.rv-stat .l { font-size: 12.5px; color: var(--muted); margin-top: 2px; }
.rv-stat.alert .n { color: var(--danger); }
.rv-stat.ok .n { color: var(--ok); }
.rv-toolbar { display: flex; align-items: center; gap: 10px; margin-bottom: 12px; }
.rv-grow { flex: 1; }
.rv-miss-tag { display: inline-block; padding: 1px 8px; border-radius: 5px; font-size: 12px; background: var(--danger-weak); color: var(--danger); margin-right: 4px; }
.rv-done-tag { display: inline-block; padding: 1px 8px; border-radius: 5px; font-size: 12px; background: #EAF7F0; color: var(--ok); }
.rv-reminded { color: var(--ok); font-size: 12px; }

/* 缺报看板紧凑版（2026-10-29 迁入每日日志顶部）：一行标题+判定+数字+折叠+提醒，未填名单默认收起 */
.miss-compact { padding: 13px 20px; }
.miss-top { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.miss-top h3 { margin: 0; font-size: 15.5px; font-weight: 600; white-space: nowrap; }
.miss-top .sub { color: var(--muted); font-size: 12.5px; flex: 1; min-width: 220px; }
.miss-chips { display: flex; gap: 8px; align-items: center; }
.mchip { display: flex; align-items: baseline; gap: 5px; background: var(--bg-soft, #f6f7fa); border-radius: 8px; padding: 5px 12px; }
.mchip .n { font-size: 17px; font-weight: 600; }
.mchip .l { font-size: 12px; color: var(--muted); }
.mchip.alert { background: var(--danger-weak); }
.mchip.alert .n { color: var(--danger); }
.mchip.ok .n { color: var(--ok); }
.miss-fold { border: none; background: transparent; color: var(--brand); font-size: 13px; cursor: pointer; padding: 4px 6px; white-space: nowrap; position: relative; }
/* 组长端：未填名单还没展开过时，折叠按钮右上角挂个红点（点开一次当天不再亮） */
.miss-fold .card-dot { top: -1px; right: -6px; width: 7px; height: 7px; box-shadow: 0 0 0 2px #fff; }
.miss-fold:hover { text-decoration: underline; }
.miss-fold .chev { display: inline-block; width: 12px; }
.miss-list { margin-top: 12px; border-top: 1px dashed var(--line); padding-top: 12px; }

/* ---------- 数据分析与沟通模块 ---------- */
.field label .req { color: var(--danger); font-weight: 600; }
.an-banner { display: flex; align-items: center; gap: 8px; background: #FDECEC; border: 1px solid #F3C9CC; border-radius: 8px; padding: 10px 12px; font-size: 13px; color: var(--danger); margin-bottom: 14px; }
.an-export { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding: 16px 18px; border: 1px solid var(--brand-line); border-radius: 10px; background: var(--brand-weak); }
.an-export .t { font-size: 15px; font-weight: 600; }
.an-export .d { font-size: 12.5px; color: var(--text-2); margin-top: 2px; }
.an-who { flex: 1; min-width: 0; }
.an-who-n { font-size: 14px; font-weight: 600; }
.an-who-n .mgr-title { font-weight: 400; }
.an-status { flex: none; }
.an-range { display: flex; align-items: center; gap: 8px; }
.an-range input[type="date"] { flex: 1; min-width: 0; }
.an-sep { color: var(--muted); flex: none; }

/* 语音转写 + 概括（所有录音共用） */
.trans { margin-top: 10px; border-left: 3px solid var(--brand, #1F5AE0); background: var(--panel); padding: 10px 12px; border-radius: 6px; }
.trans-done { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.trans-done-txt { font-size: 13px; color: var(--text); }
.trans-txt { font-size: 13px; line-height: 1.7; color: var(--text); white-space: pre-wrap; word-break: break-word; }
.trans-sum { margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--line); font-size: 13px; line-height: 1.6; color: var(--text); }
.trans-sum b { display: inline-block; margin-right: 4px; color: var(--brand, #1F5AE0); }
.trans-meta { margin-top: 8px; text-align: right; }
.trans-done .trans-meta { margin-top: 0; white-space: nowrap; }
.trans-loading { color: var(--muted); font-size: 13px; }
.trans-fail { color: var(--danger); font-size: 13px; }
/* 音频行（.aitem 是 flex 行）里的转写控件只留按钮 / 进度条本身，
   否则 .trans 的蓝左边框 + 内边距会被 flex 压成一道竖线 */
.aitem .trans { margin-top: 0; border-left: 0; background: none; padding: 0; border-radius: 0; flex: none; }
.aitem .trans-meta { margin-top: 0; text-align: left; }
.aitem .trans-done { justify-content: flex-start; gap: 6px; }
.aitem .trans-done-txt { white-space: nowrap; }
.aitem .trans-progress { width: 190px; }
/* 失败原因是一整句话（「语音转写未配置（缺本地 FunASR 服务地址…）」），
   flex 行里没宽度约束会被压成一列竖排汉字 —— 让它换行独占一行。
   必须写在 .aitem .trans 之后，两者选择器权重相同，靠顺序覆盖。 */
.aitem { flex-wrap: wrap; }
/* max-width 必须给 100%：原来这里有一条 max-width:320px，会把 100% 的 flex-basis 卡回 320，
   于是又不换行、又被压成竖排（这条和上一条是同一个选择器，合并成一条，别再拆开写）。 */
.aitem .trans-fail { flex: 1 0 100%; max-width: 100%; margin-top: 6px; line-height: 1.5; }

/* 转写实时进度条（processing / pending） */
.trans-progress { border-left-color: var(--brand, #1F5AE0); }
.trans-bar { position: relative; height: 6px; border-radius: 3px; background: #E8EDF5; overflow: hidden; }
.trans-bar i {
  display: block; height: 100%; border-radius: 3px;
  background: linear-gradient(90deg, var(--brand, #1F5AE0), #5B8DEF);
  transition: width .6s ease;
}
.trans-bar::after {
  content: ''; position: absolute; top: 0; left: -40%; width: 40%; height: 100%;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, .55), transparent);
  animation: transShimmer 1.4s infinite;
}
@keyframes transShimmer {
  0% { left: -40%; }
  100% { left: 100%; }
}
.trans-info { display: flex; align-items: center; justify-content: space-between; margin-top: 6px; }
.trans-stage { font-size: 12.5px; color: var(--muted); }
.trans-pct { font-size: 12.5px; font-weight: 600; color: var(--brand, #1F5AE0); }

/* ---------- 积分统计 ---------- */
.pt-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin: 14px 0; }
.pt-stat { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 14px 16px; }
.pt-stat .n { font-size: 26px; font-weight: 600; line-height: 1.2; }
.pt-stat .n small { font-size: 14px; color: var(--muted); font-weight: 500; }
.pt-stat .l { font-size: 12.5px; color: var(--muted); margin-top: 2px; }
.pt-stat.brand .n { color: var(--brand); }
.pt-stat.ok .n { color: var(--ok); }
.pt-stat.alert .n { color: var(--danger); }

.pt-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.pt-toolbar select, .pt-toolbar input[type="date"], .pt-toolbar input[type="text"] {
  border: 1px solid var(--line); border-radius: 8px; padding: 7px 10px; font: 13px var(--font); background: #fff; color: var(--text);
}
.pt-custom { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--muted); }
.pt-search { width: 140px; }

.pt-rank { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 8px; font-weight: 600; font-size: 13px; color: var(--muted); }
.pt-rank.r1 { background: #FDF3E0; color: #B7791F; }
.pt-rank.r2 { background: #F0F2F5; color: #5B6470; }
.pt-rank.r3 { background: #FBEADB; color: #A05A2C; }

.pt-total { font-size: 16px; font-weight: 600; color: var(--brand); }
.pt-rate { display: inline-block; padding: 1px 8px; border-radius: 5px; font-size: 12px; white-space: nowrap; }
.pt-rate.ok { background: #E9F7EE; color: #1D8A4E; }
.pt-rate.bad { background: var(--danger-weak); color: var(--danger); }
.pt-trend { font-size: 12px; white-space: nowrap; }
.pt-trend.ok { color: var(--ok); }
.pt-trend.bad { color: var(--danger); }
.pt-legend { font-size: 12px; color: var(--muted); margin-top: 12px; }

tr.pt-me td { background: var(--brand-weak); }
.pt-me-inline { display: inline-block; background: var(--brand-weak); padding: 0 6px; border-radius: 4px; color: var(--text-2); }


/* 积分统计 · 今日五项状态卡（2026-10-24「每日总结」复原，列数从 4 回到 5；
   类名 pt-today4 是历史遗留，只描述这一组卡，不跟着改 —— grep 过全站只有这里和 modules.js 用） */
.pt-today4 { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; margin-bottom: 14px; }
.pt-t4 { border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; background: var(--panel); }
.pt-t4 .h { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.pt-t4 .name { font-weight: 600; font-size: 13.5px; }
.pt-t4 .pts { font-size: 18px; font-weight: 600; }
.pt-t4 .pts.plus { color: var(--ok); }
.pt-t4 .pts.zero { color: var(--muted); }
.pt-t4 .s { font-size: 12px; color: var(--muted); margin-top: 4px; }
.pt-t4.got { border-color: #BFE5D2; background: linear-gradient(180deg, #FBFEFC, #fff); }

/* 积分统计 · 职位彩色标签 / 我徽标 / 得分率进度条 */
.pt-tag { display: inline-block; padding: 1px 8px; border-radius: 5px; font-size: 12px; line-height: 1.5; white-space: nowrap; }
.pt-tag.asst { background: var(--brand-weak); color: var(--brand); }
.pt-tag.dep { background: #F3F0FE; color: #7C5CE0; }
.pt-tag.sup { background: #FFF4E5; color: #B76E00; }
.pt-mebadge { display: inline-block; padding: 0 7px; border-radius: 5px; font-size: 12px; background: #F2F4F7; color: var(--muted); vertical-align: 1px; }
.pt-bar-cell { min-width: 110px; }
.pt-bar { height: 6px; border-radius: 3px; background: #F0F2F5; overflow: hidden; }
.pt-bar i { display: block; height: 100%; border-radius: 3px; background: var(--brand); }

/* 成绩排行 · 分组段位榜：段位标签 + 分组标签（姚币 10-22 起前端不再展示） */
.pt-tier { display: inline-block; padding: 2px 10px; border-radius: 6px; font-size: 12px; font-weight: 600; white-space: nowrap; }
.pt-tier.king { background: linear-gradient(180deg, #FFF3D6, #FFE7A8); color: #A16207; border: 1px solid #F5D67A; }
.pt-tier.diamond { background: linear-gradient(180deg, #EAF3FF, #D9E8FF); color: #2456C7; border: 1px solid #BBD3FF; }
.pt-tier.gold { background: linear-gradient(180deg, #FFF2E4, #FFE4C2); color: #B76E00; border: 1px solid #F5CF96; }
.pt-tier.silver { background: linear-gradient(180deg, #F3F5F7, #E9ECEF); color: #5B6470; border: 1px solid #D5DAE0; }
.pt-tier.bronze { background: linear-gradient(180deg, #F9EEE6, #F2DFD1); color: #8C5A34; border: 1px solid #E3C3A6; }
.pt-group-tag { display: inline-block; padding: 1px 8px; border-radius: 5px; font-size: 12px; background: #FDF3E0; color: #B7791F; white-space: nowrap; }

/* 积分统计 · 总后台分组管理 */
.ptg-toolbar { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.ptg-input, .ptg-select {
  border: 1px solid var(--line); border-radius: 8px; padding: 7px 10px; font: 13px var(--font); background: #fff; color: var(--text); min-width: 180px;
}
.ptg-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 14px; }
.ptg-card { border: 1px solid var(--line); border-radius: 10px; background: var(--panel); padding: 12px 14px; }
.ptg-card.ungrouped { border-style: dashed; background: #FAFBFC; }
.ptg-head { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
.ptg-name { font-weight: 600; font-size: 14px; }
.ptg-count { font-size: 12px; color: var(--muted); background: #F2F4F7; border-radius: 10px; padding: 1px 8px; }
.ptg-members { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.ptg-members li {
  display: flex; align-items: center; gap: 8px; border: 1px solid var(--line); border-radius: 8px; padding: 6px 8px; cursor: pointer; transition: border-color .15s;
}
.ptg-members li:hover { border-color: var(--brand); }
.ptg-members li.ptg-empty { cursor: default; border-style: dashed; }
.ptg-mname { display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0; }
.ptg-mregion { font-size: 12px; color: var(--muted); white-space: nowrap; }
.ptg-x { border: none; background: transparent; color: var(--muted); cursor: pointer; font-size: 14px; padding: 2px 6px; border-radius: 5px; }
.ptg-x:hover { color: var(--danger); background: var(--danger-weak); }
.btn-xs { padding: 3px 8px; font-size: 12px; }
.btn-xs.danger { color: var(--danger); }

/* 积分统计 · 历史周结算记录 */
.ptg-wk { border: 1px solid var(--line); border-radius: 10px; margin-bottom: 12px; overflow: hidden; }
.ptg-wk-head { background: #F7F8FA; padding: 8px 14px; font-size: 13px; font-weight: 600; color: var(--text-2); border-bottom: 1px solid var(--line); }
.ptg-wk-group { padding: 10px 14px; }
.ptg-wk-group + .ptg-wk-group { border-top: 1px dashed var(--line); }
.ptg-wk-gname { font-size: 13px; font-weight: 600; margin-bottom: 6px; }
.ptg-wk-table { width: 100%; border-collapse: collapse; }
.ptg-wk-table th, .ptg-wk-table td { padding: 6px 8px; border-bottom: 1px solid #F0F2F5; font-size: 13px; }
.ptg-wk-table thead th { color: var(--muted); font-weight: 500; }

/* 运营组长端 · 每日日志重设计（2026-10-21）：一人一行表格 + 筛选 + 4 统计卡 */
.mgr-who { display: flex; align-items: center; gap: 10px; }
/* 组长列表里「点名字 = 进该大区岗位的总览」 */
.mgr-who-link { cursor: pointer; border-radius: 8px; }
.mgr-who-link:hover .mgr-name { color: var(--brand); }
.mgr-ava.sm { width: 30px; height: 30px; font-size: 13px; border-radius: 8px; }
.mgr-name.sm { font-size: 14px; }
.mgr-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 14px; }
.mgr-stat {
  background: var(--panel); border: 1px solid var(--line); border-radius: 10px;
  padding: 14px 16px; cursor: pointer; transition: border-color .15s, box-shadow .15s;
}
.mgr-stat:hover { border-color: var(--brand-line); }
.mgr-stat.on { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.mgr-stat .n { font-size: 24px; font-weight: 600; line-height: 1.2; }
.mgr-stat .n small { font-size: 13px; color: var(--muted); font-weight: 500; }
.mgr-stat .l { font-size: 12.5px; color: var(--muted); margin-top: 2px; }
.mgr-stat.wait .n { color: var(--brand); }
.mgr-stat.ok .n { color: var(--ok); }
.mgr-stat.drop .n { color: var(--danger); }
.mgr-stat.audit .n { color: var(--warn); }

.mgr-cnt {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 32px; height: 26px; padding: 0 8px; border: 0; border-radius: 7px;
  font-weight: 600; font-size: 13px; cursor: pointer; background: var(--brand-weak); color: var(--brand);
  transition: background .15s, color .15s;
}
.mgr-cnt:hover { background: var(--brand); color: #fff; }
.mgr-cnt.zero { color: var(--muted); background: #F2F4F7; font-weight: 500; }
.mgr-cnt.zero:hover { background: #E6EAF0; color: var(--text-2); }
.mgr-cnt.tone-blue { background: #E8EEFE; color: #1F5AE0; }
.mgr-cnt.tone-teal { background: #E2F3EF; color: #0E8A72; }
.mgr-cnt.tone-violet { background: #EDE9FC; color: #6A4FE0; }
.mgr-cnt.tone-green { background: #E6F5EC; color: #1D8A4E; }
.mgr-cnt.tone-amber { background: #FDF0DC; color: #C77700; }
.mgr-cnt.tone-blue:hover { background: #1F5AE0; color: #fff; }
.mgr-cnt.tone-teal:hover { background: #0E8A72; color: #fff; }
.mgr-cnt.tone-violet:hover { background: #6A4FE0; color: #fff; }
.mgr-cnt.tone-green:hover { background: #1D8A4E; color: #fff; }
.mgr-cnt.tone-amber:hover { background: #C77700; color: #fff; }

/* ---- 外出报备 · 新增弹窗（2026-10-22 建，2026-10-30 重设计） ----
   病因：原版弹窗无限高、遮罩不能滚，凭证一多「提交报备」在视口外点不到；
   图片还是 180px 大图竖堆，两张就把弹窗撑爆。
   新版：弹窗整体限高 86vh，头部 / 底部按钮常驻，中间 .out-scroll 内滚；
   图片收成 84×84 缩略图网格（点开走 img-zoom、右上角 × 删除），
   录音 / Excel / 压缩包收成一行一个的紧凑行。全部限定在 .out-card 内，不外溢。 */
.modal-card.out-card {
  width: 660px; max-width: 94vw; padding: 0;
  max-height: 86vh; display: flex; flex-direction: column; overflow: hidden;
}
.modal-card.out-card .out-head { flex: none; display: flex; align-items: center; padding: 16px 22px 12px; }
.modal-card.out-card .out-head h3 { margin: 0; font-size: 15px; font-weight: 600; }
.modal-card.out-card .out-head .btn-ghost { margin-left: auto; flex: none; }
.modal-card.out-card form { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }
.modal-card.out-card .out-scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 2px 22px 16px; }
.modal-card.out-card .out-foot {
  flex: none; display: flex; align-items: center; justify-content: flex-end; gap: 10px;
  border-top: 1px solid var(--line); background: #FBFCFE; padding: 12px 22px;
}
/* .btn-primary 默认 width:100%，在自写 flex 底栏里会把「取消」挤成竖排两字
   （.modal-btns 那条老坑），这里照抄同样的事后修正 */
.modal-card.out-card .out-foot > .btn-primary { width: auto; min-width: 120px; margin-top: 0; }
.modal-card.out-card .out-foot > .btn-ghost { flex: none; white-space: nowrap; height: 34px; padding: 0 16px; }
.modal-card.out-card .out-foot .login-err { margin: 0 auto 0 0; min-height: 0; }
.modal-card.out-card .orow { display: grid; grid-template-columns: 170px 1fr; gap: 14px; margin-bottom: 14px; }
.modal-card.out-card .otimes { display: flex; align-items: center; gap: 8px; }
.modal-card.out-card .otimes input { width: 100%; }
.modal-card.out-card .otimes .dash { color: var(--muted); flex: none; }
.modal-card.out-card .ofield { margin-bottom: 14px; }
.modal-card.out-card .lb { display: block; font-size: 12px; color: var(--text-2); margin-bottom: 6px; }
.modal-card.out-card .lb .req { color: #D64545; margin-left: 2px; }
.modal-card.out-card input[type="date"],
.modal-card.out-card input[type="time"],
.modal-card.out-card textarea {
  width: 100%; box-sizing: border-box; height: 36px; padding: 7px 10px;
  border: 1px solid var(--line); border-radius: 8px; background: #fff;
  font-size: 14px; color: var(--text);
}
.modal-card.out-card textarea { height: auto; min-height: 62px; resize: vertical; }
.modal-card.out-card input[type="date"]:focus,
.modal-card.out-card input[type="time"]:focus,
.modal-card.out-card textarea:focus {
  border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); outline: none;
}

/* 凭证：图片缩略图网格 */
.modal-card.out-card .vgrid { display: flex; flex-wrap: wrap; gap: 12px; }
.modal-card.out-card .vthumb { width: 84px; position: relative; }
.modal-card.out-card .vbox {
  display: block; width: 84px; height: 84px; padding: 0; border-radius: 10px;
  border: 1px solid var(--line); background: #fff; overflow: hidden; cursor: zoom-in;
  transition: border-color .15s, box-shadow .15s;
}
.modal-card.out-card .vbox:hover { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.modal-card.out-card .vbox img { width: 100%; height: 100%; object-fit: cover; display: block; }
.modal-card.out-card .vdel {
  position: absolute; top: -7px; right: -7px; width: 20px; height: 20px; padding: 0;
  border-radius: 50%; background: rgba(27, 35, 48, .82); color: #fff; border: 2px solid #fff;
  font-size: 11px; line-height: 1; cursor: pointer; display: grid; place-items: center;
}
.modal-card.out-card .vdel:hover { background: #D64545; }
.modal-card.out-card .vthumb .fname {
  font-size: 11px; color: var(--text-2); margin-top: 4px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.modal-card.out-card .vadd {
  width: 84px; height: 84px; border: 1.5px dashed #C4CCDA; border-radius: 10px;
  display: grid; place-items: center; color: var(--muted); font-size: 12px;
  cursor: pointer; text-align: center; line-height: 1.5;
}
.modal-card.out-card .vadd:hover { border-color: var(--brand); color: var(--brand); background: var(--brand-weak); }
.modal-card.out-card .vadd input[type="file"] { display: none; }

/* 凭证：录音 / Excel / 压缩包紧凑行 */
.modal-card.out-card .vfiles { margin-top: 10px; }
.modal-card.out-card .vfile {
  display: flex; align-items: center; gap: 10px;
  border: 1px solid var(--line); border-radius: 10px; padding: 8px 12px; font-size: 12.5px;
}
.modal-card.out-card .vfile + .vfile { margin-top: 8px; }
.modal-card.out-card .vfile .ic {
  width: 34px; height: 34px; border-radius: 8px; display: grid; place-items: center;
  font-size: 12px; font-weight: 600; flex: none;
}
.modal-card.out-card .vfile .ic.aud { background: #EAF7F1; color: #0E8A72; }
.modal-card.out-card .vfile .ic.doc { background: #FDF6E7; color: #A97611; }
.modal-card.out-card .vfile .meta { min-width: 0; }
.modal-card.out-card .vfile .meta .n { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 150px; }
.modal-card.out-card .vfile .meta .k { font-size: 11px; color: var(--muted); }
.modal-card.out-card .vfile audio { height: 30px; flex: 1; min-width: 120px; max-width: 300px; }
.modal-card.out-card .vfile .out-dl { flex: none; margin-left: auto; font-size: 12.5px; color: var(--brand); }
.modal-card.out-card .vfile .btn-mini { margin-left: auto; flex: none; margin-top: 0; }
.modal-card.out-card .vfile .meta + .btn-mini { margin-left: auto; }

/* ---- 外出报备 · 凭证列统一小方格（2026-10-22） ----
   以前录音是横条播放器、图片是缩略图、压缩包是下载链接，三种高度不齐竖着堆，
   一行被撑得忽高忽低。现在不管什么类型都收成同一个 46×46 的格子横排，行高恒定。
   这里的 .vchip 也复用在预览弹窗底部的小图切换条上，所以尺寸交给调用处覆盖。 */
.vchips { display: flex; flex-wrap: wrap; gap: 6px; }

.vchip {
  width: 46px; height: 46px; border-radius: 8px; border: 1px solid var(--line);
  background: #fff; padding: 0; overflow: hidden; position: relative;
  display: grid; place-items: center;
  transition: border-color .15s, box-shadow .15s;
}
.vchip:hover { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-weak); }
.vchip:active { transform: scale(.97); }
.vchip img { width: 100%; height: 100%; object-fit: cover; display: block; }
.vchip .tri { width: 0; height: 0; border-left: 11px solid currentColor;
  border-top: 7px solid transparent; border-bottom: 7px solid transparent; margin-left: 3px; }
.vchip .ex { font-size: 10px; font-weight: 700; letter-spacing: .3px; }
.vchip.aud { background: #EAF7F1; border-color: #CBEBDE; color: #0E8A72; }
.vchip.zip { background: #FDF6E7; border-color: #F1E2C4; color: #A97611; }
.vchip.more { background: #F2F4F7; border-color: #E3E7ED; color: var(--text-2);
  font-size: 12px; font-weight: 500; letter-spacing: -.2px; }
.vchip.on { border-color: var(--brand); box-shadow: 0 0 0 2px var(--brand-weak); }

/* ---- 凭证预览弹窗 ---- */
.modal-card.vch-card { width: 720px; max-width: 94vw; }
.modal-card.vch-card .sub { margin-left: 2px; }
.vch-body {
  padding: 16px 18px; background: #FAFBFC; min-height: 240px;
  display: flex; align-items: center; justify-content: center;
}
.vch-body .vch-big {
  max-width: 100%; max-height: 54vh; border-radius: 8px;
  border: 1px solid var(--line); background: #fff;
}
.vch-audio { width: 100%; text-align: left; }
.vch-audio audio { width: 100%; }
.vch-audio .trans { margin-top: 12px; }
.vch-file { text-align: center; padding: 22px 10px; }
.vch-file .vch-ext {
  width: 64px; height: 64px; border-radius: 14px; background: #FDF6E7;
  border: 1px solid #F1E2C4; color: #A97611; display: grid; place-items: center;
  font-size: 13px; font-weight: 700; margin: 0 auto 12px;
}
.vch-file .vch-fn { font-size: 13px; margin-bottom: 4px; word-break: break-all; }
.vch-file .vch-fs { font-size: 12px; color: var(--muted); margin-bottom: 14px; }
.vch-file .btn-inline { text-decoration: none; }
.vch-thumbs {
  display: flex; gap: 8px; padding: 12px 18px 16px;
  border-top: 1px solid var(--line); flex-wrap: wrap;
}
.vch-thumbs .vchip { width: 54px; height: 44px; }

/* ==================== AI 助手 + 工作态度（2026-10-23）====================
   2026-10-23 上线时是顶掉「每日总结」的，2026-10-24 用户要求把总结复原 ——
   现在三块并存：每日总结（他写）/ AI 助手（系统推演）/ 工作态度（系统判定）。
   类名分工：总结用 nform / nlist / nitem（这一节上面的老类名，从没删过），
   这两块的所有类名都以 ai- / att- 开头，跟别处不冲突。 */

/* 入口按钮里的 AI 图标底色 */
.dqi-ai { background: linear-gradient(135deg, #EEF2FF, #F5EEFF); color: #6D4BE0; }

/* ---------- AI 助手弹窗 ---------- */
.modal-card.ai-card {
  width: 620px; max-width: 94vw; padding: 0;
  display: flex; flex-direction: column; overflow: hidden;
  border-radius: 16px; box-shadow: 0 24px 64px -16px rgba(16, 24, 40, .32);
}
.modal-card.ai-card.ai-result { width: 700px; }
.ai-head {
  display: flex; align-items: flex-start; gap: 12px;
  padding: 16px 20px 14px; border-bottom: 1px solid var(--line);
}
.ai-head h3 { margin: 0; font-size: 18px; font-weight: 600; }
.ai-head .sub { display: block; margin-top: 3px; font-size: 12.5px; color: var(--muted); line-height: 1.5; }
.ai-x {
  margin-left: auto; flex: none; width: 30px; height: 30px; padding: 0;
  border: 1px solid var(--line); border-radius: 8px; background: #fff;
  color: var(--muted); font-size: 15px; line-height: 1; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
.ai-x:hover { background: #F7F8FA; color: var(--text-2); }
.ai-body { padding: 16px 20px; max-height: 62vh; overflow: auto; }
.ai-card .modal-btns { padding: 14px 20px; background: #FBFCFE; }
.ai-card .modal-btns button { width: auto; flex: none; white-space: nowrap; }

/* 只剩「打算加盟几个人」一个字段：占满一行但别拉成整条横幅，限个宽度更好看 */
.ai-frow { display: grid; grid-template-columns: 1fr; gap: 14px; }
.ai-frow .ai-field { max-width: 320px; }
.ai-field label {
  display: block; font-size: 13px; font-weight: 500; margin-bottom: 7px;
}
.ai-field label span { font-weight: 400; color: var(--muted); font-size: 12px; margin-left: 6px; }
.ai-field input {
  width: 100%; height: 40px; padding: 0 12px;
  border: 1px solid var(--line); border-radius: 9px;
  font: 14px var(--font); color: var(--text); background: #fff; outline: none;
}
.ai-field input:focus { border-color: var(--brand); box-shadow: 0 0 0 3px rgba(31, 90, 224, .12); }
.ai-tip {
  margin-top: 14px; padding: 10px 12px; background: #FBFCFE;
  border: 1px dashed var(--line); border-radius: 9px;
  font-size: 12.5px; color: var(--text-2); line-height: 1.7;
}
.ai-tip b { color: var(--text); }
.ai-err {
  margin-top: 12px; padding: 9px 12px; border-radius: 8px;
  background: #FDECEC; color: #C4302F; font-size: 12.5px;
}

/* loading */
.ai-loading { text-align: center; padding: 40px 20px 46px; }
.ai-spin {
  width: 34px; height: 34px; margin: 0 auto 14px; border-radius: 50%;
  border: 3px solid var(--line); border-top-color: var(--brand);
  animation: ai-spin .8s linear infinite;
}
@keyframes ai-spin { to { transform: rotate(360deg); } }
.ai-load-txt { font-size: 13px; color: var(--text-2); }
.ai-load-bar {
  margin: 16px auto 0; width: 220px; height: 5px; border-radius: 3px;
  background: #EEF1F5; overflow: hidden; position: relative;
}
.ai-load-bar i {
  position: absolute; top: 0; bottom: 0; width: 40%; border-radius: 3px;
  background: var(--brand); animation: ai-slide 1.2s ease-in-out infinite;
}
@keyframes ai-slide { 0% { left: -40%; } 100% { left: 100%; } }

/* 结果三段 */
.ai-sec { padding-bottom: 16px; margin-bottom: 16px; border-bottom: 1px dashed var(--line); }
.ai-sec:last-of-type { border-bottom: none; margin-bottom: 0; padding-bottom: 0; }
.ai-h { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
.ai-h .no {
  width: 19px; height: 19px; border-radius: 50%; background: var(--brand-weak);
  color: var(--brand); font-size: 11.5px; display: inline-flex;
  align-items: center; justify-content: center; flex: none;
}
.ai-h b { font-size: 14px; }
.ai-text {
  margin-top: 10px; padding: 11px 13px; border-radius: 8px;
  border: 1px solid var(--line); border-left: 3px solid var(--brand);
  background: #FBFCFE; font-size: 13px; color: var(--text-2); line-height: 1.8;
}
.ai-text.ok { border-left-color: #0E9F6E; background: #F2FAF7; }
.ai-text.warn { border-left-color: #C77700; background: #FDF8EF; }
.ai-text b { color: var(--text); }
.ai-legend { margin-top: 6px; font-size: 11.5px; color: var(--muted); line-height: 1.6; }
.ai-ev { margin: 10px 0 0; padding: 0; list-style: none; font-size: 12.5px; color: var(--text-2); }
.ai-ev li { padding: 3px 0 3px 14px; position: relative; }
.ai-ev li:before {
  content: ''; position: absolute; left: 0; top: 10px;
  width: 5px; height: 5px; border-radius: 50%; background: var(--muted);
}

/* 漏斗四段 */
.ai-funnel { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.ai-funnel .fn {
  border: 1px solid var(--line); border-radius: 9px; padding: 9px 8px;
  text-align: center; background: #FBFCFE;
}
.ai-funnel .fn .k { font-size: 11.5px; color: var(--muted); }
.ai-funnel .fn .v { font-size: 19px; font-weight: 700; margin-top: 1px; }
.ai-funnel .fn .r { font-size: 11px; color: var(--brand); margin-top: 1px; }

/* 预测块 */
.ai-pred {
  margin-top: 10px; border: 1px solid var(--line); border-radius: 10px;
  padding: 13px 15px; background: #FBFCFE;
}
.ai-pred .row { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; flex-wrap: wrap; }
.ai-pred .k { font-size: 12.5px; color: var(--muted); width: 74px; flex: none; }
.ai-pred .v { font-size: 17px; font-weight: 700; }
.ai-pred .t { font-size: 12px; color: var(--muted); }
.ai-bar { height: 8px; border-radius: 4px; background: #EEF1F5; overflow: hidden; margin-top: 8px; }
.ai-bar i { display: block; height: 100%; border-radius: 4px; background: var(--brand); }
.ai-bar i.good { background: #0E9F6E; }
.ai-bar i.bad { background: #E5484D; }

/* 三段转化率对比 */
.ai-cmp { display: grid; gap: 8px; }
.ai-cmp-row { display: grid; grid-template-columns: 96px 1fr 54px; align-items: center; gap: 10px; font-size: 12.5px; }
.ai-cmp-row .nm { color: var(--text-2); }
.ai-cmp-row .pct { text-align: right; font-weight: 600; }
.ai-cmp-row.low .pct { color: #E5484D; }
.ai-cmp-row .track { height: 9px; border-radius: 5px; background: #EEF1F5; position: relative; }
.ai-cmp-row .track i { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 5px; background: var(--brand); }
.ai-cmp-row.low .track i { background: #E5484D; }
.ai-cmp-row .track .mark { position: absolute; top: -3px; bottom: -3px; width: 2px; background: var(--text-2); opacity: .35; }
.ai-note { margin-top: 12px; font-size: 12px; color: var(--muted); }

/* ---------- 工作态度 ---------- */
.att-badge { display: inline-block; font-size: 12px; padding: 2px 9px; border-radius: 20px; white-space: nowrap; }
.att-badge.att-ok { background: #E7F6F0; color: #0E9F6E; }
.att-badge.att-warn { background: #FBF3E6; color: #C77700; }
.att-badge.att-bad { background: #FDECEC; color: #E5484D; }
/* 列表里那格做成可点的按钮：去掉按钮皮，只留徽章 */
.att-cell {
  border: none; background: none; padding: 0; cursor: pointer; font: inherit;
}

/* 热力条：一格一天。周期最长 31 天，用 auto-fill 自动换行，别硬撑成 7 列 */
.att-week {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(36px, 1fr));
  gap: 5px; margin-top: 10px;
}
.att-wd { text-align: center; }
.att-wd i {
  display: flex; align-items: center; justify-content: center; height: 28px;
  border-radius: 6px; background: #F2F4F7; font-style: normal;
  font-size: 12px; color: var(--muted);
}
.att-wd b { display: block; margin-top: 3px; font-size: 11px; font-weight: 400; color: var(--muted); }
.att-wd.on i { background: var(--brand-weak); color: var(--brand); font-weight: 600; }
.att-wd.hot i { background: #FDECEC; color: #E5484D; font-weight: 600; }
/* 天数多（周期 20 天以上）时格子收窄、日期只留日号，一行放得下更多 */
.att-week.dense { grid-template-columns: repeat(auto-fill, minmax(30px, 1fr)); gap: 4px; }
.att-week.dense .att-wd i { height: 26px; font-size: 11.5px; }
.att-week.dense .att-wd b { font-size: 10px; }

/* 表格里的紧凑热力条：一行铺满、绝不换行 —— 周期刚开始 3 天和周期末尾 31 天
   都是同一行高（原来用 grid auto-fill，落在窄单元格里会换行，天数越多行越高）。
   格子按 flex 比例分宽度，不写死像素；完整日期和当天次数走 title 悬停。 */
.att-week.att-strip {
  display: flex; align-items: stretch; gap: 2px;
  margin-top: 0; height: 22px; min-width: 150px;
}
.att-strip .att-sd { flex: 1 1 0; min-width: 3px; border-radius: 3px; background: #E9EDF2; }
.att-strip .att-sd.on { background: #9CBBF5; }
.att-strip .att-sd.strong { background: var(--brand); }
.att-strip .att-sd.hot { background: #E5484D; }
/* 本周还没到的天：虚线空格占位（2026-10-29 按周统计后才有） */
.att-strip .att-sd.future {
  background: transparent; border: 1px dashed #D5DBE6; box-sizing: border-box;
}
/* 单人详情宽版格子的 future 占位：同样的虚线空格，日期照标 */
.att-wd.future i { background: transparent; border: 1px dashed #D5DBE6; }
/* 热力条那一格收紧上下留白，别让条本身把行撑起来 */
table.att-tbl td.att-daycell { padding-top: 8px; padding-bottom: 8px; }
/* 表下面的色块说明 */
.att-legend { margin-top: 10px; font-size: 12px; color: var(--muted); line-height: 1.7; }

/* ---- 全员工作态度 · 按周统计的周期切换条（2026-10-29） ---- */
.week-bar {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 9px 12px; background: #F8F9FC; border: 1px solid var(--line);
  border-radius: 10px; margin-bottom: 14px;
}
.week-bar .wk-grow { flex: 1 1 auto; }
.wk-nav {
  width: 28px; height: 28px; line-height: 1; font-size: 15px; cursor: pointer;
  border: 1px solid var(--line); background: #fff; border-radius: 8px; color: var(--text);
}
.wk-nav:hover:not(:disabled) { border-color: var(--brand-line); color: var(--brand); }
.wk-nav:disabled { opacity: .35; cursor: not-allowed; }
.wk-label { font-size: 13.5px; font-weight: 600; }
.wk-label small { color: var(--muted); font-weight: 400; margin-left: 8px; font-size: 12px; }
.wk-cur, .wk-hist {
  display: inline-block; border-radius: 6px; padding: 1px 8px; font-size: 11.5px;
  font-weight: 500; margin-left: 8px; vertical-align: 1px;
}
.wk-cur { background: var(--brand-weak); color: var(--brand); border: 1px solid var(--brand-line); }
.wk-hist { background: #FEF3E2; color: #B4720F; border: 1px solid #F3DDB8; }
.wk-select { padding: 5px 8px; font-size: 12.5px; }

/* 单人详情 */
.att-detail { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; }
.att-row { display: flex; gap: 12px; padding: 9px 14px; border-bottom: 1px solid var(--line-2); font-size: 13px; }
.att-row:last-child { border-bottom: none; }
.att-row .att-k { width: 92px; flex: none; color: var(--muted); }
.att-row .att-v { color: var(--text); }
.att-sub { margin: 18px 0 8px; font-size: 13.5px; }
table.att-tbl { width: 100%; border-collapse: collapse; font-size: 13px; margin-top: 8px; }
table.att-tbl th {
  text-align: left; font-weight: 500; color: var(--muted); font-size: 12px;
  padding: 8px 10px; border-bottom: 1px solid var(--line); white-space: nowrap;
}
table.att-tbl td { padding: 10px; border-bottom: 1px solid var(--line-2); vertical-align: middle; }
table.att-tbl tr:last-child td { border-bottom: none; }
.att-why {
  margin-top: 12px; padding: 10px 12px; border-radius: 8px; background: #FBFCFE;
  border: 1px dashed var(--line); font-size: 12.5px; color: var(--text-2); line-height: 1.7;
}
.att-why b { color: var(--text); }

/* 全员工作态度：两个汇总砖 */
.att-sum { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 14px; }
.att-sum-card { border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; background: #FBFCFE; }
.att-sum-card .k { font-size: 12px; color: var(--muted); }
.att-sum-card .v { font-size: 24px; font-weight: 700; margin-top: 2px; }
.att-sum-card .v i { font-style: normal; font-size: 12px; font-weight: 400; color: var(--muted); margin-left: 3px; }
.att-sum-card.ok .v { color: #0E9F6E; }
.att-sum-card.bad .v { color: #E5484D; }

/* 预警规则库（产出断更）· 2026-10-23
   触发总览按「人」归集：一个人可能同时踩好几条规则，每条规则单独一行 */
.alt-tbl td { vertical-align: top; }
.alt-line {
  display: flex; align-items: center; flex-wrap: wrap; gap: 8px;
  padding: 5px 0; border-top: 1px dashed var(--line);
}
.alt-line:first-child { border-top: 0; padding-top: 0; }
.alt-line:last-child { padding-bottom: 0; }
.alt-line .alt-rule { font-weight: 600; color: var(--danger); }
.alt-line .btn-mini { margin-left: auto; margin-right: 0; }
.alt-gap { color: var(--danger); }
.panel > .note { font-size: 12px; color: var(--muted); line-height: 1.7; }

/* 模块卡上可能出现两个数字角标：待沟通（红，原位）+ 产出断更预警（蓝，左挪一格） */
.card-count.alt { background: var(--brand); box-shadow: 0 0 0 3px #EAF1FE; }
.card-count + .card-count { right: 36px; }

/* 组长端 · 预警提醒区 */
.alt-panel .alt-banner {
  background: #FFF7E0; border: 1px solid #F3DFA8; color: #8A6100;
  border-radius: 8px; padding: 8px 12px; font-size: 13px; margin-bottom: 12px;
}
.alt-card {
  border: 1px solid var(--line); border-left: 3px solid var(--danger);
  border-radius: 8px; padding: 10px 12px; margin-bottom: 10px;
}
.alt-card .alt-who { font-weight: 600; font-size: 14px; }
.alt-card .alt-meta { font-size: 13px; color: var(--text); margin-top: 3px; line-height: 1.6; }
.alt-card .alt-ruleline { font-size: 12px; color: var(--muted); margin-top: 2px; }
.alt-card .alt-btns { display: flex; gap: 8px; margin-top: 8px; }

/* ==================== 设置（账号 / 权限 / 交接 三合一）====================
   进去是三张竖排的入口卡，整组在剩余视口高度里左右 + 上下都居中。
   起名前 grep 过 app.css：setstage / setstack / setcap / setrow / scard /
   sico / stxt / s1 / s2 / scount / sgo / setcrumb 均无同名。 */
/* 三张卡这一组要精确居中，所以舞台上不放任何标题之类的东西 ——
   模块页头部已经有「设置 · 账号 / 权限 / 交接」了 */
.setstage {
  min-height: calc(100vh - 230px);
  display: flex; align-items: center; justify-content: center;
  padding: 16px 0;
}
.setrow { width: 100%; max-width: 472px; display: flex; flex-direction: column; gap: 16px; }

.scard {
  display: flex; align-items: center; gap: 14px; width: 100%;
  background: var(--panel); border: 1px solid var(--line); border-radius: 14px;
  padding: 18px 20px; text-align: left; color: inherit; position: relative;
  transition: transform .16s, box-shadow .16s, border-color .16s;
}
.scard:hover { transform: translateY(-2px); box-shadow: var(--shadow); border-color: var(--brand-line); }
.scard .sico {
  width: 42px; height: 42px; flex: none; border-radius: 11px;
  display: flex; align-items: center; justify-content: center;
}
.scard .sico svg { width: 20px; height: 20px; }
.scard.cyan .sico { background: #E6F6F8; color: #0E7C86; }
.scard.gray .sico { background: #F2F4F7; color: #4E5969; }
.scard.amber .sico { background: #FFF4E5; color: var(--warn); }
.scard .stxt { flex: 1; min-width: 0; }
.scard .s1 { display: block; font-size: 15.5px; font-weight: 600; letter-spacing: .2px; }
.scard .s2 { display: block; font-size: 12.5px; color: var(--muted); margin-top: 2px; }
.scard .scount {
  flex: none; min-width: 22px; text-align: center; padding: 1px 8px; border-radius: 20px;
  background: var(--danger); color: #fff; font-size: 12px; font-weight: 600;
}
.scard .sgo { flex: none; font-size: 18px; color: #C3CAD4; transition: color .15s, transform .15s; }
.scard:hover .sgo { color: var(--brand); transform: translateX(2px); }

/* 子页顶部的返回条：区分模块页头部那个「返回工作台」 */
.setcrumb { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.setcrumb-txt { font-size: 13px; color: var(--muted); }

@media (max-width: 640px) {
  .setstage { min-height: 0; }
  .setrow { max-width: 100%; }
}

/* ==================== 新手指南（2026-10-24） ====================
   入口 = 首页统计砖右边那张虚线砖（.tile.guide）；点开是 `.gd-modal` 大卡片。
   内容是前端按 Perm.visible() 现算的，所以这里只写样式，不写死的宽度。
   起名前 grep 过 app.css：gd-* / guide / tile.guide 均无同名。 */

/* 入口砖：白底虚线框，跟旁边三张实心统计砖区分开，一眼看出能点 */
.tile.guide {
  background: #fff; border-style: dashed; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  transition: border-color .15s, background .15s, transform .15s;
}
.tile.guide:hover { border-color: var(--brand); background: var(--brand-weak); transform: translateY(-2px); }
.tile.guide:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.tile.guide .v { font-size: 13.5px; color: var(--brand); display: flex; align-items: center; gap: 4px; }
.tile.guide .v svg { width: 13px; height: 13px; flex: none; }
.tile.guide .k { color: var(--brand); }

/* 弹窗外壳：指南很长，卡片自己滚，遮罩不滚 */
.modal-mask.guide-mask { align-items: center; padding: 5vh 16px; }
.modal-card.gd-modal {
  width: 920px; max-width: 96vw; max-height: 90vh; overflow-y: auto; padding: 0;
}
.gd-modal .gd-mhead {
  position: sticky; top: 0; z-index: 2; margin: 0; padding: 14px 24px;
  background: #fff; border-bottom: 1px solid var(--line-2);
}
.gd-modal .gd-mhead h3 { margin: 0; font-size: 15px; }
.gd-modal .gd-mhead .sub { margin-left: 8px; font-size: 12px; color: var(--muted); }
.gd-modal .gd-mhead .btn-ghost { margin-left: auto; flex: none; height: 30px; }

/* 头部问候区 */
.gd-hero { padding: 22px 24px 18px; background: linear-gradient(165deg, #F7FAFF, #fff); border-bottom: 1px solid var(--line-2); }
.gd-hero h3 { margin: 0 0 6px; font-size: 18px; font-weight: 500; letter-spacing: .2px; }
.gd-hero h3 b { color: var(--brand); font-weight: 600; }
.gd-hero p { margin: 0; font-size: 13px; color: var(--text-2); }
.gd-hero p b { color: var(--text); font-weight: 500; }
.gd-chips { display: flex; gap: 8px; margin-top: 13px; flex-wrap: wrap; }
.gd-chip {
  font-size: 11.5px; padding: 3px 11px; border-radius: 99px;
  border: 1px solid var(--line); background: #fff; color: var(--muted);
}
.gd-chip.hi { border-color: var(--brand-line); background: var(--brand-weak); color: var(--brand); font-weight: 500; }

.gd-body { padding: 20px 24px 26px; }
.gd-sec { margin-bottom: 24px; }
.gd-sec:last-child { margin-bottom: 0; }
.gd-sec-h { display: flex; align-items: baseline; gap: 9px; margin-bottom: 12px; }
.gd-sec-h i { width: 3px; height: 13px; border-radius: 2px; background: var(--brand); flex: none; align-self: center; }
.gd-sec-h h4 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: .2px; }
.gd-sec-h span { font-size: 12px; color: var(--muted); }

/* 数据范围：能看到 / 看不到 */
.gd-scope { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.gd-scope-i { border: 1px solid var(--line); border-radius: 11px; padding: 11px 13px; background: #FBFCFE; }
.gd-scope-i.no { background: #FDFBFB; border-color: #F0E6E6; }
.gd-scope-i .t {
  font-size: 12.5px; font-weight: 500; margin-bottom: 4px;
  display: flex; align-items: center; gap: 6px;
}
.gd-scope-i .t::before { content: ""; width: 6px; height: 6px; border-radius: 99px; background: currentColor; flex: none; }
.gd-scope-i.yes .t { color: var(--ok); }
.gd-scope-i.no .t { color: var(--muted); }
.gd-scope-i p { margin: 0; font-size: 12.5px; color: var(--text-2); line-height: 1.65; }
.gd-scope-i p b { color: var(--text); font-weight: 500; }

/* 功能卡：两列，左侧一道色条，颜色跟着模块 tone 走 */
.gd-fgrid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.gd-fcard {
  border: 1px solid var(--line); border-radius: 13px; padding: 14px 15px 13px;
  background: #fff; border-left: 3px solid var(--brand);
}
.gd-fhead { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 10px; }
.gd-fico {
  width: 32px; height: 32px; border-radius: 9px; flex: none;
  display: flex; align-items: center; justify-content: center;
  background: var(--brand-weak); color: var(--brand);
}
.gd-fico svg { width: 17px; height: 17px; }
.gd-fhead .tt { flex: 1; min-width: 0; }
.gd-fhead .fn { font-size: 14px; font-weight: 600; line-height: 1.35; }
.gd-fhead .fs { font-size: 11.5px; color: var(--muted); line-height: 1.4; margin-top: 1px; }
.gd-fno { font-size: 11px; color: #C9CDD4; font-weight: 600; flex: none; margin-top: 2px; }

/* 模块 tone 配色（和 modules.js 里的 tone 一一对应） */
.gd-fico.tone-blue   { background: #EDF3FF; color: #1F5AE0; }
.gd-fico.tone-indigo { background: #EEEEFB; color: #5B5BD6; }
.gd-fico.tone-amber  { background: #FDF4E5; color: #C77700; }
.gd-fico.tone-teal   { background: #E8F6F1; color: #0E9F6E; }
.gd-fico.tone-violet { background: #F3EDFC; color: #7A4FD1; }
.gd-fico.tone-rose   { background: #FCEBF1; color: #D6336C; }
.gd-fico.tone-green  { background: #E8F6F1; color: #0E9F6E; }
.gd-fico.tone-gray   { background: #F2F4F7; color: #4E5969; }

.gd-row { display: flex; gap: 8px; margin-bottom: 6px; font-size: 12.5px; line-height: 1.6; }
.gd-row i { font-style: normal; color: var(--muted); flex: none; width: 42px; font-size: 11.5px; padding-top: 1px; }
.gd-row p { margin: 0; color: var(--text-2); }
.gd-row ol { margin: 0; padding-left: 16px; color: var(--text-2); }
.gd-row ol li { margin-bottom: 2px; }
.gd-row ol li:last-child { margin-bottom: 0; }

.gd-tip {
  margin-top: 9px; padding: 8px 10px; border-radius: 8px; font-size: 12px; line-height: 1.6;
  background: #FFFBF0; border: 1px solid #FAEBC8; color: #8A5D00;
}
.gd-tip b { font-weight: 600; }
.gd-tip.plain { background: #F7F9FC; border-color: var(--line-2); color: var(--text-2); }

/* 时间节奏：四格 */
.gd-tl { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; }
.gd-tl-i { border: 1px solid var(--line); border-radius: 11px; padding: 11px 12px; background: #FBFCFE; }
.gd-tl-i .when { font-size: 11.5px; color: var(--brand); font-weight: 600; letter-spacing: .3px; margin-bottom: 4px; }
.gd-tl-i .what { font-size: 12.5px; color: var(--text-2); line-height: 1.6; }
.gd-tl-i .what b { color: var(--text); font-weight: 500; }

/* 常见问题 */
.gd-faq { border: 1px solid var(--line); border-radius: 11px; overflow: hidden; }
.gd-faq-i { padding: 10px 13px; border-bottom: 1px solid var(--line-2); background: #fff; }
.gd-faq-i:last-child { border-bottom: 0; }
.gd-faq-i .q { font-size: 12.5px; font-weight: 500; margin-bottom: 2px; }
.gd-faq-i .a { font-size: 12.5px; color: var(--text-2); line-height: 1.65; }

.gd-foot {
  padding: 13px 24px; background: #FBFCFE; border-top: 1px solid var(--line-2);
  font-size: 12.5px; color: var(--muted);
}
.gd-foot b { color: var(--brand); font-weight: 500; }
.gd-empty { padding: 18px; text-align: center; color: var(--muted); font-size: 13px; }

/* 外出报备组长端（2026-11-02 方案A）：紧凑两列小卡，替代满宽 .mgr-card */
.grid2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.ocard { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 13px 15px; }
.ocard:hover { border-color: var(--brand-line); }
.ocard .top { display: flex; align-items: center; gap: 10px; }
.ocard .nm { font-size: 14.5px; font-weight: 600; }
.ocard .meta { color: var(--muted); font-size: 12px; margin-top: 1px; }
.ocard .view { margin-left: auto; }
.ocard .nums { display: flex; align-items: center; gap: 18px; margin-top: 11px; padding-top: 10px;
  border-top: 1px dashed var(--line); }
.ocard .st .n { font-size: 19px; font-weight: 700; color: var(--text); }
.ocard .st .n.blue { color: var(--brand); }
.ocard .st .n.green { color: var(--ok); }
.ocard .st .n.zero { color: var(--muted); }
.ocard .st .k { font-size: 11px; color: var(--muted); }
.ocard .right { margin-left: auto; display: flex; align-items: center; gap: 10px; }

/* 窄屏：功能卡和节奏都收成一列，否则 12px 的字在手机上会挤成竖排 */
@media (max-width: 820px) {
  .gd-fgrid, .gd-scope, .gd-tl { grid-template-columns: 1fr; }
  .gd-body { padding: 16px 16px 20px; }
  .gd-hero { padding: 18px 16px 15px; }
  .gd-modal .gd-mhead { padding: 12px 16px; }
}

/* ==========================================================================
   窄屏补丁区（2026-10-25）
   --------------------------------------------------------------------------
   铁律：这一段里**只允许出现 @media**，PC 端的默认样式一行都不准改。
   断点沿用项目已有的 860 / 640，另加 560 应付小屏手机（iPhone SE 一类）。
   目标：375px 宽的手机上，大区助理端六个模块都能正常用、不横向溢出。

   为什么单独放末尾：改动集中在一处，将来要回滚/调整只删这一段，
   不会误伤上面任何一条 PC 规则。
   ========================================================================== */

/* ---------- ≤860px：平板与大屏手机 ---------- */
@media (max-width: 860px) {
  /* 表格：整个项目 36 张表全是 JS 拼出来的，逐个套滚动容器要动 36 处模板，
     这里用纯 CSS 兜底 —— 表本身变成可横向滑动的块，列宽按内容撑开。
     表头加 nowrap，避免「外出原因」这类长表头在窄屏被折成三行。 */
  table {
    display: block;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
  }
  table th { white-space: nowrap; }

  /* 高列数统计栅格：PC 上一行 4~6 个，手机上继续按原列数会挤成竖排汉字。
     .adm-stats 这条必须带 !important：有 5 处模板把列数写成了内联
     style="grid-template-columns:repeat(3|4,1fr)"（外出报备/Bug/座谈等），
     内联样式的优先级高于媒体查询，不加 !important 那几处完全不生效 ——
     曾经出现「本月答题完成」在 375px 被折成两行、320px 折成三行。 */
  .adm-stats { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; }
  .mgr-five, .rate-stats, .pt-today4 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .rate-drv-stats, .pt-stats, .mgr-stats, .ai-funnel { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  /* 模块页头部：返回按钮 + 标题 + 副标题三件横排，窄屏必须允许换行 */
  .mhead { flex-wrap: wrap; }

  /* .hcard 的 min-width:320px 在 760~860 之间仍会撑破容器 */
  .hcard { min-width: 0; }

  /* 两处写死 nowrap 的工具栏跟着换行 */
  .modal-card.res-card .toolbar,
  .modal-card.symp-card-modal .toolbar { flex-wrap: wrap; }
}

/* ---------- ≤640px：手机竖屏（主要目标机型） ---------- */
@media (max-width: 640px) {
  /* 登录页：卡片是写死的 400px，375px 视口第一屏就溢出 */
  .login-wrap { padding: 24px 16px; }
  .login-card { width: 100%; max-width: 400px; padding: 24px 20px; }

  /* 弹窗：默认款 380px 且没有 max-width 兜底，symp-qrmodal / imgzoom-modal
     两个变体在 CSS 里压根没定义宽度，走的也是默认款 */
  .modal-card { width: auto; max-width: 92vw; padding: 18px 16px; }
  .modal-mask { padding-top: 6vh; padding-bottom: 6vh; align-items: center; }

  /* 外出报备弹窗（.out-card 自己管 padding，不受上面那条影响）：日期行退单列 */
  .modal-card.out-card .orow { grid-template-columns: 1fr; }
  .modal-card.out-card .vfile .meta .n { max-width: 96px; }
  .modal-card.out-card .vfile audio { min-width: 90px; max-width: 160px; }

  /* 顶栏：mark + 品牌名 + 两行 who + 两个按钮，375px 下必然挤压。
     藏掉品牌名（logo 还在），who 只留一行字号。 */
  .topbar { height: 56px; padding: 0 12px; gap: 8px; }
  .topbar .brand .name { display: none; }
  .topbar .brand .mark { width: 30px; height: 30px; font-size: 15px; border-radius: 8px; }
  .topbar .right { gap: 6px; }
  .who { font-size: 11px; }

  /* 页面容器收紧 */
  .page { padding: 14px 12px 40px; }
  .page-head h2 { font-size: 21px; }
  .panel { padding: 14px 13px; }

  /* 统计栅格再降一档（.adm-stats 见上面 ≤860px 的说明，内联样式需要 !important） */
  .adm-stats { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .mgr-five, .rate-stats, .pt-today4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .rv-stats, .kpi-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .grid2 { grid-template-columns: minmax(0, 1fr); }

  /* 表单行退回单列（新增简历是 5 个字段，两列在手机上太挤） */
  .newuser-row { grid-template-columns: minmax(0, 1fr); }

  /* 触控尺寸：PC 上 input 40 / button 42 / 字号 14 在手机上偏小。
     字号必须 ≥16px，否则 iOS Safari 聚焦输入框时会自动放大整页。 */
  input, select, textarea { font-size: 16px; }
  .field input, .field select, .field textarea { height: 44px; }
  .btn-primary { height: 48px; font-size: 16px; }
  .btn-ghost { height: 40px; padding: 0 14px; font-size: 14px; }
  .btn-mini { height: 34px; padding: 0 12px; }
  .pf { min-height: 34px; }

  /* 首页统计砖：PC 上 4 个挤一行各 108px，手机上那样「泉州丰泽」会被折成两行。
     改成两列铺满（2×2），每张约 160px，四个字放得下。 */
  .tiles { gap: 8px; }
  .tile { flex: 0 1 calc(50% - 4px); min-width: 0; }
  .tile .v { white-space: nowrap; }
  .hcard { width: 100%; min-width: 0; }
  .home-sec { font-size: 12px; }

  /* 统计卡标签：12px 在手机上偏大，「本月答题完成」「实际客户消息合计」这类
     6~8 字标签正好卡在临界点、时折时不折。收到 11px 稳一点（数字 26px 不动）。 */
  .adm-stat .k { font-size: 11px; }

  /* 接单率首页第一张卡是「<区域> · 本月总接单率」，13 个字，两列里怎么放都折行，
     让它独占一整行；剩下 4 张正好 2×2。 */
  .rate-stats .adm-stat:first-child { grid-column: 1 / -1; }

  /* 座谈入口两块大按钮：PC 上并排，手机上并排会把 320px 屏撑到 349px */
  .symp-acts { grid-template-columns: minmax(0, 1fr); gap: 12px; }
  .symp-act { padding: 16px 14px; gap: 12px; }
  .symp-act .ic { width: 38px; height: 38px; font-size: 19px; }

  /* 每日总结保存区：PC 上「保存今天的总结」和右侧说明横排，
     手机上余量不够会把按钮压成两行。按钮独占一行，说明文字落到下面。 */
  .nsave { display: block; }
  .nsave .btn-primary { width: 100%; }
  .nsave .hint { margin-top: 8px; }
}

/* ---------- ≤560px：小屏手机 ---------- */
@media (max-width: 560px) {
  /* 小屏仍保两列：320px 下每张约 130px，「本月答题完成」这种 6 字标签放得下。
     退成单列虽然不会溢出，但四个数字要占掉半屏，反而更难一眼扫完。
     .adm-stats 见 ≤860px 的说明，内联样式需要 !important。 */
  .adm-stats { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .mgr-five, .rate-stats, .pt-today4,
  .rv-stats, .kpi-row,
  .rate-drv-stats, .pt-stats, .mgr-stats, .ai-funnel { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  .topbar .who { display: none; }
}
