From d3efaba6f75a9cb3152c4b3616f112b2843b10dc Mon Sep 17 00:00:00 2001 From: mota Date: Mon, 13 Oct 2025 19:45:01 +0900 Subject: [PATCH] =?UTF-8?q?=E3=85=8B=E3=85=8B=E3=85=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/components/AppHeader.tsx | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/app/components/AppHeader.tsx b/src/app/components/AppHeader.tsx index d9ed2e9..97020f2 100644 --- a/src/app/components/AppHeader.tsx +++ b/src/app/components/AppHeader.tsx @@ -51,7 +51,10 @@ export function AppHeader() { const scheduleClose = React.useCallback(() => { cancelClose(); - closeTimer.current = window.setTimeout(() => setMegaOpen(false), 150); + closeTimer.current = window.setTimeout(() => { + setMegaOpen(false); + setOpenSlug(null); + }, 150); }, [cancelClose]); // 카테고리 로드 React.useEffect(() => { @@ -96,16 +99,33 @@ export function AppHeader() { if (!container) return; const containerRect = container.getBoundingClientRect(); const nextPositions: Record = {}; - const nextWidths: Record = {}; + const desiredWidths: Record = {}; + const minWidthsBySlug: Record = { community: 200 }; categories.forEach((cat) => { const itemEl = navItemRefs.current[cat.slug]; if (!itemEl) return; const r = itemEl.getBoundingClientRect(); nextPositions[cat.slug] = Math.max(0, r.left - containerRect.left); - nextWidths[cat.slug] = r.width; // 각 네비 항목의 실제 폭을 사용 + const baseWidth = r.width; // 각 네비 항목의 실제 폭을 기본값으로 사용 + const minWidth = minWidthsBySlug[cat.slug] ?? baseWidth; + desiredWidths[cat.slug] = Math.max(baseWidth, minWidth); }); setLeftPositions(nextPositions); - setBlockWidths(nextWidths); + + // 원하는 최소 폭을 기준으로 하되, 다음 항목의 시작점까지를 넘지 않도록 클램프 + const finalWidths: Record = {}; + const ordered = categories + .filter((c) => typeof nextPositions[c.slug] === "number") + .sort((a, b) => (nextPositions[a.slug]! - nextPositions[b.slug]!)); + ordered.forEach((cat, idx) => { + const currentLeft = nextPositions[cat.slug]!; + const desired = desiredWidths[cat.slug] ?? 0; + const maxAvail = idx < ordered.length - 1 + ? Math.max(0, nextPositions[ordered[idx + 1].slug]! - currentLeft) + : Math.max(0, containerRect.width - currentLeft); + finalWidths[cat.slug] = Math.min(desired, maxAvail); + }); + setBlockWidths(finalWidths); // 패널 높이 = 블록들 중 최대 높이 let maxH = 0; @@ -176,7 +196,7 @@ export function AppHeader() { {/*
{cat.name}
*/} -
+
{cat.boards.map((b) => (