leptos_components/
chip.rs

1use 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}