> For AI agents: the complete documentation index is available at https://rspress.rs/llms.txt, the full documentation bundle is available at https://rspress.rs/llms-full.txt.

# Tabs/Tab

`Tabs` and `Tab` switch between multiple content panes.

## Usage

```mdx title="index.mdx" preview
import { Tab, Tabs } from '@rspress/core/theme';

<Tabs>
  <Tab label="Tab 1">Tab 1 content</Tab>
  <Tab label="Tab 2">Tab 2 content</Tab>
</Tabs>
```

## Code blocks

````mdx title="index.mdx" preview
import { Tab, Tabs } from '@rspress/core/theme';

<Tabs>
<Tab label="Tab 1">

```tsx title="src/index.mjs"
import foo from 'foo';
import bar from 'bar';
```

</Tab>
<Tab label="Tab 2">

```tsx title="src/index.cjs"
const foo = require('foo');
const bar = require('bar');
```

</Tab>
</Tabs>
````

## Group synchronization

Use the same `groupId` to synchronize the active tab across multiple `Tabs`.

```mdx title="index.mdx" preview
import { Tab, Tabs } from '@rspress/core/theme';

<Tabs groupId="package-manager">
  <Tab label="npm">npm install rspress</Tab>
  <Tab label="pnpm">pnpm add rspress</Tab>
</Tabs>

<Tabs groupId="package-manager">
  <Tab label="npm">npm run dev</Tab>
  <Tab label="pnpm">pnpm dev</Tab>
</Tabs>
```

## Custom labels

Use `label` on each `Tab` to render custom tab labels.

```mdx title="index.mdx" preview
import {
  IconGithub,
  IconGitlab,
  SvgWrapper,
  Tab,
  Tabs,
} from '@rspress/core/theme';

<Tabs>
  <Tab
    label={
      <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>
        <SvgWrapper icon={IconGithub} width={16} height={16} />
        GitHub
      </span>
    }
  >
    GitHub repository settings
  </Tab>
  <Tab
    label={
      <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>
        <SvgWrapper icon={IconGitlab} width={16} height={16} />
        GitLab
      </span>
    }
  >
    GitLab project settings
  </Tab>
</Tabs>
```

## Separate labels and content

Use `values` to define tab labels separately from panel content. Each item provides a `value`, and the matching `<Tab value="...">` supplies the content. Use `defaultValue` to preselect a tab by `value`.

```mdx title="index.mdx" preview
import { Tab, Tabs } from '@rspress/core/theme';

<Tabs
  defaultValue="apple"
  values={[
    { label: 'Apple', value: 'apple' },
    { label: 'Orange', value: 'orange' },
    { label: 'Banana', value: 'banana' },
  ]}
>
  <Tab value="apple">This is an apple 🍎</Tab>
  <Tab value="orange">This is an orange 🍊</Tab>
  <Tab value="banana">This is a banana 🍌</Tab>
</Tabs>
```

## Props

```ts
interface TabsProps {
  children: React.ReactNode;
  values?: Array<{ label: React.ReactNode; value: string }>;
  defaultIndex?: number;
  defaultValue?: string;
  groupId?: string;
  tabPosition?: 'left' | 'center';
}

interface TabProps {
  label?: React.ReactNode;
  value?: string;
  children: React.ReactNode;
}
```

`label` accepts any renderable React node, so it can include icons or custom markup. Use `defaultIndex` to preselect a tab by index, or `defaultValue` to preselect a tab by `value`; `groupId` syncs selection across multiple `Tabs`; `tabPosition` sets list alignment.
