-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Tabs.tsx
100 lines (84 loc) · 2.08 KB
/
Tabs.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import { makeStyles } from '@material-ui/core'
import React from 'react'
import { Tabs as OGTabs, TabList, Tab, TabPanels, TabPanel } from '@reach/tabs'
import Breakpoints from '../data/breakpoints'
import Colors from '../data/colors.json'
interface TabProps {
tabNames: string[]
tabItems: React.ReactElement[]
}
const useStyles = makeStyles({
nav: {
display: 'grid',
margin: 0,
marginBottom: 16,
gridTemplateColumns: 'repeat(auto-fit, minmax(10px, 1fr))',
[Breakpoints.between.phone.and.bigPhone]: {
gridTemplateColumns: '1fr 1fr',
gridTemplateRows: 'repeat(auto-fit, minmax(10px, 1fr))',
},
[Breakpoints.upTo.phone]: {
gridTemplateColumns: '1fr',
gridTemplateRows: 'repeat(auto-fit, minmax(10px, 1fr))',
},
},
tab: {
padding: 16,
color: '#000',
textAlign: 'center',
font: 'inherit',
fontWeight: 'bold',
cursor: 'pointer',
position: 'relative',
appearance: 'none',
border: 'none',
background: 'none',
[Breakpoints.upTo.phone]: {
padding: 12,
},
'&[aria-selected="true"]': {
background: '#000',
color: '#fff',
},
'&::after': {
content: '""',
position: 'absolute',
top: 0,
right: 0,
bottom: 0,
left: 0,
},
'&:hover::after': {
border: `2px solid #000`,
},
'&:focus': {
outline: `4px solid ${Colors.primaryBlue}`,
'&:not(:focus-visible)': {
outline: 'none',
},
},
},
})
const Tabs: React.FC<TabProps> = ({ tabNames, tabItems }) => {
const classes = useStyles()
if (tabNames.length !== tabItems.length) {
throw new Error('Different amount of tabNames and tabItems provided.')
}
return (
<OGTabs>
<TabList className={classes.nav}>
{tabNames.map(name => (
<Tab key={name} className={classes.tab}>
{name}
</Tab>
))}
</TabList>
<TabPanels>
{tabItems.map((tab, i) => (
<TabPanel key={tabNames[i]}>{tab}</TabPanel>
))}
</TabPanels>
</OGTabs>
)
}
export default Tabs