use leptos::prelude::*;
use lodviz_core::core::theme::ChartTheme;
pub fn use_prefers_dark() -> Signal<bool> {
#[cfg(target_arch = "wasm32")]
{
use wasm_bindgen::closure::Closure;
use wasm_bindgen::JsCast;
let (is_dark, set_is_dark) = signal(false);
if let Some(Ok(Some(mql))) =
web_sys::window().map(|w| w.match_media("(prefers-color-scheme: dark)"))
{
set_is_dark.set(mql.matches());
let closure = Closure::<dyn Fn(web_sys::MediaQueryListEvent)>::new(
move |ev: web_sys::MediaQueryListEvent| {
set_is_dark.set(ev.matches());
},
);
let _ =
mql.add_event_listener_with_callback("change", closure.as_ref().unchecked_ref());
closure.forget();
}
is_dark.into()
}
#[cfg(not(target_arch = "wasm32"))]
{
false.into()
}
}
#[component]
pub fn ThemeProvider(
#[prop(default = ChartTheme::default())]
light_theme: ChartTheme,
#[prop(default = ChartTheme::dark())]
dark_theme: ChartTheme,
#[prop(default = true)]
auto_dark_mode: bool,
#[prop(optional, into)]
theme_override: Option<Signal<ChartTheme>>,
children: Children,
) -> impl IntoView {
let prefers_dark = use_prefers_dark();
let theme_signal: Signal<ChartTheme> = if let Some(override_sig) = theme_override {
override_sig
} else {
Signal::derive(move || {
if auto_dark_mode && prefers_dark.get() {
dark_theme.clone()
} else {
light_theme.clone()
}
})
};
provide_context(theme_signal);
children()
}