picocss/docs/js/src/theme-switcher.js

107 lines
2.2 KiB
JavaScript
Raw Normal View History

2021-07-09 17:42:10 +07:00
/*
* Theme switcher
*
* Pico.css - https://picocss.com
* Copyright 2019-2021 - Licensed under MIT
*/
export const themeSwitcher = {
// Config
2021-07-09 18:18:39 +07:00
_scheme: 'auto',
change: {
2021-07-09 17:42:10 +07:00
light: '<i>Turn on dark mode</i>',
2021-10-24 12:33:20 +07:00
dark: '<i>Turn off dark mode</i>',
2021-07-09 17:42:10 +07:00
},
2021-07-09 18:18:39 +07:00
buttonsTarget: '.theme-switcher',
2021-07-09 17:42:10 +07:00
// Init
init() {
this.scheme = this._scheme;
this.initSwitchers();
},
// Prefered color scheme
get preferedColorScheme() {
2021-11-08 00:12:34 +07:00
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
return 'dark';
} else {
return 'light';
}
2021-07-09 17:42:10 +07:00
},
// Init switchers
initSwitchers() {
2021-07-09 18:18:39 +07:00
const buttons = document.querySelectorAll(this.buttonsTarget);
2021-11-08 00:12:34 +07:00
buttons.forEach(
function (button) {
button.addEventListener(
'click',
function (event) {
if (this.scheme == 'dark') {
this.scheme = 'light';
} else {
this.scheme = 'dark';
}
}.bind(this),
false
);
}.bind(this)
);
2021-07-09 17:42:10 +07:00
},
// Add new button
addButton(config) {
2021-11-08 00:12:34 +07:00
// Insert Switcher
2021-07-09 17:42:10 +07:00
let button = document.createElement(config.tag);
button.className = config.class;
document.querySelector(config.target).appendChild(button);
},
// Set scheme
set scheme(scheme) {
if (scheme == 'auto') {
2021-11-08 00:12:34 +07:00
if (this.preferedColorScheme == 'dark') {
this._scheme = 'dark';
} else {
this._scheme = 'light';
}
2021-07-09 17:42:10 +07:00
}
2021-11-08 00:12:34 +07:00
// Set to Dark
2021-07-09 17:42:10 +07:00
else if (scheme == 'dark' || scheme == 'light') {
this._scheme = scheme;
}
2021-11-08 00:12:34 +07:00
// Set to Apply theme
2021-07-09 17:42:10 +07:00
this.applyScheme();
},
2021-07-09 18:18:39 +07:00
// Get scheme
get scheme() {
return this._scheme;
},
2021-07-09 17:42:10 +07:00
// Apply scheme
applyScheme() {
2021-11-08 00:12:34 +07:00
// Root attribute
2021-07-09 18:18:39 +07:00
document.querySelector('html').setAttribute('data-theme', this.scheme);
2021-11-08 00:12:34 +07:00
// Buttons text
2021-07-09 18:18:39 +07:00
const buttons = document.querySelectorAll(this.buttonsTarget);
2021-11-08 00:12:34 +07:00
let text;
2021-10-24 12:33:20 +07:00
buttons.forEach(
2021-11-08 00:12:34 +07:00
function (button) {
if (this.scheme == 'dark') {
text = this.change.dark;
} else {
text = this.change.light;
}
2021-10-24 12:33:20 +07:00
button.innerHTML = text;
button.setAttribute('aria-label', text.replace(/<[^>]*>?/gm, ''));
2021-11-08 00:12:34 +07:00
}.bind(this)
2021-10-24 12:33:20 +07:00
);
},
};
2021-10-23 12:17:04 +07:00
2021-10-24 12:33:20 +07:00
export default themeSwitcher;