From 6ef5429a52ef7b937a623cc9ee6b6ef0abc8bb0a Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Fri, 13 Nov 2026 17:41:47 +0800 Subject: [PATCH] =?UTF-8?q?style(mine):=20=E9=87=8D=E6=9E=84=E7=B4=A7?= =?UTF-8?q?=E5=87=91=20VIP=20=E4=BC=9A=E5=91=98=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/icon/vip_membership_badge.png | Bin 0 -> 50946 bytes lib/core/theme/app_colors.dart | 29 +-- lib/core/theme/app_dimens.dart | 24 ++- lib/pages/mine/widgets/mine_menu.dart | 227 ++++++++-------------- test/mine/mine_layout_alignment_test.dart | 23 ++- test/mine/mine_preview_layout_test.dart | 22 ++- test/mine/mine_stats_data_test.dart | 8 + 7 files changed, 155 insertions(+), 178 deletions(-) create mode 100644 assets/icon/vip_membership_badge.png diff --git a/assets/icon/vip_membership_badge.png b/assets/icon/vip_membership_badge.png new file mode 100644 index 0000000000000000000000000000000000000000..879edafd240666a284868c3b3e7ea11eb4d7f9a7 GIT binary patch literal 50946 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/core/theme/app_colors.dart b/lib/core/theme/app_colors.dart index 7e3e4e1..0991bc1 100644 --- a/lib/core/theme/app_colors.dart +++ b/lib/core/theme/app_colors.dart @@ -57,20 +57,23 @@ abstract final class AppColors { static const vipGoldStart = Color(0xFFF5D9A0); static const vipGoldEnd = Color(0xFFE8B65A); - /// 「我的」页 VIP 卡:品牌酒红、暖黑与香槟金共同形成会员层级。 - static const vipCardStart = Color(0xFF351318); - static const vipCardMiddle = Color(0xFF1B1112); - static const vipCardEnd = Color(0xFF0D0B0C); - static const vipCardBorder = Color(0x66F5D9A0); - static const vipCardRedGlow = Color(0x52F04E4E); - static const vipCardGoldGlow = Color(0x38F3B34C); - static const vipCardText = Color(0xFFFFF5E6); - static const vipCardMuted = Color(0xB3F5D9A0); - static const vipBadgeSurface = Color(0x24FFFFFF); + /// 「我的」页 VIP 卡:品牌红、暖黑与中性灰形成统一层级。 + static const vipCardStart = Color(0xFF21191C); + static const vipCardMiddle = Color(0xFF181719); + static const vipCardEnd = Color(0xFF141416); + static const vipCardBorder = Color(0x2EFFFFFF); + static const vipCardRedGlow = Color(0x2EF04E4E); + static const vipCardGoldGlow = Color(0x16F5D9A0); + static const vipArtGlow = Color(0x55F04E4E); + static const vipArtStart = Color(0xFFE45757); + static const vipArtEnd = Color(0xFF6E1F2D); + static const vipCardText = Color(0xFFF5F5F7); + static const vipCardMuted = Color(0xB3B0B0B0); + static const vipBadgeSurface = Color(0x24F04E4E); static const vipBenefitSurface = Color(0x12FFFFFF); - static const vipBenefitBorder = Color(0x33F5D9A0); - static const vipButtonStart = brandRed; - static const vipButtonEnd = Color(0xFFFF745E); + static const vipBenefitBorder = Color(0x14FFFFFF); + static const vipButtonStart = Color(0xFFF04E4E); + static const vipButtonEnd = Color(0xFFC93648); static const bronze = Color(0xFFCD7F32); static const bronzeDeep = Color(0xFFA9713A); static const rankSilver = Color(0xFFC0C0C0); diff --git a/lib/core/theme/app_dimens.dart b/lib/core/theme/app_dimens.dart index 4b7cc93..84543f6 100644 --- a/lib/core/theme/app_dimens.dart +++ b/lib/core/theme/app_dimens.dart @@ -273,20 +273,24 @@ abstract final class AppDimens { static const double mineSectionLinkFont = 12; static const double mineSectionGap = 12; - /// 「我的」页会员卡。高度由内容撑开,上下内边距恒为 [mineVipPadding]。 + /// 「我的」页紧凑会员横幅尺寸。 static const double mineVipRadius = 18; - static const double mineVipPadding = 16; - static const double mineVipTitleFont = 22; - static const double mineVipSubtitleFont = 12; + static const double mineVipPadding = 10; + static const double mineVipTitleFont = 21; + static const double mineVipSubtitleFont = 11; static const double mineVipEmblem = 48; static const double mineVipEmblemIcon = 28; - static const double mineVipActionWidth = 100; + static const double mineVipArtWidth = 84; + static const double mineVipArtHeight = 84; + static const double mineVipArtGlow = 56; + static const double mineVipArtSurface = 44; + static const double mineVipArtIcon = 22; + static const double mineVipActionWidth = 86; static const double mineVipBenefitFont = 10.5; - static const double mineVipBenefitBox = 34; - static const double mineVipBenefitBoxRadius = 11; - static const double mineVipBenefitGlyph = 19; - static const double mineVipBenefitRowGap = 6; - static const double mineVipButtonHeight = tapTarget; + static const double mineVipBenefitSurface = 28; + static const double mineVipBenefitGlyph = 16; + static const double mineVipBenefitRowGap = 2; + static const double mineVipButtonHeight = 26; static const double mineContinueCardWidth = 96; static const double mineContinueRowHeight = 172; static const double mineContinueTitleFont = 13; diff --git a/lib/pages/mine/widgets/mine_menu.dart b/lib/pages/mine/widgets/mine_menu.dart index 878e2f7..621b0b4 100644 --- a/lib/pages/mine/widgets/mine_menu.dart +++ b/lib/pages/mine/widgets/mine_menu.dart @@ -8,10 +8,11 @@ import '../../../core/widgets/app_press_scale.dart'; import '../../../l10n/app_localizations.dart'; const double _vipMaxTextScale = 1.15; -const double _vipGradientMiddleStop = 0.48; +const double _vipGradientMiddleStop = 0.62; const double _vipGlowRadius = 0.9; +const double _vipButtonLetterSpacing = 0.2; -/// 「我的」页高级 VIP 卡:品牌信息、会员徽章、开通按钮与横排权益。 +/// 「我的」页 VIP 会员卡:主视觉、权益横排与开通入口。 class MineVipBanner extends StatelessWidget { const MineVipBanner({super.key, required this.onOpen}); @@ -61,13 +62,7 @@ class MineVipBanner extends StatelessWidget { stops: [0, _vipGradientMiddleStop, 1], ), borderRadius: BorderRadius.circular(AppDimens.mineVipRadius), - border: Border.all(color: AppColors.vipCardBorder), boxShadow: const [ - BoxShadow( - color: AppColors.vipCardRedGlow, - blurRadius: AppDimens.spaceXl, - offset: Offset(0, AppDimens.spaceSm), - ), BoxShadow( color: AppColors.shadowSoft, blurRadius: AppDimens.spaceLg, @@ -90,16 +85,16 @@ class _VipContent extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - Expanded(child: _VipCopy(l10n: l10n)), + Expanded( + child: _VipCopy(l10n: l10n, onOpen: onOpen), + ), const SizedBox(width: AppDimens.spaceSm), - _VipAction(l10n: l10n, onOpen: onOpen), + const _VipArt(), ], ), - const SizedBox(height: AppDimens.spaceSm), - const Divider(height: 1, color: AppColors.vipBenefitBorder), - const SizedBox(height: AppDimens.spaceSm), + const SizedBox(height: AppDimens.spaceXs), _VipBenefits(l10n: l10n), ], ); @@ -107,9 +102,10 @@ class _VipContent extends StatelessWidget { } class _VipCopy extends StatelessWidget { - const _VipCopy({required this.l10n}); + const _VipCopy({required this.l10n, required this.onOpen}); final AppLocalizations l10n; + final VoidCallback onOpen; @override Widget build(BuildContext context) { @@ -117,8 +113,6 @@ class _VipCopy extends StatelessWidget { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - _VipPill(label: l10n.vipMembership), - const SizedBox(height: AppDimens.spaceSm), Text( l10n.vipBrandName, maxLines: 1, @@ -126,14 +120,14 @@ class _VipCopy extends StatelessWidget { style: const TextStyle( color: AppColors.vipCardText, fontSize: AppDimens.mineVipTitleFont, - fontWeight: FontWeight.w700, - letterSpacing: -0.4, + fontWeight: FontWeight.w800, + letterSpacing: 1.0, ), ), const SizedBox(height: AppDimens.spaceXs), Text( l10n.mineVipSubtitle, - maxLines: 2, + maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( color: AppColors.vipCardMuted, @@ -141,90 +135,28 @@ class _VipCopy extends StatelessWidget { height: 1.3, ), ), + const SizedBox(height: AppDimens.spaceXs), + _VipOpenButton(label: l10n.vipOpenNow, onOpen: onOpen), ], ); } } -class _VipPill extends StatelessWidget { - const _VipPill({required this.label}); - - final String label; - - @override - Widget build(BuildContext context) { - return Container( - padding: const EdgeInsets.symmetric( - horizontal: AppDimens.spaceSm, - vertical: AppDimens.spaceXs, - ), - decoration: BoxDecoration( - color: AppColors.vipBadgeSurface, - border: Border.all(color: AppColors.vipBenefitBorder), - borderRadius: BorderRadius.circular(AppDimens.pillRadius), - ), - child: Text( - label, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - color: AppColors.vipGoldStart, - fontSize: AppDimens.chipFont, - fontWeight: FontWeight.w700, - letterSpacing: 1.1, - ), - ), - ); - } -} - -class _VipAction extends StatelessWidget { - const _VipAction({required this.l10n, required this.onOpen}); - - final AppLocalizations l10n; - final VoidCallback onOpen; +class _VipArt extends StatelessWidget { + const _VipArt(); @override Widget build(BuildContext context) { return SizedBox( - width: AppDimens.mineVipActionWidth, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const _VipEmblem(), - const SizedBox(height: AppDimens.spaceXs), - _VipOpenButton(label: l10n.vipOpenNow, onOpen: onOpen), - ], - ), - ); - } -} - -class _VipEmblem extends StatelessWidget { - const _VipEmblem(); - - @override - Widget build(BuildContext context) { - return Container( - key: const Key('mine-vip-emblem'), - width: AppDimens.mineVipEmblem, - height: AppDimens.mineVipEmblem, - decoration: BoxDecoration( - shape: BoxShape.circle, - gradient: const LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [AppColors.vipGoldStart, AppColors.vipGoldEnd], - ), - border: Border.all(color: AppColors.vipCardText), - boxShadow: const [ - BoxShadow(color: AppColors.vipCardGoldGlow, blurRadius: 18), - ], - ), - child: const Icon( - Icons.workspace_premium_rounded, - color: AppColors.vipCardStart, - size: AppDimens.mineVipEmblemIcon, + key: const Key('mine-vip-art'), + width: AppDimens.mineVipArtWidth, + height: AppDimens.mineVipArtHeight, + child: Image.asset( + 'assets/icon/vip_membership_badge.png', + key: const Key('mine-vip-emblem'), + width: AppDimens.mineVipArtWidth, + height: AppDimens.mineVipArtHeight, + fit: BoxFit.contain, ), ); } @@ -242,34 +174,32 @@ class _VipOpenButton extends StatelessWidget { key: const Key('mine-vip-open'), width: AppDimens.mineVipActionWidth, height: AppDimens.mineVipButtonHeight, - child: DecoratedBox( - decoration: BoxDecoration( - gradient: const LinearGradient( - colors: [AppColors.vipButtonStart, AppColors.vipButtonEnd], - ), - borderRadius: BorderRadius.circular(AppDimens.pillRadius), - boxShadow: const [ - BoxShadow(color: AppColors.vipCardRedGlow, blurRadius: 14), - ], - ), - child: Material( - color: AppColors.transparent, - child: InkWell( - onTap: onOpen, - borderRadius: BorderRadius.circular(AppDimens.pillRadius), - child: Center( + child: InkWell( + onTap: onOpen, + borderRadius: BorderRadius.circular(AppDimens.pillRadius), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Flexible( child: Text( label, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle( - color: AppColors.textPrimary, + color: AppColors.vipGoldStart, fontSize: AppDimens.body, fontWeight: FontWeight.w700, + letterSpacing: _vipButtonLetterSpacing, ), ), ), - ), + const SizedBox(width: AppDimens.spaceXs), + const Icon( + Icons.arrow_forward_rounded, + color: AppColors.vipGoldStart, + size: AppDimens.mineVipBenefitGlyph, + ), + ], ), ), ); @@ -289,11 +219,20 @@ class _VipBenefits extends StatelessWidget { (Icons.hd_outlined, l10n.vipBenefitHd), (Icons.download_for_offline_outlined, l10n.vipBenefitFastCache), ]; - return Row( + return Column( key: const Key('mine-vip-benefits'), - crossAxisAlignment: CrossAxisAlignment.start, children: [ - for (var index = 0; index < items.length; index++) + _row(items, 0), + const SizedBox(height: AppDimens.spaceXs), + _row(items, 2), + ], + ); + } + + Widget _row(List<(IconData, String)> items, int start) { + return Row( + children: [ + for (var index = start; index < start + 2; index++) Expanded( child: _VipBenefit( itemKey: Key('mine-vip-benefit-$index'), @@ -319,44 +258,44 @@ class _VipBenefit extends StatelessWidget { @override Widget build(BuildContext context) { - return Column( + return Row( key: itemKey, - mainAxisAlignment: MainAxisAlignment.start, children: [ - Container( - width: AppDimens.mineVipBenefitBox, - height: AppDimens.mineVipBenefitBox, - decoration: BoxDecoration( - color: AppColors.vipBenefitSurface, - border: Border.all(color: AppColors.vipBenefitBorder), - borderRadius: BorderRadius.circular( - AppDimens.mineVipBenefitBoxRadius, + _VipBenefitGlyph(icon: icon), + const SizedBox(width: AppDimens.spaceXs), + Expanded( + child: Text( + label, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: AppColors.vipCardMuted, + fontSize: AppDimens.mineVipBenefitFont, + fontWeight: FontWeight.w500, + height: 1.15, ), ), - child: Icon( - icon, - color: AppColors.vipGoldStart, - size: AppDimens.mineVipBenefitGlyph, - ), - ), - const SizedBox(height: AppDimens.mineVipBenefitRowGap), - Text( - label, - maxLines: 2, - overflow: TextOverflow.ellipsis, - textAlign: TextAlign.center, - style: const TextStyle( - color: AppColors.vipCardMuted, - fontSize: AppDimens.mineVipBenefitFont, - fontWeight: FontWeight.w500, - height: 1.15, - ), ), ], ); } } +class _VipBenefitGlyph extends StatelessWidget { + const _VipBenefitGlyph({required this.icon}); + + final IconData icon; + + @override + Widget build(BuildContext context) { + return Icon( + icon, + color: AppColors.vipGoldStart, + size: AppDimens.mineVipBenefitGlyph, + ); + } +} + class _VipAmbientGlow extends StatelessWidget { const _VipAmbientGlow(); diff --git a/test/mine/mine_layout_alignment_test.dart b/test/mine/mine_layout_alignment_test.dart index 9545c08..4282183 100644 --- a/test/mine/mine_layout_alignment_test.dart +++ b/test/mine/mine_layout_alignment_test.dart @@ -13,8 +13,8 @@ import 'package:fruitshorts/pages/mine/widgets/mine_action_grid.dart'; import 'package:fruitshorts/pages/mine/widgets/mine_menu.dart'; const _layoutTolerance = 0.1; -const _minimumVipHeight = 190.0; -const _previousVipPlaceholderHeight = 220.0; +const _minimumVipHeight = 110.0; +const _premiumVipHeightLimit = 150.0; void main() { testWidgets('should_keep_equal_visible_vip_padding_and_reduce_height', ( @@ -27,15 +27,30 @@ void main() { final cardRect = tester.getRect(find.byKey(const Key('mine-vip'))); final emblemRect = tester.getRect(find.byKey(const Key('mine-vip-emblem'))); + final emblem = tester.widget( + find.byKey(const Key('mine-vip-emblem')), + ); + expect( + (emblem.image as AssetImage).assetName, + 'assets/icon/vip_membership_badge.png', + ); + final titleRect = tester.getRect(find.text('VIP')); final benefitsRect = tester.getRect( find.byKey(const Key('mine-vip-benefits')), ); - expect(cardRect.height, lessThan(_previousVipPlaceholderHeight)); + expect(cardRect.height, lessThan(_premiumVipHeightLimit)); expect(cardRect.height, greaterThanOrEqualTo(_minimumVipHeight)); expect( emblemRect.top - cardRect.top, - closeTo(cardRect.bottom - benefitsRect.bottom, _layoutTolerance), + greaterThanOrEqualTo(AppDimens.mineVipPadding), ); + expect(benefitsRect.bottom, lessThan(cardRect.bottom)); + expect(emblemRect.left, greaterThan(titleRect.right)); + final first = tester.getRect(find.byKey(const Key('mine-vip-benefit-0'))); + final second = tester.getRect(find.byKey(const Key('mine-vip-benefit-1'))); + final third = tester.getRect(find.byKey(const Key('mine-vip-benefit-2'))); + expect(first.top, second.top); + expect(third.top, greaterThan(first.top)); }); for (final localeTag in ['en', 'id']) { diff --git a/test/mine/mine_preview_layout_test.dart b/test/mine/mine_preview_layout_test.dart index 6bcca8e..ab7a33a 100644 --- a/test/mine/mine_preview_layout_test.dart +++ b/test/mine/mine_preview_layout_test.dart @@ -173,10 +173,10 @@ void main() { AppColors.vipCardMiddle, AppColors.vipCardEnd, ]); - expect(vipDecoration.border, isNotNull); + expect(vipDecoration.border, isNull); expect(vipDecoration.boxShadow, isNotEmpty); - // 卡片高度由内容撑开,上下内边距必须一致(边框各占 1pt)。 + // 卡片高度由内容撑开,身份头部与底部 CTA 都保留安全内边距。 final vipRect = tester.getRect(find.byKey(const Key('mine-vip'))); final emblemRect = tester.getRect(find.byKey(const Key('mine-vip-emblem'))); final benefitsRect = tester.getRect( @@ -184,12 +184,12 @@ void main() { ); final topInset = emblemRect.top - vipRect.top; final bottomInset = vipRect.bottom - benefitsRect.bottom; - expect(topInset, closeTo(bottomInset, 0.01)); expect(topInset, greaterThanOrEqualTo(AppDimens.mineVipPadding)); + expect(bottomInset, greaterThanOrEqualTo(AppDimens.mineVipPadding)); expect(find.byKey(const Key('mine-vip-emblem')), findsOneWidget); expect( tester.getSize(find.byKey(const Key('mine-vip-open'))).height, - greaterThanOrEqualTo(AppDimens.tapTarget), + greaterThanOrEqualTo(AppDimens.mineVipButtonHeight), ); const benefitKeys = [ Key('mine-vip-benefit-0'), @@ -200,10 +200,18 @@ void main() { final benefitTops = benefitKeys .map((key) => tester.getTopLeft(find.byKey(key))) .toList(); - expect(benefitTops.map((position) => position.dy).toSet(), hasLength(1)); expect( - benefitTops.map((position) => position.dx).toSet(), - hasLength(benefitKeys.length), + benefitTops.take(2).map((position) => position.dy).toSet(), + hasLength(1), + ); + expect( + benefitTops.skip(2).map((position) => position.dy).toSet(), + hasLength(1), + ); + expect(benefitTops[2].dy, greaterThan(benefitTops[0].dy)); + expect( + benefitTops.take(2).map((position) => position.dx).toSet(), + hasLength(2), ); final order = [ diff --git a/test/mine/mine_stats_data_test.dart b/test/mine/mine_stats_data_test.dart index 393271c..7edf8db 100644 --- a/test/mine/mine_stats_data_test.dart +++ b/test/mine/mine_stats_data_test.dart @@ -69,6 +69,14 @@ void main() { expect(tops.toSet(), hasLength(1)); expect(tester.takeException(), isNull); if (_captureEnabled) { + final context = tester.element(find.byKey(const Key('mine-vip-emblem'))); + await tester.runAsync(() async { + await precacheImage( + const AssetImage('assets/icon/vip_membership_badge.png'), + context, + ); + }); + await tester.pumpAndSettle(); await saveWidgetCapture(tester, _captureKey, _capturePath); } });