feat: add knowledge library card details - #35
Conversation
starvingarc
left a comment
There was a problem hiding this comment.
整体方向与 #25 一致:知识库卡片现在可以进入独立详情,来源降级也比原实现更诚实。复核中确认编译成功、3/3 XCTest 通过,文档检查和 diff-check 通过;不过以下问题需要在合并前处理。
必须修复
-
真实 API 时间格式无法被当前解析器处理
后端使用
Date.toISOString(),实际返回类似2026-07-30T08:00:00.000Z的带毫秒时间;OmoModels.swift中默认的ISO8601DateFormatter()无法解析这一格式。真实卡片因此会把“下次召回”显示为“等待安排”、隐藏创建时间,isDue还可能把未到期卡片判断为到期。请建立同时兼容带/不带 fractional seconds 的共享解析器,并使用真实 API wire format 补测试。现有 Fixture 和测试时间均不带毫秒,因此掩盖了该问题。
-
Debug 自动详情导航没有一次性消费
openFixtureDetailIfRequested同时挂在onAppear和store.cards变化上,而LibraryView在切换 Tab 后会重建、path恢复为空。只要启动参数仍包含-OmoOpenLibraryDetail,每次进入“知识库”都会再次自动打开第一张卡。该标记应放在不会随 Tab 重建的
ContentView或OmoStore中,并在首次自动打开后立即消费。请覆盖:首次启动自动打开 → 返回列表 → 切到今日 → 再进知识库时仍停留在列表。
体验与无障碍
-
详情正文对比度不足
explanation、来源归属和状态说明使用固定OmoTheme.muted。该颜色对页面背景约为3.53:1、对表面约为4.00:1,低于普通字号建议的4.5:1;固定 RGB 也不会随系统“增强对比度”自动调整。请改用动态语义色或提供满足对比度要求的 token,并复核正文、caption 与高对比模式。 -
“低频漂浮”实际为持续循环动画
详情页角色使用
1.8s.repeatForever,用户阅读长内容时始终移动,与文档声明的“低频漂浮”不一致。建议改为一次入场动作,或采用有间隔、可取消的 idle 动作;离开页面、Reduce Motion 或低电量时应停止。
验收证据
PR 描述引用的 /tmp/Omo-issue25-*.png 仅存在作者本机,其他 reviewer 无法复核;当前两张 Fixture 也不足以证明“返回后保留长列表位置”。修复后请补一段可复核的长列表返回验证,以及标准字号、Accessibility 字号、Reduce Motion 和来源降级状态的证据。
完成以上修改后可以继续复审。
范围
Closes #25
背景
main重新提交相同功能,当前仅供评审,不自动合并Plan 历史
原计划已在仓库历史中完成并退役:
088d7cd plan: feat-library-card-detail0c86deb plan: complete feat-library-card-detail0fbbaac plan: retire feat-library-card-detail验证
npm --prefix backend run docs:check:通过,16 篇 Markdown / 139 个双链目标git diff --check origin/main...HEAD:通过/tmp/Omo-issue25-*.pngUI 证据使用显式 Debug Fixture 或不可连接本地地址,只证明受测 Simulator 的布局与状态映射,不证明真实 Qwen / TikHub 或生产服务。
合并
本 PR 保持 open,等待人工评审;不要自动 merge。