use topcoat::{
Result,
icon::{icon, iconify::iconify_icon},
view::{Attributes, Child, StaticClass, View, class, component, view},
};
const ERROR_STATE: StaticClass = class!(
"flex flex-col items-center gap-2 rounded-xl border border-destructive/30 \
bg-card px-6 py-12 text-center text-card-foreground \
[&>svg]:mb-1 [&>svg]:size-6 [&>svg]:text-destructive"
);
const ERROR_STATE_TITLE: StaticClass = class!("text-sm font-medium text-destructive");
const ERROR_STATE_DETAIL: StaticClass = class!("text-sm text-muted-foreground");
const ERROR_STATE_ACTION: StaticClass = class!("text-sm font-medium text-primary hover:underline");
#[component]
pub async fn error_state(
#[into]
title: String,
#[into]
#[default]
detail: String,
#[default]
action: Option<Child<'_>>,
#[default]
mut attrs: Attributes,
) -> Result<impl View> {
Ok(view! {
<div class=(class!(ERROR_STATE, attrs.remove("class"))) (attrs)>
icon(data: iconify_icon!("lucide:circle-alert"))
<p class=(class!(ERROR_STATE_TITLE))>(title)</p>
if !detail.is_empty() {
<p class=(class!(ERROR_STATE_DETAIL))>(detail)</p>
}
if let Some(action) = action {
<div class=(class!(ERROR_STATE_ACTION))>(action)</div>
}
</div>
})
}
#[cfg(test)]
mod tests;