import SwiftUI struct MealWindowsStepView: View { @Binding var selection: Set var onNext: () -> Void var body: some View { VStack(spacing: 24) { Text("meal_windows_title") .font(.mealMoodH1) .foregroundColor(.mealMoodTextPrimary) .multilineTextAlignment(.leading) .frame(maxWidth: .infinity, alignment: .leading) .padding(.horizontal, 24) .padding(.top, 12) VStack(spacing: 12) { ForEach(MealType.allCases, id: \.self) { mealType in SelectionCard( icon: mealType.icon, title: optionTitle(mealType), isSelected: selection.contains(mealType) ) { withAnimation(.spring(response: 0.3)) { if selection.contains(mealType) { // Keep at least one meal selected. if selection.count > 1 { selection.remove(mealType) } } else { selection.insert(mealType) } } HapticManager.shared.selection() } } } .padding(.horizontal, 24) PrimaryButton(title: String(localized: "onboarding_continue"), action: onNext) .accessibilityIdentifier("onboarding_cta_meal_windows") .padding(.horizontal, 24) .padding(.top, 8) .padding(.bottom, 40) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) } private func optionTitle(_ mealType: MealType) -> String { let emoji: String switch mealType { case .breakfast: emoji = "☕️" case .lunch: emoji = "🌞" case .snack: emoji = "🍎" case .dinner: emoji = "🌙" } return "\(emoji) \(String(localized: String.LocalizationValue(mealType.localizedKey)))" } } struct SelectionCard: View { let icon: String let title: String let isSelected: Bool let action: () -> Void var body: some View { Button(action: action) { HStack { Text(title) .font(.mealMoodBody) .foregroundColor(.mealMoodTextPrimary) Spacer() Image(systemName: isSelected ? "checkmark.circle.fill" : "circle") .foregroundColor(isSelected ? .mealMoodCoral : Color(hex: "#C4C4C4")) .font(.system(size: 22)) } .padding(16) .background(Color.mealMoodSurface) .cornerRadius(14) .overlay( RoundedRectangle(cornerRadius: 14) .stroke(isSelected ? Color.mealMoodCoral : Color(hex: "#F0F0F0"), lineWidth: isSelected ? 2 : 1) ) } } }