Files
hinode/assets/js/critical/color.js

76 lines
2.3 KiB
JavaScript

{{- if site.Params.main.enableDarkMode -}}
/*!
* Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors
* Licensed under the Creative Commons Attribution 3.0 Unported License.
*/
(() => {
'use strict'
const supportedThemes = ['auto', 'dark', 'light'];
// retrieves the currently stored theme from local storage
const storedTheme = getLocalStorage('theme', 'auto', 'functional')
// retrieves the theme preferred by the client, defaults to light
function getPreferredTheme() {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
}
// retrieves the current theme, either from local storage or client's preferences
function getTheme() {
if (storedTheme) {
return storedTheme
} else {
const preference = getPreferredTheme()
setLocalStorage('theme', preference, 'functional')
return preference
}
}
// applies and stores requested theme
function setTheme(theme) {
if (!supportedThemes.includes(theme)) {
theme = 'auto'
}
setLocalStorage('theme', theme, 'functional')
if (theme === 'auto') {
document.documentElement.setAttribute('data-bs-theme', (getPreferredTheme()))
} else {
document.documentElement.setAttribute('data-bs-theme', theme)
}
document.querySelectorAll('.navbar-mode-selector').forEach(chk => {
chk.checked = (document.documentElement.getAttribute('data-bs-theme') === 'light')
})
}
// alternates the currently active theme
function toggleTheme() {
const target = document.documentElement.getAttribute('data-bs-theme') === 'dark' ? 'light' : 'dark'
setTheme(target)
}
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
if (storedTheme !== 'light' || storedTheme !== 'dark') {
setTheme(getPreferredTheme())
}
})
window.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.navbar-mode-selector').forEach(chk => {
chk.addEventListener('change', function () {
document.documentElement.setAttribute('data-bs-theme-animate', 'true')
toggleTheme()
})
})
})
// initialize theme directly when script is invoked
setTheme(getTheme())
})()
{{- end -}}