diff --git a/docs/plans/INBOX.md b/docs/plans/INBOX.md index 468563d..38b9a65 100644 --- a/docs/plans/INBOX.md +++ b/docs/plans/INBOX.md @@ -1,3 +1,42 @@ +## [已处理] 2026-10-20 | K31-B 首页频道悬浮轮播图 + 轮播全宽直角 + 频道下划线选中(仅 App 端) + +**用户指令(2026-10-20,原文)**: +> 「现在改首页 上方的热门 免费 新剧 榜单 是悬浮在轮播图上的 轮播图宽度占满 不要圆角 而且上面的也不是圆角展示 选中的下方带横线标识即可」 + +**现状** +- `lib/pages/home/home_browse_view.dart` 的 `_sections()` 顺序为:`_channels()`(ChoiceChip 胶囊行)→ `_hero()`(带左右 16 padding)→ 继续观看 → 频道标题 → 网格。 +- `_channels()` 用 `ChoiceChip` + `StadiumBorder` + `selectedColor: AppColors.blue`,是圆角胶囊选中态。 +- `_hero()` 外层有 `Padding(pageHorizontal)`,`FeedBannerCarousel` 的 `_bannerCard` 用 `ClipRRect` 圆角(hero 用 `AppDimens.heroBannerRadius`),点击层 `Material` 也带同款圆角。 + +**口径(只改 Flutter,不动后端、不改接口、不影响发现页)** +1. 结构调整:把「频道行」叠加到轮播图上。新增 `_heroWithChannels()`: + - `SizedBox(height: AppDimens.heroBannerHeight)` 内用 `Stack`; + - 底层 `Positioned.fill(child: FeedBannerCarousel(...))`; + - 顶层 `Positioned(top: 8, left: 0, right: 0, child: _channels(l10n, overImage: true))`。 + - 无 banner 时(`banners.isEmpty`)退化为普通频道行,放在网格上方,不叠加。 +2. 轮播图全宽直角(仅首页 hero): + - `FeedBannerCarousel` 增加可选参数 `flush`(默认 false,发现页行为不变); + - `flush: true` 时 `_bannerCard` 的外层 `ClipRRect` 圆角为 0、点击层 `Material` 圆角为 0; + - 首页 `_hero()` 去掉左右 `Padding`,让轮播贴屏幕左右边缘; + - 发现页的 0.94 视口与圆角保持现状。 +3. 频道行改为下划线选中,不再用 `ChoiceChip`: + - 结构:横向可滚动 `Row`/`ListView`,项间距 20,左右内边距 16,整行高 44; + - 文字:选中 `fontSize 15 / w800`,未选中 `w600`;悬浮在图上时颜色为白色(未选中 `Colors.white70`,带播放器同款文字阴影),非叠加场景用 `AppColors.onSurface` / `AppColors.muted`; + - 选中项文字下方 4px 处一条 `width 18 / height 2 / 圆角 1` 的横线,悬浮时白色、非叠加时 `AppColors.blue`;未选中项用同尺寸透明横线占位,避免切换时跳动; + - Key 保持不变:整行 `home-channels`,每项 `home-channel-`;横线新增 `home-channel-underline-`。 +4. 交互与状态不变:点击仍然调用 `logic.selectChannel(...)`,选中频道影响下方网格与频道标题。 +5. `_sections()` 中 `_channels()` 从原位置移除,改为由 `_heroWithChannels()` 承载;无 banner 时才单独出现在网格上方。 + +**测试/门禁** +- 同步改写 `test/home/k28_a_navigation_test.dart` 中基于 ChoiceChip 的断言:改为断言选中项横线可见/非选中项横线透明、颜色与字重符合上述口径,点击仍能切换频道; +- 新增断言:`home-hero-banner` 宽度等于屏幕宽度(无左右 padding)、圆角为 0;频道行在 Stack 中位于轮播之上(可通过层级/位置断言); +- 发现页轮播测试保持通过(`flush` 默认 false); +- `dart analyze lib test` 零告警 + `flutter test` 全过 + `flutter build apk --debug`。 + +**流程**:从 `develop` 拉 `feature/flutter-k31-home-channels`;作者 `Zhou Weidong <502333560@qq.com>`;`--no-ff` 合回 develop 并 push;PROGRESS 留痕;真机验收由用户执行。 + +--- + ## [已处理] 2026-10-20 | K31-A 播放页长按手势:中间更多 / 两侧清屏+2 倍速(仅 App 端) **用户指令(2026-10-20,原文)**: diff --git a/docs/plans/PROGRESS.md b/docs/plans/PROGRESS.md index 80fb643..9494a91 100644 --- a/docs/plans/PROGRESS.md +++ b/docs/plans/PROGRESS.md @@ -20303,3 +20303,36 @@ Running Gradle task 'assembleDebug'... ``` 解读:静态检查零告警,400 条测试全部通过,debug APK 构建成功。工作区原有 `pubspec.lock` 变更未纳入本批提交。真机验收由用户执行。 + +## 2026-10-20 ReelShort:K31-B 首页频道悬浮轮播 + 全宽直角 + 下划线选中 + +- 分支:`feature/flutter-k31-home-channels` +- 功能提交:`a24f1fa feat(flutter): 首页频道叠加轮播并改下划线选中` +- develop 合并提交:`290b92c merge: 合并 K31-B 首页频道与轮播改版`,已推送。 +- `home_browse_view.dart`:新增 `_heroWithChannels()`,`SizedBox(heroBannerHeight)` 内 Stack,底层 `Positioned.fill` 放轮播、顶层 `Positioned(top:8)` 放频道行;无 banner 时退化为普通频道行。 +- 频道行去掉 ChoiceChip/StadiumBorder:44 高横向滚动,间距 20、左右 16;选中 15 号 w800、未选中 w600;图上白字(未选中 white70 + 阴影)、非叠加 onSurface/muted;选中下划线 18×2 圆角 1(图上白色、非叠加主色),未选中透明占位。Key 保持 `home-channels` / `home-channel-`,新增 `home-channel-underline-`。 +- `FeedBannerCarousel` 新增可选 `flush`(默认 false):首页 hero 传 `flush: true` 且去掉左右 padding,轮播宽度等于屏宽、ClipRRect 与点击层圆角均为 0;发现页保持 0.94 视口与原圆角。 +- 交互不变:点击仍调用 `logic.selectChannel`。 + +测试(改写 + 新增): +- `should_switch_home_channel_when_underline_tab_is_tapped`:选中白色下划线/未选中透明、字重 800/600、图上文字 white/white70,点击后横线与字重切换。 +- `should_render_flush_hero_with_channels_overlaid`:`home-hero-banner` 宽 390=屏宽、left=0、ClipRRect 圆角 0,频道行位于 `home-hero-section` 内且 top=hero.top+8。 +- 发现页轮播、首页布局相关用例继续通过(flush 默认 false)。 + +门禁原始输出: + +```text +$ dart analyze lib test +Analyzing lib, test... +No issues found! + +$ flutter test +00:35 +401: All tests passed! + +$ flutter build apk --debug +Running Gradle task 'assembleDebug'... + 7.0s +✓ Built build/app/outputs/flutter-apk/app-debug.apk +``` + +解读:静态检查零告警,401 条测试全部通过,debug APK 构建成功。工作区原有 `pubspec.lock` 变更未纳入本批提交。真机验收由用户执行。