diff --git a/Yattee/Views/Components/SubscriptionDestinationMenu.swift b/Yattee/Views/Components/SubscriptionDestinationMenu.swift index 1bb22886..115a798e 100644 --- a/Yattee/Views/Components/SubscriptionDestinationMenu.swift +++ b/Yattee/Views/Components/SubscriptionDestinationMenu.swift @@ -367,8 +367,6 @@ struct SubscriptionDestinationPicker: View { var body: some View { ZStack { - Color.black.ignoresSafeArea() - VStack(alignment: .leading, spacing: 24) { Text(String(localized: "channel.menu.subscribeOn")) .font(.title2.bold()) @@ -395,6 +393,8 @@ struct SubscriptionDestinationPicker: View { .padding(.horizontal, 80) .padding(.vertical, 60) } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .tvFullScreenCoverBackground() } } #endif diff --git a/Yattee/Views/Components/TVFullScreenCoverBackground.swift b/Yattee/Views/Components/TVFullScreenCoverBackground.swift new file mode 100644 index 00000000..15a89c97 --- /dev/null +++ b/Yattee/Views/Components/TVFullScreenCoverBackground.swift @@ -0,0 +1,39 @@ +// +// TVFullScreenCoverBackground.swift +// Yattee +// +// Scheme-adaptive opaque background for tvOS full screen covers. +// + +import SwiftUI + +#if os(tvOS) +/// tvOS full screen covers have a transparent background, letting the view +/// below leak through, so they need an explicit opaque fill. A hardcoded +/// black makes primary (black) text invisible under the light color scheme, +/// so the fill follows the scheme instead. +struct TVFullScreenCoverBackgroundModifier: ViewModifier { + @Environment(\.colorScheme) private var colorScheme + + func body(content: Content) -> some View { + content + .background( + (colorScheme == .dark ? Color.black : Color(white: 0.92)) + .ignoresSafeArea() + ) + } +} +#endif + +extension View { + /// Gives a tvOS full screen cover an opaque, color-scheme-appropriate + /// background. No-op on other platforms. + @ViewBuilder + func tvFullScreenCoverBackground() -> some View { + #if os(tvOS) + modifier(TVFullScreenCoverBackgroundModifier()) + #else + self + #endif + } +} diff --git a/Yattee/Views/Instances/InstanceBrowseView.swift b/Yattee/Views/Instances/InstanceBrowseView.swift index db8487c4..d1713219 100644 --- a/Yattee/Views/Instances/InstanceBrowseView.swift +++ b/Yattee/Views/Instances/InstanceBrowseView.swift @@ -552,7 +552,7 @@ struct InstanceBrowseView: View { TVSidebarDetailContainer(systemImage: "pencil.circle", title: String(localized: "sources.editSource")) { EditSourceView(source: .remoteServer(instance)) } - .background(Color.black.ignoresSafeArea()) + .tvFullScreenCoverBackground() } #else .sheet(isPresented: $showEditInstance) { diff --git a/Yattee/Views/Settings/InstanceLoginView.swift b/Yattee/Views/Settings/InstanceLoginView.swift index 02b6fa3d..0abb7096 100644 --- a/Yattee/Views/Settings/InstanceLoginView.swift +++ b/Yattee/Views/Settings/InstanceLoginView.swift @@ -54,7 +54,7 @@ struct InstanceLoginView: View { formContent } .frame(maxWidth: .infinity, maxHeight: .infinity) - .background(Color.black.ignoresSafeArea()) + .tvFullScreenCoverBackground() .accessibilityIdentifier("instance.login.view") #else NavigationStack { diff --git a/Yattee/Views/Video/VideoInfoView.swift b/Yattee/Views/Video/VideoInfoView.swift index 247045bb..d48e61e5 100644 --- a/Yattee/Views/Video/VideoInfoView.swift +++ b/Yattee/Views/Video/VideoInfoView.swift @@ -1989,9 +1989,7 @@ struct VideoInfoView: View { } } } - #if os(tvOS) - .background(Color.black.ignoresSafeArea()) - #endif + .tvFullScreenCoverBackground() .navigationTitle(String(localized: "videoInfo.section.comments")) #if os(iOS) .navigationBarTitleDisplayMode(.inline) diff --git a/Yattee/YatteeApp.swift b/Yattee/YatteeApp.swift index abdb218c..c668f78f 100644 --- a/Yattee/YatteeApp.swift +++ b/Yattee/YatteeApp.swift @@ -182,11 +182,9 @@ struct YatteeApp: App { .fullScreenCover(isPresented: $showingICloudProgress) { ICloudSyncProgressView() .appEnvironment(appEnvironment) - #if os(tvOS) // tvOS full screen covers have a transparent background, // letting the view below leak through. - .background(Color.black.ignoresSafeArea()) - #endif + .tvFullScreenCoverBackground() } #endif #if os(tvOS) @@ -202,7 +200,7 @@ struct YatteeApp: App { } .appEnvironment(appEnvironment) } - .background(Color.black.ignoresSafeArea()) + .tvFullScreenCoverBackground() } #else .sheet(isPresented: $showingLegacyAccountsImport) {