import React, { FC, Fragment } from 'react' import posed from 'react-pose' import styled, { css, FlattenSimpleInterpolation, SimpleInterpolation, } from 'styled-components' import { baseDisabledStyles, BorderRadius, borderRadius, Colors, ease, flexFlow, FontSizes, getColor, gothamFontFamily, Sizes, transition, visible, } from '@monorail/helpers/exports' import { zIndex, ZIndexNodeName } from '@monorail/helpers/zIndex' import { PopOverToggleProps } from '@monorail/metaComponents/popOver/PopOver' import { CommonComponentType, CssOverridesType } from '@monorail/types' import { ButtonDisplay, IconButtonShape, } from '@monorail/visualComponents/buttons/buttonTypes' import { IconButton } from '@monorail/visualComponents/buttons/IconButton' import { BaseLink } from '@monorail/visualComponents/hyperLink/BaseLink' import { ScrollAnimation } from '@monorail/visualComponents/layout/ScrollAnimation' import { ListItem, ListItemGraphic, ListItemPrimaryText, ListItemSecondaryText, ListItemText, StyledListItemIcon, } from '@monorail/visualComponents/list/List' import { Text } from '@monorail/visualComponents/typography/Text' export const sideBarCollapsedTransitionDuration = 150 export const sideBarCollapsedTransition: (props: { properties?: Array isSideBarCollapsed: boolean }) => SimpleInterpolation = ({ properties = ['all'], isSideBarCollapsed }) => transition({ properties, easing: ease(isSideBarCollapsed), duration: sideBarCollapsedTransitionDuration, }) export enum SidebarContainerAnimationPose { Open = 'open', Collapsed = 'collapsed', } /* eslint-disable no-unexpected-multiline */ export const SidebarContainer = styled( posed.div({ [SidebarContainerAnimationPose.Open]: { width: 248, transition: { duration: sideBarCollapsedTransitionDuration, ease: 'easeIn', }, }, [SidebarContainerAnimationPose.Collapsed]: { width: 64, transition: { duration: sideBarCollapsedTransitionDuration, ease: 'easeOut', }, }, }), )< CommonComponentType & { pose: string backgroundColor: FlattenSimpleInterpolation } >` ${flexFlow()}; ${gothamFontFamily}; ${zIndex(ZIndexNodeName.SidebarContainer)}; background-color: #f4f4f7; ${props => { // eslint-disable-next-line @typescript-eslint/no-unsafe-return return props.backgroundColor }}; box-sizing: border-box; flex-shrink: 0; position: relative; will-change: width; &::after { background: linear-gradient( to right, rgba(0, 0, 0, 0.1) 0px, rgba(0, 0, 0, 0.1) 1px, rgba(0, 0, 0, 0.05) 1px, rgba(0, 0, 0, 0) 100% ); bottom: 0; content: ''; position: absolute; right: -3px; top: 0; width: 3px; } ` /* eslint-enable no-unexpected-multiline */ export const SidebarBack: FC<{ to: string title: string byline: string display?: ButtonDisplay shape?: IconButtonShape }> = ({ to, title, byline, display = ButtonDisplay.Secondary, shape = IconButtonShape.Square, ...domProps }) => ( {title} {byline} ) export const SidebarMenuContainerFullWidth = styled.div( () => css` height: unset; padding: 0; flex: 0; ${SideBarMenuDivider} { margin: 0; } `, ) export const SidebarMenuContainer = styled(ScrollAnimation)< CommonComponentType & { isSideBarCollapsed: boolean } >( ({ isSideBarCollapsed }) => css` padding: 0 12px; ${SideBarMenuDivider} { margin-left: 0; margin-right: 0; } ${isSideBarCollapsed && css` ${SideBarMenuDivider} { margin-left: -12px; margin-right: -12px; } `}; `, ) export const SidebarMenuItemDropDownToggle = styled( ({ title, subtitle, iconName, isActive, isSideBarCollapsed, ...domProps }) => ( {title} {subtitle} ), )< CommonComponentType & PopOverToggleProps & { disabled?: boolean title: string subtitle?: string iconName: string isSideBarCollapsed: boolean } >( ({ isActive, isSideBarCollapsed, cssOverrides, disabled }) => css` ${disabled && baseDisabledStyles}; ${borderRadius(BorderRadius.Medium)}; background: ${getColor(Colors.White)}; margin: 0 12px 8px; border: 1px solid ${isActive ? getColor(Colors.AccentPurple700) : getColor(Colors.White)}; color: ${isActive ? getColor(Colors.AccentPurple700) : getColor(Colors.BrandDarkBlue)}; &:hover, &:active { background: ${getColor(Colors.White)}; } &:hover { border-color: ${!isActive && getColor(Colors.AccentPurple500)}; } &:active { border-color: ${getColor(Colors.AccentPurple700)}; color: ${getColor(Colors.AccentPurple700)}; } /* stylelint-disable selector-type-no-unknown */ &:active, &:active ${StyledListItemIcon} { color: ${getColor(Colors.AccentPurple700)}; } /* stylelint-enable selector-type-no-unknown */ ${ListItemText} { ${visible(!isSideBarCollapsed)}; ${/* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment */ sideBarCollapsedTransition({ isSideBarCollapsed })}; } ${cssOverrides}; `, ) type SideBarMenuCollapsedProps = { isSideBarCollapsed: boolean } export const SideBarMenuDivider = styled.div( ({ isSideBarCollapsed = false }) => css` background: ${getColor(Colors.Grey90)}; height: 1px; margin: 15px 12px 16px; flex-shrink: 0; transition: margin ${ease(isSideBarCollapsed)} ${sideBarCollapsedTransitionDuration}ms; ${isSideBarCollapsed && css` margin-left: 0px; margin-right: 0px; `}; `, ) export const SideBarMenuHeader: FC<{ isSideBarCollapsed: boolean header: string fontSize?: FontSizes cssOverrides?: CssOverridesType }> = ({ header, isSideBarCollapsed, fontSize = FontSizes.Title5, cssOverrides, }) => ( {header .split(' ') .map((word: string, index: number, list: Array) => { return ( {word.charAt(0)} {word.slice(1)} ) })} )