From 7f6ded7de0dc18a83e886618c2721ca9f75261d7 Mon Sep 17 00:00:00 2001 From: Guido Schmit Date: Mon, 10 Aug 2026 21:17:13 +0200 Subject: [PATCH] =?UTF-8?q?Men=C3=BCleistensymbol:=20Konturfassung=20statt?= =?UTF-8?q?=20Silhouette?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Das Glyph des App-Icons besteht aus deckenden Flächen. Als Template-Bild — der einzige Weg, macOS zum Einfärben zu bewegen — verschmolzen die Facetten zu einer flachen Silhouette, weil dabei nur der Alphakanal zählt. MenuBarIcon.svg ist als Kontur gezeichnet: zwischen den Linien ist nichts, also bleibt beim Einfärben die Struktur erhalten. Das Symbol wird damit automatisch weiß auf dunkler und schwarz auf heller Menüleiste — ohne zweite Datei für den zweiten Fall. Die ebenfalls angebotene helle Flächenfassung wird damit überflüssig und ist nicht eingecheckt: sie wäre auf einer hellen Menüleiste unsichtbar, und eine ungenutzte Alternative im Repo lädt später zum Verwechseln ein. Der Kopierschritt für quartz.svg entfällt — die Datei liegt jetzt direkt im App-Target und wird ohne Umweg als Ressource eingebunden. --- Onyx.xcodeproj/project.pbxproj | 27 +++++---------------------- outline.svg => Onyx/MenuBarIcon.svg | 0 Onyx/OnyxApp.swift | 26 ++++++++++++-------------- bright.svg | 1 - project.yml | 12 ------------ 5 files changed, 17 insertions(+), 49 deletions(-) rename outline.svg => Onyx/MenuBarIcon.svg (100%) delete mode 100644 bright.svg diff --git a/Onyx.xcodeproj/project.pbxproj b/Onyx.xcodeproj/project.pbxproj index 52a6b72..1f7d5cd 100644 --- a/Onyx.xcodeproj/project.pbxproj +++ b/Onyx.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 5BE38CAFCDA4B9CBE787CABA /* WeatherProvider in Frameworks */ = {isa = PBXBuildFile; productRef = D4578EB64F7A3372B49BC50C /* WeatherProvider */; }; 5EA873EC28C7EE21AC85A263 /* PlaceholderWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB5D52C0D22AE1F5E0601AF9 /* PlaceholderWidgets.swift */; }; 68EE5495435A82E20248EBC2 /* OnyxDesign in Frameworks */ = {isa = PBXBuildFile; productRef = 3D680DD645941493A7D3559E /* OnyxDesign */; }; + 7CE2EDC6BC58678269BF27AD /* MenuBarIcon.svg in Resources */ = {isa = PBXBuildFile; fileRef = 24ADD22F5CE30B27020B479B /* MenuBarIcon.svg */; }; 9C2E419014B7E04630FDF151 /* OnyxApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F89CAC2A7DA89B8707D45D65 /* OnyxApp.swift */; }; A529046C33E6B00C0E9508FF /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 508DECB5C05264E6130C373E /* Localizable.xcstrings */; }; B6CD48B41866A468AE7A1BC7 /* OnyxMenuBar in Frameworks */ = {isa = PBXBuildFile; productRef = A7FD7A4864E5ED4B95C211AF /* OnyxMenuBar */; }; @@ -27,6 +28,7 @@ /* Begin PBXFileReference section */ 055263008CB3306A8D09E6D4 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = wrapper.icon; path = AppIcon.icon; sourceTree = ""; }; 0804288DC4A8146DD9F3FC3E /* Onyx.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Onyx.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 24ADD22F5CE30B27020B479B /* MenuBarIcon.svg */ = {isa = PBXFileReference; path = MenuBarIcon.svg; sourceTree = ""; }; 45BD2DF1B775C733C8F75635 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; 508DECB5C05264E6130C373E /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 50A018673EE6BD9C50F1EFA0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; @@ -97,6 +99,7 @@ B83C4E3CB821F903F3977E88 /* AppModel.swift */, 50A018673EE6BD9C50F1EFA0 /* Info.plist */, 508DECB5C05264E6130C373E /* Localizable.xcstrings */, + 24ADD22F5CE30B27020B479B /* MenuBarIcon.svg */, 87597F09E971C14CF1E475DB /* Onyx.entitlements */, F89CAC2A7DA89B8707D45D65 /* OnyxApp.swift */, CB5D52C0D22AE1F5E0601AF9 /* PlaceholderWidgets.swift */, @@ -117,7 +120,6 @@ B211CE3C0EF94A8D680E4AE0 /* Resources */, 7FF994FE5530D53BEFBE13FE /* Frameworks */, 9A7A5929B893076DEC10139E /* MediaRemote-Adapter bauen und beilegen */, - F10EA44D021D8D6C50BEDCAA /* Glyph für die Menüleiste ins Bundle kopieren */, ); buildRules = ( ); @@ -183,6 +185,7 @@ files = ( FF97F56CE1C734E59F1B40F4 /* AppIcon.icon in Resources */, A529046C33E6B00C0E9508FF /* Localizable.xcstrings in Resources */, + 7CE2EDC6BC58678269BF27AD /* MenuBarIcon.svg in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -202,32 +205,12 @@ name = "MediaRemote-Adapter bauen und beilegen"; outputFileListPaths = ( ); - outputPaths = ( - "$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/Vendor/mediaremote-adapter.pl", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "OUT=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/Vendor\" \\\n \"$SRCROOT/Scripts/build-mediaremote-adapter.sh\"\n"; - }; - F10EA44D021D8D6C50BEDCAA /* Glyph für die Menüleiste ins Bundle kopieren */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(SRCROOT)/Onyx/AppIcon.icon/Assets/quartz.svg", - ); - name = "Glyph für die Menüleiste ins Bundle kopieren"; - outputFileListPaths = ( - ); outputPaths = ( "$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "SRC=\"$SRCROOT/Onyx/AppIcon.icon/Assets/quartz.svg\"\nDST=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/quartz.svg\"\nif [ -f \"$SRC\" ]; then\n mkdir -p \"$(dirname \"$DST\")\"\n cp \"$SRC\" \"$DST\"\nelse\n echo \"warning: $SRC fehlt — Menüleiste fällt auf ein SF-Symbol zurück\"\nfi\n"; + shellScript = "OUT=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/Vendor\" \\\n \"$SRCROOT/Scripts/build-mediaremote-adapter.sh\"\n"; }; /* End PBXShellScriptBuildPhase section */ diff --git a/outline.svg b/Onyx/MenuBarIcon.svg similarity index 100% rename from outline.svg rename to Onyx/MenuBarIcon.svg diff --git a/Onyx/OnyxApp.swift b/Onyx/OnyxApp.swift index 0570660..7d31cfa 100644 --- a/Onyx/OnyxApp.swift +++ b/Onyx/OnyxApp.swift @@ -172,28 +172,26 @@ final class AppDelegate: NSObject, NSApplicationDelegate { /// Menüleiste. Dort steht sie als farbiger Klotz zwischen lauter /// Strichsymbolen. /// - /// Geladen wird dieselbe SVG-Datei, aus der auch das App-Icon gebaut wird — - /// NSImage liest sie als Vektor (`_NSSVGImageRep`), sie skaliert also - /// verlustfrei. + /// **Eine eigene Konturfassung, nicht das App-Icon.** /// - /// **Als Template-Bild.** Das Glyph besteht aus zehn deckenden Pfaden in - /// sehr dunklen Tönen (#1c1f1f bis #000000). Im App-Icon liegt es auf - /// blauem Verlauf und liest sich als Kristall; allein auf einer dunklen - /// Menüleiste ist es schwarz auf schwarz. macOS färbt ausschließlich - /// Template-Bilder ein, und die benutzen nur den Alphakanal — die Facetten - /// verschmelzen dabei zu einer Silhouette. + /// Das Glyph des App-Icons besteht aus deckenden Flächen in sehr dunklen + /// Tönen. Auf dem blauen Verlauf des Icons liest es sich als Kristall, + /// allein auf einer dunklen Menüleiste ist es schwarz auf schwarz. Und als + /// Template-Bild — der einzige Weg, macOS zum Einfärben zu bewegen — + /// verschmelzen die Facetten zu einer flachen Silhouette, weil dabei nur + /// der Alphakanal zählt. /// - /// Das ist der bewusste Tausch: erkennbare Form in hellen wie dunklen - /// Menüleisten statt Facetten, die man in keiner von beiden sieht. Eine - /// Fassung mit durchsichtigen Facettenfugen behielte beides — dafür müsste - /// das SVG entsprechend gezeichnet sein. + /// `MenuBarIcon.svg` ist deshalb als Kontur gezeichnet: zwischen den Linien + /// ist nichts, also bleibt beim Einfärben die Struktur erhalten. Das Symbol + /// wird damit automatisch weiß auf dunkler und schwarz auf heller + /// Menüleiste, ohne zweite Datei für den zweiten Fall. /// /// 18 pt ist die übliche Höhe; die Leiste ist 22 pt hoch und braucht oben /// und unten Luft. private static func menuBarIcon() -> NSImage { let size = NSSize(width: 18, height: 18) - if let url = Bundle.main.url(forResource: "quartz", withExtension: "svg"), + if let url = Bundle.main.url(forResource: "MenuBarIcon", withExtension: "svg"), let glyph = NSImage(contentsOf: url) { let image = NSImage(size: size, flipped: false) { rect in glyph.draw(in: rect, from: .zero, operation: .sourceOver, fraction: 1) diff --git a/bright.svg b/bright.svg deleted file mode 100644 index 1e04dc1..0000000 --- a/bright.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/project.yml b/project.yml index ea62b98..c767de3 100644 --- a/project.yml +++ b/project.yml @@ -72,18 +72,6 @@ targets: # .icns und Assets.car und legt nichts Lesbares ins Bundle — und eine # einzelne Datei daraus lässt sich nicht als Ressource referenzieren. # Deshalb kopieren statt duplizieren: es bleibt bei einer Quelldatei. - - name: Glyph für die Menüleiste ins Bundle kopieren - script: | - SRC="$SRCROOT/Onyx/AppIcon.icon/Assets/quartz.svg" - DST="$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/quartz.svg" - if [ -f "$SRC" ]; then - mkdir -p "$(dirname "$DST")" - cp "$SRC" "$DST" - else - echo "warning: $SRC fehlt — Menüleiste fällt auf ein SF-Symbol zurück" - fi - inputFiles: - - $(SRCROOT)/Onyx/AppIcon.icon/Assets/quartz.svg outputFiles: - $(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg settings: