Markdown
Render markdown content with syntax-aware styling and optional Tree-sitter highlighting for code blocks.
Basic usage
Renderable API
import { MarkdownRenderable, SyntaxStyle, RGBA, createCliRenderer } from "@opentui/core"
const renderer = await createCliRenderer()
const syntaxStyle = SyntaxStyle.fromStyles({
"markup.heading.1": { fg: RGBA.fromHex("#58A6FF"), bold: true },
"markup.list": { fg: RGBA.fromHex("#FF7B72") },
"markup.raw": { fg: RGBA.fromHex("#A5D6FF") },
default: { fg: RGBA.fromHex("#E6EDF3") },
})
const markdown = new MarkdownRenderable(renderer, {
id: "readme",
width: 60,
content: "# Hello\n\n- One\n- Two\n\n```ts\nconst x = 1\n```",
syntaxStyle,
})
renderer.root.add(markdown)
Concealment
Hide markdown markers (backticks, emphasis markers, etc.) when conceal is true:
const markdown = new MarkdownRenderable(renderer, {
content: "**bold** and `code`",
syntaxStyle,
conceal: true,
})
Streaming updates
Enable streaming mode for incremental updates:
const markdown = new MarkdownRenderable(renderer, {
content: "",
syntaxStyle,
streaming: true,
})
markdown.content += "# Live log\n"
markdown.content += "- line 1\n"
Custom node rendering
Override rendering for a token and fall back to default rendering:
const markdown = new MarkdownRenderable(renderer, {
content: "# Title\n\nHello",
syntaxStyle,
renderNode: (token, context) => {
if (token.type === "heading") {
return context.defaultRender()
}
return undefined
},
})
Construct API
Not available yet. Use
MarkdownRenderablefor now.
Properties
| Property | Type | Default | Description |
|---|---|---|---|
content | string | "" | Markdown source |
syntaxStyle | SyntaxStyle | required | Style definitions for tokens |
conceal | boolean | true | Hide markdown markers |
streaming | boolean | false | Optimize for incremental updates |
treeSitterClient | TreeSitterClient | - | Custom Tree-sitter client for code blocks |
renderNode | (token: Token, context: RenderNodeContext) => Renderable | - | Custom render hook per markdown block |