diff --git a/client/.gitignore b/client/.gitignore index 3820a95..4f4c726 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -33,6 +33,9 @@ migrate_working_dir/ /build/ /coverage/ +# Golden test diff artifacts (transient, regenerated on failure) +test/golden/failures/ + # Symbolication related app.*.symbols diff --git a/client/assets/fonts/NotoSansSC.ttf b/client/assets/fonts/NotoSansSC.ttf new file mode 100644 index 0000000..556dbf7 Binary files /dev/null and b/client/assets/fonts/NotoSansSC.ttf differ diff --git a/client/lib/core/theme/themes.dart b/client/lib/core/theme/themes.dart index 492d846..ed78fe3 100644 --- a/client/lib/core/theme/themes.dart +++ b/client/lib/core/theme/themes.dart @@ -18,7 +18,8 @@ ThemeData buildTheme(String key) { brightness: brightness, colorScheme: scheme, scaffoldBackgroundColor: t.bg, - fontFamily: null, // 系统中文字体;字号梯度后续在组件层接入 + // 全平台统一中文字体(与原型截图、golden 保真 diff 一致);打包内置。 + fontFamily: 'NotoSansSC', extensions: >[t], ); } diff --git a/client/lib/widgets/data_table_card.dart b/client/lib/widgets/data_table_card.dart index 828c077..17c0220 100644 --- a/client/lib/widgets/data_table_card.dart +++ b/client/lib/widgets/data_table_card.dart @@ -156,7 +156,7 @@ class _DataTableCardState extends State { children: widget.columns.map((col) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), - child: DefaultTextStyle( + child: DefaultTextStyle.merge( style: TextStyle( fontSize: 13, fontWeight: FontWeight.w600, @@ -187,10 +187,10 @@ class _DataTableCardState extends State { constraints: const BoxConstraints(minHeight: 48), alignment: col.numeric ? Alignment.centerRight : Alignment.centerLeft, - color: hovered == rowIndex ? const Color(0xFFF5F7FF) : null, + color: hovered == rowIndex ? context.tokens.rowHover : null, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - child: DefaultTextStyle( + child: DefaultTextStyle.merge( style: TextStyle( fontSize: 13, color: context.tokens.text), child: cell.child, diff --git a/client/pubspec.yaml b/client/pubspec.yaml index 5a0edd5..0d3c65a 100644 --- a/client/pubspec.yaml +++ b/client/pubspec.yaml @@ -62,5 +62,11 @@ flutter: assets: - assets/fonts/NotoSansSC-Regular.ttf + - assets/fonts/NotoSansSC.ttf - assets/config/app_info.json - assets/brand/logo_mark.png + + fonts: + - family: NotoSansSC + fonts: + - asset: assets/fonts/NotoSansSC.ttf diff --git a/client/test/golden/goldens/about_a.png b/client/test/golden/goldens/about_a.png index 700431c..f7d199f 100644 Binary files a/client/test/golden/goldens/about_a.png and b/client/test/golden/goldens/about_a.png differ diff --git a/client/test/golden/goldens/about_b.png b/client/test/golden/goldens/about_b.png index b708b09..f86e8da 100644 Binary files a/client/test/golden/goldens/about_b.png and b/client/test/golden/goldens/about_b.png differ diff --git a/client/test/golden/goldens/about_c.png b/client/test/golden/goldens/about_c.png index 31885c7..82d2424 100644 Binary files a/client/test/golden/goldens/about_c.png and b/client/test/golden/goldens/about_c.png differ diff --git a/client/test/golden/goldens/about_mobile_a.png b/client/test/golden/goldens/about_mobile_a.png index 94b91db..d57e8df 100644 Binary files a/client/test/golden/goldens/about_mobile_a.png and b/client/test/golden/goldens/about_mobile_a.png differ diff --git a/client/test/golden/goldens/about_mobile_b.png b/client/test/golden/goldens/about_mobile_b.png index e15d43a..32a7a05 100644 Binary files a/client/test/golden/goldens/about_mobile_b.png and b/client/test/golden/goldens/about_mobile_b.png differ diff --git a/client/test/golden/goldens/about_mobile_c.png b/client/test/golden/goldens/about_mobile_c.png index 3efbdcd..a425620 100644 Binary files a/client/test/golden/goldens/about_mobile_c.png and b/client/test/golden/goldens/about_mobile_c.png differ diff --git a/client/test/golden/goldens/device_management_a.png b/client/test/golden/goldens/device_management_a.png index 8898efa..bd81873 100644 Binary files a/client/test/golden/goldens/device_management_a.png and b/client/test/golden/goldens/device_management_a.png differ diff --git a/client/test/golden/goldens/device_management_b.png b/client/test/golden/goldens/device_management_b.png index a5a5472..56f6c8f 100644 Binary files a/client/test/golden/goldens/device_management_b.png and b/client/test/golden/goldens/device_management_b.png differ diff --git a/client/test/golden/goldens/device_management_c.png b/client/test/golden/goldens/device_management_c.png index 8c72357..aefd07d 100644 Binary files a/client/test/golden/goldens/device_management_c.png and b/client/test/golden/goldens/device_management_c.png differ diff --git a/client/test/golden/goldens/device_management_mobile_a.png b/client/test/golden/goldens/device_management_mobile_a.png index d1ee09f..52aadbf 100644 Binary files a/client/test/golden/goldens/device_management_mobile_a.png and b/client/test/golden/goldens/device_management_mobile_a.png differ diff --git a/client/test/golden/goldens/device_management_mobile_b.png b/client/test/golden/goldens/device_management_mobile_b.png index dd5532d..a948989 100644 Binary files a/client/test/golden/goldens/device_management_mobile_b.png and b/client/test/golden/goldens/device_management_mobile_b.png differ diff --git a/client/test/golden/goldens/device_management_mobile_c.png b/client/test/golden/goldens/device_management_mobile_c.png index c47d6d5..590ed3e 100644 Binary files a/client/test/golden/goldens/device_management_mobile_c.png and b/client/test/golden/goldens/device_management_mobile_c.png differ diff --git a/client/test/golden/goldens/finance_a.png b/client/test/golden/goldens/finance_a.png index e06c982..cc2b1d3 100644 Binary files a/client/test/golden/goldens/finance_a.png and b/client/test/golden/goldens/finance_a.png differ diff --git a/client/test/golden/goldens/finance_b.png b/client/test/golden/goldens/finance_b.png index 8f9c19b..a356fc2 100644 Binary files a/client/test/golden/goldens/finance_b.png and b/client/test/golden/goldens/finance_b.png differ diff --git a/client/test/golden/goldens/finance_c.png b/client/test/golden/goldens/finance_c.png index f45f24a..b680fb6 100644 Binary files a/client/test/golden/goldens/finance_c.png and b/client/test/golden/goldens/finance_c.png differ diff --git a/client/test/golden/goldens/finance_mobile_a.png b/client/test/golden/goldens/finance_mobile_a.png index d85bbf0..0c9dfef 100644 Binary files a/client/test/golden/goldens/finance_mobile_a.png and b/client/test/golden/goldens/finance_mobile_a.png differ diff --git a/client/test/golden/goldens/finance_mobile_b.png b/client/test/golden/goldens/finance_mobile_b.png index b4bf597..d0dfead 100644 Binary files a/client/test/golden/goldens/finance_mobile_b.png and b/client/test/golden/goldens/finance_mobile_b.png differ diff --git a/client/test/golden/goldens/finance_mobile_c.png b/client/test/golden/goldens/finance_mobile_c.png index 2845752..d9f9564 100644 Binary files a/client/test/golden/goldens/finance_mobile_c.png and b/client/test/golden/goldens/finance_mobile_c.png differ diff --git a/client/test/golden/goldens/inventory_list_a.png b/client/test/golden/goldens/inventory_list_a.png index 14fbc34..f642f35 100644 Binary files a/client/test/golden/goldens/inventory_list_a.png and b/client/test/golden/goldens/inventory_list_a.png differ diff --git a/client/test/golden/goldens/inventory_list_b.png b/client/test/golden/goldens/inventory_list_b.png index 0ad4a33..8447718 100644 Binary files a/client/test/golden/goldens/inventory_list_b.png and b/client/test/golden/goldens/inventory_list_b.png differ diff --git a/client/test/golden/goldens/inventory_list_c.png b/client/test/golden/goldens/inventory_list_c.png index 5eebb11..eefd218 100644 Binary files a/client/test/golden/goldens/inventory_list_c.png and b/client/test/golden/goldens/inventory_list_c.png differ diff --git a/client/test/golden/goldens/inventory_list_mobile_a.png b/client/test/golden/goldens/inventory_list_mobile_a.png index 51a7b44..a1b7c3e 100644 Binary files a/client/test/golden/goldens/inventory_list_mobile_a.png and b/client/test/golden/goldens/inventory_list_mobile_a.png differ diff --git a/client/test/golden/goldens/inventory_list_mobile_b.png b/client/test/golden/goldens/inventory_list_mobile_b.png index f3af24f..4664263 100644 Binary files a/client/test/golden/goldens/inventory_list_mobile_b.png and b/client/test/golden/goldens/inventory_list_mobile_b.png differ diff --git a/client/test/golden/goldens/inventory_list_mobile_c.png b/client/test/golden/goldens/inventory_list_mobile_c.png index 8922ff3..2e51ef5 100644 Binary files a/client/test/golden/goldens/inventory_list_mobile_c.png and b/client/test/golden/goldens/inventory_list_mobile_c.png differ diff --git a/client/test/golden/goldens/login_a.png b/client/test/golden/goldens/login_a.png index 52f6d6a..af064b0 100644 Binary files a/client/test/golden/goldens/login_a.png and b/client/test/golden/goldens/login_a.png differ diff --git a/client/test/golden/goldens/login_b.png b/client/test/golden/goldens/login_b.png index 30ff26c..141a23f 100644 Binary files a/client/test/golden/goldens/login_b.png and b/client/test/golden/goldens/login_b.png differ diff --git a/client/test/golden/goldens/login_c.png b/client/test/golden/goldens/login_c.png index 62cbde2..8a1d461 100644 Binary files a/client/test/golden/goldens/login_c.png and b/client/test/golden/goldens/login_c.png differ diff --git a/client/test/golden/goldens/partners_a.png b/client/test/golden/goldens/partners_a.png index 0546362..5e0e619 100644 Binary files a/client/test/golden/goldens/partners_a.png and b/client/test/golden/goldens/partners_a.png differ diff --git a/client/test/golden/goldens/partners_b.png b/client/test/golden/goldens/partners_b.png index 35b2db5..1656108 100644 Binary files a/client/test/golden/goldens/partners_b.png and b/client/test/golden/goldens/partners_b.png differ diff --git a/client/test/golden/goldens/partners_c.png b/client/test/golden/goldens/partners_c.png index 1178c9f..4dc2634 100644 Binary files a/client/test/golden/goldens/partners_c.png and b/client/test/golden/goldens/partners_c.png differ diff --git a/client/test/golden/goldens/partners_mobile_a.png b/client/test/golden/goldens/partners_mobile_a.png index c87461f..d15f558 100644 Binary files a/client/test/golden/goldens/partners_mobile_a.png and b/client/test/golden/goldens/partners_mobile_a.png differ diff --git a/client/test/golden/goldens/partners_mobile_b.png b/client/test/golden/goldens/partners_mobile_b.png index c91b50a..c088801 100644 Binary files a/client/test/golden/goldens/partners_mobile_b.png and b/client/test/golden/goldens/partners_mobile_b.png differ diff --git a/client/test/golden/goldens/partners_mobile_c.png b/client/test/golden/goldens/partners_mobile_c.png index 00aa6e7..d44d68b 100644 Binary files a/client/test/golden/goldens/partners_mobile_c.png and b/client/test/golden/goldens/partners_mobile_c.png differ diff --git a/client/test/golden/goldens/product_detail_a.png b/client/test/golden/goldens/product_detail_a.png index ff51de9..f059465 100644 Binary files a/client/test/golden/goldens/product_detail_a.png and b/client/test/golden/goldens/product_detail_a.png differ diff --git a/client/test/golden/goldens/product_detail_b.png b/client/test/golden/goldens/product_detail_b.png index d879481..e10cd1f 100644 Binary files a/client/test/golden/goldens/product_detail_b.png and b/client/test/golden/goldens/product_detail_b.png differ diff --git a/client/test/golden/goldens/product_detail_c.png b/client/test/golden/goldens/product_detail_c.png index 13c6d7f..fa58997 100644 Binary files a/client/test/golden/goldens/product_detail_c.png and b/client/test/golden/goldens/product_detail_c.png differ diff --git a/client/test/golden/goldens/products_archive_a.png b/client/test/golden/goldens/products_archive_a.png index fc0027a..ee99163 100644 Binary files a/client/test/golden/goldens/products_archive_a.png and b/client/test/golden/goldens/products_archive_a.png differ diff --git a/client/test/golden/goldens/products_archive_b.png b/client/test/golden/goldens/products_archive_b.png index 95a935b..a2afac2 100644 Binary files a/client/test/golden/goldens/products_archive_b.png and b/client/test/golden/goldens/products_archive_b.png differ diff --git a/client/test/golden/goldens/products_archive_c.png b/client/test/golden/goldens/products_archive_c.png index accc8b3..a72660c 100644 Binary files a/client/test/golden/goldens/products_archive_c.png and b/client/test/golden/goldens/products_archive_c.png differ diff --git a/client/test/golden/goldens/register_a.png b/client/test/golden/goldens/register_a.png index 3c69839..5a6f93f 100644 Binary files a/client/test/golden/goldens/register_a.png and b/client/test/golden/goldens/register_a.png differ diff --git a/client/test/golden/goldens/register_b.png b/client/test/golden/goldens/register_b.png index 5ab82fc..f2a9da3 100644 Binary files a/client/test/golden/goldens/register_b.png and b/client/test/golden/goldens/register_b.png differ diff --git a/client/test/golden/goldens/register_c.png b/client/test/golden/goldens/register_c.png index 049fc01..131f649 100644 Binary files a/client/test/golden/goldens/register_c.png and b/client/test/golden/goldens/register_c.png differ diff --git a/client/test/golden/goldens/settings_params_a.png b/client/test/golden/goldens/settings_params_a.png index 9cd129c..6e45ba9 100644 Binary files a/client/test/golden/goldens/settings_params_a.png and b/client/test/golden/goldens/settings_params_a.png differ diff --git a/client/test/golden/goldens/settings_params_b.png b/client/test/golden/goldens/settings_params_b.png index e56769e..9c72437 100644 Binary files a/client/test/golden/goldens/settings_params_b.png and b/client/test/golden/goldens/settings_params_b.png differ diff --git a/client/test/golden/goldens/settings_params_c.png b/client/test/golden/goldens/settings_params_c.png index 19aab04..1adcf7b 100644 Binary files a/client/test/golden/goldens/settings_params_c.png and b/client/test/golden/goldens/settings_params_c.png differ diff --git a/client/test/golden/goldens/stock_in_form_a.png b/client/test/golden/goldens/stock_in_form_a.png index fdce55a..9b80a1a 100644 Binary files a/client/test/golden/goldens/stock_in_form_a.png and b/client/test/golden/goldens/stock_in_form_a.png differ diff --git a/client/test/golden/goldens/stock_in_form_b.png b/client/test/golden/goldens/stock_in_form_b.png index f02b0e4..8020d38 100644 Binary files a/client/test/golden/goldens/stock_in_form_b.png and b/client/test/golden/goldens/stock_in_form_b.png differ diff --git a/client/test/golden/goldens/stock_in_form_c.png b/client/test/golden/goldens/stock_in_form_c.png index d4f6087..b113b8a 100644 Binary files a/client/test/golden/goldens/stock_in_form_c.png and b/client/test/golden/goldens/stock_in_form_c.png differ diff --git a/client/test/golden/goldens/stock_in_form_mobile_a.png b/client/test/golden/goldens/stock_in_form_mobile_a.png index 8ec265b..5282ef4 100644 Binary files a/client/test/golden/goldens/stock_in_form_mobile_a.png and b/client/test/golden/goldens/stock_in_form_mobile_a.png differ diff --git a/client/test/golden/goldens/stock_in_form_mobile_b.png b/client/test/golden/goldens/stock_in_form_mobile_b.png index 8e97110..3d09519 100644 Binary files a/client/test/golden/goldens/stock_in_form_mobile_b.png and b/client/test/golden/goldens/stock_in_form_mobile_b.png differ diff --git a/client/test/golden/goldens/stock_in_form_mobile_c.png b/client/test/golden/goldens/stock_in_form_mobile_c.png index af58984..3b4581f 100644 Binary files a/client/test/golden/goldens/stock_in_form_mobile_c.png and b/client/test/golden/goldens/stock_in_form_mobile_c.png differ diff --git a/client/test/golden/goldens/stock_in_list_a.png b/client/test/golden/goldens/stock_in_list_a.png index b5cf351..1c224b6 100644 Binary files a/client/test/golden/goldens/stock_in_list_a.png and b/client/test/golden/goldens/stock_in_list_a.png differ diff --git a/client/test/golden/goldens/stock_in_list_b.png b/client/test/golden/goldens/stock_in_list_b.png index 66e43b0..9fe2b9f 100644 Binary files a/client/test/golden/goldens/stock_in_list_b.png and b/client/test/golden/goldens/stock_in_list_b.png differ diff --git a/client/test/golden/goldens/stock_in_list_c.png b/client/test/golden/goldens/stock_in_list_c.png index 4a10d1c..1f3efb3 100644 Binary files a/client/test/golden/goldens/stock_in_list_c.png and b/client/test/golden/goldens/stock_in_list_c.png differ diff --git a/client/test/golden/goldens/stock_in_list_mobile_a.png b/client/test/golden/goldens/stock_in_list_mobile_a.png index 94478fc..47c0096 100644 Binary files a/client/test/golden/goldens/stock_in_list_mobile_a.png and b/client/test/golden/goldens/stock_in_list_mobile_a.png differ diff --git a/client/test/golden/goldens/stock_in_list_mobile_b.png b/client/test/golden/goldens/stock_in_list_mobile_b.png index c00df3e..c14e8c3 100644 Binary files a/client/test/golden/goldens/stock_in_list_mobile_b.png and b/client/test/golden/goldens/stock_in_list_mobile_b.png differ diff --git a/client/test/golden/goldens/stock_in_list_mobile_c.png b/client/test/golden/goldens/stock_in_list_mobile_c.png index f2153f1..7d71962 100644 Binary files a/client/test/golden/goldens/stock_in_list_mobile_c.png and b/client/test/golden/goldens/stock_in_list_mobile_c.png differ diff --git a/client/test/golden/goldens/stock_out_form_a.png b/client/test/golden/goldens/stock_out_form_a.png index ec411b9..70c1a99 100644 Binary files a/client/test/golden/goldens/stock_out_form_a.png and b/client/test/golden/goldens/stock_out_form_a.png differ diff --git a/client/test/golden/goldens/stock_out_form_b.png b/client/test/golden/goldens/stock_out_form_b.png index 79df1a1..d33e68a 100644 Binary files a/client/test/golden/goldens/stock_out_form_b.png and b/client/test/golden/goldens/stock_out_form_b.png differ diff --git a/client/test/golden/goldens/stock_out_form_c.png b/client/test/golden/goldens/stock_out_form_c.png index 595dc99..333c96a 100644 Binary files a/client/test/golden/goldens/stock_out_form_c.png and b/client/test/golden/goldens/stock_out_form_c.png differ diff --git a/client/test/golden/goldens/stock_out_form_mobile_a.png b/client/test/golden/goldens/stock_out_form_mobile_a.png index 594eaa2..b0af25b 100644 Binary files a/client/test/golden/goldens/stock_out_form_mobile_a.png and b/client/test/golden/goldens/stock_out_form_mobile_a.png differ diff --git a/client/test/golden/goldens/stock_out_form_mobile_b.png b/client/test/golden/goldens/stock_out_form_mobile_b.png index b79a64c..ade5865 100644 Binary files a/client/test/golden/goldens/stock_out_form_mobile_b.png and b/client/test/golden/goldens/stock_out_form_mobile_b.png differ diff --git a/client/test/golden/goldens/stock_out_form_mobile_c.png b/client/test/golden/goldens/stock_out_form_mobile_c.png index 80c9bd8..41cd007 100644 Binary files a/client/test/golden/goldens/stock_out_form_mobile_c.png and b/client/test/golden/goldens/stock_out_form_mobile_c.png differ diff --git a/client/test/golden/goldens/stock_out_list_a.png b/client/test/golden/goldens/stock_out_list_a.png index fd050a9..da6dd0d 100644 Binary files a/client/test/golden/goldens/stock_out_list_a.png and b/client/test/golden/goldens/stock_out_list_a.png differ diff --git a/client/test/golden/goldens/stock_out_list_b.png b/client/test/golden/goldens/stock_out_list_b.png index fe6d29b..dc32df3 100644 Binary files a/client/test/golden/goldens/stock_out_list_b.png and b/client/test/golden/goldens/stock_out_list_b.png differ diff --git a/client/test/golden/goldens/stock_out_list_c.png b/client/test/golden/goldens/stock_out_list_c.png index 7bab2d8..d0bfb52 100644 Binary files a/client/test/golden/goldens/stock_out_list_c.png and b/client/test/golden/goldens/stock_out_list_c.png differ diff --git a/client/test/golden/goldens/stock_out_list_mobile_a.png b/client/test/golden/goldens/stock_out_list_mobile_a.png index b963489..c6a2da6 100644 Binary files a/client/test/golden/goldens/stock_out_list_mobile_a.png and b/client/test/golden/goldens/stock_out_list_mobile_a.png differ diff --git a/client/test/golden/goldens/stock_out_list_mobile_b.png b/client/test/golden/goldens/stock_out_list_mobile_b.png index 25e288d..272346a 100644 Binary files a/client/test/golden/goldens/stock_out_list_mobile_b.png and b/client/test/golden/goldens/stock_out_list_mobile_b.png differ diff --git a/client/test/golden/goldens/stock_out_list_mobile_c.png b/client/test/golden/goldens/stock_out_list_mobile_c.png index bbc5feb..6e54d79 100644 Binary files a/client/test/golden/goldens/stock_out_list_mobile_c.png and b/client/test/golden/goldens/stock_out_list_mobile_c.png differ diff --git a/client/test/support/golden_harness.dart b/client/test/support/golden_harness.dart index 5b7c748..e4a457b 100644 --- a/client/test/support/golden_harness.dart +++ b/client/test/support/golden_harness.dart @@ -1,8 +1,26 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' show rootBundle, FontLoader; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jiu_client/core/theme/themes.dart'; +// 加载真实中文字体(消除 golden 豆腐块),使 golden 能与原型截图做保真 diff。 +// 原型截图侧同样注入 Noto Sans SC(见 tools/fidelity.mjs),两边字体一致。 +bool _fontsLoaded = false; +Future ensureGoldenFonts() async { + if (_fontsLoaded) return; + final loader = FontLoader('NotoSansSC') + ..addFont(rootBundle.load('assets/fonts/NotoSansSC.ttf')); + await loader.load(); + _fontsLoaded = true; +} + +/// 把 NotoSansSC 套到主题文字上(含 hardcoded TextStyle 经 DefaultTextStyle 继承)。 +ThemeData withGoldenFont(ThemeData base) => base.copyWith( + textTheme: base.textTheme.apply(fontFamily: 'NotoSansSC'), + primaryTextTheme: base.primaryTextTheme.apply(fontFamily: 'NotoSansSC'), + ); + /// design-distill 阶段4(Flutter 端)可复用 golden 骨架。 /// 在指定主题 / viewport 下渲染 [child](含 provider 覆盖),比对/更新 golden。 /// @@ -23,6 +41,7 @@ Future pumpGolden( Size logical = const Size(1280, 900), double dpr = 2.0, }) async { + await ensureGoldenFonts(); tester.view.physicalSize = Size(logical.width * dpr, logical.height * dpr); tester.view.devicePixelRatio = dpr; addTearDown(tester.view.resetPhysicalSize); @@ -32,7 +51,7 @@ Future pumpGolden( overrides: overrides, child: MaterialApp( debugShowCheckedModeBanner: false, - theme: buildTheme(theme), + theme: withGoldenFont(buildTheme(theme)), home: child, ), ));