--- template: overrides/main.html --- # Diagrams Diagrams help to communicate complex relationships and interconnections between different technical components, and are a great addition to project documentation. Material for MkDocs integrates with [Mermaid.js], a very popular and flexible solution for drawing diagrams. [Mermaid.js]: https://mermaid-js.github.io/mermaid/ ## Configuration [:octicons-heart-fill-24:{ .mdx-heart } Insiders][Insiders]{ .mdx-insiders } · :octicons-beaker-24: Experimental · [:octicons-tag-24: insiders-1.15.0 ... present][Insiders] This configuration enables native support for [Mermaid.js] diagrams. Material for MkDocs will automatically initialize the JavaScript runtime when a page includes a `mermaid` code block: ``` yaml markdown_extensions: - pymdownx.superfences: custom_fences: - name: mermaid class: mermaid format: !!python/name:pymdownx.superfences.fence_code_format ``` No further configuration is necessary. Advantages over custom integration: - [x] Works with [instant loading] without any additional effort - [x] Diagrams automatically use fonts and colors defined in `mkdocs.yml`[^1] - [x] Fonts and colors can be customized with [additional stylesheets] - [x] Support for both, light and dark color schemes _While it's also possible to integrate [Mermaid.js] using existing third-party plugins[^2], the new native integration is recommended as it ensures interoperability with all Material for MkDocs features._ [^1]: While all [Mermaid.js] features should work out-of-the-box, Material for MkDocs will currently adjust the fonts and colors for flow charts, sequence diagrams, class diagams, state diagrams and entity relationship diagrams. [^2]: If you don't want to use the native integration, [mkdocs-mermaid2-plugin] might be a good alternative. However, note that this plugin cannot be used in conjunction with the [mkdocs-minify-plugin] and doesn't adapt to dark mode. [Insiders]: ../insiders/index.md [instant loading]: ../setup/setting-up-navigation.md#instant-loading [additional stylesheets]: ../customization.md#additional-css [mkdocs-mermaid2-plugin]: https://github.com/fralau/mkdocs-mermaid2-plugin [mkdocs-minify-plugin]: https://github.com/byrnereese/mkdocs-minify-plugin ## Usage Mermaid diagrams are written as code blocks with the help of the [SuperFences]extension. They must be enclosed with two separate lines containing three backticks. [code blocks]: code-blocks.md [SuperFences]: ../setup/extensions/python-markdown-extensions.md#superfences ### Using flowcharts [Flowcharts] are diagrams that represent workflows or processes. The steps are rendered as nodes of various kinds and are connected by edges, describing the necessary order of steps. _Example_: ```` markdown ``` mermaid graph LR A[Start] --> B{Error?}; B -->|Yes| C[Hmm...]; C --> D[Debug]; D --> B; B ---->|No| E[Yay!]; ``` ```` _Result_: ``` mermaid graph LR A[Start] --> B{Error?}; B -->|Yes| C[Hmm...]; C --> D[Debug]; D --> B; B ---->|No| E[Yay!]; ``` [Flowcharts]: https://mermaid-js.github.io/mermaid/#/flowchart ### Using sequence diagrams [Sequence diagrams] describe a specific scenario as sequential interactions between multiple objects or actors, including the messages that are exchanged between those actors. _Example_: ```` markdown ``` mermaid sequenceDiagram Alice->>John: Hello John, how are you? loop Healthcheck John->>John: Fight against hypochondria end Note right of John: Rational thoughts! John-->>Alice: Great! John->>Bob: How about you? Bob-->>John: Jolly good! ``` ```` _Result_: ``` mermaid sequenceDiagram Alice->>John: Hello John, how are you? loop Healthcheck John->>John: Fight against hypochondria end Note right of John: Rational thoughts! John-->>Alice: Great! John->>Bob: How about you? Bob-->>John: Jolly good! ``` [Sequence diagrams]: https://mermaid-js.github.io/mermaid/#/sequenceDiagram ### Using state diagrams [State diagrams] are a great tool to describe the behavior of a system, decomposing it into a finite number of states, and transitions between those states. _Example_: ```` markdown ``` mermaid stateDiagram-v2 [*] --> Active state Active { [*] --> NumLockOff NumLockOff --> NumLockOn : EvNumLockPressed NumLockOn --> NumLockOff : EvNumLockPressed -- [*] --> CapsLockOff CapsLockOff --> CapsLockOn : EvCapsLockPressed CapsLockOn --> CapsLockOff : EvCapsLockPressed -- [*] --> ScrollLockOff ScrollLockOff --> ScrollLockOn : EvScrollLockPressed ScrollLockOn --> ScrollLockOff : EvScrollLockPressed } ``` ```` _Result_: ``` mermaid stateDiagram-v2 [*] --> Active state Active { [*] --> NumLockOff NumLockOff --> NumLockOn : EvNumLockPressed NumLockOn --> NumLockOff : EvNumLockPressed -- [*] --> CapsLockOff CapsLockOff --> CapsLockOn : EvCapsLockPressed CapsLockOn --> CapsLockOff : EvCapsLockPressed -- [*] --> ScrollLockOff ScrollLockOff --> ScrollLockOn : EvScrollLockPressed ScrollLockOn --> ScrollLockOff : EvScrollLockPressed } ``` [State diagrams]: https://mermaid-js.github.io/mermaid/#/stateDiagram ### Using class diagrams [Class diagrams] are central to object oriented programing, describing the structure of a system by modelling entities as classes and relationships between them. _Example_: ```` markdown ``` mermaid classDiagram Person <|-- Student Person <|-- Professor Person : +String name Person : +String phoneNumber Person : +String emailAddress Person: +purchaseParkingPass() Address "1" <-- "0..1" Person:lives at class Student{ +int studentNumber +int averageMark +isEligibleToEnrol() +getSeminarsTaken() } class Professor{ +int salary } class Address{ +String street +String city +String state +int postalCode +String country -validate() +outputAsLabel() } ``` ```` _Result_: ``` mermaid classDiagram Person <|-- Student Person <|-- Professor Person : +String name Person : +String phoneNumber Person : +String emailAddress Person: +purchaseParkingPass() Address "1" <-- "0..1" Person:lives at class Student{ +int studentNumber +int averageMark +isEligibleToEnrol() +getSeminarsTaken() } class Professor{ +int salary } class Address{ +String street +String city +String state +int postalCode +String country -validate() +outputAsLabel() } ``` [Class diagrams]: https://mermaid-js.github.io/mermaid/#/classDiagram ### Using entity-relationship diagrams An [entity-relationship diagram] is composed of entity types and specifies relationships that exist between entities. It describes inter-related things in a specific domain of knowledge. _Example_: ```` markdown ``` mermaid erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses ``` ```` _Result_: ``` mermaid erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses ``` [entity-relationship diagram]: https://mermaid-js.github.io/mermaid/#/entityRelationshipDiagram