Bark 界面规范

这份文档约束 Yumu 的每一个前端:macOS(SwiftUI)、Windows(WinUI 3)、将来的 Linux(GTK4),以及任何预览页或新壳。目标只有一句话:换一台电脑打开 Yumu,除了字体和窗口边框,看到的是同一个产品。

平台只决定三件事:字体、窗口边框与系统控件的手感、系统级弹窗(文件选择器、权限)。其余一切——布局、层级、颜色、间距、动效、文案、交互顺序——由本文与 bark/tokens/ 决定,任何端不得自行发挥。

可交互的效果演示见 bark/preview/:index.html 是三个布局方向的选版页,spec.html 是令牌与组件演示。用 python3 -m http.server --directory bark/preview 起个静态服务再打开,直接双击文件加载不到共用脚本。


0. 已定的方向

三个布局方案(见 bark/preview/)里选定了素木,并吸收森林的两点:侧栏带像素图标,标签栏用下划线式(带数量角标)。没有封面大图,因为大多数实例不是整合包、没有美术资源;头部的分量靠「大图标 + 大标题 + 右侧数据带 + 一排按钮」撑起来。macOS 应用已按此实现,apps/macos 就是这份规范的参照物。

1. 四条原则

原则一句话判断标准
一眼看懂任何页面 3 秒内知道自己在哪、能做什么每页只有一个主操作按钮,用强调色;其余全是次级
一步到位用户想做的事,默认值已经填好,直接点新建实例不改任何项就能创建;拖入整合包不问任何问题
高级藏起来高级功能全部存在,但默认看不见高级项在「更多」菜单、折叠区或设置页里,永不出现在主路径
动起来才算完成每个状态变化都有过渡,没有闪变列表增删、页面切换、进度、成功反馈都走 Bark 动效令牌

冲突时按这个顺序取舍:一眼看懂 > 一步到位 > 高级藏起来 > 动效。


2. 窗口结构

所有端用同一个两栏结构,第三栏按需出现。

┌─────────────┬────────────────────────────────────────────┐
│  侧栏        │  内容区                                     │
│  实例列表    │  标题区(图标、名称、副标题、次级操作)         │
│             │  分段切换(概览 · 模组 · 资源 · 日志)         │
│             │  页面内容                                   │
│  ─────────  │                                            │
│  导入进度    │                                            │
│  账号栏      │  底栏:状态(左)  主操作「开始游戏」(右)      │
└─────────────┴────────────────────────────────────────────┘

3. 页面清单

每一页按同一个模板写:目的、主操作、次操作、空状态、加载、进度、错误。缺一项就是没设计完。

3.1 实例列表(侧栏)

3.2 实例详情

3.3 空状态(没有实例)

3.4 新建实例(Sheet,宽 440)

3.5 整合包浏览器(Sheet,宽 720 × 540)

3.6 模组页 / 资源页

3.7 账号栏(侧栏底部)

3.8 设置(窗口菜单或 ⌘, / Ctrl+,)

3.9 存档

3.10 日志与崩溃

3.11 欢迎页(首次启动)

3.12 关于(设置里的一组)

3.13 导入进度与崩溃报告


4. 渐进披露:高级功能怎么藏

三层,从外到里:

层在哪放什么例子
直接可见页面上90% 用户每次都用的开始游戏、新建、导入、搜索模组
一次点击「···」菜单、右键、折叠区偶尔用、懂的人才用打开文件夹、复制实例、加载器版本、JVM 参数
设置页偏好设置装好后几乎不再碰下载源、代理、Java 列表、强调色

规则:

  1. 默认值必须能直接用。没有一个高级项是「不填就跑不起来」的。
  2. 折叠区记住展开状态(每个表单单独记),但新用户第一次看到的一定是折叠的。
  3. 不做「专家模式」总开关。那是把设计责任推给用户。
  4. 高级项展开后依然用同一套控件与间距,不换成「技术风」。
  5. 任何高级项都带一句说明文字(text.secondary,type.callout),说明不写术语,写后果:「内存越大加载越快,但不要超过物理内存的一半。」
  6. 破坏性操作永远在菜单最底部、用危险色、二次确认,确认按钮写明动作(「删除实例」不写「确定」)。

5. 组件

组件尺寸用令牌表达,三端的实现必须对上这张表。所有尺寸单位是逻辑像素(pt / dip)。

5.1 按钮

层级填充文字高度圆角用途
主accent.defaulttext.onAccent28 / 大 36radius.md每页一个
次surface.elevated + border.subtletext.primary28radius.md其他操作
文字无accent.default28radius.md行内、低优先
危险status.dangerTintstatus.danger28radius.md删除、移除

状态:悬停加 surface.hover 叠层;按下缩放 0.97(quick);禁用 40% 不透明度且不响应悬停;聚焦画 2px accent 外环,偏移 2。

5.2 列表行

高 36(紧凑 28),左右内边距 space.md,行间无分隔线,用 space.xs 间隔。选中 accent.tint 底 + radius.sm。悬停 surface.hover。

5.3 卡片

surface.default 底,radius.lg,内边距 space.lg,无边框,elevation.raised 只在悬停时出现(quick)。

5.4 分段控件

高 28,surface.sunken 轨道,选中块 surface.elevated + elevation.raised,选中块位移用 standard。

5.5 输入框与搜索框

高 28,surface.sunken 底,radius.sm,无边框;聚焦时底变 surface.default 并画 2px accent 外环。搜索框左侧放大镜图标,右侧有内容时出现清除按钮。

5.6 进度

5.7 状态点与标签

状态点 8 × 8 圆:运行 success,安装 accent,警告 warning,错误 danger。运行中的点以 2 秒周期轻微呼吸(0.6 ↔ 1 不透明度)。标签高 18,type.caption,surface.sunken 底,radius.sm,内边距 2 × 6。

5.8 开关

44 × 24,开为 accent,滑块位移 standard。

5.9 Sheet 与对话框

从窗口顶部中央下落,emphasized 进入、standard 退出,背后画 30% 遮罩并模糊。宽度固定:表单 440、浏览器 720、确认 360。Esc 关闭,回车触发主按钮。

5.10 Toast

右下角,surface.elevated + elevation.overlay,radius.lg,图标 + 一句话 + 可选动作,3 秒后自动消失。同时最多一条,后来的顶掉前面的。

5.11 拖放覆盖层

拖入窗口任何位置:整窗覆盖 ultraThinMaterial,中央虚线框 2px accent,图标 48 + 文字「拖入 .mrpack 即可导入」。quick 淡入淡出。

5.12 右键菜单与「···」菜单

系统原生菜单。条目顺序:常用操作 → 分隔线 → 次要操作 → 分隔线 → 破坏性操作。


6. 视觉令牌

全部在 bark/tokens/*.json,这里只说规则,不抄数值。


7. 动效

7.1 令牌

名称时长曲线Web 近似用途
instant0——减弱动态效果时的替代
quick150 msease-outcubic-bezier(0, 0, 0.2, 1)悬停、按下、开关、淡入淡出
standard≈ 300 msspring(response 0.35, damping 0.85)300ms cubic-bezier(0.2, 0.8, 0.2, 1)列表增删、面板切换、选中块位移
emphasized≈ 450 msspring(response 0.5, damping 0.8)450ms cubic-bezier(0.34, 1.3, 0.64, 1)导入完成、创建成功、Sheet 进入

7.2 场景对照

场景动效怎么动
悬停 / 离开quick背景叠层淡入
按下quick缩放 0.97
开关、复选quick滑块位移 + 颜色
选中列表行standard选中背景从旧行滑到新行(同一元素位移,不是两次淡入淡出)
切换详情standard旧内容淡出并上移 8,新内容淡入并从下 8 归位;标题区不动
分段切换standard选中块位移,内容交叉淡入淡出
列表新增standard从 0.96 缩放 + 淡入,其他行位移让位
列表删除standard淡出 + 缩放 0.96,其他行合拢
列表首次出现standard + 错峰每项间隔 20 ms,最多 6 项错峰,之后同步
Sheet 进入emphasized从上方 −16 下落 + 0.96 缩放 + 淡入,遮罩 quick
Sheet 退出standard反向,不过冲
进度更新standard进度条宽度插值,数字直接变
成功反馈emphasized目标元素 1 → 1.04 → 1 一次
错误反馈quick变色 + 文字出现。不抖动,不弹窗
拖放覆盖quick淡入淡出
Toaststandard 进 / quick 出从右下 +16 滑入
运行中状态点2 s 循环不透明度 0.6 ↔ 1,减弱动态时静止

7.3 规则

  1. 一次只动一个主体。 内容切换时标题区、侧栏、底栏不动。
  2. 动效表达因果。 从哪来、到哪去要和用户的动作对应:从右下角按钮触发的 Toast 出现在右下角。
  3. 持续性反馈不阻塞。 进度在原位显示,用户随时能干别的。
  4. 时长不随数量变。 100 个实例的列表和 3 个实例的列表动画一样长。
  5. 减弱动态效果(系统设置):所有位移、缩放、spring 退化为 instant,只保留淡入淡出,呼吸点静止。
  6. 不叠加动效:一个元素同一时刻只有一个动画,新动画打断旧动画而不是排队。
  7. 60 fps 是底线。动画只改 transform 与 opacity,不动 layout;列表超过 50 项时错峰关闭。

8. 文案


9. 状态与反馈

状态怎么做不这么做
加载 < 300 ms什么都不显示闪一下进度环
加载 ≥ 300 ms原位进度环 + 一句话(「正在获取版本列表…」)整页遮罩
列表加载骨架行 3 条,standard 淡入真实内容空白再突然出现
有进度线性进度条 + 数字,原位模态进度窗
成功emphasized 一次 + Toast 或原位文字弹窗说「成功」
可恢复错误原位红字说明 + 一个修复按钮弹窗
不可恢复错误系统 alert,标题「出了点问题」,正文翻译后的 kind + args显示原始错误串
离线搜索框下一行提示,已安装内容照常可用禁用整页

10. 可访问性与输入


11. 平台映射

概念macOS SwiftUIWindows WinUI 3Linux GTK4Web 预览
两栏结构NavigationSplitViewNavigationView (Left, compact 折叠)AdwNavigationSplitViewCSS Grid
侧栏材质.sidebarMica Alt.sidebar-panebackground.sidebar
主按钮.borderedProminentAccentButtonStyle.suggested-action.btn-primary
危险按钮role: .destructive自定义 Brush.destructive-action.btn-danger
分段控件Picker(.segmented)SelectorBarAdwViewSwitcher.segmented
Sheet.sheetContentDialogAdwDialog.sheet
确认.confirmationDialogContentDialogAdwAlertDialog.sheet.confirm
右键菜单.contextMenuMenuFlyoutGtkPopoverMenu自绘
Toast自绘InfoBar / TeachingTipAdwToast自绘
拖放.dropDestinationAllowDropGtkDropTargetdragover
减弱动态accessibilityDisplayShouldReduceMotionUISettings.AnimationsEnabledgtk-enable-animationsprefers-reduced-motion
强调色.tint 跟随系统SystemAccentColor令牌苔绿令牌苔绿
字体SF ProSegoe UI VariableCantarell / Inter系统字体栈
图标SF SymbolsFluent System IconsLucide内联 SVG

图标语义表(三套图标库各自对应):实例 cube / 模组实例 puzzle / 开始 play / 新建 plus / 导入 arrow-down-to-box / 整合包 package / 文件夹 folder / 搜索 magnifier / 设置 gear / 账号 person / 更多 ellipsis / 删除 trash / 运行中 circle.fill。


12. 提 PR 前自查

  1. 这页只有一个强调色按钮吗。
  2. 不改任何默认值能完成任务吗。
  3. 高级项在「···」、折叠区或设置里吗,带后果说明吗。
  4. 空状态、加载、进度、错误四种状态都画了吗,都有下一步动作吗。
  5. 每个状态变化都用了 Bark 动效令牌吗,减弱动态时正常吗。
  6. 尺寸、颜色、间距全部来自令牌吗,没有魔法数字吗。
  7. 三语文案都在 bark/i18n/ 里吗。
  8. 键盘走一遍能完成吗,Esc 和回车对吗。
  9. 深色模式看过了吗。
  10. 和另一端摆在一起,除了字体和窗口边框还有区别吗。

13. 禁止事项

源文件 bark/guidelines.md 更新于 2026-10-08