diff --git a/components/header.tsx b/components/header.tsx index b00fc0e..ce60c4c 100644 --- a/components/header.tsx +++ b/components/header.tsx @@ -4,8 +4,10 @@ import { Menu, X } from "lucide-react" import Link from "next/link" import { usePathname } from "next/navigation" import * as React from "react" +import { createPortal } from "react-dom" import { Button } from "@/components/ui/button" +import { useHeaderOffset } from "@/lib/hooks/useHeaderOffset" import { cn } from "@/lib/utils" const navigation = [ @@ -22,7 +24,9 @@ const navigation = [ export function Header() { const [mobileMenuOpen, setMobileMenuOpen] = React.useState(false) const [scrolled, setScrolled] = React.useState(false) + const [mounted, setMounted] = React.useState(false) const pathname = usePathname() + const headerOffset = useHeaderOffset() ?? 64 React.useEffect(() => { const handleScroll = () => { @@ -32,6 +36,23 @@ export function Header() { return () => window.removeEventListener("scroll", handleScroll) }, []) + React.useEffect(() => { + setMounted(true) + }, []) + + React.useEffect(() => { + if (!mobileMenuOpen) { + return + } + + const previousOverflow = document.body.style.overflow + document.body.style.overflow = "hidden" + + return () => { + document.body.style.overflow = previousOverflow + } + }, [mobileMenuOpen]) + return (
-
) } diff --git a/lib/hooks/useHeaderOffset.ts b/lib/hooks/useHeaderOffset.ts index b327ec0..4894b80 100644 --- a/lib/hooks/useHeaderOffset.ts +++ b/lib/hooks/useHeaderOffset.ts @@ -16,13 +16,15 @@ export function useHeaderOffset(additionalOffset = 0) { } const updateOffset = () => { - const header = document.querySelector("header") - if (!header) { + const target = + document.querySelector("[data-header-height]") ?? + document.querySelector("header") + if (!target) { setOffset(additionalOffset) return } - const { height } = header.getBoundingClientRect() + const { height } = target.getBoundingClientRect() setOffset(height + additionalOffset) } @@ -31,10 +33,12 @@ export function useHeaderOffset(additionalOffset = 0) { let resizeObserver: ResizeObserver | null = null if (typeof ResizeObserver !== "undefined") { - const header = document.querySelector("header") - if (header) { + const target = + document.querySelector("[data-header-height]") ?? + document.querySelector("header") + if (target) { resizeObserver = new ResizeObserver(updateOffset) - resizeObserver.observe(header) + resizeObserver.observe(target) } }