use topcoat::{
Result,
view::{Attributes, Child, StaticClass, View, class, component, view},
};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[allow(dead_code)]
pub enum AlertVariant {
#[default]
Neutral,
Destructive,
}
impl AlertVariant {
fn classes(self) -> StaticClass {
match self {
Self::Neutral => class!("border-border text-foreground"),
Self::Destructive => class!("border-destructive/50 text-destructive"),
}
}
}
const BASE: StaticClass = class!(
"grid w-full grid-cols-[0_1fr] items-start gap-y-1 rounded-lg border \
bg-background px-4 py-3 text-sm has-[>svg]:grid-cols-[1rem_1fr] has-[>svg]:gap-x-3 \
[&>svg]:size-4 [&>svg]:translate-y-0.5",
);
#[component]
pub async fn alert(
#[default]
variant: AlertVariant,
#[default]
mut attrs: Attributes,
#[default]
child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<div class=(class!(BASE, variant.classes(), attrs.remove("class"))) (attrs)>
(child)
</div>
})
}
#[component]
pub async fn alert_title(
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<p
class=(class!(
"col-start-2 font-medium tracking-tight",
attrs.remove("class"),
))
(attrs)
>
(child)
</p>
})
}
#[component]
pub async fn alert_description(
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<div
class=(class!(
"col-start-2 text-sm text-muted-foreground",
attrs.remove("class"),
))
(attrs)
>
(child)
</div>
})
}