02. Manual de Uso de Mermaid
Capítulo 2: Diagramas de Flujo Avanzados, Subgrafos y Estilos CSS
En el capítulo anterior aprendiste la sintaxis básica y cómo compilar tus primeros archivos .mmd. Ahora profundizaremos en el diseño de diagramas de flujo complejos, explorando la organización modular mediante subgrafos y la personalización estética utilizando estilos CSS y clases.
1. Conexiones Avanzadas y Encadenamiento
A medida que los flujos crecen, definir las conexiones línea por línea puede volverse repetitivo. Mermaid permite encadenar nodos y definir múltiples enlaces en una sola instrucción.
Encadenamiento en serie
Puedes conectar múltiples nodos de forma consecutiva en una sola línea:
flowchart LR
A --> B --> C --> D
flowchart LR
A --> B --> C --> D
Conexiones múltiples (uno a muchos / muchos a uno)
Para enviar o recibir flujos hacia/desde varios nodos simultáneamente, utiliza la sintaxis con &:
flowchart TD
%% Uno a muchos
Inicio --> A & B & C
%% Muchos a uno
A & B & C --> Fin
flowchart TD
%% Uno a muchos
Inicio --> A & B & C
%% Muchos a uno
A & B & C --> Fin
Cruzamiento de enlaces y direcciones inversas
Puedes combinar diferentes direcciones en los conectores para controlar la disposición en pantalla:
flowchart LR
Paso1 --> Paso2
Paso2 --> Paso3
Paso3 -- Reintentar --> Paso2
Paso3 -- Error grave --> Paso1
flowchart LR
Paso1 --> Paso2
Paso2 --> Paso3
Paso3 -- Reintentar --> Paso2
Paso3 -- Error grave --> Paso1
2. Agrupación y Estructuración con Subgrafos
Los subgrafos (subgraph) permiten dividir diagramas extensos en bloques lógicos o secciones funcionales (por ejemplo, frontend, backend, base de datos).
Sintaxis básica de un subgrafo
flowchart TB
subgraph Frontend [Capa de Presentación]
UI[Interfaz de Usuario]
App[Aplicación Móvil]
end
subgraph Backend [Capa de Negocio]
API[Servidor API]
Auth[Servicio de Autenticación]
end
UI --> API
App --> API
API --> Auth
flowchart TB
subgraph Frontend [Capa de Presentación]
UI[Interfaz de Usuario]
App[Aplicación Móvil]
end
subgraph Backend [Capa de Negocio]
API[Servidor API]
Auth[Servicio de Autenticación]
end
UI --> API
App --> API
API --> Auth
Subgrafos anidados y dirección interna
Es posible anidar subgrafos dentro de otros y definir una dirección de flujo independiente (direction) para el interior de cada subgrafo:
flowchart LR
subgraph Sistema [Sistema Principal]
direction TB
subgraph ModuloA [Módulo de Entrada]
direction LR
A1[Captura] --> A2[Validación]
end
subgraph ModuloB [Módulo de Salida]
direction LR
B1[Procesamiento] --> B2[Generación Reporte]
end
ModuloA --> ModuloB
end
flowchart LR
subgraph Sistema [Sistema Principal]
direction TB
subgraph ModuloA [Módulo de Entrada]
direction LR
A1[Captura] --> A2[Validación]
end
subgraph ModuloB [Módulo de Salida]
direction LR
B1[Procesamiento] --> B2[Generación Reporte]
end
ModuloA --> ModuloB
end
Enlaces entre subgrafos
Puedes conectar nodos individuales directamente entre subgrafos o vincular la estructura del subgrafo completo asignándole un ID:
flowchart LR
subgraph Grupo1 [Origen]
N1[Nodo 1]
end
subgraph Grupo2 [Destino]
N2[Nodo 2]
end
Grupo1 --> Grupo2
flowchart LR
subgraph Grupo1 [Origen]
N1[Nodo 1]
end
subgraph Grupo2 [Destino]
N2[Nodo 2]
end
Grupo1 --> Grupo2
3. Personalización Estética: Estilos CSS y Clases
Mermaid permite modificar los colores, bordes y fuentes de tus diagramas directamente en el archivo .mmd utilizando directivas style y classDef.
Estilos individuales con style
Aplica propiedades CSS estándar a un nodo específico mediante la palabra clave style:
flowchart LR
A[Servicio Activo]
B[Servicio Inactivo]
style A fill:#2ecc71,stroke:#27ae60,stroke-width:2px,color:#fff
style B fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#fff
flowchart LR
A[Servicio Activo]
B[Servicio Inactivo]
style A fill:#2ecc71,stroke:#27ae60,stroke-width:2px,color:#fff
style B fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#fff
Reutilización de estilos con classDef
Para mantener el código limpio y no repetir estilos, define clases con classDef y asígnalas a los nodos:
flowchart TD
%% 1. Definición de clases reutilizables
classDef exito fill:#2ecc71,stroke:#1abc9c,color:#fff,font-weight:bold;
classDef alerta fill:#f39c12,stroke:#d35400,color:#fff;
classDef error fill:#e74c3c,stroke:#c0392b,color:#fff;
%% 2. Nodos del diagrama
N1[Operación Correcta]
N2[Advertencia de Espacio]
N3[Fallo de Conexión]
%% 3. Asignación de clases
class N1 exito;
class N2 alerta;
class N3 error;
flowchart TD
%% 1. Definición de clases reutilizables
classDef exito fill:#2ecc71,stroke:#1abc9c,color:#fff,font-weight:bold;
classDef alerta fill:#f39c12,stroke:#d35400,color:#fff;
classDef error fill:#e74c3c,stroke:#c0392b,color:#fff;
%% 2. Nodos del diagrama
N1[Operación Correcta]
N2[Advertencia de Espacio]
N3[Fallo de Conexión]
%% 3. Asignación de clases
class N1 exito;
class N2 alerta;
class N3 error;
Sintaxis alternativa en línea: Puedes asignar una clase directamente al definir el nodo añadiendo :::nombreClase:
flowchart LR
A[Ok]:::exito --> B[Warning]:::alerta
flowchart LR
A[Ok]:::exito --> B[Warning]:::alerta
4. Ejemplo Complejo: Arquitectura de Microservicios
A continuación, combinamos encadenamiento, subgrafos anidados, direcciones internas y clases CSS en un único diagrama avanzado:
flowchart TB
%% Definición de estilos
classDef cliente fill:#3498db,stroke:#2980b9,color:#fff;
classDef gateway fill:#9b59b6,stroke:#8e44ad,color:#fff;
classDef microservicio fill:#1abc9c,stroke:#16a085,color:#fff;
classDef db fill:#f1c40f,stroke:#f39c12,color:#333;
%% Nodos de entrada
Web[Cliente Web]:::cliente
Mobile[App Móvil]:::cliente
%% Api Gateway
Gateway[API Gateway / Router]:::gateway
Web & Mobile --> Gateway
%% Infraestructura Backend
subgraph Cloud [Infraestructura en la Nube]
direction TB
subgraph Servicios [Microservicios]
direction LR
Auth[Servicio Auth]:::microservicio
Users[Servicio Usuarios]:::microservicio
Orders[Servicio Pedidos]:::microservicio
end
subgraph Persistencia [Bases de Datos]
direction LR
DB_Auth[(Redis Cache)]:::db
DB_Users[(PostgreSQL Users)]:::db
DB_Orders[(MongoDB Orders)]:::db
end
end
%% Conexiones entre capas
Gateway --> Auth & Users & Orders
Auth --> DB_Auth
Users --> DB_Users
Orders --> DB_Orders
flowchart TB
%% Definición de estilos
classDef cliente fill:#3498db,stroke:#2980b9,color:#fff;
classDef gateway fill:#9b59b6,stroke:#8e44ad,color:#fff;
classDef microservicio fill:#1abc9c,stroke:#16a085,color:#fff;
classDef db fill:#f1c40f,stroke:#f39c12,color:#333;
%% Nodos de entrada
Web[Cliente Web]:::cliente
Mobile[App Móvil]:::cliente
%% Api Gateway
Gateway[API Gateway / Router]:::gateway
Web & Mobile --> Gateway
%% Infraestructura Backend
subgraph Cloud [Infraestructura en la Nube]
direction TB
subgraph Servicios [Microservicios]
direction LR
Auth[Servicio Auth]:::microservicio
Users[Servicio Usuarios]:::microservicio
Orders[Servicio Pedidos]:::microservicio
end
subgraph Persistencia [Bases de Datos]
direction LR
DB_Auth[(Redis Cache)]:::db
DB_Users[(PostgreSQL Users)]:::db
DB_Orders[(MongoDB Orders)]:::db
end
end
%% Conexiones entre capas
Gateway --> Auth & Users & Orders
Auth --> DB_Auth
Users --> DB_Users
Orders --> DB_Orders
Compilación desde Debian
Para exportar este flujo complejo a una imagen vectorial de alta calidad con fondo transparente en Debian:
mmdc -i arquitectura.mmd -o arquitectura.svg -b transparent
Resumen del Capítulo
- Encadenamiento: Simplifica la sintaxis utilizando
A & B --> Cpara conectar múltiples nodos simultáneamente. - Subgrafos: Organiza diagramas complejos en módulos lógicos con
subgraphe independiza sus direcciones condirection. - Estilos CSS: Utiliza
classDefpara definir esquemas de color limpios, mantenibles y reutilizables en tus nodos.