@corvex/runtime
Bundle host que a plataforma injeta ao compilar temas. Não é um pacote npm — importe @corvex/runtime nos arquivos do tema.
Contrato de dados da loja: @corvex/theme-sdk. Esta página cobre vitrine, integração com o Editor e boas práticas para quem implementa sections com blocks.
Runtime como proxy do builder
O editor usa um motor interno de árvore de blocos (implementação da plataforma). Temas não importam esse motor.@corvex/runtime é o proxy Corvex: hooks e componentes que leem o estado da section no builder, espelham blocks / block_order nos props e permitem preview ao vivo na vitrine do canvas.
Quem cria o tema escolhe como compor a section — Padrão A ({children}), B (marquee / settings), C (grade com RepeatedBlockCard), ou layout customizado montado com os mesmos exports desta página. Não há lista fechada de “permitido”: há ferramentas documentadas e contratos (blocks, block_order, schema.json).
Limite de fronteira (código do tema): não importe o motor do editor, não declare propriedade estática no componente e não importe caminhos internos da plataforma. Fora isso, combine os símbolos desta página como o plano do tema exigir.
Regras de ouro (agências e LLMs)
- Dados da loja →
@corvex/theme-sdk(usePage,useCorvexCart,defineSectionData, …). - Chrome do Editor e blocks ao vivo →
@corvex/runtime(esta página). - Nunca importe paths internos da plataforma, hooks não documentados aqui ou pacotes que o host já substitui (
reactcontinua vindo do host no bundle). - Mesma árvore visual no canvas do builder, em
/previewe na vitrine — o inspect do editor não deve trocar layout, grid ou carrossel. - Sections com blocks têm dois padrões (A e B abaixo) — nunca misture
{children}no editor com cards montados manualmente a partir deblocks/block_order. - Integração com o builder só via
@corvex/runtimee@corvex/theme-sdk. Não importe o motor do editor nem código interno da plataforma. - Depois de alterar JSX de section/block:
corvex validate .→corvex build .→corvex sync .→ hard refresh no builder.
Onde o tema roda
Use
useEditorPreviewCanvas() para saber se está no iframe do builder — não confunda com “qualquer preview”.
PUBLIC_THEME_API (vitrine)
Use na loja publicada, em/preview e sempre que não precisar de estado ao vivo do editor:
Preferir hooks direto de
@corvex/theme-sdk quando não precisa do re-export runtime.
PUBLIC_EDITOR_INTEGRATION (Builder)
Componentes
SectionBlockCanvas e BlockCanvas são <div> de layout — a plataforma garante que os blocks filhos participem do flex/grid do tema. Renderize {children} uma vez dentro do canvas correspondente. BlockCanvasRoot é INTERNAL.
Bloco contêiner ≠ grupo de layout (layoutGroups). Contrato: Block Contract. Cookbook: Colunas agrupadas.
Hooks — qual usar?
useBuilderBlockEditLayout() existe por compatibilidade e sempre retorna false. Não altere layout, autoplay ou carrossel com base nele — o tema é WYSIWYG.Padrão A — blocks renderizados com {children}
Slides, FAQ, grid de depoimentos, qualquer layout onde cada block é um componente React (blocks/testimonial-card/block.jsx, etc.).
Grid de depoimentos (canônico)
Carrossel com slides (blocks)
- Editor canvas:
{children}sempre — nuncablocks.map()quandouseEditorPreviewCanvas()étrue. - Contagem:
useSectionBlockCount()— nãoChildren.count(children). - Renderize
{children}uma única vez — sem cópia oculta para “modo editor”. - Classe de card/slide no block, não em wrapper manual em cima de
{children}. - Autoplay e gestos: implemente no tema; a plataforma não fornece carrossel global.
Padrão B — blocks lidos sem {children} (marquee / faixa)
Somente quando a section nunca monta cada block como filho React — ex.: promo-bar que lê textos e desenha uma faixa animada, ou carrossel de vídeo onde o JSX monta <video> a partir de settings do block.
Padrão C — grade de produtos (card repetido por bloco)
Quando o lojista monta o card (imagem, título, preço…) com blocos e cada produto da grade deve repetir a mesma composição:- A section busca produtos (
useCorvexDataoudefineSectionData). - Por produto:
Providerde contexto + função que iterablock_ordere renderiza o componente de cadablocks[id].type. - No builder:
RepeatedBlockCard(editorHostno primeiro card +renderMirrornos demais) euseSectionBlockTemplate(blocks, block_order)para o molde ao vivo. - Blocks de catálogo não fazem fetch — leem o produto do contexto.
- No tema:
@corvex/runtimee@corvex/theme-sdk. Não importe o motor do editor.
product-list que importam snippet fixo.
Cookbook completo: Grade com blocos de catálogo.
useSectionBlockTemplate(blocks, block_order)
Retorno: { blocks, block_order } — no builder, settings e ordem ao vivo (proxy sobre o estado interno da section); na vitrine, os props serializados. Atalho para grades e qualquer loop que repete o molde de blocos. Equivalente de baixo nível: useSectionLiveBlocks() + merge com os props da section.
RepeatedBlockCard
Props: editorHost (boolean), className, children (repasse da section), renderMirror (função que retorna o JSX espelhado). Encapsula o par card âncora no builder + cards espelhados em listas repetidas (ex.: grade de produtos). Se o layout do tema for atípico, monte o mesmo comportamento com SectionBlockCanvas, {children} e useSectionBlockTemplate — a plataforma continua responsável pelo espelho nos props.
useSectionLiveBlocks()
Retorno:
Use quando a section monta UI a partir de settings de cada block (vídeo, texto+link, ou grade que repete blocks por produto) e não repassa
{children} na vitrine visível.
Na vitrine/publicado, leia blocks + block_order das props (ou defaults do template) — liveItems reflete o estado ao vivo no editor.
Cada entrada em blocks deve ter type estável (ex.: catalog-product-title). O name do schema.json do block é label no editor, não substitui type na serialização.
useSectionBlockMessages()
Retorno: array estável de { text, link? } extraído dos blocks — ideal para promo-bar / ticker com blocks só de texto.
Marquee — atributos obrigatórios
CSS do tema:
@keyframes + variável --marquee-duration. Guia: Carrossel de vídeos.
Blocks — adicionar, remover e reordenar
A plataforma oferece o painel Itens no inspetor lateral quando a section temsections/{id}/blocks.json. O lojista:
- clica em Adicionar para criar um block (respeitando
max_blocks); - arrasta pelo ícone ≡ para reordenar;
- clica em um item para selecioná-lo no canvas;
- remove com o botão de lixeira.
block_order / ordem de sections.
Manifest da section
type em theme.json → blocks[]. Ver Blocks.
Ordem persistida
Cada instância na página guarda:Defaults no template
block_order persistido.
Edição inline — duplo clique no canvas
Campostext / textarea podem ser editados direto no canvas com duplo clique, além do inspetor lateral.
Pré-requisito no builder
- Ative o modo Inspecionar / Selecionar na barra do editor.
- Selecione a section ou o block desejado (opcional, mas recomendado).
- Duplo clique no texto — entra em edição; Esc cancela; Enter confirma (linha única); clique fora (blur) salva.
/preview, vitrine) os componentes renderizam texto estático — sem placeholder de edição.
Settings da section — InlineText
Use propKey = id do field no schema.json (gravado nos props da section no editor).
Leia settings dos props flat (
props.title) ou de props.settings — a plataforma pode passar ambos conforme o ambiente. Normalize no topo da section como no exemplo.Settings do block — BlockInlineText
Use dentro de blocks/{id}/block.jsx. Grava em settings[fieldKey].
Quando não usar inline
Campos editáveis no inspetor sempre funcionam —
InlineText / BlockInlineText são opcionais para UX de duplo clique.
Padrão C — texto inline (resumo)
Ver seção Edição inline — duplo clique acima. Envolva a section comSectionChrome e declare os mesmos ids no schema.json.
Checklist antes de publicar
- Canvas do builder — section visível; blocks adicionáveis na sidebar.
/previewem nova aba — mesmo visual; sem classes exclusivas de “modo editor” forçadas no JSX.- Vitrine — conteúdo vem de
blocks/block_orderou settings, não só de estado ao vivo do editor. corvex validate .— schemas e manifest OK.corvex build .— bundle compila sem erro.corvex sync .— código sobe para a loja vinculada.- Hard refresh no builder após deploy de nova API do runtime no editor.
Anti-padrões
Sintomas comuns (banner vazio, carrossel com 1 slide, loop infinito de render): Section Contract — blocks · cookbooks acima.
INTERNAL (não usar em temas)
Sem garantia de compatibilidade — não importe estes símbolos no tema:GenericInspector, SectionInspector, BlockSettingsInspector, BlockCanvasRoot, hooks internos de edição legados, useEditorViewport, …
Prefira arquitetura declarativa (React + CSS) documentada nos cookbooks.
Referência rápida de imports
@corvex/theme-sdk:
Veja também
- SDK overview
- Section Contract
- Block Contract
- Cookbooks
- Carrossel de vídeos
AGENTS.mdna pasta da documentação — regras para agentes de código