图标体系#
Web 端用三族图标。每一族有自己的地盘,一个界面里不会无意间把实心图标和线性图标并排放在一起。
| 族 | 地盘 | 包 / 来源 | 许可 |
|---|---|---|---|
| Solar(Bold Duotone) | 输入框区域:环境条 chip、控制行及其 + 菜单、模型 / 权限徽章、思考力度 pill、提问 / 审批面板、发送箭头;以及聊天执行时间线每一行左侧的图标方块 | apps/web/components/solar-icons——图标主体由 apps/web/scripts/icons/fetch-solar.mjs 从 Iconify 的 solar 集合取回,落在 bodies.ts |
CC BY 4.0,Solar Icons by 480 Design |
| pqoqubbw 动效线性图标 | 输入框以外的外壳:左侧 rail、中央标签页、侧栏、设置导航、功能卡片、DAG 视图 | apps/web/components/animated-icons |
MIT |
| lucide-react | 其余不需要动效的地方:设置正文、对话框、时间线行尾的展开箭头 | lucide-react |
ISC |
供应商 logo 来自 LobeHub(components/settings/lobe-icons.ts),头像来自 DiceBear identicon,二者不在本约定之内。
没有人手画图标 SVG。要加一个 Solar 图标,就在 fetch-solar.mjs 的 ICONS 里加一项再跑一遍;生成文件提交进仓库,构建不依赖网络。
输入框区域用 Solar#
在输入框 14–16px 的尺寸下,双色图标看起来像是为这个功能专门设计的,线性图标则显得通用。所有 Solar 图标统一用 Bold Duotone 一种样式:实心主体 + 浅一档(50% 透明)的副层。
| 位置 | Solar 图标 |
|---|---|
+ 选项触发 |
tuning-2 |
| 添加文件 | paperclip |
| 工具 | case-minimalistic |
| 工具配置 | settings-minimalistic |
| 网页搜索 | global |
| 沙箱 | box-minimalistic |
| 无人值守 关 / 开 | eye / eye-closed |
| 思考力度 | dumbbell-large-minimalistic |
| Chat 模型 / 执行模型徽章 | chat-round-dots / programming |
| 权限徽章 | shield-check |
| Local 连接 chip | monitor |
| 网页标签 chip | earth |
| 画中画 chip | pip-2 |
| 工作目录 / 添加目录 | folder-with-files / add-folder |
| 项目 chip / 项目目录丢失 | folder-open / danger-triangle |
| 菜单勾选 | check-circle |
| 关闭 × | close-circle |
| 展开箭头 | alt-arrow-right、alt-arrow-down |
| 发送 | plain-2(纸飞机) |
| 复制 | copy |
| 模型能力(视觉 / 视频 / 工具 / 推理) | eye / videocamera / case-minimalistic / lightbulb-bolt;公文包用 12px 而不是 14px,因为它的图形占满整格、眼睛和摄像机留有边距,12px 时三者上下边才对齐 |
| Git 胶囊 / 其菜单:新建分支或 worktree、worktree、PR、查看 PR | git-branch / add-circle、folder-path-connect、git-pull-request、square-arrow-right-up |
| 文件修改卡片:标题 / 文件行 | pen-new-square / file-text |
| 文件修改卡片:撤回 / Review 按钮 | Font Awesome rotate-left / eye(实心),图标 + 文字 |
Solar 的撤回图标都是细线箭头,在按钮尺寸下几乎看不见,所以文件卡片的两个操作按钮改用 Font Awesome 的实心图标,由同一个脚本取回、放进同一张表(viewBox 记在 SOLAR_VIEWBOXES)。
反映开关的图标随状态换形,而不只靠颜色:无人值守开启后眼睛闭上;运行中模式"注入"是前进箭头、"排队"是队列列表;项目目录丢失时项目 chip 变成警告三角。
输入框区域有两个不是 Solar 的图标。高速(Fast)开关保留动效集里的仪表盘,由 active 属性转动指针。思考力度卡片里的 ? 帮助按钮(effort-picker.zh.html)是 14px 的 lucide CircleHelp:Solar 尚未取回问号图标,而且这个按钮是静态的,不需要动效句柄。二者均见文末实现状态。
执行时间线用 Solar#
展开后的执行时间线,每一行以一个 24px 的着色方块开头(嵌套时 20px),里面是 13px 的图标(嵌套时 11px)。图标用 Solar Bold Duotone,所以各行显示为色调色的扁平实心标记,而不是线稿。apps/web/components/chat/messages/tool-presentation.ts 里的 presentTool() 按工具选图(ToolPresentation.icon,类型为 SolarIconName);没有工具图标时,execution-strip.tsx 的 StepRow 按行类别兜底。方块本身和色调配色不随图标族改变。
| 行 | Solar 图标 |
|---|---|
命令(bash、terminal_use、process) |
programming |
| 执行代码 | code-square |
| 修改 / 写入 / 补丁 | pen-new-square |
| 读取文件 / PDF | file-text |
| 列出目录 | folder-open |
查找文件(glob) |
file-search |
搜索(grep、代码搜索) |
magnifier |
| 代码分析(LSP) | structure |
| 网页搜索 / 抓取 | global |
| 浏览器操作 | cursor |
| 生成图片 / 分析图片 | gallery-add / gallery |
| 画布、发送文件、给代理发消息 | plain-2 |
| 子代理类工具 | bot |
| 读取对话 | book |
| 向用户提问 | chat-round-question-mark |
| 规划模式 | map |
| 定时任务 | calendar |
| 运行程序 | box |
| 使用技能 | stars |
| 资源、记忆 | database |
| 待办 | checklist |
| 工作树 | git-branch |
| 自我更新 | refresh |
| MCP | plug-circle |
| 其他函数 | sledgehammer |
| 按行类别兜底:思考 / LLM / 子代理 / 函数 | lightbulb-bolt / cpu / bot / sledgehammer |
Solar 没有扳手,通用函数行用锤子(sledgehammer)作为工具标记;思考行兜底复用 lightbulb-bolt,与模型选择器里表示推理能力的图标相同。失败行保留小号描边 ✗,摘要后的展开箭头仍是 lucide ChevronRight,二者都不是类型图标。
时间线图标是静态的(motionPreset="none"):行头不是按钮,点击只负责展开 / 收起。图标不带任何悬停提示,因为对话内容不加 tooltip。
动效约定#
三族图标都讲同一套命令式句柄 AnimatedNavIconHandle(startAnimation / stopAnimation):容器——按钮、菜单行、chip——才是悬停目标,图标自己 16px 的命中区从不单独动。父级挂上 ref 就接管驱动;没有 ref 的 Solar 图标跟随最近的可点击祖先(按钮、链接、菜单项、chip)的悬停,所以不论有没有接 ref,每个按钮的表现都一样;纯展示的图标——菜单勾、警告三角、模型能力标记——用 none。
pqoqubbw 图标会自己重绘(扳手转一下、箭头跳一下)。实心的 Solar 图标做不到,所以 SolarIcon 提供几种克制而统一的预设:pop(放大到 1.12,默认)、fly(发送纸飞机向右上飞 1.5px)、nudge(箭头右移 1.5px)、pulse(一次性弹入,用于菜单项变为勾选时)和 none。prefers-reduced-motion 下全部不动。
SolarIcon 在 <svg> 外包一层 span.inline-flex,与动效图标的包裹层同构,容器里按"装着 svg 的那个元素"去定尺寸或隐藏的 CSS 继续有效。
署名#
Solar Icons © 480 Design,CC BY 4.0(https://github.com/480-Design/Solar-Icon-Set)。两个 Font Awesome 图标来自 Font Awesome Free,© Fonticons,CC BY 4.0(https://fontawesome.com/license/free)。声明放在 bodies.ts 文件头和本页;面向用户的致谢条目尚未添加(见下)。
实现状态#
- 输入框区域换成 Solar,含环境条 chip、+ 菜单、提问 / 审批面板,以及经
components/chat/top-bar共用的模型 / 权限徽章:已实现。 - 执行时间线行图标换成 Solar(按工具选图,以及思考 / LLM / 子代理 / 函数兜底):已实现。
- 高速开关改为状态驱动的仪表盘(关时指针停在低速区,开时甩到高速区并变成强调红):未实现——目前仍是动效集的仪表盘加静态
active旋转。 - 思考力度卡片的帮助图标换成 Solar
question-circle(经fetch-solar.mjs取回):未实现——暂用 lucideCircleHelp。 - 面向用户的 Solar 第三方致谢(CC BY):未实现。
- rail、标签页、侧栏、设置仍用动效线性集,不计划迁移。