mirror of
https://github.com/claude-code-best/claude-code.git
synced 2026-06-17 22:05:50 +00:00
* feat: 第一版大重构 * fix: 修复类型问题 * chore: 更新版本到 1.3.2 * Add brave as alternative WebSearchTool * fix: 修正顺序 * fix: 修复对穷鬼模式的 auto dream 和 session memory 越过 * feat: 穷鬼模式去除 session-summary * feat: 创建 builtin-tools 包,搬运所有工具实现 将 src/tools/ 下的全部 60 个工具目录迁移至 packages/builtin-tools/src/tools/, 内部导入路径已更新为 src/ alias 模式。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 更新 src/ 中所有工具引用至 builtin-tools 包,删除 src/tools/ - src/tools.ts 及 178 个 src/ 文件的 import 路径从 ./tools/ 改为 builtin-tools/tools/ - 删除 src/tools/ 整个目录(已迁移至 packages/builtin-tools/) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: 添加 builtin-tools 路径别名至 tsconfig,更新 bun.lock - tsconfig.json 新增 builtin-tools/* 和 builtin-tools 路径映射 - 新增 packages/builtin-tools/src 至 include Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: 为 builtin-tools、mcp-client、agent-tools 添加 @claude-code-best 作用域前缀 所有包名及 import 路径统一添加 @claude-code-best/ 前缀: - builtin-tools → @claude-code-best/builtin-tools - mcp-client → @claude-code-best/mcp-client - agent-tools → @claude-code-best/agent-tools Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: 修复 node 环境没有 bun 的问题 --------- Co-authored-by: Eric-Guo <eric.guocz@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
214 lines
5.7 KiB
Markdown
214 lines
5.7 KiB
Markdown
# Chapter 4: Theme System
|
|
|
|
The theme system provides consistent, accessible color palettes across the application. It supports dark mode, light mode, ANSI-only terminals, and colorblind-accessible variants.
|
|
|
|
## ThemeProvider
|
|
|
|
Wraps the application to provide theme context.
|
|
|
|
```tsx
|
|
import { ThemeProvider } from '@anthropic/ink'
|
|
|
|
function App() {
|
|
return (
|
|
<ThemeProvider initialState="dark" onThemeSave={(setting) => saveConfig(setting)}>
|
|
<MyComponent />
|
|
</ThemeProvider>
|
|
)
|
|
}
|
|
```
|
|
|
|
### Props
|
|
|
|
| Prop | Type | Description |
|
|
|------|------|-------------|
|
|
| `children` | `ReactNode` | Child components |
|
|
| `initialState` | `ThemeSetting` | Initial theme (default: loads from config) |
|
|
| `onThemeSave` | `(setting: ThemeSetting) => void` | Called when theme is saved |
|
|
|
|
### Theme Configuration Injection
|
|
|
|
Before mounting, inject config persistence callbacks:
|
|
|
|
```tsx
|
|
import { setThemeConfigCallbacks } from '@anthropic/ink'
|
|
|
|
setThemeConfigCallbacks({
|
|
loadTheme: () => configStore.get('theme', 'dark'),
|
|
saveTheme: (setting) => configStore.set('theme', setting),
|
|
})
|
|
```
|
|
|
|
## Theme Settings
|
|
|
|
```ts
|
|
type ThemeSetting = 'auto' | 'dark' | 'light' | 'light-daltonized' | 'dark-daltonized' | 'light-ansi' | 'dark-ansi'
|
|
type ThemeName = 'dark' | 'light' | 'light-daltonized' | 'dark-daltonized' | 'light-ansi' | 'dark-ansi'
|
|
```
|
|
|
|
| Theme | Description |
|
|
|-------|-------------|
|
|
| `dark` | Dark theme with RGB colors (default) |
|
|
| `light` | Light theme with RGB colors |
|
|
| `dark-daltonized` | Colorblind-accessible dark theme |
|
|
| `light-daltonized` | Colorblind-accessible light theme |
|
|
| `dark-ansi` | Dark theme using only 16 ANSI colors |
|
|
| `light-ansi` | Light theme using only 16 ANSI colors |
|
|
| `auto` | Follows terminal's dark/light mode (resolved at runtime) |
|
|
|
|
## Theme Hooks
|
|
|
|
### `useTheme()`
|
|
|
|
Returns the resolved theme name and setter.
|
|
|
|
```tsx
|
|
const [currentTheme, setTheme] = useTheme()
|
|
// currentTheme: ThemeName (never 'auto')
|
|
// setTheme: (setting: ThemeSetting) => void
|
|
```
|
|
|
|
### `useThemeSetting()`
|
|
|
|
Returns the raw setting (may be `'auto'`).
|
|
|
|
```tsx
|
|
const setting = useThemeSetting() // 'auto' | 'dark' | ...
|
|
```
|
|
|
|
### `usePreviewTheme()`
|
|
|
|
Returns preview controls for a theme picker UI.
|
|
|
|
```tsx
|
|
const { setPreviewTheme, savePreview, cancelPreview } = usePreviewTheme()
|
|
|
|
// Show preview
|
|
setPreviewTheme('light')
|
|
|
|
// User confirms
|
|
savePreview()
|
|
|
|
// User cancels
|
|
cancelPreview()
|
|
```
|
|
|
|
## Theme Color Palette
|
|
|
|
Every theme defines these semantic color keys:
|
|
|
|
### Brand & Identity
|
|
|
|
| Key | Purpose |
|
|
|-----|---------|
|
|
| `claude` | Brand orange |
|
|
| `claudeShimmer` | Lighter brand orange (animated) |
|
|
| `permission` | Permission/blue |
|
|
| `permissionShimmer` | Lighter permission blue |
|
|
| `autoAccept` | Electric violet |
|
|
| `planMode` | Teal/sage |
|
|
| `ide` | Muted blue |
|
|
|
|
### Semantic Colors
|
|
|
|
| Key | Purpose |
|
|
|-----|---------|
|
|
| `text` | Primary text color |
|
|
| `inverseText` | Text on inverse backgrounds |
|
|
| `inactive` | Dimmed/disabled elements |
|
|
| `inactiveShimmer` | Lighter inactive |
|
|
| `subtle` | Very subtle text |
|
|
| `suggestion` | Interactive/accent |
|
|
| `background` | General background accent |
|
|
| `success` | Positive/success |
|
|
| `error` | Negative/error |
|
|
| `warning` | Caution/warning |
|
|
| `warningShimmer` | Lighter warning |
|
|
| `merged` | Merged state |
|
|
|
|
### Diff Colors
|
|
|
|
| Key | Purpose |
|
|
|-----|---------|
|
|
| `diffAdded` | Added lines background |
|
|
| `diffRemoved` | Removed lines background |
|
|
| `diffAddedDimmed` | Dimmed added |
|
|
| `diffRemovedDimmed` | Dimmed removed |
|
|
| `diffAddedWord` | Word-level added |
|
|
| `diffRemovedWord` | Word-level removed |
|
|
|
|
### UI Colors
|
|
|
|
| Key | Purpose |
|
|
|-----|---------|
|
|
| `promptBorder` | Input prompt border |
|
|
| `promptBorderShimmer` | Lighter prompt border |
|
|
| `bashBorder` | Shell block border |
|
|
| `selectionBg` | Text selection highlight background |
|
|
| `userMessageBackground` | User message background |
|
|
| `userMessageBackgroundHover` | User message hover |
|
|
| `messageActionsBackground` | Action buttons background |
|
|
|
|
### Agent Colors
|
|
|
|
| Key | Purpose |
|
|
|-----|---------|
|
|
| `red_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
| `blue_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
| `green_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
| `yellow_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
| `purple_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
| `orange_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
| `pink_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
| `cyan_FOR_SUBAGENTS_ONLY` | Agent color assignment |
|
|
|
|
## Using Theme Colors in Components
|
|
|
|
### ThemedText
|
|
|
|
```tsx
|
|
<Text color="success">Operation complete</Text>
|
|
<Text color="error" bold>Failed!</Text>
|
|
<Text color="claude">Claude says...</Text>
|
|
<Text dimColor>Secondary info</Text>
|
|
<Text backgroundColor="userMessageBackground">Highlighted</Text>
|
|
```
|
|
|
|
### ThemedBox
|
|
|
|
```tsx
|
|
<Box borderStyle="single" borderColor="permission" backgroundColor="userMessageBackground">
|
|
<Text>Themed content</Text>
|
|
</Box>
|
|
```
|
|
|
|
### color() Utility
|
|
|
|
```tsx
|
|
import { color, useTheme } from '@anthropic/ink'
|
|
|
|
function MyComponent() {
|
|
const [themeName] = useTheme()
|
|
const paint = color('success', themeName)
|
|
// paint('text') returns ANSI-colored string
|
|
}
|
|
```
|
|
|
|
## Daltonized Themes
|
|
|
|
The daltonized themes (`light-daltonized`, `dark-daltonized`) are designed for users with protanopia/deuteranopia:
|
|
|
|
- Green/red diffs replaced with blue/red
|
|
- Status colors use blue instead of green
|
|
- Warning colors adjusted for better distinction
|
|
- All color pairs verified for sufficient contrast
|
|
|
|
## System Theme Detection
|
|
|
|
When `ThemeSetting` is `'auto'`:
|
|
|
|
1. Seeds from `$COLORFGBG` environment variable
|
|
2. Queries terminal via OSC 11 for live background color
|
|
3. Watches for changes (terminal theme switch) in real-time
|
|
4. Resolves to `'dark'` or `'light'` based on detected brightness
|