mermaid/docs/stateDiagram.md
2019-10-09 20:05:24 +02:00

5.4 KiB
Executable File

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.

Mermaid can render state diagrams with a syntax derived from plantUml, this to make the diagrams easier to use.

stateDiagram
    [*] --> Still
    Still --> [*]

    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]
stateDiagram
    [*] --> Still
    Still --> [*]

    Still --> Moving
    Moving --> Still
    Moving --> Crash
    Crash --> [*]

States

A state can be declares in multiple ways. The simplest way is to define a state id as a description.

stateDiagram
    s1
stateDiagram
    s1

Another way is by using the state key word as per below:

stateDiagram
    state "This ia state decription" as s2
stateDiagram
    state "This ia state decription" as s2

Transitions

Transitions are path/edges when one state passes into another. This is represented using text arrow, "-->".

Transitions from and to states that are not defined implicitly defines these states.

stateDiagram
    s1 --> s2
stateDiagram
    s1 --> s2

It is possieblt to add text to a transition.

stateDiagram
    s1 --> s2: A transition
stateDiagram
    s1 --> s2: A transition

There are two special states indicating the start of the diagram and the stop of the diagram. These are written with the [*] syntax.

stateDiagram
    [*] --> s1
    s1 --> [*]
stateDiagram
    [*] --> s1
    s1 --> [*]

Composit states

In a real world use of state diagrams you often end up with diagrams that are multi-dimensional as one state can have several internal states.

In order to define a composit state you need to use the state keyword as per below:

stateDiagram
    [*] --> First
    state First {
        [*] --> second
        second --> [*]
    }
stateDiagram
    [*] --> First
    state First {
        [*] --> second
        second --> [*]
    }

You can do this in several layers:

stateDiagram
    [*] --> First
    First --> Second
    First --> Third

    state First {
        [*] --> fir
        fir --> [*]
    }
    state Second {
        [*] --> sec
        sec --> [*]
    }
    state Third {
        [*] --> thi
        thi --> [*]
    }
stateDiagram
    [*] --> First
    First --> Second
    First --> Third

    state First {
        [*] --> fir
        fir --> [*]
    }
    state Second {
        [*] --> sec
        sec --> [*]
    }
    state Third {
        [*] --> thi
        thi --> [*]
    }

Forks

It is possible to specify a fork in the diagram using <<fork>> <<join>>.

   stateDiagram
    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 --> [*]
   stateDiagram
    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 then a postit note. That is also the case in state diagrams.

Here you canb choose to put the onte to the right or to the left of a node.

    stateDiagram
        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.
    stateDiagram
    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.

    stateDiagram
        [*] --> Active

        state Active {
            [*] --> NumLockOff
            NumLockOff --> NumLockOn : EvNumLockPressed
            NumLockOn --> NumLockOff : EvNumLockPressed
            --
            [*] --> CapsLockOff
            CapsLockOff --> CapsLockOn : EvCapsLockPressed
            CapsLockOn --> CapsLockOff : EvCapsLockPressed
            --
            [*] --> ScrollLockOff
            ScrollLockOff --> ScrollLockOn : EvCapsLockPressed
            ScrollLockOn --> ScrollLockOff : EvCapsLockPressed
        }

Styling

Styling of the a sequence diagram is done by defining a number of css classes. During rendering these classes are extracted from the file located at src/themes/sequence.scss

Classes used (TB Written)

Class Description
Fakenote Styles for the note box.
FakenoteText Styles for the text on in the note boxes.

Configuration

Is it possible to adjust the margins etc for the stateDiagram ... TB written

mermaid.stateConfig = {
};

Possible configuration params:

Param Description Default value
TBS Turns on/off the rendering of actors below the diagram as well as above it false