This is an advanced guide to building mermaid diagrams
ALWAYS test any mermaid diagrams you draw using the mermaid-diagram-validator subagent before you consider them done. NEVER trust your judgement - the agent will do a better job.
classDef invisible fill:#0000,stroke:#0000;
NodeName@{shape: diamond, label: "Decision"}
If you need to configure a mermaid diagram - standalone or embedded in a markdown file - you can do it with YAML frontmatter:
---
config:
theme: forest
---
graph LR
A --> B
You can set a theme in the frontmatter as above - unless instructed otherwise you should probably leave this as the default, or use base
which then allows you to customize things like the main colour scheme:
---
config:
theme: base
themeVariables:
primaryColor: 'red'
primaryTextColor: 'white'
fontSize: 32px
lineColor: 'green'
---
graph TD
A --> B
Theme variables if you need them are at https://mermaid.js.org/config/theming.html#theme-variables
On occasion the user may want a hand-drawn style - this is again set in front matter:
---
config:
look: handDrawn
---
graph TD
A --> B
Use NodeName@{shape: shapeName, label: "Label"}
for custom shapes:
flowchart TB
decision@{shape: diamond, label: "Decision"}
database@{shape: cyl, label: "Database"}
document@{shape: doc, label: "Document"}
input@{shape: lean-r, label: "Input/Output"}
A powerful technique for grouping related nodes without visual borders:
flowchart LR
%% Define invisible style
classDef invisible fill:#0000, stroke:#0000;
%% Group related components invisibly
subgraph api_layer[" "]
api1[API Gateway]
api2[Auth Service]
api3[Rate Limiter]
end
subgraph services[" "]
svc1[User Service]
svc2[Order Service]
svc3[Payment Service]
end
%% Apply invisible style
class api_layer,services invisible;
%% Connections
api1 --> svc1
api1 --> svc2
api2 --> svc1
api3 --> api1
This technique:
[" "]
to hide subgraph titlesDefine reusable styles:
flowchart TB
classDef primary fill:#1e40af,stroke:#1e3a8a,color:#fff;
classDef danger fill:#dc2626,stroke:#b91c1c,color:#fff;
start[Start]:::primary
error[Error]:::danger
start --> error
sequenceDiagram
actor User
participant API
participant DB as Database
%% Grouping with boxes
box rgba(100,100,255,0.1) Frontend
participant UI
participant Cache
end
%% Parallel execution
par Process A
API->>DB: Query users
and Process B
API->>Cache: Check cache
end
%% Conditional flow
alt Cache hit
Cache-->>API: Return cached data
else Cache miss
DB-->>API: Return fresh data
end
Use linkStyle to style specific edges (numbered in order of definition):
flowchart LR
A[Start] --> B[Process]
B --> C[End]
linkStyle 0 stroke:#ff3,stroke-width:4px
linkStyle 1 stroke:#f9f,stroke-width:2px,stroke-dasharray: 5 5
classDef
at the top rather than inline stylesclassDef
with semantic names (primary, error)