Skip to main content

nightshade_api/web/base/
button.rs

1use leptos::prelude::*;
2
3/// A styled `<button>`. Pass extra classes via `class` and a click handler via
4/// the optional `on_click` callback.
5#[component]
6pub fn Button(
7    #[prop(into, optional)] class: String,
8    #[prop(optional)] on_click: Option<Callback<web_sys::MouseEvent>>,
9    children: Children,
10) -> impl IntoView {
11    let handle = move |event: web_sys::MouseEvent| {
12        if let Some(callback) = on_click {
13            callback.run(event);
14        }
15    };
16    view! {
17        <button class=format!("nightshade-button {class}") on:click=handle>
18            {children()}
19        </button>
20    }
21}
22
23/// A square, icon-only button variant. Pass extra classes via `class` and a
24/// click handler via the optional `on_click` callback.
25#[component]
26pub fn IconButton(
27    #[prop(into, optional)] class: String,
28    #[prop(optional)] on_click: Option<Callback<web_sys::MouseEvent>>,
29    children: Children,
30) -> impl IntoView {
31    let handle = move |event: web_sys::MouseEvent| {
32        if let Some(callback) = on_click {
33            callback.run(event);
34        }
35    };
36    view! {
37        <button class=format!("nightshade-icon-button {class}") on:click=handle>
38            {children()}
39        </button>
40    }
41}