Skip to content

[feat] 공용 레이아웃 구조 세팅 및 랜딩페이지 ui 구현#24

Merged
KyeongJooni merged 10 commits into
devfrom
feat/#23/layout-setting
Jul 23, 2026
Merged

[feat] 공용 레이아웃 구조 세팅 및 랜딩페이지 ui 구현#24
KyeongJooni merged 10 commits into
devfrom
feat/#23/layout-setting

Conversation

@KyeongJooni

@KyeongJooni KyeongJooni commented Jul 21, 2026

Copy link
Copy Markdown
Member

#️⃣ 연관된 이슈

📝 작업 내용

이번 PR에서 작업한 내용을 자세히 설명해주세요. 무엇을, 왜 바꿨는지가 드러나게 작성합니다.

  • 헤더/푸터가 있는 화면과 없는 화면을 구분하기 위해 AuthLayout(빈 레이아웃), LandingLayout(헤더+콘텐츠+푸터) 두 개의 라우트 레이아웃을 추가하고, router.tsx에서 페이지를 각 레이아웃 그룹 아래로 재배치했습니다.
  • Header/Footersrc/components 최상위에서 src/components/layout로 옮기고, Figma variant(default/carousel/tab/adm)에 맞춰 헤더를 재구현했습니다.
  • 기존 HomePage를 걷어내고 실제 Figma 랜딩 디자인 기준의 LandingPagesrc/features/landing 하위 도메인 컴포넌트(LandingHero, LandingContent, LandingFeatureGrid, LandingFeatureCard)로 대체했습니다.
  • 최초 방문 시 헤드라인 타이핑 효과 + 콘텐츠 순차 리빌 애니메이션을 재생하고, 재방문(3일 이내) 시 짧은 리빌만 재생하는 useLandingIntroAnimation 훅을 구현했습니다. 헤더는 translateY(-100%) 기반 슬라이드다운 애니메이션으로 별도 처리했습니다.
  • cn() 유틸리티가 프로젝트 커스텀 text-* 크기 클래스를 인식하지 못해 다른 텍스트 클래스와 병합 시 잘못 처리되던 문제를 tailwind-mergeextendTailwindMerge로 수정했습니다.
  • <html lang="en">이 실제 한국어 콘텐츠와 맞지 않아 크롬이 자동 번역을 제안하던 문제를 lang="ko"로 수정했습니다.
  • Header의 h-[50px], max-w-[1200px] 같은 임의값 클래스를 프로젝트 Tailwind 스케일에 맞는 h-12.5, max-w-300으로 정리했습니다.

✅ 체크사항

  • UI 동작 및 레이아웃 확인
  • 불필요한 console 제거
  • 기능 정상 동작
  • 팀 컨벤션에 맞게 구현했는지
  • 관련 문서 또는 주석을 갱신했는지

📸 스크린샷 (UI 변경 시)

UI 변경이 있는 경우 결과 화면 스크린샷을 첨부해주세요.

image

📦 추가한 라이브러리 (선택)

새로 추가한 라이브러리가 있다면 이름과 추가 이유를 작성해주세요.

💬 리뷰 요구사항 (선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요.

  • 인트로 애니메이션 지속시간/이징 값들은 여러 차례 조정한 값이라, 체감상 더 조정이 필요하면 말씀해주세요.

Summary by CodeRabbit

  • 새 기능
    • 새로운 랜딩 페이지(인트로 타이핑, 단계적 노출, 재방문 시 스킵)와 서비스 특징 카드 섹션 추가.
    • 랜딩/인증 영역을 위한 공통 레이아웃과 랜딩 전용 콘텐츠 구성 도입.
  • 개선
    • 상황에 따라 시작하기, 로그인/로그아웃, 탭·나가기 등 헤더 구성이 달라짐.
    • 모션 최소화 설정을 적용해 애니메이션 부담을 줄임.
  • 변경
    • 기존 홈 화면이 랜딩 기반 라우팅으로 전환.
    • 페이지 언어를 한국어로 변경.

@KyeongJooni KyeongJooni linked an issue Jul 21, 2026 that may be closed by this pull request
4 tasks
@KyeongJooni KyeongJooni self-assigned this Jul 21, 2026
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 844777ec-7a93-4671-8f69-c61f1bc6e4d9

📥 Commits

Reviewing files that changed from the base of the PR and between 9ffb411 and 2a26d57.

📒 Files selected for processing (1)
  • src/styles/index.css
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/styles/index.css

Walkthrough

공용 Header/Footer와 중첩 레이아웃 라우팅을 추가하고, 타이핑 인트로·재방문 스킵·reveal 애니메이션을 포함한 랜딩 페이지를 구현했습니다. 기존 HomePage 구조는 새 레이아웃 구조로 대체되었습니다.

Changes

공용 레이아웃과 랜딩 페이지

Layer / File(s) Summary
공용 레이아웃 컴포넌트
src/components/layout/*
variant별 Header, 링크와 문구를 포함한 Footer, Outlet 기반 AuthLayout을 추가했습니다.
랜딩 인트로와 콘텐츠
src/components/layout/LandingLayout.tsx, src/features/landing/*, src/pages/LandingPage/*
타이핑 인트로 상태를 Outlet context로 전달하고, 히어로 및 특징 카드 그리드를 렌더링합니다. reduced-motion과 3일간 재방문 스킵을 처리합니다.
라우팅과 랜딩 스타일 통합
src/routes/router.tsx, src/styles/index.css, src/utils/cn.ts, index.html
LandingLayout/AuthLayout 중첩 라우팅, 랜딩 애니메이션 스타일, typography 클래스 병합 규칙, 문서 언어를 추가했습니다.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Browser
  participant LandingLayout
  participant IntroHook as useLandingIntroAnimation
  participant LandingPage
  Browser->>LandingLayout: 랜딩 라우트 렌더링
  LandingLayout->>IntroHook: 문구와 타이핑 간격 전달
  IntroHook-->>LandingLayout: typedHeadline 및 완료 상태 반환
  LandingLayout->>LandingPage: Outlet context 전달
  LandingPage-->>Browser: 히어로와 특징 카드 렌더링
Loading

Possibly related PRs

Suggested reviewers: j2nnif2r, dahyun174

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 공용 레이아웃 구조와 랜딩페이지 구현이라는 실제 변경 범위를 잘 요약합니다.
Linked Issues check ✅ Passed 공용 레이아웃 셸 추가, 라우트 재구성, 랜딩페이지 구현이 #23의 요구사항과 일치합니다.
Out of Scope Changes check ✅ Passed 레이아웃과 랜딩페이지를 중심으로 한 변경만 보이며, 별도의 무관한 코드 변경은 보이지 않습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#23/layout-setting

Comment @coderabbitai help to get the list of available commands.

@KyeongJooni KyeongJooni added ✨ Feature 새로운 기능 🔧 Chore 기타 작업, 설정 labels Jul 21, 2026
@github-actions

Copy link
Copy Markdown

🚦 CI 검증 결과

항목 결과
🧠 TypeScript 타입 체크 success
🧹 ESLint 검사 success
🎨 Prettier 검사 success
🏗️ Build 검증 success

@KyeongJooni KyeongJooni changed the title Feat/#23/layout setting [feat] 공용 레이아웃 구조 세팅 및 랜딩페이지 구현 Jul 21, 2026
@KyeongJooni KyeongJooni changed the title [feat] 공용 레이아웃 구조 세팅 및 랜딩페이지 구현 [feat] 공용 레이아웃 구조 세팅 및 랜딩페이지 ui 구현 Jul 21, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/components/layout/Footer.tsx`:
- Around line 21-33: Update the footer navigation links in Footer to target
valid destinations instead of the undefined /about, /terms, /privacy, and
/contact paths. Add corresponding routes and pages in the router configuration,
or reuse existing page destinations, ensuring none of these links falls through
to the * NotFound route.

In `@src/components/layout/Header.tsx`:
- Around line 146-150: Update the Header CTA in the Header component so the
“시작하기” Button navigates to the intended signup or onboarding destination instead
of remaining a no-op button. Reuse the existing routing/link pattern or click
handler used by LandingLayout, while preserving the current HeaderShell and
HeaderLogo structure.

In `@src/features/landing/components/LandingContent.tsx`:
- Around line 13-18: Connect the CTA actions in LandingContent by passing the
defined start and login handlers as onStart and onLogin props to LandingHero, or
render those buttons as links to the existing flows. Ensure both LandingHero
buttons perform their intended navigation when clicked.

In `@src/styles/index.css`:
- Around line 110-118: Update the prefers-reduced-motion media query to
explicitly reset the transform on .landing-reveal--from-top, so the header
remains onscreen when animations are disabled. Preserve the existing opacity and
animation overrides for the other reveal and typing-cursor classes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 97f6318b-4451-450e-94b3-fa31cad10e9e

📥 Commits

Reviewing files that changed from the base of the PR and between ef68424 and 9ffb411.

📒 Files selected for processing (19)
  • index.html
  • src/components/Footer.tsx
  • src/components/Header.tsx
  • src/components/layout/.gitkeep
  • src/components/layout/AuthLayout.tsx
  • src/components/layout/Footer.tsx
  • src/components/layout/Header.tsx
  • src/components/layout/LandingLayout.tsx
  • src/features/landing/components/LandingContent.tsx
  • src/features/landing/components/LandingFeatureCard.tsx
  • src/features/landing/components/LandingFeatureGrid.tsx
  • src/features/landing/components/LandingHero.tsx
  • src/features/landing/hooks/useLandingIntroAnimation.ts
  • src/pages/HomePage/HomePage.tsx
  • src/pages/LandingPage/LandingPage.tsx
  • src/routes/router.tsx
  • src/styles/index.css
  • src/utils/.gitkeep
  • src/utils/cn.ts
💤 Files with no reviewable changes (3)
  • src/pages/HomePage/HomePage.tsx
  • src/components/Header.tsx
  • src/components/Footer.tsx

Comment on lines +21 to +33
<nav className="flex flex-1 items-center justify-center gap-10 text-body-small font-medium whitespace-nowrap text-text-primary">
<Link to="/about" className="hover:text-primary-500">
서비스소개
</Link>
<Link to="/terms" className="hover:text-primary-500">
이용약관
</Link>
<Link to="/privacy" className="hover:text-primary-500">
개인정보처리방침
</Link>
<Link to="/contact" className="hover:text-primary-500">
문의하기
</Link>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

푸터 링크가 모두 NotFound로 이동합니다.

src/routes/router.tsx:8-20에는 이 네 경로가 없어서 모두 * fallback으로 매칭됩니다. 실제 페이지와 라우트를 추가한 뒤 노출하거나, 현재 존재하는 목적지로 연결하세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/layout/Footer.tsx` around lines 21 - 33, Update the footer
navigation links in Footer to target valid destinations instead of the undefined
/about, /terms, /privacy, and /contact paths. Add corresponding routes and pages
in the router configuration, or reuse existing page destinations, ensuring none
of these links falls through to the * NotFound route.

Comment on lines +146 to +150
return (
<HeaderShell className={className}>
<HeaderLogo>Job.is</HeaderLogo>
<Button className="h-12.5">시작하기</Button>
</HeaderShell>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

button_file="$(fd -a -t f '^Button\.(tsx|ts)$' src/components/common | head -n 1)"
test -n "$button_file"

ast-grep outline "$button_file" --items all
sed -n '1,260p' "$button_file"
rg -n -C 3 '<Header\s*/>|<Header\b' src

Repository: Leets-Official/Job-is-FE

Length of output: 2185


src/components/layout/Header.tsx:146-150 — 랜딩 헤더 CTA에 목적지를 연결하세요. Button은 기본 <button type="button">이라 시작하기가 현재 아무 동작도 하지 않습니다. LandingLayout<Header />에 가입/온보딩 링크나 클릭 핸들러를 넣어야 합니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/layout/Header.tsx` around lines 146 - 150, Update the Header
CTA in the Header component so the “시작하기” Button navigates to the intended
signup or onboarding destination instead of remaining a no-op button. Reuse the
existing routing/link pattern or click handler used by LandingLayout, while
preserving the current HeaderShell and HeaderLogo structure.

Comment on lines +13 to +18
<LandingHero
headline={headline}
typedHeadline={typedHeadline}
isIntroComplete={isIntroComplete}
shouldPlayRevisitAnimation={shouldPlayRevisitAnimation}
/>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

CTA에 실제 전환 동작을 연결하세요.

onStartonLogin을 전달하지 않아 LandingHero의 두 버튼은 클릭해도 아무 동작을 하지 않습니다. 정의된 시작/로그인 흐름으로 이동하는 핸들러를 전달하거나 링크로 렌더링하세요.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/features/landing/components/LandingContent.tsx` around lines 13 - 18,
Connect the CTA actions in LandingContent by passing the defined start and login
handlers as onStart and onLogin props to LandingHero, or render those buttons as
links to the existing flows. Ensure both LandingHero buttons perform their
intended navigation when clicked.

Comment thread src/styles/index.css
Comment on lines +110 to +118
@media (prefers-reduced-motion: reduce) {
.landing-reveal {
opacity: 1;
}

.landing-reveal--visible,
.landing-typing-cursor::after {
animation: none;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

동작 줄이기 설정에서도 헤더를 표시하세요.

landing-reveal--from-toptranslateY(-100%)는 slide-down 애니메이션으로만 복구됩니다. 이 미디어쿼리가 애니메이션을 제거하면 헤더가 화면 밖에 남습니다.

수정 예시
 `@media` (prefers-reduced-motion: reduce) {
+  .landing-reveal--from-top {
+    transform: translateY(0);
+  }
+
   .landing-reveal {
     opacity: 1;
   }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
@media (prefers-reduced-motion: reduce) {
.landing-reveal {
opacity: 1;
}
.landing-reveal--visible,
.landing-typing-cursor::after {
animation: none;
}
`@media` (prefers-reduced-motion: reduce) {
.landing-reveal--from-top {
transform: translateY(0);
}
.landing-reveal {
opacity: 1;
}
.landing-reveal--visible,
.landing-typing-cursor::after {
animation: none;
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/styles/index.css` around lines 110 - 118, Update the
prefers-reduced-motion media query to explicitly reset the transform on
.landing-reveal--from-top, so the header remains onscreen when animations are
disabled. Preserve the existing opacity and animation overrides for the other
reveal and typing-cursor classes.

Comment thread index.html
@@ -1,5 +1,5 @@
<!doctype html>
<html lang="en">
<html lang="ko">

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

수고하셨습니다!

@KyeongJooni
KyeongJooni merged commit e7f1a5c into dev Jul 23, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔧 Chore 기타 작업, 설정 ✨ Feature 새로운 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 공용 레이아웃 구조 세팅 및 랜딩페이지 구현

2 participants