use crate::{
context::{LayoutDirection, ThemeContext},
prelude::*,
};
#[derive(Debug, Clone)]
pub struct ThemeProviderProps {
pub initial_palette: String,
pub language: String,
pub direction: String,
pub children: Vec<VNode>,
}
impl Default for ThemeProviderProps {
fn default() -> Self {
Self {
initial_palette: "hikari".to_string(),
language: "en".to_string(),
direction: "ltr".to_string(),
children: Vec::new(),
}
}
}
#[allow(non_snake_case)]
pub fn ThemeProvider(props: ThemeProviderProps) -> VNode {
let palette_name = props.initial_palette.as_str();
let colors = match palette_name {
"hikari" => themes::Hikari::palette(),
"tairitsu" => themes::Tairitsu::palette(),
_ => themes::Hikari::palette(),
};
let dir = match props.direction.as_str() {
"rtl" => "rtl",
_ => "ltr",
};
let context = ThemeContext {
palette: props.initial_palette.clone(),
colors,
direction: if dir == "rtl" {
LayoutDirection::Rtl
} else {
LayoutDirection::Ltr
},
set_theme: Callback::new(|_| {}),
};
provide_context(context);
rsx! {
div {
class: "hi-theme-provider",
"data-theme": palette_name,
"data-language": props.language.as_str(),
"dir": dir,
..props.children
}
}
}