Skip to main content

Criar Product Grid

Card montável no editor (imagem, título, preço por bloco, repetido em cada produto): use o cookbook Grade com blocos de catálogo. Este guia cobre grade + dados; o cookbook cobre section, blocks e persistência.
Golden Path para uma section de produtos orientada a dados — o principal exemplo de Section que lista catálogo na Corvex Store V2. Contratos: Section · Data · Product · Cart · Schema.

1. Section mínima

File: sections/product-grid/schema.json
File: sections/product-grid/section.jsx
theme.json → "sections": [ "product-grid", … ]

2. Schema completo


3. Título e subtítulo


4. Quantidade (range)

settings.limit é number. Use no fetch:

5. Seleção de Collection

Quando settings.collection tem UUID, filtre a listagem:
Sem coleção selecionada: listagem geral (sem filtro de categoria).

6. schema.data: ["products"]

sections/product-grid/schema.json é o arquivo que corvex validate lê. O build copia esse JSON para o componente só se o componente ainda não tiver .schema. Declare data nesse arquivo. Não duplique o schema com defineSection no JSX: se o componente já tiver .schema, o build deixa de anexar o schema.json e o inspetor pode divergir do arquivo validado.

7. defineSectionData

data: ["products"] no schema.json já lista com settings.limit (ou settings.first, padrão 8), settings.collection, settings.category, settings.featured e settings.sortBy. Use defineSectionData quando a consulta não cabe nessa chave. A runtime lê a função em Componente.data, não o export solto:
Depois do loader, atribua ProductGridSection.data = data. Sem isso, a chave products do schema é que roda.

8. Product Contract

Produtos chegam em data.products.nodes (Connection<Product>):
Campos garantidos em cards: id, title, url, featuredImage, price, compareAtPrice, availableForSale. Product Contract

9. ProductVariant

Para grid de cards, variante não é obrigatória — use product.availableForSale e addItem(product) quando não há seletor. PDP usa variantes — ver Product Variant.

10. ProductCard (snippet scaffold)

O scaffold oficial inclui snippets/product-card/snippet.jsx. Card usa product.title, product.featuredImage, product.price.formatted. Componente ProductCard do SDK (@corvex/theme-sdk) é alternativa pública documentada no SDK overview.

11. Imagem


12. Preço

O starter traz snippets/product-card. Não há snippet product-price nesse tema.

13. Compare-at price

Parte do contrato ProductSummary:

14. Variante e add to cart

Grid simples — adicionar produto sem variante explícita quando única variante:
Com múltiplas variantes, link para product.url em vez de add direto. Cart Contract

15. Loading

Com defineSectionData ou schema.data, a vitrine não monta a seção enquanto a carga não termina e ainda não há data. O componente não recebe essa espera: um if (!data) dentro dele não é a tela de carregamento. useCorvexData('products', params) busca no próprio componente. Aí o estado de espera fica no retorno do hook.

16. Empty state


17. Responsividade

CSS opcional em sections/product-grid/styles.css.

18. Performance

  • Use limit em products.list({ first: limit }) — não renderize o catálogo inteiro.
  • Use loading="lazy" em imagens de card.
  • Evite buscar produto individual em loop (N+1) — use os dados da listagem.

19. Editor

  • Inspector mostra fields do schema.json.
  • Picker collection salva UUID.
  • O canvas lê o estado aberto no editor (Preview Contract).
  • Pré-visualizar grava o rascunho da página antes de abrir a aba.

20. Section completa

File: sections/product-grid/section.jsx O schema.json da seção 2 continua obrigatório. Este arquivo não declara schema de novo.
A runtime lê ProductGridSection.data. O export nomeado sozinho não chega ao componente. Não atribua ProductGridSection.schema: o build já anexa o schema.json quando essa propriedade está vazia. Registrar em theme.json e adicionar à home em templates/index.json se desejar.

Checklist

  • schema.json com name, category
  • data: ['products'] ou defineSectionData
  • Field types estáveis apenas
  • collection opcional no list options
  • Empty state
  • limit no fetch
  • Product fields só do Product Contract
  • useCorvexCart().addItem para CTA
  • corvex validate + corvex build

Veja também