From 48b40e2b760cc2f156ed13f15db421723fec8ea7 Mon Sep 17 00:00:00 2001 From: kbsoo Date: Fri, 27 Mar 2026 10:14:08 +0900 Subject: [PATCH] Replace emoji indicators with custom tinted menubar icons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the generic 🟢🟡🔴 emoji status indicators with custom PNG icons (Claude spark logo and Clawd pixel art character) that are tinted green/yellow/red based on usage level. Icons are Base64-embedded in source for build-system independence. Users can switch between Spark and Clawd styles via a segmented picker in the popover footer. Co-Authored-By: Claude Opus 4.6 (1M context) --- ClaudeUsage.xcodeproj/project.pbxproj | 4 + ClaudeUsage/ClaudeUsageApp.swift | 27 ++++++- ClaudeUsage/StatusIcon.swift | 109 ++++++++++++++++++++++++++ ClaudeUsage/UsageManager.swift | 5 ++ ClaudeUsage/UsageView.swift | 9 +++ clawd.png | Bin 0 -> 36992 bytes icon.png | Bin 0 -> 742 bytes 7 files changed, 152 insertions(+), 2 deletions(-) create mode 100644 ClaudeUsage/StatusIcon.swift create mode 100644 clawd.png create mode 100644 icon.png diff --git a/ClaudeUsage.xcodeproj/project.pbxproj b/ClaudeUsage.xcodeproj/project.pbxproj index 0e89dc9..645ded5 100644 --- a/ClaudeUsage.xcodeproj/project.pbxproj +++ b/ClaudeUsage.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 002 /* UsageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 102 /* UsageManager.swift */; }; 003 /* UsageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 103 /* UsageView.swift */; }; 004 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 104 /* Assets.xcassets */; }; + 005 /* StatusIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 106 /* StatusIcon.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -20,6 +21,7 @@ 103 /* UsageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsageView.swift; sourceTree = ""; }; 104 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 105 /* ClaudeUsage.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ClaudeUsage.entitlements; sourceTree = ""; }; + 106 /* StatusIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusIcon.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -47,6 +49,7 @@ 101 /* ClaudeUsageApp.swift */, 102 /* UsageManager.swift */, 103 /* UsageView.swift */, + 106 /* StatusIcon.swift */, 104 /* Assets.xcassets */, 105 /* ClaudeUsage.entitlements */, ); @@ -133,6 +136,7 @@ 001 /* ClaudeUsageApp.swift in Sources */, 002 /* UsageManager.swift in Sources */, 003 /* UsageView.swift in Sources */, + 005 /* StatusIcon.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ClaudeUsage/ClaudeUsageApp.swift b/ClaudeUsage/ClaudeUsageApp.swift index 6f99ef8..f4c458c 100644 --- a/ClaudeUsage/ClaudeUsageApp.swift +++ b/ClaudeUsage/ClaudeUsageApp.swift @@ -1,5 +1,6 @@ import SwiftUI import Combine +import AppKit @main struct ClaudeUsageApp: App { @@ -19,6 +20,10 @@ class AppDelegate: NSObject, NSApplicationDelegate { var usageManager = UsageManager() var timer: Timer? var cancellables = Set() + var iconStyle: MenubarIconStyle { + let raw = UserDefaults.standard.string(forKey: "menubarIconStyle") ?? MenubarIconStyle.spark.rawValue + return MenubarIconStyle(rawValue: raw) ?? .spark + } func applicationDidFinishLaunching(_ notification: Notification) { // Hide dock icon - menubar only @@ -51,6 +56,12 @@ class AppDelegate: NSObject, NSApplicationDelegate { .receive(on: DispatchQueue.main) .sink { [weak self] _ in self?.updateStatusItem() } .store(in: &cancellables) + + // Re-render icon when user switches icon style in preferences + NotificationCenter.default.publisher(for: UserDefaults.didChangeNotification) + .receive(on: DispatchQueue.main) + .sink { [weak self] _ in self?.updateStatusItem() } + .store(in: &cancellables) } @objc func handleWake() { @@ -106,11 +117,23 @@ class AppDelegate: NSObject, NSApplicationDelegate { if let usage = usageManager.usage { let sessionPct = usage.sessionPercentage - let emoji = usageManager.statusEmoji - button.title = "\(emoji) \(sessionPct)%" + let utilization = usageManager.statusUtilization + let color = StatusIcon.color(forUtilization: utilization) + + if let icon = StatusIcon.menubarIcon(style: iconStyle, color: color) { + button.image = icon + button.imagePosition = .imageLeft + button.title = " \(sessionPct)%" + } else { + // Fallback to emoji if image loading fails + button.image = nil + button.title = "\(usageManager.statusEmoji) \(sessionPct)%" + } } else if usageManager.error != nil { + button.image = nil button.title = "❌" } else { + button.image = nil button.title = "⏳" } } diff --git a/ClaudeUsage/StatusIcon.swift b/ClaudeUsage/StatusIcon.swift new file mode 100644 index 0000000..d19c89f --- /dev/null +++ b/ClaudeUsage/StatusIcon.swift @@ -0,0 +1,109 @@ +import AppKit + +enum MenubarIconStyle: String, CaseIterable { + case spark = "spark" + case clawd = "clawd" + + var displayName: String { + switch self { + case .spark: return "Spark" + case .clawd: return "Clawd" + } + } +} + +enum StatusIcon { + + private static let menubarHeight: CGFloat = 18 + + // icon.png resized to 36x36 (2x for menubar) + private static let sparkBase64 = "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" + + // clawd.png with white border removed, resized to height 36, nearest-neighbor for pixel art + private static let clawdBase64 = "iVBORw0KGgoAAAANSUhEUgAAACwAAAAkCAYAAADy19hsAAAB3UlEQVR4nOWYS0rEQBCGv+qJL3yBoIjgVsGNZ9CFF3Ch5xBBj6DgQXThatYeZHwsBEXd+MIHOGpJSc8YM8mY0WAS/SAQOt3Vf1cqleoWkhHyRdOKqgBDqnpFjojICHALPIfbXUzf/rzFGqp6aY4jQhBtAPpsZfvry7Gv5LeY2ti2t98PmPO0nYfzjt0wLfriBBcaR8lwlIwgFLeBX0APxaHb63nx6U0DL3ZYVa99p2MKgqoeRPLylYntUtW6NdZWF5vpQ4KuT4OnN3ea97W1pUwETbexqc/1j35bu++ZS0S6Gx6OFZknEq+lUrqPzlEygrQds4rbn9osnYcdJcNRMsT/TUZV9TT8oCDl5SdEpCdo/PJEZM7XwhVVrVIARGQe6AUegSPg1AS/Ahd+O2LZeozicA6ceaea6JdGWrPi4s6HiK2oKNwA1+12HPYg19j9c1nCUTIcf7WWmArlxWiOjsuZcey3GZc276cW/BUisgDY4Ud0YvE7mr0s5slMMHAInCQIHs9qkiwFPwH1BMFP//ajc/xjwUJOjKsqnV7AZIJo+YHNiajNOA8/iMjsNxZ6n1CHqLc504mxarW6YuOiNpNO4Af9lSZkrDw1sS2n5RGbdjg90KFNq9askmzyBn/yz6+c1NcLAAAAAElFTkSuQmCC" + + /// Returns a tinted menubar icon for the given usage level. + static func menubarIcon(style: MenubarIconStyle, color: NSColor) -> NSImage? { + guard let baseImage = loadEmbeddedImage(style: style) else { return nil } + let resized = resizeForMenubar(baseImage) + switch style { + case .spark: + return tintedImage(resized, color: color) + case .clawd: + return colorBlendImage(resized, color: color) + } + } + + /// Returns the appropriate NSColor for a usage percentage. + static func color(forUtilization utilization: Double) -> NSColor { + if utilization >= 90 { return .systemRed } + if utilization >= 70 { return NSColor(red: 1.0, green: 0.8, blue: 0.0, alpha: 1.0) } + return .systemGreen + } + + /// Load image from embedded Base64 data — no bundle/asset catalog dependency. + private static func loadEmbeddedImage(style: MenubarIconStyle) -> NSImage? { + let b64: String + switch style { + case .spark: b64 = sparkBase64 + case .clawd: b64 = clawdBase64 + } + guard let data = Data(base64Encoded: b64), + let image = NSImage(data: data) else { return nil } + return image + } + + /// Resize image to fit menubar height, preserving aspect ratio. + private static func resizeForMenubar(_ image: NSImage) -> NSImage { + let originalSize = image.size + guard originalSize.height > 0 else { return image } + + let scale = menubarHeight / originalSize.height + let newSize = NSSize(width: round(originalSize.width * scale), height: menubarHeight) + + let resized = NSImage(size: newSize, flipped: false) { rect in + image.draw(in: rect, + from: NSRect(origin: .zero, size: originalSize), + operation: .copy, + fraction: 1.0) + return true + } + return resized + } + + /// Tints a silhouette image — fills all opaque pixels with the given color. + private static func tintedImage(_ image: NSImage, color: NSColor) -> NSImage { + let size = image.size + return NSImage(size: size, flipped: false) { rect in + image.draw(in: rect) + color.set() + rect.fill(using: .sourceAtop) + return true + } + } + + /// Color-blend tint — changes hue/saturation while preserving luminance. + /// Keeps black (eyes) dark and white (outline) light. + private static func colorBlendImage(_ image: NSImage, color: NSColor) -> NSImage { + let size = image.size + let result = NSImage(size: size, flipped: false) { rect in + guard let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil), + let ctx = NSGraphicsContext.current?.cgContext else { return false } + + // Draw original image + ctx.draw(cgImage, in: rect) + + // Apply color blend: keeps luminance from original, takes hue+saturation from tint + ctx.setBlendMode(.color) + ctx.setFillColor(color.cgColor) + ctx.fill(rect) + + // Restore alpha from the original (color blend can affect transparency) + ctx.setBlendMode(.destinationIn) + ctx.draw(cgImage, in: rect) + + return true + } + return result + } +} diff --git a/ClaudeUsage/UsageManager.swift b/ClaudeUsage/UsageManager.swift index 137e27a..8de484b 100644 --- a/ClaudeUsage/UsageManager.swift +++ b/ClaudeUsage/UsageManager.swift @@ -68,6 +68,11 @@ class UsageManager: ObservableObject { return "🟢" } + var statusUtilization: Double { + guard let usage = usage else { return 0 } + return max(usage.sessionUtilization, usage.weeklyUtilization) + } + func refresh() async { await refreshWithRetry(retriesRemaining: 5) } diff --git a/ClaudeUsage/UsageView.swift b/ClaudeUsage/UsageView.swift index 1a7f7e5..076a7f1 100644 --- a/ClaudeUsage/UsageView.swift +++ b/ClaudeUsage/UsageView.swift @@ -5,6 +5,7 @@ import ServiceManagement struct UsageView: View { @ObservedObject var manager: UsageManager @Environment(\.openURL) var openURL + @AppStorage("menubarIconStyle") private var iconStyleRaw: String = MenubarIconStyle.spark.rawValue @State private var launchAtLogin: Bool = { if #available(macOS 13.0, *) { return SMAppService.mainApp.status == .enabled @@ -186,6 +187,14 @@ struct UsageView: View { .font(.caption) .padding(.top, 8) + Picker("Icon", selection: $iconStyleRaw) { + ForEach(MenubarIconStyle.allCases, id: \.rawValue) { style in + Text(style.displayName).tag(style.rawValue) + } + } + .pickerStyle(.segmented) + .padding(.horizontal) + Toggle("Launch at Login", isOn: $launchAtLogin) .toggleStyle(.checkbox) .font(.caption) diff --git a/clawd.png b/clawd.png new file mode 100644 index 0000000000000000000000000000000000000000..f62ec8e732a07240b9b8bff99bbc887c0a4fb99c GIT binary patch literal 36992 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 literal 0 HcmV?d00001 diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2261b93ba5a9320905821346169c4357e088e2c6 GIT binary patch literal 742 zcmVI;;5+;MZVgNC0auGw%SBpQ5Q9as3i zPOul~C2la#u7$nNaN2X@-`aZ3D^l22D^b(HmhPUuEsLnTw}<5F?;-Yd z*uwXKR^TDf09*o20Q-RLz$##Q4Dq04l%#d44-(0lAA zJ_0t#?X3}Ut@Jirp@eHtj%39`Q|vpmf#Kpl0UKqz>7A%c#U^JI1EQI(loBmRuWwTid1uQjE0Ca_E6b3pG%r4UR52Ac6A zy*5qe!FTumwfY6d8&Bl56?zua8t06$x+3l!o+K`%xVw8BV6=ps_#SaC40nMsxr(Or zuy-oi0!)u6f$NOR`;!1=%3$XpBsIWV`Uh52Xk Y8&Dk!i17!QY5)KL07*qoM6N<$f~;j(u>b%7 literal 0 HcmV?d00001