@@ -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
0 commit comments