PromucFlow_constructor/app/client/src/components/ads/Tabs.tsx

127 lines
3.5 KiB
TypeScript
Raw Normal View History

import React from "react";
import { Tab, Tabs, TabList, TabPanel } from "react-tabs";
import "react-tabs/style/react-tabs.css";
import styled from "styled-components";
import { Icon, IconName } from "./Icon";
import { Size } from "./Button";
const TabsWrapper = styled.div<{ shouldOverflow?: boolean }>`
user-select: none;
border-radius: 0px;
height: 100%;
.ads-icon {
margin-right: ${props => props.theme.spaces[4]}px;
svg {
width: ${props => props.theme.spaces[9]}px;
height: ${props => props.theme.spaces[9]}px;
}
}
.react-tabs {
height: 100%;
}
.react-tabs__tab-panel {
height: calc(100% - 32px);
overflow: scroll;
}
.react-tabs__tab-list {
display: flex;
align-items: center;
border-bottom: 2px solid ${props => props.theme.colors.blackShades[3]};
color: ${props => props.theme.colors.blackShades[6]};
path {
fill: ${props => props.theme.colors.blackShades[6]};
}
${props =>
props.shouldOverflow &&
`
overflow-y: hidden;
overflow-x: auto;
white-space: nowrap;
`}
}
.react-tabs__tab {
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 0 ${props => props.theme.spaces[2]}px 0;
margin-right: ${props => props.theme.spaces[12] - 3}px;
text-align: center;
display: inline-flex;
align-items: center;
justify-content: center;
}
.react-tabs__tab:hover {
color: ${props => props.theme.colors.blackShades[9]};
path {
fill: ${props => props.theme.colors.blackShades[9]};
}
}
.react-tabs__tab:focus {
box-shadow: none;
border-bottom: ${props => props.theme.colors.info.main}
${props => props.theme.spaces[1] - 2}px solid;
path {
fill: ${props => props.theme.colors.blackShades[9]};
}
}
.react-tabs__tab--selected {
color: ${props => props.theme.colors.blackShades[9]};
border: 0px solid;
border-bottom: ${props => props.theme.colors.info.main}
${props => props.theme.spaces[1] - 2}px solid;
background-color: transparent;
path {
fill: ${props => props.theme.colors.blackShades[9]};
}
}
.react-tabs__tab:focus:after {
content: none;
height: ${props => props.theme.spaces[1] - 2}px;
background: ${props => props.theme.colors.info.main};
}
`;
const TabTitle = styled.span`
font-size: ${props => props.theme.typography.h4.fontSize}px;
font-weight: normal;
line-height: ${props => props.theme.typography.h4.lineHeight}px;
letter-spacing: ${props => props.theme.typography.h4.letterSpacing}px;
`;
type TabbedViewComponentType = {
tabs: Array<{
key: string;
title: string;
panelComponent: JSX.Element;
icon?: IconName;
}>;
selectedIndex?: number;
setSelectedIndex?: Function;
overflow?: boolean;
};
export const AdsTabComponent = (props: TabbedViewComponentType) => {
return (
<TabsWrapper shouldOverflow={props.overflow}>
<Tabs
selectedIndex={props.selectedIndex}
onSelect={(index: number) => {
props.setSelectedIndex && props.setSelectedIndex(index);
}}
>
<TabList>
{props.tabs.map(tab => (
<Tab key={tab.key}>
{tab.icon ? <Icon name={tab.icon} size={Size.large} /> : null}
<TabTitle>{tab.title}</TabTitle>
</Tab>
))}
</TabList>
{props.tabs.map(tab => (
<TabPanel key={tab.key}>{tab.panelComponent}</TabPanel>
))}
</Tabs>
</TabsWrapper>
);
};