/* ROFMAD — Gruvbox Dark Hard / Professional TUI Theme */ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;600;700&display=swap'); :root { /* Gruvbox Dark Hard — backgrounds */ --gb-bg-h: #1d2021; --gb-bg: #282828; --gb-bg-s: #32302f; --gb-bg1: #3c3836; --gb-bg2: #504945; --gb-bg3: #665c54; --gb-bg4: #7c6f64; --gb-gray: #928374; /* Gruvbox Dark Hard — foreground */ --gb-fg: #ebdbb2; --gb-fg2: #d5c4a1; --gb-fg3: #bdae93; --gb-fg4: #a89984; /* Gruvbox accents */ --gb-red: #cc241d; --gb-red-b: #fb4934; --gb-yellow: #d79921; --gb-yellow-b: #fabd2f; --gb-blue: #458588; --gb-blue-b: #83a598; --gb-purple: #b16286; --gb-purple-b: #d3869b; --gb-orange: #d65d0e; --gb-orange-b: #fe8019; --gb-aqua: #689d6a; --gb-aqua-b: #8ec07c; /* Semantic aliases */ --primary: var(--gb-blue); --primary-b: var(--gb-blue-b); --secondary: var(--gb-purple); --secondary-b: var(--gb-purple-b); --bg-primary: var(--gb-bg-h); --bg-secondary: var(--gb-bg); --bg-tertiary: var(--gb-bg1); --bg-card: var(--gb-bg-s); --bg-hover: var(--gb-bg2); --text-primary: var(--gb-fg); --text-secondary: var(--gb-fg2); --text-muted: var(--gb-fg4); --text-dim: var(--gb-gray); --border-color: var(--gb-bg1); --border-dim: var(--gb-bg2); --shadow-sm: 0 1px 3px rgba(0,0,0,0.5); --shadow-md: 0 3px 8px rgba(0,0,0,0.6); --success: var(--gb-blue-b); --warning: var(--gb-orange-b); --danger: var(--gb-red-b); --info: var(--gb-blue-b); /* Legacy aliases — referenced in page-specific templates */ --primary-purple: var(--gb-blue); --dark-purple: #076678; --light-purple: var(--gb-blue-b); --accent-yellow: var(--gb-yellow); --bright-yellow: var(--gb-yellow-b); --dark-yellow: #b57614; --success-green: var(--gb-blue-b); --warning-orange: var(--gb-orange-b); --danger-red: var(--gb-red-b); --info-blue: var(--gb-blue-b); --border-light: var(--gb-bg2); --border-radius: 0; --border-radius-lg: 0; --max-width: 1440px; } /* ── Reset & Base ──────────────────────────────────────────── */ * { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 14px; scroll-behavior: smooth; } body { font-family: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', 'Consolas', monospace; background-color: var(--bg-primary); color: var(--text-primary); line-height: 1.55; font-weight: 400; overflow-x: hidden; } /* ── Typography ────────────────────────────────────────────── */ h1, h2, h3, h4, h5, h6 { font-family: 'JetBrains Mono', monospace; font-weight: 700; line-height: 1.25; margin-bottom: 0.4rem; letter-spacing: -0.01em; } h1 { font-size: 1.8rem; color: var(--gb-blue-b); } h2 { font-size: 1.4rem; color: var(--text-primary); } h3 { font-size: 1.15rem; color: var(--text-primary); } h4 { font-size: 1rem; color: var(--text-secondary); } h5 { font-size: 0.9rem; color: var(--text-secondary); } h6 { font-size: 0.82rem; color: var(--text-muted); } p { margin-bottom: 0.8rem; color: var(--text-secondary); } a { color: var(--gb-blue-b); text-decoration: none; transition: color 0.1s; } a:hover { color: var(--gb-yellow-b); text-decoration: none; } /* ── Navigation ────────────────────────────────────────────── */ .navbar { background-color: var(--gb-bg); padding: 0 1.5rem; height: 44px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--gb-bg1); position: sticky; top: 0; z-index: 100; } .nav-brand h1 { color: var(--gb-blue-b); font-size: 1rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; -webkit-text-fill-color: unset; background: none; } .nav-links { display: flex; gap: 0; height: 100%; align-items: stretch; } .nav-links a { color: var(--text-muted); padding: 0 1rem; font-size: 0.78rem; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase; display: flex; align-items: center; border-bottom: 2px solid transparent; transition: color 0.1s, border-color 0.1s; } .nav-links a:hover { color: var(--text-primary); border-bottom-color: var(--gb-blue); text-decoration: none; } /* ── Layout ────────────────────────────────────────────────── */ .container { max-width: var(--max-width); margin: 0 auto; padding: 1.5rem; } /* ── Cards ─────────────────────────────────────────────────── */ .card { background-color: var(--bg-card); border: 1px solid var(--border-color); padding: 1.25rem; transition: border-color 0.1s; } .card:hover { border-color: var(--gb-blue); } .section-card { background-color: var(--bg-card); border: 1px solid var(--border-color); margin-bottom: 2rem; overflow: hidden; } .card-header { background-color: var(--gb-bg1); padding: 1rem 1.25rem; border-bottom: 1px solid var(--border-color); } .card-header h2 { color: var(--text-secondary); margin: 0; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.08em; } /* ── Section Headers ───────────────────────────────────────── */ .section-header { background-color: var(--gb-bg); padding: 1.25rem 1.5rem; border-bottom: 1px solid var(--gb-blue); display: flex; justify-content: space-between; align-items: center; margin-bottom: 2rem; } .section-header::before { display: none; } .section-header h1, .section-header h2 { font-size: 1.2rem; font-weight: 700; color: var(--gb-blue-b); margin-bottom: 0; display: flex; align-items: center; gap: 0.6rem; -webkit-text-fill-color: unset; background: none; background-clip: unset; -webkit-background-clip: unset; letter-spacing: 0.04em; text-transform: uppercase; } .section-title { font-size: 0.82rem; font-weight: 700; color: var(--text-muted); margin-bottom: 0.4rem; display: flex; align-items: center; gap: 0.5rem; text-transform: uppercase; letter-spacing: 0.08em; } .section-subtitle { color: var(--text-dim); font-size: 0.8rem; } .section-content { padding: 1.75rem; } /* ── Stats Grid ────────────────────────────────────────────── */ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0.75rem; margin-bottom: 2rem; } .stat-card { background-color: var(--gb-bg); padding: 1.5rem; text-align: left; border: 1px solid var(--gb-bg1); border-left: 3px solid var(--gb-blue); transition: border-left-color 0.1s, background-color 0.1s; } .stat-card:hover { background-color: var(--gb-bg-s); border-left-color: var(--gb-yellow); } .stat-card::before { display: none; } .stat-card::after { display: none; } .stat-card h3 { color: var(--text-dim); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 0.5rem; font-weight: 500; } .stat-number { font-size: 2rem; font-weight: 700; color: var(--gb-blue-b); display: block; margin-bottom: 0; font-family: 'JetBrains Mono', monospace; filter: none; background: none; -webkit-text-fill-color: unset; -webkit-background-clip: unset; background-clip: unset; } /* ── Progress ──────────────────────────────────────────────── */ .progress-section { background-color: var(--bg-card); border: 1px solid var(--border-color); padding: 1.25rem; margin-bottom: 1.5rem; } .progress-grid { display: grid; gap: 0.75rem; } .progress-item { display: grid; grid-template-columns: 160px 1fr 60px; align-items: center; gap: 1rem; } .progress-item label { color: var(--text-secondary); font-weight: 500; font-size: 0.82rem; } .progress-bar { background-color: var(--gb-bg1); height: 12px; border: 1px solid var(--border-color); overflow: hidden; } .progress-fill { background-color: var(--gb-blue); height: 100%; transition: width 0.3s ease; } .progress-fill::after { display: none; } .progress-item span { color: var(--gb-blue-b); font-weight: 600; text-align: right; font-size: 0.82rem; } /* ── Tables ────────────────────────────────────────────────── */ .table-container { background-color: var(--bg-card); border: 1px solid var(--border-color); overflow: hidden; margin-bottom: 1.5rem; } .hosts-table, .tasks-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; } .hosts-table th, .hosts-table td, .tasks-table th, .tasks-table td { padding: 0.55rem 0.875rem; text-align: left; border-bottom: 1px solid var(--gb-bg1); } .hosts-table th, .tasks-table th { background-color: var(--gb-bg1); color: var(--text-muted); font-weight: 600; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.08em; position: sticky; top: 0; z-index: 10; border-bottom: 2px solid var(--gb-blue); } .hosts-table tr:hover, .tasks-table tr:hover { background-color: var(--gb-bg1); } .hosts-table tbody tr:last-child td, .tasks-table tbody tr:last-child td { border-bottom: none; } /* ── Host Links ────────────────────────────────────────────── */ .host-link { color: var(--gb-blue-b); font-weight: 600; font-size: 0.85rem; } .host-link:hover { color: var(--gb-yellow-b); } /* ── Tags ──────────────────────────────────────────────────── */ .tags { display: flex; flex-wrap: wrap; gap: 0.3rem; } .tag { background-color: var(--gb-bg1); color: var(--text-secondary); padding: 0.15rem 0.5rem; font-size: 0.72rem; font-weight: 500; border: 1px solid var(--gb-bg2); transition: background-color 0.1s, color 0.1s; cursor: pointer; font-family: 'JetBrains Mono', monospace; border-radius: 0; } .tag:hover { background-color: var(--gb-blue); color: var(--gb-fg); border-color: var(--gb-blue-b); } .tech-tag, .service-tag { background-color: var(--gb-blue); color: var(--gb-fg); padding: 0.15rem 0.5rem; font-size: 0.72rem; font-weight: 600; border-radius: 0; } .tag-action { background-color: var(--gb-orange) !important; color: var(--gb-bg-h) !important; border-color: var(--gb-orange-b) !important; font-weight: 700 !important; } .tag-manual { background-color: var(--gb-yellow) !important; color: var(--gb-bg-h) !important; border-color: var(--gb-yellow-b) !important; font-weight: 700 !important; } .tag-refined { background-color: var(--gb-purple) !important; color: var(--gb-fg) !important; border-color: var(--gb-purple-b) !important; } .tag-automated { background-color: var(--gb-bg1) !important; color: var(--text-muted) !important; border-color: var(--gb-bg2) !important; font-size: 0.68rem !important; } .tag-combined { background-color: var(--gb-blue) !important; color: var(--gb-fg) !important; border-color: var(--gb-blue-b) !important; font-weight: 500 !important; } .tag.action-tag { background-color: var(--gb-yellow); color: var(--gb-bg-h); border-color: var(--gb-yellow-b); font-weight: 700; } .tag.action-tag:hover { background-color: var(--gb-yellow-b); color: var(--gb-bg-h); } /* ── Status Indicators ─────────────────────────────────────── */ .status-indicators { display: flex; gap: 0.25rem; } .status-indicator { width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; font-size: 0.65rem; font-weight: 700; border: 1px solid; border-radius: 0; transition: opacity 0.1s; } .status-indicator.complete { background-color: var(--gb-blue); border-color: var(--gb-blue-b); color: var(--gb-fg); } .status-indicator.incomplete { background-color: var(--gb-bg1); border-color: var(--gb-bg2); color: var(--text-muted); } .status-indicator:hover { opacity: 0.75; } /* ── Buttons ───────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.4rem; padding: 0.45rem 1rem; border: 1px solid transparent; border-radius: 0; font-size: 0.78rem; font-weight: 600; text-decoration: none; cursor: pointer; transition: background-color 0.1s, color 0.1s, border-color 0.1s; min-width: 70px; font-family: 'JetBrains Mono', monospace; letter-spacing: 0.05em; text-transform: uppercase; } .btn-primary { background-color: var(--gb-blue); color: var(--gb-fg); border-color: var(--gb-blue-b); } .btn-primary:hover { background-color: var(--gb-blue-b); color: var(--gb-bg-h); text-decoration: none; } .btn-secondary { background-color: var(--gb-bg1); color: var(--text-secondary); border-color: var(--gb-bg2); } .btn-secondary:hover { background-color: var(--gb-bg2); color: var(--text-primary); border-color: var(--gb-blue); text-decoration: none; } .btn-detail { background-color: var(--gb-purple); color: var(--gb-fg); border-color: var(--gb-purple-b); font-weight: 700; } .btn-detail:hover { background-color: var(--gb-purple-b); color: var(--gb-bg-h); text-decoration: none; } .btn-warning { background-color: var(--gb-orange); color: var(--gb-fg); border-color: var(--gb-orange-b); } .btn-warning:hover { background-color: var(--gb-orange-b); color: var(--gb-bg-h); text-decoration: none; } .btn-danger { background-color: var(--gb-red); color: var(--gb-fg); border-color: var(--gb-red-b); } .btn-danger:hover { background-color: var(--gb-red-b); color: var(--gb-fg); text-decoration: none; } .btn-small { padding: 0.3rem 0.6rem; font-size: 0.7rem; min-width: auto; } /* ── Forms ─────────────────────────────────────────────────── */ .form-group { margin-bottom: 1rem; } .form-group label { display: block; margin-bottom: 0.3rem; color: var(--text-muted); font-weight: 500; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; } input[type="text"], input[type="password"], input[type="email"], input[type="number"], select, textarea { width: 100%; padding: 0.5rem 0.75rem; background-color: var(--gb-bg-h); border: 1px solid var(--gb-bg2); border-radius: 0; color: var(--text-primary); font-size: 0.85rem; font-family: 'JetBrains Mono', monospace; transition: border-color 0.1s; } input:focus, select:focus, textarea:focus { outline: none; border-color: var(--gb-blue); box-shadow: 0 0 0 1px var(--gb-blue); background-color: var(--gb-bg); } select option { background-color: var(--gb-bg); } .form-actions { display: flex; gap: 0.75rem; justify-content: flex-end; margin-top: 1.25rem; } .form-help { color: var(--text-dim); font-size: 0.72rem; margin-top: 0.2rem; display: block; } .required { color: var(--gb-red-b); } /* ── Tabs ──────────────────────────────────────────────────── */ .tab-nav { display: flex; background-color: var(--gb-bg-h); border: 1px solid var(--border-color); border-bottom: 2px solid var(--gb-blue); overflow-x: auto; } .tab-btn { padding: 0.6rem 1.25rem; background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 0.72rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; transition: background-color 0.1s, color 0.1s; border-right: 1px solid var(--border-color); white-space: nowrap; font-family: 'JetBrains Mono', monospace; } .tab-btn:last-child { border-right: none; } .tab-btn:hover { background-color: var(--gb-bg1); color: var(--text-secondary); } .tab-btn.active { background-color: var(--gb-blue); color: var(--gb-fg); } .tab-content { display: none; background-color: var(--bg-card); border: 1px solid var(--border-color); border-top: none; padding: 1.25rem; } .tab-content.active { display: block; } /* ── Code ──────────────────────────────────────────────────── */ pre, code { background-color: var(--gb-bg-h); border: 1px solid var(--border-color); font-family: 'JetBrains Mono', 'Consolas', monospace; font-size: 0.82rem; line-height: 1.5; color: var(--gb-fg3); border-radius: 0; } pre { padding: 0.875rem; overflow-x: auto; margin: 0.75rem 0; } code { padding: 0.1rem 0.35rem; display: inline; } /* ── Modals ────────────────────────────────────────────────── */ .modal-header { background-color: var(--gb-bg1); padding: 0.75rem 1.25rem; border-bottom: 1px solid var(--border-color); display: flex; justify-content: space-between; align-items: center; } .modal-body { padding: 1.25rem; } /* Discovery Modal */ .discovery-modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.85); display: flex; align-items: center; justify-content: center; z-index: 10000; } .discovery-modal { background: var(--gb-bg); border: 1px solid var(--gb-blue); border-top: 2px solid var(--gb-blue-b); width: 90%; max-width: 1000px; max-height: 80%; display: flex; flex-direction: column; box-shadow: var(--shadow-md); } .discovery-modal-header { background: var(--gb-bg1); padding: 0.75rem 1.25rem; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid var(--border-color); } .discovery-modal-title { color: var(--gb-blue-b); font-weight: 700; margin: 0; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.08em; } .discovery-modal-close { background: var(--gb-red); color: var(--gb-fg); border: 1px solid var(--gb-red-b); padding: 0.3rem 0.7rem; cursor: pointer; font-weight: 700; font-size: 0.72rem; font-family: 'JetBrains Mono', monospace; text-transform: uppercase; letter-spacing: 0.05em; border-radius: 0; } .discovery-modal-close:hover { background: var(--gb-red-b); } .discovery-modal-body { flex: 1; padding: 1.25rem; overflow-y: auto; } .discovery-section { margin-bottom: 1.25rem; } .discovery-section h3 { color: var(--gb-blue-b); margin-bottom: 0.6rem; padding-bottom: 0.35rem; border-bottom: 1px solid var(--border-color); font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.08em; } .discovery-table { width: 100%; border-collapse: collapse; background: var(--gb-bg-h); border: 1px solid var(--border-color); font-size: 0.82rem; } .discovery-table th { background: var(--gb-bg1); color: var(--text-muted); padding: 0.5rem 0.875rem; text-align: left; font-weight: 600; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.06em; border-bottom: 2px solid var(--gb-blue); } .discovery-table td { padding: 0.5rem 0.875rem; border-bottom: 1px solid var(--border-color); color: var(--text-secondary); } .discovery-table tr:hover { background: var(--gb-bg1); } .discovery-actions { display: flex; gap: 0.4rem; flex-wrap: wrap; } .discovery-btn { padding: 0.3rem 0.65rem; border: 1px solid transparent; font-size: 0.72rem; font-weight: 600; cursor: pointer; transition: background-color 0.1s; font-family: 'JetBrains Mono', monospace; text-transform: uppercase; letter-spacing: 0.04em; border-radius: 0; } .discovery-btn-primary { background: var(--gb-blue); color: var(--gb-fg); border-color: var(--gb-blue-b); } .discovery-btn-secondary{ background: var(--gb-bg1); color: var(--text-primary); border-color: var(--gb-bg2); } .discovery-btn-danger { background: var(--gb-red); color: var(--gb-fg); border-color: var(--gb-red-b); } .discovery-btn-warning { background: var(--gb-orange); color: var(--gb-fg); border-color: var(--gb-orange-b); } .discovery-btn:hover { opacity: 0.82; } .discovery-empty { text-align: center; padding: 2rem; color: var(--text-dim); font-size: 0.82rem; } /* Terminal Modal */ .terminal-modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.88); display: flex; align-items: center; justify-content: center; z-index: 10000; } .terminal-modal { background: var(--gb-bg-h); border: 1px solid var(--gb-blue); border-top: 2px solid var(--gb-blue-b); width: 80%; max-width: 900px; height: 70%; display: flex; flex-direction: column; box-shadow: var(--shadow-md); } .terminal-btn { background: var(--gb-bg1); color: var(--text-secondary); border: 1px solid var(--gb-bg2); padding: 0.3rem 0.65rem; cursor: pointer; font-size: 0.72rem; font-family: 'JetBrains Mono', monospace; text-transform: uppercase; letter-spacing: 0.04em; transition: background-color 0.1s; border-radius: 0; } .terminal-btn:hover { background: var(--gb-blue); color: var(--gb-fg); border-color: var(--gb-blue-b); } .terminal-close { background: var(--gb-red); color: var(--gb-fg); border-color: var(--gb-red-b); } .terminal-close:hover { background: var(--gb-red-b); } .terminal-output { flex: 1; background: var(--gb-bg-h); color: var(--gb-fg3); font-family: 'JetBrains Mono', 'Consolas', monospace; font-size: 0.82rem; padding: 0.875rem; overflow-y: auto; white-space: pre-wrap; line-height: 1.5; } .terminal-modal-status { background: var(--gb-bg1); color: var(--text-dim); padding: 0.35rem 0.875rem; font-size: 0.7rem; border-top: 1px solid var(--border-color); font-family: 'JetBrains Mono', monospace; } /* ── Host Header ───────────────────────────────────────────── */ .host-header { background-color: var(--gb-bg); border: 1px solid var(--border-color); border-left: 3px solid var(--gb-blue); padding: 1.25rem; margin-bottom: 1.5rem; } .host-header h1 { font-size: 1.8rem; margin-bottom: 0.2rem; } .host-header h2 { color: var(--text-muted); font-weight: 400; margin-bottom: 0.6rem; font-size: 0.9rem; } /* Hostname display */ .no-hostname { color: var(--text-dim); font-style: italic; font-size: 0.82rem; } .ad-domain { color: var(--gb-yellow); font-style: normal; font-size: 0.78rem; font-weight: 600; margin-left: 0.3rem; } .no-hostname + .ad-domain { color: var(--gb-blue-b); font-weight: 700; } /* ── Search Preview ────────────────────────────────────────── */ .search-preview { margin-top: 1.25rem; background-color: var(--bg-card); border: 1px solid var(--border-color); padding: 1rem; } .search-preview h4 { color: var(--text-muted); margin-bottom: 0.6rem; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; } .tag-preview-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 0.3rem; } .tag-preview-item { background: var(--gb-bg1); border: 1px solid var(--border-color); padding: 0.35rem; text-align: center; font-size: 0.72rem; color: var(--text-secondary); transition: background-color 0.1s, color 0.1s; cursor: pointer; font-family: 'JetBrains Mono', monospace; } .tag-preview-item:hover { background: var(--gb-blue); color: var(--gb-fg); border-color: var(--gb-blue-b); } /* Tag name/count */ .tag-name { font-weight: 600; font-size: 0.82rem; } .tag-count { background: var(--gb-blue); color: var(--gb-fg); padding: 0.1rem 0.4rem; font-size: 0.7rem; font-weight: 700; } /* ── Empty States ──────────────────────────────────────────── */ .empty-placeholder { text-align: center; padding: 2rem; } .empty-icon { font-size: 2rem; margin-bottom: 0.75rem; opacity: 0.4; } .empty-placeholder h3 { color: var(--text-secondary); margin-bottom: 0.3rem; font-size: 1rem; } .empty-placeholder p { color: var(--text-muted); margin-bottom: 0.875rem; font-size: 0.82rem; } .empty-stats { display: flex; gap: 1.5rem; justify-content: center; } .empty-stat { color: var(--gb-blue-b); font-size: 0.82rem; font-weight: 600; } /* ── Notifications ─────────────────────────────────────────── */ .notification { position: fixed; bottom: 1.5rem; right: 1.5rem; padding: 0.6rem 1.25rem; background-color: var(--gb-bg1); border: 1px solid var(--gb-blue); border-left: 3px solid var(--gb-blue-b); color: var(--text-primary); font-size: 0.82rem; z-index: 9999; font-family: 'JetBrains Mono', monospace; box-shadow: var(--shadow-md); border-radius: 0; } .notification.success { border-left-color: var(--gb-blue-b); } .notification.error { border-left-color: var(--gb-red-b); border-color: var(--gb-red); } .notification.warning { border-left-color: var(--gb-orange-b); border-color: var(--gb-orange); } /* ── Utilities ─────────────────────────────────────────────── */ .text-center { text-align: center; } .text-right { text-align: right; } .text-left { text-align: left; } .text-muted { color: var(--text-muted); } .text-success { color: var(--gb-blue-b); } .text-warning { color: var(--gb-orange-b); } .text-danger { color: var(--gb-red-b); } .no-data { color: var(--text-dim); font-style: italic; font-size: 0.82rem; } .small { font-size: 0.82rem; } .smaller { font-size: 0.72rem; } .mb-0 { margin-bottom: 0; } .mb-1 { margin-bottom: 0.4rem; } .mb-2 { margin-bottom: 0.8rem; } .mb-3 { margin-bottom: 1.25rem; } .mb-4 { margin-bottom: 1.75rem; } .mt-0 { margin-top: 0; } .mt-1 { margin-top: 0.4rem; } .mt-2 { margin-top: 0.8rem; } .mt-3 { margin-top: 1.25rem; } .mt-4 { margin-top: 1.75rem; } /* ── Responsive ────────────────────────────────────────────── */ @media (max-width: 1024px) { .container { padding: 1rem; } .stats-grid { grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); } .progress-item { grid-template-columns: 1fr; gap: 0.4rem; text-align: center; } .hosts-table { font-size: 0.75rem; } .hosts-table th, .hosts-table td { padding: 0.45rem 0.5rem; } } @media (max-width: 768px) { .navbar { padding: 0 0.875rem; } .nav-links { flex-wrap: wrap; } .nav-links a { padding: 0 0.6rem; font-size: 0.7rem; } .container { padding: 0.75rem; } .section-header { flex-direction: column; gap: 0.75rem; text-align: left; } .75rem; } .hosts-table th, .hosts-table td { padding: 0.4rem 0.3rem; font-size: 0.7rem; } .tab-btn { font-size: 0.68rem; padding: 0.5rem 0.875rem; } .status-indicators { justify-content: center; } .status-indicator { width: 18px; height: 18px; font-size: 0.6rem; } .discovery-modal { width: 95%; height: 88%; } .discovery-actions { flex-direction: column; } .discovery-btn { width: 100%; } .terminal-modal { width: 95%; height: 82%; } } @media (max-width: 480px) { .stat-card { padding: 0.875rem; } .stat-number { font-size: 1.6rem; } .progress-section, .host-header { padding: 0.875rem; } .hosts-table { display: block; overflow-x: auto; white-space: nowrap; } .stats-grid { grid-template-columns: 1fr; } .navbar { height: auto; padding: 0.5rem 0.75rem; flex-direction: column; gap: 0.4rem; } .nav-links { width: 100%; justify-content: center; } }