diff --git a/packages/web/src/Screen.svelte b/packages/web/src/Screen.svelte index 232068cce..b7262d489 100644 --- a/packages/web/src/Screen.svelte +++ b/packages/web/src/Screen.svelte @@ -12,7 +12,7 @@ visibleCommandPalette, visibleTitleBar, visibleToolbar, - getSystemTheme, + systemThemeStore, } from './stores'; import TabsPanel from './tabpanel/TabsPanel.svelte'; import TabRegister from './tabpanel/TabRegister.svelte'; @@ -51,7 +51,7 @@
e.preventDefault()} diff --git a/packages/web/src/stores.ts b/packages/web/src/stores.ts index 45a7ce616..b18ccd3e2 100644 --- a/packages/web/src/stores.ts +++ b/packages/web/src/stores.ts @@ -26,8 +26,18 @@ export interface TabDefinition { focused?: boolean; } +const darkModeMediaQuery = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null; + +const systemThemeStore = writable(darkModeMediaQuery?.matches ? 'theme-dark' : 'theme-light'); + +if (darkModeMediaQuery) { + darkModeMediaQuery.addEventListener('change', e => { + systemThemeStore.set(e.matches ? 'theme-dark' : 'theme-light'); + }); +} + export function getSystemTheme() { - return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'theme-dark' : 'theme-light'; + return darkModeMediaQuery?.matches ? 'theme-dark' : 'theme-light'; } export function writableWithStorage(defaultValue: T, storageName, removeCondition?: (value: T) => boolean) { @@ -207,10 +217,13 @@ currentTheme.subscribe(value => { }); export const getCurrentTheme = () => currentThemeValue; -export const currentThemeDefinition = derived([currentTheme, extensions], ([$currentTheme, $extensions]) => { - const usedTheme = $currentTheme ?? getSystemTheme(); - return $extensions?.themes?.find(x => x.themeClassName == usedTheme); -}); +export const currentThemeDefinition = derived( + [currentTheme, extensions, systemThemeStore], + ([$currentTheme, $extensions, $systemTheme]) => { + const usedTheme = $currentTheme ?? $systemTheme; + return $extensions?.themes?.find(x => x.themeClassName == usedTheme); + } +); currentThemeDefinition.subscribe(value => { if (value?.themeType && getCurrentTheme()) { localStorage.setItem('currentThemeType', value?.themeType);