FaceFlow Lists — Dynamic Content Listings
The List system in FaceFlow enables you to create dynamic, data-driven pages that query and display collections of content — blog archives, product catalogs, team directories, portfolios, and more. Lists combine a powerful query builder with flexible rendering options (card layout or custom Handlebars templates) and built-in AJAX pagination.
Documentação para Desenvolvedores de Listas
As Listas são a camada de conteúdo dinâmica no FaceFlow.
Elas permitem que usuários técnicos definam como coleções de conteúdo são selecionadas, renderizadas, paginadas e publicadas dentro de uma experiência de Página sem converter cada arquivo ou diretório em edição manual de páginas.
Responsabilidade Principal
Uma Lista é responsável por:
- selecionar um conjunto de conteúdo
- ordenar e limitar resultados
- renderizar cada item de forma consistente
- paginar coleções maiores
- expor um contrato de navegação previsível
As Listas devem responder a uma pergunta clara: "qual coleção esta página é responsável por apresentar?"
Modelo de Lista
Uma Lista típica combina:
- uma definição de consulta
- uma estratégia de ordenação de resultados
- um tamanho de página
- um modo de renderização
- campos personalizados opcionais
- lógica de template de item opcional
Conceitualmente:
{
"name": "resource-library",
"query": {
"template": "resource-item",
"parent": "/resources/",
"sort": "-published",
"limit": 12
},
"display": {
"mode": "custom-template",
"pagination": true
}
}Contrato de Consulta
Equipes técnicas devem manter as consultas de Lista explícitas e delimitadas.
Entradas típicas incluem:
- tipo de conteúdo
- delimitação de seção
- ordenação
- limite de resultados
- restrições adicionais de filtro
Uma consulta fraca gera uma saída fraca. Se a delimitação de conteúdo for vaga, a Lista rapidamente se torna um depósito de conteúdo.
Exemplo:
template=resource-item, parent=/resources/, sort=-published, limit=12Essa consulta é compreensível. Um arquivo "catch-all" com vários tipos não relacionados geralmente não é.
Exemplo de Design de Consulta
Boas definições de Lista geralmente mantêm a regra de seleção e a regra de exibição separadas:
{
"name": "case-studies",
"query": {
"template": "case-study",
"parent": "/customers/",
"sort": "-published",
"limit": 9
},
"display": {
"mode": "custom-template",
"pagination": true
}
}Isso facilita revisar se a delimitação de conteúdo está correta antes de discutir a apresentação.
Modos de Renderização
As Listas normalmente seguem um de dois modelos.
Saída em estilo cartão
Use quando:
- editores precisam de um caminho de configuração de baixa fricção
- o arquivo segue um padrão visual consistente
- um contrato de cartão consistente é suficiente
Saída com template personalizado
Use quando:
- os itens de resultado precisam de um mapeamento mais rico
- o design não é uma grade simples de cartões
- metadados, emblemas ou mídia precisam de posicionamento personalizado
- o arquivo depende da lógica do Facet
Exemplo de saída de item personalizada:
<div class="resource-grid">
{{#each items}}
<article class="resource-card">
<a href="{{ this.url }}">
<h3>{{ this.title }}</h3>
<p>{{ this.summary }}</p>
</a>
</article>
{{/each}}
</div>Paginação
A paginação faz parte do contrato da Lista, não apenas um detalhe visual.
A revisão técnica deve definir:
- tamanho de página padrão
- comportamento da contagem de páginas
- padrão de navegação
- comportamento para estado vazio
Conceitualmente:
page 1 -> items 1-12
page 2 -> items 13-24
page 3 -> items 25-36Se espera que uma Lista cresça, a paginação deve ser intencional desde o primeiro lançamento.
Relação com Páginas e Componentes
O modelo mental claro é:
- Layout fornece a estrutura
- Página fornece a rota publicável e a experiência ao redor
- Lista fornece a coleção dinâmica
- Componente pode fornecer seções de apoio ao redor da Lista
Exemplo de composição de página:
resource-layout
-> archive-hero component
-> resource-library list
-> newsletter-signup componentIsso mantém a navegação dinâmica separada do conteúdo de página único.
Exemplo de Template de Lista
<section class="archive">
<header class="archive-header">
<h1>{{ page.title }}</h1>
</header>
<div class="archive-items">
{{#each items}}
<article class="archive-item">
<a href="{{ this.url }}">{{ this.title }}</a>
</article>
{{/each}}
</div>
{{#if pagination}}
<nav class="archive-pagination">
{{{ pagination.links }}}
</nav>
{{/if}}
</section>O objetivo é um contrato estável entre a consulta da Lista e o template do arquivo.
Regras de Estado Vazio e de Crescimento
A revisão técnica também deve contemplar o que acontece quando a coleção muda de formato:
- nenhum resultado
- um resultado
- muitas páginas de resultados
- campos opcionais ausentes em alguns itens
Um template de Lista é estável apenas se sobreviver a todas as quatro condições sem quebra de layout ou saída confusa.
Checklist de Revisão Técnica
- a delimitação da consulta está clara e estreita?
- a ordenação corresponde à intenção de navegação?
- o template consegue lidar com o aumento no volume de resultados?
- a paginação faz parte do contrato de design?
- a Lista resolve um único problema de arquivo, e não vários problemas não relacionados?
Anti-padrões
Evitar:
- misturar tipos de conteúdo não relacionados em um único arquivo apenas porque estão disponíveis
- construir um arquivo inteiramente à mão com cartões manuais repetidos
- usar uma única Lista para vários modos visuais com contratos incompatíveis
- deixar a ordenação de resultados implícita
- ignorar estados vazios e paginação até que o volume de conteúdo se torne um problema