diff --git a/DynamicIsland/ContentView.swift b/DynamicIsland/ContentView.swift index 981af01..b97b446 100644 --- a/DynamicIsland/ContentView.swift +++ b/DynamicIsland/ContentView.swift @@ -87,6 +87,18 @@ struct ContentView: View { var dynamicNotchSize: CGSize { let baseSize = Defaults[.enableMinimalisticUI] ? minimalisticOpenNotchSize : openNotchSize + // When inline sneak peek is active in closed notch, use the wider inline width + // so the outer maxWidth frame doesn't clip the expanded content + let inlineSneakPeekActive = vm.notchState == .closed + && coordinator.expandingView.show + && (coordinator.expandingView.type == .music || coordinator.expandingView.type == .timer) + && Defaults[.enableSneakPeek] + && Defaults[.sneakPeekStyles] == .inline + if inlineSneakPeekActive { + let inlineWidth: CGFloat = 460 + return CGSize(width: max(baseSize.width, inlineWidth), height: baseSize.height) + } + if coordinator.currentView == .timer { return CGSize(width: baseSize.width, height: 250) // Extra height for timer presets } @@ -952,37 +964,42 @@ struct ContentView: View { .fill(.black) .frame(width: effectiveCenterWidth, height: notchContentHeight) .overlay( - HStack(alignment: .top){ + HStack(alignment: .top) { if(coordinator.expandingView.show && coordinator.expandingView.type == .music) { MarqueeText( .constant(musicManager.songTitle), textColor: Defaults[.coloredSpectrogram] ? Color(nsColor: musicManager.avgColor) : Color.gray, minDuration: 0.4, - frameWidth: 100 + frameWidth: max(0, (effectiveCenterWidth - vm.closedNotchSize.width) / 2 - 12) ) + .padding(.leading, 8) .opacity((coordinator.expandingView.show && Defaults[.enableSneakPeek] && Defaults[.sneakPeekStyles] == .inline) ? 1 : 0) Spacer(minLength: vm.closedNotchSize.width) Text(musicManager.artistName) .lineLimit(1) .truncationMode(.tail) .foregroundStyle(Defaults[.coloredSpectrogram] ? Color(nsColor: musicManager.avgColor) : Color.gray) + .padding(.trailing, 8) .opacity((coordinator.expandingView.show && coordinator.expandingView.type == .music && Defaults[.enableSneakPeek] && Defaults[.sneakPeekStyles] == .inline) ? 1 : 0) } else if(coordinator.expandingView.show && coordinator.expandingView.type == .timer) { MarqueeText( .constant(timerManager.timerName), textColor: timerManager.timerColor, minDuration: 0.4, - frameWidth: 100 + frameWidth: max(0, (effectiveCenterWidth - vm.closedNotchSize.width) / 2 - 12) ) + .padding(.leading, 8) .opacity((coordinator.expandingView.show && Defaults[.enableSneakPeek] && Defaults[.sneakPeekStyles] == .inline) ? 1 : 0) Spacer(minLength: vm.closedNotchSize.width) Text(timerManager.formattedRemainingTime()) .lineLimit(1) .truncationMode(.tail) .foregroundStyle(timerManager.timerColor) + .padding(.trailing, 8) .opacity((coordinator.expandingView.show && coordinator.expandingView.type == .timer && Defaults[.enableSneakPeek] && Defaults[.sneakPeekStyles] == .inline) ? 1 : 0) } } + .clipped() ) musicRightWing(for: secondary, notchHeight: notchContentHeight, trailingWidth: rightWingWidth) diff --git a/DynamicIsland/DynamicIslandApp.swift b/DynamicIsland/DynamicIslandApp.swift index 6bceecd..1143c43 100644 --- a/DynamicIsland/DynamicIslandApp.swift +++ b/DynamicIsland/DynamicIslandApp.swift @@ -297,8 +297,8 @@ class AppDelegate: NSObject, NSApplicationDelegate { // If inline sneak peek is active, use a wider width to accommodate the expanded content if isInlineSneakPeekActive { // Calculate required width for inline sneak peek: - // Album art (~32) + Middle section (380) + Visualizer (~32) + padding = ~450 - let inlineSneakPeekWidth: CGFloat = 450 + // Album art (~32) + Middle section (380) + Visualizer (~32) + horizontal padding (28) + clip shape margin (12) + let inlineSneakPeekWidth: CGFloat = 460 return CGSize(width: inlineSneakPeekWidth, height: vm.effectiveClosedNotchHeight) } @@ -513,11 +513,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { }.store(in: &cancellables) // Observe minimalistic UI setting changes - trigger window resize - Defaults.publisher(.enableMinimalisticUI, options: []).sink { [weak self] change in - // Force sneak peek to standard mode when minimalistic UI is enabled - if change.newValue == true && Defaults[.sneakPeekStyles] != .standard { - Defaults[.sneakPeekStyles] = .standard - } + Defaults.publisher(.enableMinimalisticUI, options: []).sink { [weak self] _ in // Update window size IMMEDIATELY (no debouncing) to prevent position shift self?.updateWindowSizeIfNeeded() }.store(in: &cancellables) diff --git a/DynamicIsland/Localizable.xcstrings b/DynamicIsland/Localizable.xcstrings index f84bc5f..9f538da 100644 --- a/DynamicIsland/Localizable.xcstrings +++ b/DynamicIsland/Localizable.xcstrings @@ -22077,6 +22077,7 @@ }, "Sneak peek style is locked to Standard in minimalistic mode" : { "comment" : "A message displayed when the sneak peek style is locked to standard in minimalistic UI mode.", + "extractionState" : "stale", "isCommentAutoGenerated" : true, "localizations" : { "pt-BR" : { diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index 7484500..5c7a6ce 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -2308,21 +2308,9 @@ struct Media: View { Text(style.rawValue).tag(style) } } - .disabled(!enableSneakPeek || enableMinimalisticUI) - .onChange(of: enableMinimalisticUI) { _, isMinimalistic in - // Force standard sneak peek style when minimalistic UI is enabled - if isMinimalistic { - sneakPeekStyles = .standard - } - } + .disabled(!enableSneakPeek) .settingsHighlight(id: highlightID("Sneak Peek Style")) - if enableMinimalisticUI { - Text("Sneak peek style is locked to Standard in minimalistic mode") - .font(.caption) - .foregroundStyle(.secondary) - } - HStack { Stepper(value: $waitInterval, in: 0...10, step: 1) { HStack {