Skip to content

Commit 646c658

Browse files
committed
feat: onboarding 화면 추가
- 네비게이션 기본 작업 - type, color 추가
1 parent 58b1ec6 commit 646c658

File tree

12 files changed

+297
-32
lines changed

12 files changed

+297
-32
lines changed

app/src/main/java/com/easyhz/patchnote/MainActivity.kt

+2-31
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,7 @@ import android.os.Bundle
44
import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
66
import androidx.activity.enableEdgeToEdge
7-
import androidx.compose.foundation.layout.fillMaxSize
8-
import androidx.compose.foundation.layout.fillMaxWidth
9-
import androidx.compose.foundation.layout.padding
10-
import androidx.compose.material3.Scaffold
11-
import androidx.compose.material3.Text
12-
import androidx.compose.runtime.Composable
13-
import androidx.compose.ui.Modifier
14-
import androidx.compose.ui.tooling.preview.Preview
15-
import com.easyhz.patchnote.core.designSystem.button.MainButton
7+
import com.easyhz.patchnote.ui.PatchNoteApp
168
import com.easyhz.patchnote.ui.theme.PatchNoteTheme
179
import dagger.hilt.android.AndroidEntryPoint
1810

@@ -21,31 +13,10 @@ class MainActivity : ComponentActivity() {
2113
override fun onCreate(savedInstanceState: Bundle?) {
2214
super.onCreate(savedInstanceState)
2315
enableEdgeToEdge()
24-
2516
setContent {
2617
PatchNoteTheme {
27-
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
28-
MainButton(modifier = Modifier.padding(innerPadding).fillMaxWidth(), text = "Button", onClick = {
29-
30-
})
31-
}
18+
PatchNoteApp()
3219
}
3320
}
3421
}
35-
}
36-
37-
@Composable
38-
fun Greeting(name: String, modifier: Modifier = Modifier) {
39-
Text(
40-
text = "Hello $name!",
41-
modifier = modifier
42-
)
43-
}
44-
45-
@Preview(showBackground = true)
46-
@Composable
47-
fun GreetingPreview() {
48-
PatchNoteTheme {
49-
Greeting("Android")
50-
}
5122
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package com.easyhz.patchnote.core.designSystem.onboarding
2+
3+
import androidx.annotation.DrawableRes
4+
import androidx.annotation.StringRes
5+
import androidx.compose.foundation.layout.Arrangement
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.Row
8+
import androidx.compose.foundation.layout.fillMaxWidth
9+
import androidx.compose.material3.Icon
10+
import androidx.compose.material3.Text
11+
import androidx.compose.runtime.Composable
12+
import androidx.compose.ui.Alignment
13+
import androidx.compose.ui.Modifier
14+
import androidx.compose.ui.res.painterResource
15+
import androidx.compose.ui.res.stringResource
16+
import androidx.compose.ui.unit.dp
17+
import com.easyhz.patchnote.R
18+
import com.easyhz.patchnote.ui.theme.Caption
19+
import com.easyhz.patchnote.ui.theme.MainText
20+
import com.easyhz.patchnote.ui.theme.Medium14
21+
import com.easyhz.patchnote.ui.theme.Primary
22+
import com.easyhz.patchnote.ui.theme.SemiBold16
23+
24+
@Composable
25+
fun OnboardingInformation(
26+
modifier: Modifier = Modifier,
27+
informationType: OnboardingInformationType,
28+
) {
29+
Row(
30+
modifier = modifier.fillMaxWidth(),
31+
horizontalArrangement = Arrangement.spacedBy(12.dp),
32+
verticalAlignment = Alignment.CenterVertically
33+
) {
34+
Icon(
35+
painter = painterResource(id = informationType.iconId),
36+
contentDescription = informationType.iconId.toString(),
37+
tint = Primary
38+
)
39+
Column(
40+
verticalArrangement = Arrangement.spacedBy(4.dp)
41+
) {
42+
Text(
43+
text = stringResource(informationType.titleId),
44+
style = SemiBold16,
45+
color = MainText
46+
)
47+
Text(
48+
text = stringResource(informationType.contentId),
49+
style = Medium14,
50+
color = Caption
51+
)
52+
}
53+
}
54+
}
55+
56+
enum class OnboardingInformationType(
57+
@StringRes val titleId: Int,
58+
@StringRes val contentId: Int,
59+
@DrawableRes val iconId: Int
60+
) {
61+
RECEIPT(
62+
titleId = R.string.onboarding_receipt_title,
63+
contentId = R.string.onboarding_receipt_content,
64+
iconId = R.drawable.ic_report
65+
),
66+
SEARCH(
67+
titleId = R.string.onboarding_search_title,
68+
contentId = R.string.onboarding_search_content,
69+
iconId = R.drawable.ic_search
70+
),
71+
SUCCESS(
72+
titleId = R.string.onboarding_success_title,
73+
contentId = R.string.onboarding_success_content,
74+
iconId = R.drawable.ic_check
75+
)
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.easyhz.patchnote.ui
2+
3+
import androidx.compose.foundation.layout.padding
4+
import androidx.compose.material3.Scaffold
5+
import androidx.compose.runtime.Composable
6+
import androidx.compose.ui.Modifier
7+
import androidx.navigation.compose.NavHost
8+
import androidx.navigation.compose.rememberNavController
9+
import com.easyhz.patchnote.ui.navigation.onboarding.Onboarding
10+
import com.easyhz.patchnote.ui.navigation.onboarding.onboardingNavigation
11+
12+
@Composable
13+
fun PatchNoteApp() {
14+
val navController = rememberNavController()
15+
Scaffold { innerPadding ->
16+
NavHost(
17+
modifier = Modifier.padding(innerPadding),
18+
navController = navController,
19+
startDestination = Onboarding,
20+
) {
21+
onboardingNavigation(navController)
22+
}
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.easyhz.patchnote.ui.navigation.onboarding
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
object Onboarding
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.easyhz.patchnote.ui.navigation.onboarding
2+
3+
import androidx.navigation.NavController
4+
import androidx.navigation.NavGraphBuilder
5+
import androidx.navigation.compose.composable
6+
import com.easyhz.patchnote.ui.screen.onboarding.OnboardingScreen
7+
8+
fun NavGraphBuilder.onboardingNavigation(
9+
navController: NavController,
10+
) {
11+
composable<Onboarding> {
12+
OnboardingScreen {
13+
14+
}
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.easyhz.patchnote.ui.screen.onboarding
2+
3+
import androidx.compose.foundation.layout.Arrangement
4+
import androidx.compose.foundation.layout.Column
5+
import androidx.compose.foundation.layout.fillMaxWidth
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.material3.Scaffold
8+
import androidx.compose.material3.Text
9+
import androidx.compose.runtime.Composable
10+
import androidx.compose.ui.Alignment
11+
import androidx.compose.ui.Modifier
12+
import androidx.compose.ui.res.stringResource
13+
import androidx.compose.ui.unit.dp
14+
import com.easyhz.patchnote.R
15+
import com.easyhz.patchnote.core.designSystem.button.MainButton
16+
import com.easyhz.patchnote.core.designSystem.onboarding.OnboardingInformation
17+
import com.easyhz.patchnote.core.designSystem.onboarding.OnboardingInformationType
18+
import com.easyhz.patchnote.ui.theme.Bold34
19+
import com.easyhz.patchnote.ui.theme.MainText
20+
import com.easyhz.patchnote.ui.theme.SemiBold20
21+
22+
@Composable
23+
fun OnboardingScreen(
24+
modifier: Modifier = Modifier,
25+
navigateToSign: () -> Unit
26+
) {
27+
Scaffold(
28+
bottomBar = {
29+
MainButton(
30+
modifier = Modifier.padding(vertical = 12.dp, horizontal = 20.dp).fillMaxWidth(),
31+
text = stringResource(id = R.string.onboarding_button_start),
32+
onClick = {
33+
34+
}
35+
)
36+
}
37+
) { innerPadding ->
38+
Column(
39+
modifier = Modifier.padding(innerPadding).padding(horizontal = 28.dp).padding(top = 100.dp),
40+
horizontalAlignment = Alignment.CenterHorizontally,
41+
verticalArrangement = Arrangement.spacedBy(76.dp)
42+
) {
43+
Column(
44+
verticalArrangement = Arrangement.spacedBy(24.dp),
45+
horizontalAlignment = Alignment.CenterHorizontally
46+
) {
47+
Text(
48+
text = stringResource(id = R.string.onboarding_title),
49+
style = Bold34,
50+
color = MainText
51+
)
52+
Text(
53+
text = stringResource(id = R.string.onboarding_subtitle),
54+
style = SemiBold20,
55+
color = MainText
56+
)
57+
}
58+
Column(
59+
verticalArrangement = Arrangement.spacedBy(40.dp)
60+
) {
61+
OnboardingInformationType.entries.forEach { type ->
62+
OnboardingInformation(
63+
informationType = type
64+
)
65+
}
66+
}
67+
}
68+
}
69+
}

app/src/main/java/com/easyhz/patchnote/ui/theme/Color.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,7 @@ val MainText = Color(0xFF000000)
1919
val SubText = Color(0xFF717171)
2020

2121
@Stable
22-
val PlaceholderText = Color(0xFFA8A8AA)
22+
val PlaceholderText = Color(0xFFA8A8AA)
23+
24+
@Stable
25+
val Caption = Color(0xFF575757)

app/src/main/java/com/easyhz/patchnote/ui/theme/Type.kt

+44
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,17 @@ private val Pretendard = FontFamily(
2222

2323
private val LetterSpacing = 0.sp
2424

25+
val Bold34 = TextStyle(
26+
fontFamily = Pretendard,
27+
fontWeight = FontWeight.Bold,
28+
fontSize = 34.sp,
29+
letterSpacing = LetterSpacing,
30+
textAlign = TextAlign.Justify,
31+
platformStyle = PlatformTextStyle(
32+
includeFontPadding = false,
33+
)
34+
)
35+
2536
val Bold20 = TextStyle(
2637
fontFamily = Pretendard,
2738
fontWeight = FontWeight.Bold,
@@ -32,4 +43,37 @@ val Bold20 = TextStyle(
3243
platformStyle = PlatformTextStyle(
3344
includeFontPadding = false,
3445
)
46+
)
47+
48+
val SemiBold20 = TextStyle(
49+
fontFamily = Pretendard,
50+
fontWeight = FontWeight.SemiBold,
51+
fontSize = 20.sp,
52+
letterSpacing = LetterSpacing,
53+
textAlign = TextAlign.Justify,
54+
platformStyle = PlatformTextStyle(
55+
includeFontPadding = false,
56+
)
57+
)
58+
59+
val SemiBold16 = TextStyle(
60+
fontFamily = Pretendard,
61+
fontWeight = FontWeight.SemiBold,
62+
fontSize = 16.sp,
63+
letterSpacing = LetterSpacing,
64+
textAlign = TextAlign.Justify,
65+
platformStyle = PlatformTextStyle(
66+
includeFontPadding = false,
67+
)
68+
)
69+
70+
val Medium14 = TextStyle(
71+
fontFamily = Pretendard,
72+
fontWeight = FontWeight.Medium,
73+
fontSize = 14.sp,
74+
letterSpacing = LetterSpacing,
75+
textAlign = TextAlign.Justify,
76+
platformStyle = PlatformTextStyle(
77+
includeFontPadding = false,
78+
)
3579
)
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="32dp"
3+
android:height="32dp"
4+
android:viewportWidth="32"
5+
android:viewportHeight="32">
6+
<group>
7+
<clip-path
8+
android:pathData="M2,2h28v28h-28z"/>
9+
<path
10+
android:pathData="M14.367,21.367L22.592,13.142L20.958,11.508L14.367,18.1L11.042,14.775L9.408,16.408L14.367,21.367ZM16,27.667C14.386,27.667 12.869,27.36 11.45,26.748C10.031,26.135 8.796,25.304 7.746,24.254C6.696,23.204 5.865,21.969 5.252,20.55C4.64,19.131 4.333,17.614 4.333,16C4.333,14.386 4.64,12.869 5.252,11.45C5.865,10.031 6.696,8.796 7.746,7.746C8.796,6.696 10.031,5.865 11.45,5.252C12.869,4.64 14.386,4.333 16,4.333C17.614,4.333 19.131,4.64 20.55,5.252C21.969,5.865 23.204,6.696 24.254,7.746C25.304,8.796 26.135,10.031 26.748,11.45C27.36,12.869 27.667,14.386 27.667,16C27.667,17.614 27.36,19.131 26.748,20.55C26.135,21.969 25.304,23.204 24.254,24.254C23.204,25.304 21.969,26.135 20.55,26.748C19.131,27.36 17.614,27.667 16,27.667ZM16,25.333C18.605,25.333 20.812,24.429 22.621,22.621C24.429,20.813 25.333,18.605 25.333,16C25.333,13.394 24.429,11.188 22.621,9.379C20.812,7.571 18.605,6.667 16,6.667C13.394,6.667 11.187,7.571 9.379,9.379C7.571,11.188 6.667,13.394 6.667,16C6.667,18.605 7.571,20.813 9.379,22.621C11.187,24.429 13.394,25.333 16,25.333Z"
11+
android:fillColor="#2378FF"/>
12+
</group>
13+
</vector>
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="32dp"
3+
android:height="32dp"
4+
android:viewportWidth="32"
5+
android:viewportHeight="32">
6+
<group>
7+
<clip-path
8+
android:pathData="M2,2h28v28h-28z"/>
9+
<path
10+
android:pathData="M16,21.833C16.33,21.833 16.608,21.722 16.831,21.498C17.055,21.274 17.167,20.997 17.167,20.667C17.167,20.336 17.055,20.059 16.831,19.835C16.608,19.612 16.33,19.5 16,19.5C15.669,19.5 15.392,19.612 15.169,19.835C14.945,20.059 14.833,20.336 14.833,20.667C14.833,20.997 14.945,21.274 15.169,21.498C15.392,21.722 15.669,21.833 16,21.833ZM14.833,17.167H17.167V10.167H14.833V17.167ZM16,29.183L12.092,25.333H6.667V19.908L2.817,16L6.667,12.092V6.667H12.092L16,2.817L19.908,6.667H25.333V12.092L29.183,16L25.333,19.908V25.333H19.908L16,29.183ZM16,25.917L18.917,23H23V18.917L25.917,16L23,13.083V9H18.917L16,6.083L13.083,9H9V13.083L6.083,16L9,18.917V23H13.083L16,25.917Z"
11+
android:fillColor="#2378FF"/>
12+
</group>
13+
</vector>
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="32dp"
3+
android:height="32dp"
4+
android:viewportWidth="32"
5+
android:viewportHeight="32">
6+
<group>
7+
<clip-path
8+
android:pathData="M2,2h28v28h-28z"/>
9+
<path
10+
android:pathData="M24.867,26.5L17.517,19.15C16.933,19.617 16.263,19.986 15.504,20.258C14.746,20.531 13.939,20.667 13.083,20.667C10.964,20.667 9.17,19.933 7.702,18.465C6.234,16.997 5.5,15.203 5.5,13.083C5.5,10.964 6.234,9.17 7.702,7.702C9.17,6.234 10.964,5.5 13.083,5.5C15.203,5.5 16.997,6.234 18.465,7.702C19.933,9.17 20.667,10.964 20.667,13.083C20.667,13.939 20.531,14.746 20.258,15.504C19.986,16.263 19.617,16.933 19.15,17.517L26.5,24.867L24.867,26.5ZM13.083,18.333C14.542,18.333 15.781,17.823 16.802,16.802C17.823,15.781 18.333,14.542 18.333,13.083C18.333,11.625 17.823,10.385 16.802,9.365C15.781,8.344 14.542,7.833 13.083,7.833C11.625,7.833 10.385,8.344 9.365,9.365C8.344,10.385 7.833,11.625 7.833,13.083C7.833,14.542 8.344,15.781 9.365,16.802C10.385,17.823 11.625,18.333 13.083,18.333Z"
11+
android:fillColor="#2378FF"/>
12+
</group>
13+
</vector>
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<string name="onboarding_title">패치노트</string>
4+
<string name="onboarding_subtitle">쉽고 빠른 하자 공유</string>
5+
6+
<string name="onboarding_receipt_title">접수</string>
7+
<string name="onboarding_receipt_content">손쉽게 하자를 접수해요</string>
8+
9+
<string name="onboarding_search_title">검색</string>
10+
<string name="onboarding_search_content">검색을 통해 하자를 빠르게 확인해요</string>
11+
12+
<string name="onboarding_success_title">완료</string>
13+
<string name="onboarding_success_content">완료 여부를 빠르게 업데이트해요</string>
14+
15+
<string name="onboarding_button_start">시작하기</string>
16+
17+
</resources>

0 commit comments

Comments
 (0)