From 8ad955a5d805f87bc5f3838cbfe1c742ac445885 Mon Sep 17 00:00:00 2001 From: Pascal Wengerter Date: Tue, 7 Nov 2023 19:59:48 +0100 Subject: [PATCH] Add themeSwitcher for more >2 themes as OcDrop, further streamline theming logic --- .../src/composables/piniaStores/theme.ts | 28 +++++-- .../src/components/Topbar/ThemeSwitcher.vue | 76 ++++++++++--------- .../src/components/Topbar/TopBar.vue | 1 - .../web-runtime/src/container/bootstrap.ts | 8 +- 4 files changed, 68 insertions(+), 45 deletions(-) diff --git a/packages/web-pkg/src/composables/piniaStores/theme.ts b/packages/web-pkg/src/composables/piniaStores/theme.ts index dc6eb8446a8..fb4810a5037 100644 --- a/packages/web-pkg/src/composables/piniaStores/theme.ts +++ b/packages/web-pkg/src/composables/piniaStores/theme.ts @@ -49,8 +49,8 @@ export const useThemeStore = defineStore('theme', () => { const hasOnlyTwoThemesForLightDarkMode = computed( () => availableThemes.value.length === 2 && - availableThemes.value.some((x) => x.isDark === true) && - availableThemes.value.some((x) => x.isDark !== true) + availableThemes.value.some((t) => t.isDark === true) && + availableThemes.value.some((t) => t.isDark !== true) ) const initializeThemes = (themes: WebTheme[], newCommonTheme: CommonTheme) => { @@ -58,18 +58,31 @@ export const useThemeStore = defineStore('theme', () => { commonTheme.value = newCommonTheme const currentThemeName = useLocalStorage('oc_currentThemeName', null) // note: use null as default so that we can fall back to system preferences - // Set default fallback theme names + // Set default theme name as fallback if (unref(currentThemeName) === null) { - currentThemeName.value = usePreferredDark().value ? themeNameDark : themeNameLight + const isDark = usePreferredDark() + currentThemeName.value = isDark.value ? themeNameDark : themeNameLight } // TODO: Fix this by passing full theme? // TODO: Discuss handling (former) default scenario - setCurrentTheme(availableThemes.value.find((x) => x.general.name === currentThemeName.value)) + setAndApplyTheme(availableThemes.value.find((t) => t.general.name === currentThemeName.value)) } - const setCurrentTheme = (theme: WebTheme) => { + const setAndApplyTheme = (theme: WebTheme) => { currentTheme.value = theme + + for (const param in currentTheme.value.designTokens.colorPalette) { + ;(document.querySelector(':root') as HTMLElement).style.setProperty( + `--oc-color-${param}`, + theme.designTokens.colorPalette[param] + ) + } + } + + // This should only be used with hasOnlyTwoThemesForLightDarkMode - we know there's exactly two themes, one with darkMode and one without + const toggleTheme = () => { + setAndApplyTheme(availableThemes.value.find((t) => t.isDark !== currentTheme.value.isDark)) } return { @@ -78,6 +91,7 @@ export const useThemeStore = defineStore('theme', () => { hasOnlyOneTheme, hasOnlyTwoThemesForLightDarkMode, initializeThemes, - setCurrentTheme + setAndApplyTheme, + toggleTheme } }) diff --git a/packages/web-runtime/src/components/Topbar/ThemeSwitcher.vue b/packages/web-runtime/src/components/Topbar/ThemeSwitcher.vue index 33b2835a89a..27376be2a94 100644 --- a/packages/web-runtime/src/components/Topbar/ThemeSwitcher.vue +++ b/packages/web-runtime/src/components/Topbar/ThemeSwitcher.vue @@ -1,6 +1,6 @@