Leia isto se: a loja aparece em /preview, mas o canvas do builder fica branco (sem erro no console).
O editor Corvex renderiza a loja dentro de um iframe isolado. Esse ambiente não é idêntico ao /preview em CSS e carregamento de bundle. Temas MUST ser escritos para funcionar nos dois.
Regra de ouro
O tema MUST renderizar a mesma árvore React em:- Canvas do builder (iframe,
data-corvex-editor-preview="true") /preview(aba)- Vitrine publicada
Diferença builder vs /preview
Um tema que funciona só no
/preview violou o contrato — não é “opcional” corrigir.
1. Escopo CSS (MUST)
MUST NOT definir layout/tokens em:root, html, body ou seletores globais (*, .container sem prefixo).
MUST prefixar com a classe raiz do layout/theme.jsx.
Guia completo: Escopo CSS — tema vs editor
2. Declarar classes raiz no theme.json
O editor não monta layout/theme.jsx. A plataforma aplica .cx-theme-scope e classes extras do manifest:
layout/theme.jsx.
Se o CSS do tema só funciona com .my-theme-root--shop e você omitir este campo, o canvas pode ficar em branco ou sem espaçamento.
3. Altura no iframe — carrosséis e heroes
Bibliotecas como Embla/Flickity medem o viewport no iframe. Enquanto não medem, a seção pode ter altura 0 → canvas branco sem erro no console. MUST adicionar regras com[data-corvex-editor-preview='true'] em sections de altura dinâmica:
4. Portais (modais, sticky, drawers)
MUST usaruseThemePortalTarget() de @corvex/runtime.
MUST NOT usar createPortal(..., document.body).
MUST NOT portalizar um wrapper de página (min-height: 100vh, fundo opaco, clone do layout). A plataforma colapsa qualquer filho em fluxo do portal — a classe do tema não importa. Portalize só o overlay (position: fixed).
5. Blocks no canvas
No builder iframe:- Use
{children}como árvore principal. Não useblocks.map(). - MUST manter
SectionBlockCanvasna mesma árvore que na vitrine
6. Publicar e testar
-
editorPreviewRootClassesnotheme.json - CSS escopado (sem
:rootde layout) - Regras
[data-corvex-editor-preview='true']em sliders/heroes - Portais via
useThemePortalTarget() - Builder iframe não branco (desktop + mobile)
-
/previewidêntico ao canvas - Smoke na vitrine após publish
Diagnóstico rápido
- DevTools → iframe
.cx-canvas-iframe - Existe
#cx-preview-content[data-corvex-editor-preview="true"]? .cx-theme-scopeinclui suas classes deeditorPreviewRootClasses?- Hero/slider com altura computada > 0?
- Network: CSS
/api/theme-bundle/...?asset=cssretorna 200 com conteúdo?
O que a plataforma já faz por você
- Portal do builder é âncora 0×0; shells de página em fluxo (qualquer classe) são colapsados
- CSS
*theme-root*/*layout-root*do bundle é aplicado no wrapper.cx-theme-scope(ThemeLayout não monta no canvas). O CSS do tema não é reescrito. - Fallback CSS draft → catálogo quando o draft falha
- Isolamento builder ↔ tema (sem vazamento de CSS)
- Patches pontuais só para packs antigos conhecidos (não são o suporte a tema novo)
Para agentes de IA
Antes de gerar um tema ou section com carrossel/blocks:- Ler
AGENTS.mdna pasta da documentação e Runtime API - Aplicar este guia + Escopo CSS
- Nunca assumir que
ThemeLayoutroda no editor - Sempre incluir checklist §6 na entrega

