2023-05-08 18:15:08 +04:30
{{define "component/themeSwitchTemplate"}}
< template >
2024-04-20 22:15:36 +03:30
< a-menu :theme = "themeSwitcher.currentTheme" mode = "inline" selected-keys = "" >
< a-sub-menu >
< span slot = "title" >
< a-icon type = "bulb" :theme = "themeSwitcher.isDarkTheme ? 'filled' : 'outlined'" > < / a-icon >
< span > Theme< / span >
< / span >
< a-menu-item id = "change-theme" class = "ant-menu-theme-switch" @ mousedown = "themeSwitcher.animationsOff()" > Dark < a-switch style = "margin-left: 2px;" size = "small" :default-checked = "themeSwitcher.isDarkTheme" @ change = "themeSwitcher.toggleTheme()" > < / a-switch >
< / a-menu-item >
< a-menu-item id = "change-theme-ultra" v-if = "themeSwitcher.isDarkTheme" class = "ant-menu-theme-switch" @ mousedown = "themeSwitcher.animationsOffUltra()" > Ultra < a-checkbox style = "margin-left: 2px;" :checked = "themeSwitcher.isUltra" @ click = "themeSwitcher.toggleUltra()" > < / a-checkbox >
< / a-menu-item >
< / a-sub-menu >
< / a-menu >
< / template >
{{end}}
{{define "component/themeSwitchTemplateLogin"}}
< template >
< a-menu @ mousedown = "themeSwitcher.animationsOff()" id = "change-theme" :theme = "themeSwitcher.currentTheme" mode = "inline" selected-keys = "" >
2024-03-09 16:36:16 +03:30
< a-menu-item mode = "inline" class = "ant-menu-theme-switch" >
< a-icon type = "bulb" :theme = "themeSwitcher.isDarkTheme ? 'filled' : 'outlined'" > < / a-icon >
< a-switch size = "small" :default-checked = "themeSwitcher.isDarkTheme" @ change = "themeSwitcher.toggleTheme()" > < / a-switch >
< template v-if = "themeSwitcher.isDarkTheme" >
< a-checkbox style = "margin-left: 1rem; vertical-align: middle;" :checked = "themeSwitcher.isUltra" @ click = "themeSwitcher.toggleUltra()" > Ultra< / a-checkbox >
< / template >
< / a-menu-item >
< / a-menu >
2023-05-08 18:15:08 +04:30
< / template >
{{end}}
{{define "component/themeSwitcher"}}
< script >
function createThemeSwitcher ( ) {
const isDarkTheme = localStorage . getItem ( 'dark-mode' ) === 'true' ;
2024-02-28 14:35:01 +03:30
const isUltra = localStorage . getItem ( 'isUltraDarkThemeEnabled' ) === 'true' ;
if ( isUltra ) {
document . documentElement . setAttribute ( 'data-theme' , 'ultra-dark' ) ;
}
2023-05-08 18:15:08 +04:30
const theme = isDarkTheme ? 'dark' : 'light' ;
2024-02-28 14:35:01 +03:30
document . querySelector ( 'body' ) . setAttribute ( 'class' , theme ) ;
2023-05-08 18:15:08 +04:30
return {
2024-04-20 22:15:36 +03:30
animationsOff ( ) {
document . documentElement . setAttribute ( 'data-theme-animations' , 'off' ) ;
const themeAnimations = document . querySelector ( '#change-theme' ) ;
themeAnimations . addEventListener ( 'mouseleave' , ( ) => {
document . documentElement . removeAttribute ( 'data-theme-animations' ) ;
} ) ;
themeAnimations . addEventListener ( 'touchend' , ( ) => {
document . documentElement . removeAttribute ( 'data-theme-animations' ) ;
} ) ;
} ,
animationsOffUltra ( ) {
document . documentElement . setAttribute ( 'data-theme-animations' , 'off' ) ;
const themeAnimationsUltra = document . querySelector ( '#change-theme-ultra' ) ;
themeAnimationsUltra . addEventListener ( 'mouseleave' , ( ) => {
document . documentElement . removeAttribute ( 'data-theme-animations' ) ;
} ) ;
themeAnimationsUltra . addEventListener ( 'touchend' , ( ) => {
document . documentElement . removeAttribute ( 'data-theme-animations' ) ;
} ) ;
} ,
2023-05-08 18:15:08 +04:30
isDarkTheme ,
2024-02-28 14:35:01 +03:30
isUltra ,
2023-05-08 18:15:08 +04:30
get currentTheme ( ) {
return this . isDarkTheme ? 'dark' : 'light' ;
} ,
toggleTheme ( ) {
this . isDarkTheme = ! this . isDarkTheme ;
localStorage . setItem ( 'dark-mode' , this . isDarkTheme ) ;
2024-02-28 14:35:01 +03:30
document . querySelector ( 'body' ) . setAttribute ( 'class' , this . isDarkTheme ? 'dark' : 'light' ) ;
2024-02-21 15:32:18 +03:30
document . getElementById ( 'message' ) . className = themeSwitcher . currentTheme ;
2023-05-08 18:15:08 +04:30
} ,
2024-02-28 14:35:01 +03:30
toggleUltra ( ) {
this . isUltra = ! this . isUltra ;
if ( this . isUltra ) {
document . documentElement . setAttribute ( 'data-theme' , 'ultra-dark' ) ;
} else {
document . documentElement . removeAttribute ( 'data-theme' ) ;
}
localStorage . setItem ( 'isUltraDarkThemeEnabled' , this . isUltra . toString ( ) ) ;
}
2023-05-08 18:15:08 +04:30
} ;
}
const themeSwitcher = createThemeSwitcher ( ) ;
Vue . component ( 'theme-switch' , {
props : [ ] ,
template : ` {{template "component/themeSwitchTemplate"}} ` ,
2024-02-28 14:35:01 +03:30
data : ( ) => ( {
themeSwitcher
} ) ,
2024-02-21 15:32:18 +03:30
mounted ( ) {
2024-02-28 14:35:01 +03:30
this . $message . config ( {
getContainer : ( ) => document . getElementById ( 'message' )
} ) ;
2024-02-21 15:32:18 +03:30
document . getElementById ( 'message' ) . className = themeSwitcher . currentTheme ;
2024-04-20 22:15:36 +03:30
}
} ) ;
Vue . component ( 'theme-switch-login' , {
props : [ ] ,
template : ` {{template "component/themeSwitchTemplateLogin"}} ` ,
data : ( ) => ( {
themeSwitcher
} ) ,
mounted ( ) {
this . $message . config ( {
getContainer : ( ) => document . getElementById ( 'message' )
2024-04-01 10:38:22 +03:30
} ) ;
2024-04-20 22:15:36 +03:30
document . getElementById ( 'message' ) . className = themeSwitcher . currentTheme ;
2024-02-21 15:32:18 +03:30
}
2023-05-08 18:15:08 +04:30
} ) ;
< / script >
2024-02-28 14:35:01 +03:30
{{end}}