hexo-theme-stellar/layout/_partial/scripts/theme.ejs

63 lines
1.7 KiB
Plaintext
Raw Permalink Normal View History

<script type="text/javascript">
const applyTheme = (theme) => {
if (theme === 'auto') {
document.documentElement.removeAttribute('data-theme')
} else {
document.documentElement.setAttribute('data-theme', theme)
}
applyThemeToGiscus(theme)
}
const applyThemeToGiscus = (theme) => {
theme = theme === 'auto' ? 'preferred_color_scheme' : theme
const cmt = document.getElementById('giscus')
if (cmt) {
// This works before giscus load.
cmt.setAttribute('data-theme', theme)
}
const iframe = document.querySelector('#comments > section.giscus > iframe')
if (iframe) {
// This works after giscus loaded.
const src = iframe.src
const newSrc = src.replace(/theme=[\w]+/, `theme=${theme}`)
iframe.src = newSrc
}
}
const switchTheme = () => {
// light -> dark -> auto -> light -> ...
const currentTheme = document.documentElement.getAttribute('data-theme')
let newTheme;
switch (currentTheme) {
case 'light':
newTheme = 'dark'
break
case 'dark':
newTheme = 'auto'
break
default:
newTheme = 'light'
}
applyTheme(newTheme)
window.localStorage.setItem('Stellar.theme', newTheme)
const messages = {
light: `<%- __('message.theme_switched.light') %>`,
dark: `<%- __('message.theme_switched.dark') %>`,
auto: `<%- __('message.theme_switched.auto') %>`,
}
hud?.toast?.(messages[newTheme])
}
(() => {
// Apply user's preferred theme, if any.
const theme = window.localStorage.getItem('Stellar.theme')
if (theme !== null) {
applyTheme(theme)
}
})()
</script>