Blog
O Seed suporta um modo blog integrado: basta criar um diretório blog/ dentro de src/ e cada arquivo .seed ali dentro é tratado como um post.
Estrutura de diretórios
``` src/ ├── default.layout ├── index.seed ├── blog/ │ ├── list.layout ← layout da listagem (opcional) │ ├── item.layout ← layout dos posts (opcional) │ ├── meu-primeiro-post.seed │ ├── como-usar-seed.seed │ └── 2026/ │ └── novidades.seed ← subdiretórios viram parte da URL └── ... ```
A estrutura de pastas dentro de blog/ vira a estrutura de URLs. Exemplo: src/blog/2026/novidades.seed gera /blog/2026/novidades.html.
Front matter dos posts
Cada post usa front matter YAML para definir seus metadados:
```seed --- title: Meu Primeiro Post publish_date: 2026-03-01 author_name: Ana Silva description: Uma introdução ao Seed e seu modo blog. tags: [seed, tutorial, blog] image: /static/img/post-cover.jpg draft: false --- @h2 Conteúdo do post aqui @p Texto, componentes e markdown — tudo funciona normalmente. ```
| Campo | Tipo | Obrigatório | Default |
|---|---|---|---|
title | string | Não | Nome do arquivo (ex: meu-post → Meu Post) |
publish_date | data ou datetime | Não — obrigatório se a coleção ordenar/agrupar por data | Sem default — post sem publish_date fica disponível imediatamente |
draft | boolean | Não | false — quando true, o post é excluído do build (mas aparece no dev) |
| (qualquer campo) | qualquer | Não | Todos os campos do front matter ficam disponíveis via {blog-campo} |
Campos como author_name, description, tags e image funcionam normalmente — basta declará-los no front matter de cada post. Não há defaults automáticos para eles além de title — exceto quando a coleção define author: no seed.yaml (veja Coleções e @each).
Layouts
item.layout
Layout aplicado a cada post individualmente. Pode referenciar campos do front matter usando placeholders {campo}:
```seed
---
title: Blog
---
@article class=max-w-3xl mx-auto py-20 px-6
@h1
{title}
@div class=text-sm text-gray-500
{publish_date} · {author_name}
@div class=prose
{content}
```Resolução: o Seed procura item.layout nesta ordem:
src/blog/item.layout— projeto vencethemes/<tema>/blog/item.layout— fallback do temasrc/default.layout— fallback global
list.layout
Layout da página de listagem gerada automaticamente em /blog/index.html. Usa o componente @each para iterar sobre os posts:
```seed
---
title: Blog
---
@section class=max-w-5xl mx-auto py-20
@h1
Blog
@div class=grid gap-8 md:grid-cols-2
@each blog
@a href={blog-url}
@h2
{blog-title}
@p
{blog-description}
@span
{blog-publish_date} · {blog-author_name}
```Resolução: o Seed procura list.layout nesta ordem:
src/blog/list.layout— projeto vencethemes/<tema>/blog/list.layout— fallback do tema- Listagem mínima embutida (fallback)
O componente @each
O @each itera sobre uma coleção registrada. Para o blog, a coleção blog é registrada automaticamente.
```seed
@each blog
@div
@a href={blog-url}
{blog-title}
@p
{blog-description}
```Variáveis disponíveis
O prefixo é derivado do nome da coleção: blogs → blog, team → team. Como a coleção se chama blog (sem s), o prefixo é o próprio blog.
| Variável | Descrição |
|---|---|
{blog-title} | Título do post |
{blog-publish_date} | Data de publicação do post |
{blog-author_name} | Autor do post — do front matter ou do author: padrão da coleção |
{blog-description} | Descrição do post |
{blog-url} | URL do post (ex: /blog/meu-post.html) |
{blog-tags} | Tags do post, separadas por vírgula |
{blog-image} | Imagem do post |
Campos internos (prefixados com _, como _file) não são expostos nos templates.
O @each usa o sistema de Coleções do Seed. Para o blog, a coleção blog é registrada automaticamente com o nome do diretório. Coleções são um conceito genérico — você pode criar coleções para equipes, portfólios, produtos e muito mais. Veja a documentação completa em Coleções e @each.
Configuração no seed.yaml
O blog funciona sem configuração — basta existir o diretório src/blog/. Para personalizar, adicione a chave blog no seed.yaml:
```yaml
blog:
dir: blog # diretório dos posts (padrão: blog)
sort: publish_date # campo de ordenação por data editorial
order: desc # asc ou desc (padrão: desc)
drafts: false # incluir drafts no build (padrão: false)
per_page: 10 # itens por página — 0 = sem paginação (padrão: 0)
list_layout: list # nome do layout de listagem (padrão: list)
item_layout: item # nome do layout por post (padrão: item)
tags: false # true → gera /blog/tags/<slug>/ com @each tags
dates: off # off | day | month → arquivos /blog/<data>/
author: # autor padrão de todo post (JSON-LD + {author_name})
name: Ana Silva
```Como sort: publish_date está ativo, todo post precisa ter publish_date no front matter — sem ele, o build falha apontando o arquivo. Para detalhes sobre paginação, arquivos de tag/data e autoria, veja Coleções e @each e SEO & Metadados.
Dev server
O dev server detecta mudanças nos posts automaticamente:
- Post editado — rebuilda o post individual + listagem
- Layout do blog editado — rebuilda tudo
- Novo post adicionado — rebuilda listagem
No modo dev, posts com draft: true são incluídos na listagem para facilitar a previsualização.
Feito com ❤️ e Seed