ソースを参照

Fix black overscroll background on Reddit home in light theme.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 ヶ月 前
コミット
ed938c9390

+ 23 - 0
Reddit App/Managers/AppearanceManager.swift

@@ -1,3 +1,4 @@
+import AppKit
 import Foundation
 import SwiftUI
 
@@ -19,6 +20,14 @@ final class AppearanceManager {
         isDarkMode ? .dark : .light
     }
 
+    var webUnderPageBackgroundColor: NSColor {
+        Self.webUnderPageBackgroundColor(isDarkMode: isDarkMode)
+    }
+
+    static func webUnderPageBackgroundColor(isDarkMode: Bool) -> NSColor {
+        NSColor(hex: (isDarkMode ? ThemePalette.dark : ThemePalette.light).webUnderPageBackgroundHex)
+    }
+
     init() {
         if UserDefaults.standard.object(forKey: Self.storageKey) != nil {
             isDarkMode = UserDefaults.standard.bool(forKey: Self.storageKey)
@@ -29,6 +38,7 @@ final class AppearanceManager {
 }
 
 struct ThemePalette {
+    let webUnderPageBackgroundHex: UInt
     let background: Color
     let sidebarBackground: Color
     let panelBackground: Color
@@ -45,6 +55,7 @@ struct ThemePalette {
     let scrim: Color
 
     static let dark = ThemePalette(
+        webUnderPageBackgroundHex: 0x0B0E14,
         background: Color(hex: 0x0B0E14),
         sidebarBackground: Color(hex: 0x0B0E14),
         panelBackground: Color(hex: 0x11141C),
@@ -62,6 +73,7 @@ struct ThemePalette {
     )
 
     static let light = ThemePalette(
+        webUnderPageBackgroundHex: 0xFFFFFF,
         background: Color(hex: 0xF5F6F8),
         sidebarBackground: Color(hex: 0xFFFFFF),
         panelBackground: Color(hex: 0xF9FAFB),
@@ -78,3 +90,14 @@ struct ThemePalette {
         scrim: Color.black.opacity(0.25)
     )
 }
+
+private extension NSColor {
+    convenience init(hex: UInt, alpha: CGFloat = 1.0) {
+        self.init(
+            red: CGFloat((hex >> 16) & 0xFF) / 255,
+            green: CGFloat((hex >> 8) & 0xFF) / 255,
+            blue: CGFloat(hex & 0xFF) / 255,
+            alpha: alpha
+        )
+    }
+}

+ 5 - 6
Reddit App/Managers/RedditWebViewManager.swift

@@ -42,12 +42,11 @@ enum RedditWebViewManager {
         webView.allowsMagnification = true
         webView.customUserAgent =
             "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15"
-        webView.underPageBackgroundColor = NSColor(
-            red: 11.0 / 255.0,
-            green: 14.0 / 255.0,
-            blue: 20.0 / 255.0,
-            alpha: 1.0
-        )
+        applyUnderPageBackground(to: webView, isDarkMode: AppearanceManager.shared.isDarkMode)
         return webView
     }
+
+    static func applyUnderPageBackground(to webView: WKWebView, isDarkMode: Bool) {
+        webView.underPageBackgroundColor = AppearanceManager.webUnderPageBackgroundColor(isDarkMode: isDarkMode)
+    }
 }

+ 1 - 0
Reddit App/Views/FrontPageView.swift

@@ -81,6 +81,7 @@ struct FrontPageView: View {
                 RedditWebView(
                     url: viewModel.redditLoadURL,
                     reloadTrigger: viewModel.redditReloadTrigger,
+                    isDarkMode: appearanceManager.isDarkMode,
                     goBackTrigger: viewModel.redditGoBackTrigger,
                     onCanGoBackChange: { viewModel.updateRedditCanGoBack($0) },
                     onAuthError: { viewModel.showAuthError($0) }

+ 15 - 0
Reddit App/Views/RedditWebView.swift

@@ -5,6 +5,7 @@ import WebKit
 struct RedditWebView: NSViewRepresentable {
     let url: URL
     let reloadTrigger: Int
+    var isDarkMode: Bool
     var goBackTrigger: Int = 0
     var onCanGoBackChange: (Bool) -> Void = { _ in }
     var onAuthError: (String) -> Void = { _ in }
@@ -22,7 +23,9 @@ struct RedditWebView: NSViewRepresentable {
         container.webView.uiDelegate = context.coordinator
         context.coordinator.container = container
         context.coordinator.lastReloadTrigger = reloadTrigger
+        context.coordinator.lastAppliedDarkMode = isDarkMode
         context.coordinator.startObservingNavigation(in: container.webView)
+        container.applyUnderPageBackground(isDarkMode: isDarkMode)
         container.load(url: url)
         return container
     }
@@ -30,6 +33,11 @@ struct RedditWebView: NSViewRepresentable {
     func updateNSView(_ container: RedditWebViewContainer, context: Context) {
         context.coordinator.onCanGoBackChange = onCanGoBackChange
 
+        if context.coordinator.lastAppliedDarkMode != isDarkMode {
+            context.coordinator.lastAppliedDarkMode = isDarkMode
+            container.applyUnderPageBackground(isDarkMode: isDarkMode)
+        }
+
         if context.coordinator.lastGoBackTrigger != goBackTrigger {
             context.coordinator.lastGoBackTrigger = goBackTrigger
             if container.webView.canGoBack {
@@ -50,6 +58,7 @@ struct RedditWebView: NSViewRepresentable {
         weak var container: RedditWebViewContainer?
         var lastReloadTrigger = -1
         var lastGoBackTrigger = 0
+        var lastAppliedDarkMode: Bool?
         var lastLoadedURL: URL?
         private var prefillWorkItem: DispatchWorkItem?
         private var canGoBackObservation: NSKeyValueObservation?
@@ -291,4 +300,10 @@ final class RedditWebViewContainer: NSView {
         pendingURL = nil
         webView.load(URLRequest(url: url))
     }
+
+    func applyUnderPageBackground(isDarkMode: Bool) {
+        let color = AppearanceManager.webUnderPageBackgroundColor(isDarkMode: isDarkMode)
+        RedditWebViewManager.applyUnderPageBackground(to: webView, isDarkMode: isDarkMode)
+        layer?.backgroundColor = color.cgColor
+    }
 }