From 4851eee5f8d26bbc2a78ffe4b91baa2e4a837ac3 Mon Sep 17 00:00:00 2001 From: Trey t Date: Mon, 23 Feb 2026 21:21:41 -0600 Subject: [PATCH] Fix paywall width overflow on iOS 18, update onboarding tip from Yesterday to Today Add containerRelativeFrame to paywall marketing content so feature cards fit within screen width on iOS 18. Update onboarding tip text and all localizations (DE, ES, FR, JA, KO, PT-BR). Co-Authored-By: Claude Opus 4.6 --- Feels/Localizable.xcstrings | 17 +++--- Shared/Onboarding/views/OnboardingDay.swift | 2 +- Shared/Views/FeelsSubscriptionStoreView.swift | 53 ++++++++++--------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/Feels/Localizable.xcstrings b/Feels/Localizable.xcstrings index 663801a..eb6040d 100644 --- a/Feels/Localizable.xcstrings +++ b/Feels/Localizable.xcstrings @@ -17873,44 +17873,43 @@ } } }, - "Tip: \"Yesterday\" works great for evening reminders": { - "comment": "A tip displayed below the \"Rate the previous day\" option, providing guidance on how to use the \"Yesterday\" option effectively.", - "isCommentAutoGenerated": true, + "Tip: \"Today\" works great for evening reminders": { + "comment": "A tip displayed below the day rating option, providing guidance on how to use the \"Today\" option effectively.", "localizations": { "de": { "stringUnit": { "state": "translated", - "value": "Tipp: „Gestern\" eignet sich gut für Abenderinnerungen" + "value": "Tipp: „Heute" eignet sich gut für Abenderinnerungen" } }, "es": { "stringUnit": { "state": "translated", - "value": "Consejo: \"Ayer\" funciona muy bien para recordatorios nocturnos" + "value": "Consejo: \"Hoy\" funciona muy bien para recordatorios nocturnos" } }, "fr": { "stringUnit": { "state": "translated", - "value": "Astuce : « Hier » fonctionne bien pour les rappels du soir" + "value": "Astuce : « Aujourd'hui » fonctionne bien pour les rappels du soir" } }, "ja": { "stringUnit": { "state": "translated", - "value": "ヒント:「昨日」は夜のリマインダーに最適です" + "value": "ヒント:「今日」は夜のリマインダーに最適です" } }, "ko": { "stringUnit": { "state": "translated", - "value": "팁: \"어제\"는 저녁 알림에 잘 맞습니다" + "value": "팁: \"오늘\"은 저녁 알림에 잘 맞습니다" } }, "pt-BR": { "stringUnit": { "state": "translated", - "value": "Dica: \"Ontem\" funciona muito bem para lembretes noturnos" + "value": "Dica: \"Hoje\" funciona muito bem para lembretes noturnos" } } } diff --git a/Shared/Onboarding/views/OnboardingDay.swift b/Shared/Onboarding/views/OnboardingDay.swift index 813424e..0b92a0b 100644 --- a/Shared/Onboarding/views/OnboardingDay.swift +++ b/Shared/Onboarding/views/OnboardingDay.swift @@ -88,7 +88,7 @@ struct OnboardingDay: View { .font(.headline) .foregroundColor(.yellow) - Text("Tip: \"Yesterday\" works great for evening reminders") + Text("Tip: \"Today\" works great for evening reminders") .font(.subheadline.weight(.medium)) .foregroundColor(.white.opacity(0.9)) } diff --git a/Shared/Views/FeelsSubscriptionStoreView.swift b/Shared/Views/FeelsSubscriptionStoreView.swift index 3e60204..d1e7dc4 100644 --- a/Shared/Views/FeelsSubscriptionStoreView.swift +++ b/Shared/Views/FeelsSubscriptionStoreView.swift @@ -63,32 +63,35 @@ struct FeelsSubscriptionStoreView: View { @ViewBuilder private var marketingContent: some View { - switch currentStyle { - case .celestial: - CelestialMarketingContent() - case .garden: - GardenMarketingContent() - case .neon: - NeonMarketingContent() - case .minimal: - MinimalMarketingContent() - case .zen: - ZenMarketingContent() - case .editorial: - EditorialMarketingContent() - case .mixtape: - MixtapeMarketingContent() - case .heartfelt: - HeartfeltMarketingContent() - case .luxe: - LuxeMarketingContent() - case .forecast: - ForecastMarketingContent() - case .playful: - PlayfulMarketingContent() - case .journal: - JournalMarketingContent() + Group { + switch currentStyle { + case .celestial: + CelestialMarketingContent() + case .garden: + GardenMarketingContent() + case .neon: + NeonMarketingContent() + case .minimal: + MinimalMarketingContent() + case .zen: + ZenMarketingContent() + case .editorial: + EditorialMarketingContent() + case .mixtape: + MixtapeMarketingContent() + case .heartfelt: + HeartfeltMarketingContent() + case .luxe: + LuxeMarketingContent() + case .forecast: + ForecastMarketingContent() + case .playful: + PlayfulMarketingContent() + case .journal: + JournalMarketingContent() + } } + .containerRelativeFrame(.horizontal) } private var tintColor: Color {