Skip to content

feat: 서비스 소개 랜딩 페이지 구현 및 앱 시작 경로 변경#126

Merged
youngminss merged 30 commits intodevelopfrom
feature/service-landing-page
Mar 13, 2026
Merged

feat: 서비스 소개 랜딩 페이지 구현 및 앱 시작 경로 변경#126
youngminss merged 30 commits intodevelopfrom
feature/service-landing-page

Conversation

@youngminss
Copy link
Copy Markdown
Member

@youngminss youngminss commented Mar 3, 2026

🎯 PR 제목

feat: 서비스 소개 랜딩 페이지 구현 및 앱 시작 경로 변경

📑 작업 상세 내역

  • 기능 추가

    • Framer 레퍼런스 사이트를 기반으로 서비스 소개 랜딩 페이지(/)를 구현합니다
    • 기존 앱 시작 페이지를 /app 경로로 이동합니다
    • /gathering/create의 뒤로가기 경로를 /에서 /app으로 변경합니다
    • Framer CDN에서 서비스 소개용 이미지 에셋 12종을 다운로드하여 추가합니다
    • Navbar, Hero, Feature 1~5, CTA, Footer 섹션을 구현합니다
    • motion/reactuseInView를 활용한 스크롤 진입 애니메이션을 적용합니다
    • 푸터에 이용약관·개인정보 처리방침 외부 링크를 적용합니다
  • 리팩토링

    • 단일 파일로 구성된 ServiceLandingPage를 섹션별 컴포넌트로 분리합니다
    • ServiceLandingPage를 서버 컴포넌트로 전환하고 클라이언트 경계를 하위로 내립니다
    • Navbar 스크롤 감지 로직을 컴포넌트 내부로 이동합니다 (hero-sentinel ID 참조)
    • Hero 영역 Lottie를 @lottiefiles/react-lottie-player 직접 dynamic import로 개선합니다
    • SpeechBubble 내부 컴포넌트를 파일 최상위로 분리하고 변수명을 개선합니다
    • router.push를 Next.js Link로 교체합니다
  • 스타일

    • Hero, PainPoint, Feature 1~5, CTA, Footer 영역 UI를 수정합니다
    • Navbar에 Hero 섹션 통과 후 페이드인 등장 애니메이션을 적용합니다
  • 버그 수정

    • Hero 텍스트 애니메이션이 한 번에 등장하던 문제를 stagger 방식으로 수정합니다
    • useRef 타입 누락 및 Variants 타입 미선언으로 발생하던 TypeScript 오류를 해결합니다
    • Feature3 이미지가 전체 너비를 차지하던 문제를 max-w 제한으로 수정합니다
    • Feature4 이미지가 섹션 밖으로 노출되던 문제를 overflow-hidden으로 수정합니다
    • Feature1, 2, 5 섹션에서 이미지가 텍스트보다 먼저 노출되던 순서를 변경합니다
    • 존재하지 않는 DISTANCE_RANGE_LABEL export를 제거합니다
  • 기타 작업

    • pnpm format 적용 및 작업 중 생성된 참고용 스크린샷 파일을 제거합니다
    • eslint-plugin-perfectionist를 추가하고 import/export 정렬 lint 에러를 수정합니다

🙏 리뷰 요청 사항

  • 서비스 랜딩 페이지의 전반적인 UI/UX 및 레퍼런스 사이트와의 유사도를 확인해주세요.
  • 모바일 / 데스크탑 반응형 레이아웃이 의도대로 노출되는지 검토해주세요.
  • /app 경로 변경 이후 기존 앱 플로우(모임 생성 등)가 정상적으로 동작하는지 확인해주세요.
  • 서버 컴포넌트 전환 후 클라이언트 경계 분리가 적절한지 확인해주세요.

📃 참고 자료

🖼️ 작업 결과물

youngminss and others added 12 commits March 4, 2026 00:20
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add explicit Variants type annotation to heroContainerVariants and
heroItemVariants so TypeScript correctly resolves the ease string literal
against Framer Motion's Easing union type.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Feature3: add max-w-[400px] on mobile and max-w-[500px] on desktop so
  images don't stretch to full viewport width
- Feature4: switch section to overflow-hidden to clip images within
  section boundary; remove mb-[-140px] and z-10 from restaurant list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@youngminss youngminss added the ✨ Feature 기능 개발 label Mar 3, 2026
@youngminss youngminss self-assigned this Mar 3, 2026
@youngminss youngminss requested a review from RookieAND March 3, 2026 16:49
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 서비스의 새로운 소개 랜딩 페이지를 구현하고, 기존 앱의 시작 경로를 조정하여 사용자 경험을 개선하는 데 중점을 둡니다. 새로운 랜딩 페이지는 시각적으로 매력적인 애니메이션과 함께 서비스의 주요 기능을 소개하며, 기존 앱 기능과의 원활한 전환을 보장하기 위해 라우팅 변경 및 여러 UI/UX 버그 수정이 포함되었습니다.

Highlights

  • 서비스 소개 랜딩 페이지 구현: Framer 레퍼런스 사이트를 기반으로 새로운 서비스 소개 랜딩 페이지를 루트 경로(/)에 구현했습니다. Navbar, Hero, Feature 1~5, CTA, Footer 섹션이 포함되어 있으며, motion/reactuseInView를 활용한 스크롤 진입 애니메이션이 적용되었습니다.
  • 앱 시작 경로 변경: 기존 앱 시작 페이지를 /app 경로로 이동하고, /gathering/create 페이지의 뒤로가기 경로를 /에서 /app으로 변경하여 새로운 랜딩 페이지와 기존 앱 플로우가 분리되도록 했습니다.
  • UI/UX 개선 및 버그 수정: Hero 텍스트 애니메이션이 한 번에 등장하던 문제를 stagger 방식으로 수정하고, useRefVariants 타입 누락으로 인한 TypeScript 오류를 해결했습니다. 또한, Feature3 및 Feature4 섹션의 이미지 레이아웃 문제를 수정하고, Feature1, 2, 5 섹션에서 이미지와 텍스트의 노출 순서를 조정했습니다.
  • 이미지 에셋 추가: 서비스 소개 랜딩 페이지에 사용될 Framer CDN의 이미지 에셋 12종을 다운로드하여 추가했습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • app/app/page.tsx
    • 기존 랜딩 페이지 컴포넌트를 /app 경로에서 렌더링하도록 새 파일을 추가했습니다.
  • app/gathering/create/page.tsx
    • 모임 생성 페이지의 뒤로가기 버튼 경로를 /에서 /app으로 업데이트했습니다.
  • app/page.tsx
    • 루트 경로(/)에서 새로운 ServiceLandingPage 컴포넌트를 렌더링하도록 변경했습니다.
  • src/hooks/gathering/useOpinionForm.tsx
    • 코드 가독성을 위해 변수 선언 형식을 조정하고 세미콜론을 추가했습니다.
  • src/pageComponents/gathering/opinion/form/ToastLinkButton.tsx
    • Tailwind CSS 클래스 배열에 후행 쉼표를 추가하여 포맷팅을 개선했습니다.
  • src/pageComponents/serviceLanding/ServiceLandingPage.tsx
    • 새로운 서비스 소개 랜딩 페이지 컴포넌트를 구현했습니다. 이 컴포넌트는 Navbar, Hero, 5개의 Feature 섹션, CTA, Footer로 구성되며, 스크롤 기반 애니메이션을 포함합니다.
  • src/pageComponents/serviceLanding/index.ts
    • 새로 생성된 ServiceLandingPage 컴포넌트를 내보내도록 파일을 추가했습니다.
Activity
  • 아직 사람의 활동은 없습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@github-actions github-actions bot added ✨ Feature 기능 개발 and removed ✨ Feature 기능 개발 labels Mar 3, 2026
@youngminss youngminss added 📤 In Progress 현재 작업 중인 PR 입니다. and removed ✨ Feature 기능 개발 labels Mar 3, 2026
@github-actions github-actions bot added ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다 and removed 📤 In Progress 현재 작업 중인 PR 입니다. labels Mar 3, 2026
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 PR은 새로운 서비스 소개 랜딩 페이지를 구현하고 앱 라우팅 구조를 변경합니다. 리뷰에서는 새로운 랜딩 페이지 컴포넌트가 프로젝트 스타일 가이드를 잘 따르고 있는지, 특히 디자인 토큰 사용, 컴포넌트 구조, 스타일 및 애니메이션 관련 모범 사례를 중심으로 확인했습니다.


return (
<header
className={`ygi:fixed ygi:top-0 ygi:right-0 ygi:left-0 ygi:z-50 ygi:bg-white ygi:transition-shadow ygi:duration-300 ${scrolled ? "ygi:shadow-md" : ""}`}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

스타일 가이드(라인 295)에 따라, className에 조건부 클래스를 적용할 때 twJoin 유틸리티를 사용하는 것을 권장합니다. 템플릿 리터럴 대신 twJoin을 사용하면 클래스 목록을 더 명확하고 일관되게 관리할 수 있습니다. (tailwind-merge에서 twJoin을 import해야 합니다.)

Suggested change
className={`ygi:fixed ygi:top-0 ygi:right-0 ygi:left-0 ygi:z-50 ygi:bg-white ygi:transition-shadow ygi:duration-300 ${scrolled ? "ygi:shadow-md" : ""}`}
className={twJoin("ygi:fixed ygi:top-0 ygi:right-0 ygi:left-0 ygi:z-50 ygi:bg-white ygi:transition-shadow ygi:duration-300", scrolled && "ygi:shadow-md")}
References
  1. 조건부 클래스를 적용할 때는 twJoin을 사용해야 합니다. (link)

Comment on lines +27 to +32
<LandingLogoIcon
color="#1f2933"
width={80}
height={25}
aria-label="요기잇"
/>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

스타일 가이드(라인 308, 323)에 따라 하드코딩된 색상 값(#1f2933) 대신 text-primary와 같은 디자인 토큰을 사용해야 합니다. color 속성을 직접 사용하는 대신 className을 통해 텍스트 색상 토큰을 적용하는 것을 권장합니다.

Suggested change
<LandingLogoIcon
color="#1f2933"
width={80}
height={25}
aria-label="요기잇"
/>
<LandingLogoIcon
className="ygi:text-text-primary"
width={80}
height={25}
aria-label="요기잇"
/>
References
  1. 색상 값은 하드코딩하지 말고 항상 디자인 토큰을 사용해야 합니다. 사용 가능한 텍스트 색상 토큰 중 하나인 text-primary를 사용할 수 있습니다. (link)

return (
<section
ref={ref}
className="md:ygi:py-28 lg:ygi:px-10 ygi:bg-white ygi:px-6 ygi:py-20"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

스타일 가이드(라인 308, 481)에서는 간격(spacing)에 하드코딩된 값을 사용하는 것을 지양하고 디자인 토큰을 사용하도록 권장하고 있습니다. px-6, py-20, md:ygi:py-28, lg:ygi:px-10 등 임의의 숫자 값 대신 p-sm, py-md, px-lg와 같이 정의된 디자인 토큰을 사용해 주세요. 이 규칙은 파일 전반에 걸쳐 여러 곳에서 위반되고 있으니 함께 수정하는 것을 고려해 보세요.

References
  1. 간격, 색상, 타이포그래피 등에는 항상 디자인 토큰을 사용하고 하드코딩된 값을 피해야 합니다. (link)

Comment on lines +280 to +284
const feature3Screens = [
{ name: "feature-3-screen-a", dir: -1, height: 434 },
{ name: "feature-3-screen-b", dir: 1, height: 418 },
{ name: "feature-3-screen-c", dir: -1, height: 398 },
];
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

스타일 가이드(라인 217, 473)에 따라, 이 배열은 런타임에 변경되지 않는 상수 데이터이므로 as const를 사용하여 타입을 더 정확하게 추론하고 불변성을 보장하는 것이 좋습니다.

Suggested change
const feature3Screens = [
{ name: "feature-3-screen-a", dir: -1, height: 434 },
{ name: "feature-3-screen-b", dir: 1, height: 418 },
{ name: "feature-3-screen-c", dir: -1, height: 398 },
];
const feature3Screens = [
{ name: "feature-3-screen-a", dir: -1, height: 434 },
{ name: "feature-3-screen-b", dir: 1, height: 418 },
{ name: "feature-3-screen-c", dir: -1, height: 398 },
] as const;
References
  1. 상수 객체에는 as const를 사용하여 타입을 고정하고 불변성을 확보해야 합니다. (link)

Comment on lines +340 to +341
className="md:ygi:py-24 lg:ygi:px-10 ygi:overflow-hidden ygi:px-6 ygi:py-16"
style={{ backgroundColor: "#13181c" }}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

스타일 가이드(라인 308, 325)에 따라 하드코딩된 색상 값(#13181c) 대신 디자인 토큰을 사용해야 합니다. 인라인 스타일 대신 className을 통해 배경색 토큰(예: ygi:bg-palette-gray-900)을 적용해 주세요. 이 색상은 LandingFooter에서도 사용되므로 일관성을 위해 토큰으로 관리하는 것이 중요합니다.

Suggested change
className="md:ygi:py-24 lg:ygi:px-10 ygi:overflow-hidden ygi:px-6 ygi:py-16"
style={{ backgroundColor: "#13181c" }}
className="md:ygi:py-24 lg:ygi:px-10 ygi:overflow-hidden ygi:px-6 ygi:py-16 ygi:bg-palette-gray-900"
References
  1. 색상 값은 하드코딩하지 말고 항상 디자인 토큰을 사용해야 합니다. 배경색 토큰으로는 bg-primary, bg-secondary, bg-tertiary 등이 있습니다. (link)

</p>
<div className="ygi:flex ygi:gap-4">
<a
href="#"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

'이용약관' 링크의 href"#"로 설정되어 있습니다. 실제 서비스에서는 유효한 URL로 연결되어야 합니다. 구현 계획에 따라 실제 페이지 경로로 업데이트하거나, 아직 페이지가 없다면 관련 이슈를 생성하여 추적하는 것을 권장합니다.

return (
<div className="ygi:w-full ygi:overflow-x-hidden">
<Navbar />
<main className="ygi:pt-[65px]">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

pt-[65px]와 같이 하드코딩된 패딩 값은 유지보수를 어렵게 만들 수 있습니다. 다른 레이아웃 컴포넌트에서 ygi:pt-layout-header-height를 사용하고 있으므로, 일관성을 위해 이 값을 사용하는 것이 좋습니다.

Suggested change
<main className="ygi:pt-[65px]">
<main className="ygi:pt-layout-header-height">
References
  1. 하드코딩된 간격 값 대신 디자인 토큰을 사용해야 합니다. (라인 308) (link)

youngminss and others added 2 commits March 4, 2026 01:53
- Navbar CTA, Hero CTA, CtaSection 버튼을 <Link>로 교체
- 더 이상 사용하지 않는 useRouter import 제거

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@youngminss youngminss added ✨ Feature 기능 개발 📤 In Progress 현재 작업 중인 PR 입니다. and removed ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다 labels Mar 5, 2026
youngminss and others added 2 commits March 6, 2026 01:53
- Hero: orange bg, prominent logo, white CTA, replace char images with Lottie animation
- Add PainPointSection: dark bg with MeetingCompleteIllustration + "어디가지..?" copy
- Update FeatureText: remove badge chip, use plain caption + headline pattern
- Feature2: bg changed to #d5dae2, headline with inline orange span for "의견 입력"
- Feature3: bg changed to palette-gray-100 with new screen images
- Feature4: bg changed to palette-gray-700, new tooltip/restaurant images, scale+y animations
- Feature5: replace HTML OG card with Figma image, sequential directional fade animations per element (①②: left→right, ③④: right→left)
- CTA: "요기잇" highlighted in orange, white button
- Update all feature section images from Figma design
- Add speech bubbles with rounded SVG tails

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
youngminss and others added 14 commits March 11, 2026 17:00
- ServiceLandingPage를 서버 컴포넌트로 전환
- 각 섹션 및 공유 컴포넌트를 개별 파일로 분리
- useScrollReveal hook 별도 파일로 분리
- Navbar의 스크롤 감지 로직을 컴포넌트 내부로 이동 (hero-sentinel ID 참조)
- HeroSection에서 LandingIntroLottie 직접 사용 대신 Player dynamic import로 개선

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- TailLeft/TailRight를 SVGProps 기반으로 개선
- 하드코딩된 색상값을 colors 상수로 교체
- 인라인 style 대신 Tailwind 클래스로 색상 처리

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions github-actions bot added ✨ Feature 기능 개발 and removed ✨ Feature 기능 개발 📤 In Progress 현재 작업 중인 PR 입니다. labels Mar 13, 2026
@youngminss youngminss added the ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다 label Mar 13, 2026
@youngminss youngminss merged commit 556e740 into develop Mar 13, 2026
8 checks passed
github-actions bot pushed a commit that referenced this pull request Mar 13, 2026
## [2.2.0-beta.1](v2.1.5-beta.1...v2.2.0-beta.1) (2026-03-13)

### Features

* 서비스 소개 랜딩 페이지 구현 및 앱 시작 경로 변경 ([#126](#126)) ([556e740](556e740)), closes [#d5dae2](https://github.com/Nexters/yogieat/issues/d5dae2)
github-actions bot pushed a commit that referenced this pull request Mar 13, 2026
## [2.2.0](v2.1.6...v2.2.0) (2026-03-13)

### Features

* 서비스 소개 랜딩 페이지 구현 및 앱 시작 경로 변경 ([#126](#126)) ([556e740](556e740)), closes [#d5dae2](https://github.com/Nexters/yogieat/issues/d5dae2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 기능 개발 ☑️ Need Review 작업이 완료되어 리뷰를 기다리고 있는 PR 입니다

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant