🌱 Seed

Lógica: @if, @each e variáveis

O Seed oferece três mecanismos programáticos que funcionam em tempo de build: substituição de variáveis {chave}, condicionais @if/@else-if/@else, e iteração @each. Nenhum deles gera JavaScript — tudo é resolvido antes de o HTML ser escrito.

Variáveis de template: {chave}

Qualquer valor definido no front matter pode ser inserido em qualquer ponto do arquivo .seed usando {chave}:

```seed
---
title: Sobre nós
author: Ana Silva
cidade: São Paulo
---

@h1
  {title}

@p
  Por {author}, em {cidade}.
```

A substituição funciona dentro de texto e dentro de valores de props:

```seed
---
hero-image: /static/img/hero.jpg
cta-url: /contato
---

@img src={hero-image}, alt=Imagem principal

@button href={cta-url}, variant=primary
  Fale conosco
```

Comportamento quando a chave não existe

Se {chave} não for encontrada no front matter, o texto permanece literal no HTML — sem erro, sem output vazio:

```seed
---
title: Minha Página
---

@p
  Autor: {author}
```

Resultado: <p>Autor: {author}</p> — o placeholder aparece intacto, o que facilita depuração.

Campos de lista

Quando o campo é uma lista YAML, ele é concatenado com vírgulas:

```seed
---
tags: [seed, tutorial, html]
---

@p
  Tags: {tags}
```

Resultado: <p>Tags: seed, tutorial, html</p>

💡

As variáveis {chave} também funcionam dentro de layouts. Os campos do front matter da página ficam disponíveis no layout após o merge — então {title} num default.layout reflete o título de cada página.

Condicionais: @if, @else-if, @else

Condicionais permitem mostrar ou ocultar blocos dependendo de um valor do front matter. Elas são resolvidas em tempo de build — o HTML gerado contém apenas o bloco que passou.

Sintaxe

```seed
@if {campo}
  // renderizado se {campo} não for vazio, zero ou "false"
@else-if {outro-campo}
  // renderizado se {campo} falhou e {outro-campo} for verdadeiro
@else
  // renderizado se nenhum bloco anterior passou
```

Como a condição é avaliada

O Seed avalia o valor da variável após substituição:

CondiçãoAvaliação
{campo}"/blog/page/2/"✅ Verdadeiro (string não-vazia)
{campo}"" (vazio)❌ Falso
{campo}"false"❌ Falso (string literal "false")
{campo} não existe no front matter❌ Falso (placeholder permanece literal)

Exemplo: botão opcional

Uma seção CTA que só aparece se cta-url estiver definido no front matter:

```seed
---
title: Sobre nós
cta-url: /contato
cta-label: Fale conosco
---

@section
  @h1
    {title}

  @if {cta-url}
    @button href={cta-url}, variant=primary
      {cta-label}
```

Exemplo: navegação de paginação

O padrão mais comum — mostrar links de anterior/próximo apenas quando existem:

```seed
@nav class=flex justify-between mt-8
  @if {prev_url}
    @a href={prev_url}
      ← Anterior
  @else
    @span

  @span class=text-gray-500
    Página {page} de {total_pages}

  @if {next_url}
    @a href={next_url}
      Próximo →
  @else
    @span
```

Exemplo: três estados

```seed
---
status: active
---

@if {status}
  @if {status}
    @badge variant=success
      Ativo
@else-if {status}
  @badge variant=warning
    Pendente
@else
  @badge variant=neutral
    Inativo
```
⚠️

@if, @else-if e @else só funcionam com variáveis de front matter e variáveis de paginação — não com resultados de expressões ou comparações arbitrárias. O Seed não é uma linguagem de programação completa: a condição é sempre "este campo tem um valor verdadeiro?".

Iteração: @each

@each repete um bloco de template para cada item de uma coleção registrada. É o mecanismo que liga o sistema de coleções ao template.

Sintaxe

```seed
@each nome-da-colecao
  // bloco repetido para cada item
  // {prefixo-campo} acessa os campos do item
```

Prefixo de variáveis

Dentro de @each, cada campo do item é acessado via {prefixo-campo}. O prefixo é derivado do nome da coleção — retirando o s final se houver:

ColeçãoPrefixoExemplos
postspost{post-title}, {post-url}, {post-date}
projectsproject{project-name}, {project-description}
teamteam{team-name}, {team-role}, {team-photo}
blogblog{blog-title}, {blog-url}, {blog-date}

Exemplo completo

```seed
@div class=grid gap-6 md:grid-cols-3
  @each team
    @div class=text-center p-6 rounded-xl border
      @img src={team-photo}, class=w-20 h-20 rounded-full mx-auto mb-4
      @h3 class=font-semibold text-gray-900
        {team-name}
      @p class=text-sm text-gray-500
        {team-role}
      @a href={team-linkedin}, class=text-teal-600 text-sm
        LinkedIn
```

Campos internos não são expostos

Campos cujo nome começa com _ (como _file) são internos ao Seed e não ficam disponíveis como {prefixo-campo} no template.

Coleção vazia ou não registrada

Se a coleção tiver zero itens, @each não gera nenhum HTML — sem erro, sem output. Se a coleção não foi registrada (nome errado ou não declarada no seed.yaml), o Seed exibe um bloco de erro inline visível na página para facilitar depuração.

📚

@each depende do sistema de Coleções — o seed.yaml precisa declarar a coleção (ou o diretório src/blog/ precisa existir para o blog automático). Veja Coleções para a configuração completa.

Variáveis de página: @@nome

Além das variáveis de front matter, o Seed tem um segundo tipo de variável: blocos de componentes definidos e reutilizados dentro da mesma página com @@nome. Elas são úteis para evitar repetir um bloco em vários lugares de uma mesma página.

```seed
@@exemplo-card
  @card variant=elevated
    @title
      Título
    @body
      Conteúdo do card.

// Usa o bloco duas vezes
@section
  @@exemplo-card

@aside
  @@exemplo-card
```

Para a documentação completa de @@variáveis, incluindo o uso especial dentro de @pre, veja Variáveis de Página.

Resumo comparativo

RecursoSintaxeQuando usar
Variável de front matter{chave}Inserir valores de metadados da página em qualquer ponto
Condicional@if {chave} / @else-if / @elseMostrar/ocultar blocos baseado em valores do front matter
Iteração@each colecaoRepetir um bloco para cada item de uma coleção
Variável de página@@nomeReutilizar um bloco de componentes dentro da mesma página

Feito com ❤️ e Seed