Product Showcase (Remotion)
A product feature showcase with animated title, tagline, and staggered feature cards — rendered with Remotion at 1280×720 30fps.
Preview
Code
import {
AbsoluteFill,
Composition,
Easing,
interpolate,
spring,
useCurrentFrame,
useVideoConfig,
} from "remotion";
const PRODUCT_NAME = "AppFlow";
const TAGLINE = "Ship faster. Build smarter.";
const FEATURES = [
{ icon: "\u26A1", title: "Lightning Fast", desc: "Sub-second builds" },
{
icon: "\uD83D\uDD12",
title: "Secure by Default",
desc: "Zero-trust architecture",
},
{
icon: "\uD83D\uDD04",
title: "Auto Scaling",
desc: "Handle any traffic spike",
},
{
icon: "\uD83D\uDCCA",
title: "Real-time Analytics",
desc: "Insights that matter",
},
];
const ACCENT = "#06b6d4";
const FeatureCard: React.FC<{
feature: (typeof FEATURES)[number];
index: number;
frame: number;
fps: number;
}> = ({ feature, index, frame, fps }) => {
const delay = 40 + index * 15;
const f = Math.max(0, frame - delay);
const scale = spring({
frame: f,
fps,
from: 0.5,
to: 1,
config: { damping: 14, stiffness: 120 },
});
const opacity = interpolate(f, [0, 12], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
const y = spring({
frame: f,
fps,
from: 30,
to: 0,
config: { damping: 16, stiffness: 100 },
});
return (
<div
style={{
flex: 1,
opacity,
transform: `translateY(${y}px) scale(${scale})`,
padding: 20,
borderRadius: 16,
backgroundColor: "rgba(255,255,255,0.05)",
border: "1px solid rgba(255,255,255,0.08)",
display: "flex",
flexDirection: "column",
alignItems: "center",
gap: 10,
textAlign: "center",
}}
>
<div style={{ fontSize: 36, marginBottom: 4 }}>{feature.icon}</div>
<div
style={{
fontFamily: "system-ui, sans-serif",
fontWeight: 700,
fontSize: 18,
color: "#ffffff",
}}
>
{feature.title}
</div>
<div
style={{
fontFamily: "system-ui, sans-serif",
fontWeight: 400,
fontSize: 14,
color: "rgba(255,255,255,0.5)",
}}
>
{feature.desc}
</div>
</div>
);
};
export const ProductShowcase: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const titleOpacity = interpolate(frame, [0, 20], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
const titleScale = spring({
frame,
fps,
from: 0.8,
to: 1,
config: { damping: 16, stiffness: 100 },
});
const taglineOpacity = interpolate(frame, [15, 35], [0, 1], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
const taglineY = spring({
frame: Math.max(0, frame - 15),
fps,
from: 15,
to: 0,
config: { damping: 14, stiffness: 80 },
});
// Subtle background pulse
const glowOpacity = interpolate(frame, [0, 30], [0, 0.25], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
easing: Easing.out(Easing.quad),
});
// Fade out
const fadeOut = interpolate(frame, [170, 210], [1, 0], {
extrapolateLeft: "clamp",
extrapolateRight: "clamp",
});
return (
<AbsoluteFill style={{ backgroundColor: "#0a0a0f", opacity: fadeOut }}>
<div
style={{
position: "absolute",
top: "30%",
left: "50%",
width: 800,
height: 400,
borderRadius: "50%",
background: `radial-gradient(circle, ${ACCENT}30 0%, transparent 70%)`,
transform: "translate(-50%, -50%)",
opacity: glowOpacity,
}}
/>
<div
style={{
position: "absolute",
top: 80,
left: 0,
right: 0,
textAlign: "center",
}}
>
<div
style={{
opacity: titleOpacity,
transform: `scale(${titleScale})`,
}}
>
<span
style={{
fontFamily: "system-ui, sans-serif",
fontWeight: 900,
fontSize: 64,
color: "#ffffff",
letterSpacing: -2,
}}
>
{PRODUCT_NAME}
</span>
</div>
<div
style={{
opacity: taglineOpacity,
transform: `translateY(${taglineY}px)`,
marginTop: 12,
}}
>
<span
style={{
fontFamily: "system-ui, sans-serif",
fontWeight: 400,
fontSize: 24,
color: "rgba(255,255,255,0.6)",
}}
>
{TAGLINE}
</span>
</div>
</div>
<div
style={{
position: "absolute",
bottom: 80,
left: 60,
right: 60,
display: "flex",
gap: 16,
}}
>
{FEATURES.map((feature, i) => (
<FeatureCard key={i} feature={feature} index={i} frame={frame} fps={fps} />
))}
</div>
</AbsoluteFill>
);
};
export const RemotionRoot: React.FC = () => (
<Composition
id="ProductShowcase"
component={ProductShowcase}
durationInFrames={210}
fps={30}
width={1280}
height={720}
/>
);Product Showcase
A product showcase video with an animated product name, tagline, and four feature cards that spring in with stagger. The title scales in from 0.8, the tagline slides up with a spring delay, and each feature card enters from below with increasing delay. The entire composition fades out over the last 40 frames.
Composition specs
| Property | Value |
|---|---|
| Resolution | 1280 x 720 |
| FPS | 30 |
| Duration | 7 s (210 frames) |
Customization
- PRODUCT_NAME — the product name displayed at the top
- TAGLINE — subtitle text below the product name
- FEATURES — array of
{ icon, title, desc }objects for the feature cards