Files
claude-code/packages/@ant/ink/docs/03-text-and-styling.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

6.4 KiB

Chapter 3: Text & Styling

Text Component

Text renders styled text content. It supports colors, emphasis, and text wrapping.

import { Text } from '@anthropic/ink'

<Text bold color="success">Operation complete</Text>

Text Props

Prop Type Default Description
color keyof Theme | Color - Foreground color
backgroundColor keyof Theme - Background color (theme-aware)
bold boolean false Bold text
dimColor boolean false Dim text (uses theme's inactive color)
italic boolean false Italic text
underline boolean false Underlined text
strikethrough boolean false Strikethrough text
inverse boolean false Swap foreground/background
wrap TextWrap 'wrap' Wrapping/truncation mode
children ReactNode - Text content

Note: bold and dimColor are mutually exclusive (ANSI terminals cannot render both simultaneously).

BaseText vs ThemedText

  • BaseText -- Accepts raw Color values only
  • Text (default export) -- Theme-aware, accepts keyof Theme | Color for color, and keyof Theme for backgroundColor
// Raw color
<BaseText color="rgb(255,0,0)">Red text</BaseText>

// Theme key (resolved to current theme palette)
<Text color="error">Error message</Text>

// Mixed
<Text color="#FF0000">Custom red</Text>

Text Wrap Modes

<Text wrap="wrap">...</Text>                // Word-wrap at container width (default)
<Text wrap="wrap-trim">...</Text>           // Wrap + trim trailing whitespace
<Text wrap="end">...</Text>                 // Truncate with "..." at end
<Text wrap="truncate-end">...</Text>        // Same as "end"
<Text wrap="truncate">...</Text>            // Truncate (no ellipsis)
<Text wrap="middle">...</Text>              // "start...end"
<Text wrap="truncate-middle">...</Text>     // Same as "middle"
<Text wrap="truncate-start">...</Text>      // "...text"

TextHoverColorContext

Uncolored Text children inherit a hover color from context:

import { TextHoverColorContext } from '@anthropic/ink'

<TextHoverColorContext.Provider value="suggestion">
  <Text>Uncolored text gets the suggestion color</Text>
  <Text color="error">This stays red</Text>
</TextHoverColorContext.Provider>

Precedence: explicit color > TextHoverColorContext > dimColor.

Color System

Raw Color Formats

Four formats are supported for raw color values:

// RGB
<Text color="rgb(255,107,128)">Bright red</Text>

// Hex
<Text color="#FF6B80">Bright red</Text>

// ANSI 256-color
<Text color="ansi256(196)">Red from 256-color palette</Text>

// Named ANSI 16-color
<Text color="ansi:red">Red</Text>
<Text color="ansi:greenBright">Bright green</Text>

ANSI Named Colors

Full list of ansi: prefixed names:

Name Color
ansi:black Black
ansi:red Red
ansi:green Green
ansi:yellow Yellow
ansi:blue Blue
ansi:magenta Magenta
ansi:cyan Cyan
ansi:white White
ansi:blackBright Dark gray
ansi:redBright Bright red
ansi:greenBright Bright green
ansi:yellowBright Bright yellow
ansi:blueBright Bright blue
ansi:magentaBright Bright magenta
ansi:cyanBright Bright cyan
ansi:whiteBright Bright white

Utility Functions

color(colorValue, themeName, type?)

Curried theme-aware color function. Resolves theme keys to raw color values.

import { color } from '@anthropic/ink'

const paint = color('error', 'dark')  // Returns (text: string) => string
console.log(paint('failed'))          // 'failed' wrapped in ANSI red codes

const paintFg = color('rgb(255,0,0)', 'dark', 'foreground')
const paintBg = color('success', 'dark', 'background')

Parameters:

  • c -- keyof Theme | Color | undefined -- Theme key or raw color
  • theme -- ThemeName -- Current theme
  • type -- 'foreground' | 'background' (default 'foreground')

stringWidth(text)

Measures the visual width of a string in terminal columns, accounting for:

  • CJK characters (2 columns each)
  • Emoji (2 columns each)
  • ANSI escape sequences (0 columns)
import { stringWidth } from '@anthropic/ink'

stringWidth('hello')      // 5
stringWidth('你好')        // 4
stringWidth('\x1b[31mhi')  // 2 (ANSI codes ignored)

wrapText(text, width, textWrap)

Wraps text to a given width with the specified wrapping mode.

import { wrapText } from '@anthropic/ink'

wrapText('Hello World', 5, 'wrap')    // 'Hello\nWorld'
wrapText('Hello World', 8, 'end')     // 'Hello...'

wrapAnsi(text, width)

Wraps text containing ANSI escape codes while preserving styling.

import { wrapAnsi } from '@anthropic/ink'

wrapAnsi('\x1b[31mHello World\x1b[0m', 5)
// Wraps at word boundaries, keeps color codes intact

measureElement(node)

Measures a rendered DOM element's dimensions.

import { measureElement } from '@anthropic/ink'

const { width, height } = measureElement(domElement)

Renders an OSC 8 terminal hyperlink (clickable URL in supported terminals).

import { Link } from '@anthropic/ink'

<Link url="https://example.com">
  <Text underline color="suggestion">example.com</Text>
</Link>

Props:

  • url -- string (required) -- Target URL
  • children -- ReactNode -- Display content
  • fallback -- ReactNode -- Shown when hyperlinks are unsupported

RawAnsi Component

Renders pre-formatted ANSI strings directly into the layout.

import { RawAnsi } from '@anthropic/ink'

<RawAnsi
  lines={['\x1b[31mRed line 1\x1b[0m', '\x1b[32mGreen line 2\x1b[0m']}
  width={40}
/>

Props:

  • lines -- string[] -- Pre-rendered ANSI lines (one terminal row each)
  • width -- number -- Column width the producer wrapped to

Border Rendering

renderBorder(box, output, options?)

Low-level border rendering function used internally by Box.

import { renderBorder } from '@anthropic/ink'
import type { BorderTextOptions } from '@anthropic/ink'

Border styles available (from cli-boxes):

  • single -- Thin lines ─│┌┐└┘
  • double -- Double lines ═║╔╗╚╝
  • round -- Rounded corners ─│╭╮╰╯
  • bold -- Bold lines ━┃┏┓┗┛
  • singleDouble -- Single horizontal, double vertical
  • doubleSingle -- Double horizontal, single vertical
  • classic -- ASCII ─|++++