Processo Tipo
Expressão gráfica
Pensamento Tipo
Expressão estruturada
Anotações Tipo
Expressão eficiente

Diagrama de estadosSintaxe

Diagrama de estados

A sintaxe do diagrama de estados do Mermaid é compatível com a sintaxe usada no plantUml, o que facilita o compartilhamento de diagramas entre o mermaid e o plantUml.

Código
                            
Copiar
Incorporar
--- title: Simple sample --- stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

Editor antigo:

Código
                            
Copiar
Incorporar
stateDiagram [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

Novo editor:

Em um diagrama de estados, o sistema é descrito por meio de estados e de como um estado passa para outro por meio de transições. O exemplo de diagrama acima mostra três estados: parado, em movimento e colisão. Você começa no estado parado e, a partir do estado parado, pode passar para o estado em movimento. A partir do estado em movimento, você pode voltar ao estado parado ou passar ao estado de colisão. Não há transição do estado parado para o estado de colisão. (Se permanecer parado, você não colidirá.)

状态

É possível declarar estados de várias maneiras; a mais simples é definir um estado apenas com um id:

Código
                            
Copiar
Incorporar
stateDiagram-v2 stateId

Outra maneira é usar a sintaxe state, adicionando a seguinte descrição:

Código
                            
Copiar
Incorporar
stateDiagram-v2 state "This is a state description" as s2

Outra forma de definir um estado com descrição é definir primeiro o ID do estado e depois adicionar dois-pontos e a descrição:

Código
                            
Copiar
Incorporar
stateDiagram-v2 s2 : This is a state description

Transição

Uma transição é a linha de conexão que ocorre quando um estado passa para outro, representada pela seta de texto "-->".

Quando você define uma transição entre dois estados e o estado ainda não foi definido, o estado indefinido será definido usando o id da transição. Depois, você pode adicionar uma descrição ao estado definido dessa forma.

Código
                            
Copiar
Incorporar
stateDiagram-v2 s1 --> s2

É possível adicionar texto a uma transição para descrever o que ela representa:

Código
                            
Copiar
Incorporar
stateDiagram-v2 s1 --> s2: A transition

Início e fim

Há dois estados especiais que representam o início e a parada do diagrama. Esses dois estados são representados pela sintaxe [*], e a direção da transição para esse estado determina se ele é o estado inicial ou o estado final.

Código
                            
Copiar
Incorporar
stateDiagram-v2 [*] --> s1 s1 --> [*]

Estado composto

Ao usar diagramas de estados no mundo real, você frequentemente encontra diagramas multidimensionais, pois um estado pode ter vários estados internos; isso é chamado de estado composto.

Para definir um estado composto, você precisa usar a sintaxe state, seguida de um id, e escrever o corpo do estado composto entre chaves {}. Você pode nomear o estado composto em uma linha separada, como faz ao definir um estado simples. Consulte o exemplo abaixo:

Código
                            
Copiar
Incorporar
stateDiagram-v2 [*] --> First state First { [*] --> second second --> [*] } [*] --> NamedComposite NamedComposite: Another Composite state NamedComposite { [*] --> namedSimple namedSimple --> [*] namedSimple: Another simple }

Você pode trabalhar em vários níveis:

Código
                            
Copiar
Incorporar
stateDiagram-v2 [*] --> First state First { [*] --> Second state Second { [*] --> second second --> Third state Third { [*] --> third third --> [*] } } }

Você também pode definir transições entre estados compostos:

Código
                            
Copiar
Incorporar
stateDiagram-v2 [*] --> First First --> Second First --> Third state First { [*] --> fir fir --> [*] } state Second { [*] --> sec sec --> [*] } state Third { [*] --> thi thi --> [*] }

Observação: não é possível definir transições entre estados internos que pertencem a estados compostos diferentes.

Escolha

Às vezes você precisa simular a escolha entre dois ou mais caminhos; isso pode ser feito com <<choice>>.

Código
                            
Copiar
Incorporar
stateDiagram-v2 state if_state <<choice>> [*] --> IsPositive IsPositive --> if_state if_state --> False: if n < 0 if_state --> True : if n >= 0

Bifurcação/Mesclagem

É possível usar <<fork>> e <<join>> para especificar uma bifurcação/junção no diagrama.

Código
                            
Copiar
Incorporar
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 --> [*]

Observação

O uso de comentários em diagramas de estados permite uma expressão mais clara; você pode optar por colocar o comentário à direita ou à esquerda do nó.

Código
                            
Copiar
Incorporar
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.

Concorrência

Assim como no plantUml, você pode usar o símbolo de hífen -- para especificar a concorrência.

Código
                            
Copiar
Incorporar
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 }

Definir a direção do diagrama

Para diagramas de estados, você pode usar uma instrução de direção para definir a direção de renderização do diagrama, como neste exemplo.

Código
                            
Copiar
Incorporar
stateDiagram direction LR [*] --> A A --> B B --> C state B { direction LR a --> b } B --> D

Comentário

É possível inserir comentários em um diagrama de estados; o editor irá ignorá-los. Os comentários devem começar com dois sinais de porcentagem (%%); todo o texto desde essa marcação até a próxima quebra de linha será considerado comentário, incluindo qualquer sintaxe de diagrama. Os comentários podem ocupar uma linha própria ou ser colocados no final de uma instrução.

Código
                            
Copiar
Incorporar
stateDiagram-v2 [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*]

Definir estilos com classDefs

Limitações atuais do classDef em diagramas de estados:

1. Não pode ser aplicado a estados iniciais ou finais

2. Não pode ser aplicado a um estado composto nem dentro de um estado composto

Você pode usar a sintaxe classDef (abreviação de class definition, em que "class" é semelhante a uma classe em CSS) para definir estilos. Depois de classDef vem o nome do estilo, seguido de um ou mais pares 'propriedade-valor', cada um composto por um nome de propriedade CSS válido, dois-pontos (:) e o valor correspondente.

A seguir está um exemplo de classDef com apenas um par 'propriedade-valor':

                            
Copiar
Incorporar
classDef movement font-style:italic;
  • O nome do estilo é movement
  • A única propriedade é font-style, e o valor é italic

Se você quiser ter vários pares 'propriedade-valor', pode colocar uma vírgula (,) entre cada par 'propriedade-valor'.

A seguir está um exemplo com três pares 'propriedade-valor':

                            
Copiar
Incorporar
classDef badBadEvent fill:#f00,color:white,font-weight:bold,stroke-width:2px,stroke:yellow
  • O nome do estilo é badBadEvent
  • A primeira propriedade é fill, e seu valor é #f00
  • A segunda propriedade é color, e seu valor é white
  • A terceira propriedade é font-weight, e seu valor é bold
  • A quarta propriedade é stroke-width, e seu valor é 2px
  • A quinta propriedade é stroke, e seu valor é yellow

Aplicar estilos classDef a estados

Há duas maneiras de aplicar estilos classDef a estados:

  • Use a sintaxe class para aplicar um estilo classDef a um ou mais estados em uma única instrução
  • Use o operador ::: para aplicar um estilo classDef quando um estado é usado em uma instrução de transição (por exemplo, com uma seta apontando para/partindo de outro estado)

1. Instrução class

A instrução class diz ao Mermaid para aplicar o classDef especificado a uma ou mais classes. A forma é:

                            
Copiar
Incorporar
class [one or more state names, separated by commas] [name of a style defined with classDef]

A seguir está um exemplo de aplicação do estilo badBadEvent ao estado chamado Crash:

                            
Copiar
Incorporar
class Crash badBadEvent

A seguir está um exemplo de aplicação do estilo movement aos estados Moving e Crash:

                            
Copiar
Incorporar
class Moving,Crash movement

Aqui está um exemplo. Observe que o estado Crash aplica dois estilos classDef: movement e badBadEvent

Código
                            
Copiar
Incorporar
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:pink,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. Aplicar estilo a estados com o operador :::

Você pode usar o operador ::: para aplicar um estilo classDef a um estado. A sintaxe é:

                            
Copiar
Incorporar
[state]:::[style name]

Você pode aplicá-lo em instruções que usam classes, incluindo estados inicial e final. Por exemplo:

Código
                            
Copiar
Incorporar
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:pink,color:white,font-weight:bold,stroke-width:2px,stroke:yellow [*] --> Still:::notMoving Still --> [*] Still --> Moving:::movement Moving --> Still Moving --> Crash:::movement Crash:::badBadEvent --> [*]

Espaços no nome do estado

Você pode definir primeiro o estado usando um id e depois referenciar esse id para adicionar espaços ao estado.

No exemplo a seguir, há um estado cujo ID é yswsii, descrito como ''Your state with spaces in it''. Após a definição, yswsii é usado na primeira transição do diagrama ([*] --> yswsii) e também é usado ao transitar para YetAnotherState (yswsii --> YetAnotherState). yswsii foi estilizado para diferenciá-lo dos outros estados.

Código
                            
Copiar
Incorporar
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 --> [*]