anthropic.claude-code-2.1.296-linux-x64/webview/index.css(2026-10-22 提取)插件定义了一层 --app-* 语义变量,映射到 VS Code 主题变量 --vscode-*。我们在独立网页中没有 --vscode-*,所以用 VS Code 默认主题的取值填充(下表的"暗/亮"两列为 Dark Modern / Light Modern 的参考值,实现时以主题文件为准)。
| 语义令牌 | 映射到 | 暗 | 亮 |
|---|---|---|---|
--app-primary-background |
sideBar.background | #181818 |
#f8f8f8 |
--app-secondary-background |
editor.background | #1f1f1f |
#ffffff |
--app-primary-foreground |
foreground | #cccccc |
#3b3b3b |
--app-secondary-foreground |
descriptionForeground | #9d9d9d |
#717171 |
--app-primary-border-color |
sideBarActivityBarTop.border | #2b2b2b |
#e5e5e5 |
--app-input-background |
input.background | #313131 |
#ffffff |
--app-input-secondary-background |
menu.background | #1f1f1f |
#ffffff |
--app-input-border |
inlineChatInput / input / widget border | #3c3c3c |
#cecece |
--app-input-active-border |
inputOption.activeBorder | #2488db |
#005fb8 |
--app-input-placeholder-foreground |
input.placeholderForeground | #989898 |
#767676 |
--app-code-background |
textCodeBlock.background | #7f7f7f26 |
#7f7f7f26 |
--app-inline-code-background |
textPreformat.background | #7f7f7f26 |
#7f7f7f26 |
--app-link-foreground |
textLink.foreground | #4daafc |
#005fb8 |
--app-list-hover-background |
list.hoverBackground | #2a2d2e |
#f2f2f2 |
--app-error-foreground |
errorForeground | #f85149 |
#f85149 |
| 令牌 | 值 | 用途 |
|---|---|---|
--app-claude-orange |
#d97757 |
输入框聚焦边框与光晕 |
--app-claude-clay-button-orange |
#c6613f |
发送按钮背景 |
--app-claude-ivory |
#faf9f5 |
发送按钮图标 |
--app-claude-slate |
#141413 |
— |
| 成功 | #74c991 |
时间线圆点、已连接徽标 |
| 失败 | #c74e39 |
时间线圆点、失败徽标 |
| 警告/待处理 | #e1c08d |
时间线圆点、需登录徽标 |
--app-spacing-small/medium/large/xlarge = 4 / 8 / 12 / 16px--corner-radius-small/medium/large = 4 / 6 / 8px/* 时间线:竖线 + 圆点 */
.timelineMessage { padding-left: 30px; }
.timelineMessage::before{ left: 9px; width: 7px; height: 7px; border-radius: 50%;
top: calc(var(--message-padding-top, 8px) + 7px);
background: var(--app-secondary-foreground); }
.timelineMessage::after { left: 12px; width: 1px; top: 0; bottom: 0;
background: var(--app-primary-border-color); }
.dotSuccess::before { background: #74c991 } .dotFailure::before { background: #c74e39 }
.dotWarning::before { background: #e1c08d }
/* 用户消息 */
.userMessage { border: 1px solid var(--app-input-border); border-radius: 6px;
background: var(--app-input-background); padding: 4px 6px; white-space: pre-wrap; }
/* 工具行 */
.toolNameText { font-weight: 700; margin-right: 4px; }
.toolNameTextSecondary { font-family: monospace; font-size: .85em; }
.toolBodyRow { display: grid; grid-template-columns: subgrid;
border-top: .5px solid var(--app-input-border); padding: 4px; }
.toolBodyRowLabel { font-family: monospace; opacity: .5; font-size: .85em; }
.toolBodyRowContent { max-height: 60px; overflow: hidden;
mask-image: linear-gradient(to bottom, #000 50px, transparent 60px); }
.toolResult { background: var(--app-code-background); white-space: pre; overflow-x: auto; }
/* 审批卡片 */
.permissionRequestContainer { background: var(--app-input-secondary-background);
border: 1px solid var(--app-input-border); border-radius: 8px;
padding: 8px; max-height: 70vh; }
.permissionRequestContainer:focus-within
{ border-color: color-mix(in srgb, var(--app-input-active-border) 65%, transparent); }
/* 输入框 */
.inputContainer { border: 1px solid var(--app-input-border); border-radius: 8px;
box-shadow: 0 1px 2px #0000001a; }
.inputContainer:focus-within { border-color: #d97757;
box-shadow: 0 0 0 3px color-mix(in srgb, #d97757 12%, transparent),
0 1px 2px color-mix(in srgb, #d97757, transparent 80%); }
.messageInput { padding: 10px 36px 10px 14px; max-height: 200px; line-height: 1.5; }
.sendButton { width: 26px; height: 26px; border-radius: 5px;
background: #c6613f; color: #faf9f5; }
/* 思考过程 */
.thinkingSummary { color: var(--app-secondary-foreground); opacity: .8; font-style: italic; }
/* 状态徽标 */
.statusBadge { border-radius: 4px; padding: 4px 8px; font-weight: 500; }
主容器:时间线和输入框都限制在 max-width: 680px 内居中,输入框距底部和左右各 16px。
timelineMessage、userMessageContainer、toolUse/toolResult/toolBodyRow、permissionRequest*、thinkingSummary、inputContainer/messageInput/sendButton、pill(模型/模式选择)、sessionItem(历史会话)、statusBadge、mcpStatus、subagentRow、menuPopup/menuItem、banner、emptyState、previewPane。
插件升级后可以重新执行提取脚本,比对令牌变化:
grep -oE -- '--app-[a-zA-Z0-9-]+:[^;]+' ~/.vscode/extensions/anthropic.claude-code-*/webview/index.css | sort -u