towerops/lib/towerops_web/components/layouts/root.html.heex

59 lines
1.9 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()} />
<.live_title default="Towerops">
{assigns[:page_title]}
</.live_title>
<link phx-track-static rel="stylesheet" href={~p"/assets/css/app.css"} />
<script defer phx-track-static type="text/javascript" src={~p"/assets/js/app.js"}>
</script>
<script>
(() => {
const mql = window.matchMedia("(prefers-color-scheme: dark)");
const getSystemTheme = () => mql.matches ? "dark" : "light";
const applyTheme = () => {
const preference = localStorage.getItem("phx:theme") || "system";
const theme = preference === "system" ? getSystemTheme() : preference;
document.documentElement.setAttribute("data-theme", theme);
};
const setTheme = (preference) => {
if (preference === "system") {
localStorage.removeItem("phx:theme");
} else {
localStorage.setItem("phx:theme", preference);
}
applyTheme();
};
// Apply theme on page load
applyTheme();
// Listen for system preference changes (for auto mode)
mql.addEventListener("change", applyTheme);
// Listen for storage changes from other tabs
window.addEventListener("storage", (e) => {
if (e.key === "phx:theme") applyTheme();
});
// Listen for theme change events from LiveView
window.addEventListener("phx:set-theme", (e) => setTheme(e.target.dataset.phxTheme));
})();
</script>
</head>
<body>
<a
href="#main-content"
class="sr-only focus:not-sr-only focus:absolute focus:top-0 focus:left-0 focus:z-50 focus:p-4 focus:bg-blue-600 focus:text-white focus:rounded-md focus:m-2"
>
Skip to main content
</a>
{@inner_content}
</body>
</html>