leptos_components/
button.rs

1use components_core::{BASE_CLASS, concat};
2use leptos::{ev::MouseEvent, prelude::*};
3
4#[derive(Default, Debug, PartialEq)]
5pub enum Variant {
6    #[default]
7    Primary,
8    Secondary,
9    Text,
10    Icon,
11}
12
13#[component]
14pub fn Button(
15    #[prop(into, optional)] variant: Variant,
16    #[prop(into, optional)] class: String,
17    on_click: impl FnMut(MouseEvent) + 'static,
18    #[prop(into, optional)] icon: Option<AnyView>,
19    #[prop(into, optional)] label: Option<String>,
20) -> impl IntoView {
21    let var = format!(
22        "{}{}",
23        concat!(BASE_CLASS, "-button", "--"),
24        format!("{variant:?}").to_lowercase()
25    );
26    let class = crate::tw!("text-button", var, concat!(BASE_CLASS, "-button"), class);
27
28    view! {
29        <button class={class} on:click=on_click>
30            {(variant != Variant::Icon).then_some(label)}
31            {icon.into_view()}
32        </button>
33    }
34}