diff --git a/Cable/Loads/OnboardingInfoView.swift b/Cable/Loads/OnboardingInfoView.swift index db53258..087d90b 100644 --- a/Cable/Loads/OnboardingInfoView.swift +++ b/Cable/Loads/OnboardingInfoView.swift @@ -141,8 +141,8 @@ extension OnboardingInfoView.Configuration { subtitle: LocalizedStringKey("battery.onboarding.subtitle"), primaryActionTitle: LocalizedStringKey("battery.overview.empty.create"), primaryActionIcon: "plus", - secondaryActionTitle: nil, - secondaryActionIcon: nil, + secondaryActionTitle: LocalizedStringKey("loads.overview.empty.library"), + secondaryActionIcon: "books.vertical", imageNames: [ "battery-onboarding" ] @@ -155,8 +155,8 @@ extension OnboardingInfoView.Configuration { subtitle: LocalizedStringKey("chargers.onboarding.subtitle"), primaryActionTitle: LocalizedStringKey("chargers.onboarding.primary"), primaryActionIcon: "plus", - secondaryActionTitle: nil, - secondaryActionIcon: nil, + secondaryActionTitle: LocalizedStringKey("loads.overview.empty.library"), + secondaryActionIcon: "books.vertical", imageNames: [ "charger-onboarding" ] diff --git a/android/app/src/main/java/app/voltplan/cable/ui/components/OnboardingCarousel.kt b/android/app/src/main/java/app/voltplan/cable/ui/components/OnboardingCarousel.kt new file mode 100644 index 0000000..24f5433 --- /dev/null +++ b/android/app/src/main/java/app/voltplan/cable/ui/components/OnboardingCarousel.kt @@ -0,0 +1,59 @@ +package app.voltplan.cable.ui.components + +import androidx.annotation.DrawableRes +import androidx.compose.animation.AnimatedContent +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.animation.togetherWith +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import kotlinx.coroutines.delay + +/** + * Auto-advancing onboarding illustration carousel. Mirrors iOS `OnboardingCarouselView`: + * cycles through the images every 8s with a horizontal slide. A single image stays static. + */ +@Composable +fun OnboardingCarousel( + @DrawableRes images: List, + modifier: Modifier = Modifier, +) { + if (images.isEmpty()) return + var index by remember(images) { mutableIntStateOf(0) } + + if (images.size > 1) { + LaunchedEffect(images) { + while (true) { + delay(8_000) + index = (index + 1) % images.size + } + } + } + + AnimatedContent( + targetState = index, + transitionSpec = { + slideInHorizontally(tween(800)) { it } togetherWith + slideOutHorizontally(tween(800)) { -it } + }, + label = "onboarding-carousel", + modifier = modifier, + ) { i -> + Image( + painter = painterResource(images[i]), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = Modifier.fillMaxSize(), + ) + } +} diff --git a/android/app/src/main/java/app/voltplan/cable/ui/components/OnboardingInfo.kt b/android/app/src/main/java/app/voltplan/cable/ui/components/OnboardingInfo.kt index 4f3c7e4..7c3881c 100644 --- a/android/app/src/main/java/app/voltplan/cable/ui/components/OnboardingInfo.kt +++ b/android/app/src/main/java/app/voltplan/cable/ui/components/OnboardingInfo.kt @@ -1,10 +1,12 @@ package app.voltplan.cable.ui.components +import androidx.annotation.DrawableRes import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column 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.layout.size import androidx.compose.material3.Button @@ -29,6 +31,7 @@ fun OnboardingInfo( onPrimary: () -> Unit, secondaryLabel: String? = null, onSecondary: (() -> Unit)? = null, + @DrawableRes images: List = emptyList(), modifier: Modifier = Modifier, ) { Column( @@ -36,7 +39,11 @@ fun OnboardingInfo( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { - Icon(icon, contentDescription = null, tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(56.dp)) + if (images.isNotEmpty()) { + OnboardingCarousel(images = images, modifier = Modifier.fillMaxWidth().height(200.dp)) + } else { + Icon(icon, contentDescription = null, tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(56.dp)) + } Spacer(Modifier.size(16.dp)) Text(title, style = MaterialTheme.typography.titleLarge, textAlign = TextAlign.Center) Spacer(Modifier.size(8.dp)) diff --git a/android/app/src/main/res/drawable-night-nodpi/onboarding_battery.png b/android/app/src/main/res/drawable-night-nodpi/onboarding_battery.png new file mode 100644 index 0000000..c70aea3 Binary files /dev/null and b/android/app/src/main/res/drawable-night-nodpi/onboarding_battery.png differ diff --git a/android/app/src/main/res/drawable-night-nodpi/onboarding_boat.png b/android/app/src/main/res/drawable-night-nodpi/onboarding_boat.png new file mode 100644 index 0000000..ad1ad0d Binary files /dev/null and b/android/app/src/main/res/drawable-night-nodpi/onboarding_boat.png differ diff --git a/android/app/src/main/res/drawable-night-nodpi/onboarding_cabin.png b/android/app/src/main/res/drawable-night-nodpi/onboarding_cabin.png new file mode 100644 index 0000000..c866018 Binary files /dev/null and b/android/app/src/main/res/drawable-night-nodpi/onboarding_cabin.png differ diff --git a/android/app/src/main/res/drawable-night-nodpi/onboarding_charger.png b/android/app/src/main/res/drawable-night-nodpi/onboarding_charger.png new file mode 100644 index 0000000..257cc63 Binary files /dev/null and b/android/app/src/main/res/drawable-night-nodpi/onboarding_charger.png differ diff --git a/android/app/src/main/res/drawable-night-nodpi/onboarding_coffee.png b/android/app/src/main/res/drawable-night-nodpi/onboarding_coffee.png new file mode 100644 index 0000000..b0f9d0d Binary files /dev/null and b/android/app/src/main/res/drawable-night-nodpi/onboarding_coffee.png differ diff --git a/android/app/src/main/res/drawable-night-nodpi/onboarding_router.png b/android/app/src/main/res/drawable-night-nodpi/onboarding_router.png new file mode 100644 index 0000000..7c0add6 Binary files /dev/null and b/android/app/src/main/res/drawable-night-nodpi/onboarding_router.png differ diff --git a/android/app/src/main/res/drawable-night-nodpi/onboarding_van.png b/android/app/src/main/res/drawable-night-nodpi/onboarding_van.png new file mode 100644 index 0000000..5da6341 Binary files /dev/null and b/android/app/src/main/res/drawable-night-nodpi/onboarding_van.png differ diff --git a/android/app/src/main/res/drawable-nodpi/onboarding_battery.png b/android/app/src/main/res/drawable-nodpi/onboarding_battery.png new file mode 100644 index 0000000..b36311d Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/onboarding_battery.png differ diff --git a/android/app/src/main/res/drawable-nodpi/onboarding_boat.png b/android/app/src/main/res/drawable-nodpi/onboarding_boat.png new file mode 100644 index 0000000..9c9655e Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/onboarding_boat.png differ diff --git a/android/app/src/main/res/drawable-nodpi/onboarding_cabin.png b/android/app/src/main/res/drawable-nodpi/onboarding_cabin.png new file mode 100644 index 0000000..392e944 Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/onboarding_cabin.png differ diff --git a/android/app/src/main/res/drawable-nodpi/onboarding_charger.png b/android/app/src/main/res/drawable-nodpi/onboarding_charger.png new file mode 100644 index 0000000..fbe6475 Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/onboarding_charger.png differ diff --git a/android/app/src/main/res/drawable-nodpi/onboarding_coffee.png b/android/app/src/main/res/drawable-nodpi/onboarding_coffee.png new file mode 100644 index 0000000..16802c4 Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/onboarding_coffee.png differ diff --git a/android/app/src/main/res/drawable-nodpi/onboarding_router.png b/android/app/src/main/res/drawable-nodpi/onboarding_router.png new file mode 100644 index 0000000..b1018dd Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/onboarding_router.png differ diff --git a/android/app/src/main/res/drawable-nodpi/onboarding_van.png b/android/app/src/main/res/drawable-nodpi/onboarding_van.png new file mode 100644 index 0000000..bba3aa4 Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/onboarding_van.png differ