# Syntax Highlighting
URL: /docs/ui/syntax-highlighting
Code block syntax highlighting with react-shiki or react-syntax-highlighter.
***
title: Syntax Highlighting
description: Code block syntax highlighting with react-shiki or react-syntax-highlighter.
-----------------------------------------------------------------------------------------
import { InstallCommand } from "@/components/docs/fumadocs/install/install-command";
import { SyntaxHighlightingSample } from "@/components/docs/samples/syntax-highlighting-sample";
Syntax highlighting is not enabled in markdown by default.
`assistant-ui` provides two options for syntax highlighting:
* **react-shiki** (recommended for performance & dynamic language support)
* **react-syntax-highlighter** (legacy - Prism or Highlight.js based)
***
## react-shiki
#### Add `shiki-highlighter`
This adds a `/components/assistant-ui/shiki-highlighter.tsx` file to your project and
installs the `react-shiki` dependency. The highlighter can be customized by editing
the config in the `shiki-highlighter.tsx` file.
#### Add it to `defaultComponents` in `markdown-text.tsx`
```tsx title="/components/assistant-ui/markdown-text.tsx"
import { SyntaxHighlighter } from "./shiki-highlighter";
export const defaultComponents = memoizeMarkdownComponents({
SyntaxHighlighter: SyntaxHighlighter, // [!code ++]
h1: /* ... */,
// ...other elements...
});
```
### Options
### Bundle Optimization
By default, `react-shiki` includes the full Shiki bundle, which contains all supported languages and themes.
To reduce bundle size, you can use the web bundle by changing the import to `react-shiki/web`, to include a smaller bundle of web related languages:
```tsx title="/components/assistant-ui/shiki-highlighter.tsx"
import ShikiHighlighter, { type ShikiHighlighterProps } from "react-shiki/web";
```
#### Custom Bundles
For strict bundle size control, `react-shiki` also supports custom bundles created using `createHighlighterCore` from `react-shiki/core` (re-exported from Shiki):
```tsx title="/components/assistant-ui/shiki-highlighter.tsx" {3-9}
import { createHighlighterCore, createOnigurumaEngine } from "react-shiki/core"; // [!code ++]
// Create the highlighter
// Use dynamic imports to load languages and themes on client on demand
const customHighlighter = await createHighlighterCore({
themes: [import("@shikijs/themes/nord")],
langs: [
import("@shikijs/langs/javascript"),
import("@shikijs/langs/typescript"),
],
engine: createOnigurumaEngine(import("shiki/wasm")),
});
// Then pass it to the highlighter prop
;
```
For more information, see [react-shiki - bundle options](https://github.com/avgvstvs96/react-shiki#bundle-options).
### Dual/multi theme support
To use multiple theme modes, pass an object with your multi-theme configuration to the `theme` prop in the `ShikiHighlighter` component:
```tsx title="/components/assistant-ui/shiki-highlighter.tsx"
```
To make themes responsive to your site's theme mode, add one of the following CSS snippets to your project:
```css title="shiki.css"
/* for class based dark mode */
html.dark .shiki,
html.dark .shiki span {
color: var(--shiki-dark) !important;
background-color: var(--shiki-dark-bg) !important;
/* Optional, if you also want font styles */
font-style: var(--shiki-dark-font-style) !important;
font-weight: var(--shiki-dark-font-weight) !important;
text-decoration: var(--shiki-dark-text-decoration) !important;
}
/* for query based dark mode */
@media (prefers-color-scheme: dark) {
.shiki,
.shiki span {
color: var(--shiki-dark) !important;
background-color: var(--shiki-dark-bg) !important;
/* Optional, if you also want font styles */
font-style: var(--shiki-dark-font-style) !important;
font-weight: var(--shiki-dark-font-weight) !important;
text-decoration: var(--shiki-dark-text-decoration) !important;
}
}
```
For more information, see [Shiki's documentation on dual and multi themes](https://shiki.style/guide/dual-themes).
***
## react-syntax-highlighter
This option may be removed in a future release. Consider using
[react-shiki](#react-shiki) instead.
#### Add `syntax-highlighter`
Adds a `/components/assistant-ui/syntax-highlighter.tsx` file to your project and installs the `react-syntax-highlighter` dependency.
#### Add it to `defaultComponents` in `markdown-text.tsx`
```tsx title="/components/assistant-ui/markdown-text.tsx"
import { SyntaxHighlighter } from "./syntax-highlighter";
export const defaultComponents = memoizeMarkdownComponents({
SyntaxHighlighter: SyntaxHighlighter, // [!code ++]
h1: /* ... */,
// ...other elements...
});
```
### Options
Supports all options from [`react-syntax-highlighter`](https://github.com/react-syntax-highlighter/react-syntax-highlighter#props).
### Bundle Optimization
By default, the syntax highlighter uses a light build that only includes languages you register. To include all languages:
```tsx title="/components/assistant-ui/syntax-highlighter.tsx"
import { makePrismAsyncSyntaxHighlighter } from "@assistant-ui/react-syntax-highlighter/full";
```
## Related Components
* [Markdown](/docs/ui/markdown) - Rich text rendering that uses syntax highlighting
* [Mermaid](/docs/ui/mermaid) - Render diagrams instead of code blocks