3 Commits
3 changed files with 413 additions and 0 deletions

No files matched your search

+82
View File
@@ -0,0 +1,82 @@
# 2026-10-17 K5 客户端视觉:克莱因蓝主题 + 印尼市场适配
## 一、目标与边界
本轮只完成 Flutter 客户端的主题色、蓝色收敛、印尼语 locale 和回归测试:
- K5-A:建立克莱因蓝 token 与浅色/深色显式 `ColorScheme`,主色统一 `#002FA7`。
- K5-B:清理页面层的旧蓝字面量,统一使用 `AppColors` / `ColorScheme`;不改语义色。
- K5-C:`LocaleController` 支持 `id`;未显式选择时跟随系统,非 `en/zh/id` 回退 `id`;
两个现有语言入口增加 Bahasa Indonesia。
- K5-D:补主题 token、对比度、硬编码扫描、locale 回退与语言切换测试,
回归深色/浅色、三态和小屏布局。
不做 K4、支付、Google 登录、新接口、下载落盘、App 图标/启动图或信息架构调整;
不改后端、`ReelShortWeb`、specs。
## 二、用户裁定色值
| Token | 值 | 用途 |
| --- | --- | --- |
| `blue` | `#002FA7` | Klein Blue / IKB 主色 |
| `bluePressed` | `#00227A` | 按下/激活态与大面积蓝色背景 |
| `blueSoft` | `#5B7BE0` | 深色背景上的高亮/次级文字与图标 |
| `onPrimary` | `#FFFFFF` | 主色上的文字/图标 |
| `ink` | `#0B0C10` | 保持现值 |
| `bar` | `#101114` | 保持现值 |
| `card` | `#17191F` | 保持现值 |
| `muted` | `#B7BDC9` | 保持现值 |
对比度口径:正文 ≥ 4.5:1,大字/图标 ≥ 3:1;错误红、成功绿、点赞红等语义色不改。
## 三、预计影响文件
- `lib/core/theme/app_colors.dart`
- `lib/app.dart`
- `lib/core/config/locale_controller.dart`
- `lib/pages/mine/mine_logic.dart`
- `lib/pages/home/widgets/home_quick_drawer.dart`
- `lib/pages/home/home_view.dart`
- `lib/pages/discover/discover_view.dart`
- `lib/pages/drama_detail/drama_detail_view.dart`
- `lib/pages/player/player_view.dart`
- `lib/pages/player/player_logic.dart`
- `lib/pages/player/widgets/seek_progress_bar.dart`
- `lib/pages/player/widgets/comment_tile.dart`
- `lib/pages/player/widgets/drama_comments_sheet.dart`
- `lib/pages/mine/mine_view.dart`
- `lib/pages/watch_records/watch_records_page.dart`
- `lib/pages/downloads/downloads_page.dart`
- `lib/pages/auth/auth_view.dart`
- `lib/core/widgets/auth_gate.dart`
- `lib/l10n/app_{en,zh,id}.arb` 与生成文件
- `test/theme/*`、`test/config/*`、相关页面 widget 测试
实际改动以静态扫描结果为准;不改业务逻辑和页面布局。
## 四、TDD 顺序
1. 写主题 token/对比度、硬编码蓝色扫描、locale `id` 持久化与未知语言回退测试,确认红灯。
2. K5-A:新增色值 token 和浅色/深色 `ColorScheme`,补主题测试转绿。
3. K5-B:按扫描结果替换页面蓝色字面量,补语言入口和 widget 回归。
4. K5-C:实现 `id` locale、系统语言跟随、未知系统语言回退 `id`,两个入口增加
Bahasa Indonesia。
5. K5-D:全量扫描、深色/浅色与小屏 widget 回归。
6. 门禁:`dart analyze lib test`、`flutter test`、`flutter build apk --debug`。
7. `--no-ff` 合并回 `develop` 并 push;FruitServer 仅提交 `docs/plans`。
## 五、风险与处理
- 克莱因蓝在浅色背景上作为文字可能对比不足:正文继续使用现有着色,
主色主要用于按钮/图标/选中态;主色背景统一配 `onPrimary`。
- `blueSoft` 仅用于深色背景高亮,避免在浅色背景当正文色造成低对比度。
- 现有 `_orange` 等历史命名可能实际承载蓝色,替换时按语义改名,避免误导。
- 直接替换主题色可能影响 FilledButton、Slider、Switch 等 Material 控件:
通过显式 `ColorScheme` 和 widget 测试统一验证。
- 语言入口两处需同步,避免“我的”和快捷抽屉行为不一致。
- 真机、设备截图与系统语言切换证据由用户执行,Codex 不跑真机。
## 六、待确认
- 当前无产品歧义;按用户裁定的方案 A 色值执行。
- specs 无成文色板,若后续提供 Stitch 视觉稿,再按新稿更新 token 与页面映射。
+214
View File
@@ -20,6 +20,220 @@
---
## [已处理·待用户验收] 2026-10-17 | K5 客户端视觉:克莱因蓝主题 + 印尼市场适配
**用户指令(2026-10-17)**:「改 UI 及 App 整体颜色,克莱因蓝,针对印尼市场,认真阅读文档严格执行」。
> **本批只做 K5 视觉与本地化,不做 K4,不接新接口。**
> **颜色口径**:specs 全文没有成文色板或设计稿(已检索 `AGENTS.md`、`CODING_STANDARDS.md`、`GIT_WORKFLOW.md`、`docs/01~20`、`docs/plans/*`、`FruitServer/docs/*`);
> 颜色值来自用户 2026-10-17 明确裁定的 **方案 A**,按下方色值执行,不得自行另选。
### 〇、开工前必读(按顺序)
1. `AGENTS.md`(目标市场:首发印尼)
2. `CODING_STANDARDS.md`(Dart/Flutter 红线、门禁)
3. `GIT_WORKFLOW.md`(Git Flow)
4. specs `docs/02-技术架构.md`(印尼首发)、`docs/15-成本清单与预算.md`(印尼语/Android 主导)、`docs/19-术语表.md`、`docs/16-测试用例库.md`
5. 本 INBOX 条目
### 一、PM 已勘察的现状(实测,直接用)
- 主题集中在 `lib/core/theme/app_colors.dart`:`blue #2F7BFF`、`blueSoft #8FB4FF`、`ink/bar/card/muted`。
- `lib/app.dart` 浅色与深色两套 `ColorScheme.fromSeed` 都硬编码 `seedColor: 0xFF2F7BFF`,另有 `scaffoldBackgroundColor`。
- **42 处硬编码蓝色**散落 14 个文件,分布:`mine_view.dart` 13、`discover_view.dart` 5、`player_view.dart` 4、`comment_tile.dart` 3、`drama_detail_view.dart` 3、`home_view.dart` 2、`auth_view.dart` 2、`app.dart` 2,其余 7 个文件各 1。
- `lib/core/config/locale_controller.dart` **只支持 `en` / `zh`**,选 `id` 会落成 null(跟随系统)——印尼首发缺陷。
- `app.dart` 的 `localeResolutionCallback` 在系统语言不支持时回退 `supported.first`(当前为 en),与「首发印尼」不符。
- 三语 arb 齐全:`app_en.arb` / `app_zh.arb` / `app_id.arb` 各 243 个 key。
### 二、本批范围(4 块,按顺序做)
#### K5-A 主题色系统(克莱因蓝)
色值(用户裁定,方案 A):
| Token | 值 | 用途 |
|---|---|---|
| `blue` | `#002FA7` | 主色(Klein Blue / IKB) |
| `bluePressed` | `#00227A` | 按下/激活态 |
| `blueSoft` | `#5B7BE0` | 深色背景上的高亮/次级文字与图标 |
| `onPrimary` | `#FFFFFF` | 主色上的文字/图标 |
| `ink/bar/card/muted` | 保持现值 | 深色底不改成蓝色,不破坏现有暗色风格 |
- `app_colors.dart` 增加上述 token,并把 `blue` 改为 `#002FA7`;`blueSoft` 若与现有语义冲突,明确注释用途。
- `app.dart` 两套主题改为显式 `ColorScheme`(或 `fromSeed` + 覆盖 `primary/onPrimary`),确保浅色与深色下主色一致为 `#002FA7`;`seedColor` 不得再出现其他蓝色字面量。
- **对比度硬要求**:正文文字 ≥ 4.5:1、大字号/图标 ≥ 3:1;主色大面积背景使用 `bluePressed`,主色上的文字用 `onPrimary`。
- 新增单测:至少断言 `blue == Color(0xFF002FA7)`、`onPrimary` 在白底/主色上的对比度达标。
#### K5-B 全量 UI 替换
- 把 42 处硬编码蓝色全部改为 `AppColors.*` 或 `Theme.of(context).colorScheme.*`,页面层禁止再出现 `0xFF2F7BFF` / `Colors.blue`。
- 覆盖页面:首页、发现、详情、播放(右栏/进度条)、我的、评论弹窗与评论项、观看记录、收藏、下载、登录、`AuthGate`、快捷抽屉。
- 统一控件:FilledButton/TextButton、Tab 指示器、Switch、进度条、选中态、链接、SnackBar 主色。
- **不改语义色**:错误红、成功绿、点赞红(如有)保持原语义,不因主题替换改成蓝色。
#### K5-C 印尼市场适配
- `LocaleController` 支持 `id`:`'id' => Locale('id')`,读写 `ui.locale` 持久化。
- 默认语言规则:用户未显式选择时跟随系统;系统语言不是 `en/zh/id` 时**回退 `id`**(首发印尼),不得回退 `en`。
- 语言选择入口增加 **Bahasa Indonesia** 选项(现有入口位置沿用,不新造页面)。
- 校验三语 arb:新增文案必须 en/zh/id 三份齐全;禁止硬编码文案。
- 日期/数字本地化:检查现有格式化是否按 locale(`intl`),`id` 下日期/数字格式正确。
- 不接 Google 登录、不做支付(属 K4/后续)。
#### K5-D 回归与验收
- 深色/浅色两套主题、加载/空/失败三态、小屏(iPhone SE 级别)均不破版。
- 新增 widget 测试:主题主色生效、页面无硬编码蓝色(可用静态扫描测试)、`LocaleController` 支持 id 与回退 id。
- 真机验收由用户执行:主题色、按钮/进度条/选中态、语言切换与印尼语显示。
### 三、明确不做
- 不改业务逻辑、接口调用、后端、`ReelShortWeb`、specs。
- 不做 Google 登录、支付、下载落盘。
- 不改 App 图标/启动图(无设计资源;如后续提供 Stitch 出稿再做)。
- 不替换信息架构与页面布局,只做颜色、主题与本地化;布局仅在换色后出现对比度/溢出问题时做最小修正。
### 四、规范约束
- 颜色只允许在 `app_colors.dart` 与主题层定义;页面禁止硬编码色值(测试断言除外)。
- l10n 三语齐全并重新生成;所有新增文案进三份 arb。
- 新文件首行 `// Author: fruit.com.cn`;public 类/方法文档注释;无 AI 痕迹。
- 代码规模红线:函数 ≤50 行、参数 ≤5、类 ≤300 行、单文件 ≤500 行、嵌套 ≤4 层、圈复杂度 ≤10。
### 五、门禁
1. `dart analyze lib test` 零告警;`flutter test` 全过。
2. `flutter build apk --debug` 通过。
3. 新增测试覆盖:主题 token 与对比度、无硬编码蓝色扫描、locale id 支持与回退、语言切换。
4. 真机/设备侧验证由用户执行(红线 7、10),回执给「用户可照做步骤 + 每步预期」,禁止用开发机 `curl` 冒充设备证据。
### 六、Git 与留痕
- 开工前先处理上一条诊断分支 `feature/flutter-ios-home-diagnostics`:按实际情况提交为诊断增强或清理回滚,确保 K5 从**干净的 `develop`** 拉分支(当前 develop 为 `e1147cf`)。
- 分支:`feature/flutter-k5-klein-blue`;完成后 `git merge --no-ff` 回 `develop` 并 push;不动 `main`。
- 先写 `FruitServer/docs/plans/2026-10-17-K5.md`(范围、影响文件、色值表、风险、待确认)。
- 每步「叙述 + 命令 + 原始输出 + 解读」追加到 `docs/plans/PROGRESS.md`;完成后停住写回执(含用户验证步骤与预期)。
- 提交作者与提交者统一 `Zhou Weidong <502333560@qq.com>`。
### 七、K5 完成回执(2026-10-17)
**结论**:K5-A 主题 token/ColorScheme、K5-B 蓝色收敛、K5-C 印尼语适配、
K5-D 回归均已完成并停止,未开始 K4,未接新接口,未跑真机。
#### 7.1 诊断分支收口
- iOS 首页诊断插桩已保留在未合并分支
`feature/flutter-ios-home-diagnostics`,提交
`7efbed97587dd3ed02967dcbbaa6fb85693c1883`。
- K5 从干净的 ReelShort `develop e1147cf` 拉出,未夹带诊断插桩。
#### 7.2 色值、主题与蓝色收敛
- `AppColors.blue = #002FA7`、`bluePressed = #00227A`、
`blueSoft = #5B7BE0`、`onPrimary = #FFFFFF`。
- `AppTheme.light()` / `AppTheme.dark()` 使用显式 ColorScheme,两套主题
`primary` 均为 `#002FA7`、`onPrimary` 均为白色;SnackBar 使用深蓝背景白字。
- 深色表面的小图标、链接和轨道使用 `blueSoft`;大面积选中背景使用
`bluePressed`;主按钮使用 `blue + onPrimary`。
- 页面层旧蓝 `0xFF2F7BFF`、`0xFF8FB4FF`、`Colors.blue` 扫描结果为空。
- 错误红、成功绿、点赞红等语义色未改;App 图标/启动图未改。
#### 7.3 印尼市场适配
- `LocaleController` 支持选择、持久化和恢复 `id`。
- 未显式选择时跟随系统;系统语言非 `en/zh/id` 时回退 `id`。
- “我的”语言弹层与首页快捷抽屉均增加 Bahasa Indonesia;
快捷抽屉改为 Wrap,避免 320px 小屏溢出。
- 新增 `bahasaIndonesia` 三语文案并重新生成 l10n。
- 观看记录与下载授权的日期/时间改由 `MaterialLocalizations` 按当前 locale
和系统 12/24 小时设置格式化。
#### 7.4 门禁原始结果
```
$ cd /Users/jianghaifeng/Desktop/ReelShort/ReelShort
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:12 +251 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
`~1` 是既有 live watch 用例在 8081 未启动时按机制跳过,不是失败。
新增测试覆盖:
- Klein Blue token、白字/主色对比度、图标/深底对比度。
- 浅色/深色 ColorScheme 与 widget 实际主题值。
- `lib` 旧蓝字面量静态扫描。
- locale `id` 选择、持久化、系统语言跟随与未知语言回退 `id`。
- Bahasa Indonesia 选项、语言切换、印尼语日期/时间格式。
- 320×568 深色小屏首页与“我的”页不溢出。
#### 7.5 Git
- 功能提交:`10d448c8ba93aa2762e14babdb528805897b3992`
`feat(flutter): 应用克莱因蓝主题与印尼语适配`
- `--no-ff` 合并提交:`e52d81881c19202c7adc8d13a6f78f78e4f6182f`
`merge: 合并 K5 克莱因蓝主题与印尼语适配`
- 已推送:`e1147cf..e52d818 develop -> develop`
- author/committer 均为 `Zhou Weidong <502333560@qq.com>`;未操作 `main`。
#### 7.6 用户真机验证步骤与预期
前置:安装最新 debug APK,分别准备一套 Android 与 iOS 设备,保留系统深色/浅色
切换条件。以下证据必须由用户在设备侧取得,Codex 未执行真机验证。
1. 浅色与深色系统下分别打开首页、发现、详情、播放、我的、收藏、记录和下载。
预期:页面可读、无溢出;主按钮为克莱因蓝白字;选中态/进度条可见;
深色底上的链接和图标使用较亮的蓝紫高亮;旧亮蓝 `#2F7BFF` 不再出现。
2. 对主按钮、进度条、选中 Tab 截图并用取色工具检查。
预期:主色接近 `#002FA7`;按下/激活大面积背景接近 `#00227A`;
主色按钮文字为 `#FFFFFF`。
3. 在 iPhone SE 级小屏打开首页与“我的”,展开语言入口。
预期:三个语言选项自动换行,不挤出屏幕;底栏文字和图标不重叠。
4. 从“我的 → 语言”选择 Bahasa Indonesia,再冷启动 App。
预期:界面切为印尼语,重启后仍保持印尼语。
5. 从首页快捷抽屉选择 Bahasa Indonesia。
预期:同样切为印尼语,两个入口行为一致。
6. 清除 App 数据/重新安装,把系统语言设为法语,且不手动选择语言。
预期:App 自动使用印尼语,不回退英语。
7. 在印尼语下查看观看记录与下载授权时间。
预期:日期/时间使用印尼地区 Material 格式;系统 12/24 小时设置变化时格式跟随。
8. 未登录点评论发布/点赞/举报,登录页按钮与错误/成功提示仍清晰可辨。
预期:业务流程不变;Klein Blue 按钮、蓝色 SnackBar 与红色错误提示对比度正常。
设备侧截图、系统语言切换日志与真机结果由用户执行;开发机检查不能替代这些证据。
#### 7.7 已知边界
- 现有主体页面保持 dark-first 设计,并显式使用 `AppTheme.dark()`;
根部同时提供浅色/深色 ColorScheme,未重做信息架构或页面布局。
- App 图标、启动图、Google 登录与支付不在本批范围。
- K4 未开始。
---
## [已处理·待用户验收] 2026-10-17 | K3 客户端第三批:互动(评论 + 点赞 + 举报 + 分享)
**用户指令(2026-10-17)**:客户端继续对接接口及 UI,严格执行 specs。
+117
View File
@@ -1667,3 +1667,120 @@ merge: 合并 K3 举报错误透传修复
```
解读:报告本人内容现在会把后端错误原样展示;author/committer 均保持统一。
---
## 2026-10-17 K5 克莱因蓝主题与印尼语适配(【Codex】)
### 19.1 诊断分支收口
叙述:上一项 iOS 首页诊断插桩已提交在独立分支,不并入 K5,也不阻塞干净基线。
```
$ git status --short --branch
## feature/flutter-ios-home-diagnostics
$ git log -1 --oneline
7efbed9 chore(flutter): 增加首页加载失败诊断日志
```
解读:诊断提交保留为未合并 feature 分支;K5 从 `develop e1147cf` 新建,
后续所有 K5 改动均在该基线上。
### 19.2 K5 计划
叙述:先写 `docs/plans/2026-10-17-K5.md`,记录方案 A 色值、影响文件、TDD、
风险和待确认,再开始代码。
```
Success. Updated the following files:
A docs/plans/2026-10-17-K5.md
```
### 19.3 K5 首次红灯
命令:
```
$ flutter test test/theme test/config/locale_controller_test.dart test/mine/mine_logic_test.dart test/widget_test.dart
```
原始输出(节选):
```
Error when reading 'lib/core/theme/app_theme.dart': No such file or directory
Member not found: 'bluePressed'
Member not found: 'onPrimary'
Method not found: 'resolveAppLocale'
Found 0 widgets with text "Bahasa Indonesia"
Expected: empty
Actual: [
'lib/core/theme/app_colors.dart:5: static const blue = Color(0xFF2F7BFF);',
...
]
00:07 +22 -5: Some tests failed.
```
解读:主题 token/ThemeData、locale 解析、语言选项和旧蓝扫描全部按预期红灯。
### 19.4 K5 实现与定向绿灯
实现内容:
- `AppColors` 新增 `bluePressed/onPrimary`,更新 `blue/blueSoft`。
- 新增 `AppTheme.light/dark` 显式 ColorScheme 和控件主题。
- 页面旧蓝清理,深色高亮改 `blueSoft`,大面积选中态改 `bluePressed`。
- `resolveAppLocale` 支持 en/zh/id,未知系统语言回退 id。
- 两个语言入口增加 Bahasa Indonesia;快捷抽屉改 Wrap。
- 日期/时间改用 `MaterialLocalizations`。
定向测试:
```
$ flutter test test/theme test/config test/formatting test/mine/mine_logic_test.dart test/widget_test.dart test/auth test/library test/watch test/download test/drama_detail
00:08 +97: All tests passed!
```
旧蓝扫描补跑:
```
$ rg -n '0xFF2F7BFF|0xFF8FB4FF|Colors\.blue|_orange|seedColor' lib -g '*.dart'
```
结果:无匹配(仅保留 `AppColors.blue/blueSoft/bluePressed` 等 token 引用)。
### 19.5 K5 最终门禁
```
$ dart analyze lib test
Analyzing lib, test...
No issues found!
$ flutter test
00:12 +251 ~1: All tests passed!
$ flutter build apk --debug
Running Gradle task 'assembleDebug'... 26.6s
✓ Built build/app/outputs/flutter-apk/app-debug.apk
```
解读:全量测试除既有 live watch 跳过外全部通过,APK 构建成功。
### 19.6 Git
```
10d448c8ba93aa2762e14babdb528805897b3992
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: feat(flutter): 应用克莱因蓝主题与印尼语适配
e52d81881c19202c7adc8d13a6f78f78e4f6182f
author: Zhou Weidong <502333560@qq.com>
committer: Zhou Weidong <502333560@qq.com>
subject: merge: 合并 K5 克莱因蓝主题与印尼语适配
To http://git.reelshort2.com/jianghaifeng/ReelShort.git
e1147cf..e52d818 develop -> develop
```
解读:K5 已以 `--no-ff` 合并到 ReelShort develop 并推送,未操作 main。