import { AbsoluteFill, OffthreadVideo, Sequence, staticFile, interpolate, spring, useCurrentFrame, useVideoConfig, } from "remotion"; import { COLORS, FONT, SPRING_CFG } from "./styles"; // ─── CONFIG ────────────────────────────────────────────────────────── const INTRO_DURATION = 3; // seconds const OUTRO_DURATION = 2; // seconds const TOTAL_DURATION = 60; // seconds (YC wants ~1 min) const TALKING_HEAD_DURATION = TOTAL_DURATION - INTRO_DURATION - OUTRO_DURATION; // ─── INTRO CARD ────────────────────────────────────────────────────── const IntroCard = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const nameY = spring({ frame, fps, config: SPRING_CFG, from: 60, to: 0, delay: 0, }); const companyY = spring({ frame, fps, config: SPRING_CFG, from: 40, to: 0, delay: 5, }); const taglineOpacity = interpolate( frame, [1.5 * fps, 2 * fps], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); const fadeOut = interpolate( frame, [(INTRO_DURATION - 0.4) * fps, INTRO_DURATION * fps], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); return ( {/* Accent glow */} {/* Founder name */} Garfield Heron {/* Company name */} ■ SquareMCP {/* Subtitle */} Y Combinator Application ); }; // ─── VIDEO PLACEHOLDER (subtle frame for your recording) ───────────── const VideoFrame = ({ children }: { children?: React.ReactNode }) => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); // Fade in from intro const fadeIn = interpolate( frame, [0, 0.5 * fps], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); // Fade out to outro const fadeOut = interpolate( frame, [(TALKING_HEAD_DURATION - 0.5) * fps, TALKING_HEAD_DURATION * fps], [1, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); return ( {/* Corner accents */} {/* Corner dots */} {[ { top: 16, left: 16 }, { top: 16, right: 16 }, { bottom: 16, left: 16 }, { bottom: 16, right: 16 }, ].map((pos, i) => ( ))} {/* Lower third - name + company */} Garfield Heron Founder, SquareMCP squaremcp.com {/* Placeholder text (remove when you overlay your actual video) */} {!children && ( YOUR RECORDING GOES HERE Record yourself talking, then overlay it in Remotion )} {children} ); }; // ─── OUTRO CARD ────────────────────────────────────────────────────── const OutroCard = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const outroStart = (TOTAL_DURATION - OUTRO_DURATION) * fps; const localFrame = frame - outroStart; const scale = spring({ frame: localFrame, fps, config: SPRING_CFG, from: 0.9, to: 1, }); const opacity = interpolate( localFrame, [0, 0.5 * fps], [0, 1], { extrapolateLeft: "clamp", extrapolateRight: "clamp" } ); return ( {/* Logo mark */} ■ SquareMCP One API. Every Platform. squaremcp.com ); }; // ─── MAIN COMPOSITION ──────────────────────────────────────────────── export const YCAppVideo = () => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const showIntro = frame < INTRO_DURATION * fps; const showOutro = frame >= (TOTAL_DURATION - OUTRO_DURATION) * fps; return ( {showIntro && } {showOutro && } ); };