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 ( - + {pages.map((page) => ( ))} + + setOpen((v) => !v)} + className="flex h-10 w-10 items-center justify-center md:hidden" + style={{ + color: solid + ? "var(--foreground)" + : "var(--hero-foreground)", + }} + > + {/* 3선 ↔ X. 가운데 선은 사라지고 위아래 선이 기울어진다. */} + + + + + + + + {open && ( + + + {pages.map((page) => ( + setOpen(false)} + className="border-b py-3.5 text-sm last:border-b-0" + style={{ + color: "var(--foreground)", + borderColor: "var(--border)", + }} + > + {page.title} + + ))} + + + )} ); }