---
title: Composições
slug: studio/composicoes
docTags: 
createdAt: 2026-04-28T18:37:55.353Z
---

# <font color="#DA8D35">Composições </font>

Composições são componentes de UI que podem ser aninhados em telas, permitindo construir bibliotecas de componentes e manter a consistência entre suas aplicações.

***

## <font color="#DA8D35">1 - O que é uma Composição? </font>

Uma composição é basicamente um fragmento de tela reutilizável. Ele contém:

- Uma coleção de elementos (botões, comandos, contêineres, etc.)&#x20;
- Estilos responsivos para diferentes pontos de interrupção (celular, tablet, desktop)&#x20;
- Propriedades que podem ser sobrescrevidas por instância&#x20;
- Suporte para aninhamento de outras composições (até 5 níveis de profundidade)&#x20;

:::hint{type="info"}
📌 As composições são expandidas no lado do servidor durante a prévia, garantindo um comportamento consistente entre o estúdio web e os aplicativos móveis.
:::

***

## <font color="#DA8D35">2 - Criando uma Composição </font>

1. Clique no botão "+" no painel Composições na barra lateral esquerda&#x20;
2. Nomeie sua composição (por exemplo, "UserCard", "ProductItem")&#x20;
3. Adicione elementos por meio de arrastar e soltar a partir da paleta&#x20;
4. Configure propriedades e estilos para cada elemento&#x20;
5. O save ocorre automaticamente após 2 segundos de inatividade&#x20;

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/_8lqmUOqa3bDqix4U9eYg-20260602-200509.gif)

```javascript
// Example composition structure
{
  uuid: "comp-123",
  name: "UserCard",
  category: "ui",
  elements: [
    {
      type: "Flex",
      properties: { direction: "column" },
      children: [
        { type: "Text", properties: { text: "Username" } },
        { type: "Button", properties: { label: "View Profile" } }
      ]
    }
  ],
  styles: {
    default: { padding: "16px" },
    sm: { padding: "12px" },
    md: { padding: "16px" },
    lg: { padding: "20px" }
  }
}
```

***

## <font color="#DA8D35">3 - Uso de Composições em Telas </font>

Uma vez criadas, as composições aparecem na paleta Componentes, na seção "Composições".

1. Navegue até uma tela no seu projeto&#x20;
2. Encontre sua composição na paleta&#x20;
3. Arraste para a tela&#x20;
4. A composição é inserida como um elemento `CompositionInstance `

```javascript
// CompositionInstance structure
{
  type: "CompositionInstance",
  uuid: "instance-456",
  properties: {
    compositionId: "comp-123",
    overrides: {
      // Per-instance style overrides
      "element-789": {
        styles: {
          default: { backgroundColor: "blue" }
        }
      }
    }
  }
}
```

***

## <font color="#DA8D35">4 - Modo de Edição </font>

O sistema opera em dois modos de edição:

| **Modo**               | **Descrição**                                                                 |
| ---------------------- | ----------------------------------------------------------------------------- |
| **Modo Tela**          | Modo padrão. Edite o layout da tela e adicione composições às telas.          |
| **Modo de composição** | Editar o conteúdo da composição. Ativado clicando em uma composição na lista. |

:::hint{type="info"}
❗ Ao editar uma composição, as alterações se aplicam a **todas as instâncias** dessa composição em todas as telas.
:::

***

## <font color="#DA8D35">5 - Composições Aninhadas </font>

Composições podem ser aninhadas dentro de outras composições com até 5 níveis de profundidade.

```javascript
// Example: UserCard composition contains Avatar composition
UserCard (Level 1)
└── Flex
    ├── Avatar (Level 2) <- Another composition
    │   └── Image
    └── Text
```

<font color="#DA8D35">**Regras de Nidificação\:**</font>

- Profundidade máxima de nidificação: 5 níveis&#x20;
- Referências circulares são impedidas (Composição A não pode conter Composição B se B já contém A)&#x20;
- Avisos visuais aparecem na paleta para composições com profundidade >= 4&#x20;

***

## <font color="#DA8D35">6 - Substituições de Estilo </font>

Cada instância de composição pode ter estilos personalizados por elemento.

:::hint{type="warning"}
⚠️ As sobrescrituras de estilo são aplicadas por instância e não afetam outras instâncias da mesma composição.
:::

Exemplo de estrutura de substituição:

```javascript
{
  type: "CompositionInstance",
  properties: {
    compositionId: "user-card",
    overrides: {
      "button-123": {
        styles: {
          default: { backgroundColor: "#007bff" },
          sm: { fontSize: "14px" }
        }
      }
    }
  }
}
```

***

## <font color="#DA8D35">7 - Expansão no Lado do Servidor </font>

:::hint{type="warning"}
🔥 **Breaking Change (dezembro de 2025):** Visualização móvel não recebe mais telas via . Agora ele busca dados diretamente do servidor `.postMessage`

**Impacto:**

- A primeira carga adiciona \~200ms de latência (depois armazenada no cache)&#x20;
- Requer conexão ativa com servidor&#x20;
- Permite composições em visualização móvel&#x20;
- Melhor consistência de dados&#x20;
:::

O servidor expande automaticamente as composições durante a prévia:

1. Solicitações de aplicativos móveis /projects/\:id/preview&#x20;
2. Servidor carrega todas as telas e composições&#x20;
3. Para cada tela, expande recursivamente os elementosCompositionInstance&#x20;
4. Retorna dados expandidos com UUIDs únicos por instância&#x20;

```javascript
// Before expansion
{
  type: "CompositionInstance",
  properties: { compositionId: "comp-123" }
}

// After expansion (server-side)
{
  type: "Flex",
  uuid: "instance-456-element-789", // Prefixed with instance UUID
  properties: { direction: "column" },
  children: [...]
}
```

***

## <font color="#DA8D35">8 - Validação e Segurança </font>

O sistema inclui várias salvaguardas:

**Detecção de Referência Circular**

```javascript
// This is prevented:
Composition A contains Composition B
Composition B contains Composition A
// ❌ Error: "Circular reference detected"
```

<font color="#DA8D35">**Validação da Profundidade de Aninhamento**</font>

- Profundidade máxima: 5 níveis&#x20;
- Aviso em profundidade >= 4&#x20;
- Blocos adicionando composições que excedem o limite&#x20;

<font color="#DA8D35">**Detecção de Composição Órfã**</font>

- Detecta composições deletadas ainda referenciadas nas telas&#x20;
- Mostra faixa de aviso com contagem&#x20;
- Atualiza automaticamente a cada 30 segundos&#x20;

***

## <font color="#DA8D35">9 - Encadernações e Eventos </font>

As ligações (eventos e propriedades) funcionam corretamente com instâncias de composição:

1. O servidor duplica vinculações para cada elemento expandido&#x20;
2. Gera IDs de vinculação únicos: `{instanceUuid}-{originalBindingId} `
3. UUIDs de elementos são rastreados no mapeamento: `{instanceUuid}-{elementUuid} `

```javascript
// Original binding in composition
{
  id: "binding-1",
  elementId: "button-123",
  eventType: "click",
  functionId: "func-456"
}

// Expanded binding in instance
{
  id: "instance-789-binding-1",
  elementId: "instance-789-button-123",
  eventType: "click",
  functionId: "func-456"
}
```

***

## <font color="#DA8D35">10 - Melhores Práticas </font>

| <font color="#DA8D35">**Prática**</font> | <font color="#DA8D35">**Descrição**</font>                             |
| ---------------------------------------- | ---------------------------------------------------------------------- |
| **Modular Design**                       | Mantenha as composições pequenas e focadas em responsabilidades únicas |
| **Convenção de nomeação**                | Use nomes descritivos: , ,`serCardProductListNavigationMenu`           |
| **Evite nidificações profundas**         | Fique dentro de 2-3 níveis para melhor desempenho                      |
| **Instâncias de Teste**                  | Verifique todos os casos após editar uma redação                       |
| **Usar categorias**                      | Organize composições por categoria (ui, layout, formas)                |

***

## <font color="#DA8D35">problemas </font>

<font color="#DA8D35">**Composição Não Aparece na Visualização do Celular**</font>

1. Verifique se a composição existe no banco de dados&#x20;
2. Verifique está correto `CompositionInstance` `compositionId `
3. Certifique-se de que o celular esteja buscando do servidor (não usando dados em cache)&#x20;
4. Verifique os logs do servidor para erros de expansão&#x20;

<font color="#DA8D35">**Avisos de Chave Duplicada**</font>

- Não deve ocorrer após as atualizações de dezembro de 2025&#x20;
- Atualmente, UUIDs são precedidos por UUID de instância&#x20;

<font color="#DA8D35">**Fixações Não Funcionando**</font>

- Verifique se a duplicação de binding do lado do servidor está funcionando&#x20;
- Verifique se os UUIDs dos elementos correspondem na tabela de ligações&#x20;
- Confirme que o ID da função é válido&#x20;

***

## <font color="#DA8D35">12 - Endpoints de API </font>

| <font color="#DA8D35">**Método**</font> | <font color="#DA8D35">**Endpoint**</font> | <font color="#DA8D35">**Descrição**</font>      |
| --------------------------------------- | ----------------------------------------- | ----------------------------------------------- |
| OBTER                                   | `/projects/:id/compositions`              | Liste todas as composições de um projeto        |
| OBTER                                   | `/projects/:id/compositions/:uuid`        | Obtenha uma composição individual               |
| POSTAR                                  | `/projects/:id/compositions`              | Crie nova composição                            |
| PATCH                                   | `/projects/:id/compositions/:uuid`        | Composição atualizada                           |
| DELETE                                  | `/projects/:id/compositions/:uuid`        | Excluir composição                              |
| OBTER                                   | `/projects/:id/preview`                   | Obtenha dados expandidos do projeto para prévia |

***

## <font color="#DA8D35">13 - Esquema de Banco de Dados </font>

```javascript
CREATE TABLE lowcode_studio.compositions (
  uuid UUID PRIMARY KEY,
  project_id TEXT NOT NULL,
  name VARCHAR(255) NOT NULL,
  category VARCHAR(100),
  description TEXT,
  icon VARCHAR(50),
  elements JSONB NOT NULL DEFAULT '[]',
  properties JSONB,
  styles JSONB,
  order INTEGER DEFAULT 0,
  created_at BIGINT DEFAULT extract(epoch from now()) * 1000,
  updated_at BIGINT,
  deleted_at BIGINT
);

CREATE INDEX idx_compositions_project
  ON lowcode_studio.compositions(project_id);
```

***

## <font color="#DA8D35">14 - Arquitetura Técnica </font>

<font color="#DA8D35">**Lado do Cliente (Web Studio)**</font>

- React Query para busca de composição&#x20;
- Sinais de Preact para estado reativo&#x20;
- Edição de modo duplo (tela vs composição)&#x20;
- Salvamento automático com dequique de 2 segundos&#x20;

<font color="#DA8D35">**Lado do Servidor (API)**</font>

- Estrutura Deno + Hono&#x20;
- Drizzle ORM com PostgreSQL&#x20;
- Expansão de composição recursiva&#x20;
- Mapeamento UUID para duplicação de ligações&#x20;

<font color="#DA8D35">**Prévia Móvel**</font>

- Buscas a partir do endpoint `/projects/:id/preview`&#x20;
- Recebe dados de composição totalmente expandidos&#x20;
- Renderizações usando lowcode-engine-tauri&#x20;

***

## <font color="#DA8D35">15 - Migração a partir de versões anteriores </font>

Projetos criados antes das composições são totalmente compatíveis:

- JSONs de projetos antigos importam sem problemas&#x20;
- O sistema lida com elegância com dados de composição ausentes&#x20;
- Sem mudanças significativas para projetos existentes&#x20;
- Somente novos projetos podem criar composições&#x20;

***

## <font color="#DA8D35">16 - Considerações de Desempenho </font>

<font color="#DA8D35">**Web Studio**</font>

- Composições carregam sob demanda&#x20;
- Tempo de 5 minutos para armazenamento de composição&#x20;
- Invalidação automática do cache em atualizações&#x20;

<font color="#DA8D35">**Prévia Móvel**</font>

- Carga inicial: \~200ms de sobrecarga para expansão&#x20;
- Carregamentos subsequentes: armazenados em cache pelo React Query&#x20;
- A expansão acontece uma vez por sessão de pré-visualização&#x20;

<font color="#DA8D35">**Recomendações**</font>

- Mantenha as composições abaixo de 50 elementos&#x20;
- Limite o aninhamento a 3 níveis para desempenho ideal&#x20;
- Use categorias de composição para uma melhor organização&#x20;
- Limpeza regular de composições não utilizadas&#x20;

***

## <font color="#DA8D35">17 - Segurança </font>

- Suporte a múltiplas inquilinações via isolamento de esquema de banco de dados&#x20;
- Autenticação baseada em token para endpoints de API&#x20;
- Validação do lado do servidor de todos os dados de composição&#x20;
- Proteção contra ataques circulares de referência&#x20;
- Prevenção de injeção SQL via Drizzle ORM&#x20;

***

## <font color="#DA8D35">18 - Melhorias Futuras </font>

<font color="#DA8D35">**Melhorias planejadas\:**</font>

- Variantes de composição (temas claro/escuro)&#x20;
- Biblioteca de modelos de composição&#x20;
- Composições de importação/exportação entre projetos&#x20;
- Histórico de versões das composições&#x20;
- Análise de composição (acompanhamento de uso)&#x20;
- Ferramenta de diferença de composição visual&#x20;
- Mercado de composições&#x20;

***

## <font color="#DA8D35">19 - Suporte e Recursos </font>

<font color="#DA8D35">**Para ajuda adicional\:**</font>

- Verifique os logs do servidor para erros de expansão&#x20;
- Use o DevTools do navegador para inspecionar os dados de composição&#x20;
- Verifique o esquema do banco de dados com `deno task db:check `
- Consulte o guia de implementação em `docs/en-us/platform/compositions.md `

:::hint{type="warning"}
💡 Ative o registro de depuração definindo variáveis de ambiente para ver logs detalhados de expansão de composição. `DEBUG=true`
:::

![](https://api.archbee.com/api/optimize/pu5VMc-2TW3GQX4ly5Xp7/-4_SDcjt_aznvASbRyZ46-20260601-191750.gif)

