diff --git a/website/src/badges.html b/website/src/badges.html index e176f3edcb..d0b6670f53 100644 --- a/website/src/badges.html +++ b/website/src/badges.html @@ -51,7 +51,10 @@ templateEngineOverride: njk .b-theme .sun { display: none; } html.dark .b-theme .sun { display: block; } html.dark .b-theme .moon { display: none; } - #badges-frame { display: block; width: 100%; height: calc(100vh - 54px); border: 0; margin-top: 54px; } + /* The frame sits under the fixed navbar (the app pads its own top to clear it) and is sized + to its content by the app's height messages, so the page — not the frame — scrolls, and + the footer follows naturally. 100vh is only the size before the first message arrives. */ + #badges-frame { display: block; width: 100%; height: 100vh; border: 0; } @media (max-width: 640px) { .b-links { gap: 24px; } } @@ -74,7 +77,7 @@ templateEngineOverride: njk - + {% include "footer.html" %} @@ -88,6 +91,10 @@ templateEngineOverride: njk function siteTheme() { try { return localStorage.getItem("theme") || "system"; } catch (e) { return "system"; } } + function isDark() { + return document.documentElement.classList.contains("dark"); + } + function siteBg() { return isDark() ? "#000832" : "#F3FAFF"; } function applySiteTheme(theme) { var dark = theme === "dark" || (theme === "system" && window.matchMedia("(prefers-color-scheme: dark)").matches); document.documentElement.classList.toggle("dark", dark); @@ -95,6 +102,7 @@ templateEngineOverride: njk } function post(msg) { try { frame.contentWindow.postMessage(msg, APP); } catch (e) { /* not ready */ } } function postRoute() { post({ type: "simplex-route", hash: location.hash }); } + function postColors() { post({ type: "simplex-colors", bg: siteBg() }); } // Buy a code / Your codes are hash links; changing the hash — from a click or from the // address bar — is what carries the route into the frame. @@ -102,19 +110,25 @@ templateEngineOverride: njk window.addEventListener("message", function (e) { if (e.origin !== APP || !e.data) return; - // The frame announces itself on load; hand it the site's theme and the current route. + // The frame announces itself on load; hand it the site's theme, background and route. if (e.data.type === "simplex-embed-ready") { post({ type: "simplex-theme", theme: siteTheme() }); + postColors(); postRoute(); } // The buyer used the theme switch inside the frame; keep the site in step. - if (e.data.type === "simplex-theme") applySiteTheme(e.data.theme); + if (e.data.type === "simplex-theme") { applySiteTheme(e.data.theme); postColors(); } + // The frame reports its content height; size it so the site's page scrolls, not the frame. + if (e.data.type === "simplex-height" && typeof e.data.height === "number") { + frame.style.height = Math.max(0, e.data.height) + "px"; + } }); document.getElementById("b-theme").addEventListener("click", function () { - var next = document.documentElement.classList.contains("dark") ? "light" : "dark"; + var next = isDark() ? "light" : "dark"; applySiteTheme(next); post({ type: "simplex-theme", theme: next }); + postColors(); }); })();