6238b86dcb
- 登录/注册(login.html/register.html 1:1):两栏卡片+品牌渐变面板+主题小衣服 pill(onSurface 变体)+记住我(记录并预填最近账号)+原型式 toast 校验; 登录 fidelity 1.4–2.1% 三主题全绿;注册暂不入闸(少 门店编号/兑换券 字段, 已记 CONTRACT,screens.mjs 留存根) - ds 原子补齐:DsToast(.toast 单例)/DsCheck(.check/.agree)/DsButton lg 档/ DsSelect 替换全部旧 DropdownButton/DsField label 在上/DsInput 后缀与密码形态 - 全屏统一:对话框按钮全 DsButton、盒式输入主题钉死(visualDensity.standard、 h38、InputDecorationTheme 渗漏修复)、图标全 lucide、JetBrains Mono 三端同源、 BrandMark 真相源 logo、只读模式写操作全量守卫(WriteGuard+DsToast) - 出入库列表:版式对齐原型(卡片对齐+搜索框居中)、KPI 近30天滚动、结清后 失效财务应收应付表;商品编辑抽屉介绍库改搜索下拉、图片双击全屏预览 - 删除旧 UI 死代码:DataTableCard/FormDialog/PageScaffold/SearchChip/ SelectProductDialog/tabStateProvider - golden/fidelity:stock-in/out 补注册(9%)、login 入册(8%)、goldens 全量重打; 修复 pubspec flutter_web_plugins 非法声明(CI pub get 阻断) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
109 lines
4.4 KiB
Dart
109 lines
4.4 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'app_dims.g.dart';
|
||
import 'app_tokens.g.dart';
|
||
|
||
ThemeData buildTheme(String key) {
|
||
final t = appTokensOf(key);
|
||
final brightness = t.isDark ? Brightness.dark : Brightness.light;
|
||
final scheme = ColorScheme.fromSeed(
|
||
seedColor: t.primary,
|
||
brightness: brightness,
|
||
).copyWith(
|
||
primary: t.primary,
|
||
onPrimary: t.onPrimary,
|
||
surface: t.surface,
|
||
error: t.danger,
|
||
);
|
||
return ThemeData(
|
||
useMaterial3: true,
|
||
brightness: brightness,
|
||
colorScheme: scheme,
|
||
scaffoldBackgroundColor: t.bg,
|
||
// 桌面端默认 adaptivePlatformDensity=compact 会把输入框/按钮压矮 8px,
|
||
// 与原型 px 规格(.input h38 等)和 golden(测试环境=standard)不一致——
|
||
// 真机曾因此输入框只有 ~30 高。锁 standard,三端渲染与原型同几何。
|
||
visualDensity: VisualDensity.standard,
|
||
// ── 对话框/输入框/按钮的 Material 默认样式钉到 ds 真相源 ──
|
||
// 原型 .modal:surface / border / r-xl / 标题 fs-h2 heading
|
||
dialogTheme: DialogThemeData(
|
||
backgroundColor: t.surface,
|
||
surfaceTintColor: Colors.transparent,
|
||
shape: RoundedRectangleBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rXl),
|
||
side: BorderSide(color: t.border),
|
||
),
|
||
titleTextStyle: TextStyle(
|
||
fontSize: AppDims.fsH2,
|
||
fontWeight: FontWeight.w700,
|
||
color: t.heading),
|
||
contentTextStyle: TextStyle(fontSize: AppDims.fsBody, color: t.text),
|
||
),
|
||
// 原型 .input:h38 盒式(surface/1px border/r-md/pad 0 11),聚焦主色边。
|
||
// 全局兜底——未显式给 decoration 边框的 TextField/DropdownButtonFormField
|
||
// 一律盒式,禁止 Material 默认下划线再出现。
|
||
inputDecorationTheme: InputDecorationTheme(
|
||
isDense: true,
|
||
filled: true,
|
||
fillColor: t.surface,
|
||
hintStyle: TextStyle(fontSize: AppDims.fsBody, color: t.faint),
|
||
labelStyle: TextStyle(fontSize: AppDims.fsSm, color: t.muted),
|
||
contentPadding: const EdgeInsets.symmetric(horizontal: 11, vertical: 9),
|
||
enabledBorder: OutlineInputBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rMd),
|
||
borderSide: BorderSide(color: t.border),
|
||
),
|
||
disabledBorder: OutlineInputBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rMd),
|
||
borderSide: BorderSide(color: t.border),
|
||
),
|
||
focusedBorder: OutlineInputBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rMd),
|
||
borderSide: BorderSide(color: t.primary),
|
||
),
|
||
border: OutlineInputBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rMd),
|
||
borderSide: BorderSide(color: t.border),
|
||
),
|
||
),
|
||
// 原型 .btn.primary:primary 底 / onPrimary 字 / h38 / r-md / w600 / 无阴影
|
||
elevatedButtonTheme: ElevatedButtonThemeData(
|
||
style: ElevatedButton.styleFrom(
|
||
backgroundColor: t.primary,
|
||
foregroundColor: t.onPrimary,
|
||
elevation: 0,
|
||
minimumSize: const Size(0, 38),
|
||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||
textStyle: const TextStyle(
|
||
fontSize: AppDims.fsBody, fontWeight: FontWeight.w600),
|
||
shape: RoundedRectangleBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rMd)),
|
||
),
|
||
),
|
||
filledButtonTheme: FilledButtonThemeData(
|
||
style: FilledButton.styleFrom(
|
||
backgroundColor: t.primary,
|
||
foregroundColor: t.onPrimary,
|
||
minimumSize: const Size(0, 38),
|
||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||
textStyle: const TextStyle(
|
||
fontSize: AppDims.fsBody, fontWeight: FontWeight.w600),
|
||
shape: RoundedRectangleBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rMd)),
|
||
),
|
||
),
|
||
// TextButton 兼作行内链接,不加边框;只统一字号字重与圆角
|
||
textButtonTheme: TextButtonThemeData(
|
||
style: TextButton.styleFrom(
|
||
minimumSize: const Size(0, 38),
|
||
textStyle: const TextStyle(
|
||
fontSize: AppDims.fsBody, fontWeight: FontWeight.w600),
|
||
shape: RoundedRectangleBorder(
|
||
borderRadius: BorderRadius.circular(AppDims.rMd)),
|
||
),
|
||
),
|
||
// 字体走系统默认(macOS/iOS=PingFang SC,与原型 --font 一致);不强制 Noto。
|
||
// Noto 仅 golden 测试加载(CI 无中文字体),见 test/support/golden_harness.dart。
|
||
extensions: <ThemeExtension<dynamic>>[t],
|
||
);
|
||
}
|