Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

TUI design language

North-star for Veyyon terminal UX. Implementation lives in packages/tui (rendering) and packages/coding-agent/src/modes/theme/ (themes and tokens).

Brand palette in the TUI

Veyyon Dark and Veyyon Light follow the brand system:

RoleDark (shipped)Light (shipped, upstream)
Surface#050505Terminal / #e0e0e0 status chrome
Primary text#FAFAFATerminal default
Brand accent (dark only today)#B8BDC7Teal #5a8080 in light.json

Veyyon Dark follows the brand system. Light theme JSON is still the upstream oh-my-pi palette until a silver light theme lands (Spec — not shipped).

Theme JSON is validated in theme.ts (themeJsonSchema). User overrides can live under ~/.veyyon/agent/themes/. See Themes and identity and engine doc docs/theme.md.

Spacing scale

Use a 4-cell rhythm:

TokenCellsUse
space-00Flush edges
space-11Inline gap, chip padding
space-22Between stacked rows
space-33Section break inside a pane
space-44Pane padding from terminal edge

Prefer space-1 / space-2 in dense tool UIs. One-off paddings are bugs.

Color and emphasis

RoleRule
Primary textTheme text token (#FAFAFA / #050505)
Secondary / metadim or muted tokens
EmphasisBold on primary; silver accent for focus and selection
Links / pathsTheme accent (silver in first-party themes)
Danger / denyTheme error (red)
Success / approvedTheme success (green)
WarningTheme warning (yellow)
MCP / external toolsDistinct marker glyph; consistent hue within MCP cells

Never rely on color alone. Pair hue with a glyph or word (ok, err, mcp). Respect NO_COLOR / --no-color.

Call sites route through packages/coding-agent/src/modes/theme/theme.ts helpers — not raw ANSI literals at widget sites.

Motion

KindBudget
Spinner / shimmerLow effective FPS; no 30 FPS frames for short blinks
Cursor blink~600ms period
Status pulseSlow, interruptible

No gratuitous animation on static content.

Empty / loading / error

  • Empty: one quiet hint + example prompts; hide once the user types.
  • Loading: spinner + short verb (thinking, running, compacting).
  • Error: cause first, remediation second. No stack dumps in the composer.

Tool-call rendering

  1. Header: glyph + tool name + status word.
  2. Arguments: syntax-aware JSON when applicable; wrap with expand affordance for large bodies.
  3. Output: collapse large bodies; keep a one-line summary visible.
  4. MCP tools: visually distinct from local shell/file tools.

Iconography

Prefer ASCII-safe glyphs with Unicode upgrades when width is known (theme.symbols presets: unicode, nerd, ascii). Width math uses grapheme-aware helpers in @veyyon/pi-tui, not byte length.

Composer and chrome

  • Empty composer hints ? for shortcuts and / for commands.
  • Mid-turn: esc to interrupt while a turn runs.
  • Picker gutters use (not >) for the selected row caret.
  • Tree connectors (├─, └─) use theme tree.* symbols consistently in session tree and tool groups.

Conformance

When touching TUI polish, name the token (spacing, theme color, motion budget). Hardcoded hex or ANSI at call sites outside theme.ts is a design-system bug.