:root{--bg: #f4f6fb;--bg-2: #ffffff;--panel: #ffffff;--panel-2: #f8fafc;--border: #e6eaf2;--border-2: #d5dcea;--text: #1e293b;--text-2: #5b6b82;--text-3: #94a3b8;--accent: #7c3aed;--accent-2: #8b5cf6;--accent-soft: #f5f3ff;--green: #16a34a;--green-soft: #ecfdf3;--red: #dc2626;--red-soft: #fef2f2;--yellow: #d97706;--yellow-soft: #fffbeb;--purple: #7c3aed;--purple-soft: #f5f3ff;--blue-soft: #eff6ff;--glow: rgba(124, 58, 237, .12);--radius: 12px;--shadow: 0 1px 3px rgba(16, 24, 40, .04), 0 1px 2px rgba(16, 24, 40, .06);--shadow-md: 0 4px 16px rgba(16, 24, 40, .06)}*{margin:0;padding:0;box-sizing:border-box}html,body,#app{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,Roboto,Helvetica,Arial,sans-serif;background:var(--bg);color:var(--text);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b8}.muted{color:var(--text-3)}.mono{font-family:SF Mono,Cascadia Code,Fira Code,Consolas,monospace;font-size:12px}.flex{display:flex}.flex-1{flex:1}.items-center{align-items:center}.gap-8{gap:8px}.gap-16{gap:16px}.card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:20px;box-shadow:var(--shadow);transition:box-shadow .2s}.card:hover{box-shadow:var(--shadow-md)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 16px;border-radius:8px;border:1px solid var(--border-2);background:var(--panel);color:var(--text);cursor:pointer;font-size:13px;font-weight:500;transition:all .16s;white-space:nowrap}.btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-soft)}.btn-primary{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}.btn-primary:hover{background:#1d4ed8;border-color:#1d4ed8;color:#fff;box-shadow:0 2px 8px var(--glow)}.btn-danger{color:var(--red)}.btn-danger:hover{border-color:var(--red);color:var(--red);background:var(--red-soft)}.btn-sm{padding:5px 12px;font-size:12px;border-radius:7px}.btn:disabled{opacity:.5;cursor:not-allowed}.input,.select{padding:8px 12px;border-radius:8px;border:1px solid var(--border-2);background:var(--panel);color:var(--text);font-size:13px;outline:none;transition:border-color .16s,box-shadow .16s}.input::placeholder{color:var(--text-3)}.input:focus,.select:focus{border-color:var(--accent);box-shadow:0 0 0 3px #2563eb1a}.select option{background:var(--panel)}.tag{display:inline-flex;align-items:center;gap:4px;padding:2px 10px;border-radius:6px;font-size:12px;font-weight:500;border:1px solid transparent}.tag-green{background:var(--green-soft);color:var(--green);border-color:#16a34a33}.tag-red{background:var(--red-soft);color:var(--red);border-color:#dc262633}.tag-yellow{background:var(--yellow-soft);color:var(--yellow);border-color:#d9770633}.tag-blue{background:var(--blue-soft);color:var(--accent);border-color:#2563eb33}.tag-purple{background:var(--purple-soft);color:var(--purple);border-color:#7c3aed33}.tag-gray{background:var(--panel-2);color:var(--text-2);border-color:var(--border)}.dot{width:8px;height:8px;border-radius:50%;display:inline-block}.dot-online{background:var(--green);box-shadow:0 0 0 3px #16a34a26;animation:pulse 2s infinite}.dot-offline{background:var(--text-3)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.45}}.table{width:100%;border-collapse:collapse;font-size:13px}.table th{text-align:left;padding:12px 14px;color:var(--text-2);font-weight:600;font-size:12px;border-bottom:1px solid var(--border);background:var(--panel-2);position:sticky;top:0;white-space:nowrap}.table td{padding:12px 14px;border-bottom:1px solid var(--border);vertical-align:middle;color:var(--text)}.table tbody tr{transition:background .15s}.table tbody tr:hover{background:var(--accent-soft)}.table tbody tr:last-child td{border-bottom:none}.skeleton{background:linear-gradient(90deg,var(--panel-2) 25%,#eef2f7 50%,var(--panel-2) 75%);background-size:200% 100%;animation:shimmer 1.4s infinite;border-radius:6px}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.fade-in{animation:fadeIn .3s ease}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.empty{text-align:center;padding:60px 20px;color:var(--text-3)}.empty .icon{font-size:48px;margin-bottom:12px;opacity:.4}
