/* ============================================================
   top发卡 后台 admin.css —— 视觉层 v2（框架增量样式）
   规格源=prototype/top发卡-UI原型单文件.html <style> 内 admin.css 段
   （原以 body 类前缀限定作用域，为单文件双区隔离；实施版 admin 单区加载，
    已去前缀：令牌挂 :root、基础规则挂 body；单文件外壳相关规则不带入）
   基底 = assets/css/bootstrap.min.css v5.3.3（纯离线，无网络请求）
   交互零依赖 Bootstrap JS；设计令牌对齐设计规格：
   单一品牌蓝 + 语义色 4（成功/价格红/警示橙/禁用灰）。
   窗口自适应三断点（1199/1023/768）随段并入。
   ============================================================ */
:root{
  /* 品牌与语义色（单品牌蓝，与小程序原型 style.css 同族） */
  --brand:#0d6efd; --brand-dark:#0b5ed7; --brand-ink:#0a58ca; --brand-tint:#eaf2ff; --brand-tint2:#f4f8ff;
  --ok:#198754; --ok-tint:#e7f6ee;
  --red:#dc3545; --red-dark:#b02a37; --red-tint:#fdecee;
  --amber:#ff9f0a; --amber-dark:#946200; --amber-tint:#fff5e0;
  --info:#0aa2c0; --info-tint:#e2f6fb;
  /* 文字与面 */
  --ink:#0f172a; --t1:#334155; --t2:#5b6b85; --t3:#8a94a6;
  --line:#e8edf5; --line-soft:#f1f4f9; --bg:#f4f6fa; --card:#fff;
  --slate:#4b5563;
  /* 侧栏 */
  --side-bg1:#0f172a; --side-bg2:#131f38; --side-txt:#93a3bd; --side-txt-on:#fff;
  /* 阴影 */
  --sh-1:0 1px 2px rgba(16,24,40,.05);
  --sh-2:0 1px 2px rgba(16,24,40,.04), 0 10px 28px -18px rgba(16,24,40,.28);
  --sh-3:0 24px 64px -28px rgba(15,23,42,.45);
  --r-card:14px; --r-ctl:9px;
}

/* ---------- 基础 ---------- */
body{
  background:var(--bg); color:var(--t1); font-size:14px;
  font-family:"Segoe UI",-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  -webkit-font-smoothing:antialiased;
}
::selection{background:rgba(13,110,253,.18)}
a{color:var(--brand)}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:#c8d0dd;border-radius:6px;border:2px solid var(--bg)}
::-webkit-scrollbar-thumb:hover{background:#aeb8c8}
::-webkit-scrollbar-track{background:transparent}

/* ---------- 侧栏 ---------- */
.sidebar{
  width:240px;min-height:100vh;background:linear-gradient(180deg,var(--side-bg1) 0%,var(--side-bg2) 100%);
  color:var(--side-txt);position:fixed;top:0;left:0;bottom:0;padding:0 0 20px;z-index:100;
  overflow-y:auto;border-right:1px solid rgba(255,255,255,.06);
}
.sidebar::-webkit-scrollbar-thumb{background:rgba(255,255,255,.14);border-color:transparent}
.sidebar .brand{
  position:relative;color:#fff;font-weight:700;font-size:14.5px;line-height:1.35;
  padding:18px 16px 15px 54px;margin-bottom:6px;border-bottom:1px solid rgba(255,255,255,.08);
}
.sidebar .brand::before{
  content:"";position:absolute;left:16px;top:18px;width:28px;height:28px;border-radius:9px;
  background:linear-gradient(135deg,#2563eb,#60a5fa);
  background-image:radial-gradient(rgba(255,255,255,.95) 1.5px, transparent 1.6px),linear-gradient(135deg,#2563eb,#60a5fa);
  background-size:7px 7px,100% 100%;background-position:center;background-repeat:no-repeat;
  box-shadow:0 6px 16px -4px rgba(37,99,235,.6);
}
.sidebar .brand small{display:block;font-weight:400;font-size:10.5px;color:#6f80a0;margin-top:3px;letter-spacing:.02em}
.sidebar a{
  position:relative;display:flex;align-items:center;margin:2px 12px;padding:8px 12px;
  color:var(--side-txt);text-decoration:none;font-size:13px;border-radius:9px;
  transition:background .15s ease,color .15s ease;
}
.sidebar a:hover{background:rgba(255,255,255,.07);color:#e6edf8}
.sidebar a.on{
  color:var(--side-txt-on);font-weight:600;
  background:linear-gradient(90deg,rgba(13,110,253,.32),rgba(13,110,253,.10));
  box-shadow:inset 3px 0 0 #4f8cff, inset 0 0 0 1px rgba(79,140,255,.28);
}
.sidebar a.on::after{
  content:"";position:absolute;right:12px;top:50%;width:5px;height:5px;border-radius:50%;
  background:#69a1ff;transform:translateY(-50%);box-shadow:0 0 8px rgba(105,161,255,.9);
}
.sidebar .grp{
  padding:16px 20px 6px;font-size:10px;font-weight:700;color:#556582;
  letter-spacing:.16em;text-transform:uppercase;
}
/* P1 留位项（行内 opacity:.5）与会话出口沿用原语义 */
.sidebar a[style*="opacity"]{font-size:12.5px}

/* ---------- 主区 / 顶栏 ---------- */
.main{margin-left:240px;padding:0 26px 52px}
.topbar{
  position:sticky;top:0;z-index:60;display:flex;justify-content:space-between;align-items:center;gap:18px;
  padding:16px 0 13px;margin-bottom:18px;background:rgba(244,246,250,.92);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-bottom:1px solid var(--line);
}
.crumbs{color:var(--ink);font-size:16px;font-weight:700;letter-spacing:.01em}
.topbar .hint-sm{max-width:640px}

/* ---------- 卡片 / 统计卡 ---------- */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--sh-2)}
.card-body{padding:18px 20px}
.stat-card{border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--sh-2);background:var(--card)}
.stat-card .card-body{padding:18px 20px}
.stat-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.stat-card .num{
  font-size:27px;font-weight:800;color:var(--ink);letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;margin:8px 0 5px;line-height:1.15;
}
.stat-card .stat-head .hint-sm{font-size:12.5px;font-weight:600;color:var(--t2)}
.stat-card .stat-head .hint-sm::before{
  content:"";display:inline-block;width:6px;height:6px;border-radius:50%;
  background:var(--brand);margin-right:7px;vertical-align:1px;
}
.stat-card>.card-body>.hint-sm:last-child{font-size:11.5px;color:var(--t3);line-height:1.6}
.stat-card h6.fw-bold{font-size:13.5px;color:var(--ink);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.stat-ico{
  flex-shrink:0;width:34px;height:34px;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;
  background:var(--brand-tint);color:var(--brand);
}
.stat-ico svg{width:17px;height:17px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.stat-ico.ok{background:var(--ok-tint);color:var(--ok)}
.stat-ico.red{background:var(--red-tint);color:var(--red)}
.stat-ico.amber{background:var(--amber-tint);color:var(--amber-dark)}
.stat-ico.info{background:var(--info-tint);color:var(--info)}
.border-start.border-4{border-left-width:4px!important}

/* ---------- 表格 ---------- */
.table{--bs-table-bg:transparent;--bs-table-color:var(--t1);--bs-table-border-color:var(--line-soft);margin-bottom:0}
.table>:not(caption)>*{background:transparent}
.table>:not(caption)>*>*{padding:.7rem .8rem;border-bottom-color:var(--line-soft);vertical-align:middle}
.table thead th{
  font-size:11.5px;font-weight:700;color:#6b7a91;letter-spacing:.06em;text-transform:uppercase;
  background:#f7f9fd;border-bottom:1px solid var(--line);white-space:nowrap;
}
.table tbody tr{transition:background .12s ease}
.table tbody tr:hover{background:#f7faff}
.table tbody tr:last-child>*{border-bottom:none}
.table-sm>:not(caption)>*>*{padding:.5rem .7rem}
.table thead.table-sm th{font-size:11px}
.table-active{background:#f1f6ff!important}
.mono{font-family:Consolas,"SF Mono",Menlo,monospace;font-size:.95em}
.num{font-variant-numeric:tabular-nums}

/* ---------- 徽章（柔和着色，语义不变） ---------- */
.badge{font-weight:600;font-size:11px;padding:4px 9px;border-radius:6px;letter-spacing:.02em;white-space:nowrap}
.badge.bg-primary{background:rgba(13,110,253,.12)!important;color:#0b5ed7!important}
.badge.bg-success,.badge.text-bg-success{background:rgba(25,136,84,.13)!important;color:#147a4a!important}
.badge.bg-danger,.badge.text-bg-danger{background:rgba(220,53,69,.12)!important;color:#c02434!important}
.badge.bg-warning,.badge.text-bg-warning{background:rgba(255,159,10,.16)!important;color:#8a5a00!important}
.badge.bg-info,.badge.text-bg-info{background:rgba(10,162,192,.14)!important;color:#0a7f96!important}
.badge.bg-secondary,.badge.text-bg-secondary{background:rgba(102,113,125,.14)!important;color:#4b5563!important}
.badge.bg-light{background:#f1f4f9!important;color:#4b5563!important}
.badge-loop{background:rgba(25,136,84,.13)!important;color:#147a4a!important}

/* ---------- 按钮 ---------- */
.btn{
  --bs-btn-border-radius:9px;
  font-weight:600;font-size:13px;padding:.38rem .9rem;letter-spacing:.01em;
  transition:background .15s ease,border-color .15s ease,color .15s ease,box-shadow .15s ease,transform .1s ease;
}
.btn:active{transform:translateY(1px)}
.btn-sm{--bs-btn-border-radius:8px;font-size:12.5px;padding:.3rem .75rem}
.btn:focus-visible{box-shadow:0 0 0 3px rgba(13,110,253,.22)}
.btn-primary{
  --bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;
  --bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0b5ed7;
  --bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a58ca;
  --bs-btn-disabled-bg:#9dc4ff;--bs-btn-disabled-border-color:#9dc4ff;
  box-shadow:0 1px 2px rgba(13,110,253,.28);
}
.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#b7d2ff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-hover-color:#fff}
.btn-outline-secondary{--bs-btn-color:#5b6b85;--bs-btn-border-color:#d4dbe7;--bs-btn-hover-bg:#5b6b85;--bs-btn-hover-border-color:#5b6b85;--bs-btn-hover-color:#fff}
.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#f3bcc2;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-hover-color:#fff}
.btn-outline-warning{--bs-btn-color:#b45309;--bs-btn-border-color:#f5d9a8;--bs-btn-hover-bg:#ff9f0a;--bs-btn-hover-border-color:#ff9f0a;--bs-btn-hover-color:#fff}
.btn-outline-dark{--bs-btn-color:#334155;--bs-btn-border-color:#c9d2e0;--bs-btn-hover-bg:#334155;--bs-btn-hover-border-color:#334155;--bs-btn-hover-color:#fff}
.btn-secondary{--bs-btn-bg:#64748b;--bs-btn-border-color:#64748b;--bs-btn-hover-bg:#55627a;--bs-btn-hover-border-color:#55627a}
.btn-danger{--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-bg:#c82333;--bs-btn-hover-border-color:#c82333}
.btn-dark{--bs-btn-bg:#253046;--bs-btn-border-color:#253046;--bs-btn-hover-bg:#1a2334;--bs-btn-hover-border-color:#1a2334}
.btn-link{text-decoration:none}
.btn-group .btn{box-shadow:none}

/* ---------- 表单 ---------- */
.form-label{font-size:12.5px;font-weight:600;color:#475569;margin-bottom:6px}
.form-label.req::after{content:" *";color:var(--red)}
.form-control,.form-select{
  border:1px solid #dde3ec;border-radius:var(--r-ctl);font-size:13.5px;color:var(--ink);
  padding:.45rem .75rem;background:#fff;transition:border-color .15s ease,box-shadow .15s ease;
}
.form-control:hover,.form-select:hover{border-color:#c6d0e0}
.form-control:focus,.form-select:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(13,110,253,.14);background:#fff}
.form-control::placeholder{color:#a7b0c0}
.form-control-plaintext{font-size:13px;color:var(--t1)}
.form-control-sm,.form-select-sm{font-size:12.5px;padding:.3rem .6rem;border-radius:8px}
.form-text{font-size:11.5px;color:var(--t3);line-height:1.65}
.form-check-input{border-color:#c3ccdb}
.form-check-input:checked{background-color:var(--brand);border-color:var(--brand)}
.form-check-input:focus{box-shadow:0 0 0 3px rgba(13,110,253,.16)}
.form-check-label{font-size:13px;color:var(--t1)}
.form-switch .form-check-input{width:2.4em;height:1.32em}
.mask-code{letter-spacing:.1em;color:#64748b}
.finger{font-size:12px;color:#64748b;font-family:Consolas,Menlo,monospace}
input[type=file].form-control{padding:.3rem .6rem;font-size:12.5px}

/* ---------- 导航：pill / tabs / 分组选项卡 ---------- */
.nav-pills .nav-link{border-radius:9px;font-size:13px;color:#475066;padding:7px 15px;transition:background .15s ease,color .15s ease}
.nav-pills .nav-link:hover{background:#eef2f9}
.nav-pills .nav-link.active{background:var(--brand);color:#fff;font-weight:600;box-shadow:0 2px 8px -3px rgba(13,110,253,.55)}
.pill-nav{gap:4px;box-shadow:var(--sh-1);border:1px solid var(--line)}
.pill-nav .nav-link{font-size:13px}
.nav-tabs{border-bottom:1px solid var(--line);gap:2px}
.nav-tabs .nav-link{border:none;background:transparent;color:#64748b;font-size:13px;font-weight:600;padding:8px 16px;border-radius:8px 8px 0 0;margin-bottom:-1px}
.nav-tabs .nav-link:hover{border-color:transparent;color:var(--ink);background:#f2f5fb}
.nav-tabs .nav-link.active{
  background:var(--brand-tint);color:var(--brand-ink);border:1px solid transparent;border-bottom-color:transparent;
  box-shadow:inset 0 -2px 0 var(--brand);
}
.nav-sm .nav-link{font-size:12px}

/* ---------- 列表组（框架页目录） ---------- */
.list-group{border:1px solid var(--line);border-radius:11px;overflow:hidden}
.list-group-item{border-color:var(--line);padding:12px 16px;font-size:13px;line-height:1.75;background:#fff}
.list-group-item b{color:var(--ink)}
.list-group-item .mono{font-size:12px}
.list-group-item-action{transition:background .14s ease,box-shadow .14s ease}
.list-group-item-action:hover{background:#f5f9ff;color:inherit}
.list-group-item.text-muted{background:#fafbfd;font-size:12.5px;line-height:1.7}

/* ---------- 提示 / 说明块 ---------- */
.hint-sm{font-size:12px;color:var(--t3);line-height:1.65}
.spec-note{
  font-size:12px;line-height:1.8;color:#57657e;background:#f5f8ff;
  border:1px solid #e3eaf7;border-left:3px solid var(--brand);
  border-radius:0 10px 10px 0;padding:11px 15px;margin-top:16px;
}
.spec-note b{color:var(--ink)}
.alert{border:none;border-radius:11px;font-size:13px;line-height:1.7}
.alert-warning{background:var(--amber-tint);color:#7a5a12}
.alert-warning b{color:#6b4c08}
.cron-once{
  background:#fffaf0;border:1px dashed #eccf94;border-radius:10px;
  padding:11px 14px;font-size:12.5px;line-height:1.7;color:#7a5f22;
}
.cd{font-variant-numeric:tabular-nums;font-weight:700;color:#b45309}
.diff{margin-top:6px;padding:8px 10px;background:#f7f9fc;border:1px solid var(--line);border-radius:8px;line-height:1.7}
.diff>div{font-size:12px;word-break:break-all}
.dirty-flag{color:var(--red);font-weight:600;animation:blink 1.4s ease-in-out infinite}
@keyframes blink{50%{opacity:.45}}
.cron{font-family:Consolas,Menlo,monospace;color:#64748b}
.btn.btn-link.p0,.btn.btn-link.p-0{color:var(--brand);font-size:12.5px;text-decoration:none}

/* ---------- 模态 ---------- */
.modal-content{border:none;border-radius:16px;box-shadow:var(--sh-3);overflow:hidden}
.modal-header{padding:15px 20px;border-bottom:1px solid var(--line);background:#fbfcfe}
.modal-title{font-size:14.5px;font-weight:700;color:var(--ink)}
.modal-body{padding:18px 20px;font-size:13.5px;line-height:1.75;color:var(--t1)}
.modal-body .form-text,.modal-body .hint-sm{font-size:12px}
.modal-footer{padding:13px 20px;border-top:1px solid var(--line);background:#fbfcfe;gap:8px}
.btn-close{opacity:.35;transition:opacity .15s ease}
.btn-close:hover{opacity:.7}
.danger-confirm .modal-content{border-top:3px solid var(--red)}
.danger-confirm .modal-header{background:linear-gradient(180deg,rgba(220,53,69,.09),rgba(220,53,69,0))}
.danger-confirm .modal-title{color:var(--red-dark)}
.danger-confirm .modal-body ul{padding-left:18px}
.danger-confirm .modal-body li{margin-bottom:5px}

/* ---------- 抽屉（订单详情等） ---------- */
.drawer-backdrop{position:fixed;inset:0;background:rgba(15,23,42,.42);display:none;z-index:1040;backdrop-filter:blur(1.5px)}
.drawer{
  position:fixed;top:0;right:-500px;width:470px;max-width:94vw;height:100vh;background:#fff;
  box-shadow:-30px 0 70px -35px rgba(15,23,42,.55);z-index:1045;transition:right .24s cubic-bezier(.22,.75,.3,1);
  overflow-y:auto;padding:20px 22px 32px;border-left:1px solid var(--line);
}
.drawer.open{right:0}
.drawer-backdrop.open{display:block}
.drawer h6{font-size:14.5px;font-weight:700;color:var(--ink)}
.drawer .table{border:1px solid var(--line);border-radius:10px;overflow:hidden}

/* ---------- 登录页 ---------- */
body.login-wrap{
  min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden;
  background:radial-gradient(900px 480px at 18% -8%, rgba(37,99,235,.35), transparent 60%),
             linear-gradient(160deg,#0f172a 0%,#16233d 60%,#1b2b4d 100%);
}
body.login-wrap::before,body.login-wrap::after{
  content:"";position:absolute;border-radius:50%;filter:blur(60px);pointer-events:none;
}
body.login-wrap::before{width:340px;height:340px;background:rgba(13,110,253,.35);top:-90px;right:-70px}
body.login-wrap::after{width:280px;height:280px;background:rgba(79,140,255,.22);bottom:-80px;left:-60px}
body.login-wrap .card{
  position:relative;z-index:1;border:none;border-radius:18px;width:min(360px,94vw);
  box-shadow:0 40px 90px -35px rgba(0,0,0,.75), 0 0 0 1px rgba(255,255,255,.06);
}
body.login-wrap .card-body{padding:30px 30px 26px}
body.login-wrap h5{position:relative;font-weight:800;letter-spacing:.01em;color:var(--ink)}
body.login-wrap h5::before{
  content:"";display:block;width:42px;height:42px;border-radius:13px;margin:0 auto 12px;
  background-image:radial-gradient(rgba(255,255,255,.95) 2px, transparent 2.1px),linear-gradient(135deg,#2563eb,#60a5fa);
  background-size:9px 9px,100% 100%;background-position:center;background-repeat:no-repeat;
  box-shadow:0 10px 24px -8px rgba(37,99,235,.7);
}
body.login-wrap .form-label{color:#475569}
body.login-wrap .btn-primary{padding:.6rem 1rem;font-size:14px;box-shadow:0 8px 20px -10px rgba(13,110,253,.9)}

/* ---------- Toast（admin.js 自绘） ---------- */
#toast .toast{border-radius:11px;box-shadow:0 18px 40px -18px rgba(15,23,42,.7);font-size:13px}
#toast .toast-body{padding:10px 16px}

/* ---------- 其他 ---------- */
.fw-bold{letter-spacing:.01em}
.fs-5{font-variant-numeric:tabular-nums}
.bg-light{background:#f6f8fc!important}
.text-danger{color:#d92d3f!important}
.text-success{color:#12855a!important}
.border{border-color:var(--line)!important}
main:focus{outline:none}

/* ===== 窗口自适应（768~1920，断点方案定稿）：断点内只调宽度/位置/换行/滚动 ===== */
/* 窄窗汉堡抽屉配套件（.tp-side-btn/.tp-side-mask 由外壳 JS 注入，样式取既有令牌） */
.tp-side-btn{
  display:none;align-items:center;justify-content:center;flex-shrink:0;
  width:32px;height:32px;background:transparent;border:1px solid var(--line);
  border-radius:8px;color:var(--ink);font-size:16px;line-height:1;cursor:pointer;
}
.tp-side-mask{
  position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:99;
  opacity:0;pointer-events:none;transition:opacity .2s ease;
}
@media (max-width:1199px){
  .sidebar{width:210px}
  .main{margin-left:210px;padding:0 18px 44px}
  .row>.col-md-3:has(>.card.stat-card){width:50%}
}
@media (max-width:1023px){
  .sidebar{transform:translateX(-100%);transition:transform .24s cubic-bezier(.22,.75,.3,1)}
  body.tp-side-open .sidebar{transform:translateX(0)}
  .main{margin-left:0}
  .topbar{flex-wrap:wrap}
  .tp-side-btn{display:inline-flex}
  body.tp-side-open .tp-side-mask{opacity:1;pointer-events:auto}
}
@media (max-width:768px){
  .modal-dialog{margin:.75rem}
}