/* ═════════════════════════════════════════════════════════ Proxmox VE-inspired light theme for VM Bench ═════════════════════════════════════════════════════════ */ :root { --pve-bg: #f0f0f0; --pve-panel-bg: #ffffff; --pve-border: #cfcfcf; --pve-text: #333333; --pve-muted: #666666; --pve-accent: #f48024; --pve-blue: #3892d5; --pve-green: #54b948; --pve-red: #e8524a; --pve-yellow: #e5a72e; --pve-header-bg: #1b3a5c; --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-header-bg); padding: 0.5rem 1.5rem; display: flex; align-items: center; gap: 0.75rem; } .pve-header .pve-logo { font-size: 1.1rem; font-weight: 700; color: #fff; } .pve-header .pve-sub { font-size: 0.75rem; color: rgba(255,255,255,0.65); 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; box-shadow: 0 1px 2px rgba(0,0,0,0.04); } .pve-panel-header { background: #f8f8f8; padding: 0.55rem 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.4rem 0.9rem; font-size: 0.78rem; font-weight: 600; border: 1px solid var(--pve-border); border-radius: var(--pve-radius); background: #f5f5f5; color: var(--pve-text); cursor: pointer; text-decoration: none; transition: background 0.12s; white-space: nowrap; } .pve-btn:hover { background: #e8e8e8; } .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.2rem 0.55rem; font-size: 0.7rem; } .pve-btn-row { display: flex; gap: 0.5rem; 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.4rem 0.6rem; background: #fff; border: 1px solid var(--pve-border); border-radius: var(--pve-radius); color: var(--pve-text); font-family: inherit; font-size: 0.8rem; 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.2); } .pve-select { appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 0.6rem center; padding-right: 2rem; cursor: pointer; } .pve-select option { background: #fff; color: var(--pve-text); } .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.8rem; } .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.1rem; background: #e8e8e8; 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.65rem; 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.4rem; } .pve-badge-queued { background: #fff3cd; color: #856404; } .pve-badge-running { background: #cce5ff; color: #004085; } .pve-badge-completed { background: #d4edda; color: #155724; } .pve-badge-failed { background: #f8d7da; color: #721c24; } /* ── Spinner ─────────────────────────────────────────────────── */ .pve-spinner { display: inline-block; width: 0.75rem; height: 0.75rem; border: 2px solid var(--pve-border); border-top-color: var(--pve-accent); 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: #f8d7da; border: 1px solid #f5c6cb; color: #721c24; } .pve-alert-success { background: #d4edda; border: 1px solid #c3e6cb; color: #155724; } .pve-alert-info { background: #cce5ff; border: 1px solid #b8daff; color: #004085; } /* ── Misc ────────────────────────────────────────────────────── */ .pve-dim { color: var(--pve-muted); } .pve-divider { border: none; border-top: 1px solid var(--pve-border); margin: 1rem 0; } .pve-code { background: #f5f5f5; padding: 0.1rem 0.4rem; border-radius: 2px; font-size: 0.78rem; } .pve-center { text-align: center; } /* ── Landing page ─────────────────────────────────────────────── */ .pve-hero { text-align: center; padding: 1.8rem 1rem 1.2rem; } .pve-hero h1 { font-size: 1.5rem; font-weight: 700; color: var(--pve-text); margin-bottom: 0.3rem; } .pve-hero p { font-size: 0.82rem; color: var(--pve-muted); } .landing-cards { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.25rem; } @media (max-width: 520px) { .landing-cards { grid-template-columns: 1fr; } } .landing-card { background: var(--pve-panel-bg); border: 1px solid var(--pve-border); border-radius: var(--pve-radius); padding: 1.2rem 1rem; text-align: center; cursor: default; box-shadow: 0 1px 2px rgba(0,0,0,0.04); } .landing-card:hover { border-color: var(--pve-accent); } .landing-card-icon { font-size: 1.6rem; margin-bottom: 0.4rem; } .landing-card h3 { font-size: 0.9rem; font-weight: 600; margin-bottom: 0.3rem; } .landing-card p { font-size: 0.75rem; color: var(--pve-muted); margin-bottom: 0.75rem; line-height: 1.4; }