Replaces the SVG schematic on /eme with a textured WebGL scene: NASA Blue Marble Earth, real-size Moon, outbound beam, dashed return ray to the sub-lunar point, and a red shading on the anti-moon hemisphere that marks who can't see the Moon (outside the bounce footprint). Three.js (~680 kB) now lives in its own chunk; esbuild --splitting keeps it out of the main bundle so it only loads when a user hits /eme. Main app.js drops from 1.6 MB to 922 kB. Also swaps the Elevation/SNR rows so the badge comes before the number.
57 lines
2.5 KiB
Text
57 lines
2.5 KiB
Text
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<meta name="csrf-token" content={get_csrf_token()} />
|
|
<%!--
|
|
OpenStreetMap's tile usage policy requires a Referer header identifying
|
|
the site using their tiles. strict-origin-when-cross-origin sends just
|
|
the origin (e.g. https://prop.w5isp.com) on cross-origin HTTPS requests,
|
|
which is the minimum OSM asks for. Explicit so we don't silently lose
|
|
the Referer if a future browser default changes.
|
|
--%>
|
|
<meta name="referrer" content="strict-origin-when-cross-origin" />
|
|
<.live_title default="Microwave Propagation" suffix=" · Microwave Propagation">
|
|
{assigns[:page_title]}
|
|
</.live_title>
|
|
<link rel="preconnect" href="https://a.tile.openstreetmap.org" crossorigin />
|
|
<link rel="preconnect" href="https://b.tile.openstreetmap.org" crossorigin />
|
|
<link rel="preconnect" href="https://c.tile.openstreetmap.org" crossorigin />
|
|
<link rel="dns-prefetch" href="https://a.tile.openstreetmap.org" />
|
|
<link rel="dns-prefetch" href="https://b.tile.openstreetmap.org" />
|
|
<link rel="dns-prefetch" href="https://c.tile.openstreetmap.org" />
|
|
<link phx-track-static rel="stylesheet" href={~p"/assets/css/app.css"} />
|
|
<script phx-track-static type="module" src={~p"/assets/js/app.js"}>
|
|
</script>
|
|
<script>
|
|
(() => {
|
|
const setTheme = (theme) => {
|
|
if (theme === "system") {
|
|
localStorage.removeItem("phx:theme");
|
|
document.documentElement.removeAttribute("data-theme");
|
|
} else {
|
|
localStorage.setItem("phx:theme", theme);
|
|
document.documentElement.setAttribute("data-theme", theme);
|
|
}
|
|
};
|
|
if (!document.documentElement.hasAttribute("data-theme")) {
|
|
setTheme(localStorage.getItem("phx:theme") || "system");
|
|
}
|
|
window.addEventListener("storage", (e) => e.key === "phx:theme" && setTheme(e.newValue || "system"));
|
|
|
|
window.addEventListener("phx:set-theme", (e) => setTheme(e.target.dataset.phxTheme));
|
|
})();
|
|
</script>
|
|
</head>
|
|
<body>
|
|
{@inner_content}
|
|
<script async src="https://a.w5isp.com/js/pa-3eKACFxtbw6MHrTDA28wG.js">
|
|
</script>
|
|
<script>
|
|
window.plausible = window.plausible || function () { (plausible.q = plausible.q || []).push(arguments) };
|
|
plausible.init = plausible.init || function (i) { plausible.o = i || {} };
|
|
plausible.init();
|
|
</script>
|
|
</body>
|
|
</html>
|