Skip to main content

orbital_base_components/card/
button_area.rs

1use std::rc::Rc;
2
3use leptos::{ev, prelude::*};
4
5/// Headless primary clickable card region — renders a `button` or anchor when `href` is set.
6#[component]
7pub fn BaseCardButtonArea(
8    #[prop(optional, into)] class: MaybeProp<String>,
9    #[prop(optional, into)] href: MaybeProp<String>,
10    #[prop(optional, into)] disabled: Signal<bool>,
11    #[prop(optional)] on_click: Option<Callback<ev::MouseEvent>>,
12    children: Children,
13) -> impl IntoView {
14    let use_link = href.get_untracked().map(|h| !h.is_empty()).unwrap_or(false);
15    let child_view = children();
16    let href_value = href.get_untracked().unwrap_or_default();
17    let on_click = Rc::new(on_click);
18
19    if use_link {
20        let on_click = on_click.clone();
21        view! {
22            <a
23                class=move || class.get().unwrap_or_default()
24                href=href_value.clone()
25                aria-disabled=move || disabled.get().then_some("true")
26                on:click=move |e: ev::MouseEvent| {
27                    if disabled.get_untracked() {
28                        e.prevent_default();
29                        return;
30                    }
31                    if let Some(handler) = on_click.as_ref() {
32                        handler.run(e);
33                    }
34                }
35            >
36                {child_view}
37            </a>
38        }
39        .into_any()
40    } else {
41        view! {
42            <button
43                type="button"
44                class=move || class.get().unwrap_or_default()
45                disabled=move || disabled.get().then_some("")
46                aria-disabled=move || disabled.get().then_some("true")
47                on:click=move |e: ev::MouseEvent| {
48                    if disabled.get_untracked() {
49                        e.prevent_default();
50                        return;
51                    }
52                    if let Some(handler) = on_click.as_ref() {
53                        handler.run(e);
54                    }
55                }
56            >
57                {child_view}
58            </button>
59        }
60        .into_any()
61    }
62}