From b4f693490883aa500ce6069ed6e30a44a63a638d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=B6=94=EC=97=B0=EC=9A=B0?= Date: Fri, 8 May 2026 01:48:00 +0900 Subject: [PATCH] =?UTF-8?q?fix=20:=20QA=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designsystem/component/ProfileImage.kt | 3 +- .../component/modal/DeleteModal.kt | 2 +- .../component/modal/RejectModal.kt | 25 ++- .../component/post/CommentUserInfoItem.kt | 7 +- .../component/post/PostUserInfoItem.kt | 16 +- .../board/boardList/BoardListScreen.kt | 57 ++++-- .../spot/feature/board/main/BoardScreen.kt | 11 +- .../board/post/content/PostContentScreen.kt | 3 +- .../board/post/posting/PostingScreen.kt | 11 +- .../umcspot/spot/category/CategoryScreen.kt | 4 +- .../spot/category/component/CategoryTabs.kt | 47 ++++- .../java/com/umcspot/spot/home/HomeScreen.kt | 2 +- .../com/umcspot/spot/main/MainNavigator.kt | 4 +- .../java/com/umcspot/spot/main/MainScreen.kt | 6 +- .../CancelMemberShipScreen.kt | 3 +- .../participating/ParticipatingStudyScreen.kt | 34 +++- .../RecruitingStudyApplicationScreen.kt | 3 +- .../com/umcspot/spot/signup/SignUpScreen.kt | 24 ++- .../spot/signup/component/AgreementConfirm.kt | 40 ---- .../spot/signup/component/AgreementModal.kt | 192 +++++++++++++----- 20 files changed, 329 insertions(+), 165 deletions(-) delete mode 100644 feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementConfirm.kt diff --git a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/ProfileImage.kt b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/ProfileImage.kt index 8e47ff9f..4f0e0493 100644 --- a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/ProfileImage.kt +++ b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/ProfileImage.kt @@ -16,6 +16,7 @@ import coil.compose.rememberAsyncImagePainter import com.umcspot.spot.designsystem.R import com.umcspot.spot.designsystem.theme.SpotTheme import com.umcspot.spot.model.ImageRef +import com.umcspot.spot.ui.extension.screenWidthDp @Composable fun ProfileImage( @@ -63,7 +64,7 @@ private fun preview() { SpotTheme { ProfileImage( imageRef = ImageRef.Name("sample"), - modifier = Modifier.size(40.dp) + modifier = Modifier.size(screenWidthDp(33.dp)) ) } } diff --git a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/DeleteModal.kt b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/DeleteModal.kt index f9a67525..3d52e3f6 100644 --- a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/DeleteModal.kt +++ b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/DeleteModal.kt @@ -53,7 +53,7 @@ fun DeleteModal( modifier = Modifier .fillMaxWidth() .wrapContentHeight() - .padding(17.dp), + .padding(screenWidthDp(17.dp), screenHeightDp(17.dp)), verticalArrangement = Arrangement.Top, horizontalAlignment = Alignment.CenterHorizontally ) { diff --git a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/RejectModal.kt b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/RejectModal.kt index 7f589f2c..e2d042a2 100644 --- a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/RejectModal.kt +++ b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/RejectModal.kt @@ -30,6 +30,7 @@ import com.umcspot.spot.designsystem.R import com.umcspot.spot.designsystem.component.button.TextButton import com.umcspot.spot.designsystem.component.button.TextButtonState import com.umcspot.spot.designsystem.shapes.SpotShapes +import com.umcspot.spot.designsystem.theme.G400 import com.umcspot.spot.designsystem.theme.R500 import com.umcspot.spot.designsystem.theme.SpotTheme import com.umcspot.spot.ui.extension.screenHeightDp @@ -83,7 +84,9 @@ fun RejectModal( contentDescription = null, modifier = Modifier .size(screenWidthDp(33.dp)), - colorFilter = ColorFilter.tint(painterTint) + colorFilter = painterTint + .takeUnless { it == Color.Unspecified } + ?.let { ColorFilter.tint(it) } ) Spacer(Modifier.height(screenHeightDp(7.dp))) @@ -183,3 +186,23 @@ private fun RejectDialog_Preview() { ) } } + + +@Preview(showBackground = true, widthDp = 360, heightDp = 640) +@Composable +private fun CancelMembbershipDialog_Preview() { + SpotTheme { + RejectDialog( + visible = true, + painter = painterResource(R.drawable.cancel_membership), + painterTint = SpotTheme.colors.G400, + modalTitle = "정말 탈퇴할까요?", + modalDes = null, + okButtonText = "탈퇴", + noButtonText = "취소", + onDismiss = { }, + onClick = { }, + onCancel = { } + ) + } +} \ No newline at end of file diff --git a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt index 3655164b..092e0df3 100644 --- a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt +++ b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt @@ -3,9 +3,10 @@ package com.umcspot.spot.designsystem.component.post import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -15,6 +16,7 @@ import androidx.compose.ui.unit.dp import com.umcspot.spot.designsystem.component.ProfileImage import com.umcspot.spot.designsystem.theme.SpotTheme import com.umcspot.spot.model.ImageRef +import com.umcspot.spot.ui.extension.screenHeightDp import com.umcspot.spot.ui.extension.screenWidthDp @Composable @@ -25,7 +27,8 @@ fun CommentUserInfo( ) { Row( modifier = modifier - .wrapContentSize(), + .wrapContentWidth() + .height(screenHeightDp(33.dp)), horizontalArrangement = Arrangement.Start, verticalAlignment = Alignment.CenterVertically ) { diff --git a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/PostUserInfoItem.kt b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/PostUserInfoItem.kt index d97fabc4..9c2395ed 100644 --- a/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/PostUserInfoItem.kt +++ b/core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/PostUserInfoItem.kt @@ -9,12 +9,15 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.umcspot.spot.designsystem.component.ProfileImage import com.umcspot.spot.designsystem.theme.SpotTheme import com.umcspot.spot.model.ImageRef +import com.umcspot.spot.ui.extension.screenHeightDp +import com.umcspot.spot.ui.extension.screenWidthDp @Composable fun UserInfo( @@ -25,22 +28,21 @@ fun UserInfo( ) { Row( modifier = modifier - .wrapContentSize() + .wrapContentSize(), + verticalAlignment = Alignment.CenterVertically ) { ProfileImage( imageRef = postWriterImage, - modifier = Modifier.size(44.dp) + modifier = Modifier.size(screenWidthDp(44.dp)) ) - Spacer(Modifier.width(10.dp)) - Column ( - - ) { + Spacer(Modifier.width(screenWidthDp(7.dp))) + Column { Text( text = postWriterName, style = SpotTheme.typography.medium_400 ) - Spacer(Modifier.height(4.dp)) + Spacer(Modifier.height(screenHeightDp(4.dp))) Text( text = postWriteAt, diff --git a/feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt b/feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt index 093b9bb3..4ee71b80 100644 --- a/feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt +++ b/feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt @@ -1,19 +1,18 @@ -package com.umcspot.spot.feature.board.boardList +package com.umcspot.spot.feature.board.boardList import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items @@ -22,8 +21,6 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.Surface import androidx.compose.material3.Tab -import androidx.compose.material3.TabRowDefaults -import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -31,6 +28,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable @@ -39,11 +37,12 @@ import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawWithContent -import androidx.compose.ui.draw.paint import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.Lifecycle @@ -165,6 +164,8 @@ fun BoardListScreen( .background(SpotTheme.colors.white) .padding(top = topPad, bottom = bottomPad), ) { + Spacer(modifier = Modifier.height(screenHeightDp(18.dp))) + SelectedLocationTabs( tabs = tabItems.map { it?.korean ?: "전체" }, selectedIndex = selectedTab, @@ -291,6 +292,9 @@ private fun SelectedLocationTabs( val scrimWidth = screenWidthDp(24.dp) val bg = SpotTheme.colors.white + val density = LocalDensity.current + val textWidths = remember(tabs) { mutableStateMapOf() } + val minTabWidth = screenWidthDp(50.dp) Box( modifier = Modifier @@ -323,7 +327,7 @@ private fun SelectedLocationTabs( ) { ScrollableTabRow( selectedTabIndex = selectedIndex, - edgePadding = 0.dp, + edgePadding = screenWidthDp(17.dp), containerColor = Color.Transparent, divider = { HorizontalDivider( @@ -332,19 +336,34 @@ private fun SelectedLocationTabs( ) }, indicator = { tabPositions -> - TabRowDefaults.SecondaryIndicator( + val currentTab = tabPositions.getOrNull(selectedIndex) ?: return@ScrollableTabRow + val textWidth = textWidths[selectedIndex] ?: 0.dp + val indicatorWidth = if (textWidth > 0.dp) { + maxOf(minTabWidth, textWidth) + } else { + minTabWidth + } + val indicatorOffsetX = currentTab.left + (currentTab.width - indicatorWidth) / 2 + + Box( modifier = Modifier - .tabIndicatorOffset(tabPositions[selectedIndex]) - .padding(horizontal = screenWidthDp(17.dp)) - .height(1.dp), - color = SpotTheme.colors.B500 + .fillMaxWidth() + .wrapContentSize(Alignment.BottomStart) + .offset(x = indicatorOffsetX) + .width(indicatorWidth) + .height(1.dp) + .background(SpotTheme.colors.B500) ) } ) { tabs.forEachIndexed { index, name -> + val textWidth = textWidths[index] ?: 0.dp + val tabWidth = if (textWidth > 0.dp) maxOf(minTabWidth, textWidth) else minTabWidth + Tab( modifier = Modifier - .wrapContentWidth(), + .width(tabWidth) + .padding(horizontal = screenWidthDp(7.dp)), // 1) 탭 간 간격 selected = selectedIndex == index, onClick = { onTabSelected(index) }, selectedContentColor = SpotTheme.colors.black, @@ -353,11 +372,17 @@ private fun SelectedLocationTabs( Text( text = name, style = SpotTheme.typography.h5, + onTextLayout = { textLayoutResult -> + textWidths[index] = with(density) { textLayoutResult.size.width.toDp() } + }, modifier = Modifier - .padding(horizontal = screenWidthDp(7.dp), vertical = screenHeightDp(4.dp)) + .padding( + vertical = screenHeightDp(4.dp) // 4) 탭 높이(세로 여백) + ), + textAlign = TextAlign.Center ) } } } } -} \ No newline at end of file +} diff --git a/feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt b/feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt index c2aa53be..91eed039 100644 --- a/feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt +++ b/feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt @@ -1,4 +1,4 @@ -package com.umcspot.spot.feature.board.main +package com.umcspot.spot.feature.board.main import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -79,7 +79,7 @@ fun BoardScreen( Box( modifier = Modifier .fillMaxSize() - .background(Color.White) + .background(SpotTheme.colors.white) .padding(top = topPad, bottom = bottomPad) ) { LazyColumn( @@ -321,14 +321,11 @@ private fun RecentCardList( onItemClick: (RecentPostResult) -> Unit ) { ShapeBox( + modifier = Modifier.fillMaxWidth(), shape = SpotShapes.Soft, color = SpotTheme.colors.white, borderWidth = 1.dp, borderColor = SpotTheme.colors.G200, - modifier = Modifier - .fillMaxWidth() - .clip(SpotShapes.Soft) - .height(screenHeightDp(162.dp)) ) { when (items) { is UiState.Loading, is UiState.Empty, is UiState.Failure -> { @@ -345,7 +342,7 @@ private fun RecentCardList( Column( modifier = Modifier - .fillMaxSize() + .fillMaxWidth() .padding(screenWidthDp(7.dp)), verticalArrangement = Arrangement.spacedBy(screenHeightDp(7.dp)) ) { diff --git a/feature/board/src/main/java/com/umcspot/spot/feature/board/post/content/PostContentScreen.kt b/feature/board/src/main/java/com/umcspot/spot/feature/board/post/content/PostContentScreen.kt index e4aa39c7..4adc357f 100644 --- a/feature/board/src/main/java/com/umcspot/spot/feature/board/post/content/PostContentScreen.kt +++ b/feature/board/src/main/java/com/umcspot/spot/feature/board/post/content/PostContentScreen.kt @@ -557,13 +557,12 @@ private fun preview() { // 2) 구분선 item(key = "divider") { - Spacer(Modifier.height(8.dp)) HorizontalDivider( modifier = Modifier.fillMaxWidth(), thickness = 1.dp, color = SpotTheme.colors.gray200 ) - Spacer(Modifier.height(8.dp)) + Spacer(Modifier.height(screenHeightDp(18.dp))) } items( diff --git a/feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt b/feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt index f072aa4b..105124aa 100644 --- a/feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt +++ b/feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt @@ -264,13 +264,14 @@ private fun BottomToolsRow( ) { Row( modifier = Modifier - .padding(horizontal = screenWidthDp(5.dp), vertical = screenHeightDp(2.dp)) - .clickable( - onClick = onClickAddPhoto - ) + .clip(SpotShapes.Hard) + .clickable(onClick = onClickAddPhoto) + .padding(horizontal = screenWidthDp(5.dp), vertical = screenHeightDp(2.dp)), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center, ) { Image( - modifier = Modifier.size(screenWidthDp(20.dp)), + modifier = Modifier.size(screenWidthDp(14.dp)), painter = painterResource(R.drawable.camera), contentDescription = "사진 추가", ) diff --git a/feature/category/src/main/java/com/umcspot/spot/category/CategoryScreen.kt b/feature/category/src/main/java/com/umcspot/spot/category/CategoryScreen.kt index 5c9b4577..bbc57f4d 100644 --- a/feature/category/src/main/java/com/umcspot/spot/category/CategoryScreen.kt +++ b/feature/category/src/main/java/com/umcspot/spot/category/CategoryScreen.kt @@ -124,13 +124,15 @@ private fun CategoryScreen( bottom = contentPadding.calculateBottomPadding() ) ) { + Spacer(Modifier.height(screenHeightDp(18.dp))) + CategoryTabs( tabs = allTabs, selectedIndex = selectedIndex, onTabSelected = onTabSelected ) - Spacer(Modifier.height(screenHeightDp(12.dp))) + Spacer(Modifier.height(screenHeightDp(12.dp))) CategoryHeaderRow( size = studyList.size, diff --git a/feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt b/feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt index 7ca73645..845f2248 100644 --- a/feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt +++ b/feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt @@ -1,23 +1,30 @@ package com.umcspot.spot.category.component +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.Tab -import androidx.compose.material3.TabRowDefaults -import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateMapOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.umcspot.spot.designsystem.theme.B500 import com.umcspot.spot.designsystem.theme.SpotTheme @@ -35,6 +42,10 @@ fun CategoryTabs( val scrimWidth = screenWidthDp(24.dp) val bg = SpotTheme.colors.white + val density = LocalDensity.current + val textWidths = remember(tabs) { mutableStateMapOf() } + val minTabWidth = screenWidthDp(50.dp) + Box( modifier = Modifier @@ -65,7 +76,7 @@ fun CategoryTabs( ScrollableTabRow( modifier = Modifier.fillMaxWidth(), selectedTabIndex = selectedIndex, - edgePadding = 0.dp, + edgePadding = screenWidthDp(17.dp), containerColor = Color.Transparent, divider = { HorizontalDivider( @@ -74,16 +85,30 @@ fun CategoryTabs( ) }, indicator = { tabPositions -> - TabRowDefaults.SecondaryIndicator( + val currentTab = tabPositions.getOrNull(selectedIndex) ?: return@ScrollableTabRow + val textWidth = textWidths[selectedIndex] ?: 0.dp + val indicatorWidth = if (textWidth > 0.dp) { + maxOf(minTabWidth, textWidth) + } else { + minTabWidth + } + val indicatorOffsetX = currentTab.left + (currentTab.width - indicatorWidth) / 2 + + Box( modifier = Modifier - .tabIndicatorOffset(tabPositions[selectedIndex]) - .padding(horizontal = screenWidthDp(17.dp)) - .height(1.dp), - color = SpotTheme.colors.B500 + .fillMaxWidth() + .wrapContentSize(Alignment.BottomStart) + .offset(x = indicatorOffsetX) + .width(indicatorWidth) + .height(1.dp) + .background(SpotTheme.colors.B500) ) } ) { tabs.forEachIndexed { index, theme -> + val textWidth = textWidths[index] ?: 0.dp + val tabWidth = if (textWidth > 0.dp) maxOf(minTabWidth, textWidth) else minTabWidth + Tab( modifier = Modifier .wrapContentWidth(), @@ -95,10 +120,14 @@ fun CategoryTabs( Text( text = theme?.title ?: "전체", style = SpotTheme.typography.h5, + onTextLayout = { textLayoutResult -> + textWidths[index] = with(density) { textLayoutResult.size.width.toDp() } + }, modifier = Modifier.padding( horizontal = screenWidthDp(7.dp), vertical = screenHeightDp(4.dp) - ) + ), + textAlign = TextAlign.Center ) } } diff --git a/feature/home/src/main/java/com/umcspot/spot/home/HomeScreen.kt b/feature/home/src/main/java/com/umcspot/spot/home/HomeScreen.kt index 4eef6ac5..0c0d1790 100644 --- a/feature/home/src/main/java/com/umcspot/spot/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/umcspot/spot/home/HomeScreen.kt @@ -143,7 +143,7 @@ private fun HomeScreen( LazyColumn( modifier = Modifier .fillMaxSize() - .background(Color.White) + .background(SpotTheme.colors.white) .padding( top = contentPadding.calculateTopPadding(), bottom = contentPadding.calculateBottomPadding() diff --git a/feature/main/src/main/java/com/umcspot/spot/main/MainNavigator.kt b/feature/main/src/main/java/com/umcspot/spot/main/MainNavigator.kt index f00eee8e..c43069a2 100644 --- a/feature/main/src/main/java/com/umcspot/spot/main/MainNavigator.kt +++ b/feature/main/src/main/java/com/umcspot/spot/main/MainNavigator.kt @@ -45,7 +45,6 @@ import com.umcspot.spot.signup.navigation.navigateToLanding import com.umcspot.spot.signup.navigation.navigateToSaving import com.umcspot.spot.signup.navigation.navigateToSignUp import com.umcspot.spot.study.detail.navigation.StudyDetail -import com.umcspot.spot.study.detail.navigation.StudyPostContent import com.umcspot.spot.study.detail.navigation.navigateToStudyBoardPost import com.umcspot.spot.study.detail.navigation.navigateToStudyDetail import com.umcspot.spot.study.detail.navigation.navigateToStudyMemoirPost @@ -128,7 +127,8 @@ class MainNavigator( BoardList::class, JJim::class, MyStudy::class, - MyPageGraph.StudyApplications::class + MyPageGraph.StudyApplications::class, + MyPageGraph.CancelMemberShip::class ) || inAnyGraphRoutes(POST_CONTENT_ROUTE)|| (currentDestination?.route?.contains(POST_CONTENT_ROUTE) == true) @Composable diff --git a/feature/main/src/main/java/com/umcspot/spot/main/MainScreen.kt b/feature/main/src/main/java/com/umcspot/spot/main/MainScreen.kt index b322588b..984e7828 100644 --- a/feature/main/src/main/java/com/umcspot/spot/main/MainScreen.kt +++ b/feature/main/src/main/java/com/umcspot/spot/main/MainScreen.kt @@ -18,7 +18,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -34,6 +33,7 @@ import com.umcspot.spot.designsystem.component.FloatingToUpButton import com.umcspot.spot.designsystem.component.appBar.AppBarHome import com.umcspot.spot.designsystem.component.appBar.BackTopBar import com.umcspot.spot.designsystem.component.modal.RejectDialog +import com.umcspot.spot.designsystem.theme.SpotTheme import com.umcspot.spot.feature.board.boardList.navigation.BoardList import com.umcspot.spot.feature.board.post.content.navigation.POST_CONTENT_ROUTE import com.umcspot.spot.feature.board.post.posting.navigation.Posting @@ -46,10 +46,8 @@ import com.umcspot.spot.signup.navigation.CheckList import com.umcspot.spot.signup.navigation.SignUp import com.umcspot.spot.study.detail.model.StudyDetailTab import com.umcspot.spot.study.detail.navigation.StudyAttendance -import com.umcspot.spot.study.detail.navigation.StudyBoardPost import com.umcspot.spot.study.detail.navigation.StudyDetail import com.umcspot.spot.study.detail.navigation.StudyMemoirPost -import com.umcspot.spot.study.detail.navigation.StudyPostContent import com.umcspot.spot.study.my.navigation.MyStudy import com.umcspot.spot.study.preferCategory.navigation.PreferCategoryFilter import com.umcspot.spot.study.preferLocation.navigation.PreferLocationFilter @@ -178,7 +176,7 @@ fun MainScreen( } }, modifier = Modifier - .background(Color.White) + .background(SpotTheme.colors.white) .fillMaxSize() ) { innerPadding -> MainNavHost( diff --git a/feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt b/feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt index dfe41695..d2170514 100644 --- a/feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt +++ b/feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt @@ -78,7 +78,7 @@ fun CancelMemberShipScreen( Row { Text(text = "복구가", style = SpotTheme.typography.regular_500) - Spacer(modifier = Modifier.width(screenWidthDp(8.dp))) + Spacer(modifier = Modifier.width(screenWidthDp(3.dp))) Text( text = "불가능", @@ -142,6 +142,7 @@ fun CancelMemberShipScreen( onDismiss = { showDialog = false }, onClick = { viewmodel.leaveSpot() + showSuccessDialog = true showDialog = false }, onCancel = { showDialog = false } diff --git a/feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt b/feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt index 4b0d2abc..efa0b84e 100644 --- a/feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt +++ b/feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt @@ -2,14 +2,36 @@ package com.umcspot.spot.mypage.participating import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -264,7 +286,7 @@ private fun ParticipatingScreenContent( .align(Alignment.BottomEnd) .offset(x = 5.dp, y = 5.dp) .size(screenWidthDp(18.dp)) - .background(Color.White, CircleShape) + .background(SpotTheme.colors.white, CircleShape) .padding(screenWidthDp(2.dp)), contentAlignment = Alignment.Center ) { @@ -305,6 +327,8 @@ fun MeetballMenu( DropdownMenu( modifier = Modifier.background(SpotTheme.colors.white), shape = SpotShapes.Soft, + shadowElevation = 1.dp, + tonalElevation = 1.dp, expanded = expanded, onDismissRequest = onDismiss, ) { @@ -378,4 +402,4 @@ fun MeetballMenu( } ) } -} \ No newline at end of file +} diff --git a/feature/mypage/src/main/java/com/umcspot/spot/mypage/recruiting/application/RecruitingStudyApplicationScreen.kt b/feature/mypage/src/main/java/com/umcspot/spot/mypage/recruiting/application/RecruitingStudyApplicationScreen.kt index a70d2d78..949d0b1f 100644 --- a/feature/mypage/src/main/java/com/umcspot/spot/mypage/recruiting/application/RecruitingStudyApplicationScreen.kt +++ b/feature/mypage/src/main/java/com/umcspot/spot/mypage/recruiting/application/RecruitingStudyApplicationScreen.kt @@ -28,7 +28,6 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel @@ -113,7 +112,7 @@ fun RecruitingStudyRequestScreen( RecruitingStudyScreenContent( modifier = Modifier .fillMaxSize() - .background(Color.White) + .background(SpotTheme.colors.white) .padding(top = contentPadding.calculateTopPadding(), bottom = contentPadding.calculateBottomPadding()) .padding(horizontal = screenWidthDp(17.dp)), applicationList = itemList, diff --git a/feature/signup/src/main/java/com/umcspot/spot/signup/SignUpScreen.kt b/feature/signup/src/main/java/com/umcspot/spot/signup/SignUpScreen.kt index 6eae7478..965d1b71 100644 --- a/feature/signup/src/main/java/com/umcspot/spot/signup/SignUpScreen.kt +++ b/feature/signup/src/main/java/com/umcspot/spot/signup/SignUpScreen.kt @@ -9,7 +9,9 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text @@ -26,7 +28,8 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.umcspot.spot.designsystem.component.button.SpotActivationButton +import com.umcspot.spot.designsystem.component.button.TextButton +import com.umcspot.spot.designsystem.shapes.SpotShapes import com.umcspot.spot.designsystem.theme.B500 import com.umcspot.spot.designsystem.theme.SpotTheme import com.umcspot.spot.signup.component.ConsentItem @@ -84,8 +87,7 @@ fun SignUpScreen( var showPrivacyDialog by rememberSaveable { mutableStateOf(false) } var showUniqueDialog by rememberSaveable { mutableStateOf(false) } - - + Column( modifier = Modifier .fillMaxSize() @@ -139,12 +141,18 @@ fun SignUpScreen( Spacer(Modifier.height(screenHeightDp(24.dp))) - SpotActivationButton( - modifier = Modifier.fillMaxWidth(), - buttonText = "다음", - isEnabled = uiState.isPrivacyChecked && uiState.isUniqueChecked, - onClick = onNextClick + TextButton( + modifier = Modifier + .padding(vertical = screenHeightDp(10.dp)) + .width(screenWidthDp(326.dp)) + .heightIn(screenHeightDp(47.dp)), + text = "다음", + style = SpotTheme.typography.h3, + enabled = uiState.isPrivacyChecked && uiState.isUniqueChecked, + onClick = onNextClick, + shape = SpotShapes.Soft ) + Spacer(Modifier.height(screenHeightDp(13.dp))) } diff --git a/feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementConfirm.kt b/feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementConfirm.kt deleted file mode 100644 index 62767195..00000000 --- a/feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementConfirm.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.umcspot.spot.signup.component - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.umcspot.spot.designsystem.theme.SpotTheme -import com.umcspot.spot.ui.extension.screenHeightDp - -@Composable -fun AgreementConfirm( - privacyChecked: Boolean, - uniqueChecked: Boolean, - onOpenPrivacyDialog: () -> Unit, - onOpenUniqueDialog: () -> Unit, -) { - Column { - Text( - text = "약관 동의", - style = SpotTheme.typography.h3 - ) - Spacer(Modifier.height(screenHeightDp(7.dp))) - - ConsentItem( - title = "개인정보 이용 및 활용 동의", - checked = privacyChecked, - onClick = onOpenPrivacyDialog - ) - Spacer(Modifier.height(screenHeightDp(4.dp))) - - ConsentItem( - title = "고유식별정보 처리 동의", - checked = uniqueChecked, - onClick = onOpenUniqueDialog - ) - } -} \ No newline at end of file diff --git a/feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt b/feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt index ca9da30d..aceae6f2 100644 --- a/feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt +++ b/feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt @@ -1,4 +1,4 @@ -package com.umcspot.spot.signup.component +package com.umcspot.spot.signup.component import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.layout.Arrangement @@ -7,8 +7,10 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon @@ -23,7 +25,7 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.umcspot.spot.designsystem.R -import com.umcspot.spot.designsystem.component.button.SpotActivationButton +import com.umcspot.spot.designsystem.component.button.TextButton import com.umcspot.spot.designsystem.shapes.SpotShapes import com.umcspot.spot.designsystem.theme.SpotTheme import com.umcspot.spot.ui.extension.screenHeightDp @@ -39,6 +41,7 @@ fun PrivacyConsentDialog( Dialog(onDismissRequest = onDismiss) { Surface( + modifier = Modifier.width(screenWidthDp(326.dp)), shape = SpotShapes.Round, tonalElevation = 2.dp, color = SpotTheme.colors.white @@ -48,8 +51,7 @@ fun PrivacyConsentDialog( .padding( vertical = screenHeightDp(17.dp), horizontal = screenWidthDp(17.dp) - ) - .fillMaxWidth(), + ), horizontalAlignment = Alignment.CenterHorizontally ) { Row( @@ -90,23 +92,20 @@ fun PrivacyConsentDialog( border = BorderStroke(1.dp, SpotTheme.colors.gray300), color = SpotTheme.colors.white, modifier = Modifier - .fillMaxWidth() + .width(screenWidthDp(292.dp)) + .height(screenHeightDp(200.dp)) ) { val scroll = rememberScrollState() Column( modifier = Modifier + .verticalScroll(scroll) .padding( vertical = screenHeightDp(10.dp), horizontal = screenWidthDp(10.dp) ) - .verticalScroll(scroll) ) { + TitleLine(1,"(개인정보 수집 및 이용 목적)",SpotTheme.typography.regular_500) - Text( - text = "제1조 (개인정보 수집 및 이용 목적)", - style = SpotTheme.typography.regular_500, - color = SpotTheme.colors.black - ) Spacer(Modifier.height(screenHeightDp(4.dp))) val bullet = SpotTheme.typography.small_500 Text( @@ -115,36 +114,65 @@ fun PrivacyConsentDialog( modifier = Modifier.padding(start = screenWidthDp(34.dp)) ) NumberedLine(1, "회원 가입 및 관리: 본인 확인, 회원 서비스 제공", bullet) - NumberedLine(2, "서비스 제공 및 운영: 커뮤니티 기능 제공, 맞춤형 \n콘텐츠 추천", bullet) + NumberedLine(2, "서비스 제공 및 운영: 커뮤니티 기능 제공, 맞춤형\n콘텐츠 추천", bullet) NumberedLine(3, "고객지원: 문의사항 응대 및 서비스 개선", bullet) NumberedLine(4, "서비스 개선 및 분석: 이용 통계 분석, 부정 이용 방지", bullet) Spacer(Modifier.height(screenHeightDp(7.dp))) + TitleLine(2,"(수집하는 개인정보 항목)",SpotTheme.typography.regular_500) - Text( - text = "제2조 (수집하는 개인정보 항목)", - style = SpotTheme.typography.regular_500, - color = SpotTheme.colors.black - ) Spacer(Modifier.height(screenHeightDp(4.dp))) NumberedLine(1, "필수항목: 이름, 이메일, 생년월일, 성별", bullet) NumberedLine(2, "자동 수집 항목: 접속 로그, 서비스 이용 기록, 기기", bullet) + Spacer(Modifier.height(screenHeightDp(7.dp))) + + TitleLine(3,"(개인정보의 보유 및 이용 기간)",SpotTheme.typography.regular_500) + + Spacer(Modifier.height(screenHeightDp(4.dp))) + + NumberedLine(1, "원칙적으로 이용자가 서비스 탈퇴 시 즉시 개인정보를\n파기합니다. ", bullet) + NumberedLine(2, "단, 법령에 따른 요청이 있을 경우 예외적으로 제공될\n수 있습니다. ", bullet) + + Spacer(Modifier.height(screenHeightDp(7.dp))) + + TitleLine(4,"(수집하는 개인정보 항목)",SpotTheme.typography.regular_500) + + Spacer(Modifier.height(screenHeightDp(4.dp))) + + NumberedLine(1, "필수항목: 이름, 이메일, 생년월일, 성별", bullet) + NumberedLine(2, "자동 수집 항목: 접속 로그, 서비스 이용 기록, 기기", bullet) + + Spacer(Modifier.height(screenHeightDp(7.dp))) + + TitleLine(5,"(동의 거부 권리 및 불이익 안내)",SpotTheme.typography.regular_500) + + Spacer(Modifier.height(screenHeightDp(4.dp))) + + Text( + text = "이용자는 개인정보 수집·이용에 대한 동의를 거부할\n" + + "권리가 있으며, 다만 필수 항목에 대한 동의를 거부할 경우\n" + + "서비스 이용이 제한될 수 있습니다.", + style = bullet, + modifier = Modifier.padding(start = screenWidthDp(34.dp)) + ) } } Spacer(Modifier.height(screenHeightDp(20.dp))) - - SpotActivationButton( + TextButton( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = screenWidthDp(51.dp)), - buttonText = "동의", - isEnabled = true, - onClick = onAgree + .padding(vertical = screenHeightDp(9.dp)) + .width(screenWidthDp(156.dp)) + .heightIn(screenHeightDp(39.dp)), + text = "동의", + style = SpotTheme.typography.h5, + enabled = true, + onClick = onAgree, + shape = SpotShapes.Soft ) } } @@ -161,6 +189,7 @@ fun UniqueConsentDialog( Dialog(onDismissRequest = onDismiss) { Surface( + modifier = Modifier.width(screenWidthDp(326.dp)), shape = SpotShapes.Round, tonalElevation = 2.dp, color = SpotTheme.colors.white @@ -171,7 +200,7 @@ fun UniqueConsentDialog( vertical = screenHeightDp(17.dp), horizontal = screenWidthDp(17.dp) ) - .fillMaxWidth(), + .width(screenWidthDp(326.dp)), horizontalAlignment = Alignment.CenterHorizontally ) { Row( @@ -212,67 +241,122 @@ fun UniqueConsentDialog( border = BorderStroke(1.dp, SpotTheme.colors.gray300), color = SpotTheme.colors.white, modifier = Modifier - .fillMaxWidth() + .width(screenWidthDp(292.dp)) + .height(screenHeightDp(200.dp)) ) { val scroll = rememberScrollState() Column( modifier = Modifier + .verticalScroll(scroll) .padding( vertical = screenHeightDp(10.dp), horizontal = screenWidthDp(10.dp) ) - .verticalScroll(scroll) ) { + TitleLine(1,"(고유식별정보의 수집 및 이용 목적)",SpotTheme.typography.regular_500) - Text( - text = "제1조 (개인정보 수집 및 이용 목적)", - style = SpotTheme.typography.regular_500, - color = SpotTheme.colors.black - ) Spacer(Modifier.height(screenHeightDp(4.dp))) val bullet = SpotTheme.typography.small_500 Text( - text = "SPOT은 이용자의 개인정보를 다음 목적을 위해\n수집 및 이용합니다.", + text = "SPOT은 아래의 목적을 위해 이용자의 고유식별정보를 수집 및 이용할 수 있습니다.", style = bullet, modifier = Modifier.padding(start = screenWidthDp(34.dp)) ) - NumberedLine(1, "회원 가입 및 관리: 본인 확인, 회원 서비스 제공", bullet) - NumberedLine(2, "서비스 제공 및 운영: 커뮤니티 기능 제공, 맞춤형 \n콘텐츠 추천", bullet) - NumberedLine(3, "고객지원: 문의사항 응대 및 서비스 개선", bullet) - NumberedLine(4, "서비스 개선 및 분석: 이용 통계 분석, 부정 이용 방지", bullet) + NumberedLine(1, "본인 확인 및 인증", bullet) + NumberedLine(2, "법적 의무 이행 (예: 연령 검증)", bullet) Spacer(Modifier.height(screenHeightDp(7.dp))) + TitleLine(2,"(수집하는 고유식별정보 항목)",SpotTheme.typography.regular_500) + + Spacer(Modifier.height(screenHeightDp(4.dp))) Text( - text = "제2조 (수집하는 개인정보 항목)", - style = SpotTheme.typography.regular_500, - color = SpotTheme.colors.black + text = "SPOT은 다음과 같은 고유식별정보를 수집할 수 있습니다.", + style = bullet, + modifier = Modifier.padding(start = screenWidthDp(34.dp)) ) + NumberedLine(1, "주민등록록번호, 외국인등록번호 (필요 시)", bullet) + + Spacer(Modifier.height(screenHeightDp(7.dp))) + + TitleLine(3,"(고유식별정보의 보유 및 이용 기간)",SpotTheme.typography.regular_500) + Spacer(Modifier.height(screenHeightDp(4.dp))) - NumberedLine(1, "필수항목: 이름, 이메일, 생년월일, 성별", bullet) - NumberedLine(2, "자동 수집 항목: 접속 로그, 서비스 이용 기록, 기기", bullet) + NumberedLine(1, "원칙적으로 목적 달성 후 즉시 파기합니다.", bullet) + NumberedLine(2, "단, 관련 법령에 따라 일정 기간 보관이 필요한 경우 해당\n기간 동안 보관 후 파기합니다.", bullet) + Spacer(Modifier.height(screenHeightDp(7.dp))) + + TitleLine(4,"(고유식별정보의 제3자 제공 및 위탁)",SpotTheme.typography.regular_500) + + Spacer(Modifier.height(screenHeightDp(4.dp))) + + NumberedLine(1, "SPOT은 이용자의 동의 없이 고유식별정보를 제3자에게\n제공하지 않습니다.", bullet) + NumberedLine(2, "단, 법령에 따른 요청이 있을 경우 예외적으로 제공될\n수 있습니다.", bullet) + + Spacer(Modifier.height(screenHeightDp(7.dp))) + + TitleLine(5,"(동의 거부 권리 및 불이익 안내)",SpotTheme.typography.regular_500) + + Spacer(Modifier.height(screenHeightDp(4.dp))) + + Text( + text = "이용자는 고유식별정보 제공에 대한 동의를 거부할 권리가\n" + + "있으며, 다만 동의를 거부할 경우 특정 서비스 이용이 제한될 수 있습니다.", + style = bullet, + modifier = Modifier.padding(start = screenWidthDp(34.dp)) + ) } } Spacer(Modifier.height(screenHeightDp(20.dp))) - SpotActivationButton( + TextButton( modifier = Modifier - .fillMaxWidth() - .padding(horizontal = screenWidthDp(51.dp)), - buttonText = "동의", - isEnabled = true, - onClick = onAgree + .padding(vertical = screenHeightDp(9.dp)) + .width(screenWidthDp(156.dp)) + .heightIn(screenHeightDp(39.dp)), + text = "동의", + style = SpotTheme.typography.h5, + enabled = true, + onClick = onAgree, + shape = SpotShapes.Soft ) } } } } +@Composable +private fun TitleLine( + number: Int, + text: String, + style: TextStyle +) { + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.Top + ) { + Text( + text = "제${number}조", + style = style, + modifier = Modifier.width(screenWidthDp(30.dp)) // 제##조 영역 고정 + ) + + Spacer(modifier = Modifier.width(screenWidthDp(4.dp))) + + Text( + text = text, + style = style, + modifier = Modifier.weight(1f) // 본문 영역 + ) + } +} + @Composable private fun NumberedLine( number: Int, @@ -285,7 +369,15 @@ private fun NumberedLine( .padding(start = screenWidthDp(34.dp)), verticalAlignment = Alignment.Top ) { - Text(text = "$number. ", style = style) - Text(text = text, style = style) + Text( + text = "$number.", + style = style, + modifier = Modifier.width(screenWidthDp(12.dp)) // 숫자 영역 고정 + ) + Text( + text = text, + style = style, + modifier = Modifier.weight(1f) // 본문 영역 + ) } } \ No newline at end of file