import { AbsoluteFill, Img, interpolate, useCurrentFrame, useVideoConfig, } from "remotion"; interface ImageSceneProps { title: string; narration: string; imageUrl?: string; } const ACCENT = "#7C3AED"; // Signature purple export const ImageScene: React.FC = ({ title, narration, imageUrl, }) => { const frame = useCurrentFrame(); // Image animations const imageScale = interpolate(frame, [0, 60], [1.05, 1.0], { extrapolateRight: "clamp", }); const imageOpacity = interpolate(frame, [0, 25], [0, 1], { extrapolateRight: "clamp", }); // Text animations const titleOpacity = interpolate(frame, [10, 30], [0, 1], { extrapolateRight: "clamp", }); const titleX = interpolate(frame, [10, 30], [-30, 0], { extrapolateRight: "clamp", }); const textOpacity = interpolate(frame, [20, 45], [0, 1], { extrapolateRight: "clamp", }); // Shape animations const ringScale = interpolate(frame, [5, 40], [0, 1], { extrapolateRight: "clamp", }); const barWidth = interpolate(frame, [0, 25], [0, 80], { extrapolateRight: "clamp", }); return ( {/* Background image -- right side only */} {imageUrl && (
{/* Gradient fade to left */}
)} {/* Geometric decorations */} {/* Ring top-right */}
{/* Small accent dot */}
{/* Vertical accent line */}
{/* Content -- left side */}
{/* Accent bar above title */}
{/* Title */}

{title}

{/* Narration */}

{narration}

{/* Bottom accent stripe */}
); };