function currentTheme() { const attr = document.documentElement.getAttribute('data-theme'); if (attr === 'light' || attr === 'dark') return attr; return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } function applyTheme(theme) { document.documentElement.setAttribute('data-theme', theme); localStorage.setItem('octane-theme', theme); updateThemeToggleIcon(); } const SUN_ICON = ``; const MOON_ICON = ``; function updateThemeToggleIcon() { const btn = document.getElementById('theme-toggle'); if (!btn) return; btn.innerHTML = currentTheme() === 'dark' ? SUN_ICON : MOON_ICON; } async function initNav(activePage) { const me = await api.get('/api/users/me'); const nav = document.getElementById('main-nav'); nav.innerHTML = ` Octane `; const toggle = document.getElementById('nav-toggle'); const menu = document.getElementById('nav-menu'); toggle.addEventListener('click', () => menu.classList.toggle('open')); menu.querySelectorAll('a').forEach((a) => a.addEventListener('click', () => menu.classList.remove('open'))); const profileTrigger = document.getElementById('nav-profile-trigger'); const profileDropdown = document.getElementById('nav-profile-dropdown'); function closeProfileDropdown() { profileDropdown.classList.remove('open'); profileTrigger.setAttribute('aria-expanded', 'false'); } profileTrigger.addEventListener('click', (e) => { e.stopPropagation(); const isOpen = profileDropdown.classList.toggle('open'); profileTrigger.setAttribute('aria-expanded', String(isOpen)); }); document.addEventListener('click', (e) => { if (!document.getElementById('nav-profile').contains(e.target)) closeProfileDropdown(); }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeProfileDropdown(); }); updateThemeToggleIcon(); document.getElementById('theme-toggle').addEventListener('click', () => { applyTheme(currentTheme() === 'dark' ? 'light' : 'dark'); }); return me; }