Spaces:
Build error
Build error
| // Function that applies light/dark theme based on the user's preference | |
| const applyAutoTheme = () => { | |
| // Determine the user's preferred color scheme | |
| const prefersLight = window.matchMedia("(prefers-color-scheme: light)").matches; | |
| const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; | |
| // Apply the appropriate attributes based on the user's preference | |
| if (prefersLight) { | |
| document.body.setAttribute("data-md-color-scheme", "default"); | |
| document.body.setAttribute("data-md-color-primary", "indigo"); | |
| } else if (prefersDark) { | |
| document.body.setAttribute("data-md-color-scheme", "slate"); | |
| document.body.setAttribute("data-md-color-primary", "black"); | |
| } | |
| }; | |
| // Function that checks and applies light/dark theme based on the user's preference (if auto theme is enabled) | |
| function checkAutoTheme() { | |
| // Array of supported language codes -> each language has its own palette (stored in local storage) | |
| const supportedLangCodes = ["en", "zh", "ko", "ja", "ru", "de", "fr", "es", "pt", "it", "tr", "vi", "nl"]; | |
| // Get the URL path | |
| const path = window.location.pathname; | |
| // Extract the language code from the URL (assuming it's in the format /xx/...) | |
| const langCode = path.split("/")[1]; | |
| // Check if the extracted language code is in the supported languages | |
| const isValidLangCode = supportedLangCodes.includes(langCode); | |
| // Construct the local storage key based on the language code if valid, otherwise default to the root key | |
| const localStorageKey = isValidLangCode ? `/${langCode}/.__palette` : "/.__palette"; | |
| // Retrieve the palette from local storage using the constructed key | |
| const palette = localStorage.getItem(localStorageKey); | |
| if (palette) { | |
| // Check if the palette's index is 0 (auto theme) | |
| const paletteObj = JSON.parse(palette); | |
| if (paletteObj && paletteObj.index === 0) { | |
| applyAutoTheme(); | |
| } | |
| } | |
| } | |
| // Run function when the script loads | |
| checkAutoTheme(); | |
| // Re-run the function when the user's preference changes (when the user changes their system theme) | |
| window.matchMedia("(prefers-color-scheme: light)").addEventListener("change", checkAutoTheme); | |
| window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", checkAutoTheme); | |
| // Re-run the function when the palette changes (e.g. user switched from dark theme to auto theme) | |
| // ! We can't use window.addEventListener("storage", checkAutoTheme) because it will NOT be triggered on the current tab | |
| // ! So we have to use the following workaround: | |
| // Get the palette input for auto theme | |
| var autoThemeInput = document.getElementById("__palette_1"); | |
| if (autoThemeInput) { | |
| // Add a click event listener to the input | |
| autoThemeInput.addEventListener("click", function () { | |
| // Check if the auto theme is selected | |
| if (autoThemeInput.checked) { | |
| // Re-run the function after a short delay (to ensure that the palette has been updated) | |
| setTimeout(applyAutoTheme); | |
| } | |
| }); | |
| } | |
| // Add iframe navigation | |
| window.onhashchange = function() { | |
| window.parent.postMessage({ | |
| type: 'navigation', | |
| hash: window.location.pathname + window.location.search + window.location.hash | |
| }, '*'); | |
| }; | |