State diagram

Sobre diagramas de estado

Um diagrama de estado (também chamado de statechart ou diagrama de máquina de estados) descreve o ciclo de vida de um sistema reativo — em quais estados ele pode estar, quais eventos fazem a transição entre eles e quais ações são executadas na entrada, saída ou durante um estado. Arquitetos de software os usam para especificar fluxos de trabalho; engenheiros de controle os usam para projetar controladores reativos; designers de UI os usam para modelar ciclos de vida de telas. Eles são formalizados na OMG UML 2.5.1 §14 (máquinas de estado) e na extensão Statechart de Harel de 1987, que introduziu estados compostos, histórico e regiões ortogonais.

O Schematex implementa um superconjunto estrito do Mermaid stateDiagram-v2 — todos os exemplos do Mermaid funcionam sem alteração, e você ainda obtém recursos da UML 2.5 que o Mermaid não expõe: atividades entry / exit / do, rótulos completos de transição trigger [guard] / action, pseudo-estados terminate e de histórico, junction e notas no estilo Schematex. O layout usa o mesmo mecanismo Sugiyama-layered-DAG dos fluxogramas, de modo que ciclos, estados compostos e transições entre fronteiras são roteados de forma limpa.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Idle Authenticating Authenticated Locked Admin User submit [form_valid] / clearErrors() ok / storeToken() fail [retries < 3] / incrementRetries() fail [retries >= 3] [role == "admin"] [role == "user"]
UTF-8 · LF · 14 lines · 395 chars✓ parsed·12.6 ms·6.5 KB SVG

1. Seu primeiro diagrama de estado

O menor diagrama de estado útil tem um estado inicial, um estado final e uma transição.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Running done
UTF-8 · LF · 3 lines · 54 chars✓ parsed·1.1 ms·3.3 KB SVG

Três regras cobrem 80% dos casos de uso:

  1. Comece com o cabeçalho stateDiagram-v2 (estilo Mermaid) ou state (estilo Schematex).
  2. Use [*] para o nó de início implícito (quando à esquerda de -->) ou o nó de fim (quando à direita).
  3. Conecte estados com -->. Adicione um rótulo após : — a forma completa UML é trigger [guard] / action.

A direção padrão é TB (de cima para baixo) para corresponder ao Mermaid. Substitua com direction LR em sua própria linha, ou [direction: LR] no cabeçalho.

Comentários usam %% (Mermaid), # ou //.


2. Declarações de estado

Os estados são criados automaticamente quando referenciados pela primeira vez em uma transição, mas declarações explícitas permitem controlar o rótulo e a forma.

state Authenticating
state "Awaiting Approval" as Approval
Idle: Waiting for input
FormaEfeito
IdleID simples — criado como estado simples com Idle como ID e rótulo
state IdleDeclaração explícita; mesmo efeito
state "Awaiting Approval" as ApprovalAliasado — exibe Awaiting Approval, referenciado como Approval nas transições
Idle: Waiting for inputRótulo inline — Idle é o ID, Waiting for input é o rótulo visível

3. Pseudo-estados

Os pseudo-estados controlam o fluxo de uma máquina de estados sem representar um estado de repouso estável.

MermaidSchematexSímboloPropósito
[*] (origem)initial idCírculo preto preenchidoPonto de entrada de uma região
[*] (destino)final idCírculo preenchido dentro de anel externoSaída bem-sucedida
state X <<choice>>choice XLosangoRamificação dinâmica (guards avaliados em tempo de execução)
state X <<fork>>fork XBarra preta espessaUma entrada → N saídas paralelas
state X <<join>>join XBarra preta espessaN entradas → uma saída
junction XPequeno círculo preenchidoPonto de fusão estático
history XCírculo com HReentrar no último sub-estado visitado
dhistory XCírculo com H*Histórico profundo (recursivo)
terminate XMarcador ×Encerramento anormal (sem limpeza)
entry_point X / exit_point XCírculo vazio na borda do compostoPontos de entrada / saída nomeados

[*] é o alias do Mermaid e é sempre resolvido por direção: no lado da origem de --> é um initial, no lado do destino é um final. Cada escopo composto recebe seu próprio par.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Idle Authorized evaluate [role == "admin"] [role == "user"]
UTF-8 · LF · 9 lines · 220 chars✓ parsed·1.9 ms·5.1 KB SVG

4. Transições

O rótulo completo de transição UML 2.5 tem três partes opcionais:

trigger [guard] / action
CampoSignificadoExemplo
triggerEvento que dispara a transiçãosubmit, tick, timeout(30s)
[guard]Expressão booleana avaliada no momento do disparo[count > 0], [role == "admin"]
/ actionAção(ões) executada(s) quando a transição é tomada/ log(); increment()

As três partes são opcionais — uma transição sem rótulo é anônima (transição de conclusão).

A --> B                                      %% conclusão anônima
A --> B : tick                                %% apenas trigger
A --> B : [count > 0]                         %% apenas guard
A --> B : / clearErrors()                     %% apenas action
A --> B : tick [count > 0] / log()            %% as três partes
A --> B : tick, tock [enabled] / handle()     %% múltiplos triggers

Rótulos longos são quebrados automaticamente quando excedem a largura da faixa.


5. Estados compostos

Um estado composto contém um sub-statechart aninhado. O estado externo age como um contêiner com seus próprios pseudo-estados initial / final.

state Playing {
  [*] --> Buffering
  Buffering --> Streaming : buffer_full
  Streaming --> Buffering : underflow
}

Tanto a sintaxe Mermaid (state X { … }) quanto a forma Schematex (composite X { … }) são aceitas. As atividades podem ser declaradas dentro do bloco composto:

state Playing {
  entry / startBuffer()
  exit / stopBuffer()
  do / decodeFrames()

  [*] --> Buffering
  Buffering --> Streaming : buffer_full
  Streaming --> Buffering : underflow
}

O renderizador desenha os compostos como um cluster estilizado com barra de título e compartimento de atividades.

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex Playing entry / startBuffer() exit / stopBuffer() do / decodeFrames() Streaming Stopped Paused Buffering play / loadSource() pause play stop / releaseSource() buffer_full underflow
UTF-8 · LF · 18 lines · 349 chars✓ parsed·3.8 ms·6.7 KB SVG

Transições entre fronteiras (Outside --> Inside) são roteadas automaticamente — o layout Sugiyama puxa a origem/destino pela borda do composto.


6. Regiões concorrentes

Dentro de um composto, o separador -- (Mermaid) ou --- (Schematex) divide o corpo em regiões ortogonais que rodam concorrentemente.

state Active {
  [*] --> r1_idle
  r1_idle --> Connected : connect
  --
  [*] --> r2_idle
  r2_idle --> Working : start
}

Use fork e join para gerar / sincronizar entre regiões:

state-diagram·§ UML 2.5 / Harel
↘ preview
100%
State Diagram UML 2.5 / Harel statechart rendered by Schematex A B done_a done_b
UTF-8 · LF · 10 lines · 136 chars✓ parsed·6.8 ms·4.6 KB SVG

7. Notas

Uma anotação curta pode ser anexada a qualquer lado de qualquer estado.

note right of Checking : Calls /api/verify synchronously.
note left of Idle : Anonymous landing state

Notas de múltiplas linhas usam a forma de bloco end note do Mermaid ou a forma { … } do Schematex:

note right of Authenticating
  Stores the JWT in localStorage
  on success.
end note

note left_of Idle {
  Anonymous landing state.
  Returns here on 401.
}

8. Auto-transições

Uma transição A --> A é renderizada como um arco curvo no lado direito do nó.

Idle --> Idle : poll / refresh()

O rótulo é posicionado ao lado do arco, fora da caixa delimitadora.


9. Direção do layout

O Schematex usa como padrão TB (de cima para baixo), correspondendo ao Mermaid. Substitua no cabeçalho:

stateDiagram-v2
direction LR

[*] --> Loading
Loading --> Ready

Ou com a forma de atributos entre colchetes do Schematex:

state "Order Lifecycle" [direction: TB]

[*] --> Pending
Pending --> Paid

BT e RL são aceitos pelo parser, mas normalizados para TB e LR respectivamente (o mecanismo de layout ainda não inverte a ordem visual).


10. Erros comuns

Você escreveuO parser dizCorreção
[*] -> [*]Tratado como alias inicial e alias final na mesma linhaSempre tenha pelo menos um estado nomeado entre os aliases [*]
state X <<branch>>branch não é um estereótipoUse <<choice>> (dinâmico) ou <<fork>> / <<join>>
note right of
text
Nota de múltiplas linhas deve terminar com end noteAdicione end note em sua própria linha
composite X (sem chaves)Tratado como uma declaração de estado simplesAbra o bloco: composite X {
direction LR dentro de compostoDireção por região ainda não suportadaDefina a direção na linha do cabeçalho

11. Gramática (EBNF)

document     = header statement*
header       = ("stateDiagram-v2" | "stateDiagram" | "state")
                ( title )? ( "[" attrs "]" )? NEWLINE
attrs        = attr ("," attr)*
attr         = "direction:" ("TB" | "LR")

statement    = comment
             | direction-stmt              %% direction LR / TB / BT / RL
             | state-decl
             | alias-decl                  %% state "Long" as ID
             | stereotype-decl             %% state ID <<choice|fork|join|end>>
             | pseudo-decl                 %% initial / final / choice / ... ID
             | composite-block             %% (state | composite) ID { ... }
             | label-stmt                  %% ID : description
             | transition
             | note-stmt
             | region-sep                  %% --  or  ---

transition   = (ID | "[*]") "-->" (ID | "[*]") ( ":" trans-label )? NEWLINE
trans-label  = trigger? ( "[" guard "]" )? ( "/" action )?

note-stmt    = "note" side ID ":" inline-text NEWLINE
             | "note" side ID NEWLINE  text-line+  ("end note" | "}") NEWLINE
side         = "left of" | "right of" | "left_of" | "right_of"

comment      = "%%" any | "#" any | "//" any

ID           = [A-Za-z_] [A-Za-z0-9_]*

Fonte autoritativa: src/diagrams/state/parser.ts. Se houver divergência com o parser, o parser prevalece — por favor, abra uma issue.


12. Conformidade com padrões

RecursoUML 2.5Harel 1987MermaidSchematex
Estado simples
Estado composto (aninhado)
Pseudo-estado initial / final
Pseudo-estado choice
Fork / join
Pseudo-estado junction
Histórico (raso / profundo)
Pseudo-estado terminate
Atividades entry / exit / do
Rótulos trigger [guard] / action❌ (apenas rótulo)
Transições internas
Regiões concorrentes
Notas em estados
Transições entre compostos
Alias initial/final [*]

O Schematex é um superconjunto estrito do Mermaid stateDiagram-v2. Exemplos do Mermaid funcionam sem alteração; os elementos adicionais da UML 2.5 (atividades, histórico, junction, terminate, rótulos completos de transição) são aceitos em conjunto.

Referências:


13. Roadmap

  • Direções BT / RL — atualmente normalizadas para TB / LR no momento do parse; inversão visual pendente
  • Substituição de direção por regiãodirection LR dentro de um bloco composto (atualmente ignorado silenciosamente)
  • Referências a submáquinas — renderização do estereótipo state Foo : Submachine
  • Compartimento de transição interna — divisor visual explícito para linhas tick [g] / a dentro do corpo de um estado

Exemplos relacionados

Cenários prontos para uso da galeria de exemplos:

state·§ OMG UML 2.5.1 §14
State Diagram — Traffic Light UML 2.5 / Harel statechart rendered by Schematex Traffic Light Red Green Yellow timer timer timer power_off
Traffic light (state diagram)
A three-state finite state machine for a traffic signal — Red, Green, Yellow — with timer-driven transitions and a power_off exit to a final state. Introduces UML initial and final pseudo-states, transition labels, and the cyclic structure that makes state diagrams the right tool for reactive systems.
education
state·§ OMG UML 2.5.1 §14
State Diagram — E-Commerce Order Lifecycle UML 2.5 / Harel statechart rendered by Schematex E-Commerce Order Lifecycle Processing AwaitingTransfer Picking Packing Shipped Delivered Failed Refunded Pending Cancelled Confirmed place_order [items_in_stock] / reserveInventory() cancel pay [method == "card"] [method == "wallet"] [method == "bank_transfer"] transfer_received [amount_correct] transfer_timeout picked / updateWarehouse() label_printed carrier_confirmed delivered / notifyCustomer() fulfillment_error return_request [within_30_days] / initiateRefund() retry [attempt < 3] retry [attempt >= 3] SLA: 48 h before timeout.
E-commerce order lifecycle (state diagram)
Full order state machine — from Pending through payment routing (choice pseudo-state), composite Processing state with Picking/Packing/Shipped sub-states, delivery, refund, and cancellation paths. Demonstrates composite states, choice pseudo-states, guard conditions, entry actions, and UML notes.
e-commerce

Found this useful?

Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.