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. Contratos: Section · Data · Product · Cart · Schema.
1. Section mínima
File:sections/product-grid/schema.json
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
Quandosettings.collection tem UUID, filtre a listagem:
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:
ProductGridSection.data = data. Sem isso, a chave products do schema é que roda.
8. Product Contract
Produtos chegam emdata.products.nodes (Connection<Product>):
id, title, url, featuredImage, price, compareAtPrice, availableForSale.
Product Contract
9. ProductVariant
Para grid de cards, variante não é obrigatória — useproduct.availableForSale e addItem(product) quando não há seletor.
PDP usa variantes — ver Product Variant.
10. ProductCard (snippet scaffold)
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
snippets/product-card. Não há snippet product-price nesse tema.
13. Compare-at price
Parte do contratoProductSummary:
14. Variante e add to cart
Grid simples — adicionar produto sem variante explícita quando única variante:product.url em vez de add direto.
Cart Contract
15. Loading
ComdefineSectionData 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
sections/product-grid/styles.css.
18. Performance
- Use
limitemproducts.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
collectionsalva 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.
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.jsoncomname,category -
data: ['products']oudefineSectionData - Field types estáveis apenas
-
collectionopcional no list options - Empty state
-
limitno fetch - Product fields só do Product Contract
-
useCorvexCart().addItempara CTA -
corvex validate+corvex build

