Make dark mode black instead of the system window grey

The panel is a full-height strip that sits beside your work, where the
system grey reads as a half-lit window next to a dark editor. Dark mode
is now pure black, with card and row colours in one Theme file so both
the panel background and the strip under the titlebar match.
This commit is contained in:
2026-10-09 18:04:08 +08:00
parent 6580a79d40
commit 78d56ca79b
4 changed files with 40 additions and 1 deletions
+6
View File
@@ -31,6 +31,12 @@ clicking an item copies it back to the clipboard.
`setDone(_:ids:)`, `move(ids:to:)`) back the selection context menu, so one `setDone(_:ids:)`, `move(ids:to:)`) back the selection context menu, so one
action applies to every selected item and image files are cleaned up once. action applies to every selected item and image files are cleaned up once.
Saves on every mutation. Saves on every mutation.
- `Sources/Prompt/Theme.swift` — the panel's appearance-aware colours. Dark
mode is pure black rather than the system window grey (the panel is a
full-height strip beside your work, where grey reads as a half-lit window);
light mode keeps the system window colour. `Theme.background` is also handed
to the `NSPanel` so the strip under the transparent titlebar matches, and the
row colour stays slightly lighter than black so cards remain visible.
- `Sources/Prompt/PanelView.swift` — the panel UI. Header (section switcher, - `Sources/Prompt/PanelView.swift` — the panel UI. Header (section switcher,
search, add photos, close), item list, composer. Composer `# Name` creates/ search, add photos, close), item list, composer. Composer `# Name` creates/
switches sections. Click = select (Shift+click for a range); the selection switches sections. Click = select (Shift+click for a range); the selection
+4
View File
@@ -56,6 +56,10 @@ final class PanelController: NSObject {
panel.isMovableByWindowBackground = true panel.isMovableByWindowBackground = true
panel.hidesOnDeactivate = false panel.hidesOnDeactivate = false
panel.isReleasedWhenClosed = false panel.isReleasedWhenClosed = false
panel.isOpaque = true
// Match the SwiftUI content so the titlebar strip and any resize flash
// do not show the system grey through.
panel.backgroundColor = Theme.background
panel.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary] panel.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
panel.contentView = NSHostingView(rootView: PanelView(store: Store.shared)) panel.contentView = NSHostingView(rootView: PanelView(store: Store.shared))
panel.setFrameAutosaveName("PromptPanel") panel.setFrameAutosaveName("PromptPanel")
+2 -1
View File
@@ -40,6 +40,7 @@ struct PanelView: View {
composerField composerField
} }
.frame(minWidth: 300) .frame(minWidth: 300)
.background(Theme.backgroundSwiftUI)
.background(shortcutButtons) .background(shortcutButtons)
.overlay(sectionSwitcher) .overlay(sectionSwitcher)
.overlay(syncOverlay) .overlay(syncOverlay)
@@ -248,7 +249,7 @@ struct PanelView: View {
private func rowBackground(_ item: PromptItem) -> Color { private func rowBackground(_ item: PromptItem) -> Color {
if selection.contains(item.id) { return Color.accentColor.opacity(0.25) } if selection.contains(item.id) { return Color.accentColor.opacity(0.25) }
return Color.primary.opacity(0.05) return Theme.rowSwiftUI
} }
@ViewBuilder @ViewBuilder
+28
View File
@@ -0,0 +1,28 @@
import AppKit
import SwiftUI
/// Appearance-aware colours for the panel.
///
/// Dark mode is pure black rather than the system window grey: the panel is a
/// full-height strip that sits beside your work, and the grey reads as a
/// half-lit window next to a dark editor or terminal.
enum Theme {
static func isDark(_ appearance: NSAppearance) -> Bool {
appearance.bestMatch(from: [.aqua, .darkAqua]) == .darkAqua
}
/// The panel's own background (also handed to the NSPanel so the area under
/// the transparent titlebar matches).
static let background = NSColor(name: nil) { appearance in
isDark(appearance) ? .black : .windowBackgroundColor
}
/// Card background, kept subtle but visible against pure black.
static let row = NSColor(name: nil) { appearance in
isDark(appearance) ? NSColor(white: 1, alpha: 0.07) : NSColor(white: 0, alpha: 0.05)
}
/// Same colours for SwiftUI.
static let backgroundSwiftUI = Color(nsColor: background)
static let rowSwiftUI = Color(nsColor: row)
}