Update stuff

This commit is contained in:
Hariharan Mudaliar 2026-05-18 23:31:46 +05:30
commit 6cdce7a785
No known key found for this signature in database
GPG key ID: 025583EB0BE5640E
2 changed files with 82 additions and 160 deletions

View file

@ -2710,10 +2710,6 @@
} }
} }
}, },
"1 s" : {
"comment" : "A description of a 1-second update interval.",
"isCommentAutoGenerated" : true
},
"1. Open Spotify in a browser and log in" : { "1. Open Spotify in a browser and log in" : {
"comment" : "A step in the process of getting the Spotify cookie.", "comment" : "A step in the process of getting the Spotify cookie.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
@ -2813,10 +2809,6 @@
"comment" : "A step to copy the Spotify cookie from the developer tools.", "comment" : "A step to copy the Spotify cookie from the developer tools.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
}, },
"3 hours" : {
"comment" : "\"3 hours\" is a placeholder for a longer, more natural name for 3 hours.",
"isCommentAutoGenerated" : true
},
"3 items" : { "3 items" : {
"comment" : "merge:ko:alt='항목 3개'", "comment" : "merge:ko:alt='항목 3개'",
"localizations" : { "localizations" : {
@ -2862,10 +2854,6 @@
"comment" : "A step in the process of getting the Spotify cookie.", "comment" : "A step in the process of getting the Spotify cookie.",
"isCommentAutoGenerated" : true "isCommentAutoGenerated" : true
}, },
"3D" : {
"comment" : "A title for a 3D Bluetooth HUD icon style.",
"isCommentAutoGenerated" : true
},
"5 colors" : { "5 colors" : {
"comment" : "merge:ko:alt='5가지 색상'", "comment" : "merge:ko:alt='5가지 색상'",
"localizations" : { "localizations" : {
@ -3004,10 +2992,6 @@
} }
} }
}, },
"6 hours" : {
"comment" : "\"6 hours\" is a calendar time range.",
"isCommentAutoGenerated" : true
},
"7 items" : { "7 items" : {
"comment" : "merge:ko:alt='항목 7개'", "comment" : "merge:ko:alt='항목 7개'",
"localizations" : { "localizations" : {
@ -3159,10 +3143,6 @@
} }
} }
}, },
"12 hours" : {
"comment" : "\"12 hours\" is a placeholder for a time period of 12 hours.",
"isCommentAutoGenerated" : true
},
"15 colors" : { "15 colors" : {
"comment" : "merge:ko:alt='15가지 색상'", "comment" : "merge:ko:alt='15가지 색상'",
"localizations" : { "localizations" : {
@ -3417,10 +3397,6 @@
} }
} }
}, },
"60 s (1 min)" : {
"comment" : "A description of a 60-second update interval.",
"isCommentAutoGenerated" : true
},
"100" : { "100" : {
"comment" : "The text displayed below a 100% battery level in the lock screen.", "comment" : "The text displayed below a 100% battery level in the lock screen.",
"isCommentAutoGenerated" : true, "isCommentAutoGenerated" : true,
@ -5643,10 +5619,6 @@
} }
} }
}, },
"All time" : {
"comment" : "Calendar option to show all events for the current day.",
"isCommentAutoGenerated" : true
},
"All-day" : { "All-day" : {
"localizations" : { "localizations" : {
"ar" : { "ar" : {
@ -8562,14 +8534,6 @@
}, },
"shouldTranslate" : false "shouldTranslate" : false
}, },
"BetterDisplay is installed but not currently running. Launch BetterDisplay to enable integration." : {
"comment" : "A description of the status of the BetterDisplay integration.",
"isCommentAutoGenerated" : true
},
"BetterDisplay OSD events will be routed through Atoll's active HUD style. Brightness is always routed; volume is routed when external volume control listener is enabled below. Make sure BetterDisplay's OSD integration is enabled in Settings › Application › Integration." : {
"comment" : "A description of how BetterDisplay is integrated with Atoll.",
"isCommentAutoGenerated" : true
},
"Blue dashed box shows actual size in Atoll" : { "Blue dashed box shows actual size in Atoll" : {
"extractionState" : "stale", "extractionState" : "stale",
"localizations" : { "localizations" : {
@ -9986,6 +9950,7 @@
} }
}, },
"Center" : { "Center" : {
"extractionState" : "stale",
"localizations" : { "localizations" : {
"de" : { "de" : {
"stringUnit" : { "stringUnit" : {
@ -13290,10 +13255,6 @@
} }
} }
}, },
"Connected to Lunar's DDC socket. Brightness and contrast adjustments are shown through Atoll's HUD; volume follows when external volume control listener is enabled below." : {
"comment" : "A description of the connection status of the external display.",
"isCommentAutoGenerated" : true
},
"Connects directly to the Apple Music app." : { "Connects directly to the Apple Music app." : {
"localizations" : { "localizations" : {
"ko" : { "ko" : {
@ -17155,9 +17116,6 @@
} }
} }
} }
},
"Display Overlay" : {
}, },
"Display Style" : { "Display Style" : {
"localizations" : { "localizations" : {
@ -25680,14 +25638,6 @@
} }
} }
}, },
"Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD." : {
"comment" : "A description of the status of the BetterDisplay integration.",
"isCommentAutoGenerated" : true
},
"Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC." : {
"comment" : "A description of how to enable external display control via Lunar.",
"isCommentAutoGenerated" : true
},
"Install updates automatically" : { "Install updates automatically" : {
"comment" : "merge:ko:alt='자동으로 업데이트 설치'", "comment" : "merge:ko:alt='자동으로 업데이트 설치'",
"extractionState" : "stale", "extractionState" : "stale",
@ -28071,14 +28021,6 @@
} }
} }
}, },
"Lunar is installed but not currently running. Launch Lunar to enable integration." : {
"comment" : "A description of the state of the Lunar display integration.",
"isCommentAutoGenerated" : true
},
"Lunar is running but the socket connection is not yet established. It will connect automatically." : {
"comment" : "A description of the current state of the Lunar DDC socket connection.",
"isCommentAutoGenerated" : true
},
"Lyrics" : { "Lyrics" : {
"localizations" : { "localizations" : {
"ko" : { "ko" : {
@ -33431,10 +33373,6 @@
} }
} }
}, },
"Not detected" : {
"comment" : "A description of a display provider that is not detected.",
"isCommentAutoGenerated" : true
},
"Not Determined" : { "Not Determined" : {
"localizations" : { "localizations" : {
"ko" : { "ko" : {
@ -38678,10 +38616,6 @@
} }
} }
}, },
"Rest of the day" : {
"comment" : "Title for the calendar view option that shows the entire day.",
"isCommentAutoGenerated" : true
},
"Restart" : { "Restart" : {
"extractionState" : "stale", "extractionState" : "stale",
"localizations" : { "localizations" : {
@ -46660,10 +46594,6 @@
} }
} }
}, },
"Symbol" : {
"comment" : "A title for a Bluetooth HUD icon style.",
"isCommentAutoGenerated" : true
},
"System" : { "System" : {
"comment" : "A label displayed above the system, load average, and uptime information.", "comment" : "A label displayed above the system, load average, and uptime information.",
"isCommentAutoGenerated" : true, "isCommentAutoGenerated" : true,

View file

@ -56,7 +56,6 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
case timer case timer
case calendar case calendar
case hudAndOSD case hudAndOSD
case systemControls
case battery case battery
case stats case stats
case clipboard case clipboard
@ -76,7 +75,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
switch self { switch self {
case .general, .appearance: return .core case .general, .appearance: return .core
case .media, .liveActivities, .lockScreen, .devices: return .mediaAndDisplay case .media, .liveActivities, .lockScreen, .devices: return .mediaAndDisplay
case .systemControls, .hudAndOSD, .battery: return .system case .hudAndOSD, .battery: return .system
case .timer, .calendar, .notes: return .productivity case .timer, .calendar, .notes: return .productivity
case .clipboard, .screenAssistant, .colorPicker, .shelf, case .clipboard, .screenAssistant, .colorPicker, .shelf,
.downloads, .shortcuts: return .utilities .downloads, .shortcuts: return .utilities
@ -97,8 +96,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
case .extensions: return String(localized: "Extensions") case .extensions: return String(localized: "Extensions")
case .timer: return String(localized: "Timer") case .timer: return String(localized: "Timer")
case .calendar: return String(localized: "Calendar") case .calendar: return String(localized: "Calendar")
case .hudAndOSD: return String(localized: "Display Overlay") case .hudAndOSD: return String(localized: "Controls")
case .systemControls: return String(localized: "Controls")
case .battery: return String(localized: "Battery") case .battery: return String(localized: "Battery")
case .stats: return String(localized: "Stats") case .stats: return String(localized: "Stats")
case .clipboard: return String(localized: "Clipboard") case .clipboard: return String(localized: "Clipboard")
@ -124,8 +122,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
case .extensions: return "puzzlepiece.extension" case .extensions: return "puzzlepiece.extension"
case .timer: return "timer" case .timer: return "timer"
case .calendar: return "calendar" case .calendar: return "calendar"
case .hudAndOSD: return "rectangle.inset.filled.on.rectangle" case .hudAndOSD: return "dial.medium.fill"
case .systemControls: return "dial.medium.fill"
case .battery: return "battery.100.bolt" case .battery: return "battery.100.bolt"
case .stats: return "chart.xyaxis.line" case .stats: return "chart.xyaxis.line"
case .clipboard: return "clipboard" case .clipboard: return "clipboard"
@ -151,8 +148,7 @@ private enum SettingsTab: String, CaseIterable, Identifiable {
case .extensions: return Color(red: 0.557, green: 0.353, blue: 0.957) case .extensions: return Color(red: 0.557, green: 0.353, blue: 0.957)
case .timer: return .red case .timer: return .red
case .calendar: return .cyan case .calendar: return .cyan
case .hudAndOSD: return .orange case .hudAndOSD: return .indigo
case .systemControls: return .indigo
case .battery: return Color(red: 0.202, green: 0.783, blue: 0.348, opacity: 1.000) case .battery: return Color(red: 0.202, green: 0.783, blue: 0.348, opacity: 1.000)
case .stats: return .teal case .stats: return .teal
case .clipboard: return .mint case .clipboard: return .mint
@ -495,7 +491,6 @@ struct SettingsView: View {
.lockScreen, .lockScreen,
.devices, .devices,
// System // System
.systemControls,
.hudAndOSD, .hudAndOSD,
.battery, .battery,
// Productivity // Productivity
@ -632,10 +627,10 @@ struct SettingsView: View {
} }
VStack(alignment: .leading, spacing: 2) { VStack(alignment: .leading, spacing: 2) {
Text(LocalizedStringKey(suggestion.title)) Text(suggestion.title)
.font(.system(size: 13, weight: .semibold)) .font(.system(size: 13, weight: .semibold))
.foregroundStyle(Color.primary) .foregroundStyle(Color.primary)
Text(LocalizedStringKey(suggestion.tab.title)) Text(suggestion.tab.title)
.font(.system(size: 11)) .font(.system(size: 11))
.foregroundStyle(Color.secondary) .foregroundStyle(Color.secondary)
} }
@ -750,12 +745,6 @@ struct SettingsView: View {
SettingsSearchEntry(tab: .battery, title: "Full battery style", keywords: ["battery", "style", "compact", "standard"], highlightID: SettingsTab.battery.highlightID(for: "Full battery style")), SettingsSearchEntry(tab: .battery, title: "Full battery style", keywords: ["battery", "style", "compact", "standard"], highlightID: SettingsTab.battery.highlightID(for: "Full battery style")),
SettingsSearchEntry(tab: .battery, title: "Full charge threshold", keywords: ["battery", "threshold", "full"], highlightID: SettingsTab.battery.highlightID(for: "Full charge threshold")), SettingsSearchEntry(tab: .battery, title: "Full charge threshold", keywords: ["battery", "threshold", "full"], highlightID: SettingsTab.battery.highlightID(for: "Full charge threshold")),
// System Controls
SettingsSearchEntry(tab: .systemControls, title: "Step size", keywords: ["brightness", "volume", "step",], highlightID: SettingsTab.systemControls.highlightID(for: "Step size")),
SettingsSearchEntry(tab: .systemControls, title: "Third-party DDC app integration", keywords: ["ddc", "third party", "external", "display", "betterdisplay", "lunar"], highlightID: SettingsTab.systemControls.highlightID(for: "Third-party DDC app integration")),
SettingsSearchEntry(tab: .systemControls, title: "Third-party DDC provider", keywords: ["provider", "betterdisplay", "lunar", "integration", "refresh detection"], highlightID: SettingsTab.systemControls.highlightID(for: "Third-party DDC provider")),
SettingsSearchEntry(tab: .systemControls, title: "Enable external volume control listener", keywords: ["external volume", "ddc volume", "betterdisplay volume", "lunar volume", "disable native volume"], highlightID: SettingsTab.systemControls.highlightID(for: "Enable external volume control listener")),
// HUDs // HUDs
SettingsSearchEntry(tab: .devices, title: "Show Bluetooth device connections", keywords: ["bluetooth", "hud"], highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections")), SettingsSearchEntry(tab: .devices, title: "Show Bluetooth device connections", keywords: ["bluetooth", "hud"], highlightID: SettingsTab.devices.highlightID(for: "Show Bluetooth device connections")),
SettingsSearchEntry(tab: .devices, title: "Use circular battery indicator", keywords: ["battery", "circular"], highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator")), SettingsSearchEntry(tab: .devices, title: "Use circular battery indicator", keywords: ["battery", "circular"], highlightID: SettingsTab.devices.highlightID(for: "Use circular battery indicator")),
@ -778,6 +767,13 @@ struct SettingsView: View {
SettingsSearchEntry(tab: .hudAndOSD, title: "Keyboard Backlight OSD", keywords: ["keyboard", "backlight", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD")), SettingsSearchEntry(tab: .hudAndOSD, title: "Keyboard Backlight OSD", keywords: ["keyboard", "backlight", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Keyboard Backlight OSD")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Material", keywords: ["material", "frosted", "liquid", "glass", "solid", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material")), SettingsSearchEntry(tab: .hudAndOSD, title: "Material", keywords: ["material", "frosted", "liquid", "glass", "solid", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Material")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Icon & Progress Color", keywords: ["color", "icon", "white", "black", "gray", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color")), SettingsSearchEntry(tab: .hudAndOSD, title: "Icon & Progress Color", keywords: ["color", "icon", "white", "black", "gray", "osd"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Icon & Progress Color")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Volume step", keywords: ["volume", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume step")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Volume fine step", keywords: ["volume", "fine", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Volume fine step")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Brightness step", keywords: ["brightness", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness step")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Brightness fine step", keywords: ["brightness", "fine", "step", "percent"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Brightness fine step")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Third-party DDC app integration", keywords: ["ddc", "third party", "external", "display", "betterdisplay", "lunar"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Third-party DDC app integration")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Third-party DDC provider", keywords: ["provider", "betterdisplay", "lunar", "integration", "refresh detection"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Third-party DDC provider")),
SettingsSearchEntry(tab: .hudAndOSD, title: "Enable external volume control listener", keywords: ["external volume", "ddc volume", "betterdisplay volume", "lunar volume", "disable native volume"], highlightID: SettingsTab.hudAndOSD.highlightID(for: "Enable external volume control listener")),
// Media // Media
SettingsSearchEntry(tab: .media, title: "Music Source", keywords: ["media source", "controller"], highlightID: SettingsTab.media.highlightID(for: "Music Source")), SettingsSearchEntry(tab: .media, title: "Music Source", keywords: ["media source", "controller"], highlightID: SettingsTab.media.highlightID(for: "Music Source")),
@ -984,10 +980,6 @@ struct SettingsView: View {
SettingsForm(tab: .hudAndOSD) { SettingsForm(tab: .hudAndOSD) {
HUDAndOSDSettingsView() HUDAndOSDSettingsView()
} }
case .systemControls:
SettingsForm(tab: .systemControls) {
SystemControlsView()
}
case .battery: case .battery:
SettingsForm(tab: .battery) { SettingsForm(tab: .battery) {
Charge() Charge()
@ -2204,22 +2196,25 @@ private struct HUDAndOSDSettingsView: View {
} }
} }
} }
// Third-party display integrations (shared across all HUD variants)
ExternalDisplayIntegrationsSection()
} }
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.background(paneBackgroundColor)
.navigationTitle("Controls")
.onAppear { .onAppear {
if #unavailable(macOS 26.0), verticalHUDMaterial == .liquid { if #unavailable(macOS 26.0), verticalHUDMaterial == .liquid {
verticalHUDMaterial = .frosted verticalHUDMaterial = .frosted
verticalHUDLiquidGlassCustomizationMode = .standard verticalHUDLiquidGlassCustomizationMode = .standard
} }
} }
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.navigationTitle("Display Overlay")
} }
} }
// MARK: - External Display Integrations Settings Section // MARK: - External Display Integrations Settings Section
private struct SystemControlsView: View { private struct ExternalDisplayIntegrationsSection: View {
@Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration @Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration
@Default(.thirdPartyDDCProvider) var thirdPartyDDCProvider @Default(.thirdPartyDDCProvider) var thirdPartyDDCProvider
@Default(.enableExternalVolumeControlListener) var enableExternalVolumeControlListener @Default(.enableExternalVolumeControlListener) var enableExternalVolumeControlListener
@ -2239,12 +2234,12 @@ private struct SystemControlsView: View {
case .betterDisplay: case .betterDisplay:
if betterDisplayManager.isRunning { return "Running" } if betterDisplayManager.isRunning { return "Running" }
if betterDisplayManager.isDetected { return "Not running" } if betterDisplayManager.isDetected { return "Not running" }
return String(localized: "Not detected") return "Not detected"
case .lunar: case .lunar:
if lunarManager.isConnected { return "Connected" } if lunarManager.isConnected { return "Connected" }
if lunarManager.isRunning { return "Running" } if lunarManager.isRunning { return "Running" }
if lunarManager.isDetected { return "Not running" } if lunarManager.isDetected { return "Not running" }
return String(localized: "Not detected") return "Not detected"
} }
} }
@ -2266,23 +2261,23 @@ private struct SystemControlsView: View {
switch thirdPartyDDCProvider { switch thirdPartyDDCProvider {
case .betterDisplay: case .betterDisplay:
if !betterDisplayManager.isDetected { if !betterDisplayManager.isDetected {
return String(localized: "Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD.") return "Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD."
} }
if !betterDisplayManager.isRunning { if !betterDisplayManager.isRunning {
return String(localized: "BetterDisplay is installed but not currently running. Launch BetterDisplay to enable integration.") return "BetterDisplay is installed but not currently running. Launch BetterDisplay to enable integration."
} }
return String(localized: "BetterDisplay OSD events will be routed through Atoll's active HUD style. Brightness is always routed; volume is routed when external volume control listener is enabled below. Make sure BetterDisplay's OSD integration is enabled in Settings › Application › Integration.") return "BetterDisplay OSD events will be routed through Atoll's active HUD style. Brightness is always routed; volume is routed when external volume control listener is enabled below. Make sure BetterDisplay's OSD integration is enabled in Settings › Application › Integration."
case .lunar: case .lunar:
if !lunarManager.isDetected { if !lunarManager.isDetected {
return String(localized: "Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC.") return "Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC."
} }
if !lunarManager.isRunning { if !lunarManager.isRunning {
return String(localized: "Lunar is installed but not currently running. Launch Lunar to enable integration.") return "Lunar is installed but not currently running. Launch Lunar to enable integration."
} }
if lunarManager.isConnected { if lunarManager.isConnected {
return String(localized: "Connected to Lunar's DDC socket. Brightness and contrast adjustments are shown through Atoll's HUD; volume follows when external volume control listener is enabled below.") return "Connected to Lunar's DDC socket. Brightness and contrast adjustments are shown through Atoll's HUD; volume follows when external volume control listener is enabled below."
} }
return String(localized: "Lunar is running but the socket connection is not yet established. It will connect automatically.") return "Lunar is running but the socket connection is not yet established. It will connect automatically."
} }
} }
@ -2327,6 +2322,7 @@ private struct SystemControlsView: View {
.font(.caption) .font(.caption)
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
} }
Stepper(value: $brightnessStepPercent, in: 1...25) { Stepper(value: $brightnessStepPercent, in: 1...25) {
HStack { HStack {
Text("Brightness step") Text("Brightness step")
@ -2367,9 +2363,6 @@ private struct SystemControlsView: View {
Section { Section {
Toggle("Enable third-party DDC app integration", isOn: $enableThirdPartyDDCIntegration) Toggle("Enable third-party DDC app integration", isOn: $enableThirdPartyDDCIntegration)
.settingsHighlight(id: highlightID("Third-party DDC app integration")) .settingsHighlight(id: highlightID("Third-party DDC app integration"))
.onChange(of: enableThirdPartyDDCIntegration) { _, _ in
enableExternalVolumeControlListener = false
}
if enableThirdPartyDDCIntegration { if enableThirdPartyDDCIntegration {
Picker("Provider", selection: $thirdPartyDDCProvider) { Picker("Provider", selection: $thirdPartyDDCProvider) {
@ -2430,8 +2423,6 @@ private struct SystemControlsView: View {
} }
} }
} }
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
.navigationTitle("Controls")
} }
} }
@ -2587,7 +2578,6 @@ struct HUD: View {
@Default(.enableBrightnessHUD) var enableBrightnessHUD @Default(.enableBrightnessHUD) var enableBrightnessHUD
@Default(.enableKeyboardBacklightHUD) var enableKeyboardBacklightHUD @Default(.enableKeyboardBacklightHUD) var enableKeyboardBacklightHUD
@Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration @Default(.enableThirdPartyDDCIntegration) var enableThirdPartyDDCIntegration
@Default(.enableExternalVolumeControlListener) var enableExternalVolumeControlListener
@Default(.systemHUDSensitivity) var systemHUDSensitivity @Default(.systemHUDSensitivity) var systemHUDSensitivity
@ObservedObject var coordinator = DynamicIslandViewCoordinator.shared @ObservedObject var coordinator = DynamicIslandViewCoordinator.shared
@ObservedObject private var accessibilityPermission = AccessibilityPermissionStore.shared @ObservedObject private var accessibilityPermission = AccessibilityPermissionStore.shared
@ -2725,6 +2715,7 @@ struct HUD: View {
} }
} }
} }
.navigationTitle("Controls")
.onAppear { .onAppear {
accessibilityPermission.refreshStatus() accessibilityPermission.refreshStatus()
} }
@ -3125,14 +3116,14 @@ struct CalendarSettings: View {
var title: String { var title: String {
switch self { switch self {
case .mins15: return String(localized: "15 mins") case .mins15: return "15 mins"
case .mins30: return String(localized: "30 mins") case .mins30: return "30 mins"
case .hour1: return String(localized: "1 hour") case .hour1: return "1 hour"
case .hours3: return String(localized: "3 hours") case .hours3: return "3 hours"
case .hours6: return String(localized: "6 hours") case .hours6: return "6 hours"
case .hours12: return String(localized: "12 hours") case .hours12: return "12 hours"
case .restOfDay: return String(localized: "Rest of the day") case .restOfDay: return "Rest of the day"
case .allTime: return String(localized: "All time") case .allTime: return "All time"
} }
} }
} }
@ -3623,9 +3614,9 @@ private extension DevicesSettingsView {
var title: String { var title: String {
switch self { switch self {
case .symbol: case .symbol:
return String(localized: "Symbol") return "Symbol"
case .threeD: case .threeD:
return String(localized: "3D") return "3D"
} }
} }
} }
@ -4961,14 +4952,14 @@ struct LockScreenSettings: View {
var title: String { var title: String {
switch self { switch self {
case .mins15: return String(localized: "15 mins") case .mins15: return "15 mins"
case .mins30: return String(localized: "30 mins") case .mins30: return "30 mins"
case .hour1: return String(localized: "1 hour") case .hour1: return "1 hour"
case .hours3: return String(localized: "3 hours") case .hours3: return "3 hours"
case .hours6: return String(localized: "6 hours") case .hours6: return "6 hours"
case .hours12: return String(localized: "12 hours") case .hours12: return "12 hours"
case .restOfDay: return String(localized: "Rest of the day") case .restOfDay: return "Rest of the day"
case .allTime: return String(localized: "All time") case .allTime: return "All time"
} }
} }
} }
@ -4982,9 +4973,9 @@ struct LockScreenSettings: View {
var title: String { var title: String {
switch self { switch self {
case .leading: return String(localized: "Left") case .leading: return "Left"
case .center: return String(localized: "Center") case .center: return "Center"
case .trailing: return String(localized: "Right") case .trailing: return "Right"
} }
} }
} }
@ -7057,11 +7048,11 @@ struct StatsSettings: View {
private var formattedUpdateInterval: String { private var formattedUpdateInterval: String {
let seconds = Int(statsUpdateInterval.rounded()) let seconds = Int(statsUpdateInterval.rounded())
if seconds >= 60 { if seconds >= 60 {
return String(localized: "60 s (1 min)") return "60 s (1 min)"
} else if seconds == 1 { } else if seconds == 1 {
return String(localized: "1 s") return "1 s"
} else { } else {
return String(localized: "\(seconds) s") return "\(seconds) s"
} }
} }
@ -7453,16 +7444,16 @@ struct ClipboardSettings: View {
let interval = Date().timeIntervalSince(date) let interval = Date().timeIntervalSince(date)
if interval < 60 { if interval < 60 {
return String(localized: "Just now") return "Just now"
} else if interval < 3600 { } else if interval < 3600 {
let minutes = Int(interval / 60) let minutes = Int(interval / 60)
return String(localized: "\(minutes)m ago") return "\(minutes)m ago"
} else if interval < 86400 { } else if interval < 86400 {
let hours = Int(interval / 3600) let hours = Int(interval / 3600)
return String(localized: "\(hours)h ago") return "\(hours)h ago"
} else { } else {
let days = Int(interval / 86400) let days = Int(interval / 86400)
return String(localized: "\(days)d ago") return "\(days)d ago"
} }
} }
} }
@ -7631,16 +7622,16 @@ struct ScreenAssistantSettings: View {
let interval = Date().timeIntervalSince(date) let interval = Date().timeIntervalSince(date)
if interval < 60 { if interval < 60 {
return String(localized: "Just now") return "Just now"
} else if interval < 3600 { } else if interval < 3600 {
let minutes = Int(interval / 60) let minutes = Int(interval / 60)
return String(localized: "\(minutes)m ago") return "\(minutes)m ago"
} else if interval < 86400 { } else if interval < 86400 {
let hours = Int(interval / 3600) let hours = Int(interval / 3600)
return String(localized: "\(hours)h ago") return "\(hours)h ago"
} else { } else {
let days = Int(interval / 86400) let days = Int(interval / 86400)
return String(localized: "\(days)d ago") return "\(days)d ago"
} }
} }
} }
@ -7957,6 +7948,7 @@ struct CustomOSDSettings: View {
} }
} }
} }
.navigationTitle("Custom OSD")
.onAppear { .onAppear {
accessibilityPermission.refreshStatus() accessibilityPermission.refreshStatus()
if #unavailable(macOS 26.0), osdMaterial == .liquid { if #unavailable(macOS 26.0), osdMaterial == .liquid {
@ -8004,21 +7996,21 @@ struct SettingsPermissionCallout: View {
var body: some View { var body: some View {
VStack(alignment: .leading, spacing: 8) { VStack(alignment: .leading, spacing: 8) {
Label(LocalizedStringKey(title), systemImage: icon) Label(title, systemImage: icon)
.font(.subheadline.weight(.semibold)) .font(.subheadline.weight(.semibold))
.foregroundStyle(iconColor) .foregroundStyle(iconColor)
Text(LocalizedStringKey(message)) Text(message)
.font(.caption) .font(.caption)
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
HStack(spacing: 8) { HStack(spacing: 8) {
Button(LocalizedStringKey(requestButtonTitle)) { Button(requestButtonTitle) {
requestAction() requestAction()
} }
.buttonStyle(.borderedProminent) .buttonStyle(.borderedProminent)
Button(LocalizedStringKey(openSettingsButtonTitle)) { Button(openSettingsButtonTitle) {
openSettingsAction() openSettingsAction()
} }
.buttonStyle(.bordered) .buttonStyle(.bordered)