mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-01-14 06:43:25 +08:00
651 lines
16 KiB
Markdown
651 lines
16 KiB
Markdown
> **Warning**
|
|
>
|
|
> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT.
|
|
>
|
|
> ## Please edit the corresponding file in [/packages/mermaid/src/docs/syntax/stateDiagram.md](../../packages/mermaid/src/docs/syntax/stateDiagram.md).
|
|
|
|
# State diagrams
|
|
|
|
> "A state diagram is a type of diagram used in computer science and related fields to describe the behavior of systems.
|
|
> State diagrams require that the system described is composed of a finite number of states; sometimes, this is indeed the
|
|
> case, while at other times this is a reasonable abstraction." Wikipedia
|
|
|
|
Mermaid can render state diagrams. The syntax tries to be compliant with the syntax used in plantUml as this will make
|
|
it easier for users to share diagrams between mermaid and plantUml.
|
|
|
|
```mermaid-example
|
|
---
|
|
title: Simple sample
|
|
---
|
|
stateDiagram-v2
|
|
[*] --> Still
|
|
Still --> [*]
|
|
|
|
Still --> Moving
|
|
Moving --> Still
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
```
|
|
|
|
```mermaid
|
|
---
|
|
title: Simple sample
|
|
---
|
|
stateDiagram-v2
|
|
[*] --> Still
|
|
Still --> [*]
|
|
|
|
Still --> Moving
|
|
Moving --> Still
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
```
|
|
|
|
Older renderer:
|
|
|
|
```mermaid-example
|
|
stateDiagram
|
|
[*] --> Still
|
|
Still --> [*]
|
|
|
|
Still --> Moving
|
|
Moving --> Still
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram
|
|
[*] --> Still
|
|
Still --> [*]
|
|
|
|
Still --> Moving
|
|
Moving --> Still
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
```
|
|
|
|
In state diagrams systems are described in terms of _states_ and how one _state_ can change to another _state_ via
|
|
a _transition._ The example diagram above shows three states: **Still**, **Moving** and **Crash**. You start in the
|
|
**Still** state. From **Still** you can change to the **Moving** state. From **Moving** you can change either back to the **Still** state or to
|
|
the **Crash** state. There is no transition from **Still** to **Crash**. (You can't crash if you're still.)
|
|
|
|
## States
|
|
|
|
A state can be declared in multiple ways. The simplest way is to define a state with just an id:
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
stateId
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
stateId
|
|
```
|
|
|
|
Another way is by using the state keyword with a description as per below:
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
state "This is a state description" as s2
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
state "This is a state description" as s2
|
|
```
|
|
|
|
Another way to define a state with a description is to define the state id followed by a colon and the description:
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
s2 : This is a state description
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
s2 : This is a state description
|
|
```
|
|
|
|
## Transitions
|
|
|
|
Transitions are path/edges when one state passes into another. This is represented using text arrow, "-->".
|
|
|
|
When you define a transition between two states and the states are not already defined, the undefined states are defined
|
|
with the id from the transition. You can later add descriptions to states defined this way.
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
s1 --> s2
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
s1 --> s2
|
|
```
|
|
|
|
It is possible to add text to a transition to describe what it represents:
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
s1 --> s2: A transition
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
s1 --> s2: A transition
|
|
```
|
|
|
|
## Start and End
|
|
|
|
There are two special states indicating the start and stop of the diagram. These are written with the \[\*] syntax and
|
|
the direction of the transition to it defines it either as a start or a stop state.
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
[*] --> s1
|
|
s1 --> [*]
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> s1
|
|
s1 --> [*]
|
|
```
|
|
|
|
## Composite states
|
|
|
|
In a real world use of state diagrams you often end up with diagrams that are multidimensional as one state can
|
|
have several internal states. These are called composite states in this terminology.
|
|
|
|
In order to define a composite state you need to use the state keyword followed by an id and the body of the composite
|
|
state between {}. See the example below:
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
[*] --> First
|
|
state First {
|
|
[*] --> second
|
|
second --> [*]
|
|
}
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> First
|
|
state First {
|
|
[*] --> second
|
|
second --> [*]
|
|
}
|
|
```
|
|
|
|
You can do this in several layers:
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
[*] --> First
|
|
|
|
state First {
|
|
[*] --> Second
|
|
|
|
state Second {
|
|
[*] --> second
|
|
second --> Third
|
|
|
|
state Third {
|
|
[*] --> third
|
|
third --> [*]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> First
|
|
|
|
state First {
|
|
[*] --> Second
|
|
|
|
state Second {
|
|
[*] --> second
|
|
second --> Third
|
|
|
|
state Third {
|
|
[*] --> third
|
|
third --> [*]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
You can also define transitions also between composite states:
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
[*] --> First
|
|
First --> Second
|
|
First --> Third
|
|
|
|
state First {
|
|
[*] --> fir
|
|
fir --> [*]
|
|
}
|
|
state Second {
|
|
[*] --> sec
|
|
sec --> [*]
|
|
}
|
|
state Third {
|
|
[*] --> thi
|
|
thi --> [*]
|
|
}
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> First
|
|
First --> Second
|
|
First --> Third
|
|
|
|
state First {
|
|
[*] --> fir
|
|
fir --> [*]
|
|
}
|
|
state Second {
|
|
[*] --> sec
|
|
sec --> [*]
|
|
}
|
|
state Third {
|
|
[*] --> thi
|
|
thi --> [*]
|
|
}
|
|
```
|
|
|
|
_You can not define transitions between internal states belonging to different composite states_
|
|
|
|
## Choice
|
|
|
|
Sometimes you need to model a choice between two or more paths, you can do so using <\<choice>>.
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
state if_state <<choice>>
|
|
[*] --> IsPositive
|
|
IsPositive --> if_state
|
|
if_state --> False: if n < 0
|
|
if_state --> True : if n >= 0
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
state if_state <<choice>>
|
|
[*] --> IsPositive
|
|
IsPositive --> if_state
|
|
if_state --> False: if n < 0
|
|
if_state --> True : if n >= 0
|
|
```
|
|
|
|
## Forks
|
|
|
|
It is possible to specify a fork in the diagram using <\<fork>> <\<join>>.
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
state fork_state <<fork>>
|
|
[*] --> fork_state
|
|
fork_state --> State2
|
|
fork_state --> State3
|
|
|
|
state join_state <<join>>
|
|
State2 --> join_state
|
|
State3 --> join_state
|
|
join_state --> State4
|
|
State4 --> [*]
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
state fork_state <<fork>>
|
|
[*] --> fork_state
|
|
fork_state --> State2
|
|
fork_state --> State3
|
|
|
|
state join_state <<join>>
|
|
State2 --> join_state
|
|
State3 --> join_state
|
|
join_state --> State4
|
|
State4 --> [*]
|
|
```
|
|
|
|
## Notes
|
|
|
|
Sometimes nothing says it better than a Post-it note. That is also the case in state diagrams.
|
|
|
|
Here you can choose to put the note to the _right of_ or to the _left of_ a node.
|
|
|
|
```mermaid-example
|
|
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.
|
|
```
|
|
|
|
```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.
|
|
```
|
|
|
|
## Concurrency
|
|
|
|
As in plantUml you can specify concurrency using the -- symbol.
|
|
|
|
```mermaid-example
|
|
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
|
|
}
|
|
```
|
|
|
|
```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
|
|
}
|
|
```
|
|
|
|
## Setting the direction of the diagram
|
|
|
|
With state diagrams you can use the direction statement to set the direction which the diagram will render like in this
|
|
example.
|
|
|
|
```mermaid-example
|
|
stateDiagram
|
|
direction LR
|
|
[*] --> A
|
|
A --> B
|
|
B --> C
|
|
state B {
|
|
direction LR
|
|
a --> b
|
|
}
|
|
B --> D
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram
|
|
direction LR
|
|
[*] --> A
|
|
A --> B
|
|
B --> C
|
|
state B {
|
|
direction LR
|
|
a --> b
|
|
}
|
|
B --> D
|
|
```
|
|
|
|
## Comments
|
|
|
|
Comments can be entered within a state diagram chart, 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 after the start of the comment to the next
|
|
newline will be treated as a comment, including any diagram syntax
|
|
|
|
```mermaid-example
|
|
stateDiagram-v2
|
|
[*] --> Still
|
|
Still --> [*]
|
|
%% this is a comment
|
|
Still --> Moving
|
|
Moving --> Still %% another comment
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram-v2
|
|
[*] --> Still
|
|
Still --> [*]
|
|
%% this is a comment
|
|
Still --> Moving
|
|
Moving --> Still %% another comment
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
```
|
|
|
|
## Styling with classDefs
|
|
|
|
As with other diagrams (like flowcharts), you can define a style in the diagram itself and apply that named style to a
|
|
state or states in the diagram.
|
|
|
|
**These are the current limitations with state diagram classDefs:**
|
|
|
|
1. Cannot be applied to start or end states
|
|
2. Cannot be applied to or within composite states
|
|
|
|
_These are in development and will be available in a future version._
|
|
|
|
You define a style using the `classDef` keyword, which is short for "class definition" (where "class" means something
|
|
like a _CSS class_)
|
|
followed by _a name for the style,_
|
|
and then one or more _property-value pairs_. Each _property-value pair_ is
|
|
a _[valid CSS property name](https://www.w3.org/TR/CSS/#properties)_ followed by a colon (`:`) and then a _value._
|
|
|
|
Here is an example of a classDef with just one property-value pair:
|
|
|
|
classDef movement font-style:italic;
|
|
|
|
where
|
|
|
|
- the _name_ of the style is `movement`
|
|
- the only _property_ is `font-style` and its _value_ is `italic`
|
|
|
|
If you want to have more than one _property-value pair_ then you put a comma (`,`) between each _property-value pair._
|
|
|
|
Here is an example with three property-value pairs:
|
|
|
|
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
|
|
|
|
where
|
|
|
|
- the _name_ of the style is `badBadEvent`
|
|
- the first _property_ is `fill` and its _value_ is `#f00`
|
|
- the second _property_ is `color` and its _value_ is `white`
|
|
- the third _property_ is `font-weight` and its _value_ is `bold`
|
|
- the fourth _property_ is `stroke-width` and its _value_ is `2px`
|
|
- the fifth _property_ is `stroke` and its _value_ is `yello`
|
|
|
|
### Apply classDef styles to states
|
|
|
|
There are two ways to apply a `classDef` style to a state:
|
|
|
|
1. use the `class` keyword to apply a classDef style to one or more states in a single statement, or
|
|
2. use the `:::` operator to apply a classDef style to a state as it is being used in a transition statement (e.g. with an arrow
|
|
to/from another state)
|
|
|
|
#### 1. `class` statement
|
|
|
|
A `class` statement tells Mermaid to apply the named classDef to one or more classes. The form is:
|
|
|
|
```text
|
|
class [one or more state names, separated by commas] [name of a style defined with classDef]
|
|
```
|
|
|
|
Here is an example applying the `badBadEvent` style to a state named `Crash`:
|
|
|
|
```text
|
|
class Crash badBadEvent
|
|
```
|
|
|
|
Here is an example applying the `movement` style to the two states `Moving` and `Crash`:
|
|
|
|
```text
|
|
class Moving, Crash movement
|
|
```
|
|
|
|
Here is a diagram that shows the examples in use. Note that the `Crash` state has two classDef styles applied: `movement`
|
|
and `badBadEvent`
|
|
|
|
```mermaid-example
|
|
stateDiagram
|
|
direction TB
|
|
|
|
accTitle: This is the accessible title
|
|
accDescr: This is an accessible description
|
|
|
|
classDef notMoving fill:white
|
|
classDef movement font-style:italic
|
|
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
|
|
|
|
[*]--> Still
|
|
Still --> [*]
|
|
Still --> Moving
|
|
Moving --> Still
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
|
|
class Still notMoving
|
|
class Moving, Crash movement
|
|
class Crash badBadEvent
|
|
class end badBadEvent
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram
|
|
direction TB
|
|
|
|
accTitle: This is the accessible title
|
|
accDescr: This is an accessible description
|
|
|
|
classDef notMoving fill:white
|
|
classDef movement font-style:italic
|
|
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
|
|
|
|
[*]--> Still
|
|
Still --> [*]
|
|
Still --> Moving
|
|
Moving --> Still
|
|
Moving --> Crash
|
|
Crash --> [*]
|
|
|
|
class Still notMoving
|
|
class Moving, Crash movement
|
|
class Crash badBadEvent
|
|
class end badBadEvent
|
|
```
|
|
|
|
#### 2. `:::` operator to apply a style to a state
|
|
|
|
You can apply a classDef style to a state using the `:::` (three colons) operator. The syntax is
|
|
|
|
```text
|
|
[state]:::[style name]
|
|
```
|
|
|
|
You can use this in a diagram within a statement using a class. This includes the start and end states. For example:
|
|
|
|
```mermaid-example
|
|
stateDiagram
|
|
direction TB
|
|
|
|
accTitle: This is the accessible title
|
|
accDescr: This is an accessible description
|
|
|
|
classDef notMoving fill:white
|
|
classDef movement font-style:italic;
|
|
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
|
|
|
|
[*] --> Still:::notMoving
|
|
Still --> [*]
|
|
Still --> Moving:::movement
|
|
Moving --> Still
|
|
Moving --> Crash:::movement
|
|
Crash:::badBadEvent --> [*]
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram
|
|
direction TB
|
|
|
|
accTitle: This is the accessible title
|
|
accDescr: This is an accessible description
|
|
|
|
classDef notMoving fill:white
|
|
classDef movement font-style:italic;
|
|
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
|
|
|
|
[*] --> Still:::notMoving
|
|
Still --> [*]
|
|
Still --> Moving:::movement
|
|
Moving --> Still
|
|
Moving --> Crash:::movement
|
|
Crash:::badBadEvent --> [*]
|
|
```
|
|
|
|
## Spaces in state names
|
|
|
|
Spaces can be added to a state by first defining the state with an id and then referencing the id later.
|
|
|
|
In the following example there is a state with the id **yswsii** and description **Your state with spaces in it**.
|
|
After it has been defined, **yswsii** is used in the diagram in the first transition (`[*] --> yswsii`)
|
|
and also in the transition to **YetAnotherState** (`yswsii --> YetAnotherState`).\
|
|
(**yswsii** has been styled so that it is different from the other states.)
|
|
|
|
```mermaid-example
|
|
stateDiagram
|
|
classDef yourState font-style:italic,font-weight:bold,fill:white
|
|
|
|
yswsii: Your state with spaces in it
|
|
[*] --> yswsii:::yourState
|
|
[*] --> SomeOtherState
|
|
SomeOtherState --> YetAnotherState
|
|
yswsii --> YetAnotherState
|
|
YetAnotherState --> [*]
|
|
```
|
|
|
|
```mermaid
|
|
stateDiagram
|
|
classDef yourState font-style:italic,font-weight:bold,fill:white
|
|
|
|
yswsii: Your state with spaces in it
|
|
[*] --> yswsii:::yourState
|
|
[*] --> SomeOtherState
|
|
SomeOtherState --> YetAnotherState
|
|
yswsii --> YetAnotherState
|
|
YetAnotherState --> [*]
|
|
```
|