1- import { useEffect , useState } from "react"
1+ import { useEffect , useRef , useState } from "react"
22import { Link , NavLink , useLocation } from "react-router-dom"
33import { navLinks , STORE_URL } from "../data/site"
44import { BrandLogo } from "./BrandLogo"
55
66export function SiteNav ( ) {
7- const [ compact , setCompact ] = useState ( false )
8- const [ open , setOpen ] = useState ( false )
97 const location = useLocation ( )
10- const overHero = location . pathname === "/" && ! compact && ! open
8+ const [ open , setOpen ] = useState ( false )
9+ const [ pastHero , setPastHero ] = useState ( location . pathname !== "/" )
10+ const [ shown , setShown ] = useState ( true )
11+ const lastY = useRef ( 0 )
1112
1213 useEffect ( ( ) => {
1314 setOpen ( false )
15+ setShown ( true )
1416 } , [ location . pathname , location . hash ] )
1517
1618 useEffect ( ( ) => {
17- const onScroll = ( ) => setCompact ( window . scrollY > 24 )
18- onScroll ( )
19- window . addEventListener ( "scroll" , onScroll , { passive : true } )
20- return ( ) => window . removeEventListener ( "scroll" , onScroll )
21- } , [ ] )
19+ if ( location . pathname !== "/" ) {
20+ setPastHero ( true )
21+ lastY . current = window . scrollY
22+ return
23+ }
24+
25+ const update = ( ) => {
26+ const y = window . scrollY
27+ const delta = y - lastY . current
28+ lastY . current = y
29+ const past = y > window . innerHeight - 48
30+ setPastHero ( past )
31+
32+ if ( open ) {
33+ setShown ( true )
34+ return
35+ }
36+ if ( ! past || y < 16 ) {
37+ setShown ( true )
38+ return
39+ }
40+ if ( delta > 4 ) setShown ( false )
41+ else if ( delta < - 4 ) setShown ( true )
42+ }
43+
44+ lastY . current = window . scrollY
45+ update ( )
46+ window . addEventListener ( "scroll" , update , { passive : true } )
47+ window . addEventListener ( "resize" , update )
48+ return ( ) => {
49+ window . removeEventListener ( "scroll" , update )
50+ window . removeEventListener ( "resize" , update )
51+ }
52+ } , [ location . pathname , open ] )
53+
54+ const overHero = location . pathname === "/" && ! pastHero && ! open
2255
2356 const linkClass = overHero
2457 ? "text-[13px] tracking-wide text-white/80 transition-colors hover:text-white"
@@ -30,11 +63,11 @@ export function SiteNav() {
3063
3164 return (
3265 < header
33- className = { `fixed inset-x-0 top-0 z-40 transition-[padding,background-color,backdrop-filter] duration-500 ${
34- compact || open
66+ className = { `fixed inset-x-0 top-0 z-40 transition-[transform, padding,background-color,backdrop-filter] duration-500 ease-[cubic-bezier(0.16,1,0.3,1)] ${
67+ pastHero || open
3568 ? "bg-white/80 py-3 backdrop-blur-md"
3669 : "bg-transparent py-6"
37- } `}
70+ } ${ shown ? "translate-y-0" : "-translate-y-full" } `}
3871 >
3972 < div className = "mx-auto flex max-w-[1440px] items-center justify-between px-5 md:px-10" >
4073 < Link to = "/" className = "flex items-center" >
0 commit comments