User:Monster Domosed/common.js: Difference between revisions

No edit summary
No edit summary
Line 1: Line 1:
(function () {
'use strict';
const CONFIG = {
cookieKey: 'mode',
toggleId: 'pt-theme-toggle'
};
// Sun = shown in dark mode (click to switch to light)
// Moon = shown in light mode (click to switch to dark)
const ICONS = {
sun: '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z" /></svg>',
moon: '<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z" /></svg>'
};
function getMode() {
return document.documentElement.getAttribute('data-mode') === 'light'
? 'light'
: 'dark';
}
function saveMode(mode) {
mw.cookie.set(CONFIG.cookieKey, mode, {
expires: 365 * 86400,
prefix: ''
});
}
function iconFor(mode) {
return mode === 'light' ? ICONS.moon : ICONS.sun;
}
function labelFor(mode) {
return mode === 'light'
? 'Switch to dark theme'
: 'Switch to light theme';
}
function apply(mode) {
document.documentElement.setAttribute('data-mode', mode);
const a = document.querySelector('#' + CONFIG.toggleId + ' a');
if (a) {
a.innerHTML = iconFor(mode);
a.setAttribute('aria-label', labelFor(mode));
a.title = labelFor(mode);
}
}
function setMode(mode) {
apply(mode);
saveMode(mode);
}
function toggleMode() {
setMode(getMode() === 'light' ? 'dark' : 'light');
}
function createToggle() {
const ul = document.querySelector('#p-personal ul');
if (!ul) {
setTimeout(createToggle, 300);
return;
}
if (document.getElementById(CONFIG.toggleId)) {
return;
}
const mode = getMode();
const li = document.createElement('li');
li.id = CONFIG.toggleId;
const a = document.createElement('a');
a.href = '#';
a.innerHTML = iconFor(mode);
a.setAttribute('aria-label', labelFor(mode));
a.title = labelFor(mode);
a.addEventListener('click', function (e) {
e.preventDefault();
toggleMode();
});
li.appendChild(a);
ul.insertBefore(li, ul.firstChild);
}
$(function () {
apply(getMode());
createToggle();
});
})();