
*{box-sizing:border-box;margin:0;padding:0}
:root{
  --brand:#6366f1; --brand-d:#4f46e5; --brand-l:rgba(99,102,241,.15);
  --ok:#10b981; --ok-l:rgba(16,185,129,.13);
  --warn:#f59e0b; --warn-l:rgba(245,158,11,.13);
  --err:#f43f5e; --err-l:rgba(244,63,94,.13);
  --tx:#e9edfb; --tx2:#a3aed0; --tx3:#6d7899;
  --bd:rgba(255,255,255,.085); --bd2:rgba(255,255,255,.15);
  --bg:#070b16; --card:rgba(255,255,255,.045);
  --cy:#22d3ee; --vi:#a855f7; --pk:#f472b6;
}
html,body{min-height:100%}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  color:var(--tx);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;
  background:
    radial-gradient(1000px 620px at 10% -10%, rgba(99,102,241,.22), transparent 60%),
    radial-gradient(860px 520px at 92% -4%, rgba(139,92,246,.18), transparent 58%),
    radial-gradient(760px 620px at 50% 112%, rgba(6,182,212,.13), transparent 62%),
    var(--bg);
  background-attachment:fixed;min-height:100vh;position:relative}
/* 霓虹网格 + 流动极光（纯装饰，不挡交互） */
body::before{content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;
  background-image:linear-gradient(rgba(99,102,241,.06) 1px,transparent 1px),
    linear-gradient(90deg,rgba(99,102,241,.06) 1px,transparent 1px);
  background-size:46px 46px;
  -webkit-mask-image:radial-gradient(ellipse 125% 82% at 50% 0%,#000 28%,transparent 78%);
  mask-image:radial-gradient(ellipse 125% 82% at 50% 0%,#000 28%,transparent 78%)}
body::after{content:"";position:fixed;inset:-25%;z-index:-2;pointer-events:none;
  background:
    radial-gradient(560px 380px at 18% 22%,rgba(34,211,238,.18),transparent 62%),
    radial-gradient(520px 400px at 82% 12%,rgba(168,85,247,.22),transparent 62%),
    radial-gradient(620px 420px at 50% 95%,rgba(99,102,241,.15),transparent 64%);
  animation:aurora 16s ease-in-out infinite alternate;will-change:transform}
@keyframes aurora{
  0%{transform:translate3d(0,0,0) scale(1)}
  50%{transform:translate3d(2.5%,-2%,0) scale(1.1)}
  100%{transform:translate3d(-2%,2.5%,0) scale(1.03)}}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:linear-gradient(180deg,rgba(99,102,241,.55),rgba(168,85,247,.55));border-radius:9px}
::-webkit-scrollbar-track{background:transparent}
.wrap{max-width:960px;margin:0 auto;padding:16px}
.card{background:var(--card);border:1px solid var(--bd);border-radius:16px;padding:20px;margin-bottom:16px;
  backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
  box-shadow:0 10px 34px rgba(0,0,0,.30),inset 0 1px 0 rgba(255,255,255,.055);
  animation:fadeUp .5s cubic-bezier(.16,1,.3,1) both;position:relative;overflow:hidden;
  transition:translate .32s cubic-bezier(.16,1,.3,1),box-shadow .32s,border-color .32s}
.card:hover{translate:0 -3px;border-color:rgba(168,85,247,.38);
  box-shadow:0 20px 52px rgba(0,0,0,.46),0 0 0 1px rgba(139,92,246,.16),0 0 46px rgba(99,102,241,.18)}
/* 顶部霓虹流光扫描线 */
.card::before{content:"";position:absolute;top:0;left:0;right:0;height:1.5px;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(34,211,238,.95),rgba(168,85,247,.95),transparent);
  background-size:220% 100%;animation:scan 5s linear infinite}
@keyframes scan{0%{background-position:-110% 0}100%{background-position:210% 0}}
@keyframes fadeUp{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
.card h2{font-size:15px;font-weight:600;margin-bottom:4px;display:flex;align-items:center;gap:8px;letter-spacing:.2px}
.card .sub{color:var(--tx3);font-size:12px;margin-bottom:14px}
.tipbox{background:rgba(124,92,255,.08);border:1px solid rgba(124,92,255,.28);border-radius:10px;padding:10px 12px;font-size:12.5px;color:var(--tx2);line-height:1.65;margin:2px 0 12px}
.tipbox b{color:var(--tx)}
label{display:block;font-size:12px;color:var(--tx2);margin:12px 0 5px;font-weight:500;letter-spacing:.2px}
input,select,textarea{width:100%;padding:10px 12px;border:1px solid var(--bd2);border-radius:10px;
  font-size:14px;font-family:inherit;background:#161b2e;color:var(--tx);
  transition:border .18s,box-shadow .18s,background .18s}
input::placeholder,textarea::placeholder{color:#5b6584}
input:focus,select:focus,textarea:focus{outline:none;border-color:#22d3ee;background:#1d2440;
  box-shadow:0 0 0 3px rgba(34,211,238,.16),0 0 22px rgba(34,211,238,.16)}
select{color-scheme:dark}
select option{background:#161b2e;color:var(--tx)}
select:focus option{background:#1d2440}
textarea{min-height:84px;resize:vertical}
button{padding:10px 18px;border:none;border-radius:10px;color:#fff;font-size:14px;font-weight:500;cursor:pointer;
  font-family:inherit;transition:transform .16s,box-shadow .16s,filter .16s;position:relative;overflow:hidden;
  background:linear-gradient(135deg,#6366f1,#a855f7 50%,#22d3ee);background-size:220% 100%;
  animation:btnFlow 7s ease infinite;box-shadow:0 4px 16px rgba(99,102,241,.34)}
@keyframes btnFlow{0%{background-position:0% 0}50%{background-position:100% 0}100%{background-position:0% 0}}
/* hover 高光扫过 */
button::after{content:"";position:absolute;top:0;left:-130%;width:55%;height:100%;pointer-events:none;
  background:linear-gradient(100deg,transparent,rgba(255,255,255,.32),transparent);transition:left .55s ease}
button:hover::after{left:135%}
button:hover{transform:translateY(-1px);box-shadow:0 8px 26px rgba(139,92,246,.5);filter:brightness(1.07)}
button:active{transform:translateY(0)}
button:disabled{background:rgba(255,255,255,.1);color:var(--tx3);box-shadow:none;cursor:not-allowed;transform:none;animation:none}
button:disabled::after{display:none}
button.ghost{background:rgba(255,255,255,.055);color:var(--tx2);border:1px solid var(--bd2);box-shadow:none;animation:none}
button.ghost::after{display:none}
button.ghost:hover{background:rgba(255,255,255,.1);color:var(--tx);transform:translateY(-1px);
  box-shadow:0 4px 14px rgba(0,0,0,.25),0 0 18px rgba(99,102,241,.22);border-color:rgba(168,85,247,.48)}
button.sm{padding:6px 12px;font-size:13px;border-radius:9px}
button.danger{background:linear-gradient(135deg,#f43f5e,#e11d48);box-shadow:0 4px 16px rgba(244,63,94,.32);animation:none}
button.danger::after{content:"";position:absolute;top:0;left:-130%;width:55%;height:100%;pointer-events:none;
  background:linear-gradient(100deg,transparent,rgba(255,255,255,.3),transparent);transition:left .55s ease}
button.danger:hover::after{left:135%}
.row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@media(max-width:640px){.grid2{grid-template-columns:1fr}.wrap{padding:10px}}
/* 仅移动端显示的区块（桌面端已有对应入口，避免重复） */
.m-only{display:none}
.ckline{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--tx2);margin:0 0 10px;cursor:pointer;user-select:none}
.ckline input[type=checkbox]{width:auto;min-width:16px;height:16px;accent-color:var(--acc, #7c5cff);margin:0;cursor:pointer}
.msg{padding:10px 12px;border-radius:10px;font-size:13px;margin-top:10px;display:none;border:1px solid transparent;white-space:pre-line;line-height:1.5}
.msg.show{display:block;animation:fadeUp .3s ease both}
.msg.ok{background:var(--ok-l);color:#6ee7b7;border-color:rgba(16,185,129,.3)}
.msg.err{background:var(--err-l);color:#fda4af;border-color:rgba(244,63,94,.3)}
.msg.info{background:var(--brand-l);color:#a5b4fc;border-color:rgba(99,102,241,.32)}
.msg.warn{background:var(--warn-l);color:#fcd34d;border-color:rgba(245,158,11,.3)}
.hide{display:none!important}
.modal-mask{position:fixed;inset:0;background:rgba(4,7,15,.72);backdrop-filter:blur(6px);
  display:flex;align-items:center;justify-content:center;z-index:9999;padding:20px;animation:fadeUp .2s ease both}
.modal{background:linear-gradient(160deg,rgba(30,38,64,.97),rgba(18,24,44,.97));border:1px solid rgba(168,85,247,.34);
  border-radius:16px;padding:20px;max-width:390px;width:100%;position:relative;overflow:hidden;
  box-shadow:0 24px 60px rgba(0,0,0,.55),0 0 64px rgba(99,102,241,.2)}
.modal::before{content:"";position:absolute;top:0;left:0;right:0;height:1.5px;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(34,211,238,.95),rgba(168,85,247,.95),transparent);
  background-size:220% 100%;animation:scan 5s linear infinite}
.modal h4{margin:0 0 8px;font-size:16px;color:var(--tx);font-weight:600}
.modal p{margin:0 0 18px;font-size:13px;color:var(--tx2);line-height:1.65;word-break:break-all}
.modal-btns{display:flex;gap:10px;justify-content:flex-end}
.pw-cell{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;
  background:rgba(99,102,241,.14);border:1px solid rgba(99,102,241,.28);border-radius:6px;
  padding:3px 8px;color:#c7d2fe;user-select:all;cursor:text;white-space:nowrap}
.copy-row{display:flex;gap:8px;align-items:stretch;margin-bottom:12px}
.copy-row input{flex:1;min-width:0}
.copy-row button{flex-shrink:0;min-width:64px}
.modal-in{width:100%;padding:10px 12px;border:1px solid var(--bd2);border-radius:10px;font-size:14px;
  margin-bottom:16px;box-sizing:border-box;background:rgba(255,255,255,.06);color:var(--tx);font-family:inherit}
.modal-in:focus{outline:none;border-color:#818cf8;box-shadow:0 0 0 3px rgba(99,102,241,.18)}
.stat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:12px 0}
.stat{background:rgba(255,255,255,.04);border:1px solid var(--bd);border-radius:12px;padding:16px 10px;text-align:center}
.stat.warn{background:var(--warn-l);border-color:rgba(245,158,11,.32)}
.stat-val{font-size:27px;font-weight:700;line-height:1.2;
  background:linear-gradient(135deg,#a5b4fc,#c4b5fd 50%,#67e8f9);-webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 0 14px rgba(99,102,241,.55))}
.stat.warn .stat-val{background:linear-gradient(135deg,#fcd34d,#fbbf24);-webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 0 14px rgba(245,158,11,.5))}
.stat-label{font-size:12px;color:var(--tx3);margin-top:3px}
.chip{display:inline-block;background:rgba(99,102,241,.16);color:#c7d2fe;border:1px solid rgba(129,140,248,.36);
  border-radius:7px;padding:3px 9px;font-size:12px;margin:3px 4px 3px 0;
  box-shadow:0 0 12px rgba(99,102,241,.14);transition:box-shadow .2s,border-color .2s}
.chip:hover{border-color:rgba(34,211,238,.5);box-shadow:0 0 16px rgba(34,211,238,.3)}
.badge{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11px;font-weight:500}
.badge.admin{background:rgba(139,92,246,.22);color:#c4b5fd;border:1px solid rgba(139,92,246,.34)}
.badge.agent{background:rgba(16,185,129,.16);color:#6ee7b7;border:1px solid rgba(16,185,129,.3)}
.badge.off{background:var(--err-l);color:#fda4af}
.badge.on{background:var(--ok-l);color:#6ee7b7}
header{position:sticky;top:0;z-index:50;background:rgba(9,13,26,.74);backdrop-filter:blur(22px) saturate(165%);
  -webkit-backdrop-filter:blur(22px) saturate(165%);border-bottom:1px solid var(--bd);padding:12px 0;margin-bottom:14px;
  box-shadow:0 8px 32px rgba(0,0,0,.42)}
header::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:1.5px;pointer-events:none;
  background:linear-gradient(90deg,transparent,rgba(34,211,238,.9),rgba(168,85,247,.9),transparent);
  background-size:220% 100%;animation:scan 5s linear infinite}
header .wrap{padding-top:0;padding-bottom:0;display:flex;justify-content:space-between;align-items:center;gap:10px}
.brand{font-size:15px;font-weight:600;display:flex;align-items:center;gap:9px;letter-spacing:.3px}
.brand svg{flex-shrink:0;filter:drop-shadow(0 0 6px rgba(139,92,246,.6))}
.dot{width:8px;height:8px;border-radius:50%;background:var(--tx3);flex-shrink:0}
.dot.on{background:var(--ok);box-shadow:0 0 9px var(--ok);animation:bp 2.1s ease-in-out infinite}
.dot.off{background:var(--err);box-shadow:0 0 9px var(--err)}
.dot.warn{background:#ffb020;box-shadow:0 0 9px #ffb020;animation:bp 2.1s ease-in-out infinite}
@keyframes bp{0%,100%{opacity:1}50%{opacity:.4}}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{padding:10px 8px;text-align:left;border-bottom:1px solid var(--bd)}
th{color:var(--tx3);font-weight:500;font-size:12px;letter-spacing:.3px}
tr:last-child td{border-bottom:none}
tbody tr{transition:background .18s}
tbody tr:hover{background:rgba(99,102,241,.075)}
#loginWrap{max-width:392px;margin:9vh auto;padding:0 16px}
#loginWrap .card{padding:26px 24px 22px}
.lg-logo{width:52px;height:52px;margin:0 auto 14px;display:block;filter:drop-shadow(0 0 14px rgba(139,92,246,.55))}
.login-title{font-size:21px;font-weight:700;text-align:center;margin-bottom:5px;letter-spacing:.4px;
  background:linear-gradient(135deg,#a5b4fc,#c4b5fd 45%,#67e8f9);-webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 0 18px rgba(139,92,246,.55))}
.login-sub{text-align:center;color:var(--tx3);font-size:12.5px;margin-bottom:18px;letter-spacing:.3px}
.qrbox{text-align:center;padding:14px;background:rgba(255,255,255,.03);border:1px solid var(--bd);
  border-radius:12px;margin-top:4px}
.qrbox img{max-width:196px;width:100%;border-radius:10px;background:#fff;padding:6px}
.adv-pick{max-height:220px;overflow-y:auto;border:1px solid var(--bd);border-radius:10px;padding:8px;background:rgba(255,255,255,.03)}
.adv-pick label{margin:0;display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:8px;cursor:pointer;
  font-size:13px;font-weight:400;transition:background .15s}
.adv-pick label:hover{background:rgba(255,255,255,.06)}
.adv-pick input{width:auto;margin:0;accent-color:#818cf8}
.foot{text-align:center;color:var(--tx3);font-size:11.5px;padding:18px 0;letter-spacing:.3px}
.step{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--tx3);margin-bottom:10px}
.step-n{width:20px;height:20px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#a855f7);color:#fff;
  font-size:11px;display:flex;align-items:center;justify-content:center;font-weight:600;flex-shrink:0;
  box-shadow:0 0 12px rgba(139,92,246,.55)}
.spin{display:inline-block;width:13px;height:13px;border:2px solid rgba(255,255,255,.25);border-top-color:#fff;
  border-radius:50%;animation:sp .7s linear infinite;vertical-align:-2px;margin-right:6px}
@keyframes sp{to{transform:rotate(360deg)}}
/* ===== 动效 ===== */
.card{animation:fadeUp .55s cubic-bezier(.16,1,.3,1) both;animation-delay:calc(var(--i,0)*.08s)}
@keyframes sheetUp{from{transform:translateY(100%);opacity:.4}to{transform:none;opacity:1}}
@keyframes pop{0%{opacity:0;transform:scale(.92)}60%{opacity:1;transform:scale(1.03)}100%{opacity:1;transform:scale(1)}}
@keyframes glow{0%,100%{opacity:.5}50%{opacity:1}}
@keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}75%{transform:translateX(5px)}}
button:active{transform:scale(.975)}
button:focus-visible{outline:2px solid #818cf8;outline-offset:2px}
.btn-busy{pointer-events:none;opacity:.75}
.toast-in{animation:pop .32s cubic-bezier(.16,1,.3,1) both}
.stat-val{animation:pop .45s cubic-bezier(.16,1,.3,1) both}
.stat:nth-child(2) .stat-val{animation-delay:.08s}
.stat:nth-child(3) .stat-val{animation-delay:.16s}
.selwrap{position:relative}
.selwrap::after{content:"";position:absolute;right:13px;top:50%;width:7px;height:7px;margin-top:-5px;
  border-right:1.8px solid var(--tx3);border-bottom:1.8px solid var(--tx3);transform:rotate(45deg);
  pointer-events:none;transition:transform .2s}
.selwrap.open::after{transform:rotate(-135deg);margin-top:-2px}
select{cursor:pointer;-webkit-appearance:none;appearance:none;padding-right:32px}
.pulse{animation:glow 2.4s ease-in-out infinite}
.err-shake{animation:shake .32s ease both}
.card-enter{animation:fadeUp .45s cubic-bezier(.16,1,.3,1) both}
.ok-pop{animation:pop .5s cubic-bezier(.16,1,.3,1) both}
/* 系统开启「减少动效」时自动降级，避免眩晕/耗电 */
@media(prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important}
}
/* ===== 移动端深度优化 ===== */
@media(max-width:640px){
  body{font-size:15px}
  .wrap{padding:12px 12px calc(24px + env(safe-area-inset-bottom))}
  .card{padding:16px 14px;border-radius:15px;margin-bottom:12px}
  /* 16px 防 iOS 聚焦时页面自动放大 */
  input,select,textarea,button,.modal-in{font-size:16px}
  /* 触控目标。文字一律不换行——换行会把按钮压成「竖排」并撑高容器 */
  button{min-height:46px;padding:12px 16px;border-radius:12px;width:100%;white-space:nowrap}
  button.sm{min-height:38px;padding:9px 13px;width:auto;white-space:nowrap}
  .row{gap:9px}
  /* 一行内多个按钮：按内容自适应宽度，放不下就整体换行，绝不压缩到文字竖排 */
  .row>button{flex:1 1 auto;width:auto;min-width:max-content}
  .modal-btns button{flex:1 1 auto;width:auto;min-height:46px;min-width:max-content}
  /* 表单 */
  .grid2{grid-template-columns:1fr;gap:0}
  label{margin:15px 0 7px;font-size:13.5px}
  input,select,textarea{padding:12px 13px;border-radius:12px}
  textarea{min-height:96px}
  .card h2{font-size:16.5px}
  .card .sub{font-size:12.5px;margin-bottom:16px}
  /* 统计三栏更紧凑 */
  .stat-grid{gap:8px;margin:14px 0}
  .stat{padding:15px 5px;border-radius:13px}
  .stat-val{font-size:25px}
  .stat-label{font-size:11.5px;margin-top:4px}
  /* 表格横向滚动 */
  .tblwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -2px}
  table{min-width:540px}
  /* 头部 */
  header{padding:10px 0}
  header .wrap{padding-left:12px;padding-right:12px}
  .brand{font-size:15px;gap:8px}
  .brand svg{width:19px;height:19px}
  #who{font-size:12.5px!important}
  /* 复选列表触控友好 */
  .adv-pick{max-height:200px}
  .adv-pick label{padding:12px 10px;font-size:14px}
  .adv-pick input{width:19px;height:19px}
  /* 模态改底部弹出（更符合手机习惯） */
  .modal-mask{align-items:flex-end;padding:0}
  .modal{max-width:100%;max-height:92dvh;max-height:92vh;overflow-y:auto;-webkit-overflow-scrolling:touch;
    border-radius:20px 20px 0 0;padding:22px 18px calc(22px + env(safe-area-inset-bottom));
    animation:sheetUp .28s cubic-bezier(.16,1,.3,1) both}
  /* 登录页 */
  #loginWrap{margin:6vh auto;padding:0 14px;max-width:100%}
  #loginWrap .card{padding:26px 20px 22px}
  .login-title{font-size:22px}
  .lg-logo{width:56px;height:56px}
  .qrbox img{max-width:210px}
  .foot{padding:14px 0;font-size:11px}
  /* 提示条 */
  .msg{font-size:13.5px;padding:11px 13px}
  /* 卡片头：标题+副标题+按钮挤；移动端换行 */
  .card-head{flex-direction:column;align-items:stretch}
  .card-head button{width:100%;margin-top:8px;min-height:44px}
  /* 任务项：4 按钮挤一行；移动端 2×2 网格 */
  .sched-item .row{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  .sched-item .row>button{width:100%;min-width:0}
  /* 号码包项：信息+按钮挤；移动端换行 */
  .aud-item{flex-direction:column;align-items:stretch}
  .aud-item .row{width:100%;margin-left:0;display:flex;flex-wrap:wrap;gap:6px}
  .aud-item .row>button{flex:1 1 auto;min-width:0}
  /* OEM 预览略小 */
  .oem-prev img{max-width:80px;max-height:80px}
  /* 表格 cell：绝不逐字断行（否则长 ID / 中文表头会竖排成一条），
     改用不换行 + 容器横向滚动 */
  table th,table td{word-break:normal;overflow-wrap:normal;white-space:nowrap}
  table th{font-size:11.5px;letter-spacing:0}
  table td{vertical-align:middle}
  .tblwrap{-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain}
  /* 成员表：手机上转成卡片，一列一行，彻底不用横向滚动 */
  table.rtable{min-width:0!important;width:100%}
  table.rtable thead{display:none}
  table.rtable tbody{display:block}
  table.rtable tr{display:block;border:1px solid var(--bd);border-radius:14px;
    padding:11px 13px;margin-bottom:10px;background:rgba(255,255,255,.025)}
  table.rtable tr:hover{background:rgba(255,255,255,.025)}
  table.rtable td{display:flex;align-items:center;gap:10px;border:none;padding:5px 0;
    white-space:nowrap;min-height:0;width:auto}
  table.rtable td::before{content:attr(data-label);flex:0 0 72px;color:var(--tx3);
    font-size:12px;font-weight:400;letter-spacing:0}
  table.rtable td>b,table.rtable td>code,table.rtable td>.badge,table.rtable td>span{min-width:0}
  table.rtable td>b{overflow:hidden;text-overflow:ellipsis}
  table.rtable td.td-adv{display:block;padding:6px 0}
  table.rtable td.td-adv::before{display:block;margin-bottom:5px}
  table.rtable .cell-adv{display:flex;flex-wrap:wrap;gap:5px;min-width:0}
  table.rtable td.td-ops{display:grid;grid-template-columns:1fr 1fr;gap:8px;
    padding:11px 0 0;margin-top:7px;border-top:1px solid var(--bd)}
  table.rtable td.td-ops::before{display:none}
  table.rtable td.td-ops>button{width:100%!important;min-width:0;min-height:42px;padding:10px 8px;font-size:14px}
  table.rtable tr.empty-row{border:none;background:none;padding:14px 0}
  table.rtable tr.empty-row td{display:block}
  table.rtable tr.empty-row td::before{display:none}
  /* chip 防止溢出 */
  .chip{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}
  .m-only{display:block}
  /* 广告主清单：长 ID 不撑破行，名称过长省略 */
  .adv-pick label{min-width:0}
  .adv-pick label>span:first-child{min-width:0;flex:0 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .adv-pick label>span:nth-child(2){flex:0 0 auto;font-variant-numeric:tabular-nums}
  .adv-pick .chip{flex:0 0 auto}
}
@media(max-width:380px){
  .stat-val{font-size:20px}
  .stat{padding:12px 2px}
  .stat-label{font-size:10.5px}
  .brand span{font-size:14px}
  .card h2{font-size:15.5px}
  .wrap{padding:10px 10px calc(20px + env(safe-area-inset-bottom))}
  .card{padding:14px 12px}
  .modal{padding:18px 14px calc(18px + env(safe-area-inset-bottom))}
}
/* 尊重系统减少动效设置 */
@media(prefers-reduced-motion:reduce){
  *{animation-duration:.01ms!important;transition-duration:.01ms!important}
}
/* ===== 导航 / 分区 ===== */
.nav{display:flex;gap:8px;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:-2px 0 16px;padding:4px 2px}
.nav::-webkit-scrollbar{display:none}
.navitem{flex:0 0 auto;padding:9px 16px;border-radius:11px;border:1px solid var(--bd);
  background:rgba(255,255,255,.04);color:var(--tx2);font-size:13.5px;font-weight:500;cursor:pointer;
  white-space:nowrap;transition:transform .16s,background .18s,color .18s,box-shadow .18s;min-height:40px}
.navitem:hover{background:rgba(255,255,255,.08);color:var(--tx);translate:0 -1px;
  border-color:rgba(168,85,247,.42);box-shadow:0 0 18px rgba(99,102,241,.2)}
.navitem.active{background:linear-gradient(135deg,#6366f1,#a855f7 55%,#22d3ee);color:#fff;border-color:transparent;
  background-size:200% 100%;animation:btnFlow 7s ease infinite;
  box-shadow:0 5px 18px rgba(139,92,246,.5),0 0 26px rgba(99,102,241,.32)}
.view{animation:fadeUp .4s cubic-bezier(.16,1,.3,1) both}
#advSearch,#advListSearch{margin:10px 0 4px}
.oem-file{margin:0;padding:10px 14px;border:1px solid var(--bd2);border-radius:10px;cursor:pointer;color:var(--tx2);
  display:inline-flex;align-items:center;min-height:42px}
.oem-prev img{display:block;max-width:96px;max-height:96px;border-radius:12px;border:1px solid var(--bd)}
.navitem .ni{display:none}
@media(max-width:640px){
  /* ===== 底部 Tab 栏：模拟原生 APP ===== */
  .nav{position:fixed;left:0;right:0;bottom:0;z-index:80;margin:0!important;
    display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:0;overflow:visible;
    padding:6px 4px calc(6px + env(safe-area-inset-bottom));
    background:rgba(10,14,27,.94);backdrop-filter:blur(20px) saturate(160%);-webkit-backdrop-filter:blur(20px) saturate(160%);
    border-top:1px solid rgba(255,255,255,.1);box-shadow:0 -10px 30px rgba(0,0,0,.45)}
  .navitem{flex:none;width:auto!important;min-height:52px;padding:5px 2px;border:none;background:transparent;
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    font-size:11px;color:var(--tx3);border-radius:12px;box-shadow:none;position:relative}
  .navitem:hover{background:transparent;translate:none;box-shadow:none;color:var(--tx2)}
  .navitem .ni{display:block;width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.9;
    stroke-linecap:round;stroke-linejoin:round;opacity:.85}
  .navitem.active{background:transparent;color:#a5b4fc;box-shadow:none;animation:none;
    font-weight:600;border-color:transparent}
  .navitem.active .ni{opacity:1;filter:drop-shadow(0 0 7px rgba(129,140,248,.85));stroke-width:2.1}
  .navitem:active{background:rgba(255,255,255,.06)}
  /* 内容区给底部 Tab 让位。注意必须把 header 里的 .wrap 排除掉：
     它同样匹配 .wrap，会把 76px 内边距吃进去，把顶栏凭空撑到 120px+，
     看上去就是「顶部挡着下面的内容」。 */
  .wrap{padding-bottom:calc(76px + env(safe-area-inset-bottom))!important}
  header .wrap{padding-top:0!important;padding-bottom:0!important}
  /* 顶部吸顶：压到一行，像 APP 的导航栏。
     原来 header 里的按钮被 button{width:100%} 拉满后互相挤压，文字竖排、
     header 被撑到 160px+ 占掉近 1/5 屏 —— 这就是「顶部挡着下面」的根因。
     低频的改密码/改账号收进「设置」页，这里只留用户名 + 退出。 */
  header{position:sticky;top:0;z-index:70;padding:7px 0;margin-bottom:10px;
    background:rgba(7,11,22,.94);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
    border-bottom:1px solid var(--bd)}
  header .wrap{gap:8px;flex-wrap:nowrap}
  .brand{min-width:0;flex:0 1 auto;font-size:14px;gap:7px}
  .brand span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  header .row{flex-wrap:nowrap;gap:6px;flex:0 0 auto;overflow:visible}
  /* 低频入口移到设置页，避免顶部拥挤 */
  .hdr-extra{display:none!important}
  header button.sm{width:auto!important;min-height:34px;padding:6px 12px;font-size:13px;border-radius:9px}
  #who{white-space:nowrap;font-size:12.5px!important;max-width:104px;overflow:hidden;text-overflow:ellipsis;flex:0 1 auto}
  #who .badge{display:none}
  /* 主要操作：普通布局，不再 sticky（sticky 会浮在内容上遮挡）。
     底部 Tab 已固定，页面底部留白由 .wrap 负责 */
  #pushRow{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:14px!important}
  #pushRow>#pushBtn{grid-column:1/-1;min-height:50px;font-size:16px;font-weight:600}
  #pushRow>button{min-height:44px;min-width:0}
}
.sched-item,.aud-item{border:1px solid var(--bd);border-radius:12px;padding:12px 14px;margin-bottom:10px;background:rgba(255,255,255,.02)}
.sched-top{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:0}
.sched-top b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.sched-meta{font-size:12.5px;color:var(--tx3);margin-top:4px}
.aud-item{display:flex;align-items:center;justify-content:space-between;gap:8px 12px;flex-wrap:wrap}
.aud-item .info{min-width:0;flex:1 1 auto}
.aud-item .row{margin-left:auto}
.card-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:6px}
.card-head .sub{margin-bottom:0;margin-top:2px}
.card-head h2{margin-bottom:2px}
.card-head button{margin-top:2px;flex:0 0 auto;white-space:nowrap}
.empty{padding:28px 12px;text-align:center;color:var(--tx3);font-size:13px}
.empty .em-ic{font-size:22px;opacity:.6;display:block;margin-bottom:6px}
/* 广告主可搜索下拉 */
.adv-search{position:relative}
.adv-search .adv-input{width:100%;box-sizing:border-box;padding:9px 12px;border:1px solid var(--bd2);border-radius:10px;background:#161b2e;color:var(--tx);font-size:13.5px;outline:none;transition:border-color .15s,box-shadow .15s,background .15s}
.adv-search .adv-input:focus{border-color:#818cf8;background:#1d2440;box-shadow:0 0 0 3px rgba(99,102,241,.18)}
.adv-search .adv-input::placeholder{color:var(--tx3)}
.adv-search .adv-pop{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:60;max-height:280px;overflow-y:auto;background:#171c31;border:1px solid rgba(255,255,255,.16);border-radius:10px;box-shadow:0 18px 46px rgba(0,0,0,.56),0 0 0 1px rgba(0,0,0,.34);display:none}
.adv-search .adv-pop.open{display:block}
.adv-search .adv-opt{padding:9px 12px;cursor:pointer;font-size:13.5px;display:flex;align-items:center;gap:6px;border-bottom:1px solid rgba(255,255,255,.08);transition:background .12s}
.adv-search .adv-opt:last-child{border-bottom:0}
.adv-search .adv-opt:hover,.adv-search .adv-opt.hi{background:rgba(99,102,241,.26);color:var(--tx)}
.adv-search .adv-opt .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.adv-search .adv-opt .id{color:var(--tx3);font-size:12px;font-family:ui-monospace,Menlo,Consolas,monospace;flex:0 0 auto}
.adv-search .adv-empty{padding:16px 12px;text-align:center;color:var(--tx3);font-size:13px}
.adv-search .adv-clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:22px;height:22px;border-radius:50%;border:0;background:rgba(255,255,255,.08);color:var(--tx2);cursor:pointer;display:none;font-size:14px;line-height:1}
.adv-search.has-val .adv-clear{display:flex;align-items:center;justify-content:center}
.adv-search .adv-clear:hover{background:rgba(255,255,255,.16);color:var(--tx)}
.adv-search .adv-native{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;left:-9999px;top:-9999px}

/* ===== pyqdx-portal 扩展样式 ===== */
.statrow{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;margin-bottom:4px}
.statrow .stat{padding:16px 18px}
.stat-hint{font-size:12px;color:var(--tx3);margin-top:2px}
.src-chip{display:inline-block;padding:2px 10px;border-radius:99px;font-size:12px;border:1px solid var(--bd2)}
.src-chip.portal{color:#a5b4fc;border-color:rgba(99,102,241,.5);background:rgba(99,102,241,.12)}
.src-chip.upstream{color:var(--tx3)}
.searchrow{display:flex;gap:10px;align-items:center;margin:10px 0 4px;flex-wrap:wrap}
.searchrow input{flex:1;min-width:200px}
.ops-tbl td,.ops-tbl th{white-space:nowrap}
.ops-detail{white-space:normal!important;word-break:break-all}
.gen-row{display:flex;gap:8px}
.gen-row input{flex:1}
/* 表单标签 */
.f-label{display:block;font-size:12.5px;color:var(--tx2);margin:0 0 6px 2px;letter-spacing:.2px}
.stat .dot{display:inline-block;margin-right:6px;vertical-align:middle}
