From 0df566d53109baaca81be347b93b680da535a63c Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Fri, 14 Aug 2026 13:48:57 +0200 Subject: [PATCH] Symbole folgen der Akzentfarbe, nicht der des Systems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SwiftUI zeichnet Symbole in Listen und Formularen auf macOS in der Akzentfarbe des Systems — nicht in der des Fensters. `.tint` an der Wurzel half deshalb nur der Reiterleiste; die Widget-Liste blieb systemgrün neben einer blauen Leiste, obwohl beides derselben Einstellung folgen soll. Ein eigener Label-Stil setzt die Farbe am Symbol. Er vererbt sich über die Umgebung, also genügt eine Zeile an denselben vier Wurzeln, an denen auch der Farbton gesetzt wird: Panel, Popovers, Einstellungen, Einrichtung. Ein Symbol, das seine Farbe selbst mitbringt, behält sie — die innere Angabe schlägt die äußere. Der grüne Haken für „erteilt" bringt sie jetzt am Symbol mit statt am ganzen Label: Grün heißt dort „erteilt" und ist keine Geschmacksfrage. Co-Authored-By: Claude Opus 5 --- Onyx/OnboardingWindowController.swift | 3 +- Onyx/OnyxApp.swift | 3 +- Onyx/SettingsView.swift | 14 +++++++-- Onyx/SettingsWindowController.swift | 3 +- .../Sources/OnyxDesign/OnyxLabelStyle.swift | 30 +++++++++++++++++++ .../OnyxMenuBar/MenuBarController.swift | 4 ++- 6 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 Packages/OnyxKit/Sources/OnyxDesign/OnyxLabelStyle.swift diff --git a/Onyx/OnboardingWindowController.swift b/Onyx/OnboardingWindowController.swift index eee4075..0db504d 100644 --- a/Onyx/OnboardingWindowController.swift +++ b/Onyx/OnboardingWindowController.swift @@ -45,7 +45,8 @@ final class OnboardingWindowController: NSObject, NSWindowDelegate { calendarModel: calendarModel, weatherModel: weatherModel, mixer: mixer, fanControl: fanControl, launchAtLogin: launchAtLogin, onFinish: { [weak self] in self?.finish() }) - .tint(Onyx.Color.accent)) + .tint(Onyx.Color.accent) + .labelStyle(.onyx)) let window = NSWindow(contentViewController: hosting) window.title = "Onyx" diff --git a/Onyx/OnyxApp.swift b/Onyx/OnyxApp.swift index 1d3e8a8..21afaf7 100644 --- a/Onyx/OnyxApp.swift +++ b/Onyx/OnyxApp.swift @@ -77,7 +77,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate { rootView: NotchContainer(presentation: presentation) { NotchPanelContent(model: model) } - .tint(Onyx.Color.accent), + .tint(Onyx.Color.accent) + .labelStyle(.onyx), presentation: presentation) } coordinator.start() diff --git a/Onyx/SettingsView.swift b/Onyx/SettingsView.swift index 64178b2..ff399b3 100644 --- a/Onyx/SettingsView.swift +++ b/Onyx/SettingsView.swift @@ -231,9 +231,17 @@ private struct PermissionRow: View { Spacer() switch state { case .granted: - Label("settings.permissions.granted", systemImage: "checkmark.circle.fill") - .foregroundStyle(Onyx.Color.positive) - .labelStyle(.titleAndIcon) + // Die Farbe sitzt am Symbol, nicht am ganzen Label: der + // Akzentstil färbt sonst darüber. Grün heißt hier „erteilt" + // und ist keine Geschmacksfrage. + Label { + Text("settings.permissions.granted") + } icon: { + Image(systemName: "checkmark.circle.fill") + .foregroundStyle(Onyx.Color.positive) + } + .foregroundStyle(Onyx.Color.positive) + .labelStyle(.titleAndIcon) case .undetermined: Button("settings.permissions.request") { Task { await request() } } case .denied: diff --git a/Onyx/SettingsWindowController.swift b/Onyx/SettingsWindowController.swift index 9bfe7df..81196bb 100644 --- a/Onyx/SettingsWindowController.swift +++ b/Onyx/SettingsWindowController.swift @@ -65,7 +65,8 @@ final class SettingsWindowController: NSObject, NSWindowDelegate { // Ohne das folgen Haken, Regler und Auswahlfelder der // Systemfarbe statt der eingestellten. Genau daher kam das // Grün, das in Onyx sonst nirgends vorkommt. - .tint(Onyx.Color.accent)) + .tint(Onyx.Color.accent) + .labelStyle(.onyx)) let window = NSWindow(contentViewController: hosting) window.title = "Onyx" diff --git a/Packages/OnyxKit/Sources/OnyxDesign/OnyxLabelStyle.swift b/Packages/OnyxKit/Sources/OnyxDesign/OnyxLabelStyle.swift new file mode 100644 index 0000000..42a7447 --- /dev/null +++ b/Packages/OnyxKit/Sources/OnyxDesign/OnyxLabelStyle.swift @@ -0,0 +1,30 @@ +import SwiftUI + +/// Färbt das Symbol eines `Label` in der eingestellten Akzentfarbe. +/// +/// **Nötig, weil `.tint` hier nicht greift.** SwiftUI zeichnet Symbole in +/// Listen und Formularen auf macOS in der Akzentfarbe des *Systems* — nicht in +/// der des Fensters. Das Ergebnis war eine Widget-Liste in Systemgrün neben +/// einer Reiterleiste in Onyx-Blau, obwohl beides derselben Einstellung folgen +/// soll. +/// +/// Ein Stil statt einer Farbe an jeder Fundstelle: er vererbt sich über die +/// Umgebung, also genügt eine Zeile an der Wurzel. Ein Symbol, das seine Farbe +/// selbst mitbringt — etwa der grüne Haken für „erteilt" —, behält sie: die +/// innere Angabe schlägt die äußere. +public struct OnyxAccentLabelStyle: LabelStyle { + + public init() {} + + public func makeBody(configuration: Configuration) -> some View { + Label { + configuration.title + } icon: { + configuration.icon.foregroundStyle(Onyx.Color.accent) + } + } +} + +public extension LabelStyle where Self == OnyxAccentLabelStyle { + static var onyx: OnyxAccentLabelStyle { OnyxAccentLabelStyle() } +} diff --git a/Packages/OnyxKit/Sources/OnyxMenuBar/MenuBarController.swift b/Packages/OnyxKit/Sources/OnyxMenuBar/MenuBarController.swift index 69c52bd..5a267d5 100644 --- a/Packages/OnyxKit/Sources/OnyxMenuBar/MenuBarController.swift +++ b/Packages/OnyxKit/Sources/OnyxMenuBar/MenuBarController.swift @@ -145,7 +145,9 @@ public final class MenuBarController { // Auswahlfelder auf die Systemfarbe zurück — das war der Grund, warum // die Popovers grün waren und die Widgets blau. entry.popover.contentViewController = NSHostingController( - rootView: entry.module.makePopoverView().tint(Onyx.Color.accent)) + rootView: entry.module.makePopoverView() + .tint(Onyx.Color.accent) + .labelStyle(.onyx)) entry.popover.show(relativeTo: sender.bounds, of: sender, preferredEdge: .minY) // Ohne das bleibt das Popover hinter dem aktiven Fenster. entry.popover.contentViewController?.view.window?.makeKey()