/* ─── Base overrides ──────────────────────────────────────────────────────── */ :root { --nav-height: 3.5rem; --color-keep: #2d9a5f; --color-remove: #c0392b; --color-pending: #888; --color-approved: #2d9a5f; --color-skipped: #888; --color-done: #2d9a5f; --color-error: #c0392b; --color-noop: #555; --font-mono: 'JetBrains Mono', 'Fira Mono', 'Cascadia Code', monospace; } body { margin: 0; } /* ─── Nav ─────────────────────────────────────────────────────────────────── */ .app-nav { display: flex; align-items: center; gap: 0.25rem; padding: 0 1.5rem; height: var(--nav-height); background: var(--pico-background-color); border-bottom: 1px solid var(--pico-muted-border-color); position: sticky; top: 0; z-index: 100; } .app-nav .brand { font-weight: 700; font-size: 1.05rem; margin-right: 1.5rem; text-decoration: none; color: var(--pico-color); } .app-nav a { padding: 0.35rem 0.75rem; border-radius: 6px; text-decoration: none; font-size: 0.9rem; color: var(--pico-muted-color); transition: background 0.15s, color 0.15s; } .app-nav a:hover, .app-nav a.active { background: var(--pico-secondary-background); color: var(--pico-color); } .app-nav .spacer { flex: 1; } /* ─── Layout ──────────────────────────────────────────────────────────────── */ .page { max-width: 1400px; margin: 0 auto; padding: 1.5rem 1.5rem 3rem; } .page-header { display: flex; align-items: baseline; gap: 1rem; margin-bottom: 1.5rem; } .page-header h1 { margin: 0; font-size: 1.5rem; } /* ─── Stat cards ──────────────────────────────────────────────────────────── */ .stat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 1rem; margin-bottom: 2rem; } .stat-card { border: 1px solid var(--pico-muted-border-color); border-radius: 8px; padding: 1rem 1.25rem; text-align: center; } .stat-card .num { font-size: 2rem; font-weight: 700; line-height: 1; } .stat-card .label { font-size: 0.78rem; color: var(--pico-muted-color); margin-top: 0.25rem; } /* ─── Badges / status ─────────────────────────────────────────────────────── */ .badge { display: inline-block; font-size: 0.72rem; font-weight: 600; padding: 0.15em 0.55em; border-radius: 999px; text-transform: uppercase; letter-spacing: 0.04em; background: var(--pico-secondary-background); color: var(--pico-muted-color); } .badge-keep { background: #d4edda; color: #155724; } .badge-remove { background: #f8d7da; color: #721c24; } .badge-pending { background: #e2e3e5; color: #383d41; } .badge-approved{ background: #d4edda; color: #155724; } .badge-skipped { background: #e2e3e5; color: #383d41; } .badge-done { background: #d1ecf1; color: #0c5460; } .badge-error { background: #f8d7da; color: #721c24; } .badge-noop { background: #e2e3e5; color: #383d41; } .badge-running { background: #fff3cd; color: #856404; } .badge-manual { background: #fde8c8; color: #7d4400; } /* ─── Filter tabs ─────────────────────────────────────────────────────────── */ .filter-tabs { display: flex; gap: 0.25rem; flex-wrap: wrap; margin-bottom: 1rem; } .filter-tabs a, .filter-tabs button { padding: 0.35rem 0.9rem; border-radius: 6px; font-size: 0.85rem; border: 1px solid var(--pico-muted-border-color); background: transparent; cursor: pointer; text-decoration: none; color: var(--pico-muted-color); } .filter-tabs a.active, .filter-tabs button.active { background: var(--pico-primary); border-color: var(--pico-primary); color: #fff; } /* ─── Tables ──────────────────────────────────────────────────────────────── */ .data-table { width: 100%; border-collapse: collapse; font-size: 0.875rem; } .data-table th { text-align: left; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--pico-muted-color); padding: 0.5rem 0.75rem; border-bottom: 2px solid var(--pico-muted-border-color); white-space: nowrap; } .data-table td { padding: 0.6rem 0.75rem; border-bottom: 1px solid var(--pico-muted-border-color); vertical-align: middle; } .data-table tr:hover td { background: var(--pico-secondary-background); } .data-table tr.expanded td { background: var(--pico-secondary-background); } .data-table td.mono { font-family: var(--font-mono); font-size: 0.8rem; } /* ─── Stream decision table ───────────────────────────────────────────────── */ .stream-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; margin-top: 0.5rem; } .stream-table th { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--pico-muted-color); padding: 0.3rem 0.6rem; border-bottom: 1px solid var(--pico-muted-border-color); } .stream-table td { padding: 0.4rem 0.6rem; border-bottom: 1px solid var(--pico-muted-border-color); vertical-align: middle; } .stream-row-keep { background: #f0fff4; } .stream-row-remove { background: #fff5f5; } /* ─── Action toggle buttons ───────────────────────────────────────────────── */ .toggle-keep, .toggle-remove { border: none; border-radius: 4px; padding: 0.2em 0.6em; font-size: 0.75rem; font-weight: 600; cursor: pointer; min-width: 5rem; } .toggle-keep { background: var(--color-keep); color: #fff; } .toggle-remove { background: var(--color-remove); color: #fff; } /* ─── Progress bar ────────────────────────────────────────────────────────── */ .progress-wrap { background: var(--pico-muted-border-color); border-radius: 999px; height: 0.5rem; overflow: hidden; margin: 0.75rem 0; } .progress-bar { height: 100%; background: var(--pico-primary); border-radius: 999px; transition: width 0.3s ease; } /* ─── Log output ──────────────────────────────────────────────────────────── */ .log-output { font-family: var(--font-mono); font-size: 0.78rem; background: #1a1a1a; color: #d4d4d4; padding: 0.75rem 1rem; border-radius: 6px; max-height: 300px; overflow-y: auto; white-space: pre-wrap; word-break: break-all; } /* ─── Command preview ─────────────────────────────────────────────────────── */ .command-preview { font-family: var(--font-mono); font-size: 0.78rem; background: #1a1a1a; color: #9cdcfe; padding: 0.75rem 1rem; border-radius: 6px; white-space: pre-wrap; word-break: break-all; border: none; width: 100%; resize: vertical; min-height: 3rem; } /* ─── Detail panel ────────────────────────────────────────────────────────── */ .detail-panel { border: 1px solid var(--pico-muted-border-color); border-radius: 8px; padding: 1.25rem; margin-top: 0.25rem; margin-bottom: 1rem; } .detail-meta { display: flex; flex-wrap: wrap; gap: 1.5rem; margin-bottom: 1rem; font-size: 0.85rem; } .detail-meta dt { color: var(--pico-muted-color); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.1rem; } .detail-meta dd { margin: 0; font-weight: 500; } /* ─── Setup wizard ────────────────────────────────────────────────────────── */ .wizard-steps { display: flex; gap: 0; margin-bottom: 2rem; border-bottom: 2px solid var(--pico-muted-border-color); } .wizard-step { padding: 0.6rem 1.25rem; font-size: 0.85rem; color: var(--pico-muted-color); border-bottom: 2px solid transparent; margin-bottom: -2px; } .wizard-step.active { color: var(--pico-primary); border-bottom-color: var(--pico-primary); font-weight: 600; } .wizard-step.done { color: var(--color-keep); } /* ─── Connection status ───────────────────────────────────────────────────── */ .conn-status { display: inline-flex; align-items: center; gap: 0.4rem; font-size: 0.82rem; padding: 0.3em 0.7em; border-radius: 5px; } .conn-status.ok { background: #d4edda; color: #155724; } .conn-status.error { background: #f8d7da; color: #721c24; } .conn-status.checking { background: #fff3cd; color: #856404; } /* ─── Inline lang select ──────────────────────────────────────────────────── */ .lang-select { font-size: 0.82rem; padding: 0.2em 0.5em; border-radius: 4px; border: 1px solid var(--pico-muted-border-color); background: var(--pico-background-color); cursor: pointer; } /* ─── Alerts ──────────────────────────────────────────────────────────────── */ .alert { padding: 0.75rem 1rem; border-radius: 6px; margin-bottom: 1rem; font-size: 0.875rem; } .alert-warning { background: #fff3cd; color: #856404; border: 1px solid #ffc107; } .alert-error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } .alert-success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .alert-info { background: #d1ecf1; color: #0c5460; border: 1px solid #bee5eb; } /* ─── HTMX loading indicator ─────────────────────────────────────────────── */ .htmx-indicator { display: none; } .htmx-request .htmx-indicator { display: inline; } .htmx-request.htmx-indicator { display: inline; } /* ─── Utility ─────────────────────────────────────────────────────────────── */ .muted { color: var(--pico-muted-color); } .mono { font-family: var(--font-mono); font-size: 0.8rem; } .truncate { max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .flex-row { display: flex; align-items: center; gap: 0.5rem; } .actions-col { white-space: nowrap; display: flex; gap: 0.4rem; align-items: center; } button[data-size="sm"], a[data-size="sm"] { padding: 0.25rem 0.65rem; font-size: 0.8rem; }