Usage ===== Sequence Diagram Elements ------------------------- Block +++++ A *Block* is anything (except ``Box``) that has an `end` statement in Mermaid JS. Some Block types have clauses; clauses can only be added to a given Block type. The table below summarises the Block types and their clauses, and how these translate to Mermaid JS. +-----------+--------+------------+--------+ | Block | Clause | Mermaid JS | | +===========+========+============+========+ | Breakk | | break | | +-----------+--------+------------+--------+ | Critical | Option | critical | option | +-----------+--------+------------+--------+ | Iff | Elsee | alt & opt | else | +-----------+--------+------------+--------+ | Loop | | loop | | +-----------+--------+------------+--------+ | Parallel | Andd | par | and | +-----------+--------+------------+--------+ | Rectangle | | rect | | +-----------+--------+------------+--------+ Blocks accept Items (See `Item`_). Block Items are rendered in the order that they are added to the Block. .. note:: Blocks are Items and so can be added to Blocks. For example, an `Iff` conditional block clause can contain a `Parallel` block. Breakk ****** A `Breakk` block indicates a stopping of the sequence within the flow. Critical ******** A `Critical` block indicates that a group of actions must happen. It *may* contain `Option` clauses to indicate groups of actions dependant on conditions and/or events. Iff *** An `Iff` block is a conditional block. It *may* contain `Elsee` clauses, either with a condition (elseif) or without (else). If the `Iff` block has `Elsee` clauses it is rendered as an `alt` in Mermaid JS; if not it is rendered as an `opt`. Loop **** A `Loop` block indicates that the actions in the block repeat. The description *should* indicate such things as repetition frequency, the condition on which repetition continues or ends, etc. Parallel ******** A `Parallel` block indicates groups of actions that happen simultaneously and *should* have one or more `Andd` clauses. .. note:: It is the action groups that run in parallel; actions within the groups run in sequence. Rectangle ********* A `Rectangle` provides a means of grouping actions together. Item ++++ As mentioned above, Blocks are Items. The other Items are `Message` and `Note`. Message ******* .. note:: `Actor` is used to indicate an `Actor` or `Participant`. They are functionally identical and differ only in how they are rendered by Mermaid JS. A `Message` indicates an action between two `Actors` - a sender and a recipient. `Actors` are typically defined ahead of time, usually defined at the start of the diagram. This is always true for the sender, but the the recipient can be defined just before the message. Similarly, if either the sender or recipient will not take part in any further messages they can be destroyed. .. note:: Only one create or destroy can be associated with a `Message`. It is not possible to create and destroy an `Actor`, or destroy the sender and recipient on the same message. Note **** A `Note` provides additional information about an `Actor`, `Message` or action in the diagram. Actor/Participant +++++++++++++++++ An `Actor` is an entity that sends and/or receives messages; it may represent a person, service, job function, ... The only difference between an `Actor` and a `Participant` is their shape in the diagram; functionally they are the same; Box *** Multiple `Actor`s can be grouped together in a `Box`. Example ------- PHP +++ .. code-block:: php echo Mermaid::create(SequenceDiagram::class) ->withParticipant($alice, $bob) ->withItem( new Message($alice, 'Hello Bob', Arrow::solidLineArrowhead, $bob), new Message($bob, 'Hello Alice', Arrow::solidLineArrowhead, $alice), (new Parallel('Alice to Bob')) ->withItem( new Message($alice, 'Message AB', Arrow::solidLineArrowhead, $bob) ) ->withAnd( (new Andd('Alice to Carol')) ->withItem( (new Message($alice, 'Message AC', Arrow::solidLineArrowhead)) ->withRecipient($carol) , (new Message($carol, 'Message CA', Arrow::solidLineArrowhead, $alice)) ->destroy(Destroy::sender) ) , (new Andd('Check on Bob')) ->withItem( (new Loop("Check Bob's status every hour until OK")) ->withitem( new Message($alice, "How's it going Bob", Arrow::solidLineArrowhead, $bob), ) , new Note('Bob is OK so end the loop', Position::over, $alice, $bob), new Message($bob, "I'm OK Alice", Arrow::solidLineArrowhead, $alice), (new Iff('If it concerns Dave')) ->withItem( (new Message($alice, 'Message AD', Arrow::solidLineArrowhead)) ->withRecipient($dave) ) ) , (new Andd('One of the boys')) ->withItem( (new Iff('Dave')) ->withItem( (new Message($alice, 'Message AD', Arrow::solidLineArrowhead, $dave)) ->destroy(Destroy::recipient) ) ->withElse( (new Elsee('Bob')) ->withItem( new Message($alice, 'Message AB', Arrow::solidLineArrowhead, $bob) ) ) ) ), new Message($alice, 'Time to wrap up Bob', Arrow::solidLineArrowhead, $bob), new Message($bob, 'OK Alice', Arrow::solidLineArrowhead, $alice) ) ->render() ; Generated Mermaid +++++++++++++++++ .. code-block:: html
    sequenceDiagram
      participant _A as Alice
      participant _B as Bob
      _A->>_B: Hello Bob
      _B->>_A: Hello Alice
      par Alice to Bob
        _A->>_B: Message AB
      and Alice to Carol
        create participant _C as Carol
        _A->>_C: Message AC
        destroy _C
        _C->>_A: Message CA
      and Check on Bob
        loop Check Bob's status every hour until OK
          _A->>_B: How's it going Bob
        end
        note over _A,_B: Bob is OK so end the loop
        _B->>_A: I'm OK Alice
        opt If it concerns Dave
          create participant _D as Dave
          _A->>_D: Message AD
        end
      and One of the boys
        alt Dave
          destroy _D
          _A->>_D: Message AD
        else Bob
          _A->>_B: Message AB
        end
      end
      _A->>_B: Time to wrap up Bob
      _B->>_A: OK Alice
    
Mermaid Diagram +++++++++++++++ .. mermaid:: sequenceDiagram participant _A as Alice participant _B as Bob _A->>_B: Hello Bob _B->>_A: Hello Alice par Alice to Bob _A->>_B: Message AB and Alice to Carol create participant _C as Carol _A->>_C: Message AC destroy _C _C->>_A: Message CA and Check on Bob loop Check Bob's status every hour until OK _A->>_B: How's it going Bob end note over _A,_B: Bob is OK so end the loop _B->>_A: I'm OK Alice opt If it concerns Dave create participant _D as Dave _A->>_D: Message AD end and One of the boys alt Dave destroy _D _A->>_D: Message AD else Bob _A->>_B: Message AB end end _A->>_B: Time to wrap up Bob _B->>_A: OK Alice