// Theme handling (function() { // Constants const THEME_STORAGE_KEY = 'theme'; const DEFAULT_THEME = 'light'; const THEMES = { LIGHT: 'light', DARK: 'dark' }; // Initialize theme immediately to prevent flash of wrong theme initThemeEarly(); // Wait for components to be loaded before initializing the theme system document.addEventListener('componentsLoaded', function() { console.log('Components loaded, initializing theme system...'); initializeThemeSystem(); }); // Functions function initThemeEarly() { try { const savedTheme = localStorage.getItem(THEME_STORAGE_KEY); const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; // Set initial theme const initialTheme = savedTheme || (prefersDark ? THEMES.DARK : THEMES.LIGHT); setTheme(initialTheme); } catch (error) { console.warn('Early theme initialization error:', error); // Fallback to light theme setTheme(DEFAULT_THEME); } } function initializeThemeSystem() { console.log('Theme system initializing...'); try { // Set up theme toggle button const themeToggle = document.querySelector('.theme-toggle'); console.log('Theme toggle button found:', themeToggle); if (themeToggle) { themeToggle.addEventListener('click', toggleTheme); updateThemeIcon(getCurrentTheme()); console.log('Theme toggle event listener added'); } // Set up system theme change listener const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); mediaQuery.addEventListener('change', handleSystemThemeChange); // Ensure theme persists across page reloads window.addEventListener('beforeunload', persistTheme); } catch (error) { console.warn('Theme system initialization error:', error); } } function getCurrentTheme() { return document.documentElement.getAttribute('data-theme') || DEFAULT_THEME; } function setTheme(theme) { document.documentElement.setAttribute('data-theme', theme); document.body.dataset.theme = theme; // Add theme to body for better SSR support } function toggleTheme() { try { const currentTheme = getCurrentTheme(); const newTheme = currentTheme === THEMES.DARK ? THEMES.LIGHT : THEMES.DARK; console.log('Theme Toggle clicked!'); console.log('Current theme:', currentTheme); console.log('New theme:', newTheme); setTheme(newTheme); localStorage.setItem(THEME_STORAGE_KEY, newTheme); updateThemeIcon(newTheme); } catch (error) { console.warn('Theme toggle error:', error); } } function updateThemeIcon(theme) { try { const themeToggle = document.querySelector('.theme-toggle'); if (themeToggle) { // Ensure both icons exist if (!themeToggle.querySelector('.fa-sun')) { themeToggle.innerHTML = ` `; } } } catch (error) { console.warn('Theme icon update error:', error); } } function handleSystemThemeChange(e) { try { // Only update theme if user hasn't set a preference if (!localStorage.getItem(THEME_STORAGE_KEY)) { const newTheme = e.matches ? THEMES.DARK : THEMES.LIGHT; setTheme(newTheme); updateThemeIcon(newTheme); } } catch (error) { console.warn('System theme change handler error:', error); } } function persistTheme() { try { const currentTheme = getCurrentTheme(); localStorage.setItem(THEME_STORAGE_KEY, currentTheme); document.body.dataset.theme = currentTheme; // Ensure theme is set on body before unload } catch (error) { console.warn('Theme persistence error:', error); } } })();