Skip to main content

Polaroid Pictures

polaroid-pictures.tsx
import {fontFamily, loadFont} from '@remotion/google-fonts/Caveat'; import { Easing, Img, Interactive, interpolate, useCurrentFrame, useVideoConfig, } from 'remotion'; loadFont('normal', { weights: ['600'], subsets: ['latin'], }); export const PolaroidPictures = () => { const frame = useCurrentFrame(); const {durationInFrames} = useVideoConfig(); return ( <div style={{ color: '#2d2620', height: 640, position: 'relative', scale: interpolate(frame, [58, durationInFrames - 32], [1, 1.035], { easing: Easing.inOut(Easing.quad), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', output: 'perceptual-scale', }), translate: interpolate( frame, [58, durationInFrames - 32], ['0px 0px', '0px -18px'], { easing: Easing.inOut(Easing.quad), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), width: 1480, willChange: 'transform', }} > <Interactive.Div name="Photo 1 card" style={{ backgroundColor: '#fffdfa', boxShadow: '0 24px 52px rgba(8, 5, 3, 0.16), 0 4px 12px rgba(8, 5, 3, 0.08), inset 0 0 0 1px rgba(80, 62, 46, 0.05)', boxSizing: 'border-box', height: 520, left: 100, opacity: interpolate( frame, [8, 16, durationInFrames - 30, durationInFrames - 1], [0, 1, 1, 0], { easing: Easing.inOut(Easing.cubic), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), padding: '22px 22px 16px', position: 'absolute', rotate: interpolate( frame, [8, 34, durationInFrames - 30, durationInFrames - 1], ['-20deg', '-8deg', '-8deg', '-18deg'], { easing: [ Easing.bezier(0.16, 1, 0.3, 1), Easing.spring({ damping: 200, mass: 1, stiffness: 100, allowTail: true, durationRestThreshold: 0.02, overshootClamping: false, }), Easing.bezier(0.16, 1, 0.3, 1), ], extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), scale: interpolate( frame, [durationInFrames - 30, durationInFrames - 1], [1, 1.08], { easing: Easing.bezier(0.16, 1, 0.3, 1), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', output: 'perceptual-scale', }, ), top: 85, translate: interpolate( frame, [8, 34, durationInFrames - 30, durationInFrames - 1], ['-620px 260px', '0px 0px', '0px 0px', '-760px -120px'], { easing: [ Easing.bezier(0.16, 1, 0.3, 1), Easing.spring({ damping: 200, mass: 1, stiffness: 100, allowTail: true, durationRestThreshold: 0.02, overshootClamping: false, }), Easing.bezier(0.16, 1, 0.3, 1), ], extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), width: 420, willChange: 'opacity, transform', zIndex: 1, }} > <Interactive.Div name="Photo 1 tape" style={{ backgroundColor: '#d9c58f', boxShadow: '0 2px 8px rgba(67, 47, 29, 0.14)', height: 48, left: 135, opacity: 0.68, position: 'absolute', rotate: '-5deg', top: -21, width: 150, zIndex: 2, translate: '-3.3px -12.3px', }} /> <div style={{ backgroundColor: '#d8cbb8', height: 380, overflow: 'hidden', position: 'relative', width: '100%', }} > <Img name="Photo 1" alt="" src="https://remotion.media/transition-bg-blue.jpg" style={{ height: '100%', objectFit: 'cover', width: '100%', }} /> <div style={{ alignItems: 'center', color: 'white', display: 'flex', fontFamily: 'sans-serif', fontSize: 160, fontWeight: 900, inset: 0, justifyContent: 'center', position: 'absolute', textShadow: '0 4px 30px rgba(0, 0, 0, 0.55)', }} > A </div> </div> <Interactive.Div name="Photo 1 caption" style={{ alignItems: 'center', color: '#2d2620', display: 'flex', fontFamily, fontSize: 44, fontWeight: 600, height: 84, justifyContent: 'center', lineHeight: 1, marginTop: 8, textAlign: 'center', }} > scene A </Interactive.Div> </Interactive.Div> <Interactive.Div name="Photo 2 card" style={{ backgroundColor: '#fffdfa', boxShadow: '0 28px 58px rgba(8, 5, 3, 0.18), 0 5px 14px rgba(8, 5, 3, 0.08), inset 0 0 0 1px rgba(80, 62, 46, 0.05)', boxSizing: 'border-box', height: 520, left: 530, opacity: interpolate( frame, [20, 28, durationInFrames - 28, durationInFrames - 1], [0, 1, 1, 0], { easing: Easing.inOut(Easing.cubic), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), padding: '22px 22px 16px', position: 'absolute', rotate: interpolate( frame, [20, 46, durationInFrames - 28, durationInFrames - 1], ['16deg', '6deg', '6deg', '15deg'], { easing: [ Easing.bezier(0.16, 1, 0.3, 1), Easing.spring({ damping: 200, mass: 1, stiffness: 100, allowTail: true, durationRestThreshold: 0.02, overshootClamping: false, }), Easing.bezier(0.16, 1, 0.3, 1), ], extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), scale: interpolate( frame, [durationInFrames - 28, durationInFrames - 1], [1, 1.1], { easing: Easing.bezier(0.16, 1, 0.3, 1), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', output: 'perceptual-scale', }, ), top: 35, translate: interpolate( frame, [20, 46, durationInFrames - 28, durationInFrames - 1], ['340px -620px', '0px 0px', '0px 0px', '280px -720px'], { easing: [ Easing.bezier(0.16, 1, 0.3, 1), Easing.spring({ damping: 200, mass: 1, stiffness: 100, allowTail: true, durationRestThreshold: 0.02, overshootClamping: false, }), Easing.bezier(0.16, 1, 0.3, 1), ], extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), width: 420, willChange: 'opacity, transform', zIndex: 2, }} > <Interactive.Div name="Photo 2 tape" style={{ backgroundColor: '#d9c58f', boxShadow: '0 2px 8px rgba(67, 47, 29, 0.14)', height: 48, left: 135, opacity: 0.68, position: 'absolute', rotate: '4deg', top: -21, width: 150, zIndex: 2, }} /> <div style={{ backgroundColor: '#d8cbb8', height: 380, overflow: 'hidden', position: 'relative', width: '100%', }} > <Img name="Photo 2" alt="" src="https://remotion.media/transition-bg-pink.jpg" style={{ height: '100%', objectFit: 'cover', width: '100%', }} /> <div style={{ alignItems: 'center', color: 'white', display: 'flex', fontFamily: 'sans-serif', fontSize: 160, fontWeight: 900, inset: 0, justifyContent: 'center', position: 'absolute', textShadow: '0 4px 30px rgba(0, 0, 0, 0.55)', }} > B </div> </div> <Interactive.Div name="Photo 2 caption" style={{ alignItems: 'center', color: '#2d2620', display: 'flex', fontFamily, fontSize: 46, fontWeight: 600, height: 84, justifyContent: 'center', lineHeight: 1, marginTop: 8, textAlign: 'center', }} > scene B </Interactive.Div> </Interactive.Div> <Interactive.Div name="Photo 3 card" style={{ backgroundColor: '#fffdfa', boxShadow: '0 32px 64px rgba(8, 5, 3, 0.2), 0 6px 16px rgba(8, 5, 3, 0.09), inset 0 0 0 1px rgba(80, 62, 46, 0.05)', boxSizing: 'border-box', height: 520, left: 960, opacity: interpolate( frame, [32, 40, durationInFrames - 26, durationInFrames - 1], [0, 1, 1, 0], { easing: Easing.inOut(Easing.cubic), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), padding: '22px 22px 16px', position: 'absolute', rotate: interpolate( frame, [32, 58, durationInFrames - 26, durationInFrames - 1], ['15deg', '-3deg', '-3deg', '10deg'], { easing: [ Easing.bezier(0.16, 1, 0.3, 1), Easing.spring({ damping: 200, mass: 1, stiffness: 100, allowTail: true, durationRestThreshold: 0.02, overshootClamping: false, }), Easing.bezier(0.16, 1, 0.3, 1), ], extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), scale: interpolate( frame, [durationInFrames - 26, durationInFrames - 1], [1, 1.12], { easing: Easing.bezier(0.16, 1, 0.3, 1), extrapolateLeft: 'clamp', extrapolateRight: 'clamp', output: 'perceptual-scale', }, ), top: 85, translate: interpolate( frame, [32, 58, durationInFrames - 26, durationInFrames - 1], ['680px 380px', '0px 0px', '0px 0px', '820px 240px'], { easing: [ Easing.bezier(0.16, 1, 0.3, 1), Easing.spring({ damping: 200, mass: 1, stiffness: 100, allowTail: true, durationRestThreshold: 0.02, overshootClamping: false, }), Easing.bezier(0.16, 1, 0.3, 1), ], extrapolateLeft: 'clamp', extrapolateRight: 'clamp', }, ), width: 420, willChange: 'opacity, transform', zIndex: 3, }} > <Interactive.Div name="Photo 3 tape" style={{ backgroundColor: '#d9c58f', boxShadow: '0 2px 8px rgba(67, 47, 29, 0.14)', height: 48, left: 135, opacity: 0.68, position: 'absolute', rotate: '-2deg', top: -21, width: 150, zIndex: 2, }} /> <div style={{ backgroundColor: '#d8cbb8', height: 380, overflow: 'hidden', position: 'relative', width: '100%', }} > <Img name="Photo 3" alt="" src="https://remotion.media/transition-bg-blue.jpg" style={{ filter: 'hue-rotate(-65deg)', height: '100%', objectFit: 'cover', width: '100%', }} /> <div style={{ alignItems: 'center', color: 'white', display: 'flex', fontFamily: 'sans-serif', fontSize: 160, fontWeight: 900, inset: 0, justifyContent: 'center', position: 'absolute', textShadow: '0 4px 30px rgba(0, 0, 0, 0.55)', }} > C </div> </div> <Interactive.Div name="Photo 3 caption" style={{ alignItems: 'center', color: '#2d2620', display: 'flex', fontFamily, fontSize: 44, fontWeight: 600, height: 84, justifyContent: 'center', lineHeight: 1, marginTop: 8, textAlign: 'center', }} > scene C </Interactive.Div> </Interactive.Div> </div> ); };