feat: 面板主题色增加跟随浏览器 (#3107)

Refs #3075
This commit is contained in:
ssongliu 2023-11-29 22:06:08 +08:00 committed by GitHub
parent fa9d855523
commit ed89f8fdd7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 30 additions and 2 deletions

View file

@ -8,6 +8,10 @@ export const useTheme = () => {
const themeConfig = computed(() => globalStore.themeConfig); const themeConfig = computed(() => globalStore.themeConfig);
const switchDark = () => { const switchDark = () => {
if (themeConfig.value.theme === 'auto') {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)');
themeConfig.value.theme = prefersDark.matches ? 'dark' : 'light';
}
const body = document.documentElement as HTMLElement; const body = document.documentElement as HTMLElement;
if (themeConfig.value.theme === 'dark') body.setAttribute('class', 'dark'); if (themeConfig.value.theme === 'dark') body.setAttribute('class', 'dark');
else body.setAttribute('class', ''); else body.setAttribute('class', '');

View file

@ -1162,6 +1162,7 @@ const message = {
theme: 'Theme', theme: 'Theme',
dark: 'Dark', dark: 'Dark',
light: 'Light', light: 'Light',
auto: 'Follow System',
language: 'Language', language: 'Language',
languageHelper: languageHelper:
'By default, it follows the browser language. This parameter takes effect only on the current browser', 'By default, it follows the browser language. This parameter takes effect only on the current browser',

View file

@ -1106,6 +1106,7 @@ const message = {
componentSize: '組件大小', componentSize: '組件大小',
dark: '暗色', dark: '暗色',
light: '亮色', light: '亮色',
auto: '跟隨系統',
language: '系統語言', language: '系統語言',
languageHelper: '默認跟隨瀏覽器語言設置後只對當前瀏覽器生效更換瀏覽器後需要重新設置', languageHelper: '默認跟隨瀏覽器語言設置後只對當前瀏覽器生效更換瀏覽器後需要重新設置',
sessionTimeout: '超時時間', sessionTimeout: '超時時間',

View file

@ -1107,6 +1107,7 @@ const message = {
componentSize: '组件大小', componentSize: '组件大小',
dark: '暗色', dark: '暗色',
light: '亮色', light: '亮色',
auto: '跟随系统',
language: '系统语言', language: '系统语言',
languageHelper: '默认跟随浏览器语言设置后只对当前浏览器生效更换浏览器后需要重新设置', languageHelper: '默认跟随浏览器语言设置后只对当前浏览器生效更换浏览器后需要重新设置',
sessionTimeout: '超时时间', sessionTimeout: '超时时间',

View file

@ -73,6 +73,15 @@ const loadDataFromDB = async () => {
switchDark(); switchDark();
}; };
const updateDarkMode = async (event: MediaQueryListEvent) => {
const res = await getSettingInfo();
if (res.data.theme !== 'auto') {
return;
}
globalStore.setThemeConfig({ ...themeConfig.value, theme: event.matches ? 'dark' : 'light' });
switchDark();
};
const loadStatus = async () => { const loadStatus = async () => {
loading.value = globalStore.isLoading; loading.value = globalStore.isLoading;
loadinText.value = globalStore.loadingText; loadinText.value = globalStore.loadingText;
@ -101,6 +110,17 @@ onBeforeUnmount(() => {
onMounted(() => { onMounted(() => {
loadStatus(); loadStatus();
loadDataFromDB(); loadDataFromDB();
const mqList = window.matchMedia('(prefers-color-scheme: dark)');
if (mqList.addEventListener) {
mqList.addEventListener('change', (e) => {
updateDarkMode(e);
});
} else if (mqList.addListener) {
mqList.addListener((e) => {
updateDarkMode(e);
});
}
}); });
</script> </script>

View file

@ -29,13 +29,14 @@
<el-form-item :label="$t('setting.theme')" prop="theme"> <el-form-item :label="$t('setting.theme')" prop="theme">
<el-radio-group @change="onSave('Theme', form.theme)" v-model="form.theme"> <el-radio-group @change="onSave('Theme', form.theme)" v-model="form.theme">
<el-radio-button label="light"> <el-radio-button label="light">
<el-icon><Sunny /></el-icon>
<span>{{ $t('setting.light') }}</span> <span>{{ $t('setting.light') }}</span>
</el-radio-button> </el-radio-button>
<el-radio-button label="dark"> <el-radio-button label="dark">
<el-icon><Moon /></el-icon>
<span>{{ $t('setting.dark') }}</span> <span>{{ $t('setting.dark') }}</span>
</el-radio-button> </el-radio-button>
<el-radio-button label="auto">
<span>{{ $t('setting.auto') }}</span>
</el-radio-button>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>