diff --git a/App/Shared/Resources/de.lproj/Localizable.strings b/App/Shared/Resources/de.lproj/Localizable.strings index 58fe471..1303d73 100644 --- a/App/Shared/Resources/de.lproj/Localizable.strings +++ b/App/Shared/Resources/de.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "Es ist kostenlos, ohne Werbung und ohne Tracking. Wenn es dir nützlich war, hilft ein kleines Trinkgeld, das so zu halten."; "Leave a tip" = "Trinkgeld geben"; "Maybe later" = "Vielleicht später"; + +"Send feedback" = "Feedback senden"; +"Rate LogWeight on the App Store" = "LogWeight im App Store bewerten"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "Feedback-E-Mails enthalten nur App-Version, iOS-Version und Gerätemodell. Es werden keine Gesundheitsdaten angehängt."; +"Email address copied" = "E-Mail-Adresse kopiert"; +"LogWeight feedback" = "LogWeight-Feedback"; diff --git a/App/Shared/Resources/en.lproj/Localizable.strings b/App/Shared/Resources/en.lproj/Localizable.strings index fdf7619..bad3e02 100644 --- a/App/Shared/Resources/en.lproj/Localizable.strings +++ b/App/Shared/Resources/en.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way."; "Leave a tip" = "Leave a tip"; "Maybe later" = "Maybe later"; + +"Send feedback" = "Send feedback"; +"Rate LogWeight on the App Store" = "Rate LogWeight on the App Store"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "Feedback emails include only your app version, iOS version, and device model. No health data is attached."; +"Email address copied" = "Email address copied"; +"LogWeight feedback" = "LogWeight feedback"; diff --git a/App/Shared/Resources/es.lproj/Localizable.strings b/App/Shared/Resources/es.lproj/Localizable.strings index 7144d2e..3d608bc 100644 --- a/App/Shared/Resources/es.lproj/Localizable.strings +++ b/App/Shared/Resources/es.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "Es gratis, sin anuncios ni seguimiento. Si te ha resultado útil, una pequeña propina ayuda a que siga siendo así."; "Leave a tip" = "Dejar una propina"; "Maybe later" = "Quizá más tarde"; + +"Send feedback" = "Enviar comentarios"; +"Rate LogWeight on the App Store" = "Valorar LogWeight en la App Store"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "Los correos de comentarios solo incluyen la versión de la app, la versión de iOS y el modelo del dispositivo. No se adjuntan datos de salud."; +"Email address copied" = "Dirección de correo copiada"; +"LogWeight feedback" = "Comentarios sobre LogWeight"; diff --git a/App/Shared/Resources/fr.lproj/Localizable.strings b/App/Shared/Resources/fr.lproj/Localizable.strings index 3dab994..479cdba 100644 --- a/App/Shared/Resources/fr.lproj/Localizable.strings +++ b/App/Shared/Resources/fr.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "L’application est gratuite, sans publicité ni suivi. Si elle vous a été utile, un petit pourboire aide à le rester."; "Leave a tip" = "Laisser un pourboire"; "Maybe later" = "Plus tard"; + +"Send feedback" = "Envoyer un commentaire"; +"Rate LogWeight on the App Store" = "Noter LogWeight sur l'App Store"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "Les e-mails de commentaires n'incluent que la version de l'app, la version d'iOS et le modèle de l'appareil. Aucune donnée de santé n'est jointe."; +"Email address copied" = "Adresse e-mail copiée"; +"LogWeight feedback" = "Commentaire sur LogWeight"; diff --git a/App/Shared/Resources/it.lproj/Localizable.strings b/App/Shared/Resources/it.lproj/Localizable.strings index c5ff374..87f55e4 100644 --- a/App/Shared/Resources/it.lproj/Localizable.strings +++ b/App/Shared/Resources/it.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "È gratuita, senza pubblicità né tracciamento. Se ti è stata utile, una piccola mancia aiuta a mantenerla così."; "Leave a tip" = "Lascia una mancia"; "Maybe later" = "Forse più tardi"; + +"Send feedback" = "Invia feedback"; +"Rate LogWeight on the App Store" = "Valuta LogWeight sull'App Store"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "Le email di feedback includono solo la versione dell'app, la versione di iOS e il modello del dispositivo. Non vengono allegati dati sulla salute."; +"Email address copied" = "Indirizzo email copiato"; +"LogWeight feedback" = "Feedback su LogWeight"; diff --git a/App/Shared/Resources/ja.lproj/Localizable.strings b/App/Shared/Resources/ja.lproj/Localizable.strings index 5d97188..b974c59 100644 --- a/App/Shared/Resources/ja.lproj/Localizable.strings +++ b/App/Shared/Resources/ja.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "無料で、広告もトラッキングもありません。役立っていたら、少額のチップがその継続を支えます。"; "Leave a tip" = "チップを送る"; "Maybe later" = "また今度"; + +"Send feedback" = "フィードバックを送信"; +"Rate LogWeight on the App Store" = "App StoreでLogWeightを評価"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "フィードバックのメールには、アプリのバージョン、iOSのバージョン、デバイスモデルのみが含まれます。健康データが添付されることはありません。"; +"Email address copied" = "メールアドレスをコピーしました"; +"LogWeight feedback" = "LogWeightへのフィードバック"; diff --git a/App/Shared/Resources/ko.lproj/Localizable.strings b/App/Shared/Resources/ko.lproj/Localizable.strings index 5413d57..4982486 100644 --- a/App/Shared/Resources/ko.lproj/Localizable.strings +++ b/App/Shared/Resources/ko.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "광고와 추적 없이 무료로 제공됩니다. 유용하셨다면 소액의 팁이 이를 유지하는 데 도움이 됩니다."; "Leave a tip" = "팁 남기기"; "Maybe later" = "나중에"; + +"Send feedback" = "피드백 보내기"; +"Rate LogWeight on the App Store" = "App Store에서 LogWeight 평가하기"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "피드백 이메일에는 앱 버전, iOS 버전, 기기 모델만 포함됩니다. 건강 데이터는 첨부되지 않습니다."; +"Email address copied" = "이메일 주소가 복사되었습니다"; +"LogWeight feedback" = "LogWeight 피드백"; diff --git a/App/Shared/Resources/nl.lproj/Localizable.strings b/App/Shared/Resources/nl.lproj/Localizable.strings index 936c5e7..e4a7640 100644 --- a/App/Shared/Resources/nl.lproj/Localizable.strings +++ b/App/Shared/Resources/nl.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "Het is gratis, zonder advertenties en zonder tracking. Als het nuttig was, helpt een kleine fooi om dat zo te houden."; "Leave a tip" = "Een fooi geven"; "Maybe later" = "Misschien later"; + +"Send feedback" = "Feedback sturen"; +"Rate LogWeight on the App Store" = "Beoordeel LogWeight in de App Store"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "Feedbackmails bevatten alleen je app-versie, iOS-versie en apparaatmodel. Er worden geen gezondheidsgegevens meegestuurd."; +"Email address copied" = "E-mailadres gekopieerd"; +"LogWeight feedback" = "LogWeight-feedback"; diff --git a/App/Shared/Resources/pt-BR.lproj/Localizable.strings b/App/Shared/Resources/pt-BR.lproj/Localizable.strings index abfd8d3..f946061 100644 --- a/App/Shared/Resources/pt-BR.lproj/Localizable.strings +++ b/App/Shared/Resources/pt-BR.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "É gratuito, sem anúncios e sem rastreamento. Se tem sido útil, uma pequena gorjeta ajuda a manter assim."; "Leave a tip" = "Deixar uma gorjeta"; "Maybe later" = "Talvez depois"; + +"Send feedback" = "Enviar feedback"; +"Rate LogWeight on the App Store" = "Avaliar o LogWeight na App Store"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "Os e-mails de feedback incluem apenas a versão do app, a versão do iOS e o modelo do dispositivo. Nenhum dado de saúde é anexado."; +"Email address copied" = "Endereço de e-mail copiado"; +"LogWeight feedback" = "Feedback do LogWeight"; diff --git a/App/Shared/Resources/zh-Hans.lproj/Localizable.strings b/App/Shared/Resources/zh-Hans.lproj/Localizable.strings index 7f1615f..b845d17 100644 --- a/App/Shared/Resources/zh-Hans.lproj/Localizable.strings +++ b/App/Shared/Resources/zh-Hans.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "它是免费的,没有广告也没有追踪。如果对你有帮助,一点小赞赏有助于保持这样。"; "Leave a tip" = "赞赏一下"; "Maybe later" = "以后再说"; + +"Send feedback" = "发送反馈"; +"Rate LogWeight on the App Store" = "在 App Store 评价 LogWeight"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "反馈邮件仅包含 App 版本、iOS 版本和设备型号,不会附带任何健康数据。"; +"Email address copied" = "邮件地址已复制"; +"LogWeight feedback" = "LogWeight 反馈"; diff --git a/App/Shared/Resources/zh-Hant.lproj/Localizable.strings b/App/Shared/Resources/zh-Hant.lproj/Localizable.strings index e25dda3..7ad2e3a 100644 --- a/App/Shared/Resources/zh-Hant.lproj/Localizable.strings +++ b/App/Shared/Resources/zh-Hant.lproj/Localizable.strings @@ -116,3 +116,9 @@ "It's free, with no ads and no tracking. If it's been useful, a small tip helps keep it that way." = "它是免費的,沒有廣告也沒有追蹤。如果對你有幫助,一點小贊賞有助於保持這樣。"; "Leave a tip" = "贊賞一下"; "Maybe later" = "以後再說"; + +"Send feedback" = "傳送意見回饋"; +"Rate LogWeight on the App Store" = "在 App Store 評價 LogWeight"; +"Feedback emails include only your app version, iOS version, and device model. No health data is attached." = "意見回饋郵件僅包含 App 版本、iOS 版本和裝置型號,不會附帶任何健康資料。"; +"Email address copied" = "電子郵件地址已拷貝"; +"LogWeight feedback" = "LogWeight 意見回饋"; diff --git a/App/Shared/Views/SettingsView.swift b/App/Shared/Views/SettingsView.swift index 9d2fa1a..9af9fba 100644 --- a/App/Shared/Views/SettingsView.swift +++ b/App/Shared/Views/SettingsView.swift @@ -18,6 +18,10 @@ struct SettingsView: View { @State private var pendingReminderEnabled: Bool? @Environment(\.dismiss) private var dismiss +#if os(iOS) + @Environment(\.openURL) private var openURL + @State private var showsEmailCopiedAlert = false +#endif #if os(iOS) private let reminderCoordinator = ReminderCoordinator() @@ -83,6 +87,25 @@ struct SettingsView: View { } .accessibilityIdentifier("settings.tipjar") } + + Section("Feedback") { + Button { + sendFeedbackEmail() + } label: { + Label("Send feedback", systemImage: "envelope") + } + .accessibilityIdentifier("settings.feedback.email") + + Link(destination: FeedbackLinks.writeReviewURL) { + Label("Rate LogWeight on the App Store", systemImage: "star") + .fixedSize(horizontal: false, vertical: true) + } + .accessibilityIdentifier("settings.feedback.rate") + + Text("Feedback emails include only your app version, iOS version, and device model. No health data is attached.") + .font(.footnote) + .foregroundStyle(.secondary) + } #endif Section("Apple Health") { @@ -124,11 +147,49 @@ struct SettingsView: View { .task { reminderAuthStatus = await reminderScheduler.authorizationStatus() } + .alert("Email address copied", isPresented: $showsEmailCopiedAlert) { + } message: { + Text(FeedbackLinks.supportAddress) + } #endif } } #if os(iOS) + /// Opens a prefilled mail draft. If no mail app can handle it, copies the + /// support address so the user can write from any client. + private func sendFeedbackEmail() { + let subject = String(localized: "LogWeight feedback") + guard let url = FeedbackLinks.mailtoURL(subject: subject, diagnostics: Self.feedbackDiagnostics()) else { + copySupportAddress() + return + } + openURL(url) { accepted in + if !accepted { copySupportAddress() } + } + } + + private func copySupportAddress() { + UIPasteboard.general.string = FeedbackLinks.supportAddress + showsEmailCopiedAlert = true + } + + private static func feedbackDiagnostics() -> FeedbackLinks.Diagnostics { + let info = Bundle.main.infoDictionary + var systemInfo = utsname() + uname(&systemInfo) + let machine = withUnsafeBytes(of: &systemInfo.machine) { buffer in + String(decoding: buffer.prefix(while: { $0 != 0 }), as: UTF8.self) + } + let model = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? machine + return FeedbackLinks.Diagnostics( + appVersion: info?["CFBundleShortVersionString"] as? String ?? "?", + build: info?["CFBundleVersion"] as? String ?? "?", + osVersion: UIDevice.current.systemVersion, + deviceModel: model + ) + } + private var reminderEnabledBinding: Binding { Binding( get: { reminderEnabled }, diff --git a/App/WatchScreenshots/WatchScreenshotTestCase.swift b/App/WatchScreenshots/WatchScreenshotTestCase.swift index 2041197..1cee3bb 100644 --- a/App/WatchScreenshots/WatchScreenshotTestCase.swift +++ b/App/WatchScreenshots/WatchScreenshotTestCase.swift @@ -14,10 +14,12 @@ class WatchScreenshotTestCase: XCTestCase { /// Launches the watch app with an in-memory store, optionally preloaded /// with a `ScreenshotFixture` via `seed`. Display unit follows the - /// simulator's region (set via `xcodebuild test -testRegion`): DE - /// captures in kg, everything else in lb. + /// simulator's region (set via `xcodebuild test -testRegion`): only + /// `.us` is imperial (lb) — `.uk` (e.g. en-GB) still displays kg for + /// body weight despite Foundation reporting it as a distinct, + /// non-`.metric` measurement system. func launchApp(seed: String? = nil) { - let unit = Locale.current.region?.identifier == "DE" ? "kg" : "lb" + let unit = Locale.current.measurementSystem == .us ? "lb" : "kg" var args = ["--use-in-memory-store", "-logweight_unit_preference", unit] if let seed { args.append("--seed=\(seed)") diff --git a/App/iOS/Support/TipJarStore.swift b/App/iOS/Support/TipJarStore.swift index 75bf073..0c57b30 100644 --- a/App/iOS/Support/TipJarStore.swift +++ b/App/iOS/Support/TipJarStore.swift @@ -20,6 +20,9 @@ final class TipJarStore { private(set) var products: [Product] = [] private(set) var purchaseState: PurchaseState = .idle + /// Stays `true` for a week after the last tip, so the thank-you note + /// survives leaving and re-entering the screen. + private(set) var showsThankYou = TipThankYouPolicy.shouldShowThankYou() @ObservationIgnored private nonisolated(unsafe) var transactionListener: Task? @@ -52,6 +55,7 @@ final class TipJarStore { switch try await product.purchase() { case .success(.verified(let transaction)): await transaction.finish() + recordTip(transaction) purchaseState = .thankYou(tip) case .success(.unverified): purchaseState = .failed @@ -69,7 +73,15 @@ final class TipJarStore { guard case .verified(let transaction) = result else { return } await transaction.finish() if let tip = TipJarProduct(rawValue: transaction.productID) { + recordTip(transaction) purchaseState = .thankYou(tip) } } + + private func recordTip(_ transaction: Transaction) { + TipThankYouPolicy.recordTip(at: transaction.purchaseDate) + // Ensure the thank-you is visible immediately after a verified purchase, + // even if the local clock is behind the transaction’s purchaseDate. + showsThankYou = TipThankYouPolicy.shouldShowThankYou(now: transaction.purchaseDate) + } } diff --git a/App/iOS/Views/TipJarView.swift b/App/iOS/Views/TipJarView.swift index ba7c4e8..9697807 100644 --- a/App/iOS/Views/TipJarView.swift +++ b/App/iOS/Views/TipJarView.swift @@ -33,7 +33,7 @@ struct TipJarView: View { .foregroundStyle(.secondary) } - if case .thankYou = store.purchaseState { + if store.showsThankYou { Section { Label("Thank you for supporting LogWeight!", systemImage: "heart.fill") .foregroundStyle(.pink) diff --git a/App/iOSScreenshots/ScreenshotTestCase.swift b/App/iOSScreenshots/ScreenshotTestCase.swift index 7c5944f..3aa5979 100644 --- a/App/iOSScreenshots/ScreenshotTestCase.swift +++ b/App/iOSScreenshots/ScreenshotTestCase.swift @@ -59,11 +59,13 @@ class ScreenshotTestCase: XCTestCase { /// the calling shell don't cross into the simulator-hosted test process, /// so locale is driven by `xcodebuild test -testLanguage -testRegion` /// instead (see Tools/CaptureScene.sh and Tools/CaptureStoreScreenshots.sh). - /// Display unit follows that same region: DE captures in kg, everything - /// else in lb, passed via the `-logweight_unit_preference` NSUserDefaults - /// argument (crosses into the app process the same way `-AppleLanguages` did). + /// Display unit follows that region: only `.us` is imperial (lb) — `.uk` + /// (e.g. en-GB) still displays kg for body weight despite Foundation + /// reporting it as a distinct, non-`.metric` measurement system — passed + /// via the `-logweight_unit_preference` NSUserDefaults argument (crosses + /// into the app process the same way `-AppleLanguages` did). func launchApp(seed: String? = nil, extraArguments: [String] = []) { - let unit = Locale.current.region?.identifier == "DE" ? "kg" : "lb" + let unit = Locale.current.measurementSystem == .us ? "lb" : "kg" var args = [ "--use-in-memory-store", "--skip-splash", diff --git a/App/iOSUITests/UITestNavigation.swift b/App/iOSUITests/UITestNavigation.swift index bf8df34..f2ccd70 100644 --- a/App/iOSUITests/UITestNavigation.swift +++ b/App/iOSUITests/UITestNavigation.swift @@ -33,10 +33,20 @@ extension XCUIApplication { } } + /// Localized "History" tab title, one per `App/Shared/Resources/*.lproj/Localizable.strings` + /// entry — needed because iPadOS 18's regular-width tab bar floats as a + /// top capsule outside the `tabBars` accessibility container and drops the + /// `tab.history` accessibility identifier entirely, so on iPad every + /// locale falls through to a label match. + private static let historyTabLabels = [ + "History", "Verlauf", "Historique", "Historial", "Cronologia", + "Histórico", "履歴", "기록", "历史", "歷史", "Geschiedenis", + ] + /// Opens the History tab on iPhone and iPad, in whatever locale the /// simulator is running (see Tools/CaptureStoreScreenshots.sh's /// `-testLanguage`/`-testRegion`) — falls back through stable identifier, - /// localized label (English and German), and tab index, in that order. + /// localized label (all supported locales), and tab index, in that order. /// iPadOS 18's regular-width tab bar floats as a top capsule outside the /// `tabBars` accessibility container, so the last fallbacks search `app.buttons` directly. func openHistoryTab(file: StaticString = #file, line: UInt = #line) { @@ -47,7 +57,7 @@ extension XCUIApplication { return } - for label in ["History", "Verlauf"] { + for label in Self.historyTabLabels { let byLabel = tabBars.buttons[label] if byLabel.waitForExistence(timeout: 2) { tapTabBarButton(byLabel.firstMatch) @@ -67,7 +77,7 @@ extension XCUIApplication { return } - for label in ["History", "Verlauf"] { + for label in Self.historyTabLabels { let byLabel = buttons[label] if byLabel.waitForExistence(timeout: 2) { tapTabBarButton(byLabel.firstMatch) diff --git a/Config/Version.xcconfig b/Config/Version.xcconfig index 32748c8..f1f88a0 100644 --- a/Config/Version.xcconfig +++ b/Config/Version.xcconfig @@ -1,3 +1,3 @@ // Build number (CFBundleVersion). Auto-incremented by CI on green runs. // See .github/workflows/ci.yml and Tools/bump-build-number.sh. -CURRENT_PROJECT_VERSION = 1 +CURRENT_PROJECT_VERSION = 19 diff --git a/Packages/LogWeightCore/Sources/LogWeightCore/Settings/SettingsKeys.swift b/Packages/LogWeightCore/Sources/LogWeightCore/Settings/SettingsKeys.swift index 2b39512..2440796 100644 --- a/Packages/LogWeightCore/Sources/LogWeightCore/Settings/SettingsKeys.swift +++ b/Packages/LogWeightCore/Sources/LogWeightCore/Settings/SettingsKeys.swift @@ -17,6 +17,7 @@ public enum SettingsKey { public static let reminderMinute = "logweight_reminder_minute" public static let successfulEntryCount = "logweight_successful_entry_count" public static let tipPromptShown = "logweight_tip_prompt_shown" + public static let lastTipPurchaseDate = "logweight_last_tip_purchase_date" public static let schemaVersion = "logweight_settings_schema_version" } diff --git a/Packages/LogWeightCore/Sources/LogWeightCore/Support/FeedbackLinks.swift b/Packages/LogWeightCore/Sources/LogWeightCore/Support/FeedbackLinks.swift new file mode 100644 index 0000000..5e20864 --- /dev/null +++ b/Packages/LogWeightCore/Sources/LogWeightCore/Support/FeedbackLinks.swift @@ -0,0 +1,54 @@ +import Foundation + +/// Links behind Settings → Feedback: the prefilled support email and the +/// App Store "write a review" deep link. +/// +/// Diagnostics are limited to app, OS, and device model. Never add health +/// values or any user-entered data here. +public enum FeedbackLinks { + public static let supportAddress = "support@juuronina.de" + public static let appStoreID = "6764679748" + + public static let writeReviewURL = URL( + string: "https://apps.apple.com/app/id\(appStoreID)?action=write-review" + )! + + public struct Diagnostics: Equatable, Sendable { + public let appVersion: String + public let build: String + public let osVersion: String + public let deviceModel: String + + public init(appVersion: String, build: String, osVersion: String, deviceModel: String) { + self.appVersion = appVersion + self.build = build + self.osVersion = osVersion + self.deviceModel = deviceModel + } + + /// Plain-text block appended below the user's message. Intentionally not + /// localized so support can read it regardless of the user's language. + var bodyBlock: String { + "---\nLogWeight \(appVersion) (\(build))\niOS \(osVersion)\n\(deviceModel)" + } + } + + /// `mailto:` URL with subject and a body that leaves room for the user's + /// message above the diagnostics block. + public static func mailtoURL( + address: String = supportAddress, + subject: String, + diagnostics: Diagnostics + ) -> URL? { + let body = "\n\n\n" + diagnostics.bodyBlock + let string = "mailto:\(address)?subject=\(encode(subject))&body=\(encode(body))" + return URL(string: string) + } + + /// Percent-encodes everything except RFC 3986 unreserved characters, so + /// `&`, `=`, `+`, `?`, and newlines in values cannot break the query. + private static func encode(_ value: String) -> String { + let unreserved = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~") + return value.addingPercentEncoding(withAllowedCharacters: unreserved) ?? "" + } +} diff --git a/Packages/LogWeightCore/Sources/LogWeightCore/Support/TipThankYouPolicy.swift b/Packages/LogWeightCore/Sources/LogWeightCore/Support/TipThankYouPolicy.swift new file mode 100644 index 0000000..e95db4a --- /dev/null +++ b/Packages/LogWeightCore/Sources/LogWeightCore/Support/TipThankYouPolicy.swift @@ -0,0 +1,26 @@ +import Foundation + +/// Decides whether the tip jar keeps showing its "thank you" note after a +/// purchase. +/// +/// Tips are consumables, so StoreKit keeps no entitlement to query. Instead the +/// date of the last successful tip is stored in `UserDefaults`, and the note +/// stays visible for `visibilityWindow` afterwards. Pure `UserDefaults` logic +/// with no StoreKit dependency. +public enum TipThankYouPolicy { + public static let visibilityWindow: TimeInterval = 7 * 24 * 60 * 60 + + public static func recordTip(at date: Date = Date(), defaults: UserDefaults = .standard) { + defaults.set(date, forKey: SettingsKey.lastTipPurchaseDate) + } + + /// `true` if the last recorded tip happened within `visibilityWindow` of `now`. + /// A stored date in the future (clock change) counts as not recent. + public static func shouldShowThankYou(now: Date = Date(), defaults: UserDefaults = .standard) -> Bool { + guard let last = defaults.object(forKey: SettingsKey.lastTipPurchaseDate) as? Date else { + return false + } + let elapsed = now.timeIntervalSince(last) + return elapsed >= 0 && elapsed < visibilityWindow + } +} diff --git a/Packages/LogWeightCore/Tests/LogWeightCoreTests/FeedbackLinksTests.swift b/Packages/LogWeightCore/Tests/LogWeightCoreTests/FeedbackLinksTests.swift new file mode 100644 index 0000000..8614526 --- /dev/null +++ b/Packages/LogWeightCore/Tests/LogWeightCoreTests/FeedbackLinksTests.swift @@ -0,0 +1,49 @@ +import XCTest +@testable import LogWeightCore + +final class FeedbackLinksTests: XCTestCase { + + private let diagnostics = FeedbackLinks.Diagnostics( + appVersion: "0.5.0", + build: "123", + osVersion: "26.0", + deviceModel: "iPhone17,1" + ) + + private func components(_ url: URL?) throws -> URLComponents { + let url = try XCTUnwrap(url) + return try XCTUnwrap(URLComponents(url: url, resolvingAgainstBaseURL: false)) + } + + func testMailtoTargetsSupportAddress() throws { + let parts = try components(FeedbackLinks.mailtoURL(subject: "LogWeight feedback", diagnostics: diagnostics)) + XCTAssertEqual(parts.scheme, "mailto") + XCTAssertEqual(parts.path, "support@juuronina.de") + } + + func testMailtoRoundTripsSubjectAndBody() throws { + let parts = try components(FeedbackLinks.mailtoURL(subject: "LogWeight feedback", diagnostics: diagnostics)) + let items = Dictionary(uniqueKeysWithValues: (parts.queryItems ?? []).map { ($0.name, $0.value ?? "") }) + XCTAssertEqual(items["subject"], "LogWeight feedback") + XCTAssertEqual(items["body"], "\n\n\n---\nLogWeight 0.5.0 (123)\niOS 26.0\niPhone17,1") + } + + func testReservedCharactersInSubjectStayInsideOneQueryItem() throws { + let parts = try components(FeedbackLinks.mailtoURL(subject: "a&b=c+d?e", diagnostics: diagnostics)) + let items = parts.queryItems ?? [] + XCTAssertEqual(items.map(\.name), ["subject", "body"]) + XCTAssertEqual(items.first?.value, "a&b=c+d?e") + } + + func testNonASCIISubjectRoundTrips() throws { + let parts = try components(FeedbackLinks.mailtoURL(subject: "LogWeight 反馈 – Rückmeldung", diagnostics: diagnostics)) + XCTAssertEqual(parts.queryItems?.first?.value, "LogWeight 反馈 – Rückmeldung") + } + + func testWriteReviewURLPointsAtAppStoreReviewAction() { + XCTAssertEqual( + FeedbackLinks.writeReviewURL.absoluteString, + "https://apps.apple.com/app/id6764679748?action=write-review" + ) + } +} diff --git a/Packages/LogWeightCore/Tests/LogWeightCoreTests/TipThankYouPolicyTests.swift b/Packages/LogWeightCore/Tests/LogWeightCoreTests/TipThankYouPolicyTests.swift new file mode 100644 index 0000000..42e8950 --- /dev/null +++ b/Packages/LogWeightCore/Tests/LogWeightCoreTests/TipThankYouPolicyTests.swift @@ -0,0 +1,44 @@ +import XCTest +@testable import LogWeightCore + +final class TipThankYouPolicyTests: XCTestCase { + + private func freshDefaults(_ name: String) -> UserDefaults { + let defaults = UserDefaults(suiteName: name)! + defaults.removePersistentDomain(forName: name) + return defaults + } + + private let now = Date(timeIntervalSince1970: 1_800_000_000) + + func testHiddenWhenNoTipRecorded() { + let defaults = freshDefaults("TipThankYouPolicyTests.none") + XCTAssertFalse(TipThankYouPolicy.shouldShowThankYou(now: now, defaults: defaults)) + } + + func testShownRightAfterTip() { + let defaults = freshDefaults("TipThankYouPolicyTests.fresh") + TipThankYouPolicy.recordTip(at: now, defaults: defaults) + XCTAssertTrue(TipThankYouPolicy.shouldShowThankYou(now: now, defaults: defaults)) + } + + func testShownJustInsideWindow() { + let defaults = freshDefaults("TipThankYouPolicyTests.inside") + TipThankYouPolicy.recordTip(at: now, defaults: defaults) + let later = now.addingTimeInterval(TipThankYouPolicy.visibilityWindow - 1) + XCTAssertTrue(TipThankYouPolicy.shouldShowThankYou(now: later, defaults: defaults)) + } + + func testHiddenAtAndAfterWindow() { + let defaults = freshDefaults("TipThankYouPolicyTests.outside") + TipThankYouPolicy.recordTip(at: now, defaults: defaults) + let later = now.addingTimeInterval(TipThankYouPolicy.visibilityWindow) + XCTAssertFalse(TipThankYouPolicy.shouldShowThankYou(now: later, defaults: defaults)) + } + + func testHiddenWhenRecordedDateIsInFuture() { + let defaults = freshDefaults("TipThankYouPolicyTests.future") + TipThankYouPolicy.recordTip(at: now.addingTimeInterval(3600), defaults: defaults) + XCTAssertFalse(TipThankYouPolicy.shouldShowThankYou(now: now, defaults: defaults)) + } +} diff --git a/Tools/CaptureStoreScreenshots.sh b/Tools/CaptureStoreScreenshots.sh index 2be8002..0588547 100755 --- a/Tools/CaptureStoreScreenshots.sh +++ b/Tools/CaptureStoreScreenshots.sh @@ -15,9 +15,9 @@ # (A SCREENSHOT_LOCALE env var doesn't work here: env vars set by the calling # shell don't cross into the simulator-hosted XCTest process.) # -# Note: Apple caps uploads at 10 screenshots per device size. ALL_SCENES in -# screenshot-scenes.sh is kept at exactly 10 for this reason — if it grows -# past that, trim Docs/store-screenshots/// before upload. +# Note: Apple caps uploads at 10 screenshots per device size. STORE_SCENES +# below is a curated subset (currently 3) of ALL_SCENES in +# screenshot-scenes.sh — stay under 10 if it grows. # # Always captured in light mode (forced per-device below) — that's the # storefront's chosen presentation, independent of whatever appearance a @@ -43,10 +43,20 @@ OUT_ROOT="$ROOT_DIR/Docs/store-screenshots" STORE_DEVICE_NAMES=("iPhone 14 Plus" "iPad Pro 13-inch (M4)") STORE_DEVICE_KEYS=("iphone-6.5" "ipad-13") -# App Store locales to capture: language code -> region code. Each must have -# an App/Shared/Resources/.lproj. -LOCALE_LANGUAGES=("en" "de") -LOCALE_REGIONS=("US" "DE") +# Scenes captured for the store set — a curated subset of ALL_SCENES, not the +# full ten (App Store screenshots don't need every scene, just the ones that +# sell best on the listing). +STORE_SCENES=(entry-after-plus-ten history-90d-plateau settings-default) + +# App Store locales to capture: language code -> region code -> output dir +# key, one triple per locale in docs/AppStoreMetadata.localized.md (each must +# have an App/Shared/Resources/.lproj), plus the three English +# storefront variants (all resolve to the single en.lproj bundle — only +# testRegion differs, which is what drives the kg/lb default per +# WeightDisplayPreferences.localeDefaultUnit). +LOCALE_LANGUAGES=("de" "fr" "es" "it" "pt-BR" "ja" "ko" "zh-Hans" "zh-Hant" "nl" "en" "en" "en") +LOCALE_REGIONS=("DE" "FR" "ES" "IT" "BR" "JP" "KR" "CN" "TW" "NL" "GB" "US" "CA") +LOCALE_KEYS=("de" "fr" "es" "it" "pt-BR" "ja" "ko" "zh-Hans" "zh-Hant" "nl" "en-GB" "en-US" "en-CA") boot_if_needed() { local name="$1" @@ -74,6 +84,11 @@ run_all_scenes() { rm -rf "$result_bundle" mkdir -p "$(dirname "$result_bundle")" + local only_testing_flags=() + for scene in "${STORE_SCENES[@]}"; do + only_testing_flags+=("-only-testing" "$(scene_to_test "$scene")") + done + xcodebuild test \ -project "$PROJECT" \ -scheme "$SCHEME" \ @@ -82,6 +97,7 @@ run_all_scenes() { -testLanguage "$language" \ -testRegion "$region" \ CODE_SIGNING_ALLOWED=NO \ + "${only_testing_flags[@]}" \ 2>&1 | grep -E "(Test|error:|warning:|Build)" | grep -v "^$" || true # xcodebuild exits non-zero when any scene test fails; tolerated here @@ -119,7 +135,7 @@ extract_attachments() { # description, App UI hierarchy) whose "isAssociatedWithFailure" flag is # not reliably set, so filtering on that alone lets them leak through. local known_scenes - known_scenes="$(IFS=,; echo "${ALL_SCENES[*]}")" + known_scenes="$(IFS=,; echo "${STORE_SCENES[*]}")" python3 << PYEOF import json, os, re, shutil @@ -164,21 +180,22 @@ PYEOF rm -rf "$result_bundle" } -echo "Full App Store screenshot set: ${#STORE_DEVICE_NAMES[@]} device size(s) x ${#LOCALE_LANGUAGES[@]} locale(s), all scenes from screenshot-scenes.sh." +echo "Full App Store screenshot set: ${#STORE_DEVICE_NAMES[@]} device size(s) x ${#LOCALE_LANGUAGES[@]} locale(s) x ${#STORE_SCENES[@]} scene(s)." for l in "${!LOCALE_LANGUAGES[@]}"; do language="${LOCALE_LANGUAGES[$l]}" region="${LOCALE_REGIONS[$l]}" + locale_key="${LOCALE_KEYS[$l]}" for i in "${!STORE_DEVICE_NAMES[@]}"; do device="${STORE_DEVICE_NAMES[$i]}" key="${STORE_DEVICE_KEYS[$i]}" - out_dir="$OUT_ROOT/$language/$key" - result_bundle="$ROOT_DIR/tmp/store-screenshots-$language-$key.xcresult" - attach_tmp="$ROOT_DIR/tmp/store-screenshots-$language-$key-attachments" + out_dir="$OUT_ROOT/$locale_key/$key" + result_bundle="$ROOT_DIR/tmp/store-screenshots-$locale_key-$key.xcresult" + attach_tmp="$ROOT_DIR/tmp/store-screenshots-$locale_key-$key-attachments" echo "" - echo "=== $device ($key) [$language-$region] ===" + echo "=== $device ($key) [$locale_key ($language-$region)] ===" udid="$(boot_if_needed "$device")" # App Store screenshots are always captured in light mode — set explicitly # rather than relying on whatever appearance the simulator happened to be diff --git a/Tools/CaptureWatchScreenshots.sh b/Tools/CaptureWatchScreenshots.sh index 50f24f5..0b08cbb 100755 --- a/Tools/CaptureWatchScreenshots.sh +++ b/Tools/CaptureWatchScreenshots.sh @@ -28,10 +28,14 @@ ALL_SCENES=( watch-history-default ) -# Locales to capture: language code -> region code. Each must have an -# App/Shared/Resources/.lproj. -LOCALE_LANGUAGES=("en" "de") -LOCALE_REGIONS=("US" "DE") +# Locales to capture: language code -> region code -> output dir key, one +# triple per locale in docs/AppStoreMetadata.localized.md (each must have an +# App/Shared/Resources/.lproj), plus the three English storefront +# variants (all resolve to the single en.lproj bundle — only testRegion +# differs). +LOCALE_LANGUAGES=("de" "fr" "es" "it" "pt-BR" "ja" "ko" "zh-Hans" "zh-Hant" "nl" "en" "en" "en") +LOCALE_REGIONS=("DE" "FR" "ES" "IT" "BR" "JP" "KR" "CN" "TW" "NL" "GB" "US" "CA") +LOCALE_KEYS=("de" "fr" "es" "it" "pt-BR" "ja" "ko" "zh-Hans" "zh-Hant" "nl" "en-GB" "en-US" "en-CA") boot_if_needed() { local name="$1" @@ -144,12 +148,13 @@ echo "Apple Watch screenshot set: ${#LOCALE_LANGUAGES[@]} locale(s), ${#ALL_SCEN for l in "${!LOCALE_LANGUAGES[@]}"; do language="${LOCALE_LANGUAGES[$l]}" region="${LOCALE_REGIONS[$l]}" - out_dir="$OUT_ROOT/$language/$OUT_KEY" - result_bundle="$ROOT_DIR/tmp/watch-screenshots-$language.xcresult" - attach_tmp="$ROOT_DIR/tmp/watch-screenshots-$language-attachments" + locale_key="${LOCALE_KEYS[$l]}" + out_dir="$OUT_ROOT/$locale_key/$OUT_KEY" + result_bundle="$ROOT_DIR/tmp/watch-screenshots-$locale_key.xcresult" + attach_tmp="$ROOT_DIR/tmp/watch-screenshots-$locale_key-attachments" echo "" - echo "=== $DEVICE_NAME [$language-$region] ===" + echo "=== $DEVICE_NAME [$locale_key ($language-$region)] ===" udid="$(boot_if_needed "$DEVICE_NAME")" run_all_scenes "$udid" "$result_bundle" "$language" "$region" extract_attachments "$result_bundle" "$attach_tmp" "$out_dir" diff --git a/docs/AppStoreMetadata.md b/docs/AppStoreMetadata.md index 4920e34..cd18bcb 100644 --- a/docs/AppStoreMetadata.md +++ b/docs/AppStoreMetadata.md @@ -21,15 +21,15 @@ This file tracks App Store Connect metadata needed for a v1.0 submission. ## Description -`LogWeight is the fastest calm way to log your body weight on Apple devices. +LogWeight is the fastest calm way to log your body weight on Apple devices. -• Save directly to Apple Health (Body Mass) -• Stepper-first entry for one-handed use -• Apple Watch support with Digital Crown input -• History list with trend chart on iPhone and iPad -• Privacy-first by design: no accounts, no analytics, no third-party SDKs +- Save directly to Apple Health (Body Mass) +- Stepper-first entry for one-handed use +- Apple Watch support with Digital Crown input +- History list with trend chart on iPhone and iPad +- Privacy-first by design: no accounts, no analytics, no third-party SDKs -Your data remains in Apple Health. LogWeight does not run its own weight database.` +Your data remains in Apple Health. LogWeight does not run its own weight database. ## Keywords diff --git a/docs/Privacy.md b/docs/Privacy.md index 1a973f7..df504c6 100644 --- a/docs/Privacy.md +++ b/docs/Privacy.md @@ -18,6 +18,15 @@ The app: Cross-device synchronisation, when the user has more than one device, is handled by Apple Health itself. +## Feedback + +Settings → Feedback offers two rows, both user-initiated: + +- **Send feedback** opens a draft in the user's own mail client, addressed to the support mailbox. The body is prefilled with app version, build, iOS version, and device model only. The user sees and can edit the draft before sending. Nothing is sent by the app itself, and no health data is included. If no mail app is available, the support address is copied to the clipboard instead. +- **Rate LogWeight on the App Store** opens the App Store review page. No data is passed. + +Whatever the user chooses to write is processed as ordinary email by the support mailbox; it is not linked to any app-side identifier. + ## Lawful basis The lawful basis for processing under GDPR is **explicit consent**, gathered through the standard HealthKit authorisation sheet. The user can revoke consent at any time in **Settings → Health → Data Access & Devices → LogWeight**. Once revoked, future writes will fail and the app surfaces a calm prompt to re-enable. diff --git a/docs/store-screenshots/de/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/de/ipad-13/entry-after-plus-ten.png index 7e2b492..14f76fc 100644 Binary files a/docs/store-screenshots/de/ipad-13/entry-after-plus-ten.png and b/docs/store-screenshots/de/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/de/ipad-13/entry-default.png b/docs/store-screenshots/de/ipad-13/entry-default.png deleted file mode 100644 index 8adaa6b..0000000 Binary files a/docs/store-screenshots/de/ipad-13/entry-default.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/entry-keyboard-up.png b/docs/store-screenshots/de/ipad-13/entry-keyboard-up.png deleted file mode 100644 index 8adaa6b..0000000 Binary files a/docs/store-screenshots/de/ipad-13/entry-keyboard-up.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/entry-xxxl-dynamic-type.png b/docs/store-screenshots/de/ipad-13/entry-xxxl-dynamic-type.png deleted file mode 100644 index a6885fb..0000000 Binary files a/docs/store-screenshots/de/ipad-13/entry-xxxl-dynamic-type.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/history-90d-plateau.png b/docs/store-screenshots/de/ipad-13/history-90d-plateau.png index d5c3594..55979dd 100644 Binary files a/docs/store-screenshots/de/ipad-13/history-90d-plateau.png and b/docs/store-screenshots/de/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/de/ipad-13/history-chart-crosshair.png b/docs/store-screenshots/de/ipad-13/history-chart-crosshair.png deleted file mode 100644 index 29dd326..0000000 Binary files a/docs/store-screenshots/de/ipad-13/history-chart-crosshair.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/history-empty.png b/docs/store-screenshots/de/ipad-13/history-empty.png deleted file mode 100644 index b57b3e8..0000000 Binary files a/docs/store-screenshots/de/ipad-13/history-empty.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/history-list-scrolled.png b/docs/store-screenshots/de/ipad-13/history-list-scrolled.png deleted file mode 100644 index c2eb91e..0000000 Binary files a/docs/store-screenshots/de/ipad-13/history-list-scrolled.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/history-list-small-scroll.png b/docs/store-screenshots/de/ipad-13/history-list-small-scroll.png deleted file mode 100644 index 32045a1..0000000 Binary files a/docs/store-screenshots/de/ipad-13/history-list-small-scroll.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/history-with-chart-30d.png b/docs/store-screenshots/de/ipad-13/history-with-chart-30d.png deleted file mode 100644 index 73716f4..0000000 Binary files a/docs/store-screenshots/de/ipad-13/history-with-chart-30d.png and /dev/null differ diff --git a/docs/store-screenshots/de/ipad-13/settings-default.png b/docs/store-screenshots/de/ipad-13/settings-default.png index 1ecf39b..4baa418 100644 Binary files a/docs/store-screenshots/de/ipad-13/settings-default.png and b/docs/store-screenshots/de/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/de/ipad-13/settings-lbs-unit.png b/docs/store-screenshots/de/ipad-13/settings-lbs-unit.png deleted file mode 100644 index 86d2636..0000000 Binary files a/docs/store-screenshots/de/ipad-13/settings-lbs-unit.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/de/iphone-6.5/entry-after-plus-ten.png index fd9e1b7..45a5ffb 100644 Binary files a/docs/store-screenshots/de/iphone-6.5/entry-after-plus-ten.png and b/docs/store-screenshots/de/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/de/iphone-6.5/entry-default.png b/docs/store-screenshots/de/iphone-6.5/entry-default.png deleted file mode 100644 index 3bc3da3..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/entry-default.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/entry-keyboard-up.png b/docs/store-screenshots/de/iphone-6.5/entry-keyboard-up.png deleted file mode 100644 index 3bc3da3..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/entry-keyboard-up.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/entry-xxxl-dynamic-type.png b/docs/store-screenshots/de/iphone-6.5/entry-xxxl-dynamic-type.png deleted file mode 100644 index 7885d58..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/entry-xxxl-dynamic-type.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/de/iphone-6.5/history-90d-plateau.png index 8a5ba53..091f416 100644 Binary files a/docs/store-screenshots/de/iphone-6.5/history-90d-plateau.png and b/docs/store-screenshots/de/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/de/iphone-6.5/history-chart-crosshair.png b/docs/store-screenshots/de/iphone-6.5/history-chart-crosshair.png deleted file mode 100644 index 249d203..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/history-chart-crosshair.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/history-empty.png b/docs/store-screenshots/de/iphone-6.5/history-empty.png deleted file mode 100644 index 93b0f88..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/history-empty.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/history-list-scrolled.png b/docs/store-screenshots/de/iphone-6.5/history-list-scrolled.png deleted file mode 100644 index 888d435..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/history-list-scrolled.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/history-list-small-scroll.png b/docs/store-screenshots/de/iphone-6.5/history-list-small-scroll.png deleted file mode 100644 index f3745aa..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/history-list-small-scroll.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/history-with-chart-30d.png b/docs/store-screenshots/de/iphone-6.5/history-with-chart-30d.png deleted file mode 100644 index ecfc9f7..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/history-with-chart-30d.png and /dev/null differ diff --git a/docs/store-screenshots/de/iphone-6.5/settings-default.png b/docs/store-screenshots/de/iphone-6.5/settings-default.png index dc6e990..6e440d0 100644 Binary files a/docs/store-screenshots/de/iphone-6.5/settings-default.png and b/docs/store-screenshots/de/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/de/iphone-6.5/settings-lbs-unit.png b/docs/store-screenshots/de/iphone-6.5/settings-lbs-unit.png deleted file mode 100644 index e7149c4..0000000 Binary files a/docs/store-screenshots/de/iphone-6.5/settings-lbs-unit.png and /dev/null differ diff --git a/docs/store-screenshots/de/watch-series-11/watch-entry-default.png b/docs/store-screenshots/de/watch-series-11/watch-entry-default.png index 85d5b27..b80b7d7 100644 Binary files a/docs/store-screenshots/de/watch-series-11/watch-entry-default.png and b/docs/store-screenshots/de/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/de/watch-series-11/watch-history-default.png b/docs/store-screenshots/de/watch-series-11/watch-history-default.png index 352227c..8408b6e 100644 Binary files a/docs/store-screenshots/de/watch-series-11/watch-history-default.png and b/docs/store-screenshots/de/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/en-CA/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/en-CA/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..4ac2e7c Binary files /dev/null and b/docs/store-screenshots/en-CA/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/en-CA/ipad-13/history-90d-plateau.png b/docs/store-screenshots/en-CA/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..459290d Binary files /dev/null and b/docs/store-screenshots/en-CA/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/en-CA/ipad-13/settings-default.png b/docs/store-screenshots/en-CA/ipad-13/settings-default.png new file mode 100644 index 0000000..c642100 Binary files /dev/null and b/docs/store-screenshots/en-CA/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/en-CA/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/en-CA/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..eb8efe5 Binary files /dev/null and b/docs/store-screenshots/en-CA/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/en-CA/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/en-CA/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..fd0fe42 Binary files /dev/null and b/docs/store-screenshots/en-CA/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/en-CA/iphone-6.5/settings-default.png b/docs/store-screenshots/en-CA/iphone-6.5/settings-default.png new file mode 100644 index 0000000..427161e Binary files /dev/null and b/docs/store-screenshots/en-CA/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/en-CA/watch-series-11/watch-entry-default.png b/docs/store-screenshots/en-CA/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..7018c79 Binary files /dev/null and b/docs/store-screenshots/en-CA/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/en-CA/watch-series-11/watch-history-default.png b/docs/store-screenshots/en-CA/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..554e028 Binary files /dev/null and b/docs/store-screenshots/en-CA/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/en-GB/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/en-GB/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..e8ddbc2 Binary files /dev/null and b/docs/store-screenshots/en-GB/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/en-GB/ipad-13/history-90d-plateau.png b/docs/store-screenshots/en-GB/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..2f8f120 Binary files /dev/null and b/docs/store-screenshots/en-GB/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/en-GB/ipad-13/settings-default.png b/docs/store-screenshots/en-GB/ipad-13/settings-default.png new file mode 100644 index 0000000..3a1bca1 Binary files /dev/null and b/docs/store-screenshots/en-GB/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/en-GB/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/en-GB/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..72b4561 Binary files /dev/null and b/docs/store-screenshots/en-GB/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/en-GB/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/en-GB/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..acb6f3c Binary files /dev/null and b/docs/store-screenshots/en-GB/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/en-GB/iphone-6.5/settings-default.png b/docs/store-screenshots/en-GB/iphone-6.5/settings-default.png new file mode 100644 index 0000000..7343036 Binary files /dev/null and b/docs/store-screenshots/en-GB/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/en-GB/watch-series-11/watch-entry-default.png b/docs/store-screenshots/en-GB/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..7018c79 Binary files /dev/null and b/docs/store-screenshots/en-GB/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/en-GB/watch-series-11/watch-history-default.png b/docs/store-screenshots/en-GB/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..5ec1e90 Binary files /dev/null and b/docs/store-screenshots/en-GB/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/en-US/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/en-US/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..9b775c5 Binary files /dev/null and b/docs/store-screenshots/en-US/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/en-US/ipad-13/history-90d-plateau.png b/docs/store-screenshots/en-US/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..678d201 Binary files /dev/null and b/docs/store-screenshots/en-US/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/en-US/ipad-13/settings-default.png b/docs/store-screenshots/en-US/ipad-13/settings-default.png new file mode 100644 index 0000000..294d682 Binary files /dev/null and b/docs/store-screenshots/en-US/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/en-US/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/en-US/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..2934ecd Binary files /dev/null and b/docs/store-screenshots/en-US/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/en-US/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/en-US/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..a4f4cd0 Binary files /dev/null and b/docs/store-screenshots/en-US/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/en-US/iphone-6.5/settings-default.png b/docs/store-screenshots/en-US/iphone-6.5/settings-default.png new file mode 100644 index 0000000..201c2e5 Binary files /dev/null and b/docs/store-screenshots/en-US/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/en-US/watch-series-11/watch-entry-default.png b/docs/store-screenshots/en-US/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..987e3ab Binary files /dev/null and b/docs/store-screenshots/en-US/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/en-US/watch-series-11/watch-history-default.png b/docs/store-screenshots/en-US/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..870ef42 Binary files /dev/null and b/docs/store-screenshots/en-US/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/en/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/en/ipad-13/entry-after-plus-ten.png deleted file mode 100644 index c5e6a51..0000000 Binary files a/docs/store-screenshots/en/ipad-13/entry-after-plus-ten.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/entry-default.png b/docs/store-screenshots/en/ipad-13/entry-default.png deleted file mode 100644 index 18b5508..0000000 Binary files a/docs/store-screenshots/en/ipad-13/entry-default.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/entry-keyboard-up.png b/docs/store-screenshots/en/ipad-13/entry-keyboard-up.png deleted file mode 100644 index c0e9ae2..0000000 Binary files a/docs/store-screenshots/en/ipad-13/entry-keyboard-up.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/entry-xxxl-dynamic-type.png b/docs/store-screenshots/en/ipad-13/entry-xxxl-dynamic-type.png deleted file mode 100644 index 4cc973f..0000000 Binary files a/docs/store-screenshots/en/ipad-13/entry-xxxl-dynamic-type.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/history-90d-plateau.png b/docs/store-screenshots/en/ipad-13/history-90d-plateau.png deleted file mode 100644 index 0f080d5..0000000 Binary files a/docs/store-screenshots/en/ipad-13/history-90d-plateau.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/history-chart-crosshair.png b/docs/store-screenshots/en/ipad-13/history-chart-crosshair.png deleted file mode 100644 index cec9a0e..0000000 Binary files a/docs/store-screenshots/en/ipad-13/history-chart-crosshair.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/history-empty.png b/docs/store-screenshots/en/ipad-13/history-empty.png deleted file mode 100644 index 76634e3..0000000 Binary files a/docs/store-screenshots/en/ipad-13/history-empty.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/history-list-scrolled.png b/docs/store-screenshots/en/ipad-13/history-list-scrolled.png deleted file mode 100644 index 1de29ba..0000000 Binary files a/docs/store-screenshots/en/ipad-13/history-list-scrolled.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/history-list-small-scroll.png b/docs/store-screenshots/en/ipad-13/history-list-small-scroll.png deleted file mode 100644 index 497154f..0000000 Binary files a/docs/store-screenshots/en/ipad-13/history-list-small-scroll.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/history-with-chart-30d.png b/docs/store-screenshots/en/ipad-13/history-with-chart-30d.png deleted file mode 100644 index 826d5c4..0000000 Binary files a/docs/store-screenshots/en/ipad-13/history-with-chart-30d.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/settings-default.png b/docs/store-screenshots/en/ipad-13/settings-default.png deleted file mode 100644 index 7269486..0000000 Binary files a/docs/store-screenshots/en/ipad-13/settings-default.png and /dev/null differ diff --git a/docs/store-screenshots/en/ipad-13/settings-lbs-unit.png b/docs/store-screenshots/en/ipad-13/settings-lbs-unit.png deleted file mode 100644 index 0927fa6..0000000 Binary files a/docs/store-screenshots/en/ipad-13/settings-lbs-unit.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/en/iphone-6.5/entry-after-plus-ten.png deleted file mode 100644 index 5844c99..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/entry-after-plus-ten.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/entry-default.png b/docs/store-screenshots/en/iphone-6.5/entry-default.png deleted file mode 100644 index fb8b023..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/entry-default.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/entry-keyboard-up.png b/docs/store-screenshots/en/iphone-6.5/entry-keyboard-up.png deleted file mode 100644 index fb8b023..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/entry-keyboard-up.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/entry-xxxl-dynamic-type.png b/docs/store-screenshots/en/iphone-6.5/entry-xxxl-dynamic-type.png deleted file mode 100644 index 9e1b9d9..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/entry-xxxl-dynamic-type.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/en/iphone-6.5/history-90d-plateau.png deleted file mode 100644 index f4f92c3..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/history-90d-plateau.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/history-chart-crosshair.png b/docs/store-screenshots/en/iphone-6.5/history-chart-crosshair.png deleted file mode 100644 index 478945c..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/history-chart-crosshair.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/history-empty.png b/docs/store-screenshots/en/iphone-6.5/history-empty.png deleted file mode 100644 index 4571a3d..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/history-empty.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/history-list-scrolled.png b/docs/store-screenshots/en/iphone-6.5/history-list-scrolled.png deleted file mode 100644 index 5051103..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/history-list-scrolled.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/history-list-small-scroll.png b/docs/store-screenshots/en/iphone-6.5/history-list-small-scroll.png deleted file mode 100644 index 534b903..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/history-list-small-scroll.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/history-with-chart-30d.png b/docs/store-screenshots/en/iphone-6.5/history-with-chart-30d.png deleted file mode 100644 index b552682..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/history-with-chart-30d.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/settings-default.png b/docs/store-screenshots/en/iphone-6.5/settings-default.png deleted file mode 100644 index ab190f9..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/settings-default.png and /dev/null differ diff --git a/docs/store-screenshots/en/iphone-6.5/settings-lbs-unit.png b/docs/store-screenshots/en/iphone-6.5/settings-lbs-unit.png deleted file mode 100644 index ab190f9..0000000 Binary files a/docs/store-screenshots/en/iphone-6.5/settings-lbs-unit.png and /dev/null differ diff --git a/docs/store-screenshots/en/watch-series-11/watch-entry-default.png b/docs/store-screenshots/en/watch-series-11/watch-entry-default.png deleted file mode 100644 index f2ae6af..0000000 Binary files a/docs/store-screenshots/en/watch-series-11/watch-entry-default.png and /dev/null differ diff --git a/docs/store-screenshots/en/watch-series-11/watch-history-default.png b/docs/store-screenshots/en/watch-series-11/watch-history-default.png deleted file mode 100644 index 402e474..0000000 Binary files a/docs/store-screenshots/en/watch-series-11/watch-history-default.png and /dev/null differ diff --git a/docs/store-screenshots/es/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/es/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..0a4fea5 Binary files /dev/null and b/docs/store-screenshots/es/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/es/ipad-13/history-90d-plateau.png b/docs/store-screenshots/es/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..927578e Binary files /dev/null and b/docs/store-screenshots/es/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/es/ipad-13/settings-default.png b/docs/store-screenshots/es/ipad-13/settings-default.png new file mode 100644 index 0000000..47db918 Binary files /dev/null and b/docs/store-screenshots/es/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/es/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/es/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..901f6ca Binary files /dev/null and b/docs/store-screenshots/es/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/es/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/es/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..51aaa3f Binary files /dev/null and b/docs/store-screenshots/es/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/es/iphone-6.5/settings-default.png b/docs/store-screenshots/es/iphone-6.5/settings-default.png new file mode 100644 index 0000000..a0bad42 Binary files /dev/null and b/docs/store-screenshots/es/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/es/watch-series-11/watch-entry-default.png b/docs/store-screenshots/es/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..c674e8e Binary files /dev/null and b/docs/store-screenshots/es/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/es/watch-series-11/watch-history-default.png b/docs/store-screenshots/es/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..860c360 Binary files /dev/null and b/docs/store-screenshots/es/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/fr/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/fr/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..70e01af Binary files /dev/null and b/docs/store-screenshots/fr/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/fr/ipad-13/history-90d-plateau.png b/docs/store-screenshots/fr/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..ebcbb57 Binary files /dev/null and b/docs/store-screenshots/fr/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/fr/ipad-13/settings-default.png b/docs/store-screenshots/fr/ipad-13/settings-default.png new file mode 100644 index 0000000..0e0031b Binary files /dev/null and b/docs/store-screenshots/fr/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/fr/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/fr/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..5b54059 Binary files /dev/null and b/docs/store-screenshots/fr/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/fr/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/fr/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..29d07ac Binary files /dev/null and b/docs/store-screenshots/fr/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/fr/iphone-6.5/settings-default.png b/docs/store-screenshots/fr/iphone-6.5/settings-default.png new file mode 100644 index 0000000..a4b0599 Binary files /dev/null and b/docs/store-screenshots/fr/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/fr/watch-series-11/watch-entry-default.png b/docs/store-screenshots/fr/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..d43cc00 Binary files /dev/null and b/docs/store-screenshots/fr/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/fr/watch-series-11/watch-history-default.png b/docs/store-screenshots/fr/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..70bd09d Binary files /dev/null and b/docs/store-screenshots/fr/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/it/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/it/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..b1bdd9f Binary files /dev/null and b/docs/store-screenshots/it/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/it/ipad-13/history-90d-plateau.png b/docs/store-screenshots/it/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..70280d6 Binary files /dev/null and b/docs/store-screenshots/it/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/it/ipad-13/settings-default.png b/docs/store-screenshots/it/ipad-13/settings-default.png new file mode 100644 index 0000000..355bec0 Binary files /dev/null and b/docs/store-screenshots/it/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/it/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/it/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..9845989 Binary files /dev/null and b/docs/store-screenshots/it/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/it/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/it/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..9c4b791 Binary files /dev/null and b/docs/store-screenshots/it/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/it/iphone-6.5/settings-default.png b/docs/store-screenshots/it/iphone-6.5/settings-default.png new file mode 100644 index 0000000..974da03 Binary files /dev/null and b/docs/store-screenshots/it/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/it/watch-series-11/watch-entry-default.png b/docs/store-screenshots/it/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..7853885 Binary files /dev/null and b/docs/store-screenshots/it/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/it/watch-series-11/watch-history-default.png b/docs/store-screenshots/it/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..7da3cce Binary files /dev/null and b/docs/store-screenshots/it/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/ja/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/ja/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..ba1e93e Binary files /dev/null and b/docs/store-screenshots/ja/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/ja/ipad-13/history-90d-plateau.png b/docs/store-screenshots/ja/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..5c1827c Binary files /dev/null and b/docs/store-screenshots/ja/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/ja/ipad-13/settings-default.png b/docs/store-screenshots/ja/ipad-13/settings-default.png new file mode 100644 index 0000000..bf60d2c Binary files /dev/null and b/docs/store-screenshots/ja/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/ja/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/ja/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..22de11e Binary files /dev/null and b/docs/store-screenshots/ja/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/ja/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/ja/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..8710da4 Binary files /dev/null and b/docs/store-screenshots/ja/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/ja/iphone-6.5/settings-default.png b/docs/store-screenshots/ja/iphone-6.5/settings-default.png new file mode 100644 index 0000000..0f50ead Binary files /dev/null and b/docs/store-screenshots/ja/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/ja/watch-series-11/watch-entry-default.png b/docs/store-screenshots/ja/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..2c9f8d2 Binary files /dev/null and b/docs/store-screenshots/ja/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/ja/watch-series-11/watch-history-default.png b/docs/store-screenshots/ja/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..7a701c0 Binary files /dev/null and b/docs/store-screenshots/ja/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/ko/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/ko/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..5626bad Binary files /dev/null and b/docs/store-screenshots/ko/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/ko/ipad-13/history-90d-plateau.png b/docs/store-screenshots/ko/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..1d78da5 Binary files /dev/null and b/docs/store-screenshots/ko/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/ko/ipad-13/settings-default.png b/docs/store-screenshots/ko/ipad-13/settings-default.png new file mode 100644 index 0000000..4d81038 Binary files /dev/null and b/docs/store-screenshots/ko/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/ko/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/ko/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..384b199 Binary files /dev/null and b/docs/store-screenshots/ko/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/ko/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/ko/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..ee200df Binary files /dev/null and b/docs/store-screenshots/ko/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/ko/iphone-6.5/settings-default.png b/docs/store-screenshots/ko/iphone-6.5/settings-default.png new file mode 100644 index 0000000..a3a23b9 Binary files /dev/null and b/docs/store-screenshots/ko/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/ko/watch-series-11/watch-entry-default.png b/docs/store-screenshots/ko/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..cf8964a Binary files /dev/null and b/docs/store-screenshots/ko/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/ko/watch-series-11/watch-history-default.png b/docs/store-screenshots/ko/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..d10006d Binary files /dev/null and b/docs/store-screenshots/ko/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/nl/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/nl/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..8dd4551 Binary files /dev/null and b/docs/store-screenshots/nl/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/nl/ipad-13/history-90d-plateau.png b/docs/store-screenshots/nl/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..2096a9a Binary files /dev/null and b/docs/store-screenshots/nl/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/nl/ipad-13/settings-default.png b/docs/store-screenshots/nl/ipad-13/settings-default.png new file mode 100644 index 0000000..41dae09 Binary files /dev/null and b/docs/store-screenshots/nl/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/nl/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/nl/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..8160bbb Binary files /dev/null and b/docs/store-screenshots/nl/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/nl/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/nl/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..dd0df03 Binary files /dev/null and b/docs/store-screenshots/nl/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/nl/iphone-6.5/settings-default.png b/docs/store-screenshots/nl/iphone-6.5/settings-default.png new file mode 100644 index 0000000..7655e89 Binary files /dev/null and b/docs/store-screenshots/nl/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/nl/watch-series-11/watch-entry-default.png b/docs/store-screenshots/nl/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..da2dda8 Binary files /dev/null and b/docs/store-screenshots/nl/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/nl/watch-series-11/watch-history-default.png b/docs/store-screenshots/nl/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..1bcf0d4 Binary files /dev/null and b/docs/store-screenshots/nl/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/pt-BR/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/pt-BR/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..3d9c202 Binary files /dev/null and b/docs/store-screenshots/pt-BR/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/pt-BR/ipad-13/history-90d-plateau.png b/docs/store-screenshots/pt-BR/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..7ae6b38 Binary files /dev/null and b/docs/store-screenshots/pt-BR/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/pt-BR/ipad-13/settings-default.png b/docs/store-screenshots/pt-BR/ipad-13/settings-default.png new file mode 100644 index 0000000..6f4b98e Binary files /dev/null and b/docs/store-screenshots/pt-BR/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/pt-BR/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/pt-BR/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..8bac83a Binary files /dev/null and b/docs/store-screenshots/pt-BR/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/pt-BR/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/pt-BR/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..48a67c4 Binary files /dev/null and b/docs/store-screenshots/pt-BR/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/pt-BR/iphone-6.5/settings-default.png b/docs/store-screenshots/pt-BR/iphone-6.5/settings-default.png new file mode 100644 index 0000000..70f5869 Binary files /dev/null and b/docs/store-screenshots/pt-BR/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/pt-BR/watch-series-11/watch-entry-default.png b/docs/store-screenshots/pt-BR/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..9784cf0 Binary files /dev/null and b/docs/store-screenshots/pt-BR/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/pt-BR/watch-series-11/watch-history-default.png b/docs/store-screenshots/pt-BR/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..fa69d15 Binary files /dev/null and b/docs/store-screenshots/pt-BR/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/zh-Hans/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/zh-Hans/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..9c7e1c4 Binary files /dev/null and b/docs/store-screenshots/zh-Hans/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/zh-Hans/ipad-13/history-90d-plateau.png b/docs/store-screenshots/zh-Hans/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..fef55bd Binary files /dev/null and b/docs/store-screenshots/zh-Hans/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/zh-Hans/ipad-13/settings-default.png b/docs/store-screenshots/zh-Hans/ipad-13/settings-default.png new file mode 100644 index 0000000..78071cd Binary files /dev/null and b/docs/store-screenshots/zh-Hans/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/zh-Hans/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/zh-Hans/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..3c89e87 Binary files /dev/null and b/docs/store-screenshots/zh-Hans/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/zh-Hans/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/zh-Hans/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..fed408a Binary files /dev/null and b/docs/store-screenshots/zh-Hans/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/zh-Hans/iphone-6.5/settings-default.png b/docs/store-screenshots/zh-Hans/iphone-6.5/settings-default.png new file mode 100644 index 0000000..08e0741 Binary files /dev/null and b/docs/store-screenshots/zh-Hans/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/zh-Hans/watch-series-11/watch-entry-default.png b/docs/store-screenshots/zh-Hans/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..61cc358 Binary files /dev/null and b/docs/store-screenshots/zh-Hans/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/zh-Hans/watch-series-11/watch-history-default.png b/docs/store-screenshots/zh-Hans/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..10ee8d7 Binary files /dev/null and b/docs/store-screenshots/zh-Hans/watch-series-11/watch-history-default.png differ diff --git a/docs/store-screenshots/zh-Hant/ipad-13/entry-after-plus-ten.png b/docs/store-screenshots/zh-Hant/ipad-13/entry-after-plus-ten.png new file mode 100644 index 0000000..fe899cd Binary files /dev/null and b/docs/store-screenshots/zh-Hant/ipad-13/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/zh-Hant/ipad-13/history-90d-plateau.png b/docs/store-screenshots/zh-Hant/ipad-13/history-90d-plateau.png new file mode 100644 index 0000000..7d10106 Binary files /dev/null and b/docs/store-screenshots/zh-Hant/ipad-13/history-90d-plateau.png differ diff --git a/docs/store-screenshots/zh-Hant/ipad-13/settings-default.png b/docs/store-screenshots/zh-Hant/ipad-13/settings-default.png new file mode 100644 index 0000000..d8ae4b9 Binary files /dev/null and b/docs/store-screenshots/zh-Hant/ipad-13/settings-default.png differ diff --git a/docs/store-screenshots/zh-Hant/iphone-6.5/entry-after-plus-ten.png b/docs/store-screenshots/zh-Hant/iphone-6.5/entry-after-plus-ten.png new file mode 100644 index 0000000..7bcf2ec Binary files /dev/null and b/docs/store-screenshots/zh-Hant/iphone-6.5/entry-after-plus-ten.png differ diff --git a/docs/store-screenshots/zh-Hant/iphone-6.5/history-90d-plateau.png b/docs/store-screenshots/zh-Hant/iphone-6.5/history-90d-plateau.png new file mode 100644 index 0000000..9fb1e93 Binary files /dev/null and b/docs/store-screenshots/zh-Hant/iphone-6.5/history-90d-plateau.png differ diff --git a/docs/store-screenshots/zh-Hant/iphone-6.5/settings-default.png b/docs/store-screenshots/zh-Hant/iphone-6.5/settings-default.png new file mode 100644 index 0000000..1bade08 Binary files /dev/null and b/docs/store-screenshots/zh-Hant/iphone-6.5/settings-default.png differ diff --git a/docs/store-screenshots/zh-Hant/watch-series-11/watch-entry-default.png b/docs/store-screenshots/zh-Hant/watch-series-11/watch-entry-default.png new file mode 100644 index 0000000..7f81caf Binary files /dev/null and b/docs/store-screenshots/zh-Hant/watch-series-11/watch-entry-default.png differ diff --git a/docs/store-screenshots/zh-Hant/watch-series-11/watch-history-default.png b/docs/store-screenshots/zh-Hant/watch-series-11/watch-history-default.png new file mode 100644 index 0000000..fc29bf2 Binary files /dev/null and b/docs/store-screenshots/zh-Hant/watch-series-11/watch-history-default.png differ diff --git a/project.yml b/project.yml index c2493c1..1a471eb 100644 --- a/project.yml +++ b/project.yml @@ -21,7 +21,7 @@ settings: DEVELOPMENT_TEAM: "A8L9TRSZCR" CODE_SIGN_STYLE: Automatic VERSIONING_SYSTEM: apple-generic - MARKETING_VERSION: "0.5.0" # x-release-please-version + MARKETING_VERSION: "1.0.0" # x-release-please-version packages: LogWeightCore: