tetra-ui Logotetra ui

Segmented Control

A native single-select control for choosing between a small set of options.

Segmented Control wraps Expo UI's SwiftUI segmented Picker on iOS and Jetpack Compose SegmentedButton on Android.

segmented-control

Installation

npx shadcn@latest add @tetra-ui/segmented-control

Usage

Compose segments from SegmentedControl, SegmentedControlItem, and SegmentedControlItemLabel.

import {
  SegmentedControl,
  SegmentedControlItem,
  SegmentedControlItemLabel,
} from "@/components/ui/segmented-control";
const [value, setValue] = useState("day");

<SegmentedControl value={value} onValueChange={setValue}>
  <SegmentedControlItem value="day">
    <SegmentedControlItemLabel>Day</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="week">
    <SegmentedControlItemLabel>Week</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="month">
    <SegmentedControlItemLabel>Month</SegmentedControlItemLabel>
  </SegmentedControlItem>
</SegmentedControl>

Controlled

Pass value and onValueChange for controlled state:

const [value, setValue] = useState("day");

<SegmentedControl value={value} onValueChange={setValue}>
  <SegmentedControlItem value="day">
    <SegmentedControlItemLabel>Day</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="week">
    <SegmentedControlItemLabel>Week</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="month">
    <SegmentedControlItemLabel>Month</SegmentedControlItemLabel>
  </SegmentedControlItem>
</SegmentedControl>

Uncontrolled

Use defaultValue when you do not need to control the selection:

<SegmentedControl defaultValue="week" onValueChange={setValue}>
  <SegmentedControlItem value="day">
    <SegmentedControlItemLabel>Day</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="week">
    <SegmentedControlItemLabel>Week</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="month">
    <SegmentedControlItemLabel>Month</SegmentedControlItemLabel>
  </SegmentedControlItem>
</SegmentedControl>

Disabled

<SegmentedControl disabled value="day" onValueChange={() => {}}>
  <SegmentedControlItem value="day">
    <SegmentedControlItemLabel>Day</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="week">
    <SegmentedControlItemLabel>Week</SegmentedControlItemLabel>
  </SegmentedControlItem>
  <SegmentedControlItem value="month">
    <SegmentedControlItemLabel>Month</SegmentedControlItemLabel>
  </SegmentedControlItem>
</SegmentedControl>

API Reference

SegmentedControl

Built on Expo UI platform primitives. Theme tint uses --color-primary (iOS tint, Android active segment colors).

Prop

Type

SegmentedControlItem

Requires a SegmentedControlItemLabel child for the segment text.

Prop

Type

SegmentedControlItemLabel

Prop

Type

On this page