// Hooks
import { useState, useEffect, useContext } from 'react'
import { useTranslation } from 'next-i18next'
// Context
import { ModalContext } from 'shared/context/modal-context.mjs'
import { LoadingContext } from 'shared/context/loading-context.mjs'
// Components
import {
CommunityIcon,
DesignIcon,
DocsIcon,
MenuIcon,
RssIcon,
SearchIcon,
ShowcaseIcon,
UserIcon,
ThemeIcon,
I18nIcon,
} from 'shared/components/icons.mjs'
import { Ribbon } from 'shared/components/ribbon.mjs'
import Link from 'next/link'
import { ModalThemePicker, ns as themeNs } from 'shared/components/modal/theme-picker.mjs'
import { ModalLocalePicker, ns as localeNs } from 'shared/components/modal/locale-picker.mjs'
import { ModalMenu } from 'site/components/navigation/modal-menu.mjs'
export const ns = ['header', themeNs, localeNs]
const NavButton = ({ href, label, color, children, onClick = false, extraClasses = '' }) => {
const className =
'border-0 px-1 lg:px-4 text-base py-3 lg:py-4 text-center flex flex-col items-center 2xl:w-36 ' +
`hover:bg-${color}-400 text-${color}-400 hover:text-neutral grow lg:grow-0 ${extraClasses}`
const span = {label}
return onClick ? (
) : (
{children}
{span}
)
}
const NavSpacer = () => (
|
)
export const colors = {
menu: 'red',
designs: 'orange',
showcase: 'yellow',
docs: 'lime',
blog: 'green',
community: 'cyan',
theme: 'blue',
language: 'indigo',
search: 'violet',
account: 'purple',
}
const NavIcons = ({ setModal, setSearch }) => {
const { t } = useTranslation(['header'])
const iconSize = 'h-6 w-6 lg:h-12 lg:w-12'
return (
<>
setModal()}
label={t('header:menu')}
color={colors.menu}
>
setModal()}
label={t('header:theme')}
color={colors.theme}
>
setModal()}
label={t('header:language')}
color={colors.language}
>
setSearch(true)} label={t('header:search')} color={colors.search}>
>
)
}
export const Header = ({ setSearch }) => {
const { setModal } = useContext(ModalContext)
const { loading } = useContext(LoadingContext)
const [prevScrollPos, setPrevScrollPos] = useState(0)
const [show, setShow] = useState(true)
useEffect(() => {
if (typeof window !== 'undefined') {
const handleScroll = () => {
const curScrollPos = typeof window !== 'undefined' ? window.pageYOffset : 0
if (curScrollPos >= prevScrollPos) {
if (show && curScrollPos > 20) setShow(false)
} else setShow(true)
setPrevScrollPos(curScrollPos)
}
window.addEventListener('scroll', handleScroll)
return () => window.removeEventListener('scroll', handleScroll)
}
}, [prevScrollPos, show])
return (
{/* Non-mobile content */}
{/* Mobile content */}
)
}