Files
qwen-code/packages/vscode-ide-companion/docs-tmp/CLAUDE_CODE_UI_IMPLEMENTATION.md
yiliang114 732220e651 wip(vscode-ide-companion): 实现 quick win 功能
- 将 WebView 调整到编辑器右侧
- 添加 ChatHeader 组件,实现会话下拉菜单
- 替换模态框为紧凑型下拉菜单
- 更新会话切换逻辑,显示当前标题
- 清理旧的会话选择器样式
基于 Claude Code v2.0.43 UI 分析实现。
2025-11-19 00:16:45 +08:00

5.9 KiB
Raw Blame History

Claude Code UI 还原实现

概述

本文档记录了如何将 Claude Code VSCode 扩展的 Webview UI 设计还原到我们的 Qwen Code VSCode IDE Companion 项目中。

分析的源 HTML 结构

从 Claude Code VSCode 扩展的 webview HTML 中,我们识别出以下关键组件:

1. 顶部导航栏 (.he)

  • Past Conversations 按钮 (.E) - 带下拉箭头的会话列表按钮
  • New Session 按钮 (.j) - 创建新会话的加号按钮
  • 使用了 ghost button 风格hover 时有背景色变化

2. 中间内容区域

  • 空状态界面 - 当没有消息时显示
    • Qwen Logo (SVG)
    • 欢迎文本:"What to do first? Ask about this codebase or we can start writing code."
    • 横幅提示:"Prefer the Terminal experience? Switch back in Settings."

3. 底部输入区域 (.u)

  • 可编辑的 contenteditable div - 替代传统的 textarea
    • placeholder: "Ask Claude to edit…"
    • 支持多行输入
  • 操作按钮行 (.ri)
    • "Ask before edits" 按钮 (.l) - 编辑模式选择
    • Thinking 开关按钮 (.H.ni)
    • 命令菜单按钮
    • 发送按钮 (.r)

实现的组件

1. EmptyState 组件

文件: src/webview/components/EmptyState.tsx, EmptyState.css

功能:

  • 显示 Qwen Logo (使用现有的 SVG)
  • 显示欢迎文本
  • 显示横幅提示(可关闭)
  • 响应式布局

关键样式:

.empty-state {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100%;
  padding: 40px 20px;
}

2. 更新的 Header

改动: src/webview/App.tsx, App.css

变更:

  • 将 select 下拉框改为 "Past Conversations" 按钮
  • 按钮样式遵循 Claude Code 的 ghost button 设计
  • 使用 flex 布局,左对齐按钮,右侧 spacer最右侧新建按钮

类名:

  • .header-conversations-button - 会话列表按钮
  • .header-spacer - flex spacer
  • .new-session-header-button - 新建会话按钮

3. 重新设计的输入表单

改动: src/webview/App.tsx, App.css

变更:

  • 使用 contenteditable div 替代 <input><textarea>
  • 添加操作按钮行:
    • Edit Mode 按钮
    • Thinking 开关
    • 命令菜单按钮
    • 发送按钮
  • 使用分隔线分隔按钮组

类名:

  • .input-wrapper - 输入区域容器
  • .input-field-editable - contenteditable div
  • .input-actions - 操作按钮行
  • .action-button - 带文本的按钮
  • .action-icon-button - 只有图标的按钮
  • .action-divider - 分隔线
  • .send-button-icon - 发送按钮

4. 更新的 CSS 变量

App.css 中添加/更新的变量:

--app-transparent-inner-border: rgba(255, 255, 255, 0.1);
--app-ghost-button-hover-background: var(--vscode-toolbar-hoverBackground);

关键设计决策

1. Logo 选择

  • 使用 Qwen 现有的像素风格 logo SVG
  • 颜色: #D97757 (橙色)
  • 保持了品牌一致性

2. 输入框实现

  • 选用 contenteditable="plaintext-only" 而不是 textarea
    • 更好的控制样式
    • 支持动态高度
    • 与 Claude Code 一致的体验

3. 按钮风格

  • 全部使用 ghost button 风格
  • hover 时使用 VSCode 的 toolbar-hoverBackground 颜色
  • 保持了 VSCode 原生的视觉感受

4. 空状态显示逻辑

const hasContent =
  messages.length > 0 ||
  isStreaming ||
  toolCalls.size > 0 ||
  permissionRequest !== null;

只有在没有任何内容时才显示空状态界面。

文件变更清单

新增文件

  1. src/webview/components/EmptyState.tsx - 空状态组件
  2. src/webview/components/EmptyState.css - 空状态样式
  3. docs-tmp/CLAUDE_CODE_UI_IMPLEMENTATION.md - 本文档

修改文件

  1. src/webview/App.tsx

    • 导入 EmptyState 组件
    • 重构 header 为 Claude Code 风格
    • 重构输入表单为 contenteditable + 操作按钮
    • 添加 hasContent 逻辑判断
  2. src/webview/App.css

    • 添加 header 按钮样式
    • 添加 contenteditable 输入框样式
    • 添加操作按钮样式
    • 更新 CSS 变量

样式映射表

Claude Code 类名 我们的类名 用途
.he .chat-header 顶部导航栏
.E .header-conversations-button 会话列表按钮
.j .new-session-header-button 新建会话按钮
.Q .messages-container 消息容器
.u .input-form 输入表单
.fo .input-wrapper 输入框包装器
.d .input-field-editable 可编辑输入框
.ri .input-actions 操作按钮行
.l .action-button 带文本的操作按钮
.H .action-icon-button 图标按钮
.r .send-button-icon 发送按钮

未来改进

  1. Banner 关闭功能 - 实现横幅的可关闭逻辑并保存状态
  2. Edit Mode 切换 - 实现编辑模式切换功能
  3. Thinking 开关 - 实现 thinking 显示开关
  4. 命令菜单 - 实现斜杠命令菜单
  5. 响应式优化 - 针对更小的窗口尺寸优化布局

构建验证

npm run build

构建成功,没有 TypeScript 或 ESLint 错误。

截图对比

(建议添加截图展示还原前后的对比)

总结

成功将 Claude Code 的 webview UI 设计还原到 Qwen Code VSCode IDE Companion 项目中,主要改进包括:

  1. 更现代的空状态界面
  2. 更直观的 header 导航
  3. 更强大的输入框体验
  4. 更清晰的操作按钮布局
  5. 保持了 VSCode 原生风格

整体 UI 更加专业、现代,用户体验得到显著提升。