/
Muvz82
/
openbox-linux
Обзор
Документация
Войти
/
Muvz82
/
openbox-linux
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
apps/desktop/src/styles/App.css
1 649 строк
27 KB
Mikhail Sviridov
init
18 май 2026, 17:54
18 май 2026, 17:54
482974b
Код
Авторство
О чём код?
:root { --bg-primary: #0d0d0d; --bg-secondary: #161616; --bg-card: #1a1a1a; --bg-card-ok: #141f14; --bg-card-missing: #1f1414; --text-primary: #d4d4d4; --text-secondary: #808080; --text-detail: #5a5a5a; --accent: #4a9eff; --accent-hover: #3a8eef; --green: #4caf50; --green-dim: #2e7d32; --red: #ef5350; --red-dim: #c62828; --yellow: #f9a825; --border: #2a2a2a; --border-ok: #1b3a1b; --border-missing: #3a1b1b; --radius: 8px; --radius-lg: 12px; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'SF Mono', 'Consolas', monospace; background: var(--bg-primary); color: var(--text-primary); line-height: 1.6; -webkit-font-smoothing: antialiased; overflow-y: auto; } ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: var(--bg-primary); } ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; } /* App Layout */ .app { min-height: 100vh; padding: 28px 32px; } .app-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 36px; padding-bottom: 20px; border-bottom: 1px solid var(--border); } .app-logo { display: flex; align-items: center; gap: 10px; } .logo-icon { font-size: 28px; color: var(--accent); } .app-title { font-size: 22px; font-weight: 700; letter-spacing: -0.5px; color: var(--text-primary); } .app-version { font-size: 11px; color: var(--text-secondary); background: var(--bg-secondary); padding: 3px 10px; border-radius: 4px; border: 1px solid var(--border); } .app-main { max-width: 860px; } /* Sections */ .section { margin-bottom: 28px; } .section-title { font-size: 11px; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 12px; } /* OS Card */ .os-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 18px 22px; } .os-name { font-size: 17px; font-weight: 600; margin-bottom: 10px; color: var(--text-primary); } .os-details { display: flex; gap: 20px; flex-wrap: wrap; } .os-detail { font-size: 12px; color: var(--text-secondary); } /* Tools Grid */ .tools-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px; } /* Status Card */ .status-card { display: flex; align-items: center; gap: 12px; padding: 13px 16px; border-radius: var(--radius); border: 1px solid var(--border); transition: border-color 0.15s, background-color 0.15s; } .status-ok { background: var(--bg-card-ok); border-color: var(--border-ok); } .status-missing { background: var(--bg-card-missing); border-color: var(--border-missing); } .status-icon { font-size: 16px; font-weight: 700; width: 24px; text-align: center; flex-shrink: 0; } .icon-ok { color: var(--green); } .icon-missing { color: var(--red); } .status-info { flex: 1; min-width: 0; } .status-name { font-size: 13px; font-weight: 600; color: var(--text-primary); } .status-detail { font-size: 10px; color: var(--text-detail); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 2px; } .status-badge { font-size: 10px; font-weight: 700; padding: 2px 8px; border-radius: 4px; flex-shrink: 0; letter-spacing: 0.5px; } .badge-ok { background: rgba(76, 175, 80, 0.12); color: var(--green); } .badge-missing { background: rgba(239, 83, 80, 0.12); color: var(--red); } /* Install buttons */ .btn-install { display: inline-flex; align-items: center; gap: 4px; margin-top: 6px; padding: 3px 10px; font-size: 10px; font-weight: 600; color: var(--accent); background: rgba(74, 158, 255, 0.08); border: 1px solid rgba(74, 158, 255, 0.25); border-radius: 4px; cursor: pointer; transition: all 0.15s; font-family: inherit; } .btn-install:hover { background: rgba(74, 158, 255, 0.18); border-color: var(--accent); } .status-hint { font-size: 10px; color: var(--yellow); margin-top: 4px; font-style: italic; } /* Summary */ .summary-section { margin-top: 8px; } .summary-card { display: flex; align-items: center; gap: 14px; padding: 16px 20px; border-radius: var(--radius-lg); border: 1px solid; } .summary-ok { background: var(--bg-card-ok); border-color: var(--border-ok); } .summary-warn { background: #1f1b14; border-color: #3a2e1b; } .summary-icon { font-size: 20px; font-weight: 700; flex-shrink: 0; } .summary-ok .summary-icon { color: var(--green); } .summary-warn .summary-icon { color: var(--yellow); } .summary-text { font-size: 13px; color: var(--text-primary); } /* Buttons */ .btn { background: var(--bg-secondary); color: var(--text-primary); border: 1px solid var(--border); padding: 8px 18px; border-radius: var(--radius); font-family: inherit; font-size: 12px; cursor: pointer; transition: all 0.15s; } .btn:hover { background: var(--accent); border-color: var(--accent); color: #fff; } .refresh-btn { margin-top: 4px; } /* Loading */ .loading { display: flex; align-items: center; gap: 12px; color: var(--text-secondary); font-size: 13px; padding: 48px 0; } .loading-spinner { width: 18px; height: 18px; border: 2px solid var(--border); border-top-color: var(--accent); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Error State */ .error-state { padding: 28px; background: var(--bg-card-missing); border: 1px solid var(--border-missing); border-radius: var(--radius-lg); } .error-icon { font-size: 28px; margin-bottom: 12px; color: var(--yellow); } .error-text { color: var(--red); font-size: 14px; font-weight: 600; margin-bottom: 6px; } .error-detail { color: var(--text-secondary); font-size: 12px; margin-bottom: 8px; } .error-hint { color: var(--text-detail); font-size: 11px; margin-bottom: 16px; } .error-hint code { background: var(--bg-secondary); padding: 2px 6px; border-radius: 3px; color: var(--accent); font-size: 11px; } /* Tabs */ .app-tabs { display: flex; gap: 4px; margin-bottom: 24px; padding-bottom: 12px; border-bottom: 1px solid var(--border); } .tab { background: transparent; color: var(--text-secondary); border: 1px solid transparent; padding: 8px 16px; border-radius: var(--radius); font-family: inherit; font-size: 12px; cursor: pointer; transition: all 0.15s; } .tab:hover { color: var(--text-primary); background: var(--bg-secondary); } .tab-active { color: var(--accent); border-color: var(--border); background: var(--bg-secondary); } /* VM List */ .vm-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 12px; } /* VM Card */ .vm-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 18px 20px; transition: border-color 0.15s; } .vm-card.vm-running { border-color: var(--border-ok); background: var(--bg-card-ok); } .vm-card.vm-stopped { border-color: var(--border); } .vm-card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; } .vm-name { font-size: 15px; font-weight: 600; color: var(--text-primary); } .vm-state-badge { display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; padding: 3px 10px; border-radius: 4px; } .vm-state-badge.vm-running { background: rgba(76, 175, 80, 0.12); color: var(--green); } .vm-state-badge.vm-stopped { background: rgba(128, 128, 128, 0.12); color: var(--text-secondary); } .vm-state-badge.vm-other { background: rgba(249, 168, 37, 0.12); color: var(--yellow); } .vm-state-dot { width: 6px; height: 6px; border-radius: 50%; } .vm-state-dot.vm-running { background: var(--green); box-shadow: 0 0 6px var(--green); } .vm-state-dot.vm-stopped { background: var(--text-secondary); } .vm-state-dot.vm-other { background: var(--yellow); } .vm-card-details { display: flex; gap: 16px; margin-bottom: 14px; } .vm-detail { font-size: 11px; color: var(--text-detail); } .vm-card-actions { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; } .btn-start { border-color: var(--green-dim) !important; color: var(--green) !important; } .btn-start:hover { background: var(--green) !important; border-color: var(--green) !important; color: #fff !important; } .btn-stop { border-color: var(--yellow) !important; color: var(--yellow) !important; } .btn-stop:hover { background: var(--yellow) !important; border-color: var(--yellow) !important; color: #000 !important; } .btn-danger { border-color: var(--red-dim) !important; color: var(--red) !important; font-size: 11px !important; padding: 6px 12px !important; } .btn-danger:hover { background: var(--red) !important; border-color: var(--red) !important; color: #fff !important; } .vm-confirm { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--yellow); padding: 8px 12px; background: rgba(249, 168, 37, 0.08); border-radius: var(--radius); } .btn-danger-sm { background: var(--red) !important; border-color: var(--red) !important; color: #fff !important; padding: 3px 10px !important; font-size: 10px !important; } .btn-cancel-sm { padding: 3px 10px !important; font-size: 10px !important; } .vm-error { margin-top: 10px; padding: 8px 12px; background: rgba(239, 83, 80, 0.08); border-radius: var(--radius); font-size: 11px; color: var(--red); } /* Empty State */ .empty-state { text-align: center; padding: 48px 24px; } .empty-icon { font-size: 36px; margin-bottom: 16px; } .empty-text { font-size: 14px; color: var(--text-primary); margin-bottom: 8px; } .empty-hint { font-size: 12px; color: var(--text-secondary); } /* VM Logs Panel */ .vm-logs-panel { margin-top: 14px; border-top: 1px solid var(--border); padding-top: 12px; } .vm-logs-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; } .vm-logs-title { font-size: 11px; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 1px; } .btn-sm { padding: 3px 10px !important; font-size: 11px !important; } .btn-logs { border-color: var(--text-detail) !important; color: var(--text-secondary) !important; font-size: 11px !important; padding: 6px 12px !important; } .btn-logs:hover { background: var(--accent) !important; border-color: var(--accent) !important; color: #fff !important; } .vm-logs-content { max-height: 200px; overflow-y: auto; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); padding: 8px 12px; font-size: 11px; line-height: 1.5; } .vm-logs-empty { color: var(--text-detail); font-style: italic; padding: 12px 0; } .vm-log-entry { display: flex; gap: 12px; padding: 2px 0; border-bottom: 1px solid rgba(42, 42, 42, 0.4); } .vm-log-entry:last-child { border-bottom: none; } .vm-log-ts { color: var(--text-detail); font-size: 10px; flex-shrink: 0; min-width: 140px; } .vm-log-msg { color: var(--text-secondary); word-break: break-all; } /* VM Toolbar */ .vm-toolbar { display: flex; gap: 8px; margin-bottom: 16px; } .btn-create { border-color: var(--accent) !important; color: var(--accent) !important; font-weight: 600; } .btn-create:hover { background: var(--accent) !important; border-color: var(--accent) !important; color: #fff !important; } /* Wizard Overlay */ .wizard-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); display: flex; align-items: center; justify-content: center; z-index: 1000; backdrop-filter: blur(4px); } .wizard { background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius-lg); width: 680px; max-height: 85vh; display: flex; flex-direction: column; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); } .wizard-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 24px; border-bottom: 1px solid var(--border); } .wizard-title { font-size: 16px; font-weight: 700; color: var(--text-primary); } .btn-close { padding: 4px 10px !important; font-size: 14px !important; } /* Wizard Steps */ .wizard-steps { display: flex; gap: 2px; padding: 12px 24px; border-bottom: 1px solid var(--border); overflow-x: auto; } .wizard-step-indicator { display: flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: var(--radius); font-size: 11px; color: var(--text-detail); white-space: nowrap; transition: all 0.15s; } .step-current { color: var(--accent); background: rgba(74, 158, 255, 0.08); } .step-done { color: var(--green); } .step-num { font-size: 13px; } .step-label { font-weight: 500; } /* Wizard Content */ .wizard-content { flex: 1; overflow-y: auto; padding: 24px; } .wizard-step-title { font-size: 15px; font-weight: 600; color: var(--text-primary); margin-bottom: 8px; } .wizard-step-desc { font-size: 12px; color: var(--text-secondary); margin-bottom: 18px; line-height: 1.5; } .wizard-link { color: var(--accent); text-decoration: none; } .wizard-link:hover { text-decoration: underline; } /* Wizard Form */ .wizard-form { display: flex; flex-direction: column; gap: 14px; } .wizard-label { font-size: 11px; font-weight: 600; color: var(--text-secondary); text-transform: uppercase; letter-spacing: 1px; } .wizard-input { background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); padding: 10px 14px; color: var(--text-primary); font-family: inherit; font-size: 13px; width: 100%; outline: none; transition: border-color 0.15s; } .wizard-input:focus { border-color: var(--accent); } .wizard-size-options { display: flex; gap: 6px; flex-wrap: wrap; } .btn-active { background: var(--accent) !important; border-color: var(--accent) !important; color: #fff !important; } .wizard-disk-info { font-size: 11px; color: var(--text-secondary); padding: 8px 12px; background: var(--bg-primary); border-radius: var(--radius); border: 1px solid var(--border); } .wizard-warn { color: var(--yellow); font-weight: 600; } /* ISO Browser */ .wizard-iso-picker { display: flex; flex-direction: column; gap: 12px; } .wizard-input-row { display: flex; gap: 8px; } .wizard-file-browser { background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; } .wizard-browser-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 12px; border-bottom: 1px solid var(--border); background: var(--bg-secondary); } .wizard-browser-path { font-size: 11px; color: var(--text-secondary); font-family: inherit; } .wizard-browser-list { max-height: 200px; overflow-y: auto; } .wizard-browser-item { display: flex; align-items: center; gap: 8px; padding: 8px 12px; cursor: pointer; transition: background 0.1s; border-bottom: 1px solid rgba(42, 42, 42, 0.3); } .wizard-browser-item:hover { background: rgba(74, 158, 255, 0.06); } .wizard-browser-item.item-selected { background: rgba(74, 158, 255, 0.12); border-color: var(--accent); } .wizard-browser-item.item-parent { color: var(--text-secondary); font-style: italic; } .wizard-browser-item.item-dir .item-name { font-weight: 600; } .item-icon { font-size: 14px; flex-shrink: 0; } .item-name { flex: 1; font-size: 12px; color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .item-size { font-size: 10px; color: var(--text-detail); flex-shrink: 0; } .wizard-browser-empty { padding: 24px; text-align: center; color: var(--text-detail); font-size: 12px; } /* Wizard Summary */ .wizard-summary { background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px 20px; margin-bottom: 18px; } .wizard-summary-row { display: flex; justify-content: space-between; align-items: baseline; padding: 6px 0; border-bottom: 1px solid rgba(42, 42, 42, 0.3); } .wizard-summary-row:last-child { border-bottom: none; } .wizard-summary-label { font-size: 12px; color: var(--text-secondary); font-weight: 500; } .wizard-summary-value { font-size: 12px; color: var(--text-primary); font-weight: 600; } .wizard-path { font-size: 11px; max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Wizard Progress */ .wizard-progress { background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); padding: 12px 16px; margin-top: 14px; font-size: 12px; line-height: 1.8; } .wizard-progress-line { color: var(--text-secondary); } .progress-error { color: var(--red); } /* Wizard Success */ .wizard-success { text-align: center; padding: 24px; margin-top: 14px; } .wizard-success-icon { font-size: 36px; margin-bottom: 12px; } .wizard-success p { font-size: 14px; color: var(--text-primary); margin-bottom: 6px; } .wizard-success-hint { font-size: 12px; color: var(--text-secondary); } /* Wizard Footer */ .wizard-footer { display: flex; justify-content: space-between; padding: 16px 24px; border-top: 1px solid var(--border); } .btn-next { border-color: var(--accent) !important; color: var(--accent) !important; } .btn-next:hover:not(:disabled) { background: var(--accent) !important; color: #fff !important; } .btn-next:disabled { opacity: 0.4; cursor: not-allowed; } /* App Grid */ .app-grid-container { max-width: 860px; } .app-grid-toolbar { display: flex; gap: 8px; margin-bottom: 16px; } .shared-dir-info { display: flex; align-items: center; gap: 8px; padding: 10px 16px; background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 16px; font-size: 12px; flex-wrap: wrap; } .shared-dir-label { color: var(--text-primary); font-weight: 600; } .shared-dir-path { background: var(--bg-primary); padding: 2px 8px; border-radius: 4px; color: var(--accent); font-size: 11px; } .shared-dir-hint { color: var(--text-detail); font-size: 11px; } .app-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 12px; } /* App Card */ .app-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 16px 18px; transition: border-color 0.15s; } .app-card.app-installed { border-color: var(--border-ok); background: var(--bg-card-ok); } .app-card-header { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; } .app-card-icon { font-size: 28px; flex-shrink: 0; } .app-card-info { flex: 1; min-width: 0; } .app-card-name { font-size: 14px; font-weight: 600; color: var(--text-primary); margin-bottom: 4px; } .app-card-status { display: flex; align-items: center; gap: 6px; font-size: 11px; color: var(--text-secondary); } .app-status-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; } .dot-green { background: var(--green); box-shadow: 0 0 6px var(--green); } .dot-yellow { background: var(--yellow); box-shadow: 0 0 6px var(--yellow); } .dot-gray { background: var(--text-detail); } .app-card-detail { display: flex; align-items: baseline; gap: 6px; margin-bottom: 6px; font-size: 11px; } .app-detail-label { color: var(--text-detail); font-weight: 600; flex-shrink: 0; } .app-detail-value { color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10px; } .app-card-actions { display: flex; gap: 8px; align-items: center; margin-top: 10px; } .btn-install-hint { border-color: var(--accent) !important; color: var(--accent) !important; } .btn-install-hint:hover { background: var(--accent) !important; color: #fff !important; } .app-install-hint { margin-top: 10px; padding: 12px 14px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); } .install-hint-title { font-size: 12px; font-weight: 600; color: var(--text-primary); margin-bottom: 8px; } .install-hint-steps { padding-left: 18px; font-size: 11px; color: var(--text-secondary); line-height: 1.8; } .install-hint-steps code { background: var(--bg-secondary); padding: 1px 5px; border-radius: 3px; color: var(--accent); font-size: 10px; } .btn-mark-installed { margin-top: 10px; border-color: var(--green-dim) !important; color: var(--green) !important; } .btn-mark-installed:hover { background: var(--green) !important; border-color: var(--green) !important; color: #fff !important; } .app-confirm-delete { display: flex; align-items: center; gap: 8px; margin-top: 10px; padding: 8px 12px; background: rgba(239, 83, 80, 0.08); border-radius: var(--radius); font-size: 11px; color: var(--yellow); } .app-confirm-btns { display: flex; gap: 6px; } /* Icon Picker */ .icon-picker { display: flex; gap: 4px; flex-wrap: wrap; } .icon-option { width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); cursor: pointer; font-size: 18px; transition: all 0.15s; } .icon-option:hover { border-color: var(--accent); } .icon-selected { border-color: var(--accent); background: rgba(74, 158, 255, 0.12); } /* Import button */ .btn-import { border-color: var(--green-dim) !important; color: var(--green) !important; } .btn-import:hover:not(:disabled) { background: var(--green) !important; border-color: var(--green) !important; color: #fff !important; } .btn-import:disabled { opacity: 0.4; cursor: not-allowed; } /* RDP Settings */ .rdp-settings { max-width: 640px; } .rdp-form { display: flex; flex-direction: column; gap: 14px; } .rdp-form-row { display: flex; flex-direction: column; gap: 4px; } .rdp-checkbox-row { flex-direction: row; align-items: center; } .rdp-checkbox-label { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-primary); cursor: pointer; } .rdp-checkbox-label input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--accent); cursor: pointer; } .rdp-warn { font-size: 10px; color: var(--yellow); margin-top: 2px; } .rdp-actions { display: flex; gap: 10px; align-items: center; margin-top: 18px; } .rdp-save-msg { font-size: 12px; color: var(--green); } .rdp-test-result { margin-top: 12px; padding: 10px 14px; border-radius: var(--radius); font-size: 12px; border: 1px solid var(--border); } .rdp-ok { background: var(--bg-card-ok); border-color: var(--border-ok); color: var(--green); } .rdp-fail { background: var(--bg-card-missing); border-color: var(--border-missing); color: var(--red); } /* RDP button on VM card */ .btn-rdp { border-color: var(--accent) !important; color: var(--accent) !important; font-weight: 600 !important; } .btn-rdp:hover:not(:disabled) { background: var(--accent) !important; border-color: var(--accent) !important; color: #fff !important; } .btn-rdp:disabled { opacity: 0.4; cursor: not-allowed; } /* App Launch button */ .btn-launch { border-color: var(--green-dim) !important; color: var(--green) !important; font-weight: 600 !important; } .btn-launch:hover:not(:disabled) { background: var(--green) !important; border-color: var(--green) !important; color: #fff !important; } .btn-launch:disabled { opacity: 0.4; cursor: not-allowed; } /* App Edit form */ .app-edit-form { margin-top: 10px; padding: 12px 14px; background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); display: flex; flex-direction: column; gap: 10px; } .app-edit-row { display: flex; flex-direction: column; gap: 4px; } /* App Launch group */ .app-launch-group { display: flex; align-items: center; gap: 4px; } .app-launch-mode { background: var(--bg-primary); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text-secondary); font-family: inherit; font-size: 10px; padding: 4px 6px; cursor: pointer; outline: none; } .app-launch-mode:focus { border-color: var(--accent); } /* SSH Settings */ .ssh-settings { max-width: 640px; } .ssh-instructions { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); padding: 14px 18px; } .ssh-instructions code { background: var(--bg-secondary); padding: 1px 5px; border-radius: 3px; color: var(--accent); font-size: 10px; } /* App Search & Filter */ .app-search { flex: 1; min-width: 180px; } .app-filter-group { display: flex; gap: 4px; } /* Activity Log */ .activity-log { max-width: 860px; } .activity-log-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; } .activity-log-controls { display: flex; align-items: center; gap: 10px; } .log-level-icon { font-size: 10px; flex-shrink: 0; } .log-error .vm-log-msg { color: var(--red); } .log-warn .vm-log-msg { color: var(--yellow); } /* Settings Page */ .settings-page { max-width: 860px; } .settings-nav { display: flex; gap: 6px; margin-bottom: 20px; padding-bottom: 12px; border-bottom: 1px solid var(--border); } .settings-content { max-width: 640px; } /* Global error banner */ .global-error-banner { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; background: var(--red-dim); border-bottom: 1px solid var(--red); color: #fff; font-size: 13px; } .btn-close-error { background: none; border: none; color: #fff; cursor: pointer; font-size: 16px; padding: 0 4px; } .btn-close-error:hover { color: var(--red); } /* First-run notice */ .first-run-notice { background: var(--bg-card); border: 1px solid var(--accent); border-radius: var(--radius-lg); padding: 20px; margin-bottom: 16px; } .first-run-notice h3 { color: var(--accent); margin-bottom: 8px; font-size: 15px; } .first-run-notice p { color: var(--text-secondary); font-size: 13px; line-height: 1.5; margin-bottom: 8px; } .first-run-notice code { background: var(--bg-secondary); padding: 2px 6px; border-radius: 4px; font-size: 12px; color: var(--green); } /* Diagnostics button */ .btn-diagnostics { background: var(--bg-secondary); border: 1px solid var(--border); color: var(--text-secondary); padding: 6px 12px; border-radius: var(--radius); cursor: pointer; font-size: 12px; margin-left: 8px; } .btn-diagnostics:hover { border-color: var(--accent); color: var(--accent); } /* Open logs button */ .btn-open-logs { background: none; border: 1px solid var(--border); color: var(--text-secondary); padding: 4px 10px; border-radius: var(--radius); cursor: pointer; font-size: 11px; } .btn-open-logs:hover { border-color: var(--accent); color: var(--accent); }