🌱 Seed

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.
```
CampoTipoObrigatórioDefault
titlestringNãoNome do arquivo (ex: meu-postMeu Post)
publish_datedata ou datetimeNão — obrigatório se a coleção ordenar/agrupar por dataSem default — post sem publish_date fica disponível imediatamente
draftbooleanNãofalse — quando true, o post é excluído do build (mas aparece no dev)
(qualquer campo)qualquerNãoTodos 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:

  1. src/blog/item.layoutprojeto vence
  2. themes/<tema>/blog/item.layout — fallback do tema
  3. src/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:

  1. src/blog/list.layoutprojeto vence
  2. themes/<tema>/blog/list.layout — fallback do tema
  3. 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: blogsblog, teamteam. Como a coleção se chama blog (sem s), o prefixo é o próprio blog.

VariávelDescriçã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:

No modo dev, posts com draft: true são incluídos na listagem para facilitar a previsualização.

Feito com ❤️ e Seed