diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index fef5305..23a7ef2 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -1115,6 +1115,7 @@ $ flutter test - 四类卡片去底板/描边,封面统一 3:4、8 圆角、行距 10、封底标题间距 6;状态角标为右上角紧凑异形丝带。 - 标题下方恢复左对齐题材文字,使用 `|` 分隔、灰色小字,与封面状态角标保持独立。 - 首页搜索栏到一级、一级到二级、二级到网格间距为 8/8/10;非精选 tab 直接以 10 衔接网格。 +- 搜索框右侧皇冠与礼物改为 40 热区、24 彩色图标,透明背景、间距 12,保留礼物角标。 - 播放量贴封面右下角(底 2、右 6),火焰图标 11 + 12/w400 纯文字,间距 4,并保留极淡底部渐变。 - 修复二级 chip 运行时颜色误用 `const TextStyle` 的编译错误,并校正相关测试 Finder 类型。 - 全部短剧的地区、字幕、配音筛选 UI 已占位;以下接口待补:地区、字幕/配音筛选数据。 diff --git a/lib/core/theme/app_colors.dart b/lib/core/theme/app_colors.dart index 18cfc32..861b272 100644 --- a/lib/core/theme/app_colors.dart +++ b/lib/core/theme/app_colors.dart @@ -39,6 +39,8 @@ abstract final class AppColors { /// 金币与奖励。 static const gold = Color(0xFFF3B34C); static const goldDeep = Color(0xFFD9A23A); + static const homeCrownGold = Color(0xFFF5C451); + static const homeGiftPink = Color(0xFFFF4D8D); static const vipGoldStart = Color(0xFFF5D9A0); static const vipGoldEnd = Color(0xFFE8B65A); static const vipBadgeSurface = Color(0x1F3D2408); diff --git a/lib/core/theme/app_dimens.dart b/lib/core/theme/app_dimens.dart index 0cf7be7..729e973 100644 --- a/lib/core/theme/app_dimens.dart +++ b/lib/core/theme/app_dimens.dart @@ -124,8 +124,10 @@ abstract final class AppDimens { static const double homeSearchPrimaryGap = 8; static const double homePrimarySecondaryGap = 8; static const double homeSecondaryGridGap = 10; - static const double homeIconSlot = 44; static const double homeHeaderIcon = 22; + static const double homeActionSlot = 40; + static const double homeActionIcon = 24; + static const double homeActionGap = 12; /// 推荐分区。 static const double recommendSectionTitle = 17; diff --git a/lib/pages/home/widgets/home_grid_header.dart b/lib/pages/home/widgets/home_grid_header.dart index e7ca8e0..929862c 100644 --- a/lib/pages/home/widgets/home_grid_header.dart +++ b/lib/pages/home/widgets/home_grid_header.dart @@ -143,13 +143,15 @@ class HomeGridHeader extends StatelessWidget { _headerAction( key: const Key('home-vip-entry'), icon: Icons.workspace_premium_outlined, + color: AppColors.homeCrownGold, tooltip: l10n.vipMembership, onTap: callbacks.onOpenVip, ), - const SizedBox(width: AppDimens.spaceXs), + const SizedBox(width: AppDimens.homeActionGap), _headerAction( key: const Key('home-wallet-entry'), icon: Icons.card_giftcard_rounded, + color: AppColors.homeGiftPink, tooltip: l10n.wallet, onTap: callbacks.onOpenWallet, badge: walletBadge, @@ -162,12 +164,13 @@ class HomeGridHeader extends StatelessWidget { Widget _headerAction({ required Key key, required IconData icon, + required Color color, required String tooltip, required VoidCallback onTap, int? badge, }) { return SizedBox.square( - dimension: AppDimens.homeIconSlot, + dimension: AppDimens.homeActionSlot, child: Stack( clipBehavior: Clip.none, children: [ @@ -175,16 +178,14 @@ class HomeGridHeader extends StatelessWidget { child: Tooltip( message: tooltip, child: Material( - color: AppColors.contentSurface, - borderRadius: BorderRadius.circular(AppDimens.inputRadius), + color: AppColors.transparent, child: InkWell( key: key, - borderRadius: BorderRadius.circular(AppDimens.inputRadius), onTap: onTap, child: Icon( icon, - size: AppDimens.homeHeaderIcon, - color: AppColors.navSelected, + size: AppDimens.homeActionIcon, + color: color, ), ), ), diff --git a/test/home/home_nav_ui_test.dart b/test/home/home_nav_ui_test.dart index 53e7ce4..dd783fd 100644 --- a/test/home/home_nav_ui_test.dart +++ b/test/home/home_nav_ui_test.dart @@ -9,6 +9,7 @@ import 'package:fruitshorts/core/data/repositories/favorite_repository.dart'; import 'package:fruitshorts/core/data/repositories/playback_repository.dart'; import 'package:fruitshorts/core/data/repositories/watch_history_repository.dart'; import 'package:fruitshorts/core/theme/app_colors.dart'; +import 'package:fruitshorts/core/theme/app_dimens.dart'; import 'package:fruitshorts/core/widgets/app_bottom_nav.dart'; import 'package:fruitshorts/pages/following/following_page.dart'; import 'package:shared_preferences_platform_interface/in_memory_shared_preferences_async.dart'; @@ -50,6 +51,57 @@ void main() { } expect(find.byKey(const Key('home-wallet-entry')), findsOneWidget); expect(find.byKey(const Key('home-wallet-badge')), findsOneWidget); + final searchEntry = find.byKey(const Key('home-search-entry')); + final vipEntry = find.byKey(const Key('home-vip-entry')); + final walletEntry = find.byKey(const Key('home-wallet-entry')); + expect( + tester.getSize(vipEntry), + const Size.square(AppDimens.homeActionSlot), + ); + expect( + tester.getSize(walletEntry), + const Size.square(AppDimens.homeActionSlot), + ); + expect( + tester.getCenter(vipEntry).dy, + closeTo(tester.getCenter(searchEntry).dy, 0.1), + ); + expect( + tester.getCenter(walletEntry).dy, + closeTo(tester.getCenter(searchEntry).dy, 0.1), + ); + expect( + tester.getTopLeft(walletEntry).dx - tester.getTopRight(vipEntry).dx, + AppDimens.homeActionGap, + ); + expect( + tester.getTopRight(walletEntry).dx, + closeTo(390 - AppDimens.feedPageHorizontal, 0.1), + ); + final crown = tester.widget( + find.descendant( + of: vipEntry, + matching: find.byIcon(Icons.workspace_premium_outlined), + ), + ); + final gift = tester.widget( + find.descendant( + of: walletEntry, + matching: find.byIcon(Icons.card_giftcard_rounded), + ), + ); + expect(crown.size, AppDimens.homeActionIcon); + expect(crown.color, AppColors.homeCrownGold); + expect(gift.size, AppDimens.homeActionIcon); + expect(gift.color, AppColors.homeGiftPink); + expect( + tester + .widget( + find.ancestor(of: vipEntry, matching: find.byType(Material)).first, + ) + .color, + AppColors.transparent, + ); expect(find.byKey(const Key('mine-mini-player')), findsNothing); expect(find.byType(FloatingActionButton), findsNothing); for (final key in _keys.skip(1)) {