use crate::utils::cn;
use dioxus::prelude::*;
#[component]
pub fn Empty(
class: Option<String>,
children: Element,
) -> Element {
let classes = cn([
Some("flex min-w-0 flex-1 flex-col items-center justify-center gap-6 rounded-lg border-dashed p-6 text-center text-balance md:p-12"),
class.as_deref(),
]);
rsx! {
div {
"data-slot": "empty",
class: "{classes}",
{children}
}
}
}
#[component]
pub fn EmptyHeader(
class: Option<String>,
children: Element,
) -> Element {
let classes = cn([
Some("flex max-w-sm flex-col items-center gap-2 text-center"),
class.as_deref(),
]);
rsx! {
div {
"data-slot": "empty-header",
class: "{classes}",
{children}
}
}
}
#[derive(Clone, Copy, PartialEq, Default)]
pub enum EmptyMediaVariant {
#[default]
Default,
Icon,
}
impl EmptyMediaVariant {
fn as_str(&self) -> &str {
match self {
EmptyMediaVariant::Default => "default",
EmptyMediaVariant::Icon => "icon",
}
}
fn classes(&self) -> &str {
match self {
EmptyMediaVariant::Default => "bg-transparent",
EmptyMediaVariant::Icon => "bg-muted text-foreground flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg:not([class*='size-'])]:size-6",
}
}
}
#[component]
pub fn EmptyMedia(
#[props(default)]
variant: EmptyMediaVariant,
class: Option<String>,
children: Element,
) -> Element {
let classes = cn([
Some("flex shrink-0 items-center justify-center mb-2 [&_svg]:pointer-events-none [&_svg]:shrink-0"),
Some(variant.classes()),
class.as_deref(),
]);
rsx! {
div {
"data-slot": "empty-icon",
"data-variant": variant.as_str(),
class: "{classes}",
{children}
}
}
}
#[component]
pub fn EmptyTitle(
class: Option<String>,
children: Element,
) -> Element {
let classes = cn([Some("text-lg font-medium tracking-tight"), class.as_deref()]);
rsx! {
div {
"data-slot": "empty-title",
class: "{classes}",
{children}
}
}
}
#[component]
pub fn EmptyDescription(
class: Option<String>,
children: Element,
) -> Element {
let classes = cn([
Some("text-muted-foreground [&>a:hover]:text-primary text-sm/relaxed [&>a]:underline [&>a]:underline-offset-4"),
class.as_deref(),
]);
rsx! {
div {
"data-slot": "empty-description",
class: "{classes}",
{children}
}
}
}
#[component]
pub fn EmptyContent(
class: Option<String>,
children: Element,
) -> Element {
let classes = cn([
Some("flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance"),
class.as_deref(),
]);
rsx! {
div {
"data-slot": "empty-content",
class: "{classes}",
{children}
}
}
}