diff --git a/mobile/ios/Runner/IosNavigationBar.swift b/mobile/ios/Runner/IosNavigationBar.swift index 24692e38a3..1b9b1f4675 100644 --- a/mobile/ios/Runner/IosNavigationBar.swift +++ b/mobile/ios/Runner/IosNavigationBar.swift @@ -623,6 +623,7 @@ private final class IosNavigationBarView: NSObject, FlutterPlatformView { let glass = UIGlassEffect(style: .regular) glass.isInteractive = true surface.effect = glass + surface.cornerConfiguration = .capsule() } else { surface.backgroundColor = controlBackground } @@ -647,6 +648,16 @@ private final class IosNavigationBarView: NSObject, FlutterPlatformView { if let action = item.primaryAction { button.addAction(action, for: .touchUpInside) } button.menu = item.menu button.showsMenuAsPrimaryAction = item.menu != nil + if item.menu != nil { + // UIKit lifts the button itself for its menu transition, not the + // enclosing glass. Give that return target the same rounded shape. + if #available(iOS 26.0, *) { + button.cornerConfiguration = .capsule() + } + button.layer.cornerRadius = 22 + button.layer.cornerCurve = .circular + button.clipsToBounds = true + } button.isEnabled = item.isEnabled button.accessibilityLabel = item.accessibilityLabel button.accessibilityValue = item.accessibilityValue diff --git a/mobile/lib/features/activity/activity_page.dart b/mobile/lib/features/activity/activity_page.dart index 03aba66863..13382da620 100644 --- a/mobile/lib/features/activity/activity_page.dart +++ b/mobile/lib/features/activity/activity_page.dart @@ -437,7 +437,7 @@ class ActivityPage extends HookConsumerWidget { nativeActions: [ IosNavigationAction( label: 'Filter inbox', - symbol: 'line.3.horizontal.decrease', + icon: BuzzIcons.filter2, children: [ for (final entry in _filterLabels.entries) IosNavigationAction( diff --git a/mobile/lib/features/channels/channel_detail_page/system_rows.dart b/mobile/lib/features/channels/channel_detail_page/system_rows.dart index 1f5db4ee18..b4dff4aa91 100644 --- a/mobile/lib/features/channels/channel_detail_page/system_rows.dart +++ b/mobile/lib/features/channels/channel_detail_page/system_rows.dart @@ -196,16 +196,12 @@ class _SystemMessageRow extends HookConsumerWidget { alignment: isHuddle ? Alignment.centerLeft : Alignment.center, - child: Container( + child: Padding( key: ValueKey('activity-card-${message.id}'), padding: const EdgeInsets.symmetric( horizontal: Grid.twelve, vertical: Grid.xxs, ), - decoration: BoxDecoration( - color: context.colors.onSurface.withValues(alpha: 0.06), - borderRadius: BorderRadius.circular(Radii.container), - ), child: IntrinsicWidth( child: groupedMembership != null ? _MembershipSystemMessageContent( diff --git a/mobile/lib/shared/theme/buzz_icons.dart b/mobile/lib/shared/theme/buzz_icons.dart index c7b3140889..9ced63f285 100644 --- a/mobile/lib/shared/theme/buzz_icons.dart +++ b/mobile/lib/shared/theme/buzz_icons.dart @@ -5,6 +5,9 @@ import 'package:flutter/widgets.dart'; /// Semantic names preserve existing call sites; artwork matches buzz-app. /// Native iOS controls share Tabler artwork except Back and Close navigation. abstract final class BuzzIcons { + /// Tabler `filter-2`. Referenced from Dart so release icon pruning retains it. + static const filter2 = IconData(0x1014b, fontFamily: 'BuzzTabler'); + static const cornerUpLeft = IconData(0xeb77, fontFamily: 'BuzzTabler'); static const droplet = IconData(0xea97, fontFamily: 'BuzzTabler'); diff --git a/mobile/test/shared/theme/tabler_icon_render_test.dart b/mobile/test/shared/theme/tabler_icon_render_test.dart index ffb50cc3ef..8765269e9b 100644 --- a/mobile/test/shared/theme/tabler_icon_render_test.dart +++ b/mobile/test/shared/theme/tabler_icon_render_test.dart @@ -45,6 +45,10 @@ void main() { child: Column( mainAxisSize: MainAxisSize.min, children: [ + const ListTile( + leading: Icon(BuzzIcons.filter2), + title: Text('Filter inbox'), + ), const ListTile( leading: Icon(BuzzIcons.archive), title: Text('Archive'),