opentui

Build terminal UIs with OpenTUI. Covers Core, frameworks, components, application APIs, testing, extensions, integrations, deployment, and public API lookup.

Install
npx skills add 'https://github.com/anomalyco/opentui/tree/main/packages/web/src/content'
Download bundle ↓
main · ac753b4Scanned 2026-09-15

Contributors

GitHub-linked commit authors for this SKILL.md at the saved revision. Co-authors and history before file renames are not included.

File history ↗

docs/components/diff.mdx

docs/components/diff.mdxBrowse 89 files
View on GitHub
← Back to SKILL.md

title: Diff description: Display unified or split diffs with optional syntax highlighting

Diff

Diff renders one file patch in a unified or split view with syntax highlighting and optional line numbers. Use Code when you do not need patch parsing.

Availability

FieldAvailability
Package@opentui/core
Core renderableDiffRenderable
React<diff> (automatic)
Solid<diff> is runtime built in. Its exact props declaration is missing.
StatusBuilt in with a Solid typing limitation

Basic usage

Renderable API

import { DiffRenderable, SyntaxStyle, RGBA, createCliRenderer } from "@opentui/core"

const renderer = await createCliRenderer()

const syntaxStyle = SyntaxStyle.fromStyles({
  default: { fg: RGBA.fromHex("#E6EDF3") },
  string: { fg: RGBA.fromHex("#A5D6FF") },
  keyword: { fg: RGBA.fromHex("#FF7B72"), bold: true },
})

const patch = `diff --git a/app.ts b/app.ts
index 1111111..2222222 100644
--- a/app.ts
+++ b/app.ts
@@ -1,3 +1,3 @@
 setup()
-const a = 1
+const a = 2
 ready(a)
`

const diff = new DiffRenderable(renderer, {
  id: "diff",
  width: "100%",
  height: 16,
  diff: patch,
  view: "split",
  filetype: "typescript",
  syntaxStyle,
  showLineNumbers: true,
})

renderer.root.add(diff)

Monochrome views of the same patch:

Unified view:

 1   setup()
 2 - const a = 1
 2 + const a = 2
 3   ready(a)

Split view:

 1   setup()      1   setup()
 2 - const a = 1  2 + const a = 2
 3   ready(a)     3   ready(a)

For multi-file input, Diff currently displays only patches[0]. Create one DiffRenderable for each file patch that you need to show.

Split view scroll sync

When view: "split" is active, you can link scrollX and scrollY for both panes. Scrolling one pane then moves the other:

const diff = new DiffRenderable(renderer, {
  id: "diff",
  view: "split",
  syncScroll: true,
  diff: patch,
  syntaxStyle,
})

// Toggle at runtime
diff.syncScroll = false

Scroll sync is a no-op in the unified view.

Properties

PropertyTypeDefaultDescription
diffstring""Unified diff string
view"unified" or "split""unified"Layout style
syncScrollbooleanfalseLink horizontal and vertical scroll in split view
filetypestring-Syntax highlighting language
fgstring or RGBA-Base foreground for inner code panes
syntaxStyleSyntaxStyle-Syntax style for code
wrapMode"word", "char", or "none"-Code wrapping mode
concealbooleanfalseConceal markup when highlighting
selectionBgstring or RGBA-Selection background in code panes
selectionFgstring or RGBA-Selection foreground in code panes
treeSitterClientTreeSitterClient-Custom Tree-sitter client
showLineNumbersbooleantrueShow line numbers
lineNumberFgstring or RGBA#888888Line number text color
lineNumberBgstring or RGBAtransparentLine number background
addedLineNumberBgstring or RGBAtransparentLine number background for added
removedLineNumberBgstring or RGBAtransparentLine number background for removed
addedBgstring or RGBA#1a4d1aBackground for added lines
removedBgstring or RGBA#4d1a1aBackground for removed lines
contextBgstring or RGBAtransparentBackground for context lines
addedContentBgstring or RGBA-Optional content background (added)
removedContentBgstring or RGBA-Optional content background (removed)
contextContentBgstring or RGBA-Optional content background (context)
addedSignColorstring or RGBA#22c55eSign color for added lines
removedSignColorstring or RGBA#ef4444Sign color for removed lines

Other grammars require Tree-sitter configuration. See the Tree-sitter reference.

Use Code for source text without patch structure. Use Line number gutter with other line-aware renderables. Use Markdown for documents and TextTable for general tabular comparisons.