2021-10-15 13:37:54 +00:00
|
|
|
import { h } from 'preact'
|
|
|
|
import { Link as ReactLink } from 'react-router-dom'
|
2021-10-20 14:33:06 +00:00
|
|
|
import { RightBox, StyledRow as Row, Modal, PositionedCross as CrossSvg } from './styles'
|
2021-10-15 13:37:54 +00:00
|
|
|
import { ImageLogo } from '../Logo'
|
2021-10-20 14:32:27 +00:00
|
|
|
import { useWindowSize } from '../../hooks/dom'
|
2021-10-15 13:37:54 +00:00
|
|
|
import Link from '../Link'
|
2021-10-20 14:32:27 +00:00
|
|
|
import { Span } from '../Text'
|
2021-10-15 13:37:54 +00:00
|
|
|
|
|
|
|
import navigation from '../../data/navigation'
|
2021-10-20 14:32:27 +00:00
|
|
|
import { colours, screenSizes, textSizes } from '../../assets/theme'
|
2021-10-20 14:33:06 +00:00
|
|
|
import { useTheme, useUiStore } from '../../store'
|
2021-10-15 13:37:54 +00:00
|
|
|
|
2021-10-20 14:33:06 +00:00
|
|
|
const Navigation = ({ theme = {}, lang = 'en', miniHeader, toggleMobileMenu }) => navigation[lang].map(navItem => (
|
2021-10-20 14:32:27 +00:00
|
|
|
<Link
|
|
|
|
navLink
|
|
|
|
to={navItem.to}
|
|
|
|
href={navItem.href}
|
2021-10-20 14:33:06 +00:00
|
|
|
onClick={toggleMobileMenu}
|
2021-10-20 14:32:27 +00:00
|
|
|
textProps={{
|
|
|
|
size: textSizes.xl,
|
2021-10-20 14:33:06 +00:00
|
|
|
colour: miniHeader ? theme.background : theme.foreground || colours.rose
|
2021-10-20 14:32:27 +00:00
|
|
|
}}>
|
|
|
|
{navItem.label}
|
|
|
|
</Link>
|
|
|
|
))
|
2021-10-15 13:37:54 +00:00
|
|
|
|
2021-10-20 14:33:06 +00:00
|
|
|
export const NavigationModal = ({ theme = {}, lang = 'en', headerTheme, ...rest }) => {
|
|
|
|
const { toggleMobileMenu } = useUiStore(store => store)
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Modal {...rest}>
|
|
|
|
<ReactLink to="/">
|
|
|
|
<ImageLogo />
|
|
|
|
</ReactLink>
|
|
|
|
<CrossSvg size={32} colour={theme.foreground} onClick={toggleMobileMenu} />
|
|
|
|
<div>
|
|
|
|
<Navigation theme={theme} lang={lang} headerTheme={theme} toggleMobileMenu={toggleMobileMenu} {...rest} />
|
|
|
|
</div>
|
|
|
|
</Modal>
|
|
|
|
)
|
|
|
|
}
|
2021-10-15 13:37:54 +00:00
|
|
|
|
2021-10-20 14:33:06 +00:00
|
|
|
const FullHeader = ({ theme = {}, lang = 'en', miniHeader, isMobile, ...rest }) => (
|
|
|
|
<Row align="center" justify="space-between" miniHeader={miniHeader} {...rest}>
|
2021-10-20 14:32:27 +00:00
|
|
|
{!miniHeader ? <ReactLink to="/">
|
|
|
|
<ImageLogo />
|
|
|
|
</ReactLink> : null}
|
|
|
|
{!isMobile ? (
|
|
|
|
<RightBox as="nav">
|
2021-10-20 14:33:06 +00:00
|
|
|
<Navigation theme={theme} lang={lang} miniHeader={miniHeader} {...rest} />
|
2021-10-20 14:32:27 +00:00
|
|
|
</RightBox>
|
2021-10-20 14:33:06 +00:00
|
|
|
) : <MobileMenuToggle miniHeader={miniHeader} />}
|
2021-10-15 13:37:54 +00:00
|
|
|
</Row>
|
|
|
|
)
|
|
|
|
|
2021-10-20 14:33:06 +00:00
|
|
|
export const MobileMenuToggle = ({ miniHeader, ...props }) => {
|
|
|
|
const { toggleMobileMenu } = useUiStore(store => store)
|
|
|
|
const { theme } = useTheme(store => store)
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Span
|
|
|
|
onClick={toggleMobileMenu}
|
|
|
|
size={textSizes.xl}
|
|
|
|
colour={miniHeader ? theme.background : theme.foreground || colours.rose}
|
|
|
|
fontFamily="Lunchtype24"
|
|
|
|
{...props}
|
|
|
|
> Menu</Span>)
|
|
|
|
}
|
|
|
|
|
2021-10-20 14:32:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
const Header = ({ miniHeader, theme, ...rest }) => {
|
|
|
|
const { width: screenWidth } = useWindowSize()
|
2021-10-20 14:33:06 +00:00
|
|
|
const { menuOpen } = useUiStore(store => store)
|
2021-10-20 14:32:27 +00:00
|
|
|
const isMobile = screenWidth < screenSizes.lg
|
|
|
|
|
2021-10-20 14:33:06 +00:00
|
|
|
return <FullHeader menuOpen={menuOpen} miniHeader={miniHeader} isMobile={isMobile} theme={theme} {...rest} />
|
2021-10-20 14:32:27 +00:00
|
|
|
}
|
2021-10-15 13:37:54 +00:00
|
|
|
|
|
|
|
export default Header
|