This theme supports Mermaid diagrams directly in your Markdown content. Mermaid lets you create diagrams and visualizations using text and code.
About Mermaid.js
This theme integrates Mermaid.js (v11) to render diagrams from text definitions within Markdown code blocks. Mermaid is a JavaScript-based diagramming and charting tool that uses text-based syntax inspired by Markdown.
For complete syntax documentation, see the Mermaid.js documentation.
Getting Started
To create a Mermaid diagram, simply use a fenced code block with mermaid as the language identifier:
|
|
The diagram will be automatically rendered when the page loads.
Features
- Auto-detection: Mermaid script only loads on pages that contain diagrams
- Theme Support: Diagrams automatically adapt to light/dark mode
- HTML Labels: Support for HTML content in labels (like
<br/>for line breaks) - Configurable: Customize version, security level, and more in your site config
Configuration
You can configure Mermaid in your site config:
hugo.yaml:
|
|
hugo.toml:
|
|
Additional Global Options
These optional settings use Mermaid’s defaults when not specified:
hugo.yaml:
|
|
hugo.toml:
|
|
For diagram-specific options (like flowchart.useMaxWidth), use Mermaid’s init directive directly in your diagram:
|
|
Security Note: The default
securityLevel: strictis recommended. Set tolooseonly if you need HTML labels like<br/>in your diagrams.
Available Themes
| Theme | Description |
|---|---|
default |
Standard colorful theme |
neutral |
Grayscale, great for printing and dark mode |
dark |
Designed for dark backgrounds |
forest |
Green color palette |
base |
Minimal theme, customizable with themeVariables |
null |
Disable theming entirely |
Custom Theme Variables
For full control, use the base theme with custom variables:
hugo.yaml:
|
|
hugo.toml:
|
|
Common variables: primaryColor, secondaryColor, tertiaryColor, primaryTextColor, lineColor, background, fontFamily
Note: Theme variables only work with the
basetheme and must use hex color values (e.g.,#ff0000).
Diagram Types
Flowchart
Flowcharts are the most common diagram type. Use graph or flowchart with direction indicators:
TDorTB: Top to bottomBT: Bottom to topLR: Left to rightRL: Right to left
flowchart LR
A[Hard edge] -->|Link text| B(Round edge)
B --> C{Decision}
C -->|One| D[Result one]
C -->|Two| E[Result two]
Sequence Diagram
Perfect for showing interactions between components:
sequenceDiagram
participant Alice
participant Bob
Alice->>John: Hello John, how are you?
loop Healthcheck
John->>John: Fight against hypochondria
end
Note right of John: Rational thoughts <br/>prevail!
John-->>Alice: Great!
John->>Bob: How about you?
Bob-->>John: Jolly good!
Class Diagram
Visualize class structures and relationships:
classDiagram
Animal <|-- Duck
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
State Diagram
Model state machines and transitions:
stateDiagram-v2
[*] --> Still
Still --> [*]
Still --> Moving
Moving --> Still
Moving --> Crash
Crash --> [*]
Entity Relationship Diagram
Document database schemas:
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
CUSTOMER {
string name
string custNumber
string sector
}
ORDER {
int orderNumber
string deliveryAddress
}
Gantt Chart
Plan and track project schedules:
gantt
title A Gantt Diagram
dateFormat YYYY-MM-DD
section Section
A task :a1, 2024-01-01, 30d
Another task :after a1, 20d
section Another
Task in Another :2024-01-12, 12d
another task :24d
Pie Chart
Display proportional data:
pie showData
title Key elements in Product X
"Calcium" : 42.96
"Potassium" : 50.05
"Magnesium" : 10.01
"Iron" : 5
Git Graph
Visualize Git branching strategies:
gitGraph
commit
commit
branch develop
checkout develop
commit
commit
checkout main
merge develop
commit
commit
Mindmap
Create hierarchical mindmaps:
mindmap
root((mindmap))
Origins
Long history
Popularisation
British popular psychology author Tony Buzan
Research
On effectiveness<br/>and features
On Automatic creation
Uses
Creative techniques
Strategic planning
Argument mapping
Tools
Pen and paper
Mermaid
Timeline
Display chronological events:
timeline
title History of Social Media Platform
2002 : LinkedIn
2004 : Facebook
: Google
2005 : YouTube
2006 : Twitter
Advanced Features
HTML in Labels
To use HTML in labels, you must set securityLevel: loose in your site config:
hugo.yaml:
|
|
hugo.toml:
|
|
Then you can use HTML tags like <br/> for line breaks:
|
|
Per-Diagram Theming
Override the theme for a specific diagram using Mermaid’s frontmatter:
|
|
%%{init: {'theme': 'forest'}}%%
graph TD
A[Christmas] -->|Get money| B(Go shopping)
B --> C{Let me think}
C -->|One| D[Laptop]
C -->|Two| E[iPhone]
C -->|Three| F[Car]
Inline Styling with style
You can style individual nodes directly within your diagram using the style directive:
|
|
Result:
flowchart LR
A[Start] --> B[Process] --> C[End]
style A fill:#4ade80,stroke:#166534,color:#000
style B fill:#60a5fa,stroke:#1e40af,color:#000
style C fill:#f87171,stroke:#991b1b,color:#fff
Style properties include:
fill- Background colorstroke- Border colorstroke-width- Border thicknesscolor- Text colorstroke-dasharray- Dashed border (e.g.,5 5)
Styling with CSS Classes
You can define reusable styles with classDef and apply them using :::className:
|
|
Result:
flowchart LR
A:::success --> B:::info --> C:::warning
classDef success fill:#4ade80,stroke:#166534,color:#000
classDef info fill:#60a5fa,stroke:#1e40af,color:#000
classDef warning fill:#fbbf24,stroke:#92400e,color:#000
Subgraphs
Group related nodes together:
flowchart TB
subgraph one
a1-->a2
end
subgraph two
b1-->b2
end
subgraph three
c1-->c2
end
one --> two
three --> two
two --> c2
Theme Switching
This theme automatically detects your site’s light/dark mode preference and adjusts the Mermaid diagram theme accordingly:
- Light mode: Uses the
defaultMermaid theme - Dark mode: Uses the
darkMermaid theme (configurable)
Try toggling the theme switcher to see diagrams update in real-time!
Complex Example
Here’s an example with subgraphs, HTML labels, emojis, and custom styling:
flowchart TD
subgraph client["👤 Client"]
A["User Device<br/>192.168.1.10"]
end
subgraph cloud["☁️ Cloud Gateway"]
B["Load Balancer<br/>(SSL Termination)"]
end
subgraph server["🖥️ Application Server"]
C["API Gateway<br/>10.0.0.1"]
D["Auth Service<br/>10.0.0.2"]
E["Web Server<br/>10.0.0.3"]
F["Database<br/>10.0.0.4"]
end
A -- "HTTPS Request" --> B
B -- "Forward<br/>(internal)" --> C
C -- "Authenticate" --> D
D -- "Token" --> C
C -- "Route" --> E
E --> F
style client fill:#1a365d,stroke:#2c5282,color:#fff
style cloud fill:#f6ad55,stroke:#dd6b20,color:#000
style server fill:#276749,stroke:#22543d,color:#fff
Note: This example requires
securityLevel: loosefor HTML labels and styling to work.
Known Limitations
Dark Mode Theming
Mermaid.js’s built-in themes have some limitations:
darktheme (default): Best text contrast, but some diagram backgrounds may appear brownish (e.g., Gantt charts)neutraltheme: Better background colors, but some text (labels, legends) may have reduced contrast
For full control, use the base theme with custom variables:
hugo.yaml:
|
|
hugo.toml:
|
|
We plan to improve dark mode theming in future updates as Mermaid.js evolves.
Troubleshooting
Diagram not rendering?
- Make sure you’re using a fenced code block with
mermaidas the language - Check your browser’s console for syntax errors
- Verify your Mermaid syntax at Mermaid Live Editor
HTML not working in labels?
HTML in labels requires securityLevel: loose. Update your configuration:
hugo.yaml:
|
|
hugo.toml:
|
|
Warning: Using
loosesecurity level allows HTML in diagrams. Only use this if you trust your diagram content.
Syntax errors?
Mermaid is strict about syntax. Common issues:
- Missing spaces around arrows
- Unclosed brackets or quotes
- Invalid node IDs (avoid special characters)
Resources
- Mermaid Documentation
- Mermaid Live Editor - Test diagrams interactively
- Mermaid Syntax Reference