:root{
  --primary:#1677ff; --primary-hover:#4096ff;
  --text:#1f2329; --text-2:#646a73; --text-3:#8f959e;
  --border:#dee0e3; --split:#f0f0f0;
  --success:#32a645; --info:#1456f0; --warning:#ed6d0c; --error:#f54a45;
  --nav-bg:#1e2a44; --nav-item:#c9d1e0; --nav-group:#6b7a99;
  --bg:#f5f6f7; --card:#fff;
  --radius:8px; --radius-sm:6px;
  --shadow:0 1px 2px rgba(0,0,0,.04),0 0 1px rgba(0,0,0,.06);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,sans-serif;
  font-size:13px; line-height:1.5715; color:var(--text); background:var(--bg);
  -webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none}

/* ── 布局 ── */
.layout{display:flex;min-height:100vh}
.sidebar{width:220px;flex:0 0 220px;background:var(--nav-bg);color:#fff;display:flex;flex-direction:column}
.brand{display:flex;align-items:center;gap:8px;height:52px;padding:0 16px;border-bottom:1px solid rgba(255,255,255,.08)}
.brand-logo{width:22px;height:22px;border-radius:5px;background:linear-gradient(135deg,#1677ff,#3f8cff);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}
.brand-name{font-size:14px;font-weight:600;letter-spacing:.3px;white-space:nowrap}
.menu{padding:8px 0 24px;overflow-y:auto}
.menu-group{padding:14px 16px 6px;font-size:11px;color:var(--nav-group);letter-spacing:.5px}
.menu-item{display:flex;align-items:center;gap:9px;padding:9px 16px;font-size:13px;color:var(--nav-item);cursor:pointer;border-left:3px solid transparent}
.menu-item:hover{background:rgba(255,255,255,.06);color:#fff}
.menu-item.active{background:#1677ff;color:#fff;border-left-color:#69b1ff;font-weight:500}
.menu-item .ico{width:15px;height:15px;flex:0 0 15px;opacity:.85}
.menu-item .badge{margin-left:auto;background:#f54a45;color:#fff;font-size:11px;line-height:16px;padding:0 5px;border-radius:8px}

.main{flex:1;min-width:0;display:flex;flex-direction:column}
.topbar{height:48px;background:#fff;border-bottom:1px solid var(--split);display:flex;align-items:center;gap:10px;padding:0 20px}
.crumb{font-size:13px;color:var(--text-2)}
.crumb b{color:var(--text);font-weight:500}
.crumb .sep{color:var(--text-3);margin:0 6px}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:14px;color:var(--text-2)}
.avatar{width:26px;height:26px;border-radius:50%;background:#e6f4ff;color:var(--primary);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600}
.page{padding:16px 20px 32px}

/* ── 卡片 ── */
.card{background:var(--card);border:1px solid var(--split);border-radius:var(--radius);box-shadow:var(--shadow)}
.card-hd{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--split)}
.card-title{font-size:14px;font-weight:600}
.card-title .sub{font-size:12px;color:var(--text-3);font-weight:400;margin-left:6px}
.card-bd{padding:16px}
.card-hd .right{margin-left:auto;display:flex;align-items:center;gap:8px}

/* ── 预警条 ── */
.alert{display:flex;align-items:center;gap:10px;padding:9px 14px;border-radius:var(--radius-sm);background:#fff1f0;border:1px solid #ffccc7;color:#cf1322;font-size:13px;margin-bottom:14px}
.alert .link{margin-left:auto;color:var(--primary);cursor:pointer}

/* ── KPI ── */
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:14px}
.kpi{padding:16px}
.kpi-label{font-size:13px;color:var(--text-2);display:flex;align-items:center;gap:6px}
.kpi-value{font-size:26px;font-weight:600;margin-top:8px;letter-spacing:-.3px}
.kpi-value small{font-size:13px;font-weight:400;color:var(--text-3);margin-left:4px}
.kpi-foot{font-size:12px;color:var(--text-3);margin-top:6px}
.kpi-foot .up{color:var(--error)}
.kpi-foot .down{color:var(--success)}

/* ── 待办网格 ── */
.todos{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
.todo{border:1px solid var(--split);border-radius:var(--radius-sm);padding:14px;cursor:pointer;transition:.15s}
.todo:hover{border-color:#91caff;box-shadow:0 2px 8px rgba(22,119,255,.08)}
.todo-num{font-size:22px;font-weight:600;color:var(--warning)}
.todo-num.zero{color:var(--text-3)}
.todo-name{font-size:13px;color:var(--text-2);margin-top:4px}

/* ── 表格 ── */
.table-wrap{overflow-x:auto}
table{width:100%;border-collapse:collapse;font-size:13px}
thead th{background:#fafafa;color:var(--text);font-weight:500;text-align:left;padding:10px 12px;border-bottom:1px solid var(--split);white-space:nowrap}
thead th.sortable{cursor:pointer}
thead th .arrows{color:var(--text-3);font-size:10px;margin-left:4px}
tbody td{padding:11px 12px;border-bottom:1px solid var(--split);color:var(--text);vertical-align:middle}
tbody tr:hover td{background:#fafcff}
td.mono{font-variant-numeric:tabular-nums;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}
td.strong{font-weight:500}
td.num{text-align:right;font-variant-numeric:tabular-nums}
/* v4.6 修复错位：数值列表头同步右对齐（原来 th 左对齐 / 数值 td 右对齐 → 表头与数据错开） */
thead th.num{text-align:right}
thead th.num .arrows{float:right;margin-left:4px}
.empty{padding:48px 0;text-align:center;color:var(--text-3)}
.link{color:var(--primary);cursor:pointer}
.link+.link{margin-left:10px}
.link.danger{color:var(--error)}

/* ── 标签 ── */
.tag{display:inline-block;padding:0 7px;line-height:20px;font-size:12px;border-radius:4px;border:1px solid transparent;white-space:nowrap}
.tag-green{color:#237804;background:#f6ffed;border-color:#b7eb8f}
.tag-blue{color:#0958d9;background:#e6f4ff;border-color:#91caff}
.tag-orange{color:#ad4e00;background:#fff7e6;border-color:#ffd591}
.tag-gray{color:#595959;background:#fafafa;border-color:#d9d9d9}
.tag-red{color:#cf1322;background:#fff1f0;border-color:#ffa39e}
.tag-cyan{color:#006d75;background:#e6fffb;border-color:#87e8de}

/* ── 筛选栏 ── */
.filters{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:14px}
.field{display:flex;align-items:center;gap:6px}
.field>label{font-size:13px;color:var(--text-2);white-space:nowrap}
input[type=text],select{height:32px;padding:0 10px;font-size:13px;color:var(--text);border:1px solid var(--border);border-radius:var(--radius-sm);background:#fff;outline:none;font-family:inherit}
input[type=text]{min-width:180px}
input[type=text]:focus,select:focus{border-color:var(--primary);box-shadow:0 0 0 2px rgba(22,119,255,.1)}
.btn{height:32px;padding:0 14px;font-size:13px;border-radius:var(--radius-sm);border:1px solid var(--border);background:#fff;color:var(--text);cursor:pointer;font-family:inherit;display:inline-flex;align-items:center;gap:6px}
.btn:hover{color:var(--primary);border-color:var(--primary)}
.btn-primary{background:var(--primary);border-color:var(--primary);color:#fff}
.btn-primary:hover{background:var(--primary-hover);border-color:var(--primary-hover);color:#fff}
.btn-link{border:none;background:none;color:var(--primary);padding:0 4px}
.filters .spacer{margin-left:auto}

/* ── 统计卡（状态筛选） ── */
.stats{display:grid;grid-template-columns:repeat(7,1fr);gap:10px;margin-bottom:14px}
.stat{padding:12px 14px;cursor:pointer;transition:.15s}
.stat:hover{border-color:#91caff}
.stat.active{border-color:var(--primary);box-shadow:0 0 0 2px rgba(22,119,255,.08)}
.stat-num{font-size:20px;font-weight:600}
.stat-name{font-size:12px;color:var(--text-2);margin-top:2px}

/* ── 分页 ── */
.pager{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:12px 16px;color:var(--text-2);font-size:13px}
.pager .pg{min-width:28px;height:28px;border:1px solid var(--border);border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;cursor:pointer;background:#fff}
.pager .pg.active{border-color:var(--primary);color:var(--primary)}

/* ── 其他 ── */
.grid-2{display:grid;grid-template-columns:2fr 1fr;gap:14px}
.notice{font-size:12px;color:var(--text-3);margin-top:10px;line-height:1.7}
.preview-flag{background:#fffbe6;border:1px solid #ffe58f;color:#ad6800;font-size:12px;padding:6px 12px;border-radius:var(--radius-sm);margin-bottom:12px;display:inline-block}

@media (max-width:1200px){
  .kpis{grid-template-columns:repeat(2,1fr)}
  .stats{grid-template-columns:repeat(4,1fr)}
  .todos{grid-template-columns:repeat(2,1fr)}
  .grid-2{grid-template-columns:1fr}
}

/* ── 悦圆品牌覆盖（青绿） ── */
:root{--nav-bg:#22352c;--primary:#2f6b4f;--primary-hover:#3f8a67;--info:#2f6b4f}
.brand-logo{background:linear-gradient(135deg,#2f6b4f,#4a9d72)!important}
.btn-primary{background:var(--primary);border-color:var(--primary)}
.btn-primary:hover{background:var(--primary-hover);border-color:var(--primary-hover)}
/* ── 补充组件 ── */
.toast{position:fixed;top:20px;left:50%;transform:translateX(-50%);z-index:99;background:#fff;border:1px solid var(--border);box-shadow:0 6px 20px rgba(0,0,0,.12);border-radius:8px;padding:10px 18px;font-size:13px;display:none}
.toast.ok{border-color:#b7eb8f;background:#f6ffed;color:#237804}
.toast.err{border-color:#ffa39e;background:#fff1f0;color:#cf1322}
.loading{padding:40px 0;text-align:center;color:var(--text-3);font-size:13px}
.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:#f5f6f7}
.login-card{width:360px;background:#fff;border:1px solid var(--split);border-radius:10px;box-shadow:0 8px 30px rgba(0,0,0,.06);padding:32px}
.login-card h1{font-size:18px;margin:0 0 6px}
.login-card p.sub{font-size:12px;color:var(--text-3);margin:0 0 24px}
.login-card .field{margin-bottom:14px;display:block}
.login-card .field label{display:block;margin-bottom:6px}
.login-card input,.login-card select{width:100%;height:38px}
.login-card .btn{width:100%;height:38px;justify-content:center}
.errline{color:#cf1322;font-size:12px;min-height:18px;margin:2px 0 8px}
.mask-hint{font-size:11px;color:var(--text-3);font-weight:400;margin-left:4px}

.m-menu-toggle{ display:none; }
.m-mask{ display:none; }

/* ============================================================
   手机端视觉层 v3.20 —— 按扣子设计规范落地
   设计意象：宣纸 · 青玉 · 印章金
   桌面端(>860px) 完全不受影响（全部包在媒体查询内）
   ============================================================ */

/* 手机端专用 token（仅在窄屏生效，不污染桌面） */
@media (max-width:860px){
  .layout, body{
    --m-bg:#f5f6f4;
    --m-card:#ffffff;
    --m-inset:#f8f9f6;
    --m-table-head:#f7f8f5;
    --m-border:#e9ece7;
    --m-split:#f0f2ee;
    --m-text:#1f2a24;
    --m-text-2:#5e6b63;
    --m-text-3:#93a098;
    --m-gold:#b08948;
    --m-primary:#2f6b4f;
    --m-primary-soft:#e8f1eb;
    --m-r-card:12px;
    --m-r-btn:8px;
    --m-r-tag:6px;
    --m-shadow-card:0 1px 2px rgba(31,42,36,.04),0 2px 8px rgba(31,42,36,.04);
    --m-shadow-drawer:6px 0 26px rgba(15,22,17,.28);
    --m-shadow-sheet:0 -8px 32px rgba(20,30,24,.18);
    --m-ease:cubic-bezier(.22,1,.36,1);
  }

  html,body{ background:var(--m-bg); }
  body{ font-size:14px; color:var(--m-text); }

  /* ---------- 布局：内容全宽 ---------- */
  .layout{ display:block; }
  .main{ width:100%; display:block; }

  /* ---------- 侧栏 → 左侧抽屉（默认隐藏） ---------- */
  .sidebar{
    position:fixed; left:0; top:0; bottom:0;
    width:min(286px,76vw); max-width:286px;
    background:#22352c;
    display:flex; flex-direction:column;
    transform:translateX(-102%);
    transition:transform 280ms var(--m-ease);
    z-index:1200;
    box-shadow:var(--m-shadow-drawer);
    overflow-y:auto; overscroll-behavior:contain;
  }
  .sidebar.menu-open{ transform:translateX(0); }
  .sidebar .brand{ height:56px; padding:0 18px; border-bottom:1px solid rgba(255,255,255,.08); flex:none; }
  .brand-name{ font-size:15px; }

  /* 菜单项：拇指热区 48px（明确重置，避免旧规则干扰） */
  .sidebar .menu{ display:block; position:static; max-height:none; overflow:visible;
    box-shadow:none; background:transparent; padding:8px 0 16px; }
  .sidebar .menu-item{ display:flex; flex-direction:row; align-items:center; justify-content:flex-start; }
  .menu-group{ display:block; padding:12px 18px 6px; font-size:11px; letter-spacing:.5px; color:#7e8c83; }
  .menu-item{
    display:flex; align-items:center; min-height:48px; padding:0 18px;
    font-size:15px; color:#a9b6ae; border-left:3px solid transparent;
    transition:background .18s,color .18s;
  }
  .menu-item:active{ background:rgba(255,255,255,.08); }
  .menu-item.active{ background:var(--m-primary); color:#fff; border-left-color:#fff; font-weight:600; }
  .menu-foot{ margin-top:8px!important; padding:8px 0!important; border-top:1px solid rgba(255,255,255,.08); }

  /* 遮罩 */
  .m-mask{
    position:fixed; inset:0; background:rgba(18,26,21,.48);
    opacity:0; visibility:hidden; transition:opacity 240ms; z-index:1190;
  }
  .m-mask.show{ opacity:1; visibility:visible; }
  body.m-lock{ overflow:hidden; }

  /* ---------- 顶栏 + FAB ---------- */
  .topbar{
    height:auto; min-height:52px; padding:8px 12px 8px 60px;
    background:#fff; border-bottom:1px solid var(--m-split);
    flex-wrap:wrap; gap:6px; position:sticky; top:0; z-index:50;
  }
  .crumb{ font-size:13px; color:var(--m-text-2); }
  .crumb b{ color:var(--m-text); }
  .topbar-right{ gap:10px; }
  .avatar{ width:28px; height:28px; background:var(--m-primary-soft); color:var(--m-primary); }

  /* FAB：左上悬浮青玉圆角按钮 */
  .m-menu-toggle{
    display:flex!important; align-items:center!important; justify-content:center!important;
    position:fixed; left:12px; top:10px; z-index:1210;
    width:40px; height:40px; padding:0;
    background:var(--m-primary); color:#fff; border:none; border-radius:10px;
    box-shadow:0 6px 16px rgba(47,107,79,.32);
    font-size:17px; line-height:1; cursor:pointer;
    transition:transform .12s;
  }
  .m-menu-toggle:active{ transform:scale(.94); }
  .m-menu-toggle span{ display:none; }   /* 只留 ☰ 图标 */

  /* ---------- 页面内容 ---------- */
  .page{ padding:12px 12px 40px; background:var(--m-bg); }
  .card{
    background:var(--m-card); border:1px solid var(--m-border);
    border-radius:var(--m-r-card); box-shadow:var(--m-shadow-card);
  }
  .card-hd{ padding:12px 14px; flex-wrap:wrap; gap:6px; border-bottom:1px solid var(--m-split); }
  .card-title{ font-size:15px; font-weight:600; }
  .card-bd{ padding:14px; }

  /* KPI / 待办：2 列 */
  .kpis,.stats{ grid-template-columns:repeat(2,1fr)!important; gap:10px; margin-bottom:12px; }
  .todos{ grid-template-columns:repeat(2,1fr)!important; gap:10px; }
  .grid-2{ grid-template-columns:1fr!important; }
  .kpi{ padding:14px; border-radius:var(--m-r-card); }
  .kpi-label{ font-size:12px; color:var(--m-text-2); }
  .kpi-value{ font-size:28px; font-weight:600; letter-spacing:-.5px; font-variant-numeric:tabular-nums; }
  .kpi-value small{ font-size:12px; }
  .kpi-foot{ font-size:11px; color:var(--m-text-3); }
  .stat{ padding:12px 10px; }
  .stat-num{ font-size:20px; font-weight:600; font-variant-numeric:tabular-nums; }
  .stat-name{ font-size:11px; }
  .todo{ padding:12px; border-radius:var(--m-r-card); }
  .todo-num{ font-size:22px; font-weight:600; color:var(--m-gold); }
  .todo-name{ font-size:12px; }

  /* 筛选栏 */
  .filters{ gap:8px; margin-bottom:12px; }
  .filters .m-search{ width:100%; order:-1; }
  .filters .m-search input{ width:100%; min-width:0; }
  .field{ width:auto; }
  .field>label{ font-size:12px; color:var(--m-text-2); }

  /* 表单控件：44px 拇指热区 */
  input[type=text],input[type=date],input[type=time],input[type=number],input[type=password],select,textarea{
    height:44px; font-size:14px; border-radius:var(--m-r-btn);
    border:1px solid var(--m-border); padding:0 12px;
  }
  input[type=text]{ min-width:0; }
  input:focus,select:focus,textarea:focus{
    border-color:var(--m-primary); box-shadow:0 0 0 3px rgba(47,107,79,.12); outline:none;
  }
  textarea{ height:auto; min-height:88px; padding:10px 12px; }
  .btn{ height:44px; padding:0 16px; font-size:14px; border-radius:var(--m-r-btn); }
  .btn-primary{ background:var(--m-primary); border-color:var(--m-primary); }

  /* ---------- 表格 → 卡片（v2 手机适配 2026-09-20） ----------
     原方案「横滑 + 冻结首列」手机上难用，改为：一行 = 一张卡，
     每个单元格 = 「字段名 —— 值」一行（字段名取 td[data-label]）。 */
  .table-wrap{ overflow:visible; position:static; border-radius:0; }
  .table-wrap::after{ content:none; }          /* 去掉右缘渐隐 */
  .m-swipe-hint{ display:none; }               /* 去掉横滑提示 */
  .m-tip{ font-size:12px; color:var(--m-text-3); padding:6px 2px 8px; }

  table{ width:100%; min-width:0; border-collapse:separate; border-spacing:0; font-size:13px; }
  thead{ display:none; }                       /* 表头隐藏，字段名进卡片 */
  tbody{ display:block; }
  tbody tr{
    display:block; background:var(--m-card);
    border:1px solid var(--m-border); border-radius:var(--m-r-card);
    box-shadow:var(--m-shadow-card);
    padding:10px 12px; margin-bottom:10px;
  }
  tbody td{
    display:flex; align-items:flex-start; justify-content:space-between; gap:16px;
    padding:6px 0; border:none; white-space:normal;
    font-size:13px; color:var(--m-text); text-align:left;
  }
  tbody td::before{
    content:attr(data-label);
    flex:0 0 auto; width:34%; min-width:56px;
    color:var(--m-text-3); font-size:12px; line-height:1.6; text-align:left;
  }
  tbody td > span{ flex:1 1 auto; text-align:right; overflow-wrap:anywhere; line-height:1.55; }
  /* 首要字段（首列）做成卡片标题行 */
  tbody td:first-child{
    display:block; padding:0 0 8px; margin-bottom:6px;
    border-bottom:1px solid var(--m-split); font-size:15px; font-weight:600;
  }
  tbody td:first-child::before{ display:none; }
  tbody td:first-child > span{ text-align:left; }
  /* 数值列右对齐（金额/数量） */
  tbody td.num > span{ font-variant-numeric:tabular-nums; font-weight:600; }
  tbody td.mono > span{ font-size:12px; }
  /* 操作列：占满一行、按钮加大 */
  tbody td[data-label="操作"]{
    display:block; padding:10px 0 0; margin-top:6px;
    border-top:1px solid var(--m-split); text-align:right;
  }
  tbody td[data-label="操作"]::before{ display:none; }
  tbody td[data-label="操作"] .btn{ min-height:36px; padding:0 14px; margin:0 0 6px 6px; }
  tbody td[data-label="状态"] > span{ font-weight:600; }
  tbody tr:hover td{ background:transparent; }

  /* ---------- 防横向溢出（v2 2026-09-20）：窄屏页面永不横滚 ---------- */
  html, body{ overflow-x:hidden; }
  .main, .page, .card, .card-hd, .card-bd, .kpis, .grid-2{ max-width:100%; min-width:0; }
  .card-hd{ flex-wrap:wrap; row-gap:8px; }
  .card-hd .title, .card-title{ min-width:0; }
  .card-hd .right{ max-width:100%; flex-wrap:wrap; row-gap:6px; justify-content:flex-end; }
  .card-hd .right .btn, .card-hd .btn{ min-height:34px; }
  /* 宽行内容单独横滑，不撑破页面 */
  .filters, .tabs, .chip-row, .chips, .seg, .segmented, .btn-row{ overflow-x:auto; -webkit-overflow-scrolling:touch; }
  .filters > *, .tabs > *, .seg > *{ flex:0 0 auto; }
  table, .table-wrap{ max-width:100%; }
  img, svg{ max-width:100%; }

  /* ---------- v3 数据行模式（一行一条 + 点行进详情） ---------- */
  .m-rows{ background:var(--m-card); border:1px solid var(--m-border); border-radius:var(--m-r-card);
    box-shadow:var(--m-shadow-card); overflow:hidden; }
  .m-rows .m-row{ display:block; padding:11px 12px; border-bottom:1px solid var(--m-split); cursor:pointer; }
  .m-rows .m-row:last-child{ border-bottom:none; }
  .m-row-main{ display:flex; align-items:center; gap:8px; }
  .m-row-title{ flex:0 0 auto; font-size:14.5px; font-weight:600; color:var(--m-text); }
  .m-row-phone{ flex:0 0 auto; font-size:12.5px; color:var(--m-text-2); font-variant-numeric:tabular-nums; }
  .m-row-go{ margin-left:auto; color:var(--m-text-3); font-size:18px; line-height:1; }
  .m-row-sub{ display:flex; flex-wrap:wrap; gap:6px 12px; margin-top:6px; }
  .m-row-cell{ font-size:12.5px; color:var(--m-text); display:inline-flex; align-items:center; gap:4px; }
  .m-row-v{ display:inline-flex; align-items:center; gap:4px; }
  .m-row-v .btn{ min-height:28px; padding:0 10px; font-size:12px; }
  .m-row-sub .tag{ height:20px; line-height:20px; font-size:11.5px; }
  .m-row-cell i{ font-style:normal; color:var(--m-text-3); margin-right:4px; font-size:11.5px; }
  .m-row-act{ margin-top:8px; display:flex; gap:8px; flex-wrap:wrap; }
  .m-row-act .btn{ min-height:34px; }
  .m-row:active{ background:#f6f8f5; }

  /* 详情弹窗内的字段表 */
  .m-dl{ padding:2px 0; }
  .m-dl-row{ display:flex; gap:12px; padding:8px 0; border-bottom:1px solid var(--m-split); font-size:13px; }
  .m-dl-row:last-child{ border-bottom:none; }
  .m-dl-k{ flex:0 0 96px; color:var(--m-text-3); }
  .m-dl-v{ flex:1 1 auto; text-align:right; overflow-wrap:anywhere; }

  /* ---------- 筛选区：手机折叠（app.js 注入「筛选」按钮） ---------- */
  .filters{ display:block; }
  /* v3 修复（2026-09-20 主人报「重置 / 每页 一高一低」）：控件统一高度 + 同一行底部对齐 */
  .filters .field{ display:flex; align-items:center; gap:8px; margin:8px 0; }
  .filters .field > label{ font-size:12.5px; color:var(--m-text-2); white-space:nowrap; }
  .filters input[type=text], .filters select,
  .filters .btn{ height:40px; line-height:38px; font-size:13.5px; }
  .filters .btn{ padding:0 14px; }
  .filters select{ height:40px; }
  .m-filters .m-inline{ display:flex; align-items:center; gap:10px; }
  .m-filters .m-size-wrap{ display:inline-flex; align-items:center; gap:6px; }
  .m-filters .m-search{ flex:1 1 100%; }
  .m-filters .m-search input{ width:100%; min-width:0 !important; }
  .m-size-wrap label{ font-size:12.5px; color:var(--m-text-2); }
  .filters.m-collapsed{ display:none; }
  .m-filter-btn{
    display:flex; align-items:center; justify-content:center; gap:6px;
    width:100%; height:40px; margin:2px 0 10px;
    background:#fff; border:1px solid var(--m-border); border-radius:var(--m-r-btn);
    color:var(--m-text); font-size:13.5px; font-weight:600;
  }
  .m-filter-btn .cnt{ color:var(--m-primary); }

  /* 标签：柔和填充 */
  .tag{ height:22px; line-height:22px; padding:0 8px; font-size:12px; border-radius:var(--m-r-tag); }

  /* 分页 */
  .pager{ padding:14px 0; justify-content:center; flex-wrap:wrap; gap:8px; font-size:12px; color:var(--m-text-3); }
  .pager .pg{ min-width:34px; height:34px; border-radius:var(--m-r-btn); }

  /* ---------- 弹窗 → 底部 Bottom Sheet ---------- */
  .form-modal{
    position:fixed!important; left:0!important; right:0!important; bottom:0!important; top:auto!important;
    width:100%!important; max-width:100%!important;
    border-radius:16px 16px 0 0!important;
    max-height:90vh!important; padding:18px 16px calc(18px + env(safe-area-inset-bottom))!important;
    box-shadow:var(--m-shadow-sheet)!important;
    animation:m-sheet-up 320ms var(--m-ease);
  }
  @keyframes m-sheet-up{ from{ transform:translateY(100%); } to{ transform:translateY(0); } }

  /* 链接热区 */
  .link{ display:inline-block; padding:6px 3px; font-size:14px; }
  .link+.link{ margin-left:12px; }

  .toast{ width:86vw; text-align:center; border-radius:var(--m-r-btn); }
  .loading,.empty{ padding:32px 0; font-size:13px; }
}



/* ============================================================
   v3.21 JS 兜底层：.is-mobile（不依赖 @media，兼容微信 X5 内核）
   由 app.js 探测屏幕宽度后给 <html> 加类
   ============================================================ */
html.is-mobile .m-menu-toggle{
  display:flex!important; align-items:center!important; justify-content:center!important;
  position:fixed!important; left:12px!important; top:10px!important; z-index:1210!important;
  width:40px!important; height:40px!important; padding:0!important;
  background:#2f6b4f!important; color:#fff!important; border:none!important; border-radius:10px!important;
  box-shadow:0 6px 16px rgba(47,107,79,.32)!important;
  font-size:17px!important; line-height:1!important; cursor:pointer!important;
}
html.is-mobile .sidebar{
  position:fixed!important; left:0!important; top:0!important; bottom:0!important;
  width:min(286px,76vw)!important; max-width:286px!important;
  background:#22352c!important; display:flex!important; flex-direction:column!important;
  transform:translateX(-102%)!important;
  transition:transform 280ms cubic-bezier(.22,1,.36,1)!important;
  z-index:1200!important; overflow-y:auto!important;
  box-shadow:6px 0 26px rgba(15,22,17,.28)!important;
}
html.is-mobile .sidebar.menu-open{ transform:translateX(0)!important; }
html.is-mobile .layout{ display:block!important; }
html.is-mobile .main{ width:100%!important; display:block!important; }
html.is-mobile .topbar{ padding-left:60px!important; }
html.is-mobile .m-mask{
  display:block!important; position:fixed!important; inset:0!important;
  background:rgba(18,26,21,.48)!important; opacity:0!important; visibility:hidden!important;
  transition:opacity 240ms!important; z-index:1190!important;
}
html.is-mobile .m-mask.show{ opacity:1!important; visibility:visible!important; }
html.is-mobile .page{ padding:12px!important; background:#f5f6f4!important; }
html.is-mobile .kpis,html.is-mobile .stats{ grid-template-columns:repeat(2,1fr)!important; gap:10px!important; }
html.is-mobile .todos{ grid-template-columns:repeat(2,1fr)!important; }
html.is-mobile .grid-2{ grid-template-columns:1fr!important; }
html.is-mobile .table-wrap{ overflow-x:auto!important; -webkit-overflow-scrolling:touch!important; }
html.is-mobile table{ width:max-content!important; min-width:100%!important; }
html.is-mobile tbody td{ white-space:nowrap!important; }
html.is-mobile .m-swipe-hint{ display:block!important; text-align:center!important; font-size:11px!important; color:#93a098!important; padding:8px 0 2px!important; }
html.is-mobile input,html.is-mobile select{ height:44px!important; font-size:14px!important; }
html.is-mobile .btn{ height:44px!important; font-size:14px!important; }


/* ============================================================
   v3.22 顶部横条（不依赖 fixed，任何浏览器都可见）
   ============================================================ */
.m-topbar{ display:none; }

html.is-mobile .m-topbar{
  display:flex!important; align-items:center!important; gap:8px!important;
  background:#22352c!important; color:#fff!important;
  padding:10px 12px!important; margin:0!important;
  position:sticky!important; top:0!important;
  z-index:1250!important;   /* v2 修复：高于抽屉(1200)，抽屉打开时「✕ 收起」仍可点 */
}
.m-topbar-btn{
  background:#2f6b4f; color:#fff; border:none; border-radius:8px;
  height:38px; padding:0 14px; font-size:14px; font-family:inherit;
  display:inline-flex; align-items:center; gap:6px; cursor:pointer;
}
.m-topbar-btn:active{ transform:scale(.97); }
.m-topbar-title{ font-size:14px; color:#c9d6ce; margin-left:auto; }
html.is-mobile .sidebar{ margin-top:0!important; }
html.is-mobile .m-menu-toggle{ display:none!important; }

@media (max-width:860px){
  .m-topbar{ display:flex!important; align-items:center; gap:8px;
    background:#22352c; color:#fff; padding:10px 12px;
    position:sticky; top:0; z-index:900; }
  .m-menu-toggle{ display:none!important; }
}

@media (prefers-reduced-motion: reduce){
  .sidebar,.form-modal,.m-mask{ transition:none!important; animation:none!important; }
}
