diff --git a/Resources/StatusBar/OpenLessStatusIcon.svg b/Resources/StatusBar/OpenLessStatusIcon.svg
new file mode 100644
index 00000000..7ca877fb
--- /dev/null
+++ b/Resources/StatusBar/OpenLessStatusIcon.svg
@@ -0,0 +1,10 @@
+
diff --git a/Sources/OpenLessApp/MenuBarController.swift b/Sources/OpenLessApp/MenuBarController.swift
index 217e0239..00c906ac 100644
--- a/Sources/OpenLessApp/MenuBarController.swift
+++ b/Sources/OpenLessApp/MenuBarController.swift
@@ -10,15 +10,13 @@ final class MenuBarController {
init(coordinator: DictationCoordinator) {
self.coordinator = coordinator
- statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
+ statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
if let button = statusItem.button {
- if let image = NSImage(systemSymbolName: "mic.circle", accessibilityDescription: "OpenLess") {
- image.isTemplate = true
- button.image = image
- } else {
- button.title = "OL"
- }
- button.toolTip = "OpenLess — 点击菜单选择模式 / 退出"
+ button.image = StatusBarIcon.image()
+ button.imageScaling = .scaleProportionallyDown
+ button.imagePosition = .imageOnly
+ button.toolTip = "OpenLess — 点击菜单选择模式 / 退出"
+ button.setAccessibilityLabel("OpenLess")
}
actions = MenuActions(coordinator: coordinator)
statusItem.menu = buildMenu()
diff --git a/Sources/OpenLessApp/StatusBarIcon.swift b/Sources/OpenLessApp/StatusBarIcon.swift
new file mode 100644
index 00000000..536fa311
--- /dev/null
+++ b/Sources/OpenLessApp/StatusBarIcon.swift
@@ -0,0 +1,56 @@
+import AppKit
+
+enum StatusBarIcon {
+ static func image() -> NSImage {
+ if let url = Bundle.main.url(forResource: "OpenLessStatusIcon", withExtension: "svg"),
+ let image = NSImage(contentsOf: url) {
+ image.size = NSSize(width: 18, height: 18)
+ image.isTemplate = false
+ return image
+ }
+ return fallbackImage()
+ }
+
+ private static func fallbackImage() -> NSImage {
+ let size = NSSize(width: 18, height: 18)
+ let image = NSImage(size: size)
+ image.lockFocus()
+ defer { image.unlockFocus() }
+
+ NSColor.clear.setFill()
+ NSRect(origin: .zero, size: size).fill()
+
+ let dark = NSColor(calibratedRed: 0.07, green: 0.09, blue: 0.12, alpha: 1)
+ let blue = NSColor(calibratedRed: 0.18, green: 0.50, blue: 1.0, alpha: 1)
+ let plate = NSBezierPath(roundedRect: NSRect(x: 1.7, y: 1.7, width: 14.6, height: 14.6), xRadius: 4.3, yRadius: 4.3)
+ NSColor.white.withAlphaComponent(0.92).setFill()
+ plate.fill()
+ dark.withAlphaComponent(0.10).setStroke()
+ plate.lineWidth = 0.45
+ plate.stroke()
+
+ let ring = NSBezierPath()
+ ring.lineWidth = 2.2
+ ring.lineCapStyle = .round
+ ring.appendArc(
+ withCenter: NSPoint(x: 8.5, y: 9),
+ radius: 6.1,
+ startAngle: 42,
+ endAngle: 330,
+ clockwise: false
+ )
+ dark.setStroke()
+ ring.stroke()
+
+ let dash = NSBezierPath()
+ dash.lineWidth = 2.1
+ dash.lineCapStyle = .round
+ dash.move(to: NSPoint(x: 12.4, y: 9))
+ dash.line(to: NSPoint(x: 16.1, y: 9))
+ blue.setStroke()
+ dash.stroke()
+
+ image.isTemplate = false
+ return image
+ }
+}
diff --git a/scripts/build-app.sh b/scripts/build-app.sh
index cb526dd5..9544981c 100755
--- a/scripts/build-app.sh
+++ b/scripts/build-app.sh
@@ -27,6 +27,7 @@ rm -rf "${APP_DIR}"
mkdir -p "${BIN_DIR}" "${RES_DIR}"
cp "${BIN_SRC}" "${BIN_DIR}/${APP_NAME}"
cp "Resources/AppIcon.icns" "${RES_DIR}/AppIcon.icns"
+cp "Resources/StatusBar/OpenLessStatusIcon.svg" "${RES_DIR}/OpenLessStatusIcon.svg"
cat > "${APP_DIR}/Contents/Info.plist" <