From e64f45bd21abdbba87e91d7a404f2c5d94ee7798 Mon Sep 17 00:00:00 2001 From: arne Date: Sun, 1 Dec 2024 14:53:25 +0100 Subject: [PATCH] save light mode --- src/AppState.ts | 16 +++++++++++++++- src/assets/svgs/moon.svg | 1 + src/assets/svgs/sun.svg | 1 + src/ui/Root/Root.vue | 6 +----- src/ui/Widgets/Icon/icons.ts | 4 ++++ src/ui/global.css | 11 +++++++++-- 6 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 src/assets/svgs/moon.svg create mode 100644 src/assets/svgs/sun.svg diff --git a/src/AppState.ts b/src/AppState.ts index bca7adc..eed23ef 100644 --- a/src/AppState.ts +++ b/src/AppState.ts @@ -1,4 +1,4 @@ -import { inject, type InjectionKey, ref, getCurrentInstance } from "vue"; +import {inject, type InjectionKey, ref, getCurrentInstance, watch} from "vue"; import { Bound } from "./utils"; export type UITool = @@ -12,6 +12,20 @@ class AppStateStore extends Bound { unitMouseStart = ref(null); selectingUnits = ref(false); deselectingUnits = ref(false); + isDark = ref(false); + + constructor() { + super(); + this.isDark.value = localStorage?.getItem("drum-slayer-theme") === "dark"; + watch(this.isDark, (newIsDark) => { + if (newIsDark) { + document.body.classList.add("dark"); + } else { + document.body.classList.remove("dark"); + } + localStorage?.setItem("drum-slayer-theme", newIsDark ? "dark" : "light"); + }, { immediate: true }); + } } const AppStateStoreKey = Symbol("AppStateStore") as InjectionKey; diff --git a/src/assets/svgs/moon.svg b/src/assets/svgs/moon.svg new file mode 100644 index 0000000..dbf7c6c --- /dev/null +++ b/src/assets/svgs/moon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/sun.svg b/src/assets/svgs/sun.svg new file mode 100644 index 0000000..7f51b94 --- /dev/null +++ b/src/assets/svgs/sun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/ui/Root/Root.vue b/src/ui/Root/Root.vue index 1b5ffcf..e003d60 100644 --- a/src/ui/Root/Root.vue +++ b/src/ui/Root/Root.vue @@ -86,7 +86,7 @@ class="quick-access-button" title="Switch theme" @click="toggleTheme"> - + @@ -128,10 +128,6 @@ const currentOrientation = ref<'horizontal' | 'vertical'>('horizontal'); const sidebarActive = ref(false); - function toggleTheme() { - document.body.classList.toggle("dark"); - } - const appStateStore = useAppStateStore(); const beatStore = useBeatStore(); diff --git a/src/ui/Widgets/Icon/icons.ts b/src/ui/Widgets/Icon/icons.ts index 66cf37a..9649075 100644 --- a/src/ui/Widgets/Icon/icons.ts +++ b/src/ui/Widgets/Icon/icons.ts @@ -14,6 +14,8 @@ import Delete from "@/assets/svgs/delete.svg"; import Eye from "@/assets/svgs/eye.svg"; import EyeOff from "@/assets/svgs/eye-off.svg"; import PaintBucket from '@/assets/svgs/paint-bucket.svg'; +import Sun from '@/assets/svgs/sun.svg'; +import Moon from '@/assets/svgs/moon.svg'; export const IconUrlMap = { arrowClockwise: ArrowClockwise, @@ -32,6 +34,8 @@ export const IconUrlMap = { eye: Eye, eyeOff: EyeOff, paintBucket: PaintBucket, + sun: Sun, + moon: Moon, } as const; export type IconName = keyof typeof IconUrlMap; diff --git a/src/ui/global.css b/src/ui/global.css index 6d4c3dd..0e13640 100644 --- a/src/ui/global.css +++ b/src/ui/global.css @@ -29,7 +29,10 @@ html, body { --color-box-hover-dark-border: #5f5f5f; --color-box: #e0e0e0; --color-box-hover: #f1f1f1; +} +* { + transition: color,background-color ease-out 300ms; } body.dark { @@ -50,8 +53,12 @@ body.dark { --color-p-dark-active: #464646; --color-title-light: #fafafa; --color-title-dark: #282828; - --color-box: #464646; - --color-box-hover: #5f5f5f; +} + +html, body { + position: relative; + width: 100%; + height: 100%; } #dropdowns {