shadow-design 0.1.0

Modular, high-performance UI component library for Dioxus 0.7 applications
Documentation
use dioxus::prelude::*;

#[derive(Clone, Copy, PartialEq, Debug, Default)]
pub enum BadgeVariant {
    #[default]
    Default,
    Primary,
    Success,
    Warning,
    Danger,
    Outline,
}

impl BadgeVariant {
    pub fn scss_class(&self) -> &'static str {
        match self {
            BadgeVariant::Default => "sd-badge--default",
            BadgeVariant::Primary => "sd-badge--primary",
            BadgeVariant::Success => "sd-badge--success",
            BadgeVariant::Warning => "sd-badge--warning",
            BadgeVariant::Danger => "sd-badge--danger",
            BadgeVariant::Outline => "sd-badge--outline",
        }
    }

    pub fn dot_color_class(&self) -> &'static str {
        match self {
            BadgeVariant::Default => "default",
            BadgeVariant::Primary => "primary",
            BadgeVariant::Success => "success",
            BadgeVariant::Warning => "warning",
            BadgeVariant::Danger => "danger",
            BadgeVariant::Outline => "outline",
        }
    }
}

#[component]
pub fn Badge(
    label: String,
    #[props(default)] variant: BadgeVariant,
    #[props(default)] pill: bool,
    #[props(default)] dot: bool,
    #[props(default)] glow: Option<bool>,
    #[props(default)] class: String,
) -> Element {
    let variant_class = variant.scss_class();
    let pill_class = if pill { "sd-badge--pill" } else { "" };

    #[cfg(feature = "theme")]
    let theme = crate::theme::use_theme();
    #[cfg(feature = "theme")]
    let radius = if pill {
        ""
    } else {
        theme().radius_scale.sm()
    };
    #[cfg(feature = "theme")]
    let glow_class = match glow {
        Some(true) => "sd-badge--glow",
        Some(false) => "",
        None => {
            if variant == BadgeVariant::Primary && theme().glow_mode != crate::theme::GlowMode::Off
            {
                "sd-badge--glow"
            } else {
                ""
            }
        }
    };

    #[cfg(not(feature = "theme"))]
    let radius = "";
    #[cfg(not(feature = "theme"))]
    let glow_class = if glow == Some(true) || (glow.is_none() && variant == BadgeVariant::Primary) {
        "sd-badge--glow"
    } else {
        ""
    };

    let dot_kind = variant.dot_color_class();

    rsx! {
        span {
            class: "sd-badge {variant_class} {pill_class} {radius} {glow_class} {class}",
            if dot {
                span { class: "sd-badge__dot-container",
                    span { class: "sd-badge__dot-ping sd-badge__dot-ping--{dot_kind}" }
                    span { class: "sd-badge__dot sd-badge__dot--{dot_kind}" }
                }
            }
            "{label}"
        }
    }
}