Skip to content

Commit d3d41aa

Browse files
author
reco_luan
committed
Merge branch 'develop' of github.com:recoluan/vuepress-theme-reco into develop
2 parents 04696fa + 096ef43 commit d3d41aa

File tree

6 files changed

+75
-66
lines changed

6 files changed

+75
-66
lines changed

packages/vuepress-theme-reco/components/Footer.vue

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
<a>
1414
<span v-if="$themeConfig.author || $site.title">{{ $themeConfig.author || $site.title }}</span>
1515
&nbsp;&nbsp;
16-
<span v-if="$themeConfig.startYear && $themeConfig.startYear != year">{{ $themeConfig.startYear }} - </span>
17-
{{ year }}
16+
<span v-if="$themeConfig.startYear && $themeConfig.startYear != (new Date().getFullYear())">{{ $themeConfig.startYear }} - </span>
17+
{{ new Date().getFullYear() }}
1818
</a>
1919
</span>
2020
<span v-show="$themeConfig.valineConfig !== undefined">
@@ -35,11 +35,6 @@ export default {
3535
return {
3636
version
3737
}
38-
},
39-
computed: {
40-
year () {
41-
return new Date().getFullYear()
42-
}
4338
}
4439
}
4540
</script>

packages/vuepress-theme-reco/components/Mode/ModePicker.vue

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
</template>
1414

1515
<script>
16-
import setMode from './setMode'
16+
import applyMode from './applyMode'
1717
export default {
1818
name: 'ModeOptions',
1919
@@ -29,18 +29,27 @@ export default {
2929
},
3030
3131
mounted () {
32-
const mode = localStorage.getItem('mode')
33-
const { mode: customMode, modePicker } = this.$themeConfig
34-
const themeMode = customMode || 'auto'
35-
this.currentMode = modePicker === false ? themeMode : mode || themeMode
36-
setMode(this.currentMode)
32+
// modePicker 开启时默认使用用户主动设置的模式
33+
this.currentMode = localStorage.getItem('mode') || this.$themeConfig.mode || 'auto'
34+
35+
// Dark and Light autoswitches
36+
// 为了避免在 server-side 被执行,故在 Vue 组件中设置监听器
37+
var that = this
38+
window.matchMedia('(prefers-color-scheme: dark)').addListener(() => {
39+
that.$data.currentMode === 'auto' && applyMode(that.$data.currentMode)
40+
})
41+
window.matchMedia('(prefers-color-scheme: light)').addListener(() => {
42+
that.$data.currentMode === 'auto' && applyMode(that.$data.currentMode)
43+
})
44+
45+
applyMode(this.currentMode)
3746
},
3847
3948
methods: {
4049
selectMode (mode) {
4150
if (mode !== this.currentMode) {
4251
this.currentMode = mode
43-
setMode(mode)
52+
applyMode(mode)
4453
localStorage.setItem('mode', mode)
4554
}
4655
},
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import modeOptions from './modeOptions'
2+
3+
function render (mode) {
4+
const rootElement = document.querySelector(':root')
5+
const options = modeOptions[mode]
6+
7+
for (const k in options) {
8+
rootElement.style.setProperty(k, options[k])
9+
}
10+
}
11+
12+
/**
13+
* Sets a color scheme for the website.
14+
* If browser supports "prefers-color-scheme", 'auto' mode will respect the setting for light or dark mode
15+
* otherwise it will set a dark theme during night time
16+
*/
17+
export default function applyMode (mode) {
18+
if (mode !== 'auto') {
19+
render(mode)
20+
return
21+
}
22+
23+
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
24+
const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
25+
26+
if (isDarkMode) render('dark')
27+
if (isLightMode) render('light')
28+
29+
if (!isDarkMode && !isLightMode) {
30+
console.log('You specified no preference for a color scheme or your browser does not support it. I schedule dark mode during night time.')
31+
const hour = new Date().getHours()
32+
if (hour < 6 || hour >= 18) render('dark')
33+
else render('light')
34+
}
35+
}

packages/vuepress-theme-reco/components/Mode/index.vue

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div v-click-outside="hideMenu" class="color-picker">
2+
<div v-click-outside="hideMenu" class="color-picker" v-if="$themeConfig.modePicker !== false" >
33
<a class="color-button" @click.prevent="showMenu = !showMenu">
44
<i class="iconfont reco-color"></i>
55
</a>
@@ -14,6 +14,7 @@
1414
<script>
1515
import ClickOutside from 'vue-click-outside'
1616
import ModePicker from './ModePicker'
17+
import applyMode from './applyMode'
1718
1819
export default {
1920
name: 'UserSettings',
@@ -32,6 +33,25 @@ export default {
3233
}
3334
},
3435
36+
// 为了在保证 modePicker 在 SSR 中正确开关,并实现管理,Mode 组件将负责 modePicker 关闭的情况
37+
mounted () {
38+
// modePicker 关闭时默认使用主题设置的模式
39+
const themeMode = this.$themeConfig.mode || 'auto'
40+
const { modePicker } = this.$themeConfig
41+
if (modePicker === false) {
42+
// 为 'auto' 模式设置监听器
43+
if (themeMode === 'auto') {
44+
window.matchMedia('(prefers-color-scheme: dark)').addListener(() => {
45+
applyMode(themeMode)
46+
})
47+
window.matchMedia('(prefers-color-scheme: light)').addListener(() => {
48+
applyMode(themeMode)
49+
})
50+
}
51+
applyMode(themeMode)
52+
}
53+
},
54+
3555
methods: {
3656
hideMenu () {
3757
this.showMenu = false

packages/vuepress-theme-reco/components/Mode/setMode.js

Lines changed: 0 additions & 50 deletions
This file was deleted.

packages/vuepress-theme-reco/components/Navbar.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
'max-width': linksWrapMaxWidth + 'px'
2323
} : {}">
2424

25-
<Mode v-show="$themeConfig.modePicker !== false" />
25+
<Mode />
2626
<AlgoliaSearchBox
2727
v-if="isAlgoliaSearch"
2828
:options="algolia"/>

0 commit comments

Comments
 (0)