fix: auto theme does not switch when OS changes day/night mode (#6813) (#12278)

When theme is set to "auto" (follow system), changing the OS from
light to dark (or vice versa) without reloading the page had no
effect. The theme was only evaluated once on page load.

Added a matchMedia 'change' event listener that calls switchTheme()
whenever the OS color scheme changes, but only when theme is "auto".
Listener is properly cleaned up on component unmount.

Fixes #6813 (point 1)
This commit is contained in:
jakub961241
2026-03-23 14:57:15 +08:00
committed by GitHub
parent f541379daa
commit 5a80931a49
+14
View File
@@ -1,3 +1,4 @@
import { onUnmounted } from 'vue';
import { GlobalStore } from '@/store';
import { setPrimaryColor } from '@/utils/theme';
@@ -26,6 +27,19 @@ export const useTheme = () => {
}
};
// Listen for OS theme changes when theme is set to "auto"
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
const onSystemThemeChange = () => {
const globalStore = GlobalStore();
if (globalStore.themeConfig.theme === 'auto') {
switchTheme();
}
};
mediaQuery.addEventListener('change', onSystemThemeChange);
onUnmounted(() => {
mediaQuery.removeEventListener('change', onSystemThemeChange);
});
return {
switchTheme,
};