use topcoat::{
Result,
view::{Attributes, Child, Class, StaticClass, View, class, component, view},
};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[allow(dead_code)]
pub enum BadgeVariant {
#[default]
Primary,
Secondary,
Outline,
Destructive,
}
impl BadgeVariant {
fn classes(self) -> StaticClass {
match self {
Self::Primary => class!("border-transparent bg-primary text-primary-foreground"),
Self::Secondary => class!("border-transparent bg-foreground/5 text-foreground"),
Self::Outline => class!("border-border text-foreground"),
Self::Destructive => {
class!("border-transparent bg-destructive text-destructive-foreground")
}
}
}
}
const BASE: StaticClass = class!(
"inline-flex w-fit shrink-0 items-center justify-center gap-1 rounded-md",
"border px-2 py-0.5 text-xs font-medium whitespace-nowrap",
);
#[must_use]
pub fn badge_variants(variant: BadgeVariant) -> Class<(StaticClass, StaticClass)> {
class!(BASE, variant.classes())
}
#[component]
pub async fn badge(
#[default] variant: BadgeVariant,
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<span class=(class!(BASE, variant.classes(), attrs.remove("class"))) (attrs)>
(child)
</span>
})
}