Fixed 1 color picker bug made home UI padding

This commit is contained in:
Venkatesh 2026-03-31 20:35:47 +08:00
commit 90b5dae3ba
12 changed files with 58 additions and 122 deletions

View file

@ -991,7 +991,7 @@ struct ContentView: View {
.background(
Image(nsImage: musicManager.albumArt)
.resizable()
.aspectRatio(contentMode: .fit)
.scaledToFill()
)
.clipped()
.clipShape(RoundedRectangle(cornerRadius: MusicPlayerImageSizes.cornerRadiusInset.closed))

View file

@ -928,6 +928,9 @@
}
}
}
},
"%0.1f" : {
},
"%d%%" : {
"localizations" : {
@ -1853,10 +1856,6 @@
}
}
},
"±10 Seconds" : {
"comment" : "Display name for the \"±10 Seconds\" music skip behavior option.",
"isCommentAutoGenerated" : true
},
"0" : {
"comment" : "A label displayed in a circular gauge to indicate the minimum battery level.",
"isCommentAutoGenerated" : true,
@ -2330,10 +2329,6 @@
}
}
},
"Accent" : {
"comment" : "Display name for the caps lock indicator tint mode.",
"isCommentAutoGenerated" : true
},
"Accent color" : {
"localizations" : {
"ar" : {
@ -2737,10 +2732,6 @@
"comment" : "Label for the active GPU field in the GPU usage dashboard.",
"isCommentAutoGenerated" : true
},
"Adaptive gradient" : {
"comment" : "Display name for the timer icon color mode: adaptive gradient.",
"isCommentAutoGenerated" : true
},
"Add" : {
"localizations" : {
"ar" : {
@ -4579,10 +4570,6 @@
}
}
},
"Apple Music" : {
"comment" : "Media controller type for Apple Music",
"isCommentAutoGenerated" : true
},
"Applies the notch-style parallax effect to the lock screen media widget album art." : {
"localizations" : {
"ko" : {
@ -5164,10 +5151,6 @@
}
}
},
"Bar" : {
"comment" : "Name of the timer progress style that shows a horizontal bar.",
"isCommentAutoGenerated" : true
},
"Battery" : {
"localizations" : {
"ar" : {
@ -10531,10 +10514,6 @@
}
}
},
"Digital" : {
"comment" : "The display name for the \"Digital\" reminder presentation style.",
"isCommentAutoGenerated" : true
},
"Dimensions" : {
"localizations" : {
"ko" : {
@ -11892,9 +11871,6 @@
},
"Enable album art parallax" : {
},
"Enable album art parallax effect" : {
},
"Enable and style the media controls that appear above the system clock when the screen is locked." : {
"comment" : "A description of the media panel settings in the lock screen settings view.",
@ -14849,10 +14825,6 @@
}
}
},
"Green" : {
"comment" : "Display name for the green caps lock indicator tint mode.",
"isCommentAutoGenerated" : true
},
"Height:" : {
"extractionState" : "stale",
"localizations" : {
@ -19228,6 +19200,7 @@
}
},
"Minutes" : {
"extractionState" : "stale",
"localizations" : {
"fr" : {
"stringUnit" : {
@ -21731,10 +21704,6 @@
}
}
},
"Now Playing" : {
"comment" : "Name of the media controller type for the \"Now Playing\" option.",
"isCommentAutoGenerated" : true
},
"Number of lines kept in the scrollback buffer. Higher values use more memory." : {
"localizations" : {
"ko" : {
@ -22281,10 +22250,6 @@
}
}
},
"Panel" : {
"comment" : "Display name for the clipboard display mode \"Panel\".",
"isCommentAutoGenerated" : true
},
"Panel mode shows clipboard in a floating window near the notch." : {
"comment" : "A description of the \"Panel\" clipboard display mode.",
"isCommentAutoGenerated" : true,
@ -22340,6 +22305,9 @@
}
}
}
},
"Parallax Effect Intensity" : {
},
"Pause" : {
"shouldTranslate" : false
@ -24560,10 +24528,6 @@
}
}
},
"Ring" : {
"comment" : "The name of the timer progress style that shows a ring shape.",
"isCommentAutoGenerated" : true
},
"Rotation:" : {
"extractionState" : "stale",
"localizations" : {
@ -25611,10 +25575,6 @@
}
}
},
"Separate Tab" : {
"comment" : "Display name for the clipboard display mode option to open the clipboard in a separate tab.",
"isCommentAutoGenerated" : true
},
"Separate Tab mode integrates Copied Items and Notes into a single view. If both are enabled, Notes appear on the right and Clipboard on the left." : {
"comment" : "A description of the \"Separate Tab\" clipboard display mode.",
"isCommentAutoGenerated" : true,
@ -26974,14 +26934,6 @@
}
}
},
"Shows screen assistant as a dropdown attached to the AI button" : {
"comment" : "Description of the screen assistant display mode option that shows the screen assistant as a dropdown attached to the AI button.",
"isCommentAutoGenerated" : true
},
"Shows screen assistant in a floating panel near the notch" : {
"comment" : "Description of the screen assistant display mode option that shows the screen assistant in a floating panel near the notch.",
"isCommentAutoGenerated" : true
},
"Shows the model's reasoning process before the final answer" : {
"localizations" : {
"fr" : {
@ -27093,10 +27045,6 @@
}
}
},
"Skip forward or backward by ten seconds" : {
"comment" : "Description of a music skip behavior option.",
"isCommentAutoGenerated" : true
},
"Slider color" : {
"localizations" : {
"ar" : {
@ -27704,10 +27652,6 @@
}
}
},
"Spotify" : {
"comment" : "Spotify media controller type.",
"isCommentAutoGenerated" : true
},
"Square" : {
"localizations" : {
"ar" : {
@ -27853,10 +27797,6 @@
}
}
},
"Standard previous/next track controls" : {
"comment" : "Description of the music skip behavior option to use standard previous/next track controls.",
"isCommentAutoGenerated" : true
},
"Start" : {
"localizations" : {
"fr" : {
@ -29697,10 +29637,6 @@
},
"shouldTranslate" : false
},
"Track Skip" : {
"comment" : "Display name for the \"Track Skip\" music skip behavior.",
"isCommentAutoGenerated" : true
},
"Transform" : {
"extractionState" : "stale",
"localizations" : {
@ -32089,10 +32025,6 @@
}
}
},
"Youtube Music" : {
"comment" : "Spotify music service.",
"isCommentAutoGenerated" : true
},
"YouTube Music requires this third-party app to be installed: " : {
"localizations" : {
"ar" : {

View file

@ -301,7 +301,7 @@ struct LockScreenMusicPanel: View {
if showAppIcon, let icon = lockScreenAppIcon {
icon
.resizable()
.aspectRatio(contentMode: .fill)
.scaledToFill()
.frame(width: appIconSize, height: appIconSize)
.clipShape(RoundedRectangle(cornerRadius: appIconCornerRadius, style: .continuous))
.shadow(color: Color.black.opacity(0.35), radius: 6, x: 0, y: 4)
@ -310,7 +310,7 @@ struct LockScreenMusicPanel: View {
}
}
.albumArtFlip(angle: musicManager.flipAngle)
.parallax3D(magnitude: 12, enableOverride: lockScreenParallaxEnabled, suspended: isParallaxSuspended)
.parallax3D(enableOverride: lockScreenParallaxEnabled, suspended: isParallaxSuspended)
.frame(width: size, height: size)
.background(albumArtBackground(cornerRadius: cornerRadius))
}
@ -1049,7 +1049,7 @@ struct LockScreenMusicPanel: View {
private func albumArtImage(size: CGFloat, cornerRadius: CGFloat) -> some View {
Image(nsImage: musicManager.albumArt)
.resizable()
.aspectRatio(contentMode: .fit)
.scaledToFill()
.frame(width: size, height: size)
.clipShape(RoundedRectangle(cornerRadius: cornerRadius, style: .continuous))
}
@ -1082,7 +1082,7 @@ struct LockScreenMusicPanel: View {
}
private var appIconCornerRadius: CGFloat {
isExpanded ? 18 : 10
isExpanded ? 18 : 12
}
private var appIconOffset: CGFloat {

View file

@ -63,6 +63,7 @@ struct MinimalisticMusicView: View {
// Lyrics under the author name (same font size as author)
if enableLyrics {
lyricsLineView
.font(.system(size: 11, weight: .regular))
}
}
.frame(width: geo.size.width, height: geo.size.height, alignment: .center)

View file

@ -34,6 +34,7 @@ struct DynamicIslandHeader: View {
@Default(.enableTimerFeature) var enableTimerFeature
@Default(.timerDisplayMode) var timerDisplayMode
@Default(.showClipboardIcon) var showClipboardIcon
@Default(.showColorPickerIcon) var showColorPickerIcon
@Default(.clipboardDisplayMode) var clipboardDisplayMode
var body: some View {
@ -50,6 +51,8 @@ struct DynamicIslandHeader: View {
.blur(radius: vm.notchState == .closed ? 20 : 0)
.animation(.smooth.delay(0.1), value: vm.notchState)
.zIndex(2)
.padding(8)
}
if vm.notchState == .open && !Defaults[.enableMinimalisticUI] {
@ -128,7 +131,7 @@ struct DynamicIslandHeader: View {
}
// ColorPicker button
if Defaults[.enableColorPickerFeature] {
if Defaults[.enableColorPickerFeature] && showColorPickerIcon{
Button(action: {
switch Defaults[.colorPickerDisplayMode] {
case .panel:
@ -293,7 +296,7 @@ private extension DynamicIslandHeader {
Defaults[.settingsIconInNotch]
&& Defaults[.enableClipboardManager]
&& Defaults[.showClipboardIcon]
&& Defaults[.enableColorPickerFeature]
&& Defaults[.showColorPickerIcon]
&& Defaults[.enableTimerFeature]
}
}

View file

@ -374,7 +374,7 @@ struct MinimalisticMusicPlayerView: View {
private struct MinimalisticReminderEventListView: View {
let reminders: [ReminderLiveActivityManager.ReminderEntry]
private let textFont = Font.system(size: 13, weight: .semibold)
private let textFont = Font.system(size: 13, weight: .regular)
private let separatorSpacing: CGFloat = 10
var body: some View {
@ -1128,7 +1128,7 @@ struct MinimalisticAlbumArtView: View {
.background(
Image(nsImage: musicManager.albumArt)
.resizable()
.aspectRatio(contentMode: .fit)
.scaledToFill()
)
.clipped()
.clipShape(RoundedRectangle(cornerRadius: 12))
@ -1147,13 +1147,13 @@ struct MinimalisticAlbumArtView: View {
.background(
Image(nsImage: musicManager.albumArt)
.resizable()
.aspectRatio(contentMode: .fit)
.scaledToFill()
)
.clipped()
.clipShape(RoundedRectangle(cornerRadius: 12))
.matchedGeometryEffect(id: "albumArt", in: albumArtNamespace)
.albumArtFlip(angle: musicManager.flipAngle)
.parallax3D(magnitude: 12)
.parallax3D()
}
.buttonStyle(PlainButtonStyle())
.opacity(musicManager.isPlaying ? 1 : 0.4)

View file

@ -33,7 +33,6 @@ struct MusicPlayerView: View {
var body: some View {
HStack(alignment: .top, spacing: 12) {
AlbumArtView(vm: vm, albumArtNamespace: albumArtNamespace)
.padding(.all, 5)
MusicControlsView()
.frame(maxWidth: .infinity, alignment: .leading)
}
@ -61,7 +60,7 @@ struct AlbumArtView: View {
.background(
Image(nsImage: musicManager.albumArt)
.resizable()
.aspectRatio(contentMode: .fit)
.scaledToFill()
)
.clipped()
.clipShape(
@ -86,7 +85,9 @@ struct AlbumArtView: View {
appIconOverlay
}
.albumArtFlip(angle: musicManager.flipAngle)
.parallax3D(magnitude: 12)
.parallax3D()
.padding(.bottom, -5)
}
.buttonStyle(PlainButtonStyle())
.scaleEffect(musicManager.isPlaying ? 1 : 0.85)
@ -109,7 +110,8 @@ struct AlbumArtView: View {
.overlay {
Image(nsImage: musicManager.albumArt)
.resizable()
.aspectRatio(contentMode: .fit)
.scaledToFill() //to ensure the thumbnail will always be within the square icon
}
.matchedGeometryEffect(id: "albumArt", in: albumArtNamespace)
.clipped()
@ -126,8 +128,8 @@ struct AlbumArtView: View {
if vm.notchState == .open && !musicManager.usingAppIconForArtwork {
AppIcon(for: musicManager.bundleIdentifier ?? "com.apple.Music")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 30, height: 30)
.scaledToFill()
.frame(width: 36, height: 36)
.offset(x: 10, y: 10)
.transition(.scale.combined(with: .opacity).animation(.bouncy.delay(0.3)))
.zIndex(2)
@ -207,9 +209,9 @@ struct MusicControlsView: View {
MarqueeText(
lyricsBinding,
font: .headline,
font: .system(size: 12, weight: .regular),
nsFont: .headline,
textColor: .white.opacity(0.8),
textColor: .white.opacity(0.7),
minDuration: 0.35,
frameWidth: width
)
@ -605,6 +607,7 @@ struct NotchHomeView: View {
.combined(with: .blurReplace.animation(.smooth.speed(0.9)))
.combined(with: .move(edge: .top)))
.blur(radius: vm.notchState == .closed ? 30 : 0)
.padding(8) //Put the main padding here for consistency!!!
}
private var minimalisticOverridePayload: ExtensionNotchExperiencePayload? {
@ -713,6 +716,7 @@ struct MusicSliderView: View {
LiveStreamProgressIndicator(tint: sliderTint)
.frame(maxWidth: .infinity)
.frame(height: sliderFrameHeight)
case .inline:
HStack(spacing: 10) {
Spacer()
@ -720,6 +724,7 @@ struct MusicSliderView: View {
LiveStreamProgressIndicator(tint: sliderTint)
.frame(maxWidth: .infinity)
.frame(height: sliderFrameHeight)
Spacer()
.frame(width: 48)
}
@ -748,10 +753,10 @@ struct MusicSliderView: View {
)
}
private var sliderTint: Color {
private var sliderTint: Color {//
switch Defaults[.sliderColor] {
case .albumArt:
return Color(nsColor: color).ensureMinimumBrightness(factor: 0.8)
return Color(nsColor: color).ensureMinimumBrightness(factor: 0.6)
case .accent:
return .accentColor
case .white:

View file

@ -2443,6 +2443,9 @@ struct Media: View {
@Default(.lockScreenMusicAlbumParallaxEnabled) private var lockScreenMusicAlbumParallaxEnabled
@Default(.showStandardMediaControls) private var showStandardMediaControls
@Default(.autoHideInactiveNotchMediaPlayer) private var autoHideInactiveNotchMediaPlayer
@Default(.parallaxEffectIntensity) private var parallaxEffectIntensity
@ObservedObject private var musicManager = MusicManager.shared
private var isAppleMusicActive: Bool {
@ -2587,10 +2590,18 @@ struct Media: View {
Text("Enable lyrics")
}
.settingsHighlight(id: highlightID("Enable lyrics"))
Defaults.Toggle(key: .enableParallaxEffect) {
Text("Enable album art parallax effect")
//Parallax Effect Intensity to control how much parallax is wanted
Slider(value: $parallaxEffectIntensity, in: 0...12, step: 1.0) {
HStack {
Text("Parallax Effect Intensity")
Spacer()
Text("\(parallaxEffectIntensity, specifier: "%0.1f")")
.foregroundStyle(.secondary)
}
}
.settingsHighlight(id: highlightID("Enable album art parallax effect"))
Picker("Sneak Peek Style", selection: $sneakPeekStyles){
ForEach(SneakPeekStyle.allCases) { style in
Text(style.rawValue).tag(style)

View file

@ -31,7 +31,6 @@ struct TabButton: View {
var body: some View {
Button(action: onClick) {
Image(systemName: icon)
.padding(.horizontal, 15)
.contentShape(Capsule())
}
.buttonStyle(PlainButtonStyle())

View file

@ -105,7 +105,7 @@ struct TabSelectionView: View {
return tabsArray
}
var body: some View {
HStack(spacing: 0) {
HStack(spacing: 32) {
ForEach(tabs) { tab in
let isSelected = isSelected(tab)
let activeAccent = tab.accentColor ?? .white
@ -117,23 +117,10 @@ struct TabSelectionView: View {
}
.frame(height: 26)
.foregroundStyle(isSelected ? activeAccent : .gray)
.background {
if isSelected {
Capsule()
.fill((tab.accentColor ?? Color(nsColor: .secondarySystemFill)).opacity(0.25))
.shadow(color: (tab.accentColor ?? .clear).opacity(0.4), radius: 8)
.matchedGeometryEffect(id: "capsule", in: animation)
} else {
Capsule()
.fill(Color.clear)
.matchedGeometryEffect(id: "capsule", in: animation)
.hidden()
}
}
}
}
.animation(.smooth(duration: 0.3), value: coordinator.currentView)
.clipShape(Capsule())
.onAppear {
ensureValidSelection(with: tabs)
}

View file

@ -22,17 +22,16 @@ import AppKit
import Defaults
struct ParallaxMotionModifier: ViewModifier {
var magnitude: Double
var enableOverride: Bool?
var isSuspended: Bool
@Default(.enableParallaxEffect) var enableParallaxEffect
@Default(.parallaxEffectIntensity) var parallaxEffectIntensity
@State private var offset: CGSize = .zero
@State private var isHovering = false
@State private var viewSize: CGSize = .zero
func body(content: Content) -> some View {
if isSuspended || !(enableOverride ?? enableParallaxEffect) {
if isSuspended || !(enableOverride ?? (parallaxEffectIntensity > 0.0)) {
content
} else {
content
@ -69,11 +68,11 @@ struct ParallaxMotionModifier: ViewModifier {
}
}
.rotation3DEffect(
.degrees(offset.height * magnitude), // Y movement rotates around X axis
.degrees(offset.height * parallaxEffectIntensity), // Y movement rotates around X axis
axis: (x: 1, y: 0, z: 0)
)
.rotation3DEffect(
.degrees(offset.width * -magnitude), // X movement rotates around Y axis (inverted to look naturally)
.degrees(offset.width * -parallaxEffectIntensity), // X movement rotates around Y axis (inverted to look naturally)
axis: (x: 0, y: 1, z: 0)
)
.scaleEffect(isHovering ? 1.02 : 1.0) // Subtle scale up on hover
@ -83,10 +82,9 @@ struct ParallaxMotionModifier: ViewModifier {
extension View {
func parallax3D(
magnitude: Double = 10,
enableOverride: Bool? = nil,
suspended: Bool = false
) -> some View {
modifier(ParallaxMotionModifier(magnitude: magnitude, enableOverride: enableOverride, isSuspended: suspended))
modifier(ParallaxMotionModifier(enableOverride: enableOverride, isSuspended: suspended))
}
}

View file

@ -776,7 +776,7 @@ extension Defaults.Keys {
static let sneakPeekStyles = Key<SneakPeekStyle>("sneakPeekStyles", default: .standard)
static let showSneakPeekOnTrackChange = Key<Bool>("showSneakPeekOnTrackChange", default: true)
static let enableFullscreenMediaDetection = Key<Bool>("enableFullscreenMediaDetection", default: true)
static let enableParallaxEffect = Key<Bool>("enableParallaxEffect", default: true)
static let parallaxEffectIntensity = Key<Double>("parallaxEffectIntensity", default: 6.0)
static let waitInterval = Key<Double>("waitInterval", default: 3)
static let showShuffleAndRepeat = Key<Bool>("showShuffleAndRepeat", default: true)
static let showMediaOutputControl = Key<Bool>("showMediaOutputControl", default: true)