Skip to content

Commit 1909c88

Browse files
committed
home: Tweak main-menu buttons to follow Figma
The buttons were 48px instead of 44px tall, and the label's line height was 26px instead of 23px.
1 parent c744d36 commit 1909c88

File tree

2 files changed

+56
-28
lines changed

2 files changed

+56
-28
lines changed

lib/widgets/home.dart

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,13 @@ void _showMainMenu(BuildContext context, {
331331
});
332332
}
333333

334-
abstract class _MenuButton extends StatelessWidget {
335-
const _MenuButton();
334+
/// A button in the main menu.
335+
///
336+
/// See Figma:
337+
/// https://www.figma.com/design/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?node-id=2037-243759&m=dev
338+
@visibleForTesting
339+
abstract class MenuButton extends StatelessWidget {
340+
const MenuButton({super.key});
336341

337342
String label(ZulipLocalizations zulipLocalizations);
338343

@@ -369,11 +374,20 @@ abstract class _MenuButton extends StatelessWidget {
369374
final designVariables = DesignVariables.of(context);
370375
final zulipLocalizations = ZulipLocalizations.of(context);
371376

377+
// Make [TextButton] set 44 instead of 48 for the height.
378+
final visualDensity = VisualDensity(vertical: -1);
379+
// A value that [TextButton] adds to some of its layout parameters;
380+
// we can cancel out those adjustments by subtracting it.
381+
final densityVerticalAdjustment = visualDensity.baseSizeAdjustment.dy;
382+
372383
final borderSideSelected = BorderSide(width: 1,
373384
strokeAlign: BorderSide.strokeAlignOutside,
374385
color: designVariables.borderMenuButtonSelected);
375386
final buttonStyle = TextButton.styleFrom(
376-
padding: const EdgeInsets.symmetric(vertical: 9, horizontal: 8),
387+
// Make the button 44px instead of 48px tall, to match the Figma.
388+
visualDensity: visualDensity,
389+
padding: EdgeInsets.symmetric(
390+
vertical: 10 - densityVerticalAdjustment, horizontal: 8),
377391
foregroundColor: designVariables.labelMenuButton,
378392
// This has a default behavior of affecting the background color of the
379393
// button for states including "hovered", "focused" and "pressed".
@@ -399,26 +413,24 @@ abstract class _MenuButton extends StatelessWidget {
399413
return AnimatedScaleOnTap(
400414
duration: const Duration(milliseconds: 100),
401415
scaleEnd: 0.95,
402-
child: ConstrainedBox(
403-
constraints: const BoxConstraints(minHeight: 44),
404-
child: TextButton(
405-
onPressed: () => _handlePress(context),
406-
style: buttonStyle,
407-
child: Row(spacing: 8, children: [
408-
SizedBox.square(dimension: _iconSize,
409-
child: buildLeading(context)),
410-
Expanded(child: Text(label(zulipLocalizations),
411-
// TODO(design): determine if we prefer to wrap
412-
overflow: TextOverflow.ellipsis,
413-
style: const TextStyle(fontSize: 19, height: 26 / 19)
414-
.merge(weightVariableTextStyle(context, wght: selected ? 600 : 400)))),
415-
?trailing,
416-
]))));
416+
child: TextButton(
417+
onPressed: () => _handlePress(context),
418+
style: buttonStyle,
419+
child: Row(spacing: 8, children: [
420+
SizedBox.square(dimension: _iconSize,
421+
child: buildLeading(context)),
422+
Expanded(child: Text(label(zulipLocalizations),
423+
// TODO(design): determine if we prefer to wrap
424+
overflow: TextOverflow.ellipsis,
425+
style: const TextStyle(fontSize: 19, height: 23 / 19)
426+
.merge(weightVariableTextStyle(context, wght: selected ? 600 : 400)))),
427+
?trailing,
428+
])));
417429
}
418430
}
419431

420432
/// A menu button controlling the selected [_HomePageTab] on the bottom nav bar.
421-
abstract class _NavigationBarMenuButton extends _MenuButton {
433+
abstract class _NavigationBarMenuButton extends MenuButton {
422434
const _NavigationBarMenuButton({required this.tabNotifier});
423435

424436
final ValueNotifier<_HomePageTab> tabNotifier;
@@ -434,7 +446,7 @@ abstract class _NavigationBarMenuButton extends _MenuButton {
434446
}
435447
}
436448

437-
class _SearchButton extends _MenuButton {
449+
class _SearchButton extends MenuButton {
438450
const _SearchButton();
439451

440452
@override
@@ -479,7 +491,7 @@ class _InboxButton extends _NavigationBarMenuButton {
479491
_HomePageTab get navigationTarget => _HomePageTab.inbox;
480492
}
481493

482-
class _MentionsButton extends _MenuButton {
494+
class _MentionsButton extends MenuButton {
483495
const _MentionsButton();
484496

485497
@override
@@ -509,7 +521,7 @@ class _MentionsButton extends _MenuButton {
509521
}
510522
}
511523

512-
class _StarredMessagesButton extends _MenuButton {
524+
class _StarredMessagesButton extends MenuButton {
513525
const _StarredMessagesButton();
514526

515527
@override
@@ -527,7 +539,7 @@ class _StarredMessagesButton extends _MenuButton {
527539
}
528540
}
529541

530-
class _CombinedFeedButton extends _MenuButton {
542+
class _CombinedFeedButton extends MenuButton {
531543
const _CombinedFeedButton();
532544

533545
@override
@@ -587,7 +599,7 @@ class _DirectMessagesButton extends _NavigationBarMenuButton {
587599
_HomePageTab get navigationTarget => _HomePageTab.directMessages;
588600
}
589601

590-
class _MyProfileButton extends _MenuButton {
602+
class _MyProfileButton extends MenuButton {
591603
const _MyProfileButton();
592604

593605
@override
@@ -598,7 +610,7 @@ class _MyProfileButton extends _MenuButton {
598610
final store = PerAccountStoreWidget.of(context);
599611
return Avatar(
600612
userId: store.selfUserId,
601-
size: _MenuButton._iconSize,
613+
size: MenuButton._iconSize,
602614
borderRadius: 4,
603615
showPresence: false,
604616
);
@@ -617,7 +629,7 @@ class _MyProfileButton extends _MenuButton {
617629
}
618630
}
619631

620-
class _SwitchAccountButton extends _MenuButton {
632+
class _SwitchAccountButton extends MenuButton {
621633
const _SwitchAccountButton();
622634

623635
@override
@@ -634,7 +646,7 @@ class _SwitchAccountButton extends _MenuButton {
634646
}
635647
}
636648

637-
class _SettingsButton extends _MenuButton {
649+
class _SettingsButton extends MenuButton {
638650
const _SettingsButton();
639651

640652
@override
@@ -651,7 +663,7 @@ class _SettingsButton extends _MenuButton {
651663
}
652664
}
653665

654-
class _AboutZulipButton extends _MenuButton {
666+
class _AboutZulipButton extends MenuButton {
655667
const _AboutZulipButton();
656668

657669
@override

test/widgets/home_test.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,22 @@ void main () {
224224
.isSameColorAs(designVariables.icon);
225225
}
226226

227+
testWidgets('buttons are 44px tall', (tester) async {
228+
await prepare(tester);
229+
230+
await tapOpenMenuAndAwait(tester);
231+
checkIconSelected(tester, inboxMenuIconFinder);
232+
checkIconNotSelected(tester, channelsMenuIconFinder);
233+
234+
final inboxElement = tester.element(
235+
find.ancestor(of: inboxMenuIconFinder, matching: find.bySubtype<MenuButton>()));
236+
check((inboxElement.renderObject as RenderBox).size).height.equals(44);
237+
238+
final channelsElement = tester.element(
239+
find.ancestor(of: inboxMenuIconFinder, matching: find.bySubtype<MenuButton>()));
240+
check((channelsElement.renderObject as RenderBox).size).height.equals(44);
241+
});
242+
227243
testWidgets('navigation states reflect on navigation bar menu buttons', (tester) async {
228244
await prepare(tester);
229245

0 commit comments

Comments
 (0)