Tabs organize content into multiple sections and allow users to navigate between them. The content under the set of tabs should be related and form a coherent unit.
<Tabsaria-label="History of Ancient Rome"><TabList><Itemkey="FoR">Founding of Rome</Item><Itemkey="MaR">Monarchy and Republic</Item><Itemkey="Emp">Empire</Item></TabList><TabPanels><Itemkey="FoR">
Arma virumque cano, Troiae qui primus ab oris.
</Item><Itemkey="MaR">
Senatus Populusque Romanus.
</Item><Itemkey="Emp">
Alea jacta est.
</Item></TabPanels></Tabs>
<Tabsaria-label="History of Ancient Rome"><TabList><Itemkey="FoR">Founding of Rome</Item><Itemkey="MaR">Monarchy and Republic</Item><Itemkey="Emp">Empire</Item></TabList><TabPanels><Itemkey="FoR">
Arma virumque cano, Troiae qui primus ab oris.
</Item><Itemkey="MaR">
Senatus Populusque Romanus.
</Item><Itemkey="Emp">
Alea jacta est.
</Item></TabPanels></Tabs>
<Tabsaria-label="History of Ancient Rome"><TabList><Itemkey="FoR">
Founding of Rome
</Item><Itemkey="MaR">
Monarchy and
Republic
</Item><Itemkey="Emp">
Empire
</Item></TabList><TabPanels><Itemkey="FoR">
Arma virumque
cano, Troiae qui
primus ab oris.
</Item><Itemkey="MaR">
Senatus
Populusque
Romanus.
</Item><Itemkey="Emp">
Alea jacta est.
</Item></TabPanels></Tabs>
Tabs expects <TabList> and <TabPanels> elements as children, however additional elements may wrap them to allow for layout flexibility. TabList and TabPanels follow the Collection Components API, accepting both static and dynamic collections. TabList and TabPanel accept <Item> elements as children,
each with a key prop. The key passed to the TabList <Item> must match its corresponding TabPanel <Item>.
Static collections, as in the previous example, can be used when the full list of tabs and their contents is known ahead of time.
Dynamic collections, as shown below, can be used when the options come from an external data source such as an API call, or update over time. As seen below, an iterable list of options is passed to the Tabs using the items prop.
Each item accepts a key prop, which is passed to the onSelectionChange handler to identify the selected item. Alternatively, if the item objects contain an id property, as shown in the example below, then this is used automatically and a key prop is not required.
See the Events section for more detail on selection.
functionExample(){lettabs=[{id: 1,name: 'Founding of Rome',children: 'Arma virumque cano, Troiae qui primus ab oris.'},{id: 2,name: 'Monarchy and Republic',children: 'Senatus Populusque Romanus.'},{id: 3,name: 'Empire',children: 'Alea jacta est.'}];let[tabId,setTabId]=React.useState(1);return(<><p>Current tab id: {tabId}</p><Tabsaria-label="History of Ancient Rome"items={tabs}onSelectionChange={setTabId}><TabList>{(item)=>(<Item>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Item>{item.children}</Item>)}</TabPanels></Tabs></>);}
functionExample(){lettabs=[{id: 1,name: 'Founding of Rome',children:
'Arma virumque cano, Troiae qui primus ab oris.'},{id: 2,name: 'Monarchy and Republic',children: 'Senatus Populusque Romanus.'},{id: 3,name: 'Empire',children: 'Alea jacta est.'}];let[tabId,setTabId]=React.useState(1);return(<><p>Current tab id: {tabId}</p><Tabsaria-label="History of Ancient Rome"items={tabs}onSelectionChange={setTabId}><TabList>{(item)=>(<Item>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Item>{item.children}</Item>)}</TabPanels></Tabs></>);}
functionExample(){lettabs=[{id: 1,name:
'Founding of Rome',children:
'Arma virumque cano, Troiae qui primus ab oris.'},{id: 2,name:
'Monarchy and Republic',children:
'Senatus Populusque Romanus.'},{id: 3,name: 'Empire',children:
'Alea jacta est.'}];let[tabId,setTabId]=React.useState(1);return(<><p>
Current tab id:
{' '}{tabId}</p><Tabsaria-label="History of Ancient Rome"items={tabs}onSelectionChange={setTabId}><TabList>{(item)=>(<Item>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Item>{item.children}</Item>)}</TabPanels></Tabs></>);}
To internationalize Tabs, a localized string should be passed as children to the TabList <Item>. Any text content within the Tab's panel should also be localized accordingly.
For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of Tabs is automatically flipped.
Icons can also be used in Tabs in addition to a text label. Tabs use Slots in order to style Icons and Text together.
<Tabsaria-label="History of Ancient Rome"><TabList><Itemkey="FoR"><Bookmark/><Text>Founding of Rome</Text></Item><Itemkey="MaR"><Calendar/><Text>Monarchy and Republic</Text></Item><Itemkey="Emp"><Dashboard/><Text>Empire</Text></Item></TabList><TabPanels><Itemkey="FoR">
Arma virumque cano, Troiae qui primus ab oris.
</Item><Itemkey="MaR">
Senatus Populusque Romanus.
</Item><Itemkey="Emp">
Alea jacta est.
</Item></TabPanels></Tabs>
<Tabsaria-label="History of Ancient Rome"><TabList><Itemkey="FoR"><Bookmark/><Text>Founding of Rome</Text></Item><Itemkey="MaR"><Calendar/><Text>Monarchy and Republic</Text></Item><Itemkey="Emp"><Dashboard/><Text>Empire</Text></Item></TabList><TabPanels><Itemkey="FoR">
Arma virumque cano, Troiae qui primus ab oris.
</Item><Itemkey="MaR">
Senatus Populusque Romanus.
</Item><Itemkey="Emp">
Alea jacta est.
</Item></TabPanels></Tabs>
<Tabsaria-label="History of Ancient Rome"><TabList><Itemkey="FoR"><Bookmark/><Text>
Founding of
Rome
</Text></Item><Itemkey="MaR"><Calendar/><Text>
Monarchy and
Republic
</Text></Item><Itemkey="Emp"><Dashboard/><Text>
Empire
</Text></Item></TabList><TabPanels><Itemkey="FoR">
Arma virumque
cano, Troiae qui
primus ab oris.
</Item><Itemkey="MaR">
Senatus
Populusque
Romanus.
</Item><Itemkey="Emp">
Alea jacta est.
</Item></TabPanels></Tabs>
If you need to add additional structure to Tabs such as buttons in-line with the TabList, we support this too.
TabList and TabPanels are not required to be the immediate children of Tabs.
While an aria-label is not explicitly required for a tab list, Tabs should be labeled using a aria-label in the absence of an ancestor landmark.
This will prevent screen readers from announcing non-focused tabs, allowing for a more focused experience.
Setting a selected tab can be done by using the defaultSelectedKey or selectedKey prop. The selected key corresponds to the key of an item. See Events for more details on selection events.
Additionally, see the react-statelySelection docs for caveats regarding selection prop typing.
Tabs supports selection via mouse, keyboard, and touch. You can handle all of these via the onSelectionChange prop. Tabs will pass the selected key to the onSelectionChange handler.
The following example uses an onSelectionChange handler to update the tab selection stored in React state.
functionExample(){lettabs=[{name: 'Triassic',children:
'The Triassic ranges roughly from 252 million to 201 million years ago, preceding the Jurassic Period.'},{name: 'Jurassic',children:
'The Jurassic ranges from 200 million years to 145 million years ago.'},{name: 'Cretaceous',children:
'The Cretaceous is the longest period of the Mesozoic, spanning from 145 million to 66 years ago.'}];let[timePeriod,setTimePeriod]=React.useState('Triassic');return(<><p>Selected time period: {timePeriod}</p><Tabsaria-label="Mesozoic time periods"items={tabs}selectedKey={timePeriod}onSelectionChange={setTimePeriod}><TabList>{(item)=>(<Itemkey={item.name}>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Itemkey={item.name}>{item.children}</Item>)}</TabPanels></Tabs></>);}
functionExample(){lettabs=[{name: 'Triassic',children:
'The Triassic ranges roughly from 252 million to 201 million years ago, preceding the Jurassic Period.'},{name: 'Jurassic',children:
'The Jurassic ranges from 200 million years to 145 million years ago.'},{name: 'Cretaceous',children:
'The Cretaceous is the longest period of the Mesozoic, spanning from 145 million to 66 years ago.'}];let[timePeriod,setTimePeriod]=React.useState('Triassic');return(<><p>Selected time period: {timePeriod}</p><Tabsaria-label="Mesozoic time periods"items={tabs}selectedKey={timePeriod}onSelectionChange={setTimePeriod}><TabList>{(item)=>(<Itemkey={item.name}>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Itemkey={item.name}>{item.children}</Item>)}</TabPanels></Tabs></>);}
functionExample(){lettabs=[{name: 'Triassic',children:
'The Triassic ranges roughly from 252 million to 201 million years ago, preceding the Jurassic Period.'},{name: 'Jurassic',children:
'The Jurassic ranges from 200 million years to 145 million years ago.'},{name: 'Cretaceous',children:
'The Cretaceous is the longest period of the Mesozoic, spanning from 145 million to 66 years ago.'}];let[timePeriod,setTimePeriod]=React.useState('Triassic');return(<><p>
Selected time
period:{' '}{timePeriod}</p><Tabsaria-label="Mesozoic time periods"items={tabs}selectedKey={timePeriod}onSelectionChange={setTimePeriod}><TabList>{(item)=>(<Itemkey={item.name}>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Itemkey={item.name}>{item.children}</Item>)}</TabPanels></Tabs></>);}
By default, pressing the arrow keys while focus is on a Tab will switch selection to the adjacent Tab in that direction, updating the content displayed accordingly. If you would like to prevent selection change
from happening automatically you can set the keyboardActivation prop to "manual". This will prevent tab selection from changing on arrow key press, requiring a subsequent Enter or Space key press to confirm
tab selection.
functionExample(){lettabs=[{name: 'Triassic',children:
'The Triassic ranges roughly from 252 million to 201 million years ago, preceding the Jurassic Period.'},{name: 'Jurassic',children:
'The Jurassic ranges from 200 million years to 145 million years ago.'},{name: 'Cretaceous',children:
'The Cretaceous is the longest period of the Mesozoic, spanning from 145 million to 66 years ago.'}];return(<Tabsaria-label="Mesozoic time periods"items={tabs}keyboardActivation="manual"><TabList>{(item)=>(<Itemkey={item.name}>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Itemkey={item.name}>{item.children}</Item>)}</TabPanels></Tabs>);}
functionExample(){lettabs=[{name: 'Triassic',children:
'The Triassic ranges roughly from 252 million to 201 million years ago, preceding the Jurassic Period.'},{name: 'Jurassic',children:
'The Jurassic ranges from 200 million years to 145 million years ago.'},{name: 'Cretaceous',children:
'The Cretaceous is the longest period of the Mesozoic, spanning from 145 million to 66 years ago.'}];return(<Tabsaria-label="Mesozoic time periods"items={tabs}keyboardActivation="manual"><TabList>{(item)=>(<Itemkey={item.name}>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Itemkey={item.name}>{item.children}</Item>)}</TabPanels></Tabs>);}
functionExample(){lettabs=[{name: 'Triassic',children:
'The Triassic ranges roughly from 252 million to 201 million years ago, preceding the Jurassic Period.'},{name: 'Jurassic',children:
'The Jurassic ranges from 200 million years to 145 million years ago.'},{name: 'Cretaceous',children:
'The Cretaceous is the longest period of the Mesozoic, spanning from 145 million to 66 years ago.'}];return(<Tabsaria-label="Mesozoic time periods"items={tabs}keyboardActivation="manual"><TabList>{(item)=>(<Itemkey={item.name}>{item.name}</Item>)}</TabList><TabPanels>{(item)=>(<Itemkey={item.name}>{item.children}</Item>)}</TabPanels></Tabs>);}
<Tabsaria-label="Chat log density example"density="compact"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs>
<Tabsaria-label="Chat log density example"density="compact"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs>
<Tabsaria-label="Chat log density example"density="compact"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior
chat history with
John Doe.
</Item><Itemkey="item2">
There is no prior
chat history with
Jane Doe.
</Item><Itemkey="item3">
There is no prior
chat history with
Joe Bloggs.
</Item></TabPanels></Tabs>
<Tabsaria-label="Chat log quiet example"isQuiet><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs>
<Tabsaria-label="Chat log quiet example"isQuiet><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs>
<Tabsaria-label="Chat log quiet example"isQuiet><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior
chat history with
John Doe.
</Item><Itemkey="item2">
There is no prior
chat history with
Jane Doe.
</Item><Itemkey="item3">
There is no prior
chat history with
Joe Bloggs.
</Item></TabPanels></Tabs>
<Flexdirection="column"rowGap="size-150"><Tabsaria-label="Chat log single tab disabled example"disabledKeys={['item2']}><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs><Tabsaria-label="Chat log all tabs disabled example"isDisabled><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs></Flex>
<Flexdirection="column"rowGap="size-150"><Tabsaria-label="Chat log single tab disabled example"disabledKeys={['item2']}><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs><Tabsaria-label="Chat log all tabs disabled example"isDisabled><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs></Flex>
<Flexdirection="column"rowGap="size-150"><Tabsaria-label="Chat log single tab disabled example"disabledKeys={['item2']}><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no
prior chat
history with
John Doe.
</Item><Itemkey="item2">
There is no
prior chat
history with
Jane Doe.
</Item><Itemkey="item3">
There is no
prior chat
history with
Joe Bloggs.
</Item></TabPanels></Tabs><Tabsaria-label="Chat log all tabs disabled example"isDisabled><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no
prior chat
history with
John Doe.
</Item><Itemkey="item2">
There is no
prior chat
history with
Jane Doe.
</Item><Itemkey="item3">
There is no
prior chat
history with
Joe Bloggs.
</Item></TabPanels></Tabs></Flex>
<Tabsaria-label="Chat log orientation example"orientation="vertical"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs>
<Tabsaria-label="Chat log orientation example"orientation="vertical"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs>
<Tabsaria-label="Chat log orientation example"orientation="vertical"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior
chat history with
John Doe.
</Item><Itemkey="item2">
There is no prior
chat history with
Jane Doe.
</Item><Itemkey="item3">
There is no prior
chat history with
Joe Bloggs.
</Item></TabPanels></Tabs>
If there isn't enough horizontal room to render every tab on a single line, the component will collapse all tabs into a Picker. Note that this does not apply to vertical Tabs.
Try the example below to see the above behavior.
functionExample(){let[collapse,setCollapse]=React.useState(false);return(<><divstyle={{width: collapse
? '150px'
: '300px',marginBottom: '50px',height: '150px',maxWidth: '100%'}}><Tabsaria-label="Chat log collapse example"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe Bloggs.
</Item></TabPanels></Tabs></div><Buttonvariant="primary"onPress={()=>setCollapse((collapse)=>!collapse)}>
Toggle tab container size.
</Button></>);}
functionExample(){let[collapse,setCollapse]=React.useState(false);return(<><divstyle={{width: collapse
? '150px'
: '300px',marginBottom: '50px',height: '150px',maxWidth: '100%'}}><Tabsaria-label="Chat log collapse example"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no prior chat history with John Doe.
</Item><Itemkey="item2">
There is no prior chat history with Jane Doe.
</Item><Itemkey="item3">
There is no prior chat history with Joe
Bloggs.
</Item></TabPanels></Tabs></div><Buttonvariant="primary"onPress={()=>setCollapse((collapse)=>!collapse)}>
Toggle tab container size.
</Button></>);}
functionExample(){let[collapse,setCollapse]=React.useState(false);return(<><divstyle={{width: collapse
? '150px'
: '300px',marginBottom:
'50px',height:
'150px',maxWidth:
'100%'}}><Tabsaria-label="Chat log collapse example"><TabList><Itemkey="item1">
John Doe
</Item><Itemkey="item2">
Jane Doe
</Item><Itemkey="item3">
Joe Bloggs
</Item></TabList><TabPanels><Itemkey="item1">
There is no
prior chat
history
with John
Doe.
</Item><Itemkey="item2">
There is no
prior chat
history
with Jane
Doe.
</Item><Itemkey="item3">
There is no
prior chat
history
with Joe
Bloggs.
</Item></TabPanels></Tabs></div><Buttonvariant="primary"onPress={()=>setCollapse((collapse)=>!collapse)}>
Toggle tab
container size.
</Button></>);}