// Theme controller. The design tokens ship both palettes; nothing switches // between them unless this runs. It follows the OS preference by default and // remembers an explicit choice. Loaded with defer from /static/, so it is // allowed by the page's `script-src 'self'` policy (no inline script). (function () { "use strict"; var KEY = "webrestrict.theme"; var root = document.documentElement; var media = window.matchMedia("(prefers-color-scheme: dark)"); var stored = null; try { stored = window.localStorage.getItem(KEY); } catch (e) { stored = null; } function apply() { var theme = stored || (media.matches ? "dark" : "light"); root.setAttribute("data-theme", theme); var buttons = document.querySelectorAll("[data-theme-toggle]"); for (var i = 0; i < buttons.length; i++) { buttons[i].textContent = theme === "dark" ? "Light" : "Dark"; buttons[i].setAttribute( "aria-label", "Switch to " + (theme === "dark" ? "light" : "dark") + " theme" ); } } document.addEventListener("click", function (event) { var target = event.target && event.target.closest ? event.target.closest("[data-theme-toggle]") : null; if (!target) { return; } stored = root.getAttribute("data-theme") === "dark" ? "light" : "dark"; try { window.localStorage.setItem(KEY, stored); } catch (e) { /* private mode: the choice just does not persist */ } apply(); }); if (media.addEventListener) { media.addEventListener("change", function () { if (!stored) { apply(); } }); } apply(); })();