11<script setup lang="ts">
22import { 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'
48import NavBarTitle from ' ./NavBarTitle.vue'
59import NavLinks from ' ./NavLinks.vue'
610import ToggleSideBarButton from ' ./ToggleSideBarButton.vue'
7- import DarkMode from ' ./icons/DarkMode.vue'
8- import LightMode from ' ./icons/LightMode.vue'
911import ZhLang from ' ./icons/ZhLang.vue'
1012import 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 ]
1427const 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+ }
1735
36+ // 国际化
1837const defaultLanguage = ref (localStorage .getItem (' preferred_lang' ))
1938function useTranslation(target ) {
2039 defaultLanguage .value = target
@@ -26,18 +45,6 @@ function useTranslation(target) {
2645 }
2746}
2847
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-
4148defineEmits ([' toggle' ])
4249 </script >
4350
@@ -65,8 +72,7 @@ defineEmits(['toggle'])
6572 <EnLang v-else ></EnLang >
6673 </div >
6774 <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 >
7076 </div >
7177 <a class =" custom-nav-item ml-m" style =" font-size : 0 ;user-select :none " href =" https://github.com/DevCloudFE/vue-devui" target =" _blank" >
7278 <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'])
95101 padding : 0.7rem 1.5rem 0.7rem 4rem ;
96102 height : var (--header-height );
97103 background-color : $devui-base-bg ;
98- & :hover {
99- cursor : pointer ;
100- }
101104}
102105
103106@media (min-width : 720px ) {
@@ -125,6 +128,8 @@ defineEmits(['toggle'])
125128}
126129
127130.custom-nav-item :hover {
131+ cursor : pointer ;
132+
128133 svg ,
129134 path {
130135 fill : $devui-brand ;
0 commit comments