*{margin:0;padding:0;box-sizing:border-box}:root{--c-primary: #2563eb;--c-primary-hover: #1d4ed8;--c-bg: #f8fafc;--c-surface: #ffffff;--c-border: #e2e8f0;--c-text: #1e293b;--c-text-secondary: #64748b;--c-danger: #dc2626;--c-success: #16a34a;--c-warning: #d97706;--sidebar-width: 200px;--header-height: 52px}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Microsoft YaHei,sans-serif;font-size:14px;color:var(--c-text);background:var(--c-bg)}a{color:var(--c-primary);text-decoration:none}a:hover{color:var(--c-primary-hover)}button{padding:6px 16px;border:1px solid var(--c-border);border-radius:6px;background:var(--c-surface);color:var(--c-text);cursor:pointer;font-size:14px;transition:all .15s}button:hover{border-color:var(--c-primary);color:var(--c-primary)}button.primary{background:var(--c-primary);color:#fff;border-color:var(--c-primary)}button.primary:hover{background:var(--c-primary-hover)}button:disabled{opacity:.5;cursor:not-allowed}input,select{padding:6px 10px;border:1px solid var(--c-border);border-radius:6px;font-size:14px;background:var(--c-surface);color:var(--c-text)}table{border-collapse:collapse;width:100%}th,td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--c-border)}th{font-weight:600;color:var(--c-text-secondary);background:var(--c-bg)}.card{background:var(--c-surface);border:1px solid var(--c-border);border-radius:8px;padding:16px}.stat-card{display:flex;flex-direction:column;gap:4px}.stat-card .label{font-size:12px;color:var(--c-text-secondary)}.stat-card .value{font-size:24px;font-weight:700;font-variant-numeric:tabular-nums}.grid{display:grid;gap:16px}.grid-4{grid-template-columns:repeat(4,1fr)}.grid-2{grid-template-columns:repeat(2,1fr)}.mono{font-family:SF Mono,Fira Code,Consolas,monospace;font-variant-numeric:tabular-nums}.text-secondary{color:var(--c-text-secondary)}.text-danger{color:var(--c-danger)}.text-success{color:var(--c-success)}.text-warning{color:var(--c-warning)}.spinner{display:inline-block;width:16px;height:16px;border:2px solid var(--c-border);border-top-color:var(--c-primary);border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.empty-state{padding:40px;text-align:center;color:var(--c-text-secondary)}.error-banner{padding:8px 12px;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;color:var(--c-danger);font-size:13px;margin-bottom:12px}
