Skip to main content

Mermaid Diagram Style Guide

Purpose

This guide establishes standards for creating Mermaid diagrams in portfolio documentation. Use these conventions to ensure diagrams are consistent, accessible, and maintainable across all docs.

Scope

  • Color palette and theming standards
  • Diagram type selection criteria
  • Naming conventions and labeling
  • Layout and spacing guidelines
  • Accessibility requirements
  • Common patterns and anti-patterns
  • Troubleshooting and validation

Why Mermaid?

Benefits:

  • Version-controllable: Text-based format in markdown
  • Maintainable: Easy to update without specialized tools
  • Consistent: Automated layout and styling
  • Accessible: Screen reader compatible with proper alt text
  • Portable: Renders in GitHub, Docusaurus, VS Code, and most markdown viewers

When NOT to use Mermaid:

  • Complex architectural diagrams requiring precise positioning → Use draw.io or Excalidraw
  • Screenshots or UI mockups → Use actual images with alt text
  • Data visualizations → Use charts.js or D3.js
  • Interactive diagrams → Consider custom React components

Standard Color Palette

Primary Colors

Use these colors consistently across all diagrams:

# Status Colors
success: '#51cf66' # Green - completed, active, success states
warning: '#ffd43b' # Yellow - in-progress, warnings, attention needed
error: '#ff6b6b' # Red - errors, blocked, critical items
info: '#339af0' # Blue - informational, default states

# Neutral Colors
primary: '#228be6' # Primary blue - main actions, highlights
secondary: '#868e96' # Gray - secondary elements, backgrounds
dark: '#212529' # Dark gray/black - text, borders
light: '#f1f3f5' # Light gray - backgrounds, containers

Semantic Usage

Success (Green #51cf66)

  • Completed tasks or stages
  • Passing tests
  • Active/healthy services
  • Approved states

Warning (Yellow #ffd43b)

  • In-progress work
  • Pending reviews
  • Warnings or cautions
  • Intermediate states

Error (Red #ff6b6b)

  • Failed tests or deployments
  • Blocked tasks
  • Critical issues
  • Deprecated elements

Info (Blue #339af0)

  • Documentation references
  • Informational nodes
  • Default states
  • General flow

Secondary (Gray #868e96)

  • Background elements
  • Less important nodes
  • Supporting information

Diagram Type Selection

Flowcharts (graph TB/LR)

Use for:

  • Process flows and workflows
  • Decision trees
  • State machines
  • Pipeline stages
  • Hierarchical relationships

Example:

```mermaid
graph TB
Start([Start]) --> Decision{Is valid?}
Decision -->|Yes| Process[Process data]
Decision -->|No| Error[Return error]
Process --> End([End])
Error --> End

style Start fill:#51cf66,stroke:#2f9e44,color:#fff
style End fill:#51cf66,stroke:#2f9e44,color:#fff
style Error fill:#ff6b6b,stroke:#c92a2a,color:#fff
style Process fill:#339af0,stroke:#1971c2,color:#fff
```

Sequence Diagrams

Use for:

  • API interactions
  • Message flows
  • Request/response cycles
  • Temporal relationships
  • Actor interactions

Example:

```mermaid
sequenceDiagram
participant Client
participant API
participant DB

Client->>+API: POST /projects
API->>+DB: INSERT project
DB-->>-API: project_id
API-->>-Client: 201 Created

Note over Client,DB: Project creation flow
```

State Diagrams

Use for:

  • Application states
  • Lifecycle management
  • Workflow stages
  • Status transitions

Example:

```mermaid
stateDiagram-v2
[*] --> Draft
Draft --> Review: Submit
Review --> Approved: Approve
Review --> Draft: Request changes
Approved --> Published: Publish
Published --> Archived: Archive
Archived --> [*]

state Review {
[*] --> Pending
Pending --> InProgress
InProgress --> Completed
}
```

Class Diagrams

Use for:

  • Type relationships
  • Schema definitions
  • Component hierarchies
  • Data models

Example:

```mermaid
classDiagram
class Project {
+string slug
+string title
+string summary
+validate()
+toJSON()
}

class Evidence {
+string dossier
+string threatModel
+string[] adrs
}

Project "1" --> "1" Evidence: has
```

Entity Relationship Diagrams

Use for:

  • Database schemas
  • Data relationships
  • Cardinality mapping

Example:

```mermaid
erDiagram
PROJECT ||--o{ TAG : has
PROJECT ||--o| EVIDENCE : contains
PROJECT {
string slug PK
string title
string summary
}
TAG {
string name PK
string category
}
EVIDENCE {
string project_slug FK
string dossier_url
}
```

Gantt Charts

Use for:

  • Project timelines
  • Milestone tracking
  • Phase planning
  • Resource allocation

Example:

```mermaid
gantt
title Phase 3 Implementation Timeline
dateFormat YYYY-MM-DD
section Stage 3.1
Registry Implementation :done, s31, 2026-01-15, 3d
section Stage 3.2
Evidence Components :done, s32, 2026-01-18, 2d
section Stage 3.3
Testing :active, s33, 2026-01-20, 2d
section Stage 3.4
Documentation :s34, 2026-01-22, 2d
```

Naming Conventions

Node IDs

Rules:

  • Use PascalCase for major nodes: StartNode, ProcessData
  • Use camelCase for internal/technical nodes: apiCall, dbQuery
  • Use UPPER_CASE for constants/config: MAX_RETRIES, API_URL
  • Keep IDs semantic and descriptive

Examples:

```mermaid
graph LR
UserInput[User Input] --> ValidateForm[Validate Form]
ValidateForm --> ProcessSubmission[Process Submission]
ValidateForm --> ShowError[Show Error]
```

❌ Bad:

A --> B
B --> C
node1 --> node2

✅ Good:

UserInput --> ValidateForm
ValidateForm --> ProcessSubmission

Labels

Rules:

  • Use sentence case: "Process user input" not "Process User Input"
  • Be concise but clear: max 5 words preferred
  • Use active voice: "Validate data" not "Data validation"
  • Avoid articles unless necessary: "Send request" not "Send the request"

Examples:

```mermaid
graph TB
Start([Start authentication]) --> CheckToken{Token valid?}
CheckToken -->|Yes| GrantAccess[Grant access]
CheckToken -->|No| DenyAccess[Deny access]
```

Layout Guidelines

Direction

Top to Bottom (TB): Default for most flows

```mermaid
graph TB
A --> B
B --> C
```

Left to Right (LR): For horizontal timelines, pipelines

```mermaid
graph LR
Stage1 --> Stage2 --> Stage3
```

Recommendation: Use TB for most diagrams unless horizontal flow is more intuitive (e.g., CI/CD pipelines, timelines).

Node Shapes

Choose shapes that convey meaning:

```mermaid
graph TB
Start([Start/End - Stadium])
Process[Process - Rectangle]
Decision{Decision - Diamond}
Data[(Database - Cylinder)]
Document{{Document - Folded document}}
Subprocess[[Subprocess - Double rectangle]]
```

Shape semantics:

  • ([text]) Stadium/Pill: Start/End points
  • [text] Rectangle: Standard process steps
  • {text} Diamond: Decision points
  • [(text)] Cylinder: Databases, data stores
  • {{text}} Document shape: Documents, artifacts
  • [[text]] Subroutine: Subprocesses, modules

Spacing and Grouping

Use subgraphs for logical grouping:

```mermaid
graph TB
subgraph Frontend
UI[User Interface]
Router[Router]
end

subgraph Backend
API[API Server]
DB[(Database)]
end

UI --> Router
Router --> API
API --> DB
```

Benefits:

  • Visual hierarchy
  • Logical separation
  • Easier maintenance
  • Clear boundaries

Styling Patterns

Standard Node Styling

Template:


style NodeID fill:#hexcolor,stroke:#hexcolor,stroke-width:2px,color:#textcolor

Examples:

```mermaid
graph TB
Success[Completed]
InProgress[Active]
Error[Failed]
Info[Informational]

style Success fill:#51cf66,stroke:#2f9e44,stroke-width:2px,color:#fff
style InProgress fill:#ffd43b,stroke:#fab005,stroke-width:2px,color:#000
style Error fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
style Info fill:#339af0,stroke:#1971c2,stroke-width:2px,color:#fff
```

Text Color Rules

  • Dark text (color:#000): Use on light backgrounds (yellow, light gray)
  • Light text (color:#fff): Use on dark backgrounds (red, green, blue, dark gray)

Border Width

  • stroke-width:2px: Standard for all nodes
  • stroke-width:3px: For emphasis (start/end nodes)
  • stroke-width:1px: For de-emphasized or background elements

For repeated styling, use classes:

```mermaid
graph TB
A[Success state]
B[Success state 2]
C[Error state]

class A,B successNode
class C errorNode

classDef successNode fill:#51cf66,stroke:#2f9e44,stroke-width:2px,color:#fff
classDef errorNode fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
```

Common Patterns

Testing Pyramid

```mermaid
graph TB
subgraph E2E["E2E Tests - ~58 tests"]
E1["Evidence link resolution"]
E2["Component rendering"]
E3["Route coverage"]
end

subgraph INT["Integration Tests"]
I1["API routes"]
I2["Data fetching"]
end

subgraph UNIT["Unit Tests - ~70 tests"]
U1["Registry validation"]
U2["Slug helpers"]
U3["Link construction"]
end

E2E --> INT
INT --> UNIT

style E2E fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
style INT fill:#ffd43b,stroke:#fab005,stroke-width:2px,color:#000
style UNIT fill:#51cf66,stroke:#2f9e44,stroke-width:2px,color:#000
```

CI/CD Pipeline

```mermaid
graph LR
Commit([Commit]) --> Lint[Lint]
Lint --> Test[Test]
Test --> Build[Build]
Build --> Deploy[Deploy]
Deploy --> Success([Success])

Lint -->|Fails| Failed([Failed])
Test -->|Fails| Failed
Build -->|Fails| Failed

style Commit fill:#339af0,stroke:#1971c2,stroke-width:2px,color:#fff
style Success fill:#51cf66,stroke:#2f9e44,stroke-width:2px,color:#fff
style Failed fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
style Lint fill:#e9ecef,stroke:#868e96,stroke-width:2px,color:#000
style Test fill:#e9ecef,stroke:#868e96,stroke-width:2px,color:#000
style Build fill:#e9ecef,stroke:#868e96,stroke-width:2px,color:#000
style Deploy fill:#e9ecef,stroke:#868e96,stroke-width:2px,color:#000
```

State Machine

```mermaid
stateDiagram-v2
[*] --> Draft
Draft --> Review: submit
Review --> Approved: approve
Review --> Draft: request_changes
Approved --> Published: publish
Published --> Archived: archive
Archived --> [*]

note right of Review
Requires 2 approvals
end note
```

API Request Flow

```mermaid
sequenceDiagram
participant Client
participant API
participant DB

Client->>+API: POST /api/projects
API->>API: Validate schema
alt Valid
API->>+DB: INSERT project
DB-->>-API: project_id
API-->>Client: 201 Created
else Invalid
API-->>Client: 400 Bad Request
end
API->>-Client: Close connection
```

Accessibility Guidelines

Alt Text

Always wrap diagrams in details/summary when possible:

<details>
<summary>View CI/CD pipeline diagram</summary>

```mermaid
graph LR
...
```

**Text description**: The CI/CD pipeline consists of 5 stages: lint, test, build, deploy, and success. Failed stages redirect to a failed end state.

</details>

High Contrast

  • Ensure minimum 4.5:1 contrast ratio for text
  • Use our standard palette (pre-validated for contrast)
  • Test with browser accessibility tools

Descriptive Labels

❌ Bad:

```mermaid
graph TB
A --> B
B --> C
```

✅ Good:

```mermaid
graph TB
ValidateInput[Validate user input] --> ProcessData[Process data]
ProcessData --> SaveResult[Save result]
```

Anti-Patterns

❌ Avoid: Overly Complex Diagrams

Problem:

Solution: Break into multiple focused diagrams or use subgraphs.

❌ Avoid: Inconsistent Styling

Problem: Different colors for the same semantic meaning across diagrams.

Solution: Use the standard palette and semantic rules from this guide.

❌ Avoid: Unlabeled Edges

Problem:

Solution: Add labels to clarify relationships:

```mermaid
graph LR
Request[API Request] -->|Success| Success[200 OK]
Request -->|Error| Error[400 Bad Request]
```

❌ Avoid: Generic Node Names

Problem: node1, step2, A, B

Solution: Use descriptive, semantic names: ValidateInput, ProcessData, SaveResult

Validation and Testing

Local Preview

  1. VS Code: Install "Markdown Preview Mermaid Support" extension
  2. Docusaurus dev server: pnpm dev and navigate to the page
  3. Mermaid Live Editor: Paste code into https://mermaid.live

Build Validation

Run local build to catch syntax errors:

cd portfolio-docs
pnpm build

Common errors:

  • Missing quotes around labels with spaces
  • Invalid direction (use TB, TD, LR, RL, BT, not others)
  • Unclosed subgraphs
  • Invalid style syntax

Syntax Checker

Use the Mermaid CLI for validation:

# Install
pnpm add -D @mermaid-js/mermaid-cli

# Validate
pnpm exec mmdc -i diagram.mmd -o diagram.svg

Quick Reference

Color Palette Summary

Use CaseColorHexText Color
Success/CompleteGreen#51cf66#fff
Warning/In-ProgressYellow#ffd43b#000
Error/BlockedRed#ff6b6b#fff
Info/DefaultBlue#339af0#fff
SecondaryGray#868e96#fff

Node Shapes Summary

ShapeSyntaxUse Case
Stadium([text])Start/End
Rectangle[text]Process
Diamond{text}Decision
Cylinder[(text)]Database
Document{{text}}Document/Artifact
Subroutine[[text]]Subprocess

Direction Codes

CodeDirectionUse Case
TB/TDTop to BottomDefault flows
LRLeft to RightTimelines, pipelines
BTBottom to TopRare, upward flows
RLRight to LeftRare, reverse flows

Examples Repository

Complete Flowchart Example

```mermaid
graph TB
Start([User submits form]) --> Validate{Valid input?}
Validate -->|Yes| Process[Process submission]
Validate -->|No| Error[Show error message]
Process --> Save[(Save to database)]
Save --> Success([Success])
Error --> End([End])
Success --> End

style Start fill:#339af0,stroke:#1971c2,stroke-width:2px,color:#fff
style Validate fill:#e9ecef,stroke:#868e96,stroke-width:2px,color:#000
style Process fill:#339af0,stroke:#1971c2,stroke-width:2px,color:#fff
style Save fill:#339af0,stroke:#1971c2,stroke-width:2px,color:#fff
style Success fill:#51cf66,stroke:#2f9e44,stroke-width:2px,color:#fff
style Error fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
style End fill:#868e96,stroke:#495057,stroke-width:2px,color:#fff
```

Complete Sequence Diagram Example

```mermaid
sequenceDiagram
actor User
participant App
participant API
participant DB

User->>+App: Click "Submit"
App->>App: Validate form
App->>+API: POST /projects

alt Valid request
API->>+DB: INSERT INTO projects
DB-->>-API: project_id
API-->>-App: 201 Created {project}
App-->>User: Show success message
else Invalid request
API-->>App: 400 Bad Request
App-->>User: Show error message
end

App->>-User: Update UI
```

See Also