-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathThemeManager.astro
More file actions
57 lines (48 loc) · 1.57 KB
/
ThemeManager.astro
File metadata and controls
57 lines (48 loc) · 1.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
---
type Props = {
defaultTheme?: "auto" | "dark" | "light" | undefined;
};
const { defaultTheme = "auto" } = Astro.props;
---
<script is:inline data-default-theme={defaultTheme}>
window.theme ??= (() => {
const defaultTheme =
document.currentScript.getAttribute("data-default-theme");
const storageKey = "theme";
const store =
typeof localStorage !== "undefined"
? localStorage
: { getItem: () => null, setItem: () => {} };
const mediaMatcher = window.matchMedia("(prefers-color-scheme: light)");
let systemTheme = mediaMatcher.matches ? "light" : "dark";
mediaMatcher.addEventListener("change", (event) => {
systemTheme = event.matches ? "light" : "dark";
applyTheme(getTheme());
});
function applyTheme(theme) {
const resolvedTheme = theme === "auto" ? systemTheme : theme;
document.documentElement.dataset.theme = resolvedTheme;
document.documentElement.style.colorScheme = resolvedTheme;
document.dispatchEvent(
new CustomEvent("theme-changed", {
detail: { theme, systemTheme, defaultTheme },
}),
);
}
function setTheme(theme = defaultTheme) {
store.setItem(storageKey, theme);
applyTheme(theme);
}
function getTheme() {
return store.getItem(storageKey) || defaultTheme;
}
function getSystemTheme() {
return systemTheme;
}
function getDefaultTheme() {
return defaultTheme;
}
return { setTheme, getTheme, getSystemTheme, getDefaultTheme };
})();
theme.setTheme(theme.getTheme());
</script>