Skip to content

Latest commit

 

History

History
525 lines (367 loc) · 15.9 KB

File metadata and controls

525 lines (367 loc) · 15.9 KB

OpenCreator 视觉与组件规范

本文档整理当前 Web 客户端已经形成的视觉语言和组件规则,后续新增功能或页面时优先延续这些规范。对应实现主要位于:

  • apps/web/src/styles/tokens.css
  • apps/web/src/styles/app.css
  • apps/web/src/features/shell/OpenCreatorSidebar.tsx
  • apps/web/src/features/runs/Composer.tsx
  • apps/web/src/features/files/FileTopBar.tsx
  • apps/web/src/components/timeline/Timeline.tsx

1. 视觉基调

OpenCreator 当前是深色、低噪声、偏工具型的桌面应用界面。整体气质应该克制、轻量、专注,不做营销页式大卡片和强装饰。

核心方向:

  • 深色背景为主,避免大面积纯黑以外的单一色块。
  • 主题高亮统一使用暖橙色,不再使用紫色作为主高亮。
  • 面板、输入框、弹层使用轻微半透明和模糊,形成“玻璃感”,但不要过亮。
  • 交互动效保持短、轻,主要用于 hover、active、侧栏收起展开、toast 自动消失等。
  • 页面主体不要堆叠卡片。卡片只用于设置项、代码块、重复列表项、弹层和实际需要框定的工具区域。

2. Design Tokens

所有新增样式应优先使用 tokens.css 中的 CSS 变量。

颜色

用途 Token 当前值
全局背景 --bg #0e1116
对话区背景 --conversation-bg #090d12
侧栏背景 --sidebar #080d12
默认面板 --surface #16191e
次级面板 --surface-2 #1c2026
悬浮/活跃面 --surface-3 #24282e
弹层 --popover #24282e
主文字 --text #fcfdff
次文字 --muted rgba(252, 253, 255, 0.68)
弱文字/图标 --subtle rgba(252, 253, 255, 0.42)
主题色 --accent #AD4D1F
强主题色 --accent-strong #D86532
主题弱背景 --accent-soft rgba(173, 77, 31, 0.18)
主题辉光 --accent-glow rgba(173, 77, 31, 0.34)
危险 --danger #ff766e
警告 --warning #f0a866
成功 --success #72d6a7

使用规则:

  • 主操作按钮、选中态、当前项目 icon、输入框渐变描边都使用 --accent / --accent-strong
  • 非主操作按钮不要直接大面积使用主题色,只在 hover 或 selected 时轻微提示。
  • 警告、错误、成功状态使用专用 token,不要复用主题色表达状态。
  • 新增渐变建议使用 linear-gradient(180deg, var(--accent-strong), var(--accent)) 或现有发送按钮渐变。

字体

用途 Token
默认字体 --font
展示标题 --font-display
代码/路径/命令 --font-mono

使用规则:

  • 普通 UI 文本使用 Inter 系列,即 var(--font)
  • 初始页大标题、少量展示型标题可以使用 var(--font-display)
  • 文件路径、代码块、命令、技术状态使用 var(--font-mono)
  • 不使用 viewport 宽度动态缩放字体。
  • 字间距保持默认,不使用负字距。

圆角与阴影

  • 默认圆角:--radius: 10px
  • 常规按钮:7px10px
  • 图标圆按钮:圆形或 12px
  • 输入框主容器:桌面 22px,移动端 10px
  • 选项卡、工具按钮、文件树行:7px9px
  • 阴影使用深色低透明阴影,避免亮色厚重投影。

3. 全局布局

主应用布局:

  • 展开侧栏:248px + main
  • 右侧详情展开:248px + main + 320-400px
  • 收起侧栏:72px + main
  • 文件工作区内:对话区和文件区之间使用 6px resize handle。

页面结构原则:

  • 顶部 header 高度通常在 56px72px
  • 主内容区必须 min-width: 0min-height: 0,滚动交给内部区域。
  • 新功能页应使用 var(--bg)var(--conversation-bg) 作为底色,内容面板使用 var(--surface)
  • 宽屏不要把内容拉满,列表或正文区域建议设置合理 max-width

响应式:

  • 920px 以下主布局变为单列,详情面板隐藏。
  • 480px 以下侧栏导航变紧凑,部分文字可隐藏,输入框和工具栏允许换行。

4. 背景规范

对话默认态背景

动态背景只在“初始状态,无选中会话且暂无 timeline 内容”时展示。

当前参数:

  • 颜色:#AD4D1F#D86532#F0A866
  • speed: 0.28
  • streakCount: 3
  • density: 0.12
  • glow: 0.48
  • backgroundGlow: 0.34
  • opacity: 0.72
  • 禁用鼠标交互:mouseInteraction={false}

使用规则:

  • 开始对话后或加载已有会话时,背景切换为纯色 var(--conversation-bg)
  • 设置页中的“动态背景”开关关闭后,默认态也使用纯色背景。
  • resize 时背景底色必须保持 var(--conversation-bg),避免纯色和动态背景之间闪白或变色。
  • 动态背景只作为氛围,不能抢占文字层级。

对话底部渐变

输入框上方使用柔和遮罩:

  • .composer-wrap 承接底部背景。
  • .composer-wrap::before 向上延伸渐变,避免消息列表和输入框硬切。

新增对话页底部内容时,要保留这层渐变过渡。

5. 滚动条

全局滚动条:

  • 宽度和高度:6px
  • track 透明,不展示背景轨道。
  • thumb:rgba(145, 153, 168, 0.28)
  • hover:rgba(161, 170, 186, 0.38)
  • Firefox 使用 scrollbar-color: rgba(145, 153, 168, 0.3) transparent

使用规则:

  • 不要给局部滚动区域额外添加可见 track。
  • 侧栏项目列表滚动条尽量靠右,保持 .sidebar-project-tree 当前负 margin 和右侧 padding 的思路。
  • 新增滚动容器应保持 overflow: auto,避免整个页面滚动导致布局跳动。

6. 左侧导航

品牌区

展开态:

  • 使用 OpenCreator 文字品牌,不加载图片标识。
  • 品牌文字宽度约 124px,高度约 24px
  • 右侧展示收起按钮。

收起态:

  • 宽度 72px
  • 展示通用菜单图标。
  • hover 或 focus 时切换为展开 icon。

顶部主导航

当前入口:

  • 新对话
  • 搜索
  • 已安排
  • 插件

样式规则:

  • 行高固定:40px
  • icon 列宽:22px
  • icon 与文本间距:4px
  • 默认文字权重较高,项目标题除外。
  • hover 背景:rgba(252, 253, 255, 0.07)
  • 当前页可用主题弱背景和轻描边。

项目与会话

项目行:

  • 项目标题不加粗,使用 font-weight: 520
  • 当前项目只改变 folder icon 颜色为 var(--accent),项目整行不高亮。
  • 展开项目使用 FolderOpen,收起项目使用 Folder

会话行:

  • 与项目文本左侧对齐。
  • 高度固定,避免刷新前后间距跳动。
  • 只有选中的会话高亮,项目和会话不能同时整行高亮。
  • 选中会话使用 rgba(173, 77, 31, 0.14) 背景,不要添加高亮描边。

底部设置:

  • 与 logo 左侧视觉对齐。
  • icon 与文本间距保持紧凑。
  • “更新”入口当前已移除,后续没有真实功能不要提前放置入口。

7. 对话 Header

高度和布局:

  • 最小高度 64px
  • 左侧标题和项目名,右侧文件按钮与详情按钮。
  • 背景为深色透明渐变,并带 backdrop-filter: blur(18px)
  • 底部分割线使用低透明白色,不要过亮。

标题:

  • 对话标题 17pxfont-weight: 680
  • 项目名 12px,使用 --muted
  • 状态 pill 使用小号圆角胶囊,包含成功状态圆点。

工具按钮:

  • 图标优先使用 lucide-react
  • icon-only 按钮尺寸 32px
  • 文本按钮高度 32px,左右 padding 11px

8. 对话消息列表

消息区域:

  • 背景使用 var(--conversation-bg)
  • 有动态背景时 body 透明,无动态背景时 body 使用纯色。
  • 历史加载时使用半透明深色 overlay,不清空原有内容,避免闪白。

消息栈:

  • 最大宽度约 960px
  • 消息间距约 28px
  • 气泡最大宽度约 820px

用户消息:

  • 右对齐。
  • 不展示头像和昵称。
  • 气泡右上角保持直角:border-top-right-radius: 0
  • 背景为 surface-3 混合少量主题色。

Agent 消息:

  • 不展示头像和昵称,回复正文直接进入消息区。
  • 气泡左上角保持直角:border-top-left-radius: 0
  • 默认背景:rgba(36, 40, 46, 0.88)
  • 可使用轻微玻璃模糊和深色阴影。

过程消息:

  • reasoning、tool、diagnostic 等内容使用更小字号和更弱颜色。
  • 过程 details 保持扁平,不要做重卡片。
  • 命令和 payload 使用 monospace。

9. 输入框 Composer

主输入框是当前产品最重要的交互组件,新增页面如果需要任务输入,应复用该形态。

容器:

  • 类名:.opencreator-composer
  • 最大宽度:980px
  • 背景为深色半透明渐变。
  • 边框使用渐变色:白色亮边到暖橙色,再回到低透明白色。
  • backdrop-filter: blur(22px)
  • 桌面圆角 22px,移动端 10px
  • 不使用 focus 后的高亮边框。

textarea:

  • 默认一行,高度约 28px
  • 自动根据内容增高。
  • 最高为 3 行,超过后内部滚动。
  • 手动 resize 关闭:resize: none
  • 输入时保证当前行可见。
  • placeholder 使用 --subtle
  • focus 和 focus-visible 不显示 outline 或额外 box-shadow。

工具栏:

  • 左侧:添加上下文、权限选择。
  • 右侧:模型选择、发送按钮。
  • “完全访问”和“默认模型”只展示图标和文字,不加圆角矩形背景。
  • 附件按钮为圆形 icon button。

发送按钮:

  • 尺寸 38px * 38px
  • 圆角方形,border-radius: 12px
  • 可发送状态使用紫色以外的暖橙渐变: linear-gradient(180deg, #DF7440 0%, #AD4D1F 54%, #7C3217 100%)
  • icon 为白色。
  • 输入为空或禁用时按钮置灰。

弹层:

  • 背景使用 var(--popover) 混合透明。
  • 圆角 14px
  • backdrop-filter: blur(20px)
  • 菜单项高度 38px,hover 使用 var(--surface-3)

10. 文件工作区

顶部栏

高度:

  • 文件顶部栏最小高度 72px
  • 左侧标题与路径上下排列。
  • 右侧为模式切换、保存、打开目录、目录树切换、关闭。

路径区:

  • 使用小字号 12px--muted
  • 路径分隔符使用 --subtle
  • 复制路径按钮跟在路径后面。
  • 复制按钮只展示 icon,不要矩形外轮廓。
  • icon 尺寸约 14px,按钮尺寸约 18px

Toast:

  • 复制路径后的提示展示在复制按钮右侧。
  • 使用 inline pill,不占用预览区顶部空间。
  • 自动隐藏时间:2200ms
  • 背景:rgba(22, 25, 30, 0.92)
  • 圆角胶囊,轻阴影,backdrop-filter: blur(16px)

编辑/预览模式

模式切换:

  • 使用 segmented control。
  • 外层背景 var(--surface-2)
  • 当前状态高亮为暖橙渐变,并使用白色文字。
  • 未选中项使用 --muted

保存按钮:

  • 有可保存内容时使用主操作渐变。
  • 无法保存时置灰。
  • 不要只靠文字提示状态,禁用态应明显。

文件树

目录树:

  • 行高 32px 左右。
  • hover 使用 var(--surface-3)
  • 当前文件使用 --accent-soft 背景和左侧 2px accent 指示。
  • 文件名必须省略号截断。

编辑器:

  • CodeMirror 背景使用 var(--surface)
  • gutter 使用 var(--surface-2)
  • 选择色使用 color-mix(in srgb, var(--accent) 42%, transparent)

11. 设置页

布局:

  • 左侧设置导航 240px
  • 右侧内容 padding:桌面 48px clamp(24px, 6vw, 72px)
  • 移动端单列布局。

设置卡片:

  • 使用 var(--surface)
  • 边框使用 var(--border)
  • 圆角 12px
  • 行高度不低于 48px

开关:

  • 42px,高 24px
  • 关闭态为低透明白色背景。
  • 开启态使用 rgba(173, 77, 31, 0.86)
  • 圆点位移 18px

设置导航当前态:

  • 背景 var(--accent-soft)
  • 左侧 2px accent 指示。

12. Markdown 与代码块

正文:

  • 默认 14px / 1.68
  • assistant/document 变体可使用 14.5px / 1.72
  • process/tool/diagnostic 使用 12.5px / 1.58--muted

代码块:

  • 外层使用 var(--surface-2),边框 var(--border)
  • 圆角使用 var(--radius)
  • 代码字体使用 var(--font-mono)
  • header 高度约 34px
  • 复制等 action 按钮采用轻量 icon/text,不做重背景。

链接:

  • 颜色 var(--accent)
  • 使用低透明底边线,不使用默认蓝色。

表格:

  • 外层可横向滚动。
  • 表头背景 var(--surface-2)
  • 单元格边框使用 var(--border)

13. 按钮规范

主按钮:

  • 用于发送、保存、关键确认。
  • 背景:暖橙垂直渐变。
  • 文字和 icon 使用白色。
  • hover 稍微提亮,不改变色相。
  • disabled 使用灰色渐变或 var(--surface-3),文字使用 --subtle

次级按钮:

  • 背景为深色半透明或 var(--surface-2)
  • 边框使用 var(--border)
  • hover 时可加入很淡的 accent ring:rgba(173, 77, 31, 0.08)

图标按钮:

  • 优先使用 lucide-react
  • 常规尺寸 32px38px
  • 不熟悉的 icon 必须有 aria-labeltitle
  • 能用 icon 表达的工具命令优先用 icon,不强行放文字。

14. 表单与输入

输入框:

  • 默认深色背景。
  • focus 后不要出现明显高亮边框。
  • 需要强调时用容器级渐变边框,而不是 input 自身的焦点边框。
  • placeholder 使用 --subtle

搜索框:

  • 高度 32px34px
  • 背景 var(--surface-2)
  • 边框 var(--border)
  • 左侧搜索 icon 时 padding 预留 34px

下拉菜单:

  • 使用 popover 样式。
  • 当前项可用 check icon,不需要整行强高亮。

15. 状态反馈

Toast:

  • 用于轻量成功、复制、短反馈。
  • 就近出现,优先贴近触发按钮。
  • 自动隐藏。
  • 不占用主内容布局高度。

Notice / Error bar:

  • 只用于需要用户处理或持续可见的状态,例如冲突、错误。
  • 可以占用顶部空间。
  • 错误使用 --danger-soft--danger
  • 冲突或保存状态使用 --warning-soft--warning

Loading:

  • 切换会话或加载历史时,不清空右侧内容后再渲染。
  • 使用 overlay 或原内容保持策略,避免闪白。
  • overlay 背景使用 rgba(9, 13, 18, 0.72) 和模糊。

16. 图标与品牌资产

当前品牌资产:

  • apps/desktop/resources/icon.png:桌面应用图标,使用深色圆角底板和白色 v2 图标。
  • apps/desktop/resources/tray.png:macOS 菜单栏模板图,只保留透明背景的 v2 图标。
  • Web 不提供旧 OpenCreator logo 或历史兼容路径;Agent 消息不加载品牌图片。

使用规则:

  • Web 暂不加载品牌 favicon。
  • Agent 消息不展示头像或品牌图片。
  • 品牌图不要拉伸,保持 object-fit: contain
  • 不再保留 logo.pnglogo-cor.pnglogo-all.png 等旧 OpenCreator 静态资源或兼容路径。
  • 新增 icon 优先从 lucide-react 选取。

17. 新增页面检查清单

新增功能或页面前,先检查:

  • 是否复用了 tokens.css,没有写新的主色。
  • 是否仍然使用 #AD4D1F 作为主题高亮,而不是紫色。
  • 是否有可见滚动条 track,如果有则移除。
  • 是否有输入框 focus 高亮边框,如果有则改为无 outline 或容器级效果。
  • 是否有页面切换闪白,如果有则保持底色或 overlay。
  • 是否出现卡片套卡片,如果有则改为 full-width band 或简单分组。
  • 是否所有按钮有 disabled、hover、active 状态。
  • 是否 icon-only 按钮有 aria-label
  • 是否长标题、路径、文件名会省略号截断。
  • 是否移动端 920px480px 下不重叠、不溢出。

18. 命名建议

继续沿用当前语义化 class 命名:

  • 页面级:*-page*-shell*-layout
  • 区域级:*-header*-body*-content*-sidebar
  • 组件级:*-button*-row*-card*-popover*-toast
  • 状态:使用 data-*aria-currentaria-pressedaria-checked,少用额外 JS class

新增组件优先让状态通过可访问属性表达,CSS 再基于这些属性设置视觉。