diff --git a/src/assets/images/moon.svg b/src/assets/images/moon.svg new file mode 100644 index 0000000..68f2353 --- /dev/null +++ b/src/assets/images/moon.svg @@ -0,0 +1,3 @@ + diff --git a/src/assets/images/sun.svg b/src/assets/images/sun.svg new file mode 100644 index 0000000..16fcaaf --- /dev/null +++ b/src/assets/images/sun.svg @@ -0,0 +1,11 @@ + diff --git a/src/components/ui/ThemeToggle.vue b/src/components/ui/ThemeToggle.vue new file mode 100644 index 0000000..58449cd --- /dev/null +++ b/src/components/ui/ThemeToggle.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/composables/useAppConfig.ts b/src/composables/useAppConfig.ts index 0af51f1..b13f666 100644 --- a/src/composables/useAppConfig.ts +++ b/src/composables/useAppConfig.ts @@ -1,6 +1,27 @@ -import { ref } from "vue"; +import { ref, watch } from "vue"; const isDrawerOpen = ref(false); +const isDarkTheme = ref(false); +const APPEARANCE_KEY = "vwa-theme-appearance"; + +watch(isDarkTheme, () => { + if (isDarkTheme.value) { + document.documentElement.classList.add("dark"); + localStorage.setItem(APPEARANCE_KEY, "dark"); + } else { + document.documentElement.classList.remove("dark"); + localStorage.setItem(APPEARANCE_KEY, ""); + } +}); + +export function initAppearance() { + // document.documentElement.classList.add("dark"); + const preference = localStorage.getItem(APPEARANCE_KEY) || ""; + const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + if (!preference || preference === "auto" ? prefersDark : preference === "dark") { + document.documentElement.classList.add("dark"); + }; +} export function useAppConfig() { function closeDrawer() { @@ -9,6 +30,8 @@ export function useAppConfig() { return { isDrawerOpen, + isDarkTheme, closeDrawer, + initAppearance, }; } diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue index b186272..4a1e210 100644 --- a/src/layouts/MainLayout.vue +++ b/src/layouts/MainLayout.vue @@ -1,25 +1,29 @@