website-risg/templates/app.js
Marie Birner f3919f5369
All checks were successful
CI/CD Pipeline / deploy-main (push) Successful in 6m53s
[TASK] add theme toggler in footer
2024-02-19 18:11:02 +01:00

72 lines
1.9 KiB
JavaScript

document.addEventListener('DOMContentLoaded', function() {
changeTheme();
initcolorTheme();
});
function changeTheme() {
let toggleBtn = document.querySelector('#theme-toggle-js');
if(toggleBtn) {
toggleBtn.addEventListener('click', function() {
if(toggleBtn.dataset.theme === 'light') {
setTheme('dark', true);
} else {
setTheme('light', true);
}
});
}
}
/***
* init javascript
* 1) detect native color scheme or use set theme in local storage
* 2) detect view (desktop or responsive) if on mobile device with touch screen
* 3) set base font size to 112.5% -> 18px
*/
function initcolorTheme() {
colorThemeWatcher();
let theme = localStorage.getItem('theme');
if (theme == null || theme === 'auto') {
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
setTheme('dark', false);
} else {
setTheme('light', false);
}
} else {
setTheme(theme)
}
}
/***
* Listener operating system native color configuration
*/
function colorThemeWatcher() {
try {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
setTheme(e.matches ? 'dark' : 'light');
});
} catch {
console.warn('color theme watcher not supported');
}
}
/**
* Define color scheme, colors without losing the base font size configuration
* and add data-theme to html tag
* @param theme
*/
function setTheme(theme, setLocalStorage = true) {
let toggleBtn = document.querySelector('#theme-toggle-js');
if (setLocalStorage) {
localStorage.setItem('theme', theme);
}
if (toggleBtn) toggleBtn.setAttribute('data-theme', theme);
if (document.documentElement.dataset.theme === 'dark' && theme === 'light') {
document.documentElement.dataset.theme = 'light';
} else if(document.documentElement.dataset.theme === 'light' && theme === 'dark'){
document.documentElement.dataset.theme = 'dark';
}
}