Files
claude-code/packages/@ant/ink/docs/04-theme-system.md
claude-code-best 2fb1c9dcd8 feat: 工具层及 mcp 大重构 (#252)
* 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>
2026-04-13 09:52:05 +08:00

5.7 KiB

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.

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:

import { setThemeConfigCallbacks } from '@anthropic/ink'

setThemeConfigCallbacks({
  loadTheme: () => configStore.get('theme', 'dark'),
  saveTheme: (setting) => configStore.set('theme', setting),
})

Theme Settings

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.

const [currentTheme, setTheme] = useTheme()
// currentTheme: ThemeName (never 'auto')
// setTheme: (setting: ThemeSetting) => void

useThemeSetting()

Returns the raw setting (may be 'auto').

const setting = useThemeSetting()  // 'auto' | 'dark' | ...

usePreviewTheme()

Returns preview controls for a theme picker UI.

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

<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

<Box borderStyle="single" borderColor="permission" backgroundColor="userMessageBackground">
  <Text>Themed content</Text>
</Box>

color() Utility

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