Props & Modifiers
Props são os parâmetros que você passa para componentes. Modifiers são grupos nomeados de classes CSS que alteram aspectos independentes de um componente — como aparência, tamanho ou comportamento.
Props reservadas
| Prop | Tipo | Descrição |
|---|---|---|
tag | string | Substitui a tag HTML do componente (ex: tag=section) |
class | string | Classes CSS extras adicionadas após as classes base e modifiers |
template | string | Seleciona o template alternativo para o componente (ex: template=centered) |
href | string | URL — envolve o componente em <a href="..."> se não for tag a |
target | string | Atributo target para o link (_blank, _self, etc.) |
rel | string | Atributo rel do link. Padrão: noopener noreferrer com target=_blank |
as | string | Renderiza como tag HTML pura, ignorando o registro de componentes |
list | flag | Em slots de template, divide o conteúdo por --- e repete o wrapper para cada item |
A prop as
A prop as é uma válvula de escape: força o Seed a renderizar o componente como uma tag HTML pura, ignorando completamente o registro de componentes (YAML, template, classes). Útil quando o nome do componente conflita com uma tag HTML que você quer usar diretamente.
```seed
@nav as=nav
@ul
@li
Item 1
@li
Item 2
```Sem as=nav, o Seed procuraria um componente nav no registro. Com as=nav, ele renderiza diretamente como <nav>:
```html
<nav>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</nav>
```Você pode usar qualquer tag HTML válida como valor — as=section, as=article, as=aside, etc. Props como class e href continuam funcionando normalmente.
Modifiers
Qualquer chave do YAML que não seja tag, class ou template é um modifier group — um conjunto nomeado de opções que mapeiam para classes CSS. Ao usar o componente, você passa o nome do grupo como prop e o valor seleciona as classes.
Exemplo de definição YAML:
```yaml
avatar:
tag: img
class: w-12 h-12 rounded-full
variant:
rounded: rounded-full
square: rounded-none
size:
small: w-8 h-8
medium: w-12 h-12
large: w-16 h-16
```Uso no .seed:
```seed @avatar src=https://exemplo.com/foto.jpg, size=small @avatar src=https://exemplo.com/foto.jpg, variant=square, size=large ```
Os modifiers variant e size não viram atributos HTML — apenas modificam as classes CSS aplicadas. HTML gerado:
```html <img class="rounded-full w-8 h-8" src="https://exemplo.com/foto.jpg" /> <img class="rounded-none w-16 h-16" src="https://exemplo.com/foto.jpg" /> ```
Você pode criar quantos modifier groups quiser — size, variant, color, align, etc. Cada grupo é independente e pode ser combinado livremente.
Props HTML passthrough
Qualquer prop que não seja reservada e não corresponda a um modifier group do componente é passada como atributo HTML:
```seed @button type=submit, form=meu-form, aria-label=Enviar Enviar @avatar src=foto.jpg, alt=Minha foto, size=small ```
Como as classes são montadas
Quando você usa um componente, o Seed monta a lista de classes em três camadas, nessa ordem:
``` 1. classes base → definidas em class: no YAML 2. classes modifier → adicionadas por cada variante/size/etc. que você passou 3. classes custom → passadas via class= no .seed ```
A regra é simples: a camada mais alta vence. Se uma classe de modifier conflita com a base, a do modifier fica. Se você passa class=, ela tem a palavra final.
Exemplo com o componente avatar definido assim:
```yaml
avatar:
tag: img
class: w-12 h-12 rounded-full object-cover
size:
small: w-8 h-8
large: w-16 h-16
```Ao usar @avatar size=small, class=border-2:
```
base: w-12 h-12 rounded-full object-cover
size: w-8 h-8
class: border-2
↓ ↓ ↓ ↓
resultado: w-8 h-8 rounded-full object-cover border-2
```w-12 e h-12 da base foram substituídos por w-8 e h-8 do modifier size=small — porque w- e h- são o mesmo "tipo" de classe. rounded-full e object-cover não tiveram concorrentes, então permaneceram. border-2 foi acrescentado no final.
A deduplicação funciona por prefixo Tailwind — w-, h-, text-, bg-, p-, rounded-, etc. Duas classes do mesmo prefixo nunca coexistem no output: a de maior prioridade vence e a outra é descartada.
Flags booleanas
Props sem valor e sem = são tratadas como flags booleanas true:
```seed @button variant=primary, disabled Desabilitado ```
Gera: <button class="..." disabled>Desabilitado</button>
Feito com ❤️ e Seed