:root { --bg: #0f1117; --surface: #1a1d27; --border: #2a2d3a; --text: #e2e8f0; --muted: #64748b; --accent: #6366f1; --accent-hover: #818cf8; --success: #22c55e; --warning: #f59e0b; --error: #ef4444; --running: #3b82f6; } *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; font-size: 14px; background: var(--bg); color: var(--text); min-height: 100vh; display: flex; flex-direction: column; } /* Nav */ nav { display: flex; align-items: center; gap: 1.5rem; padding: 0.75rem 2rem; background: var(--surface); border-bottom: 1px solid var(--border); } nav a { color: var(--muted); text-decoration: none; font-size: 0.9rem; } nav a:hover { color: var(--text); } nav .brand { font-weight: 700; font-size: 1rem; color: var(--accent); margin-right: auto; } /* Main */ main { flex: 1; max-width: 1100px; width: 100%; margin: 0 auto; padding: 2rem; } footer { text-align: center; padding: 1rem; color: var(--muted); font-size: 0.8rem; border-top: 1px solid var(--border); } footer a { color: var(--muted); } /* Headings */ h1 { font-size: 1.5rem; font-weight: 600; margin-bottom: 1.5rem; } h2 { font-size: 1.1rem; font-weight: 600; margin: 2rem 0 1rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.75rem; } .page-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; } .page-header h1 { margin-bottom: 0; } /* Alerts */ .alert { padding: 0.75rem 1rem; border-radius: 6px; margin-bottom: 1.5rem; font-size: 0.9rem; } .alert-success { background: rgba(34,197,94,0.1); border: 1px solid rgba(34,197,94,0.3); color: var(--success); } .alert-warning { background: rgba(245,158,11,0.1); border: 1px solid rgba(245,158,11,0.3); color: var(--warning); } /* Stats grid */ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 1rem; margin-bottom: 2rem; } .stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem 1.5rem; } .stat-value { font-size: 2rem; font-weight: 700; color: var(--accent); } .stat-label { font-size: 0.8rem; color: var(--muted); margin-top: 0.25rem; } /* Tables */ table { width: 100%; border-collapse: collapse; background: var(--surface); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; margin-bottom: 1.5rem; } th { text-align: left; padding: 0.6rem 1rem; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); border-bottom: 1px solid var(--border); background: rgba(255,255,255,0.02); } td { padding: 0.6rem 1rem; border-bottom: 1px solid var(--border); vertical-align: middle; } tr:last-child td { border-bottom: none; } tr:hover td { background: rgba(255,255,255,0.02); } /* Badges */ .badge { display: inline-block; padding: 0.2rem 0.55rem; border-radius: 999px; font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; } .badge-success, .badge-uploaded { background: rgba(34,197,94,0.15); color: var(--success); } .badge-error { background: rgba(239,68,68,0.15); color: var(--error); } .badge-partial, .badge-skipped_duplicate { background: rgba(245,158,11,0.15); color: var(--warning); } .badge-running { background: rgba(59,130,246,0.15); color: var(--running); } /* Buttons */ .btn { display: inline-block; padding: 0.5rem 1.25rem; border-radius: 6px; font-size: 0.9rem; font-weight: 500; cursor: pointer; border: none; text-decoration: none; transition: background 0.15s; } .btn-primary { background: var(--accent); color: #fff; } .btn-primary:hover { background: var(--accent-hover); } .btn-secondary { background: transparent; color: var(--accent); border: 1px solid var(--accent); } .btn-secondary:hover { background: rgba(99,102,241,0.1); } .btn-disabled { background: var(--border); color: var(--muted); cursor: not-allowed; } .btn-danger { background: #dc2626; color: #fff; border: 1px solid #dc2626; } .btn-danger:hover { background: #b91c1c; border-color: #b91c1c; } .danger-zone { border-color: rgba(220,38,38,0.4); } /* Forms */ .form-section { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 1.5rem; margin-bottom: 1.5rem; } .form-section h2 { margin-top: 0; } .form-row { display: flex; flex-direction: column; gap: 0.4rem; margin-bottom: 1.25rem; } .form-row:last-child { margin-bottom: 0; } label { font-size: 0.85rem; color: var(--muted); font-weight: 500; } input[type=text], input[type=url], input[type=password], input[type=number], textarea { background: var(--bg); border: 1px solid var(--border); border-radius: 6px; color: var(--text); padding: 0.5rem 0.75rem; font-size: 0.9rem; font-family: inherit; width: 100%; transition: border-color 0.15s; } input:focus, textarea:focus { outline: none; border-color: var(--accent); } textarea { font-family: monospace; resize: vertical; } .radio-group { display: flex; gap: 1.5rem; } .radio-group label { display: flex; align-items: center; gap: 0.4rem; color: var(--text); cursor: pointer; } .form-actions { display: flex; justify-content: flex-end; } /* Pagination */ .pagination { display: flex; align-items: center; gap: 1rem; justify-content: center; padding: 1rem 0; } .pagination a { color: var(--accent); text-decoration: none; } .pagination span { color: var(--muted); font-size: 0.85rem; } /* Header actions */ .header-actions { display: flex; align-items: center; gap: 1rem; } .schedule-badge { font-size: 0.8rem; color: var(--running); background: rgba(59,130,246,0.12); border: 1px solid rgba(59,130,246,0.25); border-radius: 999px; padding: 0.3rem 0.8rem; } /* Key fingerprint */ .key-status { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.25rem; } .key-fingerprint { font-family: monospace; font-size: 0.8rem; color: var(--muted); } /* Connection test result */ .test-result { font-size: 0.85rem; margin-top: 0.5rem; min-height: 1.2em; } .test-ok { color: var(--success); } .test-fail { color: var(--error); } /* Utilities */ .muted { color: var(--muted); } .small { font-size: 0.8rem; } .mono { font-family: monospace; font-size: 0.82rem; } p.muted { padding: 1.5rem 0; }