diff --git a/src/AppProvider.vue b/src/AppProvider.vue index 6c7f8fc0..20797740 100644 --- a/src/AppProvider.vue +++ b/src/AppProvider.vue @@ -6,16 +6,18 @@ :theme="dark" :theme-overrides="theme.themeOverrids" > - - - - - - - - - - + + + + + + + + + + + + @@ -23,18 +25,18 @@ import { computed, watch } from 'vue'; import { NConfigProvider, - darkTheme, - zhCN, - dateZhCN, + NElement, NLoadingBarProvider, NDialogProvider, NNotificationProvider, - NMessageProvider + NMessageProvider, + darkTheme, + zhCN, + dateZhCN } from 'naive-ui'; import { useDark } from '@vueuse/core'; import { AppProviderContent } from '@/components'; import { useThemeStore } from '@/store'; -import { addColorAlpha } from '@/utils'; const osDark = useDark(); const theme = useThemeStore(); @@ -43,13 +45,6 @@ const { handleDarkMode } = useThemeStore(); /** 系统暗黑模式 */ const dark = computed(() => (theme.darkMode ? darkTheme : undefined)); -// 主题颜色 -const primary = computed(() => theme.themeColor); -const primaryWithAlpha = computed(() => { - const alpha = theme.darkMode ? 0.15 : 0.1; - return addColorAlpha(primary.value, alpha); -}); - // 操作系统的暗黑模式 watch( osDark, @@ -61,18 +56,4 @@ watch( } ); - + diff --git a/src/layouts/BasicLayout/components/GlobalHeader/components/ThemeMode.vue b/src/layouts/BasicLayout/components/GlobalHeader/components/ThemeMode.vue index c8b1562e..b1aea287 100644 --- a/src/layouts/BasicLayout/components/GlobalHeader/components/ThemeMode.vue +++ b/src/layouts/BasicLayout/components/GlobalHeader/components/ThemeMode.vue @@ -1,26 +1,17 @@ - + diff --git a/src/layouts/BasicLayout/components/GlobalSider/components/VerticalMixSider/components/MixMenu.vue b/src/layouts/BasicLayout/components/GlobalSider/components/VerticalMixSider/components/MixMenu.vue index a9708571..61f3e55f 100644 --- a/src/layouts/BasicLayout/components/GlobalSider/components/VerticalMixSider/components/MixMenu.vue +++ b/src/layouts/BasicLayout/components/GlobalSider/components/VerticalMixSider/components/MixMenu.vue @@ -2,7 +2,7 @@

-

{{ title }}

+

{{ title }}

diff --git a/src/layouts/BasicLayout/components/SettingDrawer/components/DarkMode/index.vue b/src/layouts/BasicLayout/components/SettingDrawer/components/DarkMode/index.vue index 96a4d3f1..cf91a1f6 100644 --- a/src/layouts/BasicLayout/components/SettingDrawer/components/DarkMode/index.vue +++ b/src/layouts/BasicLayout/components/SettingDrawer/components/DarkMode/index.vue @@ -3,10 +3,10 @@
diff --git a/src/layouts/BasicLayout/components/common/GlobalLogo.vue b/src/layouts/BasicLayout/components/common/GlobalLogo.vue index 11650857..1ffffd02 100644 --- a/src/layouts/BasicLayout/components/common/GlobalLogo.vue +++ b/src/layouts/BasicLayout/components/common/GlobalLogo.vue @@ -1,7 +1,7 @@ diff --git a/src/store/modules/theme/helpers.ts b/src/store/modules/theme/helpers.ts index 20c57821..4cceaa8e 100644 --- a/src/store/modules/theme/helpers.ts +++ b/src/store/modules/theme/helpers.ts @@ -1,8 +1,39 @@ -import { brightenColor, darkenColor } from '@/utils'; +import { brightenColor, darkenColor, addColorAlpha } from '@/utils'; -export function getHoverAndPressedColor(color: string) { - return { - hover: brightenColor(color), - pressed: darkenColor(color) - }; +type ColorType = 'primary' | 'info' | 'success' | 'warning' | 'error'; + +type ColorScene = '' | 'Suppl' | 'Hover' | 'Pressed' | 'Active'; + +type ColorKey = `${ColorType}Color${ColorScene}`; + +type ThemeColor = { + [key in ColorKey]?: string; +}; + +interface ColorAction { + scene: ColorScene; + handler: (color: string) => string; +} + +/** 获取主题颜色的各种场景对应的颜色 */ +export function getThemeColors(colors: [ColorType, string][]) { + const colorActions: ColorAction[] = [ + { scene: '', handler: color => color }, + { scene: 'Suppl', handler: color => color }, + { scene: 'Hover', handler: color => brightenColor(color) }, + { scene: 'Pressed', handler: color => darkenColor(color) }, + { scene: 'Active', handler: color => addColorAlpha(color, 0.1) } + ]; + + const themeColor: ThemeColor = {}; + + colors.forEach(color => { + colorActions.forEach(action => { + const [colorType, colorValue] = color; + const colorKey: ColorKey = `${colorType}Color${action.scene}`; + themeColor[colorKey] = action.handler(colorValue); + }); + }); + + return themeColor; } diff --git a/src/store/modules/theme/index.ts b/src/store/modules/theme/index.ts index 4ee8caf8..9b5fa596 100644 --- a/src/store/modules/theme/index.ts +++ b/src/store/modules/theme/index.ts @@ -3,17 +3,10 @@ import type { GlobalThemeOverrides } from 'naive-ui'; import { themeSettings, defaultThemeSettings } from '@/settings'; import { store } from '@/store'; import type { ThemeSettings, NavMode, MultiTabMode, AnimateType, HorizontalMenuPosition } from '@/interface'; -import { addColorAlpha } from '@/utils'; -import { getHoverAndPressedColor } from './helpers'; +import { getThemeColors } from './helpers'; type ThemeState = ThemeSettings; -interface relativeThemeColor { - hover: string; - pressed: string; - shallow: string; -} - const themeStore = defineStore({ id: 'theme-store', state: (): ThemeState => ({ @@ -23,58 +16,29 @@ const themeStore = defineStore({ /** naive UI主题配置 */ themeOverrids(): GlobalThemeOverrides { const { - themeColor: primaryColor, - otherColor: { info: infoColor, success: successColor, warning: warningColor, error: errorColor } + themeColor, + otherColor: { info, success, warning, error } } = this; - const { hover: primaryColorHover, pressed: primaryColorPressed } = getHoverAndPressedColor(primaryColor); - const { hover: infoColorHover, pressed: infoColorPressed } = getHoverAndPressedColor(infoColor); - const { hover: successColorHover, pressed: successColorPressed } = getHoverAndPressedColor(successColor); - const { hover: warningColorHover, pressed: warningColorPressed } = getHoverAndPressedColor(warningColor); - const { hover: errorColorHover, pressed: errorColorPressed } = getHoverAndPressedColor(errorColor); + const themeColors = getThemeColors([ + ['primary', themeColor], + ['info', info], + ['success', success], + ['warning', warning], + ['error', error] + ]); - const primaryColorSuppl = primaryColor; - const infoColorSuppl = infoColor; - const successColorSuppl = infoColor; - const warningColorSuppl = warningColor; - const errorColorSuppl = errorColor; - const colorLoading = primaryColor; + const colorLoading = themeColor; return { common: { - primaryColor, - primaryColorHover, - primaryColorPressed, - primaryColorSuppl, - infoColor, - infoColorHover, - infoColorPressed, - infoColorSuppl, - successColor, - successColorHover, - successColorPressed, - successColorSuppl, - warningColor, - warningColorHover, - warningColorPressed, - warningColorSuppl, - errorColor, - errorColorHover, - errorColorPressed, - errorColorSuppl + ...themeColors }, LoadingBar: { colorLoading } }; }, - relativeThemeColor(): relativeThemeColor { - const shallow = addColorAlpha(this.themeColor, 0.1); - return { - ...getHoverAndPressedColor(this.themeColor), - shallow - }; - }, isVerticalNav(): boolean { const { mode } = this.navStyle; return mode === 'vertical' || mode === 'vertical-mix'; @@ -92,6 +56,10 @@ const themeStore = defineStore({ handleDarkMode(isDark: boolean) { this.darkMode = isDark; }, + /** 切换暗黑模式 */ + toggleDarkMode() { + this.darkMode = !this.darkMode; + }, /** 设置系统主题颜色 */ setThemeColor(color: string) { this.themeColor = color; diff --git a/src/views/about/components/ProjectInfo/index.vue b/src/views/about/components/ProjectInfo/index.vue index 4149bae7..a99b92ec 100644 --- a/src/views/about/components/ProjectInfo/index.vue +++ b/src/views/about/components/ProjectInfo/index.vue @@ -8,10 +8,10 @@ {{ lastestBuildTime }} - Github地址 + Github地址 - 预览地址 + 预览地址 diff --git a/src/views/dashboard/workbench/components/WorkbenchMain/index.vue b/src/views/dashboard/workbench/components/WorkbenchMain/index.vue index ac038da2..4ffa23ec 100644 --- a/src/views/dashboard/workbench/components/WorkbenchMain/index.vue +++ b/src/views/dashboard/workbench/components/WorkbenchMain/index.vue @@ -4,7 +4,7 @@ @@ -14,7 +14,7 @@ diff --git a/src/views/system/login/components/PwdLogin/index.vue b/src/views/system/login/components/PwdLogin/index.vue index 04f2c35b..3f2c93e6 100644 --- a/src/views/system/login/components/PwdLogin/index.vue +++ b/src/views/system/login/components/PwdLogin/index.vue @@ -10,7 +10,7 @@
记住我 - 忘记密码? + 忘记密码?
确定 diff --git a/src/views/system/login/index.vue b/src/views/system/login/index.vue index e7697dd6..fcfed9b6 100644 --- a/src/views/system/login/index.vue +++ b/src/views/system/login/index.vue @@ -10,7 +10,7 @@
-

{{ item.label }}

+

{{ item.label }}

diff --git a/windi.config.ts b/windi.config.ts index 4bf61412..463382fa 100644 --- a/windi.config.ts +++ b/windi.config.ts @@ -1,9 +1,4 @@ import { defineConfig } from 'windicss/helpers'; -import themeSettings from './src/settings/theme.json'; - -const { - otherColor: { info, success, warning, error } -} = themeSettings; export default defineConfig({ extract: { @@ -15,31 +10,47 @@ export default defineConfig({ 'wh-full': 'w-full h-full', 'center-layout': 'w-1280px mx-auto px-15px', 'flex-center': 'flex justify-center items-center', - 'flex-col-center': 'flex flex-col justify-center items-center', + 'flex-col-center': 'flex-center flex-col', 'flex-x-center': 'flex justify-center', 'flex-y-center': 'flex items-center', 'inline-flex-center': 'inline-flex justify-center items-center', 'inline-flex-x-center': 'inline-flex justify-center', 'inline-flex-y-center': 'inline-flex items-center', - 'flex-1-hidden': 'flex-1 overflow-hidden', 'flex-col-stretch': 'flex flex-col items-stretch', 'inline-flex-col-stretch': 'flex flex-col items-stretch', - 'absolute-center': 'absolute left-0 top-0 flex justify-center items-center wh-full', + 'flex-1-hidden': 'flex-1 overflow-hidden', + 'absolute-center': 'absolute left-0 top-0 flex-center wh-full', 'absolute-lt': 'absolute left-0 top-0', 'absolute-lb': 'absolute left-0 bottom-0', 'absolute-rt': 'absolute right-0 top-0', 'absolute-rb': 'absolute right-0 bottom-0', - 'fixed-center': 'fixed left-0 top-0 flex justify-center items-center wh-full', - 'ellipsis-text': 'whitespace-nowrap overflow-hidden overflow-ellipsis', - 'nowrap-hidden': 'whitespace-nowrap overflow-hidden' + 'fixed-center': 'fixed left-0 top-0 flex-center wh-full', + 'nowrap-hidden': 'whitespace-nowrap overflow-hidden', + 'ellipsis-text': 'nowrap-hidden overflow-ellipsis' }, theme: { extend: { colors: { - info, - success, - warning, - error, + primary: 'var(--primary-color)', + 'primary-hover': 'var(--primary-color-hover)', + 'primary-pressed': 'var(--primary-color-pressed)', + 'primary-active': 'var(--primary-color-active)', + info: 'var(--info-color)', + 'info-hover': 'var(--info-color-hover)', + 'info-pressed': 'var(--info-color-pressed)', + 'info-active': 'var(--info-color-active)', + success: 'var(--success-color)', + 'success-hover': 'var(--success-color-hover)', + 'success-pressed': 'var(--success-color-pressed)', + 'success-active': 'var(--success-color-active)', + warning: 'var(--warning-color)', + 'warning-hover': 'var(--warning-color-hover)', + 'warning-pressed': 'var(--warning-color-pressed)', + 'warning-active': 'var(--warning-color-active)', + error: 'var(--error-color)', + 'error-hover': 'var(--error-color-hover)', + 'error-pressed': 'var(--error-color-pressed)', + 'error-active': 'var(--error-color-active)', light: '#ffffff', dark: '#18181c' },