# @spark-web/tabs

> --- title: Tabs storybookPath: page-layout-tabs--default isExperimentalPackage: true ---

Latest version **5.2.2** (published 2026-06-15) · 0 weekly downloads

## Install

```sh
npm install @spark-web/tabs
pnpm add @spark-web/tabs
yarn add @spark-web/tabs
bun add @spark-web/tabs
```

## Health

**Score 55/100 (C)** — status: active.

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 5.2.2 |
| Published | 2026-06-15 |
| First published | 2022-07-29 |
| Weekly downloads | 0 |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=14 |
| Dependencies | 12 |
| Unpacked size | 73.1 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | brighte, brighte-release-bot |

## Links

- npm: https://www.npmjs.com/package/@spark-web/tabs
- Repository: https://github.com/brighte-labs/spark-web
- Homepage: https://github.com/brighte-labs/spark-web#readme
- Issues: https://github.com/brighte-labs/spark-web/issues
- npm.io page: https://npm.io/package/@spark-web/tabs

## Dependencies (12)

- [@babel/runtime](https://npm.io/package/@babel/runtime.md) ^7.25.0
- [@emotion/react](https://npm.io/package/@emotion/react.md) ^11.14.0
- [@spark-web/box](https://npm.io/package/@spark-web/box.md) ^6.0.0
- [@spark-web/a11y](https://npm.io/package/@spark-web/a11y.md) ^5.3.1
- [@spark-web/text](https://npm.io/package/@spark-web/text.md) ^5.3.0
- [@spark-web/stack](https://npm.io/package/@spark-web/stack.md) ^5.1.0
- [@spark-web/theme](https://npm.io/package/@spark-web/theme.md) ^5.13.1
- [@spark-web/utils](https://npm.io/package/@spark-web/utils.md) ^5.1.0
- [@spark-web/button](https://npm.io/package/@spark-web/button.md) ^5.6.0
- [react-use-measure](https://npm.io/package/react-use-measure.md) ^2.1.1
- [@spark-web/divider](https://npm.io/package/@spark-web/divider.md) ^5.1.1
- [@radix-ui/react-tabs](https://npm.io/package/@radix-ui/react-tabs.md) ^1.0.0

## Recent versions

- 5.2.2 (latest) — 2026-06-15
- 0.0.0-snapshot-release-20260827022754 (snapshot-release) — 2026-08-27
- 5.1.0-rc.0 (rc) — 2025-07-24
- 5.2.1 — 2026-03-09
- 5.2.0 — 2026-03-06
- 5.1.0 — 2026-01-15
- 5.0.3 — 2025-12-09
- 5.0.2 — 2025-10-20
- 5.0.0 — 2025-02-10
- 5.0.0-rc.31 — 2025-02-10
- 5.0.0-rc.29 — 2025-02-06
- 5.0.0-rc.28 — 2025-02-06
- 5.0.0-rc.27 — 2025-02-05
- 5.0.0-rc.26 — 2025-02-05
- 5.0.0-rc.25 — 2025-01-31
- … 30 more at https://npm.io/package/@spark-web/tabs/versions

## README

---
title: Tabs
storybookPath: page-layout-tabs--default
isExperimentalPackage: true
---

Tabs are a set of layered sections of content (known as tab panels) that display
one panel of content at a time. Each tab panel has an associated tab element,
that when activated, displays the panel. The list of tab elements is arranged
along the top edge of the currently displayed panel.

## Example

```jsx live
<Tabs>
  <TabList>
    <Tab>First tab</Tab>
    <Tab>Second tab</Tab>
  </TabList>
  <TabPanels>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder label="Content from first panel" height={64} />
      </Stack>
    </TabPanel>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder label="Content from second panel" height={64} />
      </Stack>
    </TabPanel>
  </TabPanels>
</Tabs>
```

### Default Index

By default, users will be shown the first tab. This can be overridden by
providing a `defaultIndex` prop. You can also have _no_ tabs active by default
by providing a `defaultIndex` of `-1`.

```jsx live
<Tabs defaultIndex={1}>
  <TabList>
    <Tab>First tab</Tab>
    <Tab>Second tab (default)</Tab>
  </TabList>
  <TabPanels>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder label="Content from first panel" height={64} />
      </Stack>
    </TabPanel>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder
          label="Content from second panel (this should be selected by default)"
          height={64}
        />
      </Stack>
    </TabPanel>
  </TabPanels>
</Tabs>
```

### Disabled tabs

Individual tabs can be be disabled by providing them with a `disabled` prop.

```jsx live
<Tabs>
  <TabList>
    <Tab>First tab</Tab>
    <Tab>Second tab</Tab>
    <Tab disabled>Third tab (disabled)</Tab>
  </TabList>
  <TabPanels>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder label="Content from first panel" height={64} />
      </Stack>
    </TabPanel>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder label="Content from second panel" height={64} />
      </Stack>
    </TabPanel>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder
          label="Content from third panel. You should not be able to see me!"
          height={64}
        />
      </Stack>
    </TabPanel>
  </TabPanels>
</Tabs>
```

### Manual Activation

By default, when a tab has focus, users can cycle through the enabled tabs using
the arrow keys. If `activationMode` is set to `"manual"`, users can activate a
tab by pressing the `Enter` or `Space` key when the tab you want to view has
focus.

It is very important for usability that functionality of components behaves in a
consistent manor. It is therefore recommended that you _do not_ use the manual
activation mode unless you absolutely need it.

```jsx live
<Tabs activationMode="manual">
  <TabList>
    <Tab>First tab</Tab>
    <Tab>Second tab</Tab>
  </TabList>
  <TabPanels>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder label="Content from first panel" height={64} />
      </Stack>
    </TabPanel>
    <TabPanel>
      <Stack paddingY="medium">
        <Placeholder label="Content from second panel" height={64} />
      </Stack>
    </TabPanel>
  </TabPanels>
</Tabs>
```

## Props

### Tabs

<PropsTable displayName="Tabs" />

### TabList

<PropsTable displayName="TabList" />

### Tab

<PropsTable displayName="Tab" />

### TabPanels

<PropsTable displayName="TabPanels" />

### TabPanel

<PropsTable displayName="TabPanel" />

[data-attribute-map]:
  https://github.com/brighte-labs/spark-web/blob/e7f6f4285b4cfd876312cc89fbdd094039aa239a/packages/utils/src/internal/buildDataAttributes.ts#L1

---
_Source: https://npm.io/package/@spark-web/tabs · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
