type Theme = 'light' | 'dark' const STORAGE_KEY = 'theme' const getSavedTheme = (): Theme => { const raw = localStorage.getItem(STORAGE_KEY) if (raw === 'light' || raw === 'dark') return raw return 'dark' } const applyTheme = (theme: Theme): void => { const html = document.documentElement html.setAttribute('data-theme', theme) localStorage.setItem(STORAGE_KEY, theme) updateToggleButton(theme) } const cycleTheme = (): void => { const current = getSavedTheme() const next: Theme = current === 'light' ? 'dark' : 'light' applyTheme(next) } const updateToggleButton = (theme: Theme): void => { const btn = document.getElementById('theme-toggle') if (!btn) return const label = btn.querySelector('[data-theme-label]') as HTMLElement | null if (label) { label.textContent = theme } const svg = btn.querySelector('svg') if (!svg) return if (theme === 'light') { svg.innerHTML = '' svg.setAttribute('stroke', 'currentColor') svg.setAttribute('fill', 'none') } else { svg.innerHTML = '' svg.setAttribute('stroke', 'currentColor') svg.setAttribute('fill', 'none') } } const initTheme = (): void => { const saved = getSavedTheme() applyTheme(saved) const btn = document.getElementById('theme-toggle') if (btn) { btn.addEventListener('click', cycleTheme) } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initTheme) } else { initTheme() }