diff --git a/src/common/header/Header.jsx b/src/common/header/Header.jsx index 4e0a962c0..919f3bcd6 100644 --- a/src/common/header/Header.jsx +++ b/src/common/header/Header.jsx @@ -1,5 +1,5 @@ import HeaderNav from './HeaderNav'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { Link, useLocation } from 'react-router-dom'; import Countdown from 'react-countdown'; import './header.css'; @@ -10,6 +10,50 @@ const Header = () => { const pathName = location.pathname; const [reset, setReset] = useState({ search: false, filter: false }); + const [showNav, setShowNav] = useState(true); + const lastScrollY = useRef(0); + + useEffect(() => { + const handleScroll = () => { + const current = window.scrollY; + + const hero = document.getElementById('hero'); + + if (hero) { + const heroBottom = hero.getBoundingClientRect().bottom; + const headerHeight = 64; // your navbar height + + const banner = document.querySelector('.activity-timer-banner'); + const bannerHeight = banner?.offsetHeight || 0; + + if (heroBottom > headerHeight + bannerHeight) { + setShowNav(true); + lastScrollY.current = current; + + return; + } + } + + // after hero → direction based (with threshold) + const SCROLL_THRESHOLD = 20; + const diff = Math.abs(current - lastScrollY.current); + + // ignore tiny scrolls + if (diff < SCROLL_THRESHOLD) return; + + if (current > lastScrollY.current) { + setShowNav(false); // down + } else { + setShowNav(true); // up + } + + lastScrollY.current = current; + }; + + window.addEventListener('scroll', handleScroll); + + return () => window.removeEventListener('scroll', handleScroll); + }, []); useEffect(() => { if (location.state) { @@ -95,7 +139,7 @@ const Header = () => { }; return ( - <> +
{process.env.REACT_APP_ACTIVITIES_ON === 'true' && showHideBits.showActivityTimer && ( )} @@ -122,7 +166,7 @@ const Header = () => { - +
); }; diff --git a/src/common/header/header.css b/src/common/header/header.css index c9ae6cbe2..75f9a7edb 100644 --- a/src/common/header/header.css +++ b/src/common/header/header.css @@ -1,8 +1,9 @@ .app-header { - position: relative; + /* position: fixed; top: 0; right: 0; - left: 0; + left: 0; */ + transition: transform 0.3s ease; z-index: 10; display: flex; justify-content: space-between; @@ -14,6 +15,25 @@ padding: 0 1rem 0 0.6rem; } +.nav-wrapper { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 10; + transition: transform 0.3s ease; +} + +.nav--hidden { + transform: translateY(-100%); +} + +.nav--visible { + transform: translateY(0); +} + + + @media screen and (max-width: 768px) { .app-header { padding: 0 1rem 0 0.2rem; @@ -21,7 +41,7 @@ } .app-header-home { - position: sticky; + /* position: sticky; */ } .app-header-home.app-header-home--promo { diff --git a/src/common/home/Home.jsx b/src/common/home/Home.jsx index f54046896..074e90679 100644 --- a/src/common/home/Home.jsx +++ b/src/common/home/Home.jsx @@ -12,7 +12,7 @@ import DefaultBanner from 'common/defaultBanner/DefaultBanner'; const Home = () => { return (
-
+