use super::*;
#[component]
pub fn euv_tabs(node: VirtualNode<EuvTabsProps>) -> VirtualNode {
let EuvTabsProps { items, active }: EuvTabsProps = node.try_get_props().unwrap_or_default();
let children: VirtualNode = node.get_children().into();
if items.is_empty() {
return html! {
div {
class: c_euv_tabs_panel()
children
}
};
}
let tab_buttons: Vec<VirtualNode> = items
.into_iter()
.map(|item: EuvTabItem| tab_button(active, item))
.collect();
html! {
div {
class: c_euv_tabs()
div {
class: c_euv_tabs_bar()
tab_buttons
}
div {
class: c_euv_tabs_panel()
children
}
}
}
}
fn tab_button(active: Signal<String>, item: EuvTabItem) -> VirtualNode {
let key: &'static str = item.key;
html! {
button {
key: key
class: c_euv_tab_item()
class: if { active.get() == key } {
c_euv_tab_item_active()
} else {
c_euv_tab_item()
}
onclick: select_tab(active, key)
{
item.label
}
}
}
}
fn select_tab(active: Signal<String>, key: &'static str) -> Option<Rc<dyn Fn(Event)>> {
Some(Rc::new(move |_: Event| {
active.set(key.to_string());
}))
}