MusePi

MusePi GUI 设计规范

English | 中文

状态:活文档(2026-08-06 建立)——规定 packages/gui / packages/desktop-web设计风格与交互标准(长什么样、怎么动、怎么组织)。与实现同步,实现文件为准。

实现契约、daemon RPC 形状、踩坑记录与验证方法见 docs/gui-implementation.md(2026-08-06 从本文件拆出)。早期线稿/架构稿(gui-prototype / gui-architecture / gui-migration)已删除——实现早已交付,以本文档与 gui-implementation 为准。

修改约定:改实现时同步本文件;发现本文档与代码不一致时,以代码为准并更新本文档。

i18n 契约(desktop-web/src/i18n)

0. 树/轨迹术语表(2026-08-21 规范化,消除命名错位)

术语 指代 组件/承载 备注
会话列表 左侧栏上按 分组/项目/日期/定时任务 聚合的会话(可多选/置顶/标记状态) SessionTree.tsx(文件名沿旧称,职责是列表) 不要叫它”会话树”;改文档/注释用「会话列表」
会话/消息树 会话内条目树:entry 的 id/parentId 层级、fork 分支、叶导航(TUI /tree 的语义) TUI tree-selector.ts + 会话级 session-manager.ts;GUI 侧载体 lib/message-tree.ts(buildMessageTree) 与「会话列表」是两层数据:列表管”选哪个会话”,消息树管”会话里怎么分支”
轨迹 当前会话的事件时间线:turn 分组 + Overview 时间轴 + 检视 + 跳转 右侧 ContextPanel「轨迹」tab(TrajectoryView + TimelineOverview) 时间投影轴;与消息树同源(都是同批 entries)但投影维度不同
/trace(规划) TUI 中消息树×轨迹的融合视图:树结构上叠加时间/成本/令牌列 TUI 新命令(复用 tree-selector 数据源) 方案见 docs/tui-trace-plan.md;/tree 保持纯结构投影

命名铁律:写代码/文档/UI 文案时,「会话树」只准指消息树(/tree 语义);会话语义的树一律叫「会话列表」;时间轴一律叫「轨迹」。

1. 布局体系

轨迹时间轴与检视(DSH Trajectory Overview parity,2026-08-21)

右栏 ContextPanel「轨迹」tab 的 TrajectoryView 顶部 = 固定 Overview 时间条(TimelineOverview.tsx,不随列表滚动):44px 圆角条带,内嵌 sunken 底 + 1px border;背景 = 时间域(全部 turn 的 [最早 start, 最晚 end]),两端 mono 起止时钟;每 turn 一段(traj-ov-segment,accent 26%→hover 42%,agent_end 冻结的回合时长命中时 = 完整回合跨度,否则 = 该轮末条事件),turn 内每个带 tsMs 的事件一落点(traj-ov-dot,颜色按 kind;user 点稍低错开)。

交互契约(与 DSH Overview 拖拽聚焦对齐,克制节奏):

CSS 命名:traj-ov-* / traj-focus-* / traj-inspector-* / traj-event--selected|--dim 全部归 gui-workspace.css 轨迹段。图标沿用 oc-icons sprite(聚焦 chip 用 target,勿用不存在的 focus-3)。

2. 设计 token 与主题

3. 动效规范(核心标准,2026-08-06 定稿)

场景 组件 机制
条件区块(显隐跟随另一选项) <Reveal open>(components/Reveal.tsx) useCollapse px 高度 240ms cubic-bezier(0.22,1,0.36,1) + 外层 160ms 淡入;关闭态 aria-hidden+inert;节点保持挂载
保持挂载但高度变化(tab 切换/列表增长) <HeightMorph morphKey>(components/HeightMorph.tsx) 渲染期捕获旧高度→新内容提交→高度过渡→settle auto;同一外层 160ms 淡入按 key 重启;形变期间容器 overflow:hidden 裁剪内容,否则新内容瞬间铺满(溢出钉住的矮盒子)、只看到盒子边缘在动=”无动画”;settle 后恢复;高度不变时(|target-prev|<1,如设置 section 切换的固定高度滚动容器)跳过钉住/裁剪只保留淡入——否则滚动条消失 300ms、滚动被禁用;时长随高度差自适应 240→480ms(delta/6 封顶)——ease-out 曲线前端加载极狠,固定 240ms 的大展开(如供应商网格 2200px)读起来仍是快弹

4. 组件与设置模式

桌面子代理操作(2026-08-11, TUI Agent Hub 对等):daemon 新增 RPC agents.kill(abort + release tombstone→aborted)/agents.revive(ensureLive)/agents.chat(ensureLive + prompt steer,与 collab host 的 agent-cmd 同构,server.ts agents.list 旁)。GUI 右栏 ContextPanel 的 AgentsPanel 选中行后渲染 AgentControls 操作条(gui/src/components/AgentControls.tsx):running→停止、parked/aborted→复活、chat 输入框(Enter 发送),错误小字展示。collab guest 走 agent-cmd 帧,桌面走 RPC——两条路语义一致。SDK events.ts 的 agent-progress payload 注释修正为 SubagentProgressPayload 包装(daemon 实际发送形状)。RPC 实测:kill idle→{ok}+ref aborted、kill/revive 错误路径、chat→ensureLive+steer 生效;running 态 kill 时序窗口未抓到(step-3.7-flash 子代理完成过快),abort 路径与 collab host 同构。i18n 补全:schema 全部 UI 字符串覆盖 100% 可译项——标签/描述/选项标签/选项描述全量中文(新增 ~240 条手译,复用 coding-agent zh 78 条),仅剩专有名词(模型/供应商/音色/硬件/API key 名/数值)保持英文与 TUI 一致;zh-CN.ts 经 biome –write 全量格式化。

伙伴(Agent Companion,BitFun parity,2026-08-06)

5. i18n 与音效

5b. 动画与库选型(2026-08-07 评估)

5c. 参考资源(设计与实现对照)

资源 对照用途 备注
opencode(../opencode dev) 会话树/header/服务器实例/设置 v2 形态 音效三分类(agent/permissions/errors)是活动音效配置的蓝本
openchamber(../openchamber v1.18.1) 三栏 shell/设置布局/通知模板/远程实例(SSH+端口转发) 设置页形态主参考;消息局部选择悬浮/保存为图片/基于回答新会话(2026-08-07 已落地局部选择+保存图片,fork 模态未做)
bitfun(../bitfun main) 伙伴(Petdex/帧动画/mood)/SSH 远程工作区/审批 桌宠视觉与交互主参考
clawd-on-desk(/tmp/clawd-on-desk,rullerzhou-afk,AGPL) 桌宠浮窗布局/权限气泡/状态指示 内容驱动窗口设计参考(2026-08-11 分析):固定宽度 + 高度自适应(窗口宽度不变→无锚定裁剪);气泡堆布局优先级 下方→侧边(空间多侧,右优先)→角落;入场从桌宠侧滑入(translateX 60→0 弹簧)。「宽度先行」思想(尺寸稳定后再动效)已落地面板入场 gating
kimi-code(../kimi-code) 图标卡中卡 80.5%/点阵品牌背景/供应商网格 Dock 视觉对齐基准
ZCode 连接向导 4 步(SSH/Docker) ConnectDialog 步骤骨架
../ui-references/aicss/ AI 界面 CSS 配方(thinking/code-block/comparison-table…) 消息流细节对照
../ui-references/cuelume/ border-beam/ thinking-orbs/ 音效/光束/思维球参考 自研组件的灵感源
reactbits.dev(2026-08-07 起) 动画组件源码参考 已落地:CountUp/BlurText/ShinyText/SpotlightCard(全部零依赖变体);候选:字体粒子背景(需 WebGL,未采用)

5d. 设计缺口与跟进(2026-08-07 登记)

缺口 现状 补全设计草案 状态
plan 审批 3 选项 GUI 化 GUI ApprovalCard 仅 批准/拒绝(tool.approve/deny);TUI 有 批准并执行(新开会话)/批准并压缩上下文/批准并保持上下文——那是 xd://propose 设备流 → handlePlanApproval → 进程内 session.prompt 的 TUI 专属机制,daemon 的 approval-request payload 只有 {requestId, tool},无 plan 元数据,GUI 无对应 RPC ①daemon approval-request 对 plan 工具附加 plan 上下文(planFilePath/title/planExists,对齐 TUI 的 propose dispatch 形状);②新增 approve 模式参数(tool.approve 扩展 mode: "run"\|"compact"\|"keep");③GUI ApprovalCard 检测 tool === plan 显示 3 选项,默认保持上下文;④桌宠审批卡同源 登记待排期
基于回答开始新会话模态 已有 fork(session.forkAt,非破坏性分叉);openchamber 是配置模态(模型/思考级别/智能体/说明/工作树/目标运行) 复用 ModelSelector/ThinkingSelector 组件做轻量模态,默认值=当前会话 登记待排期(可选)
Aurora/Particles 欢迎页背景 未采用(WebGL/常驻 rAF 违反 CSS 优先;DotMatrixMark 已是品牌视觉) 若用户想要”换氛围”,用 CSS 渐变动画替代或做切换开关 备选,不做

5f. 设计资产扩展点(插件化,2026-08-16 定稿)

内置设计资产以 token + 覆盖机制 组织,第三方/主题/动效包通过覆盖 token 扩展,不 fork 组件。

动效参数全表(gui.css :root)

Token 默认 用途 覆盖方式
--spring / --spring-snappy / --spring-bouncy spring(300,30)/(400,34)/(320,16) linear() 全部 UI morph 缓动 注入 CSS 覆盖 :root 变量
--gui-motion-menu-in/out 130ms 浮层菜单进出 同上
--gui-motion-chip 180ms 芯片/小元素 同上
--gui-motion-fade-in/out 160ms 淡入淡出 同上
--gui-motion-height / -max 240ms / 480ms 高度形变(HeightMorph delta/6 封顶) 同上
--gui-motion-blur 280ms blur 类动效(BlurText) 同上
--gui-motion-roll 240ms 滚动/翻页类 同上
--gui-motion-slide-y / -lg 6px / 10px 位移距离 同上
--gui-motion-blur-amt / -lg 8px / 24px 模糊量 同上
--gui-ease-out cubic-bezier(0.22,1,0.36,1) 高度/形变缓动别名 同上

覆盖机制:keyframes 与 transition 一律读 token(var(--gui-motion-*));动效包/主题注入样式表(加载在后 wins)覆盖变量即可整体换肤,无需改 keyframes。gui-motion-off(prefers-reduced-motion)全局禁用。

组件参数化(不 fork 即可定制)

新动效组件的接入契约

  1. 时值/位移/模糊 必须读 token,禁止裸值(裸值 = 无法被主题/动效包覆盖)。
  2. 进场动画走两阶段(useTwoPhaseEnteropacity:0 + 下一帧 --entered),防 Chromium 跳过 backdrop 采样。
  3. 尊重 gui-motion-off(禁用态直显,不播动画)。
  4. 复用 gui-menu-in/out / gui-fade-in/out keyframes 或同参数自建(命名 gui-<name>-in/out)。

    5e. 弹窗、键盘与选择器(2026-08-14 定稿)

弹窗动画与键盘优先级

浮窗定位规范(2026-08-25 定稿,openchamber v1.20.0 对照)

单一入口铁律:所有弹出浮层(菜单/dropdown/上下文菜单/颜色选择器/附件菜单)必须经 components/Pop.tsxlib/use-floating-menu.tsx(唯一实现:portal 到 React root + 全局互斥 + gui-menu-in/out 动画)。禁止手写 position: fixed/absolute 的弹出浮层——openchamber 用 @base-ui/react(floating-ui popper 内部引擎),我们手写同语义、不相依:

模型选择器(provider 复合键)

获取可用模型(自定义供应商表单)

看板画布与组光效

设置搜索与新建项目

5g. 近期落地特性(2026-08-24 → 2026-08-26)

早期章节之后落地的设计决策与模式;实现契约与坑在 docs/gui-implementation.md §18,分特性规格见所列文档。

5h. 吸收轮增补(2026-08-29)

6. 品牌图标(App Icon,2026-08-06 重设计)