Tonic UI
Getting StartedColor ModeColor StyleContributing
THEME
BordersBreakpointsColorsOutlinesPositionsSpacingSizesShadowsTypography
BUILDING BLOCKS
BoxControlBox
UTILITIES

Tabs

An accessible tabs component.

The Tab and TabPanel elements are associated by their order in the tree. None of the components are empty wrappers, each is associated with a real DOM element in the document, giving you maximum control over styling and composition.

Import

Usage

You can render any element within Tabs, but TabList should only have Tab as children, and TabPanels should have TabPanel as children.

Tabs expects TabList and TabPanels as children. The order doesn't matter, you can have tabs at the top, at the bottom, or both.

EDITABLE EXAMPLE

Accessing Internal state

<TabPanel> provides access to one internal state: isActive. Use the render prop pattern to access the internal states.

EDITABLE EXAMPLE

Tab variants and color

Tabs come in 3 different variants to style the tabs: line,enclosed, unstyled

EDITABLE EXAMPLE

Make a Tab disabled

When a Tab is disabled, it's skipped during keyboard navigation and it's not clickable.

EDITABLE EXAMPLE

Change the tabs alignment

You can change the alignment of the TabList by passing align prop. We support 3 sizes left, center, right.

EDITABLE EXAMPLE

Fitted Tabs

Stretch the tab list to fit the container by passing isFitted prop.

EDITABLE EXAMPLE

Styling the tab states manually

In event you need to create custom styles for the tabs. Simply set the variant to unstyled, and use the _selected, _hover, _active style props.

EDITABLE EXAMPLE

AutoSizer Table in the tab

EDITABLE EXAMPLE

Manually Activated Tabs

By default, Tabs are activated automatically. This means when you use the arrow keys to change tabs, the tab is activated and focused.

The content of a TabPanel should ideally be preloaded. However, if switching to a tab panel causes a network request and possibly a page refresh, there might be some notable latency and this might affect the experience for keyboard and screen reader users.

In this scenario, you should use a manually activated tab, it moves focus without activating the tabs. With focus on a specifc tab, users can activate a tab by pressing Space or Enter.

EDITABLE EXAMPLE

Data Tabs

If you'd like to drive your tabs with an array instead of using the granular components, you can create your own DataTabs component.

EDITABLE EXAMPLE

Accessibility

Keyboard

KeyAction
ArrowLeftMoves focus to the next tab
ArrowUpMoves focus to the previous tab
TabWhen focus moves into the tab list, places focus on the active tab element
Space or EnterActivates the tab if it was not activated automatically on focus
HomeMoves focus to the first tab
EndMoves focus to the last tab

ARIA roles

ComponentAriaUsage
Tabrole="tab"Indicates that it's a tab
aria-selectedSet to true a tab is selected and all other Tabs have it set to false.
aria-controlsSet to the id of its associated TabPanel
TabListidThe id of the TabPanel that's referencd by its associated Tab
aria-orientationSet to vertical or horizontal based on the value of the orientation prop.
role="tablist"Indicates that it's a tablist
aria-labelledbySet to the id of the Tab that labels the TabPanel.

Props

Tabs

NameTypeDefaultDescription
onChange(index: number) => voidThe callback to update the active tab index.
indexnumberThe controlled index of the tabs.
defaultIndexnumberThe index of the initial active tab.
activateOnKeypressbooleanIf true, keyboard navigation changes focus between tabs but doens't activate it. User will have to press Enter or Space to active it. This is deprecated and will be removed in the v1 release
isManualbooleanIf true, keyboard navigation changes focus between tabs but doens't activate it. User will have to press Enter or Space to active it
childrenReactNodeThe children of the switch.
variantline,enclosed, unstyledlineThe visual style of the tab.
orientationhorizontal, verticalhorizontalThe orientation of the tabs
isFittedbooleanIf true, the tabs will stretch to fill the available space

Tab

NameTypeDefaultDescription
disabledbooleanIf true, the user cannot interact with the control. This sets aria-disabled=true and you can style this state by passing the _disabled prop.

TabPanel

NameTypeDefaultDescription
childrenReactNode, (props: InternalState) => ReactNodeThe children of the TabPanel.