Skip to content

feat: 인증/온보딩 페이지 ui 제작#29

Merged
KyeongJooni merged 40 commits into
devfrom
feat/#26/auth-page
Jul 25, 2026
Merged

feat: 인증/온보딩 페이지 ui 제작#29
KyeongJooni merged 40 commits into
devfrom
feat/#26/auth-page

Conversation

@KyeongJooni

@KyeongJooni KyeongJooni commented Jul 25, 2026

Copy link
Copy Markdown
Member

#️⃣ 연관된 이슈

📝 작업 내용

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

  • 구글/카카오 소셜 로그인 페이지, 로그인 실패 페이지, OAuth 콜백 페이지를 추가해 로그인 진입점을 구성했습니다.
  • 온보딩 3단계(프로필 입력 / 퀴즈 / 확인) 페이지와 이용약관 페이지를 추가했습니다.
  • 헤더와 랜딩 페이지의 "시작하기"/"로그인" 동작을 /login으로 연결하고, MainLayout 레이아웃 셸과 라우터에 로그인/온보딩/정책/콜백/추천 라우트를 등록했습니다.
  • 추천 페이지를 RecommendationPendingPage에서 RecommendationsPage로 이름을 바꿔, 이후 추천카드 도착 상태를 같은 라우트 안에서 분기 렌더링할 수 있는 구조로 정리했습니다(상태 분기 로직 자체는 이번 PR에 포함되지 않았습니다 — 관련 API가 아직 없습니다).
  • 피드백 UI 컴포넌트(Alert, ProgressStepper, ResultIcon, Spinner)를 components/common에서 components/feedback으로 이동했습니다.
  • 공용 컴포넌트를 보완했습니다: Button/Tab에 cursor-pointer, Tag에 select variant, CarouselArrow에 크기 variant, CarouselIndicator에 전환 애니메이션을 추가했습니다.
  • JobCard의 임의값 Tailwind 클래스를 스케일 클래스로 정리하고, 전역 애니메이션 정의를 src/styles/global.css로 분리했습니다.
  • 커밋 컨벤션에 style 타입을 추가하고, CodeRabbit 리뷰 지침을 보강했습니다.

✅ 체크사항

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

📸 스크린샷 (UI 변경 시)

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

image image image image image image

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

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

💬 리뷰 요구사항 (선택)

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

  • 소셜 로그인/OAuth 콜백은 실제 백엔드 연동 없이 페이지 구조만 구현되어, 로그인 성공/실패 흐름이 실제로 동작하는지는 별도 확인이 필요합니다.

Summary by CodeRabbit

  • 새 기능

    • 소셜 로그인, 로그인 실패·이메일 인증 안내 및 OAuth 콜백 화면을 추가했습니다.
    • 약관 동의, 프로필 입력, 퀴즈, 확인으로 이어지는 온보딩 흐름을 제공합니다.
    • 추천 편지의 대기·소개·탐색·완료·재방문 화면을 지원합니다.
    • 진행 단계, 선택 가능한 태그, 다양한 크기의 캐러셀 화살표를 추가했습니다.
  • 개선

    • 랜딩·온보딩·추천 화면에 전환 애니메이션을 적용했습니다.
    • 버튼과 탭의 상호작용 커서 및 체크박스 전환 효과를 개선했습니다.
    • 모션 감소 설정을 존중하도록 접근성을 보완했습니다.
  • 문서

    • 커밋 유형 안내에 style 유형을 추가했습니다.

@KyeongJooni KyeongJooni self-assigned this Jul 25, 2026
@KyeongJooni KyeongJooni added ✨ Feature 새로운 기능 🔧 Chore 기타 작업, 설정 labels Jul 25, 2026
@KyeongJooni KyeongJooni linked an issue Jul 25, 2026 that may be closed by this pull request
3 tasks
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@KyeongJooni, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 45 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 96c494b6-26af-44da-9f3b-04acc11b40d6

📥 Commits

Reviewing files that changed from the base of the PR and between dd14654 and b6ce50b.

📒 Files selected for processing (4)
  • src/features/onboarding/components/OnboardingQuizStep.tsx
  • src/features/recommendations/components/RecommendationFlowContent.tsx
  • src/features/recommendations/components/RecommendationGreeting.tsx
  • src/features/recommendations/components/RecommendationLetterCarousel.tsx

Walkthrough

로그인·정책·온보딩·추천 플로우와 관련 라우팅 및 레이아웃을 추가했습니다. 공통 UI 컴포넌트와 피드백 export 경로를 정리하고, 카드·단계·페이지 진입 애니메이션 및 reduced-motion 스타일을 확장했습니다.

Changes

공통 UI 및 피드백 컴포넌트

Layer / File(s) Summary
공통 컴포넌트와 피드백 export 정리
src/components/common/*, src/components/feedback/*, src/features/jobs/components/JobDetailMatchReasons.tsx, src/pages/PlaygroundPage/PlaygroundPage.tsx
버튼·탭·태그·체크박스·캐러셀 UI를 확장하고 Alert, ProgressStepper, ResultIcon, Spinnerfeedback 경로에서 재내보내도록 변경했습니다.

인증·정책 화면과 랜딩 이동

Layer / File(s) Summary
인증 화면과 랜딩 내비게이션
src/features/landing/*, src/features/login/*, src/pages/LandingPage/*, src/pages/LoginPage/*, src/pages/CallbackPage/*, src/pages/PolicyPage/*
로그인 기본·실패·이메일·콜백 화면, 소셜 로그인 버튼, 정책 동의 상태와 랜딩의 /login 이동을 추가했습니다.

레이아웃과 라우팅

Layer / File(s) Summary
라우트 기반 레이아웃과 헤더
src/components/layout/*, src/routes/router.tsx
AuthLayoutMainLayout의 경로별 콘텐츠 전환을 구성하고, 헤더 탭·캐러셀·로고·로그인 이동 및 추천 관련 라우트를 연결했습니다.
페이지 레이아웃 정리
src/pages/ExplorePage/*, src/pages/JobDetailPage/*
AppShell 의존 렌더링을 제거하고 페이지 내부 레이아웃과 추천 경로 링크를 갱신했습니다.

온보딩 단계 흐름

Layer / File(s) Summary
프로필·퀴즈·확인 단계
src/features/onboarding/components/*, src/pages/OnboardingPage/*
지역·경력 선택, 퀴즈 선택 지연 처리, 확인 요약·수정·시작 액션과 단계 전환 상태를 구현했습니다.

추천 플로우

Layer / File(s) Summary
추천 화면 분기와 상태 처리
src/pages/RecommendationsPage/*, src/features/recommendations/components/RecommendationFlowContent.tsx
pending·intro·deck·news·complete·revisit·empty 화면을 분기하고 레터 상태·조회·내비게이션을 연결했습니다.
추천 카드 전환과 인트로 애니메이션
src/features/recommendations/components/*, src/features/recommendations/hooks/*
카드 스택 전환, 인트로 initial/revisit 모드, 로컬 스토리지 완료 시각과 reduced-motion 처리를 추가했습니다.

전역 스타일

Layer / File(s) Summary
진입 애니메이션과 reduced-motion 스타일
src/styles/global.css, src/styles/index.css
랜딩·온보딩·추천 진입 및 카드 전환 애니메이션과 reduced-motion 비활성화 규칙을 추가하고 전역 스타일 import를 변경했습니다.

커밋 규칙과 리뷰 지침

Layer / File(s) Summary
커밋 타입 및 리뷰 설정
.coderabbit.yaml, commitlint.config.js, docs/GIT_WORKFLOW.md
리뷰 지침을 확장하고 커밋 타입 설정과 문서에 style 타입을 반영했습니다.

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

Possibly related PRs

Suggested labels: 📝 Docs

Suggested reviewers: dahyun174

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 추천 플로우, 피드백 컴포넌트 재구성, 전역 스타일/라우팅 등 인증·온보딩 범위를 벗어난 변경이 다수 포함됩니다. 이 이슈 범위와 직접 관련된 login/policy/preference 변경만 남기고 나머지 기능성 변경은 별도 PR로 분리하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 인증/온보딩 UI 제작이라는 PR의 핵심 변경을 정확히 요약합니다.
Linked Issues check ✅ Passed login, policy, preference 페이지와 온보딩 흐름이 모두 추가되어 #26의 작업 목록을 충족합니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#26/auth-page

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

Copy link
Copy Markdown

🚦 CI 검증 결과

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

@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: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/components/layout/Header.tsx (1)

118-135: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

좁은 화면에서 탭 헤더가 가로로 넘칩니다.

w-251 shrink-0만 1004px이고 로고·프로필도 축소되지 않아, 1024px 뷰포트에서는 헤더가 오버플로됩니다. 내비게이션을 flex-1 min-w-0 max-w-251로 제한하고 작은 화면의 패딩·탭 오버플로 전략을 추가하세요.

🤖 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 118 - 135, Update the
HeaderTabNav layout in the HeaderTabShell to use flex-1 min-w-0 with max-w-251
instead of fixed w-251 shrink-0, and add responsive reductions for horizontal
padding on narrow screens. Ensure the tab navigation handles overflow within its
available width while keeping the logo and profile elements visible without
horizontal overflow.
🧹 Nitpick comments (1)
src/styles/global.css (1)

1-164: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

@layer 없이 선언된 커스텀 클래스, Tailwind v4에서 유틸리티 오버라이드 무력화 가능.

이 파일의 @keyframes.landing-reveal*/.onboarding-step-enter*/.recommendation-pending-enter 클래스가 @layer로 감싸이지 않은 최상위(unlayered) 컨텍스트에 있습니다. Tailwind v4는 네이티브 cascade layers를 사용하므로, unlayered 규칙은 특이성/소스 순서와 무관하게 layered 유틸리티(@layer utilities)를 항상 이깁니다. 지금은 직접 충돌하는 유틸리티 조합이 보이지 않지만, 향후 cn()으로 같은 속성(opacity, transform 등)을 오버라이드하려는 Tailwind 유틸리티 클래스를 붙이면 조용히 무시될 수 있습니다.

♻️ 제안 리팩터
+@layer components {
 `@keyframes` landing-fade-slide-up {
   ...
 }
 ...
 .landing-reveal { opacity: 0; }
 ...
+}

프로젝트의 레이어 순서 설정(@layer theme, base, components, utilities; 등)을 확인해 실제로 유틸리티 오버라이드가 필요한 상황에서 문제가 없는지 검증을 권장합니다.

🤖 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/global.css` around lines 1 - 164, Wrap the landing, onboarding,
and recommendation animation definitions in the project’s appropriate named
cascade layer, preferably the configured components layer, including their
`@keyframes` and related class rules. Reuse the project’s existing `@layer` order
declaration if present so Tailwind utility classes can override properties such
as opacity and transform when applied through cn().
🤖 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/common/Tag.tsx`:
- Around line 7-30: Update the button rendered by Tag so the select variant
exposes its selection state via aria-pressed={selected}. Preserve the existing
selected styling and avoid applying this attribute to non-select variants unless
required by the component’s API.

In `@src/features/jobs/components/RecommendationPendingContent.tsx`:
- Around line 42-48: Update the action buttons in RecommendationPendingContent
so “공고 둘러보기” and “프로필 보완” either navigate to their intended destination routes
with click handlers or are rendered disabled until those routes are available;
ensure neither button remains interactive without behavior.

In `@src/features/onboarding/components/OnboardingConfirmStep.tsx`:
- Around line 40-45: Update the 수정 button in OnboardingConfirmStep so it has an
onClick handler that invokes the appropriate item-specific edit callback and
transitions to that onboarding step; if those callbacks or navigation are not
supported, hide the 수정 button instead of rendering a no-op control.

In `@src/features/onboarding/components/OnboardingQuizStep.tsx`:
- Around line 5-12: OnboardingQuizStep의 QUESTIONS와 TOTAL_QUESTIONS 간 불일치를 수정하세요.
실제 문항 배열을 10개로 완성하거나, TOTAL_QUESTIONS 및 진행률·마지막 문항 판정 로직(선택 처리와 확인 단계 이동)을
QUESTIONS.length에서 파생해 현재 문항 수와 일치시키세요.

In `@src/pages/PolicyPage/PolicyPage.tsx`:
- Around line 20-25: Update the initial state in PolicyPage’s checked useState
so all required consent entries—terms, privacy, and age—start as false, while
preserving marketing’s existing false default; users must explicitly select each
required item before consent is recorded.
- Line 53: PolicyPage의 “다음” Button에 클릭 동작을 연결해 필수 약관 항목이 모두 선택된 경우에만 다음 온보딩 단계
또는 기존 의도 경로로 이동하도록 구현하세요. 선택이 완료되지 않은 상태에서는 진행되지 않도록 검증을 유지하고, 관련 상태와 라우팅 흐름을
재사용하세요.

In `@src/routes/router.tsx`:
- Around line 26-31: Align the policy links with the registered routes: in
src/routes/router.tsx lines 26-31, register /terms and /privacy using the
appropriate policy page components, and in src/pages/LoginPage/LoginPage.tsx
lines 30-42, update the terms and privacy links to those registered paths.
Ensure both links navigate to existing routes instead of NotFoundPage.

---

Outside diff comments:
In `@src/components/layout/Header.tsx`:
- Around line 118-135: Update the HeaderTabNav layout in the HeaderTabShell to
use flex-1 min-w-0 with max-w-251 instead of fixed w-251 shrink-0, and add
responsive reductions for horizontal padding on narrow screens. Ensure the tab
navigation handles overflow within its available width while keeping the logo
and profile elements visible without horizontal overflow.

---

Nitpick comments:
In `@src/styles/global.css`:
- Around line 1-164: Wrap the landing, onboarding, and recommendation animation
definitions in the project’s appropriate named cascade layer, preferably the
configured components layer, including their `@keyframes` and related class rules.
Reuse the project’s existing `@layer` order declaration if present so Tailwind
utility classes can override properties such as opacity and transform when
applied through cn().
🪄 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 Plus

Run ID: 50c41507-554b-4525-be75-694437545a53

📥 Commits

Reviewing files that changed from the base of the PR and between b7ecb3a and 3d1761b.

⛔ Files ignored due to path filters (9)
  • src/assets/icons/icon-carousel-arrow-large-left.svg is excluded by !**/*.svg
  • src/assets/icons/icon-carousel-arrow-large-right.svg is excluded by !**/*.svg
  • src/assets/icons/icon-carousel-arrow-medium-left.svg is excluded by !**/*.svg
  • src/assets/icons/icon-carousel-arrow-medium-right.svg is excluded by !**/*.svg
  • src/assets/icons/icon-carousel-arrow-small-left.svg is excluded by !**/*.svg
  • src/assets/icons/icon-carousel-arrow-small-right.svg is excluded by !**/*.svg
  • src/assets/icons/icon-google.svg is excluded by !**/*.svg
  • src/assets/icons/icon-kakao.svg is excluded by !**/*.svg
  • src/assets/images/avatar-default-profile.png is excluded by !**/*.png
📒 Files selected for processing (38)
  • .coderabbit.yaml
  • commitlint.config.js
  • docs/GIT_WORKFLOW.md
  • src/components/common/Button.tsx
  • src/components/common/CarouselArrow.tsx
  • src/components/common/CarouselIndicator.tsx
  • src/components/common/Tab.tsx
  • src/components/common/Tag.tsx
  • src/components/common/index.ts
  • src/components/feedback/Alert.tsx
  • src/components/feedback/ProgressStepper.tsx
  • src/components/feedback/ResultIcon.tsx
  • src/components/feedback/Spinner.tsx
  • src/components/feedback/index.ts
  • src/components/layout/Header.tsx
  • src/components/layout/MainLayout.tsx
  • src/features/auth/.gitkeep
  • src/features/jobs/components/JobCard.tsx
  • src/features/jobs/components/RecommendationPendingContent.tsx
  • src/features/landing/components/LandingContent.tsx
  • src/features/landing/components/LandingHero.tsx
  • src/features/login/components/SocialLoginButton.tsx
  • src/features/login/hooks/.gitkeep
  • src/features/onboarding/components/OnboardingConfirmStep.tsx
  • src/features/onboarding/components/OnboardingProfileStep.tsx
  • src/features/onboarding/components/OnboardingQuizStep.tsx
  • src/features/onboarding/hooks/.gitkeep
  • src/pages/CallbackPage/CallbackPage.tsx
  • src/pages/LandingPage/LandingPage.tsx
  • src/pages/LoginFailPage/LoginFailPage.tsx
  • src/pages/LoginPage/LoginPage.tsx
  • src/pages/OnboardingPage/OnboardingPage.tsx
  • src/pages/PlaygroundPage/PlaygroundPage.tsx
  • src/pages/PolicyPage/PolicyPage.tsx
  • src/pages/RecommendationsPage/RecommendationsPage.tsx
  • src/routes/router.tsx
  • src/styles/global.css
  • src/styles/index.css
💤 Files with no reviewable changes (1)
  • src/components/common/index.ts

Comment thread src/components/common/Tag.tsx Outdated
Comment on lines +42 to +48
<div className="flex items-center justify-center gap-2.5">
<Button variant="outline" className="w-37.5">
공고 둘러보기
</Button>
<Button variant="outline" className="w-37.5">
프로필 보완
</Button>

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

대기 화면의 행동 버튼이 동작하지 않습니다.

공고 둘러보기프로필 보완은 클릭 핸들러나 이동 대상이 없어 아무 작업도 수행하지 않습니다. 목적지 라우트에 연결하거나, 제공 전까지 비활성 상태로 표시하세요.

🤖 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/jobs/components/RecommendationPendingContent.tsx` around lines
42 - 48, Update the action buttons in RecommendationPendingContent so “공고 둘러보기”
and “프로필 보완” either navigate to their intended destination routes with click
handlers or are rendered disabled until those routes are available; ensure
neither button remains interactive without behavior.

Comment thread src/features/onboarding/components/OnboardingConfirmStep.tsx
Comment thread src/features/onboarding/components/OnboardingQuizStep.tsx
Comment thread src/pages/PolicyPage/PolicyPage.tsx
Comment thread src/pages/PolicyPage/PolicyPage.tsx Outdated
Comment thread src/routes/router.tsx Outdated

@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: 2

♻️ Duplicate comments (1)
src/features/onboarding/components/OnboardingConfirmStep.tsx (1)

42-45: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

모든 수정이 프로필 단계로만 이동합니다.

이력서·선호 조건 등은 프로필 단계에서 수정할 수 없는데도 동일한 콜백으로 처리됩니다. 항목별 편집 대상을 전달해 해당 단계로 이동시키거나, 현재 수정 가능한 항목에만 수정을 노출하세요.

  • src/features/onboarding/components/OnboardingConfirmStep.tsx#L42-L45: 요약 항목별 편집 대상 또는 콜백을 전달하세요.
  • src/pages/OnboardingPage/OnboardingPage.tsx#L95-L95: 전달받은 대상에 따라 해당 편집 단계로 전환하세요.
🤖 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/onboarding/components/OnboardingConfirmStep.tsx` around lines 42
- 45, Update OnboardingConfirmStep.tsx at lines 42-45 to associate each summary
item’s 수정 action with its intended onboarding step or callback instead of
routing every item through onEdit; update OnboardingPage.tsx at line 95 to
consume that target and transition to the corresponding edit step, while only
showing 수정 for items that support editing.
🤖 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/features/login/components/LoginDefaultContent.tsx`:
- Around line 27-39: Update the terms and privacy anchor destinations in
LoginDefaultContent to use routes registered by the application, replacing the
invalid /terms and /privacy paths with the corresponding policy screen paths or
registering those routes in the router. Ensure both links resolve without
NotFound.

In `@src/features/login/components/LoginEmailRequiredContent.tsx`:
- Around line 10-17: LoginEmailRequiredContent의 이메일 입력과 확인 메일 보내기 Button을 실제 이메일
인증 발송 흐름에 연결하세요. 입력값을 상태로 관리하고 유효성을 검증한 뒤 발송 핸들러에서 인증 메일 요청을 호출하며, 지원되는 발송 로직이
없다면 버튼을 비활성화해 동작하지 않는 CTA로 남지 않게 하세요.

---

Duplicate comments:
In `@src/features/onboarding/components/OnboardingConfirmStep.tsx`:
- Around line 42-45: Update OnboardingConfirmStep.tsx at lines 42-45 to
associate each summary item’s 수정 action with its intended onboarding step or
callback instead of routing every item through onEdit; update OnboardingPage.tsx
at line 95 to consume that target and transition to the corresponding edit step,
while only showing 수정 for items that support editing.
🪄 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 Plus

Run ID: 1ccabda3-dfa9-4d0e-aba1-3bfabd78289d

📥 Commits

Reviewing files that changed from the base of the PR and between 3d1761b and f7268d4.

📒 Files selected for processing (16)
  • src/components/common/Checkbox.tsx
  • src/components/common/Tag.tsx
  • src/components/layout/AuthLayout.tsx
  • src/components/layout/MainLayout.tsx
  • src/features/login/components/LoginCallbackContent.tsx
  • src/features/login/components/LoginDefaultContent.tsx
  • src/features/login/components/LoginEmailRequiredContent.tsx
  • src/features/login/components/LoginFailureContent.tsx
  • src/features/onboarding/components/OnboardingConfirmStep.tsx
  • src/features/onboarding/components/OnboardingProfileStep.tsx
  • src/pages/CallbackPage/CallbackPage.tsx
  • src/pages/LoginPage/LoginPage.tsx
  • src/pages/OnboardingPage/OnboardingPage.tsx
  • src/pages/PolicyPage/PolicyPage.tsx
  • src/routes/router.tsx
  • src/styles/global.css
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/routes/router.tsx
  • src/styles/global.css
  • src/components/common/Tag.tsx
  • src/features/onboarding/components/OnboardingProfileStep.tsx

Comment on lines +27 to +39
<a
href="/terms"
className="text-text-secondary underline decoration-solid decoration-from-font [text-underline-position:from-font]"
>
이용약관
</a>{' '}
•{' '}
<a
href="/privacy"
className="text-text-secondary underline decoration-solid decoration-from-font [text-underline-position:from-font]"
>
개인정보처리방침
</a>

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

약관 링크를 등록된 경로로 연결하세요.

/terms/privacy는 제공된 라우터에 없고 /policy만 등록되어 있어 클릭 시 NotFound로 이동합니다. 각각의 정책 라우트를 등록하거나 실제 정책 화면 경로로 변경하세요.

🤖 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/login/components/LoginDefaultContent.tsx` around lines 27 - 39,
Update the terms and privacy anchor destinations in LoginDefaultContent to use
routes registered by the application, replacing the invalid /terms and /privacy
paths with the corresponding policy screen paths or registering those routes in
the router. Ensure both links resolve without NotFound.

Comment on lines +10 to +17
<input
type="email"
aria-label="이메일 주소"
placeholder="min****@naver.com"
className="h-10 w-full rounded-sm border border-gray-700 bg-white px-4 text-label-medium font-medium text-gray-700 placeholder:text-gray-700 focus:border-primary-500 focus:outline-none"
/>
</div>
<Button className="w-full max-w-104">확인 메일 보내기</Button>

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

확인 메일 발송 CTA가 동작하지 않습니다.

입력값을 읽거나 검증하는 로직과 발송 핸들러가 없어 버튼을 눌러도 아무 일도 일어나지 않습니다. 이메일 인증 흐름에 연결하거나, 지원 전까지 비활성 상태로 처리하세요.

🤖 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/login/components/LoginEmailRequiredContent.tsx` around lines 10
- 17, LoginEmailRequiredContent의 이메일 입력과 확인 메일 보내기 Button을 실제 이메일 인증 발송 흐름에
연결하세요. 입력값을 상태로 관리하고 유효성을 검증한 뒤 발송 핸들러에서 인증 메일 요청을 호출하며, 지원되는 발송 로직이 없다면 버튼을
비활성화해 동작하지 않는 CTA로 남지 않게 하세요.

@KyeongJooni KyeongJooni changed the title Feat/#26/auth page feat: 인증/온보딩 페이지 ui 제작 Jul 25, 2026
…o feat/#26/auth-page

# Conflicts:
#	src/components/common/Tag.tsx
#	src/components/layout/Header.tsx
#	src/routes/router.tsx

@j2nnif2r j2nnif2r left a comment

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.

추가하신 부분들 확인했습니다. 수고 많으셨습니다.

@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: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/features/jobs/components/JobDetailMatchReasons.tsx (1)

15-16: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

matchScore를 0~100 범위로 보정하세요.

현재 number 타입만 보장하므로 잘못된 값이 적합도 150% 또는 음수로 표시될 수 있습니다. ProgressStepper처럼 표시 전에 유효 범위를 보정하거나 입력 경계에서 검증해 주세요.

수정 예시
+const normalizedMatchScore = Number.isFinite(matchScore)
+  ? Math.min(100, Math.max(0, matchScore))
+  : 0;
+
 <Badge type="solid" color="primary">
-  적합도 {matchScore}%
+  적합도 {normalizedMatchScore}%
 </Badge>
🤖 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/jobs/components/JobDetailMatchReasons.tsx` around lines 15 - 16,
Badge의 matchScore 표시값이 0~100 범위를 벗어나지 않도록 보정하세요. JobDetailMatchReasons의 렌더링에서 표시
전에 matchScore를 최소 0, 최대 100으로 제한하고, 보정된 값을 적합도 퍼센트에 사용하세요.
♻️ Duplicate comments (1)
src/features/recommendations/components/RecommendationPendingContent.tsx (1)

42-49: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

대기 화면의 "공고 둘러보기"/"프로필 보완" 버튼이 여전히 동작하지 않습니다.

이전 리뷰에서 지적된 이슈가 이번 diff에서도 그대로 남아 있습니다. 목적지 라우트에 연결하거나 제공 전까지 비활성 상태로 표시해야 합니다.

🤖 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/recommendations/components/RecommendationPendingContent.tsx`
around lines 42 - 49, RecommendationPendingContent의 “공고 둘러보기”와 “프로필 보완” Button에
각각 올바른 목적지 라우트 이동 동작을 연결하거나, 라우트가 제공되기 전까지 disabled 상태로 표시하세요. 두 버튼이 클릭 가능한 상태로
남아 있으면서 아무 동작도 하지 않지 않도록 처리하세요.
🤖 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/features/onboarding/components/OnboardingQuizStep.tsx`:
- Around line 53-61: Cancel any pending selection timer and clear
pendingSelection when the previous or skip handlers run in OnboardingQuizStep,
preventing the delayed onSelect from applying after navigation; alternatively,
disable both controls while selectionTimerRef is pending. Ensure the existing
handleSelect flow remains unchanged for normal selections.

In `@src/features/recommendations/components/RecommendationFlowContent.tsx`:
- Around line 220-263: RecommendationNoticePanel의 primary Button에서 empty-signup과
empty-before-send 상태가 무반응이 되지 않도록 처리하세요. 각 화면에 실제 동작을 연결할 수 있으면 empty-signup은
온보딩 프로필 이동, empty-before-send는 새로고침 트리거를 연결하고, 목적지가 없으면 해당 상태에서 Button을 disabled
처리하세요. empty-candidates의 기존 탐색 이동 동작은 유지하세요.

In `@src/features/recommendations/components/RecommendationGreeting.tsx`:
- Around line 41-50: Update the decorative SunIcon in RecommendationGreeting to
include aria-hidden="true", matching the existing accessibility pattern used by
MailIcon and ResultIcon.

In `@src/features/recommendations/components/RecommendationLetterCarousel.tsx`:
- Around line 42-79: Move the isAnimating update into the contentKey-change
transition effect so every transition, including those triggered by onSave or
onDismiss, sets it before the animation begins and clears it after the existing
440ms timeout. Remove the arrow-only isAnimating assignments from handlePrev and
handleNext while preserving their guards and navigation behavior.
- Around line 92-104: Update the leavingContent wrapper in
RecommendationLetterCarousel so the outgoing card subtree is marked aria-hidden
during its transition. Keep the existing animation and pointer-events behavior
unchanged, ensuring focusable controls in the leaving card cannot receive
keyboard focus while it is being removed.

---

Outside diff comments:
In `@src/features/jobs/components/JobDetailMatchReasons.tsx`:
- Around line 15-16: Badge의 matchScore 표시값이 0~100 범위를 벗어나지 않도록 보정하세요.
JobDetailMatchReasons의 렌더링에서 표시 전에 matchScore를 최소 0, 최대 100으로 제한하고, 보정된 값을 적합도
퍼센트에 사용하세요.

---

Duplicate comments:
In `@src/features/recommendations/components/RecommendationPendingContent.tsx`:
- Around line 42-49: RecommendationPendingContent의 “공고 둘러보기”와 “프로필 보완” Button에
각각 올바른 목적지 라우트 이동 동작을 연결하거나, 라우트가 제공되기 전까지 disabled 상태로 표시하세요. 두 버튼이 클릭 가능한 상태로
남아 있으면서 아무 동작도 하지 않지 않도록 처리하세요.
🪄 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 Plus

Run ID: 29948173-37df-4866-a394-ce7778838ddd

📥 Commits

Reviewing files that changed from the base of the PR and between f7268d4 and dd14654.

⛔ Files ignored due to path filters (1)
  • src/assets/icons/logo.svg is excluded by !**/*.svg
📒 Files selected for processing (23)
  • src/components/common/Button.tsx
  • src/components/common/CarouselArrow.tsx
  • src/components/common/Tag.tsx
  • src/components/feedback/ResultIcon.tsx
  • src/components/layout/AuthLayout.tsx
  • src/components/layout/Header.tsx
  • src/components/layout/MainLayout.tsx
  • src/features/jobs/components/JobDetailMatchReasons.tsx
  • src/features/onboarding/components/OnboardingProfileStep.tsx
  • src/features/onboarding/components/OnboardingQuizStep.tsx
  • src/features/recommendations/components/RecommendationFlowContent.tsx
  • src/features/recommendations/components/RecommendationGreeting.tsx
  • src/features/recommendations/components/RecommendationLetterCard.tsx
  • src/features/recommendations/components/RecommendationLetterCarousel.tsx
  • src/features/recommendations/components/RecommendationNews.tsx
  • src/features/recommendations/components/RecommendationNoticePanel.tsx
  • src/features/recommendations/components/RecommendationPendingContent.tsx
  • src/features/recommendations/hooks/useRecommendationIntroAnimation.ts
  • src/pages/ExplorePage/ExplorePage.tsx
  • src/pages/JobDetailPage/JobDetailPage.tsx
  • src/pages/RecommendationsPage/RecommendationsPage.tsx
  • src/routes/router.tsx
  • src/styles/global.css
🚧 Files skipped from review as they are similar to previous changes (5)
  • src/components/feedback/ResultIcon.tsx
  • src/components/common/Tag.tsx
  • src/features/onboarding/components/OnboardingProfileStep.tsx
  • src/components/common/CarouselArrow.tsx
  • src/components/layout/Header.tsx

Comment thread src/features/onboarding/components/OnboardingQuizStep.tsx
Comment thread src/features/recommendations/components/RecommendationGreeting.tsx
Comment on lines +42 to +79
useEffect(() => {
if (!enableStackTransition) return;
if (activeContentRef.current.key === contentKey) return;

const nextContent = { key: contentKey, node: children };
const direction = current >= previousCurrentRef.current ? 'forward' : 'backward';
previousCurrentRef.current = current;
let transitionTimer: number | undefined;
const animationFrame = window.requestAnimationFrame(() => {
setTransitionDirection(direction);
setLeavingContent(activeContentRef.current.node);
activeContentRef.current = nextContent;
setActiveContent(nextContent);
transitionTimer = window.setTimeout(() => {
setLeavingContent(undefined);
setIsAnimating(false);
}, 440);
});

return () => {
window.cancelAnimationFrame(animationFrame);
if (transitionTimer) window.clearTimeout(transitionTimer);
};
}, [children, contentKey, current, enableStackTransition]);

const handlePrev = () => {
if (isAnimating || prevDisabled) return;

if (enableStackTransition) setIsAnimating(true);
onPrev?.();
};

const handleNext = () => {
if (isAnimating || nextDisabled) return;

if (enableStackTransition) setIsAnimating(true);
onNext?.();
};

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

isAnimating이 화살표 클릭 경로에서만 설정되어, onSave/onDismiss로 트리거된 전환 중엔 화살표가 비활성화되지 않습니다.

RecommendationFlowContent.tsx의 저장/관심없음 버튼은 carousel의 handleNext를 거치지 않고 goNext()를 직접 호출합니다. 이때 전환 이펙트(라인 42-65)는 실행되지만 isAnimating은 여전히 false이므로 화살표가 활성 상태로 남습니다. 전환 중(440ms) 화살표를 빠르게 클릭하면 deckIndex가 두 번 진행되어 카드 한 장이 사용자에게 노출되지 않고 건너뛰어질 수 있습니다. isAnimatingcontentKey 변경을 감지하는 이펙트 내부에서 직접 설정하도록 옮기는 것을 권장합니다.

🤖 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/recommendations/components/RecommendationLetterCarousel.tsx`
around lines 42 - 79, Move the isAnimating update into the contentKey-change
transition effect so every transition, including those triggered by onSave or
onDismiss, sets it before the animation begins and clears it after the existing
440ms timeout. Remove the arrow-only isAnimating assignments from handlePrev and
handleNext while preserving their guards and navigation behavior.

@KyeongJooni
KyeongJooni merged commit 4515bfb into dev Jul 25, 2026
2 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Jul 26, 2026
5 tasks
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] 인증/ 온보딩 페이지 ui 제작

2 participants