MCPcopy Create free account
hub / github.com/astercloud/aster / useDarkMode

Function useDarkMode

ui/src/composables/useDarkMode.ts:10–90  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

8export type Theme = "light" | "dark" | "auto";
9
10export function useDarkMode() {
11 const theme = ref<Theme>("auto");
12 const isDark = ref(false);
13
14 // 检测系统主题
15 const getSystemTheme = (): "light" | "dark" => {
16 if (typeof window === "undefined") return "light";
17 return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
18 };
19
20 // 应用主题
21 const applyTheme = (newTheme: Theme) => {
22 const effectiveTheme = newTheme === "auto" ? getSystemTheme() : newTheme;
23 isDark.value = effectiveTheme === "dark";
24
25 if (typeof document !== "undefined") {
26 if (isDark.value) {
27 document.documentElement.classList.add("dark");
28 } else {
29 document.documentElement.classList.remove("dark");
30 }
31 }
32 };
33
34 // 设置主题
35 const setTheme = (newTheme: Theme) => {
36 theme.value = newTheme;
37 applyTheme(newTheme);
38
39 // 保存到 localStorage
40 if (typeof localStorage !== "undefined") {
41 localStorage.setItem("theme", newTheme);
42 }
43 };
44
45 // 切换主题
46 const toggleTheme = () => {
47 const newTheme = isDark.value ? "light" : "dark";
48 setTheme(newTheme);
49 };
50
51 // 监听系统主题变化
52 const watchSystemTheme = () => {
53 if (typeof window === "undefined") return;
54
55 const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
56 const handler = () => {
57 if (theme.value === "auto") {
58 applyTheme("auto");
59 }
60 };
61
62 mediaQuery.addEventListener("change", handler);
63 return () => mediaQuery.removeEventListener("change", handler);
64 };
65
66 // 初始化
67 onMounted(() => {

Callers 1

Calls 2

watchSystemThemeFunction · 0.85
applyThemeFunction · 0.70

Tested by

no test coverage detected