91 lines
2.1 KiB
JavaScript
91 lines
2.1 KiB
JavaScript
// MusicRoom - UI theme and layout experiments
|
|
|
|
(function() {
|
|
const M = window.MusicRoom;
|
|
|
|
const THEMES = new Set([
|
|
"default",
|
|
"phosphor",
|
|
"vaporwave",
|
|
"sunrise",
|
|
"paper",
|
|
"contrast",
|
|
"aquarium",
|
|
"amber",
|
|
"compact",
|
|
"cinema",
|
|
"spreadsheet",
|
|
"myspace",
|
|
"sideways"
|
|
]);
|
|
|
|
function decodeCookieValue(value) {
|
|
if (!value) return null;
|
|
try {
|
|
return decodeURIComponent(value);
|
|
} catch {
|
|
M.clearCookieValue(M.THEME_STORAGE_KEY);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function normalizeTheme(theme) {
|
|
return THEMES.has(theme) ? theme : "default";
|
|
}
|
|
|
|
M.getSavedTheme = function() {
|
|
const cookieTheme = normalizeTheme(decodeCookieValue(M.getCookieValue(M.THEME_STORAGE_KEY)));
|
|
if (cookieTheme !== "default") return cookieTheme;
|
|
|
|
try {
|
|
const storedTheme = normalizeTheme(localStorage.getItem(M.THEME_STORAGE_KEY));
|
|
if (storedTheme !== "default") {
|
|
M.rememberTheme(storedTheme);
|
|
return storedTheme;
|
|
}
|
|
} catch {}
|
|
|
|
return "default";
|
|
};
|
|
|
|
M.rememberTheme = function(theme) {
|
|
const normalized = normalizeTheme(theme);
|
|
if (normalized === "default") {
|
|
M.clearThemePreference();
|
|
return;
|
|
}
|
|
|
|
M.setCookieValue(M.THEME_STORAGE_KEY, normalized);
|
|
try {
|
|
localStorage.setItem(M.THEME_STORAGE_KEY, normalized);
|
|
} catch {}
|
|
};
|
|
|
|
M.clearThemePreference = function() {
|
|
M.clearCookieValue(M.THEME_STORAGE_KEY);
|
|
try {
|
|
localStorage.removeItem(M.THEME_STORAGE_KEY);
|
|
} catch {}
|
|
};
|
|
|
|
M.applyTheme = function(theme, remember = true) {
|
|
const normalized = normalizeTheme(theme);
|
|
document.documentElement.dataset.uiTheme = normalized;
|
|
document.body.dataset.uiTheme = normalized;
|
|
|
|
const selector = document.getElementById("theme-select");
|
|
if (selector) selector.value = normalized;
|
|
|
|
if (remember) M.rememberTheme(normalized);
|
|
};
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
const selector = document.getElementById("theme-select");
|
|
M.applyTheme(M.getSavedTheme(), false);
|
|
|
|
if (selector) {
|
|
selector.onchange = () => M.applyTheme(selector.value);
|
|
}
|
|
});
|
|
})();
|