leptos_components/
button.rs1use 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}