feat(fs.dev): Hide navbar when scrolling
This commit is contained in:
parent
43a89a85ad
commit
c065e6ec23
2 changed files with 44 additions and 15 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
import { useState, useEffect } from 'react'
|
||||||
import Logo from 'shared/components/logos/freesewing.js'
|
import Logo from 'shared/components/logos/freesewing.js'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import ThemePicker from 'shared/components/theme-picker.js'
|
import ThemePicker from 'shared/components/theme-picker.js'
|
||||||
|
@ -14,18 +15,46 @@ const Left = props => (
|
||||||
)
|
)
|
||||||
|
|
||||||
const Header = ({ app }) => {
|
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])
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<header className={`
|
<header className={`
|
||||||
|
fixed top-0 left-0
|
||||||
bg-neutral
|
bg-neutral
|
||||||
block
|
w-full
|
||||||
z-30
|
z-30
|
||||||
|
transition-transform
|
||||||
|
${show ? '': 'fixed top-0 left-0 -translate-y-20'}
|
||||||
`}>
|
`}>
|
||||||
<div className="max-w-6xl m-auto">
|
<div className="max-w-6xl m-auto">
|
||||||
<div className="p-2 flex flex-row gap-2 justify-between text-neutral-content">
|
<div className="p-2 flex flex-row gap-2 justify-between text-neutral-content">
|
||||||
<button
|
<button
|
||||||
className={`
|
className={`
|
||||||
btn border-base-100 text-base-100 btn-sm border border-transparent bg-transparent
|
btn btn-sm
|
||||||
hover:border hover:bg-transparent hover:border-base-100
|
text-base-100 bg-transparent
|
||||||
|
border border-transparent
|
||||||
|
hover:bg-transparent hover:border-base-100
|
||||||
|
sm:hidden
|
||||||
|
h-12
|
||||||
`}
|
`}
|
||||||
onClick={app.togglePrimaryMenu}>
|
onClick={app.togglePrimaryMenu}>
|
||||||
{app.primaryMenu
|
{app.primaryMenu
|
||||||
|
@ -33,12 +62,18 @@ const Header = ({ app }) => {
|
||||||
: <>Show menu <Right /></>
|
: <>Show menu <Right /></>
|
||||||
}
|
}
|
||||||
</button>
|
</button>
|
||||||
<Logo size={32} fill="currentColor" stroke={false} />
|
<div className="flex flex-row gap-2">
|
||||||
<Link href="/">
|
<Link href="/">
|
||||||
<a role="button" className="btn btn-link btn-sm text-neutral-content">
|
<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
|
freesewing.dev
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
|
</div>
|
||||||
<ThemePicker app={app} />
|
<ThemePicker app={app} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -76,12 +76,6 @@ const DefaultLayout = ({ app, title=false, children=[]}) => {
|
||||||
bg-base-100
|
bg-base-100
|
||||||
`}>
|
`}>
|
||||||
<Header app={app}/>
|
<Header app={app}/>
|
||||||
<div className={`
|
|
||||||
h-1 w-full theme-gradient ${app.loading ? 'loading' : ''}
|
|
||||||
fixed top-0 right-0 z-40
|
|
||||||
-mt-1
|
|
||||||
hidden sm:block
|
|
||||||
`}></div>
|
|
||||||
<main className={`
|
<main className={`
|
||||||
grow flex flex-row
|
grow flex flex-row
|
||||||
gap-2
|
gap-2
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue