/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* OpenCRVS is also distributed under the terms of the Civil Registration
* & Healthcare Disclaimer located at http://opencrvs.org/license.
*
* Copyright (C) The OpenCRVS Authors located at https://github.com/opencrvs/opencrvs-core/blob/master/AUTHORS.
*/
import * as React from 'react'
import { ReactElement } from 'react'
import styled from 'styled-components'
import { ICON_ALIGNMENT, TertiaryButton } from '../buttons'
import { colors } from '../colors'
import { BackArrow } from '../icons'
const Container = styled.div<{ size: ContentSize }>`
position: relative;
border-radius: 4px;
box-sizing: border-box;
margin: 24px auto;
max-width: ${({ size }) => {
switch (size) {
case 'large':
return '1140px'
case 'normal':
return '778px'
case 'small':
default:
return '568px'
}
}};
border: 1px solid ${({ theme }) => theme.colors.grey300};
background: ${({ theme }) => theme.colors.white};
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
margin: 0;
height: 100%;
border: 0;
border-radius: 0;
max-width: 100%;
}
`
const Header = styled.div`
position: relative;
display: flex;
justify-content: center;
flex-direction: column;
padding: 0 24px;
border-bottom: 1px solid ${({ theme }) => theme.colors.grey300};
@media (max-width: ${({ theme }) => theme.grid.breakpoints.lg}px) {
border: 0;
padding: 0;
}
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
margin: 0;
}
`
const TopActionBar = styled.div`
display: flex;
align-items: center;
gap: 8px;
`
export const SubHeader = styled.div`
padding-bottom: 24px;
color: ${({ theme }) => theme.colors.supportingCopy};
${({ theme }) => theme.fonts.reg16};
`
export const Body = styled.div`
color: ${({ theme }) => theme.colors.copy};
${({ theme }) => theme.fonts.reg16};
`
const Footer = styled.div`
display: flex;
padding: 24px;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
padding: 16px;
}
`
const HeaderBottom = styled.div`
display: flex;
padding: 0 0 24px;
width: 100%;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.lg}px) {
padding: 24px;
border-bottom: 1px solid ${({ theme }) => theme.colors.grey300};
}
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
padding: 0 16px 16px;
}
`
const TopTabBar = styled.div`
display: flex;
gap: 28px;
width: 100%;
margin: -24px 0;
padding: 0;
position: relative;
bottom: -1px;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
margin: -16px 0;
}
`
const TopFilterBar = styled.div`
display: flex;
flex-wrap: wrap;
gap: 8px;
`
const TopBar = styled.div<{ keepShowing?: boolean }>`
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
min-height: 64px;
padding: 12px 0;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.lg}px) {
${({ keepShowing }) => {
return !keepShowing ? 'display:none;' : 'padding:16px;'
}}
}
`
const BottomActionBar = styled.div<{
bottomActionDirection: 'row' | 'column'
}>`
width: 100%;
display: flex;
flex-direction: ${(props) => props.bottomActionDirection};
gap: 8px;
@media (max-width: ${({ theme }) => theme.grid.breakpoints.lg}px) {
flex-direction: column;
}
`
const BackButtonContainer = styled.div`
padding-left: 8px;
@media (min-width: ${({ theme }) => theme.grid.breakpoints.lg}px) {
display: none;
}
`
const TitleContainer = styled.div<{ titleColor?: keyof typeof colors }>`
display: flex;
gap: 16px;
align-items: center;
width: 0;
flex: 1;
color: ${({ theme, titleColor }) => titleColor && theme.colors[titleColor]};
`
const Title = styled.div`
${({ theme }) => theme.fonts.h1}
color: ${({ theme }) => theme.colors.copy};
`
const Icon = styled.div`
height: 24px;
background-color: ${({ theme }) => theme.colors.white};
@media (max-width: ${({ theme }) => theme.grid.breakpoints.lg}px) {
display: none;
}
`
const Contents = styled.div<{ noPadding?: boolean }>`
padding: ${(props) => (props.noPadding ? 0 : '24px')};
@media (max-width: ${({ theme }) => theme.grid.breakpoints.md}px) {
padding: ${(props) => (props.noPadding ? 0 : '16px')};
}
`
export enum ContentSize {
LARGE = 'large',
NORMAL = 'normal',
SMALL = 'small'
}
interface IProps {
id?: string
icon?: () => React.ReactNode
backButtonLabel?: string
backButtonAction?: () => void
title?: string | React.ReactNode
titleColor?: keyof typeof colors
showTitleOnMobile?: boolean
noPadding?: boolean
topActionButtons?: ReactElement[]
tabBarContent?: React.ReactNode
filterContent?: React.ReactNode
subtitle?: string | React.ReactNode
children?: React.ReactNode
bottomActionButtons?: ReactElement[]
bottomActionDirection?: 'row' | 'column'
size?: ContentSize
className?: string
}
export const UnstyledContent = ({
icon,
backButtonLabel,
backButtonAction,
title,
titleColor,
showTitleOnMobile,
topActionButtons,
tabBarContent,
filterContent,
noPadding,
subtitle,
children,
bottomActionButtons,
bottomActionDirection = 'row',
size = ContentSize.NORMAL,
className
}: IProps) => (
{backButtonLabel && (
}
onClick={backButtonAction}
>
{backButtonLabel}
)}
{(icon || title || topActionButtons) && (
{icon && {icon()}}
{title && {title}}
{topActionButtons && {topActionButtons}}
)}
{(filterContent || tabBarContent) && (
{tabBarContent && {tabBarContent}}
{filterContent && {filterContent}}
)}
{subtitle && {subtitle}}
{children && {children}}
{bottomActionButtons && (
)}
)
// Allows styling inside styled`` -template blocks
// https://web.archive.org/web/20220725170839/https://styled-components.com/docs/advanced#caveat
export const Content = styled(UnstyledContent)``