new_site/assets/js/theme.js

102 lines
2.9 KiB
JavaScript

// Has to be in the head tag, otherwise a flicker effect will occur.
let toggleTheme = (theme) => {
if (theme == "dark") {
setTheme("light");
} else {
setTheme("dark");
}
};
let setTheme = (theme) => {
transTheme();
setHighlight(theme);
setGiscusTheme(theme);
if (theme) {
document.documentElement.setAttribute("data-theme", theme);
// Add class to tables.
let tables = document.getElementsByTagName("table");
for (let i = 0; i < tables.length; i++) {
if (theme == "dark") {
tables[i].classList.add("table-dark");
} else {
tables[i].classList.remove("table-dark");
}
}
// Set jupyter notebooks themes.
let jupyterNotebooks = document.getElementsByClassName("jupyter-notebook-iframe-container");
for (let i = 0; i < jupyterNotebooks.length; i++) {
let bodyElement = jupyterNotebooks[i].getElementsByTagName("iframe")[0].contentWindow.document.body;
if (theme == "dark") {
bodyElement.setAttribute("data-jp-theme-light", "false");
bodyElement.setAttribute("data-jp-theme-name", "JupyterLab Dark");
} else {
bodyElement.setAttribute("data-jp-theme-light", "true");
bodyElement.setAttribute("data-jp-theme-name", "JupyterLab Light");
}
}
} else {
document.documentElement.removeAttribute("data-theme");
}
localStorage.setItem("theme", theme);
// Updates the background of medium-zoom overlay.
if (typeof medium_zoom !== "undefined") {
medium_zoom.update({
background:
getComputedStyle(document.documentElement).getPropertyValue(
"--global-bg-color"
) + "ee", // + 'ee' for trasparency.
});
}
};
let setHighlight = (theme) => {
if (theme == "dark") {
document.getElementById("highlight_theme_light").media = "none";
document.getElementById("highlight_theme_dark").media = "";
} else {
document.getElementById("highlight_theme_dark").media = "none";
document.getElementById("highlight_theme_light").media = "";
}
};
let setGiscusTheme = (theme) => {
function sendMessage(message) {
const iframe = document.querySelector("iframe.giscus-frame");
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, "https://giscus.app");
}
sendMessage({
setConfig: {
theme: theme,
},
});
};
let transTheme = () => {
document.documentElement.classList.add("transition");
window.setTimeout(() => {
document.documentElement.classList.remove("transition");
}, 500);
};
let initTheme = (theme) => {
if (theme == null || theme == "null") {
const userPref = window.matchMedia;
if (userPref && userPref("(prefers-color-scheme: dark)").matches) {
theme = "dark";
}
}
setTheme(theme);
};
initTheme(localStorage.getItem("theme"));