Skip to content

Commit 72d39ea

Browse files
dadachiclaude
andauthored
Add welcome page to Onboarding (#47)
Mirrors NativeAppTemplate-Android#60. Adds a dedicated first onboarding page showing the hero image with a bold "Welcome to {app_name}" title anchored at the bottom; the existing description pages keep their full-size layout. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 1da4f88 commit 72d39ea

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/app_root/OnboardingView.kt

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import androidx.compose.ui.layout.ContentScale
3434
import androidx.compose.ui.platform.LocalContext
3535
import androidx.compose.ui.res.painterResource
3636
import androidx.compose.ui.res.stringResource
37+
import androidx.compose.ui.text.font.FontWeight
38+
import androidx.compose.ui.text.style.TextAlign
3739
import androidx.compose.ui.unit.dp
3840
import androidx.compose.ui.unit.sp
3941
import com.nativeapptemplate.nativeapptemplatefree.NativeAppTemplateConstants
@@ -48,7 +50,7 @@ internal fun OnboardingView(
4850
val lineHeightLarge = 26
4951
val onboardings = OnboardingViewModel.onboardings
5052
val pagerState = rememberPagerState(pageCount = {
51-
onboardings.size
53+
onboardings.size + 1
5254
})
5355

5456
Scaffold(
@@ -65,7 +67,11 @@ internal fun OnboardingView(
6567
modifier = Modifier
6668
.fillMaxSize(),
6769
) { page ->
68-
val onboarding = onboardings[page]
70+
if (page == 0) {
71+
WelcomePage()
72+
return@HorizontalPager
73+
}
74+
val onboarding = onboardings[page - 1]
6975
val imageBottomPadding = if (onboarding.imageOrientation == ImageOrientation.LANDSCAPE) 192.dp else 0.dp
7076
Box(
7177
modifier = Modifier
@@ -123,6 +129,44 @@ internal fun OnboardingView(
123129
}
124130
}
125131

132+
@Composable
133+
private fun WelcomePage() {
134+
Box(
135+
modifier = Modifier
136+
.fillMaxSize()
137+
.padding(12.dp)
138+
.padding(top = 12.dp),
139+
) {
140+
Image(
141+
painter = painterResource(R.drawable.ic_hero),
142+
contentDescription = null,
143+
contentScale = ContentScale.Fit,
144+
modifier = Modifier
145+
.align(Alignment.TopCenter)
146+
.padding(bottom = 192.dp),
147+
)
148+
Box(
149+
modifier = Modifier
150+
.align(Alignment.BottomCenter)
151+
.fillMaxWidth()
152+
.background(MaterialTheme.colorScheme.background),
153+
) {
154+
Text(
155+
text = stringResource(R.string.welcome_to_app, stringResource(R.string.app_name)),
156+
color = MaterialTheme.colorScheme.onBackground,
157+
fontSize = 34.sp.nonScaledSp,
158+
lineHeight = 41.sp.nonScaledSp,
159+
fontWeight = FontWeight.Bold,
160+
textAlign = TextAlign.Center,
161+
modifier = Modifier
162+
.align(Alignment.TopCenter)
163+
.fillMaxWidth()
164+
.padding(16.dp),
165+
)
166+
}
167+
}
168+
}
169+
126170
@OptIn(ExperimentalMaterial3Api::class)
127171
@Composable
128172
private fun TopAppBar(

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
<string name="terms_of_use_updated">Terms of Use Updated</string>
6767

6868
<!-- On-boarding -->
69+
<string name="welcome_to_app">Welcome to %1$s</string>
6970
<string name="onboarding_description1">Onboarding description 1.</string>
7071
<string name="onboarding_description2">Onboarding description 2.</string>
7172
<string name="onboarding_description3">Onboarding description 3.</string>

0 commit comments

Comments
 (0)