/* ============================================================
   管理后台 v4 外壳层 —— 248px 单栏导航
   ------------------------------------------------------------
   把原来「64px 图标轨 + 200px 二级面板」改成一条 248px 单栏：
     品牌头 → 搜索 → 分组（工作台 / 现场业务 / 组织与配置）
            → 一级项（域）→ 二级项（入口，就地展开）
   DOM 仍然只有 #adminPanel 一个 aside，所有 id 不变，
   业务页拿到的 #adminMain / #adminTitle / 面包屑完全不受影响。

   只作用于 #admin，不碰登录页与手机打卡端。
   ============================================================ */

/* ---------- 0. 补齐三个「被引用但从未声明」的令牌 ----------
   admin-rectify.js / admin-lsr.js / admin-handover.js 里一共 34 处引用了
   --v2-ink-1 / --v2-line-strong / --v2-surface-2，而 admin-v2.css 只声明到
   --v2-ink-4。变量不存在又没写 fallback 时，该属性会退化成「继承」——
   正文颜色于是跟着父级走，深色浮层里就会出现同色黑字。
   与其去改 34 处引用（还要跟着回滚），不如把令牌补上：一处声明，全部生效。 */
#admin {
  --v2-ink-1: #1B2437;        /* 正文字色，比 --v2-ink 浅、比 --v2-ink-2 深 */
  --v2-line-strong: #D3DAE8;  /* 比 --v2-line 重一档，用于需要看清的分隔 */
  --v2-surface-2: #FAFBFD;    /* 次级面，卡片内浅底 */
}

/* ---------- 0. 退役旧的两段式 ---------- */
#admin .v2-rail { display: none !important; }

/* v3 在宽屏把面板宽度做成可折叠动画，这里整体放弃收起逻辑：
   单栏常驻，宽度恒定。 */
@media (min-width: 1081px) {
  #admin .v2-panel {
    overflow: visible;
    transition: none;
  }
  #admin .v2-panel > * {
    width: auto;
    flex-shrink: 0;
  }
  #admin.admin-app.nav-collapsed .v2-panel {
    width: 248px;
    min-width: 248px;
    border-right: 1px solid var(--v2-line);
    opacity: 1;
    pointer-events: auto;
  }
}

/* ---------- 1. 面板本体 ---------- */
#admin .v2-panel {
  width: 248px;
  min-width: 248px;
  flex-shrink: 0;
  background: #fff;
  border-right: 1px solid var(--v2-line);
  display: flex;
  flex-direction: column;
  position: sticky;
  top: 0;
  height: 100vh;
  z-index: 30;
}

/* ---------- 2. 品牌头 ---------- */
#admin .v2-brand {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 17px 16px 15px;
  flex-shrink: 0;
}
#admin .v2-brand-logo {
  width: 40px;
  height: 40px;
  border-radius: 11px;
  display: grid;
  place-items: center;
  background: #fff;
  border: 1px solid var(--v2-line);
  flex-shrink: 0;
  box-shadow: 0 1px 3px rgba(13, 20, 36, 0.06);
}
#admin .v2-brand-logo svg {
  width: 33px;
  height: 33px;
  display: block;
}
#admin .v2-brand-text {
  min-width: 0;
}
#admin .v2-brand-name {
  font-size: 13.5px;
  font-weight: 700;
  letter-spacing: 0.1px;
  line-height: 1.3;
  color: var(--v2-ink);
  white-space: nowrap;
}
#admin .v2-brand-tag {
  font-size: 10px;
  color: var(--v2-ink-4);
  letter-spacing: 0.1em;
  margin-top: 2px;
  line-height: 1.3;
  white-space: nowrap;
}
/* 关闭按钮只在窄屏浮层里出现 */
#admin .v2-panel-close {
  display: none;
  flex-shrink: 0;
  margin-left: auto;
  width: 26px;
  height: 26px;
  place-items: center;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 7px;
  background: transparent;
  color: var(--v2-ink-4);
  cursor: pointer;
  transition: background 0.14s, color 0.14s, border-color 0.14s;
}
#admin .v2-panel-close:hover {
  background: #f1f4fa;
  color: var(--v2-ink);
  border-color: var(--v2-line);
}
#admin .v2-panel-close svg { width: 15px; height: 15px; }

/* ---------- 3. 搜索 ---------- */
#admin .v2-search {
  position: relative;
  margin: 0 11px 6px;
  flex-shrink: 0;
}
#admin .v2-search input {
  width: 100%;
  height: 32px;
  box-sizing: border-box;
  border: 1px solid var(--v2-line);
  border-radius: 8px;
  background: #f7f9fc;
  padding: 0 34px 0 30px;
  font-size: 12px;
  color: var(--v2-ink);
  font-family: inherit;
  outline: none;
  transition: background 0.14s, border-color 0.14s, box-shadow 0.14s;
}
#admin .v2-search input::placeholder { color: var(--v2-ink-4); }
#admin .v2-search input:focus {
  background: #fff;
  border-color: #bfccff;
  box-shadow: 0 0 0 3px rgba(61, 90, 254, 0.08);
}
#admin .v2-search > svg {
  position: absolute;
  left: 9px;
  top: 9px;
  width: 14px;
  height: 14px;
  color: var(--v2-ink-4);
  pointer-events: none;
}
#admin .v2-search kbd {
  position: absolute;
  right: 6px;
  top: 7px;
  font-size: 9.5px;
  letter-spacing: 0.02em;
  color: var(--v2-ink-4);
  border: 1px solid var(--v2-line);
  border-radius: 4px;
  padding: 1px 4px;
  background: #fff;
  line-height: 1.3;
  font-family: inherit;
  pointer-events: none;
}

/* ---------- 4. 列表 ---------- */
#admin .v2-panel-list {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 4px 10px 14px;
  display: block;
}
#admin .v2-group > h5 {
  margin: 19px 0 5px;
  padding: 0 9px;
  font-size: 10px;
  font-weight: 700;
  color: var(--v2-ink-4);
  letter-spacing: 0.16em;
  line-height: 1.4;
}
#admin .v2-group:first-child > h5 { margin-top: 4px; }

/* 一级项：域的标题行 */
#admin .v2-nitem {
  display: flex;
  align-items: center;
  gap: 9px;
  width: 100%;
  height: 36px;
  padding: 0 9px;
  border: 0;
  border-radius: 8px;
  background: transparent;
  color: var(--v2-ink-2);
  font-family: inherit;
  font-size: 13px;
  line-height: 1;
  text-align: left;
  cursor: pointer;
  position: relative;
  transition: background 0.12s, color 0.12s;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#admin .v2-nitem svg {
  width: 15px;
  height: 15px;
  flex: none;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.7;
}
#admin .v2-nitem:hover { background: #f4f6fa; color: var(--v2-ink); }
#admin .v2-nitem:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
#admin .v2-nitem.on { background: var(--primary-light); color: var(--primary); font-weight: 600; }
#admin .v2-nitem.on svg { stroke-width: 2; }
#admin .v2-nitem.open { color: var(--v2-ink); font-weight: 600; }
#admin .v2-nitem.open.on { color: var(--primary); }
#admin .v2-nitem .v2-chev {
  margin-left: auto;
  width: 12px;
  height: 12px;
  flex: none;
  color: var(--v2-ink-4);
  stroke: currentColor;
  stroke-width: 2.2;
  transition: transform 0.16s;
}
#admin .v2-nitem.open .v2-chev { transform: rotate(90deg); }

/* 二级项：域里的入口，就地展开 */
#admin .v2-nsub {
  display: none;
  position: relative;
  padding: 1px 0 5px;
}
#admin .v2-nsub.on { display: block; }
#admin .v2-nsub::before {
  content: "";
  position: absolute;
  left: 15px;
  top: 2px;
  bottom: 8px;
  width: 1px;
  background: var(--v2-line);
}
#admin .v2-nsub button {
  display: flex;
  align-items: center;
  width: 100%;
  height: 29px;
  padding: 0 9px 0 28px;
  border: 0;
  background: transparent;
  color: var(--v2-ink-3);
  font-family: inherit;
  font-size: 12.5px;
  line-height: 1;
  text-align: left;
  cursor: pointer;
  border-radius: 7px;
  position: relative;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: color 0.12s, background 0.12s;
}
#admin .v2-nsub button:hover { color: var(--v2-ink); background: #f7f9fc; }
#admin .v2-nsub button:focus-visible { outline: 2px solid var(--primary); outline-offset: -2px; }
#admin .v2-nsub button.on {
  color: var(--primary);
  font-weight: 600;
  background: #f5f7ff;
}
#admin .v2-nsub button.on::before {
  content: "";
  position: absolute;
  left: 13px;
  top: 12px;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 0 2px #fff;
}

/* 搜索态：子项全展开，方便一眼看全 */
#admin .v2-panel-list.searching .v2-nsub { display: block; }
#admin .v2-panel-list.searching .v2-nitem.open .v2-chev { transform: rotate(90deg); }

/* ---------- 5. 底部用户卡 ---------- */
#admin .v2-panel-foot {
  flex-shrink: 0;
  border-top: 1px solid var(--v2-line-soft);
  padding: 9px 11px 11px;
}
#admin .v2-user {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 3px 4px;
}
#admin .v2-user-badge {
  width: 27px;
  height: 27px;
  border-radius: 8px;
  background: var(--primary-light);
  color: var(--primary);
  display: grid;
  place-items: center;
  font-size: 11px;
  font-weight: 700;
  font-style: normal;
  flex-shrink: 0;
}
#admin .v2-user-text { min-width: 0; }
#admin .v2-user-text b {
  display: block;
  font-size: 12px;
  font-weight: 600;
  line-height: 1.35;
  color: var(--v2-ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#admin .v2-user-text small {
  display: block;
  font-size: 10.5px;
  color: var(--v2-ink-4);
  line-height: 1.3;
}
#admin .v2-panel-foot .v2-logout {
  margin-left: auto;
  width: auto;
  height: auto;
  flex-shrink: 0;
  font-size: 11px;
  color: var(--v2-ink-4);
  background: none;
  border: 0;
  padding: 4px;
  cursor: pointer;
  transition: color 0.12s;
}
#admin .v2-panel-foot .v2-logout:hover { color: var(--signal-ink); border: 0; }

/* ---------- 页内页签：胶囊式 → 下划线式 ----------
   合并入口的页签是「页面级导航」，不是视图切换开关。
   下划线式与左侧分组导航同一套语言，也不会在内容区顶上多出一个灰块。 */
#admin .page-tabs {
  display: flex;
  gap: 2px;
  margin: 0 0 16px;
  padding: 0;
  background: transparent;
  border-radius: 0;
  border-bottom: 1px solid var(--v2-line);
  box-shadow: none;
}
#admin .page-tabs .page-tab {
  position: relative;
  height: 36px;
  padding: 0 14px;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--v2-ink-3);
  font-size: 13px;
  font-weight: 500;
  margin-bottom: -1px;
  transition: color 0.14s;
}
#admin .page-tabs .page-tab:hover {
  background: transparent;
  color: var(--v2-ink);
}
#admin .page-tabs .page-tab.active {
  background: transparent;
  color: var(--primary);
  font-weight: 600;
  box-shadow: none;
}
#admin .page-tabs .page-tab.active::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  border-radius: 1px 1px 0 0;
  background: var(--primary);
}

/* 面包屑始终靠左：有汉堡时不能被 justify-content 推到中间 */
#admin .admin-top .v2-crumb { margin-right: auto; }

/* ---------- 6. 窄屏：整条侧栏做浮层 ---------- */
#admin .v2-nav-toggle {
  display: none;
  flex-shrink: 0;
  width: 30px;
  height: 30px;
  place-items: center;
  padding: 0;
  border: 1px solid var(--v2-line);
  border-radius: 8px;
  background: #fff;
  color: var(--v2-ink-2);
  cursor: pointer;
}
#admin .v2-nav-toggle svg { width: 16px; height: 16px; }
#admin .v2-nav-toggle:hover { border-color: #c7d0de; }

@media (max-width: 1080px) {
  #admin .v2-panel {
    position: fixed;
    left: 0;
    top: 0;
    width: 248px;
    min-width: 248px;
    transform: translateX(-100%);
    transition: transform 0.22s cubic-bezier(0.32, 0.72, 0.28, 1);
    box-shadow: 0 12px 40px rgba(13, 20, 36, 0.18);
    z-index: 40;
  }
  #admin .v2-panel.open { transform: translateX(0); }
  #admin .v2-panel-close { display: grid; }
  #admin .v2-nav-toggle { display: grid; }
  #admin .admin-main { padding: 16px 18px 24px; }
  #admin .admin-top { padding: 12px 18px; }
}

@media (max-width: 720px) {
  #admin .admin-top .admin-user-pill { display: none; }
  #admin .admin-top h1 { font-size: 16px; }
  #admin .v2-crumb-home,
  #admin .v2-crumb-sep { display: none; }
  #admin .admin-main { padding: 12px 12px 22px; }
  #admin .panel-body { padding: 12px; }
}

/* ============================================================================
   内容区（第二批）—— 把各模块各自的旧样式压成同一套页面语言
   ----------------------------------------------------------------------------
   背景：39 个页面分属 6 个 JS 文件，每个文件都用 ensureStyle() 往 <head> 末尾
   动态插一份 <style>。动态 style 晚于所有 <link>，所以本文件里同优先级的选择器
   一律会被它们压掉。这里统一用 `#admin #adminMain .x`（多一个 id）提高特异性，
   不去动那些 JS 里的样式字符串 —— 好处是回滚只要删这一个文件。
   ============================================================================ */

/* ---------- 1. 顶栏：一行面包屑 → 小标签 + 大标题 + 说明 ---------- */
#admin .admin-top {
  padding: 11px 26px 10px;
  gap: 18px;
}
#admin .at-head {
  display: flex;
  flex-direction: column;
  gap: 1px;
  min-width: 0;
  margin-right: auto;
}
#admin .at-head .v2-crumb {
  gap: 5px;
  min-height: 14px;
}
#admin .at-head .v2-crumb-link {
  font-size: 10px;
  letter-spacing: 0.03em;
  padding: 1px 3px;
  color: var(--v2-ink-4);
}
#admin .at-head .v2-crumb-sep {
  font-size: 10px;
  color: #D2D9E4;
}
#admin .at-titleline {
  display: flex;
  align-items: baseline;
  gap: 10px;
  min-width: 0;
}
#admin .admin-top h1 {
  font-size: 18px;
  font-weight: 700;
  letter-spacing: -0.25px;
  line-height: 1.3;
}
/* 一域多页时标题是「域名 + 当前页名」：域名大，页名小字跟在后面。
   这样切页签时大标题不动，只有后面那截小字变，不会四个页像四个模块。 */
#admin .admin-top h1 em {
  margin-left: 8px;
  font-style: normal;
  font-size: 12.5px;
  font-weight: 500;
  color: var(--v2-ink-4);
  letter-spacing: 0;
}
#admin .at-sub {
  margin: 0;
  font-size: 11.5px;
  font-weight: 400;
  color: var(--v2-ink-4);
  letter-spacing: 0.01em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ---------- 2. 页面容器：统一边距，收掉「一页一张大白卡」的观感 ---------- */
#admin #adminMain .rf-wrap,
#admin #adminMain .ho-wrap,
#admin #adminMain .lsr-wrap,
#admin #adminMain .ev-wrap {
  padding: 16px 26px 28px;
  max-width: none;
}

/* ---------- 3. 页内标题降级为工具条 ----------
   顶栏已经有 18px 的页面大标题，页面里再出现 17px 标题就是两个 h1 打架。
   工具条只留「这批有多少条」+ 右侧动作。 */
#admin #adminMain .rf-head {
  align-items: center;
  margin-bottom: 10px;
  gap: 12px;
}
#admin #adminMain .rf-title {
  font-size: 12.5px;
  font-weight: 400;
  color: var(--v2-ink-3);
  line-height: 1.6;
  letter-spacing: 0.01em;
}
#admin #adminMain .rf-title em {
  font-size: 12.5px;
  color: var(--v2-ink-2);
  margin-left: 6px;
}

/* ---------- 4. 筛选行：一行排开，不再是一坨灰盒子 ---------- */
#admin #adminMain .rf-filters {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  padding: 0;
  margin-bottom: 12px;
  background: transparent;
  border: 0;
  border-radius: 0;
}
#admin #adminMain .rf-field {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 11.5px;
  color: var(--v2-ink-3);
  white-space: nowrap;
}
#admin #adminMain .rf-input {
  height: 32px;
  padding: 0 10px;
  font-size: 12.5px;
  border: 1px solid var(--v2-line);
  border-radius: 7px;
  background: #fff;
  color: var(--v2-ink);
  font-family: inherit;
  min-width: 120px;
}
#admin #adminMain .rf-input:focus {
  outline: 0;
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(61, 90, 254, 0.1);
}
#admin #adminMain .rf-input::placeholder { color: #A9B4C6; }

/* ---------- 5. 状态页签：胶囊 → 下划线（与页签栏同一套语言） ---------- */
#admin #adminMain .rf-tabs {
  display: flex;
  gap: 2px;
  flex-wrap: wrap;
  margin-bottom: 12px;
  padding: 0;
  background: transparent;
  border-bottom: 1px solid var(--v2-line);
  border-radius: 0;
}
#admin #adminMain .rf-tab {
  position: relative;
  height: 34px;
  padding: 0 12px;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--v2-ink-3);
  font-size: 12.5px;
  font-weight: 500;
  font-family: inherit;
  cursor: pointer;
  margin-bottom: -1px;
  transition: color 0.14s;
}
#admin #adminMain .rf-tab:hover { background: transparent; color: var(--v2-ink); }
#admin #adminMain .rf-tab.is-active {
  background: transparent;
  color: var(--primary);
  font-weight: 600;
  box-shadow: none;
}
#admin #adminMain .rf-tab.is-active::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  border-radius: 1px 1px 0 0;
  background: var(--primary);
}

/* ---------- 6. KPI 行：四张卡 → 一行细分隔指标 ---------- */
#admin #adminMain .rf-kpi {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 0;
  margin-bottom: 12px;
  background: #fff;
  border: 1px solid var(--v2-line);
  border-radius: 12px;
  overflow: hidden;
}
#admin #adminMain .rf-kpi-card {
  padding: 11px 16px 12px;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
}
#admin #adminMain .rf-kpi-card + .rf-kpi-card {
  border-left: 1px solid var(--v2-line-soft);
}
#admin #adminMain .rf-kpi-label {
  font-size: 11px;
  color: var(--v2-ink-4);
  letter-spacing: 0.01em;
}
#admin #adminMain .rf-kpi-value {
  margin-top: 3px;
  font-size: 21px;
  font-weight: 700;
  letter-spacing: -0.4px;
  color: var(--v2-ink);
  font-variant-numeric: tabular-nums;
  line-height: 1.25;
}
#admin #adminMain .rf-kpi-sub {
  margin-top: 1px;
  font-size: 10.5px;
  color: var(--v2-ink-4);
}

/* ---------- 7. 表格 ---------- */
#admin #adminMain .rf-panel {
  border: 1px solid var(--v2-line);
  border-radius: 12px;
  background: #fff;
  overflow: hidden;
  box-shadow: none;
}
#admin #adminMain .rf-table thead th {
  padding: 9px 12px;
  font-size: 11px;
  font-weight: 600;
  color: var(--v2-ink-3);
  background: #FAFBFD;
  border-bottom: 1px solid var(--v2-line);
  letter-spacing: 0.02em;
  white-space: nowrap;
}
#admin #adminMain .rf-table tbody td {
  padding: 10px 12px;
  font-size: 12.5px;
  color: var(--v2-ink-2);
  border-bottom: 1px solid var(--v2-line-soft);
}
#admin #adminMain .rf-table tbody tr:hover td { background: #FAFBFD; }
#admin #adminMain .rf-table tbody tr:last-child td { border-bottom: 0; }
#admin #adminMain .rf-code {
  font-variant-numeric: tabular-nums;
  color: var(--v2-ink);
  font-weight: 500;
}

@media (max-width: 1080px) {
  #admin .at-sub { display: none; }
  #admin .admin-top { padding: 10px 18px; }
  #admin #adminMain .rf-wrap,
  #admin #adminMain .ho-wrap,
  #admin #adminMain .lsr-wrap,
  #admin #adminMain .ev-wrap { padding: 14px 18px 24px; }
  #admin #adminMain .rf-kpi { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #admin #adminMain .rf-kpi-card:nth-child(3) { border-left: 0; }
  #admin #adminMain .rf-kpi-card:nth-child(n + 3) { border-top: 1px solid var(--v2-line-soft); }
}

/* ---------- 8. 修掉内容区里的蓝紫渐变 ----------
   旧样式里 hero / 进度条 / 花名册工具条都铺了 118deg 的紫蓝渐变，
   在 248px 单栏的冷灰底上显得像营销页。统一改成白底 + 发丝边框，
   主色只出现在应有的地方（选中态、主按钮、进度填充）。 */
#admin #adminMain .dash-hero {
  background: #fff;
  border: 1px solid var(--v2-line);
  box-shadow: none;
  padding: 18px 22px;
}
#admin #adminMain .dash-hero::before {
  display: none;
}
#admin #adminMain .dash-rate-track i,
#admin #adminMain .rate-track i {
  background: var(--primary);
}
#admin #adminMain .rf-bar {
  background: #fff;
}

/* 筛选字段默认是纵向堆的（旧样式的 flex-direction:column），这里压回一行 */
#admin #adminMain .rf-field {
  flex-direction: row;
  align-items: center;
}

/* hero 里的四个指标：分隔线跟着底色一起调淡 */
#admin #adminMain .dash-kpi {
  border-left-color: var(--v2-line);
}
#admin #adminMain .dash-kpi:first-child {
  border-left: 0;
}

/* ---------- 9. 按钮统一 ----------
   styles.css 末尾有一段「全局重刷」，把 .btn-primary 写死成 #1f4e79（旧主题的深藏青）、
   .btn-ghost 写成淡蓝底。那是打卡端的配色，后台的主色是 #3D5AFE。
   这里只在 #admin 作用域内改回来，打卡端与登录页不受影响。 */
#admin .btn-primary {
  background: var(--primary);
  box-shadow: none;
}
#admin .btn-primary:hover:not(:disabled) {
  background: var(--primary-dark);
}
#admin .btn-ghost {
  background: #fff;
  color: var(--v2-ink-2);
  border: 1px solid var(--v2-line);
  box-shadow: none;
}
#admin .btn-ghost:hover:not(:disabled) {
  background: #F6F8FB;
  border-color: #D5DCE8;
  color: var(--v2-ink);
}
#admin .btn-primary,
#admin .btn-ghost,
#admin .btn-ok,
#admin .btn-bad,
#admin .btn-outline,
#admin .btn-warn {
  min-height: 32px;
  padding: 0 13px;
  border-radius: 8px;
  font-size: 12.5px;
  font-weight: 500;
  line-height: 30px;
}
#admin .btn-sm {
  min-height: 28px;
  padding: 0 10px;
  font-size: 12px;
  line-height: 26px;
}

/* ---------- 10. 设置页：顶栏已经写了页面名，面板头里的同名标题是重复的 ---------- */
#admin #adminMain[data-page="settings"] > .panel > .panel-head {
  display: none;
}
#admin #adminMain[data-page="settings"] > .panel {
  padding-top: 18px;
}

/* ---------- 11. 页签栏与内容之间留出呼吸 ---------- */
#admin #adminMain > .page-tabs-wrap {
  margin-bottom: 14px;
}
#admin #adminMain > .page-tabs-wrap > .page-tabs {
  margin-bottom: 0;
}

/* 入口下的二级条（如 加班与工时 → 本公司加班 / 承包商工时）。
   与主页面签是两级信息，所以不做成同样的下划线，用浅底小胶囊，
   高度压到 28px，视觉上明显退一层。 */
#admin .page-subtabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 10px 0 2px;
}
#admin .page-subtabs .page-tab {
  height: 26px;
  padding: 0 11px;
  border: 1px solid var(--v2-line);
  border-radius: 6px;
  background: #fff;
  color: var(--v2-ink-3);
  font-size: 12px;
  font-weight: 500;
  margin: 0;
}
#admin .page-subtabs .page-tab:hover {
  border-color: #C3CDF0;
  color: var(--v2-ink);
}
#admin .page-subtabs .page-tab.active {
  border-color: #C3CDF0;
  background: var(--primary-soft, #EEF1FF);
  color: var(--primary);
  font-weight: 600;
}
#admin .page-subtabs .page-tab.active::after { display: none; }

/* ---------- 12. 交接班 / LSR 的页内标题同样降级 ---------- */
#admin #adminMain .rf-title em,
#admin #adminMain .ho-title em,
#admin #adminMain .lsr-title em {
  margin-left: 0;
}
#admin #adminMain .ho-title,
#admin #adminMain .lsr-title {
  font-size: 12.5px;
  font-weight: 400;
  color: var(--v2-ink-3);
  line-height: 1.6;
  letter-spacing: 0.01em;
}
#admin #adminMain .ho-head,
#admin #adminMain .lsr-head {
  align-items: center;
  margin-bottom: 10px;
}
#admin #adminMain .lsr-sub {
  font-size: 11.5px;
  color: var(--v2-ink-4);
  margin-top: 1px;
  max-width: none;
}

/* ---------- 13. 收掉双层内边距与工具条底色 ----------
   实测：#adminMain 已经有 26px 左右内边距，各模块的 .xx-wrap 又补了 26px，
   两层叠起来内容比顶栏多缩进 26px，右边缘也对不齐。这里把 wrap 的内边距归零，
   由 #adminMain 单独负责；工具条自带的 #FAFBFD 底色一并去掉，避免出现"卡中卡"。 */
#admin #adminMain .rf-wrap,
#admin #adminMain .ho-wrap,
#admin #adminMain .lsr-wrap,
#admin #adminMain .ev-wrap {
  padding: 0;
}
#admin #adminMain .rf-head,
#admin #adminMain .ho-head,
#admin #adminMain .lsr-head {
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: 0;
}

/* ---------- 14. 交接班筛选区同样去壳 ----------
   .ho-filters 用的是 var(--v2-surface-2, #FAFBFD) —— 这个变量在 #admin 上
   从来没声明过，永远走 fallback，于是筛选区变成一块灰底圆角盒。
   这里直接不要底色，与整改单的筛选行保持同一种观感。 */
#admin #adminMain .ho-filters {
  padding: 0;
  margin-bottom: 12px;
  gap: 8px;
  background: transparent;
  border: 0;
  border-radius: 0;
}
#admin #adminMain .ho-input,
#admin #adminMain .ho-select {
  height: 32px;
  padding: 0 9px;
  background: #fff;
  border: 1px solid var(--v2-line);
  border-radius: 7px;
}
#admin #adminMain .ho-input:focus,
#admin #adminMain .ho-select:focus {
  outline: 0;
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(61, 90, 254, 0.1);
}

/* ============================================================
   15. 登录页 v4 —— 左品牌 / 右表单
   ------------------------------------------------------------
   旧版是 900px 卡片 + 深蓝绿渐变左栏（#163c5d→#1f4e79→#0f766e），
   与后台 #3D5AFE 完全是两套颜色。这里整页铺开、左右分栏，
   左侧浅色品牌区，右侧白底表单，与后台同一套色板。

   变量只声明在 #login 上（登录页不在 #admin 内，拿不到后台令牌）。
   styles.css 里的 .login-wrapper 等旧类整段弃用，DOM 已删。
   ============================================================ */
#login.login-page {
  --lg-primary: #3D5AFE;
  --lg-primary-dark: #2F49DA;
  --lg-primary-soft: #EEF1FF;
  --lg-signal: #FF6B4A;
  --lg-ink: #0C1526;
  --lg-ink-2: #28324A;
  --lg-ink-3: #68768A;
  --lg-ink-4: #94A2B8;
  --lg-line: #E3E8F1;
  --lg-line-soft: #EDF1F7;
  display: block;
  align-items: stretch;
  justify-content: flex-start;
  padding: 0;
  background: #FBFCFE;
  min-height: 100vh;
  min-height: 100dvh;
  color: var(--lg-ink);
  font-size: 13px;
  line-height: 1.7;
  font-variant-numeric: tabular-nums;
  -webkit-font-smoothing: antialiased;
}
#login .lg-wrap {
  display: grid;
  grid-template-columns: minmax(0, 1.08fr) minmax(430px, 0.92fr);
  min-height: 100vh;
  min-height: 100dvh;
}

/* ---------- 15.1 左：品牌区 ---------- */
#login .lg-side {
  position: relative;
  overflow: hidden;
  padding: 42px 52px 34px;
  display: flex;
  flex-direction: column;
  border-right: 1px solid var(--lg-line);
  background:
    radial-gradient(820px 440px at 2% 4%, #F0F4FF 0%, rgba(240, 244, 255, 0) 62%),
    radial-gradient(640px 420px at 98% 98%, #E9EFFF 0%, rgba(233, 239, 255, 0) 58%),
    #FBFCFE;
}
#login .lg-ghost {
  position: absolute;
  right: -176px;
  bottom: -214px;
  width: 520px;
  height: 520px;
  opacity: 0.03;
  pointer-events: none;
  transform: rotate(-8deg);
}
#login .lg-ghost svg { width: 100%; height: 100%; display: block; }

#login .lg-brand { display: flex; align-items: center; gap: 13px; position: relative; }
#login .lg-logo { width: 50px; height: 50px; flex-shrink: 0; }
#login .lg-logo svg { width: 100%; height: 100%; display: block; }
#login .lg-name { font-size: 18.5px; font-weight: 700; letter-spacing: -0.2px; line-height: 1.3; }
#login .lg-en { font-size: 9.5px; letter-spacing: 0.2em; color: var(--lg-ink-4); margin-top: 3px; }

#login .lg-notice {
  position: relative;
  display: flex;
  align-items: center;
  gap: 9px;
  margin-top: 22px;
  padding: 9px 12px;
  background: #fff;
  border: 1px solid var(--lg-line);
  border-radius: 9px;
  font-size: 11.5px;
  color: var(--lg-ink-3);
  align-self: flex-start;
  max-width: 100%;
}
#login .lg-notice::before {
  content: "";
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--lg-signal);
  box-shadow: 0 0 0 3px rgba(255, 107, 74, 0.12);
  flex-shrink: 0;
}
#login .lg-notice b { font-weight: 600; color: var(--lg-ink-2); flex-shrink: 0; }
#login .lg-notice span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

#login .lg-mid {
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 18px 0 22px;
  position: relative;
}
#login .lg-pitch {
  margin: 0;
  font-size: 33px;
  line-height: 1.5;
  font-weight: 600;
  letter-spacing: -0.8px;
  max-width: 13em;
  color: var(--lg-ink);
}
#login .lg-pitch b { font-weight: 700; color: var(--lg-primary); }
#login .lg-pitch-sub { margin: 13px 0 0; font-size: 12.5px; color: var(--lg-ink-3); line-height: 1.95; }
#login .lg-pitch-sub span { display: block; }
#login .lg-pitch-sub i { font-style: normal; color: var(--lg-ink-4); margin: 0 6px; opacity: 0.6; }

#login .lg-grp {
  font-size: 10.5px;
  letter-spacing: 0.12em;
  color: var(--lg-ink-4);
  font-weight: 600;
  margin: 30px 0 10px;
  display: flex;
  align-items: center;
  gap: 8px;
}
#login .lg-grp::before { content: ""; width: 12px; height: 1px; background: #C7D0DE; flex-shrink: 0; }

#login .lg-caps { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; max-width: 520px; }
#login .lg-cap {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 13px 14px;
  background: #fff;
  border: 1px solid var(--lg-line);
  border-radius: 10px;
}
#login .lg-cap > i {
  width: 26px;
  height: 26px;
  flex-shrink: 0;
  border-radius: 7px;
  background: var(--lg-primary-soft);
  display: grid;
  place-items: center;
}
#login .lg-cap > i svg { width: 14px; height: 14px; stroke: var(--lg-primary); fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
#login .lg-cap b { display: block; font-size: 12.5px; font-weight: 600; line-height: 1.5; }
#login .lg-cap s { display: block; text-decoration: none; font-size: 11px; color: var(--lg-ink-4); line-height: 1.6; margin-top: 1px; }

#login .lg-flow { display: flex; align-items: center; max-width: 520px; }
#login .lg-flow > div { flex: 1; display: flex; align-items: baseline; gap: 7px; min-width: 0; }
#login .lg-flow b {
  font-size: 10px;
  font-weight: 700;
  color: var(--lg-primary);
  letter-spacing: 0.04em;
  background: var(--lg-primary-soft);
  border-radius: 5px;
  padding: 1px 5px;
  flex-shrink: 0;
}
#login .lg-flow span { font-size: 11.5px; color: var(--lg-ink-3); white-space: nowrap; }
#login .lg-flow i { font-style: normal; color: #C7D0DE; font-size: 12px; padding: 0 10px; flex-shrink: 0; }

#login .lg-legal { margin-top: 18px; font-size: 11px; color: var(--lg-ink-4); line-height: 1.9; }
#login .lg-legal i { font-style: normal; opacity: 0.4; margin: 0 6px; }
#login .lg-legal s { text-decoration: none; opacity: 0.85; }

/* ---------- 15.2 右：表单区 ---------- */
#login .lg-main {
  background: #fff;
  display: flex;
  flex-direction: column;
  padding: 34px 52px 22px;
}
#login .lg-form { width: 100%; max-width: 366px; margin: auto; }
#login .lg-eyebrow {
  font-size: 10px;
  letter-spacing: 0.16em;
  color: var(--lg-ink-4);
  font-weight: 600;
  margin-bottom: 9px;
  display: flex;
  align-items: center;
  gap: 7px;
}
#login .lg-eyebrow::after { content: ""; flex: 1; height: 1px; background: var(--lg-line-soft); }
#login .lg-title { margin: 0; font-size: 21px; font-weight: 700; letter-spacing: -0.3px; color: var(--lg-ink); }
#login .lg-sub { margin: 6px 0 22px; font-size: 12.5px; color: var(--lg-ink-4); }

#login .lg-err {
  display: none;
  margin: 0 0 14px;
  padding: 9px 12px;
  font-size: 12px;
  line-height: 1.7;
  color: #B42318;
  background: #FEF3F2;
  border: 1px solid #FECDCA;
  border-left: 2px solid #D92D20;
  border-radius: 7px;
}
#login .lg-err.show { display: block; }
/* 提示型（忘记密码 / 状态过期）：中性蓝灰，不是报错 */
#login .lg-err.info {
  color: #2C3E66;
  background: #F4F7FE;
  border-color: #DCE4F7;
  border-left-color: #7D93C9;
}

#login .lg-field { margin-bottom: 13px; }
#login .lg-field > label { display: block; font-size: 11.5px; color: var(--lg-ink-3); margin-bottom: 6px; font-weight: 500; }
#login .lg-ipt {
  position: relative;
  display: flex;
  align-items: center;
  height: 42px;
  border: 1px solid var(--lg-line);
  border-radius: 9px;
  background: #fff;
  transition: border-color 0.14s, box-shadow 0.14s;
}
#login .lg-ipt:focus-within { border-color: #A9BAFF; box-shadow: 0 0 0 3px rgba(61, 90, 254, 0.09); }
#login .lg-ipt > svg {
  width: 15px;
  height: 15px;
  margin: 0 9px 0 13px;
  flex-shrink: 0;
  stroke: var(--lg-ink-4);
  fill: none;
  stroke-width: 1.7;
  stroke-linecap: round;
}
#login .lg-ipt input {
  flex: 1;
  min-width: 0;
  height: 100%;
  border: 0;
  background: none;
  outline: none;
  font-size: 13px;
  color: var(--lg-ink);
  font-family: inherit;
  padding: 0 12px 0 0;
  box-shadow: none;
}
#login .lg-ipt input::placeholder { color: #B7C1D0; }
#login .lg-eye {
  border: 0;
  background: none;
  padding: 0 12px;
  height: 100%;
  cursor: pointer;
  color: var(--lg-ink-4);
  display: grid;
  place-items: center;
}
#login .lg-eye:hover { color: var(--lg-ink-3); }
#login .lg-eye svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 1.7; stroke-linecap: round; }
#login .lg-eye.on { color: var(--lg-primary); }

#login .lg-row { display: flex; align-items: center; gap: 8px; margin: 2px 0 18px; }
#login .lg-check { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--lg-ink-3); cursor: pointer; user-select: none; }
#login .lg-check input { width: 13px; height: 13px; accent-color: var(--lg-primary); margin: 0; cursor: pointer; }
#login .lg-sp { flex: 1; }
#login .lg-link {
  border: 0;
  background: none;
  padding: 0;
  font-size: 12px;
  color: var(--lg-primary);
  cursor: pointer;
  font-family: inherit;
}
#login .lg-link:hover { color: var(--lg-primary-dark); text-decoration: underline; }

#login .lg-submit {
  width: 100%;
  height: 42px;
  border: 0;
  border-radius: 9px;
  background: var(--lg-primary);
  color: #fff;
  font-size: 13.5px;
  font-weight: 600;
  font-family: inherit;
  letter-spacing: 0.02em;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  cursor: pointer;
  transition: background 0.14s, transform 0.1s;
  box-shadow: 0 1px 2px rgba(61, 90, 254, 0.24);
}
#login .lg-submit:hover { background: var(--lg-primary-dark); }
#login .lg-submit:active { transform: translateY(1px); }
#login .lg-submit:disabled { background: #B8C2F5; cursor: default; transform: none; box-shadow: none; }
#login .lg-submit svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

#login .lg-note {
  display: flex;
  gap: 8px;
  margin-top: 18px;
  padding: 11px 12px;
  background: #F8FAFE;
  border: 1px solid var(--lg-line-soft);
  border-radius: 8px;
  font-size: 11.5px;
  line-height: 1.75;
  color: var(--lg-ink-3);
}
#login .lg-note svg { width: 13px; height: 13px; flex-shrink: 0; margin-top: 2px; stroke: var(--lg-ink-4); fill: none; stroke-width: 1.7; stroke-linecap: round; }
#login .lg-note b { color: var(--lg-ink-2); font-weight: 600; }

#login .lg-help { margin-top: 22px; padding-top: 14px; border-top: 1px solid var(--lg-line-soft); }
#login .lg-help-hd { font-size: 10.5px; letter-spacing: 0.1em; color: var(--lg-ink-4); font-weight: 600; margin-bottom: 8px; }
#login .lg-help-i { display: flex; gap: 10px; font-size: 11.5px; line-height: 1.8; padding: 2px 0; }
#login .lg-help-i b { flex: 0 0 62px; color: var(--lg-ink-2); font-weight: 500; }
#login .lg-help-i span { flex: 1; color: var(--lg-ink-4); }

#login .lg-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-top: 16px;
  font-size: 11px;
  color: var(--lg-ink-4);
}
#login .lg-lock { display: inline-flex; align-items: center; gap: 5px; }
#login .lg-lock svg { width: 12px; height: 12px; stroke: currentColor; fill: none; stroke-width: 1.7; stroke-linecap: round; }
#login .lg-foot a { color: var(--lg-ink-4); text-decoration: none; }
#login .lg-foot a:hover { color: var(--lg-primary); }

/* ---------- 15.3 窄屏 ---------- */
@media (max-width: 1100px) {
  #login .lg-wrap { grid-template-columns: minmax(0, 1fr) minmax(390px, 0.85fr); }
  #login .lg-side { padding: 34px 36px 28px; }
  #login .lg-pitch { font-size: 28px; }
  #login .lg-main { padding: 28px 36px 20px; }
}
@media (max-width: 900px) {
  #login .lg-wrap { grid-template-columns: minmax(0, 1fr); }
  #login .lg-side { min-width: 0; border-right: 0; border-bottom: 1px solid var(--lg-line); padding: 26px 22px 22px; }
  #login .lg-ghost { display: none; }
  #login .lg-mid { padding: 20px 0 4px; justify-content: flex-start; }
  #login .lg-pitch { font-size: 24px; max-width: none; }
  #login .lg-pitch-sub { font-size: 12px; }
  #login .lg-caps, #login .lg-flow, #login .lg-grp, #login .lg-legal { display: none; }
  #login .lg-notice { margin-top: 16px; min-width: 0; }
  #login .lg-notice span { white-space: normal; line-height: 1.6; }
  #login .lg-main { min-width: 0; padding: 24px 22px 20px; }
  #login .lg-form { margin: 0 auto; }
  #login .lg-help { display: none; }
  /* 430px 下「加密传输 / 备案号」两端对齐会顶到边缘，改成单行左起 */
  #login .lg-foot { flex-wrap: wrap; gap: 4px 14px; }
}

/* ============================================================
   16. 值班台 —— KPI 仪表带 + 待办带
   ------------------------------------------------------------
   原来是「渐变 hero 卡（左大打卡率 + 右 4 KPI）+ 3 张图标快捷卡」。
   现在拆成两层：
     · 仪表带：一张白卡横向切 5 格，打卡率占 1.45 格，其余等宽，
       格与格之间只有发丝竖线；
     · 待办带：三张带真实件数的待办卡，周报/主管提醒降级为带下文字入口。
   旧的 .dash-hero / .dash-kpi / .dash-quick>button 样式留在 v3 里不再命中。
   ============================================================ */

/* ---------- 16.1 仪表带 ---------- */
#admin #adminMain .dash-strip {
  display: grid;
  grid-template-columns: 1.45fr repeat(4, minmax(0, 1fr));
  background: #fff;
  border: 1px solid var(--v2-line);
  border-radius: 12px;
  overflow: hidden;
}
#admin #adminMain .strip-cell {
  padding: 15px 18px 16px;
  border-left: 1px solid #EEF1F7;
  min-width: 0;
}
#admin #adminMain .strip-cell:first-child { border-left: 0; }
#admin #adminMain .strip-k {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 11.5px;
  color: var(--v2-ink-4);
  white-space: nowrap;
}
#admin #adminMain .strip-v {
  font-size: 26px;
  font-weight: 750;
  letter-spacing: -0.8px;
  line-height: 1.15;
  color: var(--v2-ink);
  margin-top: 4px;
  font-variant-numeric: tabular-nums;
}
#admin #adminMain .strip-v-lg { font-size: 36px; letter-spacing: -1.6px; }
#admin #adminMain .strip-v small {
  font-size: 15px;
  font-weight: 700;
  color: var(--v2-ink-4);
  margin-left: 1px;
  letter-spacing: 0;
}
#admin #adminMain .strip-v.warn { color: #C2452A; }
#admin #adminMain .strip-v.info { color: #2F49DA; }
#admin #adminMain .strip-n {
  font-size: 11px;
  color: var(--v2-ink-4);
  margin-top: 2px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
#admin #adminMain .strip-track {
  height: 5px;
  border-radius: 99px;
  background: #E9EDF6;
  overflow: hidden;
  margin-top: 11px;
}
#admin #adminMain .strip-track i {
  display: block;
  height: 100%;
  border-radius: 99px;
  background: var(--primary);
  transition: width 0.5s cubic-bezier(0.22, 0.8, 0.3, 1);
}
#admin #adminMain .dash-strip-foot {
  margin-top: 8px;
  font-size: 11.5px;
  color: var(--v2-ink-4);
}

/* ---------- 16.2 待办带 ----------
   #dashQuick 在 v3 里是 display:grid 三列 + 直接子级是 button，
   现在子级换成 .dash-todos / .dash-tools 两个块，必须把容器改回 block。 */
#admin #adminMain #dashQuick { display: block; }
#admin #adminMain .dash-todos {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
  margin-top: 12px;
}
#admin #adminMain .dash-todo {
  position: relative;
  display: block;
  width: 100%;
  text-align: left;
  padding: 13px 30px 14px 16px;
  background: #fff;
  border: 1px solid var(--v2-line);
  border-radius: 11px;
  cursor: pointer;
  font-family: inherit;
  transition: border-color 0.14s, box-shadow 0.14s;
}
#admin #adminMain .dash-todo:hover {
  border-color: #C3CDF0;
  box-shadow: 0 6px 16px rgba(13, 20, 36, 0.06);
}
#admin #adminMain .dash-todo:active { transform: translateY(1px); }
#admin #adminMain .todo-k {
  display: block;
  font-size: 11.5px;
  color: var(--v2-ink-3);
}
#admin #adminMain .todo-v {
  display: block;
  font-size: 22px;
  font-weight: 750;
  letter-spacing: -0.6px;
  line-height: 1.2;
  color: var(--v2-ink-2);
  margin-top: 2px;
  font-variant-numeric: tabular-nums;
}
/* 0 不收「要处理」的颜色，但也不做灰到看不见的处理 */
#admin #adminMain .dash-todo.is-zero .todo-v { color: var(--v2-ink-4); }
#admin #adminMain .dash-todo:hover .todo-v { color: var(--primary); }
#admin #adminMain .todo-n {
  display: block;
  font-size: 11px;
  color: var(--v2-ink-4);
  margin-top: 1px;
}
#admin #adminMain .todo-go {
  position: absolute;
  right: 14px;
  top: 50%;
  transform: translateY(-50%);
  color: #C7D0DE;
  font-size: 17px;
  line-height: 1;
}

/* 卡片头里的下拉（公司 / 主管选择器）：原来吃浏览器原生的方角样式，
   与旁边 12px 的卡片标题不在一个语汇里，这里统一成 28px 小控件。 */
#admin #adminMain .dash-card-head select {
  height: 28px;
  padding: 0 26px 0 9px;
  font-size: 11.5px;
  font-family: inherit;
  color: var(--v2-ink-2);
  background-color: #fff;
  border: 1px solid var(--v2-line);
  border-radius: 7px;
  appearance: none;
  -webkit-appearance: none;
  cursor: pointer;
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2368768A' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 7px center;
  background-size: 13px 13px;
}
#admin #adminMain .dash-card-head select:focus {
  outline: 0;
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(61, 90, 254, 0.1);
}

/* ---------- 16.3 带下工具入口 ---------- */#admin #adminMain .dash-tools {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 10px;
  font-size: 11.5px;
  color: var(--v2-ink-4);
}
#admin #adminMain .dash-tools button {
  border: 0;
  background: none;
  padding: 0 0 1px;
  font: inherit;
  font-size: 11.5px;
  color: var(--v2-ink-3);
  cursor: pointer;
  border-bottom: 1px dashed #D6DCEA;
}
#admin #adminMain .dash-tools button:hover { color: var(--primary); border-bottom-color: var(--primary); }
#admin #adminMain .dash-tools-sep { color: #C7D0DE; }

/* ---------- 16.4 窄屏 ----------
   5 格要拆成 2 列，不能让最后一格孤零零挂在第三列（会留一块空白）。
   第 5 格跨满两列，待办带第 3 张同理。 */
@media (max-width: 1240px) {
  #admin #adminMain .dash-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #admin #adminMain .strip-cell { border-top: 1px solid #EEF1F7; }
  #admin #adminMain .strip-cell:nth-child(1),
  #admin #adminMain .strip-cell:nth-child(2) { border-top: 0; }
  #admin #adminMain .strip-cell:nth-child(odd) { border-left: 0; }
  #admin #adminMain .strip-cell:nth-child(5) { grid-column: 1 / -1; }
  #admin #adminMain .dash-todos { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #admin #adminMain .dash-todo:nth-child(3) { grid-column: 1 / -1; }
}
@media (max-width: 760px) {
  #admin #adminMain .dash-strip { grid-template-columns: 1fr; }
  #admin #adminMain .strip-cell { border-left: 0; }
  #admin #adminMain .strip-cell:nth-child(2) { border-top: 1px solid #EEF1F7; }
  #admin #adminMain .dash-todos { grid-template-columns: 1fr; }
  #admin #adminMain .dash-todo:nth-child(3) { grid-column: auto; }
}

/* ============================================================
   17. 安全台账 —— 按 v5/ledger.html 的版式收拢
   ------------------------------------------------------------
   原来这一页从上到下是：页内标题行 → 四个筛选字段 + 两个按钮
   → 状态页签 → 四张 KPI 卡（比表格还高）→ 表格。
   台账页是查单子的地方，四张统计卡把表格顶到了首屏之外。

   现在：状态页签 → 一行筛选（搜索 / 单位 / 查询 / …… / 计数 / 更多 / 导出 / 刷新）
   → 表格。日期区间收进「更多筛选」，默认收起。
   ============================================================ */

/* ---------- 17.1 筛选行 ---------- */
#admin #adminMain .rf-f-q { width: 250px; }
#admin #adminMain .rf-f-co { width: 158px; }
#admin #adminMain .rf-f-sp { flex: 1 1 auto; min-width: 8px; }

#admin #adminMain .rf-count {
  font-size: 11.5px;
  color: var(--v2-ink-4);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
#admin #adminMain .rf-count b {
  font-size: 13px;
  font-weight: 700;
  color: var(--v2-ink);
}
#admin #adminMain .rf-count i {
  font-style: normal;
  margin: 0 7px;
  opacity: 0.4;
}

/* ---------- 17.2 更多筛选 ---------- */
#admin #adminMain .rf-more {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  padding: 11px 13px;
  margin: 0 0 12px;
  background: #FAFBFD;
  border: 1px solid var(--v2-line-soft);
  border-radius: 9px;
}
#admin #adminMain .rf-more[hidden] { display: none; }
#admin #adminMain .rf-btn.is-on {
  border-color: #C3CDF0;
  background: #EEF1FF;
  color: var(--primary);
}

/* ---------- 17.3 状态页签紧贴筛选行上方 ---------- */
#admin #adminMain .rf-wrap > .rf-tabs { margin-top: -2px; }

@media (max-width: 900px) {
  #admin #adminMain .rf-f-q,
  #admin #adminMain .rf-f-co { width: 100%; }
}

/* ============================================================
   18. 值班台 —— 分段叙事 + 结论句
   ------------------------------------------------------------
   设计稿（v5/index.html）把看板写成一条叙事线：
     01 今天的结果 → 02 正在往哪个方向走 → 03 为什么是这样 → 04 现在就能处理的
   每段有编号、标题、一句说明和一条横线。
   原来线上是一堆卡片直接平铺，没有分段，看不出先看什么。
   这里只补「段落抬头」和「结论句」两块，卡片本身的渲染不动。
   ============================================================ */

/* ---------- 18.1 段落抬头 ---------- */
#admin #adminMain .dsec {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 26px 0 12px;
}
#admin #adminMain .dsec-no {
  flex-shrink: 0;
  padding: 1px 6px 2px;
  border-radius: 5px;
  background: #EEF1FF;
  color: var(--primary);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums;
}
#admin #adminMain .dsec h2 {
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  letter-spacing: -0.2px;
  color: var(--v2-ink);
  white-space: nowrap;
}
#admin #adminMain .dsec-d {
  font-size: 11.5px;
  color: var(--v2-ink-4);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#admin #adminMain .dsec-ln {
  flex: 1 1 auto;
  min-width: 20px;
  height: 1px;
  background: var(--v2-line);
}

/* ---------- 18.2 结论句 ---------- */
#admin #adminMain .verdict {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 13px 16px 13px 14px;
  margin-bottom: 12px;
  background: #fff;
  border: 1px solid var(--v2-line);
  border-left: 3px solid var(--primary);
  border-radius: 11px;
}
#admin #adminMain .verdict.is-hot { border-left-color: #FF6B4A; }
#admin #adminMain .verdict.is-ok { border-left-color: #2F7D52; }
#admin #adminMain .v-ico {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border-radius: 8px;
  display: grid;
  place-items: center;
  background: #FFF0EC;
  color: #C2452A;
  margin-top: 1px;
}
#admin #adminMain .verdict.is-ok .v-ico { background: #EAF6EF; color: #2F7D52; }
#admin #adminMain .v-ico svg { width: 15px; height: 15px; }
#admin #adminMain .v-txt { min-width: 0; }
#admin #adminMain .v-txt b {
  display: block;
  font-size: 13.5px;
  font-weight: 600;
  line-height: 1.6;
  color: var(--v2-ink);
}
#admin #adminMain .v-txt b em {
  font-style: normal;
  font-weight: 700;
  color: #C2452A;
  font-variant-numeric: tabular-nums;
}
#admin #adminMain .verdict.is-ok .v-txt b em { color: #2F7D52; }
#admin #adminMain .v-txt p {
  margin: 3px 0 0;
  font-size: 11.5px;
  line-height: 1.7;
  color: var(--v2-ink-3);
  font-variant-numeric: tabular-nums;
}
#admin #adminMain .v-link {
  flex-shrink: 0;
  margin-left: auto;
  align-self: center;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  border: 0;
  background: none;
  padding: 0;
  font: inherit;
  font-size: 12px;
  font-weight: 600;
  color: var(--primary);
  cursor: pointer;
  white-space: nowrap;
}
#admin #adminMain .v-link svg { width: 13px; height: 13px; }
#admin #adminMain .v-link:hover { color: #2F49DA; text-decoration: underline; }

/* 第一段紧接筛选条，别留太大的顶空 */
#admin #adminMain .dash > .dsec:first-of-type { margin-top: 18px; }

@media (max-width: 900px) {
  #admin #adminMain .dsec-d { display: none; }
  #admin #adminMain .v-link { display: none; }
}

/* ============================================================
   19. 通用页面组件 —— KPI 统计条 / 段落抬头 / 工具行 / 表格列修复
   ------------------------------------------------------------
   设计稿（v5/*.html）里每个列表页顶部都是一条「单卡多格统计条」：
   一张白卡、横向切 N 格、格与格之间只有一根发丝竖线。
   线上各页原来各写各的：评价页是一排带间距的小卡，预警页是
   自带边框的格子，打卡页和花名册干脆没有 —— 摆在一起就不像同一个系统。

   这里只提供三个中性组件，各页按需接入，不覆盖任何既有结构：
     .kstrip + .kc     统计条（--n 控制格数）
     .psec             段落抬头（标题 + 说明 + 横线 + 右侧计数）
     .pg-bar           工具行（筛选控件 / 按钮右对齐）
   ============================================================ */

/* ---------- 19.1 统计条 ---------- */
#admin #adminMain .kstrip {
  display: grid;
  grid-template-columns: repeat(var(--n, 5), minmax(0, 1fr));
  background: #fff;
  border: 1px solid var(--v2-line);
  border-radius: 12px;
  overflow: hidden;
}
#admin #adminMain .kstrip > * {
  padding: 14px 17px 15px;
  border-left: 1px solid #EEF1F7;
  min-width: 0;
}
#admin #adminMain .kstrip > *:first-child { border-left: 0; }
#admin #adminMain .kc > span {
  display: block;
  font-size: 11.5px;
  color: var(--v2-ink-4);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#admin #adminMain .kc > b {
  display: block;
  font-size: 24px;
  font-weight: 750;
  letter-spacing: -0.7px;
  line-height: 1.2;
  color: var(--v2-ink);
  margin-top: 3px;
  font-variant-numeric: tabular-nums;
}
#admin #adminMain .kc > b small {
  font-size: 12.5px;
  font-weight: 600;
  color: var(--v2-ink-4);
  margin-left: 2px;
  letter-spacing: 0;
}
#admin #adminMain .kc > em {
  display: block;
  font-size: 11px;
  font-style: normal;
  color: var(--v2-ink-4);
  margin-top: 2px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#admin #adminMain .kc > b.hot { color: #C2452A; }
#admin #adminMain .kc > em.warn { color: #C2452A; }
#admin #adminMain .kc > em.ok { color: #2F7D52; }

/* ---------- 19.2 段落抬头 ---------- */
#admin #adminMain .psec {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 20px 0 10px;
}
#admin #adminMain .psec:first-child { margin-top: 14px; }
#admin #adminMain .psec h2 {
  margin: 0;
  font-size: 14px;
  font-weight: 700;
  letter-spacing: -0.2px;
  color: var(--v2-ink);
  white-space: nowrap;
}
#admin #adminMain .psec .d {
  font-size: 11.5px;
  color: var(--v2-ink-4);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#admin #adminMain .psec .ln {
  flex: 1 1 auto;
  min-width: 16px;
  height: 1px;
  background: var(--v2-line);
}

/* ---------- 19.3 工具行 ---------- */
#admin #adminMain .pg-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 12px;
}
#admin #adminMain .pg-bar .grow { flex: 1 1 auto; }
#admin #adminMain .pg-bar select,
#admin #adminMain .pg-bar input[type="date"] { height: 30px; }
#admin #adminMain .pg-bar .hint {
  font-size: 11.5px;
  color: var(--v2-ink-4);
  white-space: nowrap;
}

/* ---------- 19.4 表格列修复 ----------
   打卡统计一行有 12 列，姓名 / 工号 / 公司被挤到只剩两三个字的宽度，
   「郑宏瑞」竖成三行、「博迈科技」拆成单字 —— 表格允许横向滚动的场合，
   这三列必须 nowrap 并给最小宽度。 */
#admin #adminMain table th { white-space: nowrap; }
#admin #adminMain .table-stats td:nth-child(1) { white-space: nowrap; min-width: 72px; }
#admin #adminMain .table-stats td:nth-child(2) { white-space: nowrap; min-width: 84px; font-variant-numeric: tabular-nums; }
#admin #adminMain .table-stats td:nth-child(3) {
  white-space: nowrap;
  min-width: 84px;
  max-width: 132px;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ---------- 19.5 页内重复标题收口 ----------
   顶栏已经写着「域 · 页面」，页内再写一遍同样的 h1，等于同一句话说两遍。 */
#admin #adminMain[data-page="users"] > .panel > .panel-head h3,
#admin #adminMain[data-page="contractorRoster"] > .panel > .panel-head h3,
#admin #adminMain[data-page="records"] > .panel > .panel-head h3 { display: none; }
#admin #adminMain[data-page="records"] > .panel > .panel-head,
#admin #adminMain[data-page="users"] > .panel > .panel-head,
#admin #adminMain[data-page="contractorRoster"] > .panel > .panel-head {
  padding: 0 0 10px;
  border-bottom: 0;
  background: none;
}

@media (max-width: 1180px) {
  #admin #adminMain .kstrip { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  #admin #adminMain .kstrip > *:nth-child(3n + 1) { border-left: 0; }
  #admin #adminMain .kstrip > *:nth-child(n + 4) { border-top: 1px solid #EEF1F7; }
}
@media (max-width: 760px) {
  #admin #adminMain .kstrip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #admin #adminMain .kstrip > *:nth-child(2n + 1) { border-left: 0; }
  #admin #adminMain .kstrip > *:nth-child(n + 3) { border-top: 1px solid #EEF1F7; }
}

/* ---------- 19.6 预警台账：收掉页内重复标题 ----------
   顶栏已经是「预警中心 · 预警台账」，页内 h2 再写一遍同样的四个字，
   下方还有一句 40 字的说明，把日期控件和统计条一起压到折线以下。
   这里只留右侧工具（日期 / 重算 / 导出），标题与说明交给顶栏。 */
#admin #adminMain[data-page="warnBoard"] .warn-head,
#admin #adminMain[data-page="confirmedAnomalies"] .warn-head {
  align-items: center;
  margin: 0 0 12px;
}
#admin #adminMain[data-page="warnBoard"] .warn-head-left,
#admin #adminMain[data-page="confirmedAnomalies"] .warn-head-left { display: none; }
#admin #adminMain[data-page="warnBoard"] .warn-head-right,
#admin #adminMain[data-page="confirmedAnomalies"] .warn-head-right { margin-left: auto; }

/* ---------- 19.7 评价汇总：页内标题同样收掉 ---------- */
#admin #adminMain[data-page="evaluationSummary"] > .panel > .panel-head { display: none; }

/* ---------- 19.8 打卡明细 / 花名册：统计条顶到最上 ----------
   这两个页面的 panel-head 已经被改成纯工具行（标题隐藏），
   再留 panel-body 的 20px 上内边距，统计条就会被推到一条空带下面。 */
#admin #adminMain[data-page="records"] > .panel > .panel-body,
#admin #adminMain[data-page="users"] > .panel > .panel-body,
#admin #adminMain[data-page="contractorRoster"] > .panel > .panel-body { padding-top: 0; }
