# Mermaid on Github Examples
All of these diagrams are dynamically rendered during html display by Github, the images generated from text inside the Github-Flavored Markdown. None are static images. Mermaid support was released for Github on [2022-02-14](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/)
Pros & Cons:
* Pro: You don't need to care about the layout.
* Con: You cannot control the layout.
Notes:
* Not all the features of Mermaid (in particular symbols `B-->C[fa:fa-ban forbidden]`, hyperlink and tooltips) are supported by Github.
* A number of other Markdown features don't work within Mermaid labels but don't break it: `:grinning:`=😀, `*italic*`=*italic*, mathjax `n2`=n2.
* Many characters, in paricular emoji `😀` & some extended ASCII `†¶` (but oddly, not extended ASCII `²`), break Mermaid with errors.
* Some embed GitHub gists and pages into other pages, and this doesn't seem to work (yet).
Docs & Tools:
* [Mermaid Docs](https://mermaid-js.github.io/mermaid/)
* [Mermaid Live Editor](https://mermaid.live/edit) (Also supports copy from Github gists and saving to `.svg` `.png`)
* [Mermaid Cheat Sheet](https://jojozhuang.github.io/tutorial/mermaid-cheat-sheet/)
Some real-world examples of Mermaid Diagrams in Github:
* [Pattern: AppDelegate -> Router -> MVP/C](https://gist.github.com/vtsoup/f1f79d19d6f8e58396bde8847c09a62e)
## [Graph (aka Flowchart)](https://mermaid-js.github.io/mermaid/#/flowchart)
### Simple Left-Right Graph
```mermaid
graph LR;
A-->B;
A-->C;
B-->D;
C-->D;
```
### Simple Graph to Mark Chapters
```mermaid
flowchart LR
a[Chapter 1] --> b[Chapter 2] --> c[Chapter 3]
c-->d[Using Ledger]
c-->e[Using Trezor]
d-->f[Chapter 4]
e-->f
```
### Simple Top-Down Graph
```mermaid
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
```
### Dependency Sets
```mermaid
graph TB
A & B--> C & D
```
### Binary Tree
```mermaid
graph TB
A((1))-->B((2))
A-->C((3))
B-->D((4))
B-->E((5))
C-->F((6))
C-->G((7))
D-->H((8))
D-->I((9))
E-->J((10))
```
### Graph Shape & Link Variants
```mermaid
graph LR
A[Square Rect] -- Link text --> B((Circle))
A --> C(Round Rect)
B --> D{Rhombus}
C --> D
```
### Basic Flowchart
```mermaid
graph TB
A[Start] ==> B{Is it?};
B -->|Yes| C[OK];
C --> D[Rethink];
D -.-> B;
B ---->|No| E[End];
```
### More complex Flowchart "Coffee Machine Not Working?"
```mermaid
graph TD
A(Coffee machine
not working) --> B{Machine has power?}
B -->|No| H(Plug in and turn on)
B -->|Yes| C{Out of beans or water?} -->|Yes| G(Refill beans and water)
C -->|No| D{Filter warning?} -->|Yes| I(Replace or clean filter)
D -->|No| F(Send for repair)
```
### Flowchart with Hyperlinks
* Hyperlinks in Github Mermaid are not by default visually different.
* I've tried adding a non-emoji unicode symbols, and even extended ASCII B† to signify a hyperlinks, they do not work. (See issues https://github.com/mermaid-js/mermaid/issues/2869 & https://github.com/mermaid-js/mermaid/issues/2870 )
* Note that tooltips feature of Mermaid does not seem to function.
* TBD: Create a better example and document how Mermaid hyperlinks function better with what GitHub supports, and come up some work-arounds for best practices (maybe some Mermaid styling trick).
*
```mermaid
flowchart LR;
A-->B;
B-->C;
C-->D;
click A callback "Tooltip for a callback"
click B "http://www.github.com" "This is a tooltip for a link"
click A call callback() "Tooltip for a callback"
click B† href "http://www.github.com" "This is a tooltip for a link"
```
### More Complex Example
```mermaid
flowchart LR;
A[CI MULTI CHAPTCHA]-->B{Select captcha service by developer?};
classDef green color:#022e1f,fill:#00f500;
classDef red color:#022e1f,fill:#f11111;
classDef white color:#022e1f,fill:#fff;
classDef black color:#fff,fill:#000;
B--YES-->C[How to use?]:::green;
C-->U[I choose recaptcha.]:::green;
U--Views-->Q["echo CIMC_JS('recaptcha');\n echo CIMC_HTML(['captcha_name'=>'recaptcha']);"]:::green;
U--Controller-->W["CIMC_RULE('recaptcha');"]:::green;
C-->I[I choose arcaptcha.]:::white;
I--Views-->O["echo CIMC_JS('arcaptcha');\n echo CIMC_HTML(['captcha_name'=>'arcaptcha']);"]:::white;
I--Controller-->P["CIMC_RULE('arcaptcha');"]:::white;
C-->X[I choose bibot.]:::red;
X--Views-->V["echo CIMC_JS('bibot');\n echo CIMC_HTML(['captcha_name'=>'bibot']);"]:::red;
X--Controller-->N["CIMC_RULE('bibot');"]:::red;
B--NO-->D[How to use?]:::black;
D---Views:::black-->F["echo CIMC_JS('randomcaptcha');\n echo CIMC_HTML(['captcha_name'=>'randomcaptcha']);"]:::black;
D---Controller:::black-->T["CIMC_RULE('archaptcha,recaptcha,bibot');"]:::black;
```
### Subgraph
```mermaid
graph TB
c1-->a2
subgraph one
a1-->a2
end
subgraph two
b1-->b2
end
subgraph three
c1-->c2
end
```
### Flowchart with Styling
```mermaid
graph TB
sq[Square shape] --> ci((Circle shape))
subgraph A
od>Odd shape]-- Two line
edge comment --> ro
di{Diamond with
line break} -.-> ro(Rounded
square
shape)
di==>ro2(Rounded square shape)
end
%% Notice that no text in shape are added here instead that is appended further down
e --> od3>Really long text with linebreak
in an Odd shape]
%% Comments after double percent signs
e((Inner / circle
and some odd
special characters)) --> f(,.?!+-*ز)
cyr[Cyrillic]-->cyr2((Circle shape Начало));
classDef green fill:#9f6,stroke:#333,stroke-width:2px;
classDef orange fill:#f96,stroke:#333,stroke-width:4px;
class sq,e green
class di orange
```
### Styled Flowchart with Titles
From [Com Powys-Lybbe's blog](https://dompl.medium.com/produce-great-looking-flowcharts-in-seconds-7f3bea64f2e2), this examples shows some best practices of comments to seperate nodes, links, and styles.
```mermaid
graph TD%% Adding a title to the flowchart using the SubGraph feature
subgraph SGTitle ["WHAT IS THE ROOT CAUSE OF THE PROBLEM? ____"]
%% Nodes
0[Key Variable
Target: 100, Actual: 80]
1[Top Variable 1
Tgt: 20, Act: 20]
2[Top Variable 2
Tgt: 30, Act: 30]
3[Top Variable 3
Tgt: 50, Act: 30]
31[Sub Variable 1
Tgt: 25, Act: 25]
32[Sub Variable 2
Tgt: 25, Act: 5]
321[Element 1
Tgt: 20, Act: 1]
322[Element 2
Tgt: 5, Act: 4]
%% Close title subgraph
end
%% Links
0 --- 1
0 --- 2
0 --- 3
3 --- 31
3 --- 32
32 --- 321
32 --- 322
%% Defining node styles
classDef Red fill:#FF9999;
classDef Amber fill:#FFDEAD;
classDef Green fill:#BDFFA4;
%% Assigning styles to nodes
class 3,32,321 Red;
class 322 Amber;
class 1,2,31 Green;
%% Changing color of links [NOTE: Link arrows will remain black]
linkStyle default fill: none, stroke: grey;
%% Styling the title subgraph
classDef Title fill:#FF99FF00, stroke-width:0, color:grey, font-weight:bold, font-size: 17px;
class SGTitle Title;
```
## [Sequence Diagram](https://mermaid-js.github.io/mermaid/#/sequenceDiagram)
```mermaid
sequenceDiagram
Alice ->> Bob: Hello Bob, how are you?
Bob-->>John: How about you John?
Bob--x Alice: I am good thanks!
Bob-x John: I am good thanks!
Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row.
Bob-->Alice: Checking with John...
Alice->John: Yes... John, how are you?
```
### Three-way Handshake (Sequence Diagram)
```mermaid
sequenceDiagram
participant c as Client
participant s as Server
c->>s: SYN
note over c, s: SEQ1 = 100
ACK1 not set
s->>c: SYN+ACK
note over c, s: SEQ2 = 300
ACK2 = 100+1 = 101
c->>s: ACK
note over c, s: SEQ3 = 101
ACK3 = 300+1 = 301
```
```mermaid
sequenceDiagram
A->> B: Query
B->> C: Forward query
Note right of C: Thinking...
C->> B: Response
B->> A: Forward response
```
### How mermaid is generated by Github
```mermaid
sequenceDiagram
participant dotcom
participant iframe
participant viewscreen
dotcom->>iframe: loads html w/ iframe url
iframe->>viewscreen: request template
viewscreen->>iframe: html & javascript
iframe->>dotcom: iframe ready
dotcom->>iframe: set mermaid data on iframe
iframe->>iframe: render mermaid
```
### Sequence with Loop & Notes
```mermaid
sequenceDiagram
autonumber
Student->>Admin: Can I enrol this semester?
loop enrolmentCheck
Admin->>Admin: Check previous results
end
Note right of Admin: Exam results may
be delayed
Admin-->>Student: Enrolment success
Admin->>Professor: Assign student to tutor
Professor-->>Admin: Student is assigned
```
## [Class Diagram](https://mermaid-js.github.io/mermaid/#/classDiagram)
```mermaid
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](https://mermaid-js.github.io/mermaid/#/stateDiagram)
### Simple State Diagram
```mermaid
stateDiagram-v2
[*] --> Still
Still --> [*]
Still --> Moving
Moving --> Still
Moving --> Crash
Crash --> [*]
```
### More Complex
```mermaid
stateDiagram-v2
[*] --> Unwritten
Unwritten --> Open: Open
Unwritten --> Void: Void
Open --> Void: Void
Open --> Cancelled: Cancel
Open --> Closed: Close
Open --> Open: Update
Closed --> Open: Open
```
```mermaid
stateDiagram-v2
[*] --> First
state First {
[*] --> second
second --> [*]
}
```
```mermaid
stateDiagram-v2
state fork_state <>
[*] --> fork_state
fork_state --> State2
fork_state --> State3
state join_state <>
State2 --> join_state
State3 --> join_state
join_state --> State4
State4 --> [*]
```
```mermaid
stateDiagram-v2
State1: The state with a note
note right of State1
Important information! You can write
notes.
end note
State1 --> State2
note left of State2 : This is the note to the left.
```
## Shipment Status
```mermaid
stateDiagram-v2
direction LR
[*] --> Initialed
Initialed --> SellerSent
SellerSent --> Transported
Transported --> BuyerPicked
BuyerPicked --> Delivered
Delivered --> [*]
BuyerPicked --> BuyerSent
BuyerSent --> ReturnTransported
ReturnTransported --> SellerPicked
SellerPicked --> [*]
Transported --> ReturnTransported: buyer doesn'y pick up the item after 1 week
```
## [Gantt Diagram](https://mermaid-js.github.io/mermaid/#/gantt)
```mermaid
gantt
title Example Gantt diagram
dateFormat YYYY-MM-DD
section Team 1
Research & requirements :done, a1, 2020-03-08, 2020-04-10
Review & documentation : after a1, 20d
section Team 2
Implementation :crit, active, 2020-03-25 , 20d
Testing :crit, 20d
```
### Another GANTT Diagram
```mermaid
gantt
dateFormat YYYY-MM-DD
title Adding GANTT diagram to mermaid
excludes weekdays 2014-01-10
section A section
Completed task :done, des1, 2014-01-06,2014-01-08
Active task :active, des2, 2014-01-09, 3d
Future task : des3, after des2, 5d
Future task2 : des4, after des3, 5d
```
## [Entity Relationship Riagram](https://mermaid-js.github.io/mermaid/#/entityRelationshipDiagram)
```mermaid
erDiagram
CUSTOMER ||--o{ ORDER : places
CUSTOMER {
string name
string custNumber
string sector
}
ORDER ||--|{ LINE-ITEM : contains
ORDER {
int orderNumber
string deliveryAddress
}
LINE-ITEM {
string productCode
int quantity
float pricePerUnit
}
```
```mermaid
erDiagram
CUSTOMER }|..|{ DELIVERY-ADDRESS : has
CUSTOMER ||--o{ ORDER : places
CUSTOMER ||--o{ INVOICE : "liable for"
DELIVERY-ADDRESS ||--o{ ORDER : receives
INVOICE ||--|{ ORDER : covers
ORDER ||--|{ ORDER-ITEM : includes
PRODUCT-CATEGORY ||--|{ PRODUCT : contains
PRODUCT ||--o{ ORDER-ITEM : "ordered in"
```
## [User Journey Diagram](https://mermaid-js.github.io/mermaid/#/user-journey)
```mermaid
journey
title My working day
section Go to work
Make tea: 5: Me
Go upstairs: 3: Me
Do work: 1: Me, Cat
section Go home
Go downstairs: 5: Me
Sit down: 3: Me
````
## [Pie Chart Diagram](https://mermaid-js.github.io/mermaid/#/pie)
```mermaid
pie title Pets adopted by volunteers
"Dogs" : 386
"Cats" : 85
"Rats" : 15
```
## [Requirement diagram](https://mermaid-js.github.io/mermaid/#/requirementDiagram)
```mermaid
requirementDiagram
requirement test_req {
id: 1
text: the test text.
risk: high
verifymethod: test
}
element test_entity {
type: simulation
}
test_entity - satisfies -> test_req
```
## GitGraph
This does not seem to be documented, see [https://github.com/mermaid-js/mermaid/issues/2011].
```mermaid
gitGraph:
options
{
"nodeSpacing": 150,
"nodeRadius": 10
}
end
commit
branch newbranch
checkout newbranch
commit
commit
checkout master
commit
commit
merge newbranch
```