///|
pub fn BrandBook::render_component_catalog(self : BrandBook) -> String {
let sections : Array[String] = []
for component in self.components {
sections.push(component.render_usage_card())
}
if sections.length() == 0 {
"No components defined."
} else {
sections.join("\n\n")
}
}
///|
pub fn ComponentSpec::render_usage_card(self : ComponentSpec) -> String {
join_lines([
"### " + self.name,
"",
self.purpose,
"",
"**Anatomy**: " + self.anatomy.join(", "),
"",
"**Tokens**: " + self.tokens.join(", "),
"",
"**States**: " + self.states.join(", "),
"",
self.render_state_matrix(),
])
}
///|
pub fn ComponentSpec::render_state_matrix(self : ComponentSpec) -> String {
let lines : Array[String] = ["| State | Token references |", "| --- | --- |"]
for state in self.states {
lines.push("| " + state + " | " + self.tokens.join(", ") + " |")
}
lines.join("\n")
}
///|
pub fn ComponentSpec::render_token_checklist(self : ComponentSpec) -> String {
let lines : Array[String] = []
for token in self.tokens {
lines.push("- [ ] " + token)
}
if lines.length() == 0 {
"- [ ] Add token references"
} else {
lines.join("\n")
}
}
///|
pub fn ComponentSpec::render_anatomy_list(self : ComponentSpec) -> String {
self.anatomy.map(fn(part) { "1. " + part }).join("\n")
}
///|
pub fn BrandBook::component_names(self : BrandBook) -> Array[String] {
let names : Array[String] = []
for component in self.components {
names.push(component.name)
}
names
}
///|
pub fn BrandBook::find_component(
self : BrandBook,
name : String,
) -> ComponentSpec? {
for component in self.components {
if component.name == name {
return Some(component)
}
}
None
}
///|
pub fn BrandBook::components_using_token(
self : BrandBook,
token : String,
) -> Array[String] {
let result : Array[String] = []
for component in self.components {
if component.tokens.any(fn(item) { item == token }) {
result.push(component.name)
}
}
result
}