切换外观
腕上一瞥 · 换轮的节拍:参考、数据、故事
状态:2026-10-19,按第三轮的六步(reference → data → story → motion → direct → ship)重做 01 腕上一瞥。本文是前三步,在任何东西动起来之前定下;动画与交互照此做。页面只读同一份 scenario.mjs 回放,不新增数据字段,下面的数都由页面用同一推导现算。表盘、卡片堆与回应屏怎样工作、承载哪类回应,仍记在 home.md;这次改动的交互与动画以本文为准。
参考
腕上一瞥本来就和份额拨盘用同一套视觉词汇:一圈 64 格的刻度,加一个数。这次从两个概念动画里各借了几样节奏:
| 借什么 | 出处 | 在手表上变成什么 |
|---|---|---|
| 刻度就是尺:64 格的位置、0 点永远不动,每轮只换一次“这一格归谁” | 拨盘:环心的 64、硬止刻、64 刻度不动;扇区每轮只动一次 | 换轮时 64 格从 0 点顺时针逐格换主人,0.5 秒扫完,之后一格不动 |
| 切点一帧硬切,第一个信息动作紧跟在后面 | 拨盘:一帧硬切,0.4 秒的第一个动作 | 表盘顶部的时间在切点直接换;第一个动作压到 0.15 秒,因为两秒内要说完 |
| 一轮分拍:涌入 → 折叠 → 一问;“一问”时整屏先压暗,朱红成为唯一的亮点 | 脉冲:三个节拍,第 3 拍先压暗 0.3 秒 | 第一拍“重分”(输入落下、刻度换主人),第二拍“一闪”(其余刻度压暗,新变得要你回的那几件亮一下),第三拍“落定”(数字停住) |
| 空轮不下雨;概念层最亮处低于信息层;概念层不暗示信息层没有的事实 | 脉冲、拨盘的两层法则 | 本轮 0 条输入就不落灰点;没有要你回的事就什么也不闪 |
| 数字只在节拍上动 | 两个动画的信息层 | 中间的数等到第三拍才滚到新值 |
为什么只借这些:抬腕一瞥大约两秒,屏幕 268×328 像素,读的是一个数。动画要是一直在动,就会抢走这两秒,所以只在换轮时动一次,1.5 秒内停下,停下的画面就是读数。官网动画里的车道、字形碎片、灰仪表、粒子云与余辉都太密,手表上不要。手表也没有面板,展开时切到“这一件”的是表盘上方那句结论。
数据
全部取 composite 默认数据(Jonas Berglund 的两周,29 帧)。口径沿用页面原来的规则:要紧指问题的期限(ask.due_at,没有时取条目的 item.due_at)在 24 小时内(含已过期),或条目的 weight 为 critical / high;与拨盘游标用的是同一条规则(motion/dial-model.mjs 的 urgentAsks)。
| 数 | 值 | 从哪里来 |
|---|---|---|
| 表圈格数 | 64,一格一份 | 每层预算 64 份(BUDGET);格子归谁按 records[i].state.root.items 的顺序与 share |
| 英雄数字:等你回的件数 | composite 只取 0–3:0 是 f00、f23–f25(4 帧),1 是 f01、f05–f07、f09–f17、f26–f28(16 帧),2 是 f02–f04、f08、f22(5 帧),3 是 f18–f21(4 帧);story 是 0–6 | 此刻开着的问题(frame.asks 经 currentAsk,属于条目的当前版本)里要紧、本页还没答的件数 |
| 新变得要紧(触感与亮闪) | composite 从 f00 逐轮往后,28 次换轮里有 6 次、共 7 件:f01(ask-05 “Smilla 约上兽医了吗?”)、f02(ask-01 “master CI 红了谁来查?”)、f03(ask-08 “母亲九月住哪?”)、f08(ask-07 “NDEBUG:报错/undef?”)、f18 两件(ask-16 “Smilla 多吃了药:打诊所?”、ask-02 “派对回几个人?”)、f26(ask-23 “主水管:挖开换还是免挖?”) | 本帧要紧问题的 ask.id 不在换轮前那一帧的要紧问题里(跳帧时比的是跳之前看到的那一帧)。旧版按 ask.frameIndex === 本帧 数,重登记也算,28 次换轮里有 20 次轻敲,多半是“母亲九月住哪?”这类老问题随条目改写重登记;这次改掉 |
| 灰点(概念层) | composite 每轮 54–234 条(f00 为 0),两条一粒,最多 120 粒;story 每轮 0–9 条,cold-00、f17、f27 为 0,不落灰点 | 本轮输入数 frame.events.length |
样张取 f25 → f26(“周六早上:水表在转” → “车道下的铜管裂了”),与拨盘第 3 拍是同一轮:
| 数 | f25 | f26 | 字段 |
|---|---|---|---|
| 本轮输入 | 54 | 158 | frames[i].events.length |
主水管(driveway-wet,短名取 categories.short) | 12 份 | 24 份 | records[i].state.root.items[].share |
猫看病(smilla-vet) | 12 份 | 6 份 | 同上 |
| 留白 | 12 份 | 1 份 | 64 − state.root.used(52 → 63) |
| 要紧的问题 | 0 | 1:ask-23 “主水管:挖开换还是免挖?”,期限 8/17 10:00,expects: choose,两项(整根挖开换 / 免挖穿新管),表上可答 | frames[26].asks['driveway-wet'] |
| 英雄数字 | 0 | 1 | 同上,本页没答 |
另一个方向的例子是 f22 → f23(“热浪第一天:药量超过失明线” → “打了诊所;母亲自己定了”):115 条进来,母亲换水管 24 → 6、猫看病 24 → 12,留白 0 → 25;两个要紧问题都在来源处答掉了,数字 2 → 0,结论句变成“不用”。
故事
一个点。 64 格每轮都在挪,但抬腕只需要读一个数:现在有几件要你开口。表圈告诉你份额去了哪里,中间的数告诉你要不要掏手机。
英雄数字:等你回的件数。 composite 两周里只在 0–3 之间:表圈一直是满的 64 格,这个数却很小,这种不对称就是论点。它是表盘上唯一的大字,0 就是“不用掏手机”。拨盘的英雄数字是 64,说的是尺;脉冲的是本轮收到的条数,说的是量。手表要回答的是“要不要”,所以选这个数。
三拍(每次换轮,一共 1.5 秒;←/→、选帧、连播、合页顶栏选帧都走这三拍;prefers-reduced-motion 时直接到终态)
| 拍 | 时刻 | 动什么 | 观众此刻 |
|---|---|---|---|
| 切点 | 0 | 表盘顶部的时间一帧切到新一轮 | 换轮了 |
| 1 重分 | 0–0.65 秒 | 本轮的输入化成灰点,从屏幕边缘落向表圈(0–0.5 秒,概念层);64 格从 0 点顺时针逐格换主人(0.15–0.65 秒),一道灰光跟着扫过;表盘下的事项名在扫完时换成新的 | 份额挪了 |
| 2 一闪 | 0.7–1.1 秒 | 这一轮新变得要紧的那几件,其余刻度先压暗、它们的刻度亮闪一下,表圈外沿轻敲 N 下(N 是新变得要紧的件数);没有新的、但仍有等你回的,最急的那一件只轻轻亮一下;没有要紧的事就什么也不闪 | 是这一件 |
| 3 落定 | 1.1–1.5 秒 | 中间的数从旧值滚到新值并停住,短问法与上方的结论句淡入;卡片堆与回应屏换到这一轮 | 要,或者不用 |
f25 → f26 演出来是:时间切到 00:00;79 粒灰点落向表圈;主水管从 12 格长到 24 格,留白从 12 格缩到 1 格,猫看病让出 6 格;其余刻度压暗,主水管的 24 格亮闪,外沿轻敲 1 下;数字 0 → 1,下面出现“10:00 前 · 还有 34 小时 / 主水管:挖开换还是免挖?”,结论句变成“要。1 件要紧,最急的是‘主水管:挖开换还是免挖?’”。f17 → f18 是另一种一闪:最急的仍是 f03 起就在等的“母亲九月住哪?”,新变得要紧的是猫看病与小龙虾派对,于是亮闪的是这两段、轻敲 2 下,数字 1 → 3。
两层。
- 概念层约两成:落向表圈的灰点与扫过表圈的一道灰光。只用灰,只在第一拍出现,静止时为零;疏密按本轮输入数,不出文字与数字,也不用朱红;本轮 0 条输入就不落灰点。
- 信息层约八成:64 格、中间的数、短问法、时间、表盘下的事项名与上方的结论句。每格归谁、数是多少都按上面的口径现算;朱红只给登记了回应路径的事项:亮朱红是要紧的问题,暗朱红是可以晚点的问题,白色是你在本页答过的要紧问题。
动起来之前的约束。
- 绝不动:64 格的位置、0 点、表盘中心与数字的位置。
- 每轮只动一次:每格的归属、中间的数、触感。翻卡片堆、作答与撤回不是换轮,数字照旧当场加减。
- 朱红的含义不变;概念层不碰朱红。
- 连按 ←/→ 时,上一段过渡直接跳到终态,再从那里开始下一段。
交互(共用 motion/ix.mjs,与份额拨盘、整理脉冲同一套标准,落在手表的几何上):
- 悬停:刻度段(按角度命中,带宽从刻度内沿一直到表圈外沿之外 14 像素)、表盘下的事项名、表盘中间的短问法都算。悬停时出概要卡,写来自哪条流、几份、本轮怎么变、本轮进了几条输入、开着的问题与期限;其余刻度与事项名降到七成。卡挂在表壳之外有地方的一侧(这一页是右侧,盖在卡片堆上),与那一段刻度射出表壳的位置同高;引线从刻度沿它自己的半径出到表壳外,右半圈直接接到卡,左半圈与正上下方的绕过表壳的顶或底再接过去,从不横穿表盘。换轮过渡与连播都停在当前时刻,离开 0.15 秒后卡淡出,再过 0.4 秒接着走。停在过渡中途时,卡上不提前说出后面节拍的事:份额落定前写上一轮的份数与“还没落定”,灰点落完前写“输入还在路上”,一闪之前不列本轮才出现的问题。
- 展开:点击上面这些地方,或 Tab 到事项后按 Enter。0 秒是切点,结论句切到“这一件 · 第 N 轮 · 主水管 24 / 64 份 · 变大 12 → 24”;0–0.3 秒那一段刻度沿各自的半径外推 8 像素(画在屏幕之上,不被屏幕裁掉);0.4–0.6 秒沿上面那条路画出引线;0.6–0.9 秒详情卡从引线末端展开,贴在表壳旁,展开到表盘外的页面区域,盖住旁边两块屏,不压表盘,也不压结论句。详情不承载作答,只列这一帧仍开着的问题,问题旁的“去回答 →”链到当前查看那一帧的 D 手机首页(
../index.html?variant=d&frame=<帧序号>,带上数据集);能在表上答的照旧在回应屏上答。 - 收回:Esc、点空白、再点同一件;换帧、连播与合页顶栏选帧会立即收起。键盘:隐藏按钮放在表盘这一栏的最前面,从页头的“状态”按 Tab 先到表圈上的事项(表圈外沿画一道白弧标出是哪一段),再到卡片堆与回应屏。触屏:第一下是悬停,第二下展开。合页
all.html的嵌入里同样可用,卡留在嵌入框内。 - 自动讲一遍:只在顶层直接打开、地址不带
?frame=、也不是从别处链来(没有 referrer)时演一次,约 6 秒:停在样张轮的前一轮,0.9 秒后换到样张轮走完三拍,再悬停最急的那一件 2.3 秒看概要卡。样张轮取份额拨盘的第三拍(composite f25 → f26,story f14 → f15)。任意键或点按跳过,按下的键只用来跳过;跳过时直接停在样张轮。页底的“重演”在顶层打开时都有,再演一遍。画廊、合页、体验站弹框(都在 iframe 里,或带着 referrer)不演;prefers-reduced-motion时也不演。 - 脚本:
window.foldWatch有与foldDial、foldPulse同名同义的hover / unhover / open / close / ixAt / paused / pointOf / ixState,另有index、go(i)、beatAt(秒)(把换轮过渡定在某一刻,供静帧;null放开)、beat()、play()、stop()、ring()(每件的份数与所占刻度)、geom()(表盘中心与半径,页面坐标)。scripts/check-ix.mjs的 16 项在本页同样跑。
取舍。
- 表盘下加了一行事项名(份额前四件、其余合计与留白)。原来事项名只在概念卡侧栏里,合页嵌入时看不到;悬停需要一个比刻度大的目标,“份额去了哪里”也需要名字。卡片堆不做悬停目标:概要卡会挂在它上面,挡住正在看的东西。
- 表盘不再是按钮:原来“点表盘把焦点移到卡片堆”的捷径让给了点击展开;页面没有焦点时按 Enter 跳到回应屏第一个按钮的捷径保留。
- 连播改由本页自己计时(仍是每 5.6 秒一轮,从切点算),这样悬停停住之后能从停下的那一刻接着走,而不是重新数 5.6 秒。
- 卡只挂在右侧:表盘在三块屏的最左边,左侧只剩约 50 像素。为此左半圈的引线要绕过表壳,比右半圈长;换成把表盘放在中间会打乱“抬腕 → 转表冠 → 点开”的读序,没有这样做。
- 触感只数这一轮新变得要紧的问题,不再按
ask.frameIndex数重登记;一闪也跟着它走,所以 f08、f18 这样“最急的没变、新来了别的”的轮次,亮的是新来的那几段。 - 要紧的口径没有改;短问法、卡片堆、回应屏和作答也都没有改。