115 lines
2.3 KiB
Vue
115 lines
2.3 KiB
Vue
<template>
|
||
<div v-click-outside="hideMenu" class="color-picker" v-if="$themeConfig.modePicker !== false" >
|
||
<a class="color-button" @click.prevent="showMenu = !showMenu">
|
||
<i class="iconfont reco-color"></i>
|
||
</a>
|
||
<transition name="menu-transition" mode="out-in">
|
||
<div v-show="showMenu" class="color-picker-menu">
|
||
<ModePicker />
|
||
</div>
|
||
</transition>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import ClickOutside from 'vue-click-outside'
|
||
import ModePicker from './ModePicker'
|
||
import applyMode from './applyMode'
|
||
|
||
export default {
|
||
name: 'UserSettings',
|
||
|
||
directives: {
|
||
'click-outside': ClickOutside
|
||
},
|
||
|
||
components: {
|
||
ModePicker
|
||
},
|
||
|
||
data () {
|
||
return {
|
||
showMenu: false
|
||
}
|
||
},
|
||
|
||
// 为了在保证 modePicker 在 SSR 中正确开关,并实现管理,Mode 组件将负责 modePicker 关闭的情况
|
||
mounted () {
|
||
// modePicker 关闭时默认使用主题设置的模式
|
||
const themeMode = this.$themeConfig.mode || 'auto'
|
||
const { modePicker } = this.$themeConfig
|
||
if (modePicker === false) {
|
||
// 为 'auto' 模式设置监听器
|
||
if (themeMode === 'auto') {
|
||
window.matchMedia('(prefers-color-scheme: dark)').addListener(() => {
|
||
applyMode(themeMode)
|
||
})
|
||
window.matchMedia('(prefers-color-scheme: light)').addListener(() => {
|
||
applyMode(themeMode)
|
||
})
|
||
}
|
||
applyMode(themeMode)
|
||
}
|
||
},
|
||
|
||
methods: {
|
||
hideMenu () {
|
||
this.showMenu = false
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="stylus">
|
||
@require '../../styles/mode.styl'
|
||
|
||
.color-picker {
|
||
position: relative;
|
||
margin-right: 1em;
|
||
cursor pointer;
|
||
.color-button {
|
||
align-items: center;
|
||
height: 100%;
|
||
.iconfont {
|
||
font-size 1.4rem
|
||
color: $accentColor
|
||
}
|
||
}
|
||
|
||
.color-picker-menu {
|
||
position: absolute;
|
||
top: 40px;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
z-index: 150;
|
||
&.menu-transition-enter-active,
|
||
&.menu-transition-leave-active {
|
||
transition: all 0.25s ease-in-out;
|
||
}
|
||
&.menu-transition-enter,
|
||
&.menu-transition-leave-to {
|
||
top: 50px;
|
||
opacity: 0;
|
||
}
|
||
|
||
ul {
|
||
list-style-type: none;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
@media (max-width: $MQMobile) {
|
||
.color-picker {
|
||
margin-right: 1rem;
|
||
.color-picker-menu {
|
||
left: calc(50% - 35px);
|
||
&::before {
|
||
left: calc(50% + 35px);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
</style>
|