Skip to content

首页与腕上:polish 记录 ​

状态:原型打磨记录(2026-10)。只记两种形式在 composite 演示数据上的取舍、交互与动画;行为契约仍以 信息契约 为准,形式定义见 概念卡。记录写于第一次自由运行(free-composite-2026-10-15)打磨出的演示数据,2026-10-15 晚按第二次自由运行(free-20261015-161501)的演示数据更新了引用:事项、问题与数字换成新数据;截图与键盘实测是在旧数据上做的,没有重拍,按新数据重测的结果接在原句之后,旧现象在新数据里不再出现的在原处注明。

两种形式共用同一个判断:用户回来时先看到“几件等我、哪件最急”,再按需展开“为什么在这里”。回应在本页演示,走 respond.mjs 的同一套状态:按下即“已保存”,推进到下一轮整理后变为“已收到”,随时可撤回;保存、Agent 确认收到、外部行动结果是三件事,页面不把“已保存”说成“已办完”。

数据上只加了一个可选字段:ask 的 short,16 字以内的短问法,供腕上这类只放得下一行的形式。它写在 edits.json 的 26 条 ask 上,由 build_demo_data.py 透传并重放生成;重放后 scenario.mjs 与原先相比只多出各帧登记里的 short。story 数据没有这个字段,腕上回退为:题干不超过 16 字直接用,否则取最后一个冒号后的分句,再不行截断加省略号。

截图都在本地 .local/polish-home/(不入库):拼图在该目录下,单张原图在 final/,打磨前的基线在 before/ 与 before-story/。截图都由真实页面驱动得到,过渡序列用 CDP 把动画放慢到 0.25 倍,每 80ms 动画时间拍一张。

D 手机首页 ​

场景。 离开半天回来,拿起手机:一眼知道有几件等自己回应,先答最急的那件;其余的知道有多少、是什么类型,需要时再展开。

承载的回应类型。 approve 与 choose 一键作答(推荐项实心);confirm 两键;reply 在卡片内展开回复框,回车发送;schedule、defer 打开底部选项层;每张卡都有“稍后”(1 小时、2 小时、明早)和“详情”。非问题事项可“知道了”或左滑已阅。

信息结构。

  • 头部:日期与时间,“N 件等你回应”(数字随作答滚动),一行“上次看是 …,之后收到 N 条,新问题 N 个,N 处变化,你在原处处理了 N 件”,行尾是屏幕用途(近期重点 / 通知中心)切换。没有任何事项时不显示这一行。
  • 最急的 3 张大卡:根层的问题按 档位 → 24 小时内到期 → 截止时间 → 份额 → 排名 排序,取前 3 张未答的。第一张带摘要。卡片顶部是“为什么在这里”的标签(档位、已过/还有多久、新问题/问题已更新、已等多久、份额),其下是事项标题、大字题干、来源处的动作句。
  • 来源处的动作写成动作句,不贴原文:例如“你用 iMessage 回复 Kajsa”,再说明这句是否回应了这个问题(“,回应了这个问题”或“;这个问题还开着”),不把对别的问题的回复当成作答。
  • 其余问题折成一行“还有 N 件等你回应 · 2 个回复 · 2 个推迟 …”,展开是两行题干加类型芯片(审批 / N 选 1 / 回一句 / 选时间 / 推到…),点芯片打开作答层。
  • “进行中与结果”只放未被提醒、档位不低的非问题事项。根层 1 份的长尾(低档、微量档)折成“另有 N 项次要事项 · 低档 3 · 微量档 4 · 共 13 份”(f26),可逐件“知道了”或一次全部知道。旧数据 f26 这一行是“低档 1 · 微量档 24 · 共 27 份”,长尾折叠是按它设计的;新数据根层短得多(f26 只有 14 件),规则不变,记录保留作为设计理由。
  • 底部常驻“累计 N 条输入 → 现在 N 件”,点开是本轮变化、采用的输入、撤下与合并。
  • 详情页:为什么在这里(事实标签、摘要、理由)、你在原处做过的、依据(来源原文,前 3 条,其余折叠)、这件事怎么变的(纳入、份额变化、改写、登记问题、你的动作合并 ×N,超过 6 步折叠)、批注、子项,底部是同一套作答区。

交互清单。

  • 切换整理时刻:←/→,空格播放/暂停(焦点在按钮上时空格照常按按钮),顶部轨道可点、可拖,轨道获焦时 Home/End 到首尾。
  • 卡片:点或 Enter 进详情;详情里 Esc 或“‹”返回,焦点回到原卡片。
  • 作答:按下立刻变成回执卡“你选了「…」· 时间 / 已保存 · 等 Agent 下一轮整理,状态还没变”,焦点落在“撤回”;推进一帧后回执变为“已收到 · Agent 在 12:00 的整理中读到”;撤回后卡片回到原位,焦点回到推荐按钮。
  • 回复:输入框里 Enter 发送、Shift+Enter 换行;未发出的草稿在重绘后保留。
  • 稍后:卡片收起并飞向头部的“◷ N 件 · 01:00”,到点后回到原位;点它可提前取回。
  • 折叠行:展开时如果在屏幕底部,只把列表的开头和前几行滚进视野,在手机框内滚动,不滚动宿主页。
  • 记录:头部“记录”打开我的回应记录,可逐条撤回。
  • 触控:主按钮至少 44px 高;行内小控件(记录、稍后、屏幕用途、文字链接)用透明扩展区把点按范围扩到约 44px,不改变行高。真机宽度下整页滚动,详情页全屏。
  • 键盘:Tab 顺序依次经过宿主的跳转链接、轨道、头部工具,第 12 次到达第一张卡;全部操作都能用键盘完成。

动画清单。(时长 200–400ms,ease-out;减少动态时全部直出。2026-10-20 起动画与手势按 home-motion.md 重做,以那里为准,下面是重做前的记录)

  • 重绘用带 key 的局部更新与 FLIP:先量旧位置、取消在途动画,再让移动的卡平移归位;位置与内容都没变的元素不动。
  • 同一张卡高度变化(作答、撤回、改写):旧内容做成幽灵层先淡出,盒子随新高度变形,新内容在后半段出现,不闪。
  • 进入:新卡从上往下揭开(clip-path);从折叠行展开的行从该行下方依次展开、错峰出现。新登记的问题在第一次出现时描一圈朱红,只闪一次,之后重绘不再重复。
  • 退出:被回答的卡收成回执卡;退进折叠行的卡向折叠行收拢;稍后的卡缩小飞向头部的稍后计数;其余向上收起。
  • 头部:作答后“N 件等你回应”的数字上下滚动;换整理时刻时说明行淡入,其余时刻不动。
  • 详情页从右滑入、向右滑出;底部选项层上滑、下滑,背景淡入淡出;关闭后焦点回到打开它的位置。

截图。

  • d-1-frames.png:f00(空状态)、f01、f12、f22、f26,以及 story 数据的默认帧与 f4。
  • d-2-transition-25to26.png:f25 → f26 切帧,每 80ms 一张,共 6 张。
  • d-3-answer-states.png:作答前、作答中(80ms、240ms)、已保存、推进一帧后已收到、撤回中、撤回后。
  • d-4-detail-folds.png:键盘 Enter 进详情、详情下半、展开其余问题的过程、类型芯片打开的作答层、展开长尾。
  • d-5-snooze-reply-reduced.png:稍后选项层、飞向稍后计数的过程、到点后回到原位、回复框输入与发出、减少动态下切帧和作答 30ms 时的画面。
  • d-6-mobile.png:390×844 真机宽度的首屏、滚动、展开长尾、展开其余问题、详情。

键盘路径(frame 26)的实测结果:12 次 Tab 到第一张卡;Enter 打开详情,焦点在“‹”;Esc 关闭,详情隐藏并清空,焦点回到卡片;Tab 到“打给兽医”,Enter 作答,焦点到“撤回”;→ 推进一帧,回执变为已收到;Enter 撤回,“9 件等你回应”恢复,焦点回到“打给兽医”;焦点在卡片上时空格开始播放,再按暂停。

按新数据在 frame 26 重测(2026-10-15 晚):12 次 Tab 到第一张卡(车道下的主水管);Enter 打开详情,焦点在“‹”;Esc 关闭,详情隐藏并清空,焦点回到卡片;Tab 到“整根挖开换”,Enter 作答,焦点到“撤回”,“5 件等你回应”变为 4 件;Enter 撤回,5 件恢复,焦点回到“整根挖开换”;焦点在卡片上时空格开始播放,再按暂停。“推进一帧后回执变为已收到”这一步新数据里不在 f26 出现:主水管在 f27 被改写并重新登记,回执属于旧版本,卡片回到“问题已更新”,下方写“你 00:00 答过”;“已收到”改在 f24 的 VAB 卡上核过(作答后推进到 f25,显示“已收到 · Agent 在 12:00 的整理中读到”)。原记录保留作为设计理由。

未解决问题。

  • 高度变化时用旧内容的幽灵层交叉淡化,0.25 倍速下可以看到约 80ms 新旧两层文字重叠;正常速度下不明显,但不是严格的单层变形。
  • 详情页和选项层的离场靠动画结束回调,另有超时兜底;后台标签页里动画时钟会暂停,这时由兜底在约 340ms 后收尾。
  • 宿主页的 Tab 顺序要先经过轨道和头部工具,第一张卡要按 12 次 Tab;可以在头部加一个“跳到第一件”的入口,但宿主页不在这次的改动范围内。
  • 左滑已阅只用指针事件模拟过,没有在真机触屏上试手感。
  • 稍后与回应只存在本页内存,刷新即清空;切回作答之前的整理时刻,回执会暂时消失,再切回来又出现,演示时需要说明。
  • 390 宽下“上次看是 …”说明行要折两到三行,信息全但不够一眼;还没想好哪几项可以收进底部的“累计”栏。

01 腕上一瞥 ​

场景。 抬腕两秒,只回答一个问题:要不要现在掏手机。要掏,就看到最急那件的短问法;能在表上答的,点一下就答完。

承载的回应类型。 只有 confirm,以及恰好两个决定或行动按钮的 choose(附带的“回一句”不上表)。approve(要看改动)、reply(要写一句)、schedule(要选时间)、defer、多于两项的 choose 一律显示“这件在手机上答 · 原因”,给“在手机上打开”和“1 小时后再提醒”。

信息结构。

  • 只数要紧的问题:24 小时内到期(含已过期)或档位 critical / high。其余问题不上表盘,只在卡片堆底部记一个“另有 N 个可以晚点”。
  • 表盘:中间大数是还没回应的要紧问题数,下面是“件要紧”,再下面是最急那件的到期情况(“已过 1 分钟”或“10:00 前 · 还有 34 小时”)和短问法;没有要紧的事时数字变灰,写“没有要紧的事 · N 个问题可以晚点”。表圈 64 格一格一份,按排名顺时针:亮朱红是要紧的问题,暗朱红是可以晚点的问题,白色是已回应的要紧问题,灰白是其他事项,深灰是未分配。
  • 表盘上方一句结论:“要。2 件要紧,最急的是‘Smilla 多吃了药:打诊所?’。”或“不用。N 个问题都可以晚点在手机上看。”
  • 卡片堆:只叠要紧的问题,最急的在最前,右上角“1/2”,后面露出两层边;卡片底部写“表上可答 →”或“到手机上答 · 要选时间”。
  • 回应屏:到期行、短问法、两个大按钮(推荐项实心)和“1 小时后再提醒”。
  • 触感:本轮新登记了要紧问题时,表圈外沿闪 N 下,图注写“触感:轻敲 N 下”。

交互清单。

  • ←/→ 换整理时刻,空格播放/暂停(播放时提示行写“▶ 播放中,每 5.6 秒一轮整理 · 空格暂停”)。
  • ↑/↓、滚轮、点表冠或“下一张 ↓”翻卡片堆,回应屏跟着换成当前这张;只有一件要紧时表冠不可用。
  • 点表盘把焦点移到卡片堆。
  • 作答:按下即回执“你选了「打给诊所」/ 已保存 · 等 Agent 下一轮整理”,焦点落在“撤回”;表盘数字减一,对应表圈刻度变白;推进一帧后回执变为“已收到 · Agent 在 12:00 的整理中读到”;撤回后按钮回来,焦点回到推荐按钮,数字加回。
  • 稍后:1 小时内不再计入,到点自动回来。
  • 键盘:页面没有焦点时按 Enter 直接跳到回应屏的第一个按钮(只移动焦点),再按 Enter 作答;也可以从表盘 Tab 4 次到达(只有一件要紧、表冠不可用时是 2 次,如新数据的 f26;f22 有两件要紧,仍是 4 次)。

动画清单。(减少动态时全部直出)

  • 表圈刻度用持久的 SVG 节点,颜色与粗细做 350ms 过渡,换帧时只有变了的格子变色。
  • 表盘数字变化时上下滚动 280ms,方向随增减。
  • 新的要紧问题登记时表圈外沿脉冲 N 次。
  • 翻卡片堆:旧卡向上淡出缩小,新卡从露边处升起,300ms;换帧换了最前一张时淡入;同一张卡状态变化时只有底部状态和勾淡入。
  • 作答:回执屏缩放淡入,勾的圆圈与对勾依次描出;已收到时圆圈填成实心。

截图。

  • w-1-frames.png:f14(无要紧的事)、f21、f22、f26、f28,以及 story 数据默认帧。
  • w-2-transition-21to22.png:f21 → f22,表盘从 0 到 2,表圈变色和脉冲,每 80ms 一张,共 6 张。
  • w-3-answer-states.png:作答前、作答中(80ms、240ms)、已保存、推进一帧后已收到、撤回后,以及按 ↓ 翻到第二张(80ms、240ms、完成)。
  • w-4-mobile.png:390 宽、关闭概念卡时依次滚到表盘、卡片堆、回应屏。

这几张截图是旧数据。新数据里对应的情形变了:f14 有 1 件要紧(母亲九月住哪),除空状态 f00 外只有 f23–f25 没有要紧的事;f21 → f22 表盘从 3 到 2(轻敲 2 下),从 0 起跳的是 f25 → f26(0 到 1,轻敲 1 下)。原记录保留作为设计理由。

键盘路径(frame 26)的实测结果:表盘获焦后 Tab 4 次到“打给兽医”;Enter 作答,回执为已保存,焦点在“撤回”,表盘数字 2 → 1;→ 推进一帧,回执变为已收到;Enter 撤回,数字回到 2,焦点回到“打给兽医”;卡片堆获焦后 ↓ 翻到“后刹排气定哪天?”,回应屏显示“这件在手机上答 · 要选时间”;空格开始播放。另测:f22 页面无焦点时 Enter 跳到“打给兽医”,再按 Enter 作答成功。

按新数据重测(2026-10-15 晚):frame 26 只有 1 件要紧(主水管),表冠不可用,表盘获焦后 Tab 2 次到“整根挖开换”;Enter 作答,回执为已保存,焦点在“撤回”,表盘数字 1 → 0;Enter 撤回,数字回到 1,焦点回到“整根挖开换”;空格开始播放。作答后 → 推进一帧不会变成已收到:主水管在 f27 被改写并重新登记,回执属于旧版本,按钮回来、数字回到 1。“已收到”与翻卡改在别的帧核过:f20 卡片堆 ↓ 翻到第二张“Smilla 多吃了药:打诊所?”作答,推进到 f21 显示“已收到 · Agent 在 12:00 的整理中读到”;f22 卡片堆 ↓ 翻到“母亲九月住哪?”,回应屏显示“这件在手机上答 · 选项不止两个”;f22 页面无焦点时 Enter 跳到“打给诊所”,再按 Enter 作答成功,数字 2 → 1。原记录里“↓ 翻到后刹排气”的那一步新数据里不在 f26 出现,保留作为设计理由。

未解决问题。

  • 形式页外壳在手机宽度下,概念卡会盖住舞台,要用 ?card=0 才能看;外壳的帧刻度是 29 个没有文字标签的按钮,Tab 要先走完它们。两处都在共享的 shell.mjs / forms.css 里,这次没有改,只在腕上加了“无焦点时 Enter 跳到按钮”的捷径。
  • 触感只用表圈闪光和文字模拟。
  • 答过的要紧问题这一轮仍留在卡片堆最前(显示勾),没有自动让到后面;要不要让位,取决于“已保存但还没被收到”算不算处理完,暂按“没处理完”保留。
  • 滚轮翻页按 280ms 节流,触控板惯性滚动可能一次翻过两张。
  • 是否“要紧”只看到期和档位,不看用户此刻的处境(会议中、开车),也不区分“已过期很久”和“马上到期”的紧迫度差别。

Safari 检查(2026-10-15) ​

  • 腕上一瞥:表圈 SVG 原来用 height: calc(100% - 8px),Safari 没有按 viewBox 保持比例,表圈随 268×328 的屏幕被拉成椭圆;改为 width: 100% 加 aspect-ratio: 1 并垂直居中,两边一致(提交 cc1fdbc)。
  • 合页 all.html 做完后,在 Safari 27 里实际打开看过,并用离屏 WebKit(WKWebView,与 Safari 同一引擎)按 1440×900 逐节截图,和 Chrome 无头截图并排对比;顶栏切到 f05 后再截一遍。D 手机首页与腕上一瞥在默认帧(f26)和 f05 都与 Chrome 一致,没有别的差异要修。