mirror of
https://github.com/13hannes11/hugo-coder-timeline.git
synced 2024-09-04 00:50:58 +02:00
By setting the color-scheme property of the :root element we get matching (dark or light) scrollbars and form controls. see: https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme
42 lines
1.5 KiB
JavaScript
42 lines
1.5 KiB
JavaScript
const body = document.body;
|
|
const darkModeToggle = document.getElementById('dark-mode-toggle');
|
|
const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
|
|
// Check if user preference is set, if not check value of body class for light or dark else it means that colorscheme = auto
|
|
if (localStorage.getItem("colorscheme")) {
|
|
setTheme(localStorage.getItem("colorscheme"));
|
|
} else if (body.classList.contains('colorscheme-light') || body.classList.contains('colorscheme-dark')) {
|
|
setTheme(body.classList.contains("colorscheme-dark") ? "dark" : "light");
|
|
} else {
|
|
setTheme(darkModeMediaQuery.matches ? "dark" : "light");
|
|
}
|
|
|
|
if (darkModeToggle) {
|
|
darkModeToggle.addEventListener('click', () => {
|
|
let theme = body.classList.contains("colorscheme-dark") ? "light" : "dark";
|
|
setTheme(theme);
|
|
rememberTheme(theme);
|
|
});
|
|
}
|
|
|
|
darkModeMediaQuery.addListener((event) => {
|
|
setTheme(event.matches ? "dark" : "light");
|
|
});
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
let node = document.querySelector('.preload-transitions');
|
|
node.classList.remove('preload-transitions');
|
|
});
|
|
|
|
function setTheme(theme) {
|
|
body.classList.remove('colorscheme-auto');
|
|
let inverse = theme === 'dark' ? 'light' : 'dark';
|
|
body.classList.remove('colorscheme-' + inverse);
|
|
body.classList.add('colorscheme-' + theme);
|
|
document.documentElement.style['color-scheme'] = theme;
|
|
}
|
|
|
|
function rememberTheme(theme) {
|
|
localStorage.setItem('colorscheme', theme);
|
|
}
|