diff --git a/Localizable.xcstrings b/Localizable.xcstrings index 3939f558..5e9c2fc4 100644 --- a/Localizable.xcstrings +++ b/Localizable.xcstrings @@ -1387,9 +1387,15 @@ }, "Remove daylight gain/loss" : { "localizations" : { - "it" : { + "en" : { "stringUnit" : { "state" : "translated", + "value" : "Remove daylight loss" + } + }, + "it" : { + "stringUnit" : { + "state" : "needs_review", "value" : "Rimuovere il guadagno/perdita della luce diurna" } } diff --git a/Solstice/Charts/AnnualDaylightChart.swift b/Solstice/Charts/AnnualDaylightChart.swift index 42d24310..1f137dfc 100644 --- a/Solstice/Charts/AnnualDaylightChart.swift +++ b/Solstice/Charts/AnnualDaylightChart.swift @@ -25,11 +25,11 @@ struct AnnualDaylightChart: View { var body: some View { Chart { ForEach(monthlySolars, id: \.date) { solar in - let sunrise = solar.safeSunrise - let sunset = solar.safeSunset + let sunrise = solar.safeSunrise.withTimeZoneAdjustment(for: location.timeZone) + let sunset = solar.safeSunset.withTimeZoneAdjustment(for: location.timeZone) - if let astronomicalSunrise = solar.astronomicalSunrise, - let astronomicalSunset = solar.astronomicalSunset { + if let astronomicalSunrise = solar.astronomicalSunrise?.withTimeZoneAdjustment(for: location.timeZone), + let astronomicalSunset = solar.astronomicalSunset?.withTimeZoneAdjustment(for: location.timeZone) { BarMark( x: .value("Astronomical Twilight", solar.date, unit: .month), yStart: .value("Astronomical Sunrise", max(0, solar.startOfDay.distance(to: astronomicalSunrise))), @@ -38,8 +38,8 @@ struct AnnualDaylightChart: View { .foregroundStyle(by: .value("Phase", Solar.Phase.astronomical)) } - if let nauticalSunrise = solar.nauticalSunrise, - let nauticalSunset = solar.nauticalSunset { + if let nauticalSunrise = solar.nauticalSunrise?.withTimeZoneAdjustment(for: location.timeZone), + let nauticalSunset = solar.nauticalSunset?.withTimeZoneAdjustment(for: location.timeZone) { BarMark( x: .value("Nautical Twilight", solar.date, unit: .month), yStart: .value("Nautical Sunrise", max(0, solar.startOfDay.distance(to: nauticalSunrise))), @@ -48,8 +48,8 @@ struct AnnualDaylightChart: View { .foregroundStyle(by: .value("Phase", Solar.Phase.nautical)) } - if let civilSunrise = solar.civilSunrise, - let civilSunset = solar.civilSunset { + if let civilSunrise = solar.civilSunrise?.withTimeZoneAdjustment(for: location.timeZone), + let civilSunset = solar.civilSunset?.withTimeZoneAdjustment(for: location.timeZone) { BarMark( x: .value("Civil Twilight", solar.date, unit: .month), yStart: .value("Civil Sunrise", max(0, solar.startOfDay.distance(to: civilSunrise))), @@ -88,7 +88,6 @@ struct AnnualDaylightChart: View { } } } - .environment(\.timeZone, location.timeZone) } } diff --git a/Solstice/Charts/DaylightChart.swift b/Solstice/Charts/DaylightChart.swift index 74b579ca..ef064150 100644 --- a/Solstice/Charts/DaylightChart.swift +++ b/Solstice/Charts/DaylightChart.swift @@ -330,7 +330,7 @@ extension DaylightChart { func scrub(to point: CGPoint, in geo: GeometryProxy, proxy: ChartProxy) { var start: Double = 0 - if #available(iOS 17, macOS 13, watchOS 10, *) { + if #available(iOS 17, macOS 14, watchOS 10, visionOS 1.0, *) { if let plotFrame = proxy.plotFrame { start = geo[plotFrame].origin.x } diff --git a/Solstice/Equinox and Solstice Info View/EquinoxAndSolsticeInfoView.swift b/Solstice/Equinox and Solstice Info View/EquinoxAndSolsticeInfoView.swift index 8e7d9eb8..3de6b1d3 100644 --- a/Solstice/Equinox and Solstice Info View/EquinoxAndSolsticeInfoView.swift +++ b/Solstice/Equinox and Solstice Info View/EquinoxAndSolsticeInfoView.swift @@ -74,6 +74,10 @@ fileprivate struct Selection: Codable, Hashable { } } +#if os(iOS) +extension NSBundleResourceRequest: @unchecked Sendable {} +#endif + struct EquinoxAndSolsticeInfoView: View { @State private var selection: Selection = Selection() #if os(iOS) diff --git a/Solstice/Helper Views/ContentToggle.swift b/Solstice/Helper Views/ContentToggle.swift index 7a03f3c4..778f16b1 100644 --- a/Solstice/Helper Views/ContentToggle.swift +++ b/Solstice/Helper Views/ContentToggle.swift @@ -15,7 +15,7 @@ struct ContentToggle: View { HStack { content(showToggledContent) .modify { content in - if #available(iOS 17, macOS 13, watchOS 10, *) { + if #available(iOS 17, macOS 14, watchOS 10, *) { content.transition(.blurReplace) } else { content @@ -32,7 +32,7 @@ struct ContentToggle: View { #Preview { ContentToggle(showToggledContent: true) { showContent in if showContent { - Text("Content #1") + Text(verbatim: "Content #1") .font(.headline) } else { Text("Content #2") diff --git a/Solstice/Helpers/CurrentLocation.swift b/Solstice/Helpers/CurrentLocation.swift index fc380033..a4eb7dfe 100644 --- a/Solstice/Helpers/CurrentLocation.swift +++ b/Solstice/Helpers/CurrentLocation.swift @@ -70,12 +70,10 @@ extension CurrentLocation { let reverseGeocoded = try? await geocoder.reverseGeocodeLocation(location) if let firstResult = reverseGeocoded?.first { - withAnimation { - placemark = firstResult - title = firstResult.locality - subtitle = firstResult.country - timeZoneIdentifier = firstResult.timeZone?.identifier - } + placemark = firstResult + title = firstResult.locality + subtitle = firstResult.country + timeZoneIdentifier = firstResult.timeZone?.identifier } } diff --git a/Solstice/List View/DaylightSummaryRow.swift b/Solstice/List View/DaylightSummaryRow.swift index b83972e6..aab927c1 100644 --- a/Solstice/List View/DaylightSummaryRow.swift +++ b/Solstice/List View/DaylightSummaryRow.swift @@ -78,31 +78,40 @@ struct DaylightSummaryRow: View { .symbolVariant(.fill) } - Text(location.title ?? "Current location") - .modify { content in - if #available(iOS 17, macOS 13, watchOS 10, *) { - content.transition(.blurReplace) - } else { - content - } + Group { + if let title = location.title { + Text(verbatim: title) + .id(location.title) + } else { + Text("Current location") } - .lineLimit(2) + } + .modify { content in + if #available(iOS 17, macOS 14, watchOS 10, *) { + content.transition(.blurReplace) + } else { + content.transition(.scale) + } + } + .lineLimit(2) } if let subtitle, !subtitle.isEmpty { Text(subtitle) + .id(subtitle) .foregroundStyle(.secondary) .font(.footnote) .modify { content in - if #available(iOS 17, macOS 13, watchOS 10, *) { + if #available(iOS 17, macOS 14, watchOS 10, *) { content.transition(.blurReplace) } else { - content + content.transition(.scale) } } } } + .animation(.default, value: location.title) Spacer() diff --git a/Solstice/Settings/NotificationSettings.swift b/Solstice/Settings/NotificationSettings.swift index de64b5c3..0c8961d0 100644 --- a/Solstice/Settings/NotificationSettings.swift +++ b/Solstice/Settings/NotificationSettings.swift @@ -190,6 +190,7 @@ struct NotificationPreview: View { Text(bodyContent).font(.footnote.leading(.tight)) .fixedSize(horizontal: false, vertical: true) .lineLimit(4) + .contentTransition(.interpolate) } Spacer(minLength: 0) @@ -198,6 +199,7 @@ struct NotificationPreview: View { .padding(.horizontal, 12) .background(.regularMaterial) .cornerRadius(12) + .animation(.default, value: bodyContent) } } diff --git a/Widget/Countdown Widget/CountdownWidgetView.swift b/Widget/Countdown Widget/CountdownWidgetView.swift index dd7e0f2e..b9c6be5a 100644 --- a/Widget/Countdown Widget/CountdownWidgetView.swift +++ b/Widget/Countdown Widget/CountdownWidgetView.swift @@ -115,7 +115,7 @@ extension CountdownWidgetView { } } -#if !os(watchOS) +#if os(iOS) #Preview( "Countdown (System Small)", as: WidgetFamily.systemSmall, diff --git a/Widget/Overview Widget/OverviewWidget.swift b/Widget/Overview Widget/OverviewWidget.swift index 131978de..a7a9aea6 100644 --- a/Widget/Overview Widget/OverviewWidget.swift +++ b/Widget/Overview Widget/OverviewWidget.swift @@ -28,6 +28,5 @@ struct OverviewWidget: Widget { .configurationDisplayName("Daylight Today") .description("See today’s daylight length, how it compares to yesterday, and sunrise/sunset times.") .supportedFamilies(OverviewWidget.supportedFamilies) - .contentMarginsDisabled() } } diff --git a/Widget/Overview Widget/OverviewWidgetView.swift b/Widget/Overview Widget/OverviewWidgetView.swift index 2609822c..905194df 100644 --- a/Widget/Overview Widget/OverviewWidgetView.swift +++ b/Widget/Overview Widget/OverviewWidgetView.swift @@ -162,12 +162,10 @@ struct OverviewWidgetView: View { .symbolRenderingMode(.hierarchical) #endif } - .padding() .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) } } else { WidgetMissingLocationView() - .padding() .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading) } } @@ -175,7 +173,7 @@ struct OverviewWidgetView: View { } } -#if !os(watchOS) +#if os(iOS) #Preview( "Overview (System Small)", as: WidgetFamily.systemSmall, diff --git a/Widget/Solar Chart Widget/SolarChartWidget.swift b/Widget/Solar Chart Widget/SolarChartWidget.swift index 9ab42776..c0d0ecb9 100644 --- a/Widget/Solar Chart Widget/SolarChartWidget.swift +++ b/Widget/Solar Chart Widget/SolarChartWidget.swift @@ -22,6 +22,5 @@ struct SolarChartWidget: Widget { .configurationDisplayName("Solar Chart") .description("Follow the sun's journey throughout the day") .supportedFamilies(Self.supportedFamilies) - .contentMarginsDisabled() } } diff --git a/Widget/Solar Chart Widget/SolarChartWidgetView.swift b/Widget/Solar Chart Widget/SolarChartWidgetView.swift index 01900430..47b09d4c 100644 --- a/Widget/Solar Chart Widget/SolarChartWidgetView.swift +++ b/Widget/Solar Chart Widget/SolarChartWidgetView.swift @@ -10,8 +10,6 @@ import WidgetKit import Solar struct SolarChartWidgetView: View { - @Environment(\.widgetContentMargins) var contentMargins - var entry: SolsticeWidgetTimelineEntry var solar: Solar? { @@ -50,7 +48,6 @@ struct SolarChartWidgetView: View { .font(.caption) .widgetAccentable() .contentTransition(.numericText()) - .padding(contentMargins) DaylightChart( solar: solar, @@ -58,13 +55,12 @@ struct SolarChartWidgetView: View { eventTypes: [], includesSummaryTitle: false, markSize: 3, - yScale: -1.0...2.0 + yScale: -1.0...1.5 ) .padding(.horizontal, -1) } } else { WidgetMissingLocationView() - .padding(contentMargins) } } .frame(maxWidth: .infinity, maxHeight: .infinity) diff --git a/Widget/Widget.swift b/Widget/Widget.swift index dcc39899..2cf838c1 100644 --- a/Widget/Widget.swift +++ b/Widget/Widget.swift @@ -5,10 +5,8 @@ // Created by Daniel Eden on 19/02/2023. // -import WidgetKit -import SwiftUI -import Intents -import Solar +import Foundation +import CoreLocation struct SolsticeWidgetLocation: AnyLocation { var title: String? @@ -29,7 +27,7 @@ struct SolsticeWidgetLocation: AnyLocation { static let defaultLocation = SolsticeWidgetLocation(title: "London", subtitle: "United Kingdom", - timeZoneIdentifier: "GMT", + timeZoneIdentifier: "Europe/London", latitude: 51.5072, longitude: -0.1276) }