Skip to content

Commit e720eab

Browse files
committed
Fix color scheme changing flicker
1 parent 4e359c6 commit e720eab

6 files changed

Lines changed: 48 additions & 44 deletions

File tree

.changeset/large-adults-grow.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'hexo-theme-cupertino': patch
3+
---
4+
5+
Fix the flicker after page load when color scheme is different from default.

layout/_partial/head.ejs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,6 @@
103103
<link rel="stylesheet" href="<%- getCdnUrl('@waline/client', 'v2', 'dist/waline.css') %>" />
104104
<% } %>
105105

106-
<script>var ThemeCupertino = {}</script>
106+
<%- js('js/head.js') %>
107107
<%- theme.insertions.head.ending %>
108108
</head>

layout/layout.ejs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
data-scroll-reveal-query="<%= theme.scroll_reveal_query %>"
2424
<% } %>
2525
>
26+
<%- js('js/body-top.js') %>
2627
<a href="#main-content" id="skip-to-content"><%- __('skip_to_content') %></a>
2728
<%- partial('_partial/nav') %>
2829
<main id="main-content">

source/js/body-top.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
document.body.dataset.colorScheme = ThemeCupertino.ColorScheme.get()
2+
ThemeCupertino.ColorScheme.updateCurrent()

source/js/head.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
window.ThemeCupertino = {}
2+
3+
ThemeCupertino['ColorScheme'] = new (class {
4+
constructor() {
5+
window
6+
.matchMedia('(prefers-color-scheme: dark)')
7+
.addEventListener('change', () => {
8+
this.updateCurrent(localStorage.getItem('color-scheme') ?? 'auto')
9+
})
10+
}
11+
get() {
12+
const stored = localStorage.getItem('color-scheme') ?? 'auto'
13+
this.updateCurrent(stored)
14+
return stored
15+
}
16+
set(value) {
17+
document.body.dataset.colorScheme = value
18+
try {
19+
localStorage.setItem('color-scheme', value)
20+
} catch (err) {
21+
console.error(err)
22+
}
23+
this.updateCurrent(value)
24+
return value
25+
}
26+
updateCurrent(value) {
27+
var current = 'light'
28+
if (value == 'auto') {
29+
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
30+
current = 'dark'
31+
}
32+
} else {
33+
current = value
34+
}
35+
document.body.dataset.currentColorScheme = current
36+
}
37+
})()

source/js/main.js

Lines changed: 2 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -33,60 +33,19 @@
3333
}
3434
})
3535

36-
const ColorScheme = new (class {
37-
constructor() {
38-
window
39-
.matchMedia('(prefers-color-scheme: dark)')
40-
.addEventListener('change', () => {
41-
this.updateCurrent(localStorage.getItem('color-scheme') ?? 'auto')
42-
})
43-
}
44-
get() {
45-
const stored = localStorage.getItem('color-scheme') ?? 'auto'
46-
this.updateCurrent(stored)
47-
return stored
48-
}
49-
set(value) {
50-
bodyEl.setAttribute('data-color-scheme', value)
51-
try {
52-
localStorage.setItem('color-scheme', value)
53-
} catch (err) {
54-
console.error(err)
55-
}
56-
this.updateCurrent(value)
57-
return value
58-
}
59-
updateCurrent(value) {
60-
var current = 'light'
61-
if (value == 'auto') {
62-
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
63-
current = 'dark'
64-
}
65-
} else {
66-
current = value
67-
}
68-
document.body.setAttribute('data-current-color-scheme', current)
69-
}
70-
})()
71-
7236
if (document.getElementById('theme-color-scheme-toggle')) {
73-
var bodyEl = document.body
7437
var themeColorSchemeToggleEl = document.getElementById(
7538
'theme-color-scheme-toggle',
7639
)
7740
var options = themeColorSchemeToggleEl.getElementsByTagName('input')
7841

79-
if (ColorScheme.get()) {
80-
bodyEl.setAttribute('data-color-scheme', ColorScheme.get())
81-
}
82-
8342
for (const option of options) {
84-
if (option.value == bodyEl.getAttribute('data-color-scheme')) {
43+
if (option.value == document.body.dataset.colorScheme) {
8544
option.checked = true
8645
}
8746
option.addEventListener('change', ev => {
8847
var value = ev.target.value
89-
ColorScheme.set(value)
48+
ThemeCupertino.ColorScheme.set(value)
9049
for (const o of options) {
9150
if (o.value != value) {
9251
o.checked = false

0 commit comments

Comments
 (0)