diff --git a/public/css/style.css b/public/css/style.css index e25ff1f..4dbaff6 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1254,6 +1254,43 @@ input:checked+.slider:before { align-items: center; } +/* ---- Server Detail Grid ---- */ +.detail-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 16px; + margin-top: 10px; +} + +.detail-item { + background: var(--bg-card); + border: 1px solid var(--border-color); + padding: 16px; + border-radius: var(--radius-md); + display: flex; + flex-direction: column; + gap: 8px; +} + +.detail-label { + font-size: 0.75rem; + font-weight: 600; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.detail-value { + font-family: var(--font-mono); + font-size: 1.1rem; + font-weight: 700; + color: var(--accent-indigo); +} + +:root.light-theme .detail-value { + color: var(--accent-blue); +} + /* ---- Animations ---- */ @keyframes fadeInUp { from { diff --git a/public/index.html b/public/index.html index bd7bd0a..8132fba 100644 --- a/public/index.html +++ b/public/index.html @@ -364,6 +364,64 @@ + + +
diff --git a/public/js/app.js b/public/js/app.js index 4576c51..9d36687 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -60,7 +60,23 @@ loginForm: document.getElementById('loginForm'), loginError: document.getElementById('loginError'), footerTime: document.getElementById('footerTime'), - legendP95: document.getElementById('legendP95') + legendP95: document.getElementById('legendP95'), + // Server Details Modal + serverDetailModal: document.getElementById('serverDetailModal'), + serverDetailClose: document.getElementById('serverDetailClose'), + serverDetailTitle: document.getElementById('serverDetailTitle'), + detailGrid: document.getElementById('detailGrid'), + detailLoading: document.getElementById('detailLoading'), + detailCpuBusy: document.getElementById('detailCpuBusy'), + detailSysLoad: document.getElementById('detailSysLoad'), + detailMemUsedPct: document.getElementById('detailMemUsedPct'), + detailSwapUsedPct: document.getElementById('detailSwapUsedPct'), + detailRootFsUsedPct: document.getElementById('detailRootFsUsedPct'), + detailCpuCores: document.getElementById('detailCpuCores'), + detailMemTotal: document.getElementById('detailMemTotal'), + detailUptime: document.getElementById('detailUptime'), + detailNetRx: document.getElementById('detailNetRx'), + detailNetTx: document.getElementById('detailNetTx') }; // ---- State ---- @@ -113,6 +129,26 @@ if (e.key === 'Escape') { closeSettings(); closeLoginModal(); + closeServerDetail(); + } + }); + + // Server detail modal listeners + dom.serverDetailClose.addEventListener('click', closeServerDetail); + dom.serverDetailModal.addEventListener('click', (e) => { + if (e.target === dom.serverDetailModal) closeServerDetail(); + }); + + // Server table row click delegator + dom.serverTableBody.addEventListener('click', (e) => { + const row = e.target.closest('tr'); + if (row && !row.classList.contains('empty-row')) { + const instance = row.getAttribute('data-instance'); + const job = row.getAttribute('data-job'); + const source = row.getAttribute('data-source'); + if (instance && job && source) { + openServerDetail(instance, job, source); + } } }); @@ -354,7 +390,7 @@ const diskPct = server.diskTotal > 0 ? (server.diskUsed / server.diskTotal * 100) : 0; return ` -