174 lines
6.0 KiB
JavaScript
174 lines
6.0 KiB
JavaScript
// This is the skin's only javascript file. If you want to add more JS files, you need to include them in skin.json's ResourceModules section, the way this one is.
|
|
|
|
// This all is for the color scheme toggle. Javascript is only truly necessary for the user's choice to persist. Without the toggle, the CSS will still respect the browser-level preference.
|
|
function getPreferredColorScheme(){
|
|
let systemScheme = 'light';
|
|
|
|
if (window.matchMedia('(prefers-color-scheme: dark)').matches){
|
|
systemScheme = 'dark';
|
|
}
|
|
|
|
let chosenScheme = systemScheme;
|
|
|
|
if (localStorage.getItem('scheme')) {
|
|
chosenScheme = localStorage.getItem('scheme');
|
|
}
|
|
|
|
if (systemScheme === chosenScheme) {
|
|
localStorage.removeItem('scheme')
|
|
}
|
|
|
|
return chosenScheme;
|
|
}
|
|
|
|
function savePreferredColorScheme(scheme) {
|
|
let systemScheme = 'light';
|
|
|
|
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
|
systemScheme = 'dark';
|
|
};
|
|
|
|
if (systemScheme === scheme) {
|
|
localStorage.removeItem('scheme');
|
|
} else {
|
|
localStorage.setItem('scheme', scheme);
|
|
};
|
|
}
|
|
|
|
function toggleColorScheme() {
|
|
let newScheme = 'light';
|
|
|
|
let scheme = getPreferredColorScheme();
|
|
|
|
if (scheme === 'light') {
|
|
newScheme = 'dark';
|
|
}
|
|
|
|
applyPreferredColorScheme(newScheme);
|
|
savePreferredColorScheme(newScheme);
|
|
|
|
}
|
|
|
|
function applyPreferredColorScheme(scheme) {
|
|
for (var s = 0; s < document.styleSheets.length; s++) {
|
|
|
|
for (var i = 0; i < document.styleSheets[s].cssRules.length; i++) {
|
|
rule = document.styleSheets[s].cssRules[i];
|
|
|
|
if (rule && rule.media && rule.media.mediaText.includes("prefers-color-scheme")) {
|
|
|
|
switch (scheme) {
|
|
case "light":
|
|
rule.media.appendMedium("original-prefers-color-scheme");
|
|
if (rule.media.mediaText.includes("light")) rule.media.deleteMedium("(prefers-color-scheme: light)");
|
|
if (rule.media.mediaText.includes("dark")) rule.media.deleteMedium("(prefers-color-scheme: dark)");
|
|
break;
|
|
case "dark":
|
|
rule.media.appendMedium("(prefers-color-scheme: light)");
|
|
rule.media.appendMedium("(prefers-color-scheme: dark)");
|
|
if (rule.media.mediaText.includes("original")) rule.media.deleteMedium("original-prefers-color-scheme");
|
|
break;
|
|
default:
|
|
rule.media.appendMedium("(prefers-color-scheme: dark)");
|
|
if (rule.media.mediaText.includes("light")) rule.media.deleteMedium("(prefers-color-scheme: light)");
|
|
if (rule.media.mediaText.includes("original")) rule.media.deleteMedium("original-prefers-color-scheme");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if (scheme === "dark") {
|
|
document.getElementById("toggle-to-light").style.display = 'block';
|
|
document.getElementById("toggle-to-dark").style.display = 'none';
|
|
} else {
|
|
document.getElementById("toggle-to-dark").style.display = 'block';
|
|
document.getElementById("toggle-to-light").style.display = 'none';
|
|
}
|
|
}
|
|
|
|
// applyPreferredColorScheme(getPreferredColorScheme());
|
|
|
|
const toggles = document.getElementsByClassName('color-scheme-toggle');
|
|
for (const toggle of toggles) {
|
|
toggle.addEventListener('click', toggleColorScheme);
|
|
};
|
|
|
|
|
|
// This toggles the version-specific information on pages that use it.
|
|
|
|
// function toggleVersion(version) {
|
|
// if (document.getElementById("current-version")) {
|
|
// document.getElementById("current-version").remove()
|
|
// }
|
|
|
|
// if (version.target) {
|
|
// var id = version.target.id.replace("mw-indicator-", "");
|
|
// } else {
|
|
// var id = version.firstElementChild.id.replace("mw-indicator-", "");
|
|
// }
|
|
|
|
// const vdiff = ".vdiff-" + id;
|
|
// const rule = vdiff + " { display: block; }";
|
|
// const style = document.createElement( 'style' );
|
|
// style.id = "current-version";
|
|
// document.head.appendChild(style);
|
|
// style.sheet.insertRule(rule);
|
|
// }
|
|
|
|
// const versions = document.getElementById('page-title-versions').children;
|
|
// for (const version of versions) {
|
|
// version.addEventListener('change', toggleVersion);
|
|
// }
|
|
|
|
// function loadVersion () {
|
|
// const defaultversion =
|
|
// defaultversion.firstElementChild.checked = true;
|
|
// toggleVersion(defaultversion);
|
|
// }
|
|
|
|
// if (document.getElementById('page-title-versions').firstElementChild) {
|
|
// loadVersion()
|
|
// }
|
|
|
|
function loadVersion() {
|
|
const toggles = document.getElementsByClassName('mw-indicator');
|
|
for (const toggle of toggles) {
|
|
if (toggle.checked = true) {
|
|
return
|
|
}
|
|
}
|
|
toggles[0].checked = true;
|
|
}
|
|
|
|
if (document.getElementById('page-title-versions').firstElementChild) {
|
|
loadVersion()
|
|
}
|
|
|
|
// The wrapper function is needed to make sure all of the mediawiki JS is loaded before the page's is, and load relevant parts for use here.
|
|
mw.loader.using( [
|
|
'mediawiki.jqueryMsg'
|
|
] ).then( () => {
|
|
|
|
// This gets the user's current username, and puts it the user menu button.
|
|
const username = mw.user.getName();
|
|
const buttons = document.getElementsByClassName('site-header-user');
|
|
for (const button of buttons) {
|
|
if (username) {
|
|
button.firstElementChild.textContent = username;
|
|
} else {
|
|
button.firstElementChild.textContent = mw.message( 'login' ).text();
|
|
}
|
|
}
|
|
|
|
// This replaces the text of the print link with the current 'print' system message.
|
|
const print = document.getElementById('page-action-print').children[0];
|
|
print.textContent = mw.message( 'print' ).text();
|
|
|
|
if (document.getElementById('site-nav-toc')) {
|
|
const toctitle = document.getElementById('site-nav-toc').children[0];
|
|
toctitle.textContent = mw.message( 'toc' ).text();
|
|
}
|
|
}
|
|
) |