/* ═════════════════════════════════════════════════════════ Proxmox VE-inspired dark theme for VM Bench ═════════════════════════════════════════════════════════ */ :root { --pve-bg: #161616; --pve-panel-bg: #1e1e1e; --pve-border: #3a3a3a; --pve-text: #e0e0e0; --pve-muted: #888; --pve-accent: #f48024; /* Proxmox orange */ --pve-blue: #3892d5; --pve-green: #54b948; --pve-red: #e8524a; --pve-yellow: #e5a72e; --pve-radius: 4px; --pve-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } * { box-sizing: border-box; margin: 0; padding: 0; } body { background: var(--pve-bg); color: var(--pve-text); font-family: var(--pve-font); font-size: 13px; line-height: 1.5; min-height: 100vh; display: flex; flex-direction: column; } /* ── Header ──────────────────────────────────────────────────── */ .pve-header { background: var(--pve-panel-bg); border-bottom: 2px solid var(--pve-accent); padding: 0.6rem 1.5rem; display: flex; align-items: center; gap: 0.75rem; } .pve-header .pve-logo { font-size: 1.1rem; font-weight: 700; color: var(--pve-accent); } .pve-header .pve-sub { font-size: 0.75rem; color: var(--pve-muted); margin-left: auto; } /* ── Footer ──────────────────────────────────────────────────── */ .pve-footer { margin-top: auto; padding: 0.4rem 1.5rem; font-size: 0.7rem; color: var(--pve-muted); display: flex; justify-content: space-between; border-top: 1px solid var(--pve-border); background: var(--pve-panel-bg); } /* ── Container ───────────────────────────────────────────────── */ .pve-container { max-width: 780px; margin: 0 auto; padding: 1.5rem 1rem; width: 100%; } /* ── Panels ──────────────────────────────────────────────────── */ .pve-panel { background: var(--pve-panel-bg); border: 1px solid var(--pve-border); border-radius: var(--pve-radius); margin-bottom: 1.25rem; overflow: hidden; } .pve-panel-header { background: #252525; padding: 0.65rem 1.25rem; border-bottom: 1px solid var(--pve-border); display: flex; align-items: center; justify-content: space-between; } .pve-panel-title { font-size: 0.9rem; font-weight: 600; color: var(--pve-text); } .pve-panel-title::before { content: ""; display: inline-block; width: 4px; height: 14px; background: var(--pve-accent); margin-right: 8px; vertical-align: middle; border-radius: 2px; } .pve-panel-body { padding: 1.25rem; } /* ── Buttons ─────────────────────────────────────────────────── */ .pve-btn { display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.45rem 1rem; font-size: 0.8rem; font-weight: 600; border: 1px solid var(--pve-border); border-radius: var(--pve-radius); background: #2a2a2a; color: var(--pve-text); cursor: pointer; text-decoration: none; transition: background 0.15s, border-color 0.15s; white-space: nowrap; } .pve-btn:hover { background: #333; border-color: #555; } .pve-btn:disabled { opacity: 0.5; cursor: not-allowed; } .pve-btn-primary { background: var(--pve-accent); color: #fff; border-color: var(--pve-accent); } .pve-btn-primary:hover { background: #e07a1e; } .pve-btn-success { background: var(--pve-green); color: #fff; border-color: var(--pve-green); } .pve-btn-success:hover { background: #4aa540; } .pve-btn-danger { background: var(--pve-red); color: #fff; border-color: var(--pve-red); } .pve-btn-danger:hover { background: #d9443f; } .pve-btn-small { padding: 0.25rem 0.6rem; font-size: 0.72rem; } .pve-btn-row { display: flex; gap: 0.6rem; margin-top: 0.75rem; flex-wrap: wrap; } /* ── Forms ───────────────────────────────────────────────────── */ .pve-form-group { margin-bottom: 0.85rem; } .pve-form-group label { display: block; margin-bottom: 0.2rem; font-size: 0.75rem; color: var(--pve-muted); font-weight: 600; } .pve-input, .pve-select { width: 100%; padding: 0.45rem 0.65rem; background: var(--pve-bg); border: 1px solid var(--pve-border); border-radius: var(--pve-radius); color: var(--pve-text); font-family: inherit; font-size: 0.82rem; transition: border-color 0.15s; } .pve-input:focus, .pve-select:focus { border-color: var(--pve-accent); outline: none; box-shadow: 0 0 0 2px rgba(244,128,36,0.15); } .pve-hint { display: block; font-size: 0.68rem; color: var(--pve-muted); margin-top: 0.2rem; } .pve-row { display: grid; grid-template-columns: 1fr 1fr; gap: 0.85rem; } @media (max-width: 520px) { .pve-row { grid-template-columns: 1fr; } } .pve-hidden { display: none !important; } /* ── Tables ──────────────────────────────────────────────────── */ .pve-table { width: 100%; border-collapse: collapse; margin: 0.5rem 0; } .pve-table td { padding: 0.35rem 0.6rem; border-bottom: 1px solid var(--pve-border); font-size: 0.82rem; } .pve-table td:first-child { color: var(--pve-muted); width: 35%; font-weight: 600; } .pve-table td:last-child { font-weight: 500; } /* ── Progress ────────────────────────────────────────────────── */ .pve-progress { height: 1.15rem; background: var(--pve-bg); border-radius: var(--pve-radius); overflow: hidden; margin: 0.6rem 0; } .pve-progress-bar { height: 100%; background: var(--pve-accent); transition: width 0.3s ease; display: flex; align-items: center; justify-content: center; font-size: 0.68rem; font-weight: 700; color: #fff; min-width: 2.5rem; } /* ── Badges ──────────────────────────────────────────────────── */ .pve-badge { display: inline-block; padding: 0.2rem 0.55rem; border-radius: 3px; font-size: 0.72rem; font-weight: 600; margin-bottom: 0.5rem; } .pve-badge-queued { background: #3b3410; color: var(--pve-yellow); } .pve-badge-running { background: #1e3a5f; color: var(--pve-blue); } .pve-badge-completed { background: #1a3a1a; color: var(--pve-green); } .pve-badge-failed { background: #3a1a1a; color: var(--pve-red); } /* ── Spinner ─────────────────────────────────────────────────── */ .pve-spinner { display: inline-block; width: 0.8rem; height: 0.8rem; border: 2px solid var(--pve-border); border-top-color: currentColor; border-radius: 50%; animation: pve-spin 0.6s linear infinite; vertical-align: middle; margin-right: 0.3rem; } @keyframes pve-spin { to { transform: rotate(360deg); } } /* ── Alerts ──────────────────────────────────────────────────── */ .pve-alert { padding: 0.55rem 0.75rem; border-radius: var(--pve-radius); font-size: 0.82rem; margin-top: 0.5rem; line-height: 1.5; } .pve-alert-error { background: #3a1a1a; border: 1px solid var(--pve-red); color: var(--pve-red); } .pve-alert-success { background: #1a3a1a; border: 1px solid var(--pve-green); color: var(--pve-green); } .pve-alert-info { background: #1a2a3a; border: 1px solid var(--pve-blue); color: var(--pve-blue); } /* ── Misc ────────────────────────────────────────────────────── */ .pve-dim { color: var(--pve-muted); } .pve-divider { border: none; border-top: 1px solid var(--pve-border); margin: 1rem 0; } .pve-code { background: var(--pve-bg); padding: 0.1rem 0.4rem; border-radius: 2px; font-size: 0.78rem; } .pve-center { text-align: center; }