# UI 组件与前端分析
## UI 架构
Claude Code 使用 React + Ink 构建 Terminal UI,组件层次分明。
```mermaid
graph TB
subgraph 入口层
Main[main.tsx
CLI 入口]
Ink[ink.ts
Ink 渲染器包装]
App[App.tsx
根组件]
end
subgraph 全屏界面
Screens[screens/
Doctor, REPL, Resume]
end
subgraph 布局组件
Fullscreen[FullscreenLayout.tsx]
StatusLine[StatusLine.tsx
状态栏]
TextInput[TextInput.tsx
文本输入]
VimInput[VimTextInput.tsx
Vim 输入]
end
subgraph 消息组件
Messages[Messages.tsx
消息列表]
MessageRow[MessageRow.tsx
消息行]
Message[Message.tsx
单条消息]
MessageResp[MessageResponse.tsx
响应消息]
VirtualList[VirtualMessageList.tsx
虚拟滚动列表]
end
subgraph 工具组件
ToolLoader[ToolUseLoader.tsx
工具加载器]
FileEditDiff[FileEditToolDiff.tsx
编辑差异]
BashProgress[BashModeProgress.tsx
Bash 进度]
NotebookReject[NotebookEditToolUseRejectedMessage.tsx]
end
subgraph 对话框组件
TrustDialog[TrustDialog/
信任对话框]
MCPDialog[MCPServerApprovalDialog.tsx
MCP 审批]
ExportDialog[ExportDialog.tsx
导出对话框]
AutoMode[AutoModeOptInDialog.tsx
自动模式确认]
CostDialog[CostThresholdDialog.tsx
成本阈值]
BridgeDialog[BridgeDialog.tsx
桥接对话框]
end
subgraph 输入组件
PromptInput[PromptInput/
提示输入]
BaseInput[BaseTextInput.tsx
基础文本输入]
SearchBox[SearchBox.tsx
搜索框]
end
Main --> Ink --> App
App --> Screens
App --> Fullscreen
App --> StatusLine
App --> TextInput
App --> Messages
Messages --> VirtualList --> MessageRow --> Message
App --> ToolLoader
App --> PromptInput
```
## 组件分类
### 核心布局组件
| 组件 | 文件 | 功能 |
|------|------|------|
| App | `App.tsx` | 应用根组件 |
| FullscreenLayout | `FullscreenLayout.tsx` | 全屏布局 |
| StatusLine | `StatusLine.tsx` | 底部状态栏 |
| TextInput | `TextInput.tsx` | 主输入框 |
| VimTextInput | `VimTextInput.tsx` | Vim 模式输入框 |
| PromptInput | `PromptInput/` | 提示输入组件 |
| VirtualMessageList | `VirtualMessageList.tsx` | 虚拟滚动消息列表 |
### 消息展示组件
| 组件 | 文件 | 功能 |
|------|------|------|
| Messages | `Messages.tsx` | 消息容器 |
| MessageRow | `MessageRow.tsx` | 消息行 |
| Message | `Message.tsx` | 单条消息 |
| MessageResponse | `MessageResponse.tsx` | 响应消息 |
| MessageModel | `MessageModel.tsx` | 模型信息 |
| MessageTimestamp | `MessageTimestamp.tsx` | 时间戳 |
| CompactSummary | `CompactSummary.tsx` | 压缩摘要 |
| Markdown | `Markdown.tsx` | Markdown 渲染 |
### 工具相关组件
| 组件 | 文件 | 功能 |
|------|------|------|
| ToolUseLoader | `ToolUseLoader.tsx` | 工具使用加载动画 |
| BashModeProgress | `BashModeProgress.tsx` | Bash 命令进度 |
| FileEditToolDiff | `FileEditToolDiff.tsx` | 文件编辑差异展示 |
| FileEditToolUpdatedMessage | `FileEditToolUpdatedMessage.tsx` | 编辑更新消息 |
| StructuredDiff | `StructuredDiff.tsx` | 结构化差异展示 |
| StructuredDiffList | `StructuredDiffList.tsx` | 差异列表 |
### 对话框组件
| 组件 | 功能 |
|------|------|
| TrustDialog/ | 信任确认对话框 |
| MCPServerApprovalDialog | MCP 服务器审批 |
| MCPServerMultiselectDialog | MCP 多选对话框 |
| ExportDialog | 导出对话框 |
| AutoModeOptInDialog | 自动模式选择 |
| AutoUpdater(AutoUpdaterWrapper) | 自动更新 |
| CostThresholdDialog | 成本阈值确认 |
| BridgeDialog | IDE 桥接对话框 |
| IdleReturnDialog | 空闲返回对话框 |
| BypassPermissionsModeDialog | 权限绕过确认 |
| WorktreeExitDialog | Worktree 退出对话框 |
| GlobalSearchDialog | 全局搜索 |
| HistorySearchDialog | 历史搜索 |
| QuickOpenDialog | 快速打开 |
### 导航和信息组件
| 组件 | 功能 |
|------|------|
| Stats | `Stats.tsx` 统计信息 |
| Spinner | `Spinner.tsx` 加载动画 |
| EffortIndicator | `EffortIndicator.ts` 思考力度指示 |
| ModelPicker | `ModelPicker.tsx` 模型选择器 |
| ThemePicker | `ThemePicker.tsx` 主题选择器 |
| LanguagePicker | `LanguagePicker.tsx` 语言选择器 |
| OutputStylePicker | `OutputStylePicker.tsx` 输出样式选择器 |
| ThinkingToggle | `ThinkingToggle.tsx` 思考模式切换 |
| FastIcon | `FastIcon.tsx` 快速模式图标 |
| ContextVisualization | `ContextVisualization.tsx` 上下文可视化 |
### 团队和代理组件
| 组件 | 功能 |
|------|------|
| CoordinatorAgentStatus | 协调器代理状态 |
| AgentProgressLine | 代理进度行 |
| TeammateViewHeader | 队友视图头部 |
| TaskListV2 | 任务列表 V2 |
| PrBadge | PR 徽章 |
### IDE 集成组件
| 组件 | 功能 |
|------|------|
| IdeStatusIndicator | IDE 状态指示器 |
| IdeAutoConnectDialog | IDE 自动连接 |
| IdeOnboardingDialog | IDE 新手引导 |
| ShowInIDEPrompt | 在 IDE 中显示提示 |
| FilePathLink | 文件路径链接 |
| LogSelector | 日志选择器 |
## Vim 模式
```mermaid
flowchart TD
A[vim/] --> B[motions.ts
移动操作]
A --> C[operators.ts
操作符]
A --> D[textObjects.ts
文本对象]
A --> E[transitions.ts
状态转换]
A --> F[types.ts
类型定义]
G[VimTextInput.tsx] --> A
H[useVimInput.ts] --> A
I[vim 命令
/commands/vim] --> J[切换 Vim 模式]
```
## 快捷键系统
```mermaid
flowchart TD
A[keybindings/] --> B[defaultBindings.ts
默认绑定]
A --> C[parser.ts
快捷键解析]
A --> D[resolver.ts
快捷键解析器]
A --> E[match.ts
快捷键匹配]
A --> F[schema.ts
Schema 定义]
A --> G[template.ts
模板]
A --> H[validate.ts
验证]
A --> I[reservedShortcuts.ts
保留快捷键]
A --> J[shortcutFormat.ts
格式化]
A --> K[loadUserBindings.ts
用户自定义]
L[KeybindingContext.tsx] --> M[快捷键上下文]
N[KeybindingProviderSetup.tsx] --> M
O[useKeybinding.ts] --> P[使用快捷键]
Q[useShortcutDisplay.ts] --> R[快捷键显示]
```
## React Hooks
项目包含约 70 个自定义 React Hooks:
### 核心 Hooks
| Hook | 功能 |
|------|------|
| `useCanUseTool` | 工具权限检查 |
| `useMergedTools` | 合并内置和 MCP 工具 |
| `useMergedCommands` | 合并命令列表 |
| `useMergedClients` | 合并客户端 |
| `useMainLoopModel` | 主循环模型管理 |
| `useGlobalKeybindings` | 全局快捷键 |
| `useCommandKeybindings` | 命令快捷键 |
| `useTextInput` | 文本输入管理 |
### 状态 Hooks
| Hook | 功能 |
|------|------|
| `useDynamicConfig` | 动态配置 |
| `useSettings` | 设置管理 |
| `useSettingsChange` | 设置变更监听 |
| `useTasksV2` | 任务管理 V2 |
| `useTaskListWatcher` | 任务列表监听 |
| `useMemoryUsage` | 内存使用 |
| `useScheduledTasks` | 定时任务 |
### IDE 集成 Hooks
| Hook | 功能 |
|------|------|
| `useIDEIntegration` | IDE 集成 |
| `useIdeSelection` | IDE 选择 |
| `useIdeAtMentioned` | IDE @ 提及 |
| `useIdeConnectionStatus` | IDE 连接状态 |
| `useIdeLogging` | IDE 日志 |
### 会话 Hooks
| Hook | 功能 |
|------|------|
| `useReplBridge` | REPL Bridge |
| `useRemoteSession` | 远程会话 |
| `useSSHSession` | SSH 会话 |
| `useSessionBackgrounding` | 会话后台化 |
| `useBackgroundTaskNavigation` | 后台任务导航 |
### 代理 Hooks
| Hook | 功能 |
|------|------|
| `useSwarmInitialization` | 集群初始化 |
| `useSwarmPermissionPoller` | 集群权限轮询 |
| `useTeammateViewAutoExit` | 队友视图自动退出 |
### 其他 Hooks
| Hook | 功能 |
|------|------|
| `useVoiceIntegration` / `useVoice` | 语音集成 |
| `useClipboardImageHint` | 剪贴板图片提示 |
| `usePasteHandler` | 粘贴处理 |
| `useTypeahead` | 自动补全 |
| `useHistorySearch` | 历史搜索 |
| `useDiffData` | 差异数据 |
| `useDiffInIDE` | IDE 差异显示 |
| `useVirtualScroll` | 虚拟滚动 |
| `useTerminalSize` | 终端尺寸 |
| `useCommandQueue` | 命令队列 |
## 设计系统 (design-system/)
内置组件库提供一致的 UI 基础:
| 组件 | 功能 |
|------|------|
| ThemedBox / ThemedText | 主题感知的容器/文本 |
| Dialog | 对话框组件 |
| Tabs | 标签页组件 |
| Button | 按钮组件 |
| ProgressBar | 进度条 |
| FuzzyPicker | 模糊选择器 |
| CheckboxInput | 复选框输入 |
### 布局系统
使用 **Yoga Layout**(Flexbox 引擎)进行终端布局计算,支持:
- Flexbox 弹性布局
- 响应式终端尺寸适配
- 基于 `useTerminalSize` 的动态调整
### 主题系统
```mermaid
flowchart TD
A[ThemeProvider] --> B[themeSetting
用户设置]
A --> C[systemTheme
系统检测]
A --> D[currentTheme
实际渲染主题]
B --> E[light / dark / auto]
C --> F[终端主题监听
自动检测变化]
D --> G[动态切换
实时预览]
```
## Buddy 伙伴精灵 (buddy/)
终端伙伴精灵系统,提供视觉陪伴和交互反馈:
```mermaid
flowchart TD
A[CompanionSprite
主精灵组件] --> B[动画系统]
A --> C[对话气泡]
A --> D[交互功能]
B --> E[idle
空闲动画]
B --> F[fidget
活动动画]
B --> G[blink
眨眼动画]
B --> H[15帧循环序列]
C --> I[提示信息气泡
~10秒显示]
C --> J[淡出效果
最后3秒渐暗]
D --> K[pet
抚摸交互]
D --> L[burst
Hearts 爆发动画
~2.5秒]
```