1
1
<script setup lang="ts">
2
2
import { ref , watch } from ' vue'
3
- import { ThemeServiceInit , devuiLightTheme , devuiDarkTheme } from ' devui-theme'
3
+ import {
4
+ ThemeServiceInit ,
5
+ devuiLightTheme , devuiDarkTheme ,
6
+ infinityTheme , provenceTheme , sweetTheme , deepTheme , galaxyTheme
7
+ } from ' devui-theme'
4
8
import NavBarTitle from ' ./NavBarTitle.vue'
5
9
import NavLinks from ' ./NavLinks.vue'
6
10
import ToggleSideBarButton from ' ./ToggleSideBarButton.vue'
7
- import DarkMode from ' ./icons/DarkMode.vue'
8
- import LightMode from ' ./icons/LightMode.vue'
9
11
import ZhLang from ' ./icons/ZhLang.vue'
10
12
import EnLang from ' ./icons/EnLang.vue'
11
-
12
- const defaultDarkMode = !! localStorage .getItem (' dark_mode' )
13
- const darkMode = ref (defaultDarkMode )
13
+ import Theme from ' ./icons/Theme.vue'
14
+
15
+ // 主题切换
16
+ const THEME_MAP = {
17
+ ' devui-light-theme' : devuiLightTheme ,
18
+ ' devui-dark-theme' : devuiDarkTheme ,
19
+ ' infinity-theme' : infinityTheme ,
20
+ ' provence-theme' : provenceTheme ,
21
+ ' sweet-theme' : sweetTheme ,
22
+ ' deep-theme' : deepTheme ,
23
+ ' galaxy-theme' : galaxyTheme ,
24
+ }
25
+ const themes = Object .keys (THEME_MAP )
26
+ const userCustomTheme = localStorage .getItem (' user-custom-theme' ) || themes [0 ]
14
27
const themeService = ThemeServiceInit ({
15
- defaultTheme: getThemeByDarkMode (darkMode .value )
16
- }, ' defaultTheme' )
28
+ ... THEME_MAP
29
+ }, userCustomTheme )
30
+ let themeIndex = themes .findIndex (item => item === userCustomTheme )
31
+ const changeTheme = () => {
32
+ themeIndex = (themeIndex + 1 ) % themes .length
33
+ themeService .applyTheme (THEME_MAP [themes [themeIndex ]])
34
+ }
17
35
36
+ // 国际化
18
37
const defaultLanguage = ref (localStorage .getItem (' preferred_lang' ))
19
38
function useTranslation(target ) {
20
39
defaultLanguage .value = target
@@ -26,18 +45,6 @@ function useTranslation(target) {
26
45
}
27
46
}
28
47
29
- function getThemeByDarkMode(target ) {
30
- return target ? devuiDarkTheme : devuiLightTheme
31
- }
32
-
33
- watch (
34
- () => darkMode .value ,
35
- (darkMode , prevDarkMode ) => {
36
- localStorage .setItem (' dark_mode' , darkMode ? true : ' ' )
37
- themeService .applyTheme (getThemeByDarkMode (darkMode ))
38
- }
39
- )
40
-
41
48
defineEmits ([' toggle' ])
42
49
</script >
43
50
@@ -65,8 +72,7 @@ defineEmits(['toggle'])
65
72
<EnLang v-else ></EnLang >
66
73
</div >
67
74
<div class =" custom-nav-item flex items-center ml-m" >
68
- <DarkMode v-if =" darkMode" @click =" darkMode = !darkMode" ></DarkMode >
69
- <LightMode v-else @click =" darkMode = !darkMode" ></LightMode >
75
+ <Theme @click =" changeTheme" ></Theme >
70
76
</div >
71
77
<a class =" custom-nav-item ml-m" style =" font-size : 0 ;user-select :none " href =" https://github.com/DevCloudFE/vue-devui" target =" _blank" >
72
78
<svg viewBox =" 0 0 20 20" width =" 18" height =" 18" ><path fill =" var(--devui-text, #252b3a)" d =" M10 0a10 10 0 0 0-3.16 19.49c.5.1.68-.22.68-.48l-.01-1.7c-2.78.6-3.37-1.34-3.37-1.34-.46-1.16-1.11-1.47-1.11-1.47-.9-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.9 1.52 2.34 1.08 2.91.83.1-.65.35-1.09.63-1.34-2.22-.25-4.55-1.11-4.55-4.94 0-1.1.39-1.99 1.03-2.69a3.6 3.6 0 0 1 .1-2.64s.84-.27 2.75 1.02a9.58 9.58 0 0 1 5 0c1.91-1.3 2.75-1.02 2.75-1.02.55 1.37.2 2.4.1 2.64.64.7 1.03 1.6 1.03 2.69 0 3.84-2.34 4.68-4.57 4.93.36.31.68.92.68 1.85l-.01 2.75c0 .26.18.58.69.48A10 10 0 0 0 10 0" ></path ></svg >
@@ -95,9 +101,6 @@ defineEmits(['toggle'])
95
101
padding : 0.7rem 1.5rem 0.7rem 4rem ;
96
102
height : var (--header-height );
97
103
background-color : $devui-base-bg ;
98
- & :hover {
99
- cursor : pointer ;
100
- }
101
104
}
102
105
103
106
@media (min-width : 720px ) {
@@ -125,6 +128,8 @@ defineEmits(['toggle'])
125
128
}
126
129
127
130
.custom-nav-item :hover {
131
+ cursor : pointer ;
132
+
128
133
svg ,
129
134
path {
130
135
fill : $devui-brand ;
0 commit comments