Fix light-mode typing indicator contrast in active sidebar

This commit is contained in:
Lawrence Chen 2026-02-23 19:22:39 -08:00
parent 0dee878268
commit 666ef75d1e
2 changed files with 35 additions and 30 deletions

View file

@ -28,17 +28,14 @@ private func coloredCircleImage(color: NSColor) -> NSImage {
return image
}
func sidebarStatusPillActiveForegroundNSColor(
colorScheme: ColorScheme,
opacity: CGFloat
func sidebarActiveForegroundNSColor(
opacity: CGFloat,
appAppearance: NSAppearance? = NSApp?.effectiveAppearance
) -> NSColor {
let clampedOpacity = max(0, min(opacity, 1))
switch colorScheme {
case .dark:
return NSColor.white.withAlphaComponent(clampedOpacity)
default:
return NSColor.black.withAlphaComponent(clampedOpacity)
}
let bestMatch = appAppearance?.bestMatch(from: [.darkAqua, .aqua])
let baseColor: NSColor = (bestMatch == .darkAqua) ? .white : .black
return baseColor.withAlphaComponent(clampedOpacity)
}
struct ShortcutHintPillBackground: View {
@ -5929,11 +5926,13 @@ private struct TabItemView: View {
}
private var activePrimaryTextColor: Color {
usesInvertedActiveForeground ? .white : .primary
usesInvertedActiveForeground ? Color(nsColor: sidebarActiveForegroundNSColor(opacity: 1.0)) : .primary
}
private func activeSecondaryColor(_ opacity: Double = 0.75) -> Color {
usesInvertedActiveForeground ? .white.opacity(opacity) : .secondary
usesInvertedActiveForeground
? Color(nsColor: sidebarActiveForegroundNSColor(opacity: CGFloat(opacity)))
: .secondary
}
private var activeUnreadBadgeFillColor: Color {
@ -6676,11 +6675,16 @@ private struct TabItemView: View {
private func logLevelColor(_ level: SidebarLogLevel, isActive: Bool) -> Color {
if isActive {
switch level {
case .info: return .white.opacity(0.5)
case .progress: return .white.opacity(0.8)
case .success: return .white.opacity(0.9)
case .warning: return .white.opacity(0.9)
case .error: return .white.opacity(0.9)
case .info:
return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.5))
case .progress:
return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8))
case .success:
return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9))
case .warning:
return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9))
case .error:
return Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.9))
}
}
switch level {
@ -6781,7 +6785,6 @@ private struct SidebarStatusPillsRow: View {
let onFocus: () -> Void
@State private var isExpanded: Bool = false
@Environment(\.colorScheme) private var colorScheme
var body: some View {
VStack(alignment: .leading, spacing: 2) {
@ -6818,11 +6821,11 @@ private struct SidebarStatusPillsRow: View {
}
private var activePrimaryTextColor: Color {
Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.8))
Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.8))
}
private var activeSecondaryTextColor: Color {
Color(nsColor: sidebarStatusPillActiveForegroundNSColor(colorScheme: colorScheme, opacity: 0.65))
Color(nsColor: sidebarActiveForegroundNSColor(opacity: 0.65))
}
private var statusText: String {

View file

@ -773,12 +773,13 @@ final class BrowserPanelOmnibarPillBackgroundColorTests: XCTestCase {
}
}
final class SidebarStatusPillActiveForegroundColorTests: XCTestCase {
func testLightModeUsesBlackWithRequestedOpacity() {
guard let color = sidebarStatusPillActiveForegroundNSColor(
colorScheme: .light,
opacity: 0.8
).usingColorSpace(.sRGB) else {
final class SidebarActiveForegroundColorTests: XCTestCase {
func testLightAppearanceUsesBlackWithRequestedOpacity() {
guard let lightAppearance = NSAppearance(named: .aqua),
let color = sidebarActiveForegroundNSColor(
opacity: 0.8,
appAppearance: lightAppearance
).usingColorSpace(.sRGB) else {
XCTFail("Expected sRGB-convertible color")
return
}
@ -789,11 +790,12 @@ final class SidebarStatusPillActiveForegroundColorTests: XCTestCase {
XCTAssertEqual(color.alphaComponent, 0.8, accuracy: 0.001)
}
func testDarkModeUsesWhiteWithRequestedOpacity() {
guard let color = sidebarStatusPillActiveForegroundNSColor(
colorScheme: .dark,
opacity: 0.65
).usingColorSpace(.sRGB) else {
func testDarkAppearanceUsesWhiteWithRequestedOpacity() {
guard let darkAppearance = NSAppearance(named: .darkAqua),
let color = sidebarActiveForegroundNSColor(
opacity: 0.65,
appAppearance: darkAppearance
).usingColorSpace(.sRGB) else {
XCTFail("Expected sRGB-convertible color")
return
}