Loading...
Loading...
Best practices for writing Remotion React Markup
npx skill4agent add remotion-dev/skills remotion-markupuseCurrentFrame()interpolate()interpolate()spring()Easing.bezier()Easing.spring()Interactive<div><Interactive.Div>namename="Hero title"InteractiveSolidSequenceimport { useCurrentFrame, Easing, interpolate, Interactive } from "remotion";
export const FadeIn = () => {
const frame = useCurrentFrame();
return (
<Interactive.Div
name="Title"
style={{
opacity: interpolate(frame, [0, 60], [0, 1], {
extrapolateRight: "clamp",
extrapolateLeft: "clamp",
easing: Easing.bezier(0.16, 1, 0.3, 1),
}),
}}
>
Hello World!
</Interactive.Div>
);
};interpolate()stylescaletranslaterotatetransform// 👍 Inline editable keyframes and transform shorthands
style={{
scale: interpolate(frame, [0, 100], [0, 1]),
translate: interpolate(frame, [0, 100], ["0px 0px", "100px 100px"]),
rotate: interpolate(frame, [0, 100], ["20deg", "90deg"]),
}}
// 👎 Hidden values and transform strings become harder to edit in Studio
const scale = interpolate(frame, [0, 100], [0, 1]);
style={{
transform: `scale(${scale})`,
}}public/staticFile()public/@remotion/media<Img>staticFile()public/import { Audio, Video } from "@remotion/media";
import { staticFile } from "remotion";
export const MyComposition = () => {
return (
<>
<Video src={staticFile("video.mp4")} style={{ opacity: 0.5 }} />
<Audio src={staticFile("audio.mp3")} />
<Img src={staticFile("logo.png")} style={{ width: 100, height: 100 }} />
<Video src="https://remotion.media/video.mp4" />
</>
);
};<Sequence>fromdurationInFrames<Sequence><Sequence>layout="none"const Main = () => {
const {fps} = useVideoConfig();
return (
<AbsoluteFill>
<Sequence name="Background">
<Background />
</Sequence>
<Sequence name="Title" from={30} durationInFrames={60} layout="none">
<Title />
</Sequence>
<Sequence name="Subtitle" from={60} durationInFrames={60} layout="none">
<Subtitle />
</Sequence>
</AbsoluteFill>
);
}
export const Title = () => {
const frame = useCurrentFrame();
return (
<div
style={{
opacity: interpolate(frame, [0, 60], [0, 1], {
extrapolateRight: "clamp",
extrapolateLeft: "clamp",
easing: Easing.bezier(0.16, 1, 0.3, 1),
}),
}}
>
Title
</div>
);
};
export const Subtitle = () => {
return <div>Subtitle</div>;
};<HtmlInCanvas>createEffect()<HtmlInCanvas onPaint>brightness()contrast()colorKey()duotone()grayscale()hue()invert()saturation()tint()linearGradient()linearGradientTint()thermalVision()blur()linearProgressiveBlur()radialProgressiveBlur()zoomBlur()dropShadow()glow()lightTrail()evolve()venetianBlinds()mirror()scale()uvTranslate()xyTranslate()barrelDistortion()chromaticAberration()fisheye()cornerPin()wave()burlap()emboss()dotGrid()halftone()noise()noiseDisplacement()paper()roughenEdges()pattern()pixelate()pixelDissolve()scanlines()speckle()shine()shrinkwrap()vignette()contourLines()checkerboard()halftoneLinearGradient()gridlines()whiteNoise()tvSignalOff()lines()rings()waves()zigzag()lightLeak()starburst()interpolatenpx remotion addnpx remotion add @remotion/media@remotion/*mediabunny@mediabunny/*zodnpx remotion studio --no-opennpx remotion still [composition-id] --scale=0.25 --frame=30--frame=30--frame