蕉不焦交互工程规格
参数级交互规格真源:design token、动效曲线、手势阈值、组件尺寸与 a11y。呼吸感与三页呈现见 07,用户路径见 06,前端实现见 09。
10 · 交互工程规格(原 mobile-design)
版本:v3.0 · 文档库编号 10
真源职责:参数级交互规格(token、动效曲线、手势阈值、组件尺寸、a11y)。
设计叙事与帧(呼吸感、三页呈现、声线)请以 07-product-presentation.md 为准。
用户路径:06-user-stories-journeys.md
前端实现:09-frontend-architecture.md
技术载体:微信小程序(Taro)
产品主链:闪念 → 沉淀 → 调度排程 → 只一步 → 纠偏 → 释负
本章不负责「产品长什么样」的故事——那是 07。本章负责工程师抄得动的数字。
1. 设计哲学(摘要 · 详见 07)
移动端不是「手机版 Todo App」,也不是「日历排程台」。它是:
随时随地的闪念捕获器 + 调度后只递一步的提醒器 + 可感知的减负智能体。
成败标准:丢进来的成本 < 记在脑子里的成本。
「不焦虑」= 界面与通知不制造压力(非医疗)。
1.0 入口硬约束(闪念:轻量 · 优雅 · 呼吸感)
| 约束 | 标准 | 禁止 |
|---|---|---|
| 轻量 | 零字段;主路径一次动作(文字提交 / 语音松手) | 项目、日期、优先级、象限必填 |
| 优雅 | ≤2s「已接住」;不跳转脏编辑页;文案短、服务语气 | 捕获后任务墙、审批流 |
| 呼吸感 | 大留白、胶囊呼吸、微光判断、果冻回弹(本章规格) | 密列表、红点债务、羞辱文案 |
| 排程可见性 | 仅文案表达「下午再回来 / 今天不再递」 | 无四象限页、无完整日历 time-block 台 |
| WIP | 聚焦页同时只强调一步 | 同时多条主动推送抢注意力 |
1.1 三大设计基调
| 基调 | 内涵 | 视觉语言 | 触感语言 |
|---|---|---|---|
| 呼吸感 | 界面不压迫,留白暗示「随时可丢闪念」,元素轻呼吸暗示「随时可点」 | 大留白、胶囊呼吸 scale(0.96→1.02) 3s、背景微光径向渐变 8s | 按下弹性回弹 |
| 智能感 | 沉淀与排程在背后运转,可见不打扰 | 微光流动 ≤3s、状态文案、「记下了」波纹 | 思考轻触觉,确认短震 |
| 果冻感 | 主按钮物理可信反馈 | 按下 0.92 + 弹性回弹 + 波纹 | 按下轻震,释放回弹 |
1.2 设计原则
| 原则 | 说明 | 落地 |
|---|---|---|
| 0 秒启动 | 打开即闪念入口 | 无开屏广告;首页=捕获中心 |
| 一次动作 | 捕获只做一次主操作 | 文字/语音/分享 |
| 即时反馈 | ≤2s | Toast/微光,不跳转 |
| 智能可见 | 判断过程可见 | 微光 + 文案 |
| 排程不扰 | 只在合适时机递一步 | 不连环催;支持今天别推 |
| 可见性优先 | 主路径有可见控件 | 常驻捕获条 + 底栏;手势仅增强 |
| 可逆可改 | 纠偏成本趋近零 | 按钮/滑动/一句话 |
| 有吸引力 | 愿回来 | 呼吸感 + 果冻 + 暖色 |
| 低羞耻 | 没完成不是失败 | 无「未完成」主视觉 |
1.3 用户心智
把事情丢进来,蕉不焦帮你管 Todo,只回来一步。
| 时刻 | 用户状态 | 移动端职责 |
|---|---|---|
| 闪念涌现 | 杂念、微信催办、截图灵感 | 最低成本丢进,2s 已接住 |
| 排程递回 | 系统判断时机合适 | 只看这一步,完成或纠偏 |
| 晚间收束 | 需要知道事情有着落 | 状态交还,明天只确认一步 |
1.4 与理论映射
| 设计 | 理论 | 规则 |
|---|---|---|
| 呼吸感留白 | 选择过载 | 只回来一步,无任务墙 |
| 零字段 | 认知负荷 | 不填日期/优先级/象限 |
| 微光智能感 | 信任 | 可解释、可撤销 |
| 「记下了」 | 直接操作 | 纠偏写回可感知 |
| 果冻反馈 | 直接操作 | 即时可逆 |
| 低羞耻 | 拖延情绪调节 | 可冷冻/稍后,复盘不羞辱 |
| 无四象限 UI | Eisenhower 仅内部 | 前台禁止矩阵作业 |
| 调度文案 | 递交时机 | 降错误打断,非日历套件 |
2. 智能感设计
闪念丢进来后,若只有一句「已接住」,用户难以感知沉淀与排程是否发生。智能感目标:判断过程可见但不打扰,学习可感知,从而建立长期信任。
2.1 智能体可见性原则
| 原则 | 说明 | 反模式 |
|---|---|---|
| 过程可见 | AI 判断过程以微光流动呈现,3 秒内完成 | 黑箱处理,用户不知道系统在干什么 |
| 结果可解释 | 每个状态判断都附带一句理由 | 只显示状态,不说为什么 |
| 学习可感知 | 纠偏后系统反馈”记下了”,让用户知道偏好已写入 | 静默写入,用户不知道系统是否记住 |
| 不确定可坦诚 | AI 不确定时明确说”我不太确定,你扫一眼” | 装作确定,事后才发现错了 |
| 不打扰当前 | 智能体反馈不跳转页面、不弹窗、不强制交互 | 判断完成后跳转详情页要求确认 |
2.2 AI 判断过程的视觉表达
碎片丢进来后,智能体在后台进行判断(归并/冷冻/拆小/等待/下一步/归档)。这个过程需要被用户感知,但不能打断用户。
微光流动动画:
用户丢进碎片 → 胶囊按钮边缘亮起一道微光(状态色,初始为中性白) → 微光沿胶囊边缘缓慢流动(3 秒内,cubic-bezier(0.4, 0, 0.2, 1)) → 流动过程中,微光颜色逐渐变化,暗示正在判断 → 判断完成:微光聚拢为一道状态色闪光(绿=已接住/蓝=已归并/橙=重要/灰=冷冻) → 闪光扩散为波纹,2 秒后淡出微光颜色语义:
| 阶段 | 微光颜色 | 含义 | 时长 |
|---|---|---|---|
| 初始 | #E0E0E0(中性白) | 正在接收碎片 | 0-300ms |
| 判断中 | #B0BEC5 → #90A4AE(渐变灰蓝) | 智能体正在分析 | 300ms-2.5s |
| 完成 | 状态色(绿/蓝/橙/灰) | 判断结果 | 2.5s-3s |
| 淡出 | 状态色透明度递减 | 反馈结束 | 3s-5s |
关键约束:
- 微光流动总时长不超过 3 秒,超时直接显示”已接住,稍后整理”
- 微光不闪烁、不跳动,只缓慢流动,避免吸引过多注意力
- 用户在微光流动期间可以继续操作,不阻塞
2.3 实时状态文案
在 AI 判断过程中,胶囊按钮上方或 Toast 位置显示实时状态文案,让用户知道智能体在做什么。
| 阶段 | 文案 | 显示时机 |
|---|---|---|
| 接收 | ”接住了,正在帮你放好…” | 碎片丢进后立即 |
| 判断 | ”蕉不焦在帮你看看这件…“ | 300ms 后 |
| 归并 | ”已放进客户方案线程,不新增 Todo” | 判断完成 |
| 下一步 | ”现在只做:打开文档写三个小标题” | 递回时 |
| 冷冻 | ”像灵感,先冷冻到周末复盘” | 判断完成 |
| 等待 | ”这件先等对方回复,不压你” | 判断完成 |
| 稍后 | ”今天先不出现,明早再回来” | 判断完成 |
| 待定 | ”我不太确定是不是硬截止,你扫一眼” | 置信度低 |
| 归档 | ”重复链接,已归档” | 判断完成 |
文案风格规则:
- 主语用”蕉不焦”或省略,不用”我”(避免拟人过度)
- 动作用”帮你”+“动词”,强调服务而非命令
- 不确定时坦诚说”我不太确定”,不装作全知
- 不用”正在处理""请稍候”等机械话术
2.4 “记下了”确认动效
用户轻纠偏后(拆小/稍后/今天别推/这很重要/语气保守等),系统需要让用户感知到偏好已被写入,系统会记住这次纠偏。这是建立”系统在变懂我”信任的关键。
确认动效流程:
用户触发纠偏(如点击"拆小") → 纠偏按钮果冻回弹(0.92 → 1.0,cubic-bezier(0.34, 1.56, 0.64, 1)) → 按钮位置绽放一道波纹(状态色,向外扩散 80px,800ms) → 波纹中心浮现"记下了"文案(16px Medium,状态色) → 文案下方副文案:"下次先拆小"(14px Regular,次要文字色) → 文案 + 波纹 1.5 秒后淡出 → 同时轻触觉反馈(短震动 20ms)“记下了”文案模板:
| 纠偏类型 | 主文案 | 副文案(偏好说明) |
|---|---|---|
| 拆小 | 记下了 | 下次先拆小 |
| 稍后 | 记下了 | 下午再回来 |
| 今天别推 | 收到 | 今天不再递 |
| 这很重要 | 已标重要 | 不冷冻 |
| 语气保守 | 记下了 | 客户回复更保守 |
| 这不是截止 | 记下了 | 截图优先当资料 |
| 这不是任务 | 归档了 | 下次类似不进 Todo |
关键约束:
- “记下了”动效不超过 1.5 秒,不阻塞用户继续操作
- 副文案让用户知道偏好写入的具体内容,增强可信度
- 同一纠偏不重复出现”记下了”,避免烦扰
2.5 智能体人格化反馈
蕉不焦的智能体不是聊天机器人,而是状态反馈者。它的人格化体现在反馈的温度,而非对话的长度。
人格化反馈原则:
| 原则 | 说明 | 示例 |
|---|---|---|
| 短而不冷 | 反馈简短但有温度 | ”接住了,先替你放好” 而非 “已保存” |
| 服务而非命令 | 用”帮你”而非”你应该" | "蕉不焦在帮你看看” 而非 “请等待处理” |
| 坦诚而非全知 | 不确定时直说 | ”我不太确定,你扫一眼” 而非 “已处理完成” |
| 不评判 | 不评价用户行为 | ”今天已经很好了” 而非 “你还有 10 件没做” |
| 不拟人过度 | 不假装有情感 | 不说”我今天很开心帮你整理” |
人格化反馈边界(对齐 06-brand-naming-character.md):
- 数字人只做状态反馈,不做情绪陪伴
- 不出现虚拟形象,只用文案 + 微光表达
- 不模仿人类语气词(不用”哎呀""嗯嗯""哈哈”)
- 不主动发起对话,只在用户操作后反馈
2.6 学习感知设计
用户需要感知到系统在”变懂自己”。学习感知通过以下方式呈现:
| 感知方式 | 触发时机 | 呈现形式 |
|---|---|---|
| ”记下了”动效 | 用户纠偏后 | 波纹扩散 + 副文案说明偏好 |
| 递回动作变小 | 同类任务下次出现时 | 下一步动作粒度更小(如”打开模板”而非”填写内容”) |
| 不再打扰 | 用户点”今天别推”后 | 当天同类任务不再递回 |
| 语气更合适 | 纠偏语气后 | 下次回复草案语气更保守/更软 |
| 复盘展示学习成果 | 晚间复盘 | ”今天记下了 3 条偏好:写作类上午不推、客户回复更保守…” |
学习感知的克制:
- 不每次纠偏都强调”我学会了”,只在复盘时汇总
- 不夸大学习能力,不暗示”AI 越来越聪明”
- 学习成果以”偏好”而非”记忆”表述,避免拟人过度
2.7 思考动画规格
当智能体需要进行较长时间的判断(如语音倾倒后拆分多个任务、复杂归并判断),展示思考动画让用户知道系统在工作。
思考动画形态:
[微光呼吸点] · · · ○ ○ ○ ← 三个小圆点依次亮起又暗下,循环- 三个小圆点(直径 6px),间距 8px
- 依次亮起:透明度 0.3 → 1.0 → 0.3,循环
- 颜色:主色
#4CAF50 - 循环时长:1.2s(每个点 400ms)
- 缓动:
cubic-bezier(0.4, 0, 0.2, 1)
思考动画使用场景:
| 场景 | 预期时长 | 动画位置 |
|---|---|---|
| 语音转写 + 拆分 | 2-5s | 语音录制结束后的反馈区 |
| 复杂归并判断 | 1-3s | 胶囊按钮上方 |
| 回复草案生成 | 3-8s | 纠偏面板内 |
| 晚间复盘生成 | 2-4s | 复盘页加载区 |
超时处理:
- 思考动画超过 5s,文案变为”还在想,稍等一下…”
- 超过 10s,文案变为”这件有点复杂,先接住了,稍后整理”
- 不让用户等待超过 10s 无反馈
3. 页面结构
移动端核心页面:首页(捕获中心) → 聚焦页(下一步) → 复盘页(晚间收束)。每个页面在原有布局基础上增加智能体状态层,让 AI 的存在贯穿三页。
3.1 首页:捕获中心
目标:让用户在最短时间内完成闪念捕获,成本低于「记在心里」。无四象限、无日历排程台。
布局:
+--------------------------+| [状态条] 今日已接住 12 件 | ← 顶部轻状态条,不抢占注意力| || [智能体状态层] | ← 微光流动 + 实时文案(判断中显示)| || [大留白] | ← 中央大留白,暗示"这里很空,随时可丢"| || || [浮动提示: 随时丢] | ← 首次使用时显示,3秒后淡出| |+--------------------------+| [🎤] [输入框........] [📷] [接住] | ← 常驻捕获条:语音 / 文字 / 图片 全部显式可点| [捕获] [聚焦] [复盘] | ← 底部导航栏:可见切换三页+--------------------------+智能体状态层:
- 位置:状态条下方,胶囊按钮上方
- 默认隐藏,仅在 AI 判断过程中显示
- 内容:微光流动 + 实时状态文案(见第 2 章)
- 判断完成后 2 秒淡出
交互:
| 动作 | 触发 | 反馈 | 说明 |
|---|---|---|---|
| 文字输入 | 在捕获条输入,点「接住」或回车 | 接住碎片 + 安静反馈 | 默认主路径,零隐藏 |
| 语音接住(按住说话) | 点左侧 🎤 切到语音模式,按住「按住 说话」录音,松手发送 | 录音 → 接住碎片 | 微信式语音消息,零学习成本;按住时按钮变高亮+录音层弹出+计时走字,上滑超过阈值进入「取消」态(红色警示、提示「松开取消」),松手放弃、滑回恢复 |
| 更多「+」面板 | 点右侧「+」展开,选 拍照 / 相册 / 模板 / 语音 | 触发对应动作 | 进阶动作,微信式九宫格,点外部收起 |
| 切换页面 | 点击底部导航栏「聚焦 / 复盘」 | 进入对应页 | 可见导航,主路径 |
| 滑动切换(增强) | 从屏幕边缘向内滑 | 进入相邻页 | 可选增强,首次进入有一次性提示 |
可见性优先原则(设计依据):GhostUI(CHI 2026)对 81 个主流 App 的实证显示,23.7% 的交互是”隐藏”的(无任何视觉线索),而”有可见边界的按钮与隐藏交互关联最弱”——即带边框、带标签的可见控件最易被用户发现。原方案把”接住”做成单胶囊 + 轻点/长按/上滑三套隐藏手势、三页切换纯靠边缘滑动,正属于”exclusively hidden functionality”反模式。故重构为:主路径全部可见(常驻捕获条 + 底部导航栏),手势仅作可选增强,进阶动作收进点按「+」展开的微信式面板,避免用户因”不知道有这功能”而流失。
状态条:
- 默认隐藏,下拉显示
- 内容:“今日已接住 X 件,Y 件已归档,Z 件稍后”
- 点击状态条可进入”线程列表”(非核心功能,MVP 不优先)
动画:
- 胶囊按钮:呼吸动画
scale(0.96→1.02) 3s ease-in-out infinite,暗示”随时可点” - 捕获后:智能体状态层微光流动 3s → 状态色波纹扩散 2s → 淡出
- 无操作 10 秒后:状态条淡出,胶囊呼吸节奏放慢(5s 循环)
3.2 聚焦页:下一步
目标:当前只回来一步,其余事项不打扰。
布局:
+--------------------------+| [< 返回] 现在只做 | ← 顶部导航,不显眼| || [智能体状态层] | ← 递回时微光流动 + "蕉不焦递回一步..."| || +----------------+ || | | || | [动作卡片] | | ← 中央大卡片,唯一焦点| | | || | 打开客户方案文档 | || | 写三个小标题 | || | | || +----------------+ || || [完成✓] [拆小] [稍后] [🔥] | ← 四个按钮,滑动操作+--------------------------+动作卡片:
格式严格:“现在只做:[动词] [对象] [边界]”
示例:
- “现在只做:打开客户方案文档,写三个小标题”
- “现在只做:回复客户邮件,确认收到”
- “现在只做:泡杯咖啡,坐下休息5分钟”
按钮交互:
| 按钮 | 颜色 | 滑动方向 | 效果 | 音效 |
|---|---|---|---|---|
| 完成✓ | 绿色 | 向右滑 | 卡片飞出,下个任务滑入 | 清脆”叮” |
| 拆小 | 蓝色 | 向上滑 | 卡片翻转,显示更小任务 | 流水声 |
| 稍后 | 灰色 | 向左滑 | 卡片淡出,设置稍后提醒 | 轻风 |
| 这很重要 | 橙色 | 长按 | 卡片边框发光,标为重要 | ”嗡”一声 |
防误触:
- 滑动距离 > 30% 屏幕宽度才生效
- 滑动过程中显示半透明遮罩,提示当前操作
- 松开手指后,如果未达阈值,卡片弹性回弹
cubic-bezier(0.34, 1.56, 0.64, 1)
背景:
- 其余 Todo 项以缩略图形式平铺在背景,模糊处理
- 用户可点击”展开”查看全部,但默认只显示当前一步
- 无任务时:显示”暂时没有任务,去捕获一些吧~” + 胶囊按钮
3.3 复盘页:晚间收束
目标:Zeigarnik 显式收束,让用户晚上不再反复想。
布局:
+--------------------------+| [时间] 21:00 | ← 时间显示,暗示"该复盘了"| || 🌙 今天已经很好了 | ← 温暖问候,无负面词汇| || [智能体状态层] | ← "今天记下了 3 条偏好..."| || +--------------------+ || | 接住 归并 冷冻 等 | || | 12 5 3 2 | ← 状态流转数字,非"未完成"| +--------------------+ || || "明天只看这一步:" | || +--------------------+ || | 打开客户方案, | || | 写第一段标题 | || +--------------------+ || || [明天上午别推了] [收到] | ← 快捷反馈按钮| |+--------------------------+文案风格:
- 不说”未完成 10 件”,而说”接住 12 件,其中 5 件已归并,3 件冷冻,2 件等待”
- 不说”你还有任务没做”,而说”明天只看这一步”
- 不说”效率低下”,而说”今天已经很好了”
交互:
- 用户点击”明天上午别推了” → “记下了”波纹动效 → 反馈”明天上午不推” → 写回偏好
- 用户点击”收到” → 复盘结束,返回首页
- 下拉刷新 → 显示更详细的线程统计(MVP 不必须)
动画:
- 数字滚动动画(从 0 滚动到实际数字,500ms)
- 状态流转图示动画(接住→归并→冷冻的流动效果,800ms)
- 按钮出现动画(透明度 + 位移,200ms 逐个浮现)
- 学习成果展示:复盘时智能体状态层显示”今天记下了 X 条偏好”
4. 组件设计系统
本章定义移动端所有核心交互组件的精确规格,使每个交互元素都有可执行的尺寸、圆角、间距、颜色和动效参数。所有主要交互按钮遵循果冻按钮系统:按下缩放 0.92 + 弹性回弹 + 触觉反馈 + 波纹扩散。
4.1 组件清单
| 组件 | 用途 | 出现页面 |
|---|---|---|
| 胶囊按钮 | 底部悬浮主捕获入口 | 首页、聚焦页(无任务时) |
| 动作卡片 | 聚焦页中央显示”现在只做” | 聚焦页 |
| 状态条 | 顶部轻状态显示 | 首页 |
| Toast | 轻量反馈提示 | 全局 |
| 纠偏面板 | 轻纠偏操作面板 | 聚焦页、通知 |
| 状态光 | 捕获后边缘闪烁光效 | 全局 |
| 微光流动层 | AI 判断过程可见 | 全局 |
| 思考动画 | 长时间判断提示 | 全局 |
4.2 通用规格参数
| 参数 | 值 | 说明 |
|---|---|---|
| 基础圆角 | 12px | 卡片、面板 |
| 胶囊圆角 | 999px | 按钮 |
| 小圆角 | 8px | 标签、小元素 |
| 页面边距 | 20px | 左右安全区 |
| 组件间距 | 16px | 垂直间距 |
| 触控热区 | 最小 44×44px | 符合无障碍标准 |
| 安全区底部 | 34px | 底部悬浮组件距底边距 |
4.3 果冻按钮系统
所有主要交互按钮(胶囊按钮、完成/拆小/稍后/重要按钮、纠偏面板按钮)统一遵循果冻按钮系统,提供一致的弹性触感反馈。
果冻按钮交互规格:
状态1:默认 ├─ scale: 1.0 ├─ 阴影: 0 8px 24px rgba(0,0,0,0.12)(重浮) └─ 无波纹
状态2:按下(touchstart) ├─ scale: 0.92(100ms, ease-out) ├─ 阴影: 0 4px 12px rgba(0,0,0,0.16)(收缩) ├─ 触觉: 单次轻震 10ms └─ 波纹起点确定(触摸点坐标)
状态3:释放(touchend) ├─ scale: 0.92 → 1.0(400ms, cubic-bezier(0.34, 1.56, 0.64, 1)) ├─ 阴影: 恢复重浮 ├─ 波纹: 从触摸点向外扩散,半径 0→80px(800ms, ease-out) │ 透明度 0.4→0(800ms, ease-out) │ 颜色: 状态色 └─ 触觉: 释放震动 10ms(延迟 100ms 触发,与回弹同步)波纹扩散规格:
- 起始半径:0px(从触摸点)
- 终止半径:80px(或按钮对角线长度,取较小值)
- 起始透明度:0.4
- 终止透明度:0
- 扩散时长:800ms
- 扩散曲线:
ease-out - 颜色:对应状态色(绿/蓝/橙/灰)
- 多次点击:波纹叠加,最多 3 层
禁用态:
- 透明度:0.4
- 无呼吸、无果冻、无波纹
- 触觉:无
4.4 胶囊按钮
底部悬浮的主捕获入口,移动端最核心的交互元素。
尺寸规格:
┌─────────────────────────────────────────┐│ 安全区底部 34px ││ ┌───────────────────────────────────┐ ││ │ [🎤] [输入框占位: 随时丢] [📷] │ │ ← 胶囊按钮主体│ │ 高度: 56px │ ││ │ 圆角: 999px │ ││ │ 左右边距: 20px │ ││ └───────────────────────────────────┘ ││ 底部安全区 34px │└─────────────────────────────────────────┘| 参数 | 值 |
|---|---|
| 宽度 | 屏幕宽度 - 40px(左右各 20px 边距) |
| 高度 | 56px |
| 圆角 | 999px |
| 背景渐变 | linear-gradient(135deg, #4CAF50, #66BB6A) |
| 阴影 | 0 8px 24px rgba(76,175,80,0.3) |
| 内部图标尺寸 | 24×24px |
| 图标颜色 | #FFFFFF |
| 占位文字 | ”随时丢” |
| 占位文字字号 | 16px Medium |
| 占位文字颜色 | rgba(255,255,255,0.7) |
| 左右图标距边 | 20px |
状态规格:
| 状态 | 视觉表现 | 触发 |
|---|---|---|
| 默认 | 呼吸动画 scale(0.96→1.02) 3s ease-in-out infinite | 无操作时 |
| 呼吸放慢 | scale(0.98→1.01) 5s ease-in-out infinite | 无操作 10s 后 |
| 按下 | 果冻缩放 0.92 + 波纹 | 轻触 |
| 录音中 | 左侧语音图标变为停止图标,背景脉动 opacity(0.8→1.0) 600ms | 长按 |
| 判断中 | 边缘微光流动(见第 2 章) | 碎片丢进后 |
| 完成 | 状态色闪光 + 波纹扩散 | AI 判断完成 |
| 禁用 | 透明度 0.4,无呼吸 | 网络异常等 |
呼吸动画规格:
- 缩放范围:
scale(0.96) → scale(1.02) - 循环时长:3s
- 曲线:
ease-in-out - 变换原点:
center - 与阴影联动:阴影也随缩放微变
0 8px 24px → 0 6px 18px
4.5 动作卡片
聚焦页中央的唯一焦点卡片,显示”现在只做”。
尺寸规格:
← 左右边距 20px →┌──────────────────────────────────┐│ ││ ┌──────────────────────────┐ ││ │ │ │ ← 动作卡片│ │ 现在只做: │ │ 宽度: 屏宽 - 40px│ │ │ │ 内边距: 24px│ │ 打开客户方案文档 │ │ 圆角: 12px│ │ 写三个小标题 │ │ 背景: #FFFFFF│ │ │ │ 阴影: 中浮│ │ │ ││ └──────────────────────────┘ ││ │└──────────────────────────────────┘| 参数 | 值 |
|---|---|
| 宽度 | 屏幕宽度 - 40px |
| 最小高度 | 200px |
| 内边距 | 24px(上下左右) |
| 圆角 | 12px |
| 背景 | #FFFFFF |
| 阴影 | 0 4px 16px rgba(0,0,0,0.08)(中浮) |
| 标题字号 | 14px Regular,颜色 #616161 |
| 标题文案 | ”现在只做:“ |
| 内容字号 | 20px Medium,颜色 #212121 |
| 行高 | 1.5 |
状态规格:
| 状态 | 视觉表现 | 触发 |
|---|---|---|
| 默认 | 中浮阴影,居中显示 | 聚焦页打开 |
| 滑动手势中 | 跟随手指位移 + 半透明遮罩提示操作 | 左/右/上滑 |
| 弹性回弹 | 回弹复位 cubic-bezier(0.34, 1.56, 0.64, 1) 400ms | 滑动未达阈值松开 |
| 完成飞出 | 向右飞出 + 淡出 300ms | 右滑达标 |
| 拆小翻转 | Y 轴翻转 180° + 显示更小任务 400ms | 上滑达标 |
| 稍后淡出 | 向左滑出 + 淡出 300ms | 左滑达标 |
| 标为重要 | 边框发光 box-shadow: 0 0 0 3px #FF9800 | 长按 |
| 悬浮微浮动 | translateY(-2px→0) 4s ease-in-out infinite | 静止时 |
| 空状态 | 显示”暂时没有任务,去捕获一些吧~” + 胶囊按钮 | 无下一步时 |
滑动遮罩规格:
- 滑动过程中卡片上方覆盖半透明遮罩
- 遮罩透明度随滑动距离递增:0→0.3
- 遮罩内显示当前操作文案(如”完成✓""拆小""稍后”)
- 遮罩文案字号 18px Medium,颜色白色
- 遮罩背景色:对应操作状态色
4.6 状态条
首页顶部的轻状态显示,默认隐藏,下拉显示。
尺寸规格:
┌──────────────────────────────────┐│ [状态条] 今日已接住 12 件 │ ← 高度 44px,毛玻璃背景│ 5 件归档,2 件稍后 │└──────────────────────────────────┘ ← 高度 44px,全宽 →| 参数 | 值 |
|---|---|
| 高度 | 44px |
| 宽度 | 100%(全宽) |
| 背景 | backdrop-filter: blur(12px); background: rgba(255,255,255,0.7) |
| 暗色背景 | backdrop-filter: blur(12px); background: rgba(30,30,30,0.7) |
| 内边距 | 左右 20px |
| 字号 | 12px Regular |
| 文字颜色 | #616161 |
| 数字颜色 | #212121 Medium |
状态规格:
| 状态 | 视觉表现 | 触发 |
|---|---|---|
| 隐藏 | translateY(-100%),不可见 | 默认 |
| 下拉显示 | translateY(-100%→0) 300ms cubic-bezier(0.0, 0, 0.2, 1) | 下拉手势 |
| 显示中 | 毛玻璃背景,显示今日统计 | 下拉到位 |
| 自动收起 | translateY(0→-100%) 300ms cubic-bezier(0.4, 0, 1, 1) | 3s 后或上滑 |
| 无操作淡出 | opacity(1→0) 500ms | 10s 无操作 |
内容格式:
- “今日已接住 X 件,Y 件已归档,Z 件稍后”
- 数字使用 Medium 字重,强调可信赖感
- 不显示”未完成”数量
4.7 Toast
全局轻量反馈提示,用于捕获确认、纠偏反馈等。
尺寸规格:
┌─────────────────────┐ │ ✓ 已接住 │ ← Toast │ 已放进产品线程 │ 高度: 48-64px(自适应) └─────────────────────┘ 宽度: 自适应(最大屏宽-80px) 圆角: 12px| 参数 | 值 |
|---|---|
| 最大宽度 | 屏幕宽度 - 80px |
| 最小高度 | 48px |
| 内边距 | 12px 20px |
| 圆角 | 12px |
| 背景 | rgba(33,33,33,0.9)(深色半透明) |
| 暗色背景 | rgba(255,255,255,0.95)(亮色半透明) |
| 主文案字号 | 14px Medium |
| 主文案颜色 | #FFFFFF(亮色模式)/ #212121(暗色模式) |
| 副文案字号 | 12px Regular |
| 副文案颜色 | rgba(255,255,255,0.7) / rgba(33,33,33,0.6) |
| 图标尺寸 | 20×20px |
| 阴影 | 0 4px 16px rgba(0,0,0,0.12) |
状态规格:
| 状态 | 视觉表现 | 触发 |
|---|---|---|
| 进入 | 从顶部滑入 translateY(-100%→0) 300ms cubic-bezier(0.0, 0, 0.2, 1) | 触发反馈 |
| 显示 | 居中顶部,距顶 64px(避开状态条) | 进入完成 |
| 退出 | 淡出 + 上滑 translateY(0→-20%) opacity(1→0) 300ms | 2s 后自动 |
| 长文本 | 高度自适应,最大 3 行 | 副文案超长 |
Toast 类型:
| 类型 | 图标 | 主色 | 示例 |
|---|---|---|---|
| 成功 | ✓ | #4CAF50 | ”已接住” |
| 归并 | ⇄ | #2196F3 | ”已放进产品线程” |
| 稍后 | ◐ | #9E9E9E | ”下午再回来” |
| 重要 | 🔥 | #FF9800 | ”已标重要” |
| 待定 | ? | #FF9800 | ”你扫一眼” |
| 错误 | ! | #F44336 | ”稍等片刻,再试试” |
关键约束:
- Toast 不阻塞用户操作
- 同一时间只显示一个 Toast,新 Toast 替换旧 Toast
- Toast 不包含可点击按钮(按钮交互用纠偏面板)
- 显示时长:2s(无副文案)/ 3s(有副文案)
4.8 纠偏面板
底部弹出的轻纠偏操作面板,用于纠偏动作选择和输入。
尺寸规格:
┌──────────────────────────────────┐│ │ ← 背景遮罩(半透明黑 0.4)│ ┌────────────────────────┐ ││ │ [把手] │ │ ← 纠偏面板│ │ │ │ 圆角: 顶部 16px│ │ 这件事你要怎么处理? │ │ 背景: 毛玻璃│ │ │ ││ │ [完成✓] [拆小] │ ││ │ [稍后] [这很重要] │ ││ │ [今天别推] [这不是任务] │ ││ │ │ ││ │ ┌─────────────────┐ │ │ ← 一句话输入框│ │ │ 或输入一句话... │ │ │ 高度 40px│ │ └─────────────────┘ │ │ 圆角 8px│ └────────────────────────┘ │└──────────────────────────────────┘| 参数 | 值 |
|---|---|
| 宽度 | 100%(全宽) |
| 圆角 | 顶部 16px |
| 背景 | backdrop-filter: blur(16px); background: rgba(255,255,255,0.8) |
| 暗色背景 | backdrop-filter: blur(16px); background: rgba(30,30,30,0.8) |
| 内边距 | 20px |
| 把手尺寸 | 36×4px,圆角 2px,颜色 #E0E0E0 |
| 把手上边距 | 8px |
| 标题字号 | 16px Medium,颜色 #212121 |
| 按钮网格 | 3 列 × 2 行 |
| 按钮间距 | 12px |
| 按钮高度 | 44px |
| 按钮圆角 | 12px |
| 输入框高度 | 40px |
| 输入框圆角 | 8px |
| 输入框背景 | rgba(0,0,0,0.04) |
| 遮罩透明度 | rgba(0,0,0,0.4) |
纠偏按钮规格:
| 按钮 | 背景 | 文字色 | 图标 |
|---|---|---|---|
| 完成✓ | rgba(76,175,80,0.12) | #4CAF50 | ✓ |
| 拆小 | rgba(33,150,243,0.12) | #2196F3 | ⤓ |
| 稍后 | rgba(158,158,158,0.12) | #616161 | ◐ |
| 这很重要 | rgba(255,152,0,0.12) | #FF9800 | 🔥 |
| 今天别推 | rgba(158,158,158,0.12) | #616161 | ✕ |
| 这不是任务 | rgba(158,158,158,0.12) | #616161 | 🗂 |
所有纠偏按钮遵循果冻按钮系统。
状态规格:
| 状态 | 视觉表现 | 触发 |
|---|---|---|
| 进入 | 从底部滑入 translateY(100%→0) 300ms cubic-bezier(0.0, 0, 0.2, 1) + 遮罩淡入 | 点击纠偏入口 |
| 显示 | 毛玻璃面板 + 遮罩 | 进入完成 |
| 按钮按下 | 果冻缩放 0.92 + 波纹 | 轻触按钮 |
| ”记下了”动效 | 按钮位置波纹扩散 + 浮现”记下了”文案 | 纠偏确认 |
| 退出 | 向下滑出 translateY(0→100%) 300ms cubic-bezier(0.4, 0, 1, 1) + 遮罩淡出 | 纠偏完成或点击遮罩 |
| 输入框聚焦 | 边框变为主色 #4CAF50,键盘弹出 | 轻触输入框 |
关键约束:
- 纠偏面板不超过屏幕高度 50%,避免遮挡过多内容
- 一句话输入框支持自然语言纠偏(如”语气保守一点""这不是截止”)
- 面板可通过下拉手势关闭
4.9 状态光
捕获后边缘闪烁的光效,颜色表示状态,是核心的状态反馈视觉语言。
尺寸规格:
| 参数 | 值 |
|---|---|
| 位置 | 胶囊按钮边缘 / 屏幕边缘 |
| 宽度 | 3px(边缘光带) |
| 扩散半径 | 60px(波纹扩散) |
| 起始透明度 | 0.8 |
| 终止透明度 | 0 |
状态色规格:
| 状态 | 光色 | rgba |
|---|---|---|
| 已接住/完成 | 绿 | rgba(76,175,80,0.8) |
| 已归并 | 蓝 | rgba(33,150,243,0.8) |
| 稍后/等待 | 灰 | rgba(158,158,158,0.6) |
| 重要 | 橙 | rgba(255,152,0,0.8) |
| 冷冻 | 浅灰蓝 | rgba(176,190,197,0.6) |
动画规格:
| 阶段 | 动画 | 时长 | 曲线 |
|---|---|---|---|
| 亮起 | 透明度 0→0.8 | 100ms | ease-out |
| 闪烁 | 透明度 0.8→0.4→0.8 | 800ms(2 次循环) | ease-in-out |
| 扩散 | 波纹向外扩散 0→60px,透明度 0.8→0 | 2s | ease-out |
| 淡出 | 透明度 0.4→0 | 500ms | ease-in |
关键约束:
- 状态光不闪烁超过 3 次,避免吸引过多注意力
- 状态光颜色与 Toast 图标色一致,保持状态色统一
- 多次连续捕获:状态光叠加显示,最多 3 层
4.10 微光流动层
AI 判断过程的视觉表达层,详见第 2 章。此处补充组件规格。
尺寸规格:
| 参数 | 值 |
|---|---|
| 位置 | 状态条下方,胶囊按钮上方 |
| 宽度 | 屏幕宽度 - 40px |
| 高度 | 48px(含文案) |
| 内边距 | 12px 20px |
| 圆角 | 12px |
| 背景 | transparent(仅微光,无背景色) |
| 微光宽度 | 2px(流动光带) |
| 微光起始透明度 | 0.6 |
| 文案字号 | 14px Regular |
| 文案颜色 | #616161 |
状态规格:
| 状态 | 视觉表现 | 触发 |
|---|---|---|
| 隐藏 | opacity: 0; height: 0 | 默认 |
| 进入 | opacity(0→1) 200ms + 高度展开 | AI 开始判断 |
| 流动 | 微光沿胶囊边缘流动 3s | 判断中 |
| 完成 | 微光聚拢为状态色闪光 → 波纹扩散 | 判断完成 |
| 退出 | opacity(1→0) 500ms + 高度收起 | 完成后 2s |
4.11 思考动画
长时间判断提示组件,详见第 2 章。此处补充组件规格。
尺寸规格:
| 参数 | 值 |
|---|---|
| 位置 | 反馈区居中 |
| 圆点直径 | 6px |
| 圆点间距 | 8px |
| 圆点颜色 | #4CAF50 |
| 总宽度 | 34px(3 点 + 2 间距) |
| 高度 | 6px |
动画规格:
| 圆点 | 亮起延迟 | 亮起时长 | 暗下时长 |
|---|---|---|---|
| 第 1 点 | 0ms | 400ms | 400ms |
| 第 2 点 | 400ms | 400ms | 400ms |
| 第 3 点 | 800ms | 400ms | 400ms |
- 亮起:透明度 0.3 → 1.0
- 暗下:透明度 1.0 → 0.3
- 循环时长:1.2s
- 曲线:
cubic-bezier(0.4, 0, 0.2, 1)
与文案的组合:
- 思考动画下方显示状态文案(如”蕉不焦在帮你看看这件…”)
- 文案字号 14px Regular,颜色
#616161 - 文案与动画间距 12px
4.12 组件状态色汇总
所有组件的状态色统一映射,确保状态在全应用中视觉一致:
| 状态 | 色值 | 用于 | 组件应用 |
|---|---|---|---|
| 已接住/完成 | #4CAF50 | 成功、活跃 | 状态光、Toast、波纹、完成按钮 |
| 已归并 | #2196F3 | 归并、拆小 | 状态光、Toast、波纹、拆小按钮 |
| 重要 | #FF9800 | 重要、待定 | 状态光、Toast、波纹、重要按钮 |
| 稍后/等待 | #9E9E9E | 稍后、归档 | 状态光、Toast、波纹、稍后按钮 |
| 冷冻 | #B0BEC5 | 冷冻 | 状态光 |
| 错误 | #F44336 | 失败、异常 | Toast 错误类型 |
| 原始碎片 | #BDBDBD | 未处理 | 状态光(初始) |
5. 手势交互系统
本章建立完整的手势词典,从 4 种基础手势扩展到 10 种,并定义拖拽场景、手势组合与冲突处理规则。所有手势设计考虑微信小程序手势 API 限制(bindtap/bindlongpress/bindtouchstart/bindtouchmove/bindtouchend/movable-view),确保可落地。
手势仅作增强,不替代可见入口:依据 GhostUI(CHI 2026)“可见性优先”结论,凡核心功能(捕获、页面切换)必须提供带边界、带标签的可见入口;本章手势词典中的边缘滑动、长按等均为可选增强,不可作为唯一路径。首页捕获已改为微信式输入栏(语音/键盘切换 + 文字输入 +「+」面板,全部显式,§3.1),页面切换已改为底部可见导航栏。交互范式直接复用微信已教育市场的操作习惯(按住说话、「+」面板),不做自创手势。
5.1 手势词典
5.1.1 轻触(Tap)
| 属性 | 值 |
|---|---|
| 触发条件 | 手指接触屏幕 < 300ms,位移 < 10px |
| 触觉反馈 | 单次轻震 10ms |
| 视觉反馈 | 果冻按钮缩放 0.92 + 弹性回弹 + 波纹 |
| 适用场景 | 胶囊按钮触发、纠偏按钮、Toast 关闭、状态条点击 |
| 小程序 API | bindtap |
| 防抖 | 500ms 内同一元素只响应一次 |
5.1.2 长按(Long Press)
| 属性 | 值 |
|---|---|
| 触发条件 | 手指接触屏幕 > 1000ms,位移 < 10px |
| 触觉反馈 | 单次中震 20ms |
| 视觉反馈 | 按钮状态变色 + 触觉提示 |
| 适用场景 | 胶囊按钮语音录制、动作卡片标为重要 |
| 小程序 API | bindlongpress |
| 取消条件 | 长按开始后位移 > 20px 则取消 |
语音录制长按规格:
- 长按开始:胶囊按钮左侧图标变为停止图标,背景脉动
opacity(0.8→1.0) 600ms - 录制中:显示录音波形动画 + 时长计数
- 松开停止:自动提交语音,进入 AI 判断流程
- 最长录制:60s,超时自动停止
5.1.3 双击(Double Tap)
| 属性 | 值 |
|---|---|
| 触发条件 | 两次轻触间隔 < 300ms,位移均 < 10px |
| 触觉反馈 | 双次轻震 10ms×2 |
| 视觉反馈 | 果冻回弹 + 绿色波纹 |
| 适用场景 | 动作卡片快速完成、首页快速捕获 |
| 小程序 API | 自定义实现(bindtap + 时间戳判断) |
| 与轻触冲突 | 300ms 延迟判断:首次点击后等待 300ms,若无第二次点击则触发轻触 |
5.1.4 上滑(Swipe Up)
| 属性 | 值 |
|---|---|
| 触发条件 | 向上滑动 > 50px,水平位移 < 30px |
| 触觉反馈 | 单次轻震 10ms |
| 视觉反馈 | 跟随手指位移 + 遮罩提示 |
| 适用场景 | 胶囊按钮唤起截图、动作卡片拆小 |
| 小程序 API | bindtouchstart/bindtouchmove/bindtouchend |
| 阈值 | 50px 触发,未达阈值弹性回弹 |
胶囊上滑(截图输入):
- 上滑 > 50px:唤起截图/相册选择
- 上滑过程中显示向上箭头 + “截图”文案
- 松开手指:若达阈值则进入截图选择,否则回弹
卡片上滑(拆小):
- 上滑 > 30% 屏幕高度:触发拆小
- 上滑过程中卡片跟随位移 + 蓝色遮罩 + “拆小”文案
- 松开手指:若达阈值则卡片翻转显示更小任务,否则弹性回弹
5.1.5 下滑(Swipe Down)
| 属性 | 值 |
|---|---|
| 触发条件 | 向下滑动 > 50px,水平位移 < 30px |
| 触觉反馈 | 单次轻震 10ms |
| 视觉反馈 | 状态条滑入 / 刷新指示器 |
| 适用场景 | 首页显示状态条、复盘页下拉刷新 |
| 小程序 API | bindtouchstart/bindtouchmove/bindtouchend 或 onPullDownRefresh |
| 阈值 | 50px 触发状态条,80px 触发刷新 |
5.1.6 左滑(Swipe Left)
| 属性 | 值 |
|---|---|
| 触发条件 | 向左滑动 > 30% 屏幕宽度,垂直位移 < 30px |
| 触觉反馈 | 单次轻震 10ms |
| 视觉反馈 | 卡片跟随位移 + 灰色遮罩 + “稍后”文案 |
| 适用场景 | 动作卡片稍后、卡片归档 |
| 小程序 API | bindtouchstart/bindtouchmove/bindtouchend 或 movable-view |
| 阈值 | 30% 屏宽触发,未达阈值弹性回弹 |
| 后续操作 | 松开后弹出时段选择(今天/明天/下周) |
5.1.7 右滑(Swipe Right)
| 属性 | 值 |
|---|---|
| 触发条件 | 向右滑动 > 30% 屏幕宽度,垂直位移 < 30px |
| 触觉反馈 | 双次短震 20ms×2(完成确认) |
| 视觉反馈 | 卡片跟随位移 + 绿色遮罩 + “完成✓“文案 |
| 适用场景 | 动作卡片完成、首页右滑进入聚焦页 |
| 小程序 API | bindtouchstart/bindtouchmove/bindtouchend |
| 阈值 | 30% 屏宽触发,未达阈值弹性回弹 |
| 完成动效 | 卡片向右飞出 + 淡出 300ms + 下个任务滑入 |
5.1.8 拖拽(Drag)
| 属性 | 值 |
|---|---|
| 触发条件 | 长按 > 500ms 后开始移动,或直接按住并移动 > 10px |
| 触觉反馈 | 开始拖拽时中震 20ms |
| 视觉反馈 | 被拖拽元素放大 scale(1.05) + 阴影增强 |
| 适用场景 | 卡片拖拽排序、拖拽到状态区域 |
| 小程序 API | movable-view/movable-area 或自定义 touchmove |
| 释放 | 松开手指后吸附到最近有效位置 |
5.1.9 边缘滑动(Edge Swipe)
| 属性 | 值 |
|---|---|
| 触发条件 | 从屏幕边缘 20px 内开始滑动,向内滑动 > 60px |
| 触觉反馈 | 单次轻震 10ms |
| 视觉反馈 | 页面跟随位移 + 下一页预览 |
| 适用场景 | 三页之间切换(首页↔聚焦页↔复盘页) |
| 小程序 API | bindtouchstart/bindtouchmove/bindtouchend(需判断起始坐标) |
| 阈值 | 60px 触发切换,未达阈值回弹 |
| 方向 | 右边缘左滑→聚焦页;左边缘右滑→复盘页(晚间) |
边缘滑动与系统手势冲突:
- 微信小程序中,右边缘左滑可能与系统返回手势冲突
- 解决方案:使用左边缘右滑作为主要页面切换手势,右边缘左滑作为辅助
- 左边缘 20px 内开始滑动时优先响应页面切换,不触发系统返回
5.1.10 双指捏合(Pinch)
| 属性 | 值 |
|---|---|
| 触发条件 | 两指距离缩小 > 20% |
| 触觉反馈 | 单次轻震 10ms |
| 视觉反馈 | 元素缩小 + 淡出 |
| 适用场景 | 聚焦页背景缩略图折叠/展开、复盘页线程统计折叠 |
| 小程序 API | 两指 touchstart/touchmove 计算距离 |
| 阈值 | 距离缩小 20% 触发折叠,放大 20% 触发展开 |
5.1.11 摇晃(Shake)
| 属性 | 值 |
|---|---|
| 触发条件 | 设备加速度超过阈值(微信 wx.onAccelerometerChange) |
| 触觉反馈 | 双次中震 20ms×2 |
| 视觉反馈 | 撤销 Toast “已撤销最后操作” |
| 适用场景 | 撤销最后一次捕获或操作 |
| 小程序 API | wx.onAccelerometerChange |
| 阈值 | 加速度 > 2g(避免误触) |
| 限制 | 5s 内只响应一次,避免连续摇晃 |
| 可撤销范围 | 最后一次捕获、最后一次状态变更、最后一次纠偏 |
5.2 手势组合
复合手势由基础手势组合而成,用于实现更高效的交互。
| 手势组合 | 序列 | 效果 | 场景 |
|---|---|---|---|
| 长按 + 上滑 | 长按胶囊 → 不松开上滑 | 长按录音 → 上滑取消录音 | 语音输入取消 |
| 长按 + 拖拽 | 长按卡片 → 拖拽到状态区 | 进入拖拽排序模式 | 卡片状态变更 |
| 双击 + 长按 | 双击卡片 → 长按 | 快速完成 + 标重要 | 高效操作 |
| 边缘滑动 + 滑动 | 边缘滑出页面 → 继续滑动 | 连续切换多页 | 快速导航 |
长按 + 拖拽的实现:
- 长按 500ms 后进入”拖拽就绪”状态(触觉中震 + 元素放大 1.05)
- 拖拽就绪后手指不松开继续移动即开始拖拽
- 拖拽过程中显示状态区域热区(底部出现 4 个状态区域:完成/拆小/稍后/重要)
- 释放到对应状态区域即触发该状态变更
5.3 拖拽场景详细设计
5.3.1 卡片拖拽排序
场景:聚焦页背景的任务缩略图,用户可长按拖拽重新排序。
交互流程:
1. 长按背景缩略图 > 500ms → 缩略图放大 scale(1.05) + 阴影增强 + 触觉中震 → 其他缩略图轻微下沉(透明度 0.6)
2. 手指拖动 → 被拖拽缩略图跟随手指 → 其他缩略图自动腾位(Y 轴位移 200ms 缓动)
3. 松开手指 → 缩略图吸附到最近空位(200ms 缓动) → 触觉轻震 + 排序写入 → 其他缩略图恢复透明度视觉规格:
- 被拖拽元素:
scale(1.05)+ 阴影0 12px 32px rgba(0,0,0,0.2) - 其他元素:透明度 0.6 + 自动腾位
- 腾位动画:
translateY 200ms cubic-bezier(0.4, 0, 0.2, 1)
5.3.2 拖拽到状态区域
场景:聚焦页动作卡片可拖拽到底部状态区域,直接改变状态。
交互流程:
1. 长按动作卡片 > 500ms → 卡片放大 scale(1.05) + 触觉中震 → 底部浮现 4 个状态区域:
┌──────┬──────┬──────┬──────┐ │ 完成✓│ 拆小 │ 稍后 │ 重要 │ │ 绿 │ 蓝 │ 灰 │ 橙 │ └──────┴──────┴──────┴──────┘
2. 拖拽卡片到某状态区域上方 → 该区域高亮(背景色加深 + scale(1.1)) → 其他区域变暗(透明度 0.5) → 触觉轻震提示进入有效区域
3. 松开手指 → 若在有效区域内:触发该状态变更 + "记下了"波纹 → 若不在有效区域内:卡片弹性回弹到原位状态区域规格:
- 位置:底部安全区上方
- 每个区域尺寸:等分屏宽,高度 80px
- 圆角:顶部 12px
- 默认背景:对应状态色 12% 透明度
- 高亮背景:对应状态色 24% 透明度 +
scale(1.1) - 图标 + 文案:居中,字号 14px Medium
5.3.3 拖拽切换页面
场景:三页之间通过边缘拖拽切换。
交互流程:
1. 从屏幕边缘 20px 内开始拖拽 → 当前页面跟随手指位移 → 下一页从边缘滑入(半透明预览)
2. 拖拽超过 60px → 下一页逐渐清晰(透明度 0.3→0.8) → 触觉轻震提示达到切换阈值
3. 松开手指 → 若超过阈值:页面切换完成(300ms 缓动到位) → 若未超过阈值:当前页面弹性回弹(400ms 弹性曲线)页面切换方向:
- 左边缘右滑 → 复盘页(晚间优先显示)
- 右边缘左滑 → 聚焦页
- 页面顺序:首页(中) ↔ 聚焦页(右) ↔ 复盘页(左)
5.4 手势冲突处理
多手势可能同时触发,需要明确的优先级和处理规则。
5.4.1 优先级规则
| 优先级 | 手势 | 说明 |
|---|---|---|
| 1(最高) | 边缘滑动 | 页面切换优先,避免与系统返回冲突 |
| 2 | 长按 | 长按一旦触发(>1s),忽略后续滑动 |
| 3 | 拖拽 | 长按 > 500ms 后进入拖拽,优先于普通滑动 |
| 4 | 滑动(左/右/上/下) | 方向明确的滑动 |
| 5 | 双击 | 需等待 300ms 判断 |
| 6(最低) | 轻触 | 最基础手势,最后判断 |
5.4.2 冲突处理规则
轻触 vs 双击:
- 首次轻触后不立即触发,等待 300ms
- 300ms 内有第二次轻触 → 触发双击
- 300ms 内无第二次轻触 → 触发轻触
- 代价:轻触有 300ms 延迟(可接受,果冻回弹动画掩盖延迟)
轻触 vs 长按:
- 手指接触屏幕后同时启动两个计时器
- < 300ms 松开 → 轻触
-
1000ms 未松开 → 长按
- 300ms-1000ms 松开 → 不触发任何手势
滑动 vs 长按:
- 手指接触后位移 > 10px → 取消长按计时,进入滑动判断
- 手指接触后位移 < 10px 且 > 1000ms → 触发长按
滑动方向冲突:
- 计算滑动的主方向(水平 vs 垂直)
- 水平位移 > 垂直位移 → 左滑/右滑
- 垂直位移 > 水平位移 → 上滑/下滑
- 主方向位移需 > 30px 才触发
边缘滑动 vs 普通滑动:
- 起始点在边缘 20px 内 → 优先边缘滑动
- 起始点在边缘 20px 外 → 普通滑动
拖拽 vs 滑动:
- 长按 > 500ms 后移动 → 拖拽
- 未长按直接移动 > 10px → 滑动
摇晃 vs 触摸手势:
- 摇晃与触摸手势独立,可同时触发
- 摇晃仅触发撤销,不干扰当前触摸操作
5.5 微信小程序手势 API 适配
| 手势 | 推荐实现 | 注意事项 |
|---|---|---|
| 轻触 | bindtap | 原生支持,注意 300ms 延迟 |
| 长按 | bindlongpress | 原生支持,bindlongpress 优先于 bindtap |
| 双击 | bindtap + 时间戳 | 需自定义判断,注意与轻触的延迟 |
| 滑动 | bindtouchstart/bindtouchmove/bindtouchend | 计算位移和方向,需处理多点触控 |
| 拖拽 | movable-view/movable-area | 原生组件,限制在 movable-area 内 |
| 边缘滑动 | bindtouchstart 判断坐标 | 需判断起始点是否在边缘 20px 内 |
| 双指捏合 | 双指 touchmove 计算距离 | 需处理 touches 数组 |
| 摇晃 | wx.onAccelerometerChange | 需申请加速度权限 |
小程序手势限制与应对:
movable-view性能有限,复杂拖拽场景需自定义touchmove- 小程序无原生 Force Touch 支持,暂不实现
- 小程序返回手势优先级高于应用手势,边缘滑动需避开右边缘
- 使用
catchtouchmove阻止事件冒泡,避免页面滚动干扰拖拽
6. 动效系统
本章定义所有动效的精确曲线和时长,区分弹性动画、缓入缓出、呼吸循环三类曲线,使开发可直接使用。每类动效都标注完整的 CSS 实现参数。
6.1 动效曲线规范
| 曲线类型 | cubic-bezier 值 | 适用场景 | 特征 |
|---|---|---|---|
| 弹性曲线 | cubic-bezier(0.34, 1.56, 0.64, 1) | 果冻回弹、卡片回弹 | 超出目标值后回弹,模拟物理弹性 |
| 缓入缓出 | cubic-bezier(0.4, 0, 0.2, 1) | 页面切换、淡入淡出 | 对称加速减速,自然流畅 |
| 缓出 | cubic-bezier(0.0, 0, 0.2, 1) | 元素进入 | 快速启动,缓慢停止 |
| 缓入 | cubic-bezier(0.4, 0, 1, 1) | 元素退出 | 缓慢启动,快速离开 |
| 呼吸曲线 | ease-in-out | 循环呼吸动画 | 对称缓动,适合无限循环 |
| 线性 | linear | 进度条、匀速旋转 | 匀速,仅用于功能性动画 |
6.2 动效分类
6.2.1 呼吸类动效
呼吸类动效是”呼吸感”基调的核心,通过缓慢的循环缩放/位移/透明度变化,暗示元素的”活性”。
| 动效 | 属性变化 | 时长 | 曲线 | 触发 |
|---|---|---|---|---|
| 胶囊呼吸 | scale(0.96→1.02) + 阴影联动 | 3s 循环 | ease-in-out | 首页无操作时 |
| 胶囊呼吸放慢 | scale(0.98→1.01) | 5s 循环 | ease-in-out | 无操作 10s 后 |
| 背景微光 | radial-gradient 位置缓动 | 8s 循环 | ease-in-out | 首页背景持续 |
| 卡片悬浮微浮动 | translateY(-2px→0) | 4s 循环 | ease-in-out | 聚焦页卡片静止时 |
| 录音中脉动 | opacity(0.8→1.0) | 600ms 循环 | ease-in-out | 语音录制中 |
| 思考心跳 | 三点透明度 0.3→1.0 | 1.2s 循环 | cubic-bezier(0.4, 0, 0.2, 1) | AI 判断中 |
呼吸动画 CSS 示例:
@keyframes breathe { 0%, 100% { transform: scale(0.96); box-shadow: 0 8px 24px rgba(76,175,80,0.3); } 50% { transform: scale(1.02); box-shadow: 0 6px 18px rgba(76,175,80,0.25); }}.capsule { animation: breathe 3s ease-in-out infinite; }6.2.2 果冻类动效
果冻类动效是”果冻感”基调的核心,通过弹性曲线提供物理触感反馈。
| 动效 | 属性变化 | 时长 | 曲线 | 触发 |
|---|---|---|---|---|
| 果冻按下 | scale(1.0→0.92) | 100ms | ease-out | 按钮按下(touchstart) |
| 果冻回弹 | scale(0.92→1.0) | 400ms | cubic-bezier(0.34, 1.56, 0.64, 1) | 按钮释放(touchend) |
| 波纹扩散 | radius(0→80px) + opacity(0.4→0) | 800ms | ease-out | 按钮释放 |
| 卡片弹性回弹 | translateX(0) | 400ms | cubic-bezier(0.34, 1.56, 0.64, 1) | 滑动未达阈值松开 |
| ”记下了”波纹 | radius(0→80px) + 文案浮现 | 800ms + 1.5s 淡出 | ease-out | 纠偏确认 |
| 状态光扩散 | radius(0→60px) + opacity(0.8→0) | 2s | ease-out | 捕获完成 |
果冻回弹 CSS 示例:
@keyframes jelly-bounce { 0% { transform: scale(0.92); } 60% { transform: scale(1.04); } 100% { transform: scale(1.0); }}.button.released { animation: jelly-bounce 400ms cubic-bezier(0.34, 1.56, 0.64, 1); }6.2.3 流转类动效
流转类动效用于页面切换、状态转换,强调流畅过渡。
| 动效 | 属性变化 | 时长 | 曲线 | 触发 |
|---|---|---|---|---|
| 页面切换 | translateX + opacity | 200ms | cubic-bezier(0.4, 0, 0.2, 1) | 边缘滑动切换 |
| 卡片飞出(完成) | translateX(100%) + opacity(1→0) | 300ms | cubic-bezier(0.4, 0, 0.2, 1) | 右滑完成 |
| 卡片翻转(拆小) | rotateY(180°) | 400ms | cubic-bezier(0.4, 0, 0.2, 1) | 上滑拆小 |
| 卡片淡出(稍后) | translateX(-100%) + opacity(1→0) | 300ms | cubic-bezier(0.4, 0, 0.2, 1) | 左滑稍后 |
| Toast 进入 | translateY(-100%→0) + opacity(0→1) | 300ms | cubic-bezier(0.0, 0, 0.2, 1) | Toast 触发 |
| Toast 退出 | translateY(0→-20%) + opacity(1→0) | 300ms | cubic-bezier(0.4, 0, 1, 1) | Toast 自动消失 |
| 状态条滑入 | translateY(-100%→0) | 300ms | cubic-bezier(0.0, 0, 0.2, 1) | 下滑显示 |
| 纠偏面板滑入 | translateY(100%→0) | 300ms | cubic-bezier(0.0, 0, 0.2, 1) | 点击纠偏入口 |
| 微光流动 | 边缘光带位移 | 3s | cubic-bezier(0.4, 0, 0.2, 1) | AI 判断中 |
6.2.4 微交互类动效
微交互类动效用于细节反馈,增强交互的精致感。
| 动效 | 属性变化 | 时长 | 曲线 | 触发 |
|---|---|---|---|---|
| 数字滚动 | 数字从 0 递增到目标值 | 500ms | ease-out | 复盘页统计 |
| 按钮浮现 | opacity(0→1) + translateY(10px→0) | 200ms 逐个(间隔 80ms) | cubic-bezier(0.0, 0, 0.2, 1) | 复盘页按钮 |
| 状态光闪烁 | opacity(0→0.8→0.4→0.8) | 800ms(2 次循环) | ease-in-out | 捕获后状态反馈 |
| 状态光淡出 | opacity(0.4→0) | 500ms | ease-in | 状态光结束 |
| 遮罩淡入 | opacity(0→0.4) | 200ms | ease-out | 滑动过程中遮罩 |
| 图标变色 | color 过渡 | 200ms | ease-out | 状态切换 |
| 边框发光 | box-shadow 过渡 | 300ms | ease-out | 标为重要 |
| 缩略图腾位 | translateY | 200ms | cubic-bezier(0.4, 0, 0.2, 1) | 拖拽排序时其他元素 |
6.3 动效组合规则
多个动效同时触发时的组合规则,确保动效协调不冲突。
| 组合场景 | 动效 A | 动效 B | 组合方式 |
|---|---|---|---|
| 按钮按下 + 触觉 | 果冻缩放 0.92 | 震动 10ms | 同步触发 |
| 按钮释放 + 波纹 + 触觉 | 果冻回弹 400ms | 波纹扩散 800ms | 回弹先开始 100ms,波纹延迟 100ms |
| 纠偏确认 + 波纹 + 文案 | ”记下了”波纹 800ms | 文案浮现 200ms | 波纹先开始,文案延迟 200ms 浮现 |
| 捕获完成 + 状态光 + Toast | 状态光扩散 2s | Toast 进入 300ms | 状态光先开始,Toast 延迟 500ms |
| 卡片完成 + 飞出 + 下一个滑入 | 卡片飞出 300ms | 下一个滑入 300ms | 飞出完成后立即滑入(无间隔) |
| 页面切换 + 呼吸重置 | 页面切换 200ms | 胶囊呼吸启动 | 切换完成后启动呼吸(延迟 200ms) |
组合约束:
- 同一元素同一时刻最多 2 个动效叠加
- 循环动效(呼吸、微光)在交互动效触发时暂停,交互完成后恢复
- 波纹扩散不与果冻回弹冲突(波纹在元素上层,不影响 transform)
6.4 性能约束
| 约束 | 值 | 说明 |
|---|---|---|
| 动画帧率 | ≥ 60fps | 所有动画必须保持流畅 |
| 同时动画数 | ≤ 5 | 同屏同时运行的独立动画不超过 5 个 |
| 循环动画数 | ≤ 3 | 同屏同时运行的循环动画不超过 3 个 |
| 动画属性 | 仅 transform/opacity | 避免触发重排(不用 width/height/margin/top/left) |
| 复杂动画 | 使用 will-change | 预告浏览器优化(如 will-change: transform) |
| 小程序限制 | 避免 setData 高频调用 | 动画用 CSS/wxs 实现,不用 JS 驱动 |
性能优化策略:
- 循环动画用 CSS
animation实现,不用 JSrequestAnimationFrame - 拖拽动画用小程序
wxs响应事件,减少setData调用 - 离屏元素暂停动画(
animation-play-state: paused) - 减少动态模式下关闭所有非功能性动画
7. 视觉设计
本章定义完整的视觉设计系统,包括主色/辅色/强调/中性色阶、渐变色、阴影层级、毛玻璃参数、光效规格,以及 8 种状态色的完整映射和暗黑模式全量映射。
7.1 色彩系统
7.1.1 主色阶(绿 - 健康、减负、已接住、完成)
| 色阶 | 色值 | 用途 |
|---|---|---|
| Green 50 | #E8F5E9 | 浅背景、成功底色 |
| Green 100 | #C8E6C9 | 标签背景、轻提示 |
| Green 200 | #A5D6A7 | 边框、分割 |
| Green 400 | #66BB6A | 渐变辅助色、暗色模式主色 |
| Green 500 | #4CAF50 | 主色,按钮、状态光、波纹 |
| Green 600 | #43A047 | 按下态 |
| Green 700 | #388E3C | 深色文字 |
7.1.2 辅色阶(蓝 - 归并、拆小、平静)
| 色阶 | 色值 | 用途 |
|---|---|---|
| Blue 50 | #E3F2FD | 浅背景 |
| Blue 100 | #BBDEFB | 标签背景 |
| Blue 200 | #90CAF9 | 边框 |
| Blue 400 | #42A5F5 | 暗色模式辅色 |
| Blue 500 | #2196F3 | 辅色,归并、拆小 |
| Blue 600 | #1E88E5 | 按下态 |
| Blue 700 | #1565C0 | 深色文字 |
7.1.3 强调色阶(橙 - 重要、硬截止、提醒)
| 色阶 | 色值 | 用途 |
|---|---|---|
| Orange 50 | #FFF3E0 | 浅背景 |
| Orange 100 | #FFE0B2 | 标签背景 |
| Orange 200 | #FFCC80 | 边框 |
| Orange 400 | #FFA726 | 暗色模式强调 |
| Orange 500 | #FF9800 | 强调色,重要、待定 |
| Orange 600 | #FB8C00 | 按下态 |
| Orange 700 | #F57C00 | 深色文字 |
7.1.4 中性色阶(灰 - 稍后、等待、文字、背景)
| 色阶 | 色值 | 用途 |
|---|---|---|
| Gray 50 | #FAFAFA | 页面背景 |
| Gray 100 | #F5F5F5 | 次级背景 |
| Gray 200 | #EEEEEE | 分割线浅 |
| Gray 300 | #E0E0E0 | 分割线、边框、已归档 |
| Gray 400 | #BDBDBD | 原始碎片、禁用 |
| Gray 500 | #9E9E9E | 中性色,稍后、等待 |
| Gray 600 | #757575 | 非文字用途(边框、图标辅助) |
| Gray 700 | #616161 | 次要文字(AA 合规,对比度 5.8:1) |
| Gray 800 | #424242 | 深色文字辅助 |
| Gray 900 | #212121 | 主文字 |
7.1.5 功能色
| 用途 | 色值 | 说明 |
|---|---|---|
| 错误 | #F44336 (Red 500) | 操作失败、异常 |
| 错误浅 | #FFEBEE (Red 50) | 错误背景 |
| 成功 | #4CAF50 (Green 500) | 同主色 |
| 警告 | #FF9800 (Orange 500) | 同强调色 |
| 信息 | #2196F3 (Blue 500) | 同辅色 |
| 链接 | #1976D2 (Blue 700) | 可点击文字 |
7.2 状态色完整映射
将 PRD 中 8 种 Todo 状态(对齐 prd.md 状态模型)各映射到主色、浅色、图标、视觉表现和交互语义:
| 状态 | 主色 | 浅色(背景) | 图标 | 视觉表现 | 交互语义 |
|---|---|---|---|---|---|
| 原始碎片 | #BDBDBD | #F5F5F5 | ○ | 未处理,中性灰 | 刚丢进来,正在判断 |
| 下一步 | #4CAF50 | #E8F5E9 | ▶ | 可开始,活跃绿 | 当前递回,唯一焦点 |
| 等待 | #90A4AE | #ECEFF1 | ⏸ | 等外部,平静灰蓝 | 不催促,7天后轻确认 |
| 归并线程 | #2196F3 | #E3F2FD | ⇄ | 已归并,平静蓝 | 不新增Todo,可拆出 |
| 稍后再出现 | #9E9E9E | #F5F5F5 | ◐ | 暂时消失,灰 | 时间到自动回来 |
| 冷冻 | #B0BEC5 | #ECEFF1 | ❄ | 不提醒,冷淡浅灰蓝 | 30天后复盘 |
| 接住待定 | #FF9800 | #FFF3E0 | ? | 需确认,注意橙 | 48小时内轻确认 |
| 已归档 | #E0E0E0 | #FAFAFA | ✓ | 无行动,淡出浅灰 | 可恢复 |
状态色使用规则:
- 状态光:使用主色,透明度 0.8
- 波纹:使用主色,透明度 0.4→0
- 标签背景:使用浅色
- 图标:使用主色
- Toast 图标色:使用主色
7.3 渐变色
| 用途 | 渐变 | 说明 |
|---|---|---|
| 背景微光 | radial-gradient(circle at 30% 20%, rgba(76,175,80,0.04), transparent 60%), radial-gradient(circle at 70% 80%, rgba(33,150,243,0.03), transparent 60%) | 首页背景双微光,8s 缓慢移动 |
| 胶囊按钮 | linear-gradient(135deg, #4CAF50, #66BB6A) | 主捕获入口,135° 对角 |
| 完成按钮 | linear-gradient(135deg, #4CAF50, #43A047) | 完成动作,稍深 |
| 拆小按钮 | linear-gradient(135deg, #2196F3, #1E88E5) | 拆小动作 |
| 重要按钮 | linear-gradient(135deg, #FF9800, #FB8C00) | 重要标记 |
| 状态光(绿) | radial-gradient(circle, rgba(76,175,80,0.8), transparent 60%) | 已接住/完成 |
| 状态光(蓝) | radial-gradient(circle, rgba(33,150,243,0.8), transparent 60%) | 已归并 |
| 状态光(橙) | radial-gradient(circle, rgba(255,152,0,0.8), transparent 60%) | 重要/待定 |
| 状态光(灰) | radial-gradient(circle, rgba(158,158,158,0.6), transparent 60%) | 稍后/等待 |
| 微光流动 | linear-gradient(90deg, transparent, rgba(176,190,197,0.6), transparent) | AI 判断中,边缘流动 |
渐变使用规则:
- 按钮渐变统一 135° 对角
- 状态光统一 radial-gradient 圆形
- 背景微光透明度 ≤ 0.04,不喧宾夺主
- 微光流动使用 linear-gradient + 位移动画
7.4 阴影系统
| 层级 | 亮色阴影 | 暗色阴影 | 用途 |
|---|---|---|---|
| 无浮 | none | none | 平面元素、内嵌元素 |
| 轻浮 | 0 2px 8px rgba(0,0,0,0.06) | 0 2px 8px rgba(0,0,0,0.3) | 状态条、小卡片、标签 |
| 中浮 | 0 4px 16px rgba(0,0,0,0.08) | 0 4px 16px rgba(0,0,0,0.4) | 动作卡片、面板、Toast |
| 重浮 | 0 8px 24px rgba(0,0,0,0.12) | 0 8px 24px rgba(0,0,0,0.5) | 胶囊按钮、弹窗 |
| 彩色浮(绿) | 0 8px 24px rgba(76,175,80,0.3) | 0 8px 24px rgba(102,187,106,0.2) | 胶囊按钮(带主色) |
| 拖拽浮 | 0 12px 32px rgba(0,0,0,0.2) | 0 12px 32px rgba(0,0,0,0.6) | 拖拽中的元素 |
| 发光(橙) | 0 0 0 3px rgba(255,152,0,0.4) | 0 0 0 3px rgba(255,167,38,0.4) | 标为重要的卡片 |
阴影使用规则:
- 层级与 z 轴对应:无浮 < 轻浮 < 中浮 < 重浮 < 拖拽浮
- 暗色模式阴影更深(rgba 透明度更高),因为暗背景需要更强对比
- 彩色阴影仅用于主交互元素(胶囊按钮)
- 动画中阴影跟随缩放联动变化
7.5 毛玻璃系统
| 用途 | 亮色参数 | 暗色参数 | 说明 |
|---|---|---|---|
| 状态条 | blur(12px); rgba(255,255,255,0.7) | blur(12px); rgba(30,30,30,0.7) | 顶部状态条 |
| Toast | blur(0px); rgba(33,33,33,0.9) | blur(0px); rgba(255,255,255,0.95) | Toast 不用毛玻璃(深色半透明) |
| 纠偏面板 | blur(16px); rgba(255,255,255,0.8) | blur(16px); rgba(30,30,30,0.8) | 底部弹出面板 |
| 遮罩 | rgba(0,0,0,0.4) | rgba(0,0,0,0.6) | 半透明遮罩 |
| 背景模糊 | blur(8px) | blur(8px) | 聚焦页背景缩略图 |
| 微光流动层 | transparent(无背景) | transparent | 仅微光,无背景 |
毛玻璃使用规则:
- 毛玻璃用于浮层(状态条、面板),不用于页面主体
- 模糊半径 12-16px,保证可读性
- 背景透明度 0.7-0.8,确保下方内容可感知但不干扰
- 小程序中
backdrop-filter兼容性需测试,降级方案为半透明纯色背景
7.6 光效系统
| 光效 | 参数 | 用途 |
|---|---|---|
| 状态光 | radial-gradient + 扩散动画 | 捕获后边缘闪烁(见 4.9) |
| 微光流动 | linear-gradient + 位移动画 | AI 判断过程(见 4.10) |
| 边框发光 | box-shadow: 0 0 0 3px [状态色] | 标为重要 |
| 波纹 | radial-gradient + 扩散动画 | 按钮释放、纠偏确认 |
| 背景微光 | radial-gradient + 缓动动画 | 首页背景呼吸感 |
| 胶囊呼吸光 | 阴影联动缩放 | 胶囊按钮呼吸时阴影微变 |
7.7 字体系统
| 层级 | 字体 | 大小 | 字重 | 行高 | 颜色 | 用途 |
|---|---|---|---|---|---|---|
| 大标题 | PingFang SC | 24px | Bold (700) | 1.3 | #212121 | 复盘页问候 |
| 动作卡片标题 | PingFang SC | 14px | Regular (400) | 1.4 | #616161 | ”现在只做:“ |
| 动作卡片内容 | PingFang SC | 20px | Medium (600) | 1.5 | #212121 | 动作描述 |
| 按钮文字 | PingFang SC | 16px | Medium (600) | 1.0 | #FFFFFF / 状态色 | 按钮文案 |
| 正文 | PingFang SC | 16px | Regular (400) | 1.5 | #212121 | 正文内容 |
| 说明文字 | PingFang SC | 14px | Regular (400) | 1.4 | #616161 | 辅助说明 |
| Toast 主文案 | PingFang SC | 14px | Medium (600) | 1.4 | #FFFFFF | Toast 主文字 |
| Toast 副文案 | PingFang SC | 12px | Regular (400) | 1.4 | rgba(255,255,255,0.7) | Toast 副文字 |
| 状态条 | PingFang SC | 12px | Regular (400) | 1.2 | #616161 | 状态条文字 |
| 数字(统计) | PingFang SC | 28px | Bold (700) | 1.0 | #212121 | 复盘页数字 |
字体使用规则:
- 字体跟随系统(PingFang SC 为 iOS 默认,Android 降级为系统默认)
- 字号支持系统缩放(最大 200%)
- 行高统一 1.4-1.5(正文),1.0-1.2(紧凑元素)
- 字重仅用 Regular (400) / Medium (600) / Bold (700) 三档
7.8 间距系统
| 级别 | 值 | 用途 |
|---|---|---|
| xs | 4px | 图标与文字间距、紧密元素 |
| sm | 8px | 小元素间距、标签内边距 |
| md | 12px | 组件内间距、按钮间距 |
| lg | 16px | 组件间距、垂直间距 |
| xl | 20px | 页面边距、卡片内边距 |
| 2xl | 24px | 大卡片内边距 |
| 3xl | 34px | 安全区底部边距 |
7.9 圆角系统
| 级别 | 值 | 用途 |
|---|---|---|
| 无 | 0px | 全屏元素 |
| sm | 8px | 标签、小元素、输入框 |
| md | 12px | 卡片、面板、Toast |
| lg | 16px | 纠偏面板顶部 |
| 胶囊 | 999px | 按钮、胶囊按钮 |
7.10 暗黑模式完整映射
| 元素 | 亮色 | 暗色 | 说明 |
|---|---|---|---|
| 页面背景 | #FAFAFA | #121212 | 主背景 |
| 次级背景 | #F5F5F5 | #1E1E1E | 卡片区背景 |
| 卡片背景 | #FFFFFF | #1E1E1E | 卡片、面板 |
| 状态条毛玻璃 | rgba(255,255,255,0.7) | rgba(30,30,30,0.7) | 状态条 |
| 纠偏面板毛玻璃 | rgba(255,255,255,0.8) | rgba(30,30,30,0.8) | 纠偏面板 |
| 主文字 | #212121 | #E0E0E0 | 主文字 |
| 次要文字 | #616161 | #9E9E9E | 辅助说明 |
| 分割线 | #E0E0E0 | #333333 | 分割、边框 |
| 主色 | #4CAF50 | #66BB6A | 提亮一档 |
| 辅色 | #2196F3 | #42A5F5 | 提亮一档 |
| 强调 | #FF9800 | #FFA726 | 提亮一档 |
| 中性 | #9E9E9E | #BDBDBD | 提亮一档 |
| 胶囊渐变 | linear-gradient(135deg, #4CAF50, #66BB6A) | linear-gradient(135deg, #66BB6A, #81C784) | 提亮 |
| 背景微光 | rgba(76,175,80,0.04) | rgba(102,187,106,0.06) | 提亮且增强 |
| 状态光(绿) | rgba(76,175,80,0.8) | rgba(102,187,106,0.8) | 提亮 |
| 状态光(蓝) | rgba(33,150,243,0.8) | rgba(66,165,245,0.8) | 提亮 |
| 状态光(橙) | rgba(255,152,0,0.8) | rgba(255,167,38,0.8) | 提亮 |
| 阴影 | rgba(0,0,0,0.06-0.12) | rgba(0,0,0,0.3-0.5) | 更深 |
| Toast 背景 | rgba(33,33,33,0.9) | rgba(255,255,255,0.95) | 反转 |
| Toast 文字 | #FFFFFF | #212121 | 反转 |
| 遮罩 | rgba(0,0,0,0.4) | rgba(0,0,0,0.6) | 更深 |
暗黑模式规则:
- 跟随系统暗黑模式自动切换
- 主色/辅色/强调色统一提亮一档(500→400),确保暗背景上的可读性
- 阴影更深(透明度更高),因为暗背景需要更强对比
- 背景微光增强(透明度从 0.04 提升到 0.06),补偿暗色下的呼吸感
- Toast 反转配色(亮色用深底白字,暗色用亮底深字)
7.11 视觉设计令牌汇总
所有视觉参数汇总为设计令牌,便于开发统一引用:
:root { /* 主色 */ --color-primary: #4CAF50; --color-primary-light: #66BB6A; --color-primary-dark: #43A047;
/* 辅色 */ --color-secondary: #2196F3; --color-secondary-light: #42A5F5;
/* 强调 */ --color-accent: #FF9800; --color-accent-light: #FFA726;
/* 中性 */ --color-neutral: #9E9E9E; --color-error: #F44336;
/* 背景 */ --bg-page: #FAFAFA; --bg-card: #FFFFFF;
/* 文字 */ --text-primary: #212121; --text-secondary: #616161;
/* 阴影 */ --shadow-sm: 0 2px 8px rgba(0,0,0,0.06); --shadow-md: 0 4px 16px rgba(0,0,0,0.08); --shadow-lg: 0 8px 24px rgba(0,0,0,0.12);
/* 圆角 */ --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-pill: 999px;
/* 间距 */ --space-xs: 4px; --space-sm: 8px; --space-md: 12px; --space-lg: 16px; --space-xl: 20px; --space-2xl: 24px; --space-3xl: 34px;}
@media (prefers-color-scheme: dark) { :root { --color-primary: #66BB6A; --color-secondary: #42A5F5; --color-accent: #FFA726; --bg-page: #121212; --bg-card: #1E1E1E; --text-primary: #E0E0E0; --text-secondary: #9E9E9E; --shadow-sm: 0 2px 8px rgba(0,0,0,0.3); --shadow-md: 0 4px 16px rgba(0,0,0,0.4); --shadow-lg: 0 8px 24px rgba(0,0,0,0.5); }}8. 触觉与音效
本章定义震动模式和音效规范,实现多感官协同反馈。触觉与音效是果冻感和智能感的重要补充,让用户在视觉之外也能感知到系统的响应和学习。
8.1 触觉反馈系统
8.1.1 震动模式定义
| 震动模式 | 波形 | 时长 | 强度 | 小程序 API |
|---|---|---|---|---|
| 轻触 | 单次短振 | 10ms | 轻 | wx.vibrateShort({ type: 'light' }) |
| 确认 | 单次中振 | 20ms | 中 | wx.vibrateShort({ type: 'medium' }) |
| 强调 | 单次长振 | 50ms | 强 | wx.vibrateLong() |
| 双击确认 | 双次中振(间隔 50ms) | 20ms×2 | 中 | 自定义两次 vibrateShort |
| 心跳 | 单次极轻振(循环) | 10ms/1.2s | 极轻 | 循环 vibrateShort |
| 警告 | 三次短振(递增) | 10ms+15ms+20ms | 中→强 | 自定义三次 |
| 撤销 | 双次轻振(递减) | 15ms+10ms | 中→轻 | 自定义两次 |
8.1.2 场景震动映射
| 场景 | 震动模式 | 说明 |
|---|---|---|
| 胶囊按钮按下 | 轻触(10ms 轻) | 按下即反馈 |
| 胶囊按钮释放 | 轻触(10ms 轻,延迟 100ms) | 与果冻回弹同步 |
| 语音录制开始 | 确认(20ms 中) | 长按触发录音 |
| 语音录制结束 | 确认(20ms 中) | 松开停止录音 |
| 捕获完成 | 双击确认(20ms×2 中) | AI 判断完成 |
| 状态确认 | 确认(20ms 中) | 状态变更反馈 |
| ”记下了” | 轻触(20ms 轻) | 纠偏偏好写入 |
| 完成动作 | 双击确认(20ms×2 中) | 任务完成 |
| 拆小动作 | 确认(20ms 中) | 卡片翻转 |
| 稍后动作 | 轻触(10ms 轻) | 卡片淡出 |
| 标为重要 | 强调(50ms 强) | 重要标记 |
| 撤销操作 | 撤销(15ms+10ms 中→轻) | 摇晃撤销 |
| 拖拽开始 | 确认(20ms 中) | 进入拖拽模式 |
| 拖拽进入有效区域 | 轻触(10ms 轻) | 提示有效区域 |
| 拖拽释放(有效) | 双击确认(20ms×2 中) | 拖拽成功 |
| 拖拽释放(无效) | 轻触(10ms 轻) | 回弹提示 |
| 页面切换 | 轻触(10ms 轻) | 页面切换完成 |
| 思考心跳 | 心跳(10ms/1.2s 极轻) | AI 判断中 |
| 错误 | 警告(10ms+15ms+20ms 中→强) | 操作失败 |
| 接住待定 | 确认(20ms 中) | 需要用户确认 |
8.1.3 触觉约束
| 约束 | 值 | 说明 |
|---|---|---|
| 最小间隔 | 100ms | 两次震动最小间隔,避免连续震动 |
| 最大频率 | 6 次/分钟 | 非循环震动最大频率,避免震动疲劳 |
| 循环震动 | 心跳模式 1 次/1.2s | 仅思考心跳使用循环 |
| 总时长上限 | 5s 内累计震动 ≤ 200ms | 避免过度震动 |
| 用户可控 | 设置中可关闭 | 尊重用户偏好 |
| 静音模式 | 不影响 | 震动独立于系统静音 |
8.2 音效系统
8.2.1 音效定义
| 音效 | 声音描述 | 时长 | 音量 | 文件格式 |
|---|---|---|---|---|
| 完成”叮” | 清脆的金属敲击声 | 300ms | 30% | mp3 |
| 拆小”流水” | 轻柔的流水声 | 400ms | 20% | mp3 |
| 稍后”轻风” | 轻风吹过 | 400ms | 20% | mp3 |
| 重要”嗡” | 低沉的共鸣音 | 200ms | 25% | mp3 |
| 接住”啵” | 轻柔的气泡声 | 200ms | 20% | mp3 |
| 归并”滴” | 柔和的滴水声 | 200ms | 20% | mp3 |
| 错误”嗯” | 低沉的疑问音 | 400ms | 30% | mp3 |
| 记下了”叮咚” | 清脆的两音阶上行 | 400ms | 25% | mp3 |
| 页面切换”嗖” | 轻柔的空气滑动声 | 150ms | 15% | mp3 |
8.2.2 场景音效映射
| 场景 | 音效 | 说明 |
|---|---|---|
| 捕获完成(已接住) | 接住”啵” | 碎片丢进确认 |
| 捕获完成(已归并) | 归并”滴” | 归并到线程 |
| 完成动作 | 完成”叮” | 任务完成 |
| 拆小动作 | 拆小”流水” | 卡片翻转拆小 |
| 稍后动作 | 稍后”轻风” | 卡片淡出稍后 |
| 标为重要 | 重要”嗡” | 重要标记 |
| ”记下了”确认 | 记下了”叮咚” | 纠偏偏好写入 |
| 页面切换 | 页面切换”嗖” | 三页切换 |
| 错误 | 错误”嗯” | 操作失败 |
| 语音录制开始 | 无 | 仅触觉反馈,避免干扰 |
| 语音录制结束 | 接住”啵” | 与捕获完成一致 |
| 思考中 | 无 | 仅视觉(思考动画),避免持续音效 |
8.2.3 音效约束
| 约束 | 值 | 说明 |
|---|---|---|
| 时长上限 | ≤ 500ms | 所有音效不超过 500ms |
| 音量上限 | ≤ 30% | 不超过系统音量 30% |
| 同时播放 | 最多 1 个 | 同一时间只播放一个音效 |
| 防抖 | 500ms | 同一音效 500ms 内不重复 |
| 用户可控 | 设置中可关闭 | 默认开启 |
| 静音模式 | 尊重系统 | 系统静音时不播放 |
| 渐入渐出 | 50ms | 音效首尾渐入渐出,避免突兀 |
8.3 多感官协同
触觉、音效、视觉三者的协同映射,确保同一操作的多感官反馈一致。
8.3.1 协同映射表
| 操作 | 视觉 | 触觉 | 音效 |
|---|---|---|---|
| 按下按钮 | 果冻缩放 0.92 | 轻触 10ms | 无 |
| 释放按钮 | 果冻回弹 + 波纹 | 轻触 10ms(延迟 100ms) | 无 |
| 捕获完成 | 微光流动→状态光扩散 | 双击确认 20ms×2 | 接住”啵” |
| 完成动作 | 卡片飞出 + 绿色波纹 | 双击确认 20ms×2 | 完成”叮” |
| 拆小 | 卡片翻转 + 蓝色波纹 | 确认 20ms | 拆小”流水” |
| 稍后 | 卡片淡出 + 灰色波纹 | 轻触 10ms | 稍后”轻风” |
| 标为重要 | 边框发光 + 橙色波纹 | 强调 50ms | 重要”嗡" |
| "记下了” | 波纹扩散 + 文案浮现 | 轻触 20ms | 记下了”叮咚” |
| 页面切换 | 页面滑动 | 轻触 10ms | 页面切换”嗖” |
| 思考中 | 三点心跳动画 | 心跳 10ms/1.2s | 无 |
| 错误 | 红色 Toast | 警告 10+15+20ms | 错误”嗯” |
8.3.2 协同时序规则
多感官反馈的触发时序,确保感知同步而非混乱:
| 规则 | 说明 |
|---|---|
| 触觉优先 | 触觉反馈延迟最低(< 10ms),最先触发 |
| 视觉同步 | 视觉动效与触觉同时开始(按下即缩放) |
| 音效延迟 | 音效延迟 50-100ms 触发,避免与触觉叠加过载 |
| 波纹延迟 | 波纹扩散延迟 100ms,在果冻回弹开始后触发 |
| 文案延迟 | ”记下了”文案延迟 200ms,在波纹扩散后浮现 |
| 结束同步 | 所有反馈在 1.5s 内完成,不留尾巴 |
8.3.3 减少感官模式
对应用户设置的”减少动态”模式(见第 10 章),多感官反馈也需降级:
| 感官 | 默认 | 减少感官模式 |
|---|---|---|
| 视觉循环动画 | 呼吸/微光/悬浮 | 关闭 |
| 视觉交互动画 | 果冻回弹 400ms | 改为 150ms 线性 |
| 视觉波纹 | 波纹扩散 800ms | 关闭 |
| 触觉 | 完整震动模式 | 仅保留确认/错误两种 |
| 音效 | 完整音效 | 仅保留完成/错误两种 |
| 思考心跳 | 触觉心跳 | 关闭,仅保留视觉 |
8.4 小程序 API 适配
| 能力 | 推荐实现 | 限制 |
|---|---|---|
| 震动 | wx.vibrateShort / wx.vibrateLong | iOS 不支持自定义震动强度,仅 light/medium/heavy |
| 音效 | wx.createInnerAudioContext | 需预加载音频文件,注意内存占用 |
| 加速度 | wx.onAccelerometerChange | 需申请权限,后台不响应 |
| 音量 | InnerAudioContext.volume | 0-1 范围,受系统音量限制 |
小程序限制与应对:
- iOS 震动强度不可精细控制,用
type: 'light'/'medium'/'heavy'三档替代 - 音频文件需打包或 CDN 加载,总大小控制在 500KB 以内
- 震动 API 在部分 Android 机型上表现不一致,需做真机测试
- 音效播放有 50-100ms 延迟,与触觉/视觉的时序需在设计中预留缓冲
9. 交互流程
本章定义移动端核心交互的完整流程序列,对齐 prd.md 的状态模型、03-brainstorm.md 的 4 条核心路径和轻纠偏机制,使每个交互都有明确的步骤、反馈和状态变更。
9.1 核心交互概览
| 场景 | 用户动作 | 系统反馈 | 状态变更 | 说明 |
|---|---|---|---|---|
| 碎片捕获 | 点击/长按/上滑胶囊 | 微光流动 3s → 状态色波纹 + Toast”已接住” | → 原始碎片 → 判断后入状态 | 不跳转页面 |
| 下一步递回 | 滑动卡片 | 完成→卡片飞出;拆小→翻转显示更小任务 | 下一步 → 完成 / 更小下一步 | 不到 1s |
| 轻纠偏 | 点击纠偏按钮/滑动 | ”记下了”波纹动效 + 副文案 | 状态变更 + 偏好写回 | 偏好写回 |
| 晚间复盘 | 打开 App/点击推送 | 状态交还 + 明天第一步 + 学习成果 | 全天状态汇总 | 无责复盘 |
| 语音倾倒 | 长按胶囊录音 | 思考动画 → 拆分多个状态 | → 多个不同状态 | 情绪倾倒不等于任务爆炸 |
| 通知纠偏 | 通知上操作 | ”记下了”波纹 + 下次行为改变 | 偏好写回 | 按钮即偏好学习 |
9.2 碎片捕获完整流程
对齐 03-brainstorm.md 路径二和路径四,碎片捕获是移动端最核心的交互。
文字捕获流程:
步骤1: 用户轻触胶囊按钮 → 胶囊果冻回弹 + 波纹 + 触觉轻震 → 输入框展开 + 键盘弹出(200ms 缓出) → 输入框占位文案:"随时丢"
步骤2: 用户输入文字,按发送 → 胶囊果冻回弹 + 触觉轻震 → 输入框收起 + 键盘收起(200ms 缓入) → 微光流动层显示:"接住了,正在帮你放好..."(0-300ms)
步骤3: AI 判断中(300ms-2.5s) → 微光流动动画:边缘光带缓慢流动 → 实时文案更新:"蕉不焦在帮你看看这件..." → 思考心跳触觉(10ms/1.2s 极轻)
步骤4: 判断完成(2.5s-3s) → 微光聚拢为状态色闪光 → 状态光扩散(2s) → Toast 显示状态文案 + 触觉双击确认 → 例:"已放进客户方案线程,不新增 Todo"(归并) → 例:"现在只做:打开文档写三个小标题"(下一步) → 例:"我不太确定是不是硬截止,你扫一眼"(待定)
步骤5: 反馈结束(3s-5s) → 状态光淡出 → Toast 2s 后自动消失 → 微光流动层淡出 → 胶囊恢复呼吸动画语音捕获流程:
步骤1: 用户长按胶囊 > 1s → 触觉中震 + 胶囊状态变色 → 左侧图标变为停止图标 → 录音波形动画显示 + 时长计数
步骤2: 用户说话(最长 60s) → 实时波形动画 → 时长计数递增
步骤3: 用户松开手指 → 触觉中震 + 录音停止 → 语音转写中:思考动画显示"蕉不焦在听..." → 转写完成 → 进入文字捕获流程的步骤3(AI 判断)截图捕获流程:
步骤1: 用户上滑胶囊 > 50px → 胶囊上滑遮罩显示"截图"文案 → 松开后唤起截图/相册选择
步骤2: 用户选择截图 → 截图预览 + 思考动画"蕉不焦在看看这张图..." → OCR 识别中
步骤3: 识别完成 → 进入文字捕获流程的步骤3(AI 判断) → 若识别到截止信息(如"明天中午前"): → 触发高代价轻确认(见 9.5) → 若为普通资料: → 归并到线程或冷冻9.3 下一步递回完整流程
对齐 prd.md 的递交层”同一时刻只主动递交一个动作”。
通知递回流程:
步骤1: 系统判断时机合适(如下午专注时段) → 发送微信模板消息通知 → 通知格式:"蕉不焦 | 打开客户方案文档,写三个小标题" → 通知按钮:[完成✓] [拆小] [稍后] [🔥]
步骤2: 用户点击通知 → 进入聚焦页 → 动作卡片滑入(200ms 缓出) → 智能体状态层:"蕉不焦递回一步..."(1s 后淡出) → 卡片悬浮微浮动启动完成动作流程:
步骤1: 用户右滑卡片 > 30% 屏宽 → 卡片跟随位移 + 绿色遮罩 + "完成✓"文案 → 触觉轻震提示达到阈值
步骤2: 用户松开手指 → 卡片向右飞出 + 淡出(300ms) → 触觉双击确认 + 完成"叮"音效 → 状态变更:下一步 → 已完成 → 偏好写回:同类任务完成时间记录
步骤3: 下一个任务滑入(300ms 缓出) → 若有下一个下一步:新卡片滑入 → 若无下一个:显示"暂时没有任务,去捕获一些吧~"拆小动作流程:
步骤1: 用户上滑卡片 > 30% 屏高 → 卡片跟随位移 + 蓝色遮罩 + "拆小"文案
步骤2: 用户松开手指 → 卡片 Y 轴翻转 180°(400ms) → 触觉确认 + 拆小"流水"音效 → 翻转后显示更小任务 → "记下了"波纹 + 副文案"下次先拆小" → 偏好写回:同类任务动作粒度更小9.4 轻纠偏完整流程
对齐 prd.md 和 03-brainstorm.md 的 7 种纠偏动作,每种纠偏都有对应的移动端交互和偏好写回。
| 纠偏 | 移动端交互 | 系统反馈 | 状态变更 | 偏好写回 |
|---|---|---|---|---|
| 拆小 | 点击”拆小”按钮 / 上滑卡片 | ”记下了”波纹 + 更小动作 | 下一步 → 更小下一步 | 同类任务动作更小 |
| 稍后再出现 | 左滑卡片 → 选择”今天/明天/下周" | "记下了”波纹 + “下午再回来” | 下一步 → 稍后再出现 | 学习时段偏好 |
| 今天别推 | 点击”今天别推" | "收到”波纹 + “今天不再递” | 下一步 → 稍后再出现(今天) | 降低当天频率 |
| 这不是任务 | 左滑卡片 → “归档" | "归档了”波纹 + “下次类似不进 Todo” | 下一步 → 已归档 | 改善分类 |
| 这很重要 | 长按卡片 / 点击”🔥" | "已标重要”波纹 + 卡片发光 | 提高优先级 | 提高同类优先级 |
| 语气保守 | 纠偏面板输入”语气保守一点" | "记下了”波纹 + 改写草案 | 回复草案更新 | 学习联系人偏好 |
| 这不是截止 | 纠偏面板输入”这不是截止" | "记下了”波纹 + 改为资料 | 接住待定 → 归并/归档 | 改善截止识别 |
纠偏面板交互流程:
步骤1: 用户点击纠偏入口(卡片上的"···"按钮) → 遮罩淡入(200ms) → 纠偏面板从底部滑入(300ms 缓出) → 面板显示标题:"这件事你要怎么处理?" → 6 个纠偏按钮 + 一句话输入框
步骤2: 用户选择纠偏方式 方式A: 点击按钮(如"拆小") → 按钮果冻回弹 + 波纹 → 触觉轻震 → 面板退出(300ms 缓入) → "记下了"波纹在卡片位置绽放 → 副文案浮现:"下次先拆小"
方式B: 输入一句话(如"语气保守一点") → 输入框聚焦 + 键盘弹出 → 用户输入 + 点击发送 → 思考动画"蕉不焦在改..."(2-5s) → 改写完成 → "记下了"波纹 + 副文案
步骤3: 偏好写回 → 偏好写入对应层级(全局/用户/线程) → 下次同类任务生效 → 复盘页展示学习成果9.5 高代价轻确认流程
对齐 prd.md 4.2 节高代价轻确认,硬截止/对外承诺/删除等不黑箱处理。
触发条件:硬截止 / 对外承诺 / 删除或归档 / 合同付款提交发送 / 客户沟通
轻确认流程:
步骤1: AI 识别为高代价事项 → 微光流动颜色偏向橙色(注意色) → Toast:"这像对外承诺,我先给保守回复草案" → 不直接入状态,等待用户确认
步骤2: 显示轻确认 方式A: 简单问题 → "这是今天必须回复的承诺吗?" → [是] [不是,先记为等待]
方式B: 草案确认 → 显示回复草案 → [发送] [改一下] [不发了]
方式C: 状态选择 → "归档还是稍后再出现?" → [归档] [稍后再出现]
步骤3: 用户确认 → 果冻回弹 + "记下了"波纹 → 状态入库 → 偏好写回(如适用)关键约束:
- 轻确认最多一个问题或一组短按钮,不是审批流
- 轻确认不阻塞用户继续捕获其他碎片
- 用户可跳过轻确认(转为接住待定)
9.6 语音倾倒流程
对齐 03-brainstorm.md 路径四,情绪倾倒不等于任务爆炸。
步骤1: 用户长按胶囊录音 → "我有点乱,报告没做,宿舍费好像要交,还有英语也没背。"
步骤2: 语音转写 + AI 拆分 → 思考动画"蕉不焦在帮你分开,不会全变成今日 Todo..."(2-5s) → 后台拆分为多个碎片: - 报告下一步 - 宿舍费待确认 - 英语冷冻到本周计划 - 情绪释放(不进 Todo)
步骤3: 多状态反馈 → 多个状态光依次闪烁(绿/橙/灰蓝/灰) → Toast 汇总:"接住 4 件,1 件下一步,1 件待定,1 件冷冻,1 件已释放"
步骤4: 前台只回来一步 → 动作卡片显示:"现在只做:打开群文件,确认你负责哪一页" → 其余事项在后台等待/冷冻/待定
步骤5: 用户可即时纠偏 → 用户说:"宿舍费今晚截止" → 触觉确认 + "记下了"波纹 → 宿舍费改为高优先级 + 今晚提醒 → 报告第一步仍保留9.7 晚间复盘流程
对齐 03-brainstorm.md 路径六,Zeigarnik 显式收束。
步骤1: 晚间 21:00 用户打开 App(或点击推送) → 复盘页淡入 → 温暖问候:"🌙 今天已经很好了" → 数字滚动动画:接住 12 / 归并 5 / 冷冻 3 / 等待 2
步骤2: 状态交还 → "今天接住 12 件,3 件变下一步,5 件归并线程,2 件等待,2 件冷冻。" → 不出现"未完成"负面词汇 → 状态流转图示动画
步骤3: 学习成果展示 → 智能体状态层:"今天记下了 3 条偏好" → "写作类上午不推、客户回复更保守、截图优先当资料"
步骤4: 明天第一步确认 → "明天只看这一步:打开客户方案,写第一段标题" → 按钮:[明天上午别推了] [收到]
步骤5: 用户反馈 → 点击"明天上午别推了" → "记下了"波纹 + "明天上午不推" → 偏好写回:写作类任务上午不推 → 点击"收到" → 复盘结束 + 返回首页 → 触觉双击确认9.8 异常处理
| 场景 | 用户感知 | 系统行为 | 触觉/音效 |
|---|---|---|---|
| 网络断开 | Toast”离线中,已保存到本地” | 本地队列,联网后同步 | 警告震动 |
| 捕获失败 | Toast”稍等片刻,再试试” | 重试 3 次,失败后提示手动输入 | 错误”嗯” |
| 智能体不确定 | 进入”接住待定”状态 + 橙色状态光 | 轻确认弹窗 | 确认震动 |
| 用户连续操作快 | 无感知 | 防抖 500ms,避免重复提交 | 无 |
| AI 判断超时 | Toast”这件有点复杂,先接住了,稍后整理” | 转为后台处理,不阻塞用户 | 轻触 |
| 思考动画超时 | 文案变为”还在想,稍等一下…” | 继续后台处理,不强制等待 | 无 |
| 语音录制失败 | Toast”没听清,再说一次?“ | 重新开始录制 | 错误”嗯” |
| 截图 OCR 失败 | Toast”看不太清,手动输入?“ | 提供手动输入入口 | 轻触 |
| 存储空间不足 | Toast”空间不够了,清理一下?“ | 引导清理归档 | 警告震动 |
9.9 防骚扰机制
对齐 prd.md 6.1 节防骚扰机制:
| 规则 | 说明 |
|---|---|
| 同一任务只通知一次 | 无论是否完成,同一任务不重复通知 |
| 3 次不回应降频 | 用户 3 次不回应同类通知,系统自动降低该类型频率 |
| ”今天别推”当天生效 | 点击后当天不再递回同类任务 |
| 通知不展示任务总数 | 不显示”还有 17 个任务”,避免压力 |
| 晚间 21:00 后不主动通知 | 除非硬截止,否则晚间不递回 |
| 用户关闭通知理解为信号 | 不催促用户开启通知 |
10. 适配与无障碍
本章定义屏幕适配、暗黑模式、无障碍和减少动态的完整规范。暗黑模式完整色值映射见第 7.10 节。
10.1 屏幕尺寸适配
| 设备 | 宽度 | 布局调整 | 胶囊按钮 | 卡片间距 |
|---|---|---|---|---|
| Android 小屏 | 360px | 紧凑布局,减少留白 | 高度 52px,字号 15px | 12px |
| iPhone SE | 375px | 紧凑布局,胶囊按钮稍小 | 高度 52px,字号 15px | 12px |
| iPhone 14 Pro | 390px | 标准布局 | 高度 56px,字号 16px | 16px |
| iPhone 14 Pro Max | 430px | 舒适布局,可展示更多信息 | 高度 56px,字号 16px | 16px |
| Android 大屏 | 450px+ | 舒适布局,卡片最大宽 420px 居中 | 高度 56px,字号 16px | 20px |
适配规则:
- 所有布局基于 375px 基准设计,其他尺寸等比缩放
- 卡片最大宽度 420px,大屏居中显示,避免过宽难读
- 胶囊按钮始终全宽(减去左右边距),保证触达性
- 安全区适配:顶部状态栏 + 底部 Home Indicator
10.2 暗黑模式
暗黑模式完整色值映射见 第 7.10 节。
切换规则:
- 跟随系统暗黑模式自动切换(
prefers-color-scheme) - 用户也可在设置中手动指定(跟随系统/强制亮色/强制暗色)
- 切换时所有颜色平滑过渡(200ms 缓入缓出)
- 切换时动画暂停,切换完成后恢复
10.3 无障碍
| 需求 | 实现 | WCAG 级别 |
|---|---|---|
| 色盲友好 | 颜色 + 图标双重提示(见状态色映射表 7.2) | AA |
| 字体大小 | 跟随系统设置,最大支持 200% | AA |
| 屏幕阅读器 | 按钮语义化(aria-label),状态可播报,动效有文字替代 | AA |
| 减少动态 | 设置中可关闭呼吸、微光、果冻动画,保留必要过渡 | AA |
| 触控热区 | 所有可点击元素最小 44×44px | AA |
| 对比度 | 文字与背景对比度 ≥ 4.5:1(正文),≥ 3:1(大文字) | AA |
| 焦点可见 | 键盘/遥控器导航时焦点可见(2px 主色边框) | AA |
| 语义化结构 | 使用语义化标签(header/main/nav/button) | A |
屏幕阅读器播报规则:
| 元素 | 播报内容 |
|---|---|
| 胶囊按钮 | ”捕获入口按钮,轻触输入,长按语音” |
| 动作卡片 | ”现在只做:[动作内容]。右滑完成,上滑拆小,左滑稍后” |
| 纠偏按钮 | ”[按钮名称]按钮” |
| Toast | 自动播报 Toast 文案 |
| 状态光 | 不播报(纯视觉) |
| 思考动画 | ”蕉不焦正在思考” |
10.4 减少动态模式
| 动效 | 默认 | 减少动态 | 说明 |
|---|---|---|---|
| 胶囊呼吸 | 3s 循环 | 关闭 | 装饰性 |
| 背景微光 | 8s 循环 | 关闭 | 装饰性 |
| 果冻回弹 | 400ms 弹性 | 改为 150ms 线性 | 保留反馈,降低弹性 |
| 微光流动 | 3s | 改为即时状态色显示(无流动) | 保留状态反馈 |
| 思考动画 | 1.2s 循环 | 保留(功能性动画) | 必要的状态提示 |
| 卡片悬浮 | 4s 循环 | 关闭 | 装饰性 |
| 波纹扩散 | 800ms | 关闭 | 装饰性 |
| 数字滚动 | 500ms | 改为即时显示 | 装饰性 |
| 页面切换 | 200ms | 保留(150ms 缓入缓出) | 必要的过渡 |
减少动态联动:
- 触觉和音效也降级(见第 8.3.3 节)
- 仅保留功能性反馈(确认/错误),关闭装饰性反馈
- 呼吸/微光/悬浮全部关闭,界面变为静态
10.5 微信小程序适配约束
| 约束 | 说明 | 应对 |
|---|---|---|
| 包大小限制 | 主包 2MB,分包 20MB | 音频文件放 CDN 或分包 |
backdrop-filter 兼容 | 部分 Android 机型不支持 | 降级为半透明纯色背景 |
| 动画性能 | 复杂动画可能卡顿 | 用 CSS/wxs 实现,避免 JS 驱动 |
| 手势限制 | 无原生 Force Touch | 暂不实现 |
| 返回手势冲突 | 右边缘左滑与系统返回冲突 | 页面切换用左边缘右滑 |
| 音频延迟 | 50-100ms 播放延迟 | 设计时预留时序缓冲 |
| 震动差异 | iOS 仅三档强度 | 用 light/medium/heavy 替代自定义 |
11. 附录
11.1 术语表
| 术语 | 说明 |
|---|---|
| 胶囊按钮 | 底部悬浮的大按钮,主要捕获入口,带呼吸动画 |
| 动作卡片 | 聚焦页中央的卡片,显示”现在只做…” |
| 状态条 | 顶部轻状态条,显示今日已接住数量 |
| 状态光 | 捕获后边缘闪烁的光效,颜色表示状态 |
| 滑动操作 | 卡片上的手势操作(完成/拆小/稍后/重要) |
| 智能体状态层 | 显示 AI 判断过程的微光流动 + 实时文案区域 |
| 微光流动 | AI 判断过程的视觉表达,3 秒内边缘微光缓慢流动 |
| ”记下了”动效 | 纠偏后波纹扩散 + 偏好说明文案的确认动效 |
| 果冻按钮 | 带弹性回弹触感的按钮,按下缩放 0.92 + 弹性回弹 |
| 呼吸感 | 界面元素轻微缩放循环,暗示”随时可点” |
| 智能感 | AI 判断过程可见但不打扰的设计基调 |
| 接住 | 碎片被系统接收并保存到 Todo 底座 |
| 归并 | 将碎片放入已有线程,不新增 Todo |
| 冷冻 | 有价值但近期不做的碎片,不提醒,30 天后复盘 |
| 递交/递回 | 系统将下一步动作推送给用户,同一时刻只递一步 |
| 收束 | 晚间显式交还沉淀结果,释放大脑对未完成事项的追踪 |
| 接住待定 | AI 不确定时,不黑箱处理,交给用户轻扫一眼 |
| 轻纠偏 | 一句话、一个按钮、一次滑动完成纠偏,成本趋近于零 |
| 轻确认 | 高代价事项不黑箱处理,前台最多一个问题或一组短按钮 |
| 沉淀 | 碎片经智能体判断后,被归并、冷冻、等待、归档或变为下一步 |
| 下一步 | 当前能开始的一小步,格式”现在只做:[动词] [对象] [边界]“ |
| 状态区域 | 拖拽场景中底部浮现的 4 个状态变更热区 |
| 果冻回弹 | 按下缩放 0.92 后释放,弹性曲线回弹到 1.0 |
11.2 状态色速查
| 状态 | 色值 | 图标 |
|---|---|---|
| 原始碎片 | #BDBDBD | ○ |
| 下一步 | #4CAF50 | ▶ |
| 等待 | #90A4AE | ⏸ |
| 归并线程 | #2196F3 | ⇄ |
| 稍后再出现 | #9E9E9E | ◐ |
| 冷冻 | #B0BEC5 | ❄ |
| 接住待定 | #FF9800 | ? |
| 已归档 | #E0E0E0 | ✓ |
11.3 手势速查
| 手势 | 主要用途 |
|---|---|
| 轻触 | 按钮触发 |
| 长按 | 语音录制、标为重要 |
| 双击 | 快速完成 |
| 上滑 | 截图输入、拆小 |
| 下滑 | 显示状态条、刷新 |
| 左滑 | 稍后、归档 |
| 右滑 | 完成、页面切换 |
| 拖拽 | 排序、状态区域 |
| 边缘滑动 | 页面切换 |
| 双指捏合 | 折叠/展开 |
| 摇晃 | 撤销 |
11.4 动效曲线速查
| 曲线 | cubic-bezier | 用途 |
|---|---|---|
| 弹性 | cubic-bezier(0.34, 1.56, 0.64, 1) | 果冻回弹 |
| 缓入缓出 | cubic-bezier(0.4, 0, 0.2, 1) | 页面切换 |
| 缓出 | cubic-bezier(0.0, 0, 0.2, 1) | 元素进入 |
| 缓入 | cubic-bezier(0.4, 0, 1, 1) | 元素退出 |
11.5 触觉与音效速查
| 操作 | 触觉 | 音效 |
|---|---|---|
| 按下按钮 | 轻触 10ms | 无 |
| 释放按钮 | 轻触 10ms(延迟 100ms) | 无 |
| 捕获完成 | 双击确认 20ms×2 | 接住”啵” |
| 完成动作 | 双击确认 20ms×2 | 完成”叮” |
| 拆小 | 确认 20ms | 拆小”流水” |
| 稍后 | 轻触 10ms | 稍后”轻风” |
| 标为重要 | 强调 50ms | 重要”嗡" |
| "记下了” | 轻触 20ms | 记下了”叮咚” |
| 页面切换 | 轻触 10ms | 页面切换”嗖” |
| 思考中 | 心跳 10ms/1.2s | 无 |
| 错误 | 警告 10+15+20ms | 错误”嗯” |
| 撤销 | 撤销 15+10ms | 无 |
11.6 组件尺寸速查
| 组件 | 关键尺寸 | 圆角 |
|---|---|---|
| 胶囊按钮 | 高 56px,全宽 - 40px | 999px |
| 动作卡片 | 宽 屏宽 - 40px,最小高 200px,内边距 24px | 12px |
| 状态条 | 高 44px,全宽 | 无 |
| Toast | 最大宽 屏宽 - 80px,最小高 48px,内边距 12px 20px | 12px |
| 纠偏面板 | 全宽,按钮高 44px,间距 12px | 顶部 16px |
| 纠偏按钮 | 高 44px,3 列 × 2 行 | 12px |
| 输入框 | 高 40px | 8px |
| 状态光 | 宽 3px,扩散半径 60px | 无 |
| 思考动画 | 圆点直径 6px,间距 8px | 999px |
| 页面边距 | 左右 20px | - |
| 安全区底部 | 34px | - |
| 触控热区 | 最小 44×44px | - |
11.7 纠偏动作速查
| 纠偏 | 交互 | 反馈 | 偏好写回 |
|---|---|---|---|
| 拆小 | 点击按钮/上滑 | ”记下了” + 更小动作 | 同类动作更小 |
| 稍后 | 左滑 → 选时段 | ”记下了” + “下午再回来” | 时段偏好 |
| 今天别推 | 点击按钮 | ”收到” + “今天不再递” | 降低当天频率 |
| 这不是任务 | 左滑 → 归档 | ”归档了” + “下次不进 Todo” | 改善分类 |
| 这很重要 | 长按/点🔥 | “已标重要” + 发光 | 提高优先级 |
| 语气保守 | 输入一句话 | ”记下了” + 改写草案 | 联系人偏好 |
| 这不是截止 | 输入一句话 | ”记下了” + 改为资料 | 截止识别 |
11.8 对比度合规说明
本文档所有文字色值已验证 WCAG AA 对比度要求:
| 文字色 | 背景色 | 对比度 | 合规 |
|---|---|---|---|
#212121(主文字) | #FAFAFA(页面背景) | 16.1:1 | AAA |
#212121(主文字) | #FFFFFF(卡片背景) | 16.4:1 | AAA |
#616161(次要文字) | #FAFAFA(页面背景) | 5.8:1 | AA |
#616161(次要文字) | #FFFFFF(卡片背景) | 5.9:1 | AA |
#E0E0E0(暗色主文字) | #121212(暗色背景) | 15.3:1 | AAA |
#9E9E9E(暗色次要文字) | #121212(暗色背景) | 7.3:1 | AAA |
#FFFFFF(按钮文字) | #4CAF50(主色按钮) | 3.4:1 | AA(大文字) |
注意:#FFFFFF 白色文字在 #4CAF50 绿色按钮上对比度为 3.4:1,满足大文字(≥18px 或 bold ≥14px)的 AA 要求(3:1),按钮文字为 16px Medium 满足此条件。
11.9 相关文档
| 文档 | 说明 |
|---|---|
| 01-overview.md | 产品定位总览:Todo 底座、智能体减负、四个支柱 |
| prd.md | 产品需求文档:8 种状态模型、轻纠偏机制、沉淀引擎 |
| technical-spec.md | 技术设计文档:微信小程序技术选型、数据模型、API |
| 03-brainstorm.md | 操作路径:4 条核心路径、轻纠偏交互 |
| 05-deep-research.md | 学术理论:减负机制的理论支撑与 UX 规则 |
| 06-brand-naming-character.md | 品牌与数字人:人格化边界、话术规范 |
| assessment.md | 落地性评估 |
| 04-product-strategy.md | 产品策略 |