From 74b90ce6339520e2a1d52a24d7773bf1fbeb9af3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Apr 2026 14:11:00 +0000 Subject: [PATCH 1/7] Skip negative top padding when Reduce Transparency is enabled When the iOS "Reduce Transparency" accessibility setting is on, the navigation bar background becomes opaque, clipping sheet content that uses negative padding/offset to sit underneath it. Conditionally set the value to 0 so the title is fully visible. https://claude.ai/code/session_01RSp49a1PyMG7RXLgw97C7N --- Ruddarr/Views/Activity/QueueItemSheet.swift | 3 ++- Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift | 3 ++- Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift | 3 ++- Ruddarr/Views/Shared/MediaEventSheet.swift | 3 ++- Ruddarr/Views/Shared/MediaFileSheet.swift | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Ruddarr/Views/Activity/QueueItemSheet.swift b/Ruddarr/Views/Activity/QueueItemSheet.swift index d827f8d7..24a5a601 100644 --- a/Ruddarr/Views/Activity/QueueItemSheet.swift +++ b/Ruddarr/Views/Activity/QueueItemSheet.swift @@ -8,6 +8,7 @@ struct QueueItemSheet: View { @Environment(\.dismiss) private var dismiss @Environment(\.openURL) private var openURL @Environment(\.deviceType) private var deviceType + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @State private var downloadProgress: Float = 0 @@ -50,7 +51,7 @@ struct QueueItemSheet: View { #if os(macOS) .padding(.top, 24) #else - .offset(y: -45) + .offset(y: reduceTransparency ? 0 : -45) #endif } .toolbar { diff --git a/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift b/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift index 31f612e8..a19afcb8 100644 --- a/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift +++ b/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift @@ -10,6 +10,7 @@ struct MovieReleaseSheet: View { @Environment(\.dismiss) private var dismiss @Environment(\.deviceType) private var deviceType + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @State private var showGrabConfirmation: Bool = false @@ -35,7 +36,7 @@ struct MovieReleaseSheet: View { #if os(macOS) .padding(.top, 24) #else - .padding(.top, -45) + .padding(.top, reduceTransparency ? 0 : -45) #endif } .toolbar { diff --git a/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift b/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift index 95647482..7dad21c7 100644 --- a/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift +++ b/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift @@ -12,6 +12,7 @@ struct SeriesReleaseSheet: View { @Environment(\.dismiss) private var dismiss @Environment(\.deviceType) private var deviceType + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @State private var showGrabConfirmation: Bool = false @@ -37,7 +38,7 @@ struct SeriesReleaseSheet: View { #if os(macOS) .padding(.top, 24) #else - .padding(.top, -45) + .padding(.top, reduceTransparency ? 0 : -45) #endif } .toolbar { diff --git a/Ruddarr/Views/Shared/MediaEventSheet.swift b/Ruddarr/Views/Shared/MediaEventSheet.swift index be85d948..7da47613 100644 --- a/Ruddarr/Views/Shared/MediaEventSheet.swift +++ b/Ruddarr/Views/Shared/MediaEventSheet.swift @@ -7,6 +7,7 @@ struct MediaEventSheet: View { @EnvironmentObject var settings: AppSettings @Environment(\.dismiss) private var dismiss + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency var body: some View { // swiftlint:disable:next closure_body_length @@ -53,7 +54,7 @@ struct MediaEventSheet: View { #if os(macOS) .padding(.top, 24) #else - .offset(y: -45) + .offset(y: reduceTransparency ? 0 : -45) #endif } .toolbar { diff --git a/Ruddarr/Views/Shared/MediaFileSheet.swift b/Ruddarr/Views/Shared/MediaFileSheet.swift index 61e7129d..95a30e77 100644 --- a/Ruddarr/Views/Shared/MediaFileSheet.swift +++ b/Ruddarr/Views/Shared/MediaFileSheet.swift @@ -5,6 +5,7 @@ struct MediaFileSheet: View { var runtime: Int @Environment(\.dismiss) private var dismiss + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency var body: some View { NavigationStack { @@ -17,7 +18,7 @@ struct MediaFileSheet: View { Spacer().frame(height: 42) } - .padding(.top, -52) + .padding(.top, reduceTransparency ? 0 : -52) .scenePadding(.horizontal) } #if os(macOS) From 7d43004956e608af2cb93eb01e69400b956d94f4 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 8 Apr 2026 14:14:19 +0000 Subject: [PATCH 2/7] Apply same Reduce Transparency fix to remaining sheets and forms Covers MovieEditView, SeriesEditView, MoviePreviewView (sheet form), SeriesPreviewView (sheet form), MediaDeleteSheet, and TaskRemovalView. https://claude.ai/code/session_01RSp49a1PyMG7RXLgw97C7N --- Ruddarr/Views/Activity/TaskRemovalView.swift | 3 ++- Ruddarr/Views/Movies/MovieEditView.swift | 3 ++- Ruddarr/Views/Movies/Search/MoviePreviewView.swift | 3 ++- Ruddarr/Views/Series/Search/SeriesPreviewView.swift | 3 ++- Ruddarr/Views/Series/SeriesEditView.swift | 3 ++- Ruddarr/Views/Shared/MediaDeleteSheet.swift | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Ruddarr/Views/Activity/TaskRemovalView.swift b/Ruddarr/Views/Activity/TaskRemovalView.swift index f31c5c41..9734f87b 100644 --- a/Ruddarr/Views/Activity/TaskRemovalView.swift +++ b/Ruddarr/Views/Activity/TaskRemovalView.swift @@ -12,6 +12,7 @@ struct TaskRemovalView: View { @State private var isWorking: Bool = false @EnvironmentObject var settings: AppSettings + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency var body: some View { Form { @@ -33,7 +34,7 @@ struct TaskRemovalView: View { } .formStyle(.grouped) #if os(iOS) - .padding(.top, -20) + .padding(.top, reduceTransparency ? 0 : -20) #endif .toolbarTitleDisplayMode(.inline) .toolbar { diff --git a/Ruddarr/Views/Movies/MovieEditView.swift b/Ruddarr/Views/Movies/MovieEditView.swift index 44191b7a..13fdf57e 100644 --- a/Ruddarr/Views/Movies/MovieEditView.swift +++ b/Ruddarr/Views/Movies/MovieEditView.swift @@ -11,6 +11,7 @@ struct MovieEditView: View { @Environment(RadarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @State private var showConfirmation: Bool = false @State private var savedChanges: Bool = false @@ -19,7 +20,7 @@ struct MovieEditView: View { var body: some View { MovieForm(movie: $movie) #if os(iOS) - .padding(.top, -20) + .padding(.top, reduceTransparency ? 0 : -20) #endif .navigationTitle(movie.title) .safeNavigationBarTitleDisplayMode(.inline) diff --git a/Ruddarr/Views/Movies/Search/MoviePreviewView.swift b/Ruddarr/Views/Movies/Search/MoviePreviewView.swift index f19c2fb4..7d19d2cd 100644 --- a/Ruddarr/Views/Movies/Search/MoviePreviewView.swift +++ b/Ruddarr/Views/Movies/Search/MoviePreviewView.swift @@ -11,6 +11,7 @@ struct MoviePreviewView: View { @Environment(RadarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss @Environment(\.deviceType) private var deviceType + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @AppStorage("movieSort", store: dependencies.store) var movieSort: MovieSort = .init() @AppStorage("movieDefaults", store: dependencies.store) var movieDefaults: MovieDefaults = .init() @@ -42,7 +43,7 @@ struct MoviePreviewView: View { toolbarSaveButton } #if os(iOS) - .padding(.top, -25) + .padding(.top, reduceTransparency ? 0 : -25) #endif } .presentationDetents(dynamic: [deviceType == .phone ? .medium : .large]) diff --git a/Ruddarr/Views/Series/Search/SeriesPreviewView.swift b/Ruddarr/Views/Series/Search/SeriesPreviewView.swift index ebc39f86..005e49b5 100644 --- a/Ruddarr/Views/Series/Search/SeriesPreviewView.swift +++ b/Ruddarr/Views/Series/Search/SeriesPreviewView.swift @@ -11,6 +11,7 @@ struct SeriesPreviewView: View { @Environment(SonarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss @Environment(\.deviceType) private var deviceType + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @AppStorage("seriesSort", store: dependencies.store) var seriesSort: SeriesSort = .init() @AppStorage("seriesDefaults", store: dependencies.store) var seriesDefaults: SeriesDefaults = .init() @@ -43,7 +44,7 @@ struct SeriesPreviewView: View { toolbarSaveButton } #if os(iOS) - .padding(.top, -25) + .padding(.top, reduceTransparency ? 0 : -25) #endif } .presentationDetents(dynamic: [deviceType == .phone ? .medium : .large]) diff --git a/Ruddarr/Views/Series/SeriesEditView.swift b/Ruddarr/Views/Series/SeriesEditView.swift index fa21cb49..ead4e1fa 100644 --- a/Ruddarr/Views/Series/SeriesEditView.swift +++ b/Ruddarr/Views/Series/SeriesEditView.swift @@ -11,6 +11,7 @@ struct SeriesEditView: View { @Environment(SonarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @State private var showConfirmation: Bool = false @State private var savedChanges: Bool = false @@ -19,7 +20,7 @@ struct SeriesEditView: View { var body: some View { SeriesForm(series: $series) #if os(iOS) - .padding(.top, -20) + .padding(.top, reduceTransparency ? 0 : -20) #endif .navigationTitle(series.title) .safeNavigationBarTitleDisplayMode(.inline) diff --git a/Ruddarr/Views/Shared/MediaDeleteSheet.swift b/Ruddarr/Views/Shared/MediaDeleteSheet.swift index 4c581139..f5e954e1 100644 --- a/Ruddarr/Views/Shared/MediaDeleteSheet.swift +++ b/Ruddarr/Views/Shared/MediaDeleteSheet.swift @@ -10,6 +10,7 @@ struct MediaDeleteSheet: View { @EnvironmentObject var settings: AppSettings @Environment(\.dismiss) private var dismiss + @Environment(\.accessibilityReduceTransparency) private var reduceTransparency var body: some View { NavigationStack { @@ -34,7 +35,7 @@ struct MediaDeleteSheet: View { toolbarDeleteButton } #if os(iOS) - .padding(.top, -25) + .padding(.top, reduceTransparency ? 0 : -25) #endif } } From 7999bc937356a91e959f7f36749b610cb2e7d469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till=20Kru=CC=88ss?= Date: Wed, 8 Apr 2026 07:28:23 -0700 Subject: [PATCH 3/7] consolidate lines --- Ruddarr/Views/Activity/QueueItemSheet.swift | 7 +------ Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift | 6 +----- Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift | 6 +----- Ruddarr/Views/Shared/MediaEventSheet.swift | 7 ++----- 4 files changed, 5 insertions(+), 21 deletions(-) diff --git a/Ruddarr/Views/Activity/QueueItemSheet.swift b/Ruddarr/Views/Activity/QueueItemSheet.swift index 24a5a601..4346b437 100644 --- a/Ruddarr/Views/Activity/QueueItemSheet.swift +++ b/Ruddarr/Views/Activity/QueueItemSheet.swift @@ -15,7 +15,6 @@ struct QueueItemSheet: View { let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect() var body: some View { - // swiftlint:disable:next closure_body_length NavigationStack { ScrollView { VStack(alignment: .leading) { @@ -48,11 +47,7 @@ struct QueueItemSheet: View { details } .scenePadding(.horizontal) - #if os(macOS) - .padding(.top, 24) - #else - .offset(y: reduceTransparency ? 0 : -45) - #endif + .padding(.top, deviceType == .mac ? 24 : (reduceTransparency ? 0 : -45)) } .toolbar { ToolbarItem(placement: .destructiveAction) { diff --git a/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift b/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift index a19afcb8..ca44aa56 100644 --- a/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift +++ b/Ruddarr/Views/Movies/Releases/MovieReleaseSheet.swift @@ -33,11 +33,7 @@ struct MovieReleaseSheet: View { details } .scenePadding(.horizontal) - #if os(macOS) - .padding(.top, 24) - #else - .padding(.top, reduceTransparency ? 0 : -45) - #endif + .padding(.top, deviceType == .mac ? 24 : (reduceTransparency ? 0 : -45)) } .toolbar { ToolbarItem(placement: .destructiveAction) { diff --git a/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift b/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift index 7dad21c7..7bde6695 100644 --- a/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift +++ b/Ruddarr/Views/Series/Releases/SeriesReleaseSheet.swift @@ -35,11 +35,7 @@ struct SeriesReleaseSheet: View { details } .scenePadding(.horizontal) - #if os(macOS) - .padding(.top, 24) - #else - .padding(.top, reduceTransparency ? 0 : -45) - #endif + .padding(.top, deviceType == .mac ? 24 : (reduceTransparency ? 0 : -45)) } .toolbar { ToolbarItem(placement: .destructiveAction) { diff --git a/Ruddarr/Views/Shared/MediaEventSheet.swift b/Ruddarr/Views/Shared/MediaEventSheet.swift index 7da47613..c2f01e2c 100644 --- a/Ruddarr/Views/Shared/MediaEventSheet.swift +++ b/Ruddarr/Views/Shared/MediaEventSheet.swift @@ -7,6 +7,7 @@ struct MediaEventSheet: View { @EnvironmentObject var settings: AppSettings @Environment(\.dismiss) private var dismiss + @Environment(\.deviceType) private var deviceType @Environment(\.accessibilityReduceTransparency) private var reduceTransparency var body: some View { @@ -51,11 +52,7 @@ struct MediaEventSheet: View { Spacer() } .scenePadding(.horizontal) - #if os(macOS) - .padding(.top, 24) - #else - .offset(y: reduceTransparency ? 0 : -45) - #endif + .padding(.top, deviceType == .mac ? 24 : (reduceTransparency ? 0 : -45)) } .toolbar { ToolbarItem(placement: .destructiveAction) { From 146ba2106e88a0627c1dc2f969b12b12dc269d34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till=20Kru=CC=88ss?= Date: Wed, 8 Apr 2026 07:31:10 -0700 Subject: [PATCH 4/7] drop --- Ruddarr/Views/Movies/Search/MoviePreviewView.swift | 3 +-- Ruddarr/Views/Series/Search/SeriesPreviewView.swift | 3 +-- Ruddarr/Views/Shared/MediaDeleteSheet.swift | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Ruddarr/Views/Movies/Search/MoviePreviewView.swift b/Ruddarr/Views/Movies/Search/MoviePreviewView.swift index 7d19d2cd..f19c2fb4 100644 --- a/Ruddarr/Views/Movies/Search/MoviePreviewView.swift +++ b/Ruddarr/Views/Movies/Search/MoviePreviewView.swift @@ -11,7 +11,6 @@ struct MoviePreviewView: View { @Environment(RadarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss @Environment(\.deviceType) private var deviceType - @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @AppStorage("movieSort", store: dependencies.store) var movieSort: MovieSort = .init() @AppStorage("movieDefaults", store: dependencies.store) var movieDefaults: MovieDefaults = .init() @@ -43,7 +42,7 @@ struct MoviePreviewView: View { toolbarSaveButton } #if os(iOS) - .padding(.top, reduceTransparency ? 0 : -25) + .padding(.top, -25) #endif } .presentationDetents(dynamic: [deviceType == .phone ? .medium : .large]) diff --git a/Ruddarr/Views/Series/Search/SeriesPreviewView.swift b/Ruddarr/Views/Series/Search/SeriesPreviewView.swift index 005e49b5..ebc39f86 100644 --- a/Ruddarr/Views/Series/Search/SeriesPreviewView.swift +++ b/Ruddarr/Views/Series/Search/SeriesPreviewView.swift @@ -11,7 +11,6 @@ struct SeriesPreviewView: View { @Environment(SonarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss @Environment(\.deviceType) private var deviceType - @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @AppStorage("seriesSort", store: dependencies.store) var seriesSort: SeriesSort = .init() @AppStorage("seriesDefaults", store: dependencies.store) var seriesDefaults: SeriesDefaults = .init() @@ -44,7 +43,7 @@ struct SeriesPreviewView: View { toolbarSaveButton } #if os(iOS) - .padding(.top, reduceTransparency ? 0 : -25) + .padding(.top, -25) #endif } .presentationDetents(dynamic: [deviceType == .phone ? .medium : .large]) diff --git a/Ruddarr/Views/Shared/MediaDeleteSheet.swift b/Ruddarr/Views/Shared/MediaDeleteSheet.swift index f5e954e1..4c581139 100644 --- a/Ruddarr/Views/Shared/MediaDeleteSheet.swift +++ b/Ruddarr/Views/Shared/MediaDeleteSheet.swift @@ -10,7 +10,6 @@ struct MediaDeleteSheet: View { @EnvironmentObject var settings: AppSettings @Environment(\.dismiss) private var dismiss - @Environment(\.accessibilityReduceTransparency) private var reduceTransparency var body: some View { NavigationStack { @@ -35,7 +34,7 @@ struct MediaDeleteSheet: View { toolbarDeleteButton } #if os(iOS) - .padding(.top, reduceTransparency ? 0 : -25) + .padding(.top, -25) #endif } } From 85b7c53fb11f1164759008decff4daae90502613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till=20Kru=CC=88ss?= Date: Wed, 8 Apr 2026 07:33:00 -0700 Subject: [PATCH 5/7] revert --- Ruddarr/Views/Activity/TaskRemovalView.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Ruddarr/Views/Activity/TaskRemovalView.swift b/Ruddarr/Views/Activity/TaskRemovalView.swift index 9734f87b..45b5b660 100644 --- a/Ruddarr/Views/Activity/TaskRemovalView.swift +++ b/Ruddarr/Views/Activity/TaskRemovalView.swift @@ -12,7 +12,6 @@ struct TaskRemovalView: View { @State private var isWorking: Bool = false @EnvironmentObject var settings: AppSettings - @Environment(\.accessibilityReduceTransparency) private var reduceTransparency var body: some View { Form { @@ -34,7 +33,7 @@ struct TaskRemovalView: View { } .formStyle(.grouped) #if os(iOS) - .padding(.top, reduceTransparency ? 0 : -20) + .padding(.top, -25) #endif .toolbarTitleDisplayMode(.inline) .toolbar { From b3d1925bbcb78397b68d6e9f3720f8aafcf1fa00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till=20Kru=CC=88ss?= Date: Wed, 8 Apr 2026 07:37:26 -0700 Subject: [PATCH 6/7] revert --- Ruddarr/Views/Movies/MovieEditView.swift | 3 +-- Ruddarr/Views/Series/SeriesEditView.swift | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Ruddarr/Views/Movies/MovieEditView.swift b/Ruddarr/Views/Movies/MovieEditView.swift index 13fdf57e..44191b7a 100644 --- a/Ruddarr/Views/Movies/MovieEditView.swift +++ b/Ruddarr/Views/Movies/MovieEditView.swift @@ -11,7 +11,6 @@ struct MovieEditView: View { @Environment(RadarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss - @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @State private var showConfirmation: Bool = false @State private var savedChanges: Bool = false @@ -20,7 +19,7 @@ struct MovieEditView: View { var body: some View { MovieForm(movie: $movie) #if os(iOS) - .padding(.top, reduceTransparency ? 0 : -20) + .padding(.top, -20) #endif .navigationTitle(movie.title) .safeNavigationBarTitleDisplayMode(.inline) diff --git a/Ruddarr/Views/Series/SeriesEditView.swift b/Ruddarr/Views/Series/SeriesEditView.swift index ead4e1fa..fa21cb49 100644 --- a/Ruddarr/Views/Series/SeriesEditView.swift +++ b/Ruddarr/Views/Series/SeriesEditView.swift @@ -11,7 +11,6 @@ struct SeriesEditView: View { @Environment(SonarrInstance.self) private var instance @Environment(\.dismiss) private var dismiss - @Environment(\.accessibilityReduceTransparency) private var reduceTransparency @State private var showConfirmation: Bool = false @State private var savedChanges: Bool = false @@ -20,7 +19,7 @@ struct SeriesEditView: View { var body: some View { SeriesForm(series: $series) #if os(iOS) - .padding(.top, reduceTransparency ? 0 : -20) + .padding(.top, -20) #endif .navigationTitle(series.title) .safeNavigationBarTitleDisplayMode(.inline) From 054f2c9aab8a32c8022f439c89bb1079a0a6f53f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Till=20Kru=CC=88ss?= Date: Wed, 8 Apr 2026 07:38:35 -0700 Subject: [PATCH 7/7] revert --- Ruddarr/Views/Activity/TaskRemovalView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ruddarr/Views/Activity/TaskRemovalView.swift b/Ruddarr/Views/Activity/TaskRemovalView.swift index 45b5b660..f31c5c41 100644 --- a/Ruddarr/Views/Activity/TaskRemovalView.swift +++ b/Ruddarr/Views/Activity/TaskRemovalView.swift @@ -33,7 +33,7 @@ struct TaskRemovalView: View { } .formStyle(.grouped) #if os(iOS) - .padding(.top, -25) + .padding(.top, -20) #endif .toolbarTitleDisplayMode(.inline) .toolbar {