Skip to content

SegmentedControl

Segmented toggle control for selecting one option from a small set. Rendered as a radio group (`role="radiogroup"`), so reach for it when picking a value — filters, settings, or view modes whose content you render yourself. If selecting an option should show or hide associated content panels, use Tabs instead.

<SegmentedControl label="Date range" layout="hug" size="md" value="day" />
function SizesStory(args: SegmentedControlProps): React.JSX.Element {
const [value, setValue] = useState(args.value);
return (
<div style={{display: 'grid', gap: 16, justifyItems: 'start'}}>
<SegmentedControl {...args} onChange={setValue} size="sm" value={value}>
<SegmentedControlItem label="Day" value="day" />
<SegmentedControlItem label="Week" value="week" />
<SegmentedControlItem label="Month" value="month" />
</SegmentedControl>
<SegmentedControl {...args} onChange={setValue} size="md" value={value}>
<SegmentedControlItem label="Day" value="day" />
<SegmentedControlItem label="Week" value="week" />
<SegmentedControlItem label="Month" value="month" />
</SegmentedControl>
<SegmentedControl {...args} onChange={setValue} size="lg" value={value}>
<SegmentedControlItem label="Day" value="day" />
<SegmentedControlItem label="Week" value="week" />
<SegmentedControlItem label="Month" value="month" />
</SegmentedControl>
</div>
);
}
<SizesStory {...args} />
function FillLayoutStory(args: SegmentedControlProps): React.JSX.Element {
const [value, setValue] = useState(args.value);
return (
<div style={{maxWidth: 480}}>
<SegmentedControl
{...args}
layout="fill"
onChange={setValue}
value={value}>
<SegmentedControlItem label="Overview" value="overview" />
<SegmentedControlItem label="Activity" value="activity" />
<SegmentedControlItem label="Settings" value="settings" />
</SegmentedControl>
</div>
);
}
<FillLayoutStory {...args} />
<SegmentedControl
label="Date range"
layout="hug"
size="md"
value="day"
isDisabled
/>
function DisabledItemStory(args: SegmentedControlProps): React.JSX.Element {
const [value, setValue] = useState(args.value);
return (
<SegmentedControl {...args} onChange={setValue} value={value}>
<SegmentedControlItem label="Day" value="day" />
<SegmentedControlItem isDisabled label="Week" value="week" />
<SegmentedControlItem label="Month" value="month" />
</SegmentedControl>
);
}
<DisabledItemStory {...args} />
function EmptySelectionStory(args: SegmentedControlProps): React.JSX.Element {
const [value, setValue] = useState<string>();
return (
<SegmentedControl {...args} onChange={setValue} value={value}>
<SegmentedControlItem isDisabled label="Day" value="day" />
<SegmentedControlItem label="Week" value="week" />
<SegmentedControlItem label="Month" value="month" />
</SegmentedControl>
);
}
<EmptySelectionStory {...args} />
function IconOnlyStory(args: SegmentedControlProps): React.JSX.Element {
const [value, setValue] = useState(args.value);
return (
<SegmentedControl {...args} onChange={setValue} value={value}>
<SegmentedControlItem
icon={Home}
isLabelHidden
label="Home"
value="home"
/>
<SegmentedControlItem
icon={Bell}
isLabelHidden
label="Notifications"
value="notifications"
/>
<SegmentedControlItem
icon={Settings}
isLabelHidden
label="Settings"
value="settings"
/>
</SegmentedControl>
);
}
<IconOnlyStory {...args} />
function IconWithLabelStory(args: SegmentedControlProps): React.JSX.Element {
const [value, setValue] = useState(args.value);
return (
<SegmentedControl {...args} onChange={setValue} value={value}>
<SegmentedControlItem icon={Calendar} label="Calendar" value="calendar" />
<SegmentedControlItem icon={List} label="List" value="list" />
<SegmentedControlItem icon={Users} label="Team" value="team" />
</SegmentedControl>
);
}
<IconWithLabelStory {...args} />
function ManyItemsStory(args: SegmentedControlProps): React.JSX.Element {
const [value, setValue] = useState(args.value);
return (
<SegmentedControl {...args} onChange={setValue} value={value}>
<SegmentedControlItem label="Overview" value="overview" />
<SegmentedControlItem label="Activity" value="activity" />
<SegmentedControlItem label="Members" value="members" />
<SegmentedControlItem label="Files" value="files" />
<SegmentedControlItem label="Billing" value="billing" />
<SegmentedControlItem label="Security" value="security" />
</SegmentedControl>
);
}
<ManyItemsStory {...args} />
<SegmentedControl
label="Date range"
layout="hug"
size="md"
value="day"
isReadOnly
/>

Segmented toggle control for selecting one option from a small set. Rendered as a radio group (`role="radiogroup"`), so reach for it when picking a value — filters, settings, or view modes whose content you render yourself. If selecting an option should show or hide associated content panels, use Tabs instead.

PropTypeDefaultDescription
children*ReactNodeSegmentedControlItem children.
classNamestringAdditional CSS class names applied to the root element.
data-testidstringTest ID applied to the root element.
isDisabledbooleanfalseWhether the entire control is disabled.
isReadOnlybooleanfalseWhether the selected segment is displayed without allowing interaction.
label*stringAccessible label for the radio group.
layout"fill" | "hug"'hug'Segment layout mode.
onChange*(value: TValue) => voidCalled when a segment is selected.
refRef<HTMLDivElement>Ref forwarded to the root element.
size"sm" | "md" | "lg"'md'Control size.
styleCSSPropertiesInline styles applied to the root element.
valueTValueCurrent selected value, or undefined when no segment is selected.

Individual segment within a `SegmentedControl`.

PropTypeDefaultDescription
classNamestringAdditional CSS class names applied to the segment.
data-testidstringTest ID applied to the segment.
iconIconComponentIcon element displayed before the label.
isDisabledbooleanfalseWhether this segment is disabled.
isLabelHiddenbooleanfalseWhether to visually hide the label.
label*stringAccessible and visible label for the segment.
refRef<HTMLButtonElement>Ref forwarded to the segment button.
styleCSSPropertiesInline styles applied to the segment.
value*TValueUnique value represented by this segment.