TreeView
OrganismCollapsible tree with keyboard navigation, selection, and aria-tree roles.
function Demo() {
const [sel, setSel] = useState();
return (
<TreeView selectedId={sel} onSelect={setSel} label="Files"
nodes={[
{ id: 'src', label: 'src', children: [
{ id: 'Button', label: 'Button.tsx' },
]},
]}
/>
);
}function Demo() {
const [sel, setSel] = useState();
return (
<TreeView label="Settings navigation" selectedId={sel} onSelect={setSel}
nodes={[
{ id: 'account', label: 'Account', children: [
{ id: 'profile', label: 'Profile' },
{ id: 'password', label: 'Password' },
]},
{ id: 'workspace', label: 'Workspace', children: [
{ id: 'general', label: 'General' },
{ id: 'billing', label: 'Billing' },
]},
{ id: 'integrations', label: 'Integrations' },
]}
/>
);
}function Demo() {
const [sel, setSel] = useState('ts');
return (
<TreeView label="Language selector" selectedId={sel} onSelect={setSel}
nodes={[
{ id: 'ts', label: 'TypeScript' },
{ id: 'js', label: 'JavaScript' },
{ id: 'py', label: 'Python' },
{ id: 'go', label: 'Go' },
]}
/>
);
}function Demo() {
const [ids, setIds] = useState<string[]>(['Card']);
return (
<TreeView
label="Project files"
selectionMode="multi"
selectedIds={ids}
onSelectionChange={setIds}
nodes={[
{ id: 'docs', label: 'Documents', children: [
{ id: 'spec', label: 'spec.md' },
{ id: 'roadmap', label: 'roadmap.md' },
]},
{ id: 'src', label: 'src', children: [
{ id: 'Button', label: 'Button.tsx' },
{ id: 'Card', label: 'Card.tsx' },
{ id: 'Drawer', label: 'Drawer.tsx' },
{ id: 'TreeView', label: 'TreeView.tsx' },
]},
]}
/>
);
}
// Try it:
// - Cmd/Ctrl-click → toggle individual rows
// - Shift-click → range-select between anchor and clicked row
// - Type "tre" → focus jumps to "TreeView.tsx"
// - Cmd/Ctrl+A → select all visible rows
// - Arrow keys / Home/End / Space / Enter — full keyboard nav.