/* 思好商行 · 账号租赁信息管理平台 —— 浅色渐变主题 */
:root {
  color-scheme: light;
  --bg1: #eef4ff; --bg2: #f7f5ff; --bg3: #eefaf6;
  --card: rgba(255, 255, 255, .86);
  --line: #e3e9f4;
  --tx: #1f2a3d; --tx2: #6b7a93;
  --pri: #3d6fe0; --pri-d: #2b57bd; --pri-2: #6f8ff0; --pri-3: #8a5cf6;
  --money: #d2543f;                         /* 金额强调色（租金 / 押金） */
  --glass: rgba(255, 255, 255, .86);        /* 玻璃态底色（半透明浮层、胶囊等） */
  --ok: #18a058; --ok-bg: #e8f8ef;
  --warn: #d98a04; --warn-bg: #fdf4e0;
  --off: #8a94a6; --off-bg: #eef1f5;
  --sold: #b0483f; --sold-bg: #fbeae8;
  --done: #8a6bf0; --done-bg: #f1ecfe;      /* 账号状态「已完成」（紫） */
  --err: #e05656; --err-bg: #fdecec;        /* 表单校验错误提示 */
  /* 选号页「交易须知」防骗提醒（暖橙，与全站蓝紫错开、一眼警示） */
  --notice: #e5583f; --notice-d: #c8432b;
  --notice-bg1: #fff7f4; --notice-bg2: #fffdf7; --notice-line: #ffdcd2;
  --surface: #fff;                          /* 需要"不透明底"的场景（如固定在右侧的操作列） */
  --bg1-grad: #f4f7ff; --bg2-grad: #f7f9ff; --bg3-grad: #fbfcff;  /* 浅蓝底（表格 hover / 卡片等） */
  /* 统一设计令牌：圆角三档 + 间距 + 阴影 */
  --rad-sm: 10px; --rad: 14px; --rad-lg: 16px;
  --sp: 14px;
  --shadow: 0 6px 24px rgba(60, 90, 160, .08);
  --shadow-lg: 0 14px 34px rgba(30, 45, 80, .18);
  --safe-b: env(safe-area-inset-bottom, 0px);   /* iPhone 底部安全区 */

  /* ---------- 全站统一字体（唯一字体定义点，其他任何地方都不要再写 font-family）---------- */
  --font-sans: "PingFang SC", "Microsoft YaHei", "微软雅黑", "Segoe UI", system-ui, Arial, sans-serif;
  --font-mono: Consolas, "Cascadia Mono", "Courier New", monospace;

  /* ---------- 全站统一字号（只允许这几档，禁止再写死 px 字号）----------
     xs   12px  辅助标注（提示文字、徽标、角标、手机号、代码）
     sm   14px  正文与表格（基准：绝大多数文字 / 表格内容 / 输入框 / 按钮）
     md   16px  小标题（卡片标题、大号输入框）
     lg   20px  标题与大数字（页面主标题、统计卡数字）
     xl   28px  品牌与特大数字（品牌名、成功页大编号）
     2xl  36px  【仅 /calc 快速评估页的报价大字】直播/投屏场景要远距离可读，普通页面别用
     —— 不允许出现 11/13/15/17/18/19/24/32 等中间尺寸 —— */
  --fs-xs: 12px; --fs-sm: 14px; --fs-md: 16px; --fs-lg: 20px; --fs-xl: 28px; --fs-2xl: 36px;

  /* ---------- 全站统一行高（只允许这 3 档，禁止再写小数）----------
     tight 1    单行元素（表格内编号/手机号、按钮、图标、角标）
     body  1.5  正文默认（页面文字、表格、输入框）
     loose 1.8  多行说明块（提示框、通知列表）
     —— 只有这 3 档，不允许出现 1.25/1.3/1.35/1.6/1.9/1.95 等中间值 —— */
  --lh-tight: 1; --lh-body: 1.5; --lh-loose: 1.8;
}

/* （深夜模式已于 2026-09-20 按老板要求移除：效果未达预期。
   注意：上面的 --pri-2 / --pri-3 / --money / --glass / --bg1-grad 系列令牌是
   "颜色收编"的产物，全站已有多处引用，保留不动。） */

/* ---------- 长文本兜底（手机端防"挤压/撑破"）----------
   这几处的文案是**可配置的**（品牌名、防骗提示语、站点标题），一旦填长了，
   在窄屏上容易把布局顶开：允许在实在放不下时断行，但不影响正常长度的显示。
   （仓库里其它文本已实测在 390px 下无溢出，见 README「视觉规范」） */
.brand-name, .foldbar-name, .n-tip, .admin-hero h1, .hero h1 { overflow-wrap: anywhere; }
/* 顶栏 / 工具条里的 flex 子项允许收缩，避免被长内容顶出容器 */
.topbar-inner > *, .toolbar-right > *, .brand > * { min-width: 0; }
/* ⚠️ 2026-09-21 补充：容器自身也要能收缩（否则子项写了 min-width:0 也没用），
   并给「👤 手机号 ▾」这类用户区加上不换行的收缩保护 —— 老板反馈它会在窄屏"漂移"。 */
.topbar-inner, .toolbar, .toolbar-right, #auth-zone, .admin-hero { min-width: 0; }
#auth-zone, .admin-who { max-width: 100%; }
* { box-sizing: border-box; margin: 0; padding: 0; -webkit-tap-highlight-color: transparent; }
html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; font-family: var(--font-sans); }
body {
  font-family: var(--font-sans);
  color: var(--tx);
  background: linear-gradient(135deg, var(--bg1) 0%, var(--bg2) 45%, var(--bg3) 100%) fixed;
  min-height: 100vh;
  font-size: var(--fs-sm);
  line-height: var(--lh-body);
  overflow-x: hidden;              /* 杜绝页面级横向滚动（表格在自己容器里滚） */
  display: flex;                   /* 竖向撑满视口：内容不足一屏时，页脚也贴在底部 */
  flex-direction: column;
}
/* 表单控件 / 按钮统一继承全站字体、字号与行高（浏览器默认既不改字体也不继承行高：
   字体掉到另一套、字号 13.33px、行高 normal≈1.2，都会显得"不统一"）——全站唯一出处
   单行控件（按钮 / 输入框 / 下拉）用 tight（行高 1），多行 textarea 用 body（1.5）
   注意：具体控件若有 class（.input / .btn-sm / .sort-select 等），按 class 的档位优先，不受这里影响 */
button, input, select, textarea { font-family: inherit; font-size: var(--fs-sm); line-height: var(--lh-body); }
/* 说明：Chrome 不遵循 <select> 的 line-height（实测内联 1/1.5/normal 均为 normal），
   下拉框高度由字体 + padding 决定，与同排输入框相差约 2px，属浏览器限制，无法用 CSS 抹平 */
/* 等宽场景统一用同一套等宽字体（编号、命令、代码） */
code, kbd, pre, samp, .mono { font-family: var(--font-mono); font-size: var(--fs-xs); }
/* 标题统一字号（避免落到浏览器默认的 1.17em/2em 等非整数尺寸；具体位置用 class 覆盖） */
h1, h2, h3, h4, h5, h6 { font-size: var(--fs-md); }
/* 数字对齐：表格与统计数字使用等宽数字，避免位数不同导致跳动 */
.grid th, .grid td, .stat-card .n, .success-id, .count-pill { font-variant-numeric: tabular-nums; }
.hidden { display: none !important; }
/* 键盘可达：统一可见焦点（鼠标点击不出现） */
:focus-visible { outline: 2px solid var(--pri); outline-offset: 2px; border-radius: 8px; }
/* 触控优化：去掉 300ms 点击延迟 */
button, .btn, .chip, .tab, .nav-item, .pager button, .ops-trigger, .skins-toggle { touch-action: manipulation; }
@media (prefers-reduced-motion: reduce) {   /* 尊重系统"减少动效"设置 */
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; transition-duration: .001ms !important; }
}

/* ---------- 顶栏 ---------- */
.topbar {
  position: sticky; top: 0; z-index: 50;
  /* 注：这里原本用 backdrop-filter: blur(10px)，滚动时每帧都要重新模糊一次整条顶栏，
     在没有独显 / 省电模式的机器上是主要的卡顿来源 → 改成不透明背景（观感几乎一致，滚动顺滑） */
  background: linear-gradient(180deg, #fff 0%, var(--bg3-grad) 55%, #f4f8ff 100%);
  border-bottom: 1px solid var(--line);
  transition: transform .3s cubic-bezier(.4, 0, .2, 1), box-shadow .3s cubic-bezier(.4, 0, .2, 1);
}
/* 品牌色渐变细线（顶栏 / 折叠条共用）——比一条灰线更精神，也不抢内容 */
.topbar::after, .foldbar::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; pointer-events: none;
  background: linear-gradient(90deg, transparent, rgba(61, 111, 224, .5) 22%, rgba(138, 92, 246, .42) 72%, transparent);
}
/* 已经滚动（但顶栏还露着）时浮起一点，和页面内容分层 */
.topbar.scrolled { box-shadow: 0 8px 22px rgba(40, 60, 110, .1); }
/* 下滚时折叠收起，聚焦内容阅读 */
.topbar.hide { transform: translateY(-100%); box-shadow: none; }
/* 顶栏折叠后的顶部细条：☰ + 品牌 logo + 品牌名（+ 右侧「点击展开」提示），点整条即可展开
   常驻 DOM、用「透明度 + 轻微下滑」过渡（原来是 display:none → flex 的瞬间显示，观感突兀） */
.foldbar {
  position: fixed; top: 0; left: 0; right: 0; height: 36px; z-index: 49;
  background: linear-gradient(180deg, #fff 0%, var(--bg3-grad) 60%, #f4f8ff 100%);
  border-bottom: 1px solid var(--line);
  box-shadow: 0 6px 18px rgba(40, 60, 110, .1);
  cursor: pointer; user-select: none;
  opacity: 0; visibility: hidden; transform: translateY(-6px); pointer-events: none;
  transition: opacity .26s ease .05s, transform .26s ease .05s, visibility .26s;
}
.foldbar.show { opacity: 1; visibility: visible; transform: none; pointer-events: auto; }
/* 折叠条内容与顶栏同宽同留白，展开/收起时视觉不跳动 */
.foldbar-inner { width: 100%; max-width: 1280px; height: 100%; margin: 0 auto; padding: 0 20px; display: flex; align-items: center; gap: 9px; }
.foldbar-btn { display: flex; flex-direction: column; gap: 3px; padding: 5px 5px; border: none; background: transparent; cursor: pointer; }
.foldbar-btn i { display: block; width: 16px; height: 2px; border-radius: 2px; background: var(--pri); transition: background .18s, transform .18s; }
.foldbar:hover .foldbar-btn i { background: var(--pri-2); }
.foldbar:hover .foldbar-btn i:nth-child(2) { transform: translateX(2px); }   /* 悬停时中间那条轻轻推出，提示"可点" */
/* 折叠条里的小 logo（跟着站点设置走：自定义图片或内置表情） */
.foldbar-logo, .foldbar-logo-img {
  width: 22px; height: 22px; border-radius: 7px; flex: 0 0 auto;
  background: linear-gradient(135deg, var(--bg1), var(--bg2));
  box-shadow: inset 0 0 0 1px rgba(61, 111, 224, .12);
  display: grid; place-items: center;
}
.foldbar-logo { font-size: 13px; line-height: 1; }
.foldbar-logo-img { object-fit: contain; padding: 2px; }
.foldbar-name { font-size: var(--fs-sm); font-weight: 700; letter-spacing: .5px; color: var(--tx2); transition: color .18s; }
.foldbar:hover .foldbar-name { color: var(--pri); }
.foldbar-hint { margin-left: auto; font-size: var(--fs-xs); color: var(--tx2); opacity: .75; }
.topbar-inner { max-width: 1280px; margin: 0 auto; padding: 10px 20px; display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
/* 品牌区：logo 放一个圆角小方块里（emoji / 自定义图片共用同一尺寸），再配品牌名。
   整块是链接（点它回首页；已在首页则刷新）→ 去掉下划线、悬停时 logo 轻微上浮 */
.brand { display: flex; align-items: center; gap: 11px; text-decoration: none; color: inherit; }
.brand:hover .brand-logo, .brand:hover .brand-logo-img { transform: translateY(-1px); }
.brand-logo, .brand-logo-img { transition: transform .18s, box-shadow .18s; }
.brand:hover .brand-logo, .brand:hover .brand-logo-img { box-shadow: inset 0 0 0 1px rgba(61, 111, 224, .3), 0 8px 18px rgba(61, 111, 224, .2); }
.brand:active { opacity: .85; }
.brand-logo, .brand-logo-img {
  width: 40px; height: 40px; border-radius: 12px; flex: 0 0 auto;
  background: linear-gradient(135deg, var(--bg1), var(--bg2));
  box-shadow: inset 0 0 0 1px rgba(61, 111, 224, .14), 0 5px 14px rgba(61, 111, 224, .12);
  display: grid; place-items: center;
}
.brand-logo { font-size: 22px; line-height: 1; }
.brand-logo-img { object-fit: contain; padding: 4px; }   /* 自定义 logo：与内置表情同一外框，切换不跳动 */
/* 品牌名用与页头标题一致的蓝紫渐变字，品牌感更强（站点设置里改的名字同样生效） */
.brand-name {
  font-size: var(--fs-lg); font-weight: 800; letter-spacing: 1.2px; line-height: var(--lh-tight);
  background: linear-gradient(90deg, var(--pri), var(--pri-3));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.nav { display: flex; gap: 6px; flex-wrap: wrap; }
.nav-item {
  padding: 8px 16px; border-radius: 999px; text-decoration: none; color: var(--tx2); font-weight: 600;
  transition: background .18s, color .18s, transform .18s, box-shadow .18s;   /* 只过渡真正会变的属性（transition: all 会拖慢重绘） */
}
.nav-item:hover { background: var(--bg1-grad); color: var(--pri); transform: translateY(-1px); }
.nav-item.active { background: linear-gradient(135deg, var(--pri), var(--pri-2)); color: #fff; box-shadow: 0 6px 16px rgba(61, 111, 224, .32); }

main { width: 100%; max-width: 1280px; margin: 0 auto; padding: 16px 20px calc(60px + var(--safe-b)); flex: 1 0 auto; }

/* ---------- 全局页脚（各页统一，年份自动、品牌名跟随站点设置） ---------- */
.site-footer {
  position: relative;
  width: 100%; max-width: 1280px; margin: 0 auto; padding: 18px 20px calc(24px + var(--safe-b));
  color: var(--tx2); font-size: var(--fs-xs); line-height: var(--lh-loose);
  text-align: center; word-break: break-word;
  /* 收尾处一层极浅的蓝紫渐变，让页面到底有"落下来"的感觉 */
  background: linear-gradient(180deg, transparent, rgba(238, 244, 255, .5) 45%, rgba(247, 245, 255, .62));
}
/* 顶部品牌色渐变细线（与顶栏、折叠条同一套语言；替代原来那条灰线） */
.site-footer::before {
  content: ''; position: absolute; left: 0; right: 0; top: 0; height: 2px; pointer-events: none;
  background: linear-gradient(90deg, transparent, rgba(61, 111, 224, .42) 22%, rgba(138, 92, 246, .38) 72%, transparent);
}
.site-footer b { color: var(--tx); font-weight: 700; }
/* 页脚联系方式行（站点设置里可配：客服微信 / 电话 / 服务时间） */
.site-footer .contact { margin-top: 6px; display: flex; gap: 6px 14px; flex-wrap: wrap; justify-content: center; }
.site-footer .contact span { color: var(--tx2); }
.site-footer .contact b { color: var(--tx); font-weight: 600; }
/* 页脚第二行：ICP 备案（换行单独展示；按管局要求备案号须可点击跳转工信部备案系统） */
.site-footer .beian { margin-top: 6px; }
.site-footer .beian a {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 10px; border-radius: 999px;
  color: var(--tx2); text-decoration: none;
  transition: color .15s, background .15s;
}
.site-footer .beian a:hover { color: var(--pri); background: var(--bg1-grad); }
.site-footer .beian .beian-ico { flex: 0 0 auto; }
@media (max-width: 640px) {
  .site-footer { padding: 14px 14px calc(18px + var(--safe-b)); }
}

/* ---------- 📢 顶部公告条 / 🛠 维护提示层（站点设置里可配，2026-09-21） ----------
   公告条：后台「站点设置 → 公告条」打开后，前台页首插入一条；可关（localStorage 记住"这条已关"，
   换文案就会重新出现）。维护模式：全站前台盖一层提示，管理员后台不受影响。 */
.site-announce {
  display: flex; align-items: center; gap: 8px; padding: 8px 16px;
  font-size: var(--fs-sm); font-weight: 600; line-height: var(--lh-body);
  background: var(--bg1-grad); color: var(--tx); border-bottom: 1px solid var(--line);
}
.site-announce .sa-ico { flex: 0 0 auto; }
.site-announce .sa-tx { flex: 1 1 auto; min-width: 0; }
.site-announce .sa-x {
  flex: 0 0 auto; border: 0; background: transparent; cursor: pointer;
  color: var(--tx2); font-size: var(--fs-sm); padding: 2px 6px; border-radius: 8px;
}
.site-announce .sa-x:hover { background: rgba(0, 0, 0, .06); color: var(--tx); }
.site-announce.lv-info { background: var(--bg1-grad); }
.site-announce.lv-warn { background: var(--warn-bg); color: #8a5a00; border-bottom-color: #f0dcb4; }
.site-announce.lv-danger { background: var(--sold-bg); color: #96322b; border-bottom-color: #f2c7c1; }
.maint-mask {
  position: fixed; inset: 0; z-index: 9999; display: grid; place-items: center;
  padding: 24px; background: var(--glass); backdrop-filter: blur(6px);
}
.maint-card {
  max-width: 420px; width: 100%; text-align: center; padding: 26px 22px;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--rad-lg); box-shadow: var(--shadow-lg);
}
.maint-card .mc-ico { font-size: 40px; line-height: 1; }
.maint-card h3 { margin: 10px 0 6px; font-size: var(--fs-lg); color: var(--tx); }
.maint-card p { color: var(--tx2); font-size: var(--fs-sm); }
.maint-card .mc-sub { margin-top: 10px; font-size: var(--fs-xs); opacity: .8; }

/* ---------- Hero（三页统一：同样的留白、字号与渐变标题） ---------- */
.hero, .admin-hero { padding: 20px 6px 12px; }
.hero h1, .admin-hero h1 { font-size: var(--fs-lg); background: linear-gradient(90deg, var(--pri), var(--pri-3)); -webkit-background-clip: text; background-clip: text; color: transparent; }
.hero p { color: var(--tx2); margin-top: 6px; }

/* 管理后台页头：标题 + 当前管理员 + 同步状态 + 退出（一行，减少堆叠） */
.admin-hero { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.admin-hero .admin-who { margin-left: auto; font-size: var(--fs-sm); color: var(--tx2); }
.admin-hero .admin-who b { color: var(--tx); }

/* ---------- 卡片 / 工具栏 ---------- */
.card { background: var(--card); border: 1px solid var(--line); border-radius: var(--rad); box-shadow: var(--shadow); }
.toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px; margin-bottom: 14px; flex-wrap: wrap; }
.toolbar-right { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.chips { display: flex; gap: 6px; flex-wrap: wrap; }
.chip { border: 1px solid var(--line); background: var(--surface); border-radius: 999px; padding: 6px 14px; cursor: pointer; color: var(--tx2); font-weight: 600; transition: background .15s, color .15s, border-color .15s; }
.chip:hover { border-color: var(--pri); color: var(--pri); }
.chip.active { background: linear-gradient(135deg, var(--pri), var(--pri-2)); border-color: transparent; color: #fff; }
/* 工具栏内的条数徽标 / 排序 / 搜索（下拉不再被 .input 的 width:100% 撑满整行） */
.board-toolbar .toolbar-right { flex: 1 1 420px; justify-content: flex-end; min-width: 0; }
/* 管理后台：筛选/搜索/导出 独占一行，排在 Tab 下方右对齐，避免与 Tab 挤在一起 */
#admin-filters { flex: 1 1 100%; justify-content: flex-end; min-width: 0; padding-top: 2px; }
.board-toolbar .count-pill { margin-right: auto; }   /* 无筛选按钮后：条数靠左，排序与搜索靠右 */
.count-pill {
  font-size: var(--fs-xs); font-weight: 700; color: var(--pri);
  background: var(--bg1-grad); border-radius: 999px; padding: 5px 12px; white-space: nowrap;
}
.sort-wrap { display: inline-flex; align-items: center; gap: 6px; }
.sort-lab { font-size: var(--fs-xs); color: var(--tx2); white-space: nowrap; }
.toolbar-right select.input { width: auto; min-width: 128px; }
.sort-select { font-size: var(--fs-sm); font-weight: 600; padding: 8px 12px; cursor: pointer; }
.search-wrap { position: relative; display: inline-flex; align-items: center; flex: 0 1 520px; min-width: 200px; }
.search-ico { position: absolute; left: 11px; font-size: var(--fs-sm); opacity: .6; pointer-events: none; }
.search-wrap .input { padding-left: 32px; }
/* 搜索框：关掉浏览器**原生**清除按钮（各家画的都不一样，是老设计感的来源），
   换成自绘的圆形 ✕ —— 有内容时才出现，点一下清空并触发搜索（JS 在 common.js 的 initSearchClear） */
.search-wrap input[type="search"]::-webkit-search-cancel-button,
.search-wrap input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; appearance: none; display: none; }
.search-clear {
  position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; display: none; place-items: center;
  padding: 0; border: 0; border-radius: 999px;
  background: #dfe6f3; color: #6b7a93; font-size: 11px; line-height: 1; cursor: pointer;
  transition: background .15s, color .15s;
}
.search-wrap.has-value .search-clear { display: grid; }
.search-clear:hover { background: var(--pri); color: #fff; }
.search-wrap.has-value .input { padding-right: 34px; }   /* 给 ✕ 留出位置 */
.sync-ind { font-size: var(--fs-sm); color: var(--tx2); white-space: nowrap; }
.sync-ind.busy { color: var(--pri); }
/* 操作日志 / 跟进记录（时间线 + 列表） */
/* 时间线（跟进记录 / 操作日志）：从"左色条卡片堆"升级成"竖向节点" ——
   左侧一条渐变竖线 + 每个条目一个圆点，先后顺序一眼看清。
   ⚠️ 圆点用 ::before 绝对定位（left 负值贴到竖线上），所以 .timeline 必须留出 padding-left。 */
.timeline { position: relative; display: flex; flex-direction: column; gap: 9px; padding-left: 22px; }
.timeline::before {
  content: ''; position: absolute; left: 5px; top: 8px; bottom: 8px; width: 2px;
  border-radius: 999px; opacity: .3;
  background: linear-gradient(180deg, var(--pri), var(--pri-3), var(--line));
}
.tl-item { position: relative; border-left: 3px solid var(--pri); background: var(--bg2-grad); border-radius: 0 10px 10px 0; padding: 8px 12px; }
.tl-item::before {
  content: ''; position: absolute; left: -22px; top: 13px; width: 12px; height: 12px;
  border-radius: 50%; background: var(--pri);
  border: 2px solid var(--surface); box-shadow: 0 0 0 2px rgba(61, 111, 224, .18);
}
.tl-item.tl-follow { border-left-color: var(--ok); background: var(--ok-bg); }
.tl-item.tl-follow::before { background: var(--ok); box-shadow: 0 0 0 2px rgba(24, 160, 88, .18); }
.tl-head { display: flex; justify-content: space-between; gap: 10px; font-size: var(--fs-sm); }
.tl-time { color: var(--tx2); font-size: var(--fs-xs); white-space: nowrap; }
.tl-body { font-size: var(--fs-sm); color: var(--tx); margin-top: 4px; white-space: pre-wrap; word-break: break-all; }
.tl-actor { font-size: var(--fs-xs); color: var(--tx2); margin-top: 4px; }
#logs-body td { font-size: var(--fs-sm); }
/* 跟进输入区 */
.follow-box { background: var(--bg2-grad); border: 1px solid var(--line); border-radius: 12px; padding: 10px; margin-bottom: 14px; }
.follow-box textarea { margin-bottom: 8px; }
.follow-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

/* ---------- 表格（编号列固定跟随，纵向随页面自然滚动） ---------- */
.table-wrap { overflow-x: auto; }
table.grid { border-collapse: separate; border-spacing: 0; width: 100%; min-width: 1500px; white-space: nowrap; }
/* 表格行高：原来 padding 9px×2 + 内容行高 1.5 = 41px，一屏看不了几行。
   收到 6px 上下 + 行高 1.3 → 约 32px（实测 26 行能省下 200 多 px 的滚动高度）。 */
.grid th, .grid td { padding: 6px 12px; border-bottom: 1px solid var(--line); text-align: left; font-size: var(--fs-sm); line-height: 1.3; vertical-align: middle; }
.grid th { background: linear-gradient(180deg, var(--bg1-grad), #eef2fc); color: var(--tx); font-weight: 700; box-shadow: inset 0 -1px 0 var(--line); }
/* 表头两行显示（如「租金 /（纯币）」）：主名一行 + 括号说明小字一行 */
.grid th small { display: block; font-size: 10px; font-weight: 400; color: var(--tx2); line-height: 1.2; }
/* 编号列：横向滚动时固定在左侧 */
.grid th:first-child { position: sticky; left: 0; z-index: 7; }
.grid td:first-child {
  position: sticky; left: 0; z-index: 2;
  box-shadow: inset -1px 0 0 var(--line);
}
/* 选号页（对外）：前 N 列钉在左侧 —— left 偏移由 JS 按实际列宽写入 --pin-l
   （列宽随字体 / 缩放 / 响应式变，写死 px 会错位），表格加 data-pin="N" 即启用 */
.grid th.pin-c, .grid td.pin-c { position: sticky; left: var(--pin-l, 0px); }
.grid th.pin-c { z-index: 7; }
.grid td.pin-c { z-index: 2; }
/* 钉住的左侧固定区加浅色渐变（老板要求"编号那栏明显些"），一眼看出这块是钉住的。
   ⚠️ 斑马纹那条 `.grid tbody tr:nth-child(even) td:first-child` 特异性与本段相同且定义在后面，
      会把渐变盖成纯色 → 这里统一加 `table` 前缀把特异性抬一档，保证钉住区的底色始终是渐变。
   斑马纹 / 悬停 / 状态高亮都要跟着走，否则滚动时会出现"半截颜色" */
.grid th.pin-c { background: linear-gradient(180deg, #e8f0ff, #dde9ff); }
.grid td.pin-c,
table.grid tbody tr:nth-child(even) td.pin-c { background: linear-gradient(90deg, #f3f8ff, #edf4ff); }
table.grid tbody tr:hover td.pin-c { background: linear-gradient(90deg, #e4eeff, #dce9ff); }
table.grid tbody tr.row-out td.pin-c { background: #fff3e0; color: #9a6320; }
/* 最后一根钉住的列：右侧加一条细阴影，提示"这边开始是滑动区" */
.grid td.pin-c.pin-last { box-shadow: inset -1px 0 0 var(--line), 6px 0 10px -8px rgba(31, 58, 120, .35); }

/* 管理端：编号列 = #编号 + [操作 ▾]（同一行，点开弹窗）+ 号主手机（审核/跟进挪到日志抽屉） */
.grid td.idc { min-width: 142px; max-width: 168px; vertical-align: middle; padding: 6px 10px; }
/* 选号页编号列：只有 #编号。老板要求"优化编号宽度、给出更多展示空间"
   → 字号与左右内边距各收一档（实测列宽 76px → 约 60px，省下的宽度自动分给后面的列）。
   ⚠️ 别指望 max-width：它在 table-cell 上基本无效 —— 真正决定列宽的是 min-width + 内容宽度，
      所以收窄只能靠"缩字号 + 缩 padding"这种实打实的写法。 */
.grid td.idc-plain { min-width: 56px; padding: 6px 8px; font-size: var(--fs-xs); }
.idc .id-line { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.idc .id-num { font-weight: 700; font-size: var(--fs-sm); line-height: var(--lh-tight); }
.ops-trigger {
  flex: 0 0 auto; font-size: var(--fs-xs); font-weight: 700; white-space: nowrap;
  color: var(--pri); background: var(--bg1-grad); border: 1px solid #d9e3fb; border-radius: 999px;
  padding: 2px 9px; cursor: pointer; transition: background .15s, color .15s, border-color .15s;
}
.ops-trigger:hover { background: var(--pri); color: #fff; border-color: transparent; }
/* 号主手机链接（现仅出现在「详情」抽屉的账号信息条里，编号列已不再显示手机） */
.id-phone { color: var(--pri); font-weight: 700; text-decoration: none; white-space: nowrap; }
.id-phone:hover { text-decoration: underline; }
.idc .id-audit, .idc .id-follow { color: var(--tx2); white-space: nowrap; }
/* 操作弹窗（编辑 / 上架 / 出租 / 下架 / 重上 / 日志 / 删除） */
.ops-menu {
  position: fixed; z-index: 65; min-width: 122px; padding: 6px;
  background: var(--surface); border: 1px solid var(--line); border-radius: 12px;
  box-shadow: 0 14px 34px rgba(30, 45, 80, .18);
  display: none; flex-direction: column; gap: 4px;
}
.ops-menu.show { display: flex; }
.ops-menu .row-ops { display: flex; flex-direction: column; gap: 4px; }
.ops-menu .btn-xs { min-width: 100%; text-align: left; padding: 6px 10px; }
.ops-menu .btn-xs.hidden { display: none; }

/* 管理后台：筛选/搜索条吸顶（顶栏折叠时贴住折叠条，滚到哪都能搜索） */
#admin-toolbar { position: sticky; top: var(--stick-top, 0px); z-index: 45; }
/* 搜索框放宽（信息不再拥挤后给搜索更多空间） */
#admin-filters .search-wrap { flex: 1 1 620px; min-width: 260px; }
#admin-filters .search-wrap .input { padding: 10px 12px 10px 34px; }
.admin-hero .sync-ind { margin-left: 2px; }
/* 页头右侧三项（当前管理员 / 已同步 / 退出登录）统一同一档字号 */
#btn-admin-logout { font-size: var(--fs-sm); }

/* 管理后台：账号表内部纵向滚动 + 表头行吸顶跟随（页头与搜索条始终可见） */
#admin-table-wrap { overflow: auto; max-height: 70vh; }
.grid thead th { position: sticky; top: 0; z-index: 6; }

/* 后台：跟进抽屉顶部账号信息条（编号列的审核人 / 跟进人 / 手机移到这里） */
.acct-info { display: grid; gap: 6px; padding: 10px 12px; margin-bottom: 12px; background: var(--bg2-grad); border: 1px solid var(--line); border-radius: 12px; }
.acct-info .row { display: flex; align-items: center; gap: 8px; font-size: var(--fs-sm); flex-wrap: wrap; }
.acct-info .k { color: var(--tx2); min-width: 62px; }
.acct-info .row .hint { font-size: var(--fs-xs); }

/* 管理后台：系统管理（运行状态 / 数据概况 / 安全状态三张卡 + 备份卡） */
.sys-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); gap: 12px; margin-bottom: 12px; }
.sys-card { padding: 14px 16px; }
.sys-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
.sys-head h3 { margin: 0; font-size: var(--fs-md); }
.sys-item { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 7px 0; border-bottom: 1px dashed var(--line); font-size: var(--fs-sm); flex-wrap: wrap; }
.sys-item:last-child { border-bottom: 0; }
.sys-item .k { color: var(--tx2); }
.sys-item .hint { font-size: var(--fs-xs); }
/* 🖥 运行状态（2026-09-21 重做）：KPI 大数字卡 + 百分比进度条（≥75% 黄、≥90% 红） */
.st-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: 12px; margin-bottom: 12px; }
.st-kpi { background: var(--card); border: 1px solid var(--line); border-radius: var(--rad); padding: 12px 14px; box-shadow: var(--shadow); }
.st-kpi .k { display: block; font-size: var(--fs-xs); color: var(--tx2); }
.st-kpi b { display: block; margin: 2px 0 2px; font-size: var(--fs-lg); color: var(--tx); font-variant-numeric: tabular-nums; }
.st-kpi b.st-ok { color: var(--ok); }
.st-kpi b.st-warn { color: var(--warn); }
.st-kpi .hint { font-size: var(--fs-xs); }
.st-meter { margin-bottom: 10px; }
.st-meter:last-child { margin-bottom: 0; }
.st-meter .st-m-top { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; font-size: var(--fs-sm); }
.st-meter .st-m-top b { font-weight: 700; font-variant-numeric: tabular-nums; }
.st-bar { height: 8px; margin: 5px 0 3px; border-radius: 999px; background: var(--bg1); overflow: hidden; }
.st-bar > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--pri), var(--pri-2)); transition: width .3s; }
.st-bar.warn > i { background: linear-gradient(90deg, #e0a53d, #f0c46a); }
.st-bar.bad > i { background: linear-gradient(90deg, #d2543f, #e88b7c); }
.st-meter .hint { font-size: var(--fs-xs); }
.st-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.st-chip { font-size: var(--fs-xs); padding: 3px 9px; border-radius: 999px; background: var(--bg1-grad); color: var(--tx2); }
.st-chip b { color: var(--tx); font-variant-numeric: tabular-nums; }
.sys-form { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; }
.sys-form .sys-f { margin: 0; min-width: 160px; }
.sys-form .input { padding: 8px 10px; }
.sys-card code { background: #f2f5fb; padding: 1px 6px; border-radius: 6px; font-size: var(--fs-xs); word-break: break-all; }
.sys-card .table-wrap { border: 1px solid var(--line); border-radius: 10px; }
.sys-card .grid th, .sys-card .grid td { padding: 7px 10px; font-size: var(--fs-sm); }
.grid tbody tr:hover td:first-child { background: #f6f9ff; }
.grid tbody tr:hover { background: #f6f9ff; }
/* 斑马纹：隔行浅蓝底，行与行更易区分（首列固定列的底色同步，避免半截颜色） */
.grid tbody tr:nth-child(even) td { background: #f5f8ff; }
.grid tbody tr:nth-child(even) td:first-child { background: #f5f8ff; }
.grid tbody tr:hover td { background: #e9f0ff; }
.grid tbody tr:hover td:first-child { background: #e9f0ff; }
/* 状态刚变化（已出租 / 已下架 / 删除）的行：橙色高亮提示，几秒后淡出移除 */
.grid tbody tr.row-out td, .grid tbody tr.row-out td:first-child {
  background: #fff3e0; color: #9a6320;
  box-shadow: inset 3px 0 0 #e9832a;
}
.grid tbody tr.row-out .badge { box-shadow: 0 0 0 2px rgba(233, 131, 42, .35); }
.grid tbody tr.row-out.fading td { opacity: 0; transition: opacity .8s; }
/* 页面出错提示条（脚本异常/请求异常时出现，避免"白屏看不出原因"） */
.page-error {
  position: sticky; top: 0; z-index: 90;
  display: flex; align-items: center; gap: 10px;
  padding: 8px 14px; font-size: var(--fs-sm);
  background: #fff0f0; border-bottom: 1px solid #ffc9c9; color: #b3261e;
}
.page-error b { white-space: nowrap; }
.page-error span { flex: 1; }
.page-error button { border: 0; background: transparent; color: #b3261e; font-size: var(--fs-sm); cursor: pointer; }
/* 表格自带横向滚动条隐藏：左右滑动统一用底部自绘滑块，避免同时出现两条滑动条 */
.table-wrap { scrollbar-width: none; -ms-overflow-style: none; }
.table-wrap::-webkit-scrollbar { height: 0; width: 0; }
.grid td.num { font-variant-numeric: tabular-nums; }
.badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: var(--fs-xs); font-weight: 600; }
.b-wait { background: var(--ok-bg); color: var(--ok); }
.b-sold { background: var(--sold-bg); color: var(--sold); }
.b-pend { background: var(--warn-bg); color: var(--warn); }
.b-off { background: var(--off-bg); color: var(--off); }
.online-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 5px; background: #c2c9d6; }
.online-dot.on { background: #2bb673; box-shadow: 0 0 6px #2bb67388; }
.money { color: var(--money); font-weight: 700; font-variant-numeric: tabular-nums; }
.idc { color: var(--tx2); font-weight: 700; }
.remark-cell { max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.empty { padding: 40px; text-align: center; color: var(--tx2); }

/* ---------- 分页 ---------- */
.pager { display: flex; align-items: center; justify-content: center; gap: 10px; padding: 16px 0 0; color: var(--tx2); }
.pager button { border: 1px solid var(--line); background: var(--surface); border-radius: 8px; padding: 6px 14px; cursor: pointer; }
.pager button:disabled { opacity: .4; cursor: not-allowed; }
.pager button:not(:disabled):hover { border-color: var(--pri); color: var(--pri); }
/* 结算单批量操作条（勾选后才出现）：批量确认结算 / 撤销 / 导出选中 */
.batch-bar {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 0 0 12px; padding: 10px var(--sp);
  background: linear-gradient(135deg, var(--bg1), var(--bg2));
  border: 1px solid var(--line); border-radius: var(--rad-sm);
  color: var(--tx2); font-size: var(--fs-sm);
}
.batch-bar b { color: var(--pri); font-size: var(--fs-md); }
/* 结算单「账目汇总」卡：把玩家侧 / 号主侧 / 平台拆开，避免押金与应付混淆 */
.money-sum {
  margin: 4px 0 12px; padding: 12px var(--sp);
  background: linear-gradient(135deg, var(--bg2), var(--bg1));
  border: 1px solid var(--line); border-radius: var(--rad);
}
.ms-title { margin: 2px 0 4px; color: var(--tx); font-size: var(--fs-sm); font-weight: 700; }
.ms-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; padding: 5px 0; font-size: var(--fs-sm); color: var(--tx2); }
.ms-row b { color: var(--tx); font-variant-numeric: tabular-nums; }
.ms-total { border-top: 1px dashed var(--line); margin-top: 4px; padding-top: 8px; color: var(--tx); font-weight: 600; }
.ms-total b { color: var(--pri); font-size: var(--fs-lg); }
.ms-sep { height: 1px; background: var(--line); margin: 8px 0 4px; }
/* 结算明细里「实退 / 实结」就地可改：贴在行右侧的小输入框（替代原来单独一块输入区，避免与上面重复显示） */
.ms-inp {
  flex: 0 0 118px; width: 118px; padding: 5px 8px; text-align: right;
  border: 1px solid var(--line); background: var(--surface); color: var(--pri);
  font-size: var(--fs-md); font-weight: 700; font-variant-numeric: tabular-nums;
}
.ms-k small { display: block; margin-top: 2px; color: var(--tx2); font-size: var(--fs-xs); font-weight: 400; }
/* 列表「操作」列固定在右侧：横向滚动时也能直接点，不用一路拖到最右边 */
table.grid th.stick-right, table.grid td.stick-right {
  position: sticky; right: 0; z-index: 2; background: var(--surface);
  box-shadow: -6px 0 10px -8px rgba(31, 58, 120, .35);
}
table.grid thead th.stick-right { z-index: 7; background: var(--bg1); }
/* 结算单两个 Tab（列表 / 新建）：表单很长、列表要横向滚动，分开显示更利落 */
/* 管理后台的卡片也铺一层极浅渐变（与统计卡、选号页 / 评估页统一，页面更有层次） */
#admin-main .card { background: linear-gradient(170deg, #fff, var(--bg1) 70%, var(--bg2)); }

/* Tab 本体（.tabs / .tab / .tab.active）沿用样式表里已有的那套；这里只补：
   两个新 Tab 栏（结算单 #tabs / 管理后台 #otabs）的下间距 + 计数角标 */
#tabs, #otabs { margin: 0 0 var(--sp); }
.tab-n {
  display: inline-block; min-width: 20px; padding: 1px 6px; margin-left: 4px;
  background: var(--bg1); border-radius: 999px; color: var(--pri);
  font-size: var(--fs-xs); text-align: center; font-variant-numeric: tabular-nums;
}
.tab.active .tab-n { background: rgba(255, 255, 255, .3); color: #fff; }
/* 表单里的黄色提醒条（如物资消耗超过账号库存） */
.warn { margin-top: 8px; padding: 8px 12px; background: var(--warn-bg); border: 1px solid var(--warn); border-radius: var(--rad-sm); color: var(--warn); font-size: var(--fs-sm); }
/* ② 物资消耗：按价目表逐项填「实际用量」（名称+单价 / 数量 / 小计） */
.supply-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 8px; }
.supply-item {
  display: flex; align-items: center; gap: 8px; padding: 6px 10px;
  background: rgba(255, 255, 255, .62); border: 1px solid rgba(255, 255, 255, .9); border-radius: 12px;
}
.si-k { flex: 1 1 auto; min-width: 0; color: var(--tx); font-size: var(--fs-sm); }
.si-k i { display: block; font-style: normal; color: #8fa0bb; font-size: var(--fs-xs); }
.si-k b { color: var(--tx2); font-weight: 600; }
.supply-item .input { flex: 0 0 76px; width: 76px; text-align: center; padding: 6px 4px; }
.si-t { flex: 0 0 60px; text-align: right; color: var(--tx); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.si-sel {
  display: inline-block; width: 56px; padding: 1px 4px; margin: 0 2px;
  border: 1px solid var(--line); border-radius: 8px; background: var(--surface); color: var(--tx); font-size: var(--fs-xs);
}
@media (max-width: 720px) {
  .supply-grid { grid-template-columns: 1fr; }
  /* 物资行在手机上改成两行：名称 + 单价说明**独占一行**（原来和数量框、小计挤在一行，
     像「子弹 ￥0.7 / 发 · 账号共有 — 发」这种长文案会被压得很难看）；
     下面一行才是「数量输入框 + 小计」，输入框拉伸填满剩余宽度，更好点。 */
  .supply-item { flex-wrap: wrap; gap: 6px 8px; }
  .si-k { flex: 1 1 100%; }
  .supply-item .input { flex: 1 1 auto; width: auto; min-width: 0; }
  .si-t { flex: 0 0 64px; }
  /* 驾驶舱手机端：KPI 固定 2 列（auto-fit 在 390px 上会掉到 1 列，太长），图表高度收一档 */
  .ck-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .ck-kpi { padding: 10px 12px 12px; }
  .ck-kpi-v { font-size: 21px; }
  .ck-spark { width: 76px; height: 26px; }
  /* ⚠️ 驾驶舱的手机端规则**不放在这个块里**：放这儿会被后面驾驶舱的桌面规则盖掉
     （同为单类选择器，只按先后决定胜负）。已统一挪到驾驶舱样式块之后，
     见「驾驶舱 · 手机端」那个 @media (max-width:720px)。 */
  /* 登录 / 改密弹窗：手机上几乎铺满，收紧内边距（原来固定宽 404px 在小屏会顶到两边） */
  #auth-box, #pwd-modal { width: calc(100vw - 24px); }
  #auth-box .modal-head, #pwd-modal .modal-head { padding: 18px 16px 13px; gap: 7px; }
  #auth-box .modal-head::before, #pwd-modal .modal-head::before { width: 42px; height: 42px; font-size: 20px; }
  #auth-box .modal-body, #pwd-modal .modal-body { padding: 14px 16px 16px; gap: 11px; }
  /* 结算单新建页：品牌头与公式卡在手机上收紧；公式改成上下两行（横排太挤会换行难看） */
  .panel-hero { padding: 12px 14px; gap: 10px; }
  .panel-hero .ph-mark { width: 40px; height: 40px; border-radius: 12px; font-size: var(--fs-md); }
  .formula-card { padding: 11px 12px; }
  .fc-row { flex-direction: column; align-items: stretch; gap: 1px; padding: 3px 0; }
  .fc-e { color: var(--tx2); }
  /* 结算单列表：手机端行收紧（16 列本来就要横滑，行矮一点一屏能多看几行） */
  #table-wrap th, #table-wrap td { padding: 6px 9px; }
}
/* 物资消耗费合计：做成醒目的一条（左侧说明 + 右侧大数字），比一个普通只读框清楚。
   用 grid 而不是 flex —— 通用的 .input 样式会带 flex 属性，flex 布局下会把左侧标签压成竖排。 */
.gear-total {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 12px;
  margin: 2px 0 8px; padding: 10px 14px;
  background: linear-gradient(135deg, rgba(61, 111, 224, .10), rgba(111, 143, 240, .05));
  border: 1px solid rgba(61, 111, 224, .22); border-radius: 14px;
}
.gear-total .gt-k { min-width: 0; color: var(--tx); font-size: var(--fs-sm); font-weight: 600; line-height: var(--lh-body); }
.gear-total .gt-k small { display: block; margin-top: 2px; color: #8fa0bb; font-size: var(--fs-xs); font-weight: 400; }
.gear-total .gt-v {
  width: 150px; max-width: 46vw; padding: 0 4px; text-align: right;
  border: none; background: transparent; box-shadow: none;
  color: var(--pri); font-size: var(--fs-lg); font-weight: 800; font-variant-numeric: tabular-nums;
}
/* 状态小标签（收款待补 / 缺开户行 / 凭证已上传）—— 不叫 .pill，避免和 tabs 的 .pill 打架 */
.tag { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: var(--fs-xs); font-weight: 600; }
.tag-warn { background: #fff4e5; color: #b26a00; border: 1px solid #ffd591; }
.tag-ok { background: #e9f8ef; color: #1f8f4e; border: 1px solid #b6e6c9; }
/* 编辑弹窗：凭证预览区 + 操作记录时间线 */
.voucher-box {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 6px 0 4px; padding: 10px 12px;
  border: 1px dashed var(--line); border-radius: 12px; background: #fafbff;
}
.voucher-box img { max-width: 180px; max-height: 120px; border: 1px solid var(--line); border-radius: 8px; cursor: zoom-in; }
.log-list { max-height: 230px; overflow-y: auto; margin-top: 2px; padding: 2px; }
.log-row {
  display: flex; flex-direction: column; gap: 2px; margin-bottom: 6px; padding: 7px 10px;
  background: #f7faff; border-left: 2px solid #dbe5f8; border-radius: 0 10px 10px 0;
}
.log-row b { color: var(--tx); font-size: var(--fs-sm); }
.log-row span { color: #8fa0bb; font-size: var(--fs-xs); }
.log-row i { color: var(--tx2); font-size: var(--fs-xs); font-style: normal; }

/* ---------- 表单 ---------- */
.form { padding: 22px; display: flex; flex-direction: column; gap: 16px; }
.form-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 14px 16px; }
.field { display: flex; flex-direction: column; gap: 6px; }
.lab { font-size: var(--fs-sm); color: var(--tx); font-weight: 600; }
.req { color: var(--err); font-style: normal; }
/* hero 顶部一行：标题在左、登录用户区（👤 手机号 ▾）在右（2026-09-21）
   原来用户区放在独立的工具栏里，手机端会漂移；并进 hero 后与「评估」同一行、居右。
   `flex-wrap` 保证在极窄屏上它宁可换行也不撑破容器。 */
.hero-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.hero-top h1 { min-width: 0; }
.hero-top #auth-zone { flex: 0 0 auto; min-width: 0; max-width: 100%; }

/* ---------- 「我登记的账号」卡片：B 方案（2026-09-21 老板选定）----------
   卡面只留「编号 + 状态 + 一行提示 + 三个关键数字」，其余（账号基础/装备/预估/皮肤/备注）
   全部收进 <details> 折叠区 —— 信息一点没删，但默认高度大幅下降。 */
.p-card .p-when { margin-left: auto; color: #98a6bd; font-size: var(--fs-xs); font-weight: 400; }
.p-key {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px;
  margin: 2px 0 10px; padding: 10px 12px; border-radius: 10px;
  background: var(--bg2-grad); border: 1px solid var(--line);
}
.p-key > span { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.p-key > span > i { color: var(--tx2); font-size: var(--fs-xs); font-style: normal; }
.p-key > span > b { color: var(--tx); font-size: var(--fs-md); font-weight: 800; font-variant-numeric: tabular-nums; }
.p-key > span > b.money { color: var(--money); }
.p-more { margin-top: 2px; }
/* 「查看详情」按钮（2026-09-21 由 <details> 改为弹窗触发）：整行虚线按钮，点开弹窗、不动其他卡片 */
.p-more-btn {
  display: block; width: 100%; margin-top: 2px; padding: 7px 10px; cursor: pointer;
  border: 1px dashed var(--line); border-radius: 9px; background: transparent;
  color: var(--pri); font-size: var(--fs-xs); font-weight: 700; font-family: inherit;
}
.p-more-btn:hover { border-color: var(--pri); background: var(--bg1); }
.p-more-btn::after { content: ' ›'; }
/* 详情弹窗：窄屏近全宽，内部沿用 .p-sec 分区 */
.mine-modal { max-width: 560px; width: calc(100vw - 32px); }
.mine-modal .modal-body { max-height: 68vh; overflow-y: auto; }
.mine-d-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; color: var(--tx2); font-size: var(--fs-xs); line-height: 1.45; }
/* 再压缩一轮（2026-09-21 老板：「弹窗前的卡片可以继续优化，显示可以再压缩，更紧凑」）
   ⚠️ 最大的浪费是**右上角的时间**和第三格「更新时间」是同一个值、显了两遍 → 右上角那个已从 JS 去掉。
   这里再把内边距/行距/按钮收紧一档。（放在末尾，覆盖前面的同名规则） */
.p-card { padding: 11px 13px; }
.p-card .mine-tip { margin: 0 0 7px; font-size: var(--fs-xs); }
.p-key { margin: 0 0 8px; padding: 8px 10px; gap: 6px; }
.p-key > span > b { font-size: var(--fs-md); }
.p-more-btn { padding: 6px 8px; }
/* A 方案：整卡可点 + 右上角「查看详情 ›」（原来那行独立按钮已移除，省一整行） */
.p-card[data-detail] { cursor: pointer; transition: border-color .15s, box-shadow .15s, transform .15s; }
.p-card[data-detail]:hover { border-color: var(--pri); box-shadow: var(--shadow); }
.p-card[data-detail]:focus-visible { outline: 2px solid var(--pri); outline-offset: 2px; }
.p-go { margin-left: auto; color: var(--pri); font-size: var(--fs-xs); font-weight: 700; white-space: nowrap; }
.p-go i { font-style: normal; font-size: 15px; }
/* 卡面只剩 2 格 → 网格改 2 列（否则第 3 格空着）
   ⚠️ 这条要放在 .p-key 基础规则之后才生效 */
.p-card .p-key { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* 「我登记的账号」一行 4 张卡（2026-09-21 老板要求）—— 只作用于本列表，不动全站 .pending-grid */
#mine-list.pending-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 1180px) { #mine-list.pending-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 900px) { #mine-list.pending-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { #mine-list.pending-grid { grid-template-columns: 1fr; } }

/* ---------- 管理端「待上架」审核卡片（2026-09-21 A+B+C，目标是提升审核效率）----------
   · C 一行 4 张（窄屏依次降列）
   · A/B 卡面压缩 + 操作按钮紧凑、主按钮突出；整卡可点 = 直接进审核抽屉 */
#admin-pending.pending-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; }
@media (max-width: 1180px) { #admin-pending.pending-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 900px) { #admin-pending.pending-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { #admin-pending.pending-grid { grid-template-columns: 1fr; } }
/* ⚠️ 2026-09-21 修：登记卡片那轮加的 `.p-card .p-key { repeat(2,…) }` **误伤了管理端卡片** ——
   管理端有 3 格（纯币/比例/押金），在 2 列网格里第 3 格会被挤到第二行，看起来像"押金没改/没显示"。
   这里把管理端还原成 3 列。 */
#admin-pending .p-card .p-key { grid-template-columns: repeat(2, minmax(0, 1fr)); }   /* 卡面只剩 纯币/比例 */
/* 再压缩（2026-09-21 老板：「卡片还是不紧凑」）：
   ⚠️ 最大浪费是两格用了「标签在上、值在下」的**竖排**，白占一倍高度 → 改成**标签+值同行**；
   同时把卡片与各块的 padding/margin 一并收紧。 */
#admin-pending .p-card { padding: 10px 12px; }
#admin-pending .p-card .p-head { margin-bottom: 0; }
#admin-pending .p-card .p-key { padding: 6px 9px; margin: 7px 0; gap: 4px 8px; }
/* ⚠️ 让「纯币 521M」「比例 50」**标签与值同行**（原来是标签在上、值在下的竖排，白占一行高度）。
   第一次只写了 `flex-direction: row` **没生效** —— 同族选择器 `.p-key > span` 的 `display:flex; flex-direction:column`
   抢先落地了。这次**把 display 一起显式写出来并用 !important 锁定**，确保必胜。
   作用域限定在 `#admin-pending`，只影响管理端审核卡片，风险可控。 */
#admin-pending .p-card .p-key > span {
  display: flex !important; flex-direction: row !important;
  align-items: baseline !important; gap: 5px !important;
}
#admin-pending .p-card .p-key > span > i { font-size: var(--fs-xs); white-space: nowrap; }
#admin-pending .p-card .p-key > span > b { font-size: var(--fs-sm); }
#admin-pending .p-card .p-actions { margin-top: 0; }
#admin-pending .p-card { cursor: pointer; transition: border-color .15s, box-shadow .15s; }
#admin-pending .p-card:hover { border-color: var(--pri); box-shadow: var(--shadow); }
/* 操作按钮**等分**（2026-09-21 老板要求）：flex:1 1 0 + 允许收缩，保证宽度一致。
   注：待上架卡片在 2026-09-21 合并「审核/编辑」后只剩 [审核上架][删除] 两个按钮，
   等分规则与按钮数量无关（两按钮各占一半），无需改样式。 */
#admin-pending .p-card .p-actions { margin-top: 8px; gap: 6px; }
#admin-pending .p-card .p-actions .btn { flex: 1 1 0; min-width: 0; padding: 5px 6px; font-size: var(--fs-xs); }
@media (max-width: 720px) {
  .p-card { padding: 10px 12px; }
  .p-key { padding: 7px 9px; gap: 5px; }
  .p-more-btn { padding: 5px 7px; }
}

/* ---------- 「我登记的账号」卡片瘦身（2026-09-21）----------
   老板：「卡片高度还需要继续优化，现在显示太占面积了，PC 展示都够了，手机就更别说」。
   一张卡要塞 账号基础6项 + 装备6项 + 系统预估7项 + 到手 + 皮肤 + 备注 + 时间，纵向确实很长。
   这里做**纯压缩**（不动列数与信息量，风险最低）：减小内外边距、行距与分区间距。 */
.p-card { padding: 13px 15px; }
.p-card .p-head { margin-bottom: 6px; }
.p-card .mine-tip { margin: 0 0 8px; line-height: 1.4; }
.p-card .p-sec { margin-bottom: 7px; padding: 8px 10px; }
.p-card .p-sec-t { margin-bottom: 4px; }
.p-card .p-grid { gap: 4px 10px; }
.p-card .p-i { padding: 0; line-height: 1.35; }
.p-card .p-net { margin-top: 6px; padding: 6px 10px; }
.p-card .p-tip { margin-top: 5px; }

/* 提交成功面板里的「请截图」提示条（2026-09-21）：从长句里拎出来单独成条 + 暖色底，确保看得见 */
.success-shot {
  display: inline-block; margin: 10px auto 8px; padding: 9px 16px;
  border-radius: 999px; background: var(--warn-bg); color: var(--warn);
  font-size: var(--fs-sm); font-weight: 700;
}

/* 表单分节块：浅色渐变把每一组字段区分开（长表单一眼看出"这是一组"） */
.form-block {
  display: flex; flex-direction: column; gap: 12px;
  padding: 14px 16px; border-radius: var(--rad);
  background: linear-gradient(165deg, var(--bg1), var(--bg2) 58%, var(--card));
  border: 1px solid var(--line);
}
/* 表单分节标题（评估页字段多，加小标题后才好找：基础 / 装备 / 皮肤 / 备注） */
.form-sec {
  display: flex; align-items: center; gap: 8px;
  margin: 8px 0 -4px; color: var(--tx); font-size: var(--fs-sm); font-weight: 700;
}
/* 分节块内的标题：块本身已有边界，不用再画一条分割线，间距也由 gap 控制 */
.form-block .form-sec { margin: 0; }
.form-block .form-sec::after { display: none; }
.form-sec i {
  flex: 0 0 auto; width: 20px; height: 20px; border-radius: 999px;
  background: var(--bg1); color: var(--pri); font-style: normal; font-weight: 700;
  font-size: var(--fs-xs); line-height: 20px; text-align: center;
}
.form-sec::after { content: ''; flex: 1; height: 1px; background: var(--line); }

/* ⚠️ 2026-09-21 老板反馈「『1 账号基础』是一级标题，但跟『哈夫币纯币（单位 M）』显示一样大，是不是主次不分？」
   → **确实不分**：`.form-sec` 和 `.lab` 都是 `--fs-sm`。
   这里**只放大评估/登记页的分节标题**（不动全局 `.form-sec`，免得影响结算单页那套彩色分节块），
   并给它加一条细分隔线，形成「分节标题 > 字段名 > 输入框」的层次。 */
#submit-form .form-sec {
  font-size: var(--fs-md); font-weight: 800; letter-spacing: .2px;
  /* ⚠️ 2026-09-21 老板反馈「1 账号基础 和 哈夫币纯币 之间间隔太近」：
     原来 `.form-block .form-sec { margin: 0 }`，只靠容器的 `gap:12px` 撐着，标题和第一行字段几乎贴着。
     → 这里补 padding-bottom 9 + margin-bottom 4（叠加容器的 12 → 视觉约 16px），标题下面留出呼吸。 */
  /* ⚠️ 实测：容器的 flex gap 在这儿没叠加进来（只算到 margin），所以间距**全靠这个 margin** 撑。
     别调小 —— 老板明确说过"标题和字段离太近"。 */
  padding-bottom: 9px; margin-bottom: 20px;
  border-bottom: 1px solid var(--line);
}
#submit-form .form-sec i { width: 22px; height: 22px; line-height: 22px; font-size: var(--fs-sm); }
/* ⚠️ 标题后面的「必填项 / 选填」小标：**必须是短词**。
   之前放了一句长文案（"以下都选填，可以直接下一步"），`.form-sec` 是 flex 且不换行 → 直接溢出，
   看起来就是"错位"。这里锁定不收缩、不改行，并且提示以后只用两个字以内的词。 */
#submit-form .form-sec .hint2 { margin-left: 0; flex: 0 0 auto; white-space: nowrap; }

/* 表单校验错误文案（登录 / 改密弹窗等） */
.form-err { color: var(--err); font-size: var(--fs-sm); text-align: center; min-height: 18px; }
.input {
  border: 1px solid var(--line); border-radius: 10px; padding: 9px 12px; background: var(--surface); color: var(--tx);
  font-size: var(--fs-sm); outline: none; transition: border .15s, box-shadow .15s; width: 100%;
}
.input:focus { border-color: var(--pri); box-shadow: 0 0 0 3px rgba(61,111,224,.14); }
/* 下拉选择器：去掉系统原生箭头（各家浏览器画得不一样、大小/位置不可控、贴边时容易显得"要溢出"），
   统一换成自绘的圆角 chevron —— 用背景 SVG，不依赖额外元素，随便什么宽度都稳定。
   ⚠️ 必须写成 select.xxx（在 .input 的 background 简写之后），否则背景图会被 background 重置掉。 */
select.input, select.sort-select, .calc-select, select {
  appearance: none; -webkit-appearance: none; -moz-appearance: none;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1.2 1.6 6 6.4l4.8-4.8' fill='none' stroke='%236b7a93' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 11px center;
  padding-right: 32px;                       /* 给箭头留出位置，文字不会顶到箭头 */
  cursor: pointer;
}
select.input:focus, select:focus { background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1.2 1.6 6 6.4l4.8-4.8' fill='none' stroke='%233d6fe0' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
/* 原生下拉展开的选项列表（部分浏览器可调） */
select option { color: var(--tx); background: var(--surface); }
/* 多选 / 无箭头的 select（如计算页的深色报价牌，箭头用白色更高对比） */
.calc-select {
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1.2 1.6 6 6.4l4.8-4.8' fill='none' stroke='%233d6fe0' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-position: right 14px center;
}
textarea.input { resize: vertical; }
.seg { display: flex; gap: 8px; flex-wrap: wrap; }
.seg label { cursor: pointer; }
.seg input { display: none; }
.seg span { display: inline-block; padding: 8px 18px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface); color: var(--tx2); font-weight: 600; transition: background .15s, color .15s, border-color .15s; }
.seg input:checked + span { background: linear-gradient(135deg, var(--pri), var(--pri-2)); color: #fff; border-color: transparent; box-shadow: 0 3px 10px rgba(61,111,224,.3); }
.field-block { display: flex; flex-direction: column; gap: 8px; }
.skin-grid { display: flex; flex-wrap: wrap; gap: 8px; }
.skin-grid label { cursor: pointer; }
.skin-grid input { display: none; }
.skin-grid span { display: inline-block; padding: 6px 13px; border: 1px solid var(--line); border-radius: 999px; background: var(--surface); color: var(--tx2); font-size: var(--fs-sm); transition: background .15s, color .15s, border-color .15s; }
.skin-grid input:checked + span { background: linear-gradient(135deg, var(--pri-3), #b18cff); color: #fff; border-color: transparent; box-shadow: 0 3px 10px rgba(138,92,246,.3); }
.form-actions { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding-top: 4px; }
.hint { color: var(--tx2); font-size: var(--fs-xs); }
/* 结算单页的分块小标题（① 账号 / ② 物资消耗 / ③ 结算明细 …）：做成色块标签，页面层次更清楚 */
.sub-title {
  display: flex; align-items: center; gap: 8px;
  margin: 16px 0 8px; padding: 8px 14px;
  background: linear-gradient(90deg, rgba(61, 111, 224, .12), rgba(61, 111, 224, .02));
  border-left: 3px solid var(--pri); border-radius: 10px;
  font-size: var(--fs-md); color: var(--tx); font-weight: 700;
}
.sub-title::before { content: ''; }
/* 「我的登记记录」区块：点击跳转定位时给固定顶栏留出空间（避免被顶栏遮住） */
#view-mine { scroll-margin-top: 74px; }
/* ---------- 管理后台登录卡（聚焦式：图标头 + 居中文案 + 整宽按钮） ---------- */
.login-card { max-width: 380px; margin: 26px auto 48px; padding: 26px 24px 20px; gap: 14px; box-shadow: var(--shadow-lg); border-radius: var(--rad-lg); }

/* ---------- 登录 / 注册 / 改密弹窗升级（2026-09-20）----------
   原来是「一行标题 + 纯白底 + 两个胶囊 Tab」，没有品牌感、字段也只是一行灰标签。
   现在：渐变品牌头（圆形图标 + 渐变标题）+ 分段式切换（segmented）+ 带图标的字段标签。
   ⚠️ 结构上刻意**不动** HTML —— JS 依赖 `.tabs [data-mode]` / `[data-pmode]` / `#xxxx-title`，
      这里全部只加样式，靠 ::before 造图标、靠定位放关闭按钮。 */
#auth-box, #pwd-modal { width: min(404px, 94vw); }
#auth-box .modal-head, #pwd-modal .modal-head {
  position: relative; flex-direction: column; align-items: center; gap: 9px;
  padding: 22px 18px 16px; text-align: center;
  background: linear-gradient(165deg, var(--bg1-grad), #f6f4ff 58%, #fff);
}
#auth-box .modal-head::before, #pwd-modal .modal-head::before {
  width: 46px; height: 46px; border-radius: 50%;
  display: grid; place-items: center; font-size: 22px; line-height: var(--lh-tight);
  background: linear-gradient(135deg, var(--pri), var(--pri-2));
  box-shadow: 0 8px 18px -8px rgba(61, 111, 224, .75);
}
#auth-box .modal-head::before { content: '🔐'; }
#pwd-modal .modal-head::before { content: '🔑'; }
#auth-box .modal-head h3, #pwd-modal .modal-head h3 {
  font-size: var(--fs-lg); font-weight: 800;
  background: linear-gradient(90deg, var(--pri), var(--pri-3));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
#auth-box .modal-head .icon-btn, #pwd-modal .modal-head .icon-btn { position: absolute; top: 10px; right: 10px; }
/* 分段式切换：整条浅底胶囊，选中项渐变高亮 */
#auth-box .tabs, #pwd-modal .tabs {
  gap: 4px; padding: 4px; margin: 0 0 4px; justify-content: stretch;
  background: var(--bg1-grad); border: 1px solid var(--line); border-radius: 999px;
}
#auth-box .tabs .tab, #pwd-modal .tabs .tab {
  flex: 1 1 0; border: 0; background: transparent; color: var(--tx2);
  border-radius: 999px; padding: 8px 12px; font-size: var(--fs-sm); font-weight: 600;
  transition: color .15s, background .15s, box-shadow .15s;
}
#auth-box .tabs .tab.active, #pwd-modal .tabs .tab.active {
  color: #fff; background: linear-gradient(135deg, var(--pri), var(--pri-2));
  box-shadow: 0 4px 12px -5px rgba(61, 111, 224, .75);
}
/* 字段标签前置图标（:has() 现代浏览器均支持；不支持时只是少个图标，不影响功能） */
#auth-box .field:has(#oa-phone) .lab::before, #pwd-modal .field:has(#pf-phone) .lab::before { content: '📱 '; }
#auth-box .field:has(#oa-password) .lab::before,
#auth-box .field:has(#oa-confirm) .lab::before,
#pwd-modal .field:has(#pm-old) .lab::before,
#pwd-modal .field:has(#pm-new) .lab::before,
#pwd-modal .field:has(#pm-new2) .lab::before { content: '🔒 '; }
#pwd-modal .field:has(#pf-id) .lab::before { content: '🧾 '; }
#auth-box .input, #pwd-modal .input { border-radius: 11px; }
#auth-box #btn-owner-auth, #pwd-modal #btn-pwd-save {
  height: 46px; border-radius: 12px; font-size: var(--fs-md); font-weight: 700;
  background: linear-gradient(135deg, var(--pri), var(--pri-2));
  box-shadow: 0 10px 20px -10px rgba(61, 111, 224, .8);
}
#auth-box .auth-alt { text-align: center; margin-top: -2px; }
#auth-box .auth-alt .link-btn { font-size: var(--fs-sm); }
#pwd-modal .sum-box {
  padding: 10px 12px; background: var(--bg2-grad); border: 1px solid var(--line);
  border-left: 3px solid var(--pri); border-radius: 10px;
  color: var(--tx2); font-size: var(--fs-xs); line-height: var(--lh-body);
}

/* ---------- 结算单「新建结算单」：品牌头 + 规则公式卡（2026-09-20）----------
   老板反馈「跟现在的设计美观格格不入」：这页原来是「朴素 h3 + 4 行挤一起的纯文字 +
   左色块小标题」，而评估页是「渐变头 + 圆形编号分组」，两套语言。
   现在统一成同一套：品牌头 + 结构化公式卡 + .form-sec 分组（与评估页共用同一 class）。 */
.panel-hero {
  display: flex; align-items: center; gap: 12px; margin-bottom: 12px; padding: 14px 16px;
  background: linear-gradient(135deg, var(--bg1-grad), #f6f4ff 58%, #fff);
  border: 1px solid var(--line); border-radius: var(--rad);
}
.panel-hero .ph-mark {
  flex: 0 0 auto; width: 44px; height: 44px; border-radius: 14px;
  display: grid; place-items: center; font-size: var(--fs-lg); line-height: var(--lh-tight);
  background: linear-gradient(135deg, var(--pri), var(--pri-2));
  box-shadow: 0 6px 14px -6px rgba(61, 111, 224, .65);
}
.panel-hero .ph-tx { min-width: 0; }
.panel-hero h3 {
  font-size: var(--fs-md); font-weight: 800;
  background: linear-gradient(90deg, var(--pri), var(--pri-3));
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.panel-hero p { margin-top: 3px; color: var(--tx2); font-size: var(--fs-xs); line-height: var(--lh-body); }
/* 新建结算单：5 个大项各用一套浅色（老板：原来容易填错，用不同色块区分更佳）
   每项 = 浅色底 + 同色编号圆 + 同色分隔线，一眼能分清"现在填的是哪一块" */
.form-sec.sec-1 { --sc: #3d6fe0; --sb: #eef4ff; --sl: #d8e4fb; }
.form-sec.sec-2 { --sc: #14915c; --sb: #e9f8f0; --sl: #c9ecd9; }
.form-sec.sec-3 { --sc: #c9522f; --sb: #fdf0eb; --sl: #f6d8cc; }
.form-sec.sec-4 { --sc: #7a4ee0; --sb: #f3efff; --sl: #ded3fb; }
.form-sec.sec-5 { --sc: #b57608; --sb: #fdf6e6; --sl: #f4e2b8; }
#panel-new .form-sec[class*="sec-"] {
  padding: 7px 12px; border-radius: 10px; background: var(--sb);
  border-left: 3px solid var(--sc); color: var(--sc);
}
#panel-new .form-sec[class*="sec-"] i { background: var(--sc); color: #fff; }
/* 分隔线：保持 1px 的纤细感，只把颜色换成该大项的主色（老板要"有颜色但更含蓄"）。
   不透明度给到 .5 —— 1px 细线下如果还用 .34 会又变得看不清。 */
#panel-new .form-sec[class*="sec-"]::after {
  height: 1px; background: var(--sc); opacity: .5;
}
/* 第 1 项里「账号物资清单」也不在栅格内（在提示条下面单独一行），同样补上蓝底 */
#panel-new #f-goods {
  background: linear-gradient(135deg, #f6faff, #e6f0ff); border-color: #cfe0f8;
}
/* 每个大项里的控件也铺上「同款更浅」的底色，让"哪几行属于同一项"一眼可见。
   用相邻兄弟选择器 `.form-sec.sec-N + .form-grid` 精确圈定，不越界到下一项。
   底色都取很浅的一档，只为区分，不干扰输入框本身的观感。 */
#panel-new .form-sec.sec-1 + .form-grid .input {
  background: linear-gradient(135deg, #f6faff, #e6f0ff); border-color: #cfe0f8;
}
#panel-new .form-sec.sec-4 + .form-grid .input {
  background: linear-gradient(135deg, #faf7ff, #eee7ff); border-color: #dccffa;
}
#panel-new .form-sec.sec-5 + .form-grid .input {
  background: linear-gradient(135deg, #fffbf0, #fdf2d9); border-color: #eeddb0;
}
/* 第 1 项里另外两处（提示条 + 物资清单）不在栅格里，单独按蓝系上色 */
#panel-new #f-hint {
  padding: 8px 11px; border-radius: 10px;
  background: linear-gradient(135deg, #f6faff, #e6f0ff); border: 1px solid #dfeafc;
}
#panel-new #f-hint:empty { display: none; }
/* 第 2 项（物资）：卡片换成绿系浅底 */
#panel-new .supply-item { background: linear-gradient(135deg, #f7fdfa, #e6f7ee); border-color: #cdeada; }
#panel-new .supply-item:focus-within { border-color: #14915c; box-shadow: 0 0 0 3px rgba(20, 145, 92, .14); }
/* 第 3 项（结算明细）：账目汇总卡换成橙系浅底 */
#panel-new .money-sum { background: linear-gradient(135deg, #fff8f4, #ffeadf); border-color: #f3d5c6; }
/* ---------- 填写进度条（sticky 跟手）---------- */
.fill-bar {
  position: sticky; top: var(--stick-top, 60px); z-index: 30;
  margin-bottom: 12px; padding: 10px 14px; border-radius: 12px;
  /* 细渐变边框（1.5px）：用「双层背景」实现 —— padding-box 盖白底、border-box 露渐变，
     这样既能要渐变边框、又能保住 border-radius（border-image 会吃掉圆角）。
     边框刻意做细，只是让这条进度条更跳出来一点，不抢内容的视觉。 */
  border: 1.5px solid transparent;
  background:
    linear-gradient(var(--surface), var(--surface)) padding-box,
    linear-gradient(120deg, #bcd6ff, #ded0ff, #ffdccd) border-box;
  box-shadow: 0 4px 14px -8px rgba(61, 111, 224, .45);
}
.fb-top { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
.fb-tx { color: var(--tx); font-size: var(--fs-sm); font-weight: 700; }
.fb-pct { color: var(--pri); font-size: var(--fs-sm); font-weight: 800; font-variant-numeric: tabular-nums; }
/* 进度条改成「线段式」：每个大项一段，完成即点亮（老板：线条线条的更好） */
.fb-track { display: flex; gap: 5px; height: 6px; margin: 8px 0; }
.fb-seg { flex: 1 1 0; height: 6px; border-radius: 999px; background: var(--line); transition: background .25s, box-shadow .25s; }
.fb-seg.on { background: linear-gradient(90deg, var(--pri), var(--pri-3)); box-shadow: 0 1px 3px rgba(61, 111, 224, .35); }
.fb-steps { display: flex; flex-wrap: wrap; gap: 6px; }
.fb-step { display: inline-flex; align-items: center; gap: 5px; padding: 3px 9px; border-radius: 999px; background: var(--bg1-grad); color: var(--tx2); font-size: var(--fs-xs); }
/* 步骤胶囊按「对应大项」上色（老板：视觉更明显，一眼能对上下面哪一块）：
   未完成 = 该项的浅色渐变（比标题色块更浅一档，只做轻点缀）；
   已完成 = 同色系再深一档 + 加粗 —— 颜色始终是"它自己的色"，不会全变成一片绿。 */
.fb-step.fb-s1 { background: linear-gradient(135deg, #f3f8ff, #e9f1ff); color: #3d6fe0; }
.fb-step.fb-s2 { background: linear-gradient(135deg, #f1fcf6, #e7f8ef); color: #14915c; }
.fb-step.fb-s3 { background: linear-gradient(135deg, #fff6f2, #fdede6); color: #c9522f; }
.fb-step.fb-s4 { background: linear-gradient(135deg, #f8f4ff, #efe8ff); color: #7a4ee0; }
.fb-step.fb-s5 { background: linear-gradient(135deg, #fffbf0, #fdf4de); color: #b57608; }
.fb-step.done { font-weight: 700; }
.fb-step.fb-s1.done { background: linear-gradient(135deg, #e4eeff, #d0e1ff); }
.fb-step.fb-s2.done { background: linear-gradient(135deg, #dcf5e7, #c6eed8); }
.fb-step.fb-s3.done { background: linear-gradient(135deg, #ffe7dd, #ffd7c8); }
.fb-step.fb-s4.done { background: linear-gradient(135deg, #ece2ff, #dfd1fd); }
.fb-step.fb-s5.done { background: linear-gradient(135deg, #fdeec8, #fbe2a8); }

.formula-card {
  padding: 12px 14px; margin-bottom: 2px;
  background: var(--bg2-grad); border: 1px solid var(--line);
  border-left: 3px solid var(--pri); border-radius: 12px;
}
.fc-row { display: flex; align-items: baseline; gap: 10px; padding: 4px 0; font-size: var(--fs-sm); }
.fc-k { flex: 0 0 auto; color: var(--tx); font-weight: 700; }
.fc-e { min-width: 0; color: var(--tx2); font-variant-numeric: tabular-nums; }
.fc-note {
  margin-top: 6px; padding-top: 7px; border-top: 1px dashed var(--line);
  color: #8fa0bb; font-size: var(--fs-xs); line-height: var(--lh-body);
}
/* 物资消耗小卡：原来几乎是透明的（白 .62 + 白边），在卡片里几乎没有形状 —— 改成标准卡 */
.supply-item {
  background: var(--surface); border: 1px solid var(--line);
  box-shadow: 0 1px 2px rgba(60, 90, 160, .04);
  transition: border-color .15s, box-shadow .15s;
}
.supply-item:focus-within { border-color: var(--pri); box-shadow: 0 0 0 3px rgba(61, 111, 224, .12); }
.login-head { display: flex; flex-direction: column; align-items: center; gap: 8px; margin-bottom: 2px; }
.login-logo { width: 52px; height: 52px; border-radius: 50%; display: grid; place-items: center; font-size: var(--fs-lg); line-height: var(--lh-tight); background: linear-gradient(135deg, var(--bg1-grad), #f5f2ff); border: 1px solid var(--line); }
.login-card h3 { font-size: var(--fs-lg); text-align: center; }
.login-sub { color: var(--tx2); font-size: var(--fs-xs); }
.login-err { color: #e05656; font-size: var(--fs-sm); text-align: center; min-height: 18px; }
/* 皮肤折叠开关 */
.skins-toggle {
  align-self: flex-start; cursor: pointer; font-size: var(--fs-sm); font-weight: 600;
  color: var(--tx2); background: var(--bg2-grad); border: 1px dashed var(--line); border-radius: 10px;
  padding: 8px 14px; text-align: left; transition: background .15s, color .15s, border-color .15s;
}
.skins-toggle:hover { border-color: var(--pri); color: var(--pri); background: var(--bg1-grad); }
/* 物品填写框（仅「有」时展开） */
/* 物品（红咖啡/甲休/大红包/红蛋）字段已下线，相关样式一并移除 */

/* ---------- 按钮 ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  border: none; border-radius: 10px; padding: 9px 18px; font-size: var(--fs-sm); font-weight: 600;
  cursor: pointer; text-decoration: none;
  transition: background .15s, color .15s, box-shadow .15s, transform .15s, filter .15s, border-color .15s;
}
.btn-primary { background: linear-gradient(135deg, var(--pri), var(--pri-2)); color: #fff; box-shadow: 0 4px 14px rgba(61,111,224,.35); }
.btn-primary:hover { filter: brightness(1.06); transform: translateY(-1px); }
.btn-lg { padding: 12px 34px; font-size: var(--fs-md); }
.btn-ghost { background: var(--surface); border: 1px solid var(--line); color: var(--tx2); }
.btn-ghost:hover { border-color: var(--pri); color: var(--pri); }
.btn-sm { padding: 4px 10px; font-size: var(--fs-xs); border-radius: 8px; }
/* 评估页页头右侧整行统一字号（提示语 + 手机号 + 登录/我的登记记录/修改密码/退出登录），
   与后台页头那排保持一致，避免同一行里出现 12/14 混排 —— 只作用于这一行，不影响别处的小按钮 */
.eval-bar .hint { font-size: var(--fs-sm); }
#auth-zone { font-size: var(--fs-sm); }
#auth-zone .btn, #auth-zone .btn-sm { font-size: var(--fs-sm); }
/* 表格内超小按钮（编号列操作区）：必须写在 .btn 之后才能生效 */
.btn-xs {
  padding: 3px 0; font-size: var(--fs-xs); border-radius: 6px; line-height: var(--lh-body);
  min-width: 46px; text-align: center; flex: 0 0 auto;
}
.btn-ok { background: var(--ok-bg); color: var(--ok); }
.btn-ok:hover { background: #d5f2e2; }
.btn-warn { background: var(--warn-bg); color: var(--warn); }
.btn-warn:hover { background: #f9ecca; }
.btn-danger { background: var(--sold-bg); color: var(--sold); }
.btn-danger:hover { background: #f6d9d6; }
.icon-btn { border: none; background: transparent; font-size: var(--fs-md); cursor: pointer; color: var(--tx2); padding: 6px; border-radius: 8px; }
.icon-btn:hover { background: #eef1f6; color: var(--tx); }

/* ---------- 统计卡片 ---------- */
.stat-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin-bottom: 14px; }
/* 浅色渐变（老板 2026-09-20 要求管理页也用渐变，与选号页 / 评估页统一）：
   整行卡片统一同一套渐变方向与色阶，不会出现"两种配色挤在一起" */
.stat-card {
  padding: 14px 18px; border-radius: var(--rad);
  background: linear-gradient(165deg, #fff, var(--bg1) 62%, var(--bg2));
  border: 1px solid var(--line); box-shadow: var(--shadow);
}
.stat-card .n { font-size: var(--fs-lg); font-weight: 700; font-variant-numeric: tabular-nums; }
.stat-card .t { color: var(--tx2); font-size: var(--fs-xs); margin-top: 2px; }
/* 统计卡右侧的功能入口卡（代替原 Tab 行）与当前视图高亮
   与统计卡共用同一套渐变与边框色（整行统一配色）；
   靠 emoji + 蓝色标题 + 悬停上浮来区分"这是入口" */
.stat-card.stat-action {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px;
  cursor: pointer; text-align: center;
  background: linear-gradient(165deg, var(--bg2), var(--bg1) 58%, #fff);
  border: 1px dashed var(--line);
  transition: transform .15s, border-color .15s;
}
.stat-card.stat-action .n { font-size: var(--fs-lg); line-height: var(--lh-tight); }
.stat-card.stat-action .t { font-size: var(--fs-sm); font-weight: 700; color: var(--pri); }
/* 所有可点击的统计卡（左侧状态卡 + 右侧入口卡）悬停效果统一：蓝边 + 轻微上浮 + 阴影，标签一起变蓝 */
.stat-card[data-goto] { cursor: pointer; transition: transform .15s, border-color .15s, box-shadow .15s; }
.stat-card[data-goto]:hover { border-color: var(--pri); transform: translateY(-1px); box-shadow: 0 10px 22px rgba(60, 90, 160, .12); }
.stat-card[data-goto]:hover .t { color: var(--pri); }
.stat-card.active { outline: 2px solid var(--pri); outline-offset: 1px; }
/* 管理员账号：新增表单按内容宽度排布（不再整行拉伸） */
#admin-users .toolbar-right { flex: 1 1 100%; justify-content: flex-end; }
#admin-users .nu-form { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
@media (min-width: 721px) {
  #admin-users .toolbar-right input.input,
  #admin-users .toolbar-right select.input { width: auto; min-width: 190px; }   /* select = 新建时的「权限」下拉 */
}
.sc-all .n { color: var(--pri); } .sc-pend .n { color: var(--warn); }
.sc-wait .n { color: var(--ok); } .sc-sold .n { color: var(--sold); }
.sc-done .n { color: var(--done); } .sc-off .n { color: var(--off); }
/* 选号页：加载态 + 工具栏多筛选可换行 */
.loading-row { text-align: center; color: var(--tx2); padding: 28px 0; font-size: var(--fs-sm); }
.board-toolbar .toolbar-right { flex-wrap: wrap; }
/* ---------- 操作日志（审计留痕） ---------- */
#admin-logs .toolbar-right { flex: 1 1 100%; justify-content: flex-end; }
#admin-logs .input { width: auto; min-width: 170px; }
#admin-logs .input[type="date"] { min-width: 148px; }
/* 详情里的「旧值 → 新值」：旧值删除线、新值绿色加粗，扫一眼就知道改了什么 */
.lg-old { color: var(--tx2); text-decoration: line-through; }
.lg-arrow { color: var(--pri); margin: 0 2px; }
.lg-new { color: var(--ok); font-weight: 600; }
/* 失败的操作（如登录失败）整行淡红底，便于快速定位异常 */
tr.lg-fail td { background: var(--sold-bg); }
/* 权限分配抽屉：权限点清单（PC 两列） */
.perm-list { display: grid; grid-template-columns: 1fr; gap: 8px; }
@media (min-width: 560px) { .perm-list { grid-template-columns: 1fr 1fr; } }
.perm-item {
  display: flex; align-items: flex-start; gap: 8px; padding: 9px 12px;
  border: 1px solid var(--line); border-radius: var(--rad-sm); background: var(--surface); cursor: pointer;
}
.perm-item input { margin-top: 3px; }
.perm-item span { display: flex; flex-direction: column; gap: 2px; }
.perm-item b { font-size: var(--fs-sm); color: var(--tx); font-weight: 600; }
.perm-item i { font-style: normal; font-size: var(--fs-xs); color: var(--tx2); }

/* ---------- 🔑 管理员账号：权限**分组** + 权限列**摘要**（2026-09-21 老板）----------
   ① 权限抽屉按分组显示（每组可一键全选 / 全不选）—— 老板：「权限的编辑还不够完善」；
   ② 表格权限列只留**一个摘要胶囊**（全部权限 / N 项权限 / 无权限），悬停看明细、点击直接改
      —— 老板：「当权限细分越来越多的时候显示就会被挤压」。 */
.perm-group { margin-bottom: 10px; padding: 9px 11px; border: 1px solid var(--line); border-radius: 10px; background: var(--bg2-grad); }
.perm-group-head { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; flex-wrap: wrap; }
.perm-group-head > b { font-size: var(--fs-sm); color: var(--tx); }
.perm-group-head .hint { flex: 1 1 auto; }
.perm-group .perm-list { gap: 6px; }
.users-grid th, .users-grid td { white-space: nowrap; }         /* 单元格不换行，避免被挤成好几行 */
.users-grid td.perm-td { max-width: 160px; }                    /* 权限列封顶，别的列才不被挤 */
.users-grid .perm-pill { cursor: pointer; }
.users-grid .perm-pill[data-uop] { border-style: dashed; }       /* 可点击（能看/改权限）的用虚线区分 */

/* ---------- Tab ---------- */
/* 项目多时（如管理后台 5 个 Tab：账号运营/操作日志/管理员账号/系统管理/价格结算单）
   横向滚动而不是被压缩换行 —— 手机上不再挤成一团。
   可滚动时由 JS 加 .can-scroll，右侧渐隐提示"还能往右滑"。 */
.tabs {
  display: flex; gap: 6px;
  overflow-x: auto; overflow-y: hidden;
  -webkit-overflow-scrolling: touch;      /* iOS 惯性滚动 */
  scrollbar-width: none;                  /* Firefox：隐藏横向滚动条（有渐隐提示就够） */
  padding: 2px;                           /* 留一丢丢边距，避免激活项贴边 */
  /* ⚠️ 2026-09-21 老板反馈「Tab（📝 我要出租 / 📋 我登记的账号）和顶栏那个 👤 手机号 ▾ 会漂移溢出，
     管理页、价格结算单页也有」。
     根因：**flex/grid 子项的默认 `min-width: auto`** —— `.tabs` 虽然自己 `overflow-x:auto`，
     但作为子项时会被内容"顶"到超过容器宽度，进而把父容器乃至整页撑出横向滚动。
     补 `min-width:0` 让它老老实实待在自己的格子里、只在内部滚动。 */
  min-width: 0; max-width: 100%;
}
.tabs::-webkit-scrollbar { display: none; }
.tab {
  flex: 0 0 auto;                         /* 不压缩：文字多也不被挤扁 */
  border: 1px solid var(--line); background: var(--surface); padding: 8px 16px; border-radius: 10px;
  cursor: pointer; font-weight: 600; color: var(--tx2); font-size: var(--fs-sm); white-space: nowrap;
}
.tab.active { background: linear-gradient(135deg, var(--pri), var(--pri-2)); color: #fff; border-color: transparent; }
/* 「🧾 报价牌」是 `<a class="tab">`（外链入口，新窗口打开）：抹掉下划线、内容居中，其余与 .tab 一致 */
a.tab { display: inline-flex; align-items: center; gap: 4px; text-decoration: none; }
/* 🔀 系统管理内的**子 Tab**（2026-09-21 老板：「系统管理的页面已经非常乱了」→ 里面再按 tab 分类）：
   做成"次级"观感（小一号字 + 药丸底 + 浅底），与顶层 Tab 一眼区分开。 */
.subtabs {
  gap: 4px; margin: 0 0 12px; padding: 4px;
  background: var(--bg1-grad); border: 1px solid var(--line); border-radius: 999px;
}
.subtabs .tab {
  border: 0; background: transparent; border-radius: 999px;
  padding: 6px 13px; font-size: var(--fs-xs); font-weight: 600; color: var(--tx2);
}
.subtabs .tab.active { background: linear-gradient(135deg, var(--pri), var(--pri-2)); color: #fff; box-shadow: 0 4px 12px -5px rgba(61, 111, 224, .75); }

/* ---------- 🧮 评估参数（系统管理 → 评估参数）：按分组铺开的一套紧凑表单 ----------
   2026-09-21 老板（两轮）：① 「折叠应该是**每大项都可以折叠**，这样操作更直观」；
   ② 「**默认全部收起**才对，这个按钮的位置不对」 →
     · **每个大项**都能折叠；点**组头整行**即可，不用瞄准小三角；
     · **默认全部收起**（首屏就 6 行标题，最省地方），要改哪项点开哪项；
     · 收起时组头右侧给一行摘要（常用组报"是否偏离默认"，重参数组报口径）；
     · 「全部展开 / 收起」按钮放在**表单正上方靠右**（`.ep-tools`），紧挨它控制的内容。 */
.ep-tools { display: flex; align-items: center; justify-content: flex-end; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
.ep-group { padding: 10px 0; border-top: 1px dashed var(--line); }
.ep-group:first-child { border-top: 0; padding-top: 0; }
.ep-head {
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; width: 100%;
  margin: 0 0 8px; padding: 4px 0; text-align: left; cursor: pointer;
  border: 0; background: transparent; font: inherit; color: inherit;
}
.ep-head:hover > b { color: var(--pri); }                 /* 整行可点 → 悬停给个反馈 */
.ep-fold { flex: 0 0 auto; color: var(--tx2); font-size: var(--fs-xs); }
.ep-head > b { font-size: var(--fs-sm); color: var(--tx); }
.ep-head .hint { flex: 1 1 auto; font-size: var(--fs-xs); }
.ep-head .ep-sum { flex: 0 1 auto; color: var(--tx2); font-size: var(--fs-xs); word-break: break-word; }
.ep-fields { gap: 10px 12px; }
/* 📱 窄屏换行优化：组头说明与右侧摘要在手机上各占一行，避免挤成"半截字" */
@media (max-width: 640px) {
  .ep-head .hint { flex: 1 1 100%; }
  .ep-head .ep-sum { flex: 1 1 100%; text-align: left; }
  .ep-tools { justify-content: flex-start; }
}
/* 折叠：任何一个大项收起时都只留组头；展开时不重复显示摘要 */
.ep-group:not(.ep-open) > .ep-fields { display: none; }
.ep-group.ep-open > .ep-fields { display: grid; }
.ep-group:not(.ep-open) .ep-head > b { color: var(--tx2); }
.ep-group.ep-open .ep-sum { display: none; }
.ep-bands { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; }
.ep-row { display: grid; grid-template-columns: 1fr 1fr 1fr auto; gap: 6px; align-items: center; }
.ep-row.ep-bh { font-size: var(--fs-xs); color: var(--tx2); }
.ep-row .input { padding: 7px 9px; font-size: var(--fs-sm); }
/* 未保存改动状态行：改一项实时列出「旧 → 新」；与已保存一致时显示 ✅ */
.ep-state {
  margin-top: 12px; padding: 8px 12px; border-radius: 10px; font-size: var(--fs-sm);
  background: var(--bg2-grad); border: 1px solid var(--line); color: var(--tx2);
}
.ep-state.ep-dirty { background: #fffaf0; border-color: #f0dcb4; color: #8a5a00; }
/* 每个数字字段旁的小字：改过 → `⚠️ 旧 → 新`；没改但偏离默认 → `默认 X`；否则空 */
.ep-delta { font-style: normal; font-size: var(--fs-xs); color: var(--tx2); margin-left: 4px; }
.ep-delta.ep-chg { color: #b06a00; font-weight: 600; }
/* 分档表「被上面的档盖住」提醒（按顺序取第一条命中 → 后面被完全覆盖的档永远不会生效） */
.ep-warn {
  margin-top: 6px; padding: 6px 10px; border-radius: 8px; font-size: var(--fs-xs);
  background: #fff6e8; border: 1px solid #f0dcb4; color: #8a5a00;
}
/* 🧪 自定义试算：收起时只占一行 */
.ep-try { margin-top: 10px; }
.ep-try-box {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 10px;
  margin-top: 10px; padding: 10px; border: 1px dashed var(--line); border-radius: 10px;
}
.ep-group.ep-adv { padding: 8px 0; }                      /* 重参数组照样可折，只是默认收起 */
/* 站点设置：**字段说明单独一行**（2026-09-21 老板：「两处错位，应该要换行，站点设置有些应该要进行换行优化」）
   ⚠️ 内联的 `.hint2` 只适合"选填 / 单位"这类 2-3 字小标记；整句说明一律用 `.sf-tip`（块级、可换行）。 */
.sf-tip { display: block; margin-top: -1px; color: var(--tx2); font-size: var(--fs-xs); font-weight: 400; line-height: var(--lh-body); }
/* 同一行里的字段：标题与输入框**横向对齐**（说明放在输入框下方，不把下面的控件顶下去） */
.ep-fields > .field { align-content: start; }
/* 字段说明里的第二行（如"关掉后同一文案不再打扰"）也允许自己换行，别撑破格子 */
.sf-tip, .ep-fields .hint2 { word-break: break-word; }
/* 站点设置的图片字段（Logo / favicon / 企微二维码）：预览 + 选文件 + 恢复默认 */
.si-img { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.si-img-pv {
  height: 40px; max-width: 170px; padding: 2px; object-fit: contain;
  background: var(--surface); border: 1px solid var(--line); border-radius: 8px;
}
.si-img-ph { font-size: var(--fs-xs); color: var(--tx2); }
.si-img input[type="file"] { flex: 1 1 300px; max-width: 420px; padding: 6px 8px; font-size: var(--fs-xs); }
.ep-matrix { overflow-x: auto; margin-top: 4px; }
.ep-matrix .grid { min-width: 720px; }
.ep-matrix .input { padding: 5px 7px; font-size: var(--fs-xs); min-width: 64px; }
@media (max-width: 720px) {
  .ep-row { grid-template-columns: 1fr 1fr 1fr; }            /* 手机上「删」按钮换到下一行 */
  .ep-row > .btn { grid-column: 1 / -1; }
}
/* 渐隐提示：右边还有内容 → 右侧淡出；已经往右滚过 → 左侧也淡出（双向都会提示） */
.tabs.can-scroll {
  mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 28px), transparent 100%);
  -webkit-mask-image: linear-gradient(90deg, #000 0, #000 calc(100% - 28px), transparent 100%);
}
.tabs.can-scroll.scrolled-left {
  mask-image: linear-gradient(90deg, transparent 0, #000 28px, #000 calc(100% - 28px), transparent 100%);
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 28px, #000 calc(100% - 28px), transparent 100%);
}
.tabs.scrolled-left:not(.can-scroll) {
  mask-image: linear-gradient(90deg, transparent 0, #000 28px, #000 100%);
  -webkit-mask-image: linear-gradient(90deg, transparent 0, #000 28px, #000 100%);
}
.pill { background: rgba(255,255,255,.35); border-radius: 999px; padding: 1px 8px; font-size: var(--fs-xs); margin-left: 2px; }
.tab:not(.active) .pill { background: var(--warn-bg); color: var(--warn); }

/* ---------- 待审核卡片 / 号主「我的登记记录」卡片（两者共用，一起美化） ---------- */
.pending-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr)); gap: 14px; }
.p-card {
  background: linear-gradient(165deg, var(--bg1), var(--bg2) 58%, var(--card));
  border: 1px solid var(--line); border-left: 4px solid var(--warn);
  border-radius: var(--rad); box-shadow: var(--shadow); padding: 16px;
  display: flex; flex-direction: column; gap: 10px;
}
.p-card .p-head { display: flex; justify-content: space-between; align-items: center; }
.p-card .p-head b { font-size: var(--fs-md); }
.p-kv { display: flex; flex-wrap: wrap; gap: 4px 0; font-size: var(--fs-sm); color: var(--tx2); }
.p-kv span { margin-right: 14px; }
.p-kv b { color: var(--tx); font-weight: 600; }
/* 「钱」单独一块：暖色浅底把租期 / 租金 / 押金从一堆参数里拎出来 */
.p-money {
  display: flex; flex-wrap: wrap; gap: 8px 22px;
  padding: 10px 12px; border-radius: var(--rad-sm);
  background: linear-gradient(135deg, #fff7f2, #fff0e8);
  border: 1px solid #ffe1cd;
}
.p-money span { display: flex; flex-direction: column; gap: 1px; font-size: var(--fs-xs); color: var(--tx2); }
.p-money b { font-size: var(--fs-lg); color: var(--money); font-weight: 700; font-variant-numeric: tabular-nums; }
.p-actions { display: flex; gap: 8px; margin-top: auto; padding-top: 6px; }

/* ---------- 抽屉 ---------- */
.drawer-mask { position: fixed; inset: 0; background: rgba(30, 40, 60, .38); z-index: 90; }
.drawer {
  position: fixed; top: 0; right: 0; height: 100vh; height: 100dvh; width: min(520px, 94vw); z-index: 95;
  background: linear-gradient(160deg, var(--bg3-grad), var(--bg1-grad)); box-shadow: -12px 0 40px rgba(40, 60, 110, .18);
  display: flex; flex-direction: column; animation: slidein .22s ease;
}
@keyframes slidein { from { transform: translateX(40px); opacity: 0; } to { transform: none; opacity: 1; } }
.drawer-head { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid var(--line); }
.drawer-head h3 { font-size: var(--fs-md); }
.drawer-body { flex: 1; overflow: auto; padding: 18px 20px; display: flex; flex-direction: column; gap: 14px; }
.drawer-foot { padding: 14px 20px; border-top: 1px solid var(--line); display: flex; gap: 10px; justify-content: flex-end; }
/* ---------- 弹窗（居中）：找回 / 修改密码等小表单 ---------- */
.modal-mask { position: fixed; inset: 0; background: rgba(30, 40, 60, .38); z-index: 90; }
.modal {
  position: fixed; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 95;
  width: min(440px, 92vw); max-height: 88vh; overflow: auto;
  background: linear-gradient(160deg, var(--bg3-grad), var(--bg1-grad)); border: 1px solid var(--line);
  border-radius: var(--rad); box-shadow: var(--shadow-lg);
  display: flex; flex-direction: column; animation: popin .18s ease;
  overscroll-behavior: contain;   /* 滚到底不再带着背景页面一起滚 */
}
/* 宽弹窗（结算单编辑等长表单）：PC 上放宽到两列、头尾固定只滚中间，移动端仍单列整块滚 */
.modal.modal-lg { overflow: hidden; }
.modal-lg .modal-body { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; }
.modal-lg .modal-foot {
  flex: 0 0 auto; display: flex; gap: 10px; justify-content: flex-end;
  padding: 12px 18px var(--sp); border-top: 1px solid var(--line); background: var(--surface);
}
@media (min-width: 900px) {
  .modal.modal-lg { width: min(940px, 94vw); }
  .modal-lg .modal-body .form-grid { grid-template-columns: 1fr 1fr; }   /* PC 两列，不用来回滚 */
}
@keyframes popin { from { transform: translate(-50%, -46%) scale(.98); opacity: 0; } to { transform: translate(-50%, -50%); opacity: 1; } }
.modal-head { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; border-bottom: 1px solid var(--line); }
.modal-head h3 { font-size: var(--fs-md); }
.modal-body { padding: 16px 18px 18px; display: flex; flex-direction: column; gap: 12px; }
/* 轻量文字按钮（如「忘记密码？」）：比整条按钮轻，不抢眼 */
.link-btn { border: 0; background: transparent; color: var(--pri); font-size: var(--fs-xs); cursor: pointer; padding: 2px 4px; border-radius: 6px; }
.link-btn:hover { background: var(--bg1-grad); text-decoration: underline; }
.auth-alt { text-align: right; margin-top: 2px; }

.sum-box { background: var(--surface); border: 1px dashed var(--line); border-radius: 12px; padding: 12px 14px; font-size: var(--fs-sm); color: var(--tx2); line-height: var(--lh-loose); }
.sum-box b { color: var(--tx); }
.calc-note { font-size: var(--fs-xs); color: var(--tx2); background: var(--bg1-grad); border-radius: 8px; padding: 8px 10px; }

/* ---------- 在线评估展示 ---------- */
.eval-preview, .eval-card {
  background: linear-gradient(135deg, #eef4ff, #f3efff);
  border: 1px solid #dfe7f8; border-radius: 12px;
}
/* ⚠️ 2026-09-21 三次调整（老板："体验还不是特别好，还有没有更好的方案"）→ 定稿为**极简收益卡**：
   · 只突出**一个核心数字「预计到手」**（大号绿色），其余收进「明细 ▾」；
   · 删掉「综合得分 / 比例 / 总价预估」（内部术语 + 重复项）；
   · 依然**不用 sticky**（前面踩过坑：吸底会遮挡字段），保持在表单顶部、纯文档流。 */
.eval-preview {
  padding: 12px 14px; margin-bottom: 12px;
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
}
.eval-preview .ep-main { flex: 1 1 auto; min-width: 0; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.eval-preview .ep-main > span { color: var(--tx2); font-size: var(--fs-sm); }
.eval-preview .ep-main > b { color: var(--ok); font-size: 30px; font-weight: 800; line-height: 1; font-variant-numeric: tabular-nums; }
.eval-preview .ep-main > small { color: #98a6bd; font-size: var(--fs-xs); }
.eval-preview .ep-toggle {
  flex: 0 0 auto; padding: 5px 12px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--line); background: #fff; color: var(--pri);
  font-size: var(--fs-xs); font-weight: 700; transition: all .15s;
}
.eval-preview .ep-toggle:hover { border-color: var(--pri); }
.eval-preview .ep-detail {
  flex: 1 1 100%; margin-top: 10px; padding-top: 10px; border-top: 1px dashed rgba(31, 58, 120, .16);
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px 10px;
}
.eval-preview .ep-r { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.eval-preview .ep-r > span { font-size: var(--fs-xs); color: var(--tx2); }
.eval-preview .ep-r > b { color: var(--pri); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.eval-preview .ep-r > b small { display: block; color: #98a6bd; font-size: 10px; font-weight: 400; }
.eval-preview .ep-note { grid-column: 1 / -1; color: #98a6bd; font-size: 10px; }

/* 表单顶部的流程说明（打消"要填多久 / 要不要钱 / 提交后谁做什么"的疑问） */
.eval-intro { margin-bottom: 12px; padding: 0 2px; }
.eval-intro b { display: block; color: var(--tx); font-size: var(--fs-md); margin-bottom: 3px; }
.eval-intro span { color: var(--tx2); font-size: var(--fs-xs); line-height: var(--lh-body); }
.eval-intro span b { display: inline; font-size: inherit; color: var(--pri); margin: 0; }

/* 字段标签后面的「选填」小字（2026-09-21）：比必填星号 * 更需要"存在感低"，
   所以做成灰色小号、不加粗 —— 一眼知道这栏可以跳。 */
.hint2 { margin-left: 5px; color: #98a6bd; font-size: var(--fs-xs); font-weight: 400; font-style: normal; }
/* （已停用）.f-tip 是上一版"字段下方说明行"，因老板要求把说明挪进输入框 placeholder，现已不再使用；
   保留定义以防别处引用，新代码请用 placeholder 或 .hint2。 */
.f-tip { display: block; margin-top: 3px; color: #98a6bd; font-size: var(--fs-xs); line-height: 1.45; }
/* 预估明细里的强调（"越小越值钱"）：<u> 改绿色、虚下划线，不用默认的实线黑字 */
.eval-preview .ep-r > b u { text-decoration: underline dashed; text-decoration-color: var(--ok); text-underline-offset: 2px; color: var(--ok); font-style: normal; }
.eval-card { margin: 6px auto 16px; max-width: 460px; text-align: left; padding: 14px 20px; display: flex; flex-direction: column; gap: 7px; font-size: var(--fs-sm); color: var(--tx2); }
.eval-line b { color: var(--pri); font-size: var(--fs-md); }
.eval-line .money { color: var(--money); }
.eval-detail { font-size: var(--fs-xs); color: var(--tx2); margin-left: 8px; }
.eval-row { background: var(--bg1-grad); border-radius: 8px; padding: 6px 10px; }
/* 「号主到手」重点行：绿色高亮，最终到手金额一眼可见 */
.eval-line.pay-line { background: var(--ok-bg); border: 1px solid #c9ebd9; border-radius: 10px; padding: 8px 10px; }
.eval-line.pay-line b.money { font-size: var(--fs-lg); color: var(--ok); }
.eval-line.pay-line .eval-detail { color: #4c7f63; }

/* ---------- 提交成功面板（2026-09-20 重做）----------
   原来是一串居中小字 + 6 行密密麻麻的 eval-line，编号和金额全埋在文字里、毫无层次。
   现在：编号做成大号渐变徽标，下面分成「评估概况 / 预估价钱」两张结构卡，到手金额单独高亮。 */
.success-box { text-align: center; padding: 34px 24px 28px; }
.success-icon {
  width: 64px; height: 64px; margin: 0 auto 12px; border-radius: 50%;
  display: grid; place-items: center; font-size: 30px; line-height: var(--lh-tight);
  background: linear-gradient(135deg, #e8f8ef, #d3f2e2); box-shadow: 0 10px 22px -12px rgba(24, 160, 88, .7);
}
.success-box h2 { font-size: var(--fs-lg); font-weight: 800; margin-bottom: 4px; }
.success-tip { color: var(--tx2); font-size: var(--fs-sm); }
.success-id {
  display: inline-block; margin: 8px 0 14px; padding: 6px 22px;
  font-size: var(--fs-2xl); font-weight: 800; letter-spacing: 1px;
  font-variant-numeric: tabular-nums; border-radius: var(--rad);
  /* ⚠️ 这里刻意用「浅底 + 实色大字」而不是渐变文字：渐变文字要 background-clip:text，
      和卡片浅底要的 padding-box 是互斥的，同一条规则里写会互相打架。 */
  color: var(--pri);
  background: linear-gradient(135deg, rgba(61, 111, 224, .12), rgba(138, 92, 246, .13));
  border: 1.5px solid rgba(61, 111, 224, .22);
  box-shadow: 0 8px 18px -12px rgba(61, 111, 224, .8);
}
/* 结构卡：内部一律左对齐（外层是居中的 hero 文案，卡片里再居中就没法读了） */
/* ---------- 账号卡片（我的登记记录 / 管理端待上架，2026-09-20 重做）----------
   原来是一长串 p-kv 平铺：字段多、没层次、找个数字要一行行扫。
   现在按「账号基础 / 装备与战绩 / 系统预估（官方定价） / 皮肤」分区，
   每区一个浅色头 + 字段网格（标签在上、值在下，三列排布），扫一眼就够。 */
.p-card { padding: 11px; border-radius: var(--rad); }
.p-head { align-items: center; gap: 8px; margin-bottom: 6px; }
.p-head b { font-size: var(--fs-md); }
.p-phone {
  margin-bottom: 8px; padding: 6px 10px; border-radius: 10px;
  background: linear-gradient(135deg, #eef4ff, #e8f0ff); border: 1px solid #d8e4fb;
  color: var(--pri); font-size: var(--fs-sm); font-weight: 600;
}
.p-phone b { font-variant-numeric: tabular-nums; }
/* 分区：浅色头 + 同色系浅底，四套色与新建结算单的 .form-sec 保持同一语言 */
.p-sec { margin-bottom: 7px; padding: 6px 9px 7px; border-radius: 11px; border: 1px solid transparent; }
.p-sec-t { margin-bottom: 5px; color: var(--tx); font-size: var(--fs-xs); font-weight: 700; }
.p-sec.s1 { background: linear-gradient(135deg, #f8fbff, #eef5ff); border-color: #dbe8fb; }
.p-sec.s1 .p-sec-t { color: #3d6fe0; }
.p-sec.s2 { background: linear-gradient(135deg, #f8fdfa, #edf9f2); border-color: #d5ecdf; }
.p-sec.s2 .p-sec-t { color: #14915c; }
.p-sec.s3 { background: linear-gradient(135deg, #fffcf9, #fff4ee); border-color: #f4dcd1; }
.p-sec.s3 .p-sec-t { color: #c9522f; }
.p-sec.s4 { background: linear-gradient(135deg, #fbf8ff, #f3eeff); border-color: #e3d9fb; }
.p-sec.s4 .p-sec-t { color: #7a4ee0; }
/* 字段网格：标签小字在上、值加粗在下；手机上自动降到两列 */
.p-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 5px 8px; }
/* 字段项：标签 + 值**横排**（标签在前、值在后）—— 竖排（上下两行）一个字段要占 ~36px，
   横排只要 ~20px，18 个字段能省下近 300px 的卡片高度（老板反馈卡片太高）。 */
.p-i { display: flex; align-items: baseline; gap: 5px; min-width: 0; }
.p-i i { color: var(--tx2); font-size: var(--fs-xs); font-style: normal; white-space: nowrap; }
.p-i b {
  color: var(--tx); font-size: var(--fs-sm); font-weight: 700;
  overflow-wrap: anywhere;
}
.p-i b.money { color: var(--money); }
/* 到手金额：单独一条高亮（整个卡片最该看到的数字） */
.p-net {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin-top: 7px; padding: 7px 10px; border-radius: 10px;
  background: linear-gradient(135deg, rgba(61, 111, 224, .1), rgba(138, 92, 246, .06));
  border: 1px solid rgba(61, 111, 224, .2);
}
.p-net span { color: var(--tx); font-size: var(--fs-sm); font-weight: 700; }
.p-net small { display: block; margin-top: 1px; color: var(--tx2); font-size: var(--fs-xs); font-weight: 400; }
.p-net b { color: var(--pri); font-size: var(--fs-lg); font-weight: 800; font-variant-numeric: tabular-nums; }
.p-skins2 { color: var(--tx); font-size: var(--fs-sm); font-weight: 600; overflow-wrap: anywhere; }
/* 分区里的小灰字说明（抽屉的公式说明、押金外加提示等） */
.p-tip { margin-top: 6px; color: var(--tx2); font-size: var(--fs-xs); line-height: var(--lh-body); }
.p-tip b { color: var(--tx); }
.p-note {
  margin-bottom: 9px; padding: 8px 11px; border-radius: 10px;
  background: var(--warn-bg); border: 1px solid #f0dfb6; color: #9a6a12; font-size: var(--fs-xs);
}
.p-time {
  display: flex; flex-wrap: wrap; gap: 4px 14px;
  padding-top: 8px; border-top: 1px dashed var(--line);
  color: #98a6bd; font-size: var(--fs-xs);
}

/* ---------- 用户区下拉菜单（管理端 / 结算单 / 评估页共用，2026-09-20）----------
   原来页头把「👤 手机号 / 📋 我的登记记录 / 🔑 修改密码 / 退出登录」全摊平排开，
   信息重复又占宽度；现在收成一个「👤 谁 ▾」按钮，点开才是这些操作。 */
.user-menu { position: relative; flex: 0 0 auto; }
.user-btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: 999px; cursor: pointer;
  border: 1px solid var(--line); background: var(--card); color: var(--tx);
  font-size: var(--fs-sm); font-weight: 600; line-height: var(--lh-tight);
  transition: border-color .15s, background .15s;
}
.user-btn:hover { border-color: var(--pri); background: var(--bg1-grad); }
.user-btn .um-name { max-width: 130px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.user-btn .um-caret { color: var(--tx2); font-size: 10px; }
.user-pop {
  position: absolute; right: 0; top: calc(100% + 6px); z-index: 60;
  min-width: 190px; padding: 6px; border-radius: 12px;
  background: var(--surface); border: 1px solid var(--line);
  box-shadow: var(--shadow-lg);
}
.user-pop .um-item {
  display: flex; align-items: center; gap: 8px; width: 100%;
  padding: 9px 11px; border: 0; border-radius: 9px; background: transparent;
  color: var(--tx); font-size: var(--fs-sm); text-align: left; cursor: pointer;
}
.user-pop .um-item:hover { background: var(--bg1-grad); color: var(--pri); }
.user-pop .um-item.danger:hover { background: var(--sold-bg); color: var(--sold); }
.user-pop .um-sep { height: 1px; margin: 5px 4px; background: var(--line); }
.user-pop .um-tip { padding: 6px 11px 3px; color: var(--tx2); font-size: var(--fs-xs); }

/* ---------- 📊 驾驶舱（后台「系统管理」之后的入口，2026-09-20 新增；同日大改）----------
   大改要点：老板"数据展现过于简单，只能看个基础"→ 加图表。
   四种图形（折线 / 柱状 / 环形 / 条形）全部**手绘 SVG + CSS**，不引第三方库。
   配色统一走 --ck-1..6（与全站主色同族，避免这页出现"外来的颜色"）。 */
:root { --ck-1: #3d6fe0; --ck-2: #6f8ff0; --ck-3: #8a5cf6; --ck-4: #f0a04b; --ck-5: #38c47e; --ck-6: #e2725b; }

/* —— KPI 大数字条（6 个，窄屏自动换列） —— */
.ck-kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(158px, 1fr)); gap: 10px; margin-bottom: 12px; }
.ck-kpi {
  position: relative; overflow: hidden;
  padding: 12px 14px 14px; border-radius: var(--rad);
  background: linear-gradient(165deg, #fff, var(--bg1) 68%, var(--bg2));
  border: 1px solid var(--line); box-shadow: var(--shadow);
}
.ck-kpi-t { display: block; color: var(--tx2); font-size: var(--fs-xs); }
.ck-kpi-v { display: block; margin: 3px 0 2px; color: var(--pri); font-size: 26px; font-weight: 800; line-height: 1.1; font-variant-numeric: tabular-nums; }
.ck-kpi-v i { margin-left: 3px; font-size: var(--fs-sm); font-style: normal; font-weight: 600; color: var(--tx2); }
.ck-kpi-s { display: block; color: #98a6bd; font-size: var(--fs-xs); line-height: 1.45; }
.ck-kpi-money .ck-kpi-v { color: var(--money); }
/* 迷你趋势线：贴在卡片右下角（纯装饰，不响应鼠标） */
.ck-spark { position: absolute; right: 0; bottom: 0; width: 96px; height: 30px; opacity: .5; pointer-events: none; }
.ck-spark polygon { fill: rgba(61, 111, 224, .16); }
.ck-spark polyline { fill: none; stroke: var(--pri); stroke-width: 1.6; }

/* —— 图表卡网格 ——
   ⚠️ 固定 3 列：6 张卡正好排成 2 行。**不要**用 `auto-fit` 配 `span 2` ——
   宽卡通 "放不下就整体换行" 会让后面留出整块空洞（实测出现过一行只有 1 张卡、
   右侧大片空白）。固定列数在任何宽度下都排得整齐。 */
.ck-charts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
.ck-card { padding: 12px 14px 14px; }
@media (max-width: 1180px) { .ck-charts { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.ck-card-h { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 10px; }
.ck-card-h h4 { font-size: var(--fs-sm); font-weight: 800; color: var(--tx); }
.ck-card-h span { color: var(--tx2); font-size: var(--fs-xs); }
.ck-empty { padding: 22px 0; text-align: center; color: var(--tx2); font-size: var(--fs-sm); }

/* —— 折线图（登记趋势） —— */
.ck-line { display: block; width: 100%; height: 168px; }
.ck-line polygon { fill: rgba(61, 111, 224, .12); }
.ck-line polyline { fill: none; stroke: var(--pri); stroke-width: 2.2; stroke-linejoin: round; }
.ck-gl { stroke: var(--line); stroke-dasharray: 3 4; }
.ck-ax { fill: #9aa8bf; font-size: 10px; }
.ck-dot { fill: #fff; stroke: var(--pri); stroke-width: 2; }

/* —— 柱状图（上架节奏） —— */
.ck-bars { display: flex; align-items: flex-end; gap: 10px; height: 168px; padding-top: 15px; }
.ck-bar-i { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; height: 100%; }
.ck-bar-v { color: var(--tx2); font-size: var(--fs-xs); font-weight: 700; font-variant-numeric: tabular-nums; }
.ck-bar-t { flex: 1 1 auto; width: 100%; display: flex; align-items: flex-end; justify-content: center; }
.ck-bar-t i { display: block; width: 62%; max-width: 46px; border-radius: 6px 6px 2px 2px; background: linear-gradient(180deg, var(--pri-2), var(--pri)); }
.ck-bar-k { margin-top: 5px; color: var(--tx2); font-size: var(--fs-xs); white-space: nowrap; }

/* —— 横向条形（保险档位 / 操作类型） —— */
.ck-dist { display: grid; gap: 9px; }
.ck-dist-i { display: grid; grid-template-columns: 74px 1fr auto; align-items: center; gap: 9px; }
.ck-dist-k { color: var(--tx2); font-size: var(--fs-xs); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ck-dist-t { display: block; height: 8px; border-radius: 999px; background: var(--bg2-grad); overflow: hidden; }
.ck-dist-t i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--pri), var(--pri-3)); }
.ck-dist-v { color: var(--tx); font-size: var(--fs-xs); font-weight: 700; font-variant-numeric: tabular-nums; white-space: nowrap; }
.ck-dist-v small { margin-left: 4px; color: #9aa8bf; font-weight: 600; }

/* —— 环形图 + 图例（状态分布 / 服务器分布） —— */
.ck-donut-w { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.ck-donut { flex: 0 0 auto; width: 140px; height: 140px; }
.ck-arc { fill: none; stroke: var(--ck-1); transition: opacity .15s; }
.ck-arc:hover { opacity: .7; }
.ck-donut-n { fill: var(--tx); font-size: 21px; font-weight: 800; font-variant-numeric: tabular-nums; }
.ck-donut-t { fill: #9aa8bf; font-size: 10px; }
/* 同一组色板：SVG 圆环用 stroke，图例小方块用 background（两个属性都写上，各取所需） */
.ck-c1 { stroke: var(--ck-1); background: var(--ck-1); }
.ck-c2 { stroke: var(--ck-2); background: var(--ck-2); }
.ck-c3 { stroke: var(--ck-3); background: var(--ck-3); }
.ck-c4 { stroke: var(--ck-4); background: var(--ck-4); }
.ck-c5 { stroke: var(--ck-5); background: var(--ck-5); }
.ck-c6 { stroke: var(--ck-6); background: var(--ck-6); }
.ck-legend { flex: 1 1 132px; min-width: 0; display: grid; gap: 6px; }
.ck-legend li { display: flex; align-items: center; gap: 7px; font-size: var(--fs-xs); color: var(--tx2); }
.ck-legend li i { flex: 0 0 auto; width: 9px; height: 9px; border-radius: 3px; }
.ck-legend li span { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ck-legend li b { color: var(--tx); font-variant-numeric: tabular-nums; }
.ck-legend li small { color: #9aa8bf; }

/* —— 四个明细盘 —— */
.ck-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 12px; }
.ck-sec { margin-bottom: 0; }
.ck-rows { display: grid; gap: 2px; }
.ck-row { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 3px 0; font-size: var(--fs-sm); color: var(--tx2); }
.ck-row b { color: var(--tx); font-weight: 700; font-variant-numeric: tabular-nums; }
.ck-row + .ck-row { border-top: 1px dashed var(--line); }

/* ---------- 📊 驾驶舱 · 第二版（2026-09-20，老板否掉第一版后重做）----------
   ⚠️ 第三版（同日稍后）起，上面那组 .ck-line / .ck-bars / .ck-donut / .ck-legend /
      .ck-c1..6 **重新启用了** —— 老板反馈"现在数据很直观，但上一版的图表很不错"。
      关键区分：他否掉的是**内容**（操作类型/保险档位那种技术统计），不是**形式**。
      所以图表只用于**经营指标**：登记趋势 / 上架节奏 / 平台收入 / 账号状态。
      （.ck-kpis / .ck-kpi / .ck-spark 仍停用，第三版没用它们。）

   ✅ 第二版原则：**能看懂的数字优先**。老板勾的是「钱的流水 + 待办与库存」，
      所以几乎不做图形了 —— 待办用大数字 + 可点击、钱用"本月/累计"两列对照、
      库存用"挂了多久"排出来的列表。图只留了一条（租期偏好）用于看分布。 */

/* —— ① 待办卡：大数字，整卡可点，点了直接去处理 —— */
.ck-todos { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
.ck-todo-c {
  display: block; padding: 14px 16px; border-radius: var(--rad); text-decoration: none;
  background: linear-gradient(165deg, #fff, var(--bg1) 70%, var(--bg2));
  border: 1px solid var(--line); box-shadow: var(--shadow);
  transition: transform .15s, border-color .15s, box-shadow .15s;
}
.ck-todo-c:hover { transform: translateY(-2px); border-color: var(--pri); box-shadow: var(--shadow-lg); }
.ck-todo-t { display: block; color: var(--tx2); font-size: var(--fs-xs); }
.ck-todo-n { display: block; margin: 2px 0 3px; font-size: 30px; font-weight: 800; line-height: 1.05; font-variant-numeric: tabular-nums; color: var(--notice); }
.ck-todo-s { display: block; color: #98a6bd; font-size: var(--fs-xs); }
/* 没有待办 → 整卡压灰（一眼看出"这块没事"），数字也不再告警色 */
.ck-todo-c.is-zero { opacity: .6; }
.ck-todo-c.is-zero .ck-todo-n { color: var(--tx2); }

/* —— 两列并排（今日/本月 与 租期偏好） —— */
.ck-row2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-bottom: 12px; }
.ck-card { padding: 14px 16px; }
.ck-card.ck-wide { margin-bottom: 12px; }

/* —— 三列对照表（左标签 + 本月 + 累计）—— 钱和新增都用它，口径一目了然 —— */
.ck-cmp { display: grid; }
.ck-cmp-h, .ck-cmp-r { display: grid; grid-template-columns: 1fr 86px 86px; align-items: baseline; gap: 8px; padding: 5px 0; }
.ck-cmp-h { border-bottom: 1px solid var(--line); }
.ck-cmp-h b { color: var(--tx2); font-size: var(--fs-xs); font-weight: 700; text-align: right; }
.ck-cmp-r { font-size: var(--fs-sm); color: var(--tx2); }
.ck-cmp-r + .ck-cmp-r { border-top: 1px dashed var(--line); }
.ck-cmp-r b { color: var(--tx); font-weight: 700; text-align: right; font-variant-numeric: tabular-nums; }

/* —— 分区标题 —— 老板要"顺序分清晰、一眼看到想要的"：
   给每一块加**编号 + 块名 + 一句话说明**，扫一眼就知道这页有哪几块、各看什么。
   编号用渐变圆点（与评估页 .form-sec 的编号语言一致，全站观感统一）。 */
.ck-h { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; margin: 6px 0 10px; }
.ck-h:not(:first-child) { margin-top: 18px; }
.ck-h i {
  flex: 0 0 auto; width: 20px; height: 20px; border-radius: 50%;
  display: grid; place-items: center; align-self: center;
  background: linear-gradient(135deg, var(--pri), var(--pri-2)); color: #fff;
  font-size: 11px; font-weight: 800; font-style: normal;
}
.ck-h b { font-size: var(--fs-md); font-weight: 800; color: var(--tx); letter-spacing: .3px; }
.ck-h span { color: #98a6bd; font-size: var(--fs-xs); }

/* —— 钱的等式条：让"钱怎么走的"一眼看懂（比罗列数字清楚得多）—— */
.ck-eq {
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  margin-top: 10px; padding: 10px 12px; border-radius: 10px;
  background: var(--bg2-grad); border: 1px solid var(--line);
  font-size: var(--fs-sm); color: var(--tx); font-variant-numeric: tabular-nums;
}
.ck-eq em { color: var(--pri); font-style: normal; font-weight: 800; }

/* —— 钱：主数字（平台已赚 / 待付号主 / 待退玩家 / 代收押金）—— */
.ck-money { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; margin-bottom: 12px; }
.ck-money-main { padding: 10px 12px; border-radius: 10px; background: var(--bg2-grad); border: 1px solid var(--line); }
.ck-money-main span { display: block; color: var(--tx2); font-size: var(--fs-xs); }
.ck-money-main b { display: block; margin: 2px 0 1px; color: var(--money); font-size: 22px; font-weight: 800; font-variant-numeric: tabular-nums; }
.ck-money-main small { color: #98a6bd; font-size: var(--fs-xs); }
/* 要"付出去"的钱用暖色：待付号主 / 待退玩家 —— 一眼分得清"赚进来的"和"要付出去的" */
.ck-money-main.ck-out b { color: var(--warn); }
/* 待结算条：有单时左边亮暖色，一眼看到"有活儿" */
.ck-pending {
  display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-top: 10px; padding: 9px 12px;
  border-radius: 10px; background: var(--bg2-grad); border: 1px solid var(--line); border-left: 3px solid var(--ok);
}
.ck-pending.has { border-left-color: var(--warn); }
.ck-pending b { color: var(--tx); font-size: var(--fs-sm); }
.ck-pending span { color: var(--tx2); font-size: var(--fs-xs); }
.ck-note { margin-top: 8px; color: #98a6bd; font-size: var(--fs-xs); line-height: var(--lh-body); }

/* —— 库存预警：挂得最久还没租出去的账号 —— */
.ck-stale { display: grid; }
.ck-stale-r { display: grid; grid-template-columns: 78px 44px 1fr auto; align-items: baseline; gap: 9px; padding: 6px 0; font-size: var(--fs-sm); color: var(--tx2); }
.ck-stale-r + .ck-stale-r { border-top: 1px dashed var(--line); }

/* —— 驾驶舱 · 手机端 ——
   ⚠️ **必须放在上面这些桌面规则之后**：一开始我把这段写进了文件前部那个
   `@media (max-width:720px)` 块里（第 487 行），结果被后面驾驶舱的桌面规则
   原样盖掉了 —— 两边都是单类选择器，CSS 只按"谁在后面"决定胜负，媒体查询
   并不天然优先。症状就是手机上「今日/本月」仍是 2 列、标签被挤成一字一行。 */
@media (max-width: 720px) {
  .ck-row2 { grid-template-columns: minmax(0, 1fr); gap: 10px; }
  .ck-cmp-h, .ck-cmp-r { grid-template-columns: minmax(0, 1fr) 62px 62px; }
  .ck-money { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ck-money-main b { font-size: 18px; }
  .ck-todo-c { padding: 10px 12px; }
  .ck-todo-n { font-size: 22px; }
  .ck-todo-s { display: none; }                 /* 省掉"去处理 →"，数字够看 */
  .ck-stale-r { grid-template-columns: 68px 40px minmax(0, 1fr); gap: 7px; }
  .ck-stale-r i { grid-column: 1 / -1; }        /* "已挂 N 天"折到下一行 */
  .ck-dist-i { grid-template-columns: 56px minmax(0, 1fr) auto; gap: 7px; }
  /* 图表（第三版加回）：手机端一律单列 + 高度收一档 */
  .ck-charts { grid-template-columns: minmax(0, 1fr); }
  .ck-line, .ck-bars { height: 140px; }
  .ck-donut { width: 116px; height: 116px; }
  .ck-donut-w { gap: 10px; }
}

/* —— 选号页工具栏：手机端整条隐藏（PC 保留）——
   老板 2026-09-20：「『共 N 条 / 排序 / 搜索』这个元素在手机端不显示，仅在 PC 显示，
   占用了手机的显示空间。」手机屏窄，这条（条数 + 排序 + 搜索框）横着占满一行还常换行，把列表往下压。
   ⚠️ 必须写在文件**靠后**：`.board-toolbar` 的桌面规则在 200 多行，
      @media 不天然优先，只按"谁写在后面"决定胜负（这个坑之前踩过一次）。
   只针对选号页的 `.board-toolbar`，后台 / 结算单的 `.toolbar` 不受影响。 */
@media (max-width: 720px) {
  .board-toolbar { display: none; }
}
.ck-stale-r b { color: var(--tx); font-weight: 700; font-variant-numeric: tabular-nums; }
.ck-stale-r i { color: var(--notice); font-style: normal; font-size: var(--fs-xs); white-space: nowrap; }

/* ---------- 📌 编号列（含状态）进一步压缩（2026-09-21）----------
   老板：「#20519 待出租 显示还是很占面积」+「手机端滑动时应该收起待出租的字样」。
   ① 不滑动时：徽标瘦身 + 该列左右内边距收窄（133px → 约 118px）；
   ② 横向滑动时（JS 给 .table-wrap 加 .pin-scrolled）：**隐藏徽标**，只剩 `#20519`（约 62px），
      滚回最左自动恢复 —— 钉住列越窄，滑动时能看到的列越多。 */
.grid td.idc, .grid th.idc { padding-left: 5px; padding-right: 5px; }
.idc .id-num { letter-spacing: -.2px; }
.idc .badge { padding: 1px 5px; margin-left: 2px; }
.table-wrap.pin-scrolled .grid tbody .idc .badge { display: none; }

/* 📱 手机端再把状态收成小色点（2026-09-21 老板二次反馈：「手机端的时候还是很宽」）：
   390px 屏上 121px 的编号列占了近 1/3，缩成 8px 色点后约 70px。
   颜色沿用 status 的语义色（绿=可出租 / 黄=待上架），**文字仍在 DOM 里**（无障碍朗读、复制粘贴都在）。 */
@media (max-width: 640px) {
  .table-wrap .grid tbody .idc .badge {
    width: 8px; height: 8px; padding: 0; margin-left: 4px; border-radius: 50%;
    font-size: 0; line-height: 0; overflow: hidden; vertical-align: middle;
    background: currentColor;   /* 原来背景是浅色底、吃不清；改用状态实色 */
  }
}

/* ---------- 📏 长文本列窄化（2026-09-21）----------
   选号页"状态和皮肤占太多显示面积"：`.grid` 是 `white-space: nowrap`，谁字多谁把表撑宽
   （实测 备注 260px / 皮肤 171px，全表 1529px > 可视 1238px）。
   现在皮肤只显示「N 个」、备注只显示 📝，全文走 hover(title) 或**点击弹窗**（手机没有 hover）。
   ⚠️ 2026-09-21 老板反馈：「没有提醒说展开查看的指引，很多人以为就没更多详细信息了，感觉信息不全」
      → 光靠浅灰虚线太弱。现在做成**蓝色链接样式 + 「▾」箭头 + 虚线下划线**，一眼看出"能点开"；
        另在表格下方加一行 `💡` 文案（见 index.html 的 .board-tip）。 */
.cell-tap {
  cursor: pointer; color: var(--pri); font-weight: 600;
  border-bottom: 1px dashed currentColor; white-space: nowrap;
}
.cell-tap::after { content: ' ▾'; font-size: .72em; opacity: .75; }   /* 箭头 = "这里还能展开" */
.cell-tap:hover { color: var(--pri-2); border-bottom-style: solid; }
/* 表格上方的可点提示（2026-09-21 老板第二轮：「这个提示不明显，应该想个办法」）
   ⚠️ 原来挂在 <main> 最底部 + 灰小字 → 玩家基本看不到。现在：① 挪到**表格正上方**；
   ② 做成浅蓝信息条（左侧色条 + 图标，一眼看出是"提示"而不是脚注）；
   ③ **点过一次「▾」后自动收起**（common.js 写 localStorage），老玩家不再被打扰。 */
.board-tip {
  display: flex; align-items: flex-start; gap: 8px;
  margin: 0 0 10px; padding: 9px 12px;
  background: linear-gradient(90deg, #eef3ff, #f8faff);
  border: 1px solid #dbe5fb; border-left: 3px solid var(--pri);
  border-radius: 10px; font-size: var(--fs-xs); line-height: 1.55; color: var(--tx);
}
.board-tip.hide { display: none; }
.board-tip b { color: var(--pri); font-weight: 700; }
.board-tip .tip-ico { flex: 0 0 auto; font-size: var(--fs-sm); line-height: 1.3; }
/* 颜色说明只在手机端显示（桌面端编号列本来就写着"待出租"，不用再解释圆点） */
.tip-m { display: none; }
@media (max-width: 640px) { .tip-m { display: inline; } }

/* ---------- 🃏 结算单卡片（2026-09-21 老板：「结算单列表应该要卡片化管理才高效」）----------
   原来是 16 列 / min-width:1420px 的表格，手机上要横向滑 950px，滑过去连单号都看不见。
   现在**电脑手机都是卡片**（老板选「全部换成卡片」），按**付款视角**排：
   金额最大最显眼 → 紧跟"打给谁" → 明细降为小字。 */
/* ⚠️ `minmax(min(360px, 100%), 1fr)`：容器比 360px 还窄时（手机/窄窗口）卡片**不会溢出父容器**，
   否则 360 的最小宽会把卡片顶出面板外（老板 2026-09-21：「卡片挤压了外边框」）。 */
.settle-cards { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(min(360px, 100%), 1fr)); align-items: stretch; }
/* ⚠️ 空态提示 `.empty` 作为 grid 的**单个格子**只会占一列，`text-align:center` 也只在那一列内居中
   → 视觉上"靠左"（老板 2026-09-21：「文案要居中显示」）。让它横跨整行即可。 */
.settle-cards > .empty { grid-column: 1 / -1; }
/* ⚠️ 卡片用 flex 纵向排列 + `.sc-acts { margin-top:auto }`：同一行卡片**高度一致、按钮贴着底边**，
   否则内容多的卡片会把整行撑高、另一张底部空一块（老板 2026-09-21：「卡片错位明显」）。 */
.sc { background: var(--surface); border: 1px solid var(--line); border-radius: 14px; padding: 11px 14px;
  box-shadow: 0 2px 10px rgba(30, 45, 80, .05); display: flex; flex-direction: column; }
.sc-head { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-bottom: 8px; }
.sc-id { font-size: var(--fs-md); }
.sc-acct { margin-left: auto; font-size: var(--fs-xs); color: var(--tx2); white-space: nowrap; }
.sc .row-check { width: 18px; height: 18px; }
.tag-pay { background: #e8f1ff; color: var(--pri); }
/* 付款行：**一行装完**（标签 · 金额 · 收款人），不再上下堆两行 —— 信息密度高一半 */
.sc-pay { display: flex; align-items: center; gap: 10px; padding: 7px 10px; border-radius: 10px;
  background: linear-gradient(90deg, #f4f8ff, #fbfdff); border: 1px solid #e6eefb; margin-bottom: 6px; }
.sc-pay.bad { background: var(--warn-bg); border-color: #f0dcc0; }   /* 收款信息不齐 → 整行告警 */
.sc-tag { flex: 0 0 62px; font-size: var(--fs-xs); color: var(--tx2); font-weight: 700; white-space: nowrap; }
.sc-amt { flex: 0 0 auto; font-size: var(--fs-md); color: var(--money); font-variant-numeric: tabular-nums; letter-spacing: -.4px; }
.sc-acc { flex: 1 1 auto; min-width: 0; font-size: var(--fs-xs); color: var(--tx2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sc-acc em { font-style: normal; color: var(--tx); font-weight: 700; }
.sc-warn { color: var(--warn); font-weight: 700; }
.sc-none { color: var(--tx2); }          /* 「无需支付」（金额 0 的那一行，不报缺信息） */
.sc-amt.mute { color: var(--tx2); font-weight: 600; }
/* 🔧 结算单列表工具栏（2026-09-21 老板：「位置错乱的」）——
   修前是「全选 / 全部 / 待结算 / 已结算 / 对账表 / 付款表」各自掉一行，
   原因是三组东西挤在同一个 flex 里、窄屏各自换行。现在**明确分三组**：
     [全选]（固定不缩） · [筛选 chips]（可换行、吃掉剩余宽） · [导出按钮]（靠右、窄屏单独一行） */
#panel-list .toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; }
#panel-list .toolbar > .chk-inline { flex: 0 0 auto; }
#panel-list .chips { display: flex; flex-wrap: wrap; gap: 6px; flex: 1 1 auto; min-width: 0; }
#panel-list .toolbar-right { display: flex; flex-wrap: wrap; gap: 6px; margin-left: auto; flex: 0 0 auto; }
/* 🔴 2026-09-21 修「卡片左右两边被挤压」的真因：
   面板 `#panel-list` 是 `.card`，而 `.card` **本身没有任何内边距**（只有边框/圆角/阴影）；
   `.toolbar` 自带 `12px 14px` 所以工具栏内容是缩进的，但 `#cards` / `#pager` 从没补过内边距 →
   实测卡片左/右缘距面板边框只有 **1px**（就是边框本身），整排卡片被"夹"在面板左右边上。
   这里把卡片容器与分页补齐与工具栏一致的水平留白，让三者左缘对齐成一条竖线。 */
#panel-list #cards { padding: 0 14px; }
#panel-list #pager { padding: 16px 14px 0; }
@media (max-width: 640px) {
  #panel-list .toolbar { padding: 7px 9px; }
  #panel-list #cards { padding: 0 9px; }      /* 与手机上工具栏 7px 9px 的水平留白对齐 */
  #panel-list #pager { padding: 14px 9px 0; }
  #panel-list .toolbar-right { margin-left: 0; flex: 1 1 100%; }   /* 手机上按钮组独占一行，不再和筛选挤 */
  #panel-list .chip { padding: 3px 9px; font-size: var(--fs-xs); }
  #panel-list .toolbar-right .btn { padding: 4px 9px; font-size: var(--fs-xs); }
  #all-wrap { font-size: var(--fs-xs); }
}
.sc-meta { display: flex; flex-direction: column; gap: 2px; font-size: var(--fs-xs); color: var(--tx2); line-height: 1.45; word-break: break-all; }
/* 底部操作分两行：**主按钮独占一行**（= 当前该做的那一步：补收款 → 上传凭证 → 确认已结算），
   次要按钮（详情/编辑、作废）在下面一行等分。
   ⚠️ 2026-09-21 修：原来 3~4 个按钮挤在一行，文字被压到变形（老板：「这几个按钮已经挤压变形了」）。 */
.sc-acts { display: flex; flex-direction: column; gap: 7px; margin-top: auto; padding-top: 9px; }
.sc-main { display: flex; }
.sc-main .btn { flex: 1 1 auto; min-width: 0; }
.sc-main .hint { flex: 1 1 auto; text-align: center; }
.sc-sub { display: flex; gap: 7px; flex-wrap: wrap; }   /* 次要按钮变多时换行，不挤成一团 */
.sc-sub .btn { flex: 1 1 auto; min-width: 84px; }        /* 等分；窄到放不下就换行 */
.sc-bar { padding: 10px 2px 0; }

/* ---------- 🧾 结算单「详情 / 编辑」弹窗（2026-09-21 老板：「编辑体验非常糟糕，信息密度也高」→ A+B 改造）----------
   A：打开先是**纯只读**详情（旧版 25 个字段里 12 个是灰掉的只读框、要滚 3 屏），点「✏️ 编辑」才出表单；
   B：编辑态里少改的块用 `<details>` 折叠 —— 物资消耗 / 结算金额默认收起，只展开"该补的收款信息"。
   ⚠️ `.hidden` 是 `display:none !important`，所以给 `#m-edit` 设 display 也不会顶掉它。 */
.smt .modal-body { gap: 10px; }
/* ⚠️ 2026-09-21 修：`.modal-body` 是 flex 列，内容总高超过可视高时子项**默认会被压扁**（而不是滚动）——
   实测 `.log-list`（操作记录）被挤到 **4px 高**，等于"记录根本看不见"。这里禁掉收缩，让它整块滚动。 */
.smt .modal-body > * { flex: 0 0 auto; }
/* ① 账目摘要：两个"要付多少钱"最大最显眼，其余关键账降成小字 */
.smt-sum { display: flex; align-items: center; gap: 8px 18px; flex-wrap: wrap;
  padding: 11px 14px; border-radius: 12px;
  background: linear-gradient(135deg, #f2f7ff, #fbfdff); border: 1px solid #e2ecfb; }
.smt-m { display: flex; flex-direction: column; gap: 1px; }
.smt-m > span { font-size: var(--fs-xs); color: var(--tx2); }
.smt-m > b { font-size: var(--fs-lg); font-weight: 800; color: var(--money);
  font-variant-numeric: tabular-nums; letter-spacing: -.4px; }
.smt-m.alt > b { color: var(--pri); }
.smt-keys { display: flex; flex-wrap: wrap; gap: 3px 14px; margin-left: auto; }
.smt-keys > span { display: flex; align-items: baseline; gap: 5px; font-size: var(--fs-xs); color: var(--tx2); }
.smt-keys i { font-style: normal; }
.smt-keys b { color: var(--tx); font-variant-numeric: tabular-nums; }
/* 摘要卡最后一行：生成 / 结算 / 导出（占满整行，与上面的金额、关键账分开） */
.smt-time { flex: 1 1 100%; margin-top: 2px; padding-top: 6px; border-top: 1px dashed var(--line);
  font-size: var(--fs-xs); color: var(--tx2); }
/* ② 详情态：只读分区（标题 + 值），不再出现任何灰输入框 */
.smt-sec { padding: 8px 0; border-bottom: 1px dashed var(--line); }
#m-view > .smt-sec:last-child { border-bottom: 0; }
.smt-sh { display: flex; align-items: center; gap: 7px; margin-bottom: 3px;
  font-size: var(--fs-xs); color: var(--tx2); font-weight: 700; }
.smt-lock { font-weight: 400; color: #8fa0bb; }
.smt-sb { font-size: var(--fs-sm); line-height: var(--lh-body); word-break: break-word; }
.smt-sb b { color: var(--tx); }
/* ③ 编辑态：可折叠块（summary 上带一行值摘要，不展开也能看到内容） */
#m-edit > * + * { margin-top: 8px; }
.smt-fold { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; background: var(--surface); }
.smt-fold > summary { display: flex; align-items: center; gap: 8px; padding: 9px 12px; cursor: pointer;
  background: #f7f9fc; font-size: var(--fs-sm); font-weight: 700; color: var(--tx); list-style: none; }
.smt-fold > summary::-webkit-details-marker { display: none; }
.smt-fold > summary::before { content: '▸'; color: var(--tx2); font-weight: 400; }
.smt-fold[open] > summary::before { content: '▾'; }
.smt-fold > summary:hover { background: #eef3fa; }
.smt-fv { margin-left: auto; max-width: 58%; font-size: var(--fs-xs); font-weight: 400; color: var(--tx2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.smt-need { color: var(--warn); font-style: normal; font-weight: 700; }
.smt-ok { color: var(--ok); font-style: normal; font-weight: 700; }
.smt-grid { padding: 12px; }
/* 凭证块里的"先补齐收款信息才能上传"提示（收款待补时出现，阻断式） */
.smt-warn { padding: 8px 11px; border-radius: 10px; font-size: var(--fs-sm); line-height: var(--lh-body);
  background: var(--warn-bg); border: 1px solid #f0dcc0; color: var(--tx); margin-bottom: 10px; }
/* 🔎 账号「可搜索下拉」（新建结算单选账号）：在输入框正下方就地展开，不用记编号 */
.ac-panel { margin-top: 6px; max-height: 210px; overflow-y: auto; padding: 5px;
  border: 1px solid var(--line); border-radius: 10px; background: var(--surface);
  box-shadow: 0 8px 20px rgba(30, 45, 80, .10); }
.ac-i { display: flex; flex-direction: column; gap: 1px; width: 100%; text-align: left;
  padding: 7px 10px; border: 0; border-radius: 8px; background: transparent; cursor: pointer; }
.ac-i:hover, .ac-i:focus-visible { background: var(--bg1-grad); }
.ac-i > b { font-size: var(--fs-sm); color: var(--pri); }
.ac-i > span { font-size: var(--fs-xs); color: var(--tx2); }
.ac-none { padding: 9px 10px; font-size: var(--fs-xs); color: var(--tx2); }
/* 操作记录折叠块内的列表：跟块内留白对齐（原来只有 2px，贴着边） */
#m-fold-logs .log-list { padding: 10px 12px; max-height: 260px; }
@media (max-width: 720px) {
  .smt-keys { margin-left: 0; }                        /* 手机上摘要不再强制靠右 */
  .smt-m > b { font-size: var(--fs-md); }              /* 小屏金额降一档，避免撑破 */
  .smt-fv { max-width: 45%; }
  .smt-grid { padding: 10px; }
}
.chk-inline { display: inline-flex; align-items: center; gap: 5px; font-size: var(--fs-sm); color: var(--tx2); cursor: pointer; white-space: nowrap; }

/* ---------- 🔒 结算单锁定提示条（2026-09-21 老板：「填过的信息不能变动，除非有异议才能修改」）----------
   编辑弹窗顶部一条：默认浅灰（锁定中）、有凭证时橙色（整单只读）、解锁后绿色。
   ⚠️ 这只是**提示**；真正拦住的是服务端对 PUT /api/admin/settlements/:id 的校验。 */
.lock-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 8px 11px;
  border-radius: 10px; font-size: var(--fs-sm); line-height: 1.5;
  background: #f4f6fa; border: 1px solid var(--line); color: var(--tx); margin-bottom: 10px; }
.lock-bar.warn { background: var(--warn-bg); border-color: #f0dcc0; }
.lock-bar.ok { background: #eaf7ef; border-color: #cbe8d6; }
.lock-bar .lock-hint { color: var(--tx2); font-size: var(--fs-xs); }
.lock-bar [data-x="unlock"] { margin-left: auto; flex: 0 0 auto; }
/* 🔓 「修改原因」输入框（2026-09-21 起代替每次弹 `window.prompt`）：独占锁条下一整行 */
.lock-bar .lock-reason { flex: 1 1 100%; margin-top: 2px; }

/* ---------- 🧮 结算计算器（管理后台 · 2026-09-21 取代「💰 价格结算单」入口）----------
   PC：左边填、右边结果（结果 sticky 跟随）；手机：上下堆叠。复用 `.card` / `.form-grid` / `.field`。 */
.calc-wrap { display: grid; grid-template-columns: minmax(0, 1fr) minmax(300px, 380px); gap: 12px; align-items: start; }
.calc-in { padding: 12px 14px; }
.calc-h { margin: 12px 0 6px; font-size: var(--fs-sm); font-weight: 700; color: var(--tx); }
.calc-h .hint { font-weight: 400; }
.calc-supply { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(230px, 100%), 1fr)); gap: 8px 10px; }
.calc-item { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 4px 8px;
  padding: 7px 10px; border: 1px solid var(--line); border-radius: 10px; background: #fbfcfe; }
.calc-item .ci-k { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 6px; font-size: var(--fs-sm); font-weight: 600; }
.calc-item .ci-k i { font-style: normal; font-size: var(--fs-xs); font-weight: 400; color: var(--tx2); }
.calc-item .calc-sel { display: inline-block; width: auto; padding: 1px 4px; font-size: var(--fs-xs); vertical-align: middle; }
.calc-item .input { min-width: 0; }
.calc-item .ci-t { min-width: 66px; text-align: right; font-size: var(--fs-sm); color: var(--money); font-variant-numeric: tabular-nums; }
.calc-total { display: flex; align-items: center; justify-content: space-between; margin-top: 10px; padding-top: 10px;
  border-top: 1px dashed var(--line); font-size: var(--fs-sm); color: var(--tx2); }
.calc-total b { font-size: var(--fs-lg); color: var(--money); font-variant-numeric: tabular-nums; }
/* 「直接填金额」的项（大红包 / 其他）：换个底色，一眼看出这里不用填数量 */
.calc-item.is-amount { background: #fffaf2; border-color: #f0e2cc; }
/* 物资区下方的常驻提醒（大红包单价浮动 → 直接填金额；不用悬停就能看到） */
.calc-tip { margin: 8px 0 0; padding: 8px 10px; border: 1px solid #f0dcc0; border-radius: 8px;
  background: var(--warn-bg); color: var(--warn); font-size: var(--fs-xs); line-height: var(--lh-body); }
.calc-tip b { color: var(--tx); }
.calc-out { position: sticky; top: 12px; padding: 14px; }
.calc-big { display: grid; gap: 8px; margin-bottom: 12px; }
.calc-big .cb-i { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; padding: 9px 12px;
  border: 1px solid #e2ecfb; border-radius: 10px; background: linear-gradient(135deg, #f2f7ff, #fbfdff); }
.calc-big .cb-i > span { font-size: var(--fs-xs); color: var(--tx2); }
.calc-big .cb-i > b { font-size: var(--fs-xl); font-weight: 800; color: var(--money);
  font-variant-numeric: tabular-nums; letter-spacing: -.4px; }
.calc-big .cb-i.alt > b { color: var(--pri); }
.calc-rows { display: grid; gap: 4px; }
.calc-rows .cr { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; font-size: var(--fs-sm); }
.calc-rows .cr > i { font-style: normal; color: var(--tx2); }
.calc-rows .cr > b { font-variant-numeric: tabular-nums; }
.calc-eq { margin-top: 10px; padding: 8px 10px; border: 1px solid #e2ecfb; border-radius: 8px;
  background: #f4f8ff; font-size: var(--fs-xs); line-height: var(--lh-body); color: var(--tx2); }
.calc-eq b { color: var(--tx); }
.calc-warn { margin-top: 8px; padding: 8px 10px; border: 1px solid #f0dcc0; border-radius: 8px;
  background: var(--warn-bg); font-size: var(--fs-xs); color: var(--warn); }
@media (max-width: 900px) {
  .calc-wrap { grid-template-columns: minmax(0, 1fr); }
  .calc-out { position: static; }
}
@media (max-width: 720px) {
  .calc-big .cb-i > b { font-size: var(--fs-lg); }   /* 小屏金额降一档，避免撑破 */
  .calc-item .ci-t { min-width: 58px; }
}
/* 被锁住的输入框：底色变灰、鼠标禁点，一眼看出"这项不能改" */
.input:disabled, .input[disabled] { background: #f4f6fa; color: var(--tx2); cursor: not-allowed; opacity: .85; }
.cell-muted { color: var(--tx2); opacity: .5; }
.skins-cell, .remark-cell { text-align: center; }
.text-pop-body { white-space: pre-wrap; word-break: break-word; line-height: var(--lh-loose); font-size: var(--fs-sm); color: var(--tx); }

/* ---------- 🚫 号主端：驳回原因 + 修改重提（2026-09-21）----------
   审核驳回后，号主要一眼看到「为什么被驳回、要改什么」，并能一键回填表单重提。 */
.mine-reject {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  margin-top: 8px; padding: 8px 10px; border-radius: var(--rad-sm);
  background: #fff4f4; border: 1px solid #ffd9d9; color: #c0392b;
  font-size: var(--fs-xs); line-height: 1.5;
}
.mine-reject b { color: #c0392b; }
.mine-reject .btn { margin-left: auto; }   /* 按钮靠右，不挤着原因文字 */
/* 重提提示条（显示在登记表单最顶部） */
.resubmit-tip {
  margin-bottom: 12px; padding: 10px 12px; border-radius: var(--rad-sm);
  background: #fff8ec; border: 1px solid #ffe3bf; color: #b57608;
  font-size: var(--fs-sm); line-height: 1.6;
}
.resubmit-tip .btn { margin-left: 6px; vertical-align: middle; }

/* ---------- 🧾 评估 / 登记页：分步向导（2026-09-21）----------
   原来 4 段表单一次铺满，看着信息量太大。改成**只展开当前一步**：
   顶部步骤条（显示进度，已完成的可点击回看），底部「上一步 / 下一步」。
   必填没填完**不让往下走**（JS 拦），但会明确提示还差哪几项。 */
.eval-step { display: none; }
.eval-step.active { display: block; animation: evalStepIn .18s ease-out; }
@keyframes evalStepIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }

/* 顶部步骤条 */
.eval-steps { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 14px; padding-bottom: 12px; border-bottom: 1px solid var(--line); }
.eval-steps-i {
  display: flex; align-items: center; gap: 6px; padding: 5px 11px; border-radius: 999px;
  background: var(--bg2-grad); border: 1px solid var(--line); color: var(--tx2);
  font-size: var(--fs-xs); font-weight: 700; cursor: pointer; transition: all .15s;
}
.eval-steps-i i {
  display: grid; place-items: center; width: 17px; height: 17px; border-radius: 50%;
  background: var(--line); color: var(--tx2); font-style: normal; font-size: 10px;
}
.eval-steps-i.done { border-color: var(--ok); color: var(--ok); }
.eval-steps-i.done i { background: var(--ok); color: #fff; }
.eval-steps-i.cur { border-color: var(--pri); background: var(--pri); color: #fff; }
.eval-steps-i.cur i { background: rgba(255, 255, 255, .3); color: #fff; }
.eval-steps-i.lock { opacity: .45; cursor: not-allowed; }
.eval-steps-sep { color: var(--line); font-size: 11px; }

/* 底部导航：上一步 | 提示文案 | 下一步 */
.eval-nav { position: relative; }
.eval-nav-hint { flex: 1 1 auto; text-align: center; color: var(--tx2); font-size: var(--fs-xs); line-height: 1.5; }
.eval-nav-hint.warn { color: var(--warn); font-weight: 700; }

/* ---------- 📱 评估表单手机端（2026-09-21 老板第三次定稿）----------
   老板：「不要分组显示，像账号基础都 3 组信息，其他的加起来看上去至少 8 组，感官还更复杂了」。
   → **分组 / 折叠整体下线**：手机端与 PC 用**同一套**（4 步向导，每步显示该步全部字段，
     底部「上一步 / 下一步」），页面上的"块"只剩 步骤条 + 当前步 + 导航。
   ⚠️ 原来的 `.eval-g` / `.eval-g-h` / `.eval-g-b` / `.eval-g-sum` / `.eval-g-done` / `.eval-g-more` /
      `.eg-on` / `.eg-open` / `.eg-done` / `.eg-manual` 规则**已全部删除**，`submit.js` 里对应的
      「3 项一组」代码也一并删了。**别再按旧注释把它加回来**。 */
/* 手机端：步骤条只留序号（避免换行成一大坨），导航按钮撑满 */
@media (max-width: 720px) {
  .eval-steps { gap: 4px; }
  .eval-steps-i { padding: 4px 8px; }
  .eval-steps-i span { display: none; }
  .eval-steps-i.cur span { display: inline; }   /* 当前步保留文字，知道自己在哪 */
  .eval-nav { flex-wrap: wrap; }
  .eval-nav-hint { flex: 1 1 100%; order: -1; margin-bottom: 8px; }
  /* 实时预估条：手机端「到手」字号收一档，明细改 2 列（4 列在 390px 会挤到换行） */
  .eval-preview { padding: 11px 12px; }
  .eval-preview .ep-main > b { font-size: 24px; }
  .eval-preview .ep-detail { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ---------- 管理端三个抽屉（审核上架 / 编辑账号 / 跟进记录）观感统一 ----------
   「🧮 公式参考」这类长文原来是一坨灰字，现在做成浅蓝说明卡，读起来不累；
   字段网格间距收紧一点，抽屉打开后一屏能多看到几个字段。 */
.drawer .hint {
  padding: 9px 11px; border-radius: 10px;
  background: linear-gradient(135deg, #f6faff, #eef5ff);
  border: 1px solid #dbe8fb; color: var(--tx2);
  line-height: var(--lh-body);
}
.drawer .drawer-body .form-grid { gap: 10px 12px; }
.drawer .drawer-body .field { gap: 4px; }

/* ⚠️ `#success-eval` 身上还挂着 `.eval-card` 这个 class（HTML 里两边都有），
   而 `.eval-card` 自带 display:flex 与 max-width → 这里显式覆盖成"整块居中、宽 560"。
   560px 是刻意的：卡片再宽，金额和标签会被拉到两头、反而不好读。 */
#success-eval {
  max-width: 560px; margin: 0 auto 14px; text-align: left;
  display: block; padding: 0; background: none; border: 0; box-shadow: none;
}
.suc-block {
  margin-bottom: 10px; padding: 12px 14px; border-radius: var(--rad);
  background: linear-gradient(165deg, #fff, var(--bg1) 75%, var(--bg2));
  border: 1px solid var(--line); box-shadow: var(--shadow);
}
.suc-block-t {
  display: flex; align-items: center; gap: 7px; margin-bottom: 9px;
  color: var(--tx); font-size: var(--fs-sm); font-weight: 700;
}
.suc-block-t::before { content: ''; width: 3px; height: 13px; border-radius: 999px; background: linear-gradient(180deg, var(--pri), var(--pri-3)); }
.suc-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.suc-cell { padding: 9px 12px; border-radius: 12px; background: var(--bg2-grad); border: 1px solid var(--line); }
.suc-k { display: block; color: var(--tx2); font-size: var(--fs-xs); }
.suc-v { color: var(--pri); font-size: var(--fs-xl); font-weight: 800; font-variant-numeric: tabular-nums; }
.suc-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.suc-tag {
  padding: 3px 10px; border-radius: 999px; font-size: var(--fs-xs); font-weight: 600;
  color: var(--ok); background: var(--ok-bg);
}
.suc-tag.minus { color: var(--warn); background: var(--warn-bg); }
.suc-rows { display: grid; gap: 5px; }
.suc-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; font-size: var(--fs-sm); color: var(--tx2); }
.suc-row b { color: var(--tx); font-weight: 700; font-variant-numeric: tabular-nums; }
.suc-row small { display: block; margin-top: 1px; color: #98a6bd; font-size: var(--fs-xs); font-weight: 400; }
.suc-sep { height: 1px; margin: 9px 0; background: var(--line); }
.suc-net {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin-top: 10px; padding: 11px 14px; border-radius: 12px;
  background: linear-gradient(135deg, rgba(61, 111, 224, .12), rgba(138, 92, 246, .07));
  border: 1px solid rgba(61, 111, 224, .22);
}
.suc-net-k { color: var(--tx); font-size: var(--fs-sm); font-weight: 700; }
.suc-net-k small { display: block; margin-top: 2px; color: var(--tx2); font-size: var(--fs-xs); font-weight: 400; }
.suc-net-v { color: var(--pri); font-size: var(--fs-xl); font-weight: 800; font-variant-numeric: tabular-nums; }
.success-note {
  padding: 9px 12px; border-radius: 10px; text-align: left;
  background: var(--warn-bg); color: #9a6a12; font-size: var(--fs-xs); line-height: var(--lh-body);
  margin-bottom: 16px; border: 1px solid #f0dfb6;
}
.mine-tip { font-size: var(--fs-xs); color: var(--warn); background: var(--warn-bg); border-radius: 8px; padding: 6px 10px; }

/* ---------- 表头固定跟随（JS 克隆表头，页面下滚时钉在顶栏下方） ---------- */
.stick-head {
  position: fixed; top: 0; left: 0; width: 0; z-index: 48;
  transition: top .22s ease;
  display: none; overflow: hidden; background: var(--card);
  border: 1px solid var(--line); border-top: none; border-radius: 0 0 10px 10px;
  box-shadow: 0 10px 22px rgba(40, 60, 110, .12);
}
.stick-head.show { display: block; }
.stick-head-inner { overflow: hidden; }
.stick-head-table { border-collapse: separate; border-spacing: 0; table-layout: fixed; }
.stick-head-table th:first-child { box-shadow: inset -1px 0 0 var(--line), inset 0 -1px 0 var(--line); }

/* ---------- 选号页交易提醒（默认折叠：折叠条醒目提示防骗，展开显示完整规则 + 官方企微二维码）
   配色走 --notice 系列令牌；⚠️ 用「光圈脉动」而不是透明度闪烁（原 n-blink 忽明忽暗比较晃眼） ---------- */
.board-notice {
  margin: 0 0 16px;
  background: linear-gradient(135deg, var(--notice-bg1), var(--notice-bg2));
  border: 1px solid var(--notice-line); border-left: 4px solid var(--notice); border-radius: var(--rad);
  box-shadow: 0 10px 26px -14px rgba(229, 88, 63, .45);
  overflow: hidden;
}
.board-notice .n-toggle {
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; cursor: pointer; border: 0;
  padding: 12px 14px 12px 16px;
  background: linear-gradient(135deg, #fff1ea, var(--notice-bg2)); transition: background .15s;
}
.board-notice .n-toggle:hover { background: linear-gradient(135deg, #ffe7dc, #fff4ec); }
/* ⚠️ 放进小圆徽章里，并用向外扩散的光圈脉动替代闪烁 */
.board-notice .n-flag {
  flex: 0 0 auto; width: 26px; height: 26px; display: grid; place-items: center;
  background: var(--surface); border-radius: 999px; font-size: 14px; line-height: 1;
  animation: n-pulse 2.1s ease-in-out infinite;
}
@keyframes n-pulse {
  0%, 100% { box-shadow: 0 0 0 1px var(--notice-line), 0 0 0 0 rgba(229, 88, 63, .34); }
  55% { box-shadow: 0 0 0 1px var(--notice-line), 0 0 0 7px rgba(229, 88, 63, 0); }
}
.board-notice .n-tip { font-size: var(--fs-sm); font-weight: 700; color: var(--notice-d); letter-spacing: .3px; }
.board-notice .n-hint {
  font-size: var(--fs-xs); font-weight: 700; color: var(--notice-d);
  background: linear-gradient(135deg, #fff, #fff6f1);
  border: 1px solid var(--notice-line); border-radius: 999px; padding: 4px 11px; white-space: nowrap;
}
/* 箭头做成小圆钮：悬停时变实心橙，提示"可点" */
.board-notice .n-caret {
  margin-left: auto; flex: 0 0 auto; width: 24px; height: 24px;
  display: grid; place-items: center; font-size: 12px; font-weight: 700;
  color: var(--notice-d); background: var(--surface); border-radius: 999px;
  box-shadow: 0 0 0 1px var(--notice-line);
  transition: transform .22s, background .18s, color .18s;
}
.board-notice .n-toggle:hover .n-caret { background: var(--notice); color: #fff; }
.board-notice:not(.folded) .n-caret { transform: rotate(180deg); }
.board-notice .n-body { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 18px; padding: 13px 16px 14px 18px; }
.board-notice.folded .n-body { display: none; }
.board-notice .n-main { flex: 1 1 380px; min-width: 0; }
/* 交易须知内的标题行已去掉（与收起条上的提示重复），样式一并移除 */
/* 规则条目：去掉默认圆点，改成带浅光圈的小圆点 + 条目间距（读起来更清爽） */
.board-notice .n-list { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 7px; }
.board-notice .n-list li { position: relative; padding-left: 19px; font-size: var(--fs-sm); color: #7c5248; line-height: 1.65; }
.board-notice .n-list li::before {
  content: ''; position: absolute; left: 3px; top: .58em; width: 6px; height: 6px;
  border-radius: 999px; background: var(--notice); box-shadow: 0 0 0 3px rgba(229, 88, 63, .14);
}
.board-notice .n-qr { flex: 0 0 auto; margin-left: auto; text-align: center; }
.board-notice .n-qr img {
  display: block; width: 112px; height: 112px; padding: 5px;
  background: var(--surface); border: 1px solid var(--notice-line); border-radius: 12px;
  box-shadow: 0 8px 18px -10px rgba(229, 88, 63, .5);
  transition: transform .2s, box-shadow .2s;
}
.board-notice .n-qr:hover img { transform: scale(1.035); box-shadow: 0 10px 22px -10px rgba(229, 88, 63, .6); }
.board-notice .n-qr span { display: block; margin-top: 6px; font-size: var(--fs-xs); font-weight: 600; color: var(--notice-d); }
/* 手机端：提醒区改为上下排布（规则占满宽度，二维码居中放在下方） */
@media (max-width: 640px) {
  .board-notice { border-left-width: 3px; }
  .board-notice .n-toggle { flex-wrap: wrap; gap: 6px; padding: 10px 12px; }
  .board-notice .n-tip { font-size: var(--fs-sm); }
  .board-notice .n-hint { font-size: var(--fs-xs); }
  .board-notice .n-caret { margin-left: 0; }
  .board-notice .n-body { padding: 10px 12px; gap: 10px; }
  .board-notice .n-main { flex: 1 1 100%; }

  .board-notice .n-list { padding: 0; }                 /* 条目圆点由 li::before 画，这里不再额外缩进 */
  .board-notice .n-list li { font-size: var(--fs-sm); line-height: 1.6; }
  .board-notice .n-qr { margin: 4px auto 0; }
  .board-notice .n-qr img { width: 106px; height: 106px; }
  .board-notice .n-qr span { font-size: var(--fs-xs); }
  /* Tab：手机上收小一档 + 缩小间距，配合横向滚动（5 个 Tab 也放得下） */
  .tabs { gap: 5px; }
  .tab { padding: 7px 12px; font-size: var(--fs-xs); border-radius: 9px; }
  .tab-n { min-width: 18px; padding: 0 5px; }
  .hscroll-hint { font-size: var(--fs-xs); padding: 6px 12px; bottom: 22px; }
  /* 折叠条：手机略矮一点；内层容器换小留白（原 .foldbar 的 padding 已移到 .foldbar-inner，
     高度也不要再写回去 —— admin.js 的吸顶偏移是按实际高度算的） */
  .foldbar { height: 32px; }
  .foldbar-inner { padding: 0 12px; gap: 7px; }
  .foldbar-name { font-size: var(--fs-xs); }
  .foldbar-hint { display: none; }                      /* 窄屏放不下，收起提示文字 */
}

/* ---------- 底部固定横向滚动条（与表格双向同步） ---------- */
.hscrollbar {
  position: fixed; left: 0; bottom: 0; height: 16px; z-index: 60;
  background: #e9eef9; border-top: 1px solid var(--line);
  display: none; touch-action: none; cursor: pointer;
}
.hscrollbar.show { display: block; }
.hscroll-thumb {
  position: absolute; top: 2px; left: 0; height: 12px; min-width: 48px;
  border-radius: 8px; background: linear-gradient(135deg, var(--pri), var(--pri-2));
  box-shadow: 0 1px 5px rgba(61, 111, 224, .45);
  cursor: grab;
}
.hscroll-thumb:active { cursor: grabbing; }
.hscrollbar::-webkit-scrollbar-track { background: transparent; }
.hscrollbar { scrollbar-width: thin; scrollbar-color: var(--pri) #f1f4fa; }

/* ---------- 左右滑动提醒 ---------- */
.hscroll-hint {
  position: fixed; bottom: 26px; z-index: 61; transform: translateX(-50%);
  background: rgba(34, 48, 71, .92); color: #fff; font-size: var(--fs-xs); font-weight: 600;
  padding: 7px 16px; border-radius: 999px; letter-spacing: 1px;
  display: none; align-items: center; pointer-events: none; white-space: nowrap;
  box-shadow: 0 6px 18px rgba(20, 30, 60, .28);
  animation: nudgex 1.6s ease-in-out infinite;
}
.hscroll-hint.show { display: inline-flex; }
@keyframes nudgex {
  0%, 100% { transform: translateX(-50%); }
  50% { transform: translateX(calc(-50% + 16px)); }
}

/* ---------- Toast ---------- */
.toast {
  position: fixed; left: 50%; top: 74px; transform: translateX(-50%); z-index: 200;
  background: #223047; color: #fff; padding: 11px 22px; border-radius: 12px; font-size: var(--fs-sm);
  box-shadow: 0 10px 30px rgba(20, 30, 60, .35); animation: drop .2s ease; max-width: 80vw;
}
.toast.ok { background: linear-gradient(135deg, #18a058, #3fbf7f); }
.toast.err { background: linear-gradient(135deg, #c0483f, #e06a5f); }
@keyframes drop { from { transform: translate(-50%, -12px); opacity: 0; } to { transform: translate(-50%, 0); opacity: 1; } }

/* ================= 手机 / 平板（H5）统一适配 ================= */
@media (max-width: 720px) {
  /* 顶栏：单行（品牌在左、导航在右），不再换行占两行高度，省下的纵向空间给内容 */
  .topbar-inner { padding: 7px 10px; gap: 10px; flex-wrap: nowrap; justify-content: space-between; }
  .brand { min-width: 0; flex: 0 1 auto; gap: 6px; }
  .brand-logo { font-size: var(--fs-md); line-height: var(--lh-tight); }
  .brand-logo-img { height: var(--fs-md); }
  .brand-name { font-size: var(--fs-sm); line-height: var(--lh-tight); letter-spacing: 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  .nav { width: auto; flex: 0 0 auto; justify-content: flex-end; gap: 6px; flex-wrap: nowrap; }
  .nav-item { flex: 0 0 auto; padding: 7px 12px; font-size: var(--fs-sm); }

  /* 内容区：左右留白收窄，底部预留固定滑块与安全区 */
  main { padding: 12px 12px calc(76px + var(--safe-b)); }
  .hero, .admin-hero { padding: 10px 2px 6px; gap: 6px 8px; }
  .hero h1, .admin-hero h1 { font-size: var(--fs-lg); }
  /* 评估页页头说明：手机上一行放不下会折成 3 行（~94px）→ 收一档字号与行高，压到 2 行 */
  .hero p { font-size: var(--fs-xs); line-height: var(--lh-body); margin-top: 4px; }
  /* 结算单 / 管理后台页头：手机把「当前管理员 / 退出登录 / 返回」收小，
     原来 4 项各占一行会堆到 3 行（白占掉近 1/5 屏） */
  .admin-hero .admin-who { margin-left: 0; font-size: var(--fs-xs); }
  .admin-hero .sync-ind { font-size: var(--fs-xs); }
  .admin-hero .btn-sm { padding: 5px 9px; font-size: var(--fs-xs); }
  /* 结算单工具栏：筛选胶囊与导出按钮在手机上偏挤，统一收一档 */
  .toolbar { padding: 10px 12px; gap: 8px; margin-bottom: 10px; }
  .toolbar .chip { padding: 5px 11px; font-size: var(--fs-xs); }
  .toolbar .btn-sm { padding: 6px 10px; font-size: var(--fs-xs); }
  #batch-bar { flex-wrap: wrap; gap: 8px; padding: 8px 12px; }
  #batch-bar .btn-sm { padding: 5px 9px; font-size: var(--fs-xs); }

  /* 卡片与模块间距统一收一点，屏幕利用率更高 */
  .card, .stat-card, .p-card, .eval-card, .board-notice { border-radius: var(--rad-sm); }
  /* 登录卡与「我的登记记录」定位偏移（手机顶栏两行，留更多空间） */
  .login-card { margin: 16px auto 32px; padding: 20px 18px 16px; }
  #view-mine { scroll-margin-top: 104px; }
  .form { padding: 16px; gap: 13px; }
  .form-grid { grid-template-columns: 1fr; gap: 12px; }
  .toolbar { padding: 10px 12px; gap: 10px; }
  .toolbar-right { width: 100%; }
  .search-wrap, #admin-filters .search-wrap { flex: 1 1 100%; min-width: 0; }
  .sort-wrap { flex: 1 1 auto; }
  .toolbar-right select.input { flex: 1 1 auto; min-width: 0; }

  /* 表单：输入 16px 防止 iOS 聚焦自动放大；主操作按钮整行更好点按 */
  .input { font-size: var(--fs-md); padding: 10px 12px; }
  .search-wrap .input { font-size: var(--fs-md); padding-left: 34px; }   /* 16px 避免 iOS 聚焦自动放大 */
  .skill-grid span, .skin-grid span { padding: 7px 13px; }
  .form-actions { gap: 10px; }
  .form-actions .btn { flex: 1 1 100%; }
  
  /* 触控目标：一律不小于 ~40px 高 */
  .btn { padding: 11px 18px; }
  .btn-lg { padding: 13px 20px; }
  .btn-sm { padding: 8px 12px; font-size: var(--fs-sm); }
  .btn-xs { padding: 7px 0; font-size: var(--fs-xs); min-width: 58px; }
  .ops-trigger { padding: 5px 11px; font-size: var(--fs-xs); }
  .icon-btn { padding: 9px; font-size: var(--fs-md); }
  .pager button { padding: 9px 16px; }
  .tab { padding: 9px 14px; }
  .chip { padding: 8px 14px; font-size: var(--fs-sm); }

  /* 统计卡 —— 手机上改成「横向滚动的一行」（老板 2026-09-20：管理页在手机上体验不好）
     原来 2 列 × 3 行要占 248px，把下面的筛选条和内容全挤出首屏；横滚后只占 ~86px。
     卡片宽 118px 在 390px 屏上能露出 3 个多，天然提示"右边还有"。
     左右出血到屏幕边（-12px），滚动时卡片像是从屏幕外滑进来，比留白更自然。 */
  #admin-stats {
    display: flex; flex-wrap: nowrap; gap: 10px;
    grid-template-columns: none;                       /* 覆盖上面的 grid 写法 */
    overflow-x: auto; -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity;
    /* ⚠️ 上下都必须留出 padding：`overflow-x: auto` 会让 overflow-y 也变成 auto（两者不能
       一个 auto 一个 visible），上下没留白的话卡片的上边框与阴影会被裁掉（"外框上面少一截"） */
    margin: 0 -12px 12px; padding: 6px 12px 6px;
  }
  #admin-stats::-webkit-scrollbar { height: 0; }
  #admin-stats .stat-card { flex: 0 0 118px; scroll-snap-align: start; padding: 10px 12px; }
  #admin-stats .stat-card .n { font-size: var(--fs-md); }
  #admin-stats .stat-card .t { font-size: var(--fs-xs); }
  /* 统计卡在别的页面仍按 2 列排（只有管理页那排改成横滚） */
  .stat-row:not(#admin-stats) { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
  .stat-card { padding: 12px 14px; }
  .stat-card .n { font-size: var(--fs-lg); }
  .stat-card.stat-action .n { font-size: var(--fs-lg); }
  /* 📱 管理页「筛选/搜索条」**手机端整体隐藏** —— 2026-09-21 老板：「在手机端不显示这个元素」
     （状态下拉「待上架」+ 🔍搜索 + ⬇导出 Excel 那一整条）。
     理由：手机上**统计卡本身就能按状态筛选**（点统计卡＝按该状态过滤，`stat-card[data-goto]`），
     再挂一条近 180px 的筛选条只会把卡片列表挤出首屏。
     ⚠️ 因此手机端**没有搜索、没有导出 Excel**（老板明确要求隐藏）；桌面端完全不受影响。
     ⚠️ 原来那套"搜索提前、状态与导出并排"的手机排版规则（order/flex）**已随之删除**，别再写回来。 */
  #admin-toolbar { display: none; }
  .pending-grid { grid-template-columns: 1fr; gap: 10px; }
  /* 账号卡片：手机端字段降到两列，留白收紧（三列会把"绝密KD"这类标签挤断行） */
  .p-card { padding: 12px; }
  .p-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 7px 9px; }
  .p-head b { font-size: var(--fs-sm); }
  .p-sec { padding: 8px 10px 9px; }
  .p-net { padding: 8px 11px; }
  .p-net b { font-size: var(--fs-md); }

  /* 表格：更紧凑，编号列更窄（横向滑动看更多列）；行高与 PC 端保持一致地收窄 */
  .grid th, .grid td { padding: 6px 10px; font-size: var(--fs-sm); }
  .grid td.idc { min-width: 128px; max-width: 150px; }
  .grid td.idc-plain { min-width: 52px; }
  #admin-table-wrap { max-height: 64vh; }

  /* 抽屉：手机全屏（右侧滑入），底部按钮平分整行 */
  .drawer { width: 100vw; }
  .drawer-head { padding: 14px 14px 12px; }
  .drawer-body { padding: 14px; }
  .drawer-foot { padding: 12px 14px calc(12px + var(--safe-b)); }
  .drawer-foot .btn { flex: 1; }

  /* 评估 / 成功面板 */
  .eval-card { padding: 12px 14px; max-width: none; }
  .eval-line.pay-line b.money { font-size: var(--fs-lg); }
  /* 成功面板：手机上收紧留白，编号字号降一档（36px 在 390 屏会把卡片撑满） */
  .success-box { padding: 24px 16px 20px; }
  .success-id { font-size: var(--fs-xl); padding: 5px 16px; }
  .success-icon { width: 56px; height: 56px; margin-bottom: 10px; font-size: 26px; }
  #success-eval .suc-block { padding: 11px 12px; }
  .suc-v, .suc-net-v { font-size: var(--fs-lg); }
  .suc-cell { padding: 8px 10px; }
  .suc-net { padding: 10px 12px; }
  .success-note { font-size: var(--fs-xs); }

  /* 底部固定横向滚动条加高，手指更好拖 */
  .hscrollbar { height: 18px; }
  .hscroll-thumb { height: 14px; top: 2px; }
  .hscroll-hint { font-size: var(--fs-xs); padding: 6px 12px; bottom: 24px; }
  .ops-menu { min-width: 132px; }
  .ops-menu .btn-xs { padding: 9px 12px; font-size: var(--fs-sm); }
}

/* 超窄屏（iPhone SE 等 320-380）再收一档 */
@media (max-width: 380px) {
  .hero h1, .admin-hero h1 { font-size: var(--fs-md); }
  .stat-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .stat-card .n { font-size: var(--fs-lg); }
  .grid th, .grid td { padding: 7px 9px; font-size: var(--fs-xs); }
  .board-notice .n-tip { font-size: var(--fs-sm); }
  .board-notice .n-hint { font-size: var(--fs-xs); padding: 2px 8px; }
}

/* ================= 快速评估页 /calc（直播搭档报价用：深色报价牌 + 大按键 + 实时出价） ================= */
.calc-main { max-width: 560px; margin: 0 auto; position: relative; overflow-x: hidden; overflow-x: clip; }   /* 移动端禁止横向滚动：输入聚焦/键盘弹出时页面不会被推歪 */
/* 页面背景彩色光斑：毛玻璃面板透出来的颜色来源（大色块模糊，不抢文字） */
.calc-main::before {
  content: ''; position: absolute; inset: 0 -24px; z-index: -1; pointer-events: none;
  background:
    radial-gradient(230px 230px at 8% 8%, rgba(99, 102, 241, .42), transparent 70%),
    radial-gradient(270px 270px at 94% 24%, rgba(255, 209, 102, .36), transparent 72%),
    radial-gradient(250px 250px at 44% 98%, rgba(168, 85, 247, .34), transparent 72%);
  filter: blur(8px);
}
/* 报价牌：深色渐变缓慢流动 + 柔光游走，直播间/投屏远距离也能一眼看清（租金金色大字） */
.calc-display {
  position: relative; overflow: hidden;
  padding: 15px 16px 11px; margin-bottom: 10px; text-align: center;
  background: #1e2a44;                       /* 静态底色兜底，渐变交给下面的流动层 */
  border-radius: 22px; box-shadow: var(--shadow-lg);
}
.calc-display > * { position: relative; z-index: 2; }   /* 内容放最上层，保证清晰 */
.calc-display::after {   /* 深色渐变流动层：3 倍宽 + transform 平移（不重绘 → 和跑马灯同屏也不掉帧） */
  content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 300%; z-index: 0;
  background: linear-gradient(100deg, #1b2440, #2c3d61, #3c2b60, #1f3a56, #1b2440);
  animation: cd-bg 18s linear infinite;
}
.calc-display::before {  /* 金色柔光：位于渐变层之上、内容之下 */
  content: ''; position: absolute; top: -120px; left: -70px; width: 240px; height: 240px; border-radius: 50%; z-index: 1;
  background: radial-gradient(circle, rgba(255, 209, 102, .22), transparent 70%);
  animation: cd-glow 13s ease-in-out infinite alternate;
}
@keyframes cd-bg { to { transform: translateX(-33.3333%); } }
@keyframes cd-glow { from { transform: translate(0, 0); } to { transform: translate(150px, 40px); } }
.cd-main { display: flex; align-items: center; justify-content: center; gap: 12px; flex-wrap: wrap; }
.cd-main .cd-label { color: #9fb0cc; font-size: var(--fs-sm); letter-spacing: 2px; }
.cd-main > b {   /* 报价：金色大字 + 柔光，远距离也能一眼看清 */
  color: #ffd166; font-size: var(--fs-2xl); line-height: var(--lh-tight);
  font-variant-numeric: tabular-nums; letter-spacing: .5px;
  text-shadow: 0 2px 16px rgba(255, 209, 102, .38);
}
/* 比例：做成浅色玻璃胶囊（信息精简了，但层次感保留） */
.cd-ratio {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 14px; border-radius: 999px;
  background: linear-gradient(140deg, rgba(255, 255, 255, .16), rgba(255, 255, 255, .06));
  border: 1px solid rgba(255, 255, 255, .22);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .22);
}
.cd-ratio span { color: #a9bad6; font-size: var(--fs-xs); }
.cd-ratio b { color: #fff; font-size: var(--fs-md); line-height: var(--lh-tight); font-variant-numeric: tabular-nums; }
/* 明细条：左侧固定「最新报价:」+ 右侧跑马灯；彩带与光泽都用 transform 动画（不触发布局/重绘 → 不卡顿） */
.cd-note {
  position: relative; overflow: hidden;
  display: flex; align-items: center; gap: 8px;
  margin-top: 10px; padding: 8px 12px;
  border: 1px solid rgba(255, 255, 255, .16); border-radius: 14px;
  color: #cdd8ea; font-size: var(--fs-xs);
}
.cd-note-lab { flex: 0 0 auto; color: #9fb0cc; font-size: var(--fs-xs); }
/* 跑马灯：内容超宽才无缝循环（复制两份 + translateX(-50%)），不超宽则静态居中；悬停暂停 */
.cd-marquee { flex: 1 1 auto; min-width: 0; overflow: hidden; white-space: nowrap; text-align: center; }
.cd-track {
  display: inline-block; color: #e6edfa;
  will-change: transform; transform: translateZ(0);   /* 提到合成层 → 长距离滚动更顺滑 */
  font-variant-numeric: tabular-nums;
}
.cd-track:hover { animation-play-state: paused; }
@keyframes cd-marquee { to { transform: translateX(-50%); } }
/* 流动彩带：3 倍宽 + transform 平移（比动 background-position 少一次重绘，和跑马灯同屏也不卡） */
.cd-note::before {
  content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 300%;
  background: linear-gradient(100deg, rgba(99, 102, 241, .40), rgba(255, 209, 102, .30), rgba(168, 85, 247, .38), rgba(56, 189, 248, .30), rgba(99, 102, 241, .40));
  animation: cd-flow 14s linear infinite;
}
.cd-note::after {   /* 斜向光泽：改用 transform（原来动 left 会每帧触发重排） */
  content: ''; position: absolute; top: -20%; bottom: -20%; left: -40%; width: 38%;
  background: linear-gradient(100deg, transparent, rgba(255, 255, 255, .22), transparent);
  animation: cd-shine 4.5s ease-in-out infinite;
}
.cd-note > * { position: relative; z-index: 1; }   /* 文字与跑马灯压在彩带/光泽之上 */
@keyframes cd-flow { to { transform: translateX(-33.3333%); } }
@keyframes cd-shine { 0% { transform: translateX(0) skewX(-18deg); } 55%, 100% { transform: translateX(430%) skewX(-18deg); } }
@media (prefers-reduced-motion: reduce) {
  .calc-display::after, .calc-display::before, .cd-note::before, .cd-note::after, .cd-track { animation: none; }
}
/* 输入面板：手机单列（每行控件铺满 → 信息不挤压）；桌面 ≥720px 才两列排布 */
/* 输入面板：iOS 风格毛玻璃（多层半透明 + 大圆角 + 顶边高光 + 斜向反光） */
.calc-panel {
  position: relative;
  padding: 8px 12px; display: flex; flex-direction: column; gap: 6px;
  border-radius: 22px;
  /* 原本是 blur(22px) 毛玻璃：整屏都在重绘，低配机滚一下都掉帧 → 改成高不透明度渐变，视觉接近但零 GPU 开销 */
  background: linear-gradient(155deg, rgba(255, 255, 255, .96), rgba(255, 255, 255, .9));
  border: 1px solid rgba(255, 255, 255, .86);
  box-shadow: 0 20px 46px rgba(60, 90, 160, .16), inset 0 1px 0 rgba(255, 255, 255, .95);
}
.calc-panel::before {   /* 顶部斜向反光：玻璃质感的关键，覆盖在内容之上但很淡 */
  content: ''; position: absolute; inset: 0; border-radius: inherit; pointer-events: none;
  background: linear-gradient(155deg, rgba(255, 255, 255, .34), rgba(255, 255, 255, 0) 46%);
}
.calc-row { display: flex; align-items: center; gap: 10px; min-width: 0; }
.calc-lab { flex: 0 0 46px; color: var(--tx2); font-size: var(--fs-sm); line-height: var(--lh-body); }
/* 步进器：大按键 + 中间数字（计算器手感） */
.stepper { display: flex; align-items: center; gap: 8px; flex: 1 1 auto; min-width: 0; }
.step-btn {
  flex: 0 0 auto; width: 44px; height: 42px; border: 1px solid rgba(255, 255, 255, .9); border-radius: 14px;
  background: rgba(255, 255, 255, .62); color: var(--pri); font-size: var(--fs-lg); line-height: var(--lh-tight); font-weight: 600;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .95), 0 2px 8px rgba(60, 90, 160, .07);
  cursor: pointer; transition: background .12s, transform .12s;
}
.step-btn:hover { background: rgba(255, 255, 255, .92); }
.step-btn:active { transform: scale(.95); }
.step-input {
  flex: 1 1 auto; min-width: 0; width: 100%; max-width: 100%; text-align: center; padding: 8px 6px;
  border: 1px solid rgba(255, 255, 255, .92); border-radius: 14px; background: rgba(255, 255, 255, .74); color: var(--tx);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .9);
  font-size: var(--fs-md); font-weight: 700; outline: none; font-variant-numeric: tabular-nums;
  transition: border .15s, box-shadow .15s, background .15s;
}
.step-input:focus { border-color: var(--pri); box-shadow: 0 0 0 3px rgba(61,111,224,.14); }
/* 下拉（体力 / 负重）：手机上直接用原生滚轮选等级，一次就选中，比连点步进器快 */
.sel-wrap { position: relative; flex: 1 1 auto; min-width: 0; display: flex; }
/* （calc 的下拉箭头原来用 .sel-wrap::after 画三角，已统一改为 select 背景 SVG，样式移除） */
.calc-select {
  flex: 1 1 auto; min-width: 0; width: 100%; padding: 8px 38px;
  border: 1px solid rgba(255, 255, 255, .92); border-radius: 14px; background: rgba(255, 255, 255, .74); color: var(--tx);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .9);
  font-size: var(--fs-md); font-weight: 700; cursor: pointer; outline: none;
  text-align: center; text-align-last: center;   /* 文字与数字框一样居中（左右 padding 对称，避免视觉偏心） */
  appearance: none; -webkit-appearance: none;
  transition: border .15s, box-shadow .15s;
}
.calc-select:focus { border-color: var(--pri); box-shadow: 0 0 0 3px rgba(61,111,224,.14); }
/* （保险档位 chips 已改为下拉选择，相关样式移除） */
/* 底部动作：两个按钮同排 + iOS 风格毛玻璃（半透明 + 背景模糊 + 白描边 + 顶边高光） */
.calc-actions { display: flex; gap: 8px; margin-top: 6px; }
.calc-actions .btn {
  flex: 1 1 0; min-width: 0; padding: 12px 10px; font-size: var(--fs-sm); border-radius: 16px;
  background: rgba(255, 255, 255, .92);   /* 同上：去掉毛玻璃 */
  border: 1px solid rgba(255, 255, 255, .74);
  box-shadow: 0 10px 24px rgba(60, 90, 160, .14), inset 0 1px 0 rgba(255, 255, 255, .9);
  transition: transform .15s, background .15s, box-shadow .15s;
}
.calc-actions .btn:active { transform: scale(.98); }
.calc-actions .btn-primary {
  background: linear-gradient(135deg, rgba(61, 111, 224, .90), rgba(111, 143, 240, .84));
  color: #fff; border-color: rgba(255, 255, 255, .45);
  box-shadow: 0 12px 26px rgba(61, 111, 224, .30), inset 0 1px 0 rgba(255, 255, 255, .55);
}
.calc-actions .btn-glass { background: rgba(255, 255, 255, .54); color: var(--pri); }
@media (max-width: 480px) {
  .calc-lab { flex: 0 0 46px; }
  .step-btn { width: 42px; height: 42px; font-size: var(--fs-md); }
  .calc-display { padding: 10px 14px 8px; margin-bottom: 8px; }
  .calc-actions { margin-top: 6px; }
  .calc-actions .btn { padding: 11px 8px; }
  .cd-note { margin-top: 6px; padding: 6px 10px; }
}
/* 桌面/投屏（直播伴侣多在电脑端）：宽度富余 → 数字行两列排布、档位更大 */
@media (min-width: 720px) {
  .calc-main { max-width: 760px; }
  .calc-panel { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 18px; padding: 10px 14px; }
  .calc-panel > .calc-row { min-width: 0; }                 /* grid 子项 min-width:auto 会被内容撑宽 → 归零 */
  .calc-panel > .calc-row-wide { grid-column: 1 / -1; }     /* 纯币/保险/体力/负重 整行 */
  .calc-lab { flex: 0 0 64px; }
  .step-btn { width: 44px; height: 42px; font-size: var(--fs-lg); }   /* 高度与数字框/下拉一致 → 一行内三个控件完全齐平 */
}
/* 永久脱敏（公域直播）：隐藏页脚，品牌名与备案信息不进画面 */
body.mask-on .site-footer { display: none; }
