0.1.0-rc.2

Tabs

Tabs organize related content into panels where only one is visible at a time, such as settings sections, product details, or dashboards.

Try it

Account settings
Security settings

Usage

Compose RuiTabList, RuiTab, RuiTabPanels, and RuiTabPanel. Set value to control the active tab.

import { RuiTabs, RuiTabList, RuiTab, RuiTabPanels, RuiTabPanel } from '@ecopages/radiant-ui/tabs';
 
<RuiTabs value="account" variant="boxed">
  <RuiTabList>
    <RuiTab id="account">Account</RuiTab>
    <RuiTab id="security">Security</RuiTab>
  </RuiTabList>
  <RuiTabPanels>
    <RuiTabPanel id="account">Account settings</RuiTabPanel>
    <RuiTabPanel id="security">Security settings</RuiTabPanel>
  </RuiTabPanels>
</RuiTabs>

Boxed or ghost

boxed tabs have a contained background and work well in settings panels. ghost tabs sit flush with the page header.

Manual activation

Set automatic=\{false} when switching tabs should require an explicit Enter/Space press.

Theming

Tabs map to semantic surface + primary roles, never Tailwind palette steps:

Part / variantCSS roles
Tab texton-background
Active indicatorprimary border (underline / top of boxed card)
Focusfocus-ring at reduced alpha
Boxed cardbackground + border + rounded-container + shadow-sm
Boxed tab stripsurface-container-low background
Panelsbackground + p-inset body

Overrides go at the theme layer, not in component CSS.

Accessibility

  • Tab list exposes role="tablist" with aria-selected on the active tab.
  • Arrow keys move between tabs; activation follows the automatic setting.
  • Each panel is labelled by its corresponding tab via aria-labelledby.

API

RuiTabs is a custom element (<rui-tabs>) coordinating role="tablist" / role="tab" / role="tabpanel" markup authored via the view helpers.

Attributes (<rui-tabs>)

AttributeTypeDefaultDescription
variantghost ยท boxedboxedVisual treatment.
valuestring''Selected tab id; defaults to the first tab.
labelstring''Accessible name for the tab list (prefer aria-label on RuiTabList).
automaticbooleantrueAutomatic (focus activates) vs manual (Enter/Space) activation.

Slots

SlotDescription
(default)RuiTabList and RuiTabPanels (or matching tablist / tabpanel markup).

Events

EventDetailDescription
rui-change{ value: string }Emitted when the selected tab changes.

View helpers

ComponentRenders
RuiTabListrole="tablist" strip.
RuiTabrole="tab" button; id pairs with a RuiTabPanel.
RuiTabPanelsPanel group below the tab list.
RuiTabPanelrole="tabpanel"; id pairs with a RuiTab.

CSS classes

Public BEM classes (documented via @cssclass):

ClassDescription
.rui-tabs__listrole="tablist" strip.
.rui-tabs__tabrole="tab" button; underline/border per variant.
.rui-tabs__panelsPanel group.
.rui-tabs__panelrole="tabpanel"; hidden when not selected.

Theme roles

PartCSS variables consumed
Active indicator--primary
Focus ring--focus-ring
Boxed card / panels--background, --border, --surface-container-low, --shadow-sm, --radius-container, --p-inset