From 6060e230d21567481d816a40c5e6377118a358cb Mon Sep 17 00:00:00 2001 From: Sadturtleman Date: Tue, 20 Oct 2026 21:21:43 +0900 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=EC=98=A8=EB=B3=B4=EB=94=A9=C2=B7?= =?UTF-8?q?=ED=99=88=20QA=20=ED=94=BC=EB=93=9C=EB=B0=B1=207=EA=B1=B4?= =?UTF-8?q?=EC=9D=84=20=EB=B0=98=EC=98=81=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 로그인: 「시작과 동시에…」 문구 제거(동의는 약관 단계에서 받는다), 로고를 스플래시와 같은 체크 링으로 교체 - 로그인: 구글 버튼을 브랜딩 가이드 뉴트럴 테마(#F2F2F2, 테두리 없음)로 바꾼다 - 루트 Scaffold 가 innerPadding 을 소비하게 해 imePadding·statusBarsPadding 이 시스템 바 높이를 두 번 더하던 문제(이름 입력 시 버튼-키보드 간격, 홈 상단 여백)를 고친다 - 프로필 사진: 편집 배지를 원형 클립 밖으로 빼 잘리지 않게 한다 - 약관: 「필수 항목에 동의해야…」 안내 박스 제거 Closes #619 Co-Authored-By: Claude Opus 5.5 (1M context) --- .../navigation/RootComposable.kt | 4 +- .../ruleup/designsystem/theme/RuleUpColor.kt | 6 +- .../presentation/intro/screen/LoginScreen.kt | 25 +++------ .../presentation/onboarding/PhotoScreen.kt | 55 ++++++++++--------- .../presentation/onboarding/TermsScreen.kt | 8 --- .../presentation/intro/LoginContentTest.kt | 8 --- 6 files changed, 42 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/ruleup/android_ruleup/navigation/RootComposable.kt b/app/src/main/java/com/ruleup/android_ruleup/navigation/RootComposable.kt index 3934a0989..7405612a7 100644 --- a/app/src/main/java/com/ruleup/android_ruleup/navigation/RootComposable.kt +++ b/app/src/main/java/com/ruleup/android_ruleup/navigation/RootComposable.kt @@ -1,6 +1,7 @@ package com.ruleup.android_ruleup.navigation import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding @@ -96,7 +97,8 @@ fun RootComposable( ) { innerPadding -> AppNavHost( backStack = backStack, - modifier = Modifier.padding(innerPadding), + // 소비하지 않으면 화면의 statusBarsPadding·imePadding 이 시스템 바 높이를 한 번 더 더한다. + modifier = Modifier.padding(innerPadding).consumeWindowInsets(innerPadding), ) } diff --git a/core/designsystem/src/main/kotlin/com/ruleup/designsystem/theme/RuleUpColor.kt b/core/designsystem/src/main/kotlin/com/ruleup/designsystem/theme/RuleUpColor.kt index d78de6343..e6a9f40ca 100644 --- a/core/designsystem/src/main/kotlin/com/ruleup/designsystem/theme/RuleUpColor.kt +++ b/core/designsystem/src/main/kotlin/com/ruleup/designsystem/theme/RuleUpColor.kt @@ -27,9 +27,8 @@ object RuleUpPalette { val Kakao = Color(0xFFFEE500) val KakaoLabel = Color(0xFF191919) - /** Google 로그인 버튼 색(브랜딩 가이드라인 라이트). */ - val GoogleSurface = Color(0xFFFFFFFF) - val GoogleStroke = Color(0xFF747775) + /** Google 로그인 버튼 색(브랜딩 가이드라인 뉴트럴). 라이트 테마로 바꾸면 #747775 테두리가 필수다. */ + val GoogleSurface = Color(0xFFF2F2F2) val GoogleLabel = Color(0xFF1F1F1F) } @@ -94,6 +93,5 @@ object RuleUpColors { val KakaoText = RuleUpPalette.KakaoLabel val Google = RuleUpPalette.GoogleSurface - val GoogleBorder = RuleUpPalette.GoogleStroke val GoogleText = RuleUpPalette.GoogleLabel } diff --git a/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/intro/screen/LoginScreen.kt b/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/intro/screen/LoginScreen.kt index ef63b5ff8..82ed9520e 100644 --- a/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/intro/screen/LoginScreen.kt +++ b/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/intro/screen/LoginScreen.kt @@ -27,15 +27,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import com.ruleup.designsystem.singleClickable import com.ruleup.designsystem.theme.RuleUpColors -import com.ruleup.designsystem.theme.RuleUpGradients import com.ruleup.designsystem.theme.RuleUpTheme import com.ruleup.onboarding.domain.auth.entity.OAuthProvider import com.ruleup.onboarding.presentation.R @@ -110,11 +106,16 @@ fun LoginContent( Modifier .size(80.dp) .clip(RoundedCornerShape(22.dp)) - .background(RuleUpGradients.Brand), + .background(Color.White) + .border(1.dp, RuleUpTheme.colors.border, RoundedCornerShape(22.dp)), contentAlignment = Alignment.Center, ) { - // 브랜드 로크업. - Text("R", color = Color.White, fontSize = 40.sp, fontWeight = FontWeight.Bold) + // 스플래시·앱 아이콘과 같은 체크 링(시안 D). + Image( + painter = painterResource(com.ruleup.designsystem.R.drawable.ic_ruleup_mark), + contentDescription = "RuleUp", + modifier = Modifier.size(54.dp), + ) } Column( horizontalAlignment = Alignment.CenterHorizontally, @@ -145,15 +146,6 @@ fun LoginContent( onClick = { onIntent(LoginIntent.LoginClicked(OAuthProvider.GOOGLE)) }, ) } - - Spacer(Modifier.height(4.dp)) - - Text( - "시작과 동시에 서비스 이용약관 및 개인정보 처리방침에 동의하게 됩니다", - color = RuleUpTheme.colors.textMuted, - style = RuleUpTheme.typography.caption, - textAlign = TextAlign.Center, - ) } } } @@ -189,7 +181,6 @@ private fun GoogleLoginButton(onClick: () -> Unit) { .aspectRatio(LOGIN_BUTTON_ASPECT_RATIO) .clip(RuleUpTheme.shapes.medium) .background(RuleUpColors.Google) - .border(1.dp, RuleUpColors.GoogleBorder, RuleUpTheme.shapes.medium) .singleClickable(onClick = onClick) .padding(horizontal = 12.dp), horizontalArrangement = Arrangement.Center, diff --git a/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/PhotoScreen.kt b/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/PhotoScreen.kt index 206543309..7cc23156d 100644 --- a/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/PhotoScreen.kt +++ b/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/PhotoScreen.kt @@ -64,32 +64,35 @@ fun PhotoContent( ) Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) { - Box( - modifier = - Modifier - .size(140.dp) - .clip(RoundedCornerShape(70.dp)) - .background(RuleUpGradients.Brand) - .border(5.dp, Color.White, RoundedCornerShape(70.dp)), - contentAlignment = Alignment.Center, - ) { - if (imageUri.isNullOrEmpty()) { - Image( - painter = painterResource(com.ruleup.designsystem.R.drawable.ic_person), - contentDescription = null, - colorFilter = ColorFilter.tint(Color.White), - modifier = Modifier.size(61.dp), - ) - } else { - val onImageSettled = rememberTtiLargeContent() - AsyncImage( - model = imageUri, - contentDescription = null, - contentScale = ContentScale.Crop, - onSuccess = { onImageSettled() }, - onError = { onImageSettled() }, - modifier = Modifier.matchParentSize().clip(RoundedCornerShape(70.dp)), - ) + // 배지를 원 안에 두면 원형 클립에 모서리가 잘린다. + Box(modifier = Modifier.size(140.dp)) { + Box( + modifier = + Modifier + .matchParentSize() + .clip(RoundedCornerShape(70.dp)) + .background(RuleUpGradients.Brand) + .border(5.dp, Color.White, RoundedCornerShape(70.dp)), + contentAlignment = Alignment.Center, + ) { + if (imageUri.isNullOrEmpty()) { + Image( + painter = painterResource(com.ruleup.designsystem.R.drawable.ic_person), + contentDescription = null, + colorFilter = ColorFilter.tint(Color.White), + modifier = Modifier.size(61.dp), + ) + } else { + val onImageSettled = rememberTtiLargeContent() + AsyncImage( + model = imageUri, + contentDescription = null, + contentScale = ContentScale.Crop, + onSuccess = { onImageSettled() }, + onError = { onImageSettled() }, + modifier = Modifier.matchParentSize().clip(RoundedCornerShape(70.dp)), + ) + } } Box( diff --git a/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/TermsScreen.kt b/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/TermsScreen.kt index dfd2236e3..3e1013cde 100644 --- a/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/TermsScreen.kt +++ b/onboarding/presentation/src/main/kotlin/com/ruleup/onboarding/presentation/onboarding/TermsScreen.kt @@ -25,7 +25,6 @@ import com.ruleup.domain.entity.user.AgreementType import com.ruleup.onboarding.domain.logging.OnboardingStep import com.ruleup.onboarding.domain.navigation.TermsDocumentPage import com.ruleup.onboarding.presentation.component.OnboardingScaffold -import com.ruleup.onboarding.presentation.onboarding.component.InfoBox import com.ruleup.onboarding.presentation.onboarding.component.OnboardingFlowPreview import com.ruleup.onboarding.presentation.onboarding.component.RequirementBadge import com.ruleup.onboarding.presentation.onboarding.component.RowDivider @@ -102,13 +101,6 @@ fun TermsContent( if (index != AgreementType.SIGNUP.lastIndex) RowDivider() } } - - InfoBox( - background = RuleUpTheme.colors.brandSoft, - emoji = "📄", - text = "필수 항목에 동의해야 가입을 완료할 수 있어요. 선택 항목은 알림 설정 기본값이 돼요", - textColor = RuleUpTheme.colors.brandStrong, - ) } } diff --git a/onboarding/presentation/src/test/kotlin/com/ruleup/onboarding/presentation/intro/LoginContentTest.kt b/onboarding/presentation/src/test/kotlin/com/ruleup/onboarding/presentation/intro/LoginContentTest.kt index 9ee32090a..72f772a22 100644 --- a/onboarding/presentation/src/test/kotlin/com/ruleup/onboarding/presentation/intro/LoginContentTest.kt +++ b/onboarding/presentation/src/test/kotlin/com/ruleup/onboarding/presentation/intro/LoginContentTest.kt @@ -51,14 +51,6 @@ class LoginContentTest { assertEquals(listOf(LoginIntent.LoginClicked(OAuthProvider.GOOGLE)), intents) } - @Test - fun `약관 동의가 시작과 함께 이뤄진다는 것을 알린다`() { - // 별도 동의 화면이 없으므로 여기서 말하지 않으면 사용자가 모른 채 동의하게 된다. - compose.renderOnboarding { LoginContent(onIntent = {}) } - - compose.onNodeWithText("시작과 동시에 서비스 이용약관 및 개인정보 처리방침에 동의하게 됩니다").assertExists() - } - @Test fun `버튼을 누르기 전에는 아무 의도도 올라가지 않는다`() { val intents = mutableListOf()