Unify macOS content view backgrounds with opaque window background

Views without an explicit background sat on the translucent window
material, which picks up a wallpaper tint (bluish in dark mode) and
clashed with views drawing windowBackgroundColor, making the video
info header gradient fade visibly mismatch. Add opaqueWindowBackground()
and apply it centrally in NavigationDestinationHandlerModifier to both
stack roots and pushed destinations, plus VideoInfoView for
presentations outside navigation stacks.

Claude-Session: https://claude.ai/code/session_0154KH8RAVAvm6iVanhmoW8o
This commit is contained in:
Arkadiusz Fal
2026-07-06 09:36:49 +02:00
parent 48378d7ca8
commit 8d4f472348
3 changed files with 45 additions and 5 deletions

View File

@@ -184,13 +184,17 @@ private struct MediaSourceByIDView: View {
struct NavigationDestinationHandlerModifier: ViewModifier {
func body(content: Content) -> some View {
content
.opaqueWindowBackground()
.navigationDestination(for: NavigationDestination.self) { destination in
if let transitionID = destination.transitionID {
destination.view()
.zoomTransitionDestination(id: transitionID)
} else {
destination.view()
Group {
if let transitionID = destination.transitionID {
destination.view()
.zoomTransitionDestination(id: transitionID)
} else {
destination.view()
}
}
.opaqueWindowBackground()
}
}
}

View File

@@ -0,0 +1,33 @@
//
// OpaqueWindowBackground.swift
// Yattee
//
// Unified opaque background for main content views on macOS.
//
import SwiftUI
/// Applies an opaque window background on macOS.
///
/// Without an explicit background, content sits on the translucent window
/// material, which picks up a wallpaper tint (often bluish in dark mode) and
/// clashes with views that draw `windowBackgroundColor` themselves (lists,
/// gradient fades). No-op on other platforms.
struct OpaqueWindowBackgroundModifier: ViewModifier {
func body(content: Content) -> some View {
#if os(macOS)
content
.background(Color(nsColor: .windowBackgroundColor).ignoresSafeArea())
#else
content
#endif
}
}
extension View {
/// Gives the view an opaque window background on macOS so all main content
/// views share the same background color. No-op on iOS/tvOS.
func opaqueWindowBackground() -> some View {
modifier(OpaqueWindowBackgroundModifier())
}
}

View File

@@ -259,6 +259,9 @@ struct VideoInfoView: View {
videoContent
}
}
// Opaque background so the header gradient (which fades to windowBackgroundColor)
// blends seamlessly even when presented outside a navigation stack.
.opaqueWindowBackground()
.task {
await loadInitialVideoIfNeeded()
}