(() => { const layout = document.querySelector('.layout-body'); if (!layout) return; const enabled = layout.dataset.sidebarEnabled === '1'; const collapsible = layout.dataset.sidebarCollapsible === '1'; const defaultState = layout.dataset.sidebarDefault || 'collapsed'; const toggles = document.querySelectorAll('[data-sidebar-toggle]'); if (!enabled || !collapsible) { toggles.forEach((t) => t.remove()); return; } const saved = localStorage.getItem('sidebar-state'); const initial = saved || defaultState; if (initial === 'open') { layout.classList.add('sidebar-open'); } else { layout.classList.remove('sidebar-open'); } toggles.forEach((toggle) => { toggle.addEventListener('click', () => { layout.classList.toggle('sidebar-open'); localStorage.setItem('sidebar-state', layout.classList.contains('sidebar-open') ? 'open' : 'collapsed'); }); }); })(); 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'); } (() => { const openBtn = document.querySelector('[data-debug-open]'); const modal = document.getElementById('debug-modal'); if (!openBtn || !modal) return; const listEl = document.getElementById('debug-log-list'); const contentEl = document.getElementById('debug-log-content'); const closeEls = modal.querySelectorAll('[data-debug-close]'); const open = () => { modal.classList.add('is-open'); modal.setAttribute('aria-hidden', 'false'); loadList(); startRefresh(); }; const close = () => { modal.classList.remove('is-open'); modal.setAttribute('aria-hidden', 'true'); if (refreshTimer) { clearInterval(refreshTimer); refreshTimer = null; } }; let activeFile = null; let refreshTimer = null; const loadList = async () => { try { const res = await fetch('/debug?list=1', { cache: 'no-store' }); if (!res.ok) { listEl.innerHTML = `