collab/mermaid/docs/syntax/classDiagram.mdblame
View source
6dd74de1> **Warning**
6dd74de2>
6dd74de3> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT.
6dd74de4>
6dd74de5> ## Please edit the corresponding file in [/packages/mermaid/src/docs/syntax/classDiagram.md](../../packages/mermaid/src/docs/syntax/classDiagram.md).
6dd74de6
6dd74de7# Class diagrams
6dd74de8
6dd74de9> "In software engineering, a class diagram in the Unified Modeling Language (UML) is a type of static structure diagram that describes the structure of a system by showing the system's classes, their attributes, operations (or methods), and the relationships among objects."
6dd74de10>
6dd74de11> -Wikipedia
6dd74de12
6dd74de13The class diagram is the main building block of object-oriented modeling. It is used for general conceptual modeling of the structure of the application, and for detailed modeling to translate the models into programming code. Class diagrams can also be used for data modeling. The classes in a class diagram represent both the main elements, interactions in the application, and the classes to be programmed.
6dd74de14
6dd74de15Mermaid can render class diagrams.
6dd74de16
6dd74de17```mermaid-example
6dd74de18---
6dd74de19title: Animal example
6dd74de20---
6dd74de21classDiagram
6dd74de22 note "From Duck till Zebra"
6dd74de23 Animal <|-- Duck
6dd74de24 note for Duck "can fly<br>can swim<br>can dive<br>can help in debugging"
6dd74de25 Animal <|-- Fish
6dd74de26 Animal <|-- Zebra
6dd74de27 Animal : +int age
6dd74de28 Animal : +String gender
6dd74de29 Animal: +isMammal()
6dd74de30 Animal: +mate()
6dd74de31 class Duck{
6dd74de32 +String beakColor
6dd74de33 +swim()
6dd74de34 +quack()
6dd74de35 }
6dd74de36 class Fish{
6dd74de37 -int sizeInFeet
6dd74de38 -canEat()
6dd74de39 }
6dd74de40 class Zebra{
6dd74de41 +bool is_wild
6dd74de42 +run()
6dd74de43 }
6dd74de44```
6dd74de45
6dd74de46```mermaid
6dd74de47---
6dd74de48title: Animal example
6dd74de49---
6dd74de50classDiagram
6dd74de51 note "From Duck till Zebra"
6dd74de52 Animal <|-- Duck
6dd74de53 note for Duck "can fly<br>can swim<br>can dive<br>can help in debugging"
6dd74de54 Animal <|-- Fish
6dd74de55 Animal <|-- Zebra
6dd74de56 Animal : +int age
6dd74de57 Animal : +String gender
6dd74de58 Animal: +isMammal()
6dd74de59 Animal: +mate()
6dd74de60 class Duck{
6dd74de61 +String beakColor
6dd74de62 +swim()
6dd74de63 +quack()
6dd74de64 }
6dd74de65 class Fish{
6dd74de66 -int sizeInFeet
6dd74de67 -canEat()
6dd74de68 }
6dd74de69 class Zebra{
6dd74de70 +bool is_wild
6dd74de71 +run()
6dd74de72 }
6dd74de73```
6dd74de74
6dd74de75## Syntax
6dd74de76
6dd74de77### Class
6dd74de78
6dd74de79UML provides mechanisms to represent class members, such as attributes and methods, and additional information about them.
6dd74de80A single instance of a class in the diagram contains three compartments:
6dd74de81
6dd74de82- The top compartment contains the name of the class. It is printed in bold and centered, and the first letter is capitalized. It may also contain optional annotation text describing the nature of the class.
6dd74de83- The middle compartment contains the attributes of the class. They are left-aligned and the first letter is lowercase.
6dd74de84- The bottom compartment contains the operations the class can execute. They are also left-aligned and the first letter is lowercase.
6dd74de85
6dd74de86```mermaid-example
6dd74de87---
6dd74de88title: Bank example
6dd74de89---
6dd74de90classDiagram
6dd74de91 class BankAccount
6dd74de92 BankAccount : +String owner
6dd74de93 BankAccount : +Bigdecimal balance
6dd74de94 BankAccount : +deposit(amount)
6dd74de95 BankAccount : +withdrawal(amount)
6dd74de96
6dd74de97```
6dd74de98
6dd74de99```mermaid
6dd74de100---
6dd74de101title: Bank example
6dd74de102---
6dd74de103classDiagram
6dd74de104 class BankAccount
6dd74de105 BankAccount : +String owner
6dd74de106 BankAccount : +Bigdecimal balance
6dd74de107 BankAccount : +deposit(amount)
6dd74de108 BankAccount : +withdrawal(amount)
6dd74de109
6dd74de110```
6dd74de111
6dd74de112## Define a class
6dd74de113
6dd74de114There are two ways to define a class:
6dd74de115
6dd74de116- Explicitly using keyword **class** like `class Animal` which would define the Animal class.
6dd74de117- Via a **relationship** which defines two classes at a time along with their relationship. For instance, `Vehicle <|-- Car`.
6dd74de118
6dd74de119```mermaid-example
6dd74de120classDiagram
6dd74de121 class Animal
6dd74de122 Vehicle <|-- Car
6dd74de123```
6dd74de124
6dd74de125```mermaid
6dd74de126classDiagram
6dd74de127 class Animal
6dd74de128 Vehicle <|-- Car
6dd74de129```
6dd74de130
6dd74de131Naming convention: a class name should be composed only of alphanumeric characters (including unicode), underscores, and dashes (-).
6dd74de132
6dd74de133### Class labels
6dd74de134
6dd74de135In case you need to provide a label for a class, you can use the following syntax:
6dd74de136
6dd74de137```mermaid-example
6dd74de138classDiagram
6dd74de139 class Animal["Animal with a label"]
6dd74de140 class Car["Car with *! symbols"]
6dd74de141 Animal --> Car
6dd74de142```
6dd74de143
6dd74de144```mermaid
6dd74de145classDiagram
6dd74de146 class Animal["Animal with a label"]
6dd74de147 class Car["Car with *! symbols"]
6dd74de148 Animal --> Car
6dd74de149```
6dd74de150
6dd74de151You can also use backticks to escape special characters in the label:
6dd74de152
6dd74de153```mermaid-example
6dd74de154classDiagram
6dd74de155 class `Animal Class!`
6dd74de156 class `Car Class`
6dd74de157 `Animal Class!` --> `Car Class`
6dd74de158```
6dd74de159
6dd74de160```mermaid
6dd74de161classDiagram
6dd74de162 class `Animal Class!`
6dd74de163 class `Car Class`
6dd74de164 `Animal Class!` --> `Car Class`
6dd74de165```
6dd74de166
6dd74de167## Defining Members of a class
6dd74de168
6dd74de169UML provides mechanisms to represent class members such as attributes and methods, as well as additional information about them.
6dd74de170
6dd74de171Mermaid distinguishes between attributes and functions/methods based on if the **parenthesis** `()` are present or not. The ones with `()` are treated as functions/methods, and all others as attributes.
6dd74de172
6dd74de173There are two ways to define the members of a class, and regardless of whichever syntax is used to define the members, the output will still be same. The two different ways are :
6dd74de174
6dd74de175- Associate a member of a class using **:** (colon) followed by member name, useful to define one member at a time. For example:
6dd74de176
6dd74de177```mermaid-example
6dd74de178classDiagram
6dd74de179class BankAccount
6dd74de180BankAccount : +String owner
6dd74de181BankAccount : +BigDecimal balance
6dd74de182BankAccount : +deposit(amount)
6dd74de183BankAccount : +withdrawal(amount)
6dd74de184```
6dd74de185
6dd74de186```mermaid
6dd74de187classDiagram
6dd74de188class BankAccount
6dd74de189BankAccount : +String owner
6dd74de190BankAccount : +BigDecimal balance
6dd74de191BankAccount : +deposit(amount)
6dd74de192BankAccount : +withdrawal(amount)
6dd74de193```
6dd74de194
6dd74de195- Associate members of a class using **{}** brackets, where members are grouped within curly brackets. Suitable for defining multiple members at once. For example:
6dd74de196
6dd74de197```mermaid-example
6dd74de198classDiagram
6dd74de199class BankAccount{
6dd74de200 +String owner
6dd74de201 +BigDecimal balance
6dd74de202 +deposit(amount)
6dd74de203 +withdrawal(amount)
6dd74de204}
6dd74de205```
6dd74de206
6dd74de207```mermaid
6dd74de208classDiagram
6dd74de209class BankAccount{
6dd74de210 +String owner
6dd74de211 +BigDecimal balance
6dd74de212 +deposit(amount)
6dd74de213 +withdrawal(amount)
6dd74de214}
6dd74de215```
6dd74de216
6dd74de217#### Return Type
6dd74de218
6dd74de219Optionally you can end a method/function definition with the data type that will be returned (note: there must be a space between the final `)` and the return type). An example:
6dd74de220
6dd74de221```mermaid-example
6dd74de222classDiagram
6dd74de223class BankAccount{
6dd74de224 +String owner
6dd74de225 +BigDecimal balance
6dd74de226 +deposit(amount) bool
6dd74de227 +withdrawal(amount) int
6dd74de228}
6dd74de229```
6dd74de230
6dd74de231```mermaid
6dd74de232classDiagram
6dd74de233class BankAccount{
6dd74de234 +String owner
6dd74de235 +BigDecimal balance
6dd74de236 +deposit(amount) bool
6dd74de237 +withdrawal(amount) int
6dd74de238}
6dd74de239```
6dd74de240
6dd74de241#### Generic Types
6dd74de242
6dd74de243Generics can be represented as part of a class definition, and for class members/return types. In order to denote an item as generic, you enclose that type within `~` (**tilde**). **Nested** type declarations such as `List<List<int>>` are supported, though generics that include a comma are currently not supported. (such as `List<List<K, V>>`)
6dd74de244
6dd74de245> _note_ when a generic is used within a class definition, the generic type is NOT considered part of the class name. i.e.: for any syntax which required you to reference the class name, you need to drop the type part of the definition. This also means that mermaid does not currently support having two classes with the same name, but different generic types.
6dd74de246
6dd74de247```mermaid-example
6dd74de248classDiagram
6dd74de249class Square~Shape~{
6dd74de250 int id
6dd74de251 List~int~ position
6dd74de252 setPoints(List~int~ points)
6dd74de253 getPoints() List~int~
6dd74de254}
6dd74de255
6dd74de256Square : -List~string~ messages
6dd74de257Square : +setMessages(List~string~ messages)
6dd74de258Square : +getMessages() List~string~
6dd74de259Square : +getDistanceMatrix() List~List~int~~
6dd74de260```
6dd74de261
6dd74de262```mermaid
6dd74de263classDiagram
6dd74de264class Square~Shape~{
6dd74de265 int id
6dd74de266 List~int~ position
6dd74de267 setPoints(List~int~ points)
6dd74de268 getPoints() List~int~
6dd74de269}
6dd74de270
6dd74de271Square : -List~string~ messages
6dd74de272Square : +setMessages(List~string~ messages)
6dd74de273Square : +getMessages() List~string~
6dd74de274Square : +getDistanceMatrix() List~List~int~~
6dd74de275```
6dd74de276
6dd74de277#### Visibility
6dd74de278
6dd74de279To describe the visibility (or encapsulation) of an attribute or method/function that is a part of a class (i.e. a class member), optional notation may be placed before that members' name:
6dd74de280
6dd74de281- `+` Public
6dd74de282- `-` Private
6dd74de283- `#` Protected
6dd74de284- `~` Package/Internal
6dd74de285
6dd74de286> _note_ you can also include additional _classifiers_ to a method definition by adding the following notation to the _end_ of the method, i.e.: after the `()` or after the return type:
6dd74de287>
6dd74de288> - `*` Abstract e.g.: `someAbstractMethod()*` or `someAbstractMethod() int*`
6dd74de289> - `$` Static e.g.: `someStaticMethod()$` or `someStaticMethod() String$`
6dd74de290
6dd74de291> _note_ you can also include additional _classifiers_ to a field definition by adding the following notation to the very end:
6dd74de292>
6dd74de293> - `$` Static e.g.: `String someField$`
6dd74de294
6dd74de295## Defining Relationship
6dd74de296
6dd74de297A relationship is a general term covering the specific types of logical connections found on class and object diagrams.
6dd74de298
6dd74de299```
6dd74de300[classA][Arrow][ClassB]
6dd74de301```
6dd74de302
6dd74de303There are eight different types of relations defined for classes under UML which are currently supported:
6dd74de304
6dd74de305| Type | Description |
6dd74de306| ------- | ------------- |
6dd74de307| `<\|--` | Inheritance |
6dd74de308| `*--` | Composition |
6dd74de309| `o--` | Aggregation |
6dd74de310| `-->` | Association |
6dd74de311| `--` | Link (Solid) |
6dd74de312| `..>` | Dependency |
6dd74de313| `..\|>` | Realization |
6dd74de314| `..` | Link (Dashed) |
6dd74de315
6dd74de316```mermaid-example
6dd74de317classDiagram
6dd74de318classA <|-- classB
6dd74de319classC *-- classD
6dd74de320classE o-- classF
6dd74de321classG <-- classH
6dd74de322classI -- classJ
6dd74de323classK <.. classL
6dd74de324classM <|.. classN
6dd74de325classO .. classP
6dd74de326
6dd74de327```
6dd74de328
6dd74de329```mermaid
6dd74de330classDiagram
6dd74de331classA <|-- classB
6dd74de332classC *-- classD
6dd74de333classE o-- classF
6dd74de334classG <-- classH
6dd74de335classI -- classJ
6dd74de336classK <.. classL
6dd74de337classM <|.. classN
6dd74de338classO .. classP
6dd74de339
6dd74de340```
6dd74de341
6dd74de342We can use the labels to describe the nature of the relation between two classes. Also, arrowheads can be used in the opposite direction as well:
6dd74de343
6dd74de344```mermaid-example
6dd74de345classDiagram
6dd74de346classA --|> classB : Inheritance
6dd74de347classC --* classD : Composition
6dd74de348classE --o classF : Aggregation
6dd74de349classG --> classH : Association
6dd74de350classI -- classJ : Link(Solid)
6dd74de351classK ..> classL : Dependency
6dd74de352classM ..|> classN : Realization
6dd74de353classO .. classP : Link(Dashed)
6dd74de354
6dd74de355```
6dd74de356
6dd74de357```mermaid
6dd74de358classDiagram
6dd74de359classA --|> classB : Inheritance
6dd74de360classC --* classD : Composition
6dd74de361classE --o classF : Aggregation
6dd74de362classG --> classH : Association
6dd74de363classI -- classJ : Link(Solid)
6dd74de364classK ..> classL : Dependency
6dd74de365classM ..|> classN : Realization
6dd74de366classO .. classP : Link(Dashed)
6dd74de367
6dd74de368```
6dd74de369
6dd74de370### Labels on Relations
6dd74de371
6dd74de372It is possible to add label text to a relation:
6dd74de373
6dd74de374```
6dd74de375[classA][Arrow][ClassB]:LabelText
6dd74de376```
6dd74de377
6dd74de378```mermaid-example
6dd74de379classDiagram
6dd74de380classA <|-- classB : implements
6dd74de381classC *-- classD : composition
6dd74de382classE o-- classF : aggregation
6dd74de383```
6dd74de384
6dd74de385```mermaid
6dd74de386classDiagram
6dd74de387classA <|-- classB : implements
6dd74de388classC *-- classD : composition
6dd74de389classE o-- classF : aggregation
6dd74de390```
6dd74de391
6dd74de392### Two-way relations
6dd74de393
6dd74de394Relations can logically represent an N:M association:
6dd74de395
6dd74de396```mermaid-example
6dd74de397classDiagram
6dd74de398 Animal <|--|> Zebra
6dd74de399```
6dd74de400
6dd74de401```mermaid
6dd74de402classDiagram
6dd74de403 Animal <|--|> Zebra
6dd74de404```
6dd74de405
6dd74de406Here is the syntax:
6dd74de407
6dd74de408```
6dd74de409[Relation Type][Link][Relation Type]
6dd74de410```
6dd74de411
6dd74de412Where `Relation Type` can be one of:
6dd74de413
6dd74de414| Type | Description |
6dd74de415| ----- | ----------- |
6dd74de416| `<\|` | Inheritance |
6dd74de417| `\*` | Composition |
6dd74de418| `o` | Aggregation |
6dd74de419| `>` | Association |
6dd74de420| `<` | Association |
6dd74de421| `\|>` | Realization |
6dd74de422
6dd74de423And `Link` can be one of:
6dd74de424
6dd74de425| Type | Description |
6dd74de426| ---- | ----------- |
6dd74de427| -- | Solid |
6dd74de428| .. | Dashed |
6dd74de429
6dd74de430### Lollipop Interfaces
6dd74de431
6dd74de432Classes can also be given a special relation type that defines a lollipop interface on the class. A lollipop interface is defined using the following syntax:
6dd74de433
6dd74de434- `bar ()-- foo`
6dd74de435- `foo --() bar`
6dd74de436
6dd74de437The interface (bar) with the lollipop connects to the class (foo).
6dd74de438
6dd74de439Note: Each interface that is defined is unique and is meant to not be shared between classes / have multiple edges connecting to it.
6dd74de440
6dd74de441```mermaid-example
6dd74de442classDiagram
6dd74de443 bar ()-- foo
6dd74de444```
6dd74de445
6dd74de446```mermaid
6dd74de447classDiagram
6dd74de448 bar ()-- foo
6dd74de449```
6dd74de450
6dd74de451```mermaid-example
6dd74de452classDiagram
6dd74de453 class Class01 {
6dd74de454 int amount
6dd74de455 draw()
6dd74de456 }
6dd74de457 Class01 --() bar
6dd74de458 Class02 --() bar
6dd74de459
6dd74de460 foo ()-- Class01
6dd74de461```
6dd74de462
6dd74de463```mermaid
6dd74de464classDiagram
6dd74de465 class Class01 {
6dd74de466 int amount
6dd74de467 draw()
6dd74de468 }
6dd74de469 Class01 --() bar
6dd74de470 Class02 --() bar
6dd74de471
6dd74de472 foo ()-- Class01
6dd74de473```
6dd74de474
6dd74de475## Define Namespace
6dd74de476
6dd74de477A namespace groups classes.
6dd74de478
6dd74de479```mermaid-example
6dd74de480classDiagram
6dd74de481namespace BaseShapes {
6dd74de482 class Triangle
6dd74de483 class Rectangle {
6dd74de484 double width
6dd74de485 double height
6dd74de486 }
6dd74de487}
6dd74de488```
6dd74de489
6dd74de490```mermaid
6dd74de491classDiagram
6dd74de492namespace BaseShapes {
6dd74de493 class Triangle
6dd74de494 class Rectangle {
6dd74de495 double width
6dd74de496 double height
6dd74de497 }
6dd74de498}
6dd74de499```
6dd74de500
6dd74de501## Cardinality / Multiplicity on relations
6dd74de502
6dd74de503Multiplicity or cardinality in class diagrams indicates the number of instances of one class that can be linked to an instance of the other class. For example, each company will have one or more employees (not zero), and each employee currently works for zero or one companies.
6dd74de504
6dd74de505Multiplicity notations are placed near the end of an association.
6dd74de506
6dd74de507The different cardinality options are :
6dd74de508
6dd74de509- `1` Only 1
6dd74de510- `0..1` Zero or One
6dd74de511- `1..*` One or more
6dd74de512- `*` Many
6dd74de513- `n` n (where n>1)
6dd74de514- `0..n` zero to n (where n>1)
6dd74de515- `1..n` one to n (where n>1)
6dd74de516
6dd74de517Cardinality can be easily defined by placing the text option within quotes `"` before or after a given arrow. For example:
6dd74de518
6dd74de519```
6dd74de520[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
6dd74de521```
6dd74de522
6dd74de523```mermaid-example
6dd74de524classDiagram
6dd74de525 Customer "1" --> "*" Ticket
6dd74de526 Student "1" --> "1..*" Course
6dd74de527 Galaxy --> "many" Star : Contains
6dd74de528```
6dd74de529
6dd74de530```mermaid
6dd74de531classDiagram
6dd74de532 Customer "1" --> "*" Ticket
6dd74de533 Student "1" --> "1..*" Course
6dd74de534 Galaxy --> "many" Star : Contains
6dd74de535```
6dd74de536
6dd74de537## Annotations on classes
6dd74de538
6dd74de539It is possible to annotate classes with markers to provide additional metadata about the class. This can give a clearer indication about its nature. Some common annotations include:
6dd74de540
6dd74de541- `<<Interface>>` To represent an Interface class
6dd74de542- `<<Abstract>>` To represent an abstract class
6dd74de543- `<<Service>>` To represent a service class
6dd74de544- `<<Enumeration>>` To represent an enum
6dd74de545
6dd74de546Annotations are defined within the opening `<<` and closing `>>`. There are two ways to add an annotation to a class, and either way the output will be same:
6dd74de547
6dd74de548> **Tip:**\
6dd74de549> In Mermaid class diagrams, annotations like `<<interface>>` can be attached in two ways:
6dd74de550>
6dd74de551> - **Inline with the class definition** (Recommended for consistency):
6dd74de552>
6dd74de553> ```mermaid-example
6dd74de554> classDiagram
6dd74de555> class Shape <<interface>>
6dd74de556> ```
6dd74de557>
6dd74de558> ```mermaid
6dd74de559> classDiagram
6dd74de560> class Shape <<interface>>
6dd74de561> ```
6dd74de562>
6dd74de563> - **Separate line after the class definition**:
6dd74de564>
6dd74de565> ```mermaid-example
6dd74de566> classDiagram
6dd74de567> class Shape
6dd74de568> <<interface>> Shape
6dd74de569> ```
6dd74de570>
6dd74de571> ```mermaid
6dd74de572> classDiagram
6dd74de573> class Shape
6dd74de574> <<interface>> Shape
6dd74de575> ```
6dd74de576>
6dd74de577> Both methods are fully supported and produce identical diagrams.\
6dd74de578> However, it is recommended to use the **inline style** for better readability and consistent formatting across diagrams.
6dd74de579
6dd74de580- In a **_separate line_** after a class is defined:
6dd74de581
6dd74de582```mermaid-example
6dd74de583classDiagram
6dd74de584class Shape
6dd74de585<<interface>> Shape
6dd74de586Shape : noOfVertices
6dd74de587Shape : draw()
6dd74de588```
6dd74de589
6dd74de590```mermaid
6dd74de591classDiagram
6dd74de592class Shape
6dd74de593<<interface>> Shape
6dd74de594Shape : noOfVertices
6dd74de595Shape : draw()
6dd74de596```
6dd74de597
6dd74de598- In a **_nested structure_** along with the class definition:
6dd74de599
6dd74de600```mermaid-example
6dd74de601classDiagram
6dd74de602class Shape{
6dd74de603 <<interface>>
6dd74de604 noOfVertices
6dd74de605 draw()
6dd74de606}
6dd74de607class Color{
6dd74de608 <<enumeration>>
6dd74de609 RED
6dd74de610 BLUE
6dd74de611 GREEN
6dd74de612 WHITE
6dd74de613 BLACK
6dd74de614}
6dd74de615
6dd74de616```
6dd74de617
6dd74de618```mermaid
6dd74de619classDiagram
6dd74de620class Shape{
6dd74de621 <<interface>>
6dd74de622 noOfVertices
6dd74de623 draw()
6dd74de624}
6dd74de625class Color{
6dd74de626 <<enumeration>>
6dd74de627 RED
6dd74de628 BLUE
6dd74de629 GREEN
6dd74de630 WHITE
6dd74de631 BLACK
6dd74de632}
6dd74de633
6dd74de634```
6dd74de635
6dd74de636## Comments
6dd74de637
6dd74de638Comments can be entered within a class diagram, which will be ignored by the parser. Comments need to be on their own line, and must be prefaced with `%%` (double percent signs). Any text until the next newline will be treated as a comment, including any class diagram syntax.
6dd74de639
6dd74de640```mermaid-example
6dd74de641classDiagram
6dd74de642%% This whole line is a comment classDiagram class Shape <<interface>>
6dd74de643class Shape{
6dd74de644 <<interface>>
6dd74de645 noOfVertices
6dd74de646 draw()
6dd74de647}
6dd74de648```
6dd74de649
6dd74de650```mermaid
6dd74de651classDiagram
6dd74de652%% This whole line is a comment classDiagram class Shape <<interface>>
6dd74de653class Shape{
6dd74de654 <<interface>>
6dd74de655 noOfVertices
6dd74de656 draw()
6dd74de657}
6dd74de658```
6dd74de659
6dd74de660## Setting the direction of the diagram
6dd74de661
6dd74de662With class diagrams you can use the direction statement to set the direction in which the diagram will render:
6dd74de663
6dd74de664```mermaid-example
6dd74de665classDiagram
6dd74de666 direction RL
6dd74de667 class Student {
6dd74de668 -idCard : IdCard
6dd74de669 }
6dd74de670 class IdCard{
6dd74de671 -id : int
6dd74de672 -name : string
6dd74de673 }
6dd74de674 class Bike{
6dd74de675 -id : int
6dd74de676 -name : string
6dd74de677 }
6dd74de678 Student "1" --o "1" IdCard : carries
6dd74de679 Student "1" --o "1" Bike : rides
6dd74de680```
6dd74de681
6dd74de682```mermaid
6dd74de683classDiagram
6dd74de684 direction RL
6dd74de685 class Student {
6dd74de686 -idCard : IdCard
6dd74de687 }
6dd74de688 class IdCard{
6dd74de689 -id : int
6dd74de690 -name : string
6dd74de691 }
6dd74de692 class Bike{
6dd74de693 -id : int
6dd74de694 -name : string
6dd74de695 }
6dd74de696 Student "1" --o "1" IdCard : carries
6dd74de697 Student "1" --o "1" Bike : rides
6dd74de698```
6dd74de699
6dd74de700## Interaction
6dd74de701
6dd74de702It is possible to bind a click event to a node. The click can lead to either a javascript callback or to a link which will be opened in a new browser tab. **Note**: This functionality is disabled when using `securityLevel='strict'` and enabled when using `securityLevel='loose'`.
6dd74de703
6dd74de704You would define these actions on a separate line after all classes have been declared.
6dd74de705
6dd74de706```
6dd74de707action className "reference" "tooltip"
6dd74de708click className call callback() "tooltip"
6dd74de709click className href "url" "tooltip"
6dd74de710```
6dd74de711
6dd74de712- _action_ is either `link` or `callback`, depending on which type of interaction you want to have called
6dd74de713- _className_ is the id of the node that the action will be associated with
6dd74de714- _reference_ is either the url link, or the function name for callback.
6dd74de715- (_optional_) tooltip is a string to be displayed when hovering over element (note: The styles of the tooltip are set by the class .mermaidTooltip.)
6dd74de716- note: callback function will be called with the nodeId as parameter.
6dd74de717
6dd74de718## Notes
6dd74de719
6dd74de720It is possible to add notes on the diagram using `note "line1\nline2"`. A note can be added for a specific class using `note for <CLASS NAME> "line1\nline2"`.
6dd74de721
6dd74de722### Examples
6dd74de723
6dd74de724```mermaid-example
6dd74de725classDiagram
6dd74de726 note "This is a general note"
6dd74de727 note for MyClass "This is a note for a class"
6dd74de728 class MyClass{
6dd74de729 }
6dd74de730```
6dd74de731
6dd74de732```mermaid
6dd74de733classDiagram
6dd74de734 note "This is a general note"
6dd74de735 note for MyClass "This is a note for a class"
6dd74de736 class MyClass{
6dd74de737 }
6dd74de738```
6dd74de739
6dd74de740_URL Link:_
6dd74de741
6dd74de742```mermaid-example
6dd74de743classDiagram
6dd74de744class Shape
6dd74de745link Shape "https://www.github.com" "This is a tooltip for a link"
6dd74de746class Shape2
6dd74de747click Shape2 href "https://www.github.com" "This is a tooltip for a link"
6dd74de748```
6dd74de749
6dd74de750```mermaid
6dd74de751classDiagram
6dd74de752class Shape
6dd74de753link Shape "https://www.github.com" "This is a tooltip for a link"
6dd74de754class Shape2
6dd74de755click Shape2 href "https://www.github.com" "This is a tooltip for a link"
6dd74de756```
6dd74de757
6dd74de758_Callback:_
6dd74de759
6dd74de760```mermaid-example
6dd74de761classDiagram
6dd74de762class Shape
6dd74de763callback Shape "callbackFunction" "This is a tooltip for a callback"
6dd74de764class Shape2
6dd74de765click Shape2 call callbackFunction() "This is a tooltip for a callback"
6dd74de766```
6dd74de767
6dd74de768```mermaid
6dd74de769classDiagram
6dd74de770class Shape
6dd74de771callback Shape "callbackFunction" "This is a tooltip for a callback"
6dd74de772class Shape2
6dd74de773click Shape2 call callbackFunction() "This is a tooltip for a callback"
6dd74de774```
6dd74de775
6dd74de776```html
6dd74de777<script>
6dd74de778 const callbackFunction = function () {
6dd74de779 alert('A callback was triggered');
6dd74de780 };
6dd74de781</script>
6dd74de782```
6dd74de783
6dd74de784```mermaid-example
6dd74de785classDiagram
6dd74de786 class Class01
6dd74de787 class Class02
6dd74de788 callback Class01 "callbackFunction" "Callback tooltip"
6dd74de789 link Class02 "https://www.github.com" "This is a link"
6dd74de790 class Class03
6dd74de791 class Class04
6dd74de792 click Class03 call callbackFunction() "Callback tooltip"
6dd74de793 click Class04 href "https://www.github.com" "This is a link"
6dd74de794```
6dd74de795
6dd74de796```mermaid
6dd74de797classDiagram
6dd74de798 class Class01
6dd74de799 class Class02
6dd74de800 callback Class01 "callbackFunction" "Callback tooltip"
6dd74de801 link Class02 "https://www.github.com" "This is a link"
6dd74de802 class Class03
6dd74de803 class Class04
6dd74de804 click Class03 call callbackFunction() "Callback tooltip"
6dd74de805 click Class04 href "https://www.github.com" "This is a link"
6dd74de806```
6dd74de807
6dd74de808> **Success** The tooltip functionality and the ability to link to urls are available from version 0.5.2.
6dd74de809
6dd74de810Beginner's tip—a full example using interactive links in an HTML page:
6dd74de811
6dd74de812```html
6dd74de813<body>
6dd74de814 <pre class="mermaid">
6dd74de815 classDiagram
6dd74de816 Animal <|-- Duck
6dd74de817 Animal <|-- Fish
6dd74de818 Animal <|-- Zebra
6dd74de819 Animal : +int age
6dd74de820 Animal : +String gender
6dd74de821 Animal: +isMammal()
6dd74de822 Animal: +mate()
6dd74de823 class Duck{
6dd74de824 +String beakColor
6dd74de825 +swim()
6dd74de826 +quack()
6dd74de827 }
6dd74de828 class Fish{
6dd74de829 -int sizeInFeet
6dd74de830 -canEat()
6dd74de831 }
6dd74de832 class Zebra{
6dd74de833 +bool is_wild
6dd74de834 +run()
6dd74de835 }
6dd74de836
6dd74de837 callback Duck "callback" "Tooltip"
6dd74de838 link Zebra "https://www.github.com" "This is a link"
6dd74de839 </pre>
6dd74de840
6dd74de841 <script>
6dd74de842 const callback = function () {
6dd74de843 alert('A callback was triggered');
6dd74de844 };
6dd74de845 const config = {
6dd74de846 startOnLoad: true,
6dd74de847 securityLevel: 'loose',
6dd74de848 };
6dd74de849 mermaid.initialize(config);
6dd74de850 </script>
6dd74de851</body>
6dd74de852```
6dd74de853
6dd74de854## Styling
6dd74de855
6dd74de856### Styling a node
6dd74de857
6dd74de858It is possible to apply specific styles such as a thicker border or a different background color to an individual node using the `style` keyword.
6dd74de859
6dd74de860Note that notes and namespaces cannot be styled individually but do support themes.
6dd74de861
6dd74de862```mermaid-example
6dd74de863classDiagram
6dd74de864 class Animal
6dd74de865 class Mineral
6dd74de866 style Animal fill:#f9f,stroke:#333,stroke-width:4px
6dd74de867 style Mineral fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
6dd74de868```
6dd74de869
6dd74de870```mermaid
6dd74de871classDiagram
6dd74de872 class Animal
6dd74de873 class Mineral
6dd74de874 style Animal fill:#f9f,stroke:#333,stroke-width:4px
6dd74de875 style Mineral fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5
6dd74de876```
6dd74de877
6dd74de878#### Classes
6dd74de879
6dd74de880More convenient than defining the style every time is to define a class of styles and attach this class to the nodes that
6dd74de881should have a different look.
6dd74de882
6dd74de883A class definition looks like the example below:
6dd74de884
6dd74de885```
6dd74de886classDef className fill:#f9f,stroke:#333,stroke-width:4px;
6dd74de887```
6dd74de888
6dd74de889Also, it is possible to define style to multiple classes in one statement:
6dd74de890
6dd74de891```
6dd74de892classDef firstClassName,secondClassName font-size:12pt;
6dd74de893```
6dd74de894
6dd74de895Attachment of a class to a node is done as per below:
6dd74de896
6dd74de897```
6dd74de898cssClass "nodeId1" className;
6dd74de899```
6dd74de900
6dd74de901It is also possible to attach a class to a list of nodes in one statement:
6dd74de902
6dd74de903```
6dd74de904cssClass "nodeId1,nodeId2" className;
6dd74de905```
6dd74de906
6dd74de907A shorter form of adding a class is to attach the classname to the node using the `:::` operator:
6dd74de908
6dd74de909```mermaid-example
6dd74de910classDiagram
6dd74de911 class Animal:::someclass
6dd74de912 classDef someclass fill:#f96
6dd74de913```
6dd74de914
6dd74de915```mermaid
6dd74de916classDiagram
6dd74de917 class Animal:::someclass
6dd74de918 classDef someclass fill:#f96
6dd74de919```
6dd74de920
6dd74de921Or:
6dd74de922
6dd74de923```mermaid-example
6dd74de924classDiagram
6dd74de925 class Animal:::someclass {
6dd74de926 -int sizeInFeet
6dd74de927 -canEat()
6dd74de928 }
6dd74de929 classDef someclass fill:#f96
6dd74de930```
6dd74de931
6dd74de932```mermaid
6dd74de933classDiagram
6dd74de934 class Animal:::someclass {
6dd74de935 -int sizeInFeet
6dd74de936 -canEat()
6dd74de937 }
6dd74de938 classDef someclass fill:#f96
6dd74de939```
6dd74de940
6dd74de941### Default class
6dd74de942
6dd74de943If a class is named default it will be applied to all nodes. Specific styles and classes should be defined afterwards to override the applied default styling.
6dd74de944
6dd74de945```
6dd74de946classDef default fill:#f9f,stroke:#333,stroke-width:4px;
6dd74de947```
6dd74de948
6dd74de949```mermaid-example
6dd74de950classDiagram
6dd74de951 class Animal:::pink
6dd74de952 class Mineral
6dd74de953
6dd74de954 classDef default fill:#f96,color:red
6dd74de955 classDef pink color:#f9f
6dd74de956```
6dd74de957
6dd74de958```mermaid
6dd74de959classDiagram
6dd74de960 class Animal:::pink
6dd74de961 class Mineral
6dd74de962
6dd74de963 classDef default fill:#f96,color:red
6dd74de964 classDef pink color:#f9f
6dd74de965```
6dd74de966
6dd74de967### CSS Classes
6dd74de968
6dd74de969It is also possible to predefine classes in CSS styles that can be applied from the graph definition as in the example
6dd74de970below:
6dd74de971
6dd74de972**Example style**
6dd74de973
6dd74de974```html
6dd74de975<style>
6dd74de976 .styleClass > * > g {
6dd74de977 fill: #ff0000;
6dd74de978 stroke: #ffff00;
6dd74de979 stroke-width: 4px;
6dd74de980 }
6dd74de981</style>
6dd74de982```
6dd74de983
6dd74de984**Example definition**
6dd74de985
6dd74de986```mermaid-example
6dd74de987classDiagram
6dd74de988 class Animal:::styleClass
6dd74de989```
6dd74de990
6dd74de991```mermaid
6dd74de992classDiagram
6dd74de993 class Animal:::styleClass
6dd74de994```
6dd74de995
6dd74de996> cssClasses cannot be added using this shorthand method at the same time as a relation statement.
6dd74de997
6dd74de998## Configuration
6dd74de999
6dd74de1000### Members Box
6dd74de1001
6dd74de1002It is possible to hide the empty members box of a class node.
6dd74de1003
6dd74de1004This is done by changing the **hideEmptyMembersBox** value of the class diagram configuration. For more information on how to edit the Mermaid configuration see the [configuration page.](https://mermaid.js.org/config/configuration.html)
6dd74de1005
6dd74de1006```mermaid-example
6dd74de1007---
6dd74de1008 config:
6dd74de1009 class:
6dd74de1010 hideEmptyMembersBox: true
6dd74de1011---
6dd74de1012classDiagram
6dd74de1013 class Duck
6dd74de1014```
6dd74de1015
6dd74de1016```mermaid
6dd74de1017---
6dd74de1018 config:
6dd74de1019 class:
6dd74de1020 hideEmptyMembersBox: true
6dd74de1021---
6dd74de1022classDiagram
6dd74de1023 class Duck
6dd74de1024```