:root{--bg-main: #0b0f19;--bg-card: rgba(18, 24, 38, .75);--bg-card-hover: rgba(28, 36, 56, .85);--border-color: rgba(255, 255, 255, .08);--border-accent: rgba(99, 102, 241, .3);--text-primary: #f8fafc;--text-secondary: #94a3b8;--text-muted: #64748b;--accent-primary: #6366f1;--accent-primary-hover: #4f46e5;--accent-secondary: #06b6d4;--accent-success: #10b981;--accent-warning: #f59e0b;--accent-danger: #ef4444;--shadow-sm: 0 2px 8px rgba(0, 0, 0, .4);--shadow-md: 0 8px 24px rgba(0, 0, 0, .5);--shadow-glow: 0 0 20px rgba(99, 102, 241, .25);--font-heading: "Outfit", -apple-system, BlinkMacSystemFont, sans-serif;--font-body: "Inter", -apple-system, BlinkMacSystemFont, sans-serif;--radius-sm: 8px;--radius-md: 14px;--radius-lg: 20px}*{box-sizing:border-box;margin:0;padding:0}body{font-family:var(--font-body);background-color:var(--bg-main);color:var(--text-primary);line-height:1.6;min-height:100vh;background-image:radial-gradient(at 0% 0%,rgba(99,102,241,.12) 0px,transparent 50%),radial-gradient(at 100% 100%,rgba(6,182,212,.1) 0px,transparent 50%);background-attachment:fixed;-webkit-font-smoothing:antialiased}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading);letter-spacing:-.02em}button{font-family:var(--font-body);cursor:pointer;border:none;outline:none;transition:all .2s cubic-bezier(.4,0,.2,1)}.glass-panel{background:var(--bg-card);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--border-color);border-radius:var(--radius-md);box-shadow:var(--shadow-md)}.badge{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:9999px;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.badge-online{background:#10b98126;color:var(--accent-success);border:1px solid rgba(16,185,129,.3)}.badge-offline{background:#ef444426;color:var(--accent-danger);border:1px solid rgba(239,68,68,.3)}.badge-pwa{background:#6366f126;color:var(--accent-primary);border:1px solid rgba(99,102,241,.3)}.pulse-dot{width:8px;height:8px;border-radius:50%;background-color:currentColor;box-shadow:0 0 8px currentColor;animation:pulse 2s infinite}@keyframes pulse{0%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.85)}to{opacity:1;transform:scale(1)}}
