/* =========================================================
   打包平台样式（来自设计稿 design/assets/design.css）
   规则见 design/README.md
   ========================================================= */

:root{
  /* 中性色 */
  --bg:#f4f5f7; --surface:#fff; --surface-2:#f8f9fb; --surface-3:#eef0f3;
  --line:#e5e7eb; --line-2:#d4d8df;
  --ink:#151a23; --ink-2:#4a5263; --ink-3:#868e9c; --ink-4:#b3b9c3;
  /* 品牌 / 操作色 */
  --brand:#2f5bea; --brand-ink:#1f45c7; --brand-soft:#edf2ff; --brand-line:#c9d6fb;
  /* 状态色：每种 3 个值 = 主色 / 浅底 / 深字 */
  --ok:#17a34a;   --ok-soft:#e7f6ec;   --ok-ink:#11743a;   --ok-line:#b7e3c6;
  --run:#2f6fed;  --run-soft:#e9f0fe;  --run-ink:#1d4fb8;  --run-line:#c3d5fb;
  --warn:#e08a00; --warn-soft:#fff4dc; --warn-ink:#94560a; --warn-line:#f4d28c;
  --hold:#f7c948; --hold-soft:#fff8d6; --hold-ink:#6b4e00; --hold-line:#efd57a;
  --bad:#dc3b31;  --bad-soft:#fdecea;  --bad-ink:#a8251c;  --bad-line:#f5c1bc;
  --idle:#8a93a3; --idle-soft:#f0f2f5; --idle-ink:#4a5263; --idle-line:#d9dde3;
  /* 字号 */
  --fs-xs:12px; --fs-sm:13px; --fs-md:14px; --fs-lg:16px; --fs-xl:18px; --fs-2xl:22px; --fs-3xl:28px;
  /* 间距（4 的倍数） */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:20px; --s6:24px; --s8:32px; --s10:40px;
  /* 圆角 / 阴影 */
  --r-sm:6px; --r-md:8px; --r-lg:12px; --r-pill:999px;
  --shadow-1:0 1px 2px rgba(16,24,40,.05);
  --shadow-2:0 6px 24px rgba(16,24,40,.10);
  --shadow-3:0 18px 48px rgba(16,24,40,.18);
  /* 尺寸 */
  --nav-h:56px; --tab-h:58px; --ctl-h:36px; --ctl-h-lg:44px; --page-w:1200px;
  --mono:ui-monospace,"SF Mono",Menlo,Consolas,monospace;
}

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--ink);
  font:var(--fs-md)/1.6 -apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans CJK SC",sans-serif;
  -webkit-font-smoothing:antialiased}
a{color:var(--brand);text-decoration:none}
a:hover{color:var(--brand-ink)}
h1,h2,h3,p{margin:0}
button,input,select,textarea{font:inherit;color:inherit}
.mono{font-family:var(--mono);font-size:.92em;word-break:break-all}
.num{font-variant-numeric:tabular-nums}
.muted{color:var(--ink-3)} .sub{color:var(--ink-2)}
.xs{font-size:var(--fs-xs)} .sm{font-size:var(--fs-sm)}
.nowrap{white-space:nowrap}
.grow{flex:1;min-width:0}
.hide{display:none!important}
.ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.i{width:16px;height:16px;flex:none;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:-3px}
.i.lg{width:20px;height:20px}

/* ---------------- 全局导航 ---------------- */
.topnav{position:sticky;top:0;z-index:40;height:var(--nav-h);background:rgba(255,255,255,.92);
  backdrop-filter:saturate(1.6) blur(10px);border-bottom:1px solid var(--line)}
.topnav-in{max-width:var(--page-w);margin:0 auto;height:100%;padding:0 var(--s6);display:flex;align-items:center;gap:var(--s6)}
.logo{display:flex;align-items:center;gap:var(--s2);font-weight:700;font-size:var(--fs-lg);color:var(--ink);white-space:nowrap}
.logo-mark{width:28px;height:28px;border-radius:8px;background:var(--ink);color:#fff;display:grid;place-items:center}
.logo-mark .i{width:16px;height:16px}
.nav{display:flex;gap:var(--s1);height:100%}
.nav a{display:flex;align-items:center;gap:6px;padding:0 var(--s3);color:var(--ink-2);font-weight:500;position:relative;white-space:nowrap}
.nav a:hover{color:var(--ink)}
.nav a.on{color:var(--ink);font-weight:600}
.nav a.on::after{content:"";position:absolute;left:var(--s3);right:var(--s3);bottom:-1px;height:2px;border-radius:2px;background:var(--ink)}
.nav .count{min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--bad);color:#fff;font-size:11px;font-weight:600;display:inline-grid;place-items:center;line-height:1}
.nav .count.run{background:var(--run)}
.topnav-right{margin-left:auto;display:flex;align-items:center;gap:var(--s3)}
.machine{display:flex;align-items:center;gap:6px;font-size:var(--fs-xs);color:var(--ink-3);white-space:nowrap}
.machine:hover{color:var(--ink-2)}

/* 手机底部 Tab 栏 */
.tabbar{display:none}
.mtop{display:none}

/* ---------------- 页面骨架 ---------------- */
.page{max-width:var(--page-w);margin:0 auto;padding:var(--s6) var(--s6) var(--s10)}
.page.narrow{max-width:880px}
.page-head{display:flex;align-items:flex-end;gap:var(--s4);margin-bottom:var(--s5);flex-wrap:wrap}
.page-head h1{font-size:var(--fs-2xl);font-weight:700;line-height:1.3;letter-spacing:.2px}
.page-head .desc{color:var(--ink-3);font-size:var(--fs-sm);margin-top:2px}
.page-head .acts{margin-left:auto;display:flex;gap:var(--s2);flex-wrap:wrap}
.back{display:inline-flex;align-items:center;gap:2px;color:var(--ink-3);font-size:var(--fs-sm);margin-bottom:var(--s2)}
.back:hover{color:var(--ink)}
.section{margin-bottom:var(--s6)}
.section-title{display:flex;align-items:center;gap:var(--s2);margin-bottom:var(--s3);font-size:var(--fs-lg);font-weight:600}
.section-title .muted{font-weight:400;font-size:var(--fs-sm)}
.section-title .acts{margin-left:auto;display:flex;gap:var(--s2)}

/* ---------------- 卡片 ---------------- */
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-1)}
.card-pad{padding:var(--s5)}
.card-head{display:flex;align-items:center;gap:var(--s3);padding:var(--s4) var(--s5);border-bottom:1px solid var(--line)}
.card-head h2{font-size:var(--fs-lg);font-weight:600}
.card-head .acts{margin-left:auto;display:flex;gap:var(--s2);align-items:center}
.card-foot{padding:var(--s3) var(--s5);border-top:1px solid var(--line);background:var(--surface-2);border-radius:0 0 var(--r-lg) var(--r-lg);font-size:var(--fs-sm);color:var(--ink-3)}
.card + .card{margin-top:var(--s4)}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4)}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4)}
.stack{display:flex;flex-direction:column;gap:var(--s4)}

/* ---------------- 按钮 ---------------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:var(--ctl-h);padding:0 14px;border-radius:var(--r-md);
  border:1px solid var(--line-2);background:var(--surface);color:var(--ink);font-weight:500;font-size:var(--fs-md);
  cursor:pointer;white-space:nowrap;transition:background .15s,border-color .15s,box-shadow .15s;user-select:none}
.btn:hover{background:var(--surface-2);border-color:#c3c8d1;color:var(--ink)}
.btn:active{transform:translateY(1px)}
.btn:focus-visible,.chip:focus-within,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--brand-line);outline-offset:1px}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff;box-shadow:0 1px 2px rgba(47,91,234,.3)}
.btn.primary:hover{background:var(--brand-ink);border-color:var(--brand-ink)}
.btn.ok{background:var(--ok);border-color:var(--ok);color:#fff}
.btn.ok:hover{background:var(--ok-ink)}
.btn.danger{color:var(--bad-ink);border-color:var(--bad-line)}
.btn.danger:hover{background:var(--bad-soft)}
.btn.danger-solid{background:var(--bad);border-color:var(--bad);color:#fff}
.btn.ghost{border-color:transparent;background:transparent;color:var(--ink-2)}
.btn.ghost:hover{background:var(--surface-3);color:var(--ink)}
.btn.sm{height:30px;padding:0 10px;font-size:var(--fs-sm);border-radius:var(--r-sm)}
.btn.lg{height:var(--ctl-h-lg);padding:0 20px;font-size:var(--fs-lg);border-radius:10px}
.btn.icon{width:var(--ctl-h);padding:0}
.btn.sm.icon{width:30px}
.btn[disabled],.btn.is-disabled{opacity:.45;pointer-events:none}
.btn.loading{pointer-events:none;color:transparent!important;position:relative}
.btn.loading::after{content:"";position:absolute;width:16px;height:16px;border-radius:50%;border:2px solid rgba(255,255,255,.5);border-top-color:#fff;animation:spin .8s linear infinite}
.btn:not(.primary).loading::after{border-color:var(--line-2);border-top-color:var(--ink-2)}
.btn-group{display:inline-flex;gap:var(--s2);flex-wrap:wrap;align-items:center}
.link{background:none;border:0;padding:0;color:var(--brand);cursor:pointer;font-weight:500}
.link:hover{color:var(--brand-ink)}
.link.muted{color:var(--ink-3)} .link.muted:hover{color:var(--ink)}
.link.danger{color:var(--bad-ink)}

/* ---------------- 状态胶囊 / 圆点 ---------------- */
.pill{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 10px;border-radius:var(--r-pill);font-size:var(--fs-xs);font-weight:600;white-space:nowrap;
  background:var(--idle-soft);color:var(--idle-ink)}
.pill::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.pill.lg{height:30px;padding:0 14px;font-size:var(--fs-md)}
.pill.lg::before{width:8px;height:8px}
.pill.ok{background:var(--ok-soft);color:var(--ok-ink)}
.pill.run{background:var(--run-soft);color:var(--run-ink)}
.pill.run::before{animation:pulse 1.4s ease-in-out infinite}
.pill.warn{background:var(--warn-soft);color:var(--warn-ink)}
.pill.bad{background:var(--bad-soft);color:var(--bad-ink)}
.pill.idle{background:var(--idle-soft);color:var(--idle-ink)}
.pill.off{background:var(--idle-soft);color:var(--ink-3)}
.pill.off::before{background:transparent;border:1.5px solid currentColor;width:5px;height:5px}
.pill.plain::before{display:none}
.tag{display:inline-flex;align-items:center;height:20px;padding:0 7px;border-radius:var(--r-sm);font-size:11px;font-weight:600;white-space:nowrap;background:var(--surface-3);color:var(--ink-2)}
.tag.brand{background:var(--brand-soft);color:var(--brand-ink)}
.tag.warn{background:var(--warn-soft);color:var(--warn-ink)}
.tag.bad{background:var(--bad-soft);color:var(--bad-ink)}
.tag.ok{background:var(--ok-soft);color:var(--ok-ink)}
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--idle);flex:none}
.dot.ok{background:var(--ok);box-shadow:0 0 0 3px var(--ok-soft)}
.dot.bad{background:var(--bad);box-shadow:0 0 0 3px var(--bad-soft)}
.dot.run{background:var(--run)}
.t-ok{color:var(--ok-ink)} .t-bad{color:var(--bad-ink)} .t-warn{color:var(--warn-ink)} .t-run{color:var(--run-ink)}

/* ---------------- 渠道进度条（一段一个渠道） ---------------- */
.segbar{display:flex;gap:2px;height:8px;width:100%;max-width:220px}
.segbar i{flex:1;border-radius:2px;background:var(--surface-3)}
.segbar i.ok{background:var(--ok)}
.segbar i.bad{background:var(--bad)}
.segbar i.run{background:var(--run);background-image:linear-gradient(45deg,rgba(255,255,255,.35) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.35) 50%,rgba(255,255,255,.35) 75%,transparent 75%);background-size:10px 10px;animation:stripes 1s linear infinite}
.segbar i.cancel{background:var(--idle-line)}
.segbar.lg{height:10px;max-width:none}
.prog-text{font-size:var(--fs-sm);color:var(--ink-2);margin-top:6px;display:flex;gap:var(--s3);flex-wrap:wrap}
.prog-text b{font-weight:600}

.meter{height:6px;border-radius:3px;background:var(--surface-3);overflow:hidden}
.meter i{display:block;height:100%;background:var(--ok);border-radius:3px}
.meter.warn i{background:var(--warn)} .meter.bad i{background:var(--bad)}

/* ---------------- 提示条 ---------------- */
.notice{display:flex;gap:var(--s3);align-items:flex-start;padding:var(--s3) var(--s4);border-radius:var(--r-md);font-size:var(--fs-md);border:1px solid;line-height:1.55}
.notice .i{margin-top:3px}
.notice b{font-weight:600}
.notice .acts{margin-left:auto;display:flex;gap:var(--s2);align-self:center;flex-wrap:wrap}
.notice.info{background:var(--brand-soft);border-color:var(--brand-line);color:#1e3a8a}
.notice.warn{background:var(--warn-soft);border-color:var(--warn-line);color:#6b3f05}
.notice.bad{background:var(--bad-soft);border-color:var(--bad-line);color:#7f1d1d}
.notice.ok{background:var(--ok-soft);border-color:var(--ok-line);color:#0f5130}
.notice + .notice{margin-top:var(--s2)}

/* ---------------- 表单 ---------------- */
.field{display:flex;flex-direction:column;gap:6px}
.field > label,.label{font-size:var(--fs-sm);font-weight:600;color:var(--ink)}
.label .muted,.field > label .muted{font-weight:400}
.req{color:var(--bad);margin-left:2px}
.hint{font-size:var(--fs-xs);color:var(--ink-3)}
.hint.bad{color:var(--bad-ink)} .hint.warn{color:var(--warn-ink)} .hint.ok{color:var(--ok-ink)}
.input,select.input,textarea.input{width:100%;height:var(--ctl-h);padding:0 12px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface);
  transition:border-color .15s,box-shadow .15s}
textarea.input{height:auto;min-height:96px;padding:10px 12px;resize:vertical;line-height:1.6}
.input:hover{border-color:#b9bfca}
.input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft)}
.input.is-bad{border-color:var(--bad);box-shadow:0 0 0 3px var(--bad-soft)}
.input.is-warn{border-color:var(--warn);box-shadow:0 0 0 3px var(--warn-soft)}
.input.mono{font-size:var(--fs-md)}
select.input{appearance:none;padding-right:32px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23868e9c' stroke-width='2.5'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 12px center}
.input-wrap{position:relative;display:flex;align-items:center}
.input-wrap .input{padding-right:84px}
.input-wrap .suffix{position:absolute;right:6px}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4) var(--s5)}
.form-grid .full{grid-column:1/-1}
.check{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none}
.check input{width:18px;height:18px;margin:0;accent-color:var(--brand)}

/* 可选卡片 / 芯片 */
.chips{display:flex;flex-wrap:wrap;gap:var(--s2)}
.chip{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 12px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface);cursor:pointer;user-select:none;font-weight:500;white-space:nowrap}
.chip:hover{border-color:#b9bfca}
.chip input{width:16px;height:16px;margin:0;accent-color:var(--brand)}
.chip:has(input:checked){border-color:var(--brand);background:var(--brand-soft);color:var(--brand-ink)}
.chip.sm{height:30px;font-size:var(--fs-sm);padding:0 10px}
.chip .muted{font-weight:400}
.filter-chips{display:flex;gap:6px;flex-wrap:wrap}
.fchip{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border-radius:var(--r-pill);border:1px solid var(--line);background:var(--surface);color:var(--ink-2);font-size:var(--fs-sm);font-weight:500;white-space:nowrap;cursor:pointer}
.fchip:hover{color:var(--ink);border-color:var(--line-2)}
.fchip.on{background:var(--ink);border-color:var(--ink);color:#fff}
.fchip .n{font-size:11px;opacity:.75}

.seg{display:inline-flex;padding:3px;background:var(--surface-3);border-radius:10px;gap:2px}
.seg a,.seg button,.seg label{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 14px;border-radius:7px;border:0;background:none;color:var(--ink-2);font-weight:500;font-size:var(--fs-sm);cursor:pointer;white-space:nowrap}
.seg .on,.seg label:has(input:checked){background:var(--surface);color:var(--ink);box-shadow:0 1px 3px rgba(16,24,40,.12)}
.seg input{display:none}
.seg .n{font-weight:600;color:var(--bad)}

/* 选择卡片（发起打包选应用） */
.pick-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:var(--s3)}
.pick{position:relative;display:flex;flex-direction:column;gap:2px;padding:var(--s3) var(--s4);border:1.5px solid var(--line);border-radius:var(--r-lg);background:var(--surface);cursor:pointer;transition:border-color .15s,background .15s}
.pick:hover{border-color:var(--line-2)}
.pick input{position:absolute;opacity:0;pointer-events:none}
.pick:has(input:checked){border-color:var(--brand);background:var(--brand-soft)}
.pick:has(input:checked)::after{content:"";position:absolute;top:10px;right:10px;width:18px;height:18px;border-radius:50%;background:var(--brand) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.5'%3E%3Cpath d='M5 12l5 5L20 7'/%3E%3C/svg%3E") center no-repeat}
.pick .name{font-weight:700;font-size:var(--fs-lg)}
.pick .meta{font-size:var(--fs-xs);color:var(--ink-3)}
.pick .busy{font-size:var(--fs-xs);color:var(--run-ink);font-weight:600}

/* ---------------- 行列表（一套标记：电脑是表格，手机是卡片） ---------------- */
.rows{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--shadow-1)}
.rows-head,.row{display:grid;align-items:center;gap:var(--s4);padding:0 var(--s5)}
.rows-head{height:40px;background:var(--surface-2);border-bottom:1px solid var(--line);font-size:var(--fs-xs);font-weight:600;color:var(--ink-3);letter-spacing:.3px}
.row{min-height:64px;padding-top:var(--s3);padding-bottom:var(--s3);border-bottom:1px solid var(--line);position:relative}
.row:last-child{border-bottom:0}
a.row,.row.clickable{color:inherit;cursor:pointer}
a.row:hover,.row.clickable:hover{background:var(--surface-2)}
.row .acts{display:flex;gap:var(--s2);justify-content:flex-end;align-items:center;flex-wrap:wrap}
.row.voided{opacity:.5}
.row.voided .strike{text-decoration:line-through}
.row.hl-bad{background:linear-gradient(90deg,var(--bad) 0 3px,transparent 3px)}
.row.hl-warn{background:linear-gradient(90deg,var(--warn) 0 3px,transparent 3px)}
.row.hl-run{background:linear-gradient(90deg,var(--run) 0 3px,transparent 3px)}
.cell-k{display:none}
.title-line{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
.title-line b{font-weight:600}
.cap{font-size:var(--fs-xs);color:var(--ink-3);margin-top:2px}

/* 打包列表 */
.task-rows .rows-head,.task-rows .row{grid-template-columns:64px minmax(180px,1.6fr) 120px 112px minmax(200px,1.5fr) 96px 96px}
.task-id{color:var(--ink-3);font-family:var(--mono);font-size:var(--fs-sm)}
.task-rows .reason{font-size:var(--fs-xs);color:var(--ink-3);max-width:320px}
.failed-ch{font-size:var(--fs-xs);color:var(--bad-ink);margin-top:4px}
.again{opacity:0;transition:opacity .15s}
.row:hover .again,.again:focus{opacity:1}

/* 渠道行（任务详情） */
.ch-rows .rows-head,.ch-rows .row{grid-template-columns:140px minmax(200px,1.5fr) 80px 72px minmax(190px,1fr) 214px}
.ch-rows .c-act{flex-wrap:nowrap}
.ch-name b{font-weight:700;font-family:var(--mono);font-size:var(--fs-md)}
.ch-step{font-size:var(--fs-xs);color:var(--run-ink);margin-top:4px;display:flex;align-items:center;gap:6px}
.ch-fail{margin-top:8px;padding:8px 10px;border-radius:var(--r-md);background:var(--bad-soft);font-size:var(--fs-sm);color:#7f1d1d;line-height:1.5}
.ch-fail b{color:var(--bad-ink)}
.ch-fail .do{display:inline-flex;align-items:center;gap:4px;margin-top:2px;font-weight:600;color:var(--bad-ink)}
.ch-fail code{font-family:var(--mono);font-size:var(--fs-xs);color:#7f1d1d;opacity:.8;display:block;margin-top:2px}
.mark-box{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.mk-btn{display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 10px;border-radius:var(--r-pill);border:1px dashed var(--line-2);background:var(--surface);font-size:var(--fs-xs);font-weight:600;color:var(--ink-2);cursor:pointer;white-space:nowrap}
.mk-btn:hover{border-style:solid;border-color:var(--brand);color:var(--brand-ink);background:var(--brand-soft)}
.mk-btn.is-on{border-style:solid}
.mk-btn.is-on.run{border-color:var(--run-line);background:var(--run-soft);color:var(--run-ink)}
.mk-btn.is-on.ok{border-color:var(--ok-line);background:var(--ok-soft);color:var(--ok-ink)}
.mk-none{font-size:var(--fs-xs);color:var(--ink-4)}

/* ---------------- 定义列表 / 复制字段 ---------------- */
.kv{display:grid;grid-template-columns:160px 1fr;border-top:1px solid var(--line)}
.kv > div{padding:12px 0;border-bottom:1px solid var(--line);min-width:0}
.kv .k{color:var(--ink-3);font-size:var(--fs-sm);padding-right:var(--s4)}
.kv.compact > div{padding:8px 0}
.copy-field{display:flex;align-items:center;gap:var(--s3);min-height:56px;padding:10px var(--s5);border-bottom:1px solid var(--line)}
.copy-field:last-child{border-bottom:0}
.copy-field .k{width:140px;flex:none;color:var(--ink-3);font-size:var(--fs-sm)}
.copy-field .v{flex:1;min-width:0;font-family:var(--mono);font-size:var(--fs-md);word-break:break-all;line-height:1.5}
.copy-field .v.text{font-family:inherit;white-space:pre-line}
.copy-btn{display:inline-flex;align-items:center;gap:4px;height:30px;padding:0 10px;border-radius:var(--r-sm);border:1px solid var(--line);background:var(--surface);font-size:var(--fs-sm);font-weight:500;color:var(--ink-2);cursor:pointer;flex:none;white-space:nowrap}
.copy-btn:hover{border-color:var(--brand-line);color:var(--brand-ink);background:var(--brand-soft)}
.copy-btn.done{border-color:var(--ok-line);background:var(--ok-soft);color:var(--ok-ink)}

/* 校验结果 */
.checks{display:grid;grid-template-columns:1fr 1fr;gap:0 var(--s6)}
.chk{display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-bottom:1px solid var(--line);min-width:0}
.chk .ic{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;flex:none;margin-top:1px}
.chk .ic .i{width:12px;height:12px;stroke-width:3.2}
.chk.ok .ic{background:var(--ok-soft);color:var(--ok)}
.chk.bad .ic{background:var(--bad);color:#fff}
.chk .n{font-weight:600;font-size:var(--fs-sm)}
.chk .d{font-size:var(--fs-xs);color:var(--ink-3);word-break:break-all}
.chk.bad .d{color:var(--bad-ink)}

/* ---------------- 看板矩阵 ---------------- */
.matrix-wrap{overflow-x:auto}
.matrix{width:100%;border-collapse:separate;border-spacing:6px;table-layout:fixed}
.matrix th{font-size:var(--fs-xs);font-weight:600;color:var(--ink-3);text-align:center;padding:4px 0}
.matrix th.app-h{text-align:left;width:118px}
.matrix th.sum-h{width:88px}
.matrix td{padding:0;height:56px}
.matrix td.app{padding-right:6px}
.matrix td.app a{display:block;color:var(--ink);font-weight:700;font-size:var(--fs-md)}
.matrix td.app .cap{font-weight:400}
.mx{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;height:100%;border-radius:var(--r-md);font-size:var(--fs-xs);font-weight:600;color:inherit;border:1px solid transparent;transition:transform .12s, box-shadow .12s;position:relative}
a.mx:hover{transform:translateY(-1px);box-shadow:var(--shadow-2);color:inherit}
.mx .sym{font-size:15px;line-height:1;display:flex}
.mx .sym .i{width:15px;height:15px;stroke-width:2.6}
.mx .v{font-family:var(--mono);font-size:11px;font-weight:500;opacity:.9}
.mx.online{background:var(--ok);color:#fff}
.mx.behind{background:var(--warn-soft);color:var(--warn-ink);border-color:var(--warn-line)}
.mx.reviewing{background:var(--run-soft);color:var(--run-ink);border-color:var(--run-line)}
.mx.rejected{background:var(--bad);color:#fff}
.mx.none{background:var(--surface);color:var(--ink-4);border:1.5px dashed var(--line-2)}
.mx.offline{background:var(--surface-3);color:var(--ink-3)}
.mx.na{background:repeating-linear-gradient(135deg,transparent 0 5px,var(--surface-3) 5px 6px);color:var(--ink-4);border-color:var(--line)}
.mx .badge{position:absolute;top:-5px;right:-5px;width:16px;height:16px;border-radius:50%;background:var(--run);color:#fff;display:grid;place-items:center;border:2px solid var(--surface)}
.mx .badge .i{width:8px;height:8px;stroke-width:4}
.sum{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}
.sum b{font-size:var(--fs-xl);font-weight:700}
.sum b small{font-size:var(--fs-sm);color:var(--ink-3);font-weight:500}
.sum .meter{width:56px;margin-top:4px}
.legend{display:flex;flex-wrap:wrap;gap:var(--s2) var(--s5);font-size:var(--fs-xs);color:var(--ink-2)}
.legend span{display:inline-flex;align-items:center;gap:6px}
.legend .mx{width:22px;height:16px;border-radius:4px;display:inline-flex}
.legend .mx .sym .i{width:10px;height:10px}

/* 手机看板卡片 */
.app-cards{display:none}
.mk-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px}
.mk-cell{display:flex;align-items:center;gap:6px;height:44px;padding:0 10px;border-radius:var(--r-md);font-size:var(--fs-sm);font-weight:600;color:inherit;min-width:0}
.mk-cell .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mk-cell .v{font-family:var(--mono);font-size:11px;font-weight:500;opacity:.85}
.mk-cell .i{width:14px;height:14px;stroke-width:2.6}
.mk-cell.online{background:var(--ok);color:#fff}
.mk-cell.behind{background:var(--warn-soft);color:var(--warn-ink);box-shadow:inset 0 0 0 1px var(--warn-line)}
.mk-cell.reviewing{background:var(--run-soft);color:var(--run-ink);box-shadow:inset 0 0 0 1px var(--run-line)}
.mk-cell.rejected{background:var(--bad);color:#fff}
.mk-cell.none{background:var(--surface);color:var(--ink-3);box-shadow:inset 0 0 0 1.5px var(--line-2)}

/* 待处理 */
.todo-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4)}
.todo-col{padding:var(--s4) var(--s5)}
.todo-col h3{display:flex;align-items:center;gap:8px;font-size:var(--fs-md);font-weight:600;margin-bottom:var(--s2)}
.todo-col h3 .n{margin-left:auto;font-size:var(--fs-xl);font-weight:700}
.todo-item{display:flex;align-items:center;gap:var(--s2);padding:10px 0;border-top:1px solid var(--line);min-height:48px}
.todo-item .grow b{font-weight:600}
.todo-item .why{font-size:var(--fs-xs);color:var(--ink-3)}
.todo-item .why.bad{color:var(--bad-ink)}

/* 统计块 */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--s3)}
.stat{padding:var(--s4) var(--s5)}
.stat .k{font-size:var(--fs-xs);color:var(--ink-3);font-weight:500}
.stat .v{font-size:var(--fs-2xl);font-weight:700;margin-top:2px;line-height:1.3}
.stat .v small{font-size:var(--fs-sm);font-weight:500;color:var(--ink-3)}
.stat.ok .v{color:var(--ok-ink)} .stat.bad .v{color:var(--bad-ink)} .stat.warn .v{color:var(--warn-ink)}

/* ---------------- 任务详情头部 ---------------- */
.hero{padding:var(--s5) var(--s6)}
.hero-top{display:flex;align-items:flex-start;gap:var(--s4)}
.hero h1{font-size:var(--fs-2xl);font-weight:700;line-height:1.3;display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
.hero h1 .ver{font-family:var(--mono);font-weight:600}
.hero .meta{display:flex;flex-wrap:wrap;gap:4px var(--s4);color:var(--ink-3);font-size:var(--fs-sm);margin-top:var(--s2)}
.hero .meta span{display:inline-flex;align-items:center;gap:5px}
.hero-prog{margin-top:var(--s5);display:flex;align-items:center;gap:var(--s5)}
.hero-prog .big{font-size:var(--fs-3xl);font-weight:700;line-height:1;font-variant-numeric:tabular-nums}
.hero-prog .big small{font-size:var(--fs-lg);color:var(--ink-3);font-weight:500}
.hero-acts{display:flex;gap:var(--s2);flex-wrap:wrap;margin-top:var(--s5);padding-top:var(--s4);border-top:1px solid var(--line);align-items:center}
.hero-acts .sep{flex:1}
.mark-all{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s5);background:var(--surface-2);border-top:1px solid var(--line);border-radius:0 0 var(--r-lg) var(--r-lg);font-size:var(--fs-sm);flex-wrap:wrap}
.mark-all .grow{color:var(--ink-2)}
.info-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;border-top:1px solid var(--line)}
.info-strip > div{padding:var(--s3) var(--s5);border-right:1px solid var(--line);min-width:0}
.info-strip > div:last-child{border-right:0}
.info-strip .k{font-size:var(--fs-xs);color:var(--ink-3)}
.info-strip .v{font-size:var(--fs-sm);margin-top:2px}

/* ---------------- 日志 ---------------- */
.log-card{background:#0d1117;border-radius:var(--r-lg);overflow:hidden;border:1px solid #1f2633}
.log-bar{display:flex;align-items:center;gap:var(--s2);padding:8px 10px 8px 14px;background:#161b22;border-bottom:1px solid #222a36;flex-wrap:wrap}
.log-bar .title{color:#e6edf3;font-weight:600;font-size:var(--fs-sm);display:flex;align-items:center;gap:8px;margin-right:var(--s2)}
.log-tabs{display:flex;gap:2px;overflow-x:auto;scrollbar-width:none;flex:1;min-width:0}
.log-tabs::-webkit-scrollbar{display:none}
.log-tab{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;border-radius:6px;border:0;background:transparent;color:#8b949e;font-family:var(--mono);font-size:var(--fs-xs);cursor:pointer;white-space:nowrap}
.log-tab:hover{background:#21262d;color:#e6edf3}
.log-tab.on{background:#2d333b;color:#fff}
.log-tab .dot{width:6px;height:6px;box-shadow:none}
.log-tools{display:flex;gap:4px;align-items:center}
.log-tool{display:inline-flex;align-items:center;gap:5px;height:28px;padding:0 8px;border:0;border-radius:6px;background:transparent;color:#8b949e;font-size:var(--fs-xs);cursor:pointer;white-space:nowrap}
.log-tool:hover{background:#21262d;color:#e6edf3}
.log-tool.on{color:#7ee787}
.log{margin:0;padding:12px 16px;height:420px;overflow:auto;color:#c9d1d9;font:12.5px/1.65 var(--mono);white-space:pre-wrap;word-break:break-all}
.log .l-step{color:#79c0ff;font-weight:600}
.log .l-ok{color:#7ee787}
.log .l-bad{color:#ff7b72}
.log .l-warn{color:#e3b341}
.log .l-dim{color:#6e7681}
.log .cursor{display:inline-block;width:7px;height:14px;background:#c9d1d9;vertical-align:-2px;animation:blink 1s steps(1) infinite}
.log-foot{display:flex;justify-content:space-between;padding:6px 14px;background:#161b22;border-top:1px solid #222a36;color:#6e7681;font-size:11px;font-family:var(--mono)}

/* ---------------- 弹窗 / 抽屉 / 菜单 ---------------- */
.overlay{position:fixed;inset:0;z-index:100;background:rgba(15,20,30,.45);display:none;align-items:center;justify-content:center;padding:var(--s4);animation:fade .15s}
.overlay.open{display:flex}
.dialog{width:100%;max-width:440px;background:var(--surface);border-radius:14px;box-shadow:var(--shadow-3);animation:pop .18s ease-out;max-height:calc(100vh - 32px);display:flex;flex-direction:column}
.dialog.wide{max-width:560px}
.dialog-body{padding:var(--s6) var(--s6) var(--s4);overflow:auto}
.dialog h3{font-size:var(--fs-xl);font-weight:700;margin-bottom:var(--s2);display:flex;align-items:center;gap:var(--s2)}
.dialog p{color:var(--ink-2)}
.dialog .ic-circle{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;margin-bottom:var(--s3)}
.dialog .ic-circle.bad{background:var(--bad-soft);color:var(--bad)}
.dialog .ic-circle.warn{background:var(--warn-soft);color:var(--warn)}
.dialog .ic-circle.ok{background:var(--ok-soft);color:var(--ok)}
.dialog .ic-circle .i{width:20px;height:20px}
.dialog-foot{display:flex;justify-content:flex-end;gap:var(--s2);padding:var(--s4) var(--s6) var(--s5)}
.sheet-handle{display:none}

.menu{position:relative;display:inline-block}
.menu > summary{list-style:none}
.menu > summary::-webkit-details-marker{display:none}
.menu-pop{position:absolute;right:0;top:calc(100% + 6px);z-index:50;min-width:220px;background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow-2);padding:6px;animation:pop .12s ease-out}
.menu-pop.left{right:auto;left:0}
.menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:9px 10px;border:0;border-radius:6px;background:none;color:var(--ink);text-align:left;cursor:pointer;font-size:var(--fs-md);white-space:nowrap}
.menu-item:hover{background:var(--surface-3);color:var(--ink)}
.menu-item .i{color:var(--ink-3)}
.menu-item.danger{color:var(--bad-ink)} .menu-item.danger .i{color:var(--bad)}
.menu-sep{height:1px;background:var(--line);margin:6px 4px}
.menu-cap{padding:6px 10px 2px;font-size:11px;color:var(--ink-3);font-weight:600}

.toast-wrap{position:fixed;left:50%;bottom:32px;transform:translateX(-50%);z-index:200;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
.toast{display:flex;align-items:center;gap:8px;padding:10px 16px;border-radius:10px;background:#1c2230;color:#fff;font-size:var(--fs-md);box-shadow:var(--shadow-3);animation:toast .2s ease-out;white-space:nowrap}
.toast .i{color:#7ee787}
.toast.bad .i{color:#ff7b72}

/* ---------------- 空状态 / 加载 / 出错 ---------------- */
.empty{text-align:center;padding:56px var(--s6)}
.empty .ill{width:56px;height:56px;margin:0 auto var(--s4);border-radius:16px;background:var(--surface-3);color:var(--ink-3);display:grid;place-items:center}
.empty .ill .i{width:26px;height:26px;stroke-width:1.6}
.empty h3{font-size:var(--fs-lg);font-weight:600;margin-bottom:4px}
.empty p{color:var(--ink-3);font-size:var(--fs-sm);max-width:360px;margin:0 auto}
.empty .btn-group{margin-top:var(--s5);justify-content:center}
.skel{background:linear-gradient(90deg,var(--surface-3) 25%,#f7f8fa 37%,var(--surface-3) 63%);background-size:400% 100%;animation:shimmer 1.3s ease infinite;border-radius:6px;height:12px}
.spinner{width:16px;height:16px;border-radius:50%;border:2px solid var(--run-line);border-top-color:var(--run);animation:spin .8s linear infinite;flex:none;display:inline-block}
.live{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-xs);color:var(--ink-3)}
.live::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--ok);animation:pulse 1.6s infinite}

/* 二维码占位 */
.qr{width:96px;height:96px;border-radius:8px;border:1px solid var(--line);padding:6px;background:#fff;flex:none}
.qr i{display:block;width:100%;height:100%;background:
  conic-gradient(from 90deg at 30% 30%,#111 25%,transparent 0) 0 0/12px 12px,
  repeating-linear-gradient(90deg,#111 0 3px,transparent 3px 7px),
  repeating-linear-gradient(0deg,transparent 0 4px,#fff 4px 7px);opacity:.85;border-radius:2px}

/* 提交说明块 */
.commit{display:flex;gap:var(--s3);align-items:flex-start;padding:var(--s3) var(--s4);border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface-2)}
.commit .sha{font-family:var(--mono);font-size:var(--fs-sm);padding:2px 8px;background:var(--surface);border:1px solid var(--line);border-radius:6px;color:var(--ink);flex:none}
.commit .msg{font-weight:600}
.commit-list{margin:var(--s2) 0 0;padding:0;list-style:none;font-size:var(--fs-sm)}
.commit-list li{display:flex;gap:var(--s2);padding:5px 0;color:var(--ink-2)}
.commit-list .mono{color:var(--ink-3);flex:none}

/* 发起打包：分节 */
.form-sec{display:grid;grid-template-columns:200px 1fr;gap:var(--s6);padding:var(--s6);border-bottom:1px solid var(--line)}
.form-sec:last-child{border-bottom:0}
.form-sec .sec-h{display:flex;gap:var(--s3);align-items:flex-start}
.form-sec .no{width:24px;height:24px;border-radius:50%;background:var(--ink);color:#fff;font-size:var(--fs-xs);font-weight:700;display:grid;place-items:center;flex:none;margin-top:1px}
.form-sec .sec-h b{display:block;font-weight:600}
.form-sec .sec-h .hint{margin-top:2px}
.form-sec .sec-b{min-width:0;display:flex;flex-direction:column;gap:var(--s3)}
.ch-pick{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--s2)}
.ch-pick .chip{height:auto;min-height:52px;padding:8px 12px;align-items:flex-start;white-space:normal}
.ch-pick .chip input{margin-top:3px}
.ch-pick .chip .t{display:flex;flex-direction:column;line-height:1.35;min-width:0}
.ch-pick .chip .t b{font-family:var(--mono);font-size:var(--fs-md)}
.ch-pick .chip .t span{font-size:var(--fs-xs);color:var(--ink-3);font-weight:400}
.ch-pick .chip.special{border-style:dashed}
.ch-tools{display:flex;align-items:center;gap:var(--s3);font-size:var(--fs-sm);flex-wrap:wrap}
.ch-tools .count{color:var(--ink-2)}
.ch-tools .count b{color:var(--ink)}
.quick{display:flex;gap:6px;flex-wrap:wrap}
.quick button{height:28px;padding:0 10px;border-radius:var(--r-pill);border:1px solid var(--line);background:var(--surface-2);font-size:var(--fs-xs);color:var(--ink-2);cursor:pointer}
.quick button:hover{border-color:var(--brand-line);color:var(--brand-ink);background:var(--brand-soft)}
.submit-bar{position:sticky;bottom:0;z-index:30;display:flex;align-items:center;gap:var(--s4);padding:var(--s3) var(--s6);background:rgba(255,255,255,.96);backdrop-filter:blur(8px);border-top:1px solid var(--line);border-radius:0 0 var(--r-lg) var(--r-lg)}
.submit-bar .sum-t{flex:1;min-width:0;font-size:var(--fs-sm);color:var(--ink-2)}
.submit-bar .sum-t b{color:var(--ink);font-weight:600}

/* 设置 */
.mach{display:flex;align-items:center;gap:var(--s4)}
.mach .big-dot{width:44px;height:44px;border-radius:12px;display:grid;place-items:center;background:var(--ok-soft);color:var(--ok)}
.mach .big-dot.bad{background:var(--bad-soft);color:var(--bad)}
.res{display:flex;flex-direction:column;gap:6px}
.res .top{display:flex;justify-content:space-between;font-size:var(--fs-sm)}
.res .top b{font-weight:600}

/* ---------------- 动画 ---------------- */
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
@keyframes stripes{to{background-position:10px 0}}
@keyframes shimmer{0%{background-position:100% 50%}100%{background-position:0 50%}}
@keyframes fade{from{opacity:0}}
@keyframes pop{from{opacity:0;transform:translateY(4px) scale(.98)}}
@keyframes toast{from{opacity:0;transform:translateY(8px)}}
@keyframes blink{50%{opacity:0}}
@keyframes sheet{from{transform:translateY(100%)}}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* =========================================================
   平板（≤1080）
   ========================================================= */
@media (max-width:1080px){
  .topnav-in,.page,.demo-in{padding-left:var(--s5);padding-right:var(--s5)}
  .machine span{display:none}
  .task-rows .rows-head,.task-rows .row{grid-template-columns:56px minmax(160px,1.5fr) 110px 104px minmax(160px,1.3fr) 88px}
  .task-rows .col-time{display:none}
  .pick-grid{grid-template-columns:repeat(3,1fr)}
  .ch-pick{grid-template-columns:repeat(3,1fr)}
  .todo-grid{grid-template-columns:1fr}
  .form-sec{grid-template-columns:1fr;gap:var(--s3)}
}

/* =========================================================
   手机（≤760）
   ========================================================= */
@media (max-width:760px){
  :root{--ctl-h:40px}
  body{font-size:15px;padding-bottom:calc(var(--tab-h) + env(safe-area-inset-bottom))}
  body.no-tab{padding-bottom:0}
  .topnav{display:none}
  .demo-in{padding:6px var(--s4)}
  .demo .gal{display:none}

  /* 顶栏：标题 + 右侧 1~2 个操作 */
  .mtop{display:flex;position:sticky;top:0;z-index:40;height:52px;align-items:center;gap:var(--s2);padding:0 var(--s2) 0 var(--s4);
    background:rgba(255,255,255,.94);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
  .mtop .t{flex:1;min-width:0;font-size:17px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .mtop .bk{display:grid;place-items:center;width:40px;height:40px;margin-left:calc(-1 * var(--s3));color:var(--ink)}
  .mtop .bk .i{width:22px;height:22px}
  .mtop .btn.sm{height:34px}

  /* 底部 Tab 栏：4 项，图标 + 文字，热区 ≥ 48px */
  .tabbar{display:grid;grid-template-columns:repeat(4,1fr);position:fixed;left:0;right:0;bottom:0;z-index:40;
    height:calc(var(--tab-h) + env(safe-area-inset-bottom));padding-bottom:env(safe-area-inset-bottom);
    background:rgba(255,255,255,.96);backdrop-filter:blur(10px);border-top:1px solid var(--line)}
  body.no-tab .tabbar{display:none}
  .tabbar a,.tabbar button{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;color:var(--ink-3);font-size:11px;font-weight:500;position:relative;border:0;background:none;cursor:pointer}
  .tabbar .i{width:22px;height:22px;stroke-width:1.8}
  .tabbar .on{color:var(--brand)}
  .tabbar .on .i{stroke-width:2.2}
  .tabbar .count{position:absolute;top:6px;left:calc(50% + 6px);min-width:16px;height:16px;padding:0 4px;border-radius:8px;background:var(--bad);color:#fff;font-size:10px;font-weight:700;display:grid;place-items:center;border:2px solid #fff;box-sizing:content-box}
  .tabbar .count.run{background:var(--run)}

  .page{padding:var(--s4) var(--s4) var(--s8)}
  .page-head{margin-bottom:var(--s4);align-items:center}
  .page-head h1{font-size:var(--fs-xl)}
  .page-head.m-hide{display:none}
  .page-head .acts{margin-left:0;width:100%}
  .back{display:none}
  .section{margin-bottom:var(--s5)}
  .card-pad{padding:var(--s4)}
  .card-head{padding:var(--s3) var(--s4)}
  .card-foot{padding:var(--s3) var(--s4)}
  .grid-2,.grid-3{grid-template-columns:1fr;gap:var(--s3)}
  .m-hide{display:none!important}
  .m-show{display:initial!important}
  .m-full{width:100%}
  .btn{font-size:15px}
  .btn.sm{height:34px;font-size:var(--fs-sm)}
  .notice{font-size:var(--fs-sm);padding:var(--s3)}
  .notice .acts{margin-left:0;width:100%}
  .filter-chips{flex-wrap:nowrap;overflow-x:auto;margin:0 calc(-1 * var(--s4));padding:0 var(--s4);scrollbar-width:none}
  .filter-chips::-webkit-scrollbar{display:none}
  .fchip{height:34px}
  .seg{display:flex}
  .seg > *{flex:1;justify-content:center}

  /* 行列表 → 卡片 */
  .rows{background:transparent;border:0;box-shadow:none;overflow:visible;display:flex;flex-direction:column;gap:var(--s2)}
  .rows-head{display:none}
  .row{display:grid;grid-template-columns:1fr auto;gap:6px var(--s3);padding:var(--s3) var(--s4);background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);min-height:0}
  .row:last-child{border-bottom:1px solid var(--line)}
  .row .acts{grid-column:1/-1;justify-content:stretch;margin-top:4px}
  .row .acts > *{flex:1}
  .row.hl-bad{box-shadow:inset 3px 0 0 var(--bad);background:var(--surface)}
  .row.hl-warn{box-shadow:inset 3px 0 0 var(--warn);background:var(--surface)}
  .row.hl-run{box-shadow:inset 3px 0 0 var(--run);background:var(--surface)}
  .cell-k{display:inline;color:var(--ink-3);font-size:var(--fs-xs);margin-right:4px}
  .again{opacity:1}

  /* 打包列表卡片：
     [应用+版本          状态]
     [渠道进度条               ]
     [#号 · 原因 · 时间        ] */
  .task-rows .row{grid-template-columns:1fr auto;grid-template-areas:"app st" "prog prog" "meta meta"}
  .task-rows .c-id{display:none}
  .task-rows .c-app{grid-area:app}
  .task-rows .c-ver{display:none}
  .task-rows .c-st{grid-area:st;align-self:start}
  .task-rows .c-prog{grid-area:prog}
  .task-rows .c-time{display:none}
  .task-rows .c-act{display:none}
  .task-rows .m-meta{grid-area:meta;display:flex!important}
  .task-rows .segbar{max-width:none}
  .task-rows .reason{display:none}

  /* 渠道卡片 */
  .ch-rows .row{grid-template-columns:1fr auto;grid-template-areas:"name st" "info info" "fail fail" "mark mark" "act act"}
  .ch-rows .c-name{grid-area:name}
  .ch-rows .c-st{grid-area:st;text-align:right}
  .ch-rows .c-st .ch-step{justify-content:flex-end}
  .ch-rows .c-fail{grid-area:fail}
  .ch-rows .c-dur,.ch-rows .c-size{display:none}
  .ch-rows .m-info{grid-area:info;display:flex!important;gap:var(--s3);font-size:var(--fs-xs);color:var(--ink-3)}
  .ch-rows .c-mark{grid-area:mark}
  .ch-rows .c-act{grid-area:act}
  .ch-rows .mark-box{display:grid;grid-template-columns:1fr 1fr;gap:var(--s2)}
  .ch-rows .mk-btn{height:40px;justify-content:center;font-size:var(--fs-sm);border-radius:var(--r-md)}
  .ch-rows .c-act .btn{height:40px}
  .ch-rows .mk-none{display:none}
  .ch-rows .empty-act{display:none}

  /* 任务详情头部 */
  .hero{padding:var(--s4)}
  .hero-top{flex-direction:column-reverse;gap:var(--s2)}
  .hero h1{font-size:var(--fs-xl)}
  .hero .meta{font-size:var(--fs-xs);gap:2px var(--s3)}
  .hero-prog{margin-top:var(--s4);gap:var(--s4)}
  .hero-prog .big{font-size:26px}
  .hero-acts{display:flex;flex-wrap:wrap;gap:var(--s2)}
  .hero-acts .sep{display:none}
  .hero-acts .btn{flex:1 1 40%}
  .hero-acts .btn.primary,.hero-acts .btn.full{flex-basis:100%}
  .hero-acts .menu{display:contents}
  .mark-all{padding:var(--s3) var(--s4);display:grid;grid-template-columns:1fr 1fr}
  .mark-all .grow{grid-column:1/-1}
  .mark-all .btn{width:100%}
  .info-strip{grid-template-columns:1fr 1fr}
  .info-strip > div{padding:var(--s3) var(--s4);border-bottom:1px solid var(--line)}
  .info-strip > div:nth-child(2n){border-right:0}

  /* 日志 */
  .log{height:320px;font-size:11.5px;padding:10px 12px}
  .log-bar{padding:8px}
  .log-bar .title{display:none}
  .log-tools .lbl{display:none}

  /* 复制字段：整行可点，按钮在右 */
  .copy-field{padding:12px var(--s4);flex-wrap:wrap;gap:4px var(--s3);min-height:0}
  .copy-field .k{width:100%;font-size:var(--fs-xs)}
  .copy-field .v{font-size:var(--fs-sm)}
  .copy-btn{height:34px;padding:0 12px}
  .checks{grid-template-columns:1fr}
  .kv{grid-template-columns:110px 1fr}

  /* 看板：矩阵 → 每个应用一张卡 */
  .matrix-card{display:none}
  .app-cards{display:flex;flex-direction:column;gap:var(--s3)}
  .stats{grid-template-columns:1fr 1fr;gap:var(--s2)}
  .stat{padding:var(--s3) var(--s4)}
  .stat .v{font-size:var(--fs-xl)}
  .todo-col{padding:var(--s3) var(--s4)}
  .legend{gap:var(--s2) var(--s3)}

  /* 表单 */
  .pick-grid{grid-template-columns:1fr 1fr;gap:var(--s2)}
  .pick{padding:10px 12px}
  .ch-pick{grid-template-columns:1fr 1fr}
  .form-grid{grid-template-columns:1fr;gap:var(--s4)}
  .form-sec{padding:var(--s4)}
  .input,select.input{height:44px;font-size:16px} /* 16px 防止 iOS 聚焦时放大 */
  textarea.input{font-size:16px}
  .chip{height:40px}
  .submit-bar{position:fixed;left:0;right:0;bottom:0;border-radius:0;padding:var(--s3) var(--s4) calc(var(--s3) + env(safe-area-inset-bottom));flex-wrap:wrap;gap:var(--s2);box-shadow:0 -4px 16px rgba(16,24,40,.06)}
  .submit-bar .sum-t{width:100%;flex:none;font-size:var(--fs-xs)}
  .submit-bar .btn{flex:1;height:48px}
  .has-submit-bar{padding-bottom:140px}

  /* 弹窗 → 底部抽屉 */
  .overlay{align-items:flex-end;padding:0}
  .dialog{max-width:none;border-radius:16px 16px 0 0;animation:sheet .22s ease-out;padding-bottom:env(safe-area-inset-bottom)}
  .sheet-handle{display:block;width:36px;height:4px;border-radius:2px;background:var(--line-2);margin:8px auto 0}
  .dialog-body{padding:var(--s4) var(--s5) var(--s3)}
  .dialog-foot{padding:var(--s3) var(--s5) var(--s5);display:grid;grid-template-columns:1fr 1fr}
  .dialog-foot .btn{height:46px}
  .dialog-foot .btn:only-child{grid-column:1/-1}

  /* 菜单 → 底部动作面板 */
  .menu[open] > summary::before{content:"";position:fixed;inset:0;z-index:99;background:rgba(15,20,30,.45)}
  .menu-pop,.menu-pop.left{position:fixed;left:0;right:0;top:auto;bottom:0;z-index:100;border-radius:16px 16px 0 0;padding:var(--s2) var(--s2) calc(var(--s3) + env(safe-area-inset-bottom));animation:sheet .2s ease-out;min-width:0}
  .menu-item{padding:14px 12px;font-size:16px}

  .toast-wrap{bottom:calc(var(--tab-h) + 20px + env(safe-area-inset-bottom))}
  .empty{padding:40px var(--s4)}
}

/* 只在手机上出现的补充信息（电脑上隐藏） */
.m-meta,.m-info,.m-ver,.m-only{display:none}
@media (max-width:760px){
  .m-ver{display:inline}
  .m-only{display:block}
  .d-only{display:none!important}
}

/* 渠道行：失败说明在电脑上占第二行（状态列到最后） */
.ch-rows .row{row-gap:6px}
.ch-rows .c-fail{grid-column:2/-1;grid-row:2}
.ch-rows .c-fail .ch-fail{margin-top:0;max-width:640px}
@media (max-width:760px){
  .ch-rows .c-fail{grid-area:fail}
  .ch-rows .c-fail .ch-fail{max-width:none}
  .ch-rows .c-mark:has(.mk-none){display:none}
}
.sec-b > .seg{align-self:flex-start}
@media (max-width:760px){
  .notice{flex-wrap:wrap}
  .notice > div:not(.acts){flex:1;min-width:0}
  .sec-b > .seg{align-self:stretch}
}
.pkg-grid{grid-template-columns:1.25fr 1fr;align-items:start}
@media (max-width:760px){.pkg-grid{grid-template-columns:1fr}}
.stats > .card + .card,.todo-grid > .card + .card,.grid-2 > .card + .card,.grid-3 > .card + .card,.app-cards > .card + .card{margin-top:0}

/* 手机看板格：两行（图标 + 市场全名 / 版本号），所有状态同高 */
.mk-cell{flex-direction:column;align-items:flex-start;justify-content:center;gap:1px;height:52px;padding:0 10px;border:1px solid transparent;box-shadow:none!important}
.mk-cell .l1{display:flex;align-items:center;gap:5px;max-width:100%;font-weight:600;line-height:1.3}
.mk-cell .nm{white-space:nowrap;overflow:visible}
.mk-cell .v{font-family:var(--mono);font-size:11px;font-weight:500;line-height:1.3;opacity:.9}
.mk-cell.behind{border-color:var(--warn-line)}
.mk-cell.reviewing{border-color:var(--run-line)}
.mk-cell.none{background:var(--surface);border:1.5px dashed var(--line-2);color:var(--ink-3)}
.mk-cell.none .nm{color:var(--ink-2)}
.mk-cell.none .v{font-family:inherit;font-size:11px}
/* 未上架：虚线框要在白卡片上一眼看出是格子（电脑格子、手机格子、图例统一） */
.mx.none,.mk-cell.none{border:1.5px dashed #a9b0bb}
.init-hint{display:flex;align-items:center;gap:8px;margin-top:10px;padding:8px 10px;border-radius:var(--r-md);background:var(--surface-2);font-size:var(--fs-sm);color:var(--ink-2)}
.init-hint .i{color:var(--ink-3)}

/* ---------------- 实现补充（设计稿以外） ---------------- */
.row-pager{display:flex;justify-content:center;gap:var(--s2);margin-top:var(--s4)}
.row-pager:empty{display:none}

/* board-app（设计稿里写在页面头部） */
.mk-rows .rows-head,.mk-rows .row{grid-template-columns:minmax(170px,1.2fr) 150px 90px 90px minmax(160px,1.3fr) 64px 220px}
@media (max-width:760px){
 .mk-rows .row{grid-template-columns:1fr auto;grid-template-areas:"m s" "on rv" "rj rj" "act act"}
 .mk-rows .c-m{grid-area:m} .mk-rows .c-s{grid-area:s;text-align:right} .mk-rows .c-on{grid-area:on} .mk-rows .c-rv{grid-area:rv;text-align:right}
 .mk-rows .c-rj{grid-area:rj} .mk-rows .c-rj:has(.muted){display:none} .mk-rows .c-up{display:none} .mk-rows .acts{grid-area:act}
}
/* listings（设计稿里写在页面头部） */
.ls-rows .rows-head,.ls-rows .row{grid-template-columns:minmax(170px,1.1fr) 120px minmax(200px,1.4fr) 120px 230px}
@media (max-width:760px){
 .ls-rows .row{grid-template-columns:1fr auto;grid-template-areas:"who st" "ver ver" "why why" "time time" "act act"}
 .ls-rows .c-who{grid-area:who} .ls-rows .c-ver{grid-area:ver} .ls-rows .c-st{grid-area:st;text-align:right}
 .ls-rows .c-why{grid-area:why} .ls-rows .c-time{grid-area:time} .ls-rows .acts{grid-area:act}
 .ls-rows .c-st .pill + .why{display:none}
}
.c-st .why{font-size:var(--fs-xs);margin-top:4px}
.m-why{display:none}
@media (max-width:760px){.m-why{display:block}}
.ch-fail b + .do{margin-left:6px}

/* 暂未提交（卡在备案、登录不了等）：实心黄 + 叹号，和「不是最新版」的浅橙区分开 */
.mx.blocked,.mk-cell.blocked{background:var(--hold);color:var(--hold-ink)}
.mx.blocked .v,.mx.rejected .v{font-family:inherit;max-width:100%;padding:0 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mk-cell.blocked .v,.mk-cell.rejected .v{font-family:inherit;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.t-hold{color:var(--hold-ink)}
.pill.hold{background:var(--hold-soft);color:var(--hold-ink)}
.row.hl-hold{background:linear-gradient(90deg,var(--hold) 0 3px,transparent 3px)}
@media (max-width:760px){.row.hl-hold{box-shadow:inset 3px 0 0 var(--hold);background:var(--surface)}}
.mk-btn.hold{border-color:var(--hold-line);background:var(--hold-soft);color:var(--hold-ink)}

/* 测试包：橙黄标签和提示，二维码下载卡片 */
.tag.test{background:var(--hold-soft);color:var(--hold-ink);box-shadow:inset 0 0 0 1px var(--hold-line)}
.notice.test{background:var(--hold-soft);border-color:var(--hold-line);color:var(--hold-ink)}
.test-dl{display:flex;gap:var(--s5);align-items:center}
.test-dl .qr{flex:none;width:168px;height:168px;padding:6px;background:#fff;border:1px solid var(--line);border-radius:var(--r-md)}
.test-dl .qr svg{width:100%;height:100%;display:block}
@media (max-width:760px){.test-dl{flex-direction:column;align-items:stretch;text-align:center}.test-dl .qr{margin:0 auto}.test-dl .btn-group{justify-content:center}}

/* ================= 登录、角色、账号、操作记录（设计稿 design/README.md 10～14） ================= */

/* 头像：取姓名后两个字 */
.avatar{width:28px;height:28px;border-radius:50%;background:var(--brand-soft);color:var(--brand-ink);font-size:11px;font-weight:700;display:inline-grid;place-items:center;flex:none;letter-spacing:-.5px}
.avatar.lg{width:40px;height:40px;font-size:14px}
.avatar.xl{width:56px;height:56px;font-size:18px}
.avatar.off{background:var(--surface-3);color:var(--ink-3)}

/* 右上角用户入口 */
.user-menu{margin-left:var(--s1)}
.user-btn{display:flex;align-items:center;gap:8px;height:36px;padding:0 6px 0 4px;border-radius:var(--r-md);cursor:pointer;color:var(--ink)}
.user-btn:hover,.user-menu[open] .user-btn{background:var(--surface-3)}
.user-btn .u-txt{display:flex;flex-direction:column;line-height:1.2}
.user-btn .u-txt b{font-size:var(--fs-sm);font-weight:600}
.user-btn .u-txt span{font-size:11px;color:var(--ink-3)}
.user-btn .u-caret{width:14px;height:14px;color:var(--ink-3)}
.user-menu .menu-pop{min-width:240px}
.user-head{display:flex;align-items:center;gap:10px;padding:8px 10px 6px}
.user-head b{font-weight:600}

/* 「更多」抽屉顶部的账号卡 */
.sheet-user{display:flex;align-items:center;gap:12px;padding:10px 10px 12px;margin-bottom:6px;border-bottom:1px solid var(--line);color:var(--ink)}
.sheet-user .grow{display:flex;flex-direction:column;line-height:1.35}
.sheet-user b{font-size:16px;font-weight:600}
.sheet-user > .i{color:var(--ink-3)}

/* 角色标签 */
.tag.role-admin{background:var(--ink);color:#fff}
.tag.role-release{background:var(--brand-soft);color:var(--brand-ink)}
.tag.role-tester{background:#fff8d6;color:#6b4e00;box-shadow:inset 0 0 0 1px #efd57a}

/* 登录页：居中卡片，没有导航 */
body.auth{min-height:100vh;display:flex;flex-direction:column;background:var(--bg)}
.auth-wrap{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--s10) var(--s4)}
.auth-brand{display:flex;align-items:center;gap:10px;font-size:22px;font-weight:700;margin-bottom:6px}
.auth-brand .logo-mark{width:36px;height:36px;border-radius:10px}
.auth-brand .logo-mark .i{width:20px;height:20px}
.auth-sub{color:var(--ink-3);font-size:var(--fs-sm);margin-bottom:var(--s6)}
.auth-card{width:100%;max-width:400px;padding:var(--s6) var(--s6) var(--s5)}
.auth-card .seg{display:flex;margin-bottom:var(--s5)}
.auth-card .seg > *{flex:1;justify-content:center}
.auth-card form{display:flex;flex-direction:column;gap:var(--s4)}
.auth-card .btn.lg{width:100%}
.auth-card h2{font-size:var(--fs-xl);font-weight:700;margin-bottom:4px}
.auth-links{display:flex;justify-content:space-between;align-items:center;font-size:var(--fs-sm);margin-top:-4px}
.auth-foot{margin-top:var(--s6);font-size:var(--fs-xs);color:var(--ink-3);text-align:center}
.code-row{display:flex;gap:var(--s2)}
.code-row .input{flex:1;min-width:0}
.code-row .btn{flex:none;width:120px;padding:0 8px}
.pw-wrap{position:relative}
.pw-gen{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.pw-gen .pw-wrap{flex:1 1 180px;min-width:0}
.pw-gen .btn{flex:none}
.danger-zone.stack{flex-wrap:wrap}
.danger-zone.stack > .grow,.danger-zone.stack > .pw-gen{flex:1 1 100%}
.pw-wrap .input{padding-right:44px}
.pw-wrap .reveal{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:36px;height:32px;display:grid;place-items:center;border:0;background:none;color:var(--ink-3);cursor:pointer;border-radius:6px}
.pw-wrap .reveal:hover{background:var(--surface-3);color:var(--ink-2)}
.pw-wrap .reveal.on{color:var(--brand)}
.auth-card .notice{font-size:var(--fs-sm);padding:10px 12px}
.forgot{font-size:var(--fs-sm);line-height:1.6}
.forgot ol{margin:4px 0 0;padding-left:18px}

/* 密码规则 */
.pw-rules{display:flex;flex-wrap:wrap;gap:4px 14px;margin:0;padding:0;list-style:none;font-size:var(--fs-xs);color:var(--ink-3)}
.pw-rules li{display:flex;align-items:center;gap:4px}
.pw-rules li::before{content:"";width:14px;height:14px;border-radius:50%;border:1.5px solid var(--line-2);box-sizing:border-box;flex:none}
.pw-rules li.ok{color:var(--ok-ink)}
.pw-rules li.ok::before{border:0;background:var(--ok) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12.5 10 17l9-10'/%3E%3C/svg%3E") center/9px no-repeat}
.pw-rules li.bad{color:var(--bad-ink)}
.pw-rules li.bad::before{border-color:var(--bad)}

/* 只有顶栏的精简外壳（强制改密码） */
.auth-top{height:var(--nav-h);display:flex;align-items:center;gap:var(--s3);padding:0 var(--s6);background:var(--surface);border-bottom:1px solid var(--line)}
.auth-top .logo{margin-right:auto}
.auth-top .who{display:flex;align-items:center;gap:8px;font-size:var(--fs-sm);color:var(--ink-2)}

/* 设置子导航（管理员才有） */
.subnav{display:flex;gap:var(--s1);border-bottom:1px solid var(--line);margin-bottom:var(--s6)}
.subnav a{display:flex;align-items:center;gap:6px;height:40px;padding:0 var(--s3);color:var(--ink-2);font-weight:500;position:relative;white-space:nowrap}
.subnav a .i{width:16px;height:16px;color:var(--ink-3)}
.subnav a:hover{color:var(--ink)}
.subnav a.on{color:var(--ink);font-weight:600}
.subnav a.on .i{color:var(--ink)}
.subnav a.on::after{content:"";position:absolute;left:var(--s3);right:var(--s3);bottom:-1px;height:2px;border-radius:2px;background:var(--ink)}
.subnav .lock{margin-left:auto;align-self:center;font-size:var(--fs-xs);color:var(--ink-3);display:flex;align-items:center;gap:4px}
.subnav .lock .i{width:13px;height:13px}

/* 开关 */
.switch{display:inline-flex;align-items:center;gap:10px;cursor:pointer;user-select:none}
.switch input{appearance:none;-webkit-appearance:none;width:40px;height:24px;margin:0;border-radius:12px;background:var(--line-2);position:relative;cursor:pointer;transition:background .15s;flex:none}
.switch input::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(16,24,40,.25);transition:left .15s}
.switch input:checked{background:var(--bad)}
.switch input:checked::after{left:18px}

/* 账号管理 */
.user-rows .rows-head,.user-rows .row{grid-template-columns:minmax(160px,1.2fr) 130px 100px 100px 150px 130px 76px}
.u-name{display:flex;align-items:center;gap:10px;min-width:0}
.u-name b{font-weight:600}
.u-name .me{font-size:11px;color:var(--ink-3);font-weight:400}
.row.disabled .u-name b,.row.disabled .mono{color:var(--ink-3)}
.pill.locked{background:var(--warn-soft);color:var(--warn-ink)}
.pill.locked::before{background:var(--warn)}
.sum-line{display:flex;gap:var(--s4);flex-wrap:wrap;font-size:var(--fs-sm);color:var(--ink-3);margin-bottom:var(--s3)}
.sum-line b{color:var(--ink);font-weight:600}
.temp-pw{display:flex;align-items:center;gap:var(--s2);padding:14px 16px;border-radius:var(--r-md);background:var(--surface-2);border:1px dashed var(--line-2)}
.temp-pw .v{flex:1;font-family:var(--mono);font-size:22px;font-weight:600;letter-spacing:1px}
.danger-zone{display:flex;align-items:center;gap:var(--s3);padding:12px 14px;border-radius:var(--r-md);border:1px solid var(--line)}
.danger-zone .grow{min-width:0}
.danger-zone b{font-weight:600;display:block}
.dialog .form-col{display:flex;flex-direction:column;gap:var(--s4);margin-top:var(--s4)}
.dialog .seg{display:flex}
.dialog .seg > *{flex:1;justify-content:center}
.role-help{font-size:var(--fs-xs);color:var(--ink-3);line-height:1.5}

/* 我的账号 */
.acct-head{display:flex;align-items:center;gap:var(--s4)}
.acct-head h2{font-size:20px;font-weight:700;line-height:1.3}
.acct-head .meta{display:flex;align-items:center;gap:8px;margin-top:4px;font-size:var(--fs-sm);color:var(--ink-3)}
.acct-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4);align-items:start}
.ro{display:flex;align-items:center;gap:6px;font-size:var(--fs-xs);color:var(--ink-3);margin-top:2px}
.ro .i{width:12px;height:12px}

/* 操作记录 */
.audit-filter{display:grid;grid-template-columns:repeat(3,minmax(0,1fr)) minmax(0,1.6fr);gap:var(--s3);padding:var(--s4) var(--s5)}
.audit-filter .field > label{font-size:var(--fs-xs);color:var(--ink-3);font-weight:500}
.audit-filter .range{display:flex;align-items:center;gap:6px}
.audit-filter .range .input{min-width:0}
.audit-types{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s5);border-top:1px solid var(--line)}
.audit-types .lbl{font-size:var(--fs-xs);color:var(--ink-3);flex:none}
.audit-rows .rows-head,.audit-rows .row{grid-template-columns:116px 110px 120px 64px minmax(0,1fr)}
.audit-rows .row{min-height:52px}
.a-who{display:flex;align-items:center;gap:8px;min-width:0}
.a-who .avatar{width:22px;height:22px;font-size:10px}
.a-what{min-width:0;line-height:1.5}
.a-what .obj{font-weight:600}
.a-what .from{color:var(--ink-3)}
.a-what .arrow{color:var(--ink-3);margin:0 4px}
.a-what .why{color:var(--ink-3)}
.a-what .t-bad{font-weight:600}
.k-tag{display:inline-flex;align-items:center;height:20px;padding:0 7px;border-radius:var(--r-sm);font-size:11px;font-weight:600;white-space:nowrap;background:var(--surface-3);color:var(--ink-2)}
.k-tag.k-build{background:var(--run-soft);color:var(--run-ink)}
.k-tag.k-list{background:var(--ok-soft);color:var(--ok-ink)}
.k-tag.k-down{background:var(--surface-3);color:var(--ink-2)}
.k-tag.k-acct{background:var(--brand-soft);color:var(--brand-ink)}
.k-tag.k-login{background:var(--surface-3);color:var(--ink-2)}
.k-tag.k-login.bad{background:var(--bad-soft);color:var(--bad-ink)}
.k-tag.k-cred{background:var(--warn-soft);color:var(--warn-ink)}
.k-tag.k-ops{background:#f1ecfb;color:#5b3d99}
.pager{display:flex;align-items:center;gap:var(--s2);padding:var(--s3) var(--s5);border-top:1px solid var(--line);background:var(--surface-2);font-size:var(--fs-sm);color:var(--ink-3)}
.pager .pages{margin-left:auto;display:flex;gap:4px}
.pager .pages a,.pager .pages span{min-width:32px;height:32px;padding:0 8px;border-radius:var(--r-sm);display:inline-grid;place-items:center;color:var(--ink-2);border:1px solid transparent}
.pager .pages a:hover{background:var(--surface);border-color:var(--line)}
.pager .pages .on{background:var(--ink);color:#fff}
.pager .pages .dis{color:var(--line-2)}
.audit-rows + .pager,.rows.audit-rows{border-radius:var(--r-lg) var(--r-lg) 0 0}
.audit-box{border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;background:var(--surface);box-shadow:var(--shadow-1)}
.audit-box .rows{border:0;border-radius:0;box-shadow:none}
.active-filters{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:var(--s3);font-size:var(--fs-sm);color:var(--ink-3)}
.af{display:inline-flex;align-items:center;gap:4px;height:26px;padding:0 6px 0 10px;border-radius:var(--r-pill);background:var(--brand-soft);color:var(--brand-ink);font-size:var(--fs-xs);font-weight:600}
.af .i{width:12px;height:12px}

/* 403 */
.deny{max-width:520px;margin:40px auto 0;text-align:center;padding:48px var(--s6) 40px}
.deny .ill{width:64px;height:64px;margin:0 auto var(--s4);border-radius:18px;background:var(--bad-soft);color:var(--bad);display:grid;place-items:center}
.deny .ill .i{width:30px;height:30px}
.deny h1{font-size:var(--fs-2xl);font-weight:700;margin-bottom:var(--s3)}
.deny p{color:var(--ink-2)}
.deny .roles{display:inline-flex;align-items:center;gap:8px;margin:var(--s4) 0 var(--s2);padding:10px 14px;border-radius:var(--r-md);background:var(--surface-2);font-size:var(--fs-sm);flex-wrap:wrap;justify-content:center}
.deny .btn-group{justify-content:center;margin-top:var(--s5)}
.deny .path{font-family:var(--mono);font-size:var(--fs-xs);color:var(--ink-3);margin-top:var(--s4)}

/* 测试包 */
.ro-note{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;border-radius:var(--r-pill);background:var(--surface-3);color:var(--ink-2);font-size:var(--fs-xs);font-weight:500}
.ro-note .i{width:14px;height:14px}
.test-rows .rows-head,.test-rows .row{grid-template-columns:56px minmax(180px,1.4fr) 120px 110px minmax(160px,1fr) 110px 150px}
.qr-mini{width:30px;height:30px;border-radius:6px;border:1px solid var(--line-2);display:grid;place-items:center;background:#fff;color:var(--ink-2)}
.exp{font-size:var(--fs-xs);color:var(--ink-3)}
.exp.soon{color:var(--warn-ink)}

@media (max-width:760px){
  .user-menu{display:none}
  .auth-wrap{justify-content:flex-start;padding:48px var(--s4) var(--s6)}
  .auth-card{max-width:none;padding:var(--s5) var(--s4) var(--s4)}
  .auth-sub{margin-bottom:var(--s5)}
  .code-row .btn{width:112px}
  .input{font-size:16px}
  .auth-top{padding:0 var(--s4);height:52px}
  .auth-top .who .u-name-t{display:none}
  .subnav{margin:0 calc(-1 * var(--s4)) var(--s4);padding:0 var(--s4);overflow-x:auto;scrollbar-width:none}
  .subnav::-webkit-scrollbar{display:none}
  .subnav .lock{display:none}
  .acct-grid{grid-template-columns:1fr}
  .acct-head .avatar.xl{width:48px;height:48px;font-size:16px}
  /* 账号管理：卡片 = 头像姓名角色 / 状态；第二行登录名 · 尾号 · 最后登录 */
  .user-rows .row{grid-template-columns:1fr auto;grid-template-areas:"name st" "meta act"}
  .user-rows .row > .c-name{grid-area:name}
  .user-rows .row > .c-st{grid-area:st;justify-self:end}
  .user-rows .row > .m-meta{grid-area:meta;padding-left:38px}
  .user-rows .row > .c-act{grid-area:act}
  .user-rows .row > .c-login,.user-rows .row > .c-role,.user-rows .row > .c-phone,.user-rows .row > .c-last{display:none}
  .u-name .tag{margin-left:2px}
  /* 操作记录：卡片 = 内容 / 类型；第二行 时间 · 人 · IP */
  .audit-filter{display:none}
  .audit-types{border-top:0;padding:0;margin-bottom:var(--s3)}
  .audit-types .lbl{display:none}
  .audit-box{background:transparent;border:0;box-shadow:none;overflow:visible}
  .audit-rows .row{grid-template-columns:1fr auto;grid-template-areas:"what kind" "meta meta"}
  .audit-rows .row > .a-what{grid-area:what;font-size:var(--fs-md)}
  .audit-rows .row > .c-kind{grid-area:kind}
  .audit-rows .row > .m-meta{grid-area:meta}
  .audit-rows .row > .c-time,.audit-rows .row > .a-who,.audit-rows .row > .c-ip{display:none}
  .pager{background:transparent;border:0;padding:var(--s3) 0;justify-content:space-between}
  .pager .pages{display:none}
  .m-filter-bar{display:flex!important;gap:var(--s2);margin-bottom:var(--s3)}
  .m-filter-bar .btn{flex:none}
  .test-rows .row{grid-template-columns:1fr auto;grid-template-areas:"app st" "prog prog" "meta act"}
  .test-rows .row > .c-app{grid-area:app}
  .test-rows .row > .c-st{grid-area:st}
  .test-rows .row > .c-prog{grid-area:prog}
  .test-rows .row > .m-meta{grid-area:meta;align-self:center}
  .test-rows .row > .c-act{grid-area:act}
  .test-rows .row > .c-id,.test-rows .row > .c-ver,.test-rows .row > .c-time,.test-rows .row > .c-exp{display:none}
  .deny{margin-top:var(--s4);padding:40px var(--s4) 32px}
  .deny h1{font-size:var(--fs-xl)}
  .deny .btn-group{flex-direction:column}
  .deny .btn-group .btn{width:100%}
}
.m-filter-bar{display:none}
@media (max-width:760px){.user-rows .row > .m-meta,.audit-rows .row > .m-meta,.test-rows .row > .m-meta{display:block}}
.m-pager,.m-types{display:none!important}
@media (max-width:760px){
  .m-pager{display:flex!important;align-items:center;justify-content:space-between;gap:var(--s2);margin-top:var(--s3)}
  .m-types{display:flex!important}
  .audit-box .pager{display:none}
}
@media (max-width:760px){.btn.m-only{display:inline-flex}.notice.m-only{display:flex}}
.role-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4)}
@media (max-width:760px){
  .role-cards{grid-template-columns:1fr;gap:var(--s3)}
  .user-rows .row{grid-template-areas:"name st" "meta meta"}
  .user-rows .row > .c-act{display:none}
}
@media (max-width:760px){.ro.m-only{display:flex}}

/* 我的账号：改密码「用原密码 ｜ 用手机验证码」切换 */
[hidden]{display:none!important}
.pw-switch{display:flex;width:100%}
.pw-switch button{flex:1;justify-content:center}
.pw-switch button:disabled{opacity:.45;cursor:not-allowed}

/* 旧地址提示条、备案号 */
.addr-bar{display:flex;align-items:center;justify-content:center;gap:8px;padding:8px 16px;background:#fff8d6;color:#6b4e00;border-bottom:1px solid #efd57a;font-size:var(--fs-sm);line-height:1.5;text-align:center}
.addr-bar .i{flex:none;width:16px;height:16px}
.addr-bar a{color:inherit;text-decoration:underline;word-break:break-all}
.icp{padding:var(--s5) 16px;text-align:center;font-size:var(--fs-xs)}
.icp a{color:var(--ink-3);text-decoration:none}
.icp a:hover{text-decoration:underline}
