/** * peardock modern UI layer * Overrides / extends ui/styles.css with a refined design system. */ :root { /* Surfaces */ --bg-primary: #0a0c10; --bg-secondary: #0f131a; --bg-tertiary: #151b24; --bg-elevated: #1a222e; --bg-hover: #232d3b; --bg-glass: rgba(15, 19, 26, 0.72); /* Brand — pear green + teal */ --accent-primary: #34d399; --accent-secondary: #2dd4bf; --accent-glow: rgba(52, 211, 153, 0.35); --accent-success: #4ade80; --accent-warning: #fbbf24; --accent-danger: #f87171; --accent-info: #38bdf8; /* Text — tuned for WCAG-ish contrast on near-black surfaces */ --text-primary: #f4f7fb; --text-secondary: #c8d1df; --text-muted: #9aa8bc; --text-faint: #7d8b9f; --border-color: rgba(255, 255, 255, 0.1); --border-strong: rgba(255, 255, 255, 0.18); --border-radius: 14px; --border-radius-sm: 10px; --border-radius-lg: 18px; --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.35); --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.35); --shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.45); --shadow-glow: 0 0 0 1px rgba(52, 211, 153, 0.15), 0 8px 32px rgba(52, 211, 153, 0.12); --titlebar-h: 42px; --sidebar-w: 288px; --sidebar-collapsed-w: 68px; --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace; } html { color-scheme: dark; } body { font-family: var(--font-sans); background: radial-gradient(1200px 600px at 10% -10%, rgba(52, 211, 153, 0.08), transparent 55%), radial-gradient(900px 500px at 100% 0%, rgba(45, 212, 191, 0.06), transparent 50%), var(--bg-primary); letter-spacing: -0.01em; -webkit-font-smoothing: antialiased; } /* ─── Titlebar ─── */ #titlebar { height: var(--titlebar-h); background: var(--bg-glass); border-bottom: 1px solid var(--border-color); backdrop-filter: blur(16px) saturate(1.4); -webkit-backdrop-filter: blur(16px) saturate(1.4); padding: 0 12px 0 8px; gap: 0; display: flex; align-items: center; justify-content: space-between; -webkit-app-region: drag; overflow: visible; z-index: 1100; } #titlebar > * { -webkit-app-region: no-drag; } /* Left cluster: window controls + brand (never overlap) */ #titlebar .titlebar-left { display: flex; align-items: center; gap: 10px; flex: 0 1 auto; min-width: 0; max-width: 55%; z-index: 2; } /* Pear window controls — reserve space so brand never sits under traffic lights */ #titlebar pear-ctrl { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: flex-start; position: relative; z-index: 5; line-height: 0; min-width: 54px; min-height: 28px; margin: 0; padding: 0 4px; overflow: visible; -webkit-app-region: no-drag; } #titlebar pear-ctrl[data-platform='darwin'] { min-width: 78px; margin: 0 8px 0 8px; margin-top: 0 !important; margin-left: 8px !important; } #titlebar pear-ctrl[data-platform='linux'], #titlebar pear-ctrl[data-platform='win32'] { min-width: 110px; } #titlebar .app-brand { display: flex; align-items: center; gap: 8px; pointer-events: none; -webkit-app-region: no-drag; margin-left: 4px; min-width: 0; flex-shrink: 1; position: relative; z-index: 1; } #titlebar .titlebar-right { display: flex; align-items: center; gap: 10px; flex: 0 0 auto; margin-left: auto; max-width: 50%; z-index: 2; } #titlebar .notification-tray { margin-left: 0; position: relative; flex-shrink: 0; } #titlebar .connection-health-badge, #titlebar #active-peer-chip { flex-shrink: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } #titlebar .app-brand-mark { width: 22px; height: 22px; border-radius: 6px; display: grid; place-items: center; overflow: hidden; flex-shrink: 0; background: transparent; box-shadow: none; } #titlebar .app-brand-mark img { width: 100%; height: 100%; object-fit: contain; display: block; } #titlebar .app-brand-text { font-size: 13px; font-weight: 650; color: var(--text-primary); letter-spacing: -0.02em; } #titlebar .app-brand-text span { color: var(--text-secondary); font-weight: 500; margin-left: 6px; font-size: 12px; } /* ─── Sidebar ─── */ #sidebar { position: fixed; top: var(--titlebar-h); left: 0; height: calc(100vh - var(--titlebar-h)); width: var(--sidebar-w); background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%); border-right: 1px solid var(--border-color); box-shadow: none; display: flex; flex-direction: column; /* Never scroll the whole sidebar — nav and peer list scroll independently */ overflow: hidden; z-index: 1000; } /* ─── Collapsed sidebar = clean icon rail ─── */ #sidebar.collapsed { width: var(--sidebar-collapsed-w); } #sidebar.collapsed .content { padding: 48px 6px 10px; align-items: stretch; } /* Expand control sits centered at top of the rail */ #sidebar.collapsed #collapse-sidebar-btn { top: 10px; left: 50%; right: auto; transform: translateX(-50%); width: 40px; height: 32px; border-radius: 10px; z-index: 12; } #sidebar.collapsed #collapse-sidebar-btn:hover { transform: translateX(-50%); color: var(--accent-primary); border-color: rgba(52, 211, 153, 0.35); } /* Hide every text label / section chrome in the rail */ #sidebar.collapsed .sidebar-section-label, #sidebar.collapsed .nav-group-label, #sidebar.collapsed .nav-label, #sidebar.collapsed .sidebar-nav-scroll > .sidebar-section-label, #sidebar.collapsed .sidebar-nav-scroll kbd, #sidebar.collapsed .connection-name, #sidebar.collapsed .connection-item small, #sidebar.collapsed .connection-meta, #sidebar.collapsed .open-add-connection-label, #sidebar.collapsed .sidebar-divider, #sidebar.collapsed .sidebar-footer .sidebar-divider, #sidebar.collapsed .docker-terminal-btn, #sidebar.collapsed .disconnect-btn, #sidebar.collapsed .connection-actions { display: none !important; } #sidebar.collapsed .sidebar-nav-scroll { width: 100%; padding: 0; padding-right: 0; scrollbar-gutter: auto; display: flex; flex-direction: column; align-items: stretch; overflow-x: hidden; } #sidebar.collapsed .nav-menu { display: flex; flex-direction: column; align-items: center; gap: 2px; margin: 0; width: 100%; padding: 0; } #sidebar.collapsed .nav-item { margin: 0; width: 100%; display: flex; justify-content: center; } /* Square icon buttons */ #sidebar.collapsed .nav-link { width: 44px; height: 40px; min-width: 44px; padding: 0; margin: 0 auto; justify-content: center; align-items: center; gap: 0; border-radius: 11px; box-sizing: border-box; } #sidebar.collapsed .nav-link i { width: auto; margin: 0; font-size: 1.05rem; line-height: 1; opacity: 0.95; } #sidebar.collapsed .nav-link:hover { background: var(--bg-hover); color: var(--text-primary); transform: none; } #sidebar.collapsed .nav-link.active { background: rgba(52, 211, 153, 0.14); color: var(--accent-primary); box-shadow: inset 0 0 0 1px rgba(52, 211, 153, 0.32); border-left: none; } /* Footer: quick-add + peers shortcut (list is on Peers view) */ #sidebar.collapsed .sidebar-footer { width: 100%; margin-top: auto; padding: 8px 0 4px; background: linear-gradient(180deg, transparent 0%, rgba(15, 19, 26, 0.9) 40%); display: flex; flex-direction: column; align-items: center; overflow: visible; } #sidebar.collapsed .connections-panel { width: 100%; align-items: center; overflow: visible; padding: 0; gap: 6px; } #sidebar.collapsed .connections-panel--compact { padding: 0; } #sidebar.collapsed .open-add-connection-btn { width: 40px; height: 36px; min-width: 40px; padding: 0; border-radius: 10px; justify-content: center; gap: 0; font-size: 14px; } #sidebar.collapsed .open-add-connection-label { display: none; } #sidebar.collapsed .connection-item { width: 100%; height: 100%; padding: 0 !important; justify-content: center; align-items: center; gap: 0; } #sidebar.collapsed .connection-info { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; flex: none; overflow: visible; cursor: pointer; } #sidebar.collapsed .connection-title-row { justify-content: center; align-items: center; gap: 0; width: auto; } #sidebar.collapsed .connection-status { margin: 0 !important; width: 11px; height: 11px; flex-shrink: 0; box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.04), 0 0 10px currentColor; } #content { margin-left: var(--sidebar-w); margin-top: var(--titlebar-h); height: calc(100vh - var(--titlebar-h)); background: transparent; overflow: hidden; display: flex; flex-direction: column; position: relative; } #content > #welcome-page { margin: auto; } #content > #dashboard, #content > .view { flex: 1; min-height: 0; } #sidebar.collapsed ~ #content { margin-left: var(--sidebar-collapsed-w); } #collapse-sidebar-btn { top: 12px; right: 12px; width: 30px; height: 30px; border-radius: 8px; background: var(--bg-tertiary); border: 1px solid var(--border-color); color: var(--text-secondary); font-size: 12px; } #collapse-sidebar-btn:hover { color: var(--accent-primary); border-color: rgba(52, 211, 153, 0.35); transform: none; } #sidebar .content { flex: 1 1 auto; padding: 16px 14px 10px; display: flex; flex-direction: column; height: 100%; min-height: 0; max-height: 100%; overflow: hidden; } /* Only the nav region scrolls — peers stay docked at the bottom */ .sidebar-nav-scroll { flex: 1 1 auto; min-height: 0; overflow-x: hidden; overflow-y: auto; padding-right: 2px; padding-bottom: 8px; scrollbar-gutter: stable; } .sidebar-section-label { font-size: 11px; font-weight: 650; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); margin: 8px 8px 10px; } .nav-menu { margin-bottom: 8px; } .nav-link { gap: 12px; padding: 10px 12px; border-radius: 10px; color: var(--text-secondary); font-weight: 500; font-size: 13.5px; } .nav-link i { width: 18px; opacity: 0.9; } .nav-link:hover { background: var(--bg-hover); color: var(--text-primary); transform: none; } .nav-link.active { background: linear-gradient(90deg, rgba(52, 211, 153, 0.16), rgba(52, 211, 153, 0.04)); color: var(--accent-primary); border-left: none; box-shadow: inset 0 0 0 1px rgba(52, 211, 153, 0.18); } .sidebar-divider { border: none; height: 1px; background: var(--border-color); margin: 8px 4px 10px; opacity: 1; flex: 0 0 auto; } /* * Footer docked to the bottom of the sidebar (not in the nav scroll). * Peer list grows upward until 4 rows, then scrolls inside the footer. */ .sidebar-footer { flex: 0 0 auto; margin-top: auto; padding-top: 4px; background: linear-gradient(180deg, transparent 0%, var(--bg-secondary) 28%); border-top: 0; z-index: 2; } .connections-panel { --peer-row-h: 54px; --peer-row-gap: 8px; --peer-list-max-visible: 4; --peer-list-max-h: calc( (var(--peer-list-max-visible) * var(--peer-row-h)) + ((var(--peer-list-max-visible) - 1) * var(--peer-row-gap)) ); flex: 0 0 auto; display: flex; flex-direction: column; margin-top: 0; padding-top: 0; padding-bottom: 4px; overflow: hidden; max-height: none; } /* Compact sidebar footer: Add peer + open Peers view (list lives in Peers tab) */ .connections-panel--compact { padding: 0 6px 6px; gap: 6px; overflow: visible; } .connections-panel--compact .open-add-connection-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 36px; border-radius: 10px; font-weight: 600; } /* Peers view full list */ #peers-view .peers-connection-list, .peers-connection-list { max-height: none !important; overflow: visible !important; display: flex; flex-direction: column; gap: 8px; padding: 0; margin: 0; background: transparent; } #peers-view .peers-connection-list .list-group-item { border-radius: 12px !important; border: 1px solid var(--border-color) !important; background: var(--bg-tertiary) !important; margin: 0 !important; padding: 12px 14px !important; width: 100% !important; max-width: none !important; height: auto !important; max-height: none !important; } #peers-view .peers-connection-list .list-group-item:hover { background: var(--bg-hover) !important; border-color: rgba(52, 211, 153, 0.35) !important; } #peers-view .peers-connection-list .list-group-item.active { border-color: rgba(52, 211, 153, 0.55) !important; box-shadow: 0 0 0 1px rgba(52, 211, 153, 0.25), 0 8px 24px rgba(0, 0, 0, 0.25); background: rgba(52, 211, 153, 0.1) !important; } #peers-view .connection-item { gap: 12px; width: 100%; } #peers-view .connection-name { max-width: none !important; font-size: 0.95rem; overflow: visible; text-overflow: unset; white-space: normal; } #peers-view .connection-meta { display: block !important; white-space: normal; } .connections-panel-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 8px; padding: 0 2px; flex: 0 0 auto; } .connections-panel-header .sidebar-section-label { margin: 0; } .open-add-connection-btn { display: inline-flex; align-items: center; gap: 6px; border-radius: 8px; font-weight: 600; font-size: 12px; padding: 4px 10px; flex-shrink: 0; } #connection-list { flex: 0 1 auto; height: auto; max-height: var(--peer-list-max-h); min-height: 0; overflow-x: hidden; overflow-y: auto; padding: 0 2px 0; margin-bottom: 0 !important; list-style: none; scrollbar-gutter: stable; } #connection-list .list-group-item { display: flex; align-items: stretch; width: 100%; max-width: 100%; height: var(--peer-row-h); max-height: var(--peer-row-h); background: var(--bg-elevated); border: 1px solid var(--border-color); border-radius: 12px; margin-bottom: var(--peer-row-gap); padding: 0; overflow: hidden; min-width: 0; box-sizing: border-box; } #connection-list .list-group-item:last-child { margin-bottom: 0; } #connection-list .list-group-item:hover { transform: none; border-color: rgba(52, 211, 153, 0.35); box-shadow: var(--shadow-glow); } #connection-list .list-group-item.active { background: rgba(52, 211, 153, 0.1); border-color: rgba(52, 211, 153, 0.4); } /* Peer row: name truncates; action buttons never overflow */ .connection-item { display: flex; align-items: center; gap: 8px; width: 100%; height: 100%; min-width: 0; max-width: 100%; padding: 8px 10px !important; border: none !important; background: transparent !important; box-sizing: border-box; } .connection-item .connection-info { flex: 1 1 auto; min-width: 0; overflow: hidden; cursor: pointer; } .connection-item .connection-title-row { display: flex; align-items: center; gap: 8px; min-width: 0; } .connection-item .connection-name { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; font-size: 13px; line-height: 1.25; } .connection-item .connection-meta { display: block; margin-left: 22px; margin-top: 2px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10px; line-height: 1.2; color: var(--text-muted); font-family: var(--font-mono); } .connection-item .connection-actions { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 4px; } .connection-item .connection-actions .btn { width: 30px; height: 30px; padding: 0; display: inline-flex; align-items: center; justify-content: center; border-radius: 8px; } #addConnectionModal .form-control { font-size: 13px; } #addConnectionModal .font-monospace { letter-spacing: -0.02em; } /* ─── Content / views ─── */ .view { margin-top: 0 !important; padding: 20px 24px 28px !important; /* Flex child of #content: fill available height and scroll internally */ flex: 1 1 auto; height: auto !important; max-height: 100%; min-height: 0; width: 100%; max-width: 100%; overflow-x: hidden; overflow-y: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; } .view > .container-fluid { width: 100%; max-width: 100%; min-width: 0; /* Avoid Bootstrap gutters + padding stacking into horizontal scroll */ padding-left: 0; padding-right: 0; padding-bottom: 8px; } .view .row { --bs-gutter-x: 0.9rem; --bs-gutter-y: 0.9rem; max-width: 100%; margin-left: 0; margin-right: 0; } .view .row > [class*='col'] { min-width: 0; max-width: 100%; } /* ═══════════════════════════════════════════════════════════ Dashboard redesign — modern fit-to-viewport shell ═══════════════════════════════════════════════════════════ */ #dashboard-view.view { display: flex !important; flex-direction: column; overflow: hidden !important; height: 100% !important; max-height: 100%; min-height: 0; padding: 0 !important; background: radial-gradient(900px 420px at 8% -10%, rgba(52, 211, 153, 0.1), transparent 55%), radial-gradient(700px 360px at 100% 0%, rgba(56, 189, 248, 0.07), transparent 50%), transparent; } #dashboard-view.hidden { display: none !important; } #dashboard-view .dashboard-layout.dash { flex: 1 1 auto; min-height: 0; height: 100%; max-height: 100%; display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto; gap: 14px; width: 100%; max-width: 100%; overflow: hidden; padding: 18px 22px 16px; box-sizing: border-box; } /* Header */ .dash-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; min-width: 0; } .dash-kicker { margin: 0 0 2px; font-size: 11px; font-weight: 650; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent-primary); } .dash-title { margin: 0; font-size: 1.55rem; font-weight: 750; letter-spacing: -0.03em; color: var(--text-primary); line-height: 1.15; } .dash-subtitle { margin: 4px 0 0; font-size: 13px; color: var(--text-muted); line-height: 1.4; } .dash-header-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .dash-icon-btn { width: 36px; height: 36px; border-radius: 10px; border: 1px solid var(--border-color); background: rgba(26, 34, 46, 0.85); color: var(--text-secondary); display: inline-flex; align-items: center; justify-content: center; cursor: pointer; transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease; } .dash-icon-btn:hover { color: var(--accent-primary); border-color: rgba(52, 211, 153, 0.4); background: rgba(52, 211, 153, 0.08); } .dash-icon-btn--sm { width: 30px; height: 30px; border-radius: 8px; font-size: 12px; } .dash-chip-btn { display: inline-flex; align-items: center; gap: 8px; height: 36px; padding: 0 14px; border-radius: 999px; border: none; cursor: pointer; font-weight: 650; font-size: 13px; color: #052e1c; background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); box-shadow: 0 6px 20px rgba(52, 211, 153, 0.25); transition: transform 0.15s ease, box-shadow 0.15s ease; } .dash-chip-btn:hover { transform: translateY(-1px); box-shadow: 0 8px 24px rgba(52, 211, 153, 0.35); } /* KPI strip */ .dash-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; min-width: 0; } .dash-kpi { position: relative; display: flex; align-items: center; gap: 12px; min-width: 0; padding: 14px 16px; border-radius: 16px; border: 1px solid var(--border-color); background: linear-gradient(145deg, rgba(26, 34, 46, 0.95), rgba(15, 19, 26, 0.9)); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.22); overflow: hidden; transition: border-color 0.18s ease, box-shadow 0.18s ease; } .dash-kpi:hover { border-color: rgba(52, 211, 153, 0.28); box-shadow: 0 10px 28px rgba(0, 0, 0, 0.28), 0 0 0 1px rgba(52, 211, 153, 0.08); } .dash-kpi-icon { width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center; flex-shrink: 0; font-size: 15px; } .dash-kpi--ok .dash-kpi-icon { background: rgba(74, 222, 128, 0.14); color: #4ade80; } .dash-kpi--stop .dash-kpi-icon { background: rgba(248, 113, 113, 0.14); color: #f87171; } .dash-kpi--info .dash-kpi-icon { background: rgba(56, 189, 248, 0.14); color: #38bdf8; } .dash-kpi--teal .dash-kpi-icon { background: rgba(45, 212, 191, 0.14); color: #2dd4bf; } .dash-kpi-meta { min-width: 0; display: flex; flex-direction: column; gap: 2px; } .dash-kpi-label { font-size: 11px; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-muted); } .dash-kpi-value { font-size: 1.65rem; font-weight: 750; letter-spacing: -0.03em; line-height: 1.05; color: var(--text-primary); font-variant-numeric: tabular-nums; } .dash-kpi-glow { position: absolute; right: -20%; top: -40%; width: 90px; height: 90px; border-radius: 50%; opacity: 0.18; pointer-events: none; filter: blur(8px); } .dash-kpi--ok .dash-kpi-glow { background: #4ade80; } .dash-kpi--stop .dash-kpi-glow { background: #f87171; } .dash-kpi--info .dash-kpi-glow { background: #38bdf8; } .dash-kpi--teal .dash-kpi-glow { background: #2dd4bf; } /* Panels */ .dash-panels { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); gap: 12px; min-height: 0; overflow: hidden; } .dash-card { min-width: 0; min-height: 0; height: 100%; display: flex; flex-direction: column; border-radius: 16px; border: 1px solid var(--border-color); background: linear-gradient(180deg, rgba(26, 34, 46, 0.92) 0%, rgba(15, 19, 26, 0.88) 100%); box-shadow: 0 10px 28px rgba(0, 0, 0, 0.22); overflow: hidden; } .dash-card-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 14px 8px; flex: 0 0 auto; border-bottom: 1px solid rgba(255, 255, 255, 0.05); } .dash-card-title { display: inline-flex; align-items: center; gap: 8px; font-size: 12.5px; font-weight: 650; letter-spacing: 0.02em; color: var(--text-primary); } .dash-card-title i { color: var(--accent-primary); font-size: 12px; opacity: 0.95; } .dash-card-body { flex: 1 1 auto; min-height: 0; overflow-x: hidden; overflow-y: auto; padding: 10px 14px 14px; font-size: 13px; } .dash-empty { color: var(--text-muted); font-size: 12.5px; padding: 18px 4px; text-align: center; } /* Metric rows inside cards */ .dash-metric { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 7px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.045); min-width: 0; } .dash-metric:last-child { border-bottom: none; } .dash-metric-label { color: var(--text-muted); font-size: 12px; flex: 0 1 auto; min-width: 0; } .dash-metric-value { color: var(--text-primary); font-weight: 600; font-size: 12.5px; text-align: right; min-width: 0; overflow-wrap: anywhere; word-break: break-word; font-variant-numeric: tabular-nums; } /* Disk usage bars */ .dash-disk-row { display: grid; gap: 4px; padding: 8px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.045); } .dash-disk-row:last-child { border-bottom: none; } .dash-disk-top { display: flex; justify-content: space-between; gap: 10px; font-size: 12px; } .dash-disk-top span { color: var(--text-muted); } .dash-disk-top strong { color: var(--text-primary); font-weight: 650; font-variant-numeric: tabular-nums; } .dash-disk-bar { height: 6px; border-radius: 999px; background: rgba(255, 255, 255, 0.06); overflow: hidden; } .dash-disk-bar > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary)); min-width: 0; max-width: 100%; } /* Events */ .dash-events.events-timeline { max-height: none !important; height: 100%; min-height: 0; font-size: 0.72rem; } #dashboard-view .events-timeline .event-row { grid-template-columns: 58px minmax(48px, 64px) minmax(0, 1fr); gap: 6px; padding: 6px 4px; border-bottom: 1px solid rgba(255, 255, 255, 0.05); border-radius: 6px; } #dashboard-view .events-timeline .event-row:hover { background: rgba(255, 255, 255, 0.03); } /* Skeleton */ .dash-skeleton { display: grid; gap: 10px; padding: 6px 0; } .dash-skel-line { height: 12px; border-radius: 6px; background: linear-gradient( 90deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.09), rgba(255, 255, 255, 0.04) ); background-size: 200% 100%; animation: dashShimmer 1.2s ease-in-out infinite; } .dash-skel-line.short { width: 55%; } @keyframes dashShimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } /* Actions dock */ .dash-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; min-width: 0; padding: 10px 12px; border-radius: 14px; border: 1px solid var(--border-color); background: rgba(15, 19, 26, 0.75); backdrop-filter: blur(10px); } .dash-actions-label { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 650; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-muted); flex-shrink: 0; } .dash-actions-label i { color: var(--accent-primary); } .dash-actions-row { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; flex: 1 1 auto; } .dash-action { display: inline-flex; align-items: center; gap: 7px; height: 32px; padding: 0 12px; border-radius: 999px; border: 1px solid var(--border-color); background: rgba(26, 34, 46, 0.9); color: var(--text-secondary); font-size: 12.5px; font-weight: 600; cursor: pointer; transition: border-color 0.15s ease, color 0.15s ease, background 0.15s ease; white-space: nowrap; } .dash-action:hover { color: var(--text-primary); border-color: rgba(52, 211, 153, 0.4); background: rgba(52, 211, 153, 0.1); } .dash-action--warn { border-color: rgba(251, 191, 36, 0.25); color: #fbbf24; } .dash-action--warn:hover { border-color: rgba(251, 191, 36, 0.5); background: rgba(251, 191, 36, 0.1); color: #fcd34d; } .dash-action--danger { border-color: rgba(248, 113, 113, 0.35); color: #fca5a5; } .dash-action--danger:hover { border-color: rgba(248, 113, 113, 0.55); background: rgba(248, 113, 113, 0.12); color: #fecaca; } /* Compat: key-value blocks injected by JS map to metric style */ #dashboard-view .key-value { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; padding: 7px 0; border-bottom: 1px solid rgba(255, 255, 255, 0.045); min-width: 0; } #dashboard-view .key-value:last-child { border-bottom: none; } #dashboard-view .key-value .key, #dashboard-view .key-value > span:first-child { color: var(--text-muted); font-size: 12px; } #dashboard-view .key-value .value, #dashboard-view .key-value strong { color: var(--text-primary); font-weight: 600; font-size: 12.5px; text-align: right; min-width: 0; overflow-wrap: anywhere; } @media (max-width: 1100px) { .dash-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 900px) { #dashboard-view.view { overflow-y: auto !important; } #dashboard-view .dashboard-layout.dash { grid-template-rows: auto auto auto auto; height: auto; max-height: none; overflow: visible; } .dash-panels { grid-template-columns: minmax(0, 1fr); grid-template-rows: none; overflow: visible; } .dash-card { min-height: 180px; } } @media (prefers-reduced-motion: reduce) { .dash-skel-line { animation: none; } .dash-chip-btn:hover { transform: none; } } .page-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 22px; flex-wrap: wrap; min-width: 0; max-width: 100%; } .page-header h2 { font-size: 1.5rem; font-weight: 700; letter-spacing: -0.03em; margin: 0 0 4px; color: var(--text-primary); display: flex; align-items: center; gap: 10px; } .page-header h2 i { color: var(--accent-primary); font-size: 1.15rem; } .page-header .page-subtitle { margin: 0; color: var(--text-muted); font-size: 13px; } /* ─── Welcome ─── */ #welcome-page { display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; position: relative; top: auto; left: auto; transform: none; max-width: 720px; width: min(720px, 92%); margin: auto; padding: 40px 36px; background: linear-gradient(160deg, rgba(52, 211, 153, 0.1) 0%, rgba(15, 19, 26, 0.9) 45%), var(--bg-elevated); border: 1px solid var(--border-strong); border-radius: var(--border-radius-lg); box-shadow: var(--shadow-lg), 0 0 80px rgba(52, 211, 153, 0.08); animation: welcomeIn 0.55s ease-out; } /* Must beat base #welcome-page { display:flex } from styles.css */ #welcome-page.hidden, #welcome-page[hidden], #welcome-page.is-hidden { display: none !important; visibility: hidden !important; pointer-events: none !important; animation: none !important; } @keyframes welcomeIn { from { opacity: 0; transform: translateY(12px) scale(0.98); } to { opacity: 1; transform: none; } } #welcome-page h1 { font-size: clamp(2rem, 4vw, 2.75rem); font-weight: 800; letter-spacing: -0.04em; margin-bottom: 12px; } #welcome-page .welcome-lead { font-size: 1.05rem; color: var(--text-secondary); margin-bottom: 28px; line-height: 1.7; } .welcome-steps { display: grid; gap: 12px; text-align: left; margin-top: 8px; } .welcome-step { display: flex; gap: 14px; align-items: flex-start; padding: 14px 16px; border-radius: 12px; background: rgba(255, 255, 255, 0.03); border: 1px solid var(--border-color); } .welcome-step-num { flex-shrink: 0; width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; font-size: 12px; font-weight: 700; color: #052e1c; background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary)); } .welcome-step strong { display: block; color: var(--text-primary); font-size: 13.5px; margin-bottom: 2px; } .welcome-step span { color: var(--text-muted); font-size: 12.5px; line-height: 1.5; } .welcome-mono { font-family: var(--font-mono); font-size: 11.5px; color: var(--accent-secondary); } /* ─── Cards & stats ─── */ .stat-card, .info-card { background: linear-gradient(180deg, rgba(255, 255, 255, 0.03) 0%, transparent 100%), var(--bg-elevated); border: 1px solid var(--border-color); border-radius: var(--border-radius); box-shadow: var(--shadow-sm); } .stat-card:hover, .info-card:hover { border-color: rgba(52, 211, 153, 0.28); box-shadow: var(--shadow-glow); transform: translateY(-1px); } .stat-card-value { font-variant-numeric: tabular-nums; font-weight: 700; letter-spacing: -0.03em; } /* ─── Bootstrap dark polish ─── */ .btn { border-radius: 10px; font-weight: 600; font-size: 13px; letter-spacing: -0.01em; transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease, transform 0.1s ease; } .btn-primary { --bs-btn-bg: #10b981; --bs-btn-border-color: #10b981; --bs-btn-hover-bg: #059669; --bs-btn-hover-border-color: #059669; --bs-btn-active-bg: #047857; --bs-btn-active-border-color: #047857; --bs-btn-color: #042f1a; --bs-btn-hover-color: #042f1a; --bs-btn-active-color: #042f1a; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.12) inset, 0 6px 16px rgba(16, 185, 129, 0.25); } .btn-outline-primary { --bs-btn-color: #6ee7b7; --bs-btn-border-color: rgba(52, 211, 153, 0.55); --bs-btn-hover-bg: rgba(52, 211, 153, 0.18); --bs-btn-hover-border-color: var(--accent-primary); --bs-btn-hover-color: #ecfdf5; --bs-btn-active-bg: rgba(52, 211, 153, 0.28); --bs-btn-active-border-color: var(--accent-primary); --bs-btn-active-color: #ecfdf5; --bs-btn-disabled-color: rgba(110, 231, 183, 0.4); --bs-btn-disabled-border-color: rgba(52, 211, 153, 0.25); background: transparent; color: #6ee7b7; border-color: rgba(52, 211, 153, 0.55); } .btn-outline-primary:hover, .btn-outline-primary:focus { background: rgba(52, 211, 153, 0.18) !important; color: #ecfdf5 !important; border-color: var(--accent-primary) !important; } .btn-secondary { --bs-btn-bg: var(--bg-tertiary); --bs-btn-border-color: var(--border-strong); --bs-btn-color: var(--text-primary); --bs-btn-hover-bg: var(--bg-hover); --bs-btn-hover-border-color: var(--border-strong); --bs-btn-hover-color: var(--text-primary); --bs-btn-active-bg: var(--bg-hover); --bs-btn-active-color: var(--text-primary); color: var(--text-primary); background: var(--bg-tertiary); border-color: var(--border-strong); } .btn-outline-secondary { --bs-btn-color: var(--text-secondary); --bs-btn-border-color: rgba(148, 163, 184, 0.45); --bs-btn-hover-bg: rgba(148, 163, 184, 0.12); --bs-btn-hover-border-color: rgba(148, 163, 184, 0.65); --bs-btn-hover-color: var(--text-primary); --bs-btn-active-bg: rgba(148, 163, 184, 0.18); --bs-btn-active-color: var(--text-primary); --bs-btn-disabled-color: var(--text-faint); background: transparent; color: var(--text-secondary); border-color: rgba(148, 163, 184, 0.45); } .btn-outline-secondary:hover, .btn-outline-secondary:focus { background: rgba(148, 163, 184, 0.12) !important; color: var(--text-primary) !important; border-color: rgba(148, 163, 184, 0.65) !important; } /* Semantic outline buttons — avoid Bootstrap light-on-dark defaults */ .btn-outline-success { --bs-btn-color: #86efac; --bs-btn-border-color: rgba(74, 222, 128, 0.5); --bs-btn-hover-bg: rgba(74, 222, 128, 0.16); --bs-btn-hover-border-color: #4ade80; --bs-btn-hover-color: #ecfdf5; --bs-btn-active-bg: rgba(74, 222, 128, 0.24); --bs-btn-active-color: #ecfdf5; background: transparent; color: #86efac; border-color: rgba(74, 222, 128, 0.5); } .btn-outline-success:hover, .btn-outline-success:focus { background: rgba(74, 222, 128, 0.16) !important; color: #ecfdf5 !important; border-color: #4ade80 !important; } .btn-outline-danger { --bs-btn-color: #fca5a5; --bs-btn-border-color: rgba(248, 113, 113, 0.55); --bs-btn-hover-bg: rgba(248, 113, 113, 0.16); --bs-btn-hover-border-color: #f87171; --bs-btn-hover-color: #fef2f2; --bs-btn-active-bg: rgba(248, 113, 113, 0.24); --bs-btn-active-color: #fef2f2; background: transparent; color: #fca5a5; border-color: rgba(248, 113, 113, 0.55); } .btn-outline-danger:hover, .btn-outline-danger:focus { background: rgba(248, 113, 113, 0.16) !important; color: #fef2f2 !important; border-color: #f87171 !important; } .btn-outline-warning { --bs-btn-color: #fcd34d; --bs-btn-border-color: rgba(251, 191, 36, 0.5); --bs-btn-hover-bg: rgba(251, 191, 36, 0.14); --bs-btn-hover-border-color: #fbbf24; --bs-btn-hover-color: #fffbeb; --bs-btn-active-bg: rgba(251, 191, 36, 0.22); --bs-btn-active-color: #fffbeb; background: transparent; color: #fcd34d; border-color: rgba(251, 191, 36, 0.5); } .btn-outline-warning:hover, .btn-outline-warning:focus { background: rgba(251, 191, 36, 0.14) !important; color: #fffbeb !important; border-color: #fbbf24 !important; } .btn-outline-info { --bs-btn-color: #7dd3fc; --bs-btn-border-color: rgba(56, 189, 248, 0.5); --bs-btn-hover-bg: rgba(56, 189, 248, 0.14); --bs-btn-hover-border-color: #38bdf8; --bs-btn-hover-color: #f0f9ff; --bs-btn-active-bg: rgba(56, 189, 248, 0.22); --bs-btn-active-color: #f0f9ff; background: transparent; color: #7dd3fc; border-color: rgba(56, 189, 248, 0.5); } .btn-outline-info:hover, .btn-outline-info:focus { background: rgba(56, 189, 248, 0.14) !important; color: #f0f9ff !important; border-color: #38bdf8 !important; } .btn-outline-light { --bs-btn-color: var(--text-secondary); --bs-btn-border-color: rgba(255, 255, 255, 0.22); --bs-btn-hover-bg: rgba(255, 255, 255, 0.08); --bs-btn-hover-border-color: rgba(255, 255, 255, 0.35); --bs-btn-hover-color: var(--text-primary); background: transparent; color: var(--text-secondary); border-color: rgba(255, 255, 255, 0.22); } .btn-outline-light:hover, .btn-outline-light:focus { background: rgba(255, 255, 255, 0.08) !important; color: var(--text-primary) !important; border-color: rgba(255, 255, 255, 0.35) !important; } .btn-success { --bs-btn-bg: #059669; --bs-btn-border-color: #059669; --bs-btn-color: #ecfdf5; --bs-btn-hover-bg: #047857; --bs-btn-hover-border-color: #047857; --bs-btn-hover-color: #ecfdf5; color: #ecfdf5; } .btn-danger { --bs-btn-bg: #dc2626; --bs-btn-border-color: #dc2626; --bs-btn-color: #fef2f2; --bs-btn-hover-bg: #b91c1c; --bs-btn-hover-border-color: #b91c1c; --bs-btn-hover-color: #fef2f2; color: #fef2f2; } .btn-warning { --bs-btn-bg: #d97706; --bs-btn-border-color: #d97706; --bs-btn-color: #fffbeb; --bs-btn-hover-bg: #b45309; --bs-btn-hover-border-color: #b45309; --bs-btn-hover-color: #fffbeb; color: #fffbeb; } .btn-info { --bs-btn-bg: #0284c7; --bs-btn-border-color: #0284c7; --bs-btn-color: #f0f9ff; --bs-btn-hover-bg: #0369a1; --bs-btn-hover-border-color: #0369a1; --bs-btn-hover-color: #f0f9ff; color: #f0f9ff; } /* Filter / pill toggles that use .active on outline buttons */ .btn-outline-primary.active, .btn-check:checked + .btn-outline-primary, .image-filter-btn.active { background: rgba(52, 211, 153, 0.22) !important; border-color: var(--accent-primary) !important; color: #ecfdf5 !important; box-shadow: 0 0 0 1px rgba(52, 211, 153, 0.25); } .form-control, .form-select { background: var(--bg-tertiary) !important; border: 1px solid var(--border-color) !important; color: var(--text-primary) !important; border-radius: 10px !important; font-size: 13.5px; } .form-control:focus, .form-select:focus { border-color: rgba(52, 211, 153, 0.5) !important; box-shadow: 0 0 0 3px rgba(52, 211, 153, 0.15) !important; } .form-control::placeholder, .form-select::placeholder, input::placeholder, textarea::placeholder { color: var(--text-faint) !important; opacity: 1 !important; } .form-label { color: var(--text-secondary); font-weight: 550; font-size: 12.5px; margin-bottom: 6px; } .table { --bs-table-bg: transparent; --bs-table-color: var(--text-primary); --bs-table-border-color: var(--border-color); --bs-table-striped-bg: rgba(255, 255, 255, 0.03); --bs-table-hover-bg: rgba(52, 211, 153, 0.08); --bs-table-striped-color: var(--text-primary); --bs-table-hover-color: var(--text-primary); font-size: 13px; } .table thead th { color: var(--text-secondary); font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; font-weight: 650; border-bottom-width: 1px; white-space: nowrap; } .table-dark { --bs-table-color: var(--text-primary); --bs-table-bg: transparent; --bs-table-border-color: var(--border-color); --bs-table-striped-bg: rgba(255, 255, 255, 0.03); --bs-table-striped-color: var(--text-primary); --bs-table-hover-bg: rgba(52, 211, 153, 0.08); --bs-table-hover-color: var(--text-primary); color: var(--text-primary); } .table td, .table th { vertical-align: middle; padding: 12px 14px; } .card, .modal-content { background: var(--bg-elevated) !important; border: 1px solid var(--border-color) !important; border-radius: var(--border-radius) !important; color: var(--text-primary); } .modal-header { border-bottom-color: var(--border-color) !important; padding: 16px 20px; } .modal-footer { border-top-color: var(--border-color) !important; padding: 14px 20px; } .modal-title { font-weight: 650; letter-spacing: -0.02em; } .accordion-item { background: var(--bg-tertiary) !important; border-color: var(--border-color) !important; } .accordion-button { background: var(--bg-elevated) !important; color: var(--text-primary) !important; font-weight: 550; box-shadow: none !important; } .accordion-button:not(.collapsed) { color: var(--accent-primary) !important; background: rgba(52, 211, 153, 0.08) !important; } .accordion-button::after { filter: invert(1) brightness(1.4); } .list-group-item { background: var(--bg-elevated); border-color: var(--border-color); color: var(--text-primary); } .badge { font-weight: 600; letter-spacing: 0.02em; border-radius: 6px; } /* Scrollbars */ * { scrollbar-width: thin; scrollbar-color: rgba(255, 255, 255, 0.15) transparent; } *::-webkit-scrollbar { width: 8px; height: 8px; } *::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.14); border-radius: 8px; } *::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.24); } /* Toolbar / filter bars */ .toolbar, .filter-bar, .view-toolbar { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-bottom: 16px; padding: 12px 14px; background: var(--bg-elevated); border: 1px solid var(--border-color); border-radius: var(--border-radius-sm); } /* Terminal */ #terminal-modal { border-top: 1px solid var(--border-strong); background: var(--bg-secondary); box-shadow: 0 -12px 40px rgba(0, 0, 0, 0.5); } #terminal-modal .header { background: var(--bg-elevated); } /* Legacy full-screen status spinner removed — activity uses #job-drawer */ /* ─── Toast stack (opt-in only; bottom job tray is primary feedback) ─── */ .toast-stack, #toast-stack, #alert-container.toast-stack { position: fixed; top: calc(var(--titlebar-h) + 12px); left: 50%; transform: translateX(-50%); z-index: 2600; display: flex; flex-direction: column; align-items: center; gap: 8px; width: min(420px, calc(100vw - 24px)); max-width: 90vw; pointer-events: none; /* Hidden unless a toast child is present (forceToast path) */ } .toast-stack:empty, #toast-stack:empty { display: none; } .pd-toast { pointer-events: auto; display: flex; align-items: flex-start; gap: 10px; width: 100%; padding: 12px 14px; border-radius: 12px; border: 1px solid var(--border-strong); background: var(--bg-elevated); box-shadow: var(--shadow-lg); color: var(--text-primary); animation: toastIn 0.22s ease-out; } .pd-toast--leaving { opacity: 0; transform: translateY(-6px); transition: opacity 0.2s ease, transform 0.2s ease; } .pd-toast-icon { margin-top: 2px; flex-shrink: 0; } .pd-toast--success { border-color: rgba(74, 222, 128, 0.45); } .pd-toast--success .pd-toast-icon { color: var(--accent-success); } .pd-toast--danger { border-color: rgba(248, 113, 113, 0.45); } .pd-toast--danger .pd-toast-icon { color: var(--accent-danger); } .pd-toast--warning { border-color: rgba(251, 191, 36, 0.45); } .pd-toast--warning .pd-toast-icon { color: var(--accent-warning); } .pd-toast--info { border-color: rgba(56, 189, 248, 0.4); } .pd-toast--info .pd-toast-icon { color: var(--accent-info); } .pd-toast-body { flex: 1 1 auto; min-width: 0; font-size: 13px; line-height: 1.4; word-break: break-word; } .pd-toast-close { appearance: none; border: none; background: transparent; color: var(--text-muted); cursor: pointer; padding: 2px 4px; line-height: 1; border-radius: 6px; } .pd-toast-close:hover { color: var(--text-primary); background: var(--bg-hover); } @keyframes toastIn { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: none; } } .alert { border-radius: 12px; border: 1px solid var(--border-strong); background: var(--bg-elevated); box-shadow: var(--shadow-md); } /* Role-gated controls */ .role-hidden { display: none !important; } /* Container action overflow */ .container-actions { display: flex; align-items: center; gap: 4px; flex-wrap: nowrap; justify-content: flex-end; } .container-actions-primary { flex-wrap: nowrap; } .container-actions-cell { white-space: nowrap; width: 1%; } .container-actions .dropdown-menu { min-width: 10rem; font-size: 13px; } /* Activity history tray */ .activity-tray { position: relative; flex-shrink: 0; } .activity-panel { position: absolute; right: 0; top: calc(100% + 8px); width: min(320px, 90vw); max-height: min(420px, 70vh); overflow: hidden; display: flex; flex-direction: column; background: var(--bg-elevated); border: 1px solid var(--border-strong); border-radius: 12px; box-shadow: var(--shadow-lg); z-index: 1200; } .activity-panel.hidden { display: none !important; } .activity-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; border-bottom: 1px solid var(--border-color); } .activity-panel-list { overflow-y: auto; flex: 1 1 auto; min-height: 0; } .activity-item { width: 100%; display: grid; grid-template-columns: 1fr auto; grid-template-rows: auto auto; gap: 2px 8px; text-align: left; padding: 10px 12px; border: none; border-bottom: 1px solid rgba(255, 255, 255, 0.05); background: transparent; color: var(--text-primary); cursor: pointer; } .activity-item:hover { background: var(--bg-hover); } .activity-item-kind { font-weight: 600; font-size: 13px; } .activity-item-meta { grid-column: 1 / -1; font-size: 11px; } /* First-connect checklist */ .first-connect-checklist { position: fixed; inset: 0; z-index: 2000; display: flex; align-items: center; justify-content: center; background: rgba(5, 8, 12, 0.55); backdrop-filter: blur(6px); padding: 20px; } .first-connect-checklist.hidden { display: none !important; } .first-connect-card { width: min(420px, 100%); background: var(--bg-elevated); border: 1px solid var(--border-strong); border-radius: 16px; padding: 20px 22px; box-shadow: var(--shadow-lg); } .first-connect-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; margin-bottom: 8px; } .first-connect-head h3 { margin: 0; font-size: 1.15rem; font-weight: 700; } .first-connect-steps { margin: 0 0 16px; padding-left: 1.2rem; color: var(--text-secondary); font-size: 13.5px; line-height: 1.55; } .first-connect-link { appearance: none; border: none; background: none; color: var(--accent-primary); font-weight: 600; padding: 0; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; } .invite-token-result.hidden { display: none !important; } /* Template list URLs in Settings */ .settings-template-urls { max-height: 200px; overflow-y: auto; border: 1px solid var(--border-color); border-radius: 10px; background: var(--bg-elevated); } .settings-template-urls .list-group-item { background: transparent; border-color: var(--border-color); color: var(--text-primary); font-family: var(--font-mono); font-size: 11.5px; display: flex; align-items: center; gap: 8px; padding: 8px 10px; } .settings-template-urls .list-group-item .url-text { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .settings-template-urls .btn-remove-url { flex: 0 0 auto; } /* Density prefs */ body[data-density='compact'] .table > :not(caption) > * > * { padding: 0.35rem 0.5rem; font-size: 12.5px; } body[data-density='compact'] .stat-card, body[data-density='compact'] .info-card { padding: 8px 10px !important; } body[data-density='compact'] .page-header { margin-bottom: 12px; } body[data-density='compact'] .nav-link { padding: 8px 10px; font-size: 12.5px; } body[data-density='compact'] .connection-item { padding: 6px 8px !important; } /* List search */ .list-search-input { max-width: 280px; min-width: 160px; } /* Inline empty states inside tables */ .pd-empty--inline { padding: 20px 12px; } .pd-empty--inline .pd-empty-icon { font-size: 1.4rem; opacity: 0.65; margin-bottom: 6px; color: var(--accent-primary); } .pd-empty--inline .pd-empty-title { font-size: 0.95rem; font-weight: 600; color: var(--text-primary); margin-bottom: 4px; } /* Palette keyboard selection */ .pd-palette-item.is-active, .pd-palette-item:hover { background: rgba(52, 211, 153, 0.12); color: var(--text-primary); } /* Focus rings */ :focus-visible { outline: 2px solid rgba(52, 211, 153, 0.65); outline-offset: 2px; } @media (prefers-reduced-motion: reduce) { .pd-toast, .pd-toast--leaving, .pd-skeleton-row, .skeleton { animation: none !important; transition: none !important; } } /* Notification tray */ .notification-tray-toggle { border-radius: 10px !important; } /* Monospace helpers */ code, .font-monospace, pre { font-family: var(--font-mono) !important; } /* Empty states */ .empty-state { text-align: center; padding: 48px 24px; color: var(--text-muted); } .empty-state i { font-size: 2rem; margin-bottom: 12px; color: var(--accent-primary); opacity: 0.7; } /* Connection health badge (titlebar) */ .connection-health-badge { display: flex; align-items: center; gap: 10px; margin-left: auto; margin-right: 12px; padding: 4px 12px; border-radius: 999px; background: var(--bg-elevated); border: 1px solid var(--border-color); font-size: 0.75rem; color: var(--text-secondary); font-family: 'JetBrains Mono', ui-monospace, monospace; max-width: 42vw; overflow: hidden; white-space: nowrap; } .health-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; background: var(--text-muted); box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.06); } .health-dot--ok { background: var(--accent-success); box-shadow: 0 0 8px rgba(74, 222, 128, 0.55); } .health-dot--degraded { background: var(--accent-warning); box-shadow: 0 0 8px rgba(251, 191, 36, 0.45); } .health-dot--down, .health-dot--unknown { background: var(--text-muted); } .health-dot--error { background: var(--accent-danger); } .health-role { text-transform: uppercase; letter-spacing: 0.04em; color: var(--accent-secondary); font-size: 0.68rem; } .events-timeline { max-height: 220px; overflow-x: hidden; overflow-y: auto; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 0.72rem; min-width: 0; } .events-timeline .event-row { display: grid; grid-template-columns: 64px minmax(56px, 72px) minmax(0, 1fr); gap: 8px; padding: 4px 0; border-bottom: 1px solid var(--border-color); color: var(--text-secondary); min-width: 0; max-width: 100%; } .events-timeline .event-row > * { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .events-timeline .event-row .event-action { color: var(--accent-info); } .events-timeline .event-row .event-type { color: var(--text-muted); } /* ─── Readability / contrast fixes (dark theme) ─── */ /* Bootstrap muted utilities are too dim on near-black backgrounds */ .text-muted, .form-text, small.text-muted, .small.text-muted, .text-body-secondary, .text-secondary { color: var(--text-muted) !important; } /* Prefer secondary for “helper” copy so it stays scannable */ .page-subtitle, .info-card-title + .text-muted, .detail-info-label, .stat-card-label { color: var(--text-secondary) !important; } code, pre, .font-monospace, kbd { color: var(--text-primary); } kbd { background: var(--bg-elevated); border: 1px solid var(--border-strong); color: var(--text-secondary); } /* List groups used for templates / peers */ .list-group-item, .list-group-item-dark, .list-group-item-action { color: var(--text-primary) !important; background-color: var(--bg-tertiary) !important; border-color: var(--border-color) !important; } .list-group-item .text-muted, .list-group-item small, .list-group-item .small { color: var(--text-muted) !important; } .list-group-item-action:hover, .list-group-item-action:focus { color: var(--text-primary) !important; background-color: var(--bg-hover) !important; } /* Accordion / forms in modals */ .accordion-body, .accordion-body .text-muted, .modal-body, .modal-body .text-muted, .modal-content .form-text, .modal-content small { color: var(--text-muted); } .accordion-body, .modal-body { color: var(--text-primary); } .accordion-button.collapsed { color: var(--text-primary) !important; } .accordion-button::after { filter: invert(0.85); } /* Bootstrap dark inputs without bg-dark class */ .form-control:not(.bg-dark), .form-select:not(.bg-dark) { background: var(--bg-tertiary) !important; color: var(--text-primary) !important; } .form-control.bg-dark, .form-select.bg-dark, input.bg-dark, textarea.bg-dark, select.bg-dark { background-color: var(--bg-tertiary) !important; color: var(--text-primary) !important; border-color: var(--border-color) !important; } .form-check-label { color: var(--text-primary); } .form-check-input { background-color: var(--bg-hover); border-color: var(--border-strong); } .form-check-input:checked { background-color: var(--accent-primary); border-color: var(--accent-primary); } .form-range { accent-color: var(--accent-primary); } /* Disabled controls: still legible, just softer */ .form-control:disabled, .form-select:disabled, .btn:disabled, .form-check-input:disabled + .form-check-label { color: var(--text-muted) !important; opacity: 0.85; } /* Cards / info panels */ .info-card, .stat-card, .settings-section, .card { color: var(--text-primary); } .info-card-body, .stat-card-value, .detail-info-value { color: var(--text-primary); } .page-header h2, .page-header h1 { color: var(--text-primary); } /* Sidebar labels — solid color instead of low opacity */ .sidebar-section-label, .nav-group-label { color: var(--text-muted) !important; opacity: 1 !important; } #sidebar .nav-link { color: var(--text-secondary); } #sidebar .nav-link:hover, #sidebar .nav-link.active { color: var(--text-primary); } #sidebar .connection-name, #connection-list .list-group-item { color: var(--text-primary) !important; } #connection-list .text-muted, #connection-list small { color: var(--text-muted) !important; } /* Health badge & peer chip */ .connection-health-badge, #health-latency, #health-docker, #health-role, #active-peer-chip, #active-peer-label { color: var(--text-secondary); } /* Alerts: ensure readable body text */ .alert { color: var(--text-primary); } .alert-success { color: #d1fae5 !important; } .alert-danger { color: #fee2e2 !important; } .alert-warning { color: #fef3c7 !important; } .alert-info { color: #e0f2fe !important; } /* Badges that Bootstrap greys out */ .badge.bg-secondary { background-color: #475569 !important; color: #f8fafc !important; } .badge.bg-dark { background-color: var(--bg-hover) !important; color: var(--text-primary) !important; } /* Dropdown menus */ .dropdown-menu { background: var(--bg-elevated); border: 1px solid var(--border-color); color: var(--text-primary); } .dropdown-item { color: var(--text-primary); } .dropdown-item:hover, .dropdown-item:focus { background: var(--bg-hover); color: var(--text-primary); } .dropdown-item-text, .dropdown-header { color: var(--text-muted); } /* Tabs — dark content tabs (not sidebar) */ .nav-tabs { border-bottom-color: var(--border-color) !important; gap: 4px; } .nav-tabs .nav-link { color: var(--text-secondary) !important; background: transparent !important; border: 1px solid transparent !important; border-bottom: none !important; border-radius: 10px 10px 0 0 !important; font-weight: 600; font-size: 0.875rem; padding: 0.5rem 0.95rem; } .nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { color: var(--text-primary) !important; background: rgba(255, 255, 255, 0.04) !important; border-color: transparent !important; isolation: isolate; } .nav-tabs .nav-link.active { color: var(--text-primary) !important; background: var(--bg-elevated) !important; border-color: var(--border-color) var(--border-color) var(--bg-elevated) !important; border-bottom-color: var(--bg-elevated) !important; } /* Pills (settings-style and generic) */ .nav-pills .nav-link { color: var(--text-secondary) !important; background: transparent !important; border: 1px solid var(--border-color); border-radius: 999px !important; font-weight: 600; } .nav-pills .nav-link:hover { color: var(--text-primary) !important; background: rgba(255, 255, 255, 0.05) !important; border-color: var(--border-strong); } .nav-pills .nav-link.active { color: #042f1a !important; background: linear-gradient(135deg, #34d399, #2dd4bf) !important; border-color: transparent !important; box-shadow: 0 4px 14px rgba(52, 211, 153, 0.28); } /* Modal footer buttons stay readable on dark modals */ .modal-content.bg-dark .btn-close-white { filter: invert(1) grayscale(100%) brightness(200%); opacity: 0.75; } .modal-content.bg-dark .btn-close-white:hover { opacity: 1; } /* List-group dark actions used in Hub search / volume browser */ .list-group-item-dark, .list-group-item-action.list-group-item-dark { background-color: var(--bg-tertiary) !important; color: var(--text-primary) !important; border-color: var(--border-color) !important; } .list-group-item-action.list-group-item-dark:hover, .list-group-item-action.list-group-item-dark:focus { background-color: var(--bg-hover) !important; color: var(--text-primary) !important; } /* Pagination / page links if used */ .page-link { background-color: var(--bg-tertiary); border-color: var(--border-color); color: var(--text-secondary); } .page-link:hover { background-color: var(--bg-hover); border-color: var(--border-strong); color: var(--text-primary); } .page-item.active .page-link { background-color: #10b981; border-color: #10b981; color: #042f1a; } /* Empty / skeleton states */ .pd-empty-body, .pd-empty { color: var(--text-muted); } .pd-empty-title { color: var(--text-primary); } /* Job panel */ .job-step-label { color: var(--text-primary); } .job-step-detail { color: var(--text-muted); } /* Deploy template list */ .deploy-template-list .fw-bold { color: var(--text-primary) !important; } .deploy-template-list .text-muted { color: var(--text-muted) !important; } /* Welcome / lead copy */ #welcome-page, #welcome-page h1, .welcome-lead { color: var(--text-primary); } .welcome-step span, .welcome-lead { color: var(--text-secondary); } /* Links */ a { color: var(--accent-secondary); } a:hover { color: var(--accent-primary); } /* Select options (native dropdown) */ option { background: var(--bg-elevated); color: var(--text-primary); } /* Narrow viewports: force the same icon-rail layout as .collapsed */ @media (max-width: 900px) { #sidebar { width: var(--sidebar-collapsed-w); } #sidebar .content { padding: 48px 6px 10px; } #sidebar #collapse-sidebar-btn { top: 10px; left: 50%; right: auto; transform: translateX(-50%); width: 40px; height: 32px; } #sidebar .sidebar-section-label, #sidebar .nav-group-label, #sidebar .nav-label, #sidebar .sidebar-nav-scroll kbd, #sidebar .connection-name, #sidebar .connection-meta, #sidebar .connection-item small, #sidebar .open-add-connection-label, #sidebar .sidebar-divider, #sidebar .docker-terminal-btn, #sidebar .disconnect-btn, #sidebar .connection-actions { display: none !important; } #sidebar .nav-menu { align-items: center; gap: 2px; margin: 0; } #sidebar .nav-item { margin: 0; display: flex; justify-content: center; } #sidebar .nav-link { width: 44px; height: 40px; padding: 0; justify-content: center; gap: 0; border-radius: 11px; } #sidebar .nav-link i { width: auto; font-size: 1.05rem; } #sidebar .connections-panel-header { justify-content: center; } #sidebar .open-add-connection-btn { width: 40px; height: 36px; padding: 0; justify-content: center; } #sidebar #connection-list { align-items: center; display: flex; flex-direction: column; } #sidebar #connection-list .list-group-item { width: 44px; height: 40px; max-width: 44px; padding: 0; justify-content: center; border-radius: 11px; } #sidebar .connection-item { padding: 0 !important; justify-content: center; } #sidebar .connection-status { margin: 0 !important; } #content { margin-left: var(--sidebar-collapsed-w); } .view { padding: 16px !important; } .connection-health-badge { display: none; } }