diff --git a/apps/spa/src/components/DynamicAnnouncementBar.tsx b/apps/spa/src/components/DynamicAnnouncementBar.tsx
index 396f294..9b7158a 100644
--- a/apps/spa/src/components/DynamicAnnouncementBar.tsx
+++ b/apps/spa/src/components/DynamicAnnouncementBar.tsx
@@ -16,7 +16,7 @@ export default function DynamicAnnouncementBar({ payload }: DynamicAnnouncementB
return (
{
- const onScroll = () => setScrolled(window.scrollY > 20)
+ const checkAnnouncement = () => {
+ const el = document.querySelector('.announcement-bar')
+ setHasAnnouncement(!!el)
+ }
+
+ checkAnnouncement()
+ const timer = setTimeout(checkAnnouncement, 300)
+
+ const onScroll = () => {
+ setScrolled(window.scrollY > 20)
+ checkAnnouncement()
+ }
window.addEventListener('scroll', onScroll, { passive: true })
// Check local orders periodically (or just on mount)
@@ -44,7 +56,10 @@ export default function Navbar({ categories = [], topOffsetClassName = 'top-0' }
try { setLocalOrdersCount(JSON.parse(stored).length) } catch (e) {}
}
- return () => window.removeEventListener('scroll', onScroll)
+ return () => {
+ window.removeEventListener('scroll', onScroll)
+ clearTimeout(timer)
+ }
}, [])
// Close mobile menu on route change
@@ -68,11 +83,17 @@ export default function Navbar({ categories = [], topOffsetClassName = 'top-0' }
const navLinkClass = ({ isActive }: { isActive: boolean }) =>
isActive ? 'text-spa-forest font-semibold' : 'text-spa-stone hover:text-spa-forest transition-colors'
+ const computedOffset = topOffsetClassName !== 'top-0'
+ ? topOffsetClassName
+ : (hasAnnouncement ? 'top-[32px] md:top-[40px]' : 'top-0')
+
+ const finalTopClassName = scrolled ? 'top-0' : computedOffset
+
return (
<>
{/* ── NAVBAR BAR ── */}