On this page

Tab

Tabbed container that switches between panes. Compose <r-tabs> as the container with one or more <r-tab> panes inside it.

Use when you need a tabbed container that switches between panes. Compose <r-tabs> with <r-tab> children, each supplying a header label and pane body.

Quick Start

Basic Usage

11111 22222 33333
<r-tabs>
  <r-tab label="tab1">11111</r-tab>
  <r-tab label="tab2">22222</r-tab>
  <r-tab label="tab3">33333</r-tab>
</r-tabs>

Each <r-tab> becomes one pane; its label is rendered as the header button, and its slotted content is the pane body. Selecting a header slides the corresponding pane into view.

API Reference

r-tabs Properties

The container. Holds the header row, the active indicator, and the pane content area.

Property Type Default Description
active string first enabled tab The r-key of the currently active tab
type string 'flat' Header style: flat, line
align string 'start' Header alignment: start, center, end
effect boolean false Enables ripple on the header buttons and hides the sliding indicator
sheet string '' CSS text injected into the shadow DOM

The active property setter accepts a key string; assigning null removes the attribute. When no active is set, the first non-disabled tab is selected on mount.

r-tab Properties

A single pane. Its attributes are read by the parent <r-tabs> to build the matching header button.

Property Type Default Description
label string '' Text shown in the tab header
r-key string index Unique identifier within an <r-tabs>; matched against active
icon string — r-icon name shown before the label
iconSize string — Size of the header icon
disabled boolean false Makes the tab unselectable
effect boolean — Ripple effect on the header (normally set by the parent's effect)
sheet string '' CSS text injected into the shadow DOM

The key property getter/setter reads and writes the r-key attribute (the plain key name is avoided because it is a reserved field). Set label and r-key before the element is connected: changes to those two attributes are not re-processed after the headers are built.

Header Style type

flat (default) shows a sliding underline indicator; line renders bordered tab headers.

11111 22222 33333 11111 22222 33333
<r-tabs type="flat">
  <r-tab label="tab1">11111</r-tab>
  <r-tab label="tab2">22222</r-tab>
  <r-tab label="tab3">33333</r-tab>
</r-tabs>

<r-tabs type="line">
  <r-tab label="tab1">11111</r-tab>
  <r-tab label="tab2">22222</r-tab>
  <r-tab label="tab3">33333</r-tab>
</r-tabs>

Header Alignment align

Aligns the header row. Defaults to start.

11111 22222 33333 11111 22222 33333 11111 22222 33333
<r-tabs type="line" align="start"> ... </r-tabs>
<r-tabs type="line" align="center"> ... </r-tabs>
<r-tabs type="line" align="end"> ... </r-tabs>

Active Tab active and r-key

  • r-key is an <r-tab> attribute that gives each pane a stable identity within the same <r-tabs>. When omitted it defaults to the pane's index.
  • active is an <r-tabs> attribute that selects the initially active tab: the pane whose r-key equals active is shown.

Without explicit keys, active matches the zero-based index:

11111 22222 33333
<r-tabs active="1">
  <r-tab label="tab1">11111</r-tab>
  <r-tab label="tab2">22222</r-tab>
  <r-tab label="tab3">33333</r-tab>
</r-tabs>

With explicit r-key values (panes without a key fall back to their index):

11111 22222 33333 4
<r-tabs active="c">
  <r-tab label="tab1" r-key="a">11111</r-tab>
  <r-tab label="tab2" r-key="b">22222</r-tab>
  <r-tab label="tab3" r-key="c">33333</r-tab>
  <r-tab label="tab4">4</r-tab>
</r-tabs>

Every r-key within one <r-tabs> must be unique: duplicate or missing keys on some panes throw an error while headers are being built.

Disabled Pane disabled

A disabled <r-tab> cannot be selected, and it is skipped when picking the default active tab.

11111 22222 33333 4
<r-tabs active="c">
  <r-tab label="tab1" r-key="a" disabled>11111</r-tab>
  <r-tab label="tab2" r-key="b">22222</r-tab>
  <r-tab label="tab3" r-key="c">33333</r-tab>
  <r-tab label="tab4">4</r-tab>
</r-tabs>

Header Icon icon and iconSize

<r-tab> accepts an icon attribute (an r-icon name) rendered before the label; iconSize sets its size.

11111 22222 33333
<r-tabs>
  <r-tab label="tab1" icon="edit">11111</r-tab>
  <r-tab label="tab2" icon="delete" iconSize="16">22222</r-tab>
  <r-tab label="tab3">33333</r-tab>
</r-tabs>

Ripple Effect effect

Set effect on <r-tabs> to enable the click ripple on the header buttons. When effect is active the sliding underline indicator is hidden.

11111 22222 33333
<r-tabs effect="true">
  <r-tab label="tab1">11111</r-tab>
  <r-tab label="tab2">22222</r-tab>
  <r-tab label="tab3">33333</r-tab>
</r-tabs>

Slots

Element Slot Description
r-tabs (default) Accepts the <r-tab> panes
r-tab (default) The pane's body content, shown when the tab is active

CSS Parts

r-tabs exposes:

Part Description
tabs Root wrapper
header Header row wrapper
nav The tablist containing the header items
indicator The sliding underline line
content Pane content viewport
content-wrap The sliding track holding all panes

r-tab exposes:

Part Description
content The pane's content slot

Events

change

<r-tabs> dispatches a change CustomEvent when an observed attribute changes, most notably when the active tab switches. event.detail.active is the current active key (the r-key of the selected <r-tab>, or its index when no r-key is set).

const tabs = document.createElement('r-tabs');
tabs.addEventListener('change', (e) => {
  console.log('active tab:', e.detail.active);
});
tabbar.append(tabs);

<r-tab> does not dispatch any custom events.

Styling

<r-tabs> exposes 10 CSS custom properties of its own, plus the semantic tokens it reads from the theme. Set one anywhere it inherits from: :root, a wrapper, or the element:

r-tabs {
  --ran-tab-content-background: var(--ran-color-bg-subtle);
}

Parts: content · content-wrap · header · indicator · nav · tabs

The full list is in style tokens; which token to reach for is the design system.

Best Practices

  • Stable identity: Give each <r-tab> a unique r-key and drive selection with active on <r-tabs> instead of relying on positional indexes.
  • Style choice: Use type="line" for a bordered, document-style tab strip; type="flat" (default) for the minimal sliding underline.
  • Alignment: Use align="center" or align="end" to reposition the header row within wide containers.
  • Disabled panes: Mark unavailable panes with disabled; they are skipped for both clicks and default selection.
  • Keyboard navigation: The header row is a WAI-ARIA tablist: arrow keys move between tabs (with Home/End), and only the active tab is in the tab order.