import React from "react"; import { AbsoluteFill, useCurrentFrame, useVideoConfig, spring, interpolate, } from "remotion"; import { theme } from "../../components/shared/theme"; import { AppScreenshot, MockScreen } from "../../components/shared/AppScreenshot"; /** * Scene 3: Road games surfaced * * Shows upcoming away games inside a phone frame, cards sliding in. * On-screen text: "Plan it in seconds" */ type GameCard = { opponent: string; opponentColor: string; date: string; venue: string; city: string; }; const ROAD_GAMES: GameCard[] = [ { opponent: "@ Dodgers", opponentColor: "#005A9C", date: "Fri, Jun 12", venue: "Dodger Stadium", city: "Los Angeles, CA", }, { opponent: "@ Giants", opponentColor: "#FD5A1E", date: "Sun, Jun 14", venue: "Oracle Park", city: "San Francisco, CA", }, { opponent: "@ Padres", opponentColor: "#2F241D", date: "Tue, Jun 16", venue: "Petco Park", city: "San Diego, CA", }, { opponent: "@ D-backs", opponentColor: "#A71930", date: "Thu, Jun 18", venue: "Chase Field", city: "Phoenix, AZ", }, ]; export const RoadGamesScene: React.FC = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); // "Plan it in seconds" label overlay (outside phone) const planLabelProgress = spring({ frame: frame - 2 * fps, fps, config: theme.animation.snappy, }); const planLabelOpacity = interpolate( frame - 2 * fps, [0, 0.2 * fps], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); return ( {/* Phone frame with app UI */} {/* "Plan it in seconds" label - overlaid outside phone */}
Plan it in seconds
); }; /** Inner screen content rendered inside the phone frame */ const RoadGamesScreenContent: React.FC = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); // Header entrance const headerProgress = spring({ frame, fps, config: theme.animation.smooth, }); const headerOpacity = interpolate(frame, [0, 0.3 * fps], [0, 1], { extrapolateRight: "clamp", }); const headerY = interpolate(headerProgress, [0, 1], [20, 0]); return (
{/* Header */}
{/* Team badge */}
ATL
Braves Road Games
June 2026 away stretch
{/* Game cards */}
{ROAD_GAMES.map((game, index) => { const cardDelay = 0.3 + index * 0.2; const cardProgress = spring({ frame: frame - cardDelay * fps, fps, config: theme.animation.snappy, }); const translateX = interpolate(cardProgress, [0, 1], [300, 0]); const opacity = interpolate(cardProgress, [0, 1], [0, 1]); return (
{/* Date block */}
{game.date.split(", ")[0]}
{game.date.split(" ")[1].replace(",", "")}
{/* Divider */}
{/* Game info */}
{game.opponent}
{game.venue}
{game.city}
); })}
); };