Tabs
Tabs are great to navigate between content. The active tab is highlighted, so the user always knows where they are.
Import
// Tree shakable import
import { Tabs, Tab } from '@bojagi/pablo';
// Or direct import
import { Tabs, Tab } from '@bojagi/pablo/Tab';
Examples
Simple Tabs
The simplest version of tabs you can find below. The Tabs component takes the selected value and onSelect callback.
The useState setter function can be passed directly. It's important to set the name on the Tab components because
they define the value that is passed to the onSelect callback function.
() => { const [selectedPage, setSelectedPage] = React.useState('home'); return ( <Tabs selected={selectedPage} onSelect={setSelectedPage}> <Tab name="home">Home</Tab> <Tab name="news">News</Tab> <Tab name="shop">Shop</Tab> </Tabs> ); }
If you want to go more barebone and take over the selection logic yourself, go with this example:
() => { const [selectedPage, setSelectedPage] = React.useState('home'); return ( <Tabs> <Tab name="home" selected={selectedPage==='home'} onClick={() => setSelectedPage('home')}>Home</Tab> <Tab name="news" selected={selectedPage==='news'} onClick={() => setSelectedPage('news')}>News</Tab> <Tab name="shop" selected={selectedPage==='shop'} onClick={() => setSelectedPage('shop')}>Shop</Tab> </Tabs> ); }
Tabs with icons
To make navigation and discoverability of tabs easier you can use icons.
In this example we are using icons from react-feather, but you can use any svg based iconset you want
(including your own ones).
() => { const [selectedPage, setSelectedPage] = React.useState('home'); return ( <Tabs selected={selectedPage} onSelect={setSelectedPage}> <Tab name="home" icon={<Home size={16} />}>Home</Tab> <Tab name="news" icon={<BookOpen size={16} />}>News</Tab> <Tab name="shop" icon={<ShoppingCart size={16} />}>Shop</Tab> </Tabs> ); }
Overflowing Tabs
Often you will find yourself in the situations where the tabs don't fit the parent (this can happen really quickly on mobile).
Tabs in Pablo handle overflowing automatically, so you don't need to worry about this. Additional content is shows within a Menu component.
Play around with resizing the below playground (grab the right border) and see how the tabs update as the screenspace gets smaller.
() => { const [selectedPage, setSelectedPage] = React.useState('a'); return ( <Tabs selected={selectedPage} onSelect={setSelectedPage}> <Tab name="a">AAAAAAAAAAAAAAAAA</Tab> <Tab name="b">BBBBBBBBBBBBBBBBB</Tab> <Tab name="c">CCCCCCCCCCCCCCCCC</Tab> <Tab name="d">DDDDDDDDDDDDDDDDD</Tab> <Tab name="e">EEEEEEEEEEEEEEEEE</Tab> <Tab name="f">FFFFFFFFFFFFFFFFF</Tab> <Tab name="g">GGGGGGGGGGGGGGGGG</Tab> <Tab name="h">HHHHHHHHHHHHHHHHH</Tab> <Tab name="i">IIIIIIIIIIIIIIIII</Tab> </Tabs> ); }
Custom styling
Like every other Pablo component you can customize the single parts of tabs.
() => { const [selectedPage, setSelectedPage] = React.useState('first'); const customstyles = { root: css` color: red; `, indicator: css` background-color: red; border-radius: 0; transform: rotate(10deg); `, hover: css` background-color: blue; `, }; return ( <Tabs selected={selectedPage} onSelect={setSelectedPage} customStyles={{ root: css` background-color: orange; `, }} > <Tab name="first" customStyles={customstyles}>First tab</Tab> <Tab name="second" customStyles={customstyles}>Second tab</Tab> <Tab name="third" customStyles={customstyles}>Third tab</Tab> </Tabs> ); }
Props
Tabs
| Name | Type | Default Value | Required | Description |
|---|
Tab
| Name | Type | Default Value | Required | Description |
|---|
Box props
Tabs
| Name | Type | Default Value | Required | Description |
|---|
Tab
| Name | Type | Default Value | Required | Description |
|---|