From cb94e5c63cc36c5cb7bb8e946a41dfa876115890 Mon Sep 17 00:00:00 2001 From: marvin Date: Fri, 18 Sep 2026 16:51:55 -0400 Subject: [PATCH] Match Docker socket status to health-tile styling, fix restart-status spacing (v0.16.5) --- README.md | 2 +- ROADMAP.md | 2 ++ package.json | 2 +- src/public/features.js | 3 ++- src/public/index.html | 4 ++-- src/public/styles.css | 2 ++ 6 files changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 43c79a8..26f8958 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Docker Architectures Caddy - Version + Version

Why Site Gateway · diff --git a/ROADMAP.md b/ROADMAP.md index f05cc6c..43a3576 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -136,3 +136,5 @@ Roughly in priority order: `v0.16.3` fixes the System tab's real population and layout bugs reported after v0.16.2 went live. Root cause of the empty sections and the tab "flickering" on refresh: the System panel is created dynamically (like Groups, Audit log, and API Access) the first time `refresh()` runs after login, but the app's render order calls the tab-visibility toggle *before* that panel exists — so a brand-new panel is created already carrying the `hidden` class, and `renderSystemStatus()` was guarded to skip populating anything while its panel was hidden. Result: on first render nothing gets filled in, and only after the *next* periodic poll (once the panel exists and the visibility toggle can find and unhide it) does it get one more chance — which looked like the tab disappearing and reappearing. Fix: `renderSystemStatus()` now always populates its content regardless of the panel's current visibility, matching how every other dynamically-created admin panel (Groups, Retention, API Access) already behaves. Also added the missing spacing between the System tab's stacked `.dashboard-panel` cards (`[data-admin-panel="system"]>.dashboard-panel+.dashboard-panel{margin-top:18px}`) — the generic `.settings-panel` wrapper never had a gap rule for its children, so the cards were rendering edge-to-edge. `v0.16.4` rewords the Reload & Restart section's "Docker socket not detected" message so it no longer reads as a duplicate of the Docker container-selection message elsewhere on the System tab. Both checks are independent (one gates the proxy-target container picker, the other gates whether Site Gateway can confirm this container will actually come back up before offering a restart), but they previously used the exact same sentence, which looked like a copy-paste mistake. No behavior change — the Restart button is still disabled under the same conditions as before. + +`v0.16.5` gives the Docker container-selection status its own `.health-tile` card (matching `BACKUP_PASSWORD` directly above it) instead of a plain paragraph — the two Environment/Integrations rows now look consistent whether Docker's socket is mounted or not. Also adds breathing room between the Reload & Restart buttons and the status line beneath them, which was sitting flush against the button row. diff --git a/package.json b/package.json index 56b0427..d5e74e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "site-gateway", - "version": "0.16.4", + "version": "0.16.5", "private": true, "description": "Site Gateway: simple self-hosted website publishing, reverse proxying, and automatic HTTPS.", "type": "module", diff --git a/src/public/features.js b/src/public/features.js index 578a0a6..42fd773 100644 --- a/src/public/features.js +++ b/src/public/features.js @@ -453,7 +453,7 @@ function renderDockerPanel() { if (!section) { section = document.createElement("div"); section.className = "docker-integration-section"; - section.innerHTML = '

Docker container selection

'; + section.innerHTML = '

Docker container selection

Docker socket
'; panel.append(section); section.querySelector("#docker-integration-toggle").addEventListener("change", async event => { const checkbox = event.currentTarget; @@ -466,6 +466,7 @@ function renderDockerPanel() { const toggle = section.querySelector("#docker-integration-toggle"); toggle.checked = enabled; toggle.disabled = !socketMounted; + section.querySelector("#docker-integration-status .status-dot").className = `status-dot ${socketMounted ? "running" : "idle"}`; section.querySelector("#docker-integration-help").textContent = socketMounted ? "Site Gateway reads the Docker socket read-only to list running containers, and only offers containers that share a Docker network with it." : "Docker socket not detected — mount /var/run/docker.sock into this container to enable container selection."; diff --git a/src/public/index.html b/src/public/index.html index 0e28cd8..a310449 100644 --- a/src/public/index.html +++ b/src/public/index.html @@ -8,7 +8,7 @@ Site Gateway - + - + diff --git a/src/public/styles.css b/src/public/styles.css index 690bc60..4884a9e 100644 --- a/src/public/styles.css +++ b/src/public/styles.css @@ -775,7 +775,9 @@ label.check-control:has(input[name="upstreamTlsInsecure"]) small{position:absolu .docker-integration-section{margin-top:14px;padding-top:14px;border-top:1px solid var(--line)} .docker-integration-heading{font-weight:600;margin:0 0 var(--space-2)} +.docker-integration-section .health-tile{margin-bottom:var(--space-3)} .docker-integration-section .check-control{margin-top:var(--space-3)} +#system-restart-status{margin-top:var(--space-3)} /* Custom-drawn select (Task #20): native