From 2252588bf2da1cb8b65ff15cc177d34872dbff37 Mon Sep 17 00:00:00 2001 From: Mina Choi Date: Mon, 21 Sep 2026 14:04:13 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[fix]=20solution/frontend:=20=EB=9E=9C?= =?UTF-8?q?=EB=94=A9(/)=20=EC=9E=85=EB=A0=A5=EC=B0=BD=C2=B7=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=A7=84=EC=9E=85=EC=A0=90=EC=9D=84=20=3F?= =?UTF-8?q?build=3D1=20=EB=92=A4=EB=A1=9C=20=EA=B0=90=EC=B6=98=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit / 를 그냥 열면 히어로 입력 폼과 헤더 로그인 링크가 항상 떠 있었다. 사장님 지시로 ?build=1 쿼리가 있을 때만 두 진입점을 보여주고, 평소 / 는 보여주기 화면으로만 쓴다. - LandingPage.tsx: useSearchParams 로 buildMode 계산, 히어로
을 그 값으로 감싼다 - MarketingShell.tsx: showAuthCta prop 추가(기본 true) — 랜딩만 buildMode 를 그대로 넘긴다 SSR 출력으로 확인: / 는 "가게 이름을 입력하세요"·"로그인" 둘 다 없음, /?build=1 은 둘 다 있음. tsc 통과. Co-Authored-By: Claude Sonnet 5 --- .../src/components/layout/MarketingShell.tsx | 12 ++- solution/frontend/src/pages/LandingPage.tsx | 82 ++++++++++--------- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/solution/frontend/src/components/layout/MarketingShell.tsx b/solution/frontend/src/components/layout/MarketingShell.tsx index 2acf72b..6ad75cd 100644 --- a/solution/frontend/src/components/layout/MarketingShell.tsx +++ b/solution/frontend/src/components/layout/MarketingShell.tsx @@ -17,7 +17,13 @@ const NAV = [ {to: '/pricing', label: '요금'}, ]; -export function MarketingShell({children}: {children: ReactNode}) { +export function MarketingShell({ + children, + showAuthCta = true, +}: { + children: ReactNode; + showAuthCta?: boolean; +}) { const user = useAuthStore((s) => s.user); return ( @@ -52,7 +58,7 @@ export function MarketingShell({children}: {children: ReactNode}) { 히어로의 큰 입력 카드가 이미 그 자리다 — 시작하는 문이 한 화면에 둘이면 어느 쪽이 진짜인지 고르게 만든다. 헤더는 로그인만 받는다. */} - {user ? ( + {showAuthCta && (user ? ( 로그인 - )} + ))} diff --git a/solution/frontend/src/pages/LandingPage.tsx b/solution/frontend/src/pages/LandingPage.tsx index 8352693..f21c30c 100644 --- a/solution/frontend/src/pages/LandingPage.tsx +++ b/solution/frontend/src/pages/LandingPage.tsx @@ -1,5 +1,5 @@ import {useState, type FormEvent} from 'react'; -import {Link, useNavigate} from 'react-router'; +import {Link, useNavigate, useSearchParams} from 'react-router'; import {ArrowRight, ArrowUp, Check} from 'lucide-react'; import {MarketingShell, Section, SectionHead} from '@/components/layout/MarketingShell'; import {ShowcaseGrid, ShowcasePeeks} from '@/features/marketing/ShowcaseGrid'; @@ -74,6 +74,8 @@ const HEADLINES = [ export function LandingPage() { const navigate = useNavigate(); const [query, setQuery] = useState(''); + const [searchParams] = useSearchParams(); + const buildMode = searchParams.get('build') === '1'; const submit = (event: FormEvent) => { event.preventDefault(); @@ -84,7 +86,7 @@ export function LandingPage() { }; return ( - + {/* ── 상단 ─────────────────────────────────────── */}
@@ -112,45 +114,47 @@ export function LandingPage() {
- -
- Web4Ai - - 가게 이름으로 시작 - - {/* 업종부터 고르고 싶은 사람을 위한 갈래. 위저드의 업종 단계로 바로 보낸다. */} - - 업종부터 고르기 - -
+ {buildMode && ( + +
+ Web4Ai + + 가게 이름으로 시작 + + {/* 업종부터 고르고 싶은 사람을 위한 갈래. 위저드의 업종 단계로 바로 보낸다. */} + + 업종부터 고르기 + +
- setQuery(e.target.value)} - placeholder="가게 이름을 입력하세요" - aria-label="가게 이름" - className="mt-4 w-full border-0 bg-transparent px-1 text-base outline-none placeholder:text-muted-foreground sm:text-lg" - /> + setQuery(e.target.value)} + placeholder="가게 이름을 입력하세요" + aria-label="가게 이름" + className="mt-4 w-full border-0 bg-transparent px-1 text-base outline-none placeholder:text-muted-foreground sm:text-lg" + /> -
-

- 숙박 · 카페 · 음식점 · 피부과 · 성형외과 -

- -
- +
+

+ 숙박 · 카페 · 음식점 · 피부과 · 성형외과 +

+ +
+ + )}
From 5952f0db62bdad956a1d51bf1d3418cc499d2b71 Mon Sep 17 00:00:00 2001 From: Mina Choi Date: Mon, 21 Sep 2026 14:16:10 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[fix]=20solution/frontend:=20=EB=9E=9C?= =?UTF-8?q?=EB=94=A9=20=EB=B6=80=EC=A0=9C("=EA=B0=80=EA=B2=8C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=ED=95=9C=20=EC=A4=84=EB=A1=9C...")=EB=8F=84=20=3Fb?= =?UTF-8?q?uild=3D1=20=EB=92=A4=EB=A1=9C=20=EA=B0=90=EC=B6=98=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 입력 폼만 감췄더니 그 위 부제가 입력창 없는 화면에 혼자 남아 어색했다. 같은 buildMode 로 감싼다. Co-Authored-By: Claude Sonnet 5 --- solution/frontend/src/pages/LandingPage.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/solution/frontend/src/pages/LandingPage.tsx b/solution/frontend/src/pages/LandingPage.tsx index f21c30c..bfdcd4c 100644 --- a/solution/frontend/src/pages/LandingPage.tsx +++ b/solution/frontend/src/pages/LandingPage.tsx @@ -103,9 +103,11 @@ export function LandingPage() { 홈페이지 -

- 가게 이름 한 줄로 시작해 보세요 -

+ {buildMode && ( +

+ 가게 이름 한 줄로 시작해 보세요 +

+ )} {/* ★ 입력 카드와 발행 사이트 띠를 **같은 밴드**에 겹친다(아임웹과 같은 구조). 띠를 카드 아래 따로 두면 첫 화면이 세로로 길어지고, 카드가 뜬금없이 혼자 뜬다. */} From c26bfb6951038f31ff7c85cab8df0ecadcb17093 Mon Sep 17 00:00:00 2001 From: Mina Choi Date: Mon, 21 Sep 2026 14:20:40 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[fix]=20solution/frontend:=20=EB=9E=9C?= =?UTF-8?q?=EB=94=A9=20=EC=9E=85=EB=A0=A5=EC=B0=BD=20=EA=B0=90=EC=B6=A4=20?= =?UTF-8?q?=EC=8B=9C=20=ED=97=A4=EB=93=9C=EB=9D=BC=EC=9D=B8=C2=B7=EC=87=BC?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EA=B0=84=EA=B2=A9=20=EB=B6=95?= =?UTF-8?q?=EA=B4=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 폼을 감췄더니 그 폼을 담던 relative 박스가 높이 0으로 접혀, top-1/2 로 그 박스 가운데에 앉던 쇼케이스 띠가 헤드라인 바로 아래로 붙어버렸다(사장님 스크린샷 실측). 폼이 없을 때만 min-h 로 그 자리를 대신 잡아준다. Co-Authored-By: Claude Sonnet 5 --- solution/frontend/src/pages/LandingPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solution/frontend/src/pages/LandingPage.tsx b/solution/frontend/src/pages/LandingPage.tsx index bfdcd4c..f32a6da 100644 --- a/solution/frontend/src/pages/LandingPage.tsx +++ b/solution/frontend/src/pages/LandingPage.tsx @@ -111,7 +111,7 @@ export function LandingPage() { {/* ★ 입력 카드와 발행 사이트 띠를 **같은 밴드**에 겹친다(아임웹과 같은 구조). 띠를 카드 아래 따로 두면 첫 화면이 세로로 길어지고, 카드가 뜬금없이 혼자 뜬다. */} -
+