93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
document.addEventListener('DOMContentLoaded', function() {
|
|
changeTheme();
|
|
initcolorTheme();
|
|
apply_stickies()
|
|
});
|
|
|
|
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';
|
|
}
|
|
}
|
|
|
|
window.addEventListener('scroll', function() {
|
|
apply_stickies()
|
|
})
|
|
|
|
function apply_stickies() {
|
|
var _$stickies = [].slice.call(document.querySelectorAll('.sticky'))
|
|
_$stickies.forEach(function(_$sticky) {
|
|
if (CSS.supports && CSS.supports('position', 'sticky')) {
|
|
apply_sticky_class(_$sticky)
|
|
}
|
|
})
|
|
}
|
|
|
|
function apply_sticky_class(_$sticky) {
|
|
var currentOffset = _$sticky.getBoundingClientRect().top
|
|
var stickyOffset = parseInt(getComputedStyle(_$sticky).top.replace('px', ''))
|
|
var isStuck = currentOffset <= stickyOffset
|
|
|
|
_$sticky.classList.toggle('js-is-sticky', isStuck)
|
|
} |