Skip to main content

euv_ui/component/button/view/
fn.rs

1use crate::*;
2
3/// A versatile button component supporting primary and outline variants.
4///
5/// Renders a styled `<button>` element whose appearance is determined by the
6/// `variant` and `disabled` props. When children are provided they replace
7/// the label text.
8///
9/// # Arguments
10///
11/// - `VirtualNode<EuvButtonProps>` - The props node containing variant, label, onclick, disabled.
12///
13/// # Returns
14///
15/// - `VirtualNode` - A styled button element.
16#[component]
17pub fn euv_button(node: VirtualNode<EuvButtonProps>) -> VirtualNode {
18    let EuvButtonProps {
19        variant,
20        label,
21        onclick: click_handler,
22        disabled,
23    }: EuvButtonProps = node.try_get_props().unwrap_or_default();
24    let children: VirtualNode = node.get_child_node();
25    let content: VirtualNode = match children {
26        VirtualNode::Empty => VirtualNode::Text(TextNode::new(label.to_string(), None)),
27        other => other,
28    };
29    match variant {
30        EuvButtonVariant::Primary => html! {
31            button {
32                class: c_euv_button_primary_md()
33                disabled: disabled.get()
34                onclick: click_handler
35                content
36            }
37        },
38        EuvButtonVariant::Outline => html! {
39            button {
40                class: c_euv_button_outline_md()
41                disabled: disabled.get()
42                onclick: click_handler
43                content
44            }
45        },
46    }
47}