You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.2 KiB
98 lines
2.2 KiB
import { |
|
Breakpoint, |
|
tabClasses as muiTabClasses, |
|
Tabs as MUITabs, |
|
tabsClasses as muiTabsClasses, |
|
useMediaQuery, |
|
useTheme, |
|
} from '@mui/material'; |
|
import { FC, useCallback, useMemo } from 'react'; |
|
|
|
import { BLUE, BORDER_RADIUS } from '../lib/consts/DEFAULT_THEME'; |
|
|
|
const TABS_MIN_HEIGHT = '1em'; |
|
const TABS_VERTICAL_MIN_HEIGHT = '1.8em'; |
|
|
|
const Tabs: FC<TabsProps> = ({ |
|
orientation: rawOrientation, |
|
variant = 'fullWidth', |
|
...restTabsProps |
|
}) => { |
|
const theme = useTheme(); |
|
|
|
const bp = useCallback( |
|
(breakpoint: Breakpoint) => theme.breakpoints.up(breakpoint), |
|
[theme], |
|
); |
|
|
|
const bpxs = useMediaQuery(bp('xs')); |
|
const bpsm = useMediaQuery(bp('sm')); |
|
const bpmd = useMediaQuery(bp('md')); |
|
const bplg = useMediaQuery(bp('lg')); |
|
const bpxl = useMediaQuery(bp('xl')); |
|
|
|
const mapToBreakpointUp: [Breakpoint, boolean][] = useMemo( |
|
() => [ |
|
['xs', bpxs], |
|
['sm', bpsm], |
|
['md', bpmd], |
|
['lg', bplg], |
|
['xl', bpxl], |
|
], |
|
[bplg, bpmd, bpsm, bpxl, bpxs], |
|
); |
|
|
|
const orientation = useMemo(() => { |
|
let result: TabsOrientation | undefined; |
|
|
|
if (typeof rawOrientation === 'object') { |
|
mapToBreakpointUp.some(([breakpoint, isUp]) => { |
|
if (isUp && rawOrientation[breakpoint]) { |
|
result = rawOrientation[breakpoint]; |
|
} |
|
|
|
return !isUp; |
|
}); |
|
} else { |
|
result = rawOrientation; |
|
} |
|
|
|
return result; |
|
}, [mapToBreakpointUp, rawOrientation]); |
|
|
|
return ( |
|
<MUITabs |
|
{...restTabsProps} |
|
orientation={orientation} |
|
variant={variant} |
|
sx={{ |
|
minHeight: TABS_MIN_HEIGHT, |
|
|
|
[`&.${muiTabsClasses.vertical}`]: { |
|
minHeight: TABS_VERTICAL_MIN_HEIGHT, |
|
|
|
[`& .${muiTabClasses.root}`]: { |
|
alignItems: 'flex-start', |
|
minHeight: TABS_VERTICAL_MIN_HEIGHT, |
|
paddingLeft: '2em', |
|
}, |
|
|
|
[`& .${muiTabsClasses.indicator}`]: { |
|
right: 'initial', |
|
}, |
|
}, |
|
|
|
[`& .${muiTabClasses.root}`]: { |
|
minHeight: TABS_MIN_HEIGHT, |
|
}, |
|
|
|
[`& .${muiTabsClasses.indicator}`]: { |
|
backgroundColor: BLUE, |
|
borderRadius: BORDER_RADIUS, |
|
}, |
|
}} |
|
/> |
|
); |
|
}; |
|
|
|
export default Tabs;
|
|
|