Seam Craft — pré-requisitos de renderização para transições entre cenas
Esta é a doutrina de correção de renderização para emendas entre cenas em PLV: os pré-requisitos e mecânicas da linha do tempo mestre que fazem qualquer transição compor corretamente, independentemente de qual transição específica é escolhida. O catálogo de transições individuais (crossfade, push-slide, zoom-through, cut-the-curve, …) vive no registro de transições — esta página é a doutrina subjacente a todas elas.
As transições regidas por esta doutrina são prontas para o Tier B: transform / opacidade /
filter puros nos dois wrappers de clipe de cena (#el-<sid>), sem DOM de sobreposição
injetado, sem cooperação por cena. Famílias de sobreposição (blocos escalonados, persianas, vazamento
de luz, dissolução em grade, queima de página) e transições de shader são adiadas para fases posteriores.
Pré-requisito do fundo da cena (guarda de flash branco)
Vários templates abrem uma janela onde a soma da opacidade dos dois wrappers é < 1 (o
corte no meio da janela do cut-the-curve, o piso de 0,15 do zoom-through, o mergulho
na curva de potência do crossfade simples). O que estiver ATRÁS dos wrappers aparece
durante essa janela. Se o index.html montado #root não tiver um fundo opaco, o
renderizador compõe o mergulho sobre sua página branca padrão → um flash branco em
cada emenda, que grita em filmes escuros (observado em duas execuções do Spotify antes
da correção). O montador deve pintar o palco: #root { background: var(--canvas-deep, var(--canvas, #000)) } — assemble-index.mjs agora emite isso;
qualquer outro consumidor destes templates tem a mesma garantia.
Como o injetor aplica uma transição
Em um limite de break entre a cena i (from) e a cena i+1 (to), o
injetor:
- Estende
#el-<from>wrapperdata-durationporduration_s(segura seu quadro final — verificado:core/src/runtime/init.ts:1393-1410branch de slot externo). - Puxa
#el-<to>wrapperdata-startpara mais cedo porduration_s(cria a janela de sobreposição). - Reatribui todos os
data-track-indexdo clipe como um ping-pong 0/1 para que os dois wrappers sobrepostos nunca compartilhem uma trilha (sobreposição na mesma trilha é ilegal —core/src/lint/rules/composition.ts). Trilha mais alta compõe por cima. - Carimba o
gsap_templateemwindow.__timelines["main"]emT = overlap-start.
Verificado por protótipo de renderização (2026-05-31): o tween do wrapper na linha do tempo mestre é buscado e renderizado (sem busca dupla com a própria linha do tempo pausada do sub-comp — o runtime os conduz independentemente), o wrapper estendido segura o quadro final da cena i, e o wrapper de entrada na trilha mais alta compõe sobre + mescla com o de saída.
Placeholders do template
O injetor substitui estes tokens em cada linha do gsap_template:
| Token | Significado |
|---|---|
__OLD__ | "#el-<from>" — seletor do wrapper de clipe de saída (entre aspas) |
__NEW__ | "#el-<to>" — seletor do wrapper de clipe de entrada (entre aspas) |
__T__ | tempo de início da sobreposição em segundos (relógio mestre) |
__DUR__ | duration_s para este limite |
__DX__ | deslocamento horizontal para tipos direcionais: -1920 (ESQUERDA) / 1920 (DIREITA) |
__DY__ | deslocamento vertical: -1080 (CIMA) / 1080 (BAIXO) |
__ORIGIN_OUT__ / __ORIGIN_IN__ | par de transformOrigin para squeeze |
filter / scaleX / transformOrigin são sem lint na linha do tempo mestre
(verificado: core/src/lint/rules/gsap.ts não tem lista de permissões por propriedade e limita
suas verificações a intervalos de data-composition-id; a lista de permissões de x/y/scale/rotation/opacity
é apenas uma regra de prompt do scene-worker — ela não vincula index.html).