use topcoat::{
Result,
icon::{icon, iconify::iconify_icon},
view::{Attributes, Child, View, attributes, class, component, view},
};
#[component]
pub async fn breadcrumb(
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<nav aria-label="breadcrumb" class=(attrs.remove("class")) (attrs)>(child)</nav>
})
}
#[component]
pub async fn breadcrumb_list(
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<ol
class=(class!(
"flex flex-wrap items-center gap-2 text-sm text-muted-foreground",
attrs.remove("class"),
))
(attrs)
>
(child)
</ol>
})
}
#[component]
pub async fn breadcrumb_item(
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<li
class=(class!("inline-flex items-center gap-2", attrs.remove("class")))
(attrs)
>
(child)
</li>
})
}
#[component]
pub async fn breadcrumb_link(
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<a
class=(class!(
"transition-colors hover:text-foreground",
attrs.remove("class"),
))
(attrs)
>
(child)
</a>
})
}
#[component]
pub async fn breadcrumb_page(
#[default] mut attrs: Attributes,
#[default] child: Child<'_>,
) -> Result<impl View> {
Ok(view! {
<span
aria-current="page"
class=(class!("font-medium text-foreground", attrs.remove("class")))
(attrs)
>
(child)
</span>
})
}
#[component]
pub async fn breadcrumb_separator(#[default] mut attrs: Attributes) -> Result<impl View> {
Ok(view! {
<li aria-hidden="true" class=(attrs.remove("class")) (attrs)>
icon(
data: iconify_icon!("lucide:chevron-right"),
attrs: attributes! { class="size-3.5" }
)
</li>
})
}
#[component]
pub async fn breadcrumb_ellipsis(#[default] mut attrs: Attributes) -> Result<impl View> {
Ok(view! {
<span class=(class!("flex items-center", attrs.remove("class"))) (attrs)>
icon(
data: iconify_icon!("lucide:ellipsis"),
attrs: attributes! { class="size-4" }
)
<span class="sr-only">"More"</span>
</span>
})
}