Files
contentm_agent/执行会话/目标-调研5个开源内容工作台项目并生成分析文档-5199a6/取证/opencreator/oc_docs_visual-component-guidelines.md
T

525 lines
16 KiB
Markdown
Raw Normal View History

# 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`。
- 常规按钮:`7px` 到 `10px`。
- 图标圆按钮:圆形或 `12px`。
- 输入框主容器:桌面 `22px`,移动端 `10px`。
- 选项卡、工具按钮、文件树行:`7px` 到 `9px`。
- 阴影使用深色低透明阴影,避免亮色厚重投影。
## 3. 全局布局
主应用布局:
- 展开侧栏:`248px + main`。
- 右侧详情展开:`248px + main + 320-400px`。
- 收起侧栏:`72px + main`。
- 文件工作区内:对话区和文件区之间使用 `6px` resize handle。
页面结构原则:
- 顶部 header 高度通常在 `56px` 到 `72px`。
- 主内容区必须 `min-width: 0`、`min-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)`。
- 底部分割线使用低透明白色,不要过亮。
标题:
- 对话标题 `17px`,`font-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`。
- 常规尺寸 `32px` 到 `38px`。
- 不熟悉的 icon 必须有 `aria-label` 和 `title`。
- 能用 icon 表达的工具命令优先用 icon,不强行放文字。
## 14. 表单与输入
输入框:
- 默认深色背景。
- focus 后不要出现明显高亮边框。
- 需要强调时用容器级渐变边框,而不是 input 自身的焦点边框。
- placeholder 使用 `--subtle`。
搜索框:
- 高度 `32px` 到 `34px`。
- 背景 `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.png`、`logo-cor.png`、`logo-all.png` 等旧 OpenCreator 静态资源或兼容路径。
- 新增 icon 优先从 `lucide-react` 选取。
## 17. 新增页面检查清单
新增功能或页面前,先检查:
- 是否复用了 `tokens.css`,没有写新的主色。
- 是否仍然使用 `#AD4D1F` 作为主题高亮,而不是紫色。
- 是否有可见滚动条 track,如果有则移除。
- 是否有输入框 focus 高亮边框,如果有则改为无 outline 或容器级效果。
- 是否有页面切换闪白,如果有则保持底色或 overlay。
- 是否出现卡片套卡片,如果有则改为 full-width band 或简单分组。
- 是否所有按钮有 disabled、hover、active 状态。
- 是否 icon-only 按钮有 `aria-label`。
- 是否长标题、路径、文件名会省略号截断。
- 是否移动端 `920px`、`480px` 下不重叠、不溢出。
## 18. 命名建议
继续沿用当前语义化 class 命名:
- 页面级:`*-page`、`*-shell`、`*-layout`
- 区域级:`*-header`、`*-body`、`*-content`、`*-sidebar`
- 组件级:`*-button`、`*-row`、`*-card`、`*-popover`、`*-toast`
- 状态:使用 `data-*`、`aria-current`、`aria-pressed`、`aria-checked`,少用额外 JS class
新增组件优先让状态通过可访问属性表达,CSS 再基于这些属性设置视觉。