Design Templates
Design templates são a feature mais poderosa do Seed. Eles permitem que componentes encapsulem estrutura HTML complexa, expondo apenas slots nomeados para o usuário.
Como funciona
Cada componente pode ter um ou mais arquivos .design. O arquivo define a estrutura HTML usando a sintaxe .seed normal, mas com placeholders {slotName} no lugar do conteúdo dinâmico.
Exemplo: hero.design
```seed
@div class=flex flex-col lg:flex-row-reverse items-center gap-12 w-full max-w-6xl mx-auto px-6
@div class=flex-1
{image}
@div class=flex-1
@h1 class=text-5xl font-bold leading-tight
{title}
@p class=py-6 text-lg opacity-80
{description}
@div class=flex gap-4
{cta}
```
O usuário escreve:
```seed
@hero
@title
Meu Título
@description
Meu texto.
@cta
@button variant=primary
Ação
```
E o Seed injeta cada slot no lugar correto. Se @image não for passado, o @div que envolve {image} é omitido do HTML.
Regra de omissão de slots
Quando um slot não é preenchido, o elemento container desse slot é omitido — não é deixado vazio. Isso evita <div></div> fantasmas no HTML.
Exceção: elementos puramente estruturais (sem slots) sempre são renderizados mesmo sem conteúdo textual.
Variantes de design
Um componente pode ter múltiplos designs. O design é selecionado pela prop design=. O padrão é default:
```seed
@hero design=center
@title
Centrado
```
Estrutura de arquivos
Componentes de uma biblioteca ficam em libs/components/<lib>/:
```
libs/components/seed-ui/
├── hero/
│ ├── hero.yaml # config do componente (tag, class, variants)
│ ├── hero.design # design padrão
│ └── center.design # design variante "center"
├── accordion/
│ ├── accordion.yaml
│ ├── accordion.design
│ └── item.design
└── nav/
├── nav.yaml
├── nav.design
├── item.yaml
└── item.design
```
Criando seu próprio componente
Componentes do projeto ficam em src/components/. O Seed carrega automaticamente qualquer YAML e .design dessa pasta.
1. Crie a pasta e o YAML:
```yaml # src/components/meu-card/meu-card.yaml meu-card: tag: div class: bg-white rounded-xl shadow-md overflow-hidden ```
2. Crie o arquivo .design:
```seed
# src/components/meu-card/meu-card.design
@div class=p-6
@h3 class=text-lg font-semibold mb-2
{title}
@p class=text-gray-600 text-sm
{description}
@div class=mt-4
{cta}
```
3. Use no .seed:
```seed
@meu-card
@title
Meu Título
@description
Descrição do card.
@cta
@button variant=primary
Ver mais
```
O slot especial {children} captura todos os filhos que não correspondem a um slot nomeado. Use para componentes que aceitam conteúdo arbitrário.