ForcePilot/web/src/stores/theme.js
2026-01-15 06:01:34 +08:00

66 lines
1.5 KiB
JavaScript

import { ref, watch } from 'vue'
import { defineStore } from 'pinia'
import { theme } from 'ant-design-vue'
export const useThemeStore = defineStore('theme', () => {
// 从 localStorage 读取保存的主题,默认为浅色
const isDark = ref(localStorage.getItem('theme') === 'dark')
// 公共主题配置
const commonTheme = {
token: {
fontFamily:
"'HarmonyOS Sans SC', Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;",
colorPrimary: '#198cb2',
borderRadius: 8,
wireframe: false
}
}
// 浅色主题配置
const lightTheme = {
...commonTheme
}
// 深色主题配置
const darkTheme = {
...commonTheme,
algorithm: theme.darkAlgorithm
}
// 当前主题配置
const currentTheme = ref(isDark.value ? darkTheme : lightTheme)
// 切换主题
function toggleTheme() {
setTheme(!isDark.value)
}
// 设置主题
function setTheme(dark) {
isDark.value = dark
currentTheme.value = dark ? darkTheme : lightTheme
localStorage.setItem('theme', dark ? 'dark' : 'light')
updateDocumentTheme()
}
// 更新 document 的主题类
function updateDocumentTheme() {
if (isDark.value) {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
}
// 初始化时设置主题
updateDocumentTheme()
return {
isDark,
currentTheme,
toggleTheme,
setTheme
}
})