diff --git a/src/components/site/site-header-bar.tsx b/src/components/site/site-header-bar.tsx index 352bc5a..6409d9d 100644 --- a/src/components/site/site-header-bar.tsx +++ b/src/components/site/site-header-bar.tsx @@ -2,6 +2,7 @@ import Link from "next/link"; import { useEffect, useState } from "react"; +import { usePathname } from "next/navigation"; import { SiteLogo } from "@/components/site/site-logo"; import { pagePath } from "@/lib/sections"; @@ -13,6 +14,7 @@ type NavPage = { /** * 고정 헤더. 히어로 위에서는 투명+밝은 글자, 스크롤하면 면이 생긴다. + * md 미만에서는 메뉴 대신 햄버거 버튼 → 아래로 패널이 열린다. * 요파트너스 `.nav` / `.nav.scrolled` 와 같은 레이아웃 역할. */ export function SiteHeaderBar({ @@ -23,6 +25,8 @@ export function SiteHeaderBar({ pages: NavPage[]; }) { const [scrolled, setScrolled] = useState(false); + const [open, setOpen] = useState(false); + const pathname = usePathname(); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 24); @@ -31,12 +35,31 @@ export function SiteHeaderBar({ return () => window.removeEventListener("scroll", onScroll); }, []); + // 페이지를 이동하면 패널을 닫는다. + const [prevPath, setPrevPath] = useState(pathname); + if (pathname !== prevPath) { + setPrevPath(pathname); + setOpen(false); + } + + useEffect(() => { + if (!open) return; + const onKey = (e: KeyboardEvent) => { + if (e.key === "Escape") setOpen(false); + }; + window.addEventListener("keydown", onKey); + return () => window.removeEventListener("keydown", onKey); + }, [open]); + + // 패널이 열려 있으면 헤더도 면을 가져야 패널과 한 덩어리로 보인다. + const solid = scrolled || open; + return (
-
); }