use leptos::prelude::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub enum ArrowGridTheme {
#[default]
Light,
Dark,
}
impl ArrowGridTheme {
pub fn class(self) -> &'static str {
match self {
Self::Light => "lag-theme-light",
Self::Dark => "lag-theme-dark",
}
}
}
#[component]
pub fn ArrowGridStyles() -> impl IntoView {
#[cfg(target_arch = "wasm32")]
{
let doc = document();
inject_style_once(&doc, "lag-grid-base", include_str!("../style/grid.css"));
inject_style_once(
&doc,
"lag-grid-themes",
include_str!("../style/lag-themes.css"),
);
}
}
#[cfg(target_arch = "wasm32")]
fn inject_style_once(doc: &web_sys::Document, id: &str, css: &str) {
if doc.get_element_by_id(id).is_some() {
return;
}
let Ok(style) = doc.create_element("style") else {
return;
};
style.set_id(id);
style.set_text_content(Some(css));
if let Some(head) = doc.head() {
let _ = head.append_child(&style);
}
}
#[component]
pub fn ArrowGridThemeScope(
#[prop(into, default = ArrowGridTheme::Light.into())]
theme: Signal<ArrowGridTheme>,
children: Children,
) -> impl IntoView {
let class = move || theme.get().class();
view! {
<div class=class>
{children()}
</div>
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn light_is_default() {
assert_eq!(ArrowGridTheme::default(), ArrowGridTheme::Light);
}
#[test]
fn class_names() {
assert_eq!(ArrowGridTheme::Light.class(), "lag-theme-light");
assert_eq!(ArrowGridTheme::Dark.class(), "lag-theme-dark");
}
#[test]
fn theme_is_copy() {
let t = ArrowGridTheme::Dark;
let t2 = t;
assert_eq!(t, t2);
}
}