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.
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.jsxpor depoimento/slide →{children}no canvas — Padrão A.
1. Resolver playback (biblioteca)
Use o Theme SDK
❌ Errado
✅ Correto
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 queshouldPlay 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.m3u8como 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; evitepreload="auto"em todos os cards.- Debounce do
IntersectionObserver(~150–200 ms) se usarplayWhenVisible.
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.
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 deuseSectionLiveBlocks() — não quando cada block é um componente visual (nesse caso use Padrão A + {children} no editor).
- Vitrine: monte cards a partir de
liveItems/block_order. - Classe de slide no block (
dm-video-carousel__slide). useSectionBlockCount()se usar{children}— nãoChildren.count(children).useSectionLiveBlocks()— ordem ao vivo alinhada ao painel Itens (marquee/faixa).
5. Editor vs vitrine publicada
Checklist de deploy:
corvex buildno temacorvex sync(código do tema na loja)- Publicar no editor
- Hard refresh na loja publicada
6. Checklist — carrossel de vídeos
Snippet CorvexVideo
- Usa
useCorvexVideoPlayback(ouresolveStoreVideoPlayback) para UUID - Poster enquanto
playbackUrlénullouloading - HLS: setup em efeito só com
[src] - Play/pause em efeito separado (
shouldPlay) -
playsInline,mutedpara autoplay - Cleanup:
hls.destroy(),pause(),removeAttribute('src')no unmount -
prefers-reduced-motiondesliga autoplay
Section video-carousel
- Blocks com
type: "video"no schema -
childrenmontados uma vez no track (sem duplicar marquee + canvas) - Marquee:
playWhenVisible={false}nos cards - Embla: pause em slides inativos
-
corvex validate+corvex buildantes 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_*.mp4pendentes - Funciona em mobile (playsInline)

