document.addEventListener('DOMContentLoaded', () => { const sidebarToggle = document.getElementById('sidebar-toggle'); const themeToggle = document.getElementById('theme-toggle'); const searchInput = document.getElementById('search-input'); const searchResults = document.getElementById('search-results'); const root = document.documentElement; function setTheme(theme) { root.dataset.theme = theme; localStorage.setItem('theme', theme); } const stored = localStorage.getItem('theme'); if (stored) setTheme(stored); if (window.innerWidth > 768) { document.body.classList.add('sidebar-open'); } sidebarToggle?.addEventListener('click', () => { document.body.classList.toggle('sidebar-open'); }); themeToggle?.addEventListener('click', () => { const next = root.dataset.theme === 'dark' ? 'light' : 'dark'; setTheme(next); }); // search let lunrIndex; let docs = []; async function loadIndex() { if (lunrIndex) return; try { const res = await fetch('/search-index.json'); const data = await res.json(); lunrIndex = lunr.Index.load(data.index); docs = data.docs; } catch (e) { console.error('Search index failed to load', e); } } function highlight(text, q) { const re = new RegExp('(' + q.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&') + ')', 'gi'); return text.replace(re, '$1'); } searchInput?.addEventListener('input', async e => { const q = e.target.value.trim(); await loadIndex(); if (!lunrIndex || !q) { searchResults.style.display = 'none'; searchResults.innerHTML = ''; return; } const matches = lunrIndex.search(q); searchResults.innerHTML = ''; if (!matches.length) { searchResults.innerHTML = '