├── .babelrc
├── .eslintrc
├── .gitattributes
├── .github
└── workflows
│ ├── render-video.yml
│ └── test.yml
├── .gitignore
├── .prettierrc
├── .vscode
└── settings.json
├── Dockerfile
├── README.md
├── out.mp4
├── package-lock.json
├── package.json
├── remotion.config.ts
├── src
├── BestQualities.tsx
├── Blue.tsx
├── Cascadia.woff2
├── CodeFrame.tsx
├── Cpu.tsx
├── EndCard.tsx
├── EndCardRepo.tsx
├── EndCardWebsite.tsx
├── EndCardYarn.tsx
├── FG_Virgil.woff2
├── FadeTransition.tsx
├── FastRefreshDemo.tsx
├── Feature.tsx
├── Fork.tsx
├── GlowingStroke.tsx
├── GoToGithub.tsx
├── HowTo.tsx
├── Inspect.tsx
├── InspectAndRefactor.tsx
├── Install.tsx
├── InstallFrame.tsx
├── Intro
│ ├── Arc.tsx
│ └── Intro.tsx
├── JustWhite.tsx
├── Logo
│ ├── Logo.tsx
│ └── Triangle.tsx
├── Main.tsx
├── MultiThreaded.tsx
├── OpenSource.tsx
├── Pricing.tsx
├── PricingFree.tsx
├── PricingRight.tsx
├── PullRequest.tsx
├── Qualities.tsx
├── RemotionPlayerDemo.tsx
├── SSRMultithreaded.tsx
├── TeaseCodeFrame.tsx
├── Terminal.tsx
├── TerminalRender.tsx
├── Trailer.tsx
├── Transition.tsx
├── Video.tsx
├── WebTechnologies.tsx
├── Website.tsx
├── YesThisWorks.tsx
├── excalidraw-fonts.css
├── fast-refresh-demo.webm
├── fork-trimmed.webm
├── github.png
├── index.tsx
├── inspect-and-refactor.png
├── inspect.png
├── prism.css
├── pull-request.png
├── remotion-logo.png
├── remotion-player.webm
├── remotion-website.png
├── videothumbnail.png
└── voiceover-no-music.mp3
├── trailer.mp4
└── tsconfig.json
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": [
3 | [
4 | "prismjs",
5 | {
6 | "languages": ["javascript", "css", "markup", "tsx"],
7 | "plugins": ["line-numbers", "line-highlight"],
8 | "css": false
9 | }
10 | ]
11 | ]
12 | }
13 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@remotion"
3 | }
4 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.github/workflows/render-video.yml:
--------------------------------------------------------------------------------
1 | on:
2 | push:
3 | workflow_dispatch:
4 | inputs:
5 | titleText:
6 | description: "Which text should it say?"
7 | required: true
8 | default: "Welcome to Remotion"
9 | titleColor:
10 | description: "Which color should it be in?"
11 | required: true
12 | default: "black"
13 | name: Render video
14 | jobs:
15 | render:
16 | name: Render video
17 | runs-on: macos-latest
18 | steps:
19 | - uses: actions/checkout@main
20 | - uses: actions/setup-node@main
21 | - run: brew install ffmpeg
22 | - run: npm i
23 | - run: npm run build -- --props="$WORKFLOW_INPUT"
24 | env:
25 | WORKFLOW_INPUT: ${{ toJson(github.event.inputs) }}
26 | - run: ffmpeg -y -i out.mp4 -i src/voiceover-no-music.mp3 -c:v copy -c:a aac trailer.mp4
27 | - uses: actions/upload-artifact@v2
28 | with:
29 | name: trailer.mp4
30 | path: trailer.mp4
31 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | on:
2 | push:
3 | name: Install and Test
4 | jobs:
5 | render:
6 | name: Install and Test
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@main
10 | - uses: actions/setup-node@main
11 | - run: npm i
12 | - run: npm test
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | .DS_Store
4 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "bracketSpacing": false,
4 | "jsxBracketSameLine": false,
5 | "useTabs": true,
6 | "overrides": [
7 | {
8 | "files": ["*.yml"],
9 | "options": {
10 | "singleQuote": false
11 | }
12 | }
13 | ]
14 | }
15 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.tabSize": 2,
3 | "java.configuration.updateBuildConfiguration": "disabled",
4 | "typescript.tsdk": "node_modules/typescript/lib",
5 | "editor.codeActionsOnSave": {
6 | "source.organizeImports": false,
7 | "source.fixAll": true
8 | },
9 | "typescript.enablePromptUseWorkspaceTsdk": true
10 | }
11 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # This is a dockerized version of a server that you can easily deploy somewhere.
2 | # If you don't want server rendering, you can safely delete this file.
3 |
4 | FROM node:alpine
5 |
6 | # Installs latest Chromium (85) package.
7 | RUN apk add --no-cache \
8 | chromium \
9 | nss \
10 | freetype \
11 | freetype-dev \
12 | harfbuzz \
13 | ca-certificates \
14 | ttf-freefont \
15 | ffmpeg
16 |
17 | # Tell Puppeteer to skip installing Chrome. We'll be using the installed package.
18 | ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
19 | PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
20 |
21 | COPY package*.json ./
22 | COPY tsconfig.json ./
23 | COPY src src
24 | COPY *.ts .
25 | COPY *.tsx .
26 |
27 | RUN npm i
28 |
29 | # Add user so we don't need --no-sandbox.
30 | RUN addgroup -S pptruser && adduser -S -g pptruser pptruser \
31 | && mkdir -p /home/pptruser/Downloads /app \
32 | && chown -R pptruser:pptruser /home/pptruser \
33 | && chown -R pptruser:pptruser /app
34 | # Run everything after as non-privileged user.
35 | USER pptruser
36 |
37 | EXPOSE 8000
38 |
39 | CMD ["npm", "run", "server"]
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## [Watch the video](https://youtu.be/gwlDorikqgY)
2 |
3 | # Remotion video
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Welcome to your Remotion project!
12 |
13 | ## Commands
14 |
15 | **Start Preview**
16 |
17 | ```console
18 | npm start
19 | ```
20 |
21 | **Render video**
22 |
23 | ```console
24 | npm run build
25 | ```
26 |
27 | **Upgrade Remotion**
28 |
29 | ```console
30 | npm run upgrade
31 | ```
32 |
33 | ## Docs
34 |
35 | Get started with Remotion by reading the [fundamentals page](https://www.remotion.dev/docs/the-fundamentals).
36 |
37 | ## Issues
38 |
39 | Found an issue with Remotion? [File an issue here](https://github.com/remotion-dev/remotion/issues/new).
40 |
41 | ## License
42 |
43 | Notice that a company license is needed. Read [the terms here](https://github.com/remotion-dev/remotion/blob/main/LICENSE.md).
44 |
--------------------------------------------------------------------------------
/out.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/out.mp4
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "remotion-template",
3 | "version": "1.0.0",
4 | "description": "My Remotion video",
5 | "scripts": {
6 | "start": "remotion preview src/index.tsx",
7 | "build": "remotion render src/index.tsx Main out.mp4",
8 | "build-trailer": "remotion render src/index.tsx Trailer trailer.mp4",
9 | "upgrade": "remotion upgrade",
10 | "test": "eslint src --ext ts,tsx && tsc && ts-unused-exports tsconfig.json"
11 | },
12 | "repository": {},
13 | "license": "UNLICENSED",
14 | "dependencies": {
15 | "@remotion/bundler": "^3.0.0",
16 | "@remotion/cli": "^3.0.0",
17 | "@remotion/eslint-config": "^3.0.0",
18 | "@remotion/renderer": "^3.0.0",
19 | "@types/lodash": "^4.14.167",
20 | "@types/prismjs": "^1.16.2",
21 | "@types/react": "^18.0.6",
22 | "@types/styled-components": "^5.1.7",
23 | "babel-plugin-prismjs": "^2.0.1",
24 | "eslint": "^8.14.0",
25 | "hack-font": "^3.3.0",
26 | "lodash": "^4.17.20",
27 | "polished": "^4.0.5",
28 | "prettier": "^2.2.1",
29 | "prettier-plugin-organize-imports": "^2.3.4",
30 | "prism-react-renderer": "^1.1.1",
31 | "prismjs": "^1.23.0",
32 | "react": "^18.0.0",
33 | "react-dom": "^18.0.0",
34 | "react-is": "^18.0.0",
35 | "remotion": "^3.0.0",
36 | "styled-components": "^5.2.1",
37 | "ts-unused-exports": "^7.0.1",
38 | "typescript": "^4.6.3"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/remotion.config.ts:
--------------------------------------------------------------------------------
1 | import {Config} from 'remotion';
2 |
3 | Config.Output.setOverwriteOutput(true);
4 | Config.Bundling.setCachingEnabled(false);
5 |
--------------------------------------------------------------------------------
/src/BestQualities.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | AbsoluteFill,
3 | Img,
4 | spring,
5 | useCurrentFrame,
6 | useVideoConfig,
7 | } from 'remotion';
8 | import styled from 'styled-components';
9 | import {Feature} from './Qualities';
10 | import remotionLogo from './remotion-logo.png';
11 |
12 | const Container = styled(AbsoluteFill)`
13 | background-color: white;
14 | flex-direction: row;
15 | justify-content: center;
16 | align-items: center;
17 | `;
18 |
19 | const Left = styled.div``;
20 |
21 | const Right = styled.div`
22 | padding-right: 100px;
23 | `;
24 |
25 | const Spacer = styled.div`
26 | width: 500px;
27 | `;
28 |
29 | const Row = styled.div`
30 | flex-direction: row;
31 | display: flex;
32 | `;
33 |
34 | const programmingFeatures = [
35 | 'Benefits of\nprogramming',
36 | 'Type safety',
37 | 'Testability',
38 | 'Server-side rendering',
39 | 'Continuous rendering',
40 | 'Continuous delivery',
41 | 'Git version control',
42 | 'Parametrization',
43 | 'Fast Refresh',
44 | 'Package ecosystem',
45 | ];
46 |
47 | export const BestQualities: React.FC = () => {
48 | const frame = useCurrentFrame();
49 | const {fps} = useVideoConfig();
50 |
51 | const logoProgress = spring({
52 | frame: frame - 180,
53 | fps,
54 | config: {
55 | damping: 200,
56 | },
57 | });
58 |
59 | return (
60 |
61 |
62 |
63 | {programmingFeatures.map((f, index) => {
64 | return (
65 |
73 | {f}
74 |
75 | );
76 | })}
77 |
78 |
79 |
80 | {[
81 | 'Video editing\nfeatures',
82 | 'Visual Preview',
83 | 'Timeline Scrubbing',
84 | 'Video footage export',
85 | 'Animation primitives',
86 | 'Composition primitives',
87 | 'Layers',
88 | 'Dynamic FPS',
89 | 'Audio support (Alpha)',
90 | 'MP4 export',
91 | ].map((f, index) => {
92 | return (
93 |
101 | {f}
102 |
103 | );
104 | })}
105 |
106 |
107 |
108 |
116 |
117 |
118 | );
119 | };
120 |
--------------------------------------------------------------------------------
/src/Blue.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill} from 'remotion';
2 |
3 | export const Blue: React.FC = () => {
4 | return (
5 |
11 | );
12 | };
13 |
--------------------------------------------------------------------------------
/src/Cascadia.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/Cascadia.woff2
--------------------------------------------------------------------------------
/src/CodeFrame.tsx:
--------------------------------------------------------------------------------
1 | import 'hack-font/build/web/hack.css';
2 | import Highlight, {defaultProps} from 'prism-react-renderer';
3 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
4 | import styled from 'styled-components';
5 | import './prism.css';
6 |
7 | const Pre = styled.pre<{
8 | width: number;
9 | }>`
10 | text-align: left;
11 | margin: 1em 0;
12 | font-size: 40px;
13 | width: ${(props) => props.width}px;
14 | `;
15 |
16 | const Line = styled.div`
17 | display: table-row;
18 | `;
19 |
20 | const LineContent = styled.span`
21 | display: table-cell;
22 | `;
23 |
24 | const Container = styled.div`
25 | flex: 1;
26 | justify-content: center;
27 | align-items: center;
28 | display: flex;
29 | `;
30 |
31 | const Frame = styled.div`
32 | border: 2px solid rgba(0, 0, 0, 0.14);
33 | border-radius: 20px;
34 | background-color: white;
35 |
36 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
37 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
38 | `;
39 |
40 | const Title = styled.div`
41 | padding: 20px;
42 | text-align: center;
43 | font-size: 28px;
44 | `;
45 |
46 | const getProgressOfLine = ({
47 | line,
48 | frame,
49 | fps,
50 | timing,
51 | }: {
52 | line: number;
53 | frame: number;
54 | fps: number;
55 | timing: Timing[];
56 | }) => {
57 | const segment = timing.find((t) => t.line === line);
58 | if (!segment) {
59 | return 1;
60 | }
61 | return spring({
62 | fps,
63 | frame: frame - segment.from,
64 | config: {
65 | stiffness: 200,
66 | damping: 100,
67 | mass: 0.5,
68 | overshootClamping: true,
69 | },
70 | });
71 | };
72 |
73 | type Timing = {
74 | line: number;
75 | from: number;
76 | };
77 |
78 | export const CodeFrame: React.FC<{
79 | code: string;
80 | timing: Timing[];
81 | title: string;
82 | width: number;
83 | }> = ({code, timing, title, width}) => {
84 | const frame = useCurrentFrame();
85 | const {fps} = useVideoConfig();
86 |
87 | return (
88 |
89 |
90 | {title}
91 |
92 |
98 | {({className, style, tokens, getLineProps, getTokenProps}) => (
99 |
100 | {tokens.map((line, i) => {
101 | return (
102 |
132 |
133 | {line.map((token, key) => {
134 | const props = getTokenProps({token, key});
135 | return (
136 |
145 | );
146 | })}
147 |
148 |
149 | );
150 | })}
151 |
152 | )}
153 |
154 |
155 |
156 |
157 | );
158 | };
159 |
--------------------------------------------------------------------------------
/src/Cpu.tsx:
--------------------------------------------------------------------------------
1 | import {mix} from 'polished';
2 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
3 | import styled from 'styled-components';
4 |
5 | const colors = ['#42e9f5', '#4290f5'];
6 |
7 | const Container = styled.div`
8 | height: 350px;
9 | width: 350px;
10 | border: 10px solid ${colors[1]};
11 | border-radius: 20px;
12 | display: flex;
13 | padding: 5px;
14 | `;
15 |
16 | const Column = styled.div`
17 | display: flex;
18 | flex-direction: column;
19 | flex: 1;
20 | `;
21 |
22 | const Row = styled.div`
23 | display: flex;
24 | flex-direction: row;
25 | flex: 1;
26 | `;
27 |
28 | const Core = styled.div<{
29 | x: number;
30 | y: number;
31 | }>`
32 | flex: 1;
33 | background-color: ${(props) => {
34 | const g = interpolate(props.x + props.y, [0, 6], [0, 1]);
35 | return mix(g, colors[0], colors[1]);
36 | }};
37 | margin: 5px;
38 | border-radius: 6px;
39 | `;
40 |
41 | const CoreContainer: React.FC<{
42 | x: number;
43 | y: number;
44 | }> = ({x, y}) => {
45 | const frame = useCurrentFrame();
46 | const {fps} = useVideoConfig();
47 | const offset = x * 4 + y;
48 | const progress = spring({
49 | fps,
50 | frame: frame - Number(offset),
51 | });
52 | return ;
53 | };
54 |
55 | export const Cpu: React.FC = () => {
56 | return (
57 |
58 |
59 | {new Array(4).fill(true).map((k, i) => {
60 | return (
61 |
62 | {new Array(4).fill(true).map((x, j) => {
63 | return ;
64 | })}
65 |
66 | );
67 | })}
68 |
69 |
70 | );
71 | };
72 |
--------------------------------------------------------------------------------
/src/EndCard.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 | import {EndCardRepo} from './EndCardRepo';
4 | import {EndCardWebsite} from './EndCardWebsite';
5 | import {EndCardYarn} from './EndCardYarn';
6 | import {GlowingStroke} from './GlowingStroke';
7 |
8 | const Outer = styled(AbsoluteFill)`
9 | background-color: white;
10 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
11 | `;
12 |
13 | const Container = styled.div`
14 | background-color: rgba(0, 0, 0, 0.04);
15 | display: flex;
16 | flex: 1;
17 | flex-direction: row;
18 | padding: 40px;
19 | `;
20 |
21 | const Left = styled.div`
22 | flex: 1;
23 | display: flex;
24 | `;
25 |
26 | const Right = styled.div`
27 | flex: 1;
28 | display: flex;
29 | flex-direction: column;
30 | `;
31 |
32 | const RADIUS = 30;
33 |
34 | const Panel = styled.div`
35 | position: absolute;
36 | background-color: white;
37 | border-radius: ${RADIUS}px;
38 | display: flex;
39 | justify-content: center;
40 | align-items: center;
41 | box-shadow: 0 15px 20px rgba(0, 0, 0, 0.07);
42 | `;
43 |
44 | const Centered = styled(AbsoluteFill)`
45 | justify-content: center;
46 | align-items: center;
47 | `;
48 |
49 | export const EndCard: React.FC = () => {
50 | const {fps, width, height} = useVideoConfig();
51 |
52 | const PADDING = 40;
53 | const SPACING = 30;
54 | const PANEL_WIDTH = (width - PADDING * 2 - SPACING) / 2;
55 | const BIG_PANEL_HEIGHT = height - PADDING * 2;
56 | const SMALL_PANEL_HEIGHT = (height - PADDING * 2 - SPACING) / 2;
57 | const frame = useCurrentFrame();
58 | const progress = (i: number) =>
59 | spring({
60 | fps,
61 | frame: frame - i * 10 - 15,
62 | config: {
63 | damping: 100,
64 | mass: 2,
65 | },
66 | });
67 |
68 | return (
69 |
70 |
71 |
72 |
79 |
80 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
101 |
102 |
110 |
111 |
112 |
113 |
114 |
122 |
123 |
131 |
132 |
133 |
134 |
135 |
136 |
137 | );
138 | };
139 |
--------------------------------------------------------------------------------
/src/EndCardRepo.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components';
2 |
3 | const Container = styled.div`
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | flex-direction: column;
8 | `;
9 |
10 | const Title = styled.div`
11 | font-weight: 700;
12 | font-family: -apple-system, BlinkMacSystemFont;
13 | font-size: 30px;
14 | margin-bottom: 7px;
15 | `;
16 |
17 | const Link = styled.div`
18 | font-weight: 700;
19 | font-size: 40px;
20 | font-family: -apple-system, BlinkMacSystemFont;
21 | background: linear-gradient(to right, #f5ad43, #fd764a);
22 | -webkit-background-clip: text;
23 | -moz-background-clip: text;
24 | background-clip: text;
25 | -webkit-text-fill-color: transparent;
26 | -moz-text-fill-color: transparent;
27 | text-fill-color: transparent;
28 | `;
29 |
30 | export const EndCardRepo: React.FC = () => {
31 | return (
32 |
33 | This video is open source:
34 |
41 | github.com/remotion-dev/trailer
42 |
43 |
44 | );
45 | };
46 |
--------------------------------------------------------------------------------
/src/EndCardWebsite.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components';
2 |
3 | const Container = styled.div`
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | flex-direction: column;
8 | `;
9 |
10 | const Title = styled.div`
11 | font-weight: 700;
12 | font-family: -apple-system, BlinkMacSystemFont;
13 | font-size: 30px;
14 | margin-bottom: 5px;
15 | `;
16 |
17 | const Link = styled.div`
18 | font-weight: 700;
19 | font-size: 60px;
20 | font-family: -apple-system, BlinkMacSystemFont;
21 | background: linear-gradient(to right, #e01d67, #79367a);
22 | -webkit-background-clip: text;
23 | -moz-background-clip: text;
24 | background-clip: text;
25 | -webkit-text-fill-color: transparent;
26 | -moz-text-fill-color: transparent;
27 | text-fill-color: transparent;
28 | `;
29 |
30 | export const EndCardWebsite: React.FC = () => {
31 | return (
32 |
33 | Read the documentation:
34 |
41 | remotion.dev
42 |
43 |
44 | );
45 | };
46 |
--------------------------------------------------------------------------------
/src/EndCardYarn.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components';
2 | import {Triangle} from './Logo/Triangle';
3 |
4 | const Container = styled.div`
5 | justify-content: center;
6 | align-items: center;
7 | display: flex;
8 | flex-direction: column;
9 | `;
10 |
11 | const Title = styled.div`
12 | font-weight: 700;
13 | font-family: -apple-system, BlinkMacSystemFont;
14 | font-size: 30px;
15 | margin-bottom: 5px;
16 | `;
17 |
18 | const YarnCreateVideo = styled.div`
19 | font-weight: 700;
20 | font-size: 60px;
21 | font-family: -apple-system, BlinkMacSystemFont;
22 | background: linear-gradient(to right, #4290f5, #42e9f5);
23 | -webkit-background-clip: text;
24 | -moz-background-clip: text;
25 | background-clip: text;
26 | -webkit-text-fill-color: transparent;
27 | -moz-text-fill-color: transparent;
28 | text-fill-color: transparent;
29 | `;
30 |
31 | export const EndCardYarn: React.FC = () => {
32 | return (
33 |
34 |
35 |
36 |
37 |
38 |
39 | Create your first video:
40 | yarn create video
41 |
42 | );
43 | };
44 |
--------------------------------------------------------------------------------
/src/FG_Virgil.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/FG_Virgil.woff2
--------------------------------------------------------------------------------
/src/FadeTransition.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import {
3 | AbsoluteFill,
4 | interpolate,
5 | useCurrentFrame,
6 | useVideoConfig,
7 | } from 'remotion';
8 |
9 | export const FadeTransition: React.FC<{
10 | type: 'in' | 'out';
11 | duration: number;
12 | children: React.ReactNode;
13 | }> = ({type, children, duration}) => {
14 | const frame = useCurrentFrame();
15 | const videoConfig = useVideoConfig();
16 |
17 | const firstFrame = videoConfig.durationInFrames - duration;
18 |
19 | const progress =
20 | type === 'in'
21 | ? interpolate(frame, [0, duration], [0, 1], {
22 | extrapolateRight: 'clamp',
23 | extrapolateLeft: 'clamp',
24 | })
25 | : interpolate(
26 | frame,
27 | [firstFrame, videoConfig.durationInFrames - 1],
28 | [1, 0],
29 | {
30 | extrapolateLeft: 'clamp',
31 | extrapolateRight: 'clamp',
32 | }
33 | );
34 |
35 | return (
36 |
41 | {children}
42 |
43 | );
44 | };
45 |
--------------------------------------------------------------------------------
/src/FastRefreshDemo.tsx:
--------------------------------------------------------------------------------
1 | import {useVideoConfig, Video} from 'remotion';
2 | import fastRefreshDemo from './fast-refresh-demo.webm';
3 |
4 | export const FastRefreshDemo: React.FC = () => {
5 | const {height} = useVideoConfig();
6 | return ;
7 | };
8 |
--------------------------------------------------------------------------------
/src/Feature.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import {spring, useCurrentFrame, useVideoConfig} from 'remotion';
3 | import styled from 'styled-components';
4 |
5 | const Title = styled.h2`
6 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
7 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
8 | font-size: 90px;
9 | font-weight: 700;
10 | text-align: center;
11 | margin-bottom: 80px;
12 | background: linear-gradient(to right, #3c873a, #78b65d);
13 | -webkit-background-clip: text;
14 | -moz-background-clip: text;
15 | background-clip: text;
16 | -webkit-text-fill-color: transparent;
17 | -moz-text-fill-color: transparent;
18 | text-fill-color: transparent;
19 | `;
20 |
21 | const Subtitle = styled.div`
22 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
23 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
24 | font-size: 50px;
25 | font-weight: 700;
26 | text-align: center;
27 | margin-bottom: 20px;
28 | `;
29 |
30 | const Row = styled.div`
31 | display: flex;
32 | flex-direction: row;
33 | align-items: center;
34 | justify-content: center;
35 | margin-top: 8px;
36 | margin-bottom: 8px;
37 | `;
38 |
39 | const IconContainer = styled.div`
40 | justify-content: center;
41 | align-items: center;
42 | display: flex;
43 | flex-direction: column;
44 | margin-left: 40px;
45 | margin-right: 40px;
46 | `;
47 |
48 | const Thing: React.FC<{index: number; children: React.ReactNode}> = ({
49 | children,
50 | index,
51 | }) => {
52 | const {fps} = useVideoConfig();
53 | const frame = useCurrentFrame();
54 | const progress = spring({
55 | fps,
56 | frame: frame - index * 4 - 8,
57 | config: {
58 | damping: 100,
59 | },
60 | });
61 | return (
62 |
69 | {children}
70 |
71 | );
72 | };
73 |
74 | const Label = styled.div`
75 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
76 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
77 | font-size: 34px;
78 | font-weight: 400;
79 | text-align: center;
80 | margin-top: 10px;
81 | `;
82 |
83 | export const NodeIcon: React.FC = () => {
84 | return (
85 |
91 | );
92 | };
93 |
94 | export const DockerIcon: React.FC = () => {
95 | return (
96 |
102 | );
103 | };
104 |
105 | export const GithubIcon: React.FC = () => {
106 | return (
107 |
113 | );
114 | };
115 |
116 | type TFeature = {
117 | name: string;
118 | icon: React.ReactNode;
119 | };
120 |
121 | export const Feature: React.FC<{
122 | title: string;
123 | features: TFeature[];
124 | }> = ({title, features}) => {
125 | return (
126 |
127 |
{title}
128 |
Examples included for
129 |
130 |
131 | {features.map((f, i) => {
132 | return (
133 |
134 | {f.icon}
135 |
136 |
137 | );
138 | })}
139 |
140 |
141 | );
142 | };
143 |
--------------------------------------------------------------------------------
/src/Fork.tsx:
--------------------------------------------------------------------------------
1 | import {spring, useCurrentFrame, useVideoConfig, Video} from 'remotion';
2 | import styled from 'styled-components';
3 | import fork from './fork-trimmed.webm';
4 |
5 | const Container = styled.div`
6 | background-color: #fafbfc;
7 | display: flex;
8 | flex: 1;
9 | justify-content: center;
10 | align-items: center;
11 | `;
12 |
13 | const Vid = styled(Video)`
14 | clip-path: inset(15% 13% 15% 23%);
15 | position: absolute;
16 | `;
17 |
18 | export const Fork: React.FC = () => {
19 | const {fps} = useVideoConfig();
20 | const frame = useCurrentFrame();
21 | const scale = spring({
22 | fps,
23 | frame,
24 | config: {
25 | damping: 200,
26 | },
27 | });
28 | return (
29 |
30 |
36 |
37 | );
38 | };
39 |
--------------------------------------------------------------------------------
/src/GlowingStroke.tsx:
--------------------------------------------------------------------------------
1 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 |
4 | const Container = styled.div<{
5 | width: number;
6 | height: number;
7 | }>`
8 | position: absolute;
9 | width: ${(props) => props.width}px;
10 | height: ${(props) => props.height}px;
11 | `;
12 |
13 | export const GlowingStroke: React.FC<{
14 | width: number;
15 | height: number;
16 | radius: number;
17 | color1: string;
18 | color2: string;
19 | offset: number;
20 | }> = ({width, height, radius, color1, color2, offset}) => {
21 | const frame = useCurrentFrame();
22 | const {fps} = useVideoConfig();
23 | const start = 40 + offset;
24 | const progress = spring({
25 | frame: frame - start,
26 | fps,
27 | config: {
28 | damping: 200,
29 | stiffness: 50,
30 | mass: 6,
31 | },
32 | });
33 | const circumference = width * 2 + height * 2;
34 | const strokeDashoffset = interpolate(
35 | progress,
36 | [0, 1],
37 | [0, -circumference + 250]
38 | );
39 | const opacity = (() => {
40 | if (frame < start + 10) {
41 | return interpolate(frame, [start, start + 10], [0, 1], {
42 | extrapolateLeft: 'clamp',
43 | extrapolateRight: 'clamp',
44 | });
45 | }
46 | return interpolate(progress, [0.9, 0.95], [1, 0]);
47 | })();
48 | const gId = `g-${color1}-${color2}`;
49 | return (
50 |
51 |
76 |
77 | );
78 | };
79 |
--------------------------------------------------------------------------------
/src/GoToGithub.tsx:
--------------------------------------------------------------------------------
1 | import {Img, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 | import github from './github.png';
4 |
5 | const Container = styled.div`
6 | background-color: white;
7 | display: flex;
8 | flex: 1;
9 | justify-content: center;
10 | align-items: center;
11 | `;
12 |
13 | const Image = styled(Img)`
14 | width: 1300px;
15 | `;
16 |
17 | export const GoToGithub: React.FC = () => {
18 | const {fps} = useVideoConfig();
19 | const frame = useCurrentFrame();
20 | const scale = spring({
21 | fps,
22 | frame,
23 | config: {
24 | damping: 200,
25 | },
26 | });
27 |
28 | return (
29 |
30 |
36 |
37 | );
38 | };
39 |
--------------------------------------------------------------------------------
/src/HowTo.tsx:
--------------------------------------------------------------------------------
1 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 |
4 | const Container = styled.div`
5 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
6 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
7 | font-size: 120px;
8 | font-weight: 700;
9 | text-align: center;
10 | `;
11 |
12 | export const Howto: React.FC = () => {
13 | const {fps} = useVideoConfig();
14 | const frame = useCurrentFrame();
15 | const progress = spring({
16 | fps,
17 | frame,
18 | config: {
19 | damping: 200,
20 | },
21 | });
22 |
23 | const translateY = interpolate(progress, [0, 1], [600, 0]);
24 |
25 | return (
26 |
35 |
40 | How to write a
video in React?
41 |
42 |
43 | );
44 | };
45 |
--------------------------------------------------------------------------------
/src/Inspect.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Img,
3 | interpolate,
4 | spring,
5 | useCurrentFrame,
6 | useVideoConfig,
7 | } from 'remotion';
8 | import styled from 'styled-components';
9 | import github from './inspect.png';
10 |
11 | const Container = styled.div`
12 | background-color: white;
13 | display: flex;
14 | flex: 1;
15 | justify-content: center;
16 | align-items: center;
17 | `;
18 |
19 | export const Inspect: React.FC = () => {
20 | const {fps} = useVideoConfig();
21 | const frame = useCurrentFrame();
22 |
23 | const progress = spring({
24 | fps,
25 | frame,
26 | config: {
27 | damping: 200,
28 | },
29 | });
30 |
31 | const scale = interpolate(progress, [0, 1], [3.7, 1]);
32 | const translateY = interpolate(progress, [0, 1], [125, 0]);
33 | const translateX = interpolate(progress, [0, 1], [120, 0]);
34 |
35 | return (
36 |
37 |
43 |
44 | );
45 | };
46 |
--------------------------------------------------------------------------------
/src/InspectAndRefactor.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Img,
3 | interpolate,
4 | spring,
5 | useCurrentFrame,
6 | useVideoConfig,
7 | } from 'remotion';
8 | import styled from 'styled-components';
9 | import {Inspect} from './Inspect';
10 | import inspectandrefactor from './inspect-and-refactor.png';
11 |
12 | const Container = styled.div`
13 | background-color: white;
14 | display: flex;
15 | flex: 1;
16 | justify-content: center;
17 | align-items: center;
18 | `;
19 |
20 | const start = 25;
21 |
22 | export const InspectAndRefactor: React.FC = () => {
23 | const frame = useCurrentFrame();
24 | const {fps} = useVideoConfig();
25 | const progress = spring({
26 | fps,
27 | frame: frame - start,
28 | config: {
29 | damping: 200,
30 | stiffness: 200,
31 | },
32 | });
33 |
34 | const browserY = interpolate(progress, [0, 1], [0, -150]);
35 | const translateY = interpolate(progress, [0, 1], [1500, 0]);
36 |
37 | return (
38 |
39 |
45 |
46 |
47 |
48 |

52 |
53 |
54 | );
55 | };
56 |
--------------------------------------------------------------------------------
/src/Install.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | AbsoluteFill,
3 | interpolate,
4 | spring,
5 | useCurrentFrame,
6 | useVideoConfig,
7 | } from 'remotion';
8 | import styled from 'styled-components';
9 | import {InstallFrame} from './InstallFrame';
10 | import {ExcalidrawYesThisWorks} from './YesThisWorks';
11 |
12 | const Container = styled(AbsoluteFill)`
13 | background-color: white;
14 | justify-content: center;
15 | align-items: center;
16 | `;
17 |
18 | export const Install: React.FC = () => {
19 | const frame = useCurrentFrame();
20 | const {fps} = useVideoConfig();
21 | const progress = spring({
22 | frame: frame - 60,
23 | fps,
24 | config: {
25 | damping: 200,
26 | },
27 | });
28 | const arrowProgress = spring({
29 | frame: frame - 65,
30 | fps,
31 | config: {
32 | damping: 200,
33 | },
34 | });
35 |
36 | const framePosition = interpolate(progress, [0, 1], [1200, 50]);
37 | const arrowPosition = interpolate(arrowProgress, [0, 1], [1200, 50]);
38 | return (
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 | );
49 | };
50 |
--------------------------------------------------------------------------------
/src/InstallFrame.tsx:
--------------------------------------------------------------------------------
1 | import 'hack-font/build/web/hack.css';
2 | import styled from 'styled-components';
3 |
4 | const Container = styled.div`
5 | background-color: #252a2e;
6 | color: white;
7 | padding: 20px;
8 | padding-left: 60px;
9 | padding-top: 40px;
10 | padding-bottom: 40px;
11 | padding-right: 60px;
12 | font-size: 60px;
13 | font-family: Hack;
14 | border-radius: 20px;
15 | `;
16 |
17 | export const InstallFrame: React.FC = () => {
18 | return (
19 |
20 | ➜
21 | ~ yarn create video
22 |
23 | );
24 | };
25 |
--------------------------------------------------------------------------------
/src/Intro/Arc.tsx:
--------------------------------------------------------------------------------
1 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 |
3 | export const Arc: React.FC<{
4 | rotation: number;
5 | delay: number;
6 | }> = ({delay, rotation}) => {
7 | const frame = useCurrentFrame();
8 | const {height, width, fps} = useVideoConfig();
9 | const rx = 180;
10 | const ry = 400;
11 | const arcLength = Math.PI * 2 * Math.sqrt((rx * rx + ry * ry) / 2);
12 |
13 | const progress = spring({
14 | frame: frame - delay,
15 | fps,
16 | config: {
17 | damping: 100,
18 | mass: 10,
19 | },
20 | });
21 |
22 | const opacity = interpolate(progress, [0, 0.2], [0, 0.7], {
23 | extrapolateRight: 'clamp',
24 | extrapolateLeft: 'clamp',
25 | });
26 |
27 | const strokeWidth = interpolate(progress, [0, 1], [200, 60]);
28 |
29 | return (
30 |
37 |
51 |
52 | );
53 | };
54 |
--------------------------------------------------------------------------------
/src/Intro/Intro.tsx:
--------------------------------------------------------------------------------
1 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 | import {Arc} from './Arc';
4 |
5 | const Container = styled.div`
6 | background-color: white;
7 |
8 | flex: 1;
9 | display: flex;
10 | justify-content: center;
11 | align-items: center;
12 | flex-direction: column;
13 | `;
14 | const ZIndex1 = styled.div`
15 | flex: 1;
16 | display: flex;
17 | justify-content: center;
18 | align-items: center;
19 | flex-direction: column;
20 | z-index: 1;
21 | position: absolute;
22 | width: 100%;
23 | height: 100%;
24 | `;
25 |
26 | const Text = styled.span`
27 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
28 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
29 | font-size: 180px;
30 | font-weight: 700;
31 | `;
32 |
33 | export const Intro: React.FC<{offset: number; showText: boolean}> = ({
34 | offset,
35 | showText,
36 | }) => {
37 | const frame = useCurrentFrame();
38 | const {fps, width, height, durationInFrames} = useVideoConfig();
39 | const scaleProgress = spring({
40 | fps,
41 | frame: frame - offset,
42 | config: {
43 | mass: 10,
44 | damping: 200,
45 | },
46 | });
47 | const scale = interpolate(scaleProgress, [0, 1], [1.5, 1]);
48 | const spring1 = spring({
49 | fps,
50 | frame: frame - 30 - offset,
51 | config: {
52 | stiffness: 100,
53 | damping: 200,
54 | },
55 | });
56 | const spring2 = spring({
57 | fps,
58 | frame: frame - 60 - offset,
59 | config: {
60 | stiffness: 100,
61 | damping: 200,
62 | },
63 | });
64 | const offset1 = interpolate(spring1, [0, 1], [800, 0]);
65 | const offset2 = interpolate(spring2, [0, 1], [800, 0]);
66 |
67 | const text = showText ? (
68 | <>
69 |
70 | This
71 | video
72 | is
73 |
74 |
75 | made
76 | with
77 | React
78 |
79 | >
80 | ) : null;
81 |
82 | const arcs = (
83 | <>
84 |
85 |
86 |
87 | >
88 | );
89 |
90 | const opacity = interpolate(
91 | frame - offset,
92 | [durationInFrames - 10 - offset, durationInFrames - offset],
93 | [1, 0]
94 | );
95 |
96 | return (
97 |
98 | {text}
99 |
133 |
134 | );
135 | };
136 |
--------------------------------------------------------------------------------
/src/JustWhite.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill} from 'remotion';
2 |
3 | export const JustWhite: React.FC = () => {
4 | return (
5 |
11 | );
12 | };
13 |
--------------------------------------------------------------------------------
/src/Logo/Logo.tsx:
--------------------------------------------------------------------------------
1 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 | import {Triangle} from './Triangle';
4 |
5 | const Outer = styled.div`
6 | display: flex;
7 | justify-content: center;
8 | flex: 1;
9 | align-items: center;
10 | background-color: white;
11 | `;
12 |
13 | const Introducing = styled.div`
14 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
15 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
16 | color: white;
17 | font-size: 120px;
18 | font-weight: 700;
19 | `;
20 |
21 | const Title = styled.div`
22 | font-size: 210px;
23 | font-family: 'SF Pro Text';
24 | font-weight: 700;
25 | `;
26 |
27 | const scaleStart = 45;
28 |
29 | export const Logo: React.FC<{
30 | showText: boolean;
31 | offset: number;
32 | textStartOffset: number;
33 | }> = ({showText, offset, textStartOffset}) => {
34 | const textStart = 85 + textStartOffset;
35 | const {fps, width, height} = useVideoConfig();
36 | const currentFrame = useCurrentFrame();
37 | const frame = currentFrame - offset;
38 | const blueOpacity = interpolate(frame, [0, 5], [0, 1], {
39 | extrapolateRight: 'clamp',
40 | });
41 | const textOpacity = interpolate(
42 | frame,
43 | [scaleStart - 10, scaleStart - 0],
44 | [1, 0]
45 | );
46 |
47 | const scale = (index: number) => {
48 | const progress = spring({
49 | fps,
50 | frame: frame - index * 10 - scaleStart,
51 | config: {
52 | damping: 200,
53 | mass: 0.7,
54 | },
55 | });
56 | return interpolate(progress, [0, 1], [20, 1]);
57 | };
58 |
59 | const textAnimated = spring({
60 | fps,
61 | frame: frame - textStart,
62 | config: {
63 | damping: 100,
64 | mass: 2,
65 | stiffness: 200,
66 | },
67 | });
68 |
69 | return (
70 |
71 |
85 |
Remotion
86 |
87 |
102 |
107 |
108 |
113 |
114 | {showText ? (
115 |
124 | Introducing
125 |
126 | ) : null}
127 |
128 | );
129 | };
130 |
--------------------------------------------------------------------------------
/src/Logo/Triangle.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components';
2 |
3 | const Container = styled.svg`
4 | position: absolute;
5 | `;
6 |
7 | export const Triangle: React.FC<{
8 | size: number;
9 | opacity: number;
10 | scale: number;
11 | }> = ({size, opacity, scale}) => {
12 | return (
13 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
30 |
31 |
32 | );
33 | };
34 |
--------------------------------------------------------------------------------
/src/Main.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill, Audio, Sequence, useCurrentFrame} from 'remotion';
2 | import {BestQualities} from './BestQualities';
3 | import {Blue} from './Blue';
4 | import {CodeFrame} from './CodeFrame';
5 | import {EndCard} from './EndCard';
6 | import {FadeTransition} from './FadeTransition';
7 | import {FastRefreshDemo} from './FastRefreshDemo';
8 | import {Fork} from './Fork';
9 | import {GoToGithub} from './GoToGithub';
10 | import {Howto} from './HowTo';
11 | import {InspectAndRefactor} from './InspectAndRefactor';
12 | import {Install} from './Install';
13 | import {Intro} from './Intro/Intro';
14 | import {JustWhite} from './JustWhite';
15 | import {Logo} from './Logo/Logo';
16 | import {Multithreaded} from './MultiThreaded';
17 | import {OpenSource} from './OpenSource';
18 | import {Pricing} from './Pricing';
19 | import {PullRequest} from './PullRequest';
20 | import {RemotionPlayerDemo} from './RemotionPlayerDemo';
21 | import {Ssr} from './SSRMultithreaded';
22 | import {TerminalRender} from './TerminalRender';
23 | import {Transition} from './Transition';
24 | import voiceover from './voiceover-no-music.mp3';
25 | import {Website} from './Website';
26 | import {WebTechnologies} from './WebTechnologies';
27 |
28 | export const Main: React.FC = () => {
29 | const frame = useCurrentFrame();
30 |
31 | return (
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | {
80 | return (
81 |
89 | );
90 | }
91 |
92 | `.trim()}
93 | timing={[
94 | {
95 | line: 5,
96 | from: 50,
97 | },
98 | {
99 | line: 6,
100 | from: 75,
101 | },
102 | {
103 | line: 7,
104 | from: 110,
105 | },
106 | {
107 | line: 8,
108 | from: 115,
109 | },
110 | ]}
111 | />
112 |
113 |
114 | {
119 | const frame = useCurrentFrame() // ${frame}
120 | ${' '}
121 | return (
122 |
127 | Frame number {frame} 🔥
128 |
129 | )
130 | }
131 |
132 | `.trim()}
133 | timing={[
134 | {
135 | line: 1,
136 | from: 50,
137 | },
138 | {
139 | line: 3,
140 | from: 170,
141 | },
142 | {
143 | line: 4,
144 | from: 170,
145 | },
146 | {
147 | line: 5,
148 | from: 170,
149 | },
150 | {
151 | line: 6,
152 | from: 170,
153 | },
154 | {
155 | line: 7,
156 | from: 170,
157 | },
158 | {
159 | line: 8,
160 | from: 170,
161 | },
162 | {
163 | line: 9,
164 | from: 170,
165 | },
166 | {
167 | line: 10,
168 | from: 170,
169 | },
170 | {
171 | line: 11,
172 | from: 170,
173 | },
174 | ]}
175 | />
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 | );
251 | };
252 |
--------------------------------------------------------------------------------
/src/MultiThreaded.tsx:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components';
2 | import {Cpu} from './Cpu';
3 |
4 | const Container = styled.div`
5 | background-color: white;
6 | flex: 1;
7 | justify-content: center;
8 | align-items: center;
9 | display: flex;
10 | `;
11 |
12 | const Title = styled.h2`
13 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
14 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
15 | font-size: 60px;
16 | font-weight: 700;
17 | text-align: center;
18 | margin-bottom: 0;
19 | `;
20 |
21 | const Column = styled.div`
22 | flex-direction: column;
23 | display: flex;
24 | align-items: center;
25 | `;
26 |
27 | export const Multithreaded: React.FC = () => {
28 | return (
29 |
30 |
31 |
32 | Multithreaded rendering
33 |
34 |
35 | );
36 | };
37 |
--------------------------------------------------------------------------------
/src/OpenSource.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill} from 'remotion';
2 | import styled from 'styled-components';
3 |
4 | const Title = styled.div`
5 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
6 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
7 | font-weight: 700;
8 | background: linear-gradient(to right, #000, #444);
9 | -webkit-background-clip: text;
10 | -moz-background-clip: text;
11 | background-clip: text;
12 | -webkit-text-fill-color: transparent;
13 | -moz-text-fill-color: transparent;
14 | text-fill-color: transparent;
15 | color: #3b5998;
16 | font-weight: 700;
17 | font-size: 160px;
18 | line-height: 1;
19 | display: flex;
20 | justify-content: center;
21 | align-items: center;
22 | `;
23 |
24 | const Subtitle = styled.div`
25 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
26 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
27 | font-weight: 700;
28 | font-size: 45px;
29 | text-align: center;
30 | display: flex;
31 | flex-direction: row;
32 | justify-content: center;
33 | align-items: center;
34 | `;
35 |
36 | const GithubIcon: React.FC = () => {
37 | return (
38 |
44 | );
45 | };
46 |
47 | const Container = styled(AbsoluteFill)`
48 | background-color: white;
49 | justify-content: center;
50 | `;
51 |
52 | export const OpenSource: React.FC = () => {
53 | return (
54 |
55 | Source-available
56 |
57 |
58 |
59 | remotion-dev/remotion
60 |
61 |
62 | );
63 | };
64 |
--------------------------------------------------------------------------------
/src/Pricing.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import {
3 | AbsoluteFill,
4 | interpolate,
5 | spring,
6 | useCurrentFrame,
7 | useVideoConfig,
8 | } from 'remotion';
9 | import styled from 'styled-components';
10 | import {PricingFree} from './PricingFree';
11 | import {PricingRight} from './PricingRight';
12 |
13 | const Container = styled.div`
14 | flex: 1;
15 | background-color: white;
16 | `;
17 |
18 | export const Pricing: React.FC = () => {
19 | const {fps, width} = useVideoConfig();
20 | const frame = useCurrentFrame();
21 | const transitionProgress = spring({
22 | fps,
23 | frame: frame - 80,
24 | config: {
25 | damping: 200,
26 | },
27 | });
28 |
29 | const freeTranslateX = interpolate(
30 | transitionProgress,
31 | [0, 1],
32 | [0, -width / 4]
33 | );
34 | const rightTranslateX = interpolate(
35 | transitionProgress,
36 | [0, 1],
37 | [0, width / 4]
38 | );
39 | const rightOpacity = interpolate(transitionProgress, [0.6, 1], [0, 1]);
40 |
41 | return (
42 |
43 |
44 |
45 |
46 |
52 |
53 |
54 |
55 | );
56 | };
57 |
--------------------------------------------------------------------------------
/src/PricingFree.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | AbsoluteFill,
3 | interpolate,
4 | spring,
5 | useCurrentFrame,
6 | useVideoConfig,
7 | } from 'remotion';
8 | import styled from 'styled-components';
9 |
10 | const Container = styled(AbsoluteFill)`
11 | text-align: center;
12 | justify-content: center;
13 | align-items: center;
14 | `;
15 |
16 | const TitleContainer = styled.div`
17 | height: 300px;
18 | `;
19 |
20 | const Title = styled.div`
21 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
22 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
23 | font-weight: 700;
24 | background: linear-gradient(to right, #4290f5, #42e9f5);
25 | -webkit-background-clip: text;
26 | -moz-background-clip: text;
27 | background-clip: text;
28 | -webkit-text-fill-color: transparent;
29 | -moz-text-fill-color: transparent;
30 | text-fill-color: transparent;
31 | color: #3b5998;
32 | font-weight: 700;
33 | `;
34 |
35 | const Subtitle = styled.div`
36 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
37 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
38 | font-weight: 400;
39 | font-size: 45px;
40 | width: 900px;
41 | line-height: 1.5;
42 | font-weight: 700;
43 | `;
44 |
45 | export const PricingFree: React.FC = () => {
46 | const frame = useCurrentFrame();
47 | const {fps} = useVideoConfig();
48 | const progress = (i: number) =>
49 | spring({
50 | fps,
51 | frame: frame - 2 * i,
52 | config: {
53 | damping: 200,
54 | overshootClamping: true,
55 | },
56 | });
57 |
58 | const subtitleProgress = spring({
59 | fps,
60 | frame: frame - 40,
61 | config: {
62 | damping: 200,
63 | overshootClamping: true,
64 | },
65 | });
66 | const textScale = interpolate(subtitleProgress, [0, 1], [1, 0.7]);
67 | const subtitleTranslate = interpolate(subtitleProgress, [0, 1], [0, 20]);
68 | return (
69 |
70 |
71 |
76 | {'Free'.split('').map((a, i) => {
77 | return (
78 |
88 | {a}
89 |
90 | );
91 | })}
92 |
93 |
94 |
95 |
101 | For individuals, small companies,
non-profits & education
102 |
103 |
104 | );
105 | };
106 |
--------------------------------------------------------------------------------
/src/PricingRight.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill} from 'remotion';
2 | import styled from 'styled-components';
3 |
4 | const Container = styled(AbsoluteFill)`
5 | text-align: center;
6 | justify-content: center;
7 | align-items: center;
8 | `;
9 |
10 | const TitleContainer = styled.div`
11 | height: 300px;
12 | display: flex;
13 | justify-content: center;
14 | align-items: center;
15 | `;
16 |
17 | const Title = styled.div`
18 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
19 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
20 | font-weight: 700;
21 | background: linear-gradient(to right, #e01d67, #79367a);
22 | -webkit-background-clip: text;
23 | -moz-background-clip: text;
24 | background-clip: text;
25 | -webkit-text-fill-color: transparent;
26 | -moz-text-fill-color: transparent;
27 | text-fill-color: transparent;
28 | color: #3b5998;
29 | font-weight: 800;
30 | font-size: 120px;
31 | line-height: 1;
32 | `;
33 |
34 | const Subtitle = styled.div`
35 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
36 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
37 | font-weight: 400;
38 | font-size: 45px;
39 | font-weight: 700;
40 | width: 900px;
41 | line-height: 1.5;
42 | `;
43 |
44 | export const PricingRight: React.FC = () => {
45 | return (
46 |
47 |
48 |
49 | Licensing
model
50 |
51 |
52 |
53 | with support, for companies with
3 or more people
54 |
55 |
56 | );
57 | };
58 |
--------------------------------------------------------------------------------
/src/PullRequest.tsx:
--------------------------------------------------------------------------------
1 | import {Img, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 | import pullRequest from './pull-request.png';
4 |
5 | const Container = styled.div`
6 | background-color: white;
7 | display: flex;
8 | flex: 1;
9 | justify-content: center;
10 | align-items: center;
11 | `;
12 |
13 | const Image = styled(Img)`
14 | width: 1300px;
15 | `;
16 |
17 | export const PullRequest: React.FC = () => {
18 | const {fps} = useVideoConfig();
19 | const frame = useCurrentFrame();
20 | const scale = spring({
21 | fps,
22 | frame,
23 | config: {
24 | damping: 200,
25 | },
26 | });
27 |
28 | return (
29 |
30 | console.log('loaded')}
36 | />
37 |
38 | );
39 | };
40 |
--------------------------------------------------------------------------------
/src/Qualities.tsx:
--------------------------------------------------------------------------------
1 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 |
4 | const ListItem = styled.div<{
5 | color1: string;
6 | color2: string;
7 | }>`
8 | font-size: 40px;
9 | line-height: 1.7;
10 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
11 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
12 | `;
13 |
14 | const Title = styled.div<{
15 | color1: string;
16 | color2: string;
17 | }>`
18 | font-weight: bold;
19 | font-size: 65px;
20 | line-height: 1.1;
21 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
22 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
23 | margin-bottom: 30px;
24 | white-space: pre;
25 | background: linear-gradient(
26 | to right,
27 | ${(props) => props.color1},
28 | ${(props) => props.color2}
29 | );
30 | -webkit-background-clip: text;
31 | -moz-background-clip: text;
32 | background-clip: text;
33 | -webkit-text-fill-color: transparent;
34 | -moz-text-fill-color: transparent;
35 | text-fill-color: transparent;
36 | `;
37 |
38 | export const Feature: React.FC<{
39 | index: number;
40 | fadeOutIndex: number;
41 | x: number;
42 | title: boolean;
43 | color1: string;
44 | color2: string;
45 | children: React.ReactNode;
46 | }> = ({children, index, title, fadeOutIndex, x, color1, color2}) => {
47 | const frame = useCurrentFrame();
48 | const {fps} = useVideoConfig();
49 | const progress = spring({
50 | fps,
51 | frame: frame - Number(index),
52 | config: {
53 | damping: 200,
54 | },
55 | });
56 | const translateY = interpolate(progress, [0, 1], [1000, 0]);
57 | const horizontalProgress = spring({
58 | fps,
59 | frame: frame - fadeOutIndex - 180,
60 | config: {
61 | damping: 200,
62 | },
63 | });
64 | const opacity = interpolate(horizontalProgress, [0, 0.7], [1, 0]);
65 | const translateX = interpolate(horizontalProgress, [0, 1], [0, x]);
66 |
67 | const Comp = title ? Title : ListItem;
68 | return (
69 |
77 | {children}
78 |
79 | );
80 | };
81 |
--------------------------------------------------------------------------------
/src/RemotionPlayerDemo.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import {Video} from 'remotion';
3 | import playerDemo from './remotion-player.webm';
4 |
5 | export const RemotionPlayerDemo: React.FC = () => {
6 | return (
7 |
16 |
17 |
18 | );
19 | };
20 |
--------------------------------------------------------------------------------
/src/SSRMultithreaded.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill} from 'remotion';
2 | import styled from 'styled-components';
3 | import {DockerIcon, Feature, GithubIcon, NodeIcon} from './Feature';
4 |
5 | const Container = styled(AbsoluteFill)`
6 | background-color: white;
7 | justify-content: center;
8 | align-items: center;
9 | `;
10 |
11 | export const Ssr: React.FC = () => {
12 | return (
13 |
14 | ,
20 | },
21 | {
22 | name: 'Docker',
23 | icon: ,
24 | },
25 | {
26 | name: 'Actions',
27 | icon: ,
28 | },
29 | ]}
30 | />
31 |
32 | );
33 | };
34 |
--------------------------------------------------------------------------------
/src/TeaseCodeFrame.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill, spring, useCurrentFrame, useVideoConfig} from 'remotion';
2 | import styled from 'styled-components';
3 | import {CodeFrame} from './CodeFrame';
4 |
5 | const code = `
6 | const Announcement: React.FC = () => {
7 | const release = new Date('2021-02-08 17:00 UTC');
8 | \n
9 | if (Date.now() < release.getTime()) {
10 | return null;
11 | }
12 | \n
13 | return (
14 | Introducing REMOTION ⚛️!
15 | );
16 | }`;
17 |
18 | const BlurryContainer = styled(AbsoluteFill)`
19 | .token.constant {
20 | background-color: rgba(0, 0, 0, 0.2);
21 | color: rgba(0, 0, 0, 0.2);
22 | -webkit-filter: blur(8px);
23 | }
24 | `;
25 |
26 | export const TeaserCodeFrame: React.FC = () => {
27 | const frame = useCurrentFrame();
28 | const {fps, durationInFrames} = useVideoConfig();
29 | const scale = spring({
30 | frame,
31 | fps,
32 | config: {
33 | damping: 200,
34 | },
35 | });
36 | const scaleOut = spring({
37 | frame: frame - durationInFrames + 13,
38 | fps,
39 | config: {
40 | mass: 0.4,
41 | damping: 100,
42 | },
43 | from: 0,
44 | to: 1,
45 | });
46 | return (
47 |
48 |
66 |
67 | );
68 | };
69 |
--------------------------------------------------------------------------------
/src/Terminal.tsx:
--------------------------------------------------------------------------------
1 | import 'hack-font/build/web/hack.css';
2 | import {interpolate, useCurrentFrame} from 'remotion';
3 | import styled from 'styled-components';
4 |
5 | const Container = styled.div`
6 | background-color: #252a2e;
7 | flex: 1;
8 | border-radius: 20px;
9 | padding-left: 60px;
10 | padding-top: 40px;
11 | font-family: Hack;
12 | color: white;
13 | font-size: 30px;
14 | line-height: 1.8;
15 | pre {
16 | margin: 0;
17 | }
18 | `;
19 |
20 | const command = 'npm run build';
21 |
22 | export const Terminal: React.FC = () => {
23 | const frame = useCurrentFrame();
24 | const npmStart = command.length + 2;
25 | const renderStart = npmStart + 3;
26 | const renderBars = 20;
27 | const renderProgress = interpolate(
28 | frame,
29 | [renderStart, renderStart + renderBars],
30 | [0, renderBars],
31 | {
32 | extrapolateLeft: 'clamp',
33 | extrapolateRight: 'clamp',
34 | }
35 | );
36 | const stitchStart = renderStart + renderBars;
37 | const readyStart = stitchStart + 3;
38 |
39 | return (
40 |
41 |
42 | ➜
43 | remotion-trailer
44 | {command.slice(0, frame)}
45 |
46 | {frame > npmStart ? (
47 | <>
48 |
49 | {'>'} remotion-template@1.0.0 build
50 | /Users/jonnyburger/remotion-trailer
51 |
52 | {'>'} ts-node render.ts HelloWorld out.mp4
53 |
54 | 📦 (1/3) Bundling video...
55 | >
56 | ) : null}
57 | {frame > renderStart ? (
58 | <>
59 |
60 | 📼 (2/3) Rendering frames{'...'.slice(0, frame - renderStart)}
61 |
62 | {renderProgress < renderBars ? (
63 |
64 | |{'='.repeat(renderProgress)}
65 | {' '.repeat(renderBars - renderProgress)}|{' '}
66 | {`(${renderProgress}/${renderBars})`}
67 |
68 | ) : null}
69 | >
70 | ) : null}
71 | {renderProgress === renderBars ? (
72 | <>
73 |
74 | 🧵 (3/3) Stitching frames together
75 | {'...'.slice(0, frame - stitchStart)}
76 |
{' '}
77 |
78 | >
79 | ) : null}
80 | {frame > readyStart ? (
81 | ▶️ Your video is now ready: out.mp4
82 | ) : null}
83 |
84 | );
85 | };
86 |
--------------------------------------------------------------------------------
/src/TerminalRender.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | Img,
3 | interpolate,
4 | spring,
5 | useCurrentFrame,
6 | useVideoConfig,
7 | } from 'remotion';
8 | import styled from 'styled-components';
9 | import {Terminal} from './Terminal';
10 | import fileicon from './videothumbnail.png';
11 |
12 | const Container = styled.div`
13 | background-color: white;
14 | flex: 1;
15 | display: flex;
16 | `;
17 |
18 | export const TerminalRender: React.FC = () => {
19 | const {width, height, fps} = useVideoConfig();
20 | const frame = useCurrentFrame();
21 | const progress = spring({
22 | fps,
23 | frame,
24 | config: {
25 | damping: 200,
26 | },
27 | });
28 | const fileProgress = spring({
29 | fps,
30 | frame: frame - 50,
31 | config: {
32 | damping: 200,
33 | },
34 | });
35 | const terminalScale = interpolate(progress, [0, 1], [0.8, 0.6]);
36 | const translateX = interpolate(fileProgress, [0, 1], [0, -600]);
37 | return (
38 |
39 |
49 |
50 |
51 |
62 |
63 | );
64 | };
65 |
--------------------------------------------------------------------------------
/src/Trailer.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill, Sequence} from 'remotion';
2 | import {Intro} from './Intro/Intro';
3 | import {Logo} from './Logo/Logo';
4 | import {TeaserCodeFrame} from './TeaseCodeFrame';
5 | import {Transition} from './Transition';
6 |
7 | export const Trailer: React.FC = () => {
8 | return (
9 |
10 |
11 |
12 |
13 |
14 |
15 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | );
30 | };
31 |
--------------------------------------------------------------------------------
/src/Transition.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import {
3 | AbsoluteFill,
4 | interpolate,
5 | spring,
6 | useCurrentFrame,
7 | useVideoConfig,
8 | } from 'remotion';
9 |
10 | export const Transition: React.FC<{
11 | type: 'in' | 'out';
12 | children: React.ReactNode;
13 | }> = ({type, children}) => {
14 | const frame = useCurrentFrame();
15 | const videoConfig = useVideoConfig();
16 |
17 | const firstFrame = videoConfig.durationInFrames - 9;
18 | const progress = spring({
19 | config: {
20 | damping: 80,
21 | },
22 | fps: videoConfig.fps,
23 | frame: type === 'in' ? frame : Math.max(0, frame - firstFrame),
24 | });
25 |
26 | const percent = interpolate(
27 | progress,
28 | [0, 1],
29 | type === 'in' ? [100, 0] : [0, 100]
30 | );
31 |
32 | return (
33 |
38 | {children}
39 |
40 | );
41 | };
42 |
--------------------------------------------------------------------------------
/src/Video.tsx:
--------------------------------------------------------------------------------
1 | import {Composition} from 'remotion';
2 | import {BestQualities} from './BestQualities';
3 | import {CodeFrame} from './CodeFrame';
4 | import {EndCard} from './EndCard';
5 | import {FastRefreshDemo} from './FastRefreshDemo';
6 | import {Fork} from './Fork';
7 | import {GoToGithub} from './GoToGithub';
8 | import {Howto} from './HowTo';
9 | import {InspectAndRefactor} from './InspectAndRefactor';
10 | import {Install} from './Install';
11 | import {Intro} from './Intro/Intro';
12 | import {Logo} from './Logo/Logo';
13 | import {Main} from './Main';
14 | import {Multithreaded} from './MultiThreaded';
15 | import {OpenSource} from './OpenSource';
16 | import {Pricing} from './Pricing';
17 | import {PullRequest} from './PullRequest';
18 | import {RemotionPlayerDemo} from './RemotionPlayerDemo';
19 | import {Ssr} from './SSRMultithreaded';
20 | import {TerminalRender} from './TerminalRender';
21 | import {Trailer} from './Trailer';
22 | import {Website} from './Website';
23 | import {WebTechnologies} from './WebTechnologies';
24 |
25 | export const RemotionVideo: React.FC = () => {
26 | return (
27 | <>
28 |
40 |
48 | {
59 | return (
60 |
68 | );
69 | }
70 |
71 | `.trim(),
72 | timing: [
73 | {
74 | line: 6,
75 | from: 0,
76 | },
77 | ],
78 | title: 'Video.tsx',
79 | }}
80 | />
81 |
89 |
97 |
109 |
122 |
130 |
138 |
146 |
154 |
162 |
170 |
178 |
186 |
194 |
202 |
210 |
218 |
226 |
234 |
235 |
243 | >
244 | );
245 | };
246 |
--------------------------------------------------------------------------------
/src/WebTechnologies.tsx:
--------------------------------------------------------------------------------
1 | import {chunk} from 'lodash';
2 | import {interpolate, spring, useCurrentFrame, useVideoConfig} from 'remotion';
3 | import styled from 'styled-components';
4 |
5 | interface Technology {
6 | name: string;
7 | color: string;
8 | }
9 |
10 | const Container = styled.div`
11 | padding: 100px;
12 | display: flex;
13 | justify-content: center;
14 | align-items: center;
15 | background-color: #fff;
16 | `;
17 |
18 | const Title = styled.div`
19 | font-weight: bold;
20 | font-size: 120px;
21 | line-height: 1em;
22 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
23 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
24 | `;
25 |
26 | const technologies: Technology[] = [
27 | {
28 | name: 'HTML',
29 | color: '#f16529',
30 | },
31 | {
32 | name: 'CSS',
33 | color: '#16a1dc',
34 | },
35 | {name: 'JS', color: '#fddc22'},
36 | {
37 | name: 'SVG',
38 | color: '#27ae60',
39 | },
40 | {
41 | name: 'Canvas',
42 | color: '#9b59b6',
43 | },
44 | {
45 | name: 'WebGL',
46 | color: '#91191e',
47 | },
48 | {
49 | name: 'Three.JS',
50 | color: '#000',
51 | },
52 | {
53 | name: 'styled-components',
54 | color: '#e59ad9',
55 | },
56 | {
57 | name: 'Tailwind',
58 | color: '#19b4b9',
59 | },
60 | {
61 | name: 'Bootstrap',
62 | color: '#573f7e',
63 | },
64 | {
65 | name: 'jQuery',
66 | color: '#0268ad',
67 | },
68 | ];
69 |
70 | export const WebTechnologies: React.FC = () => {
71 | const config = useVideoConfig();
72 | const frame = useCurrentFrame();
73 | const chunks = chunk(technologies, Math.ceil(technologies.length / 2));
74 | return (
75 |
76 |
77 | {chunks.map((ch) => {
78 | return (
79 |
80 | {ch.map((t, i) => {
81 | const pos = spring({
82 | fps: config.fps,
83 | frame: frame - i * 2,
84 | config: {
85 | stiffness: 100,
86 | mass: 0.5,
87 | damping: 50,
88 | },
89 | });
90 | return (
91 |
102 | {t.name}
103 |
104 | );
105 | })}
106 |
107 | );
108 | })}
109 |
110 |
111 | );
112 | };
113 |
--------------------------------------------------------------------------------
/src/Website.tsx:
--------------------------------------------------------------------------------
1 | import {AbsoluteFill, Img} from 'remotion';
2 | import styled from 'styled-components';
3 | import remotionWebsite from './remotion-website.png';
4 |
5 | const Container = styled(AbsoluteFill)`
6 | background-color: white;
7 | justify-content: center;
8 | align-items: center;
9 | `;
10 |
11 | const Subtitle = styled.div`
12 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,
13 | Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
14 | font-weight: 400;
15 | font-size: 65px;
16 | line-height: 1.5;
17 | font-weight: 700;
18 | text-align: center;
19 | `;
20 |
21 | export const Website: React.FC = () => {
22 | return (
23 |
24 | www.remotion.dev
25 |
26 |
27 |
28 |
29 | );
30 | };
31 |
--------------------------------------------------------------------------------
/src/YesThisWorks.tsx:
--------------------------------------------------------------------------------
1 | import './excalidraw-fonts.css';
2 |
3 | export const ExcalidrawYesThisWorks: React.FC = () => {
4 | return (
5 |
72 | );
73 | };
74 |
--------------------------------------------------------------------------------
/src/excalidraw-fonts.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'Virgil';
3 | src: url('./FG_Virgil.woff2');
4 | }
5 | @font-face {
6 | font-family: 'Cascadia';
7 | src: url('./Cascadia.woff2');
8 | }
9 |
--------------------------------------------------------------------------------
/src/fast-refresh-demo.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/fast-refresh-demo.webm
--------------------------------------------------------------------------------
/src/fork-trimmed.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/fork-trimmed.webm
--------------------------------------------------------------------------------
/src/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/github.png
--------------------------------------------------------------------------------
/src/index.tsx:
--------------------------------------------------------------------------------
1 | import {registerRoot} from 'remotion';
2 | import {RemotionVideo} from './Video';
3 |
4 | registerRoot(RemotionVideo);
5 |
--------------------------------------------------------------------------------
/src/inspect-and-refactor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/inspect-and-refactor.png
--------------------------------------------------------------------------------
/src/inspect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/inspect.png
--------------------------------------------------------------------------------
/src/prism.css:
--------------------------------------------------------------------------------
1 | code[class*='language-'],
2 | pre[class*='language-'] {
3 | color: #383a42;
4 | background: none;
5 | font-family: Hack;
6 | text-align: left;
7 | white-space: pre;
8 | word-spacing: normal;
9 | word-break: normal;
10 | word-wrap: normal;
11 | line-height: 1.5;
12 | -moz-tab-size: 4;
13 | -o-tab-size: 4;
14 | tab-size: 4;
15 | -webkit-hyphens: none;
16 | -moz-hyphens: none;
17 | -ms-hyphens: none;
18 | hyphens: none;
19 | }
20 | pre[class*='language-']::selection,
21 | pre[class*='language-'] ::selection,
22 | code[class*='language-']::selection,
23 | code[class*='language-'] ::selection,
24 | pre[class*='language-']::-moz-selection,
25 | pre[class*='language-'] ::-moz-selection,
26 | code[class*='language-']::-moz-selection,
27 | code[class*='language-'] ::-moz-selection {
28 | text-shadow: none;
29 | background: #e5e6e7;
30 | }
31 | @media print {
32 | code[class*='language-'],
33 | pre[class*='language-'] {
34 | text-shadow: none;
35 | }
36 | }
37 | pre[class*='language-'] {
38 | padding: 1em;
39 | margin: 0.5em 0;
40 | overflow: auto;
41 | }
42 | :not(pre) > code[class*='language-'],
43 | pre[class*='language-'] {
44 | background: #fff;
45 | }
46 | :not(pre) > code[class*='language-'] {
47 | padding: 0.1em;
48 | border-radius: 0.3em;
49 | white-space: normal;
50 | }
51 | .token.comment,
52 | .token.prolog,
53 | .token.doctype,
54 | .token.cdata {
55 | color: #a0a1a7;
56 | }
57 | .token.punctuation {
58 | color: #383a42;
59 | }
60 | .token.selector,
61 | .token.tag {
62 | color: #f07c85;
63 | }
64 | .token.property,
65 | .token.boolean,
66 | .token.number,
67 | .token.constant,
68 | .token.symbol,
69 | .token.attr-name,
70 | .token.deleted {
71 | color: #e1aa76;
72 | }
73 | .token.string,
74 | .token.char,
75 | .token.attr-value,
76 | .token.builtin,
77 | .token.inserted {
78 | color: #88b369;
79 | }
80 | .token.operator,
81 | .token.entity,
82 | .token.url,
83 | .language-css .token.string,
84 | .style .token.string {
85 | color: #46a6b2;
86 | }
87 | .token.function {
88 | color: #519fdf;
89 | }
90 | .token.atrule,
91 | .token.keyword,
92 | .token.regex,
93 | .token.important,
94 | .token.variable {
95 | color: #b668cd;
96 | }
97 | .token.important,
98 | .token.bold {
99 | font-weight: bold;
100 | }
101 | .token.italic {
102 | font-style: italic;
103 | }
104 | .token.entity {
105 | cursor: help;
106 | }
107 | pre.line-numbers {
108 | position: relative;
109 | padding-left: 3.8em;
110 | counter-reset: linenumber;
111 | }
112 | pre.line-numbers > code {
113 | position: relative;
114 | }
115 | .line-numbers .line-numbers-rows {
116 | position: absolute;
117 | pointer-events: none;
118 | top: 0;
119 | font-size: 100%;
120 | left: -3.8em;
121 | width: 3em;
122 | letter-spacing: -1px;
123 | border-right: 0;
124 | -webkit-user-select: none;
125 | -moz-user-select: none;
126 | -ms-user-select: none;
127 | user-select: none;
128 | }
129 | .line-numbers-rows > span {
130 | pointer-events: none;
131 | display: block;
132 | counter-increment: linenumber;
133 | }
134 | .line-numbers-rows > span:before {
135 | content: counter(linenumber);
136 | color: #b5b9c2;
137 | display: block;
138 | padding-right: 0.8em;
139 | text-align: right;
140 | }
141 | code.language-css,
142 | pre.languagecss {
143 | color: #ca1243;
144 | }
145 | code.language-javascript,
146 | pre.languagejavascript {
147 | color: #ca1243;
148 | }
149 | code.language-js,
150 | pre.languagejs {
151 | color: #ca1243;
152 | }
153 | code.language-jsx,
154 | pre.languagejsx {
155 | color: #ca1243;
156 | }
157 | code.language-sass,
158 | pre.languagesass {
159 | color: #ca1243;
160 | }
161 | code.language-scss,
162 | pre.languagescss {
163 | color: #ca1243;
164 | }
165 | code.language-ts,
166 | pre.languagets {
167 | color: #ca1243;
168 | }
169 | code.language-tsx,
170 | pre.languagetsx {
171 | color: #ca1243;
172 | }
173 | code.language-typescript,
174 | pre.languagetypescript {
175 | color: #ca1243;
176 | }
177 |
--------------------------------------------------------------------------------
/src/pull-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/pull-request.png
--------------------------------------------------------------------------------
/src/remotion-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/remotion-logo.png
--------------------------------------------------------------------------------
/src/remotion-player.webm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/remotion-player.webm
--------------------------------------------------------------------------------
/src/remotion-website.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/remotion-website.png
--------------------------------------------------------------------------------
/src/videothumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/videothumbnail.png
--------------------------------------------------------------------------------
/src/voiceover-no-music.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/src/voiceover-no-music.mp3
--------------------------------------------------------------------------------
/trailer.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/remotion-dev/trailer/63c2a66f2c7780f64c85c26e5f872daa31d9545c/trailer.mp4
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2018",
4 | "module": "commonjs",
5 | "jsx": "react-jsx",
6 | "outDir": "./dist",
7 | "strict": true,
8 | "noEmit": true,
9 | "lib": ["es2015", "DOM"],
10 | "esModuleInterop": true,
11 | "skipLibCheck": true,
12 | "forceConsistentCasingInFileNames": true
13 | }
14 | }
15 |
--------------------------------------------------------------------------------