Loading...
Loading...
Create Remotion videos using the Geist design system aesthetic. Use when asked to create videos, animations, or motion graphics that should follow Vercel's visual style - dark theme, spring animations, Geist typography, and the Geist color palette.
npx skill4agent add vercel-labs/skill-remotion-geist create-remotion-geist@geist-ui/iconssrc/index.tsxregisterRoot().tsmkdir -p src/{scenes,components,utils} out
npm init -y
npm install remotion @remotion/cli @remotion/tailwind react react-dom
npm install -D tailwindcss typescript @types/react
npm install @geist-ui/icons # For proper iconsreferences/project-setup.mdremotion.config.tstailwind.config.jssrc/styles.csssrc/index.tsxregisterRoot()src/Root.tsxsrc/utils/animations.tsreferences/scene-patterns.mdnpx remotion studio # Preview at localhost:3000
npx remotion render MyComp out/video.mp4| Token | CSS Variable | Value | Usage |
|---|---|---|---|
| background-100 | --ds-background-100 | #0a0a0a | Primary background |
| background-200 | --ds-background-200 | #171717 | Secondary/elevated |
| gray-400 | --ds-gray-400 | #737373 | Default borders |
| green-700 | --ds-green-700 | #46A758 | Success |
| red-700 | --ds-red-700 | #E5484D | Error |
| amber-700 | --ds-amber-700 | #FFB224 | Warning |
| blue-700 | --ds-blue-700 | #0070F3 | Info/accent |
text-heading-{72|64|56|48|40|32|24|20|16|14}text-label-{20|18|16|14|13|12}[-mono]text-copy-{24|20|18|16|14|13}[-mono]space-2space-4space-6space-8import { spring, interpolate } from 'remotion';
// Fade in with delay
export function fadeIn(frame: number, fps: number, delay = 0, duration = 0.4) {
const delayFrames = delay * fps;
const durationFrames = duration * fps;
return interpolate(frame, [delayFrames, delayFrames + durationFrames], [0, 1],
{ extrapolateLeft: 'clamp', extrapolateRight: 'clamp' });
}
// Spring scale
export function springIn(frame: number, fps: number, delay = 0) {
return spring({ frame: frame - delay * fps, fps, config: { damping: 200 } });
}export function MyScene() {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const titleOpacity = fadeIn(frame, fps, 0, 0.4);
const titleScale = springIn(frame, fps, 0);
return (
<AbsoluteFill className="bg-background-100 flex flex-col items-center justify-center">
<h2 style={{ opacity: titleOpacity, transform: `scale(${titleScale})` }}>
Title
</h2>
</AbsoluteFill>
);
}@geist-ui/iconsimport { Code, Folder, Check } from '@geist-ui/icons'references/project-setup.mdreferences/geist-icons.mdreferences/code-blocks.mdreferences/geist-colors.mdreferences/geist-typography.mdreferences/geist-components.mdreferences/scene-patterns.mdreferences/storyboard-template.md@font-face {
font-family: 'Geist';
src: url('https://cdn.jsdelivr.net/npm/geist@1.5.1/dist/fonts/geist-sans/Geist-Regular.woff2') format('woff2');
font-weight: 400;
}
/* Add Medium (500), SemiBold (600), Bold (700) weights */