/* 族谱数据中心 · 视觉规范 v1
   一套字、一套色、一套间距；无外部依赖，离网可用。
   字体：中文优先（PingFang / 思源黑 / 雅黑），数字等宽对齐。
   色彩：暖白纸 + 墨字 + 单一靛青主色；状态色只在状态处出现。 */

:root{
  --paper:#f7f6f3;
  --card:#ffffff;
  --ink:#1b1c1e;
  --ink-2:#4c5157;
  --ink-3:#85898f;
  --line:#e6e3dc;
  --line-2:#f0eee8;

  --accent:#1e3a5f;
  --accent-2:#16304f;
  --accent-soft:#eef2f7;

  --ok:#1f6b46;
  --ok-soft:#eaf3ee;
  --warn:#8a5a12;
  --warn-soft:#fbf3e4;
  --bad:#9c2f24;
  --bad-soft:#fbece9;

  --r-sm:6px;
  --r:10px;
  --r-lg:14px;

  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px; --s6:32px; --s7:48px;

  --font:"PingFang SC","Hiragino Sans GB","Source Han Sans SC","Noto Sans SC",
         "Microsoft YaHei",system-ui,-apple-system,sans-serif;
  --mono:"SF Mono",ui-monospace,"Cascadia Mono",Consolas,"Liberation Mono",monospace;
}

*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--font);font-size:15px;line-height:1.65;
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  font-variant-numeric:tabular-nums;
}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline;text-underline-offset:3px}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--r-sm)}

/* ---------- 骨架 ---------- */
.shell{display:grid;grid-template-columns:232px minmax(0,1fr);min-height:100%}
.side{
  background:var(--card);border-right:1px solid var(--line);
  display:flex;flex-direction:column;padding:var(--s5) var(--s3);
  position:sticky;top:0;height:100vh;
}
.brand{display:flex;align-items:center;gap:10px;padding:0 4px var(--s5)}
.brand .seal{
  width:30px;height:30px;border-radius:7px;background:var(--accent);color:#fff;
  display:grid;place-items:center;font-size:15px;font-weight:600;letter-spacing:0
}
.brand .nm{display:flex;flex-direction:column;line-height:1.25}
.brand .nm b{font-size:17px;font-weight:600;letter-spacing:.02em}
.brand .nm span{font-size:11px;color:var(--ink-3);letter-spacing:.14em;text-transform:uppercase}

.nav{display:flex;flex-direction:column;gap:2px}


.main{padding:var(--s6) var(--s7);max-width:1080px;width:100%}
.topline{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--s4);margin-bottom:var(--s5)}
.topline h1{margin:0;font-size:24px;font-weight:600;letter-spacing:.01em}
.topline .sub{color:var(--ink-3);font-size:13px;margin-top:2px}
.crumb{font-size:13px;color:var(--ink-3);margin-bottom:var(--s3)}
.crumb a{color:var(--ink-3)}

/* ---------- 卡片 ---------- */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--s5)}
.card + .card{margin-top:var(--s4)}
.card-h{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);margin-bottom:var(--s4)}
.card-h h2{margin:0;font-size:15px;font-weight:600;letter-spacing:.01em}
.card-h .hint{font-size:12px;color:var(--ink-3)}
.flat{border:0;padding:0;background:none}

/* 快捷入口卡（全站概览底部）：以前只有 .card，没有 .cards/.card-v ——
   <a class=card> 被当 inline，挤成一条条几百 px 的空白条，数字也不显示 */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(168px,1fr));
  gap:var(--s4);margin-top:var(--s4)}
.cards > a.card{margin-top:0;display:block;text-decoration:none;color:inherit;
  transition:border-color .15s ease,box-shadow .15s ease,transform .15s ease}
.cards > a.card:hover{border-color:var(--accent);box-shadow:0 2px 10px rgba(30,58,95,.10);
  transform:translateY(-1px)}
.cards .card-h{display:block;margin-bottom:var(--s2);font-size:13px;font-weight:500;
  color:var(--ink-3);letter-spacing:.02em}
.card-v{font-size:26px;font-weight:600;line-height:1.15;font-variant-numeric:tabular-nums;
  letter-spacing:.01em;color:var(--ink)}

/* ---------- 统计条 ---------- */
/* grid-auto-flow:column + 1fr：卡数 4 张（批次页）或 5 张（全站概览）都平铺一行、宽度均分 */
.stats{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;margin-bottom:var(--s4)}
.stat{padding:var(--s4) var(--s5);border-right:1px solid var(--line)}
.stat:last-child{border-right:0}
.stat .l{font-size:12px;color:var(--ink-3);letter-spacing:.02em}
.stat .v{font-size:24px;font-weight:600;letter-spacing:.01em;margin-top:2px}
.stat .v small{font-size:13px;font-weight:400;color:var(--ink-3);margin-left:3px}

/* ---------- 表格 ---------- */
table{width:100%;border-collapse:collapse}
th,td{text-align:left;padding:11px 10px;border-bottom:1px solid var(--line-2);vertical-align:middle}
th{font-size:12px;font-weight:600;color:var(--ink-3);letter-spacing:.04em;white-space:nowrap}
td{font-size:14px;color:var(--ink-2)}
td b,td strong{color:var(--ink);font-weight:600}
tr:last-child td{border-bottom:0}
tbody tr:hover td{background:#fbfaf8}
.num{text-align:right;font-variant-numeric:tabular-nums}
.mono{font-family:var(--mono);font-size:12px;color:var(--ink-3)}

/* ---------- 状态 ---------- */
.pill{display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 8px;border-radius:var(--r-sm);
  font-size:12px;font-weight:500;background:var(--line-2);color:var(--ink-2);white-space:nowrap}
.pill:before{content:"";width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.7}
.pill.run{background:var(--accent-soft);color:var(--accent)}
.pill.ok{background:var(--ok-soft);color:var(--ok)}
.pill.warn{background:var(--warn-soft);color:var(--warn)}
.pill.bad{background:var(--bad-soft);color:var(--bad)}
.pill.plain:before{display:none}

/* ---------- 进度 ---------- */
.bar{height:5px;border-radius:99px;background:var(--line-2);overflow:hidden;min-width:80px}
.bar i{display:block;height:100%;background:var(--accent);border-radius:99px;transition:width .3s ease}
.bar.done i{background:var(--ok)}
.prog{display:flex;align-items:center;gap:10px}
.prog .t{font-size:12px;color:var(--ink-3);white-space:nowrap}

/* ---------- 按钮 / 表单 ---------- */
.btn,button{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;height:38px;padding:0 16px;
  border:1px solid transparent;border-radius:var(--r-sm);background:var(--accent);color:#fff;
  font-family:var(--font);font-size:14px;font-weight:500;cursor:pointer;white-space:nowrap;
  transition:background .15s ease,border-color .15s ease;
}
.btn:hover,button:hover{background:var(--accent-2);text-decoration:none}
.btn.ghost,button.ghost{background:var(--card);border-color:var(--line);color:var(--ink)}
.btn.ghost:hover,button.ghost:hover{background:var(--line-2);border-color:#d9d5cc}
.btn.sm,button.sm{height:30px;padding:0 10px;font-size:13px}
.btn.danger{background:var(--card);border-color:var(--bad-soft);color:var(--bad)}
.btn.danger:hover{background:var(--bad-soft)}
.btn[disabled]{opacity:.5;cursor:not-allowed}
form.inline{display:inline}
.actions{display:flex;gap:var(--s2);flex-wrap:wrap;align-items:center}

label.f{display:block;font-size:13px;color:var(--ink-2);margin-bottom:6px}
input[type=text],input[type=password],input[type=number],select{
  width:100%;height:38px;padding:0 12px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--card);color:var(--ink);font-family:var(--font);font-size:14px;
}
input:focus,select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.form-row{display:grid;grid-template-columns:1fr 120px auto;gap:8px;align-items:end}
.form-tip{font-size:12px;color:var(--ink-3);margin-top:6px}

.alert{display:flex;gap:8px;padding:10px 12px;border-radius:var(--r-sm);font-size:13px;margin-bottom:var(--s4)}
.alert.bad{background:var(--bad-soft);color:var(--bad)}
.alert.ok{background:var(--ok-soft);color:var(--ok)}
.alert.info{background:var(--accent-soft);color:var(--accent)}

/* ---------- 步骤轨 ---------- */
.steps{display:flex;gap:0;margin:var(--s5) 0 0;overflow-x:auto;border-top:1px solid var(--line-2);padding-top:0}
.step{flex:1;min-width:86px;padding-top:12px;border-top:2px solid var(--line);margin-top:-1px;font-size:12px;color:var(--ink-3)}
.step b{display:block;font-size:12px;font-weight:500;color:inherit}
.step.done{border-top-color:var(--accent);color:var(--ink-2)}
.step.now{border-top-color:var(--accent);color:var(--accent);font-weight:600}
.step.now b{font-weight:600}

/* ---------- 明细 ---------- */
.kv{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s3) var(--s6)}
.kv .k{font-size:12px;color:var(--ink-3)}
.kv .v{font-size:14px;color:var(--ink);word-break:break-all}
.list{display:flex;flex-direction:column;gap:2px}
.rowline{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);
  padding:10px 0;border-bottom:1px solid var(--line-2);font-size:14px}
.rowline:last-child{border-bottom:0}
.dim{color:var(--ink-3)}
.empty{padding:var(--s6) var(--s4);text-align:center;color:var(--ink-3);font-size:14px}
.empty b{display:block;color:var(--ink);font-size:15px;font-weight:600;margin-bottom:4px}

/* ---------- 登录 ---------- */
.auth{min-height:100vh;display:grid;grid-template-columns:1fr 460px}
.auth .aside{background:var(--accent);color:#fff;padding:var(--s7);display:flex;flex-direction:column;justify-content:space-between}
.auth .aside h1{font-size:26px;font-weight:600;margin:0 0 10px;letter-spacing:.02em}
.auth .aside p{color:rgba(255,255,255,.72);font-size:14px;margin:0;max-width:38ch;line-height:1.8}
.auth .aside .foot{font-size:12px;color:rgba(255,255,255,.5);letter-spacing:.06em}
.auth .panel{display:flex;align-items:center;justify-content:center;padding:var(--s6);background:var(--card)}
.auth form{width:100%;max-width:330px}
.auth h2{font-size:20px;margin:0 0 4px;font-weight:600}
.auth .lead{color:var(--ink-3);font-size:13px;margin:0 0 var(--s5)}
.auth .field{margin-bottom:var(--s4)}
.auth .btn{width:100%;height:40px}

/* ---------- 文档 ---------- */
.doc{max-width:820px;padding:var(--s6)}
.doc h1{font-size:22px;margin:0 0 var(--s3);font-weight:600}
.doc h2{font-size:17px;margin:var(--s6) 0 var(--s3);font-weight:600;padding-top:var(--s3);border-top:1px solid var(--line-2)}
.doc h3{font-size:15px;margin:var(--s5) 0 var(--s2);font-weight:600}
.doc p{margin:0 0 var(--s3);color:var(--ink-2);font-size:14px}
.doc ul{margin:0 0 var(--s3);padding-left:20px;color:var(--ink-2);font-size:14px}
.doc li{margin:3px 0}
.doc code{font-family:var(--mono);font-size:12px;background:var(--line-2);padding:1px 5px;border-radius:4px;color:var(--ink)}
.doc pre{background:#1d2126;color:#e8e6e1;padding:14px 16px;border-radius:var(--r);overflow:auto;font-size:12px;line-height:1.7}
.doc pre code{background:none;color:inherit;padding:0}
.doc table{margin:var(--s3) 0 var(--s4);font-size:13px}
.doc th{background:var(--paper)}
.doc blockquote{margin:0 0 var(--s3);padding-left:var(--s4);border-left:2px solid var(--line);color:var(--ink-3);font-size:13px}
.doc hr{border:0;border-top:1px solid var(--line);margin:var(--s5) 0}

/* ---------- 移动端 ---------- */
@media (max-width:900px){
  .shell{grid-template-columns:1fr}
  .side{position:static;height:auto;border-right:0;border-bottom:1px solid var(--line);
    padding:var(--s3) var(--s4);flex-direction:row;align-items:center;gap:var(--s3);overflow-x:auto}
  .brand{padding:0}
  .nav{flex-direction:row;gap:4px;margin-left:auto}
  .main{padding:var(--s4) var(--s4) var(--s6);max-width:none}
  .topline{flex-direction:column;align-items:flex-start;gap:var(--s3)}
  .stats{grid-auto-flow:row;grid-template-columns:repeat(2,1fr)}
  .stat:last-child:nth-child(odd){grid-column:1/-1;border-right:0}
  .cards{grid-template-columns:repeat(2,1fr);gap:var(--s3)}
  .stat{border-bottom:1px solid var(--line);padding:var(--s3) var(--s4)}
  .stat:nth-child(2n){border-right:0}
  .stat:nth-last-child(-n+2){border-bottom:0}
  .card{padding:var(--s4);border-radius:var(--r)}
  .kv{grid-template-columns:1fr;gap:var(--s2)}
  .form-row{grid-template-columns:1fr}
  table.resp thead{display:none}
  table.resp tr{display:block;border-bottom:1px solid var(--line-2);padding:var(--s2) 0}
  table.resp td{display:flex;justify-content:space-between;gap:var(--s3);border:0;padding:5px 0}
  table.resp td:before{content:attr(data-l);color:var(--ink-3);font-size:12px;flex:0 0 auto}
  .auth{grid-template-columns:1fr}
  .auth .aside{display:none}
}

@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}

/* 打印（出件回执/页面备查） */

/* ========== 输入框 / 下拉 / 按钮 统一尺寸 ========== */
/* 筛选表单：输入框有合理最小宽度，下拉不膨胀 */
.form-row input[type=text], .form-row input[type=search],
.form-row input[type=tel], .form-row input[type=email]{min-width:100px}
.form-row select{min-width:80px;max-width:180px}
.form-row.five select{max-width:130px}
/* 任务名称和关键词要宽些 */
.form-row input[name=task_name]{min-width:140px}
.form-row input[name=q]{min-width:120px}
/* 账号筛选短些 */
.form-row input[name=account]{min-width:60px;max-width:100px}

/* 文件上传框：不撑满 */
input[type=file]{width:auto;max-width:100%}

/* 设置页输入框：KV 模式下适中 */
.set-card input[type=text], .set-card input[type=password],
.set-card input[type=number], .set-card input[type=tel],
.set-card select{max-width:320px}

/* 按钮高度统一：筛选按钮与输入框等高 */
.form-row .btn, .form-row button, .form-row .fbtns .btn, .form-row .fbtns button{
  height:38px;min-width:60px;padding:0 14px}
.form-row .fbtns{display:flex;gap:6px;align-items:end}

/* 搜索/筛选按钮加微圆角 */
.form-row .btn.ghost, .form-row button.ghost{border-radius:var(--r-sm)}

@media print{
  .side,.actions,form{display:none!important}
  body{background:#fff}
  .card{border-color:#ddd;break-inside:avoid}
  .main{padding:0;max-width:none}
}

/* ---------- 解析产物（页详情） ---------- */
.split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--s4);align-items:start}
.split .card{margin:0}
.form-row.two{grid-template-columns:1fr auto;align-items:end}
.blocks{max-height:560px;overflow:auto;border-top:1px solid var(--line-2)}
.blk{display:grid;grid-template-columns:26px 1fr auto auto;gap:8px;align-items:baseline;
  padding:7px 2px;border-bottom:1px solid var(--line-2);font-size:13px}
.blk .i{color:var(--ink-3);font-size:11px;text-align:right}
.blk .t{color:var(--ink);word-break:break-all}
.blk .c{color:var(--ink-3);font-size:11px;font-variant-numeric:tabular-nums}
.blk .b{color:var(--ink-3);font-size:10px;font-family:var(--mono)}
.persons{display:flex;flex-direction:column;gap:var(--s2);max-height:560px;overflow:auto}
.person{border:1px solid var(--line);border-radius:var(--r);padding:10px 12px;background:#fdfdfc}
.person .ph{display:flex;align-items:center;gap:8px;font-size:15px}
.person .ph b{font-weight:600}
.person .pv{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:6px}
.kv2{font-size:12px;color:var(--ink-2)}
.kv2 i{color:var(--ink-3);font-style:normal;margin-right:4px}
.person .pr{font-size:12px;color:var(--ink-3);margin-top:6px;line-height:1.6}
@media (max-width:900px){
  .split{grid-template-columns:1fr}
  .form-row.two{grid-template-columns:1fr}
  .blocks,.persons{max-height:none}
}

/* 侧栏用户块：三行分开 */
.who .role{display:block;margin-top:2px}
.who a{display:block;margin-top:10px}

/* 移动端：顶栏两行（品牌 + 导航横滑），表格转键值列表 */
@media (max-width:900px){
  .side{flex-wrap:wrap;gap:10px;padding:12px 14px;align-items:center}
  .brand{flex:0 0 auto}
  .nav{order:3;flex:1 1 100%;margin:0;display:flex;gap:6px;overflow-x:auto;
       padding:2px 0 0;-webkit-overflow-scrolling:touch}
  .nav a{height:32px;padding:0 12px;background:var(--paper);border:1px solid var(--line)}
  .nav a.on{background:var(--accent-soft);border-color:transparent}
  .step{min-width:70px;font-size:11px;padding-top:10px}
  table.resp td:before{min-width:56px}
  table.resp td{padding:6px 0}
  .card-h{flex-direction:column;align-items:flex-start;gap:2px}
  .topline h1{font-size:21px}
}

/* 移动端步骤轨：折成两行，全部可见 */
@media (max-width:900px){
  .steps{flex-wrap:wrap;overflow:visible}
  .step{flex:0 0 25%;min-width:0;border-top-width:2px;padding-right:6px}
  .step b{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .step:nth-child(n+5){padding-top:10px}
}

/* 移动端表格：一行一卡，标签在上、值在下（覆盖前面所有 .resp 规则） */
@media (max-width:900px){
  table.resp{display:block;white-space:normal}
  table.resp thead{display:none}
  table.resp tbody{display:block}
  table.resp tr{display:block;padding:10px 0;border-bottom:1px solid var(--line-2)}
  table.resp tr:last-child{border-bottom:0}
  table.resp td{display:block;border:0;padding:2px 0;font-size:14px;
    text-align:left!important;min-width:0}
  table.resp td:before{content:attr(data-l);display:block;font-size:11px;
    color:var(--ink-3);min-width:0;margin-bottom:1px}
  table.resp .prog{max-width:220px}
}

/* ---------- 公司署名 ---------- */
.co{margin-top:auto;padding:14px 10px 0;border-top:1px solid var(--line);
  font-size:11px;line-height:1.7;color:var(--ink-3)}
.co a{color:var(--ink-3);text-decoration:underline;text-underline-offset:2px}
.co a:hover{color:var(--accent)}
.fineprint{margin:18px 0 0;font-size:12px;color:var(--ink-3);text-align:center}
.fineprint a{color:var(--ink-3)}

/* ---------- 核对台 ---------- */
.rv{margin-bottom:var(--s3)}
.rvraw{font-size:13px;color:var(--ink-2);background:var(--paper);border:1px solid var(--line-2);
  border-radius:var(--r-sm);padding:10px 12px;line-height:1.7;word-break:break-all}
.rvform{display:grid;grid-template-columns:1fr 1fr auto;gap:var(--s3);align-items:end;margin-top:var(--s3)}
.rvacts{display:flex;gap:6px;flex-wrap:wrap}
.rvacts button{height:34px;padding:0 12px;font-size:13px}
@media (max-width:900px){
  .rvform{grid-template-columns:1fr;gap:var(--s2)}
  .rvacts button{flex:1}
}

/* ---------- 列表：筛选页签 / 分页 / 操作列 ---------- */
.tabs{display:flex;gap:4px;flex-wrap:wrap;margin:0 0 var(--s3)}
.tabs a{height:30px;padding:0 12px;display:inline-flex;align-items:center;border-radius:var(--r-sm);
  font-size:13px;color:var(--ink-2);border:1px solid transparent}
.tabs a:hover{background:var(--line-2);text-decoration:none}
.tabs a.on{background:var(--accent-soft);color:var(--accent);font-weight:600}
.pager{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);
  margin-top:var(--s4);padding-top:var(--s3);border-top:1px solid var(--line-2);font-size:13px}
.pager .pg{display:flex;gap:6px;align-items:center}
.pager .pg a{color:var(--ink-2);padding:0 6px}
.pager .pg .cur{color:var(--accent);padding:0 6px}
td.ops{white-space:nowrap}
td.ops form{display:inline}
td.ops .btn{margin-left:4px}
.field{margin-bottom:var(--s4)}
@media (max-width:900px){
  .pager{flex-direction:column;align-items:flex-start;gap:8px}
  td.ops{display:flex;flex-wrap:wrap;gap:6px;padding-top:8px}
  td.ops .btn{margin:0}
}

/* 登录面板：表单与公司署名竖排居中 */
.auth .panel{flex-direction:column;align-items:center;justify-content:center}
.auth .panel form{width:100%;max-width:330px}
.fineprint{margin:18px 0 0;text-align:center;line-height:1.8}
@media (max-width:900px){ .auth .panel{padding:28px 20px} }

/* 登录页左侧：公司名链接在白字区可读 */
.auth .aside a{color:rgba(255,255,255,.92);text-decoration:underline;text-underline-offset:3px}
.auth .aside a:hover{color:#fff}
.fineprint a{text-decoration:underline;text-underline-offset:3px}
.co a{text-decoration:underline}
.co a:hover{color:var(--accent)}

/* 公司名链接：明显可点（下边线 + 悬停） */
.auth .aside .foot a{color:#fff;text-decoration:none;border-bottom:1px solid rgba(255,255,255,.55);
  padding-bottom:1px}
.auth .aside .foot a:hover{border-bottom-color:#fff;background:rgba(255,255,255,.08)}
.fineprint a{color:var(--ink-2)}
.fineprint a:hover{color:var(--accent)}

/* 外链箭头 */
.ext{display:inline-block;margin-left:4px;font-size:11px;opacity:.75}

/* ---------- 页脚（登录后） ---------- */
.shell{grid-template-rows:1fr auto}
.site-foot{grid-column:1/-1;display:flex;align-items:center;justify-content:center;gap:8px;
  padding:16px 24px 22px;border-top:1px solid var(--line);background:var(--card);
  font-size:12px;color:var(--ink-3)}
.site-foot a{color:var(--ink-2);text-decoration:none;border-bottom:1px solid var(--line)}
.site-foot a:hover{color:var(--accent);border-bottom-color:var(--accent)}
.site-foot .sep{opacity:.5}
@media (max-width:900px){ .site-foot{flex-direction:column;gap:4px;font-size:11px;padding:14px} }

/* 布局修正：左栏与内容区同高，底部与页脚对齐成一条线 */
.shell{display:grid;grid-template-columns:232px minmax(0,1fr);grid-template-rows:1fr auto;
  min-height:100vh;align-items:stretch}
.side{position:static;height:auto;align-self:stretch;display:flex;flex-direction:column;
  padding:var(--s5) var(--s3);border-right:1px solid var(--line);background:var(--card)}
.side .who{margin-top:auto}
.main{min-width:0}
@media (max-width:900px){
  .shell{grid-template-columns:1fr;grid-template-rows:auto 1fr auto;min-height:100vh}
  .side{flex-direction:row;align-items:center;border-right:0;border-bottom:1px solid var(--line);
    padding:12px 14px;height:auto}
}

/* 左栏：背景铺到页脚，内容随视口固定（导航与退出始终可见） */
.side{padding:0}
.side-in{position:sticky;top:0;height:100vh;display:flex;flex-direction:column;
  padding:var(--s5) var(--s3)}
@media (max-width:900px){
  .side-in{position:static;height:auto;flex-direction:row;align-items:center;gap:10px;
    padding:12px 14px;flex-wrap:wrap}
}

/* 页脚固定：始终贴在视口底部；左栏高度 = 视口 - 页脚 */
:root{--foot-h:52px}
.shell{padding-bottom:var(--foot-h)}
.site-foot{position:fixed;left:0;right:0;bottom:0;height:var(--foot-h);z-index:20;
  grid-column:auto;justify-content:center;padding:0 24px;box-sizing:border-box}
.side-in{height:calc(100vh - var(--foot-h))}
@media (max-width:900px){
  :root{--foot-h:62px}
  .site-foot{flex-direction:column;gap:2px;font-size:11px;height:var(--foot-h);padding:8px 12px}
  .side-in{height:auto}
  .shell{padding-bottom:calc(var(--foot-h) + 4px)}
}

/* 最终布局：左栏固定（底边正好压在页脚顶），内容区右移；页脚固定 */
.shell{display:block;min-height:100vh;padding-bottom:var(--foot-h)}
.side{position:fixed;left:0;top:0;bottom:var(--foot-h);width:232px;z-index:10;
  background:var(--card);border-right:1px solid var(--line);padding:var(--s5) var(--s3);
  align-self:auto}
.side-in{position:static;height:100%;display:flex;flex-direction:column}
.main{margin-left:232px;max-width:1080px;padding:var(--s6) var(--s7)}
@media (max-width:900px){
  .shell{padding-bottom:calc(var(--foot-h) + 4px)}
  .side{position:static;width:auto;bottom:auto;padding:12px 14px;border-right:0;
    border-bottom:1px solid var(--line)}
  .side-in{height:auto;flex-direction:row;align-items:center;flex-wrap:wrap;gap:10px;padding:0}
  .main{margin-left:0;padding:var(--s4) var(--s4) var(--s6);max-width:none}
}

/* 内容区宽度：不再溢出（原来 width:100% + margin-left 造成横向滚动条） */
.main{width:calc(100% - 232px);max-width:none;margin-left:232px;
  padding:var(--s6) var(--s7) var(--s5)}
.main > *{max-width:1080px}
@media (max-width:900px){
  .main{width:auto;margin-left:0;padding:var(--s4) var(--s4) var(--s6)}
  .main > *{max-width:none}
}

@media (max-width:900px){
  .site-foot .sep{display:none}
  .site-foot{gap:2px;line-height:1.5}
}

/* 分页：每页条数选择 */
.pager{flex-wrap:wrap}
.pager .sizes{color:var(--ink-3);font-size:12px;margin-left:auto;display:flex;gap:6px;align-items:center}
.pager .sizes a{color:var(--ink-2)}
.pager .sizes b{color:var(--accent)}
@media (max-width:900px){ .pager .sizes{margin-left:0} }

/* 内容区放开：右侧占满（去掉 1080 上限与过宽留白） */
.main{padding:var(--s5) var(--s5) var(--s4)}
.main > *{max-width:none;width:100%}
.card, .stats, table{width:100%}

/* 表单控件统一：text/password/number/tel/email/search 与下拉同高同样式 */
input[type=text], input[type=password], input[type=number], input[type=tel],
input[type=email], input[type=search], input[type=url], select, textarea{
  width:100%;height:38px;padding:0 12px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--card);color:var(--ink);font-family:var(--font);font-size:14px;
  line-height:36px;-webkit-appearance:none;appearance:none;box-sizing:border-box;
}
textarea{height:auto;min-height:88px;padding:10px 12px;line-height:1.6}
input[type=tel]::placeholder, input[type=text]::placeholder{color:var(--ink-3);font-size:13px}
input[type=text]:focus, input[type=password]:focus, input[type=number]:focus,
input[type=tel]:focus, input[type=email]:focus, select:focus, textarea:focus{
  outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)
}
input:invalid:not(:placeholder-shown){border-color:var(--bad)}
@media (max-width:900px){
  input[type=text],input[type=password],input[type=number],input[type=tel],select{height:44px;font-size:15px}
}

/* 下拉：保留统一外观，但补回箭头 */
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 1.5 6 6.5l5-5' fill='none' stroke='%2385898f' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center;padding-right:34px;
  cursor:pointer;
}

/* 空框不算错：只在服务端返回错误时提示，不再用 :invalid 常亮红框 */
input:invalid:not(:placeholder-shown){border-color:var(--line)}
input:invalid:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}

/* 三列筛选表单 */
.form-row.three{grid-template-columns:190px 300px auto;justify-content:start;gap:12px;max-width:760px}
@media (max-width:900px){ .form-row.three{grid-template-columns:1fr} }

/* 批量操作条与勾选列 */
.bulkbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 var(--s3);
  padding:8px 10px;background:var(--paper);border:1px solid var(--line-2);border-radius:var(--r-sm)}
.bulkbar .dim{font-size:12px}
td.pick, th.pick{width:34px;padding-left:4px}
td.pick input{width:16px;height:16px;accent-color:var(--accent)}
@media (max-width:900px){ .bulkbar button{flex:1} td.pick{display:flex;justify-content:flex-start} }

/* 任务与批次表单：分组小标题、勾选项 */
.sec{margin:var(--s5) 0 var(--s3);padding-top:var(--s3);border-top:1px solid var(--line-2);
  font-size:13px;font-weight:600;color:var(--ink-2)}
.chk{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink-2);margin:6px 0;
  cursor:pointer}
.chk input{width:16px;height:16px;accent-color:var(--accent)}
.chk.dim{color:var(--ink-3);cursor:not-allowed}
.outs{display:flex;flex-wrap:wrap;gap:10px 18px}

/* 日志与预览 */
.form-row.four{grid-template-columns:120px 120px 1.5fr auto}
.preview{max-height:620px;overflow:auto;background:var(--paper);border:1px solid var(--line-2);
  border-radius:var(--r-sm);padding:12px 14px;font-family:var(--mono);font-size:12px;
  line-height:1.7;white-space:pre-wrap;word-break:break-all;margin:0}
@media (max-width:900px){
  .form-row.four{grid-template-columns:1fr}
  .nav a{white-space:nowrap}
}

/* 设置分页 */
.cols2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.cols2 .card{margin:0}
.tips{margin:0;padding-left:18px;color:var(--ink-2);font-size:13px;line-height:2}
.tips b{color:var(--ink)}
@media (max-width:900px){.cols2{grid-template-columns:1fr}}

/* 设置总览卡片 */
.set-card{padding:20px 22px}
.set-h{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px}
.set-h h2{margin:0;font-size:17px}
.set-card .sub{margin-bottom:12px}
.set-card .kv{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 18px}
.set-card .kv .k{font-size:12px;color:var(--ink-3)}
.set-card .kv .v{font-size:14px;color:var(--ink);margin-top:2px;word-break:break-all}
@media (max-width:900px){.set-card .kv{grid-template-columns:1fr 1fr}}

/* 批次筛选：账号 · 任务名称 · 状态 · 按钮 */
.form-row.jobs{grid-template-columns:120px minmax(220px,1fr) 130px auto;align-items:end}
@media (max-width:900px){.form-row.jobs{grid-template-columns:1fr}}

/* 日志筛选：五列一行 */
.form-row.five{grid-template-columns:110px 110px 2fr 1.2fr auto;align-items:end}
.form-row .fbtns{display:flex;gap:8px}
@media (max-width:900px){.form-row.five{grid-template-columns:1fr}}

/* 复选框换行显示 */
.chk.block{display:block;margin:6px 0}


/* ---------- 核对台·人物卡（一行四格 / 三格 / 整行，手机单列） ---------- */
/* 状态色条：一眼看出哪张卡机器判错（红）/需人看（黄） */
.rv.bad,.rv.fail{border-left:4px solid var(--bad)}
.rv.warn{border-left:4px solid var(--warn)}
.rv.ok{border-left:4px solid var(--ok)}
.rv .pill.sm{font-size:11px;height:20px;padding:0 8px}
.rvcard{margin-top:10px}
.rvrow{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px 12px;margin-bottom:10px}
.rvrow.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.rvrow.two{grid-template-columns:repeat(2,minmax(0,1fr))}
.rvrow.name{grid-template-columns:repeat(5,minmax(0,1fr))}
/* 只读格：世代这类不让改的值 */
.ro{height:38px;display:flex;align-items:center;padding:0 10px;border-radius:6px;
  background:var(--line-2);color:var(--ink-2);font-size:14px;font-variant-numeric:tabular-nums}
.rvrow.one{grid-template-columns:1fr}
.rvcard textarea{min-height:52px;font-family:var(--font);font-size:14px}
.rv .card-h h2{font-size:15px}
.rv .pill{font-size:11px;height:20px}
/* 机器校验说明：默认折成一行，点开才看条目（原来一整块红字铺满卡片顶） */
.rvnote{margin:2px 0 10px;border:1px solid var(--line);border-radius:8px;background:#fbfaf6}
.rvnote summary{cursor:pointer;padding:8px 10px;font-size:13px;color:var(--ink-2);list-style:none}
.rvnote summary::-webkit-details-marker{display:none}
.rvnote summary:before{content:"▸ ";color:var(--ink-3)}
.rvnote[open] summary:before{content:"▾ "}
.rvnote ul{margin:0;padding:0 14px 10px 30px;font-size:13px;color:var(--ink-2);line-height:1.65}
/* 原文：折两行，点开看全文 */
.rvraw{margin:2px 0 10px;border-radius:8px;background:#f4f3ef;padding:8px 10px;font-size:13px}
.rvraw summary{cursor:pointer;color:var(--ink-3);list-style:none}
.rvraw summary::-webkit-details-marker{display:none}
.rvraw p{margin:6px 0 0;color:var(--ink-2);line-height:1.7;word-break:break-all}
/* 底部：勾选一行、按钮一行；手机端主按钮满宽在最上 */
.rvfoot{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between;
  border-top:1px solid var(--line);padding-top:10px;margin-top:2px}
.rvacts{display:flex;gap:8px}
@media (max-width:900px){
  .rvrow,.rvrow.three,.rvrow.two,.rvrow.name{grid-template-columns:1fr 1fr}
  .rvrow.one{grid-template-columns:1fr}
  .rvfoot{flex-direction:column;align-items:stretch}
  .rvacts{display:grid;grid-template-columns:1fr 1fr;gap:8px;width:100%}
  .rvacts button{width:100%;height:42px}
  .rvacts button[value=fix]{grid-column:1/-1;order:-1}
}
@media (max-width:600px){
  .rvrow,.rvrow.three,.rvrow.two,.rvrow.name{grid-template-columns:1fr}
}

/* 搜索行：输入框自适应 + 按钮贴右 */
.form-row.search{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:end}
@media (max-width:900px){.form-row.search{grid-template-columns:1fr}}

/* 人物列表：派名/名/世代不折行；生卒列给足宽度；原文两行截断 */
table.resp td.nm,table.resp th.nm{white-space:nowrap}
table.resp td.nm b{font-weight:600}
table.resp td.gen{white-space:nowrap;color:var(--ink-2);font-variant-numeric:tabular-nums}
table.resp td.life{min-width:190px;color:var(--ink-2)}
table.resp td.clip2{max-width:520px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;
  -webkit-box-orient:vertical;line-height:1.55}
@media (max-width:900px){table.resp td.clip2{max-width:none;-webkit-line-clamp:4}}

/* 时间列不折行；分页当前页做成圆点 */
table.resp td.time{white-space:nowrap}
.pager .pg .cur,.pager .cur{display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;
  border-radius:13px;background:var(--accent);color:#fff;font-size:12px;font-weight:600;padding:0 8px}

/* 日志表：窄列定宽，省得空行（—）把整表撑宽 */
table.logs td:nth-child(1),table.logs th:nth-child(1){width:120px}
table.logs td:nth-child(2),table.logs th:nth-child(2){width:72px}
table.logs td:nth-child(3),table.logs th:nth-child(3){width:90px}
table.logs td:nth-child(8),table.logs th:nth-child(8){width:110px}
table.logs td:nth-child(4){max-width:240px}
table.logs td:nth-child(5){max-width:220px}

/* 手机：页面右上那排按钮改成等宽两列，不再狼牙参差 */
@media (max-width:600px){
  .topline .actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;width:100%}
  .topline .actions .btn{width:100%;justify-content:center}
}

/* 契约文档：引用块 + 行内码 */
.card.doc blockquote{margin:10px 0;padding:8px 12px;border-left:3px solid var(--line);
  background:var(--line-2);color:var(--ink-2);font-size:13.5px;border-radius:0 6px 6px 0}
.card.doc code{background:var(--line-2);padding:1px 5px;border-radius:4px;font-size:12.5px;
  white-space:pre-wrap;word-break:break-word}
.card.doc pre{white-space:pre-wrap;word-break:break-word}
.card.doc h2{font-size:18px;margin:22px 0 10px}
.card.doc p{line-height:1.75}

/* 批次/任务的固定色块：同一个 id 永远同一色 */
.jdot{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:7px;
  vertical-align:baseline;flex:none}

/* 核对卡三段标题：本人 / 配偶 / 子女 */
.rvsec{font-size:12px;color:var(--ink-3);letter-spacing:.1em;margin:14px 0 6px;
  padding-bottom:4px;border-bottom:1px dashed var(--line)}
.rvsec:first-child{margin-top:4px}

/* 出件闸门提示：单独一块，换行显示，不挤按钮 */
.gateblock{display:inline-block;vertical-align:top}
.gatehint{margin-top:6px;max-width:300px;font-size:12.5px;line-height:1.65;color:var(--warn);
  background:var(--warn-soft);border-radius:6px;padding:6px 9px}
@media (max-width:600px){.gatehint{max-width:none}}

/* 批次页操作条：流程组 / 查看组，各自不换行，组间一条竖线 */
.actions2{display:flex;flex-wrap:wrap;align-items:center;gap:10px;justify-content:flex-end}
.gatehint.wide{flex-basis:100%;margin-top:8px}
.actions2 .agrp{display:flex;flex-wrap:wrap;align-items:flex-start;gap:8px}
.actions2 .asep{width:1px;height:26px;background:var(--line);margin:2px 4px}
@media (max-width:600px){
  .actions2{justify-content:stretch}
  .actions2 .agrp{width:100%}
  .actions2 .asep{display:none}
}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.field .row2 input{width:100%}
/* 侧栏按模块分组（2026-11-10）：组名一行小字，组内链接照旧 */
.navg{margin:14px 0 4px;padding:0 10px;font-size:12px;letter-spacing:.08em;color:var(--dim,#8a8f98);opacity:.75}
.navg:first-child{margin-top:6px}


/* 窄屏顶栏：常驻「退出」（宽屏侧栏里已有，不重复占位） */
.topbar{display:none}
@media (max-width:900px){
  .topbar{display:flex;align-items:center;justify-content:space-between;gap:10px;
    padding:8px var(--s4);border-bottom:1px solid var(--line);background:var(--card)}
  .topbar .tb-who{font-size:13px;color:var(--ink-3)}
}

/* ============ 侧栏 v2（2026-11-11 机主：重做，原版太糙） ============ */
.shell{grid-template-columns:252px minmax(0,1fr)}
.side-in{display:flex;flex-direction:column;width:100%;min-height:0;padding:18px 12px 12px;gap:6px}
.brand{padding:2px 6px 14px}
.brand .seal{width:36px;height:36px;border-radius:11px;font-size:18px;
  background:linear-gradient(135deg,#2b4f7d,#182f4c);box-shadow:0 3px 10px rgba(24,47,76,.28)}
.brand .nm b{font-size:17px}
.brand .nm span{font-size:10.5px;letter-spacing:.18em}

.nav{flex:1 1 auto;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:1px;
  margin:0 -6px;padding:0 6px 6px;scrollbar-width:thin;scrollbar-color:#d8d5cf transparent}
.nav::-webkit-scrollbar{width:6px}
.nav::-webkit-scrollbar-thumb{background:#dcd9d3;border-radius:3px}
.nav::-webkit-scrollbar-track{background:transparent}
.nav a{display:flex;align-items:center;gap:11px;height:42px;padding:0 12px;border-radius:10px;
  color:var(--ink-2);font-size:16px;font-weight:400;position:relative;
  transition:background .12s,color .12s}
.nav a .ni{width:19px;height:19px;flex:0 0 19px;fill:none;stroke:currentColor;stroke-width:1.6;
  stroke-linecap:round;stroke-linejoin:round;opacity:.72}
.nav a:hover{background:var(--line-2);color:var(--ink);text-decoration:none}
.nav a:hover .ni{opacity:1}
.nav a.on{background:var(--accent-soft);color:var(--accent);font-weight:600}
.nav a.on .ni{opacity:1}
.nav a.on::before{content:"";position:absolute;left:2px;top:50%;transform:translateY(-50%);
  width:3px;height:20px;border-radius:3px;background:var(--accent)}
.navtop a{margin-bottom:4px}

.navgrp{margin:0;display:flex;flex-direction:column}
.navgrp .gtoggle{position:absolute;opacity:0;pointer-events:none;width:0;height:0}
.navgrp .gname{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;
  padding:16px 12px 7px;font-size:16px;font-weight:700;letter-spacing:.02em;color:var(--ink);
  user-select:none}
.navgrp .gname:hover{color:var(--ink)}
.navgrp .gname{border-bottom:1px solid var(--line-2);margin:0 6px 4px;padding-left:6px;padding-right:6px}
.navgrp .chev{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;
  stroke-linecap:round;stroke-linejoin:round;opacity:.55;transition:transform .15s}
.navgrp .gtoggle:checked ~ .gname .chev{transform:rotate(180deg)}
.navgrp .gtoggle:not(:checked) ~ .glinks{display:none}
.glinks{display:flex;flex-direction:column;gap:1px}

.sidefoot{margin-top:auto;padding-top:12px;border-top:1px solid var(--line)}
.me{display:flex;align-items:center;gap:10px;padding:8px;border-radius:12px;background:var(--line-2)}
.me .ava{width:34px;height:34px;flex:0 0 34px;border-radius:50%;background:var(--card);
  border:1px solid var(--line);display:grid;place-items:center;font-weight:600;color:var(--accent);font-size:15px}
.me .metxt{display:flex;flex-direction:column;min-width:0;line-height:1.3}
.me .metxt b{font-size:15px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.me .metxt span{font-size:12.5px;color:var(--ink-3)}
.me .quit{margin-left:auto;width:34px;height:34px;flex:0 0 34px;border-radius:9px;display:grid;
  place-items:center;color:var(--ink-3);transition:background .12s,color .12s}
.me .quit svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round}
.me .quit:hover{background:var(--bad-soft);color:var(--bad);text-decoration:none}

@media (max-width:900px){
  .shell{grid-template-columns:1fr}
  .side{height:auto;position:sticky;top:0;z-index:30;border-right:0;border-bottom:1px solid var(--line)}
  .side-in{flex-direction:row;align-items:center;gap:6px;padding:8px 10px;overflow-x:auto}
  .brand{padding:0 4px 0 0}
  .brand .nm{display:none}
  .brand .seal{width:30px;height:30px;border-radius:9px;font-size:15px}
  .nav{flex-direction:row;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;gap:6px;margin:0;padding:0 0 2px}
  .nav a{flex:0 0 auto}
  .navgrp{display:contents}
  .navgrp .gname{display:none}
  .glinks{display:contents}
  .nav a{height:38px;padding:0 12px;font-size:15px;white-space:nowrap;border-radius:9px}
  .nav a.on::before{display:none}
  .nav a .ni{display:none}
  .sidefoot{display:none}
}

/* 手机：查询条件一律一列（模型/距离不再拉满屏） */
@media (max-width:760px){
  .form-row.three{grid-template-columns:1fr;max-width:none}
}

/* ============ 列表对齐（2026-11-11 机主报「计费各页数据列没对准」） ============
   根因两条：①数字单元格右对齐、表头却左对齐 ②没有列宽，浏览器按内容乱分
   改法：数字列表头也右对齐（th.num）＋每张表用 colgroup 定百分比列宽 + table-layout:fixed */
th.num{text-align:right}
table.tbl-bill{table-layout:fixed}
table.tbl-bill th,table.tbl-bill td{padding:11px 12px;overflow-wrap:anywhere}
table.tbl-bill th.num,table.tbl-bill td.num{white-space:nowrap}
table.tbl-bill td.time{white-space:nowrap;color:var(--ink-3)}
table.tbl-bill thead th+th,table.tbl-bill tbody td+td{border-left:1px solid var(--line-2)}

/* 列表页筛选条：一行排开（原来 form.inline 只有 display:inline → 输入框被拉成整行、按钮掉到下一行） */
.card-h form.inline{display:flex;flex-wrap:wrap;align-items:center;gap:8px;justify-content:flex-end}
.card-h form.inline input[type=text],.card-h form.inline input[type=search]{width:200px;min-width:140px}
.card-h form.inline select{width:150px;min-width:120px}
@media (max-width:900px){
  table.tbl-bill{table-layout:auto}
  table.tbl-bill th,table.tbl-bill td{padding:2px 0;border-left:0}
  table.tbl-bill td.time{white-space:normal}
  .card-h form.inline{width:100%;justify-content:flex-start}
  .card-h form.inline input[type=text],.card-h form.inline input[type=search],
  .card-h form.inline select{flex:1 1 100%;width:100%}
}

/* 列表行（入口/明细混排）：标题—说明—按钮一行排开（原来 .li 没样式，文字会粘在一起） */
.li{display:flex;align-items:center;gap:10px;padding:11px 0;
  border-bottom:1px solid var(--line-2);font-size:14px;color:var(--ink-2)}
.li:last-child{border-bottom:0}
.li b{font-weight:600;color:var(--ink);white-space:nowrap}
.li .dim{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.li .btn{margin-left:auto;flex:0 0 auto}
@media (max-width:600px){
  .li{flex-wrap:wrap}
  .li .dim{flex:1 1 100%;white-space:normal}
}

/* 侧栏整体可滚（2026-11-11：菜单 15 项 + 5 组，900px 高的屏装不下；
   原来只滚 .nav，结果「设置」组标题露一半、菜单项被切掉，看着像坏了）*/
.side{overflow:hidden}
.side-in{max-height:100vh;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin}
.side-in::-webkit-scrollbar{width:6px}
.side-in::-webkit-scrollbar-thumb{background:#dcd8cf;border-radius:3px}
.nav{flex:0 0 auto;overflow:visible;margin:0 -6px;padding:0 6px 6px}
.nav a{height:40px}
.navgrp>summary,.navgrp .gname{padding:9px 12px 3px}

/* 品牌与账号卡片常驻（菜单滚，头尾不动） */
.brand{position:sticky;top:0;z-index:3;background:var(--card)}
.sidefoot{position:sticky;bottom:0;z-index:3;background:var(--card);padding-bottom:2px}

/* 菜单滚到品牌下面时加一层渐隐，避免露出半截菜单项 */
.brand{box-shadow:0 8px 10px -10px rgba(20,20,25,.35)}
.brand:after{content:"";position:absolute;left:0;right:0;bottom:-16px;height:16px;
  background:linear-gradient(var(--card),rgba(255,255,255,0));pointer-events:none}

/* 任务列表筛选：用户（归属账号）+ 任务名 + 查询，各占一格不叠在一起 */
.form-row.taskflt{grid-template-columns:220px minmax(240px,1fr) auto;gap:10px;
  max-width:860px;align-items:end;justify-content:start}
.form-row.taskflt select{max-width:none}
@media (max-width:900px){.form-row.taskflt{grid-template-columns:1fr;max-width:none}}

/* 账号卡片上沿渐隐（菜单滚到下面时不露出半截行） */
.sidefoot{box-shadow:0 -8px 10px -10px rgba(20,20,25,.35)}
.sidefoot:before{content:"";position:absolute;left:0;right:0;top:-14px;height:14px;
  background:linear-gradient(rgba(255,255,255,0),var(--card));pointer-events:none}

/* 页脚多了「公安备案」一项（2026-11-11）：桌面 52→58px、手机 62→86px，允许换行 */
:root{--foot-h:58px}
.site-foot{flex-wrap:wrap;row-gap:2px}
@media (max-width:900px){ :root{--foot-h:86px} .site-foot{flex-wrap:wrap} }

/* 公安联网备案：官方图标 + 备案号，一行不折 */
.site-foot .police{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
.site-foot .police img{width:16px;height:16px;display:block;flex:0 0 16px}
