// Cena: janela de tempo de um plano (troca "deslizar"). Dentro dela, useCurrentFrame() começa em 0. // A saída da cena cruza 9 quadros com a entrada da próxima. import React, {createContext, useContext} from 'react'; import {AbsoluteFill, Sequence, useCurrentFrame} from 'remotion'; import {e5, seg} from '../base'; export type Entrada = 'direita' | 'esquerda' | 'subir' | 'zoom' | 'nenhuma'; export const SOBREPOE = 9; // quadros em que a saída desta cena cruza a entrada da próxima const CenaCtx = createContext({duracao: 60}); /** duração da cena atual em quadros (sem a sobreposição) */ export const useDuracaoCena = () => useContext(CenaCtx).duracao; export type CenaProps = {de: number; ate: number; entrada?: Entrada; ultima?: boolean; children: React.ReactNode}; const estilo = (f: number, duracao: number, entrada: Entrada, ultima: boolean): React.CSSProperties => { const en = entrada === 'nenhuma' ? 0 : 1 - e5(seg(f, 0, 10)); const xo = ultima ? 0 : e5(seg(f, duracao, duracao + SOBREPOE)); let tf = ''; if (entrada === 'direita') tf += `translateX(${en * 1080}px) `; if (entrada === 'esquerda') tf += `translateX(${-en * 1080}px) `; if (entrada === 'subir') tf += `translateY(${en * 900}px) `; if (entrada === 'zoom') tf += `scale(${1 + en * 0.6}) `; tf += `translateX(${-xo * 460}px) scale(${1 - xo * 0.06})`; const blur = en * 10 + xo * 8; return {transform: tf, opacity: 1 - xo * 0.9, filter: blur > 0.3 ? `blur(${blur}px)` : undefined}; }; const Janela: React.FC<{duracao: number; entrada: Entrada; ultima: boolean; children: React.ReactNode}> = ({duracao, entrada, ultima, children}) => { const f = useCurrentFrame(); return {children}; }; export const Cena: React.FC = ({de, ate, entrada = 'direita', ultima = false, children}) => { const duracao = ate - de; return {children} ; };