From d99443be6dffc59a7a01ff31d45e052c75d6f876 Mon Sep 17 00:00:00 2001 From: ericholguin Date: Sat, 21 Feb 2026 12:40:12 -0700 Subject: [PATCH] ui: Fixes for iOS 26 toolbars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: This will only become user-facing once we switch to liquid glass mode, therefore no changelog entry is needed now. Changelog-None Closes: https://github.com/damus-io/damus/issues/3702 Co-Authored-by: Daniel D’Aquino Signed-off-by: ericholguin --- damus.xcodeproj/project.pbxproj | 8 +++++ damus/ContentView.swift | 2 ++ .../Views/NotificationsView.swift | 3 ++ .../Features/Profile/Views/ProfileView.swift | 4 +++ .../Modifiers/ToolbarItemModifier.swift | 35 +++++++++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 damus/Shared/Modifiers/ToolbarItemModifier.swift diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj index cfbe371f..0d1bf2a6 100644 --- a/damus.xcodeproj/project.pbxproj +++ b/damus.xcodeproj/project.pbxproj @@ -1706,6 +1706,9 @@ D76BE18C2E0CF3DA004AD0C6 /* Interests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76BE18B2E0CF3D5004AD0C6 /* Interests.swift */; }; D76BE18D2E0CF3DA004AD0C6 /* Interests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76BE18B2E0CF3D5004AD0C6 /* Interests.swift */; }; D76BE18E2E0CF3DA004AD0C6 /* Interests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76BE18B2E0CF3D5004AD0C6 /* Interests.swift */; }; + D76C034D2F6B6D78002CAEB5 /* ToolbarItemModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76C034C2F6B6D78002CAEB5 /* ToolbarItemModifier.swift */; }; + D76C034E2F6B6D78002CAEB5 /* ToolbarItemModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76C034C2F6B6D78002CAEB5 /* ToolbarItemModifier.swift */; }; + D76C034F2F6B6D78002CAEB5 /* ToolbarItemModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76C034C2F6B6D78002CAEB5 /* ToolbarItemModifier.swift */; }; D77135D32E7B766B00E7639F /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77135D22E7B766300E7639F /* DataExtensions.swift */; }; D77135D42E7B766B00E7639F /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77135D22E7B766300E7639F /* DataExtensions.swift */; }; D77135D52E7B766B00E7639F /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77135D22E7B766300E7639F /* DataExtensions.swift */; }; @@ -2863,6 +2866,7 @@ D767066E2C8BB3CE00F09726 /* URLHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLHandler.swift; sourceTree = ""; }; D76874F22AE3632B00FB0F68 /* ProfileZapLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileZapLinkView.swift; sourceTree = ""; }; D76BE18B2E0CF3D5004AD0C6 /* Interests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Interests.swift; sourceTree = ""; }; + D76C034C2F6B6D78002CAEB5 /* ToolbarItemModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarItemModifier.swift; sourceTree = ""; }; D77135D22E7B766300E7639F /* DataExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataExtensions.swift; sourceTree = ""; }; D773BC5E2C6D538500349F0A /* CommentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentItem.swift; sourceTree = ""; }; D774A5C72F4F93F5006A4D64 /* StorageStatsViewHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageStatsViewHelper.swift; sourceTree = ""; }; @@ -5458,6 +5462,7 @@ children = ( 5C8F97482EB46208009399B1 /* Glow.swift */, F7F0BA24297892BD009531F3 /* SwipeToDismiss.swift */, + D76C034C2F6B6D78002CAEB5 /* ToolbarItemModifier.swift */, ); path = Modifiers; sourceTree = ""; @@ -6197,6 +6202,7 @@ 5C513FCC2984ACA60072348F /* QRCodeView.swift in Sources */, 4CC14FF52A740BB7007AEB17 /* NoteId.swift in Sources */, 4C19AE512A5CEF7C00C90DB7 /* NostrScript.swift in Sources */, + D76C034E2F6B6D78002CAEB5 /* ToolbarItemModifier.swift in Sources */, 4C32B95E2A9AD44700DC3548 /* FlatBufferObject.swift in Sources */, D783A63F2AD4E53D00658DDA /* SuggestedHashtagsView.swift in Sources */, D73FA9E12DDC12AA00C706E1 /* OnboardingContentSettings.swift in Sources */, @@ -6775,6 +6781,7 @@ 82D6FB8F2CD99F7900C925F4 /* DirectMessagesModel.swift in Sources */, D73C7EDD2DE517A1001F9392 /* OnboardingContentSettings.swift in Sources */, 82D6FB902CD99F7900C925F4 /* DirectMessageModel.swift in Sources */, + D76C034F2F6B6D78002CAEB5 /* ToolbarItemModifier.swift in Sources */, 82D6FB912CD99F7900C925F4 /* UserSettingsStore.swift in Sources */, 82D6FB922CD99F7900C925F4 /* Wallet.swift in Sources */, 82D6FB932CD99F7900C925F4 /* Report.swift in Sources */, @@ -7348,6 +7355,7 @@ D73E5EF72C6A97F4007EB227 /* PullDownSearch.swift in Sources */, D73E5EF82C6A97F4007EB227 /* NotificationsView.swift in Sources */, D5C1AFC12E5DF7E60092F72F /* ContactCardManager.swift in Sources */, + D76C034D2F6B6D78002CAEB5 /* ToolbarItemModifier.swift in Sources */, D73B74E32D8365BA0067BDBC /* ExtraFonts.swift in Sources */, D73E5EF92C6A97F4007EB227 /* EventGroupView.swift in Sources */, D73E5EFA2C6A97F4007EB227 /* NotificationItemView.swift in Sources */, diff --git a/damus/ContentView.swift b/damus/ContentView.swift index af9d2677..65800548 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -254,6 +254,7 @@ struct ContentView: View { ToolbarItem(placement: .navigationBarLeading) { TopbarSideMenuButton(damus_state: damus, isSideBarOpened: $isSideBarOpened) } + .hideToolbarBackground() ToolbarItem(placement: .navigationBarTrailing) { HStack(alignment: .center) { @@ -271,6 +272,7 @@ struct ContentView: View { } } } + .hideToolbarBackground() } } .background(DamusColors.adaptableWhite) diff --git a/damus/Features/Notifications/Views/NotificationsView.swift b/damus/Features/Notifications/Views/NotificationsView.swift index 94bb8868..02564f70 100644 --- a/damus/Features/Notifications/Views/NotificationsView.swift +++ b/damus/Features/Notifications/Views/NotificationsView.swift @@ -124,6 +124,8 @@ struct NotificationsView: View { } ) } + .hideToolbarBackground() + ToolbarItem(placement: .navigationBarTrailing) { if showTrustedButton { TrustedNetworkButton(filter: $filter.friend_filter) { @@ -133,6 +135,7 @@ struct NotificationsView: View { } } } + .hideToolbarBackground() } .onChange(of: filter.friend_filter) { val in state.settings.friend_filter = val diff --git a/damus/Features/Profile/Views/ProfileView.swift b/damus/Features/Profile/Views/ProfileView.swift index 63596d2c..8bf8e693 100644 --- a/damus/Features/Profile/Views/ProfileView.swift +++ b/damus/Features/Profile/Views/ProfileView.swift @@ -503,6 +503,8 @@ struct ProfileView: View { .padding(.top, max(5, 15 + (yOffset / 30))) } } + .hideToolbarBackground() + if showFollowBtnInBlurrBanner() { ToolbarItem(placement: .topBarTrailing) { FollowButtonView( @@ -512,12 +514,14 @@ struct ProfileView: View { ) .padding(.top, 8) } + .hideToolbarBackground() } else { ToolbarItem(placement: .topBarTrailing) { navActionSheetButton .padding(.top, 5) .accentColor(DamusColors.white) } + .hideToolbarBackground() } } .toolbarBackground(.hidden) diff --git a/damus/Shared/Modifiers/ToolbarItemModifier.swift b/damus/Shared/Modifiers/ToolbarItemModifier.swift new file mode 100644 index 00000000..eb82b519 --- /dev/null +++ b/damus/Shared/Modifiers/ToolbarItemModifier.swift @@ -0,0 +1,35 @@ +// +// ToolbarItemModifier.swift +// damus +// + +import SwiftUI + +/// Extension that adds the `.hideToolbarBackground()` modifier to toolbar content. +/// +/// This modifier conditionally applies `.sharedBackgroundVisibility(.hidden)` on iOS 26+, +/// eliminating the need for duplicated `if #available(iOS 26.0, *)` checks throughout the codebase. +/// +/// - Usage: +/// ```swift +/// .toolbar { +/// ToolbarItem(placement: .navigationBarLeading) { +/// Button("Action") { } +/// } +/// .hideToolbarBackground() +/// } +/// ``` +@available(iOS 15.0, *) +extension ToolbarContent { + /// Hides the toolbar background on iOS 26+, leaving it unchanged on earlier versions. + /// + /// Apply this modifier to `ToolbarItem` views to suppress the shared background + /// visibility introduced in iOS 26 without duplicating version checks. + func hideToolbarBackground() -> some ToolbarContent { + if #available(iOS 26.0, *) { + return self.sharedBackgroundVisibility(.hidden) + } else { + return self + } + } +}