/* ==========================================================================
   NavHub Admin — 与前台同源的 Midnight Ledger 体系
   ========================================================================== */

:root {
  --ink-900:#0b0e13; --ink-850:#0e1116; --ink-800:#12161d; --ink-750:#161b23;
  --ink-700:#1b212a; --ink-600:#232a35; --ink-500:#2e3644; --ink-400:#3b4454;
  --paper:#e8e4dc; --paper-2:#b8b3aa; --paper-3:#7f8288; --paper-4:#5a5e66;
  --accent:#d8a25c; --jade:#5fb3a8; --rose:#c9737a; --sky:#7c9cd1;
  --accent-soft:rgba(216,162,92,.14);
  --accent-line:rgba(216,162,92,.34);
  --r-sm:6px; --r:10px; --r-lg:16px;
  --sh-2:0 6px 24px -8px rgba(0,0,0,.6);
  --sh-3:0 24px 60px -20px rgba(0,0,0,.75);
  --serif:"Iowan Old Style","Palatino Linotype",Palatino,"Songti SC","Source Han Serif SC",Georgia,serif;
  --sans:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  --mono:"SF Mono","JetBrains Mono","Cascadia Code",Consolas,monospace;
  --ease:cubic-bezier(.22,.61,.36,1);
  --side:236px;
}
* { box-sizing:border-box; }
body {
  margin:0; background:var(--ink-850); color:var(--paper);
  font-family:var(--sans); font-size:15px; line-height:1.6;
  -webkit-font-smoothing:antialiased; text-wrap:pretty;
}
a { color:inherit; text-decoration:none; }
button,input,select,textarea { font:inherit; color:inherit; }
::selection { background:var(--accent-line); color:#fff; }
:focus-visible { outline:2px solid var(--accent); outline-offset:2px; border-radius:3px; }

/* ------------------------------------------------------------------ 登录 */

.login-wrap {
  min-height:100vh; display:grid; place-items:center; padding:32px;
  background:
    radial-gradient(70% 60% at 50% 0%, rgba(216,162,92,.09), transparent 70%),
    var(--ink-850);
}
.login {
  width:100%; max-width:392px;
  background:var(--ink-800); border:1px solid var(--ink-600);
  border-radius:var(--r-lg); padding:36px 32px 30px; box-shadow:var(--sh-3);
  animation:rise .4s var(--ease) both;
}
.login__mark {
  width:46px; height:46px; border-radius:var(--r); display:grid; place-items:center;
  font-family:var(--serif); font-size:24px; color:var(--ink-900);
  background:linear-gradient(150deg,var(--accent),#b8823c); margin-bottom:22px;
}
.login h1 { font-family:var(--serif); font-weight:500; font-size:25px; margin:0 0 6px; letter-spacing:-.01em; }
.login p.hint { color:var(--paper-3); font-size:13.5px; margin:0 0 26px; }

@keyframes rise { from{opacity:0;transform:translateY(10px)} to{opacity:1;transform:none} }

/* ------------------------------------------------------------------ 表单 */

.field { margin-bottom:18px; }
.field > label {
  display:block; margin-bottom:7px;
  font-size:12.5px; font-weight:500; letter-spacing:.05em;
  text-transform:uppercase; color:var(--paper-3);
}
.input, .select, .textarea {
  width:100%; padding:11px 13px;
  background:var(--ink-850); border:1px solid var(--ink-600);
  border-radius:var(--r-sm); color:var(--paper);
  transition:border-color .18s var(--ease), box-shadow .18s var(--ease);
}
.input::placeholder, .textarea::placeholder { color:var(--paper-4); }
.input:hover, .select:hover, .textarea:hover { border-color:var(--ink-500); }
.input:focus, .select:focus, .textarea:focus {
  outline:none; border-color:var(--accent-line); box-shadow:0 0 0 3px var(--accent-soft);
}
.textarea { resize:vertical; min-height:78px; line-height:1.55; }
.select {
  appearance:none; cursor:pointer; padding-right:36px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%237f8288' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:right 12px center;
}
.hint-sm { font-size:12.5px; color:var(--paper-4); margin:6px 0 0; }

.btn {
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  padding:10px 18px; border-radius:var(--r-sm); border:1px solid transparent;
  background:var(--accent); color:#14100a; font-weight:600; font-size:14.5px;
  cursor:pointer; white-space:nowrap;
  transition:filter .18s var(--ease), transform .12s var(--ease), background .18s var(--ease), border-color .18s var(--ease);
}
.btn:hover { filter:brightness(1.08); }
.btn:active { transform:translateY(1px); }
.btn--ghost { background:transparent; border-color:var(--ink-500); color:var(--paper-2); font-weight:500; }
.btn--ghost:hover { border-color:var(--accent-line); color:var(--accent); background:var(--accent-soft); filter:none; }
.btn--danger { background:transparent; border-color:rgba(201,115,122,.4); color:var(--rose); }
.btn--danger:hover { background:rgba(201,115,122,.12); border-color:var(--rose); filter:none; }
.btn--block { width:100%; }
.btn--sm { padding:7px 12px; font-size:13px; }
.btn svg { width:15px; height:15px; }

/* ------------------------------------------------------------------ 布局 */

.app { display:grid; grid-template-columns:var(--side) minmax(0,1fr); min-height:100vh; }

.side {
  position:sticky; top:0; align-self:start; height:100vh;
  background:var(--ink-900); border-right:1px solid var(--ink-700);
  display:flex; flex-direction:column; padding:22px 14px;
  overflow-y:auto;
}
.side__brand { display:flex; align-items:center; gap:11px; padding:0 8px 20px; border-bottom:1px solid var(--ink-700); margin-bottom:16px; }
.side__mark {
  width:34px; height:34px; border-radius:9px; display:grid; place-items:center;
  font-family:var(--serif); font-size:17px; color:var(--ink-900);
  background:linear-gradient(150deg,var(--accent),#b8823c); flex:none;
}
.side__name { font-family:var(--serif); font-size:17px; font-weight:500; line-height:1.2; }
.side__sub { font-family:var(--mono); font-size:10.5px; color:var(--paper-4); letter-spacing:.06em; }

.nav { display:flex; flex-direction:column; gap:2px; }
.nav__label {
  font-size:11px; letter-spacing:.08em; text-transform:uppercase;
  color:var(--paper-4); padding:14px 10px 6px;
}
.nav a {
  display:flex; align-items:center; gap:11px;
  padding:9px 11px; border-radius:var(--r-sm);
  color:var(--paper-2); font-size:14.5px;
  transition:background .16s var(--ease), color .16s var(--ease);
}
.nav a svg { width:17px; height:17px; flex:none; opacity:.8; }
.nav a:hover { background:var(--ink-800); color:var(--paper); }
.nav a.is-active { background:var(--ink-750); color:var(--accent); }
.nav a.is-active svg { opacity:1; }
.nav a .pill {
  margin-left:auto; font-family:var(--mono); font-size:11px;
  color:var(--paper-4); background:var(--ink-800); padding:1px 7px; border-radius:999px;
}
.nav a.is-active .pill { background:var(--accent-soft); color:var(--accent); }
.side__foot { margin-top:auto; padding-top:16px; border-top:1px solid var(--ink-700); display:flex; flex-direction:column; gap:2px; }

.main { min-width:0; padding:30px clamp(20px,3.2vw,42px) 80px; }
.page-head {
  display:flex; align-items:flex-end; justify-content:space-between;
  gap:20px; flex-wrap:wrap; margin-bottom:26px;
  padding-bottom:20px; border-bottom:1px solid var(--ink-700);
}
.page-head h1 { font-family:var(--serif); font-weight:500; font-size:27px; margin:0 0 4px; letter-spacing:-.01em; }
.page-head p { margin:0; color:var(--paper-3); font-size:14px; }
.page-head__actions { display:flex; gap:10px; flex-wrap:wrap; }

.card-panel {
  background:var(--ink-800); border:1px solid var(--ink-700);
  border-radius:var(--r-lg); padding:22px; margin-bottom:20px;
}
.card-panel > h2 {
  font-family:var(--serif); font-weight:500; font-size:18px;
  margin:0 0 4px;
}
.card-panel > .sub { color:var(--paper-3); font-size:13.5px; margin:0 0 20px; }

/* ------------------------------------------------------------------ 统计 */

.stats { display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:12px; margin-bottom:20px; }
.stat {
  background:var(--ink-800); border:1px solid var(--ink-700);
  border-radius:var(--r); padding:18px 20px; position:relative; overflow:hidden;
  transition:border-color .2s var(--ease), transform .2s var(--ease);
}
.stat:hover { border-color:var(--ink-500); transform:translateY(-2px); }
.stat::after {
  content:""; position:absolute; inset:auto -20% -60% auto; width:140px; height:140px;
  background:radial-gradient(circle, var(--tint,rgba(216,162,92,.16)), transparent 70%);
}
.stat__n {
  font-family:var(--serif); font-size:32px; line-height:1.1; margin:0 0 4px;
  letter-spacing:-.02em;
}
.stat__k { font-size:12.5px; color:var(--paper-3); letter-spacing:.04em; }
.stat--a { --tint:rgba(216,162,92,.18); } .stat--a .stat__n { color:var(--accent); }
.stat--j { --tint:rgba(95,179,168,.18); }  .stat--j .stat__n { color:var(--jade); }
.stat--s { --tint:rgba(124,156,209,.18); } .stat--s .stat__n { color:var(--sky); }
.stat--r { --tint:rgba(201,115,122,.18); } .stat--r .stat__n { color:var(--rose); }

.cols-2 { display:grid; grid-template-columns:1.15fr .85fr; gap:20px; align-items:start; }

/* ------------------------------------------------------------------ 表格 */

.table-wrap { overflow-x:auto; margin:0 -6px; padding:0 6px; }
table.tbl { width:100%; border-collapse:collapse; font-size:14px; }
.tbl th {
  text-align:left; font-size:11.5px; font-weight:600; letter-spacing:.07em;
  text-transform:uppercase; color:var(--paper-4);
  padding:0 12px 10px; white-space:nowrap; border-bottom:1px solid var(--ink-700);
}
.tbl td { padding:11px 12px; border-bottom:1px solid var(--ink-750); vertical-align:middle; }
.tbl tr:last-child td { border-bottom:0; }
.tbl tbody tr { transition:background .14s var(--ease); }
.tbl tbody tr:hover { background:var(--ink-750); }
.tbl tbody tr.is-hidden td { opacity:.45; }
.tbl .num { font-family:var(--mono); font-size:12.5px; color:var(--paper-3); text-align:right; }
.tbl .act { display:flex; gap:6px; justify-content:flex-end; }

.grip {
  width:26px; height:26px; display:grid; place-items:center; cursor:grab;
  color:var(--paper-4); border-radius:4px; flex:none;
  transition:color .16s var(--ease), background .16s var(--ease);
}
.grip:hover { color:var(--paper-2); background:var(--ink-700); }
.grip:active { cursor:grabbing; }
.grip svg { width:15px; height:15px; }

.icon-cell {
  width:32px; height:32px; border-radius:8px; flex:none; display:grid; place-items:center;
  font-family:var(--serif); font-size:15px; color:var(--ink-900); background:var(--c,var(--paper-4));
  overflow:hidden;
}
.icon-cell img { width:100%; height:100%; object-fit:cover; }

.sname { display:flex; align-items:center; gap:11px; min-width:0; }
.sname__t { min-width:0; }
.sname__n { font-weight:500; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sname__u { font-family:var(--mono); font-size:11.5px; color:var(--paper-4); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:32ch; }

.tag {
  display:inline-flex; align-items:center; gap:6px;
  padding:3px 9px; border-radius:999px; font-size:12px;
  background:color-mix(in srgb, var(--c) 15%, transparent);
  color:var(--c); border:1px solid color-mix(in srgb, var(--c) 30%, transparent);
  white-space:nowrap;
}
.tag--muted { background:var(--ink-700); color:var(--paper-3); border-color:var(--ink-600); }

.iconbtn {
  width:30px; height:30px; display:grid; place-items:center;
  border-radius:var(--r-sm); border:1px solid var(--ink-600); background:transparent;
  color:var(--paper-3); cursor:pointer;
  transition:border-color .16s var(--ease), color .16s var(--ease), background .16s var(--ease);
}
.iconbtn svg { width:15px; height:15px; }
.iconbtn:hover { border-color:var(--accent-line); color:var(--accent); background:var(--accent-soft); }
.iconbtn.is-on { color:var(--accent); border-color:var(--accent-line); background:var(--accent-soft); }
.iconbtn--danger:hover { border-color:rgba(201,115,122,.5); color:var(--rose); background:rgba(201,115,122,.12); }

.drag-over td { box-shadow:inset 0 2px 0 var(--accent); }

/* ------------------------------------------------------------------ 工具条 */

.filters-bar { display:flex; gap:12px; flex-wrap:wrap; align-items:center; margin-bottom:18px; }
.search-mini { position:relative; flex:1 1 240px; min-width:200px; }
.search-mini svg { position:absolute; left:12px; top:50%; transform:translateY(-50%); width:15px; height:15px; color:var(--paper-4); }
.search-mini .input { padding-left:36px; }

.empty-row { padding:56px 20px; text-align:center; color:var(--paper-3); }
.empty-row h3 { font-family:var(--serif); font-weight:500; font-size:19px; color:var(--paper-2); margin:0 0 6px; }
.empty-row p { margin:0 0 18px; font-size:14px; }

/* ------------------------------------------------------------------ 弹窗 */

.modal {
  position:fixed; inset:0; z-index:100;
  display:none; align-items:center; justify-content:center; padding:24px;
  background:rgba(6,8,11,.72); backdrop-filter:blur(6px);
}
.modal.is-open { display:flex; animation:fade .2s var(--ease); }
@keyframes fade { from{opacity:0} to{opacity:1} }
.modal__box {
  width:100%; max-width:520px; max-height:88vh; overflow-y:auto;
  background:var(--ink-800); border:1px solid var(--ink-600);
  border-radius:var(--r-lg); box-shadow:var(--sh-3);
  animation:rise .26s var(--ease) both;
}
.modal__head {
  display:flex; align-items:center; justify-content:space-between; gap:16px;
  padding:20px 22px 16px; border-bottom:1px solid var(--ink-700);
  position:sticky; top:0; background:var(--ink-800); z-index:1;
}
.modal__head h2 { font-family:var(--serif); font-weight:500; font-size:19px; margin:0; }
.modal__body { padding:20px 22px; }
.modal__foot {
  display:flex; justify-content:flex-end; gap:10px;
  padding:16px 22px 20px; border-top:1px solid var(--ink-700);
  position:sticky; bottom:0; background:var(--ink-800);
}
.row-2 { display:grid; grid-template-columns:1fr 1fr; gap:14px; }
.x-btn { width:30px; height:30px; display:grid; place-items:center; border-radius:var(--r-sm); border:1px solid var(--ink-600); background:transparent; color:var(--paper-3); cursor:pointer; }
.x-btn:hover { border-color:var(--rose); color:var(--rose); }

/* 色板 */
.swatches { display:flex; gap:8px; flex-wrap:wrap; }
.swatch {
  width:28px; height:28px; border-radius:8px; border:2px solid transparent;
  cursor:pointer; padding:0; position:relative;
  transition:transform .14s var(--ease), border-color .14s var(--ease);
}
.swatch:hover { transform:scale(1.12); }
.swatch.is-on { border-color:var(--paper); }

/* 开关 */
.switch { display:flex; align-items:center; gap:10px; cursor:pointer; user-select:none; }
.switch input { position:absolute; opacity:0; pointer-events:none; }
.switch__track {
  width:38px; height:22px; border-radius:999px; background:var(--ink-600);
  position:relative; transition:background .2s var(--ease); flex:none;
}
.switch__track::after {
  content:""; position:absolute; top:3px; left:3px; width:16px; height:16px;
  border-radius:50%; background:var(--paper-2);
  transition:transform .2s var(--ease), background .2s var(--ease);
}
.switch input:checked + .switch__track { background:var(--accent-line); }
.switch input:checked + .switch__track::after { transform:translateX(16px); background:var(--accent); }
.switch input:focus-visible + .switch__track { outline:2px solid var(--accent); outline-offset:2px; }
.switch__label { font-size:14.5px; }

/* Toast */
.toasts { position:fixed; right:22px; bottom:22px; z-index:200; display:flex; flex-direction:column; gap:10px; }
.toast {
  display:flex; align-items:center; gap:10px;
  padding:12px 16px; border-radius:var(--r);
  background:var(--ink-750); border:1px solid var(--ink-500);
  box-shadow:var(--sh-2); font-size:14px; max-width:340px;
  animation:slide .3s var(--ease) both;
}
.toast svg { width:16px; height:16px; flex:none; }
.toast--ok { border-color:rgba(95,179,168,.45); } .toast--ok svg { color:var(--jade); }
.toast--err { border-color:rgba(201,115,122,.45); } .toast--err svg { color:var(--rose); }
@keyframes slide { from{opacity:0;transform:translateX(24px)} to{opacity:1;transform:none} }

.muted { color:var(--paper-3); }
.mono { font-family:var(--mono); }
.bar-list { display:flex; flex-direction:column; gap:13px; }
.bar-item__top { display:flex; align-items:center; gap:10px; font-size:13.5px; margin-bottom:6px; }
.bar-item__n { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.bar-item__v { margin-left:auto; font-family:var(--mono); font-size:12px; color:var(--paper-3); flex:none; }
.bar { height:5px; border-radius:3px; background:var(--ink-700); overflow:hidden; }
.bar > i { display:block; height:100%; border-radius:3px; background:linear-gradient(90deg,var(--accent),#b8823c); }

/* ------------------------------------------------------------------ 响应式 */

.menu-btn { display:none; }
@media (max-width: 1080px) {
  .stats { grid-template-columns:repeat(2,minmax(0,1fr)); }
  .cols-2 { grid-template-columns:1fr; }
}
@media (max-width: 860px) {
  .app { grid-template-columns:1fr; }
  .side {
    position:fixed; z-index:90; left:0; top:0; width:270px;
    transform:translateX(-100%); transition:transform .26s var(--ease);
    box-shadow:var(--sh-3);
  }
  .side.is-open { transform:none; }
  .menu-btn { display:inline-flex; }
  .scrim { position:fixed; inset:0; background:rgba(6,8,11,.6); z-index:80; display:none; }
  .scrim.is-on { display:block; }
}
@media (max-width: 560px) {
  .stats { grid-template-columns:1fr; }
  .row-2 { grid-template-columns:1fr; }
  .main { padding:22px 16px 64px; }
  .sname__u { max-width:18ch; }
}
@media (prefers-reduced-motion: reduce) {
  *,*::before,*::after { animation-duration:.01ms !important; transition-duration:.01ms !important; }
}
