/* 自托管 Archivo（拉丁/数字子集，可变字重），避免境外字体 CDN 阻塞首屏 */
@font-face{
  font-family:'Archivo';
  src:url('fonts/archivo-var.woff2') format('woff2-variations');
  font-weight:400 800;
  font-style:normal;
  font-display:swap;
  unicode-range:U+0000-00FF,U+2000-206F,U+20A0-20CF,U+2100-214F;
}

/* ===========================================================
   贵定燕子洞 · 探洞预约系统
   共享设计系统 theme.css
   色彩：洞外苔林 / 洞内头灯
   =========================================================== */

:root{
  /* 深色 · 洞内 */
  --ink:#0C1F19;
  --ink-2:#14312A;
  --ink-3:#1F463B;
  --ink-4:#2B5A4B;

  /* 绿色系 */
  --moss:#3F6B4F;
  --moss-2:#5C8564;
  --sage:#8CA690;
  --fern:#B7C9B0;

  /* 浅色 · 洞外石灰岩 */
  --stone:#E7E6DC;
  --stone-hi:#F6F5ED;
  --stone-mid:#DCDCD0;
  --stone-lo:#CFD0C2;
  --line:#C9CCBD;
  --line-2:#DDDFD2;

  /* 强调 */
  --amber:#EAA63B;
  --amber-2:#F7D69A;
  --amber-3:#8A5A12;
  --water:#2A6E68;
  --rust:#B94A2E;
  --rust-2:#F6E3DC;
  --sky:#3E6E8C;

  /* 文字 */
  --text:#102620;
  --text-2:#3D5449;
  --muted:#6D8074;
  --muted-2:#93A398;

  /* 形状 */
  --r-lg:20px;
  --r:14px;
  --r-sm:10px;
  --r-xs:7px;

  --shadow-1:0 2px 6px rgba(12,31,25,.06);
  --shadow-2:0 14px 34px -18px rgba(12,31,25,.42);
  --shadow-3:0 28px 60px -30px rgba(12,31,25,.55);

  --ff:"Noto Sans SC","PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,sans-serif;
  --ff-num:"Archivo","Noto Sans SC",sans-serif;

  --ease:cubic-bezier(.22,.8,.32,1);
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;
  font-family:var(--ff);
  color:var(--text);
  background:var(--stone);
  font-size:15px;
  line-height:1.62;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
h1,h2,h3,h4,h5,p,figure{margin:0}
h1,h2,h3,h4{font-weight:900;letter-spacing:-.025em;line-height:1.2}
a{color:inherit;text-decoration:none}
button{font-family:inherit;font-size:inherit;color:inherit;cursor:pointer;border:0;background:none}
input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}
ul{margin:0;padding:0;list-style:none}
img{max-width:100%;display:block}
::selection{background:var(--amber);color:var(--ink)}
:focus-visible{outline:2px solid var(--amber);outline-offset:2px}

.num{font-family:var(--ff-num);font-variant-numeric:tabular-nums;letter-spacing:-.01em}

/* ---------------- 图标 ---------------- */
.ico{
  width:1em;height:1em;display:inline-block;vertical-align:-.14em;
  fill:none;stroke:currentColor;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round;flex:none;
}

/* ---------------- 通用 ---------------- */
.container{max-width:1320px;margin:0 auto;padding:0 32px}
.hidden{display:none!important}
.muted{color:var(--muted)}
.tiny{font-size:12px}
.row{display:flex;align-items:center;gap:10px}
.row-between{display:flex;align-items:center;justify-content:space-between;gap:12px}
.col{display:flex;flex-direction:column}
.grow{flex:1;min-width:0}
.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.spacer{flex:1}

/* ---------------- 按钮 ---------------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:7px;
  height:44px;padding:0 20px;border-radius:12px;
  font-size:14.5px;font-weight:700;letter-spacing:.01em;
  border:1px solid transparent;position:relative;overflow:hidden;
  transition:transform .16s var(--ease),background .18s,box-shadow .18s,color .18s;
  white-space:nowrap;user-select:none;
}
.btn:active{transform:scale(.975)}
.btn--primary{background:var(--amber);color:#231503;box-shadow:0 8px 18px -10px rgba(234,166,59,.9)}
.btn--primary:hover{background:#F0B352}
.btn--dark{background:var(--ink);color:#F4F3EA}
.btn--dark:hover{background:var(--ink-3)}
.btn--ghost{background:transparent;border-color:var(--line);color:var(--text)}
.btn--ghost:hover{background:var(--stone-mid)}
.btn--soft{background:var(--stone-mid);color:var(--text)}
.btn--soft:hover{background:var(--stone-lo)}
.btn--danger{background:transparent;border-color:#DDB4A7;color:var(--rust)}
.btn--danger:hover{background:var(--rust-2)}
.btn--sm{height:34px;padding:0 13px;font-size:13px;border-radius:9px}
.btn--xs{height:27px;padding:0 9px;font-size:12px;border-radius:7px;gap:4px}
.btn--icon{width:42px;padding:0}
.btn--block{width:100%}
.btn[disabled]{opacity:.42;pointer-events:none;box-shadow:none}
.btn--primary::after{
  content:"";position:absolute;inset:0;border-radius:inherit;
  background:radial-gradient(circle at var(--mx,50%) var(--my,50%),rgba(255,255,255,.45),transparent 45%);
  opacity:0;transition:opacity .4s;
}
.btn--primary:active::after{opacity:1;transition:none}

/* ---------------- 标签 ---------------- */
.tag{
  display:inline-flex;align-items:center;gap:5px;
  height:24px;padding:0 9px;border-radius:20px;
  font-size:11.5px;font-weight:700;letter-spacing:.01em;
  border:1px solid;white-space:nowrap;
}
.tag i{width:5px;height:5px;border-radius:50%;background:currentColor;display:block}
.tag--wait{color:#7A6A3C;border-color:#DDD2AE;background:#F7F1DF}
.tag--insure{color:#8A5A12;border-color:#E6C98C;background:#FAEED5}
.tag--ready{color:#1E5B50;border-color:#A3C2B9;background:#E2EFEA}
.tag--verify{color:#2C4C72;border-color:#B2C2D8;background:#E8EDF5}
.tag--done{color:#3B5A3D;border-color:#B7C8B3;background:#E6EEE2}
.tag--refund{color:var(--rust);border-color:#DDB4A7;background:var(--rust-2)}
.tag--cancel{color:#77857A;border-color:#C9CCBD;background:transparent}
.tag--group{color:#6A3D7A;border-color:#CDB9D6;background:#F1E7F5}
.tag--mt{color:#7A5E00;border-color:#E7D48A;background:#FCF3D4}
.tag--dy{color:#20302C;border-color:#BFC8C4;background:#EEF1EE}
.tag--solid{background:var(--ink);color:#F4F3EA;border-color:var(--ink)}

.chip{
  display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 13px;border-radius:18px;
  font-size:13px;color:var(--text-2);border:1px solid var(--line);background:transparent;
  transition:all .18s var(--ease);white-space:nowrap;
}
.chip:hover{border-color:var(--sage)}
.chip.is-on{background:var(--ink);color:#F4F3EA;border-color:var(--ink);font-weight:700}

/* ---------------- 表单 ---------------- */
.field{display:flex;flex-direction:column;gap:6px}
.field > label{font-size:12.5px;color:var(--muted);font-weight:500}
.input,.select,.textarea{
  width:100%;height:44px;padding:0 14px;border-radius:11px;
  border:1px solid var(--line);background:#fff;color:var(--text);
  font-size:14.5px;transition:border-color .16s,box-shadow .16s;
}
.textarea{height:auto;padding:11px 14px;resize:vertical;line-height:1.6}
.input:focus,.select:focus,.textarea:focus{
  outline:0;border-color:var(--moss);box-shadow:0 0 0 3px rgba(63,107,79,.12);
}
.input::placeholder,.textarea::placeholder{color:#A5B0A5}
.select{appearance:none;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='%236D8074' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;padding-right:34px}
.input--code{font-family:var(--ff-num);letter-spacing:.18em;font-weight:600}

.switch{position:relative;width:44px;height:26px;border-radius:20px;background:var(--stone-lo);transition:background .2s;flex:none;cursor:pointer}
.switch::after{content:"";position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.2);transition:transform .2s var(--ease)}
.switch.is-on{background:var(--moss)}
.switch.is-on::after{transform:translateX(18px)}

.checkbox{width:19px;height:19px;border-radius:6px;border:1.5px solid var(--line);background:#fff;display:inline-grid;place-items:center;flex:none;cursor:pointer;transition:all .16s}
.checkbox.is-on{background:var(--ink);border-color:var(--ink);color:#fff}
.checkbox.is-on::after{content:"";width:5px;height:9px;border:2px solid #fff;border-top:0;border-left:0;transform:rotate(42deg) translateY(-1px)}

.seg{display:inline-flex;padding:4px;background:var(--stone-mid);border-radius:12px;gap:2px}
.seg button{height:34px;padding:0 16px;border-radius:9px;font-size:13.5px;color:var(--text-2);font-weight:500;transition:all .18s var(--ease)}
.seg button.is-on{background:var(--stone-hi);color:var(--text);font-weight:700;box-shadow:var(--shadow-1)}

/* ---------------- 卡片 ---------------- */
.card{background:var(--stone-hi);border:1px solid var(--line);border-radius:var(--r);position:relative}
.card--pad{padding:20px}
.card--dark{background:var(--ink);color:#E9E8DC;border-color:var(--ink-2)}
.divider{height:1px;background:var(--line-2);margin:14px 0}

/* ---------------- 弹层 ---------------- */
.mask{
  position:fixed;inset:0;background:rgba(9,24,19,.55);backdrop-filter:blur(3px);
  z-index:900;opacity:0;pointer-events:none;transition:opacity .24s;
}
.mask.is-open{opacity:1;pointer-events:auto}
.modal{
  position:fixed;z-index:901;left:50%;top:50%;transform:translate(-50%,-46%) scale(.97);
  width:min(520px,calc(100vw - 32px));max-height:86vh;overflow:auto;
  background:var(--stone-hi);border-radius:var(--r-lg);box-shadow:var(--shadow-3);
  opacity:0;pointer-events:none;transition:opacity .22s,transform .26s var(--ease);
}
.modal.is-open{opacity:1;pointer-events:auto;transform:translate(-50%,-50%) scale(1)}
.modal__head{padding:22px 24px 14px;display:flex;justify-content:space-between;align-items:flex-start;gap:16px;position:sticky;top:0;background:var(--stone-hi);z-index:2;border-bottom:1px solid transparent}
.modal__head h3{font-size:18px}
.modal__body{padding:4px 24px 8px}
.modal__foot{padding:16px 24px 22px;display:flex;gap:10px;justify-content:flex-end}
.sheet-m{
  position:fixed;left:50%;bottom:0;transform:translate(-50%,100%);
  width:min(480px,100vw);background:var(--stone-hi);
  border-radius:22px 22px 0 0;z-index:901;transition:transform .3s var(--ease);
  max-height:86vh;overflow:auto;padding-bottom:env(safe-area-inset-bottom);
}
.sheet-m.is-open{transform:translate(-50%,0)}

/* ---------------- 吐司 ---------------- */
.toast-wrap{position:fixed;left:50%;top:22px;transform:translateX(-50%);z-index:990;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}
.toast{
  display:flex;align-items:center;gap:9px;
  background:var(--ink);color:#F4F3EA;padding:11px 18px;border-radius:12px;
  font-size:13.5px;box-shadow:var(--shadow-2);
  animation:toastIn .32s var(--ease) both;max-width:min(90vw,420px);
}
.toast.is-out{animation:toastOut .26s var(--ease) forwards}
.toast--ok{background:#1F4B40}
.toast--err{background:#7E3020}
.toast--warn{background:#6E4B12}
@keyframes toastIn{from{opacity:0;transform:translateY(-10px) scale(.96)}to{opacity:1;transform:none}}
@keyframes toastOut{to{opacity:0;transform:translateY(-8px) scale(.97)}}

/* ---------------- 表格 ---------------- */
.table-wrap{overflow:auto;border-radius:var(--r);border:1px solid var(--line)}
.table{width:100%;border-collapse:collapse;font-size:13px;background:var(--stone-hi)}
.table th{
  text-align:left;font-size:12px;font-weight:600;color:var(--muted);
  padding:11px 14px;background:#EFEEE5;border-bottom:1px solid var(--line);
  white-space:nowrap;position:sticky;top:0;z-index:1;
}
.table td{padding:12px 14px;border-bottom:1px solid var(--line-2);vertical-align:middle;white-space:nowrap}
.table tr:last-child td{border-bottom:0}
.table tbody tr{transition:background .14s}
.table tbody tr:hover{background:#F0EFE6}
.table tbody tr.is-selected{background:#FBF3E1}
.table .cell-strong{font-weight:700}
.table .cell-mono{font-family:var(--ff-num);letter-spacing:.02em}
.table .actions{display:flex;gap:6px;justify-content:flex-end}
.link-btn{color:var(--moss);font-weight:700;font-size:12.5px;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;text-decoration-color:#B7C9B0;cursor:pointer}
.link-btn:hover{color:var(--ink)}
.link-btn--danger{color:var(--rust);text-decoration-color:#DDB4A7}

/* ---------------- 空状态 ---------------- */
.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:54px 20px;text-align:center;color:var(--muted)}
.empty .ico{font-size:34px;color:var(--sage)}
.empty b{font-size:14.5px;color:var(--text)}
.empty p{font-size:13px;max-width:30ch}

/* ---------------- 移动端框架 ---------------- */
.m-body{
  max-width:480px;margin:0 auto;min-height:100vh;position:relative;
  background:var(--stone);overflow-x:hidden;
  box-shadow:0 0 80px rgba(12,31,25,.18);
}
@media (min-width:900px){
  body.m-desktop{background:#0A1B16}
  body.m-desktop::before{
    content:"";position:fixed;inset:0;pointer-events:none;
    background:
      radial-gradient(700px 500px at 20% 0%,rgba(63,107,79,.5),transparent 70%),
      radial-gradient(600px 400px at 85% 100%,rgba(42,110,104,.28),transparent 70%);
  }
}
.m-nav{
  position:sticky;top:0;z-index:50;display:flex;align-items:center;gap:12px;
  height:52px;padding:0 16px;background:rgba(231,230,220,.88);
  backdrop-filter:blur(14px);border-bottom:1px solid rgba(201,204,189,.7);
}
.m-nav--dark{background:rgba(12,31,25,.6);border-color:rgba(255,255,255,.08);color:#F4F3EA}
.m-nav__back{width:32px;height:32px;display:grid;place-items:center;font-size:19px;margin-left:-8px;border-radius:8px}
.m-nav__back:active{background:rgba(0,0,0,.06)}
.m-nav h1{font-size:16px;font-weight:900;letter-spacing:-.02em}
.m-nav .spacer{flex:1}

.m-tabbar{
  position:fixed;left:50%;bottom:calc(10px + env(safe-area-inset-bottom));transform:translateX(-50%);
  width:min(440px,calc(100vw - 28px));z-index:60;
  display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:4px;
  background:rgba(16,34,27,.92);backdrop-filter:blur(18px) saturate(1.25);
  border:1px solid rgba(255,255,255,.10);border-radius:22px;
  box-shadow:0 12px 34px rgba(8,22,16,.38), 0 2px 8px rgba(8,22,16,.22);
  padding:7px;
}
.m-tabbar button{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  height:52px;font-size:10.5px;color:#8FA398;position:relative;
  border-radius:16px;transition:color .18s,background .18s;
}
.m-tabbar .ico{font-size:20px;transition:transform .26s var(--ease)}
.m-tabbar button.is-on{color:#F2E7CE;font-weight:700;background:linear-gradient(160deg,rgba(234,166,59,.20),rgba(234,166,59,.08));box-shadow:inset 0 0 0 1px rgba(234,166,59,.28)}
.m-tabbar button.is-on .ico{transform:translateY(-2px);color:var(--amber)}
.m-tabbar button.is-on::before{
  content:"";position:absolute;top:6px;width:16px;height:2.5px;border-radius:3px;background:var(--amber);
}
.m-tabbar--dark{background:rgba(10,26,20,.94);border-color:rgba(255,255,255,.08)}
.m-tabbar--dark button{color:#7E968A}
.m-tabbar--dark button.is-on{color:#F4F3EA}

.m-main{padding:0 16px 110px}

/* 移动端通用块 */
.m-section{margin-top:22px}
.m-section__head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:11px}
.m-section__head h2{font-size:16.5px}
.m-section__head a,.m-section__head button{font-size:12.5px;color:var(--muted);display:inline-flex;align-items:center;gap:2px}

/* 揭示动画 */
.reveal{opacity:0;transform:translateY(14px)}
.reveal.is-in{opacity:1;transform:none;transition:opacity .6s var(--ease),transform .6s var(--ease)}
.reveal-stagger > *{opacity:0;transform:translateY(12px)}
.reveal-stagger.is-in > *{opacity:1;transform:none;transition:opacity .5s var(--ease),transform .5s var(--ease)}
.reveal-stagger.is-in > *:nth-child(1){transition-delay:.02s}
.reveal-stagger.is-in > *:nth-child(2){transition-delay:.07s}
.reveal-stagger.is-in > *:nth-child(3){transition-delay:.12s}
.reveal-stagger.is-in > *:nth-child(4){transition-delay:.17s}
.reveal-stagger.is-in > *:nth-child(5){transition-delay:.22s}
.reveal-stagger.is-in > *:nth-child(6){transition-delay:.27s}

@media (prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;transition-duration:.001ms!important}
  .reveal,.reveal-stagger > *{opacity:1!important;transform:none!important}
}

/* ---------------- 管理后台框架 ---------------- */
.admin{display:grid;grid-template-columns:238px minmax(0,1fr);min-height:100vh;background:var(--stone)}
.sidebar{
  background:var(--ink);color:#DCE5DB;position:sticky;top:0;height:100vh;
  display:flex;flex-direction:column;overflow:hidden;
}
.sidebar__brand{display:flex;align-items:center;gap:10px;padding:22px 20px 18px;border-bottom:1px solid rgba(255,255,255,.07)}
.sidebar__brand b{font-size:14.5px;letter-spacing:-.01em;color:#F4F3EA;line-height:1.3}
.sidebar__brand span{display:block;font-size:10.5px;color:#6E8B7C;font-weight:400;letter-spacing:.02em}
.sidebar__nav{flex:1;overflow:auto;padding:14px 10px 20px}
.sidebar__group{font-size:10.5px;color:#5C7A6C;padding:14px 12px 6px;letter-spacing:.04em}
.sidebar__nav a{
  display:flex;align-items:center;gap:10px;height:38px;padding:0 12px;border-radius:9px;
  font-size:13.5px;color:#B9C9BC;margin-bottom:2px;position:relative;
  transition:background .16s,color .16s;
}
.sidebar__nav a .ico{font-size:17px;color:#7C9887}
.sidebar__nav a:hover{background:rgba(255,255,255,.06);color:#EDEFE7}
.sidebar__nav a.is-on{background:rgba(234,166,59,.14);color:#FBF6E9;font-weight:700}
.sidebar__nav a.is-on .ico{color:var(--amber)}
.sidebar__nav a.is-on::before{content:"";position:absolute;left:-10px;top:9px;bottom:9px;width:3px;border-radius:0 3px 3px 0;background:var(--amber)}
.sidebar__nav a .badge{margin-left:auto;font-size:10.5px;background:var(--rust);color:#fff;border-radius:20px;padding:1px 6px;font-weight:700}
.sidebar__foot{padding:14px;border-top:1px solid rgba(255,255,255,.07);display:flex;align-items:center;gap:10px}
.avatar{
  width:34px;height:34px;border-radius:50%;background:var(--ink-3);color:#E7E6DC;
  display:grid;place-items:center;font-weight:900;font-size:13px;flex:none;
  border:1px solid rgba(255,255,255,.1);
}
.avatar--amber{background:var(--amber);color:#231503}
.avatar--light{background:var(--stone-mid);color:var(--ink);border-color:var(--line)}

.admin__main{min-width:0;display:flex;flex-direction:column}
.topbar{
  height:64px;display:flex;align-items:center;gap:16px;padding:0 28px;
  background:rgba(246,245,237,.9);backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line);position:sticky;top:0;z-index:40;
}
.topbar h1{font-size:17px;font-weight:900}
.topbar .crumb{font-size:12px;color:var(--muted);margin-top:1px}
.topbar__search{display:flex;align-items:center;gap:8px;height:36px;padding:0 12px;border:1px solid var(--line);border-radius:10px;background:var(--stone-hi);color:var(--muted);width:240px}
.topbar__search input{border:0;background:none;outline:0;width:100%;font-size:13px}
.admin__content{padding:24px 28px 90px;max-width:1560px;width:100%}

.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:18px;flex-wrap:wrap}
.page-head h2{font-size:22px}
.page-head p{font-size:13px;color:var(--muted);margin-top:4px}

/* KPI */
.kpi-grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:14px}
.kpi{
  background:var(--stone-hi);border:1px solid var(--line);border-radius:var(--r);
  padding:16px 18px;position:relative;overflow:hidden;transition:transform .2s var(--ease),box-shadow .2s;
}
.kpi:hover{transform:translateY(-2px);box-shadow:var(--shadow-2)}
.kpi__label{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px}
.kpi__value{font-family:var(--ff-num);font-size:28px;font-weight:700;letter-spacing:-.02em;margin-top:6px;line-height:1.1}
.kpi__value small{font-size:13px;font-weight:500;color:var(--muted);margin-left:3px;letter-spacing:0}
.kpi__delta{font-size:11.5px;margin-top:6px;display:flex;align-items:center;gap:4px;color:var(--moss)}
.kpi__delta.down{color:var(--rust)}
.kpi--accent{background:var(--ink);color:#EFEEE3;border-color:var(--ink)}
.kpi--accent .kpi__label{color:#8FA898}
.kpi--accent .kpi__value{color:#F7D69A}
.kpi--accent .kpi__delta{color:#A9C3AE}

/* 图表 */
.chart-bars{display:flex;align-items:flex-end;gap:14px;height:170px;padding:10px 0 0}
.chart-bars .col-b{flex:1;display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:0}
.chart-bars .pairs{display:flex;gap:4px;align-items:flex-end;height:100%}
.chart-bars .pairs i{flex:1;border-radius:3px 3px 0 0;display:block;transition:height .6s var(--ease);min-height:3px}
.chart-bars .b1{background:var(--moss)}
.chart-bars .b2{background:var(--amber)}
.chart-bars .x{text-align:center;font-size:11px;color:var(--muted);margin-top:8px}
.legend{display:flex;gap:14px;font-size:12px;color:var(--muted)}
.legend em{font-style:normal;display:inline-flex;align-items:center;gap:6px}
.legend i{width:8px;height:8px;border-radius:2px;display:block}

/* 选批工具条 */
.batchbar{
  position:fixed;left:50%;bottom:26px;transform:translate(-50%,120%);
  background:var(--ink);color:#F4F3EA;border-radius:14px;padding:9px 12px 9px 16px;
  display:flex;align-items:center;gap:14px;box-shadow:var(--shadow-3);z-index:80;
  transition:transform .3s var(--ease),opacity .2s;font-size:13px;
  opacity:0;pointer-events:none;visibility:hidden;
}
.batchbar.is-on{transform:translate(-50%,0);opacity:1;pointer-events:auto;visibility:visible}
.batchbar b{color:var(--amber-2);font-family:var(--ff-num)}
.batchbar .btn{height:32px;font-size:12.5px;padding:0 12px;border-radius:9px}
/* 深色条上的幽灵按钮：必须给半透明浅底 + 浅字，否则被 v2 的白底覆盖成「白底白字」 */
.batchbar .btn--ghost{
  background:rgba(255,255,255,.14);
  border-color:rgba(255,255,255,.30);
  color:#F2F1E7;
  font-weight:700;
}
.batchbar .btn--ghost:hover{background:rgba(255,255,255,.24);color:#fff;border-color:rgba(255,255,255,.45)}
.batchbar .btn--ghost:active{background:rgba(255,255,255,.30);color:#fff}
.batchbar .btn--ghost:focus-visible{box-shadow:0 0 0 3px rgba(234,166,59,.55)}

/* 工具条 */
.toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:14px}
.toolbar .input,.toolbar .select{height:38px;font-size:13px;border-radius:10px;width:auto;min-width:130px}

/* 分栏 */
.split{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:16px}
.split-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.panel-h{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}
.panel-h h3{font-size:15px}
.panel-h span{font-size:12px;color:var(--muted)}

/* 响应 */
@media (max-width:1280px){
  .kpi-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .split{grid-template-columns:1fr}
}
@media (max-width:1080px){
  .admin{grid-template-columns:74px minmax(0,1fr)}
  .sidebar__brand span,.sidebar__brand b,.sidebar__nav a span,.sidebar__group{display:none}
  .sidebar__nav a{justify-content:center;padding:0}
  .sidebar__foot .col{display:none}
  .sidebar__nav a.is-on::before{left:-10px}
}
@media (max-width:900px){
  .admin{grid-template-columns:1fr}
  .sidebar{position:fixed;left:0;top:0;bottom:0;width:238px;transform:translateX(-100%);transition:transform .3s var(--ease);z-index:200}
  .sidebar.is-open{transform:none}
  .sidebar.is-open .sidebar__brand b,.sidebar.is-open .sidebar__brand span,.sidebar.is-open .sidebar__nav a span,.sidebar.is-open .sidebar__nav a{display:revert}
  .sidebar.is-open .sidebar__nav a{justify-content:flex-start;padding:0 12px}
  .admin__content{padding:16px 14px 90px}
  .topbar{padding:0 14px;height:58px}
  .topbar__search{width:auto;flex:1}
  .kpi-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .split-2{grid-template-columns:1fr}
  .container{padding:0 16px}
}

/* ===========================================================
   v2 设计系统升级 · Design System v2
   原则：一个圆角体系 / 一个字重阶梯 / 一种按压反馈 /
        一套语义色 / 统一动效曲线（大厂级一致性）
   =========================================================== */
:root{
  /* 品牌色阶（补全） */
  --moss-600:#35603F;
  --moss-700:#28492F;
  --amber-600:#D8922A;
  --amber-hi:#F2B455;

  /* 语义色 */
  --success:#2F7D5B;   --success-bg:#E2EFEA;
  --warning:#8A5A12;   --warning-bg:#FAEED5;
  --danger:#B94A2E;    --danger-bg:#F6E3DC;

  /* 焦点与动效令牌 */
  --focus-ring:0 0 0 3px rgba(234,166,59,.38);
  --focus-ring-moss:0 0 0 3px rgba(63,107,79,.16);
  --ease-out:cubic-bezier(.2,.7,.3,1);
  --ease-spring:cubic-bezier(.34,1.35,.44,1);
  --t-fast:140ms;
  --t-med:220ms;
  --t-slow:320ms;

  /* 统一阴影（冷绿色调） */
  --shadow-sm:0 1px 2px rgba(12,31,25,.05),0 2px 8px -2px rgba(12,31,25,.07);
  --shadow-md:0 2px 4px rgba(12,31,25,.05),0 12px 28px -14px rgba(12,31,25,.28);
  --shadow-lg:0 4px 8px rgba(12,31,25,.06),0 28px 56px -24px rgba(12,31,25,.4);
}

/* ---------- 全局排版 ---------- */
body{letter-spacing:.001em}
h1,h2,h3,h4{font-weight:800}
h1{letter-spacing:-.028em}
b{font-weight:700}
.tiny{font-size:11.5px;font-weight:500;letter-spacing:.01em}
.muted{color:var(--muted)}
.num{font-feature-settings:"tnum" 1}

/* ---------- 图标统一：1.8 线宽 / 一致光学尺寸 ---------- */
.ico{stroke-width:1.8}
.ico{vertical-align:-.16em}

/* ---------- 按钮系统 v2 ---------- */
.btn{
  border-radius:13px;font-weight:800;letter-spacing:.02em;
  transition:transform var(--t-fast) var(--ease-out),filter var(--t-fast),
             background var(--t-med),box-shadow var(--t-med),color var(--t-med);
}
.btn:active{transform:scale(.96);filter:brightness(.94)}
.btn:focus{outline:0}
.btn:focus-visible{box-shadow:var(--focus-ring);outline:0}
.btn--primary{
  background:linear-gradient(180deg,var(--amber-hi),var(--amber) 88%);
  color:#231503;
  box-shadow:0 10px 22px -10px rgba(234,166,59,.9),inset 0 1px 0 rgba(255,255,255,.4);
}
.btn--primary:hover{background:linear-gradient(180deg,#F6BC63,#EFAC41 88%)}
.btn--dark{
  background:linear-gradient(180deg,var(--ink-3),var(--ink) 90%);
  color:#F4F3EA;
  box-shadow:0 10px 22px -12px rgba(12,31,25,.75),inset 0 1px 0 rgba(255,255,255,.09);
}
.btn--dark:hover{background:linear-gradient(180deg,var(--ink-4),var(--ink-2) 90%)}
.btn--ghost{border-color:var(--line);background:var(--stone-hi)}
.btn--ghost:hover{border-color:var(--sage);background:var(--stone-hi)}
.btn--soft{background:var(--stone-mid);font-weight:700}
.btn--sm{height:36px;border-radius:10px}
.btn--xs{height:28px;border-radius:8px}
.btn--block{border-radius:14px}
.btn--danger:hover{background:var(--danger-bg)}

/* ---------- 输入控件 v2（filled 风格 + 双层焦点） ---------- */
.input,.select,.textarea{border-radius:12px;background:var(--stone-hi);border-color:var(--line)}
.input:hover,.select:hover,.textarea:hover{border-color:var(--sage)}
.input:focus,.select:focus,.textarea:focus{
  border-color:var(--moss);
  box-shadow:var(--focus-ring-moss);
  background:#fff;
}
.field > label{font-weight:600;letter-spacing:.015em}
.select{transition:border-color var(--t-fast),box-shadow var(--t-fast),background var(--t-fast)}

/* ---------- 分段控件 v2（白 thumb 浮起） ---------- */
.seg{padding:3px;border-radius:13px;background:var(--stone-mid)}
.seg button{height:36px;border-radius:10px;font-weight:600}
.seg button.is-on{
  background:#fff;color:var(--text);font-weight:800;
  box-shadow:0 2px 6px rgba(12,31,25,.16),0 0 0 .5px rgba(12,31,25,.04);
}

/* ---------- Chips / 标签 v2 ---------- */
.chip{height:34px;border-radius:18px;background:var(--stone-hi);font-weight:600;transition:transform var(--t-fast) var(--ease-out),background var(--t-med),color var(--t-med),border-color var(--t-med)}
.chip:active{transform:scale(.95)}
.chip.is-on{background:var(--ink);color:#F4F3EA;box-shadow:0 6px 14px -8px rgba(12,31,25,.55)}
.tag{font-weight:700;border-radius:999px}
.tag i{box-shadow:0 0 0 2px rgba(255,255,255,.55)}

/* ---------- 卡片 v2 ---------- */
.card{box-shadow:var(--shadow-sm)}
.card--pad{padding:18px 18px}
@media (hover:hover) and (min-width:900px){
  .kpi{transition:transform var(--t-med) var(--ease-out),box-shadow var(--t-med)}
}
.divider{background:linear-gradient(90deg,var(--line-2),transparent 4%,var(--line-2))}

/* ---------- 弹层 v2（弹簧曲线 + 提手） ---------- */
.modal{box-shadow:var(--shadow-lg);border:1px solid rgba(255,255,255,.5)}
.modal{transition:opacity var(--t-med) ease,transform var(--t-slow) var(--ease-spring)}
.sheet-m{
  border-radius:24px 24px 0 0;box-shadow:var(--shadow-lg);
  transition:transform var(--t-slow) var(--ease-spring);
}
.sheet-m::before{
  content:"";position:sticky;top:8px;z-index:5;display:block;
  width:38px;height:4px;border-radius:4px;background:var(--stone-lo);
  margin:2px auto 2px;pointer-events:none;
}

/* ---------- Toast v2（胶囊 + 毛玻璃） ---------- */
.toast{
  border-radius:999px;padding:10px 20px;font-weight:600;
  backdrop-filter:blur(10px);box-shadow:var(--shadow-md);
}
.toast .ico{font-size:15px}
.toast--loading{padding-left:16px}
.toast .spinner{
  width:15px;height:15px;flex:none;border-radius:50%;
  border:2px solid rgba(255,255,255,.28);border-top-color:var(--amber-hi);
  animation:spin .7s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- 底部导航 v2 ---------- */
.m-tabbar button{font-size:10.5px;font-weight:500}
.m-tabbar button.is-on .ico{transform:translateY(-2px) scale(1.05)}
.m-tabbar button:active .ico{transform:scale(.88)}

/* ---------- 管理后台 v2 ---------- */
.sidebar__group{
  color:#7E9B8B;text-transform:uppercase;letter-spacing:.14em;font-weight:700;font-size:10px;
}
.sidebar__nav a{border-radius:10px;font-weight:500}
.sidebar__nav a.is-on{box-shadow:inset 0 0 0 1px rgba(234,166,59,.16)}
.topbar{gap:12px}
.topbar .crumb{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:44vw}
.topbar h1{white-space:nowrap}
@media (max-width:900px){
  .topbar .crumb{display:none}
  .topbar h1{font-size:16px}
}
.table th{font-weight:700;letter-spacing:.03em}
.table tbody tr:hover{background:#F2F1E8}

/* ---------- 骨架屏 ---------- */
.skeleton{position:relative;overflow:hidden;background:var(--stone-mid);border-radius:9px;min-height:1em}
.skeleton::after{
  content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.65),transparent);
  animation:sk 1.4s infinite;
}
@keyframes sk{to{transform:translateX(100%)}}

/* ---------- 空状态 v2 ---------- */
.empty .ico{opacity:.75}

/* ---------- 滚动条（桌面） ---------- */
@media (min-width:900px){
  ::-webkit-scrollbar{width:10px;height:10px}
  ::-webkit-scrollbar-thumb{background:var(--stone-lo);border-radius:8px;border:2px solid var(--stone-hi)}
  ::-webkit-scrollbar-thumb:hover{background:var(--sage)}
  ::-webkit-scrollbar-track{background:transparent}
}

/* ---------- 通用微互动 ---------- */
.pressable{transition:transform var(--t-fast) var(--ease-out)}
.pressable:active{transform:scale(.97)}
a.link-btn,.link-btn{transition:color var(--t-fast)}
.m-nav__back{transition:background var(--t-fast)}
.fade-in{animation:fadeIn var(--t-med) var(--ease-out) both}
@keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* ---------- 后台移动端抽屉导航 ---------- */
.sidebar-scrim{
  position:fixed;inset:0;background:rgba(8,22,17,.46);
  opacity:0;transition:opacity .26s var(--ease);z-index:190;
  backdrop-filter:blur(2px);
}
.sidebar-scrim.is-on{opacity:1}
body.nav-locked{overflow:hidden}

@media (max-width:900px){
  .sidebar{
    box-shadow:0 24px 60px -20px rgba(8,22,17,.6);
    padding-top:env(safe-area-inset-top);
    padding-bottom:env(safe-area-inset-bottom);
  }
  /* 抽屉展开时恢复被 1080px 规则隐藏的文案，避免“只有鼠标悬停才看得见” */
  .sidebar.is-open .sidebar__brand b,
  .sidebar.is-open .sidebar__brand span{display:block}
  .sidebar.is-open .sidebar__group{display:block}
  .sidebar.is-open .sidebar__nav a{display:flex;justify-content:flex-start;padding:0 12px}
  .sidebar.is-open .sidebar__nav a span{display:inline}
  .sidebar.is-open .sidebar__foot .col{display:flex}
  .sidebar.is-open .sidebar__foot{display:flex}
}

@media (prefers-reduced-motion:reduce){
  .skeleton::after{animation:none}
  .toast .spinner{animation-duration:1.6s}
}
