import type React from "react"; import { AbsoluteFill, Img, interpolate, staticFile, useCurrentFrame } from "remotion"; import { GrainOverlay } from "@/components/GrainOverlay"; import { COLOR } from "@/lib/colors"; import { FONT } from "@/lib/fonts"; const RINGS = [ { formats: ["CR2", "NEF", "ARW", "RAF", "DNG"], radius: 120, color: "#f59e0b", direction: 1, }, { formats: ["AVIF", "JXL", "HEIC", "WebP", "QOI"], radius: 195, color: "#14b8a6", direction: -1, }, { formats: ["JPEG", "PNG", "TIFF", "BMP", "GIF", "PSD"], radius: 270, color: "#3b82f6", direction: 1, }, ]; const DURATION = 180; const SPEED = (2 * Math.PI) / DURATION; const Badge: React.FC<{ label: string; color: string; angle: number; radius: number; }> = ({ label, color, angle, radius }) => { const x = Math.cos(angle) * radius; const y = Math.sin(angle) * radius * 0.55; const z = Math.sin(angle); const scale = interpolate(z, [-1, 1], [0.75, 1.0]); const opacity = interpolate(z, [-1, 1], [0.4, 1.0]); const zIndex = Math.round(interpolate(z, [-1, 1], [0, 10])); return (
{label}
); }; /** Trail badge - renders a badge at a past frame's position with reduced opacity */ const TrailBadge: React.FC<{ label: string; color: string; angle: number; radius: number; trailOpacity: number; }> = ({ label, color, angle, radius, trailOpacity }) => { const x = Math.cos(angle) * radius; const y = Math.sin(angle) * radius * 0.55; const z = Math.sin(angle); const scale = interpolate(z, [-1, 1], [0.75, 1.0]); const zIndex = Math.round(interpolate(z, [-1, 1], [0, 10])); return (
{label}
); }; export const FormatUniverse: React.FC = () => { const frame = useCurrentFrame(); const logoScale = Math.sin(frame * 0.06) * 0.05 + 1; return ( {/* Orbit ring lines (faint elliptical paths behind each ring) */} {RINGS.map((ring) => ( ))} {/* Opacity trail: render each badge at frame-1 and frame-2 positions */} {RINGS.map((ring) => ring.formats.map((fmt, fi) => { const angleOffset = (fi / ring.formats.length) * Math.PI * 2; const trail1Angle = angleOffset + (frame - 1) * SPEED * ring.direction; const trail2Angle = angleOffset + (frame - 2) * SPEED * ring.direction; return [ , , ]; }), )} {/* Main badges at current frame */} {RINGS.map((ring) => ring.formats.map((fmt, fi) => { const angleOffset = (fi / ring.formats.length) * Math.PI * 2; const angle = angleOffset + frame * SPEED * ring.direction; return ( ); }), )}
55+ formats. Every camera. Every device.
); };