import { useState, useEffect, type ReactNode } from 'react'; import BookHeader from './BookHeader.tsx'; import TOCSidebar from './TOCSidebar.tsx'; interface Props { children: ReactNode; } const THEME_KEY = 'ns-book-theme'; function readStoredTheme(): 'light' | 'dark' { try { const stored = localStorage.getItem(THEME_KEY); if (stored === 'dark' || stored === 'light') return stored; } catch { // ignore } // Default to system preference return typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; } export default function BookLayout({ children }: Props) { // Read theme synchronously in the initializer to avoid a flash of wrong theme. const [theme, setTheme] = useState<'light' | 'dark'>(readStoredTheme); const [menuOpen, setMenuOpen] = useState(false); // Persist theme changes useEffect(() => { try { localStorage.setItem(THEME_KEY, theme); } catch { // ignore } }, [theme]); return (