// Breadcrumb - Navigation trail component
pub struct Breadcrumb {
items: Vec<BreadcrumbItem>,
separator: string,
class: string,
}
pub struct BreadcrumbItem {
label: string,
href: string,
active: bool,
}
impl Breadcrumb {
pub fn new() -> Breadcrumb {
Breadcrumb {
items: Vec::new(),
separator: "/".to_string(),
class: String::new(),
}
}
pub fn item(label: string, href: string, active: bool) -> Breadcrumb {
self.items.push(BreadcrumbItem {
label,
href,
active,
})
self
}
pub fn separator(separator: string) -> Breadcrumb {
self.separator = separator
self
}
pub fn class(class: string) -> Breadcrumb {
self.class = class
self
}
pub fn render() -> string {
let mut html = String::new()
html.push_str("<nav class=\"wj-breadcrumb ")
html.push_str(self.class.as_str())
html.push_str("\" style=\"display: flex; align-items: center; gap: 8px; font-size: 14px;\">")
for (i, item) in self.items.iter().enumerate() {
if i > 0 {
html.push_str("<span style=\"color: #9ca3af;\">")
html.push_str(self.separator.as_str())
html.push_str("</span>")
}
if item.active {
html.push_str("<span style=\"color: #3b82f6; font-weight: 500;\">")
html.push_str(item.label.as_str())
html.push_str("</span>")
} else {
html.push_str("<a href=\"")
html.push_str(item.href.as_str())
html.push_str("\" style=\"color: #6b7280; text-decoration: none; hover: color: #3b82f6;\">")
html.push_str(item.label.as_str())
html.push_str("</a>")
}
}
html.push_str("</nav>")
html
}
}