Mermaid
Render Mermaid diagrams (flowcharts, sequence, class, state,
gantt…) as a framework-agnostic web component. <r-mermaid> lazy-loads the mermaid library
on first render (apps that never use it pay nothing) and draws the diagram into its shadow
root, so it's isolated from page styles.
Use when you want to drop a diagram from text into any page without wiring up mermaid yourself, optionally with a copy / download / fullscreen toolbar and pan-zoom viewer.
Quick Start
<r-mermaid>graph LR; A[Request] --> B[Validate]; B --> C[Store]</r-mermaid>import 'ranui'; // or the standalone entry:
import 'ranui/mermaid';The diagram source is read from the element's text content, or from a URI-encoded
code attribute (use code when the syntax contains <, e.g. classDiagram <|--,
so it survives HTML parsing):
el.code = 'classDiagram\n Dog --|> Animal'; // property setter URI-encodes for youControls
Every control is opt-in via a boolean attribute; a bare <r-mermaid> is a clean static
diagram. The toolbar appears on hover (top-right).
<r-mermaid copy download fullscreen>graph TD; A --> B; B --> C</r-mermaid>- copy: copies the diagram source to the clipboard.
- download: SVG / PNG / source (
.mmd); a single format downloads directly, multiple show a menu. Restrict withdownload="svg"ordownload="svg png". - fullscreen: opens a headerless lightbox (r-modal) with pan & zoom (wheel to zoom,
drag to pan, reset); close via the ✕, backdrop click, or
Esc.
API Reference
Attributes
| Attribute | Type | Default | Description |
|---|---|---|---|
code |
string (URI-encoded) |
— | Diagram source. Falls back to the element's text content when absent. |
theme |
'auto' | 'light' | 'dark' |
'auto' |
Mermaid theme. auto follows the page (.dark / [data-ran-theme]) and re-renders on toggle. |
copy |
boolean | off | Show the copy-source button. |
download |
boolean / "svg png source" |
off | Show the download button; value restricts the offered formats. |
fullscreen |
boolean | off | Show the fullscreen button. |
sheet |
string |
— | Extra CSS injected into the shadow root. |
label-* |
string |
English | Override control labels: label-copy, label-download, label-fullscreen, label-zoom-in, label-zoom-out, label-reset, label-diagram (fullscreen dialog name). |
Events
All events bubble and cross the shadow boundary (composed).
| Event | detail |
Fired when |
|---|---|---|
render |
{ ok: true } |
a diagram finished rendering |
copied |
{ kind: 'source' } |
the source was copied |
download |
{ format: 'svg' | 'png' | 'source' } |
a file was downloaded |
error |
{ message: string } |
the diagram failed to parse/render |
fullscreenchange |
{ open: boolean } |
the fullscreen lightbox opened/closed |
CSS Parts
| Part | Description |
|---|---|
mermaid |
The outer wrapper. |
diagram |
The rendered-diagram container. |
toolbar |
The hover control bar. |
button |
Each toolbar icon button. |
error |
The error message box (on render failure). |
r-mermaid::part(toolbar) {
background: var(--surface);
}CSS Variables
Override on the element (each falls back to a semantic token, then a literal):
--ran-mermaid-padding, --ran-mermaid-toolbar-background, --ran-mermaid-toolbar-gap,
--ran-mermaid-button-size, --ran-mermaid-button-color, --ran-mermaid-button-hover-background,
--ran-mermaid-error-color.
Notes
- Lazy-loaded: mermaid (and the r-modal used for fullscreen) are dynamic imports, so they arrive as separate async chunks only when a diagram renders / fullscreen opens.
- Rendering fidelity:
<r-mermaid>uses mermaid's own render, so all diagram types and themes are supported. - PNG export: diagrams that use HTML labels (mermaid
htmlLabels) render via<foreignObject>, which can taint the canvas and make PNG export fail; anerrorevent is dispatched in that case. SVG and source export always work.