use gloo_storage::{LocalStorage, Storage}; use web_sys::window; use yew::prelude::*; #[function_component(DarkModeToggle)] pub fn dark_mode_toggle() -> Html { // 1. Initialize state from LocalStorage or system preference let is_dark = use_state(|| { LocalStorage::get::("dark-mode").unwrap_or_else(|_| { // Fallback to system preference if not set window() .and_then(|w| w.match_media("(prefers-color-scheme: dark)").ok().flatten()) .map(|m| m.matches()) .unwrap_or(false) }) }); // 2. Synchronize the class on the body when the state changes { let is_dark = is_dark.clone(); use_effect_with(is_dark, |is_dark| { if let Some(win) = window() { if let Some(doc) = win.document() { if let Some(body) = doc.body() { if **is_dark { let _ = body.class_list().add_1("theme-dark"); let _ = body.class_list().remove_1("theme-light"); let _ = LocalStorage::set("dark-mode", true); } else { let _ = body.class_list().add_1("theme-light"); let _ = body.class_list().remove_1("theme-dark"); let _ = LocalStorage::set("dark-mode", false); } } } } || () }); } // 3. Toggle action let onclick = { let is_dark = is_dark.clone(); Callback::from(move |_| { is_dark.set(!*is_dark); }) }; html! { } }