leptos_components/
chip.rs1use components_core::{BASE_CLASS, concat};
2use leptos::prelude::*;
3use leptos::{IntoView, component, view};
4
5use crate::icons::{Location, StarBold};
6
7#[derive(Default, Debug, PartialEq)]
8pub enum Variant {
9 #[default]
10 Featured,
11 Numeric,
12 Description,
13 Location,
14 Small,
15}
16
17impl Variant {
18 pub fn icon(&self) -> Option<AnyView> {
19 match self {
20 Variant::Featured => Some(view! { <StarBold /> }.into_any()),
21 Variant::Small | Variant::Location => Some(view! { <Location /> }.into_any()),
22 _ => None,
23 }
24 }
25}
26
27#[component]
28pub fn Chip(
29 #[prop(into)] label: String,
30 #[prop(into, optional)] class: String,
31 #[prop(into, optional)] variant: Variant,
32) -> impl IntoView {
33 let class = crate::tw!(
34 concat!(BASE_CLASS, "-chip"),
35 format!("{BASE_CLASS}-chip--{variant:?}").to_lowercase(),
36 class
37 );
38
39 view! {
40 <div class=class>
41 {variant.icon()}
42 {(variant == Variant::Numeric).then_some(format!("#{label}")).unwrap_or(label)}
43 </div>
44 }
45}