Mermaid Renderer
Preview-first Mermaid diagrams with zoom, pan, download, fullscreen, and a code toggle backed by CodeBlock.
Private Registry
This component is distributed only from registry.private.json (Bearer token). Configure @f-ui-private as in the data table docs. Install code-block first (dependency), then @f-ui-private/mermaid-renderer — or add markdown-renderer, which pulls both.
The mermaid-renderer registry item provides MermaidRenderer: Preview by default, Code toggle (uses CodeBlock for the source), dynamic mermaid import, debounced re-render for streaming, a spinner while the library loads, and inline error display. Diagram source is evaluated by Mermaid on the client only.
Installation
1. Configure components.json
Add @f-ui-private (same as Data Table).
2. Install
REGISTRY_TOKEN=xxx pnpm dlx shadcn@latest add @f-ui-private/mermaid-rendererREGISTRY_TOKEN=xxx npx shadcn@latest add @f-ui-private/mermaid-rendererREGISTRY_TOKEN=xxx yarn dlx shadcn@latest add @f-ui-private/mermaid-rendererREGISTRY_TOKEN=xxx bun x shadcn@latest add @f-ui-private/mermaid-rendererregistryDependencies: code-block. Runtime dependency: mermaid.
Contributors
Local build: pnpm registry:build:private — install from .registry-private/r/mermaid-renderer.json.
Usage
import { MermaidRenderer } from "@/components/f-ui/mermaid-renderer/mermaid-renderer";
const source = ["flowchart LR", " A-->B"].join("\n");
export function Example() {
return (
<MermaidRenderer source={source} defaultView="preview" />
);
}Demo
import { MermaidRenderer } from "@/components/f-ui/mermaid-renderer/mermaid-renderer"
const SOURCE = ["graph TD", " A[Start] --> B{Choice}", " B -->|Yes| C[OK]", " B -->|No| D[End]"].join(
"\n",
)
export function MermaidRendererDemo() {
return <MermaidRenderer source={SOURCE} defaultView="preview" />
}Edge Cases & Errors
When mermaid.parse or mermaid.render fails, MermaidRenderer:
- Shows a destructive inline message under the toolbar with the error text (
role="alert"). - Switches the view to Code automatically so users can edit the source without hunting for the toggle.
- Optionally forwards the thrown value to
onErrorfor logging or telemetry.
Invalid or hostile diagram text never runs on the server; everything happens in the browser after the dynamic mermaid import.
Invalid syntax (unclosed node)
Mermaid rejects invalid bracket structure. The renderer shows an inline error and switches to Code so the source can be fixed.
import { MermaidRenderer } from "@/components/f-ui/mermaid-renderer/mermaid-renderer"
const SOURCE = ["flowchart LR", " A[Start --> B[unclosed"].join("\n")
export function MermaidRendererDemoInvalidSyntax() {
return <MermaidRenderer source={SOURCE} defaultView="preview" />
}Unknown Diagram Type
Unrecognized top-level keywords fail at parse time with a clear error.
import { MermaidRenderer } from "@/components/f-ui/mermaid-renderer/mermaid-renderer"
const SOURCE = ["notARealDiagramType TD", " foo --> bar"].join("\n")
export function MermaidRendererDemoUnknownDiagramType() {
return <MermaidRenderer source={SOURCE} defaultView="preview" />
}Incomplete Edge
Incomplete arrows or missing targets surface as parse errors instead of a silent blank preview.
import { MermaidRenderer } from "@/components/f-ui/mermaid-renderer/mermaid-renderer"
const SOURCE = ["graph TD", " A -->"].join("\n")
export function MermaidRendererDemoIncompleteEdge() {
return <MermaidRenderer source={SOURCE} defaultView="preview" />
}API
| Prop | Type | Default | Description |
|---|---|---|---|
source | string | (required) | Mermaid diagram source. |
defaultView | "code" | "preview" | "preview" | Initial view. |
mermaidTheme | string | — | Overrides auto theme (light→default, dark→dark). |
mermaidConfig | MermaidConfig | — | Passed to mermaid.initialize. |
onError | (err: unknown) => void | — | Optional logging hook. |