Coulures de scène — prérequis de rendu pour les transitions entre scènes
Ceci est la doctrine de correction du rendu pour les jonctions de scène à scène dans PLV : les prérequis et les mécanismes de la timeline maîtresse qui assurent que toute transition se compose correctement, indépendamment de la transition spécifique choisie. Le catalogue par transition (crossfade, push-slide, zoom-through, cut-the-curve, …) se trouve dans le registre des transitions — cette page est la doctrine qui les sous-tend toutes.
Les transitions régies par cette doctrine sont prêtes pour le niveau B : pure transformation / opacité / filtre sur les deux wrappers de scène ("#el-"), sans DOM superposé injecté, sans coopération par scène. Les familles de superposition (blocs décalés, stores, fuite de lumière, dissolution en grille, brûlure de page) et les transitions par shader sont reportées aux phases ultérieures.
Prérequis du fond de scène (garde anti-flash blanc)
Plusieurs templates ouvrent une fenêtre où l'opacité cumulée des deux wrappers < 1 (la coupe
médiane de cut-the-curve, le plancher à 0,15 du zoom-through, le creux de la courbe de puissance
du crossfade classique). Ce qui se trouve DERRIÈRE les wrappers apparaît au travers pendant cette
fenêtre. Si le "#root" du index.html assemblé n'a pas de fond opaque, le moteur de rendu compose
l'ouverture sur son fond de page blanc par défaut → un flash blanc à chaque jonction,
éclatant sur les films sombres (observé sur deux exécutions Spotify avant la correction).
L'assembleur doit peindre le fond : #root { background: var(--canvas-deep, var(--canvas, #000)) } — assemble-index.mjs émet désormais cela ;
tout autre consommateur de ces templates assume la même garantie.
Comment l'injecteur applique une transition
À une limite break entre la scène i (from) et la scène i+1 (to), l'injecteur :
- Prolonge
data-durationdu wrapper "#el-" deduration_s(maintient sa dernière image — vérifié :core/src/runtime/init.ts:1393-1410branche externe). - Avance
data-startdu wrapper "#el-" deduration_s(crée la fenêtre de chevauchement). - Réaffecte tous les
data-track-indexdes clips selon un ping-pong 0/1 afin que les deux wrappers qui se chevauchent ne partagent jamais une piste (le chevauchement sur la même piste est interdit —core/src/lint/rules/composition.ts). La piste supérieure se compose au-dessus. - Inscrit le
gsap_templatedanswindow.__timelines["main"]àT = overlap-start.
Vérifié par rendu prototype (2026-05-31) : le tween du wrapper de la timeline maîtresse est cherché et rendu (pas de double recherche avec la propre timeline en pause du sous-composant — le runtime les pilote indépendamment), le wrapper prolongé maintient la dernière image de la scène i, et le wrapper entrant de piste supérieure se compose par-dessus + se fond avec celui qui sort.
Espaces réservés des templates
L'injecteur remplace ces jetons dans chaque ligne de gsap_template :
| Jeton | Signification |
|---|---|
__OLD__ | "#el-<from>" — sélecteur du wrapper du clip sortant (entre guillemets) |
__NEW__ | "#el-<to>" — sélecteur du wrapper du clip entrant (entre guillemets) |
__T__ | heure de début du chevauchement en secondes (horloge maîtresse) |
__DUR__ | duration_s pour cette limite |
__DX__ | déplacement horizontal pour les types directionnels : -1920 (GAUCHE) / 1920 (DROITE) |
__DY__ | déplacement vertical : -1080 (HAUT) / 1080 (BAS) |
__ORIGIN_OUT__ / __ORIGIN_IN__ | paire transformOrigin pour squeeze |
filter / scaleX / transformOrigin sont propres au lint sur la timeline maîtresse
(vérifié : core/src/lint/rules/gsap.ts n'a pas de liste blanche par propriété et limite
ses vérifications aux plages data-composition-id ; la liste blanche x/y/scale/rotation/opacity
est une règle de l'agent scene-worker uniquement — elle ne lie pas index.html).