diff --git a/DynamicIsland/ContentView.swift b/DynamicIsland/ContentView.swift index d194707..8760a57 100644 --- a/DynamicIsland/ContentView.swift +++ b/DynamicIsland/ContentView.swift @@ -125,7 +125,15 @@ struct ContentView: View { // Only close if mouse leaves and the notch is open and no popovers are active if !hovering && vm.notchState == .open && !vm.isBatteryPopoverActive { - vm.close() + // Add slight delay for stats tab to prevent accidental closure during layout changes + let delay: Double = (coordinator.currentView == .stats) ? 0.2 : 0.0 + + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { + // Double-check conditions after delay + if !isHovering && vm.notchState == .open && !vm.isBatteryPopoverActive { + vm.close() + } + } } } .onTapGesture { diff --git a/DynamicIsland/components/Notch/NotchStatsView.swift b/DynamicIsland/components/Notch/NotchStatsView.swift index 6deac34..94e81e5 100644 --- a/DynamicIsland/components/Notch/NotchStatsView.swift +++ b/DynamicIsland/components/Notch/NotchStatsView.swift @@ -118,25 +118,71 @@ struct NotchStatsView: View { return graphs } - // Simplified and more consistent layout system + // Smart grid layout system for different graph counts @ViewBuilder var statsGridLayout: some View { let graphCount = availableGraphs.count - // Use LazyVGrid for all cases - more predictable layout behavior - LazyVGrid( - columns: Array(repeating: GridItem(.flexible(), spacing: 8), count: min(graphCount, 3)), - spacing: 12 - ) { - ForEach(0.. 0.1 && previousNetworkStats.bytesIn > 0 && previousNetworkStats.bytesOut > 0 { + // Only calculate speeds if we have a reasonable time interval and this isn't the first run + if timeInterval > 0.1 && (previousNetworkStats.bytesIn > 0 || previousNetworkStats.bytesOut > 0) { let bytesDownloaded = currentNetworkStats.bytesIn > previousNetworkStats.bytesIn ? currentNetworkStats.bytesIn - previousNetworkStats.bytesIn : 0 let bytesUploaded = currentNetworkStats.bytesOut > previousNetworkStats.bytesOut ? @@ -136,8 +136,8 @@ class StatsManager: ObservableObject { var readSpeed: Double = 0.0 var writeSpeed: Double = 0.0 - // Only calculate speeds if we have a reasonable time interval and previous data - if timeInterval > 0.1 && previousDiskStats.bytesRead > 0 && previousDiskStats.bytesWritten > 0 { + // Only calculate speeds if we have a reasonable time interval and this isn't the first run + if timeInterval > 0.1 && (previousDiskStats.bytesRead > 0 || previousDiskStats.bytesWritten > 0) { let bytesRead = currentDiskStats.bytesRead > previousDiskStats.bytesRead ? currentDiskStats.bytesRead - previousDiskStats.bytesRead : 0 let bytesWritten = currentDiskStats.bytesWritten > previousDiskStats.bytesWritten ?