Skip to content

Mermaid

Render Mermaid diagrams using Mermaid.js on the client.


Quick Start

Mermaid requires the Mermaid.js runtime. Include it once:

from fasthtml.common import Script
from faststrap import Mermaid

Script(src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js")
Mermaid("""
graph TD
    A[Start] --> B{Decision}
    B -->|Yes| C[Ship]
    B -->|No| D[Revise]
""")

Theme and Security

Mermaid(
    """
sequenceDiagram
  client->>server: request
  server-->>client: response
""",
    theme="dark",
    security_level="strict",
)

Mermaid config is global. If you need custom config, initialize Mermaid manually before rendering.


Layout Control

Mermaid(diagram, min_width=280)

HTMX Support

Faststrap re-initializes Mermaid diagrams after HTMX swaps when Mermaid.js is available.


Security Notes

Only render trusted diagrams when using relaxed security settings. Keep security_level="strict" for untrusted input.


API Reference

faststrap.components.display.mermaid.Mermaid(diagram, *, theme=None, security_level=None, min_width=None, **kwargs)

Render Mermaid diagram text inside a Mermaid container.

Source code in src/faststrap/components/display/mermaid.py
@register(category="display", requires_js=True)
@beta
def Mermaid(
    diagram: str,
    *,
    theme: str | None = None,
    security_level: str | None = None,
    min_width: str | int | None = None,
    **kwargs: Any,
) -> Div:
    """Render Mermaid diagram text inside a Mermaid container."""
    cfg = resolve_defaults(
        "Mermaid",
        theme=theme,
        security_level=security_level,
    )
    c_theme = cfg.get("theme", theme)
    c_security = cfg.get("security_level", security_level)

    user_cls = kwargs.pop("cls", "")
    cls = merge_classes("mermaid faststrap-mermaid", user_cls)

    attrs: dict[str, Any] = {
        "cls": cls,
        "data_fs_mermaid": "true",
    }

    if c_theme:
        attrs["data_fs_mermaid_theme"] = c_theme
    if c_security:
        attrs["data_fs_mermaid_security"] = c_security

    if min_width is not None:
        attrs["style"] = f"min-width: {_normalize_size(min_width)};"

    attrs.update(convert_attrs(kwargs))

    return Div(diagram, **attrs)