Skip to main content
Quero que o lojista monte o card do produto no editor (imagem, título, descrição, preço, botão) e que cada produto da grade use a mesma composição. Remover um bloco remove aquele elemento de todos os cards.
Referência de implementação: tema de exemplo com seção main + blocos catalog-product-* + lib/renderCatalogProductBlocks.jsx. Índice: Cookbooks

Runtime Corvex, não motor interno

Grade com blocos nos cards é um caso de uso suportado de ponta a ponta: o lojista edita blocos na section; cada produto repete o mesmo molde; preview no builder e vitrine publicada batem. No código do tema você usa @corvex/runtime e @corvex/theme-sdk. O editor entrega o molde em blocks e block_order. O tema não importa o motor do editor. Ferramentas usuais para este cookbook:

Quando usar este padrão


Três camadas (não misture)

Snippets não viram blocos sozinhos. Para card composável, crie tipos de block dedicados (ou um block único que importa o snippet internamente — o lojista ainda não desmonta o card no editor).

Contratos utilizados

  • Section — blocks.json, props blocks / block_order
  • Block — settings; sem fetch de catálogo
  • Product — campos públicos no card
  • Runtime API — useSectionBlockTemplate, RepeatedBlockCard, useEditorPreviewCanvas, BlockChrome
  • Theme defaults — templates/*.json com blocks + block_order

Anatomia recomendada no tema

Registre cada catalog-product-* em theme.json → blocks[].

1. blocks.json da section

Um tipo por “fatia” do card. max_blocks = quantidade de tipos distintos (não repita o mesmo tipo várias vezes no manifest se cada fatia é única).
O rótulo de cada bloco vem de blocks/{id}/schema.json → name, não deste arquivo. O build anexa o manifest no componente da section. Não importe blocks.json no JSX.

2. Block — receber produto sem fetch

  • O tipo é o id da pasta (blocks/catalog-product-title/). Se schema.json tiver type, use o mesmo id. O validador não exige type.
  • name no schema é o rótulo do bloco no editor. Pode mudar. Não mude a pasta depois que a página já existe.

3. Section — loop + render repetido

Pontos obrigatórios:
  1. Vitrine: renderCatalogProductBlocks (ou equivalente) em cada produto — mesma block_order.
  2. Builder: use RepeatedBlockCard com editorHost no primeiro card (ou no lugar vazio, se não houver produtos) e renderMirror nos demais. Não monte os cards à mão a partir de blocks no iframe.
  3. Molde ao vivo: useSectionBlockTemplate(blocks, block_order) devolve blocks e block_order atualizados no builder.
  4. Persistência: blocks e block_order nos props da section (template e publicação). O editor atualiza esses props ao editar, reordenar e remover itens.
Fronteira do tema: não importe o motor do editor, não declare propriedade estática no componente e não importe código interno da plataforma. A integração com o builder passa por @corvex/runtime.

4. renderCatalogProductBlocks

Mapa explícito type → componente; itere block_order, nunca Object.keys sem ordem.
resolveCatalogBlocks pode definir defaults quando blocks está vazio (primeira instalação).

5. Persistência e templates

Checklist de template: se order inclui "main", a chave sections.main deve existir com blocks + block_order. Referência: templates/search.json no tema de exemplo.

6. O que fazer / o que não fazer

Faça

  • Um block por fatia do card. O tipo é a pasta (catalog-product-title). schema.type, se existir, repete esse id.
  • Provider de produto por item da grade (CatalogProductProvider).
  • block_order como fonte de ordem na vitrine e no editor.
  • useSectionBlockTemplate + RepeatedBlockCard (ou composição equivalente com useSectionLiveBlocks + SectionBlockCanvas se o layout exigir).
  • Defaults completos no template para a seção aparecer correta ao adicionar na página.

Não faça

  • Usar snippet product-card na mesma seção e esperar que blocos do editor alterem o snippet.
  • Assumir que product-list (carrossel com snippet) compartilha blocos com main.
  • Fetch de produtos dentro do block (storefront.products.get no block).
  • Montar {children} duas vezes na grade visível (ghost blocks).
  • Fallback que renderiza 5 imagens quando o tipo do block não resolve — corrija type no molde (useSectionBlockTemplate / props da section).
  • Esconder fatia só com toggle mostrar: false se a intenção é remover a fatia do card — prefira remover o bloco na árvore (toggle é opcional para o lojista).

7. Sintomas comuns


8. Checklist antes de publicar o tema

  • sections/{id}/blocks.json + ids em theme.json → blocks[]
  • Cada bloco na pasta blocks/{id}/; name pode mudar, a pasta não
  • Section com data ou useCorvexData para produtos
  • renderCatalogProductBlocks (ou equivalente) + contexto de produto
  • RepeatedBlockCard (ou equivalente documentado) no builder
  • Templates com blocks + block_order para a section de grade
  • corvex validate . e corvex build .
  • Teste no editor: adicionar/remover/reordenar blocos e conferir todos os cards da grade

Relacionados