

<Demo name="segmented-control/demos/default" />

## Installation [#installation]

Set up dotUI first — export your design system from the [Studio](/studio), which registers `@dotui` in your project. See [Installation](/docs/installation).

<CodeBlockTabs defaultValue="npm" groupId="package-manager">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npx shadcn@latest add @dotui/segmented-control
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm dlx shadcn@latest add @dotui/segmented-control
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn dlx shadcn@latest add @dotui/segmented-control
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bunx shadcn@latest add @dotui/segmented-control
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## Usage [#usage]

Use a segmented control for a small set of mutually exclusive options — view modes, ranges, filters. It's built on `ToggleButtonGroup` with single selection, and the indicator slides between segments (React Aria's `SelectionIndicator`).

```tsx
import {
  SegmentedControl,
  SegmentedControlItem,
} from "@/components/ui/segmented-control"
```

```tsx
<SegmentedControl aria-label="Date range" defaultSelectedKeys={["week"]}>
  <SegmentedControlItem id="day">Day</SegmentedControlItem>
  <SegmentedControlItem id="week">Week</SegmentedControlItem>
  <SegmentedControlItem id="month">Month</SegmentedControlItem>
</SegmentedControl>
```

## Anatomy [#anatomy]

A `SegmentedControl` wraps one `SegmentedControlItem` per option. Each item needs a unique `id`, which is the value the control reports as selected.

```tsx
import {
  SegmentedControl,
  SegmentedControlItem,
} from "@/components/ui/segmented-control"
```

```tsx
<SegmentedControl>
  <SegmentedControlItem id="…">…</SegmentedControlItem>
</SegmentedControl>
```

## Selection [#selection]

Selection is single-only and can never be empty (`disallowEmptySelection`). Use `defaultSelectedKeys` for uncontrolled state, or `selectedKeys` with `onSelectionChange` to control it — both are a `Set` of item ids.

```tsx
const [selected, setSelected] = React.useState(new Set(['week']))

<SegmentedControl
  aria-label="Date range"
  selectedKeys={selected}
  onSelectionChange={setSelected}
>
  <SegmentedControlItem id="day">Day</SegmentedControlItem>
  <SegmentedControlItem id="week">Week</SegmentedControlItem>
  <SegmentedControlItem id="month">Month</SegmentedControlItem>
</SegmentedControl>
```

## Examples [#examples]

<Examples className="grid-cols-1">
  <Example name="segmented-control/demos/default" title="Default" />

  <Example name="segmented-control/demos/with-icons" title="With icons" />
</Examples>

## API Reference [#api-reference]

<Reference name="segmented-control" />

<Reference name="segmented-control-item" />
