diff --git a/.stylelintrc.cjs b/.stylelintrc.cjs index bc1219c9..e6b1be15 100644 --- a/.stylelintrc.cjs +++ b/.stylelintrc.cjs @@ -44,7 +44,7 @@ module.exports = { "at-rule-no-unknown": [ true, { - ignoreAtRules: ["apply", "use"], + ignoreAtRules: ["apply", "use", "forward"], }, ], }, diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue index 7e383086..e74aa44c 100644 --- a/src/components/IconSelect/index.vue +++ b/src/components/IconSelect/index.vue @@ -201,7 +201,7 @@ onClickOutside(iconSelectRef, () => (popoverVisible.value = false), { } .icon-item:hover { - border-color: #409eff; + border-color: #4080ff; scale: 1.2; } } diff --git a/src/layout/components/Settings/components/ThemeColorPicker.vue b/src/layout/components/Settings/components/ThemeColorPicker.vue index 5a0d59cd..587c1ac5 100644 --- a/src/layout/components/Settings/components/ThemeColorPicker.vue +++ b/src/layout/components/Settings/components/ThemeColorPicker.vue @@ -15,7 +15,7 @@ const emit = defineEmits(["update:modelValue"]); // 定义颜色预设 const colorPresets = [ - "#409EFF", + "#4080FF", "#ff4500", "#ff8c00", "#90ee90", diff --git a/src/settings.ts b/src/settings.ts index e25fef2c..c4393497 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -18,7 +18,7 @@ const defaultSettings: AppSettings = { theme: mediaQueryList.matches ? ThemeEnum.DARK : ThemeEnum.LIGHT, size: SizeEnum.DEFAULT, language: LanguageEnum.ZH_CN, - themeColor: "#409EFF", + themeColor: "#4080FF", watermarkEnabled: false, watermarkContent: pkg.name, }; diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts index a581e90f..9a2eee6a 100644 --- a/src/store/modules/settings.ts +++ b/src/store/modules/settings.ts @@ -1,68 +1,50 @@ import defaultSettings from "@/settings"; import { ThemeEnum } from "@/enums/ThemeEnum"; -import Color from "color"; +import { generateThemeColors, applyTheme, toggleDarkMode } from "@/utils/theme"; type SettingsValue = boolean | string; export const useSettingsStore = defineStore("setting", () => { - // 是否显示设置 + // 基本设置 const settingsVisible = ref(false); - // 是否显示标签视图 + // 标签 const tagsView = useStorage("tagsView", defaultSettings.tagsView); - // 是否显示侧边栏logo + // 侧边栏 Logo const sidebarLogo = useStorage( "sidebarLogo", defaultSettings.sidebarLogo ); - // 是否固定头部 + // 固定头部 const fixedHeader = useStorage( "fixedHeader", defaultSettings.fixedHeader ); - // 布局模式:left-左侧模式(默认) top-顶部模式 mix-混合模式 + // 布局 const layout = useStorage("layout", defaultSettings.layout); - // 主题颜色 - const themeColor = useStorage( - "themeColor", - defaultSettings.themeColor - ); - // 主题:light-亮色(默认) dark-暗色 - const theme = useStorage("theme", defaultSettings.theme); - // 是否开启水印 + // 水印 const watermarkEnabled = useStorage( "watermarkEnabled", defaultSettings.watermarkEnabled ); + // 主题 + const themeColor = useStorage( + "themeColor", + defaultSettings.themeColor + ); + const theme = useStorage("theme", defaultSettings.theme); + + // 监听主题变化 watch( [theme, themeColor], - ([newTheme, newThemeColor], [oldTheme, oldThemeColor]) => { - if (newTheme !== oldTheme) { - if (newTheme === ThemeEnum.DARK) { - document.documentElement.classList.add("dark"); - } else { - document.documentElement.classList.remove("dark"); - } - } - - if (newThemeColor !== oldThemeColor) { - const rootStyle = document.documentElement.style; - rootStyle.setProperty(`--el-color-primary`, newThemeColor); - rootStyle.setProperty(`--el-color-primary-dark-2`, newThemeColor); - - for (let i = 1; i < 10; i++) { - rootStyle.setProperty( - `--el-color-primary-light-${i}`, - `${Color(newThemeColor).alpha(1 - i * 0.1)}` - ); - } - } + ([newTheme, newThemeColor]) => { + toggleDarkMode(newTheme === ThemeEnum.DARK); + const colors = generateThemeColors(newThemeColor); + applyTheme(colors); }, - { - immediate: true, // 立即执行,确保在侦听器创建时执行一次 - } + { immediate: true } ); - + // 设置更改函数 const settingsMap: Record> = { fixedHeader, tagsView, @@ -79,31 +61,17 @@ export const useSettingsStore = defineStore("setting", () => { value: SettingsValue; }) { const setting = settingsMap[key]; - if (setting) { - setting.value = value; - } + if (setting) setting.value = value; } - /** - * 切换主题 - */ function changeTheme(val: string) { theme.value = val; } - /** - * 切换主题颜色 - * - * @param color 主题颜色 - * - */ function changeThemeColor(color: string) { themeColor.value = color; } - /** - * 切换布局 - */ function changeLayout(val: string) { layout.value = val; } diff --git a/src/styles/variables.scss b/src/styles/variables.scss index 42f97182..f4e44145 100644 --- a/src/styles/variables.scss +++ b/src/styles/variables.scss @@ -1,3 +1,23 @@ +@forward "element-plus/theme-chalk/src/common/var.scss" with ( + $colors: ( + "primary": ( + "base": #4080ff, + ), + "success": ( + "base": #23c343, + ), + "warning": ( + "base": #ff9a2e, + ), + "danger": ( + "base": #f76560, + ), + "info": ( + "base": #a9aeb8, + ), + ) +); + /** 全局SCSS变量 */ :root { diff --git a/src/views/dashboard/components/VisitTrend.vue b/src/views/dashboard/components/VisitTrend.vue index 66e69fa7..91dea645 100644 --- a/src/views/dashboard/components/VisitTrend.vue +++ b/src/views/dashboard/components/VisitTrend.vue @@ -7,7 +7,7 @@ 访问趋势 @@ -99,10 +99,10 @@ const setChartOptions = (data: VisitTrendVO) => { }, smooth: true, itemStyle: { - color: "#409EFF", + color: "#4080FF", }, lineStyle: { - color: "#409EFF", + color: "#4080FF", }, }, { diff --git a/vite.config.ts b/vite.config.ts index 2aa9cde9..1b3747a1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -85,7 +85,9 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => { imports: ["vue", "@vueuse/core", "pinia", "vue-router", "vue-i18n"], resolvers: [ // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式) - ElementPlusResolver(), + ElementPlusResolver({ + importStyle: "sass", + }), // 自动导入图标组件 IconsResolver({}), ], @@ -105,7 +107,9 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => { Components({ resolvers: [ // 自动导入 Element Plus 组件 - ElementPlusResolver(), + ElementPlusResolver({ + importStyle: "sass", + }), // 自动注册图标组件 IconsResolver({ // element-plus图标库,其他图标库 https://icon-sets.iconify.design/