From 3a45e87b255adb2b43ac0de94dba7a485290d27e Mon Sep 17 00:00:00 2001 From: klopez4212 Date: Sun, 18 Oct 2026 10:31:21 -0400 Subject: [PATCH] fix(mobile): polish Inbox controls and system notices (#8423) Use Tabler `filter-2` in Inbox and keep the iOS filter button rounded when its menu closes. Remove shaded containers from chat system notices while preserving spacing, profile links, and reactions. Validation: mobile formatting, analysis, full test suite, and iOS Release build; independent review found no blockers. Kenny verified the icon and menu dismissal on his iPhone. --------- Signed-off-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz> --- mobile/ios/Runner/IosNavigationBar.swift | 11 +++++++++++ mobile/lib/features/activity/activity_page.dart | 2 +- .../channels/channel_detail_page/system_rows.dart | 6 +----- mobile/lib/shared/theme/buzz_icons.dart | 3 +++ mobile/test/shared/theme/tabler_icon_render_test.dart | 4 ++++ 5 files changed, 20 insertions(+), 6 deletions(-) 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'),