Skip to content

로그인 시안 UI와 Feature Preview 구성 - #15

Merged
gnoes-ios merged 10 commits into
devfrom
feat/login-ui
Aug 6, 2026
Merged

로그인 시안 UI와 Feature Preview 구성#15
gnoes-ios merged 10 commits into
devfrom
feat/login-ui

Conversation

@gnoes-ios

Copy link
Copy Markdown
Contributor

📌 변경 요약

  • 로그인 시안 기반 히어로/숏폼 마퀴/소셜 로그인 UI 구성
  • Preview 가능하도록 Feature 의존 체인 dynamic framework 전환
  • Login/Root/Coordinator 등 주요 뷰 상태별 Preview 추가

📌 변경 내용

Login UI

  • Projects/Feature/Sources/Scene/Login/LoginView.swift
    • 로고, 숏폼 마퀴, 타이틀/서브카피, 카카오·애플 로그인 버튼 배치
    • 로딩 오버레이 화면 중앙 정렬
    • Idle / Loading / Error Preview 추가
  • Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift
    • 일정 속도 무한 스크롤 숏폼 카드 마퀴 구성
    • Preview 추가

DesignSystem / Social

  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brand
    • logo_mozi 에셋 등록
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login
    • login_shortform_01..04 에셋 등록
  • Projects/Shared/DesignSystem/Sources/Components/Social/SocialLoginProvider.swift
    • 애플 소셜 버튼 아이콘 간격 카카오와 동일화
  • Projects/Shared/DesignSystem/Tests/Components/SocialLoginProviderTests.swift
    • 애플 버튼 간격 검증 수정

Preview 인프라

  • Tuist/ProjectDescriptionHelpers/ProjectFactory.swift
    • Feature 기본 product를 framework로 전환
    • ThirdParty product override 지원
  • Projects/Domain/Project.swift
  • Projects/Shared/{Util,DesignSystem,Logger}/Project.swift
  • Projects/ThirdParty/{ThirdParty,ThirdPartyUI}/Project.swift
    • Preview 체인 모듈 dynamic framework 전환

상태별 Preview

  • Projects/Feature/Sources/Root/RootView.swift
    • Bootstrapping / Login / Onboarding / Main Preview
  • Projects/Feature/Sources/AppCoordinator/AppCoordinatorView.swift
    • phase별 + toast 상태 Preview
  • Projects/Feature/Sources/AppCoordinator/Overlay/OverlayView.swift
    • Empty / Toast / Alert Preview
  • Projects/Feature/Sources/Scene/OnboardingPlaceholder/OnboardingPlaceholderView.swift
    • Idle / Logging Out / Error Preview
  • Projects/Feature/Sources/Scene/Placeholder/PlaceholderView.swift
    • Main Placeholder Preview

로컬 설정 템플릿

  • Config/Example.xcconfig
    • 로컬 서명 팀 ID 예시 키 추가

@gnoes-ios gnoes-ios added the feat 새로운 기능 label Aug 6, 2026
@gnoes-ios gnoes-ios self-assigned this Aug 6, 2026
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • 새로운 기능

    • 로그인 화면에 로고, 숏폼 마키, 설명 및 카카오·Apple 로그인 버튼을 추가했습니다.
    • 로그인 진행 중 중앙 로딩 표시와 입력 차단을 제공합니다.
    • 로그인 실패 유형에 따라 토스트 또는 알림으로 오류를 안내합니다.
  • 개선 사항

    • 카카오와 Apple 로그인 버튼의 콘텐츠 간격을 통일했습니다.
    • 온보딩, 메인 화면, 알림 및 토스트 상태를 확인할 수 있도록 미리보기를 보강했습니다.

Walkthrough

프로젝트 생성기가 프레임워크 제품 유형을 전달하도록 변경되었습니다. 로그인 화면에 숏폼 마키와 새 레이아웃을 추가했습니다. 로그인 오류를 토스트 또는 알림으로 전달합니다. 주요 화면과 오버레이에 상태별 SwiftUI 프리뷰를 추가했습니다.

Changes

프레임워크 제품 설정

Layer / File(s) Summary
제품 유형 전달 및 모듈 설정
Tuist/ProjectDescriptionHelpers/ProjectFactory.swift, Projects/*/Project.swift
thirdParty가 제품 유형을 받도록 변경되었습니다. Feature, Domain, DesignSystem, Logger, Util, ThirdParty 모듈은 .framework 제품을 사용합니다.

로그인 흐름 및 화면

Layer / File(s) Summary
로그인 오류 전달
Projects/Feature/Sources/Scene/Login/LoginFeature.swift, Projects/Feature/Sources/AppCoordinator/AppCoordinatorFeature.swift, Projects/Feature/Tests/Login/LoginFeatureTests.swift, Projects/Feature/Tests/AppCoordinator/AppCoordinatorFeatureTests.swift
로그인 오류 메시지 상태를 제거했습니다. 오류 유형에 따라 presentToast 또는 presentAlert delegate를 발생시키고 오버레이 상태로 전달합니다. 관련 테스트를 갱신했습니다.
로그인 화면 및 숏폼 마키
Projects/Feature/Sources/Scene/Login/LoginView.swift, Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift
로고, 숏폼 마키, 소셜 로그인 버튼, 로딩 표시를 포함하는 로그인 화면을 구성했습니다. TimelineView 기반 마키와 레이아웃 상수를 추가했습니다.

SwiftUI 상태 프리뷰

Layer / File(s) Summary
앱 상태별 프리뷰 구성
Projects/Feature/Sources/AppCoordinator/..., Projects/Feature/Sources/Root/RootView.swift, Projects/Feature/Sources/Scene/OnboardingPlaceholder/OnboardingPlaceholderView.swift, Projects/Feature/Sources/Scene/Placeholder/PlaceholderView.swift
부트스트래핑, 로그인, 온보딩, 메인, 토스트, 알림, 로그아웃 상태의 프리뷰를 추가했습니다. 각 프리뷰에 초기 상태와 인증 의존성을 구성했습니다.

소셜 로그인 간격

Layer / File(s) Summary
소셜 로그인 간격 조정
Projects/Shared/DesignSystem/Sources/Components/Social/SocialLoginProvider.swift, Projects/Shared/DesignSystem/Tests/Components/SocialLoginProviderTests.swift
카카오와 Apple 로그인에 contentGap12를 적용했습니다. 테스트 기대값을 갱신했습니다.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant LoginFeature
  participant AppCoordinatorFeature
  participant OverlayFeature
  LoginFeature->>AppCoordinatorFeature: 로그인 오류 delegate 전달
  AppCoordinatorFeature->>OverlayFeature: 토스트 또는 알림 표시 action 전달
  OverlayFeature-->>AppCoordinatorFeature: 표시 메시지 상태 갱신
Loading

Possibly related PRs

  • TeamMozi/mozi-iOS#1: AppCoordinator, Root, Overlay, 로그인 화면의 초기 구조와 직접 연결됩니다.
  • TeamMozi/mozi-iOS#10: SharedDesignSystem 컴포넌트와 로그인 화면 스타일을 연결합니다.
  • TeamMozi/mozi-iOS#13: 로그인 게이트와 관련 화면 및 상태 흐름을 직접 확장합니다.
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 제목은 로그인 UI와 Feature Preview 구성이라는 변경의 주요 내용을 간결하게 설명합니다.
Description check ✅ Passed 변경 요약, 주요 변경 내용, 파일별 설명을 템플릿 구조에 맞게 제공하며 PR 목표와 일치합니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

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

🧹 Nitpick comments (3)
Projects/Feature/Sources/Scene/Login/LoginView.swift (2)

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

marqueeHeight가 카드 높이를 중복 정의합니다.

LoginShortformMarqueeView.cardSize.height172입니다. 두 값이 독립적으로 관리되면 카드 크기를 바꿀 때 컨테이너 높이가 어긋납니다. 마키 뷰의 상수를 직접 참조해 주세요.

♻️ 제안 리팩터
-    static let marqueeHeight: CGFloat = 172
+    static let marqueeHeight: CGFloat = LoginShortformMarqueeView.cardSize.height
🤖 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 `@Projects/Feature/Sources/Scene/Login/LoginView.swift` at line 124, Update
LoginView’s marqueeHeight to reference LoginShortformMarqueeView.cardSize.height
instead of defining the literal 172, keeping the container height synchronized
with the marquee card size.

96-101: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

로딩 오버레이가 배경 터치를 차단하지 않습니다.

변경 설명은 로딩 중 터치 입력 차단을 명시합니다. 그러나 ProgressView.allowsHitTesting(false)가 적용되어 터치가 뒤쪽 뷰로 통과합니다. 현재는 두 로그인 버튼이 .disabled(store.isLoading)으로 개별 차단되므로 실제 결함은 없습니다.

배경 차단이 의도라면 오버레이가 히트 테스트를 받도록 바꿔 주세요.

♻️ 제안 수정
             if store.isLoading {
-                ProgressView()
-                    .tint(Color.ds.text.neutral.white)
-                    .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
-                    .allowsHitTesting(false)
+                Color.clear
+                    .contentShape(Rectangle())
+                    .overlay {
+                        ProgressView()
+                            .tint(Color.ds.text.neutral.white)
+                    }
             }
🤖 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 `@Projects/Feature/Sources/Scene/Login/LoginView.swift` around lines 96 - 101,
Update the loading overlay around ProgressView so it participates in hit testing
and blocks touches from reaching the background while store.isLoading is true;
remove the allowsHitTesting(false) modifier, while preserving the existing
visual layout and button disabled behavior.
Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift (1)

18-20: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

copies 계산식을 여러 줄로 분리해 주세요.

Line 20은 약 105자입니다. CONVENTIONS의 100자 경고 기준을 넘습니다. 중간 값을 이름 있는 상수로 빼면 길이와 가독성이 함께 개선됩니다.

♻️ 제안 리팩터
         GeometryReader { proxy in
             let sequenceWidth = Self.sequenceWidth(cardCount: images.count)
-            let copies = max(3, Int(ceil((proxy.size.width + sequenceWidth) / max(sequenceWidth, 1))) + 1)
+            let requiredWidth = proxy.size.width + sequenceWidth
+            let sequenceCount = Int(ceil(requiredWidth / max(sequenceWidth, 1))) + 1
+            let copies = max(3, sequenceCount)

As per coding guidelines: "Swift 코드는 4칸 들여쓰기, 100자 경고/120자 오류 기준을 따르고".

🤖 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
`@Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift`
around lines 18 - 20, GeometryReader 내부의 copies 계산을 여러 줄로 분리해 100자 경고 기준을 준수하세요.
sequenceWidth를 활용한 화면 너비 기반 계산을 별도의 이름 있는 상수로 추출한 뒤, copies는 해당 중간값과 최소값을 사용하도록
수정하세요.

Source: Path instructions

🤖 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 `@Projects/Feature/Sources/Scene/Login/LoginView.swift`:
- Around line 114-117: 로그인 화면의 고정 콘텐츠 높이가 소형 기기의 안전 영역을 초과하므로, LoginView 레이아웃에서
고정 .frame(height:)를 제거하고 Spacer(minLength: 0) 또는 화면 높이에 따라 여백을 축소하는 방식으로 조정하세요.
두 SocialLoginButton의 48pt 높이와 오류 메시지 표시 동작은 유지하면서 iPhone SE에서도 버튼이 화면 밖으로 밀리지 않게
하세요.

---

Nitpick comments:
In `@Projects/Feature/Sources/Scene/Login/LoginView.swift`:
- Line 124: Update LoginView’s marqueeHeight to reference
LoginShortformMarqueeView.cardSize.height instead of defining the literal 172,
keeping the container height synchronized with the marquee card size.
- Around line 96-101: Update the loading overlay around ProgressView so it
participates in hit testing and blocks touches from reaching the background
while store.isLoading is true; remove the allowsHitTesting(false) modifier,
while preserving the existing visual layout and button disabled behavior.

In
`@Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift`:
- Around line 18-20: GeometryReader 내부의 copies 계산을 여러 줄로 분리해 100자 경고 기준을 준수하세요.
sequenceWidth를 활용한 화면 너비 기반 계산을 별도의 이름 있는 상수로 추출한 뒤, copies는 해당 중간값과 최소값을 사용하도록
수정하세요.
🪄 Autofix

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: 6a1aed37-6941-4a33-8146-8febff5e96bf

📥 Commits

Reviewing files that changed from the base of the PR and between f548fd7 and 6e5c34a.

⛔ Files ignored due to path filters (13)
  • Config/Example.xcconfig is excluded by !Config/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brand/Contents.json is excluded by !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brand/logo_mozi.imageset/Contents.json is excluded by !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Brand/logo_mozi.imageset/mozi_BI.svg is excluded by !**/*.svg, !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/Contents.json is excluded by !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_01.imageset/Contents.json is excluded by !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_01.imageset/login_shortform_01.jpg is excluded by !**/*.jpg, !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_02.imageset/Contents.json is excluded by !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_02.imageset/login_shortform_02.jpg is excluded by !**/*.jpg, !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_03.imageset/Contents.json is excluded by !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_03.imageset/login_shortform_03.jpg is excluded by !**/*.jpg, !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_04.imageset/Contents.json is excluded by !**/*.xcassets/**
  • Projects/Shared/DesignSystem/Resources/Assets.xcassets/Login/login_shortform_04.imageset/login_shortform_04.jpg is excluded by !**/*.jpg, !**/*.xcassets/**
📒 Files selected for processing (16)
  • Projects/Domain/Project.swift
  • Projects/Feature/Sources/AppCoordinator/AppCoordinatorView.swift
  • Projects/Feature/Sources/AppCoordinator/Overlay/OverlayView.swift
  • Projects/Feature/Sources/Root/RootView.swift
  • Projects/Feature/Sources/Scene/Login/LoginView.swift
  • Projects/Feature/Sources/Scene/Login/Subviews/LoginShortformMarqueeView.swift
  • Projects/Feature/Sources/Scene/OnboardingPlaceholder/OnboardingPlaceholderView.swift
  • Projects/Feature/Sources/Scene/Placeholder/PlaceholderView.swift
  • Projects/Shared/DesignSystem/Project.swift
  • Projects/Shared/DesignSystem/Sources/Components/Social/SocialLoginProvider.swift
  • Projects/Shared/DesignSystem/Tests/Components/SocialLoginProviderTests.swift
  • Projects/Shared/Logger/Project.swift
  • Projects/Shared/Util/Project.swift
  • Projects/ThirdParty/ThirdParty/Project.swift
  • Projects/ThirdParty/ThirdPartyUI/Project.swift
  • Tuist/ProjectDescriptionHelpers/ProjectFactory.swift

Comment thread Projects/Feature/Sources/Scene/Login/LoginView.swift

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

🤖 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 `@Projects/Feature/Tests/Login/LoginFeatureTests.swift`:
- Line 62: Rename the affected test methods to follow the test_한글_한글 convention:
update toast_delegate at Projects/Feature/Tests/Login/LoginFeatureTests.swift
lines 62-62 and 82-82, alert_delegate at lines 102-102, idle at line 122-122,
and toast_delegate/overlay_toast plus alert_delegate/overlay_alert at
Projects/Feature/Tests/AppCoordinator/AppCoordinatorFeatureTests.swift lines
228-228 and 243-243 to Korean event or state names while preserving each test’s
behavior.
🪄 Autofix

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: 9d5348c5-dde8-4cb0-b105-87c8af19b7a9

📥 Commits

Reviewing files that changed from the base of the PR and between 6e5c34a and 710175f.

📒 Files selected for processing (6)
  • Projects/Feature/Sources/AppCoordinator/AppCoordinatorFeature.swift
  • Projects/Feature/Sources/AppCoordinator/AppCoordinatorView.swift
  • Projects/Feature/Sources/Scene/Login/LoginFeature.swift
  • Projects/Feature/Sources/Scene/Login/LoginView.swift
  • Projects/Feature/Tests/AppCoordinator/AppCoordinatorFeatureTests.swift
  • Projects/Feature/Tests/Login/LoginFeatureTests.swift
💤 Files with no reviewable changes (1)
  • Projects/Feature/Sources/Scene/Login/LoginView.swift

Comment thread Projects/Feature/Tests/Login/LoginFeatureTests.swift
@gnoes-ios
gnoes-ios merged commit f60fb45 into dev Aug 6, 2026
3 checks passed
@gnoes-ios
gnoes-ios deleted the feat/login-ui branch August 6, 2026 08:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 새로운 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant