/* ================================================================
   统一企业管理平台 — 企业深蓝主题（沿用原型设计令牌）
   ================================================================ */
:root {
  --nx-primary-50:#eff6ff; --nx-primary-100:#dbeafe; --nx-primary-200:#bfdbfe;
  --nx-primary-300:#93c5fd; --nx-primary-400:#60a5fa; --nx-primary-500:#3b82f6;
  --nx-primary-600:#2563eb; --nx-primary-700:#1d4ed8; --nx-primary-800:#1e40af;
  --nx-primary-900:#1e3a8a; --nx-primary-950:#172554;
  --nx-neutral-0:#fff; --nx-neutral-50:#f8fafc; --nx-neutral-100:#f1f5f9;
  --nx-neutral-200:#e2e8f0; --nx-neutral-300:#cbd5e1; --nx-neutral-400:#94a3b8;
  --nx-neutral-500:#64748b; --nx-neutral-600:#475569; --nx-neutral-700:#334155;
  --nx-neutral-800:#1e293b; --nx-neutral-900:#0f172a;
  --nx-success:#10b981; --nx-success-bg:#ecfdf5;
  --nx-warning:#f59e0b; --nx-warning-bg:#fffbeb;
  --nx-error:#ef4444; --nx-error-bg:#fef2f2;
  --nx-info:#3b82f6; --nx-info-bg:#eff6ff;
  /* 语义化表面令牌（各主题只需覆盖以下令牌即可整站换肤） */
  --nx-bg:#f8fafc; --nx-card:#fff; --nx-surface:#fff;
  --nx-ink:#0f172a;
  --nx-ink-2:#475569; --nx-ink-3:#94a3b8; --nx-border:#e2e8f0; --nx-ring:#3b82f6;
  --nx-fill-1:#f8fafc; --nx-fill-2:#f1f5f9; --nx-fill-3:#e2e8f0;
  --nx-grid:#cbd5e1; --nx-grid-strong:#b8c4d4;
  --nx-chrome:var(--nx-primary-900);
  --nx-ring-shadow:rgba(59,130,246,.18);
  --nx-mask:rgba(15,23,42,.45);
  --nx-scrollbar:#cbd5e1; --nx-scrollbar-hover:#94a3b8;
  --nx-sk-1:#f1f5f9; --nx-sk-2:#e2e8f0;
  --nx-danger-border:#fecaca;
  --nx-success-ink:#047857; --nx-warning-ink:#b45309;
  --nx-error-ink:#b91c1c; --nx-info-ink:#1d4ed8; --nx-neutral-ink:var(--nx-neutral-600);
  --nx-chart-line:#1e40af; --nx-chart-fill:rgba(147,197,253,.35);
  --nx-shadow-1:0 1px 2px rgba(15,23,42,.05),0 1px 1px rgba(15,23,42,.03);
  --nx-shadow-2:0 8px 24px -8px rgba(15,23,42,.18);
  --nx-shadow-3:0 24px 60px -20px rgba(15,23,42,.30);
}

/* ============== 主题：深邃（深色护眼） ============== */
html[data-theme="dark"] {
  --nx-primary-50:rgba(59,130,246,.16); --nx-primary-100:rgba(59,130,246,.28);
  --nx-primary-200:rgba(96,165,250,.35); --nx-primary-300:#60a5fa;
  --nx-primary-400:#60a5fa; --nx-primary-500:#3b82f6; --nx-primary-600:#3b82f6;
  --nx-primary-700:#60a5fa; --nx-primary-800:#2563eb; --nx-primary-900:#0a1120;
  --nx-primary-950:#050a14;
  --nx-bg:#0b1220; --nx-card:#121c30; --nx-surface:#18243c;
  --nx-ink:#e6edf8; --nx-ink-2:#9fb1c9; --nx-ink-3:#687a96;
  --nx-border:#25324a; --nx-ring:#60a5fa;
  --nx-fill-1:#16223a; --nx-fill-2:#1d2b45; --nx-fill-3:#2b3a57;
  --nx-grid:#2c3a55; --nx-grid-strong:#3d4f70;
  --nx-chrome:#0a1120;
  --nx-ring-shadow:rgba(96,165,250,.32);
  --nx-mask:rgba(2,6,23,.62);
  --nx-scrollbar:#334155; --nx-scrollbar-hover:#475569;
  --nx-sk-1:#16223a; --nx-sk-2:#1d2b45;
  --nx-danger-border:rgba(239,68,68,.4);
  --nx-success-ink:#34d399; --nx-warning-ink:#fbbf24;
  --nx-error-ink:#f87171; --nx-info-ink:#60a5fa; --nx-neutral-ink:#9fb1c9;
  --nx-success-bg:rgba(16,185,129,.14); --nx-warning-bg:rgba(245,158,11,.14);
  --nx-error-bg:rgba(239,68,68,.13); --nx-info-bg:rgba(59,130,246,.15);
  --nx-chart-line:#60a5fa; --nx-chart-fill:rgba(59,130,246,.25);
  --nx-shadow-1:0 1px 2px rgba(0,0,0,.4);
  --nx-shadow-2:0 8px 24px -8px rgba(0,0,0,.55);
  --nx-shadow-3:0 24px 60px -20px rgba(0,0,0,.7);
}

/* ============== 主题：科技青（赛博霓虹） ============== */
html[data-theme="tech"] {
  --nx-primary-50:rgba(34,211,238,.13); --nx-primary-100:rgba(34,211,238,.22);
  --nx-primary-200:rgba(34,211,238,.32); --nx-primary-300:#22d3ee;
  --nx-primary-400:#22d3ee; --nx-primary-500:#06b6d4; --nx-primary-600:#06b6d4;
  --nx-primary-700:#22d3ee; --nx-primary-800:#0891b2; --nx-primary-900:#03080d;
  --nx-primary-950:#01040a;
  --nx-bg:#050a10; --nx-card:#0b1522; --nx-surface:#102133;
  --nx-ink:#d8f6ff; --nx-ink-2:#8fb8c9; --nx-ink-3:#5b8396;
  --nx-border:#15303d; --nx-ring:#22d3ee;
  --nx-fill-1:#0d1c2b; --nx-fill-2:#12283a; --nx-fill-3:#1c3a4d;
  --nx-grid:#17394a; --nx-grid-strong:#215063;
  --nx-chrome:#03080d;
  --nx-ring-shadow:rgba(34,211,238,.3);
  --nx-mask:rgba(0,8,14,.68);
  --nx-scrollbar:#15303d; --nx-scrollbar-hover:#215063;
  --nx-sk-1:#0d1c2b; --nx-sk-2:#12283a;
  --nx-danger-border:rgba(251,113,133,.4);
  --nx-success-ink:#2dd4bf; --nx-warning-ink:#fbbf24;
  --nx-error-ink:#fb7185; --nx-info-ink:#22d3ee; --nx-neutral-ink:#8fb8c9;
  --nx-success-bg:rgba(45,212,191,.12); --nx-warning-bg:rgba(251,191,36,.12);
  --nx-error-bg:rgba(251,113,133,.12); --nx-info-bg:rgba(34,211,238,.13);
  --nx-neutral-50:#0d1c2b; --nx-neutral-100:#12283a;
  --nx-chart-line:#22d3ee; --nx-chart-fill:rgba(34,211,238,.22);
  --nx-shadow-1:0 1px 2px rgba(0,0,0,.5);
  --nx-shadow-2:0 8px 28px -8px rgba(6,182,212,.35);
  --nx-shadow-3:0 24px 60px -20px rgba(0,0,0,.8);
}
/* 科技主题：氛围光 + 霓虹描边 */
html[data-theme="tech"] body {
  background:radial-gradient(1200px 600px at 82% -12%, rgba(34,211,238,.09), transparent 60%), var(--nx-bg);
}
html[data-theme="tech"] .nx-btn-primary { box-shadow:0 0 14px rgba(34,211,238,.28); }
html[data-theme="tech"] .nx-nav-item.active {
  background:rgba(34,211,238,.16); box-shadow:inset 2px 0 0 #22d3ee;
}
html[data-theme="tech"] .nx-card { border-color:rgba(34,211,238,.18); }
html[data-theme="tech"] .nx-input:focus,
html[data-theme="tech"] .nx-select:focus,
html[data-theme="tech"] .nx-textarea:focus { box-shadow:0 0 0 2px rgba(34,211,238,.22); }

/* ============== 主题：清凉薄荷（青绿浅色） ============== */
html[data-theme="cool"] {
  --nx-primary-50:#f0fdfa; --nx-primary-100:#ccfbf1; --nx-primary-200:#99f6e4;
  --nx-primary-300:#5eead4; --nx-primary-400:#2dd4bf; --nx-primary-500:#14b8a6;
  --nx-primary-600:#0d9488; --nx-primary-700:#0f766e; --nx-primary-800:#115e59;
  --nx-primary-900:#0f4241; --nx-primary-950:#042f2e;
  --nx-bg:#f1faf9; --nx-card:#ffffff; --nx-surface:#ffffff;
  --nx-ink:#0c3333; --nx-ink-2:#41706f; --nx-ink-3:#86a5a3;
  --nx-border:#d3e9e6; --nx-ring:#14b8a6;
  --nx-fill-1:#eef8f7; --nx-fill-2:#e2f3f1; --nx-fill-3:#cde7e3;
  --nx-grid:#bfe3de; --nx-grid-strong:#9fd3cc;
  --nx-chrome:#0f4241;
  --nx-ring-shadow:rgba(20,184,166,.22);
  --nx-mask:rgba(8,51,51,.4);
  --nx-scrollbar:#a9d5d0; --nx-scrollbar-hover:#7fc0b9;
  --nx-sk-1:#e2f3f1; --nx-sk-2:#cde7e3;
  --nx-chart-line:#0f766e; --nx-chart-fill:rgba(45,212,191,.3);
}

/* ============== 主题：暖米沙（暖棕米色） ============== */
html[data-theme="warm"] {
  --nx-primary-50:#fff7ed; --nx-primary-100:#ffedd5; --nx-primary-200:#fed7aa;
  --nx-primary-300:#fdba74; --nx-primary-400:#fb923c; --nx-primary-500:#f97316;
  --nx-primary-600:#ea580c; --nx-primary-700:#c2410c; --nx-primary-800:#9a3412;
  --nx-primary-900:#7c2d12; --nx-primary-950:#431407;
  --nx-bg:#faf5ee; --nx-card:#fffdf8; --nx-surface:#fffdf8;
  --nx-ink:#3d2818; --nx-ink-2:#7c6049; --nx-ink-3:#ad977f;
  --nx-border:#ece0d0; --nx-ring:#ea580c;
  --nx-fill-1:#f6eee2; --nx-fill-2:#f0e4d2; --nx-fill-3:#e5d4bd;
  --nx-grid:#e2d2ba; --nx-grid-strong:#cfb898;
  --nx-chrome:#7c2d12;
  --nx-ring-shadow:rgba(234,88,12,.2);
  --nx-mask:rgba(61,40,24,.42);
  --nx-scrollbar:#ddc9ac; --nx-scrollbar-hover:#c9ad88;
  --nx-sk-1:#f0e4d2; --nx-sk-2:#e5d4bd;
  --nx-chart-line:#c2410c; --nx-chart-fill:rgba(251,146,60,.3);
}

/* ============== 主题：紫韵罗兰（优雅紫浅色） ============== */
html[data-theme="violet"] {
  --nx-primary-50:#f5f3ff; --nx-primary-100:#ede9fe; --nx-primary-200:#ddd6fe;
  --nx-primary-300:#c4b5fd; --nx-primary-400:#a78bfa; --nx-primary-500:#8b5cf6;
  --nx-primary-600:#7c3aed; --nx-primary-700:#6d28d9; --nx-primary-800:#5b21b6;
  --nx-primary-900:#4c1d95; --nx-primary-950:#2e1065;
  --nx-bg:#faf9ff; --nx-card:#ffffff; --nx-surface:#ffffff;
  --nx-ink:#241a4d; --nx-ink-2:#5d5484; --nx-ink-3:#9d96bd;
  --nx-border:#e9e4f8; --nx-ring:#7c3aed;
  --nx-fill-1:#f5f3fd; --nx-fill-2:#ede9fa; --nx-fill-3:#ded5f2;
  --nx-grid:#d8cef0; --nx-grid-strong:#bfb0e2;
  --nx-chrome:#4c1d95;
  --nx-ring-shadow:rgba(124,58,237,.2);
  --nx-mask:rgba(36,26,77,.42);
  --nx-scrollbar:#cfc2ec; --nx-scrollbar-hover:#b39de0;
  --nx-sk-1:#ede9fa; --nx-sk-2:#ded5f2;
  --nx-chart-line:#6d28d9; --nx-chart-fill:rgba(167,139,250,.3);
}

/* ============== 主题：樱语粉（樱粉浅色） ============== */
html[data-theme="rose"] {
  --nx-primary-50:#fff1f2; --nx-primary-100:#ffe4e6; --nx-primary-200:#fecdd3;
  --nx-primary-300:#fda4af; --nx-primary-400:#fb7185; --nx-primary-500:#f43f5e;
  --nx-primary-600:#e11d48; --nx-primary-700:#be123c; --nx-primary-800:#9f1239;
  --nx-primary-900:#881337; --nx-primary-950:#4c0519;
  --nx-bg:#fff8f9; --nx-card:#ffffff; --nx-surface:#ffffff;
  --nx-ink:#43242f; --nx-ink-2:#7d5561; --nx-ink-3:#b08e99;
  --nx-border:#f5dce2; --nx-ring:#e11d48;
  --nx-fill-1:#fdf3f5; --nx-fill-2:#fae8ec; --nx-fill-3:#f4d6dd;
  --nx-grid:#f0cdd6; --nx-grid-strong:#e2afbc;
  --nx-chrome:#881337;
  --nx-ring-shadow:rgba(225,29,72,.18);
  --nx-mask:rgba(67,36,47,.42);
  --nx-scrollbar:#eec3ce; --nx-scrollbar-hover:#dfa1b1;
  --nx-sk-1:#fae8ec; --nx-sk-2:#f4d6dd;
  --nx-chart-line:#be123c; --nx-chart-fill:rgba(251,113,133,.3);
}

/* ============== 主题：翡翠绿（自然绿浅色） ============== */
html[data-theme="emerald"] {
  --nx-primary-50:#ecfdf5; --nx-primary-100:#d1fae5; --nx-primary-200:#a7f3d0;
  --nx-primary-300:#6ee7b7; --nx-primary-400:#34d399; --nx-primary-500:#10b981;
  --nx-primary-600:#059669; --nx-primary-700:#047857; --nx-primary-800:#065f46;
  --nx-primary-900:#064e3b; --nx-primary-950:#022c22;
  --nx-bg:#f4fbf7; --nx-card:#ffffff; --nx-surface:#ffffff;
  --nx-ink:#0c3325; --nx-ink-2:#41705c; --nx-ink-3:#86a597;
  --nx-border:#d5ecdf; --nx-ring:#10b981;
  --nx-fill-1:#eef8f3; --nx-fill-2:#e1f2ea; --nx-fill-3:#cde7db;
  --nx-grid:#bfe3d3; --nx-grid-strong:#9fd3ba;
  --nx-chrome:#064e3b;
  --nx-ring-shadow:rgba(16,185,129,.2);
  --nx-mask:rgba(12,51,37,.42);
  --nx-scrollbar:#a9d5c0; --nx-scrollbar-hover:#7fc0a5;
  --nx-sk-1:#e1f2ea; --nx-sk-2:#cde7db;
  --nx-chart-line:#047857; --nx-chart-fill:rgba(52,211,153,.3);
}

/* 主题切换时颜色平滑过渡 */
body, .nx-card, .nx-modal, .nx-sidebar, .nx-stat, .nx-input, .nx-select, .nx-textarea, .nx-btn,
.nx-perm-table, .nx-perm-table th, .nx-perm-table td {
  transition:background-color .2s ease, border-color .2s ease;
}

* { box-sizing: border-box; }
html, body { margin:0; padding:0; overflow-x:hidden; }
body {
  font-family: Inter, "Noto Sans SC", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
  background:var(--nx-bg); color:var(--nx-ink);
  font-size:14px; line-height:1.6;
}
::-webkit-scrollbar { width:8px; height:8px; }
::-webkit-scrollbar-track { background:transparent; }
::-webkit-scrollbar-thumb { background:var(--nx-scrollbar); border-radius:4px; }
::-webkit-scrollbar-thumb:hover { background:var(--nx-scrollbar-hover); }

/* ---------- 按钮 ---------- */
.nx-btn {
  display:inline-flex; align-items:center; gap:6px; height:34px;
  padding:0 14px; border-radius:6px; border:1px solid var(--nx-border);
  background:var(--nx-card); color:var(--nx-ink); font-size:13px; font-weight:500;
  cursor:pointer; white-space:nowrap; transition:all .15s;
}
.nx-btn:hover { background:var(--nx-fill-2); transform:translateY(-1px); }
.nx-btn-primary { background:var(--nx-primary-800); border-color:var(--nx-primary-800); color:#fff; }
.nx-btn-primary:hover { background:var(--nx-primary-700); border-color:var(--nx-primary-700); }
.nx-btn-danger { color:var(--nx-error); border-color:var(--nx-danger-border); background:var(--nx-surface); }
.nx-btn-danger:hover { background:var(--nx-error-bg); }
.nx-btn-ghost { border-color:transparent; background:transparent; }
.nx-btn-ghost:hover { background:var(--nx-fill-2); }
.nx-btn-sm { height:28px; padding:0 10px; font-size:12px; }
.nx-btn:disabled { opacity:.55; cursor:not-allowed; transform:none; }

/* ---------- 表单 ---------- */
.nx-input, .nx-select, .nx-textarea {
  width:100%; height:34px; padding:0 12px; border-radius:6px;
  border:1px solid var(--nx-border); background:var(--nx-surface); color:var(--nx-ink);
  font-size:13px; outline:none; transition:box-shadow .15s, border-color .15s;
}
.nx-textarea { height:auto; padding:8px 12px; min-height:84px; resize:vertical; font-family:inherit; }
.nx-input:focus, .nx-select:focus, .nx-textarea:focus {
  border-color:var(--nx-ring);
  box-shadow:0 0 0 2px var(--nx-ring-shadow);
}
.nx-label { display:block; font-size:13px; font-weight:500; margin-bottom:6px; color:var(--nx-ink); }
.nx-label .req { color:var(--nx-error); margin-left:2px; }
.nx-form-row { margin-bottom:16px; }
.nx-filter-input { min-width:180px; }

/* ---------- 卡片 / 徽章 ---------- */
.nx-card {
  background:var(--nx-card); border:1px solid var(--nx-border);
  border-radius:8px; box-shadow:var(--nx-shadow-1); overflow:hidden;
}
.nx-badge {
  display:inline-flex; align-items:center; gap:4px;
  padding:2px 9px; border-radius:4px; font-size:12px; font-weight:500; white-space:nowrap;
}
.nx-badge-success { color:var(--nx-success-ink); background:var(--nx-success-bg); }
.nx-badge-warning { color:var(--nx-warning-ink); background:var(--nx-warning-bg); }
.nx-badge-error   { color:var(--nx-error-ink); background:var(--nx-error-bg); }
.nx-badge-info    { color:var(--nx-info-ink); background:var(--nx-info-bg); }
.nx-badge-neutral { color:var(--nx-neutral-ink); background:var(--nx-fill-2); }
.nx-dot { width:6px; height:6px; border-radius:9999px; display:inline-block; }
.nx-dot-success { background:var(--nx-success); }
.nx-dot-error { background:var(--nx-error); }

/* ---------- 表格 ---------- */
.nx-table-wrap { overflow-x:auto; }
.nx-table { width:100%; border-collapse:collapse; font-size:13px; }
.nx-table th {
  text-align:left; font-weight:600; color:var(--nx-ink-2); white-space:nowrap;
  padding:10px 14px; background:var(--nx-fill-1);
  border-bottom:1px solid var(--nx-border); font-size:12px;
}
.nx-table td { padding:11px 14px; border-bottom:1px solid var(--nx-border); vertical-align:middle; }
.nx-table tbody tr:hover { background:var(--nx-fill-1); }
.nx-table .col-actions { white-space:nowrap; text-align:right; }
.nx-link { color:var(--nx-primary-700); cursor:pointer; font-weight:500; }
.nx-link:hover { text-decoration:underline; }
.nx-link-danger { color:var(--nx-error); cursor:pointer; }
.nx-link-danger:hover { text-decoration:underline; }

/* 进度条 */
.nx-progress { width:90px; height:6px; border-radius:9999px; background:var(--nx-fill-2); overflow:hidden; display:inline-block; vertical-align:middle; }
.nx-progress > i { display:block; height:100%; border-radius:9999px; background:var(--nx-primary-600); }
.nx-progress-text { font-size:12px; color:var(--nx-ink-2); margin-left:6px; }

/* ---------- 分页 ---------- */
.nx-pagination { display:flex; align-items:center; gap:6px; justify-content:flex-end; padding:12px 16px; font-size:13px; color:var(--nx-ink-2); flex-wrap:wrap; }
.nx-page-btn { min-width:30px; height:30px; padding:0 8px; border:1px solid var(--nx-border); background:var(--nx-surface); border-radius:6px; cursor:pointer; font-size:13px; }
.nx-page-btn.active { background:var(--nx-primary-800); color:#fff; border-color:var(--nx-primary-800); }
.nx-page-btn:disabled { opacity:.45; cursor:not-allowed; }

/* ---------- 计划安排 ---------- */
.nx-plan-card { border:1px solid var(--nx-border); border-radius:8px; padding:14px 16px; margin-bottom:10px; background:var(--nx-fill-1); }
.nx-plan-head { display:flex; justify-content:space-between; align-items:flex-start; gap:10px; }
.nx-plan-name { font-weight:600; font-size:14px; }
.nx-plan-sub { font-size:12px; color:var(--nx-ink-3); margin-top:2px; }
.nx-plan-meta { display:flex; flex-wrap:wrap; gap:16px; font-size:12px; color:var(--nx-ink-2); margin:8px 0 10px; }
.nx-plan-actions { display:flex; flex-wrap:wrap; gap:8px; }
.nx-plan-step { border:1px dashed var(--nx-border); border-radius:6px; padding:10px 12px; margin-bottom:8px; background:var(--nx-card); }
.nx-plan-step-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; font-size:12px; color:var(--nx-ink-2); }
.nx-plan-log { max-height:420px; overflow:auto; background:var(--nx-fill-2); border:1px solid var(--nx-border); border-radius:6px; padding:12px; font-size:12px; line-height:1.5; white-space:pre-wrap; word-break:break-all; font-family:Consolas,monospace; }

/* 计划页面：左侧竖向 tab + 右侧内容 */
.nx-plan-layout { display:flex; gap:14px; align-items:stretch; min-height:calc(100vh - 130px); }
.nx-plan-side { flex:none; width:180px; display:flex; flex-direction:column; gap:6px; position:sticky; top:0; align-self:flex-start; }
.nx-plan-sidenav { display:flex; align-items:center; gap:10px; padding:11px 14px; border-radius:8px; cursor:pointer; font-size:13px; color:var(--nx-ink-2); background:var(--nx-card); border:1px solid var(--nx-border); transition:.15s; }
.nx-plan-sidenav:hover { color:var(--nx-ink); border-color:var(--nx-ring); }
.nx-plan-sidenav.active { background:var(--nx-primary-600); color:#fff; border-color:var(--nx-primary-600); font-weight:600; }
.nx-plan-content { flex:1; min-width:0; position:relative; }
.nx-plan-content .nx-plan-card { background:var(--nx-card); }
.nx-detail-page .nx-plan-log { max-height:none; flex:1; margin:0; }

/* 计划执行步骤（勾选行） */
.nx-plan-stepbox { display:flex; flex-direction:column; gap:8px; }
.nx-plan-steprow { display:flex; gap:12px; align-items:flex-start; border:1px solid var(--nx-border); border-radius:8px; padding:12px 14px; background:var(--nx-card); transition:.15s; }
.nx-plan-steprow.on { border-color:var(--nx-ring); background:var(--nx-primary-50); }
.nx-plan-stepchk { position:relative; flex:none; width:18px; height:18px; margin-top:1px; cursor:pointer; }
.nx-plan-stepchk input { position:absolute; opacity:0; inset:0; cursor:pointer; }
.nx-plan-stepdot { display:block; width:18px; height:18px; border:1.5px solid var(--nx-grid-strong); border-radius:5px; background:var(--nx-card); transition:.15s; }
.nx-plan-stepchk input:checked + .nx-plan-stepdot { background:var(--nx-primary-600); border-color:var(--nx-primary-600); }
.nx-plan-stepchk input:checked + .nx-plan-stepdot::after { content:''; position:absolute; left:5px; top:1px; width:5px; height:10px; border:solid #fff; border-width:0 2px 2px 0; transform:rotate(45deg); }
.nx-plan-stepmain { flex:1; min-width:0; }
.nx-plan-stepname { font-weight:600; font-size:13px; }
.nx-plan-stepdesc { font-size:12px; color:var(--nx-ink-3); margin-top:1px; }
.nx-plan-stepfields { display:flex; flex-wrap:wrap; gap:8px; margin-top:8px; }
@media(max-width:900px){ .nx-plan-layout{flex-direction:column;} .nx-plan-side{width:100%;flex-direction:row;flex-wrap:wrap;} }

/* ---------- 弹窗 ---------- */
.nx-modal-mask {
  position:fixed; inset:0; background:var(--nx-mask); z-index:100;
  display:flex; align-items:flex-start; justify-content:center; padding:5vh 16px; overflow-y:auto;
}
.nx-modal {
  background:var(--nx-surface); color:var(--nx-ink); border:1px solid var(--nx-border);
  border-radius:12px; box-shadow:var(--nx-shadow-3);
  width:560px; max-width:100%; animation:nx-pop .18s ease;
}
.nx-modal.nx-modal-lg { width:760px; }
@keyframes nx-pop { from { transform:translateY(8px); opacity:0; } to { transform:none; opacity:1; } }
.nx-modal-header { display:flex; align-items:center; justify-content:space-between; padding:18px 20px 8px; }
.nx-modal-title { font-size:16px; font-weight:600; }
.nx-modal-body { padding:10px 20px 4px; max-height:62vh; overflow-y:auto; }
.nx-modal-footer { display:flex; justify-content:flex-end; gap:10px; padding:16px 20px; }
.nx-modal-x { border:none; background:transparent; cursor:pointer; color:var(--nx-ink-3); font-size:20px; line-height:1; }
.nx-modal-x:hover { color:var(--nx-ink); }

/* ---------- Toast / 确认框 ---------- */
.nx-toast-wrap { position:fixed; top:20px; left:50%; transform:translateX(-50%); z-index:200; display:flex; flex-direction:column; gap:8px; }
.nx-toast {
  background:var(--nx-neutral-900); color:#fff; padding:10px 18px; border-radius:8px;
  font-size:13px; box-shadow:var(--nx-shadow-2); display:flex; align-items:center; gap:8px;
  animation:nx-pop .18s ease;
}
.nx-toast.success { background:#065f46; }
.nx-toast.error { background:#991b1b; }
.nx-toast.warning { background:#92400e; }

/* ---------- 侧栏导航 ---------- */
.nx-sidebar {
  position:fixed; top:64px; left:0; bottom:0; width:240px; z-index:40;
  background:var(--nx-chrome);
  display:flex; flex-direction:column;
  overflow-y:auto; overflow-x:hidden; overscroll-behavior:contain;
  scrollbar-width:thin; scrollbar-color:rgba(255,255,255,.3) transparent;
}
.nx-sidebar::-webkit-scrollbar { width:8px; }
.nx-sidebar::-webkit-scrollbar-thumb { background:rgba(255,255,255,.35); border-radius:4px; border:2px solid var(--nx-chrome); }
.nx-sidebar::-webkit-scrollbar-thumb:hover { background:rgba(255,255,255,.6); }
.nx-sidebar::-webkit-scrollbar-track { background:transparent; }
/* 菜单容器：内容不足时撑满剩余空间，使帮助中心贴底；超出时由侧栏整体滚动 */
.nx-nav-scroll { flex:1 1 auto; }
/* 底部帮助中心：滚动时始终钉在可视区底部 */
.nx-side-bottom {
  position:sticky; bottom:0; flex:none; padding:8px 0 10px;
  border-top:1px solid rgba(255,255,255,.1);
  background:var(--nx-chrome);
  display:flex; align-items:center;
}
.nx-side-bottom .nx-nav-item { flex:1 1 auto; min-width:0; }
.nx-side-version {
  flex:none; margin:0 12px 0 4px; padding:2px 8px;
  font-size:11px; font-family:Consolas,monospace; color:rgba(255,255,255,.55);
  border:1px solid rgba(255,255,255,.18); border-radius:10px;
  white-space:nowrap; user-select:none;
}
.nx-nav-item {
  display:flex; align-items:center; gap:12px; padding:9px 14px; margin:2px 10px;
  border-radius:6px; color:rgba(255,255,255,.72); font-size:13.5px; font-weight:500;
  cursor:pointer; transition:all .15s; text-decoration:none; flex-shrink:0;
}
.nx-nav-item:hover { background:rgba(255,255,255,.1); color:#fff; }
.nx-nav-item.active { background:rgba(255,255,255,.15); color:#fff; }
.nx-nav-item svg { width:18px; height:18px; flex:none; }
.nx-nav-section { padding:14px 22px 6px; font-size:11px; color:rgba(255,255,255,.4); letter-spacing:.08em; flex-shrink:0; }

/* ---------- 统计卡 ---------- */
.nx-stat {
  background:var(--nx-card); border:1px solid var(--nx-border); border-radius:8px;
  padding:14px 16px; box-shadow:var(--nx-shadow-1);
}
.nx-stat-label { font-size:12.5px; color:var(--nx-ink-3); font-weight:500; }
.nx-stat-value { font-size:24px; font-weight:600; margin-top:4px; font-variant-numeric:tabular-nums; }
.nx-stat-icon { width:32px; height:32px; border-radius:6px; display:flex; align-items:center; justify-content:center; background:var(--nx-primary-50); color:var(--nx-primary-700); }
.nx-stat-icon svg { width:16px; height:16px; }
/* 可点击统计卡 */
.nx-stat-clickable { cursor:pointer; transition:border-color .15s, box-shadow .15s, transform .1s; }
.nx-stat-clickable:hover { border-color:var(--nx-primary-400); box-shadow:var(--nx-shadow-2); }
.nx-stat-clickable:active { transform:translateY(1px); }
.nx-stat-hint { margin-top:8px; font-size:11px; color:var(--nx-primary-600); opacity:0; transition:opacity .15s; }
.nx-stat-clickable:hover .nx-stat-hint { opacity:1; }

/* ---------- 总控制台 · 未读消息卡片 ---------- */
.dash-notif-item {
  display:flex; align-items:center; gap:12px;
  padding:12px 16px; border-bottom:1px solid var(--nx-border);
  cursor:pointer; transition:background .12s;
}
.dash-notif-item:hover { background:var(--nx-fill-1); }
.dash-notif-item:last-child { border-bottom:none; }
.dash-notif-icon {
  width:36px; height:36px; border-radius:8px;
  display:flex; align-items:center; justify-content:center; flex:none;
}
.dash-notif-icon svg { width:18px; height:18px; }
.dash-notif-body { flex:1; min-width:0; }
.dash-notif-title {
  font-size:13px; font-weight:600; margin-bottom:4px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  color:var(--nx-ink);
}
.dash-notif-meta { display:flex; align-items:center; gap:6px; font-size:12px; color:var(--nx-ink-3); }
.dash-notif-arrow { width:16px; height:16px; color:var(--nx-ink-3); flex:none; opacity:0; transition:opacity .15s, transform .15s; }
.dash-notif-item:hover .dash-notif-arrow { opacity:1; transform:translateX(3px); }

/* ---------- 杂项 ---------- */
.nx-empty { display:flex; align-items:center; justify-content:center; gap:8px; flex-wrap:wrap; color:var(--nx-ink-3); padding:48px 0; font-size:13px; }
.nx-empty i { flex:none; }
.nx-skeleton { background:linear-gradient(90deg,var(--nx-sk-1) 25%,var(--nx-sk-2) 50%,var(--nx-sk-1) 75%); background-size:200% 100%; animation:nx-sk 1.5s infinite; border-radius:4px; }
@keyframes nx-sk { 0%{background-position:200% 0;} 100%{background-position:-200% 0;} }
.nx-tabs { display:flex; gap:4px; border-bottom:1px solid var(--nx-border); margin-bottom:14px; }
.nx-tab { padding:8px 16px; font-size:13.5px; font-weight:500; color:var(--nx-ink-2); cursor:pointer; border-bottom:2px solid transparent; margin-bottom:-1px; }
.nx-tab.active { color:var(--nx-primary-700); border-bottom-color:var(--nx-primary-700); }
.nx-kb-card { cursor:pointer; transition:all .15s; }
.nx-kb-card:hover { border-color:var(--nx-primary-300); transform:translateY(-2px); box-shadow:var(--nx-shadow-2); }
@media (max-width: 768px) { .nx-sidebar { display:none; } }

/* ============== 代码评审：投票徽章与按钮（Gerrit 风格） ============== */
.nx-vote { display:inline-flex; align-items:center; justify-content:center; min-width:34px; height:22px;
  padding:0 7px; border-radius:5px; font-family:Consolas,monospace; font-size:12px; font-weight:700; }
.nx-vote-plus2 { background:#16a34a; color:#fff; }
.nx-vote-plus1 { background:#dcfce7; color:#15803d; }
.nx-vote-zero  { background:var(--nx-fill-2); color:var(--nx-ink-3); }
.nx-vote-minus1 { background:#ffedd5; color:#c2410c; }
.nx-vote-minus2 { background:#dc2626; color:#fff; }

.nx-vote-btn { min-width:42px; height:30px; border-radius:6px; border:1px solid var(--nx-border);
  background:var(--nx-surface); font-family:Consolas,monospace; font-size:13px; font-weight:700; cursor:pointer; transition:all .12s; }
.nx-vote-btn:hover { transform:translateY(-1px); box-shadow:var(--nx-shadow-1); }
.nx-vote-btn-plus2 { background:#16a34a; border-color:#16a34a; color:#fff; }
.nx-vote-btn-plus1 { border-color:#86efac; background:#f0fdf4; color:#15803d; }
.nx-vote-btn-zero { border-color:#cbd5e1; background:var(--nx-fill-1); color:var(--nx-ink-2); }
.nx-vote-btn-minus1 { border-color:#fdba74; background:#fff7ed; color:#c2410c; }
.nx-vote-btn-minus2 { background:#dc2626; border-color:#dc2626; color:#fff; }

/* ============== 权限分组管理 ============== */
.nx-perm-mem-grid { display:grid; grid-template-columns:1fr 1fr; gap:20px; }
@media (max-width:920px) { .nx-perm-mem-grid { grid-template-columns:1fr; } }
.nx-perm-mem-title { display:flex; align-items:center; gap:7px; font-size:13.5px; font-weight:600; margin-bottom:10px; color:var(--nx-ink-2); }
.nx-perm-mem-title svg { width:15px; height:15px; color:var(--nx-primary-600); }
.nx-perm-mem-title span { color:var(--nx-ink-3); font-weight:500; font-size:12px; }
.nx-chip-list { display:flex; flex-wrap:wrap; gap:8px; min-height:32px; margin-bottom:12px; }
.nx-chip { display:inline-flex; align-items:center; gap:6px; padding:5px 6px 5px 10px;
  background:var(--nx-primary-50); border:1px solid var(--nx-primary-100); border-radius:6px;
  font-size:12.5px; color:var(--nx-primary-700); }
.nx-chip-x { display:flex; align-items:center; justify-content:center; width:18px; height:18px;
  border:none; border-radius:4px; background:transparent; color:var(--nx-primary-600);
  cursor:pointer; transition:all .12s; padding:0; }
.nx-chip-x:hover { background:var(--nx-error); color:#fff; }
.nx-perm-mem-add { display:flex; gap:8px; }

.nx-btn-danger-outline { color:var(--nx-error); border-color:var(--nx-danger-border); background:var(--nx-surface); }
.nx-btn-danger-outline:hover { background:var(--nx-error-bg); }
.nx-btn-primary:disabled, .nx-btn:disabled { opacity:.5; cursor:not-allowed; transform:none; box-shadow:none; }

/* ============== 权限管理：角色 × 功能矩阵 ============== */
/* 深色顶栏图标按钮 hover（覆盖浅色 ghost 态） */
.nx-header .nx-header-icon:hover { background:rgba(255,255,255,.14); color:#fff; }
#perm-matrix { overflow-x:auto; }
.nx-perm-table-wrap { width:100%; margin:0; border:1px solid var(--nx-grid-strong); border-radius:8px;
  overflow:hidden; box-shadow:var(--nx-shadow-1); background:var(--nx-card); }
.nx-perm-table { width:100%; border-collapse:collapse; background:var(--nx-card);
  table-layout:fixed; }
.nx-perm-table th, .nx-perm-table td { padding:10px 14px; border:1px solid var(--nx-grid);
  font-size:13px; text-align:left; }
.nx-perm-table th { background:var(--nx-fill-1); font-weight:600; white-space:nowrap;
  border-color:var(--nx-grid-strong); border-bottom-width:2px; }
.nx-perm-table tbody tr:hover td { background:var(--nx-fill-1); }
.nx-perm-table td.center, .nx-perm-table th.center { text-align:center; width:110px; background:var(--nx-fill-1); }
.nx-perm-table th.center { background:var(--nx-fill-1); }
.nx-perm-table th:first-child, .nx-perm-table td:first-child { width:auto; }
.nx-perm-section td { background:var(--nx-primary-50) !important; color:var(--nx-primary-700);
  font-weight:600; font-size:12px; letter-spacing:.04em; border-color:var(--nx-primary-200) !important; }
.nx-perm-check { width:16px; height:16px; accent-color:var(--nx-primary-700); cursor:pointer; vertical-align:middle; }
.nx-perm-check:disabled { cursor:not-allowed; opacity:.55; }
.nx-perm-dash { color:var(--nx-ink-3); }

/* ============== 界面主题选择器 ============== */
.nx-theme-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(170px,1fr)); gap:14px; margin-top:6px; }
.nx-theme-card {
  position:relative; display:block; width:100%; text-align:left; cursor:pointer;
  border:2px solid var(--nx-border); border-radius:10px; padding:10px;
  background:var(--nx-card); color:var(--nx-ink);
  transition:border-color .15s, box-shadow .15s, transform .15s;
}
.nx-theme-card:hover { border-color:var(--nx-primary-400); transform:translateY(-2px); box-shadow:var(--nx-shadow-2); }
.nx-theme-card.active { border-color:var(--nx-primary-600); box-shadow:0 0 0 3px var(--nx-ring-shadow); }
.nx-theme-preview {
  height:86px; border-radius:7px; overflow:hidden; border:1px solid var(--nx-border);
  display:flex; flex-direction:column; margin-bottom:9px;
}
.nx-tp-top { height:15px; flex:none; display:flex; align-items:center; padding:0 6px; gap:4px; }
.nx-tp-top i { width:5px; height:5px; border-radius:9999px; background:rgba(255,255,255,.55); display:block; }
.nx-tp-body { flex:1; display:flex; min-height:0; }
.nx-tp-side { width:24%; flex:none; }
.nx-tp-main { flex:1; min-width:0; padding:7px 8px; display:flex; flex-direction:column; gap:5px; }
.nx-tp-line { height:5px; border-radius:3px; }
.nx-tp-dots { display:flex; gap:4px; margin-top:auto; }
.nx-tp-dots b { width:14px; height:14px; border-radius:4px; display:block; }
.nx-theme-name { font-size:13px; font-weight:600; display:flex; align-items:center; justify-content:space-between; gap:6px; }
.nx-theme-desc { font-size:11.5px; color:var(--nx-ink-3); margin-top:2px; line-height:1.4; }
.nx-theme-check { color:var(--nx-primary-600); display:none; flex:none; }
.nx-theme-card.active .nx-theme-check { display:block; }
.nx-theme-hint { font-size:12px; color:var(--nx-ink-3); margin:10px 0 0; }

/* ============ 区域显示详情页（Bug/评审等） ============ */
.nx-detail-page { position:absolute; inset:0; background:var(--nx-bg); z-index:10; display:flex; flex-direction:column; min-height:calc(100vh - 60px); }
.nx-detail-header { display:flex; align-items:center; gap:12px; padding:10px 20px; border-bottom:1px solid var(--nx-border); background:var(--nx-card); flex:none; }
.nx-detail-title { font-size:15px; font-weight:600; color:var(--nx-ink-1); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.nx-detail-body { flex:1; overflow-y:auto; padding:20px; }
.nx-detail-footer { display:flex; justify-content:flex-end; gap:10px; padding:12px 20px; border-top:1px solid var(--nx-border); background:var(--nx-card); flex:none; }
/* 内容流变体：footer 跟随内容滚动显示（用于表单页），不再固定贴视口底部 */
.nx-detail-page.nx-detail-flow { display:block; overflow-y:auto; }
.nx-detail-page.nx-detail-flow .nx-detail-header { position:sticky; top:0; z-index:6; }
.nx-detail-page.nx-detail-flow .nx-detail-body { overflow:visible; flex:none; }
.nx-detail-page.nx-detail-flow .nx-detail-footer { border-bottom:0; }

/* ============ 数据库管理 ============ */
.nx-db-tbl { padding:8px 10px; border-radius:8px; cursor:pointer; border:1px solid transparent; }
.nx-db-tbl:hover { background:var(--nx-fill-1); }
.nx-db-tbl.active { background:var(--nx-fill-2); border-color:var(--nx-border); }

/* ============ 品牌 Logo（思趣游戏） ============ */
.nx-logo-mark {
  position:relative; display:flex; align-items:center; justify-content:center;
  background:#fff; border-radius:8px; overflow:hidden; flex:none;
  box-shadow:0 1px 2px rgba(0,0,0,.12);
}
.nx-logo-mark .nx-logo-fb {
  position:absolute; font-weight:700; color:var(--nx-primary-700);
  font-size:15px; letter-spacing:.02em; user-select:none;
}
.nx-logo-mark img { position:relative; width:100%; height:100%; object-fit:contain; display:block; }
/* 登录品牌区主视觉：白底卡片承载 logo，与深色品牌面板形成对比 */
.nx-logo-hero {
  width:120px; height:120px; border-radius:18px; background:#fff;
  display:flex; align-items:center; justify-content:center; overflow:hidden;
  box-shadow:0 8px 24px rgba(0,0,0,.25); margin-bottom:22px;
}
.nx-logo-hero img { width:88%; height:88%; object-fit:contain; display:block; }
