Skip to main content
Guia normativo para sections com vários cards de vídeo (formato Reels 9:16), blocks video-reel, carrossel Embla e faixa marquee com autoplay. Use este documento quando for criar ou revisar uma section como video-carousel. Ele evita os problemas mais comuns que não aparecem no editor ou só estouram na vitrine publicada.
Carrossel de vídeo ≠ slideshow de imagens. Cada card pode abrir um stream HLS da biblioteca de vídeos da loja. Trate playback, concorrência e ciclo de vida do player como requisitos de arquitetura — não como detalhe de CSS.

Arquitetura recomendada

Nunca resolva UUID ou monte HLS dentro da section ou do block — centralize no snippet.

Integração @corvex/runtime

Padrão B — sections que montam cards a partir de settings sem {children} no track (marquee de vídeos). Se cada block é um card React visível, use Padrão A ({children} no editor).
  • useSectionLiveBlocks() — Padrão B — ordem ao vivo + settings mesclados.
  • Grid com block.jsx por depoimento/slide → {children} no canvas — Padrão A.
Boas práticas: Runtime API.

1. Resolver playback (biblioteca)

Use o Theme SDK

O hook resolve o UUID. Se a resposta de playback vier sem URL e com miniatura da biblioteca de vídeos da loja, o SDK monta o manifesto HLS a partir dessa miniatura.

❌ Errado

✅ Correto

Até playbackUrl existir, mostre poster (thumbnail do hook ou image do block). Nunca deixe o card vazio.

2. Ciclo de vida do HLS — evite loop de requisições

O bug mais grave em carrosséis: destruir e recriar o HLS sempre que shouldPlay ou visibilidade mudam. Isso gera centenas de requisições pendentes (init.mp4, seg_2.mp4, …) no Network.

Regra de ouro

❌ Errado — um único useEffect com shouldPlay no array

✅ Correto — efeitos separados

Outras regras do snippet

  • Não use video.src = manifest.m3u8 como fallback após erro fatal do HLS (Chrome não reproduz HLS nativo assim — só gera mais falhas).
  • Prefira hls.recoverMediaError() uma vez em erros de mídia.
  • preload="metadata" em listas; evite preload="auto" em todos os cards.
  • Debounce do IntersectionObserver (~150–200 ms) se usar playWhenVisible.

3. Marquee + vários cards clonados

Faixas marquee duplicam os mesmos cards para preencher o trilho (expandReelsForMarquee). Um carrossel com 2 vídeos únicos pode virar 8+ instâncias de <video> + HLS.

Problemas típicos

Marquee: desligue playWhenVisible

Com autoplay na faixa, não use IntersectionObserver — os cards estão sempre em movimento e o observer fica instável.
No block:

Limite de streams simultâneos

  • Marquee com autoplay: aceite que vários vídeos tocam muted ao mesmo tempo — mantenha buffer baixo no Hls.js e não recrie players.
  • Carrossel Embla (um slide visível): pause slides inativos; só o ativo reproduz.
  • Grid / muitos cards: play no clique — um stream ativo por vez.

4. Section + blocks

Siga Runtime API — Padrão B quando o JSX monta cards a partir de useSectionLiveBlocks() — não quando cada block é um componente visual (nesse caso use Padrão A + {children} no editor).
  1. Vitrine: monte cards a partir de liveItems / block_order.
  2. Classe de slide no block (dm-video-carousel__slide).
  3. useSectionBlockCount() se usar {children} — não Children.count(children).
  4. useSectionLiveBlocks() — ordem ao vivo alinhada ao painel Itens (marquee/faixa).
CSS:

5. Editor vs vitrine publicada

Checklist de deploy:
  1. corvex build no tema
  2. corvex sync (código do tema na loja)
  3. Publicar no editor
  4. Hard refresh na loja publicada
Teste sempre na URL publicada, não só no preview do editor.

6. Checklist — carrossel de vídeos

Snippet CorvexVideo

  • Usa useCorvexVideoPlayback (ou resolveStoreVideoPlayback) para UUID
  • Poster enquanto playbackUrl é null ou loading
  • HLS: setup em efeito só com [src]
  • Play/pause em efeito separado (shouldPlay)
  • playsInline, muted para autoplay
  • Cleanup: hls.destroy(), pause(), removeAttribute('src') no unmount
  • prefers-reduced-motion desliga autoplay
  • Blocks com type: "video" no schema
  • children montados uma vez no track (sem duplicar marquee + canvas)
  • Marquee: playWhenVisible={false} nos cards
  • Embla: pause em slides inativos
  • corvex validate + corvex build antes do sync

Vitrine

  • Publicou após sync do tema
  • Uma resolução por UUID (o SDK guarda o resultado em cache)
  • Network: não centenas de seg_*.mp4 pendentes
  • Funciona em mobile (playsInline)

Leitura relacionada