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 @@