mirror of
https://github.com/nunocoracao/blowfish.git
synced 2026-10-24 12:45:25 +00:00
Dynamically update the appearance switcher accessibility labels and tooltips using the native i18n variables so that the UI correctly reflects the user's localized language instead of hardcoded English strings.
168 lines
5.3 KiB
JavaScript
168 lines
5.3 KiB
JavaScript
const sitePreference = document.documentElement.getAttribute("data-default-appearance");
|
|
const userPreference = localStorage.getItem("appearance");
|
|
|
|
if ((sitePreference === "dark" && userPreference === null) || userPreference === "dark") {
|
|
document.documentElement.classList.add("dark");
|
|
}
|
|
|
|
if (document.documentElement.getAttribute("data-auto-appearance") === "true") {
|
|
if (
|
|
window.matchMedia &&
|
|
window.matchMedia("(prefers-color-scheme: dark)").matches &&
|
|
userPreference !== "light"
|
|
) {
|
|
document.documentElement.classList.add("dark");
|
|
}
|
|
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", (event) => {
|
|
if (event.matches) {
|
|
document.documentElement.classList.add("dark");
|
|
} else {
|
|
document.documentElement.classList.remove("dark");
|
|
}
|
|
});
|
|
}
|
|
|
|
// Mermaid dark mode support
|
|
var updateMermaidTheme = () => {
|
|
if (typeof mermaid !== 'undefined') {
|
|
const isDark = document.documentElement.classList.contains("dark");
|
|
|
|
const mermaids = document.querySelectorAll('pre.mermaid');
|
|
mermaids.forEach(e => {
|
|
if (e.getAttribute('data-processed')) {
|
|
// Already rendered, clean the processed attributes
|
|
e.removeAttribute('data-processed');
|
|
// Replace the rendered HTML with the stored text
|
|
e.innerHTML = e.getAttribute('data-graph');
|
|
} else {
|
|
// First time, store the text
|
|
e.setAttribute('data-graph', e.textContent);
|
|
}
|
|
});
|
|
|
|
if (isDark) {
|
|
initMermaidDark();
|
|
mermaid.run();
|
|
} else {
|
|
initMermaidLight();
|
|
mermaid.run();
|
|
}
|
|
}
|
|
}
|
|
|
|
window.addEventListener("DOMContentLoaded", (event) => {
|
|
const switcher = document.getElementById("appearance-switcher");
|
|
const switcherMobile = document.getElementById("appearance-switcher-mobile");
|
|
|
|
// Load the i18n translations for the tooltips
|
|
const darkLabel = '{{ i18n "footer.dark_appearance" }}';
|
|
const lightLabel = '{{ i18n "footer.light_appearance" }}';
|
|
|
|
updateMeta();
|
|
this.updateLogo?.(getTargetAppearance());
|
|
|
|
// Initialize mermaid theme on page load
|
|
updateMermaidTheme();
|
|
|
|
// Helper to update the tooltip depending on the current mode
|
|
const updateTooltip = (targetAppearance) => {
|
|
// If target is dark, the next action will be switching to light
|
|
const label = targetAppearance === "dark" ? lightLabel : darkLabel;
|
|
if (switcher) {
|
|
switcher.setAttribute("aria-label", label);
|
|
switcher.setAttribute("title", label);
|
|
}
|
|
if (switcherMobile) {
|
|
switcherMobile.setAttribute("aria-label", label);
|
|
switcherMobile.setAttribute("title", label);
|
|
}
|
|
};
|
|
|
|
// Set initial tooltip on load
|
|
updateTooltip(getTargetAppearance());
|
|
|
|
if (switcher) {
|
|
switcher.addEventListener("click", () => {
|
|
document.documentElement.classList.toggle("dark");
|
|
var targetAppearance = getTargetAppearance();
|
|
localStorage.setItem(
|
|
"appearance",
|
|
targetAppearance
|
|
);
|
|
updateMeta();
|
|
updateMermaidTheme();
|
|
updateTooltip(targetAppearance);
|
|
this.updateLogo?.(targetAppearance);
|
|
});
|
|
switcher.addEventListener("contextmenu", (event) => {
|
|
event.preventDefault();
|
|
localStorage.removeItem("appearance");
|
|
});
|
|
}
|
|
if (switcherMobile) {
|
|
switcherMobile.addEventListener("click", () => {
|
|
document.documentElement.classList.toggle("dark");
|
|
var targetAppearance = getTargetAppearance();
|
|
localStorage.setItem(
|
|
"appearance",
|
|
targetAppearance
|
|
);
|
|
updateMeta();
|
|
updateMermaidTheme();
|
|
updateTooltip(targetAppearance);
|
|
this.updateLogo?.(targetAppearance);
|
|
});
|
|
switcherMobile.addEventListener("contextmenu", (event) => {
|
|
event.preventDefault();
|
|
localStorage.removeItem("appearance");
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
var updateMeta = () => {
|
|
var elem, style;
|
|
elem = document.querySelector('body');
|
|
style = getComputedStyle(elem);
|
|
document.querySelector('meta[name="theme-color"]').setAttribute('content', style.backgroundColor);
|
|
}
|
|
|
|
{{ if and (.Site.Params.Logo) (.Site.Params.SecondaryLogo) }}
|
|
{{ $primaryLogo := resources.Get .Site.Params.Logo }}
|
|
{{ $secondaryLogo := resources.Get .Site.Params.SecondaryLogo }}
|
|
{{ if and ($primaryLogo) ($secondaryLogo) }}
|
|
var updateLogo = (targetAppearance) => {
|
|
var imgElems = document.querySelectorAll("img.logo");
|
|
var logoContainers = document.querySelectorAll("span.logo");
|
|
|
|
targetLogoPath =
|
|
targetAppearance == "{{ .Site.Params.DefaultAppearance }}" ?
|
|
"{{ $primaryLogo.RelPermalink }}" : "{{ $secondaryLogo.RelPermalink }}"
|
|
for (const elem of imgElems) {
|
|
elem.setAttribute("src", targetLogoPath)
|
|
}
|
|
|
|
{{ if eq $primaryLogo.MediaType.SubType "svg" }}
|
|
targetContent =
|
|
targetAppearance == "{{ .Site.Params.DefaultAppearance }}" ?
|
|
`{{ $primaryLogo.Content | safeHTML }}` : `{{ $secondaryLogo.Content | safeHTML }}`
|
|
for (const container of logoContainers) {
|
|
container.innerHTML = targetContent;
|
|
}
|
|
{{ end }}
|
|
}
|
|
{{ end }}
|
|
{{- end }}
|
|
|
|
var getTargetAppearance = () => {
|
|
return document.documentElement.classList.contains("dark") ? "dark" : "light"
|
|
}
|
|
|
|
window.addEventListener("DOMContentLoaded", (event) => {
|
|
const scroller = document.getElementById("top-scroller");
|
|
const footer = document.getElementById("site-footer");
|
|
if(scroller && footer && scroller.getBoundingClientRect().top > footer.getBoundingClientRect().top) {
|
|
scroller.hidden = true;
|
|
}
|
|
});
|