Base UI (Angular) tabs switch panels in place: pills, underline, or default chrome, optional icons, and overflow scroll. Copy tabs in and project tab, tab-label, and tab-body. They are for sibling views on one URL, not for routing between pages. For morphing panels, wrap the state change in document.startViewTransition() — cookbook: view-transitions.
Install with npx base-ui-cli add tabs.
Use type="" to change the tab view. Base theme supports 3 types, "folder", "underline" and "pills". Morph in-page panels with document.startViewTransition() — View Transitions cookbook.
<base-tabs type="folder">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="underline">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="pills">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
Control Tabs Labels position with position="" choose between "left", "right" and "center" or "full-width". By default the tabs labels are positioned on left hand side.
Example Labels positioned in the middle below
<base-tabs type="folder" position="center">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="underline" position="center">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="pills" position="center">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
Example Tabs Labels positioned in the middle below
<base-tabs type="folder" position="center">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="underline" position="right">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="pills" position="right">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
Examples Tabs Labels distributed horizontally with equal width in the middle below
<base-tabs type="folder" position="full-width">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="underline" position="full-width">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="pills" position="full-width">
<base-tab>
<base-tab-label>First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
Add icon="" with the preferred icon name chosen from our Base Icon Pack
<base-tabs type="folder" position="full-width">
<base-tab>
<base-tab-label icon="home">First Tab</base-tab-label>
<base-tab-body icon="settings">First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label icon="user">Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label>Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="underline" position="full-width">
<base-tab>
<base-tab-label icon="home">First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label icon="settings">Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label icon="user">Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
<base-tabs type="pills" position="full-width">
<base-tab>
<base-tab-label icon="home">First Tab</base-tab-label>
<base-tab-body>First Tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label icon="settings">Second Tab</base-tab-label>
<base-tab-body>Second tab Body</base-tab-body>
</base-tab>
<base-tab>
<base-tab-label icon="user">Third Tab </base-tab-label>
<base-tab-body>Third Tab Body</base-tab-body>
</base-tab>
</base-tabs>
TypeScript
import { Component } from '@angular/core';
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-tabs-example',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class TabsExampleComponent {}Install
npx base-ui-cli add tabs
Run the following command to add this component to your project:
npx base-ui-cli add tabs
For AI agents
Copy a prompt with the registry name, CLI install, and import — or add the Base UI MCP server.
npx -y base-ui-ng-mcp
Base UI provides standalone components. Import the exact elements you want to use into your component.
// Install: npx base-ui-cli add tabs
// Paths are relative to aliases.components (default: src/app/components)
import { TabBodyComponent } from './tabs/tab-body/tab-body.component';
import { TabLabelComponent } from './tabs/tab-label/tab-label.component';
import { TabComponent } from './tabs/tab/tab.component';
import { TabsComponent } from './tabs/tabs.component';
@Component({
selector: 'app-your-component',
imports: [
TabBodyComponent,
TabComponent,
TabLabelComponent,
TabsComponent
],
template: `...`
})
export class YourComponent {} API for tabs — generated from JSDoc in the library source.
| API | Member | Type | Default | Description |
|---|---|---|---|---|
base-tab | label | string | '' | A simple string label for the tab. If complex HTML is needed, project a `base-tab-label` inside instead. |
base-tab | isActive | boolean | false | Tracks whether this tab is currently selected. |
base-tab | tabClass | unknown | 'cursor-pointer' | Additional CSS classes to apply to the tab trigger. |
base-tab-body | — | — | — | The actual content wrapper for a `base-tab`. Content inside this tag is only rendered/visible when the parent tab is active. |
base-tab-label | — | — | — | A custom label for a `base-tab`. Allows you to add rich content (icons, badges, etc.) as the tab label. |
base-tabs | class | string | '' | Additional host CSS classes (merged via cn()). |
base-tabs | defaultTab | number | 0 | — |
base-tabs | type | string | undefined | undefined | — |
base-tabs | position | string | undefined | undefined | — |
base-tabs | icon | string | undefined | undefined | — |
base-tabs | scrollRestricted | boolean | false | — |
base-tabs | ariaLabel | string | '' | Accessible name for the tab list when a visible label is not present elsewhere. |
base-tabs | labelledBy | string | '' | ID of an external element that labels this tab list. |
base-tabs | (tabChanged) | TabComponent | — | Emitted whenever the active tab changes. |
Content