feat(film): pillar title card
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import { useCurrentFrame, interpolate, spring, useVideoConfig, AbsoluteFill } from "remotion";
|
||||
import { theme } from "../theme";
|
||||
|
||||
export const PillarTitle: React.FC<{
|
||||
index: string; // "①" etc, or "01"
|
||||
title: string;
|
||||
subtitle: string;
|
||||
startFrame: number;
|
||||
durationInFrames: number;
|
||||
}> = ({ index, title, subtitle, startFrame, durationInFrames }) => {
|
||||
const frame = useCurrentFrame();
|
||||
const { fps } = useVideoConfig();
|
||||
const local = frame - startFrame;
|
||||
if (local < 0 || local > durationInFrames) return null;
|
||||
|
||||
const enter = spring({ frame: local, fps, config: { damping: 200 }, durationInFrames: 20 });
|
||||
const opacity = interpolate(local, [0, 10, durationInFrames - 12, durationInFrames], [0, 1, 1, 0], {
|
||||
extrapolateLeft: "clamp",
|
||||
extrapolateRight: "clamp",
|
||||
});
|
||||
const y = interpolate(enter, [0, 1], [40, 0]);
|
||||
|
||||
return (
|
||||
<AbsoluteFill style={{ alignItems: "center", justifyContent: "center", opacity }}>
|
||||
<div style={{ transform: `translateY(${y}px)`, textAlign: "center", fontFamily: theme.font }}>
|
||||
<div style={{ fontSize: 34, fontWeight: 800, color: theme.blue, marginBottom: 16, fontFamily: theme.mono }}>{index}</div>
|
||||
<div
|
||||
style={{
|
||||
fontSize: 96,
|
||||
fontWeight: 900,
|
||||
letterSpacing: "-0.02em",
|
||||
color: theme.text,
|
||||
background: theme.brandGradient,
|
||||
WebkitBackgroundClip: "text",
|
||||
WebkitTextFillColor: "transparent",
|
||||
}}
|
||||
>
|
||||
{title}
|
||||
</div>
|
||||
<div style={{ fontSize: 36, color: theme.textDim, marginTop: 18, fontWeight: 600 }}>{subtitle}</div>
|
||||
</div>
|
||||
</AbsoluteFill>
|
||||
);
|
||||
};
|
||||
Reference in New Issue
Block a user