1
0
Fork 0
freesewing/packages/freesewing.dev/components/header.js

86 lines
2.8 KiB
JavaScript
Raw Normal View History

import { useState, useEffect } from 'react'
2021-12-26 16:43:35 +01:00
import Logo from 'shared/components/logos/freesewing.js'
import Link from 'next/link'
import ThemePicker from 'shared/components/theme-picker.js'
2021-12-26 16:43:35 +01:00
2021-12-25 14:14:18 +01:00
const Right = props => (
<svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 8l4 4m0 0l-4 4m4-4H3" />
</svg>
)
const Left = props => (
<svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 19l-7-7m0 0l7-7m-7 7h18" />
</svg>
)
const Header = ({ app }) => {
const [prevScrollPos, setPrevScrollPos] = useState(0)
const [show, setShow] = useState(true)
const handleScroll = () => {
const curScrollPos = (typeof window !== 'undefined') ? window.pageYOffset : 0
if (curScrollPos >= prevScrollPos) {
if (show && curScrollPos > 20) setShow(false)
}
else setShow(true)
setPrevScrollPos(curScrollPos)
}
useEffect(() => {
if (typeof window !== 'undefined') {
window.addEventListener('scroll', handleScroll)
return () => window.removeEventListener('scroll', handleScroll)
}
}, [prevScrollPos, show, handleScroll])
2021-12-25 14:14:18 +01:00
return (
<header className={`
fixed top-0 left-0
2021-12-26 12:52:00 +01:00
bg-neutral
w-full
2021-12-26 12:52:00 +01:00
z-30
transition-transform
${show ? '': 'fixed top-0 left-0 -translate-y-20'}
2021-12-25 14:14:18 +01:00
`}>
<div className="max-w-6xl m-auto">
<div className="p-2 flex flex-row gap-2 justify-between text-neutral-content">
<button
className={`
btn btn-sm
text-base-100 bg-transparent
border border-transparent
hover:bg-transparent hover:border-base-100
sm:hidden
h-12
`}
onClick={app.togglePrimaryMenu}>
{app.primaryMenu
? <><Left />&nbsp; Hide menu</>
: <>Show menu &nbsp;<Right /></>
}
</button>
<div className="flex flex-row gap-2">
<Link href="/">
<a className="flex flex-column items-center">
<Logo size={36} fill="currentColor" stroke={false} />
</a>
</Link>
<Link href="/">
<a role="button" className="btn btn-link btn-sm text-neutral-content h-12">
freesewing.dev
</a>
</Link>
</div>
<ThemePicker app={app} />
</div>
2021-12-26 12:52:00 +01:00
</div>
<div className={`theme-gradient h-1 w-full z-10 relative -mb-1 ${app.loading ? 'loading' : ''}`}></div>
2021-12-25 14:14:18 +01:00
</header>
)
}
export default Header