Merge branch 'main' into feature/configurable-media-key-steps

This commit is contained in:
Hariharan Mudaliar 2026-05-18 21:45:18 +05:30 • committed by GitHub
commit d6e833e724
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 7444 additions and 346 deletions

View file

@ -113,6 +113,7 @@ struct MinimalisticMusicPlayerView: View {
// Compact progress bar
progressBar
.padding(.top, 6)
.clipped()
// Compact playback controls
if shouldShowControlHUDRow {
@ -133,7 +134,7 @@ struct MinimalisticMusicPlayerView: View {
reminderList
}
.padding(.horizontal, 12)
.padding(.top, -15)
.padding(.top, 12)
.padding(.bottom, ReminderLiveActivityManager.baselineMinimalisticBottomPadding)
.frame(maxWidth: .infinity)
.frame(height: calculateDynamicHeight(), alignment: .top)
@ -254,7 +255,7 @@ struct MinimalisticMusicPlayerView: View {
height += 6 + 4 // progress bar + top padding
// Add playback controls height
height += 40 + 2 // controls + top padding
height += 54 + 2 // controls + top padding
// Add lyrics height if enabled in settings (reserve space even while loading)
if enableLyrics {
@ -706,7 +707,7 @@ private struct MinimalisticReminderDetailsView: View {
// MARK: - Playback Controls (Larger)
private var playbackControls: some View {
HStack(spacing: 16) {
HStack(spacing: 10) {
ForEach(Array(displayedSlots.enumerated()), id: \.offset) { _, slot in
slotView(for: slot)
}
@ -834,10 +835,10 @@ private struct MinimalisticReminderDetailsView: View {
private var playPauseButton: some View {
MinimalisticSquircircleButton(
icon: musicManager.isPlaying ? (musicManager.isLiveStream ? "stop.fill" : "pause.fill") : "play.fill",
fontSize: 28,
fontSize: 26,
fontWeight: .semibold,
frameSize: CGSize(width: 60, height: 60),
cornerRadius: 24,
frameSize: CGSize(width: 54, height: 54),
cornerRadius: 22,
foregroundColor: .white,
pressEffect: .none,
symbolEffectStyle: .replace,
@ -867,8 +868,8 @@ private struct MinimalisticReminderDetailsView: View {
icon: icon,
fontSize: size,
fontWeight: .medium,
frameSize: CGSize(width: 40, height: 40),
cornerRadius: 16,
frameSize: CGSize(width: 36, height: 36),
cornerRadius: 14,
foregroundColor: isActive ? resolvedActiveColor : .white.opacity(0.85),
pressEffect: pressEffect,
symbolEffectStyle: symbolEffect,
@ -991,8 +992,8 @@ private struct MinimalisticReminderDetailsView: View {
icon: routeManager.activeDevice?.iconName ?? "speaker.wave.2",
fontSize: 18,
fontWeight: .medium,
frameSize: CGSize(width: 40, height: 40),
cornerRadius: 16,
frameSize: CGSize(width: 36, height: 36),
cornerRadius: 14,
foregroundColor: .white.opacity(0.85),
symbolEffectStyle: .replace
) {
@ -1051,8 +1052,8 @@ private struct MinimalisticReminderDetailsView: View {
icon: "airplayaudio",
fontSize: 18,
fontWeight: .medium,
frameSize: CGSize(width: 40, height: 40),
cornerRadius: 16,
frameSize: CGSize(width: 36, height: 36),
cornerRadius: 14,
foregroundColor: .white.opacity(0.85),
symbolEffectStyle: .replace
) {
@ -1144,17 +1145,17 @@ struct MinimalisticAlbumArtView: View {
)
.clipped()
.clipShape(RoundedRectangle(cornerRadius: albumArtCornerRadius))
.scaleEffect(x: 1.3, y: 1.4)
.scaleEffect(x: 1.08, y: 1.1)
.rotationEffect(.degrees(92))
.blur(radius: 35)
.blur(radius: 16)
.opacity(
usesLiveCanvasArtwork
? (musicManager.isPlaying ? 0.68 : 0.22)
: min(0.6, 1 - max(musicManager.albumArt.getBrightness(), 0.3))
? (musicManager.isPlaying ? 0.55 : 0.18)
: min(0.45, 1 - max(musicManager.albumArt.getBrightness(), 0.3))
)
.shadow(
color: Color(nsColor: musicManager.avgColor).opacity(usesLiveCanvasArtwork ? 0.28 : 0.16),
radius: usesLiveCanvasArtwork ? 18 : 12,
color: Color(nsColor: musicManager.avgColor).opacity(usesLiveCanvasArtwork ? 0.22 : 0.12),
radius: usesLiveCanvasArtwork ? 10 : 7,
x: 0,
y: 0
)

View file

@ -632,10 +632,10 @@ struct SettingsView: View {
}
VStack(alignment: .leading, spacing: 2) {
Text(suggestion.title)
Text(LocalizedStringKey(suggestion.title))
.font(.system(size: 13, weight: .semibold))
.foregroundStyle(Color.primary)
Text(suggestion.tab.title)
Text(LocalizedStringKey(suggestion.tab.title))
.font(.system(size: 11))
.foregroundStyle(Color.secondary)
}
@ -2239,12 +2239,12 @@ private struct SystemControlsView: View {
case .betterDisplay:
if betterDisplayManager.isRunning { return "Running" }
if betterDisplayManager.isDetected { return "Not running" }
return "Not detected"
return String(localized: "Not detected")
case .lunar:
if lunarManager.isConnected { return "Connected" }
if lunarManager.isRunning { return "Running" }
if lunarManager.isDetected { return "Not running" }
return "Not detected"
return String(localized: "Not detected")
}
}
@ -2266,23 +2266,23 @@ private struct SystemControlsView: View {
switch thirdPartyDDCProvider {
case .betterDisplay:
if !betterDisplayManager.isDetected {
return "Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD."
return String(localized: "Install [BetterDisplay](https://betterdisplay.pro) to control external display brightness (and optional volume) through Atoll's HUD.")
}
if !betterDisplayManager.isRunning {
return "BetterDisplay is installed but not currently running. Launch BetterDisplay to enable integration."
return String(localized: "BetterDisplay is installed but not currently running. Launch BetterDisplay to enable 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."
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.")
case .lunar:
if !lunarManager.isDetected {
return "Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC."
return String(localized: "Install [Lunar](https://lunar.fyi) to control external display brightness, contrast, and optional volume through Atoll's HUD via DDC.")
}
if !lunarManager.isRunning {
return "Lunar is installed but not currently running. Launch Lunar to enable integration."
return String(localized: "Lunar is installed but not currently running. Launch Lunar to enable integration.")
}
if lunarManager.isConnected {
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: "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 "Lunar is running but the socket connection is not yet established. It will connect automatically."
return String(localized: "Lunar is running but the socket connection is not yet established. It will connect automatically.")
}
}
@ -3125,14 +3125,14 @@ struct CalendarSettings: View {
var title: String {
switch self {
case .mins15: return "15 mins"
case .mins30: return "30 mins"
case .hour1: return "1 hour"
case .hours3: return "3 hours"
case .hours6: return "6 hours"
case .hours12: return "12 hours"
case .restOfDay: return "Rest of the day"
case .allTime: return "All time"
case .mins15: return String(localized: "15 mins")
case .mins30: return String(localized: "30 mins")
case .hour1: return String(localized: "1 hour")
case .hours3: return String(localized: "3 hours")
case .hours6: return String(localized: "6 hours")
case .hours12: return String(localized: "12 hours")
case .restOfDay: return String(localized: "Rest of the day")
case .allTime: return String(localized: "All time")
}
}
}
@ -3623,9 +3623,9 @@ private extension DevicesSettingsView {
var title: String {
switch self {
case .symbol:
return "Symbol"
return String(localized: "Symbol")
case .threeD:
return "3D"
return String(localized: "3D")
}
}
}
@ -4961,14 +4961,14 @@ struct LockScreenSettings: View {
var title: String {
switch self {
case .mins15: return "15 mins"
case .mins30: return "30 mins"
case .hour1: return "1 hour"
case .hours3: return "3 hours"
case .hours6: return "6 hours"
case .hours12: return "12 hours"
case .restOfDay: return "Rest of the day"
case .allTime: return "All time"
case .mins15: return String(localized: "15 mins")
case .mins30: return String(localized: "30 mins")
case .hour1: return String(localized: "1 hour")
case .hours3: return String(localized: "3 hours")
case .hours6: return String(localized: "6 hours")
case .hours12: return String(localized: "12 hours")
case .restOfDay: return String(localized: "Rest of the day")
case .allTime: return String(localized: "All time")
}
}
}
@ -4982,9 +4982,9 @@ struct LockScreenSettings: View {
var title: String {
switch self {
case .leading: return "Left"
case .center: return "Center"
case .trailing: return "Right"
case .leading: return String(localized: "Left")
case .center: return String(localized: "Center")
case .trailing: return String(localized: "Right")
}
}
}
@ -7057,11 +7057,11 @@ struct StatsSettings: View {
private var formattedUpdateInterval: String {
let seconds = Int(statsUpdateInterval.rounded())
if seconds >= 60 {
return "60 s (1 min)"
return String(localized: "60 s (1 min)")
} else if seconds == 1 {
return "1 s"
return String(localized: "1 s")
} else {
return "\(seconds) s"
return String(localized: "\(seconds) s")
}
}
@ -7453,16 +7453,16 @@ struct ClipboardSettings: View {
let interval = Date().timeIntervalSince(date)
if interval < 60 {
return "Just now"
return String(localized: "Just now")
} else if interval < 3600 {
let minutes = Int(interval / 60)
return "\(minutes)m ago"
return String(localized: "\(minutes)m ago")
} else if interval < 86400 {
let hours = Int(interval / 3600)
return "\(hours)h ago"
return String(localized: "\(hours)h ago")
} else {
let days = Int(interval / 86400)
return "\(days)d ago"
return String(localized: "\(days)d ago")
}
}
}
@ -7631,16 +7631,16 @@ struct ScreenAssistantSettings: View {
let interval = Date().timeIntervalSince(date)
if interval < 60 {
return "Just now"
return String(localized: "Just now")
} else if interval < 3600 {
let minutes = Int(interval / 60)
return "\(minutes)m ago"
return String(localized: "\(minutes)m ago")
} else if interval < 86400 {
let hours = Int(interval / 3600)
return "\(hours)h ago"
return String(localized: "\(hours)h ago")
} else {
let days = Int(interval / 86400)
return "\(days)d ago"
return String(localized: "\(days)d ago")
}
}
}
@ -8004,21 +8004,21 @@ struct SettingsPermissionCallout: View {
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Label(title, systemImage: icon)
Label(LocalizedStringKey(title), systemImage: icon)
.font(.subheadline.weight(.semibold))
.foregroundStyle(iconColor)
Text(message)
Text(LocalizedStringKey(message))
.font(.caption)
.foregroundStyle(.secondary)
HStack(spacing: 8) {
Button(requestButtonTitle) {
Button(LocalizedStringKey(requestButtonTitle)) {
requestAction()
}
.buttonStyle(.borderedProminent)
Button(openSettingsButtonTitle) {
Button(LocalizedStringKey(openSettingsButtonTitle)) {
openSettingsAction()
}
.buttonStyle(.bordered)