diff --git a/docs/tasks/PROGRESS-icon-motion-audit-20260922.md b/docs/tasks/PROGRESS-icon-motion-audit-20260922.md new file mode 100644 index 00000000..a4aa9f9a --- /dev/null +++ b/docs/tasks/PROGRESS-icon-motion-audit-20260922.md @@ -0,0 +1,25 @@ +# 进度 · 图标与轻量动效审计(2026-09-22) + +- 基线:`90eaf244`(入口弱边框已合入 staging)。 +- 结论:未换图标,未新增动效。星星辨识度的问题没有低风险替换。 +- 今日星语用 Lucide `Sparkles`,生时校正用 Lucide `Clock3`。两者都是装饰,按钮自己有 `aria-label`,图标 `aria-hidden`。换成月亮会和星盘里的 ☽ 撞意,所以不换。 +- 侧栏「收藏」旁的 `Star` 旁边已经有「收藏」二字,不靠图标单独表达状态。 +- 品牌标记保持静态。没有恢复 `thinking-orbs`,也没有给入口加循环动画。 +- `prefers-reduced-motion: reduce` 已把全站 `transition-duration` 收到 `.01ms`。入口过渡是 120ms 的边框、背景和阴影,落在既有 120/160/180ms 预算里。 +- 浏览器级减少动态效果和屏幕阅读器没有在本机走查,见 `docs/testing/icon-motion-audit-20260922.md`。 + +## 库存 + +| 位置 | 来源 | 语义 | 状态 | +| --- | --- | --- | --- | +| 今日星语入口 | Lucide `Sparkles` | 装饰,名字在按钮上 | 保留 | +| 生时校正入口 | Lucide `Clock3` | 装饰,名字在按钮上 | 保留 | +| 聊天顶栏人物 | 无图标,文字按钮 | 「当前星盘」+ 人名 | 保留 | +| 人物列表选中 | Lucide `Check` | 选中,旁边有人名 | 保留 | +| 侧栏收藏分组 | Lucide `Star` | 分组装饰,文字是「收藏」 | 保留 | +| 余额按钮 | Lucide `Sparkles` | 装饰,按钮有余额的可访问名 | 保留 | +| 星盘行星 | 自带 Noto 行星字形 | 盘面符号,不是入口图标 | 保留 | +| 首屏转圈 | `.app-loading-orbit` 纯 CSS | 唯一的首屏等待;失败后由内联脚本换文案 | 不新增第二套 | +| 发送 / 停止 | Lucide `ArrowUp` / `Square` | 输入框动作 | 保留 | + +`app-sidebar.tsx` 仍 import 了 `Orbit`,本轮没有调用点。任务书要求只记录、不顺手删。 diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 4f71275f..b2586348 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -155,7 +155,7 @@ | `TASK-report-public-content-20260922.md` | `PROGRESS-report-public-content-20260922.md` | 普通报告 canonical allowlist/projection:页面、下载、API 统一只展示用户可读正文、结论和必要限制说明;隐藏 workflow/技法/评分/raw tool/任务元数据 | 待验收 | `dd4141a0` | | `TASK-home-bootstrap-reliability-20260922.md` | `PROGRESS-home-bootstrap-reliability-20260922.md` | BUG-936 首屏 bundle 无关 fallback、可读失败状态和用户触发重试;复用既有 first-paint 任务,不重复添加 loading,不提前标记 resolved | 待验收 | `337d8200` | | `TASK-starter-entry-soften-20260922.md` | `PROGRESS-starter-entry-soften-20260922.md` | 弱化“今日星语 / 生时校正”入口默认边框与交互状态;保留 native button、44px 命中区、既有动作和 reduced-motion,不恢复旧卡片 | 待验收 | `45ec4617` | -| `TASK-icon-motion-audit-20260922.md` | `PROGRESS-icon-motion-audit-20260922.md` | P2 图标/轻量动效库存与合同审计;优先 Lucide/既有 glyph,不强行换图标、不新增 loading 或循环动画 | 待领取 | — | +| `TASK-icon-motion-audit-20260922.md` | `PROGRESS-icon-motion-audit-20260922.md` | P2 图标/轻量动效库存与合同审计;优先 Lucide/既有 glyph,不强行换图标、不新增 loading 或循环动画 | 待验收 | 本分支,未换图标 | | `TASK-consultation-answer-start-anchor-20260917.md` | `PROGRESS-consultation-answer-start-anchor-20260917.md` | 主会话回答落在结尾:`useConversationScrollAnchor` 是贴底跟随,流式期间视口钉在最后一个字,回答开头滚出视口;改为发送后问题钉顶、回答向下长、长出视口显示「跳到最新」、末尾动态留白;产品追加拍板:校正面同一语义(推翻 BUG-041/048 贴底),本轮开头 = 用户行或新助手行。BUG 段 930 起 | 已验收(经修复单) | `worktree/green-harbor-5be3` | | `TASK-consultation-answer-start-anchor-fix-20260917.md` | `PROGRESS-consultation-answer-start-anchor-fix-20260917.md` | 验收修复单:F1 头就是留白行时留白按整视口算(BUG-931);F2 留白只在钉住期间存在(BUG-932);前置:先修 e4e73f56 的两处 TS 错否则门禁不过 | 已验收 | `cc1a8980`(Claude 验收:tsc 0 / lint 0 error / npm test 3457 条 39 红与 11c0028d 逐条一致、新增 2 条绿 / `next build --webpack` 通过、`/` Static、首屏 gzip 591,242(较 09-16 基线 582,800 +1.45%,含会话列表单)/ Chrome 真实布局 S1–S6 全部通过,S6 新助手行距顶 16px 且增高不动,S5 不再写留白);真机六条欠 | | — | `PROGRESS-starter-greeting-20260917.md` | 首页开场语改成 claude.ai 式单行问候:`starter-greeting.ts` 的「称呼 + 追问句」五时段十五条收成三个池子(时段 / 星期 / 回访,按 `variantSelection` 确定性取一条),副标题行与 `.starter-salutation` 下线,h1 降到 `clamp(24px, 2.8vw, 30px)`;追问移到输入框占位符「想聊什么都可以」。产品直接拍板,非 Bug,不占 BUG 号 | 待验收 | `codex/starter-greeting-20260917` | diff --git a/docs/testing/icon-motion-audit-20260922.md b/docs/testing/icon-motion-audit-20260922.md new file mode 100644 index 00000000..4b86aba0 --- /dev/null +++ b/docs/testing/icon-motion-audit-20260922.md @@ -0,0 +1,8 @@ +# 图标与动效审计 · 浏览器清单(2026-09-22) + +本轮没有换图标,也没有加动画。下面留给真人,本机没有屏幕阅读器和系统「减少动态效果」的走查: + +1. 打开系统「减少动态效果」。首页两枚入口的边框可以变色,但不要看到滑动或循环转动。首屏转圈在脚本接管前仍是原来的 CSS,失败后应停在文案和「重新加载」。 +2. 用屏幕阅读器走到今日星语、生时校正:读到的是按钮名字,不读图标名。 +3. 侧栏「收藏」读到的是文字,星星不单独报一项。 +4. 星盘页的行星符号仍是盘面字形,不要被入口图标替换。 diff --git a/frontend/tests/icon-motion-audit.test.ts b/frontend/tests/icon-motion-audit.test.ts new file mode 100644 index 00000000..dfbed629 --- /dev/null +++ b/frontend/tests/icon-motion-audit.test.ts @@ -0,0 +1,19 @@ +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import test from "node:test"; + +const starterHome = readFileSync(new URL("../src/components/starter-home.tsx", import.meta.url), "utf8"); +const css = readFileSync(new URL("../src/app/globals.css", import.meta.url), "utf8"); + +test("the 2026-09-22 icon audit keeps the existing entry icons and adds no loop", () => { + assert.match(starterHome, /import \{ Clock3, Sparkles \} from "lucide-react"/); + assert.match(starterHome, /