document.documentElement.classList.add('js'); function readThemePreference(key, fallback) { try { return localStorage.getItem(key) || fallback; } catch (error) { return fallback; } } const themeMode = readThemePreference('nexus.theme', document.documentElement.dataset.theme || 'day'); const themeAccent = readThemePreference('nexus.accent', document.documentElement.dataset.accent || 'logo'); function applyTheme(mode, accent) { const normalizedMode = ['day', 'night'].includes(mode) ? mode : 'day'; const normalizedAccent = ['logo', 'pink', 'cyan', 'orange', 'green'].includes(accent) ? accent : 'logo'; document.documentElement.dataset.theme = normalizedMode; document.documentElement.dataset.accent = normalizedAccent; try { localStorage.setItem('nexus.theme', normalizedMode); localStorage.setItem('nexus.accent', normalizedAccent); } catch (error) { // Ignore blocked storage; the current page still receives the theme. } } applyTheme(themeMode, themeAccent); const themeModeSelect = document.querySelector('[data-theme-mode]'); const themeAccentSelect = document.querySelector('[data-theme-accent]'); if (themeModeSelect) { themeModeSelect.value = document.documentElement.dataset.theme; themeModeSelect.addEventListener('change', () => { applyTheme(themeModeSelect.value, document.documentElement.dataset.accent); }); } if (themeAccentSelect) { themeAccentSelect.value = document.documentElement.dataset.accent; themeAccentSelect.addEventListener('change', () => { applyTheme(document.documentElement.dataset.theme, themeAccentSelect.value); }); } for (const element of document.querySelectorAll('[data-reveal]')) { element.classList.add('reveal'); }