From 5153313f32609a3a3eaf6c539562d0aec2e5c915 Mon Sep 17 00:00:00 2001 From: parkchanil <0114chan@gmail.com> Date: Wed, 6 Nov 2024 12:19:16 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=B0=8F?= =?UTF-8?q?=20=EC=82=AC=EC=A7=84=20=EC=88=98=EC=A0=95=20(#59)=20(KAN-135)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mhnfe/ui/screens/auth/LoginScreen.kt | 149 ++++++++++++------ app/src/main/res/drawable/logo2.png | Bin 0 -> 13173 bytes 2 files changed, 97 insertions(+), 52 deletions(-) create mode 100644 app/src/main/res/drawable/logo2.png diff --git a/app/src/main/java/com/example/mhnfe/ui/screens/auth/LoginScreen.kt b/app/src/main/java/com/example/mhnfe/ui/screens/auth/LoginScreen.kt index 4b7ce89c..2253589a 100644 --- a/app/src/main/java/com/example/mhnfe/ui/screens/auth/LoginScreen.kt +++ b/app/src/main/java/com/example/mhnfe/ui/screens/auth/LoginScreen.kt @@ -1,100 +1,145 @@ package com.example.mhnfe.ui.screens.auth +import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material3.Checkbox import androidx.compose.material3.CheckboxDefaults +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.material3.Scaffold - +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController +import com.example.mhnfe.R import com.example.mhnfe.ui.components.MainTextBox import com.example.mhnfe.ui.components.SubTopBar import com.example.mhnfe.ui.components.middleButton +import com.example.mhnfe.ui.theme.mainBlack import com.example.mhnfe.ui.theme.mainGray import com.example.mhnfe.ui.theme.mainYellow +import com.example.mhnfe.ui.theme.mainGray3 @Composable fun LoginScreen( - onBackClick: () -> Unit, + modifier: Modifier = Modifier, + navController: NavController, onLoginClick: () -> Unit ) { val focusManager = LocalFocusManager.current var isAutoLogin by remember { mutableStateOf(false) } Scaffold( - modifier = Modifier - .statusBarsPadding() - .navigationBarsPadding(), + modifier = modifier, topBar = { SubTopBar( text = "로그인", - onBack = onBackClick + onBack = { navController.popBackStack() } ) } ) { paddingValues -> Column( - modifier = Modifier - .fillMaxSize() + modifier = modifier .padding(paddingValues) - .padding(horizontal = 20.dp) - .padding(top = 20.dp), - verticalArrangement = Arrangement.spacedBy(16.dp), - horizontalAlignment = Alignment.CenterHorizontally // 중앙 정렬 추가 + .fillMaxSize() + .padding(horizontal = 34.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(110.dp, alignment = Alignment.Top) ) { - // 입력 필드들 + // 상단부 (로고) Column( - modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(16.dp) + modifier = modifier.padding(vertical = 50.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(40.dp, alignment = Alignment.CenterVertically) ) { - MainTextBox( - focusManager = focusManager, - hintText = "아이디" + // 로고 이미지 + Image( + painter = painterResource(id = R.drawable.logo2), + contentDescription = "로고", + modifier = Modifier.size(250.dp), + contentScale = ContentScale.Fit ) - MainTextBox( - focusManager = focusManager, - hintText = "비밀번호" - ) - - // 자동 로그인 체크박스 - Row( - modifier = Modifier.padding(vertical = 4.dp), - verticalAlignment = Alignment.CenterVertically + // 입력 필드들과 자동로그인을 포함하는 Column + Column( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + verticalArrangement = Arrangement.spacedBy(16.dp, alignment = Alignment.CenterVertically), + horizontalAlignment = Alignment.Start ) { - Checkbox( - checked = isAutoLogin, - onCheckedChange = { isAutoLogin = it }, - colors = CheckboxDefaults.colors(checkedColor = mainYellow) + MainTextBox( + focusManager = focusManager, + hintText = "아이디" + ) + + MainTextBox( + focusManager = focusManager, + hintText = "비밀번호" ) - Text("자동로그인") + + // 자동 로그인 체크박스 + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.offset((-12).dp) + ) { + Checkbox( + checked = isAutoLogin, + onCheckedChange = { isAutoLogin = it }, + colors = CheckboxDefaults.colors(checkedColor = mainYellow) + ) + Text( + text = "자동로그인", + color = mainGray + ) + } } } - Spacer(modifier = Modifier.weight(1f)) - - // 로그인 버튼 - middleButton( - text = "로그인", - onClick = onLoginClick, - modifier = Modifier.align(Alignment.CenterHorizontally) - ) + // 하단부 버튼과 텍스트를 포함하는 Column + Column( + modifier = modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + // 로그인 버튼 + middleButton( + text = "로그인", + onClick = onLoginClick + ) - // 비밀번호 찾기 텍스트 - Text( - text = "비밀번호를 잊어버리셨나요?", - modifier = Modifier - .padding(vertical = 16.dp), // fillMaxWidth 제거 - textAlign = TextAlign.Center, - color = mainGray - ) + // 비밀번호 찾기 텍스트 + Text( + text = "비밀번호를 잊어버리셨나요?", + textAlign = TextAlign.Center, + color = mainGray, + modifier = Modifier + .clickable { navController.navigate("forgot_password") } - // 하단 여백 - Spacer(modifier = Modifier.height(20.dp)) + ) + } } } -} \ No newline at end of file +} + +@Preview( + name = "Login Screen", + showBackground = true, + showSystemUi = true, + device = "spec:width=411dp,height=891dp" +) +@Composable +fun LoginScreenPreview() { + LoginScreen( + navController = rememberNavController(), + onLoginClick = {} + ) +} + diff --git a/app/src/main/res/drawable/logo2.png b/app/src/main/res/drawable/logo2.png new file mode 100644 index 0000000000000000000000000000000000000000..72cc7d5828198d038ab950d29f05484a390eee4f GIT binary patch literal 13173 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