---
title: "Modelo de conteúdo e mídia"
description: "Como um site separa textos do layout, o que o editor, a API e os agentes validam e como a mídia funciona."
canonical: "https://atelier201.com/docs/pt/platform/content-model"
updated: "2026-11-06"
---

# Modelo de conteúdo e mídia

Todo site é um projeto Astro que mantém o que o proprietário altera em arquivos
de conteúdo tipados e o layout no código. Uma página lê o conteúdo e organiza
seu layout. Ela nunca contém o nome da empresa, um preço ou o horário de
funcionamento.

O **modelo de conteúdo** é a lista desses tipos de conteúdo e seus campos. Ele
é definido uma única vez em `src/content.config.ts` do projeto (um esquema Zod
por tipo). A cada build, ele é exportado como JSON Schemas, e o editor, a API
REST, o MCP e a CLI validam todas as alterações com base nele. Um valor que não
se encaixa é rejeitado, com o nome do campo, e nada é salvo.

O modelo vem do build mais recente. Faça um novo build do site antes de
consultar o modelo de conteúdo.

## Coleções e itens únicos

Uma **coleção** contém várias entradas, uma por arquivo. O nome do arquivo é o
slug da entrada: letras minúsculas, números e hífens. Um **item único** é um
documento JSON em um caminho fixo.

O starter do Atelier201 inclui estes itens:

| Nome           | Tipo              | Conteúdo                                                                                                                                                                   |
| -------------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `business`     | item único        | Nome, slogan, descrição, telefone, e-mail, endereço, horário de funcionamento, redes sociais, dados legais, links para reservas e mapas e idioma do site                   |
| `theme`        | item único        | Quatro cores da marca, raio dos cantos, combinação de fontes e modo claro, escuro ou automático                                                                            |
| `navigation`   | item único        | Links do cabeçalho, links do rodapé e botão de chamada para ação                                                                                                           |
| `integrations` | item único        | ID do Google Analytics, domínio do Plausible e código adicionado ao cabeçalho ou ao fim do corpo                                                                           |
| `services`     | coleção, JSON     | Serviços com nome, descrição, preço, ordem e imagem                                                                                                                        |
| `blog`         | coleção, Markdown | Publicações com título, descrição, data, autor, imagem de capa, tags, os serviços sobre os quais tratam (uma relação com `services`, pelo slug) e um indicador de rascunho |

O starter é um esqueleto: inclui essas duas coleções como exemplos e não
pressupõe nada sobre a empresa. O site pode excluir as coleções de que não
precisa e adicionar as suas próprias (uma equipe, um menu, eventos).

Uma coleção de **conteúdo** usa Markdown: campos no front matter e um corpo. Uma
coleção de **dados** usa JSON, sem corpo.

Uma nova entrada criada pela API ou pelo MCP começa como rascunho se a coleção
tiver um campo de rascunho, para que alguém decida se ela deve ser exibida.

## Altere o conteúdo sem comprometer o layout

Prefira as chamadas de conteúdo às alterações diretas nos arquivos para textos,
entradas e informações da empresa:

| Tarefa             | REST                                                           | MCP                 | CLI                        |
| ------------------ | -------------------------------------------------------------- | ------------------- | -------------------------- |
| Consultar o modelo | [Ler o modelo de conteúdo](/docs/api/content/model)            | `get_content_model` | `atelier201 content model` |
| Salvar uma entrada | [Criar ou atualizar uma entrada](/docs/api/content/save-entry) | `save_entry`        | `atelier201 content save`  |
| Alterar um texto   | [Alterar um campo](/docs/api/content/set-field)                | `set_field`         | `atelier201 content set`   |

Use as chamadas de arquivo somente para alterar código: um layout, um
componente ou o próprio modelo de conteúdo. Para adicionar um campo, inclua-o
em `src/content.config.ts` com `.default()` ou `.optional()` para manter válidas
as entradas existentes.

## Edição em linha: `data-atelier201-field`

O proprietário clica em um texto curto na página e o edita ali mesmo. Isso é
possível porque o texto contém o endereço do campo de onde vem:

```html
<h1 data-atelier201-field="business:/name">Morning Crumb Bakery</h1>
<time data-atelier201-field="business:/hours/2/close">15:00</time>
```

O endereço segue o formato `<singleton>:<JSON pointer>`: `business`, `theme` ou
`navigation`, dois-pontos e, em seguida, um ponteiro [RFC 6901](https://www.rfc-editor.org/rfc/rfc6901)
para o arquivo daquele item único. O mesmo endereço funciona com `set_field` e
`atelier201 content set`.

Siga estas regras ao editar um componente:

- Coloque o atributo em um elemento cujo texto completo corresponda exatamente
  ao campo, sem nenhum outro conteúdo dentro dele. O Atelier201 substitui o
  texto do elemento. Em "Ligue para nós: 555 0100", envolva apenas o número em
  um `span`.
- Mova o atributo junto com o elemento ao mudar seu estilo e adicione-o onde
  quer que um campo de item único apareça em um novo lugar.
- Não o use em textos montados com vários campos, textos transformados (uma
  data formatada), corpos em Markdown ou entradas de coleção. Na página, uma
  entrada deve manter `data-atelier201-entry="<collection>/<slug>"` em seu
  contêiner.

## O site continua estático

Um site feito para o Atelier201 é um site estático em Astro: sem adaptador de
servidor, renderização no servidor, framework no cliente nem solicitações a
outras origens durante a execução (incluindo fontes, tags de analytics e mapas
incorporados). Ele usa um único idioma, definido em `business.locale`. Suas
dependências são `astro` e `@astrojs/mdx` (desativada até que `mdx()` seja
adicionada à configuração), pois o build é executado sem acesso à rede. O
`AGENTS.md` do starter lista essas regras para um agente que edita o código.

## Mídia

Envie uma imagem, um PDF ou um vídeo curto para o site e, em seguida, faça
referência a ele como `/media/<filename>` no conteúdo, por exemplo, no campo
`coverImage` de uma publicação do blog.

- Cada arquivo pode ter até 20 MB. Pelo MCP, os arquivos enviados são codificados
  em base64 e limitados a 5 MB.
- Adicione um texto `alt` às imagens para quem não consegue vê-las.
- A mídia é contabilizada no armazenamento do plano: 100 MB em um rascunho e
  5 GB em um Site.
- Um arquivo enviado é incluído a partir do próximo build. Excluir um arquivo
  o remove dos builds seguintes, mas os builds já publicados mantêm sua cópia
  até serem substituídos por uma publicação mais recente.
