pub struct ComponentGroup {
pub name: &'static str,
pub components: Vec<&'static str>,
pub notes: Vec<&'static str>,
}
pub fn default_groups() -> Vec<ComponentGroup> {
vec![
ComponentGroup {
name: "Content",
components: vec![
"CardHeader",
"TextContent",
"MarkDownRenderer",
"Callout",
"TextCallout",
"Image",
"ImageBlock",
"ImageGallery",
"CodeBlock",
"Separator",
],
notes: vec![],
},
ComponentGroup {
name: "Tables",
components: vec!["Table", "Col"],
notes: vec![],
},
ComponentGroup {
name: "Charts (2D)",
components: vec![
"BarChart",
"LineChart",
"AreaChart",
"RadarChart",
"HorizontalBarChart",
"Series",
],
notes: vec![],
},
ComponentGroup {
name: "Charts (1D)",
components: vec!["PieChart", "RadialChart", "SingleStackedBarChart", "Slice"],
notes: vec![],
},
ComponentGroup {
name: "Charts (Scatter)",
components: vec!["ScatterChart", "ScatterSeries", "Point"],
notes: vec![],
},
ComponentGroup {
name: "Forms",
components: vec![
"Form",
"FormControl",
"Label",
"Input",
"TextArea",
"Select",
"SelectItem",
"DatePicker",
"Slider",
"CheckBoxGroup",
"CheckBoxItem",
"RadioGroup",
"RadioItem",
"SwitchGroup",
"SwitchItem",
],
notes: vec![],
},
ComponentGroup {
name: "Buttons",
components: vec!["Button", "Buttons"],
notes: vec![
"The `action` prop type accepts: ContinueConversation (sends message to LLM), OpenUrl (navigates to URL), or Custom (app-defined).",
],
},
ComponentGroup {
name: "Lists & Follow-ups",
components: vec!["ListBlock", "ListItem", "FollowUpBlock", "FollowUpItem"],
notes: vec![],
},
ComponentGroup {
name: "Sections",
components: vec!["SectionBlock", "SectionItem"],
notes: vec![],
},
ComponentGroup {
name: "Layout",
components: vec![
"Stack",
"Card",
"Tabs",
"TabItem",
"Accordion",
"AccordionItem",
"Steps",
"StepsItem",
"Carousel",
],
notes: vec![],
},
ComponentGroup {
name: "Data Display",
components: vec!["TagBlock", "Tag"],
notes: vec![],
},
]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_groups_not_empty() {
let groups = default_groups();
assert!(!groups.is_empty());
}
#[test]
fn test_no_empty_groups() {
let groups = default_groups();
for group in &groups {
assert!(
!group.components.is_empty(),
"Group '{}' has no components",
group.name
);
}
}
#[test]
fn test_no_duplicate_components_across_groups() {
let groups = default_groups();
let mut seen = std::collections::HashSet::new();
for group in &groups {
for comp in &group.components {
assert!(
seen.insert(*comp),
"Component '{}' appears in multiple groups",
comp
);
}
}
}
}