Naht-Handwerk – Render-Voraussetzungen für Szenenübergänge
Dies ist die Render-Korrektheitsdoktrin für PLV-Szenennähte: die Voraussetzungen und Master-Timeline-Mechaniken, die jeden Übergang korrekt zusammensetzen, unabhängig davon, welcher spezifische Übergang gewählt wird. Der Katalog der einzelnen Übergänge (Crossfade, Push-Slide, Zoom-Through, Cut-the-Curve, …) befindet sich im Transition-Registry – diese Seite ist die Doktrin, die unter all diesen Übergängen liegt.
Die von dieser Doktrin geregelten Übergänge sind Tier-B-ready: reine transform/opacity/filter auf den beiden Szenen-Clip-Wrappern (#el-<sid>), kein injiziertes Overlay-DOM, keine szenenübergreifende Kooperation. Overlay-Familien (gestaffelte Blöcke, Jalousien, Light-Leak, Grid-Dissolve, Page-Burn) und Shader-Übergänge sind für spätere Phasen zurückgestellt.
Bühnen-Grundvoraussetzung (White-Flash-Guard)
Mehrere Templates öffnen ein Fenster, in dem die summierte Opazität der beiden Wrapper < 1 liegt (das Cut-the-Curve-Mid-Window-Cut, Zoom-Throughs 0,15-Boden, der Powerkurven-Dip beim einfachen Crossfade). Was HINTER den Wrappern liegt, scheint in diesem Fenster durch. Wenn das assemblierte index.html #root keinen undurchsichtigen Hintergrund hat, setzt der Renderer den Dip über seinen standardmäßigen weißen Seitenhintergrund → ein weißer Blitz an jeder Naht, besonders auffällig bei dunklen Filmen (beobachtet bei zwei Spotify-Durchläufen vor der Korrektur). Der Assembler muss die Bühne färben: #root { background: var(--canvas-deep, var(--canvas, #000)) } – assemble-index.mjs gibt dies nun aus; jeder andere Verwender dieser Templates trägt dieselbe Garantie.
Wie der Injektor einen Übergang anwendet
An einer break-Grenze zwischen Szene i (from) und Szene i+1 (to) macht der Injektor:
- Verlängert
#el-<from>-Wrappersdata-durationumduration_s(hält das letzte Bild fest – verifiziert:core/src/runtime/init.ts:1393-1410external-slot-Branch). - Zieht
#el-<to>-Wrappersdata-startumduration_snach vorne (erzeugt das Überlappungsfenster). - Weist allen Clip-
data-track-indexals 0/1-Ping-Pong neu zu, sodass die beiden überlappenden Wrapper niemals denselben Track teilen (Überlappung auf gleichem Track ist unzulässig –core/src/lint/rules/composition.ts). Höhere Tracks liegen oben. - Setzt das
gsap_templateinwindow.__timelines["main"]beiT = overlap-start.
Verifiziert durch Prototyp-Render (2026-05-31): Der Master-Timeline-Wrapper-Tween wird gesucht und gerendert (kein doppeltes Suchen mit der eigenen pausierten Timeline des Sub-Comps – die Laufzeitumgebung steuert sie unabhängig), der verlängerte Wrapper hält das letzte Bild von Szene i fest, und der eingehende Wrapper auf höherem Track legt sich darüber und vermischt sich mit dem ausgehenden.
Template-Platzhalter
Der Injektor ersetzt diese Token in jeder gsap_template-Zeile:
| Token | Bedeutung |
|---|---|
__OLD__ | "#el-<from>" – Selektorbefehl für den ausgehenden Clip-Wrapper (in Anführungszeichen) |
__NEW__ | "#el-<to>" – Selektorbefehl für den eingehenden Clip-Wrapper (in Anführungszeichen) |
__T__ | Überlappungsstartzeit in Sekunden (Master-Takt) |
__DUR__ | duration_s für diese Grenze |
__DX__ | horizontale Bewegung für Richtungstypen: -1920 (LINKS) / 1920 (RECHTS) |
__DY__ | vertikale Bewegung: -1080 (HOCH) / 1080 (RUNTER) |
__ORIGIN_OUT__ / __ORIGIN_IN__ | transformOrigin-Paar für squeeze |
filter / scaleX / transformOrigin sind lint-clean im Master-Timeline (verifiziert: core/src/lint/rules/gsap.ts hat keine eigenschaftsbezogene Whitelist und beschränkt seine Prüfungen auf data-composition-id-Bereiche; die x/y/scale/rotation/opacity-Whitelist ist nur eine Scene-Worker-Prompt-Regel – sie bindet index.html nicht).