Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
3d002f7
feat: 온보딩 UI 구현 (#21)
dada4679 Jul 20, 2026
688fa48
feat: 온보딩 UI 구현 (#21)
dada4679 Jul 24, 2026
9d46a6d
feat: 온보딩 UI 구현 (#21)
dada4679 Jul 25, 2026
8b4f4de
chore: develop 브랜치 변경사항을 feature 브랜치로 머지
dada4679 Jul 26, 2026
3e766dd
feat: 온보딩 UI 구현 (#21)
dada4679 Jul 26, 2026
96c8665
feat: 온보딩 UI 구현 (#21)
dada4679 Jul 26, 2026
c8d63f7
feat: 온보딩 UI 구현 (#21)
dada4679 Jul 27, 2026
29350bf
Merge branch 'develop' into feature/21-onboarding-ui
dada4679 Jul 27, 2026
40252a7
fix: preserve onboarding AppScreen changes
dada4679 Jul 27, 2026
4b869f6
fix: pr리뷰 반영 (#21)
dada4679 Jul 28, 2026
540bbed
Merge branch 'develop' into feature/21-onboarding-ui
dada4679 Jul 28, 2026
10625e1
fix: pr리뷰 반영 (#21)
dada4679 Jul 28, 2026
e7dfd3a
Merge branch 'develop' of https://github.com/call-from-ai/CallFromAi_…
dada4679 Jul 28, 2026
82f64a2
Merge branch 'feature/21-onboarding-ui' of https://github.com/call-fr…
dada4679 Jul 28, 2026
34666a8
fix: pr리뷰 반영 (#21)
dada4679 Jul 29, 2026
2c6e21e
fix: pr리뷰 반영 (#21)
dada4679 Jul 29, 2026
471a07a
Merge remote-tracking branch 'origin/develop' into feature/21-onboard…
dada4679 Jul 29, 2026
de7ca5e
Merge branch 'develop' of https://github.com/call-from-ai/CallFromAi_…
dada4679 Jul 29, 2026
94fb158
fix: 다시 랜딩화면 못가게 설정(#21)
dada4679 Jul 29, 2026
37b54a7
fix: pr리뷰 반영(#21)
dada4679 Jul 29, 2026
19cbbe0
fix: pr리뷰 반영(#21)
dada4679 Jul 30, 2026
e7fe9bc
fix: pr리뷰 반영(#21)
dada4679 Jul 30, 2026
ca61c41
Merge remote-tracking branch 'origin/develop' into feature/21-onboard…
dada4679 Jul 30, 2026
dc00ec2
feat: 프로필 선택 BottomModal기능 추가(#21)
dada4679 Jul 30, 2026
6a1a790
fix:온보딩4 그리드 수정 (#21)
dada4679 Jul 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 54 additions & 14 deletions app/src/main/java/kr/co/call/callfromai/AppScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package kr.co.call.callfromai
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.compose.foundation.layout.exclude
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.ime
Expand All @@ -20,7 +21,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
Expand All @@ -43,8 +43,13 @@ import kr.co.call.api.ManagerChatRoomNayKey
import kr.co.call.api.MyPageNavKey
import kr.co.call.api.ProfileNavKey
import kr.co.call.api.SubscriptionNavKey
import kr.co.call.api.Onboarding1NavKey
import kr.co.call.api.Onboarding2NavKey
import kr.co.call.api.Onboarding3NavKey
import kr.co.call.api.Onboarding4NavKey
import kr.co.call.api.Onboarding5NavKey
import kr.co.call.api.Onboarding6NavKey
import kr.co.call.api.TermNavKey
import kr.co.call.api.OnboardingNavKey
import kr.co.call.callfromai.ui.MainBottomBar
import kr.co.call.callfromai.ui.MainTab
import kr.co.call.callfromai.util.toMainTab
Expand Down Expand Up @@ -95,7 +100,6 @@ fun AppScreen(modifier: Modifier = Modifier) {
val bottomBarPadding = remember(bottomBarHeightPx) {
with(density) { bottomBarHeightPx.toDp() }
}

Scaffold(
modifier = modifier.fillMaxSize(),
bottomBar = {
Expand All @@ -108,10 +112,9 @@ fun AppScreen(modifier: Modifier = Modifier) {
)
}
},
contentWindowInsets = WindowInsets.safeDrawing
.only(WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal)
.exclude(WindowInsets.ime),

contentWindowInsets = WindowInsets.safeDrawing.only(
WindowInsetsSides.Bottom + WindowInsetsSides.Horizontal
).exclude(WindowInsets.ime),
) { padding ->
CompositionLocalProvider(
LocalBottomBarPadding provides if (showBottomBar) bottomBarPadding else 0.dp,
Expand All @@ -126,16 +129,16 @@ fun AppScreen(modifier: Modifier = Modifier) {
entryProvider = entryProvider {
loginEntry(
navigateToLogin={
appNavigator.navigate(LoginNavKey)
appNavigator.replaceAll(LoginNavKey)
},
navigateToOnboarding = {
appNavigator.navigate(OnboardingNavKey)
appNavigator.replaceAll(Onboarding1NavKey)
},
navigateToHome = {
appNavigator.navigate(HomeNavKey)
appNavigator.replaceAll(HomeNavKey)
},
navigateToAgreement={
appNavigator.navigate(AgreementNavKey)
appNavigator.replaceAll(AgreementNavKey)
},
navigateToAgreementDetail={term ->
appNavigator.navigate(
Expand All @@ -147,13 +150,48 @@ fun AppScreen(modifier: Modifier = Modifier) {
)
},
navigateAfterAgreement={
appNavigator.navigate(OnboardingNavKey)
appNavigator.navigate(Onboarding1NavKey)
},
onBack={
appNavigator.popBackStack()
}
)
onboardingEntry()
onboardingEntry(
onOnboarding1Next= {
appNavigator.navigate(Onboarding2NavKey)
},
onBackFromOnboarding2 = {
appNavigator.popBackStack()
},
onOnboarding2Next = {
appNavigator.navigate(Onboarding3NavKey)
},
onBackFromOnboarding3 = {
appNavigator.popBackStack()
},
onOnboarding3Next = {
appNavigator.navigate(Onboarding4NavKey)
},
onBackFromOnboarding4 = {
appNavigator.popBackStack()
},
onOnboarding4Next = {
appNavigator.navigate(Onboarding5NavKey)
},
onBackFromOnboarding5 = {
appNavigator.popBackStack()
},
onOnboarding5Next = {
appNavigator.navigate(Onboarding6NavKey)
},
onOnboarding6CallNow = {
//나중에 전화화면으로 바꾸기
appNavigator.replaceAll(HomeNavKey)
},
Comment thread
coderabbitai[bot] marked this conversation as resolved.
onOnboarding6CallLater = {
appNavigator.replaceAll(HomeNavKey)
},
)
homeEntry(
navigateToCall = { characterId ->
appNavigator.navigate(
Expand All @@ -163,7 +201,9 @@ fun AppScreen(modifier: Modifier = Modifier) {
)
},
navigateToCallRecord = { callId ->
appNavigator.navigate(CallRecordNavKey(callId = callId))
appNavigator.navigate(
CallRecordNavKey(callId = callId),
)
},
onCallRecordBack = {
appNavigator.popBackStack()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ val SubGray2 = Color(0xFFF7F3F3)
val SubRed = Color(0xFFFF0000)
val SubBlue = Color(0xFF4391FF)

val SubFire=Color(0xFFFF5677)
val SubSoup=Color(0xFFFFCE91)

val SubYellow=Color(0xFFFDE500)

val SubPressed = Color(0xFFED5988)
Expand Down Expand Up @@ -81,6 +84,13 @@ val ChatGradientReverse = Brush.horizontalGradient(
)
)

val DragGradient=Brush.horizontalGradient(
listOf(
Color(0xFFFFD092),
Color(0xFFFF4F75)
)
)

// ---------- Design System Colors ----------
@Immutable
data class CallColors(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ data class CallTypography(
// Others (line height 150%)
val caption: TextStyle = pretendard(12, 1.5f, FontWeight.Normal),
val captionBold: TextStyle = pretendard(12, 1.5f, FontWeight.SemiBold),
val captionSmall: TextStyle = pretendard(8,1.5f, FontWeight.Normal),
val miniMedium: TextStyle = pretendard(11,1.5f,FontWeight.Normal),
val captionSmallBold: TextStyle = pretendard(8, 1.5f, FontWeight.SemiBold), // 신규
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,21 @@ import androidx.navigation3.runtime.NavKey
import kotlinx.serialization.Serializable

@Serializable
data object OnboardingNavKey : NavKey
data object Onboarding1NavKey : NavKey

@Serializable
data object Onboarding2NavKey: NavKey {
}

@Serializable
data object Onboarding3NavKey: NavKey

@Serializable
data object Onboarding4NavKey: NavKey

@Serializable
data object Onboarding5NavKey: NavKey

@Serializable
data object Onboarding6NavKey: NavKey

3 changes: 3 additions & 0 deletions feature/onboarding/impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,7 @@ dependencies {
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)

//coil 설정
implementation(libs.coil.compose)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package kr.co.call.impl.component

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
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.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import kr.co.call.designsystem.theme.CallFromAiTheme
import kr.co.call.designsystem.theme.CallTheme
import kr.co.call.designsystem.theme.Gray100
import kr.co.call.designsystem.theme.Gray600
import kr.co.call.designsystem.theme.Gray900
import kr.co.call.designsystem.theme.SubRed
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue

@Composable
fun AgeInputField(
age: String,
onAgeChange: (String) -> Unit,
modifier: Modifier = Modifier,
){
Column(modifier = modifier) {
Row {
Text(
text = "만 나이",
style = CallTheme.typography.bodyMedium,
color = Gray600,
)
Text(
text = "*",
style = CallTheme.typography.bodyMedium,
color = SubRed,
)
}

Spacer(modifier = Modifier.height(7.dp))

BasicTextField(
value = age,
onValueChange = { input ->
if (input.all(Char::isDigit)) onAgeChange(input)
},
modifier = Modifier
.fillMaxWidth()
.height(51.dp)
.background(
color = Gray100,
shape = RoundedCornerShape(10.dp),
),
singleLine = true,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number,
),
textStyle = CallTheme.typography.bodyMediumMedium.copy(
color = Gray900,
),
decorationBox = { innerTextField ->
Row(
modifier = Modifier
.fillMaxSize()
.padding(
start = 19.dp,
top = 16.dp,
end = 15.dp,
bottom = 15.dp,
),
verticalAlignment = Alignment.CenterVertically,
) {
Box(modifier = Modifier.weight(1f)) {
innerTextField()
}
Text(
text = "(세)",
style = CallTheme.typography.bodyMedium,
color = Gray600,
)
}
},
)
}
}

@Preview(
name = "AgeInputField",
showBackground = true,
widthDp = 393,
)
@Composable
private fun AgeInputFieldPreview() {
var age by rememberSaveable { mutableStateOf("25") }
CallFromAiTheme {
AgeInputField(
age = age,
onAgeChange = { age = it },
modifier = Modifier.padding(16.dp),
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package kr.co.call.impl.component

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import kr.co.call.designsystem.theme.Black
import kr.co.call.onboarding.impl.R

@Composable
fun BackStepBar(
onBackClick:()->Unit,
modifier: Modifier =Modifier,
){
Row(
modifier=modifier
.fillMaxWidth()
.height(58.dp)
.padding(
start=0.dp,
end=8.dp,),
verticalAlignment = Alignment.CenterVertically,
){
IconButton(
onClick=onBackClick,
){
Icon(
painter= painterResource(R.drawable.ic_back),
contentDescription="뒤로가기",
tint= Black,
modifier=Modifier
.size(
width=8.dp,
height=15.dp
)
)
}
}
}

@Preview(
showBackground = true,
widthDp = 393,
heightDp=58
)
@Composable
private fun BackTopBarPreview() {
BackStepBar(
onBackClick = {}
)
}
Loading