Pular para o conteúdo

Componentes

Markdown para LLMs (em inglês)llms.txt

Um componente é um trecho de slide com nome, que você define uma vez e usa quantas vezes quiser. Ele recebe parâmetros, como um molde: muda o texto, o visual continua o mesmo.

Componentes não têm lógica. Não existem laços, condições nem cálculos: o Folio apenas troca cada parâmetro pelo valor informado.

Escreva a definição no início do documento, junto com @title, @theme e as outras definições, antes do primeiro slide:

@component metrica {valor rotulo cor=accent}
::: box {.card align=center}
$valor {size=5xl weight=bold color=$cor}
$rotulo {.muted}
:::
@end
  • @component é seguido do nome e, entre chaves, da lista de parâmetros.
  • Tudo entre essa linha e @end é o corpo do componente, escrito com a mesma linguagem dos slides.
  • O nome usa letras minúsculas, números e hífens, como metrica ou cartao-equipe.
FormaSignificado
valorParâmetro obrigatório. Usar o componente sem ele é erro.
cor=accentParâmetro com valor padrão. Se você não informar, vale accent.
titulo="Sem título"Valor padrão com espaços, entre aspas.

Dentro do corpo, $nome é trocado pelo valor do parâmetro. Isso funciona em qualquer lugar:

  • no texto: ## $titulo ou Responsável: $nome;
  • em valores de atributos: {color=$cor} ou {bg=$fundo};
  • numa linha sozinha: $rotulo vira um parágrafo com o valor.

O valor pode ter formatação de texto, como **negrito**, e ela é aplicada no slide.

Há duas formas de usar um componente, as mesmas dos blocos da linguagem:

  • Uma linha só, com ::, quando ele não tem conteúdo: :: metrica {valor=38% rotulo="crescimento"}.
  • Contêiner, com ::: e um ::: de fechamento, quando ele recebe conteúdo (veja a seção seguinte).

Os parâmetros vão entre chaves, sempre com nome. Valores com espaços ficam entre aspas.

@component metrica {valor rotulo cor=accent}
::: box {.card align=center}
$valor {size=5xl weight=bold color=$cor}
$rotulo {.muted}
:::
@end
# Resultados do trimestre
::: grid {cols=3 gap=lg}
:: metrica {valor=38% rotulo="crescimento da receita"}
:: metrica {valor=94 rotulo="novos clientes" cor=green}
:: metrica {valor=4,8 rotulo="nota de satisfação" cor=violet}
:::

Quando você usa o componente como contêiner, tudo o que estiver entre a abertura e o fechamento vai para $content. Coloque $content numa linha sozinha, no ponto do corpo em que o conteúdo deve aparecer:

@component destaque {titulo}
::: box {.card gap=sm}
## $titulo
$content
:::
@end
::: destaque {titulo="Próximos passos"}
- Revisar o orçamento com a diretoria
- Contratar duas pessoas para o suporte
- Lançar o novo plano em março
:::

O conteúdo pode ter qualquer coisa: texto, listas, imagens, outros blocos e outros componentes.

Às vezes um componente precisa de mais de uma área de conteúdo, como as duas colunas de uma comparação. Para isso existem os espaços nomeados:

  1. No corpo do componente, escreva $nome-do-espaco numa linha sozinha, com um nome que não seja um parâmetro.
  2. Ao usar o componente, preencha o espaço com um bloco ::: slot nome-do-espaco … :::.
  3. O restante do conteúdo continua indo para $content.
@component comparacao {antes depois}
::: columns {gap=xl}
::: box {.card gap=sm}
## $antes
$content
:::
::: box {.card gap=sm bg=accent color=white}
## $depois
$resultado
:::
:::
@end
::: comparacao {antes="Planilhas soltas" depois="Um painel único"}
Cada área exporta, cola e formata os números à mão.
::: slot resultado
Os dados chegam sozinhos e o relatório se atualiza a cada hora.
:::
:::

Espaços que você não preencher ficam vazios, sem erro. Preencher um espaço que o componente não tem é erro, e o editor sugere o nome mais parecido.

O corpo de um componente pode usar outros componentes, e o conteúdo passado a um componente também:

@component selo {texto}
::: box {bg=accent color=white pad=sm radius=lg}
$texto {size=sm weight=bold uppercase}
:::
@end
@component plano {nome preco}
::: box {.card gap=sm}
:: selo {texto=$nome}
## $preco
$content
:::
@end
::: grid {cols=2 gap=lg}
::: plano {nome=Essencial preco="R$ 49"}
Até 5 usuários
:::
::: plano {nome=Equipe preco="R$ 149"}
Usuários ilimitados
:::
:::

Um componente não pode usar a si mesmo, nem direta nem indiretamente (por exemplo, a usa b e b usa a). O Folio detecta o ciclo e mostra um erro. Componentes podem ser aninhados até 16 níveis.

O atributo step também vale na chamada do componente. O componente inteiro aparece na etapa indicada:

:: metrica {valor=38% rotulo="crescimento" step=1}
:: metrica {valor=94 rotulo="novos clientes" step=2}

Veja mais em Revelação por etapas.

Componentes recebem apenas parâmetros. Estilos como .card e #id na chamada são erro. Para mudar a aparência de um uso específico, envolva o componente num box:

::: box {.dark pad=lg}
:: metrica {valor=38% rotulo="crescimento"}
:::

Se a mudança deve valer sempre, prefira criar um parâmetro, como o cor=accent do exemplo metrica.

CódigoQuando acontece
F401$content foi usado fora de um @component.
F404O componente usa a si mesmo, direta ou indiretamente.
F405Componentes aninhados em mais de 16 níveis.
F406A chamada tem .estilo ou #id. Envolva o componente num box.
F407A chamada informa um parâmetro que o componente não tem.
F408A chamada tem texto solto em vez de parâmetros entre chaves.
F409Falta um parâmetro obrigatório.
F410O corpo usa $nome, mas nome não foi declarado como parâmetro.
F411Aviso: o componente recebeu conteúdo, mas não usa $content.
F412O nome do componente é o de um bloco da linguagem.
F413O mesmo componente foi definido duas vezes no documento.
F414::: slot preenche um espaço que o componente não tem.
F415::: slot sem o nome do espaço.
F416::: slot fora da chamada de um componente.
F417O mesmo espaço foi preenchido duas vezes.
F504@component sem o @end correspondente.
F511Nome de componente inválido (use letras minúsculas, números e hífens).

Erros dentro do corpo de um componente aparecem na linha em que ele é usado, com a indicação “(no componente nome)”. A lista completa está em Mensagens de erro.