/* Orion Gate V3 Dashboard - Base Style */
*{margin:0;padding:0;box-sizing:border-box;}
:root{
  --bg:#0d1117;--bg2:#161b22;--bg3:#21262d;--bg4:#2d333b;
  --border:#30363d;--text:#c9d1d9;--sub:#8b949e;--dim:#6e7681;
  --blue:#58a6ff;--green:#3fb950;--orange:#f0883e;
  --purple:#a371f7;--red:#f85149;--yellow:#d29922;--cyan:#39c5cf;
}
body{background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;font-size:13px;line-height:1.5;min-height:100vh;}
a{color:var(--blue);text-decoration:none;}a:hover{text-decoration:underline;}
code,pre,.mono{font-family:'SF Mono','Fira Code',Consolas,monospace;}

/* ── Layout ─────────────────────────────────────── */
.layout{display:flex;min-height:100vh;}
.sidebar{
  width:220px;min-height:100vh;background:var(--bg2);
  border-right:1px solid var(--border);display:flex;
  flex-direction:column;position:fixed;top:0;left:0;bottom:0;z-index:50;
  transition:width .2s;
}
.sidebar.collapsed{width:52px;}
.main{margin-left:220px;flex:1;display:flex;flex-direction:column;min-height:100vh;transition:margin-left .2s;}
.sidebar.collapsed ~ .main{margin-left:52px;}

/* ── Sidebar ────────────────────────────────────── */
.sb-logo{
  display:flex;align-items:center;gap:10px;padding:14px 16px;
  border-bottom:1px solid var(--border);min-height:52px;
}
.sb-logo-icon{
  width:28px;height:28px;border-radius:6px;flex-shrink:0;
  background:linear-gradient(135deg,#1f4d6e,#0d3a52);
  display:flex;align-items:center;justify-content:center;font-size:14px;
}
.sb-logo-text{font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;}
.sb-logo-version{font-size:10px;color:var(--sub);}
.sb-collapse-btn{
  margin-left:auto;width:22px;height:22px;border:1px solid var(--border);
  border-radius:4px;background:none;color:var(--sub);cursor:pointer;
  display:flex;align-items:center;justify-content:center;font-size:12px;
  flex-shrink:0;transition:color .15s;
}
.sb-collapse-btn:hover{color:var(--text);}

.sb-nav{flex:1;overflow-y:auto;padding:8px 6px;}
.sb-nav-item{text-decoration:none;
  display:flex;align-items:center;gap:10px;padding:8px 10px;
  border-radius:6px;cursor:pointer;color:var(--sub);
  transition:background .1s,color .1s;white-space:nowrap;overflow:hidden;
  margin-bottom:1px;font-size:12px;font-weight:500;
}
.sb-nav-item:hover{background:var(--bg3);color:var(--text);text-decoration:none;}
.sb-nav-item.active{background:#1c2a3a;color:var(--blue);}
.sb-nav-icon{font-size:15px;flex-shrink:0;width:18px;text-align:center;}
.sb-nav-label{overflow:hidden;white-space:nowrap;}
.sidebar.collapsed .sb-nav-label,.sidebar.collapsed .sb-logo-text,.sidebar.collapsed .sb-logo-version{display:none;}
.sidebar.collapsed .sb-collapse-btn{margin-left:0;}

.sb-user{
  padding:10px 12px;border-top:1px solid var(--border);
  display:flex;align-items:center;gap:8px;
}
.sb-avatar{
  width:28px;height:28px;border-radius:50%;background:var(--bg4);
  display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:700;color:var(--blue);flex-shrink:0;
}
.sb-user-info{overflow:hidden;flex:1;}
.sb-user-name{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.sb-user-role{font-size:10px;color:var(--sub);}
.sb-logout{
  color:var(--sub);background:none;border:none;cursor:pointer;
  font-size:13px;padding:4px;border-radius:4px;transition:color .15s;flex-shrink:0;
}
.sb-logout:hover{color:var(--red);}
.sidebar.collapsed .sb-user-info,.sidebar.collapsed .sb-logout{display:none;}

/* ── Topbar ─────────────────────────────────────── */
.topbar{
  height:52px;border-bottom:1px solid var(--border);
  background:var(--bg2);display:flex;align-items:center;
  padding:0 24px;gap:12px;position:sticky;top:0;z-index:40;
}
.topbar-title{font-size:14px;font-weight:600;flex:1;}
.topbar-badge{
  font-size:10px;padding:2px 8px;border-radius:10px;
  background:#0d2413;color:var(--green);border:1px solid #1a4a20;
}

/* ── Page ───────────────────────────────────────── */
.page{padding:24px;flex:1;}
.page-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;}
.page-title{font-size:17px;font-weight:700;}
.page-sub{font-size:12px;color:var(--sub);margin-top:2px;}

/* ── Card ───────────────────────────────────────── */
.card{background:var(--bg2);border:1px solid var(--border);border-radius:8px;}
.card-head{padding:12px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;}
.card-title{font-size:13px;font-weight:600;}
.card-body{padding:16px;}

/* ── Stats Grid ─────────────────────────────────── */
.stats-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px;margin-bottom:20px;}
.stat-card{
  background:var(--bg2);border:1px solid var(--border);
  border-radius:8px;padding:14px 16px;
}
.stat-label{font-size:11px;color:var(--sub);margin-bottom:6px;}
.stat-value{font-size:24px;font-weight:700;line-height:1;}
.stat-sub{font-size:10px;color:var(--dim);margin-top:4px;}

/* ── Table ──────────────────────────────────────── */
.table-wrap{border-radius:8px;border:1px solid var(--border);overflow-x:auto;overflow-y:hidden;}
table{width:100%;border-collapse:collapse;font-size:12px;}
thead tr{background:var(--bg3);}
th{padding:10px 14px;text-align:left;font-size:11px;font-weight:600;color:var(--sub);white-space:nowrap;}
td{padding:10px 14px;border-top:1px solid var(--border);vertical-align:middle;}
tr:hover td{background:rgba(255,255,255,.025);}
.td-mono{font-family:'SF Mono',Consolas,monospace;font-size:11px;}
.td-dim{color:var(--sub);}
.td-link{color:var(--blue);font-weight:600;cursor:pointer;}
.td-link:hover{text-decoration:underline;}

/* ── Badge ──────────────────────────────────────── */
.badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:10px;font-size:10px;font-weight:600;border:1px solid;white-space:nowrap;}
.bg{color:var(--green);background:#0d2413;border-color:#1a4a20;}
.br{color:var(--red);background:#2d0808;border-color:#5a1515;}
.by{color:var(--yellow);background:#2d1f00;border-color:#5a3e00;}
.bb{color:var(--blue);background:#0d2433;border-color:#1f6e8c;}
.bp{color:var(--purple);background:#1f1535;border-color:#3d2a6e;}
.bgr{color:var(--sub);background:var(--bg3);border-color:var(--border);}
.bc{color:var(--cyan);background:#0d2433;border-color:#1a5a5e;}

/* ── Forms ──────────────────────────────────────── */
.form-group{margin-bottom:14px;}
.form-label{display:block;font-size:11px;font-weight:600;color:var(--sub);margin-bottom:5px;text-transform:uppercase;letter-spacing:.04em;}
.input,.select,.textarea{
  width:100%;background:var(--bg);border:1px solid var(--border);
  border-radius:6px;padding:8px 12px;color:var(--text);
  font-size:12px;font-family:inherit;outline:none;transition:border-color .15s;
}
.input:focus,.select:focus,.textarea:focus{border-color:var(--blue);}
.input::placeholder{color:var(--dim);}
.textarea{resize:vertical;min-height:80px;}
.form-grid{display:grid;gap:12px;}
.form-grid.col2{grid-template-columns:1fr 1fr;}
.form-grid.col3{grid-template-columns:1fr 1fr 1fr;}

/* ── Buttons ────────────────────────────────────── */
.btn{
  display:inline-flex;align-items:center;gap:6px;
  padding:7px 14px;border-radius:6px;font-size:12px;font-weight:600;
  cursor:pointer;border:1px solid transparent;font-family:inherit;
  transition:opacity .15s,background .15s;white-space:nowrap;
}
.btn:hover{opacity:.85;}
.btn:disabled{opacity:.4;cursor:not-allowed;}
.btn-primary{background:#238636;color:#fff;border-color:#2ea043;}
.btn-secondary{background:var(--bg3);color:var(--text);border-color:var(--border);}
.btn-danger{background:#2d0808;color:var(--red);border-color:#5a1515;}
.btn-warning{background:#2d1f00;color:var(--yellow);border-color:#5a3e00;}
.btn-sm{padding:4px 10px;font-size:11px;}
.btn-xs{padding:2px 8px;font-size:10px;}
.btn-icon{padding:6px;width:30px;height:30px;justify-content:center;}

/* ── Search bar ─────────────────────────────────── */
.search-bar{display:flex;gap:8px;align-items:center;margin-bottom:16px;flex-wrap:wrap;}
.search-input{
  height:32px;background:var(--bg2);border:1px solid var(--border);
  border-radius:6px;padding:0 10px 0 30px;color:var(--text);
  font-size:12px;font-family:inherit;outline:none;min-width:200px;
}
.search-input:focus{border-color:var(--blue);}
.search-wrap{position:relative;display:inline-flex;align-items:center;}
.search-wrap::before{content:'🔍';position:absolute;left:8px;font-size:11px;}

/* ── Pagination ─────────────────────────────────── */
.pagination{display:flex;align-items:center;gap:4px;margin-top:16px;justify-content:flex-end;}
.pagination .pg-info{font-size:11px;color:var(--sub);margin-right:8px;}
.pg-btn{
  min-width:28px;height:28px;padding:0 8px;border-radius:5px;
  border:1px solid var(--border);background:var(--bg2);color:var(--sub);
  cursor:pointer;font-size:12px;font-family:inherit;
  display:inline-flex;align-items:center;justify-content:center;
}
.pg-btn:hover{background:var(--bg3);color:var(--text);}
.pg-btn.active{background:#0d2433;color:var(--blue);border-color:#1f6e8c;}
.pg-btn:disabled{opacity:.4;cursor:not-allowed;}

/* ── Modal ──────────────────────────────────────── */
.modal-overlay{
  display:none;position:fixed;inset:0;background:rgba(0,0,0,.7);
  align-items:center;justify-content:center;z-index:999;
}
.modal-overlay.show{display:flex;}
.modal{
  background:var(--bg2);border:1px solid var(--border);
  border-radius:10px;padding:0;width:480px;max-width:95vw;
  max-height:90vh;overflow-y:auto;
}
.modal-wide{width:640px;}
.modal-head{
  padding:14px 18px;border-bottom:1px solid var(--border);
  display:flex;align-items:center;justify-content:space-between;
}
.modal-title{font-size:14px;font-weight:700;}
.modal-close{
  background:none;border:none;color:var(--sub);cursor:pointer;
  font-size:18px;line-height:1;padding:2px 6px;border-radius:4px;
}
.modal-close:hover{color:var(--text);background:var(--bg3);}
.modal-body{padding:18px;}
.modal-foot{padding:14px 18px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:8px;}

/* ── Toggle ─────────────────────────────────────── */
.toggle{position:relative;display:inline-block;width:36px;height:20px;flex-shrink:0;}
.toggle input{opacity:0;width:0;height:0;}
.toggle-slider{
  position:absolute;inset:0;background:var(--bg4);
  border-radius:10px;cursor:pointer;transition:background .2s;
  border:1px solid var(--border);
}
.toggle-slider::before{
  content:'';position:absolute;width:14px;height:14px;
  left:2px;bottom:2px;background:var(--sub);border-radius:50%;transition:transform .2s,background .2s;
}
.toggle input:checked + .toggle-slider{background:#0d2413;border-color:#2ea043;}
.toggle input:checked + .toggle-slider::before{transform:translateX(16px);background:var(--green);}

/* ── Tabs ───────────────────────────────────────── */
.tab-bar{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:20px;}
.tab-item{
  padding:10px 16px;font-size:12px;font-weight:500;cursor:pointer;
  color:var(--sub);border-bottom:2px solid transparent;transition:all .15s;
}
.tab-item:hover{color:var(--text);}
.tab-item.active{color:var(--orange);border-bottom-color:var(--orange);}

/* ── Alerts ─────────────────────────────────────── */
.alert{padding:10px 14px;border-radius:6px;border:1px solid;font-size:12px;margin-bottom:12px;}
.alert-ok{color:var(--green);background:#0d2413;border-color:#1a4a20;}
.alert-err{color:var(--red);background:#2d0808;border-color:#5a1515;}
.alert-warn{color:var(--yellow);background:#2d1f00;border-color:#5a3e00;}
.alert-info{color:var(--blue);background:#0d2433;border-color:#1f6e8c;}

/* ── Loading ─────────────────────────────────────── */
.loading{display:flex;align-items:center;justify-content:center;padding:40px;color:var(--sub);}
.spinner{
  width:20px;height:20px;border:2px solid var(--border);
  border-top-color:var(--blue);border-radius:50%;
  animation:spin .7s linear infinite;margin-right:10px;
}
@keyframes spin{to{transform:rotate(360deg);}}

/* ── Empty state ────────────────────────────────── */
.empty{padding:48px 24px;text-align:center;color:var(--sub);}
.empty-icon{font-size:36px;margin-bottom:10px;}
.empty-text{font-size:13px;}

/* ── Progress bar ───────────────────────────────── */
.progress{height:5px;background:var(--bg3);border-radius:3px;overflow:hidden;margin-top:4px;}
.progress-bar{height:100%;border-radius:3px;transition:width .3s;}

/* ── Key preview ────────────────────────────────── */
.key-preview{
  font-family:'SF Mono',Consolas,monospace;font-size:11px;
  background:var(--bg3);padding:2px 8px;border-radius:4px;
  border:1px solid var(--border);color:var(--blue);
}

/* ── Responsive ─────────────────────────────────── */
@media(max-width:768px){
  .sidebar{width:52px;}
  .sidebar .sb-nav-label,.sidebar .sb-logo-text,.sidebar .sb-logo-version,.sidebar .sb-user-info,.sidebar .sb-logout{display:none;}
  .main{margin-left:52px;}
  .form-grid.col2,.form-grid.col3{grid-template-columns:1fr;}
}

/* ── 工具类（utility classes）──────────────────────────────
   替代内联 style，统一维护 */

/* 显示/隐藏 */
.hidden           { display: none !important; }
.d-flex           { display: flex; }
.d-flex-center    { display: flex; align-items: center; }
.d-flex-between   { display: flex; justify-content: space-between; }
.d-flex-between-c { display: flex; align-items: center; justify-content: space-between; }
.d-flex-gap-6     { display: flex; gap: 6px; }
.d-flex-gap-8     { display: flex; gap: 8px; }
.d-flex-wrap      { display: flex; flex-wrap: wrap; gap: 8px; }
.d-flex-center-8  { display: flex; align-items: center; gap: 8px; }

/* 文字 */
.text-muted       { color: var(--text-muted); }
.text-sub         { color: var(--sub); }
.text-sm          { font-size: 12px; }
.text-sm-muted    { font-size: 12px; color: var(--text-muted); }
.text-sm-sub      { font-size: 12px; color: var(--sub); }
.text-bold        { font-weight: 600; }
.text-right       { text-align: right; }
.text-nowrap      { white-space: nowrap; }

/* 间距 */
.mb-0  { margin-bottom: 0; }
.mb-4  { margin-bottom: 4px; }
.mb-8  { margin-bottom: 8px; }
.mb-12 { margin-bottom: 12px; }
.mb-16 { margin-bottom: 16px; }
.mt-8  { margin-top: 8px; }
.mt-12 { margin-top: 12px; }
.mt-16 { margin-top: 16px; }

/* 高度 */
.h-32  { height: 32px; }

/* 表格辅助 */
.td-right { text-align: right; }
.border-none { border: none; }
.cursor-pointer { cursor: pointer; }

/* 字号组合 */
.fs-13-bold { font-size: 13px; font-weight: 500; }
.fs-13-sub  { display: flex; justify-content: space-between; font-size: 13px; }

/* 间距组合 */
.p-8-0 { padding: 8px 0; }

/* 第二轮补充工具类 */
.mb-20         { margin-bottom: 20px; }
.mt-2          { margin-top: 2px; }
.text-xs       { font-size: 11px; }
.text-xs-sub   { font-size: 11px; color: var(--sub); }
.text-blue     { color: var(--blue); }
.text-primary  { color: var(--primary); }
.font-normal   { text-transform: none; font-weight: 400; }
.w-160         { width: 160px; }
.w-120         { width: 120px; }
.cursor-pointer{ cursor: pointer; }
