*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --bg-deep: #0f1117; --bg-card: #16213e; --bg-input: #0d2040; --accent: #e94560; --accent-hov: #c73652; --border: #1e3a5f; --text: #dde4f0; --muted: #7a8aaa; --green: #4caf6e; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg-deep); color: var(--text); height: 100vh; display: flex; align-items: center; justify-content: center; -webkit-font-smoothing: antialiased; user-select: none; } /* ── Login page ──────────────────────────────────────────── */ body.login-page { align-items: center; } .login-card { width: 380px; background: var(--bg-card); border: 1px solid var(--border); border-radius: 14px; padding: 2.2rem 2rem; box-shadow: 0 24px 60px rgba(0,0,0,0.55); } .brand { text-align: center; margin-bottom: 2rem; } .brand h1 { font-size: 1.65rem; font-weight: 700; color: var(--accent); letter-spacing: -0.02em; } .brand .tagline { font-size: 0.78rem; color: var(--muted); margin-top: 0.2rem; text-transform: uppercase; letter-spacing: 0.1em; } /* ── Form elements ───────────────────────────────────────── */ .field { margin-bottom: 1.1rem; } .field label { display: block; font-size: 0.72rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 0.4rem; } input[type="text"], input[type="password"] { width: 100%; padding: 0.6rem 0.85rem; background: var(--bg-input); border: 1px solid var(--border); border-radius: 7px; color: var(--text); font-size: 0.92rem; outline: none; transition: border-color 0.18s; } input[type="text"]:focus, input[type="password"]:focus { border-color: var(--accent); } .checkbox-row { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1.4rem; } .checkbox-row label { font-size: 0.82rem; color: var(--muted); cursor: pointer; text-transform: none; letter-spacing: 0; } input[type="checkbox"] { accent-color: var(--accent); cursor: pointer; width: 15px; height: 15px; } /* ── Buttons ─────────────────────────────────────────────── */ .btn-primary { width: 100%; padding: 0.72rem; background: var(--accent); color: #fff; border: none; border-radius: 7px; font-size: 0.95rem; font-weight: 600; cursor: pointer; transition: background 0.18s; } .btn-primary:hover:not(:disabled) { background: var(--accent-hov); } .btn-primary:disabled { background: #3a3a4a; color: #666; cursor: not-allowed; } .btn-secondary { padding: 0.42rem 0.9rem; background: transparent; color: var(--muted); border: 1px solid #2a3a55; border-radius: 7px; font-size: 0.8rem; cursor: pointer; transition: all 0.18s; } .btn-secondary:hover { border-color: var(--accent); color: var(--accent); } .btn-connect { padding: 0.44rem 1.1rem; background: var(--accent); color: #fff; border: none; border-radius: 7px; font-size: 0.82rem; font-weight: 600; cursor: pointer; transition: background 0.18s; white-space: nowrap; flex-shrink: 0; } .btn-connect:hover:not(:disabled) { background: var(--accent-hov); } .btn-connect:disabled { background: #3a3a4a; color: #666; cursor: not-allowed; } /* ── Error / notice ──────────────────────────────────────── */ .error { margin-top: 1rem; padding: 0.65rem 0.85rem; background: rgba(233,69,96,0.12); border: 1px solid rgba(233,69,96,0.35); border-radius: 7px; color: #f07090; font-size: 0.82rem; line-height: 1.45; } .notice { margin-top: 1rem; padding: 0.65rem 0.85rem; background: rgba(76,175,110,0.1); border: 1px solid rgba(76,175,110,0.3); border-radius: 7px; color: #80d09a; font-size: 0.82rem; } .hidden { display: none !important; } /* ── VMs page ────────────────────────────────────────────── */ body.vms-page { align-items: flex-start; padding: 2rem 2.5rem; } .vms-wrapper { width: 100%; max-width: 660px; margin: 0 auto; } .page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.4rem; padding-bottom: 1rem; border-bottom: 1px solid var(--border); } .page-header h2 { font-size: 1.1rem; font-weight: 600; color: var(--text); } .header-actions { display: flex; gap: 0.5rem; align-items: center; } /* ── VM cards ─────────────────────────────────────────────── */ .vm-list { display: flex; flex-direction: column; gap: 0.6rem; } .vm-card { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 1rem 1.2rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: 9px; transition: border-color 0.18s; } .vm-card:hover { border-color: #2e5a8a; } .vm-info { flex: 1; min-width: 0; } .vm-name { font-size: 0.97rem; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-bottom: 0.22rem; } .vm-meta { font-size: 0.75rem; color: var(--muted); } .status-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--green); margin-right: 0.35rem; vertical-align: middle; } /* ── States ───────────────────────────────────────────────── */ .loading-state, .empty-state { text-align: center; padding: 3rem 0; color: var(--muted); } .spinner { width: 34px; height: 34px; border: 3px solid #1e2d40; border-top-color: var(--accent); border-radius: 50%; animation: spin 0.75s linear infinite; margin: 0 auto 1rem; } @keyframes spin { to { transform: rotate(360deg); } } .empty-state .hint { font-size: 0.78rem; margin-top: 0.5rem; color: #3a4a60; }