ui_storybook/components/primitives/
badge.rs1use leptos::prelude::*;
9
10#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
12pub enum BadgeKind {
13 #[default]
16 Neutral,
17 Accent,
20 Danger,
22 Live,
24 Plan,
26 Count,
29}
30
31impl BadgeKind {
32 #[must_use]
34 pub fn css(self) -> &'static str {
35 match self {
36 BadgeKind::Neutral => "badge-neutral",
37 BadgeKind::Accent => "badge-accent",
38 BadgeKind::Danger => "badge-danger",
39 BadgeKind::Live => "badge-live",
40 BadgeKind::Plan => "badge-plan",
41 BadgeKind::Count => "badge-count",
42 }
43 }
44}
45
46#[component]
47pub fn Badge(
48 #[prop(optional)] kind: BadgeKind,
49 #[prop(optional, into)] extra_class: String,
50 children: Children,
51) -> impl IntoView {
52 let class = format!(
53 "badge {}{}{}",
54 kind.css(),
55 if extra_class.is_empty() { "" } else { " " },
56 extra_class,
57 );
58 view! { <span class=class>{children()}</span> }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn each_kind_has_unique_class() {
67 let classes = [
68 BadgeKind::Neutral.css(),
69 BadgeKind::Accent.css(),
70 BadgeKind::Danger.css(),
71 BadgeKind::Live.css(),
72 BadgeKind::Plan.css(),
73 BadgeKind::Count.css(),
74 ];
75 let mut sorted = classes.to_vec();
76 sorted.sort_unstable();
77 sorted.dedup();
78 assert_eq!(sorted.len(), classes.len());
79 }
80}