${safeTitle}
${safeMessage}
From b72afdcee34de9e079b616ccc249086f9cc66214 Mon Sep 17 00:00:00 2001
From: marvin
-
+
Why Site Gateway · diff --git a/ROADMAP.md b/ROADMAP.md index 2fc1d6c..bed9bf8 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,6 +4,8 @@ `v0.12.0` marks a shift from the earlier per-fix `0.11.x` patch numbering to ordinary semantic versioning going forward — a minor bump for a real batch of changes, a patch bump for a targeted fix, rather than incrementing the same trailing number for every single change regardless of size. The product itself has moved well past the original alpha creation flow described in earlier versions of this document — Hosted Sites, Proxy Hosts, Redirect Hosts, and Streaming Hosts are all implemented, along with authentication, access control, certificates, backups, and full dashboard reporting. This document reflects what's actually shipped and what's genuinely still ahead. +`v0.13.0` is a real batch under that same convention, not a targeted fix, even though none of it changes what the app *does*: the in-app light theme has been removed entirely (the app is dark-only now, including the two visitor-facing themed pages -- the default-site 404/welcome/custom-HTML page and the Access-List sign-in page, both previously following the visitor's OS light/dark preference and now fixed dark for consistency with the rest of the app), the full color/spacing/radius design-token system begun in v0.12.0 has been completed (zero hardcoded color literals remain anywhere outside the token definitions), and `styles.css` has been restructured into commented, page-aligned sections matching the convention already used in `app.js`/`features.js`/`server.js`. A handful of small pre-existing bugs (a duplicate CSS custom property, some dead/duplicate rules, a decorative background glow that rendered incorrectly at certain aspect ratios) were also found and fixed along the way. + ## Product direction Site Gateway stays simpler than a general-purpose proxy manager: one dashboard, clear health reporting, and guided setup instead of exposing raw server configuration. **Caddy** remains the managed gateway — Site Gateway stores a small route model and generates/validates Caddy configuration rather than reimplementing certificate and proxy behavior itself. diff --git a/package.json b/package.json index 2e1d9c3..34c69d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "site-gateway", - "version": "0.12.0", + "version": "0.13.0", "private": true, "description": "Site Gateway: simple self-hosted website publishing, reverse proxying, and automatic HTTPS.", "type": "module", diff --git a/src/public/app.js b/src/public/app.js index 3ddf613..a3d6200 100644 --- a/src/public/app.js +++ b/src/public/app.js @@ -1,5 +1,5 @@ // ============================================================================ -// app.js -- core client application: state, API helper, theme, dashboard, +// app.js -- core client application: state, API helper, dashboard, // Hosted Sites & Proxy Hosts rendering, routing between views, dialogs (create/ // edit/icon/user/account/MFA), and every event listener for those areas. The // remaining views (Streaming, Redirects, Access Lists, Administration panels) @@ -19,19 +19,6 @@ const proxyAccessLabel = document.querySelector("#proxy-form [name=accessListId] const settingsAccessLabel = document.querySelector("#settings-access-list")?.closest("label"); const settingsTlsLabel = document.querySelector("#settings-form [name=tls]")?.closest("label"); if (settingsAccessLabel && settingsTlsLabel) settingsTlsLabel.before(settingsAccessLabel); document.querySelector("#settings-advanced [name=accessListId]")?.closest("label")?.remove(); -// --- Theme (light/dark/system) ------------------------------------------------- -const systemTheme = window.matchMedia("(prefers-color-scheme: dark)"); - -function applyTheme(preference) { - const effective = preference === "system" ? (systemTheme.matches ? "dark" : "light") : preference; - document.documentElement.dataset.theme = effective; - document.querySelector('meta[name="theme-color"]').content = effective === "dark" ? "#08101d" : "#f3f6fa"; -} -const savedTheme = localStorage.getItem("webserver-theme") || "system"; -$("#theme-select").value = savedTheme; applyTheme(savedTheme); -$("#theme-select").addEventListener("change", event => { localStorage.setItem("webserver-theme", event.target.value); applyTheme(event.target.value); }); -systemTheme.addEventListener("change", () => { if ($("#theme-select").value === "system") applyTheme("system"); }); - // --- API helper ------------------------------------------------------------------ async function api(url, options = {}) { diff --git a/src/public/features.js b/src/public/features.js index 170a859..531d694 100644 --- a/src/public/features.js +++ b/src/public/features.js @@ -106,7 +106,7 @@ function renderDefaultSettings() { function defaultSiteThemedHtml(title, message) { const safeTitle = extendedEscape(title); const safeMessage = extendedEscape(message); - return `
${safeMessage}
${safeMessage}