XDSTabMenu@xds/core · TabList

Usage

TabList provides tab-style navigation for organizing content into categorized sections. Use it to let users switch between related views without leaving the page, with overflow items handled by a built-in "more" menu.

Best practices

GuidancePractices
DoKeep tab labels short and descriptive so users can quickly scan available sections.
DoUse XDSTabMenu to group overflow items when horizontal space is limited rather than scrolling tabs off-screen.
DoWhen using hasDivider with action buttons alongside tabs, use a smaller button size (sm) so the actions don’t overpower the tab row.
Don'tUse tabs for sequential steps or workflows — use a stepper or wizard pattern instead.
Don'tPlace more than 6–8 visible tabs before the overflow menu — prioritize the most important categories.
Don'tConfuse TabList with XDSSegmentedControl or XDSToggleButton. TabList is for navigation between views. SegmentedControl and ToggleButton are input controls — SegmentedControl always has exactly one selected option, while ToggleButton can be toggled on or off.

Anatomy

ElementDescription
Left ContentMost important area; hugs content width.
Center-Fill ContentStretches to fill available space.
Right ContentHugs content width.

Import

ts
import {XDSTabMenu} from '@xds/core/TabList'

Props

PropTypeDescription
labelrequired
stringLabel for the trigger button (shown when no option is selected) and the dropdown heading divider.
optionsrequired
XDSTabMenuOption[]Array of menu options rendered in the dropdown.

Showcase source

tsx
'use client';
import {XDSTabList, XDSTab, XDSTabMenu} from '@xds/core/TabList';
export default function TabMenuShowcase() {
return (
<XDSTabList value="settings" onChange={() => {}}>
<XDSTab value="overview" label="Overview" />
<XDSTab value="activity" label="Activity" />
<XDSTabMenu
label="More"
options={[
{value: 'settings', label: 'Settings'},
{value: 'integrations', label: 'Integrations'},
{value: 'billing', label: 'Billing'},
]}
/>
</XDSTabList>
);
}