XDSTreeList@xds/core · TreeList

Usage

An expandable tree structure for displaying hierarchical data with branch connector lines. Use it for file explorers, nested category browsers, or any interface that visualizes parent-child relationships.

Best practices

GuidancePractices
DoProvide meaningful labels and icons for each node to make the hierarchy easy to scan.
DoPre-expand important branches so users see key content immediately.
Don'tNest more than 4–5 levels deep — flatten the structure or use a different pattern.
Don'tUse a tree for flat, non-hierarchical data — use a List instead.

Import

ts
import {XDSTreeList} from '@xds/core/TreeList'

Props

PropTypeDescription
itemsrequired
XDSTreeListItemData[]Recursive tree item data. Each item has id, label, optional children array, and optional isExpanded boolean for initial state.
density
'compact' | 'balanced' | 'spacious' (default: 'balanced')Spacing density for items.
header
ReactNodeHeader content, associated with the tree via aria-labelledby.
xstyle
StyleXStylesStyleX styles for layout customization. Must be a stylex.create() value.

Sub-components

TreeList is a compound component with 1 sub-component.

XDSTreeList

Tree list container. Accepts items data and rendering configuration. Expansion state is managed internally.
PropTypeDescription
itemsrequired
XDSTreeListItemData[]Recursive tree item data. Each item has id, label, optional children array, and optional isExpanded boolean for initial state.
density
'compact' | 'balanced' | 'spacious' (default: 'balanced')Spacing density for items.
header
ReactNodeHeader content, associated with the tree via aria-labelledby.
xstyle
StyleXStylesStyleX styles for layout customization. Must be a stylex.create() value.

Examples

Common configurations, variations, and states.
TreeList — File Tree With IconsFile browser tree with folder and document icons distinguishing directories from files.
tsx
'use client';
import {XDSTreeList} from '@xds/core/TreeList';
import {XDSIcon} from '@xds/core/Icon';
import {FolderIcon, DocumentIcon} from '@heroicons/react/24/outline';
export default function TreeListFileTreeWithIcons() {
return (
<XDSTreeList
items={[
{
id: 'src',
label: 'src',
isExpanded: true,
startContent: <XDSIcon icon={FolderIcon} size="sm" />,
children: [
{
id: 'app',
label: 'App.tsx',
onClick: () => {},
startContent: <XDSIcon icon={DocumentIcon} size="sm" />,
},
{
id: 'index',
label: 'index.tsx',
onClick: () => {},
startContent: <XDSIcon icon={DocumentIcon} size="sm" />,
},
],
},
{
id: 'pkg',
label: 'package.json',
onClick: () => {},
startContent: <XDSIcon icon={DocumentIcon} size="sm" />,
},
]}
/>
);
}
TreeList — Interactive SettingsSettings tree with clickable items and a documentation link.
tsx
'use client';
import {XDSTreeList} from '@xds/core/TreeList';
import {XDSIcon} from '@xds/core/Icon';
import {Cog6ToothIcon, ChevronRightIcon} from '@heroicons/react/24/outline';
export default function TreeListInteractiveSettings() {
return (
<XDSTreeList
items={[
{
id: 'settings',
label: 'Settings',
isExpanded: true,
startContent: <XDSIcon icon={Cog6ToothIcon} size="sm" />,
children: [
{
id: 'general',
label: 'General',
onClick: () => {},
},
{
id: 'advanced',
label: 'Advanced',
onClick: () => {},
},
],
},
{
id: 'docs',
label: 'Documentation',
href: '#',
endContent: <XDSIcon icon={ChevronRightIcon} size="sm" />,
},
]}
/>
);
}
TreeList — Mailbox TreeEmail folder tree with unread badge counts.
tsx
'use client';
import {XDSTreeList} from '@xds/core/TreeList';
import {XDSBadge} from '@xds/core/Badge';
const noop = () => {};
export default function TreeListMailboxTree() {
return (
<XDSTreeList
items={[
{
id: 'inbox',
label: 'Inbox',
isExpanded: true,
endContent: <XDSBadge label="3" />,
children: [
{
id: 'unread',
label: 'Unread',
onClick: noop,
endContent: <XDSBadge label="3" />,
},
{id: 'starred', label: 'Starred', onClick: noop},
],
},
{id: 'sent', label: 'Sent', onClick: noop},
{
id: 'drafts',
label: 'Drafts',
onClick: noop,
endContent: <XDSBadge label="1" />,
},
]}
/>
);
}
TreeList — Navigation TreeNavigation tree with a selected item for the current page.
tsx
'use client';
import {XDSTreeList} from '@xds/core/TreeList';
const noop = () => {};
export default function TreeListNavigationTree() {
return (
<XDSTreeList
items={[
{
id: 'nav',
label: 'Navigation',
isExpanded: true,
children: [
{id: 'home', label: 'Home', onClick: noop},
{id: 'about', label: 'About', onClick: noop, isSelected: true},
{id: 'contact', label: 'Contact', onClick: noop},
],
},
]}
/>
);
}

Showcase source

tsx
'use client';
import {XDSTreeList} from '@xds/core/TreeList';
const noop = () => {};
export default function TreeListShowcase() {
return (
<XDSTreeList
items={[
{
id: 'src',
label: 'src',
isExpanded: true,
children: [
{
id: 'components',
label: 'components',
children: [
{id: 'button', label: 'Button.tsx', onClick: noop},
{id: 'card', label: 'Card.tsx', onClick: noop},
{id: 'list', label: 'List.tsx', onClick: noop},
],
},
{id: 'app', label: 'App.tsx', onClick: noop},
{id: 'index', label: 'index.tsx', onClick: noop},
],
},
{
id: 'public',
label: 'public',
children: [
{id: 'favicon', label: 'favicon.ico', onClick: noop},
{id: 'index-html', label: 'index.html', onClick: noop},
],
},
{id: 'pkg', label: 'package.json', onClick: noop},
{id: 'readme', label: 'README.md', onClick: noop},
]}
/>
);
}