/* Theme definitions according to A29 Design System "Крона" */ :root { /* Common variables */ --status-healthy: #72C943; --status-warning: #E1A62B; --status-error: #E45C4F; --status-info: #4C8DD8; --status-disabled: #708078; --prov-antigravity: #74A9FF; --prov-codex: #46BE8A; --prov-opencode: #F39A50; --prov-claude: #DF9C63; --prov-grok: #3B82F6; --radius-sm: 4px; --radius-md: 6px; --radius-lg: 8px; --font-ui: 'Inter', "Segoe UI", -apple-system, sans-serif; --font-title: "Cinzel", "Cinzel Decorative", "Segoe UI", serif; --font-mono: "Consolas", "Courier New", monospace; --header-height: 58px; --sidebar-width: 230px; } /* Default DARK theme */ :root, body[data-theme="dark"] { --bg-base: #101510; --bg-sidebar: #0D120D; --bg-header: #0D120D; --bg-statusbar: #0D120D; --bg-modal-backdrop: rgba(16, 21, 16, 0.85); --surface: #1A2A1F; --surface-hover: #2F4A36; --surface-active: #3C5C44; --surface-selected: #28402F; --surface-muted: #152219; --border: #36513B; --border-subtle: #203A2D; --border-accent: #CDAA64; --border-hover: #537456; --text-primary: #F7F1E3; --text-secondary: #B0B8B2; --text-muted: #8FA395; --text-accent: #CDAA64; --accent: #CDAA64; --accent-hover: #E0B84E; --accent-pressed: #A9781E; --accent-dim: rgba(205, 170, 100, 0.15); } /* MEDIUM theme (cream cards on green canvas) */ body[data-theme="medium"] { --bg-base: #1A2A1F; --bg-sidebar: #152219; --bg-header: #152219; --bg-statusbar: #152219; --bg-modal-backdrop: rgba(26, 42, 31, 0.85); --surface: #F7F1E3; --surface-hover: #F0EAD6; --surface-active: #E6DFCB; --surface-selected: #EAE3CF; --surface-muted: #2F4A36; --border: #D1C7AE; --border-subtle: #E0D7BF; --border-accent: #CDAA64; --border-hover: #B7A88D; --text-primary: #101510; --text-secondary: #2F4A36; --text-muted: #537456; --text-accent: #B78525; --accent: #B78525; --accent-hover: #CDAA64; --accent-pressed: #9A6F1D; --accent-dim: rgba(183, 133, 37, 0.15); } /* LIGHT theme */ body[data-theme="light"] { --bg-base: #F7F1E3; --bg-sidebar: #F0EAD6; --bg-header: #F0EAD6; --bg-statusbar: #E6DFCB; --bg-modal-backdrop: rgba(247, 241, 227, 0.85); --surface: #FFFFFF; --surface-hover: #FDFBF7; --surface-active: #F4EEDF; --surface-selected: #FAF7F0; --surface-muted: #F0EAD6; --border: #D1C7AE; --border-subtle: #EAE3CF; --border-accent: #CDAA64; --border-hover: #C5BAA1; --text-primary: #101510; --text-secondary: #2F4A36; --text-muted: #537456; --text-accent: #B78525; --accent: #B78525; --accent-hover: #CDAA64; --accent-pressed: #9A6F1D; --accent-dim: rgba(183, 133, 37, 0.15); } /* Hermes Hub Web Client — Dark Theme & Cockpit Design System */ * { box-sizing: border-box; margin: 0; padding: 0; } body { background-color: var(--bg-base); color: var(--text-primary); font-family: var(--font-ui); font-size: 13px; line-height: 1.4; overflow: hidden; height: 100vh; width: 100vw; user-select: none; -webkit-font-smoothing: antialiased; } /* ── Typography & Utilities ── */ .text-healthy { color: var(--status-healthy); } .text-warning { color: var(--status-warning); } .text-error { color: var(--status-error); } .text-info { color: var(--status-info); } .text-accent { color: var(--text-accent); } .text-muted { color: var(--text-muted); } .text-secondary { color: var(--text-secondary); } /* ── App Layout ── */ .app-layout { display: flex; height: 100vh; width: 100vw; overflow: hidden; } /* ── Sidebar ── */ .sidebar { width: var(--sidebar-width); min-width: var(--sidebar-width); background-color: var(--bg-sidebar); border-right: 1px solid var(--border-subtle); display: flex; flex-direction: column; height: 100%; } .brand { padding: 16px 18px 14px; display: flex; align-items: center; gap: 12px; border-bottom: 1px solid var(--border-subtle); } .brand-logo { font-size: 22px; color: var(--accent); } .brand-title { display: block; font-family: var(--font-title); font-weight: 700; font-size: 15px; letter-spacing: 1px; color: var(--text-accent); } .brand-subtitle { display: block; font-size: 10px; color: var(--text-muted); letter-spacing: 0.5px; } .nav-menu { flex: 1; padding: 12px 10px; display: flex; flex-direction: column; gap: 3px; overflow-y: auto; } .nav-item { display: flex; align-items: center; gap: 10px; padding: 9px 12px; background: transparent; border: 1px solid transparent; border-radius: var(--radius-sm); color: var(--text-secondary); font-family: var(--font-ui); font-size: 13px; font-weight: 500; cursor: pointer; text-align: left; transition: all 0.15s ease; } .nav-item:hover { background-color: var(--surface-hover); color: var(--text-primary); } .nav-item.active { background-color: var(--surface-selected); color: var(--text-accent); border-color: var(--border-accent); } .nav-icon { font-size: 15px; display: inline-flex; width: 18px; } .nav-label { flex: 1; } .nav-badge { background-color: var(--surface-muted); color: var(--text-muted); font-size: 10px; padding: 2px 6px; border-radius: 10px; font-weight: 600; } .sidebar-footer { padding: 12px 16px; border-top: 1px solid var(--border-subtle); display: flex; flex-direction: column; gap: 6px; } .source-indicator { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--text-secondary); } .status-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--status-disabled); display: inline-block; } .status-dot.healthy { background-color: var(--status-healthy); box-shadow: 0 0 6px var(--status-healthy); } .status-dot.warning { background-color: var(--status-warning); } .status-dot.error { background-color: var(--status-error); } .version-tag { font-size: 10px; color: var(--text-muted); font-family: var(--font-mono); } /* ── Main Area ── */ .main-wrapper { flex: 1; display: flex; flex-direction: column; height: 100%; overflow: hidden; background-color: var(--bg-base); } /* ── Top Header ── */ .top-header { height: var(--header-height); background-color: var(--bg-header); border-bottom: 1px solid var(--border); padding: 0 24px; display: flex; align-items: center; justify-content: space-between; gap: 16px; } .header-left { display: flex; align-items: center; gap: 16px; } .header-title { font-size: 18px; font-weight: 700; color: var(--text-primary); } .header-readiness-badge { display: inline-flex; align-items: center; gap: 6px; background-color: var(--surface-muted); border: 1px solid var(--border-subtle); padding: 4px 10px; border-radius: var(--radius-sm); font-size: 11px; font-weight: 600; } .header-update-badge { display: inline-flex; align-items: center; gap: 6px; background-color: rgba(225, 166, 43, 0.15); border: 1px solid var(--status-warning); color: var(--status-warning); padding: 4px 10px; border-radius: var(--radius-sm); font-size: 11px; font-weight: 600; cursor: pointer; transition: all 0.15s ease; } .header-update-badge:hover { background-color: rgba(225, 166, 43, 0.28); } .header-actions { display: flex; align-items: center; gap: 10px; } /* ── Buttons ── */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 7px 14px; border-radius: var(--radius-sm); font-family: var(--font-ui); font-size: 12px; font-weight: 600; cursor: pointer; border: 1px solid transparent; transition: all 0.15s ease; } .btn-primary { background-color: var(--accent); color: #061916; border-color: var(--border-accent); } .btn-primary:hover { background-color: var(--accent-hover); } .btn-secondary { background-color: var(--surface); color: var(--text-primary); border-color: var(--border); } .btn-secondary:hover { background-color: var(--surface-hover); border-color: var(--border-hover); } .btn-ghost { background: transparent; color: var(--text-secondary); } .btn-ghost:hover { background-color: var(--surface-hover); color: var(--text-primary); } .btn-sm { padding: 4px 8px; font-size: 11px; } .btn:disabled { opacity: 0.45; cursor: not-allowed; } /* ── Content Scroll Area ── */ .content-scroll { flex: 1; overflow-y: auto; padding: 20px 24px; } .view-pane { display: none; } .view-pane.active { display: block; } .view-header-note { background-color: var(--surface-muted); border: 1px solid var(--border-subtle); padding: 10px 14px; border-radius: var(--radius-sm); color: var(--text-secondary); font-size: 12px; margin-bottom: 16px; } /* ── Toolbar & Filters ── */ .toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 16px; flex-wrap: wrap; } .search-box { display: flex; align-items: center; gap: 8px; background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 6px 12px; width: 340px; } .search-icon { font-size: 13px; color: var(--text-muted); } .search-box input { background: transparent; border: none; color: var(--text-primary); font-family: var(--font-ui); font-size: 12px; width: 100%; outline: none; } .search-box input::placeholder { color: var(--text-muted); } .filters-row { display: flex; align-items: center; gap: 10px; } .select-filter { background-color: var(--surface); border: 1px solid var(--border); color: var(--text-primary); font-family: var(--font-ui); font-size: 12px; padding: 6px 10px; border-radius: var(--radius-sm); outline: none; cursor: pointer; } .select-filter:focus { border-color: var(--border-accent); } .toolbar-stats { font-size: 11px; color: var(--text-muted); } /* ── Provider Group & Account Cards Grid ── */ .provider-group { margin-bottom: 24px; } .provider-group-header { display: flex; align-items: center; justify-content: space-between; background-color: var(--surface-muted); border: 1px solid var(--border-subtle); padding: 8px 14px; border-radius: var(--radius-sm); margin-bottom: 10px; } .provider-group-title { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 700; color: var(--text-primary); } .provider-group-count { font-size: 11px; color: var(--text-muted); } .accounts-empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 24px; text-align: center; background-color: var(--surface); border: 1px dashed var(--border); border-radius: var(--radius-md); margin: 16px 0; } .accounts-empty-state .empty-state-icon { font-size: 40px; margin-bottom: 12px; } .accounts-empty-state h3 { font-size: 16px; font-weight: 700; color: var(--text-primary); margin-bottom: 6px; } .accounts-empty-state p { font-size: 13px; color: var(--text-secondary); margin-bottom: 18px; max-width: 440px; } .accounts-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); gap: 10px; } /* ── Compact Account Card (164px Fixed Height) ── */ .account-card { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); height: 164px; padding: 10px 14px; display: flex; flex-direction: column; justify-content: space-between; cursor: pointer; transition: all 0.15s ease; position: relative; overflow: hidden; } .account-card:hover { background-color: var(--surface-hover); border-color: var(--border-hover); transform: translateY(-1px); } .account-card.main-account { border-color: var(--border-accent); } .account-card-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .account-provider-tag { display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 600; } .account-badges { display: flex; align-items: center; gap: 6px; } .badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 6px; border-radius: var(--radius-sm); font-size: 10px; font-weight: 700; } .badge-plan { background-color: var(--accent-dim); color: var(--text-accent); border: 1px solid var(--border-accent); } .badge-status { background-color: var(--surface-muted); color: var(--text-secondary); } .badge-status.healthy { color: var(--status-healthy); } .badge-status.warning { color: var(--status-warning); } .badge-status.quota_exhausted { color: var(--status-error); } .badge-status.auth_required { color: var(--status-warning); } .badge-status.disabled { color: var(--status-disabled); } .badge-unassigned { background-color: var(--surface-muted); color: var(--text-muted); border: 1px solid var(--border-subtle); } .account-eligibility-warning { margin-top: 6px; padding: 6px 8px; background: rgba(230, 162, 60, 0.12); border-left: 3px solid var(--status-warning); border-radius: var(--radius-sm); font-size: 11px; color: var(--status-warning); line-height: 1.4; } .role-answering-status { padding: 6px 10px; border-radius: var(--radius-sm); font-size: 12px; margin: 6px 0 10px; display: flex; align-items: center; gap: 6px; } .role-answering-status.healthy { background-color: rgba(114, 201, 67, 0.1); color: var(--status-healthy); border: 1px solid rgba(114, 201, 67, 0.25); } .role-answering-status.warning { background-color: rgba(225, 166, 43, 0.1); color: var(--status-warning); border: 1px solid rgba(225, 166, 43, 0.25); } .routing-toolbar-actions { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; padding: 8px 12px; background-color: var(--surface-muted); border-radius: var(--radius-md); border: 1px solid var(--border-subtle); } .account-identity-row { margin: 2px 0; } .account-email { font-size: 13px; font-weight: 700; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .account-meta { font-size: 11px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* ── Quota Cells Grid (Up to 4 pools) ── */ .account-quota-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px 10px; margin-top: 4px; } .account-quota-grid.single-cell { grid-template-columns: 1fr; } .quota-cell { background-color: var(--surface-muted); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 4px 6px; display: flex; flex-direction: column; justify-content: center; } .quota-cell-top { display: flex; align-items: center; justify-content: space-between; font-size: 10px; } .quota-cell-title { color: var(--text-secondary); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100px; } .quota-cell-value { font-family: var(--font-mono); font-weight: 700; } .quota-bar-track { height: 4px; background-color: rgba(255, 255, 255, 0.08); border-radius: 2px; overflow: hidden; margin: 3px 0 2px; } .quota-bar-fill { height: 100%; border-radius: 2px; transition: width 0.3s ease; } .quota-cell-reset { font-size: 9px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* ── Overview KPI Grid ── */ .overview-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; margin-bottom: 20px; } .kpi-card { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 16px; } .kpi-label { font-size: 11px; color: var(--text-muted); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; } .kpi-value { font-size: 24px; font-weight: 700; line-height: 1.2; } .kpi-sub { font-size: 11px; color: var(--text-secondary); margin-top: 4px; } /* ── Section Cards ── */ .section-card { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 20px; margin-bottom: 20px; } .section-card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; } .section-card-title { font-size: 15px; font-weight: 700; color: var(--text-primary); } .section-card-subtitle { font-size: 12px; color: var(--text-muted); margin-top: 2px; } /* ── Route Diagram ── */ .route-diagram-container { display: flex; gap: 16px; overflow-x: auto; padding: 10px 0; } .diagram-column { flex: 1; min-width: 220px; background-color: var(--surface-muted); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 12px; } .diagram-column-header { font-size: 12px; font-weight: 700; color: var(--text-accent); margin-bottom: 10px; border-bottom: 1px solid var(--border-subtle); padding-bottom: 6px; } .diagram-node { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 8px 10px; margin-bottom: 8px; } .diagram-node.active { border-color: var(--status-healthy); box-shadow: 0 0 8px rgba(114, 201, 67, 0.2); } /* ── Providers Grid ── */ .providers-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 12px; } .provider-summary-card { background-color: var(--surface-muted); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 14px; } .provider-summary-title { font-size: 14px; font-weight: 700; color: var(--text-primary); margin-bottom: 4px; } .provider-summary-stats { font-size: 12px; color: var(--text-secondary); margin-bottom: 8px; } .provider-models-tag { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); background-color: var(--bg-base); padding: 6px 8px; border-radius: var(--radius-sm); word-break: break-all; } /* ── Routing Pipelines List (Main Control Center) ── */ .routing-pipelines-list { display: flex; flex-direction: column; gap: 14px; } .pipeline-card { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 16px 20px; } .pipeline-header { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 14px; } .pipeline-title { font-size: 15px; font-weight: 700; color: var(--text-primary); } .pipeline-desc { font-size: 12px; color: var(--text-muted); margin-top: 4px; } .badge-quota { background-color: rgba(64, 158, 255, 0.15); color: var(--accent); border: 1px solid rgba(64, 158, 255, 0.3); font-size: 11px; padding: 2px 8px; border-radius: var(--radius-sm); font-weight: 600; } .badge-quota.warning { background-color: rgba(230, 162, 60, 0.15); color: var(--status-warning); border-color: rgba(230, 162, 60, 0.3); } .badge-quota.error { background-color: rgba(245, 108, 108, 0.15); color: var(--status-error); border-color: rgba(245, 108, 108, 0.3); } .badge-affinity { background-color: var(--surface-muted); color: var(--text-secondary); border: 1px solid var(--border-subtle); font-size: 10px; padding: 2px 6px; border-radius: var(--radius-sm); } .pipeline-chain-flow { display: flex; align-items: stretch; gap: 12px; flex-wrap: wrap; min-height: 100px; padding: 4px 0; } /* ── Draggable Node Chip (HTML5 DND) ── */ .pipeline-node-chip { background-color: var(--surface-muted); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 10px 12px; display: flex; flex-direction: column; gap: 4px; min-width: 220px; max-width: 280px; cursor: grab; user-select: none; transition: transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease, opacity 0.15s ease; position: relative; } .pipeline-node-chip[draggable]:hover { border-color: var(--accent); background-color: var(--surface-hover); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); } .pipeline-node-chip.active { border-color: var(--status-healthy); background-color: var(--surface-hover); box-shadow: 0 0 6px rgba(103, 194, 58, 0.2); } .pipeline-node-chip.dragging { opacity: 0.45; cursor: grabbing; transform: scale(0.96); border-style: dashed; border-color: var(--accent); } .pipeline-node-chip.drop-target { border-color: var(--accent); box-shadow: 0 0 14px rgba(64, 158, 255, 0.5); transform: scale(1.03); background-color: var(--surface-hover); } .node-top-row { display: flex; align-items: center; justify-content: space-between; font-size: 11px; } .node-rank { font-weight: 700; color: var(--accent); } .btn-node-remove { background: transparent; border: none; color: var(--text-muted); font-size: 13px; cursor: pointer; padding: 0 4px; line-height: 1; border-radius: var(--radius-xs); transition: color 0.15s ease, background 0.15s ease; } .btn-node-remove:hover { color: var(--status-error); background: rgba(245, 108, 108, 0.15); } .node-identity { font-size: 13px; font-weight: 700; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; } .node-meta { font-size: 11px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .mono-tag { font-family: var(--font-mono); font-size: 10px; color: var(--text-muted); } .node-model-row { display: flex; align-items: center; gap: 6px; margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--border-subtle); } .node-model-label { font-size: 10px; color: var(--text-muted); font-weight: 600; white-space: nowrap; } .node-model-select, .diagram-model-select, .diagram-account-select { flex: 1; background-color: var(--bg-base); border: 1px solid var(--border-subtle); border-radius: var(--radius-xs); color: var(--text-primary); font-size: 11px; font-family: var(--font-mono); padding: 3px 6px; outline: none; cursor: pointer; max-width: 100%; } .diagram-account-select { margin-bottom: 4px; width: 100%; font-family: var(--font-sans); font-size: 11px; font-weight: 500; } .node-model-select:focus, .diagram-model-select:focus, .diagram-account-select:focus { border-color: var(--accent); } .node-model-refresh-row { display: flex; align-items: center; justify-content: space-between; gap: 6px; } .node-model-text { font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .node-failover-warning { font-size: 10px; color: var(--status-warning); margin-top: 4px; } .btn-xs { font-size: 10px; padding: 2px 6px; } .pipeline-arrow { color: var(--accent); font-weight: bold; } /* ── Settings Card ── */ .settings-card { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 20px; max-width: 800px; } .settings-group-title { font-size: 16px; font-weight: 700; color: var(--text-primary); margin-bottom: 16px; border-bottom: 1px solid var(--border-subtle); padding-bottom: 8px; } .setting-row { display: flex; align-items: center; justify-content: space-between; padding: 12px 0; border-bottom: 1px solid var(--border-subtle); gap: 16px; } .setting-label { font-size: 13px; font-weight: 600; color: var(--text-primary); } .setting-desc { font-size: 11px; color: var(--text-muted); } .input-text { background-color: var(--surface-muted); border: 1px solid var(--border); color: var(--text-primary); font-family: var(--font-ui); font-size: 12px; padding: 6px 10px; border-radius: var(--radius-sm); outline: none; width: 260px; } .input-text:focus { border-color: var(--border-accent); } .settings-actions { margin-top: 20px; display: flex; justify-content: flex-end; } /* ── Modal Layer ── */ .modal-backdrop { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background-color: var(--bg-modal-backdrop); display: flex; align-items: center; justify-content: center; z-index: 9999; backdrop-filter: blur(4px); } .modal-backdrop.hidden { display: none !important; } .modal-card { background-color: var(--surface); border: 1px solid var(--border-accent); border-radius: var(--radius-lg); width: 680px; max-width: 90vw; max-height: 85vh; display: flex; flex-direction: column; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.6); animation: modalAppear 0.2s ease-out; } @keyframes modalAppear { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } } .modal-header { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; } .modal-title { font-size: 16px; font-weight: 700; color: var(--text-primary); } .modal-close { background: transparent; border: none; color: var(--text-muted); font-size: 16px; cursor: pointer; } .modal-close:hover { color: var(--text-primary); } .modal-body { padding: 20px; overflow-y: auto; flex: 1; } .modal-footer { padding: 14px 20px; border-top: 1px solid var(--border); display: flex; align-items: center; justify-content: flex-end; gap: 10px; } .modal-feedback { padding: 8px 12px; border-radius: var(--radius-sm); font-size: 12px; margin-bottom: 14px; } .modal-feedback.error { background-color: rgba(228, 92, 79, 0.15); border: 1px solid var(--status-error); color: #FFD8D2; } .modal-feedback.success { background-color: rgba(114, 201, 67, 0.15); border: 1px solid var(--status-healthy); color: #E2F8D5; } .modal-feedback.info { background-color: rgba(76, 141, 216, 0.15); border: 1px solid var(--status-info); color: #D2E5FA; } /* ── Toast Notifications ── */ .toast-container { position: fixed; bottom: 24px; right: 24px; display: flex; flex-direction: column; gap: 8px; z-index: 10000; pointer-events: none; } .toast { background-color: var(--surface-hover); border: 1px solid var(--border); color: var(--text-primary); padding: 10px 16px; border-radius: var(--radius-sm); font-size: 12px; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4); animation: toastSlideIn 0.2s ease-out; pointer-events: auto; } .toast.success { border-color: var(--status-healthy); } .toast.error { border-color: var(--status-error); } .toast.warning { border-color: var(--status-warning); } @keyframes toastSlideIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* ── Scrollbars ── */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--surface-muted); } ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--border-hover); } /* ── Data Tables (Analytics) ── */ .table-responsive { width: 100%; overflow-x: auto; } .data-table { width: 100%; border-collapse: collapse; font-size: 12px; text-align: left; } .data-table th { background-color: var(--surface-muted); color: var(--text-muted); font-weight: 600; padding: 10px 12px; border-bottom: 1px solid var(--border); text-transform: uppercase; font-size: 10px; letter-spacing: 0.5px; } .data-table td { padding: 10px 12px; border-bottom: 1px solid var(--border-subtle); color: var(--text-primary); } .data-table tr:hover td { background-color: var(--surface-hover); } .cell-bar-container { display: flex; align-items: center; gap: 8px; min-width: 120px; } .cell-bar-track { flex: 1; height: 6px; background: var(--surface-muted); border-radius: 3px; overflow: hidden; } .cell-bar-fill { height: 100%; border-radius: 3px; } /* ── Readiness Banner (Health) ── */ .readiness-banner { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 18px 20px; margin-bottom: 16px; border-left: 4px solid var(--status-healthy); } .readiness-banner.degraded { border-left-color: var(--status-warning); } .readiness-banner.critical { border-left-color: var(--status-error); } .readiness-banner.limited { border-left-color: var(--status-info); } .readiness-banner-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; } .readiness-banner-title { font-size: 16px; font-weight: 700; color: var(--text-primary); display: flex; align-items: center; gap: 8px; } .readiness-banner-summary { font-size: 13px; color: var(--text-secondary); margin-bottom: 12px; } .readiness-banner-stats { display: flex; gap: 16px; flex-wrap: wrap; font-size: 12px; color: var(--text-muted); } .readiness-banner-stats strong { color: var(--text-primary); } /* ── Host Resources Grid (Health) ── */ .host-resources-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; padding: 14px; } .host-resource-card { background-color: var(--surface-muted); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 14px; } .host-resource-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; } .host-resource-title { font-size: 12px; font-weight: 600; color: var(--text-secondary); } .host-resource-value { font-size: 16px; font-weight: 700; color: var(--text-primary); } .host-resource-bar { height: 6px; background: var(--surface); border-radius: 3px; overflow: hidden; margin-bottom: 6px; } .host-resource-fill { height: 100%; border-radius: 3px; background: var(--accent); } .host-resource-sub { font-size: 11px; color: var(--text-muted); } /* ── Warnings List (Health) ── */ .warnings-list { padding: 14px; } .warning-item { display: flex; align-items: flex-start; gap: 10px; background-color: rgba(225, 166, 43, 0.08); border: 1px solid var(--status-warning); border-radius: var(--radius-sm); padding: 10px 14px; margin-bottom: 8px; font-size: 12px; color: var(--text-primary); } .warning-item:last-child { margin-bottom: 0; } .warning-icon { font-size: 14px; color: var(--status-warning); line-height: 1.2; } /* ── Logs Feed (Events) ── */ .logs-container { max-height: 620px; overflow-y: auto; padding: 8px; } .log-entry { display: flex; align-items: flex-start; gap: 10px; padding: 8px 10px; border-bottom: 1px solid var(--border-subtle); font-size: 12px; } .log-entry:hover { background-color: var(--surface-hover); } .log-timestamp { font-family: var(--font-mono); font-size: 11px; color: var(--text-muted); min-width: 65px; } .log-badge { padding: 2px 6px; border-radius: 3px; font-size: 9px; font-weight: 700; text-transform: uppercase; min-width: 54px; text-align: center; } .log-badge.info { background: rgba(76, 141, 216, 0.2); color: var(--status-info); border: 1px solid var(--status-info); } .log-badge.success { background: rgba(114, 201, 67, 0.2); color: var(--status-healthy); border: 1px solid var(--status-healthy); } .log-badge.warning { background: rgba(225, 166, 43, 0.2); color: var(--status-warning); border: 1px solid var(--status-warning); } .log-badge.error { background: rgba(228, 92, 79, 0.2); color: var(--status-error); border: 1px solid var(--status-error); } .log-category { font-size: 10px; padding: 2px 6px; border-radius: 3px; background: var(--surface-muted); border: 1px solid var(--border-subtle); color: var(--text-secondary); } .log-content { flex: 1; } .log-message { color: var(--text-primary); font-weight: 500; } .log-details { font-size: 11px; color: var(--text-muted); margin-top: 2px; font-family: var(--font-mono); word-break: break-all; } /* ── Settings View ── */ .mono-path { font-family: var(--font-mono); font-size: 11px; color: var(--text-secondary); background: var(--surface-muted); padding: 4px 8px; border-radius: 3px; border: 1px solid var(--border-subtle); display: inline-block; margin-top: 4px; } .badge { display: inline-block; padding: 3px 8px; border-radius: 3px; font-size: 10px; font-weight: 600; background: var(--surface-muted); border: 1px solid var(--border-subtle); color: var(--text-muted); } .badge.healthy { background: rgba(114, 201, 67, 0.15); border-color: var(--status-healthy); color: var(--status-healthy); } /* ── Light Theme Override ── */ /* Drag and Drop Styles */ .draggable-item { cursor: grab; user-select: none; } .draggable-item:active { cursor: grabbing; } .drop-zone { min-height: 40px; border: 1px dashed var(--border); border-radius: var(--radius-sm); display: flex; align-items: center; justify-content: center; font-size: 11px; color: var(--text-muted); transition: all 0.2s; margin-top: 8px; } .drop-zone.drag-over { border-color: var(--accent); background-color: var(--accent-dim); color: var(--accent); } .role-section { background-color: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); margin-bottom: 16px; display: flex; flex-direction: column; } .role-header { padding: 12px 16px; border-bottom: 1px solid var(--border-subtle); display: flex; justify-content: space-between; align-items: center; } .role-header h4 { font-family: var(--font-title); color: var(--text-primary); font-size: 14px; margin: 0; display: flex; align-items: center; gap: 8px; } .role-badge { font-size: 10px; background-color: var(--accent-dim); color: var(--accent); padding: 2px 6px; border-radius: 4px; font-family: var(--font-ui); } .account-row { display: grid; grid-template-columns: 24px 20px 200px 120px 120px 150px 80px 80px 24px; align-items: center; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var(--border-subtle); background-color: var(--surface); font-size: 12px; } .account-row:last-child { border-bottom: none; } .account-row.drag-over { border-top: 2px solid var(--accent); } .drag-handle { color: var(--text-muted); cursor: grab; text-align: center; } .provider-logo-sm { width: 16px; height: 16px; border-radius: 2px; } .available-account-card { background-color: var(--surface); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); padding: 10px; display: flex; align-items: center; gap: 10px; cursor: grab; } .available-account-card:hover { border-color: var(--border); background-color: var(--surface-hover); } .grid-header { display: grid; grid-template-columns: 24px 20px 200px 120px 120px 150px 80px 80px 24px; align-items: center; gap: 8px; padding: 8px 12px; font-size: 10px; color: var(--text-muted); text-transform: uppercase; border-bottom: 1px solid var(--border-subtle); background-color: var(--surface-muted); } /* A48 — Крона workspace. Surface and chrome have separate ink tokens so cream cards remain legible against the medium theme's green workspace. */ :root, body[data-theme="dark"] { --bg-base:#07120f; --bg-sidebar:#06110e; --bg-header:#07120f; --surface:#0d1b16; --surface-muted:#10231c; --surface-hover:#172e23; --surface-active:#253b27; --surface-selected:#182e20; --border:#3d3924; --border-subtle:#2d3423; --border-accent:#9f7938; --text-primary:#f2eedf; --text-secondary:#c5cbbb; --text-muted:#a3b0a0; --accent:#dab568; --text-accent:#dab568; --chrome-ink:#f2eedf; --chrome-muted:#b5bca9; --canvas-bg:#081811; --canvas-ink:#d8d4b6; --surface-card:var(--surface); --accent-ink:#211c0e; --sidebar-width:244px; --header-height:76px; } body[data-theme="medium"] { --bg-base:#1a2a1f; --bg-sidebar:#102219; --bg-header:#15271c; --surface:#f7f1e3; --surface-muted:#eee6d3; --surface-hover:#e8dec6; --surface-active:#e4d7b8; --surface-selected:#eae0c8; --border:#c9bea4; --border-subtle:#dbcfb5; --border-accent:#9b7429; --text-primary:#1c2b20; --text-secondary:#3a4d3d; --text-muted:#57624e; --accent:#89631d; --text-accent:#89631d; --chrome-ink:#f7f1e3; --chrome-muted:#c3cbb9; --canvas-bg:#1a2a1f; --canvas-ink:#e5d2a6; --status-healthy:#42732c; --status-warning:#86580e; --status-error:#a93428; --status-info:#396ba0; --accent-ink:#fff9e9; } body[data-theme="light"] { --bg-base:#f7f1e3; --bg-sidebar:#f3ecdb; --bg-header:#f7f1e3; --surface:#fcf8ee; --surface-muted:#f0e8d7; --surface-hover:#eee3ca; --surface-active:#e7d7b2; --surface-selected:#f0e4cb; --border:#d4c5a5; --border-subtle:#e3d7be; --border-accent:#a67b2e; --text-primary:#202b21; --text-secondary:#414e3e; --text-muted:#606951; --accent:#8b631c; --text-accent:#8b631c; --chrome-ink:#202b21; --chrome-muted:#606951; --canvas-bg:#f5eedb; --canvas-ink:#5c593e; --status-healthy:#42732c; --status-warning:#86580e; --status-error:#a93428; --status-info:#396ba0; --accent-ink:#fff9e9; } body { font-size:13px; font-variant-numeric:tabular-nums; user-select:text; } button,input,select,textarea { font:inherit; } button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,[tabindex]:focus-visible { outline:2px solid var(--accent); outline-offset:3px; } button:disabled { opacity:.5; cursor:not-allowed; } .brand { min-height:104px; padding:16px 12px; gap:6px; border:0; } .brand-logo { width:68px; height:68px; object-fit:contain; flex-shrink:0; } .brand-title { font-size:18px; font-weight:500; letter-spacing:.6px; } .brand-subtitle { font-size:9px; letter-spacing:0; color:var(--chrome-muted); } .nav-menu { padding:8px 12px; gap:5px; flex:0 1 auto; } .nav-item { min-height:45px; padding:10px 12px; gap:14px; color:var(--chrome-ink); border-radius:6px; } .nav-item.active { border-color:var(--border-accent); background:var(--surface-selected); color:var(--text-accent); } .nav-icon { width:23px; height:23px; fill:none; stroke:var(--accent); stroke-width:1.4; stroke-linecap:round; stroke-linejoin:round; flex-shrink:0; } body[data-theme="medium"] .nav-icon { stroke:var(--canvas-ink); } .brand-panel { margin:auto 14px 18px; padding:20px 10px; border:1px solid var(--border-accent); border-radius:7px; text-align:center; color:var(--chrome-ink); } .brand-panel img { width:110px; height:110px; object-fit:contain; } .brand-panel p { font-size:12px; line-height:1.8; margin:12px 0; } .brand-panel span { color:var(--chrome-muted); font-size:11px; } .sidebar-footer { padding:14px 16px; border-color:var(--border-accent); } .sidebar-footer .source-text,.sidebar-footer .version-tag { color:var(--chrome-muted); } .main-wrapper { min-width:0; } .top-header { min-height:var(--header-height); height:auto; flex-wrap:wrap; padding:14px 20px; gap:10px 18px; border-color:var(--border-accent); } .header-left { flex:1; min-width:220px; gap:12px; flex-wrap:wrap; } .header-title { color:var(--chrome-ink); font-size:20px; font-weight:600; } .header-readiness-badge { font-weight:400; color:var(--text-secondary); background:var(--surface); } .header-actions { gap:12px; } .header-page-actions { display:flex; gap:10px; } .header-search { min-width:178px; display:flex; align-items:center; justify-content:space-between; gap:16px; padding:9px 12px; border:1px solid var(--border-accent); border-radius:6px; background:transparent; color:var(--chrome-muted); cursor:pointer; } .header-search kbd { font-size:10px; } .header-icon { width:32px; height:34px; background:transparent; border:0; font-size:23px; color:var(--chrome-muted); cursor:pointer; } .hub-user { display:flex; align-items:center; gap:9px; color:var(--chrome-ink); font-size:12px; } .hub-user>span { display:grid; place-items:center; width:34px; height:34px; border:1px solid var(--border-accent); border-radius:50%; color:var(--chrome-muted); } .hub-user small { display:block; font-size:9px; color:var(--chrome-muted); } .content-area { padding:18px 20px; } .btn { min-height:34px; box-shadow:none; transition:background-color .15s,border-color .15s; } .btn-primary { background:var(--accent); color:var(--accent-ink); border-color:var(--accent); } .btn-secondary { background:var(--surface); color:var(--text-accent); border-color:var(--border-accent); } .status-dot.healthy { box-shadow:none; } .view-header-note { color:var(--chrome-muted); background:transparent; border:0; padding:0 0 16px; line-height:1.6; } .toolbar { gap:12px; flex-wrap:wrap; margin-bottom:16px; } .search-box { min-width:220px; background:var(--surface); border-color:var(--border); } .filters-row { flex-wrap:wrap; } .section-card,.settings-card,.kpi-card,.account-card,.resource-card { background:var(--surface); border:1px solid var(--border); border-radius:7px; box-shadow:none; } .section-card { padding:16px; margin-bottom:14px; min-width:0; } .section-card-title,.settings-group-title { font-family:var(--font-ui); font-weight:500; color:var(--text-accent); font-size:13px; text-transform:uppercase; letter-spacing:.03em; } .section-card-subtitle { margin-top:6px; color:var(--text-muted); line-height:1.5; } .account-summary { display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:0; border:1px solid var(--border); background:var(--surface); border-radius:7px; margin-bottom:16px; } .account-summary>div { padding:16px; border-right:1px solid var(--border-subtle); } .account-summary strong { display:block; font-size:24px; font-weight:500; margin:6px 0; } .account-summary span,.account-summary small { color:var(--text-muted); font-size:11px; } .accounts-groups-container { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:12px; } .provider-group { grid-column:1 / -1; min-width:0; } .provider-group-header { display:flex; justify-content:space-between; align-items:center; margin:12px 0; } .accounts-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(min(100%,300px),1fr)); gap:12px; } .account-card { min-width:0; padding:16px; height:auto; min-height:164px; gap:10px; } .account-card-header { flex-wrap:wrap; } .account-badges { min-width:0; flex-wrap:wrap; } .account-card .badge-status { white-space:normal; overflow-wrap:anywhere; } .badge-status.unhealthy { color:var(--status-error); } .account-card-header { gap:8px; } .account-provider-tag { display:flex; align-items:center; gap:10px; } .account-provider-tag img { width:30px; height:30px; object-fit:contain; } .account-email,.account-meta { overflow-wrap:anywhere; white-space:normal; } .account-quota-grid { gap:6px; } .quota-cell { background:var(--surface-muted); border:1px solid var(--border-subtle); padding:10px; } .quota-bar-track { height:5px; box-shadow:none; background:var(--border-subtle); } .routing-grid { display:grid!important; grid-template-columns:minmax(0,2.15fr) minmax(280px,1fr); gap:16px!important; height:calc(100vh - 212px)!important; } .routing-left-col { min-width:0; } .routing-right-col { min-width:0; background:var(--surface)!important; } .role-section { background:var(--surface); padding:12px; margin-bottom:14px; border:1px solid var(--border); border-radius:7px; overflow:auto; } .role-header { gap:10px; } .role-header h4 { font:600 14px var(--font-ui); } .grid-header,.account-row { grid-template-columns:20px 56px minmax(120px,1.2fr) minmax(126px,1fr) minmax(100px,1fr) 88px 82px 26px; gap:8px; min-width:690px; } .grid-header { font-size:10px; padding:10px 8px; } .account-row { padding:10px 8px; border:1px solid var(--border-subtle); border-radius:5px; margin:4px 0; } .account-row>div { min-width:0; overflow-wrap:anywhere; } .account-row select { width:100%; background:var(--surface-muted); color:var(--text-primary); border:1px solid var(--border); padding:5px; border-radius:4px; } .available-account-card { background:var(--surface); border:1px solid var(--border-subtle); padding:12px; } .drop-zone { padding:12px; border:1px dashed var(--border-accent); color:var(--text-accent); } .drag-over { outline:2px solid var(--accent); outline-offset:-2px; background:var(--surface-selected); } .route-priority { font-size:9px; color:var(--text-accent); } .route-quota { font-size:10px; color:var(--text-muted); margin-bottom:5px; } .route-remove { color:var(--text-accent); background:transparent; border:0; cursor:pointer; padding:5px; } .overview-grid { grid-template-columns:repeat(4,minmax(0,1fr)); gap:12px; } .kpi-card { padding:18px; } .kpi-value { font-size:28px; font-weight:500; } .analytics-workspace { display:grid; grid-template-columns:1.25fr 1fr .8fr; gap:14px; } .analytics-tables { display:grid; grid-template-columns:1.1fr 1fr; gap:14px; } .metric-chart { min-height:230px; display:flex; flex-direction:column; justify-content:center; gap:12px; color:var(--text-muted); } .metric-bar { display:grid; grid-template-columns:minmax(80px,1fr) 2fr auto; gap:10px; align-items:center; font-size:11px; } .metric-bar meter { width:100%; height:10px; accent-color:var(--status-healthy); } .data-table th { color:var(--text-accent); background:var(--surface); font-weight:500; } .data-table td { padding:13px 10px; border-color:var(--border-subtle); } .data-table tr:hover { background:var(--surface-hover); } .host-resources-grid { grid-template-columns:repeat(5,minmax(0,1fr)); } .resource-card { padding:16px; } .resource-value { font-size:24px; } .logs-layout { display:grid; grid-template-columns:minmax(0,2.4fr) minmax(250px,1fr); gap:16px; } .logs-container { min-width:0; overflow:auto; max-height:65vh; } .log-detail { background:var(--surface-muted); border:1px solid var(--border); border-radius:6px; padding:18px; overflow-wrap:anywhere; } .log-detail h2 { font-size:13px; font-weight:500; color:var(--text-accent); text-transform:uppercase; margin-bottom:20px; } .log-detail pre { white-space:pre-wrap; font-size:11px; margin-top:16px; } .log-detail p { margin:10px 0; color:var(--text-secondary); } #view-settings.active { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; align-items:start; } #view-settings>.settings-card { margin:0!important; min-width:0; } .setting-row { padding:14px 0; gap:12px; align-items:start; } .setting-control { min-width:0; max-width:55%; } .setting-control input,.setting-control select { max-width:100%; } .command-results { display:flex; flex-direction:column; gap:8px; padding-top:12px; } .command-results button { text-align:left; } @media(min-width:1700px) { #view-settings.active { grid-template-columns:repeat(3,minmax(0,1fr)); } } @media(max-width:1250px) { :root { --sidebar-width:210px; }.hub-user { display:none; }.accounts-groups-container { grid-template-columns:repeat(2,minmax(0,1fr)); }.routing-grid { grid-template-columns:minmax(0,1.6fr) 280px; }.brand-title { font-size:15px; }.brand-logo { width:50px;height:50px; } } @media(max-width:950px) { :root { --sidebar-width:180px; }.analytics-workspace,.analytics-tables,.logs-layout { grid-template-columns:1fr; }#view-settings.active { grid-template-columns:1fr; }.host-resources-grid,.account-summary { grid-template-columns:repeat(2,minmax(0,1fr)); }.brand-panel { display:none; }.sidebar-footer { margin-top:auto; }.routing-grid { height:auto!important; grid-template-columns:1fr; }.routing-right-col { max-height:400px; } } @media(max-width:650px) { :root { --sidebar-width:64px; }.brand { padding:8px; min-height:70px; }.brand-text,.nav-label,.nav-badge,.sidebar-footer { display:none; }.nav-menu { padding:6px; }.nav-item { padding:10px; }.content-area { padding:12px; }.header-title { font-size:17px; }.header-search { min-width:120px; }.header-page-actions { flex-wrap:wrap; }.accounts-groups-container,.overview-grid { grid-template-columns:1fr; }.setting-row { flex-direction:column; }.setting-control { max-width:100%; }.top-header { padding:12px; } } @media(prefers-reduced-motion:reduce) { *,*::before,*::after { animation:none!important; transition:none!important; } } /* Keep navigation reachable on shorter desktop windows. */ .brand,.sidebar-footer { flex-shrink:0; } .nav-menu { flex:0 0 auto; overflow:visible; } .brand-panel { min-height:0; } .content-scroll { padding:18px 20px; min-height:0; } .setting-control { display:flex; flex-wrap:wrap; gap:8px; flex:0 1 48%; } .setting-control input { min-width:0; width:100%!important; } .setting-info { min-width:0; flex:1; } .setting-control select { width:100%; } .header-left { flex-basis:260px; } .header-title { white-space:nowrap; font-size:18px; } @media(max-height:850px) { .brand-panel { display:none; }.sidebar-footer { margin-top:auto; } } @media(max-width:1350px) { .hub-user { display:none; }.header-search { min-width:150px; } } @media(max-width:650px) { .content-scroll { padding:12px; }.setting-control { flex-basis:auto; width:100%; } } .health-workspace { display:grid; grid-template-columns:1.1fr 1fr 1fr; gap:14px; } .health-workspace .section-card { margin:0; } .health-workspace p { font-size:12px; color:var(--text-muted); line-height:1.6; margin:10px 0; } @media(max-width:1100px) { .health-workspace { grid-template-columns:1fr; } } .routing-right-col input,.routing-right-col select { min-width:0; padding:8px 10px; color:var(--text-primary); background:var(--surface-muted); border:1px solid var(--border); border-radius:4px; font:11px var(--font-ui); } body[data-theme="medium"] .brand-title { color:var(--canvas-ink); } body[data-theme="medium"] .nav-item.active .nav-icon { stroke:var(--text-accent); } .header-icon svg { width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:1.5; } .header-update-badge { color:var(--chrome-ink); background:transparent; } @media(min-width:1051px) { .top-header { min-height:84px; padding-top:8px; padding-bottom:8px; } .header-left { display:flex; flex-wrap:wrap; gap:6px; min-width:200px; } .header-title { width:100%; } .header-readiness-badge,.header-update-badge { margin:0; font-size:9px; padding:4px 6px; } } .readiness-banner.not-ready { border-left-color:var(--status-error); } .status-dot.not-ready { background:var(--status-error); } .status-dot.ready { background:var(--status-healthy); } .resource-value { font-size:clamp(18px,1.7vw,26px); } /* ── Skills View & Cards ── */ .skills-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(360px, 1fr)); gap: 16px; padding-top: 12px; } .skill-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 16px; display: flex; flex-direction: column; gap: 10px; transition: border-color 0.2s, box-shadow 0.2s; } .skill-card:hover { border-color: var(--border-accent); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25); } .skill-card-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 8px; } .skill-card-title { font-size: 15px; font-weight: 700; color: var(--text-primary); font-family: var(--font-mono); } .skill-card-desc { font-size: 12px; color: var(--text-secondary); line-height: 1.4; flex: 1; } .skill-card-meta { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); word-break: break-all; } .skill-card-tags { display: flex; flex-wrap: wrap; gap: 4px; } .skill-tag { font-size: 10px; padding: 2px 6px; background: var(--surface-muted); border: 1px solid var(--border-subtle); border-radius: var(--radius-sm); color: var(--text-muted); } .skill-card-assigned { font-size: 12px; color: var(--text-secondary); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; } .skill-agent-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; background: rgba(33, 150, 243, 0.12); border: 1px solid rgba(33, 150, 243, 0.3); border-radius: 12px; font-size: 11px; color: #90caf9; } .skill-agent-badge .remove-btn { cursor: pointer; font-weight: bold; opacity: 0.7; } .skill-agent-badge .remove-btn:hover { opacity: 1; color: var(--status-error); } .skill-card-actions { display: flex; align-items: center; justify-content: space-between; gap: 8px; border-top: 1px solid var(--border-subtle); padding-top: 10px; margin-top: 4px; } .doctor-report-body { font-size: 13px; line-height: 1.5; } .doctor-report-body h2 { font-size: 14px; margin: 14px 0 6px; color: var(--text-primary); } .doctor-report-body h3 { font-size: 13px; margin: 10px 0 4px; color: var(--text-secondary); } .doctor-report-body ul, .doctor-report-body ol { margin: 0 0 10px 18px; padding: 0; } .doctor-report-body pre { background: var(--surface-muted); border: 1px solid var(--border-subtle); padding: 10px; border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 12px; overflow-x: auto; white-space: pre-wrap; word-break: break-all; } /* Brand marks are local assets, separate for a provider and the model it hosts. */ .brand-logo,.account-provider-tag img,.available-account-card>img { width:24px; height:24px; object-fit:contain; padding:3px; border-radius:4px; background:#fff; flex:none; } .model-brand { display:inline-flex; align-items:center; gap:6px; min-width:0; } .model-brand>span { overflow-wrap:anywhere; } .account-models { display:flex; gap:8px; flex-wrap:wrap; margin:10px 0; font-size:11px; } .account-models:empty { display:none; } .route-model-with-logo { display:flex; align-items:center; gap:6px; min-width:0; } .route-model-with-logo select { min-width:0; } .agent-node-icon .brand-logo { width:27px; height:27px; } .account-check { font-size:12px; line-height:1.5; color:var(--text-secondary); overflow-wrap:anywhere; } .badge-status.checking { color:var(--text-accent); }