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:
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user