Skip to content

feat(app): add theme tokens, translations and toasts - #190

Merged
1morr merged 8 commits into
mainfrom
feat/ui-foundation
Sep 30, 2026
Merged

1morr merged 8 commits into
mainfrom
feat/ui-foundation

Conversation

@1morr

@1morr 1morr commented Sep 30, 2026

Copy link
Copy Markdown
Owner

M1 PR 12a:UI 的基礎(ADR 0024 §決定 1–3、7;ADR 0023 §決定 1–3、5;擁有者決定 2)。PR 12 拆成 12a 與 12b,由擁有者核准。

做了什麼

  • 主題(lib/ui/theme/):
    • Material 3,淺色與深色;
    • AppTokens 包含間距、圓角、成功與警告兩組語意色、焦點框;元件的固定尺寸放 AppLayout;
    • 字型 fallback 取自平台層,依介面語言排序。
  • WindowClass:與 M3 同值,依內容區寬度判斷。
  • i18n:slang 三語言(zh-TW 為 base、zh-CN、en),產生檔比照 drift 提交,CI 現有的 codegen 檢查一併涵蓋。
    • MaterialApp.locale 用帶書寫系統的形式,例如 zh-Hant-TW。
    • 英文介面時,主題的文字樣式帶 zh-Hant,漢字才會用繁中字形。
  • 錯誤訊息:ErrorMessageKey 對到翻譯字串。AppError.messageArgs 收窄成 Map<ErrorMessageArg, int>,插件或伺服器的文字在型別上就放不進畫面。
  • 提示:Toaster 與 ToastHost 放在 MaterialApp.builder,在全螢幕頁、對話框、底部面板之上都看得到。
    • 一次一則,新的取代舊的;時長 4/6 秒;5 秒內去重;開無障礙導覽時停留到手動關閉;App 在背景不顯示。
    • 錯誤一律寫進錯誤歷史,被去重掉的也寫。
    • 擁有者核准延到 M3:ADR 0023 §決定 4 的詳細頁與「回報」。
  • 外觀設定可清回跟隨系統:repository 新增 clear。
  • 身分頁:暫時保留,加上主題、語言切換與字形樣本,12b 會換成正式外殼。

驗證

  • format、dart analyze --fatal-infos、flutter analyze 都零問題;flutter test 714 個通過;哨兵通過;Windows 與 Android 的 dev 建置都成功。
  • 測試涵蓋:
    • 三語言的 key 與參數一致,檔內有變異案例;
    • 每個錯誤 key 在三語言都有字串;
    • 提示的去重、取代、時長,以及在各種頁面之上可見;
    • 淺色與深色主題下的點擊區與對比度;
    • 元件確實繼承文字的 locale;
    • 切換語言時 log 記下的字型清單是對的。
  • 實機(照 verify-on-device):
    • 平台:Windows 11(dev debug)|模式:不連網
      • 繁中與 English 用正黑體,简中用雅黑;
      • 切 繁中 → English → 简中 → 繁中,四筆 UI locale applied 的字型清單都對;
      • 淺色、深色、跟隨系統都能切換,log 裡沒有錯誤。
    • 平台:Android 模擬器(dev debug,系統語言 en)|模式:不連網
      • 原本英文介面的漢字落到簡中字形,修正後與 zh-Hant 對照列相同;
      • 简中介面與 zh-Hans 列相同。
  • opus 審查修了兩個實機發現的問題,並補上 intl 的直接依賴:
    • 切換語言時 log 記到上一個語言的字型清單:Riverpod 通知順序造成的舊值;
    • Android 英文介面的漢字用了簡中字形。

Review 指南

  • lib/ui/toast/toast_host.dart:層級、取代、停留。
  • lib/ui/i18n/ui_locale.dart:系統語言的對應,以及字型、文字 locale 的推導。
  • lib/core/errors/app_error.dart:messageArgs 的新型別。

A fresh checkout has no build_runner asset graph, so committed slang
outputs are treated as conflicts and the build aborts; git still
decides whether anything changed.
slang_build_runner treats committed outputs as conflicts in a fresh
checkout even with --delete-conflicting-outputs; the slang CLI reads
slang.yaml and rewrites them in place.
@1morr

1morr commented Sep 30, 2026

Copy link
Copy Markdown
Owner Author

CI 修正:前兩輪 App Analyze and Test 在「Check generated code is up to date」失敗。原因是 slang_build_runner 在乾淨的 checkout 裡,會把已提交的 lib/i18n/*.g.dart 當成衝突而拒絕覆寫;加了 --delete-conflicting-outputs 也一樣。改成用 slang 內建的 CLI dart run slang 產生(設定移到 slang.yaml),CI 會分別重跑 drift 與 slang,再看 git status 有沒有變動。這一輪全綠。

@1morr
1morr merged commit b2f50db into main Sep 30, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant