Status

Rust/UI component for displaying statuses.

  • Rust/UI Icons - CopyCopy Demo
use leptos::prelude::*;

use crate::components::extensions::status::Status;

#[component]
pub fn DemoStatus() -> impl IntoView {
    view! {
        <Status>
            <div class="rounded-md size-16 bg-neutral-500" />
        </Status>
    }
}

Installation

You can run either of the following commands:

# cargo install ui-cli --force
ui add demo_status
ui add status

Update the imports to match your project setup.

Copy and paste the following code into your project:

components/ui/status.rs

use leptos::prelude::*;
use tw_merge::*;

const PING_ANIMATION: &str = "animate-ping";
const RELATIVE: &str = "relative";

#[component]
pub fn Status(
    #[prop(into, optional)] class: String,
    #[prop(into, optional)] variant: StatusIndactorVariant,
    children: Children,
) -> impl IntoView {
    let merged_class = tw_merge!(RELATIVE, class);

    view! {
        <div class=merged_class>
            {children()} <StatusIndactor variant=variant class=PING_ANIMATION /> <StatusIndactor variant=variant />
        </div>
    }
}

/* ========================================================== */
/*                     ✨ FUNCTIONS ✨                        */
/* ========================================================== */

#[derive(TwClass, Clone, Copy)]
#[tw(class = "absolute top-0 right-0 -mt-1 -mr-1 rounded-full size-4")]
pub struct StatusIndactorClass {
    pub variant: StatusIndactorVariant,
}

#[derive(TwVariant)]
pub enum StatusIndactorVariant {
    #[tw(default, class = "bg-neutral-300")]
    Default,
    #[tw(class = "bg-green-300 ")]
    Active,
    #[tw(class = "bg-orange-300 ")]
    Inactive,
    #[tw(class = "bg-sky-300 ")]
    Normal,
}

#[component]
pub fn StatusIndactor(
    #[prop(into, optional)] variant: Signal<StatusIndactorVariant>,
    #[prop(into, optional)] class: String,
) -> impl IntoView {
    let merged_class = move || {
        let status_indicator = StatusIndactorClass { variant: variant.get() };
        status_indicator.with_class(class.clone())
    };

    view! { <div class=merged_class /> }
}

Update the imports to match your project setup.

Usage

// Coming soon 🦀

Examples

Variants

  • Rust/UI Icons - CopyCopy Demo
use leptos::prelude::*;
use leptos_ui::void;

use crate::components::extensions::status::{Status, StatusIndactorVariant};

#[component]
pub fn DemoStatusVariants() -> impl IntoView {
    void! {DemoContainer, div, "rounded-md size-16 bg-neutral-500"}

    view! {
        <div class="flex gap-4">
            <Status variant=StatusIndactorVariant::Normal>
                <DemoContainer />
            </Status>
            <Status variant=StatusIndactorVariant::Active>
                <DemoContainer />
            </Status>
            <Status variant=StatusIndactorVariant::Inactive>
                <DemoContainer />
            </Status>
        </div>
    }
}