Tabs
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.
install | yarn add @react-spectrum/tabs |
---|---|
version | 3.0.0-alpha.3 |
usage | import {Tabs, Item} from '@react-spectrum/tabs' |
Example#
import {Content} from '@react-spectrum/view';
import {Text} from '@react-spectrum/text';
<Tabs aria-label="History of Ancient Rome">
<Item title="Founding of Rome" key="FoR">
<Content marginTop="size-250" marginStart="size-125">
<Text>Arma virumque cano, Troiae qui primus ab oris.</Text>
</Content>
</Item>
<Item title="Monarchy and Republic" key="MaR">
<Content marginTop="size-250" marginStart="size-125">
<Text>Senatus Populusque Romanus.</Text>
</Content>
</Item>
<Item title="Empire" key="Emp">
<Content marginTop="size-250" marginStart="size-125">
<Text>Alea jacta est.</Text>
</Content>
</Item>
</Tabs>
import {Content} from '@react-spectrum/view';
import {Text} from '@react-spectrum/text';
<Tabs aria-label="History of Ancient Rome">
<Item title="Founding of Rome" key="FoR">
<Content marginTop="size-250" marginStart="size-125">
<Text>
Arma virumque cano, Troiae qui primus ab oris.
</Text>
</Content>
</Item>
<Item title="Monarchy and Republic" key="MaR">
<Content marginTop="size-250" marginStart="size-125">
<Text>Senatus Populusque Romanus.</Text>
</Content>
</Item>
<Item title="Empire" key="Emp">
<Content marginTop="size-250" marginStart="size-125">
<Text>Alea jacta est.</Text>
</Content>
</Item>
</Tabs>
import {Content} from '@react-spectrum/view';
import {Text} from '@react-spectrum/text';
<Tabs aria-label="History of Ancient Rome">
<Item
title="Founding of Rome"
key="FoR">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
Arma virumque
cano, Troiae
qui primus ab
oris.
</Text>
</Content>
</Item>
<Item
title="Monarchy and Republic"
key="MaR">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
Senatus
Populusque
Romanus.
</Text>
</Content>
</Item>
<Item
title="Empire"
key="Emp">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
Alea jacta est.
</Text>
</Content>
</Item>
</Tabs>
Content#
Tabs follows the Collection Components API, accepting both static and dynamic collections. Similar to Menu, Tabs accepts <Item>
elements as children,
each with a key
prop. The content of the Tab itself is defined via the title
prop passed to the <Item>
element whereas the contents of the Tab's panel are defined by the <Item>
element's children.
This can be seen in the example above, where each Tab's rendered title mirrors the string provided to the <Item>
's title
prop and the content of each Tab is populated by the <Item>
's children.
Static collections, as in this 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.
function Example() {
let tabs = [
{
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] = ReactuseState(1);
return (
<>
<p>Current tab id: tabId</p>
<Tabs
aria-label="History of Ancient Rome"
items= tabs
onSelectionChange= setTabId>
(item) => (
<Item title= itemname>
<Content marginTop="size-250" marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
</>
);
}
function Example() {
let tabs = [
{
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] = ReactuseState(1);
return (
<>
<p>Current tab id: tabId</p>
<Tabs
aria-label="History of Ancient Rome"
items= tabs
onSelectionChange= setTabId>
(item) => (
<Item title= itemname>
<Content
marginTop="size-250"
marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
</>
);
}
function Example() {
let tabs = [
{
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
] = ReactuseState(1);
return (
<>
<p>
Current tab id:' '
tabId
</p>
<Tabs
aria-label="History of Ancient Rome"
items= tabs
onSelectionChange=
setTabId
>
(item) => (
<Item
title=
itemname
>
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
itemchildren
</Text>
</Content>
</Item>
)
</Tabs>
</>
);
}
Internationalization#
To internationalize Tabs, a localized string should be passed to the title
of each 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.
Labeling#
Accessibility#
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.
Selection#
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.
function Example() {
let tabs = [
{id: 1 name: 'Keyboard Settings' children: 'No keyboard detected.'}
{id: 2 name: 'Mouse Settings' children: 'No mouse detected.'}
{id: 3 name: 'Gamepad Settings' children: 'No gamepad detected'}
];
let [tab setTab] = ReactuseState(2);
return (
<Flex gap="size-150" wrap>
<span id="label-2">Settings (uncontrolled)</span>
<Tabs
aria-labelledby="label-2"
items= tabs
defaultSelectedKey=2
marginBottom="size-400">
(item) => (
<Item title= itemname>
<Content marginTop="size-250" marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
<span id="label-3">Settings (controlled)</span>
<Tabs
aria-labelledby="label-3"
items= tabs
selectedKey= tab
onSelectionChange= setTab>
(item) => (
<Item title= itemname>
<Content marginTop="size-250" marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
</Flex>
);
}
function Example() {
let tabs = [
{
id: 1
name: 'Keyboard Settings'
children: 'No keyboard detected.'
}
{
id: 2
name: 'Mouse Settings'
children: 'No mouse detected.'
}
{
id: 3
name: 'Gamepad Settings'
children: 'No gamepad detected'
}
];
let [tab setTab] = ReactuseState(2);
return (
<Flex gap="size-150" wrap>
<span id="label-2">Settings (uncontrolled)</span>
<Tabs
aria-labelledby="label-2"
items= tabs
defaultSelectedKey=2
marginBottom="size-400">
(item) => (
<Item title= itemname>
<Content
marginTop="size-250"
marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
<span id="label-3">Settings (controlled)</span>
<Tabs
aria-labelledby="label-3"
items= tabs
selectedKey= tab
onSelectionChange= setTab>
(item) => (
<Item title= itemname>
<Content
marginTop="size-250"
marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
</Flex>
);
}
function Example() {
let tabs = [
{
id: 1
name:
'Keyboard Settings'
children:
'No keyboard detected.'
}
{
id: 2
name:
'Mouse Settings'
children:
'No mouse detected.'
}
{
id: 3
name:
'Gamepad Settings'
children:
'No gamepad detected'
}
];
let [
tab
setTab
] = ReactuseState(2);
return (
<Flex
gap="size-150"
wrap>
<span id="label-2">
Settings
(uncontrolled)
</span>
<Tabs
aria-labelledby="label-2"
items= tabs
defaultSelectedKey=
2
marginBottom="size-400">
(item) => (
<Item
title=
itemname
>
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
itemchildren
</Text>
</Content>
</Item>
)
</Tabs>
<span id="label-3">
Settings
(controlled)
</span>
<Tabs
aria-labelledby="label-3"
items= tabs
selectedKey= tab
onSelectionChange=
setTab
>
(item) => (
<Item
title=
itemname
>
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
itemchildren
</Text>
</Content>
</Item>
)
</Tabs>
</Flex>
);
}
Events#
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.
function Example() {
let tabs = [
{
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] = ReactuseState('Triassic');
return (
<>
<p>Selected time period: timePeriod</p>
<Tabs
aria-label="Mesozoic time periods"
items= tabs
selectedKey= timePeriod
onSelectionChange= setTimePeriod>
(item) => (
<Item title= itemname key= itemname>
<Content marginTop="size-250" marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
</>
);
}
function Example() {
let tabs = [
{
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] = ReactuseState(
'Triassic'
);
return (
<>
<p>Selected time period: timePeriod</p>
<Tabs
aria-label="Mesozoic time periods"
items= tabs
selectedKey= timePeriod
onSelectionChange= setTimePeriod>
(item) => (
<Item title= itemname key= itemname>
<Content
marginTop="size-250"
marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
</>
);
}
function Example() {
let tabs = [
{
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
] = ReactuseState(
'Triassic'
);
return (
<>
<p>
Selected time
period:' '
timePeriod
</p>
<Tabs
aria-label="Mesozoic time periods"
items= tabs
selectedKey=
timePeriod
onSelectionChange=
setTimePeriod
>
(item) => (
<Item
title=
itemname
key=
itemname
>
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
itemchildren
</Text>
</Content>
</Item>
)
</Tabs>
</>
);
}
Keyboard Activation#
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.
function Example() {
let tabs = [
{
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 (
<Tabs
aria-label="Mesozoic time periods"
items= tabs
keyboardActivation="manual">
(item) => (
<Item title= itemname key= itemname>
<Content marginTop="size-250" marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
);
}
function Example() {
let tabs = [
{
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 (
<Tabs
aria-label="Mesozoic time periods"
items= tabs
keyboardActivation="manual">
(item) => (
<Item title= itemname key= itemname>
<Content
marginTop="size-250"
marginStart="size-125">
<Text> itemchildren</Text>
</Content>
</Item>
)
</Tabs>
);
}
function Example() {
let tabs = [
{
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 (
<Tabs
aria-label="Mesozoic time periods"
items= tabs
keyboardActivation="manual">
(item) => (
<Item
title=
itemname
key=
itemname
>
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
itemchildren
</Text>
</Content>
</Item>
)
</Tabs>
);
}
Props#
Name | Type | Default | Description |
children | CollectionChildren<T> | — | The contents of the collection. |
isQuiet | boolean | — | Whether the Tabs should be displayed with a quiet style. |
density | 'compact' | 'regular' | 'regular' | Sets the amount of space between the Tab and the Tab rail. |
isDisabled | boolean | — | Whether Tabs are disabled. |
selectedKey | Key | — | The currently selected Tab key in the collection (controlled). |
defaultSelectedKey | Key | — | The initial selected Tab key in the collection (uncontrolled). |
keyboardActivation | 'automatic' | 'manual' | 'automatic' | Whether tabs are activated automatically on focus or manually. |
orientation | Orientation | 'horizontal' | The orientation of the tabs. |
items | Iterable<T> | — | Item objects in the collection. |
disabledKeys | Iterable<Key> | — | The item keys that are disabled. These items cannot be selected, focused, or otherwise interacted with. |
disallowEmptySelection | boolean | — | Whether the collection allows empty selection. |
Events
Name | Type | Default | Description |
onSelectionChange | (
(selectedItem: Key
)) => void | — | Handler that is called when the tab selection changes. |
Layout
Name | Type | Default | Description |
flex | string
| number
| boolean | — | When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN. |
flexGrow | number | — | When used in a flex layout, specifies how the element will grow to fit the space available. See MDN. |
flexShrink | number | — | When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN. |
flexBasis | number | string | — | When used in a flex layout, specifies the initial main size of the element. See MDN. |
alignSelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'center'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'stretch' | — | Overrides the alignItems property of a flex or grid container. See MDN. |
justifySelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch' | — | Specifies how the element is justified inside a flex or grid container. See MDN. |
order | number | — | The layout order for the element within a flex or grid container. See MDN. |
gridArea | string | — | When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN. |
gridColumn | string | — | When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN. |
gridRow | string | — | When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN. |
gridColumnStart | string | — | When used in a grid layout, specifies the starting column to span within the grid. See MDN. |
gridColumnEnd | string | — | When used in a grid layout, specifies the ending column to span within the grid. See MDN. |
gridRowStart | string | — | When used in a grid layout, specifies the starting row to span within the grid. See MDN. |
gridRowEnd | string | — | When used in a grid layout, specifies the ending row to span within the grid. See MDN. |
Spacing
Name | Type | Default | Description |
margin | DimensionValue | — | The margin for all four sides of the element. See MDN. |
marginTop | DimensionValue | — | The margin for the top side of the element. See MDN. |
marginBottom | DimensionValue | — | The margin for the bottom side of the element. See MDN. |
marginStart | DimensionValue | — | The margin for the logical start side of the element, depending on layout direction. See MDN. |
marginEnd | DimensionValue | — | The margin for the logical end side of an element, depending on layout direction. See MDN. |
marginX | DimensionValue | — | The margin for both the left and right sides of the element. See MDN. |
marginY | DimensionValue | — | The margin for both the top and bottom sides of the element. See MDN. |
Sizing
Name | Type | Default | Description |
width | DimensionValue | — | The width of the element. See MDN. |
minWidth | DimensionValue | — | The minimum width of the element. See MDN. |
maxWidth | DimensionValue | — | The maximum width of the element. See MDN. |
height | DimensionValue | — | The height of the element. See MDN. |
minHeight | DimensionValue | — | The minimum height of the element. See MDN. |
maxHeight | DimensionValue | — | The maximum height of the element. See MDN. |
Positioning
Name | Type | Default | Description |
position | 'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky' | — | Specifies how the element is positioned. See MDN. |
top | DimensionValue | — | The top position for the element. See MDN. |
bottom | DimensionValue | — | The bottom position for the element. See MDN. |
left | DimensionValue | — | The left position for the element. See MDN. Consider using start instead for RTL support. |
right | DimensionValue | — | The right position for the element. See MDN. Consider using start instead for RTL support. |
start | DimensionValue | — | The logical start position for the element, depending on layout direction. See MDN. |
end | DimensionValue | — | The logical end position for the element, depending on layout direction. See MDN. |
zIndex | number | — | The stacking order for the element. See MDN. |
isHidden | boolean | — | Hides the element. |
Accessibility
Name | Type | Default | Description |
id | string | — | The element's unique identifier. See MDN. |
aria-label | string | — | Defines a string value that labels the current element. |
aria-labelledby | string | — | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | — | Identifies the element (or elements) that describes the object. |
aria-details | string | — | Identifies the element (or elements) that provide a detailed, extended description for the object. |
Advanced
Name | Type | Default | Description |
UNSAFE_className | string | — | Sets the CSS className for the element. Only use as a last resort. Use style props instead. |
UNSAFE_style | CSSProperties | — | Sets inline style for the element. Only use as a last resort. Use style props instead. |
Visual options#
Density#
<Tabs aria-label="Chat log density example" density="compact">
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with John Doe.</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Jane Doe.</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Joe Bloggs.</Text>
</Content>
</Item>
</Tabs>
<Tabs
aria-label="Chat log density example"
density="compact">
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with John Doe.
</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with Jane Doe.
</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
<Tabs
aria-label="Chat log density example"
density="compact">
<Item
title="John Doe"
key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
John Doe.
</Text>
</Content>
</Item>
<Item
title="Jane Doe"
key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Jane Doe.
</Text>
</Content>
</Item>
<Item
title="Joe Bloggs"
key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
Quiet#
<Tabs aria-label="Chat log quiet example" isQuiet>
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with John Doe.</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Jane Doe.</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Joe Bloggs.</Text>
</Content>
</Item>
</Tabs>
<Tabs aria-label="Chat log quiet example" isQuiet>
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with John Doe.
</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with Jane Doe.
</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
<Tabs
aria-label="Chat log quiet example"
isQuiet>
<Item
title="John Doe"
key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
John Doe.
</Text>
</Content>
</Item>
<Item
title="Jane Doe"
key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Jane Doe.
</Text>
</Content>
</Item>
<Item
title="Joe Bloggs"
key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
Disabled#
<Flex direction="column" rowGap="size-150">
<Tabs
aria-label="Chat log single tab disabled example"
disabledKeys=['item2']>
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with John Doe.</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Jane Doe.</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Joe Bloggs.</Text>
</Content>
</Item>
</Tabs>
<Tabs aria-label="Chat log all tabs disabled example" isDisabled>
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with John Doe.</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Jane Doe.</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Joe Bloggs.</Text>
</Content>
</Item>
</Tabs>
</Flex>
<Flex direction="column" rowGap="size-150">
<Tabs
aria-label="Chat log single tab disabled example"
disabledKeys=['item2']>
<Item title="John Doe" key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with John Doe.
</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with Jane Doe.
</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
<Tabs
aria-label="Chat log all tabs disabled example"
isDisabled>
<Item title="John Doe" key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with John Doe.
</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with Jane Doe.
</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
</Flex>
<Flex
direction="column"
rowGap="size-150">
<Tabs
aria-label="Chat log single tab disabled example"
disabledKeys=[
'item2'
]>
<Item
title="John Doe"
key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
John Doe.
</Text>
</Content>
</Item>
<Item
title="Jane Doe"
key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Jane Doe.
</Text>
</Content>
</Item>
<Item
title="Joe Bloggs"
key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
<Tabs
aria-label="Chat log all tabs disabled example"
isDisabled>
<Item
title="John Doe"
key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
John Doe.
</Text>
</Content>
</Item>
<Item
title="Jane Doe"
key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Jane Doe.
</Text>
</Content>
</Item>
<Item
title="Joe Bloggs"
key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
</Flex>
Orientation#
<Tabs aria-label="Chat log orientation example" orientation="vertical">
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with John Doe.</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Jane Doe.</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Joe Bloggs.</Text>
</Content>
</Item>
</Tabs>
<Tabs
aria-label="Chat log orientation example"
orientation="vertical">
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with John Doe.
</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with Jane Doe.
</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>
There is no prior chat history with Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
<Tabs
aria-label="Chat log orientation example"
orientation="vertical">
<Item
title="John Doe"
key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
John Doe.
</Text>
</Content>
</Item>
<Item
title="Jane Doe"
key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Jane Doe.
</Text>
</Content>
</Item>
<Item
title="Joe Bloggs"
key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no
prior chat
history with
Joe Bloggs.
</Text>
</Content>
</Item>
</Tabs>
Collapse (overflow behavior)#
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.
function Example() {
let [collapse setCollapse] = ReactuseState(false);
return (
<>
<div
style={
width: collapse ? '100px' : '300px'
marginBottom: '50px'
height: '150px'
maxWidth: '100%'
}>
<Tabs aria-label="Chat log collapse example">
<Item title="John Doe" key="item1">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with John Doe.</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Jane Doe.</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content marginTop="size-250" marginStart="size-125">
<Text>There is no prior chat history with Joe Bloggs.</Text>
</Content>
</Item>
</Tabs>
</div>
<Button
variant="primary"
onPress=() => setCollapse((collapse) => !collapse)>
Toggle tab container size.
</Button>
</>
);
}
function Example() {
let [collapse setCollapse] = ReactuseState(false);
return (
<>
<div
style={
width: collapse ? '100px' : '300px'
marginBottom: '50px'
height: '150px'
maxWidth: '100%'
}>
<Tabs aria-label="Chat log collapse example">
<Item title="John Doe" key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with John
Doe.
</Text>
</Content>
</Item>
<Item title="Jane Doe" key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with Jane
Doe.
</Text>
</Content>
</Item>
<Item title="Joe Bloggs" key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is no prior chat history with Joe
Bloggs.
</Text>
</Content>
</Item>
</Tabs>
</div>
<Button
variant="primary"
onPress=() =>
setCollapse((collapse) => !collapse)
>
Toggle tab container size.
</Button>
</>
);
}
function Example() {
let [
collapse
setCollapse
] = ReactuseState(
false
);
return (
<>
<div
style={
width: collapse
? '100px'
: '300px'
marginBottom:
'50px'
height:
'150px'
maxWidth:
'100%'
}>
<Tabs aria-label="Chat log collapse example">
<Item
title="John Doe"
key="item1">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is
no prior
chat
history
with John
Doe.
</Text>
</Content>
</Item>
<Item
title="Jane Doe"
key="item2">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is
no prior
chat
history
with Jane
Doe.
</Text>
</Content>
</Item>
<Item
title="Joe Bloggs"
key="item3">
<Content
marginTop="size-250"
marginStart="size-125">
<Text>
There is
no prior
chat
history
with Joe
Bloggs.
</Text>
</Content>
</Item>
</Tabs>
</div>
<Button
variant="primary"
onPress=() =>
setCollapse(
(collapse) =>
!collapse
)
>
Toggle tab
container size.
</Button>
</>
);
}