import React, { FC, ReactNode } from 'react'
import { flexFlow } from '@monorail/helpers/flex'
import { Sizes, sizes } from '@monorail/helpers/size'
import styled, { css } from '@monorail/helpers/styled-components'
import { getThemeColor, ThemeColors } from '@monorail/helpers/theme'
import {
HorizontalNavigationController,
TabBarIndicatorProps,
} from '@monorail/metaComponents/horizontalNavigation/HorizontalNavigationController'
// TabBarIndicator is pos:abs to this element. Also we use offsetLeft on the Tab which references this position.
export const PageLevelNavBarContainer = styled.div(
({
theme: {
size: { page },
},
}) => css`
${flexFlow('row')};
${page.width !== 'auto' &&
`max-width: ${page.width + sizes.page.sideSpace * 2}px;`};
flex-shrink: 0;
height: ${Sizes.DP40}px;
margin-top: -4px;
padding: 0 ${sizes.page.sideSpace}px 0 ${sizes.page.sideSpace - 12}px;
position: relative;
`,
)
const tabBarIndicatorSideWidth = 3
const tabBarIndicatorBodyWidth = 10
const PageLevelNavBarIndicatorContainer = styled(
({ left, width, duration, ...otherProps }: TabBarIndicatorProps) => (
),
)(
({ left, duration }) => css`
${flexFlow('row')};
bottom: 1px;
height: 3px;
left: 0;
position: absolute;
transition-duration: ${duration}ms;
transition-property: all;
transition-timing-function: ease-in-out;
transform-origin: bottom left;
transform: translateX(${left}px);
`,
)
const PageLevelNavBarIndicatorLeft = styled.div`
background: ${getThemeColor(ThemeColors.ApplicationPrimary)};
border-radius: 3px 0 0 0;
height: 100%;
width: ${tabBarIndicatorSideWidth + 1}px;
position: absolute;
left: 0;
`
type PageLevelNavBarIndicatorSideProps = { duration: number; width: number }
const PageLevelNavBarIndicatorRight = styled(
({ duration, width, ...otherProps }: PageLevelNavBarIndicatorSideProps) => (
),
)(
({ duration, width }) => css`
background: ${getThemeColor(ThemeColors.ApplicationPrimary)};
border-radius: 0 3px 0 0;
height: 100%;
width: ${tabBarIndicatorSideWidth + 1}px;
transition-duration: ${duration}ms;
transition-property: all;
transition-timing-function: ease-in-out;
transform-origin: bottom left;
transform: translateX(
${width - tabBarIndicatorBodyWidth - tabBarIndicatorSideWidth - 1}px
);
`,
)
const PageLevelNavBarIndicatorBody = styled(
({ duration, width, ...otherProps }: PageLevelNavBarIndicatorSideProps) => (
),
)(
({ duration, width }) => css`
background: ${getThemeColor(ThemeColors.ApplicationPrimary)};
height: 100%;
width: ${tabBarIndicatorBodyWidth}px;
transition-duration: ${duration}ms;
transition-property: all;
transition-timing-function: ease-in-out;
transform-origin: bottom left;
transform: translateX(${tabBarIndicatorSideWidth}px)
scaleX(
${(width - tabBarIndicatorSideWidth * 2) / tabBarIndicatorBodyWidth}
);
`,
)
type PageLevelNavBarProps = {
activeTabIndex?: number
getActiveTabIndex?: (activeTabIndex: number) => void
actions?: ReactNode
}
export const PageLevelNavBar: FC = props => {
const {
actions,
children,
activeTabIndex,
getActiveTabIndex,
...domProps
} = props
return (
React.Children.toArray(children).filter(child => !!child).length >
0 ? (
) : null
}
activeTabIndex={activeTabIndex}
getActiveTabIndex={getActiveTabIndex}
>
{children}
)
}