Stripe | Financial Infrastructure to Grow Your Revenue

Stripe | Financial Infrastructure to Grow Your Revenue

4466 articles

Tabs component for Stripe Apps


Tabs component for Stripe Apps

Use tabs to display sections of content.

SDK version

Tabs are sections of content that display one panel of content at a time. The list of tab elements sits along the top edge of the currently displayed panel.

To add the Tabs component to your app:

Loading example...

<Box css={{width: 'fill'}}>
 <Tabs fitted>
 <TabList>
 {[1, 2].map((i) => (
 <Tab key={i} tabKey={i}>
 Tab {i}
 </Tab>
 ))}
 </TabList>
 <TabPanels>
 {[1, 2].map((i) => (
 <TabPanel key={i} tabKey={i}>
 <Box css={{backgroundColor: 'container', padding: 'large'}}>
 Tab panel {i}
 </Box>
 </TabPanel>
 ))}
 </TabPanels>
 </Tabs>
</Box>

Tabs props

PropertyType
childrenRequired React.ReactNode One or more TabList or TabPanels components.
fittedOptional boolean | undefined Whether or not the TabList should take up the entire width of its container.
onSelectionChangeOptional ((event: React.Key) => void) | undefined Callback to be fired when a Tab is selected.
selectedKeyOptional React.Key | undefined Key of the selected Tab when using it as a controlled component. Use with onSelectionChange to control the tab selection state.
sizeOptional ("small" | "medium" | "large") | undefined The size of the component.

Tab

The TabList component supports the selection of content. TabList is made up of a collection of Tab components. Each Tab can be uniquely identified with a tabKey prop. If you render Tab components using a map function, you must still add a key to satisfy the rules of React.

TabList props

PropertyType
childrenRequired React.ReactNode One or more Tab components.

Tab props

PropertyType
childrenRequired React.ReactNode The contents of the component.
disabledOptional boolean | undefined Whether or not the tab should be disabled.
idOptional string | undefined A unique identifier that controls selection using the Tabs component’s selectedKey prop.
tabKeyOptional Deprecated use the id prop instead. (React.Key | null) | undefined A unique identifier to use with the Tabs selectedKey.

TabPanel

The TabPanels component supports displaying panels of content with Tabs. TabPanels is made up of a collection of TabPanel components. Each TabPanel can be uniquely identified with a tabKey prop. If you render TabPanel components using a map function, you must still add a key to satisfy the rules of React.

TabPanel props

PropertyType
childrenRequired React.ReactNode The contents of the component.
idOptional string | undefined A unique identifier that controls selection using the Tabs component’s selectedKey prop.
tabKeyOptional Deprecated use the id prop instead. (React.Key | null) | undefined A unique identifier to use with the Tabs selectedKey.

Small Tabs

Loading example...

<Box css={{width: 'fill'}}>
 <Tabs size="small">
 <TabList>
 {[1, 2, 3, 4, 5].map((i) => (
 <Tab key={i} tabKey={i}>
 Tab {i}
 </Tab>
 ))}
 </TabList>
 <TabPanels>
 {[1, 2, 3, 4, 5].map((i) => (
 <TabPanel key={i} tabKey={i}>
 <Box css={{backgroundColor: 'container', padding: 'large'}}>
 Tab panel {i}
 </Box>
 </TabPanel>
 ))}
 </TabPanels>
 </Tabs>
</Box>

Disabled Tabs

Loading example...

<Box css={{width: 'fill'}}>
 <Tabs size="large" fitted>
 <TabList>
 <Tab tabKey="1">Tab</Tab>
 <Tab tabKey="2">Another Tab</Tab>
 <Tab tabKey="3" disabled>
 Disabled Tab
 </Tab>
 </TabList>
 <TabPanels>
 <TabPanel tabKey="1">
 <Box css={{backgroundColor: 'container', padding: 'large'}}>
 Test Tab Panel 1
 </Box>
 </TabPanel>
 <TabPanel tabKey="2">
 <Box css={{backgroundColor: 'container', padding: 'large'}}>
 Test Tab Panel 2
 </Box>
 </TabPanel>
 <TabPanel tabKey="3">
 <Box css={{backgroundColor: 'container', padding: 'large'}}>
 Test Tab Panel 3
 </Box>
 </TabPanel>
 </TabPanels>
 </Tabs>
</Box>

Unsupported uses

Tabs don’t support conditional content within fragments unless the fragment children are given the same key.

const [result] = React.useState(null);

return (
 <Box css={{width: 'fill'}}>
 <Tabs>
 <TabList>
 <Tab tabKey="1">
 <>
 {result ? (
 <Inline>View results</Inline>
 ) : (
 <Inline>Create results</Inline>
 )}
 </>
 </Tab>
 </TabList>
 <TabPanels>
 <TabPanel tabKey="1">
 <>
 {result ? (
 <Inline>Results</Inline>
 ) : (
 <Inline>No results yet</Inline>
 )}
 </>
 </TabPanel>
 </TabPanels>
 </Tabs>
 </Box>
)

To avoid unsupported uses of Tabs, use components instead of fragments. Alternatively, give the children of fragments a shared key.

Loading example...

const [result] = React.useState(null);

return (
 <Box css={{width: 'fill'}}>
 <Tabs>
 <TabList>
 <Tab tabKey="1">
 <Box>
 {result ? (
 <Inline>View results</Inline>
 ) : (
 <Inline>Create results</Inline>
 )}
 </Box>
 </Tab>
 </TabList>
 <TabPanels>
 <TabPanel tabKey="1">
 <>
 {result ? (
 <Inline key="tab-panel-results">Results</Inline>
 ) : (
 <Inline key="tab-panel-no-results">No results yet</Inline>
 )}
 </>
 </TabPanel>
 </TabPanels>
 </Tabs>
 </Box>
)

Controlled Tabs

Use the selectedKey prop from Tabs in combination with the tabKey prop from Tab and TabPanel to create a controlled component.

Loading example...

const [key, setSelectedKey] = React.useState<React.Key>('c');

return (
 <Box css={{width: 'fill'}}>
 <Tabs selectedKey={key} onSelectionChange={setSelectedKey}>
 <TabList>
 {['a', 'b', 'c', 'd', 'e'].map((key) => (
 <Tab key={key} tabKey={key}>
 Tab {key}
 </Tab>
 ))}
 </TabList>
 <TabPanels>
 {['a', 'b', 'c', 'd', 'e'].map((key) => (
 <TabPanel key={key} tabKey={key}>
 <Box css={{backgroundColor: 'container', padding: 'large'}}>
 Tab panel {key}
 </Box>
 </TabPanel>
 ))}
 </TabPanels>
 </Tabs>
 </Box>
)

See also

Last verified 2026-09-24

Is this helpful?