:root{--bg: #0f1117;--bg2: #161b27;--bg3: #1e2538;--surface: #242b3d;--surface2: #2d3650;--border: #2e3654;--border2: #3d4a6a;--text: #e8ecf5;--text2: #8b95b0;--text3: #5a6480;--accent: #4e7cff;--accent2: #3d6bec;--accentbg: #1a2654;--green: #2dca72;--greenbg: #0d2a1c;--red: #ff5252;--redbg: #2a0d0d;--amber: #f5a623;--amberbg: #2a1e0d;--purple: #a78bfa;--purplebg: #1e1430;--radius: 10px;--radius2: 14px;--sidebar-w: 220px}*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,PingFang SC,Microsoft YaHei,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;-webkit-font-smoothing:antialiased}a{color:var(--accent);text-decoration:none}a:hover{color:var(--accent2)}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border2);border-radius:2px}.card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius2);padding:20px}.card-title{font-size:14px;font-weight:600;margin-bottom:14px;display:flex;align-items:center;gap:7px}.btn{display:inline-flex;align-items:center;gap:7px;padding:9px 18px;border-radius:var(--radius);font-size:13.5px;font-weight:500;cursor:pointer;border:none;transition:all .15s;white-space:nowrap}.btn-primary{background:var(--accent);color:#fff}.btn-primary:hover{background:var(--accent2)}.btn-ghost{background:transparent;color:var(--text2);border:1px solid var(--border2)}.btn-ghost:hover{color:var(--text);background:var(--surface)}.btn-sm{padding:6px 12px;font-size:12.5px}.btn-danger{background:var(--redbg);color:var(--red);border:1px solid rgba(255,82,82,.2)}.btn-success{background:var(--greenbg);color:var(--green);border:1px solid rgba(45,202,114,.2)}.btn:disabled{opacity:.45;cursor:not-allowed}.badge{display:inline-flex;align-items:center;padding:3px 9px;border-radius:20px;font-size:11.5px;font-weight:500}.badge-green{background:var(--greenbg);color:var(--green)}.badge-accent{background:var(--accentbg);color:var(--accent)}.badge-amber{background:var(--amberbg);color:var(--amber)}.badge-red{background:var(--redbg);color:var(--red)}.badge-gray{background:var(--surface);color:var(--text3)}.badge-purple{background:var(--purplebg);color:var(--purple)}.input{background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:9px 14px;font-size:14px;color:var(--text);width:100%;outline:none;transition:border .15s;font-family:inherit}.input:focus{border-color:var(--accent)}textarea.input{resize:vertical;min-height:80px}select.input{cursor:pointer}.progress-bar{height:6px;background:var(--surface);border-radius:3px;overflow:hidden}.progress-fill{height:100%;border-radius:3px;background:var(--accent);transition:width .4s}.progress-fill.green{background:var(--green)}.progress-fill.amber{background:var(--amber)}.progress-fill.red{background:var(--red)}.fade-enter-active,.fade-leave-active{transition:opacity .2s,transform .2s}.fade-enter-from{opacity:0;transform:translateY(6px)}.fade-leave-to{opacity:0}.slide-enter-active,.slide-leave-active{transition:all .25s}.slide-enter-from{transform:translate(16px);opacity:0}.slide-leave-to{transform:translate(-16px);opacity:0}.page-wrap{padding:28px 32px}.page-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:24px}.page-title{font-size:22px;font-weight:700;letter-spacing:-.3px}.page-desc{font-size:13.5px;color:var(--text2);margin-top:5px}.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px}.grid-4{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:12px}.table-wrap{overflow-x:auto}table{width:100%;border-collapse:collapse;font-size:13px}th{font-size:11px;font-weight:600;color:var(--text3);text-align:left;padding:9px 14px;border-bottom:1px solid var(--border);letter-spacing:.05em;text-transform:uppercase;white-space:nowrap}td{padding:11px 14px;border-bottom:1px solid var(--border);color:var(--text2)}tr:last-child td{border-bottom:none}tr:hover td{background:#ffffff03}@keyframes spin{to{transform:rotate(360deg)}}.spinner{width:20px;height:20px;border:2px solid var(--border2);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite}@keyframes blink{0%,80%,to{opacity:.2}40%{opacity:1}}.dot{animation:blink 1.2s infinite;display:inline-block}.dot:nth-child(2){animation-delay:.2s}.dot:nth-child(3){animation-delay:.4s}
