Add onboarding Next buttons and fix accessibility for paged TabView
App-side changes: - Added "Get Started" / "Continue" next buttons to all onboarding pages (Welcome, Day, Time, Style) with onboarding_next_button accessibility ID - Added onNext callback plumbing from OnboardingMain to each page - OnboardingMain now uses TabView(selection:) for programmatic page navigation - Added .accessibilityElement(children: .contain) to all onboarding pages to fix iOS 26 paged TabView not exposing child elements - Added settings_segmented_picker accessibility ID to Settings Picker - Reduced padding on onboarding pages to keep buttons in visible area Test-side changes: - OnboardingScreen: replaced unreliable swipeToNext() with tapNext() that taps the accessibility-identified next button - OnboardingScreen: multi-strategy skip button detection for subscription page - SettingsScreen: scoped segment tap to picker element to avoid tab bar collision - CustomizeScreen: simplified horizontal scroll to plain app.swipeLeft() - OnboardingVotingTests: uses tapNext() to advance to Day page Passing: OnboardingTests.CompleteFlow, OnboardingVotingTests Remaining: OnboardingTests.DoesNotRepeat (session state issue), Settings scroll (deep elements), Customize horizontal pickers Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,8 @@
|
||||
import SwiftUI
|
||||
|
||||
struct OnboardingWelcome: View {
|
||||
var onNext: (() -> Void)? = nil
|
||||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
// Gradient background
|
||||
@@ -54,28 +56,32 @@ struct OnboardingWelcome: View {
|
||||
Spacer()
|
||||
|
||||
// Feature highlights
|
||||
VStack(spacing: 20) {
|
||||
VStack(spacing: 16) {
|
||||
FeatureRow(icon: "bell.badge.fill", title: "Daily Reminders", description: "Never forget to log your mood")
|
||||
FeatureRow(icon: "chart.bar.fill", title: "Beautiful Insights", description: "See your mood patterns over time")
|
||||
FeatureRow(icon: "paintpalette.fill", title: "Fully Customizable", description: "Make it yours with themes & colors")
|
||||
}
|
||||
.padding(.horizontal, 30)
|
||||
.padding(.bottom, 40)
|
||||
.padding(.bottom, 24)
|
||||
|
||||
// Swipe hint
|
||||
HStack(spacing: 8) {
|
||||
Text("Swipe to get started")
|
||||
.font(.subheadline.weight(.medium))
|
||||
.foregroundColor(.white.opacity(0.7))
|
||||
Image(systemName: "chevron.right")
|
||||
.font(.subheadline.weight(.semibold))
|
||||
.foregroundColor(.white.opacity(0.7))
|
||||
// Continue button
|
||||
Button(action: { onNext?() }) {
|
||||
Text("Get Started")
|
||||
.font(.headline.weight(.semibold))
|
||||
.foregroundColor(Color(hex: "667eea"))
|
||||
.frame(maxWidth: .infinity)
|
||||
.padding(.vertical, 14)
|
||||
.background(
|
||||
RoundedRectangle(cornerRadius: 16)
|
||||
.fill(.white)
|
||||
)
|
||||
}
|
||||
.padding(.bottom, 60)
|
||||
.accessibilityLabel(String(localized: "Swipe right to continue"))
|
||||
.accessibilityHint(String(localized: "Swipe to the next onboarding step"))
|
||||
.padding(.horizontal, 30)
|
||||
.padding(.bottom, 40)
|
||||
.accessibilityIdentifier(AccessibilityID.Onboarding.nextButton)
|
||||
}
|
||||
}
|
||||
.accessibilityElement(children: .contain)
|
||||
.accessibilityIdentifier(AccessibilityID.Onboarding.welcomeScreen)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user