/** * Theme Force Update Component * Forces theme updates by manipulating DOM classes and triggering repaints */ import { useEffect } from 'react'; import { useTheme } from '@/hooks/useTheme'; export function ThemeForceUpdate() { const { theme, themeId } = useTheme(); useEffect(() => { // Force theme class update const root = document.documentElement; // Remove all theme classes root.classList.remove('theme-dark', 'theme-light', 'theme-blue', 'theme-green'); // Add current theme class root.classList.add(`theme-${themeId}`); // Force repaint by triggering multiple style recalculation methods const forceRepaint = () => { // Method 1: Toggle display root.style.display = 'none'; void root.offsetHeight; // Trigger reflow root.style.display = ''; // Method 2: Force style recalculation on body document.body.style.zoom = '1.0000001'; setTimeout(() => { document.body.style.zoom = '1'; }, 0); // Method 3: Trigger animation frame cascade requestAnimationFrame(() => { root.style.opacity = '0.9999'; requestAnimationFrame(() => { root.style.opacity = '1'; }); }); // Method 4: Force all elements to recalculate const allElements = document.querySelectorAll('*'); allElements.forEach(el => { (el as HTMLElement).style.cssText += '; '; }); }; // Apply theme updates with a slight delay to ensure CSS variables are set setTimeout(forceRepaint, 10); // Log theme change console.log(`Theme force updated to: ${themeId}`, { background: getComputedStyle(root).getPropertyValue('--background'), foreground: getComputedStyle(root).getPropertyValue('--foreground'), primary: getComputedStyle(root).getPropertyValue('--primary-500'), }); }, [themeId, theme]); return null; }