主题
图标系统
本文引用的源码文件
本文引用的文件
目录
引言
本文件面向 AI Helper 扩展(Manifest V3,侧边栏 side panel)中的图标系统,覆盖以下目标:
- SVG 图标管理机制:集中常量、避免重复内联、按尺寸分组。
- 动态加载与降级:文件类型图标、Emoji 降级、按需引入第三方库。
- 缓存策略:工作目录、Agent 配置等探测结果缓存;图标本身以模块常量形式驻留内存。
- 主题适配:基于 CSS Token 的亮/暗主题切换,图标颜色通过
currentColor继承。 - 性能优化:SVG 内联、构建期生成多尺寸 PNG、运行时按需加载 PDF/Word/Excel 解析器。
- API 接口:图标获取方法、状态管理与错误处理。
- 国际化与可访问性:i18n 文案、
aria-hidden、语义化命名。 - 设计规范:视觉一致性、语义化命名、版本管理。
项目结构
图标相关代码分布在三个层次:
- 设计层:
icons/design-philosophy.md描述“Neural Prism”视觉语言;icons/README.md说明扩展应用图标尺寸要求。 - 构建层:
scripts/generate-icons.js用 Sharp 从 SVG 模板渲染 16/48/128 三档 PNG,并输出对应 SVG 源文件。 - 运行层:
src/side_panel/icons.js提供共享 SVG 常量;其他 UI 模块按需导入;文件类型图标由file-extract.js和workspace-manager.js提供 Emoji 降级方案。
graph TB subgraph "设计" D1["design-philosophy.md<br/>Neural Prism 视觉语言"] D2["icons/README.md<br/>扩展图标尺寸规范"] end subgraph "构建" B1["generate-icons.js<br/>Sharp 生成 16/48/128 PNG + SVG"] end subgraph "运行" R1["icons.js<br/>共享 SVG 常量"] R2["chat-manager.js<br/>引用图标常量"] R3["chat-streaming.js<br/>引用图标常量"] R4["ui-prototype.js<br/>引用图标常量"] R5["file-extract.js<br/>Emoji 文件图标"] R6["workspace-manager.js<br/>Emoji 文件图标"] end D1 --> B1 D2 --> B1 B1 --> |产物| R1 R1 --> R2 R1 --> R3 R1 --> R4 R5 --> R2 R6 --> R2
图表来源
- icons/design-philosophy.md#L1-L42
- icons/README.md#L1-L12
- scripts/generate-icons.js#L1-L252
- src/side_panel/icons.js#L1-L126
- src/side_panel/chat-manager.js#L13
- src/side_panel/chat-streaming.js#L11
- src/side_panel/ui-prototype.js#L4
- src/side_panel/file-extract.js#L75-L84
- src/side_panel/workspace-manager.js#L55-L59
章节来源
- icons/design-philosophy.md#L1-L42
- icons/README.md#L1-L12
- scripts/generate-icons.js#L1-L252
- src/side_panel/icons.js#L1-L126
核心组件
- 共享 SVG 常量模块:
src/side_panel/icons.js导出 16x16、24x24、1024x1024 三类图标常量,供聊天、流式输出、原型预览等模块复用。 - 文件类型图标模块:
src/side_panel/file-extract.js与src/side_panel/workspace-manager.js提供基于扩展名的 Emoji 图标映射,作为通用文件列表的降级显示。 - 图标构建脚本:
scripts/generate-icons.js定义 Neural Prism 六边形晶体结构,生成扩展所需的 16/48/128 PNG 及 SVG 源文件。 - 主题系统:
src/shared/theme.css与src/shared/theme.js提供亮/暗主题 Token,图标通过fill="currentColor"或stroke="currentColor"自动适配。
章节来源
- src/side_panel/icons.js#L1-L126
- src/side_panel/file-extract.js#L75-L84
- src/side_panel/workspace-manager.js#L55-L59
- scripts/generate-icons.js#L1-L252
- src/shared/theme.css#L1-L289
- src/shared/theme.js#L1-L90
架构总览
图标系统在运行时的调用链如下:UI 模块从 icons.js 导入 SVG 字符串常量,直接写入 DOM;文件列表则通过 getFileIcon 返回 Emoji 字符;扩展应用图标由构建脚本生成 PNG 后由 Manifest 使用。
sequenceDiagram participant UI as "UI 模块<br/>chat-manager / chat-streaming / ui-prototype" participant ICONS as "icons.js<br/>SVG 常量" participant FILE as "file-extract / workspace-manager<br/>Emoji 图标" participant THEME as "theme.css / theme.js<br/>CSS Token" participant BUILD as "generate-icons.js<br/>构建产物" UI->>ICONS : 导入 ICON_* 常量 UI->>UI : 将 SVG 字符串插入 DOM UI->>FILE : getFileIcon(name, type) FILE-->>UI : 返回 Emoji 字符 THEME->>UI : data-theme 控制颜色变量 ICONS->>THEME : fill/stroke=currentColor 继承主题色 BUILD->>BUILD : 生成 16/48/128 PNG + SVG
图表来源
- src/side_panel/icons.js#L1-L126
- src/side_panel/chat-manager.js#L13
- src/side_panel/chat-streaming.js#L11
- src/side_panel/ui-prototype.js#L4
- src/side_panel/file-extract.js#L75-L84
- src/side_panel/workspace-manager.js#L55-L59
- src/shared/theme.css#L1-L289
- src/shared/theme.js#L1-L90
- scripts/generate-icons.js#L1-L252
详细组件分析
共享 SVG 常量模块:src/side_panel/icons.js
该模块是图标系统的核心资产入口,职责包括:
- 集中维护 16x16、24x24、1024x1024 三类 SVG 字符串常量。
- 使用
fill="currentColor"或stroke="currentColor"实现主题色继承。 - 为不同场景提供专用 class,如
thinking-icon、tool-call-icon、dropdown-arrow。 - 避免在多个 UI 文件中重复内联 SVG,降低体积与维护成本。
关键分类:
- 16x16:复制、勾选、编辑等小尺寸操作图标。
- 24x24:思考大脑、时钟、箭头、关闭、工具、图片、外部链接、下载、终端、文件、搜索等常用功能图标。
- 1024x1024:引用、导出、Word/PDF 文档等大尺寸业务图标。
classDiagram
class IconsModule {
<<module>>
+ICON_COPY_16
+ICON_CHECKMARK_16
+ICON_EDIT_16
+ICON_BRAIN_24
+ICON_BRAIN_STATIC_24
+ICON_CLOCK_24
+ICON_CHEVRON_DOWN_24
+ICON_CLOSE_24
+ICON_EXPAND_24
+ICON_STOP_24
+ICON_WRENCH_24
+ICON_IMAGE_24
+ICON_EYE_24
+ICON_EXTERNAL_LINK_24
+ICON_EDIT_PEN_24
+ICON_TRASH_24
+ICON_DOWNLOAD_24
+ICON_EXEC_24
+ICON_FILE_24
+ICON_SEARCH_24
+ICON_WRENCH_PLAIN_24
+ICON_QUOTE_1024
+ICON_EXPORT_1024
+ICON_WORD_1024
+ICON_PDF_1024
+ICON_DROPDOWN_ARROW
}
图表来源
章节来源
文件类型图标模块:file-extract.js 与 workspace-manager.js
两个模块都提供 getFileIcon,但用途略有差异:
file-extract.js:用于附件提取流程,按文件类别返回 Emoji,如 PDF、Word、Excel、文本、未知类型。workspace-manager.js:用于工作区文件列表,支持目录与扩展名映射,默认回退到通用文档 Emoji。
flowchart TD
Start(["调用 getFileIcon"]) --> CheckDir{"是否目录?"}
CheckDir --> |是| ReturnDir["返回 📁"]
CheckDir --> |否| GetExt["提取扩展名"]
GetExt --> MapType{"映射类型"}
MapType --> |pdf/docx/xlsx/text| ReturnEmoji["返回对应 Emoji"]
MapType --> |未知| Fallback["返回 📎 或 📄"]
图表来源
章节来源
图标构建脚本:scripts/generate-icons.js
该脚本负责生成扩展应用图标(非侧边栏 UI 图标),遵循 “Neural Prism” 设计哲学:
- 使用 Sharp 将 SVG 模板渲染为 16/48/128 PNG。
- 同时保存 SVG 源文件,便于后续调整。
- 颜色采用固定调色板:深靛蓝、电光蓝、紫罗兰、青色火花。
flowchart TD A["启动 generate-icons.js"] --> B["读取 icons 目录"] B --> C["生成 svg16/svg48/svg128"] C --> D["Sharp 渲染 PNG"] D --> E["写入 icon16.png/icon48.png/icon128.png"] D --> F["写入对应 .svg 源文件"] F --> G["完成"]
图表来源
章节来源
依赖关系分析
图标系统的依赖关系清晰且低耦合:
- UI 模块仅依赖
icons.js提供的常量,不直接操作 SVG 路径。 - 文件类型图标模块独立于 UI 模块,提供 Emoji 降级。
- 主题系统通过 CSS Token 影响所有
currentColor图标,无需 JS 干预。 - 构建脚本与运行时代码解耦,产物为 PNG/SVG 文件。
graph LR CHAT["chat-manager.js"] --> ICONS["icons.js"] STREAM["chat-streaming.js"] --> ICONS PROTO["ui-prototype.js"] --> ICONS FE["file-extract.js"] --> |Emoji| CHAT WM["workspace-manager.js"] --> |Emoji| CHAT THEME["theme.css / theme.js"] --> ICONS BUILD["generate-icons.js"] --> |PNG/SVG| EXT["扩展应用图标"]
图表来源
- src/side_panel/chat-manager.js#L13
- src/side_panel/chat-streaming.js#L11
- src/side_panel/ui-prototype.js#L4
- src/side_panel/file-extract.js#L75-L84
- src/side_panel/workspace-manager.js#L55-L59
- src/shared/theme.css#L1-L289
- src/shared/theme.js#L1-L90
- scripts/generate-icons.js#L1-L252
章节来源
- src/side_panel/chat-manager.js#L13
- src/side_panel/chat-streaming.js#L11
- src/side_panel/ui-prototype.js#L4
- src/side_panel/file-extract.js#L75-L84
- src/side_panel/workspace-manager.js#L55-L59
- src/shared/theme.css#L1-L289
- src/shared/theme.js#L1-L90
- scripts/generate-icons.js#L1-L252
性能与优化
- SVG 内联优化:
icons.js将常用 SVG 定义为模块常量,避免重复内联,减少 DOM 重建开销。 - 构建期生成:扩展应用图标通过 Sharp 在构建时生成 PNG,避免运行时缩放损耗。
- 按需加载:PDF/Word/Excel 解析器在文件提取流程中动态 import,避免首屏加载无关库。
- 降级策略:当 Agent 不可达或文件格式不支持时,回退到浏览器端提取或 Emoji 图标,保证 UI 可用。
- 缓存策略:工作目录、家目录、Agent 配置等探测结果在模块内缓存,减少重复网络请求。
章节来源
- src/side_panel/icons.js#L1-L126
- scripts/generate-icons.js#L1-L252
- src/side_panel/file-extract.js#L108-L181
- src/side_panel/workspace-manager.js#L162-L249
主题适配与可访问性
- 亮/暗主题切换:
theme.js管理用户偏好与生效主题,写入<html data-theme>;theme.css定义亮/暗两套 Token。 - 颜色继承:图标 SVG 使用
fill="currentColor"或stroke="currentColor",自动继承当前文本颜色,从而适配主题。 - 可访问性:部分图标按钮使用
aria-hidden="true"隐藏装饰性图标,确保屏幕阅读器聚焦语义元素。 - 尺寸自适应:SVG 使用
viewBox与相对单位,配合 CSS 控制宽高,实现不同容器下的自适应显示。
stateDiagram-v2 [*] --> 初始化 初始化 --> 亮色 : "data-theme='light'" 初始化 --> 暗色 : "data-theme='dark'" 亮色 --> 暗色 : "用户切换或系统主题变化" 暗色 --> 亮色 : "用户切换或系统主题变化"
图表来源
章节来源
API 与使用示例
图标获取方法
- SVG 图标常量:从
icons.js导入对应常量,如ICON_IMAGE_24、ICON_COPY_16。 - 文件类型图标:调用
getFileIcon(name, type),返回 Emoji 字符。
章节来源
- src/side_panel/icons.js#L1-L126
- src/side_panel/file-extract.js#L75-L84
- src/side_panel/workspace-manager.js#L55-L59
状态管理与错误处理
- 文件提取状态:
processFile设置extracting、done、error状态,并更新 UI。 - Agent 连接错误:
isAgentUnreachableError判断网络失败,记录 debug 日志,避免控制台噪音。 - 资源加载失败:动态 import 解析器失败时抛出错误,由上层捕获并降级。
章节来源
使用示例
- 在 UI 组件中使用图标:导入
icons.js常量,将 SVG 字符串赋值给innerHTML。 - 动态切换图标:根据状态切换不同常量,如思考中显示
ICON_BRAIN_24,完成后显示ICON_CHECKMARK_16。 - 处理加载失败:捕获
processFile异常,设置error状态并提示用户。
章节来源
- src/side_panel/chat-manager.js#L13
- src/side_panel/chat-streaming.js#L11
- src/side_panel/file-extract.js#L225-L266
故障排查
- 图标不显示:检查
icons.js中对应常量是否存在,确认 DOM 插入逻辑正确。 - 主题颜色异常:确认
theme.js已初始化,data-theme属性已设置,图标 SVG 使用currentColor。 - 文件图标为 Emoji:这是预期行为,如需自定义文件图标,需扩展
getFileIcon映射。 - Agent 不可达:检查网络连接与 Agent 服务状态,查看日志中的
agent unreachable提示。
章节来源
- src/side_panel/icons.js#L1-L126
- src/shared/theme.js#L1-L90
- src/side_panel/workspace-manager.js#L171-L189
设计规范与版本管理
- 视觉一致性:遵循 “Neural Prism” 设计哲学,使用六边形晶体结构与固定调色板。
- 语义化命名:图标常量命名包含尺寸与用途,如
ICON_IMAGE_24、ICON_COPY_16。 - 版本管理:扩展应用图标由构建脚本生成,UI 图标常量集中在
icons.js,便于统一维护。 - 国际化支持:图标按钮的标题与提示通过 i18n 文案动态设置,确保多语言环境下的可用性。
章节来源
结论
AI Helper 的图标系统以 icons.js 为核心,结合构建脚本与主题系统,实现了高效、可维护、可访问的图标管理。通过 SVG 内联、Emoji 降级、按需加载与缓存策略,系统在性能与用户体验之间取得平衡。未来可扩展更多图标类型,并进一步完善自动化测试与主题审计流程。