import React from "react"; import { AbsoluteFill, useCurrentFrame, useVideoConfig, spring, interpolate, } from "remotion"; import { theme } from "../../components/shared/theme"; type Message = { text: string; sender: string; color: string; side: "left" | "right"; }; const messages: Message[] = [ { text: "Lakers game?", sender: "Mike", color: "#552583", side: "left" }, { text: "Dodgers?", sender: "Sarah", color: "#005A9C", side: "right" }, { text: "Both??", sender: "Jake", color: "#007AFF", side: "left" }, { text: "When though", sender: "Sarah", color: "#005A9C", side: "right" }, { text: "idk June maybe", sender: "Mike", color: "#552583", side: "left" }, { text: "too many options 😩", sender: "Jake", color: "#007AFF", side: "right" }, ]; export const ChatBubbles: React.FC = () => { const frame = useCurrentFrame(); const { fps, width } = useVideoConfig(); return ( {/* Header - looks like a group chat */}
{/* Avatar stack */}
{["#FF6B6B", "#4ECDC4", "#45B7D1"].map((color, i) => (
0 ? -15 : 0, zIndex: 3 - i, }} /> ))}
LA Trip Planning
3 people
{/* Messages */}
{messages.map((message, index) => { // Stagger each message const messageDelay = index * 6; const localFrame = frame - messageDelay; const entranceProgress = spring({ frame: localFrame, fps, config: theme.animation.snappy, }); const opacity = interpolate( localFrame, [0, 5], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); const translateX = message.side === "left" ? interpolate(entranceProgress, [0, 1], [-50, 0]) : interpolate(entranceProgress, [0, 1], [50, 0]); const scale = interpolate(entranceProgress, [0, 1], [0.8, 1]); return (
{/* Sender name */} {message.sender} {/* Bubble */}
{message.text}
); })}
); }; // "Stop the chaos" text overlay export const StopTheChaos: React.FC = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const progress = spring({ frame, fps, config: theme.animation.smooth, }); const opacity = interpolate(progress, [0, 1], [0, 1]); const translateY = interpolate(progress, [0, 1], [30, 0]); return (
Stop the chaos.
); };