@remotion/promo-pages 4.0.260 → 5.0.0-canary.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Homepage.js +2 -4
- package/package.json +52 -48
- package/.turbo/turbo-lint.log +0 -5
- package/.turbo/turbo-make.log +0 -8
- package/LICENSE.md +0 -49
- package/bundle.ts +0 -46
- package/eslint.config.mjs +0 -7
- package/index.html +0 -13
- package/public/fire.mp3 +0 -0
- package/public/img/cluster.png +0 -0
- package/public/img/code-sample-new.png +0 -0
- package/public/img/freelancers/alex.jpeg +0 -0
- package/public/img/freelancers/antoine.jpeg +0 -0
- package/public/img/freelancers/ayush.png +0 -0
- package/public/img/freelancers/benjamin.jpeg +0 -0
- package/public/img/freelancers/default.png +0 -0
- package/public/img/freelancers/florent.jpeg +0 -0
- package/public/img/freelancers/karel.jpeg +0 -0
- package/public/img/freelancers/lorenzo.jpeg +0 -0
- package/public/img/freelancers/mickael.jpeg +0 -0
- package/public/img/freelancers/mohit.jpeg +0 -0
- package/public/img/freelancers/pramod.jpg +0 -0
- package/public/img/freelancers/pranav.jpg +0 -0
- package/public/img/freelancers/rahul.png +0 -0
- package/public/img/freelancers/ray.jpeg +0 -0
- package/public/img/freelancers/stephen.png +0 -0
- package/public/img/freelancers/umungo.png +0 -0
- package/public/img/freelancers/yehor.jpeg +0 -0
- package/public/img/gt-planar-black.woff2 +0 -0
- package/public/img/gt-planar-bold.woff2 +0 -0
- package/public/img/gt-planar-medium.woff2 +0 -0
- package/public/img/gt-planar-regular.woff2 +0 -0
- package/public/img/logo-small.png +0 -0
- package/public/img/mp4.png +0 -0
- package/public/img/player-demo.mp4 +0 -0
- package/public/img/player-example-dark.png +0 -0
- package/public/img/player-example.png +0 -0
- package/public/img/writeinreact.png +0 -0
- package/public/partyhorn.mp3 +0 -0
- package/public/sad.mp3 +0 -0
- package/src/cn.ts +0 -6
- package/src/components/Homepage.tsx +0 -88
- package/src/components/homepage/BackgroundAnimation.tsx +0 -108
- package/src/components/homepage/ChooseTemplate.tsx +0 -57
- package/src/components/homepage/CodeExample.tsx +0 -89
- package/src/components/homepage/CommunityStats.tsx +0 -54
- package/src/components/homepage/CommunityStatsItems.tsx +0 -304
- package/src/components/homepage/Counter.tsx +0 -110
- package/src/components/homepage/Demo/Card.tsx +0 -273
- package/src/components/homepage/Demo/Cards.tsx +0 -129
- package/src/components/homepage/Demo/Comp.tsx +0 -157
- package/src/components/homepage/Demo/CurrentCountry.tsx +0 -97
- package/src/components/homepage/Demo/DemoError.tsx +0 -18
- package/src/components/homepage/Demo/DemoErrorIcon.tsx +0 -32
- package/src/components/homepage/Demo/DemoRender.tsx +0 -166
- package/src/components/homepage/Demo/DigitWheel.tsx +0 -179
- package/src/components/homepage/Demo/DisplayedEmoji.tsx +0 -81
- package/src/components/homepage/Demo/DoneCheckmark.tsx +0 -39
- package/src/components/homepage/Demo/DownloadNudge.tsx +0 -62
- package/src/components/homepage/Demo/DragAndDropNudge.tsx +0 -57
- package/src/components/homepage/Demo/EmojiCard.tsx +0 -198
- package/src/components/homepage/Demo/Minus.tsx +0 -21
- package/src/components/homepage/Demo/PlayPauseButton.tsx +0 -66
- package/src/components/homepage/Demo/PlayerControls.tsx +0 -48
- package/src/components/homepage/Demo/PlayerSeekBar.tsx +0 -325
- package/src/components/homepage/Demo/PlayerVolume.tsx +0 -83
- package/src/components/homepage/Demo/Progress.tsx +0 -38
- package/src/components/homepage/Demo/Spinner.tsx +0 -60
- package/src/components/homepage/Demo/Switcher.tsx +0 -54
- package/src/components/homepage/Demo/Temperature.tsx +0 -44
- package/src/components/homepage/Demo/TemperatureNumber.tsx +0 -68
- package/src/components/homepage/Demo/ThemeNudge.tsx +0 -72
- package/src/components/homepage/Demo/TimeDisplay.tsx +0 -43
- package/src/components/homepage/Demo/TrendingRepos.tsx +0 -106
- package/src/components/homepage/Demo/icons.tsx +0 -114
- package/src/components/homepage/Demo/index.tsx +0 -158
- package/src/components/homepage/Demo/math.ts +0 -43
- package/src/components/homepage/Demo/types.ts +0 -6
- package/src/components/homepage/Editor.tsx +0 -67
- package/src/components/homepage/EvaluateRemotion.tsx +0 -92
- package/src/components/homepage/FreePricing.tsx +0 -295
- package/src/components/homepage/GetStartedStrip.tsx +0 -77
- package/src/components/homepage/GitHubButton.tsx +0 -23
- package/src/components/homepage/IconForTemplate.tsx +0 -154
- package/src/components/homepage/IfYouKnowReact.tsx +0 -29
- package/src/components/homepage/InfoTooltip.tsx +0 -25
- package/src/components/homepage/MoreTemplatesButton.tsx +0 -29
- package/src/components/homepage/MuxVideo.tsx +0 -68
- package/src/components/homepage/NewsletterButton.tsx +0 -88
- package/src/components/homepage/Pricing.tsx +0 -49
- package/src/components/homepage/PricingBulletPoint.tsx +0 -50
- package/src/components/homepage/RealMp4Videos.tsx +0 -50
- package/src/components/homepage/Spacer.tsx +0 -5
- package/src/components/homepage/TemplateIcon.tsx +0 -36
- package/src/components/homepage/TextInput.tsx +0 -62
- package/src/components/homepage/TrustedByBanner.tsx +0 -194
- package/src/components/homepage/VideoApps.tsx +0 -231
- package/src/components/homepage/VideoAppsShowcase.tsx +0 -276
- package/src/components/homepage/VideoAppsTitle.tsx +0 -24
- package/src/components/homepage/VideoPlayerWithControls.tsx +0 -188
- package/src/components/homepage/WriteInReact.tsx +0 -34
- package/src/components/homepage/YouAreHere.tsx +0 -30
- package/src/components/homepage/custom.css +0 -57
- package/src/components/homepage/layout/Button.tsx +0 -93
- package/src/components/homepage/layout/colors.ts +0 -17
- package/src/components/homepage/layout/use-color-mode.tsx +0 -44
- package/src/components/homepage/layout/use-el-size.ts +0 -51
- package/src/components/homepage/layout/use-mobile-layout.ts +0 -8
- package/src/components/homepage/video-player.css +0 -24
- package/src/components/icons/blank.tsx +0 -13
- package/src/components/icons/clone.tsx +0 -10
- package/src/components/icons/code-hike.tsx +0 -15
- package/src/components/icons/cubes.tsx +0 -13
- package/src/components/icons/js.tsx +0 -17
- package/src/components/icons/next.tsx +0 -64
- package/src/components/icons/overlay.tsx +0 -24
- package/src/components/icons/remix.tsx +0 -24
- package/src/components/icons/skia.tsx +0 -13
- package/src/components/icons/stargazer.tsx +0 -13
- package/src/components/icons/still.tsx +0 -13
- package/src/components/icons/tailwind.tsx +0 -22
- package/src/components/icons/tiktok.tsx +0 -13
- package/src/components/icons/ts.tsx +0 -18
- package/src/components/icons/tts.tsx +0 -13
- package/src/components/icons/undo.tsx +0 -11
- package/src/components/icons/waveform.tsx +0 -13
- package/src/fonts.css +0 -30
- package/src/index.css +0 -74
- package/src/main.tsx +0 -12
- package/tsconfig.json +0 -15
- package/vite.config.ts +0 -9
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import React, {useState} from 'react';
|
|
2
|
-
import {GithubButton} from './GitHubButton';
|
|
3
|
-
import {PlainButton} from './layout/Button';
|
|
4
|
-
|
|
5
|
-
export const GetStarted: React.FC = () => {
|
|
6
|
-
const [clicked, setClicked] = useState<number | null>(null);
|
|
7
|
-
|
|
8
|
-
return (
|
|
9
|
-
<div className="flex flex-col lg:flex-row items-center justify-center text-center w-full">
|
|
10
|
-
<div className="w-full lg:w-auto">
|
|
11
|
-
<div className="flex flex-row w-full ">
|
|
12
|
-
{clicked ? (
|
|
13
|
-
<div
|
|
14
|
-
key={clicked}
|
|
15
|
-
style={{
|
|
16
|
-
animation: 'click 0.7s linear',
|
|
17
|
-
animationFillMode: 'forwards',
|
|
18
|
-
}}
|
|
19
|
-
className="absolute z-0 top-0 font-mono text-sm text-center w-full"
|
|
20
|
-
>
|
|
21
|
-
Copied!
|
|
22
|
-
</div>
|
|
23
|
-
) : null}
|
|
24
|
-
<div
|
|
25
|
-
className="bg-[#333] text-white rounded-lg px-4 font-mono hover:[#444] cursor-pointer justify-center items-center flex flex-1 min-h-12"
|
|
26
|
-
onClick={() => {
|
|
27
|
-
navigator.clipboard.writeText('npx create-video@latest');
|
|
28
|
-
|
|
29
|
-
setClicked(Date.now());
|
|
30
|
-
}}
|
|
31
|
-
title="Click to copy"
|
|
32
|
-
>
|
|
33
|
-
$ npx create-video@latest
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
</div>
|
|
37
|
-
<div className="w-2 h-2" />
|
|
38
|
-
<div className="w-full lg:w-auto">
|
|
39
|
-
<a
|
|
40
|
-
className={'no-underline w-full block'}
|
|
41
|
-
href="https://www.youtube.com/watch?v=deg8bOoziaE"
|
|
42
|
-
target="_blank"
|
|
43
|
-
>
|
|
44
|
-
<PlainButton size="sm" loading={false} className="w-full">
|
|
45
|
-
Watch demo
|
|
46
|
-
</PlainButton>
|
|
47
|
-
</a>
|
|
48
|
-
</div>
|
|
49
|
-
<div style={{width: 10, height: 10}} />
|
|
50
|
-
<a className={'no-underline w-full lg:w-auto'} href="/docs">
|
|
51
|
-
<PlainButton size="sm" loading={false} className="w-full">
|
|
52
|
-
Docs
|
|
53
|
-
</PlainButton>
|
|
54
|
-
</a>
|
|
55
|
-
<div className="w-2 h-2" />
|
|
56
|
-
<a
|
|
57
|
-
className="no-underline w-full lg:w-auto"
|
|
58
|
-
href="https://remotion.dev/discord"
|
|
59
|
-
target="_blank"
|
|
60
|
-
>
|
|
61
|
-
<PlainButton size="sm" loading={false} className="w-full">
|
|
62
|
-
Discord
|
|
63
|
-
</PlainButton>
|
|
64
|
-
</a>
|
|
65
|
-
<div className="w-2 h-2" />
|
|
66
|
-
<a
|
|
67
|
-
className="no-underline w-full lg:w-auto"
|
|
68
|
-
href="https://github.com/remotion-dev/remotion"
|
|
69
|
-
target="_blank"
|
|
70
|
-
>
|
|
71
|
-
<PlainButton size="sm" loading={false} className="w-full">
|
|
72
|
-
<GithubButton />
|
|
73
|
-
</PlainButton>
|
|
74
|
-
</a>
|
|
75
|
-
</div>
|
|
76
|
-
);
|
|
77
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
const GithubIcon: React.FC = () => {
|
|
4
|
-
return (
|
|
5
|
-
<svg viewBox="0 0 496 512" style={{height: 24, marginRight: 8}}>
|
|
6
|
-
<path
|
|
7
|
-
fill="currentColor"
|
|
8
|
-
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"
|
|
9
|
-
/>
|
|
10
|
-
</svg>
|
|
11
|
-
);
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
export const GithubButton: React.FC = () => {
|
|
15
|
-
return (
|
|
16
|
-
<div className="flex flex-row items-center text-base">
|
|
17
|
-
<GithubIcon /> <span>GitHub</span>{' '}
|
|
18
|
-
<div className="text-xs inline-block ml-2 leading-none mt-[3px] self-center">
|
|
19
|
-
{'21k'}
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
);
|
|
23
|
-
};
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import type {Template} from 'create-video';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import {Blank} from '../icons/blank';
|
|
4
|
-
import {CodeHike} from '../icons/code-hike';
|
|
5
|
-
import {Cubes} from '../icons/cubes';
|
|
6
|
-
import {JSIcon} from '../icons/js';
|
|
7
|
-
import {NextIcon} from '../icons/next';
|
|
8
|
-
import {OverlayIcon} from '../icons/overlay';
|
|
9
|
-
import {RemixIcon} from '../icons/remix';
|
|
10
|
-
import {SkiaIcon} from '../icons/skia';
|
|
11
|
-
import {Stargazer} from '../icons/stargazer';
|
|
12
|
-
import {StillIcon} from '../icons/still';
|
|
13
|
-
import {TikTok} from '../icons/tiktok';
|
|
14
|
-
import {TypeScriptIcon} from '../icons/ts';
|
|
15
|
-
import {TTSIcon} from '../icons/tts';
|
|
16
|
-
import {Waveform} from '../icons/waveform';
|
|
17
|
-
|
|
18
|
-
export const IconForTemplate: React.FC<{
|
|
19
|
-
readonly template: Template;
|
|
20
|
-
readonly scale: number;
|
|
21
|
-
}> = ({template, scale = 1}) => {
|
|
22
|
-
if (template.cliId === 'hello-world') {
|
|
23
|
-
return (
|
|
24
|
-
<TypeScriptIcon
|
|
25
|
-
style={{
|
|
26
|
-
height: scale * 48,
|
|
27
|
-
}}
|
|
28
|
-
/>
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (template.cliId === 'blank') {
|
|
33
|
-
return (
|
|
34
|
-
<Blank
|
|
35
|
-
style={{
|
|
36
|
-
height: scale * 36,
|
|
37
|
-
overflow: 'visible',
|
|
38
|
-
}}
|
|
39
|
-
/>
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (template.cliId === 'javascript') {
|
|
44
|
-
return (
|
|
45
|
-
<JSIcon
|
|
46
|
-
style={{
|
|
47
|
-
height: scale * 40,
|
|
48
|
-
}}
|
|
49
|
-
/>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (template.cliId === 'three') {
|
|
54
|
-
return (
|
|
55
|
-
<Cubes
|
|
56
|
-
style={{
|
|
57
|
-
height: scale * 36,
|
|
58
|
-
}}
|
|
59
|
-
/>
|
|
60
|
-
);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (template.cliId === 'still') {
|
|
64
|
-
return (
|
|
65
|
-
<StillIcon
|
|
66
|
-
style={{
|
|
67
|
-
height: scale * 36,
|
|
68
|
-
}}
|
|
69
|
-
/>
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (template.cliId === 'audiogram') {
|
|
74
|
-
return (
|
|
75
|
-
<Waveform
|
|
76
|
-
style={{
|
|
77
|
-
height: scale * 36,
|
|
78
|
-
}}
|
|
79
|
-
/>
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (template.cliId === 'tts') {
|
|
84
|
-
return (
|
|
85
|
-
<TTSIcon
|
|
86
|
-
style={{
|
|
87
|
-
height: scale * 36,
|
|
88
|
-
}}
|
|
89
|
-
/>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (template.cliId === 'google-tts') {
|
|
94
|
-
return (
|
|
95
|
-
<TTSIcon
|
|
96
|
-
style={{
|
|
97
|
-
height: scale * 36,
|
|
98
|
-
}}
|
|
99
|
-
/>
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (template.cliId === 'skia') {
|
|
104
|
-
return (
|
|
105
|
-
<SkiaIcon
|
|
106
|
-
style={{
|
|
107
|
-
height: scale * 32,
|
|
108
|
-
}}
|
|
109
|
-
/>
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
if (template.cliId === 'remix') {
|
|
114
|
-
return (
|
|
115
|
-
<RemixIcon
|
|
116
|
-
style={{
|
|
117
|
-
height: scale * 32,
|
|
118
|
-
}}
|
|
119
|
-
/>
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (template.cliId === 'overlay') {
|
|
124
|
-
return <OverlayIcon style={{height: scale * 42}} />;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (
|
|
128
|
-
template.cliId === 'next' ||
|
|
129
|
-
template.cliId === 'next-tailwind' ||
|
|
130
|
-
template.cliId === 'next-pages-dir'
|
|
131
|
-
) {
|
|
132
|
-
return <NextIcon style={{height: scale * 36}} />;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (template.cliId === 'stargazer') {
|
|
136
|
-
return <Stargazer style={{height: scale * 36}} />;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (template.cliId === 'tiktok') {
|
|
140
|
-
return <TikTok style={{height: scale * 36}} />;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
if (template.cliId === 'code-hike') {
|
|
144
|
-
return <CodeHike style={{height: scale * 36}} />;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return (
|
|
148
|
-
<Blank
|
|
149
|
-
style={{
|
|
150
|
-
height: scale * 40,
|
|
151
|
-
}}
|
|
152
|
-
/>
|
|
153
|
-
);
|
|
154
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {CodeExample} from './CodeExample';
|
|
3
|
-
import {BlueButton} from './layout/Button';
|
|
4
|
-
|
|
5
|
-
export const IfYouKnowReact: React.FC = () => {
|
|
6
|
-
return (
|
|
7
|
-
<div className="flex flex-col-reverse lg:flex-row text-left lg:text-right justify-start lg:justify-end items-start lg:items-center">
|
|
8
|
-
<CodeExample />
|
|
9
|
-
<div className="h-10 lg:w-10" />
|
|
10
|
-
<div className="lg:text-right">
|
|
11
|
-
<h2 className="text-4xl fontbrand">
|
|
12
|
-
Leverage <span className="text-brand">React</span> <br />
|
|
13
|
-
to express yourself.
|
|
14
|
-
</h2>
|
|
15
|
-
<p className="leading-relaxed">
|
|
16
|
-
Remotion gives you the tools for video creation, <br /> but the rules
|
|
17
|
-
of React stay the same. <br />
|
|
18
|
-
</p>
|
|
19
|
-
Learn the fundamentals in just a few minutes.
|
|
20
|
-
<div className="h-7" />
|
|
21
|
-
<a className="no-underline inline-block" href="/docs/the-fundamentals">
|
|
22
|
-
<BlueButton size="sm" loading={false}>
|
|
23
|
-
Learn Remotion
|
|
24
|
-
</BlueButton>
|
|
25
|
-
</a>
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
);
|
|
29
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import React, {useState} from 'react';
|
|
2
|
-
|
|
3
|
-
interface InfoTooltipProps {
|
|
4
|
-
readonly text: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export const InfoTooltip: React.FC<InfoTooltipProps> = ({text}) => {
|
|
8
|
-
const [isVisible, setIsVisible] = useState(false);
|
|
9
|
-
|
|
10
|
-
return (
|
|
11
|
-
<span
|
|
12
|
-
className="relative inline-block ml-1 text-gray-600 cursor-default"
|
|
13
|
-
onMouseEnter={() => setIsVisible(true)}
|
|
14
|
-
onMouseLeave={() => setIsVisible(false)}
|
|
15
|
-
>
|
|
16
|
-
<span style={{fontSize: '1rem'}}>ⓘ</span>
|
|
17
|
-
{isVisible && (
|
|
18
|
-
<span className="absolute bottom-full left-1/2 transform -translate-x-1/2 bg-gray-800 text-white p-2 rounded text-xs whitespace-nowrap z-10 cursor-default">
|
|
19
|
-
{text}
|
|
20
|
-
<span className="absolute top-full left-1/2 transform -translate-x-1/2 border-5 border-solid border-gray-800 border-t-transparent border-r-transparent border-b-transparent border-l-transparent cursor-default" />
|
|
21
|
-
</span>
|
|
22
|
-
)}
|
|
23
|
-
</span>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {useMobileLayout} from './layout/use-mobile-layout';
|
|
3
|
-
|
|
4
|
-
const icon: React.CSSProperties = {
|
|
5
|
-
height: 16,
|
|
6
|
-
marginLeft: 10,
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export const MoreTemplatesButton: React.FC = () => {
|
|
10
|
-
const mobileLayout = useMobileLayout();
|
|
11
|
-
|
|
12
|
-
return (
|
|
13
|
-
<a href="/templates" className="no-underline text-inherit">
|
|
14
|
-
<div className="right-0 border-2 rounded-full text-inherit px-4 py-2 fontbrand font-semibold text-sm flex flex-row items-center">
|
|
15
|
-
{mobileLayout ? 'Templates' : 'Find a template'}
|
|
16
|
-
<svg
|
|
17
|
-
style={icon}
|
|
18
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
19
|
-
viewBox="0 0 448 512"
|
|
20
|
-
>
|
|
21
|
-
<path
|
|
22
|
-
fill="currentColor"
|
|
23
|
-
d="M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
|
|
24
|
-
/>
|
|
25
|
-
</svg>
|
|
26
|
-
</div>
|
|
27
|
-
</a>
|
|
28
|
-
);
|
|
29
|
-
};
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import Hls from 'hls.js';
|
|
2
|
-
import React, {forwardRef, useEffect, useImperativeHandle, useRef} from 'react';
|
|
3
|
-
import {VideoPlayerWithControls} from './VideoPlayerWithControls';
|
|
4
|
-
|
|
5
|
-
const getVideoToPlayUrl = (muxId: string) => {
|
|
6
|
-
return `https://stream.mux.com/${muxId}.m3u8`;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
const MuxVideoForward: React.ForwardRefRenderFunction<
|
|
10
|
-
HTMLVideoElement,
|
|
11
|
-
React.DetailedHTMLProps<
|
|
12
|
-
React.VideoHTMLAttributes<HTMLVideoElement>,
|
|
13
|
-
HTMLVideoElement
|
|
14
|
-
> & {
|
|
15
|
-
readonly muxId: string;
|
|
16
|
-
}
|
|
17
|
-
> = ({muxId, ...props}, ref) => {
|
|
18
|
-
const videoRef = useRef<HTMLVideoElement>(null);
|
|
19
|
-
const vidUrl = getVideoToPlayUrl(muxId);
|
|
20
|
-
|
|
21
|
-
useImperativeHandle(ref, () => videoRef.current!, []);
|
|
22
|
-
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
let hls: Hls;
|
|
25
|
-
if (videoRef.current) {
|
|
26
|
-
const {current} = videoRef;
|
|
27
|
-
if (current.canPlayType('application/vnd.apple.mpegurl')) {
|
|
28
|
-
// Some browers (safari and ie edge) support HLS natively
|
|
29
|
-
current.src = vidUrl;
|
|
30
|
-
} else if (Hls.isSupported()) {
|
|
31
|
-
// This will run in all other modern browsers
|
|
32
|
-
hls = new Hls();
|
|
33
|
-
hls.loadSource(vidUrl);
|
|
34
|
-
hls.attachMedia(current);
|
|
35
|
-
} else {
|
|
36
|
-
// eslint-disable-next-line no-console
|
|
37
|
-
console.error("This is a legacy browser that doesn't support MSE");
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return () => {
|
|
42
|
-
if (hls) {
|
|
43
|
-
hls.destroy();
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
}, [vidUrl, videoRef]);
|
|
47
|
-
|
|
48
|
-
return <video ref={videoRef} {...props} />;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
export const MuxVideo = forwardRef(MuxVideoForward);
|
|
52
|
-
|
|
53
|
-
export const NewMuxVideo: React.FC<{
|
|
54
|
-
readonly muxId: string;
|
|
55
|
-
}> = ({muxId}) => {
|
|
56
|
-
return (
|
|
57
|
-
<VideoPlayerWithControls
|
|
58
|
-
playbackId={muxId}
|
|
59
|
-
poster={'https://image.mux.com/' + muxId + '/thumbnail.png?time=1'}
|
|
60
|
-
onError={(error) => {
|
|
61
|
-
// eslint-disable-next-line no-console
|
|
62
|
-
console.log(error);
|
|
63
|
-
}}
|
|
64
|
-
onLoaded={() => undefined}
|
|
65
|
-
onSize={() => undefined}
|
|
66
|
-
/>
|
|
67
|
-
);
|
|
68
|
-
};
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import React, {useCallback, useState} from 'react';
|
|
2
|
-
import {BlueButton} from './layout/Button';
|
|
3
|
-
import {Spacer} from './Spacer';
|
|
4
|
-
|
|
5
|
-
export const NewsletterButton: React.FC<{}> = () => {
|
|
6
|
-
const [email, setEmail] = useState('');
|
|
7
|
-
const [submitting, setSubmitting] = useState(false);
|
|
8
|
-
const [subscribed, setSubscribed] = useState(false);
|
|
9
|
-
|
|
10
|
-
const handleSubmit = useCallback(
|
|
11
|
-
async (e: React.FormEvent<HTMLFormElement>) => {
|
|
12
|
-
try {
|
|
13
|
-
setSubmitting(true);
|
|
14
|
-
e.preventDefault();
|
|
15
|
-
|
|
16
|
-
const response = await fetch(
|
|
17
|
-
'https://www.remotion.pro/api/newsletter',
|
|
18
|
-
{
|
|
19
|
-
method: 'POST',
|
|
20
|
-
body: JSON.stringify({email}),
|
|
21
|
-
headers: {
|
|
22
|
-
'content-type': 'application/json',
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
);
|
|
26
|
-
const json = await response.json();
|
|
27
|
-
if (json.success) {
|
|
28
|
-
setSubscribed(true);
|
|
29
|
-
} else {
|
|
30
|
-
// eslint-disable-next-line no-alert
|
|
31
|
-
alert('Something went wrong. Please try again later.');
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
setSubmitting(false);
|
|
35
|
-
} catch {
|
|
36
|
-
// eslint-disable-next-line no-alert
|
|
37
|
-
alert('Something went wrong. Please try again later.');
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
[email],
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<div>
|
|
45
|
-
<div className="flex flex-col">
|
|
46
|
-
<div className={'w-full'}>
|
|
47
|
-
<div className={'border-effect bg-pane flex flex-col flex-1 p-5'}>
|
|
48
|
-
<div className={'text-2xl font-bold fontbrand'}>Newsletter</div>
|
|
49
|
-
<form
|
|
50
|
-
onSubmit={handleSubmit}
|
|
51
|
-
style={{
|
|
52
|
-
width: '100%',
|
|
53
|
-
}}
|
|
54
|
-
>
|
|
55
|
-
<p className="leading-snug mt-1 text-muted fontbrand">
|
|
56
|
-
Read about new features and noteworthy updates we have made on
|
|
57
|
-
Remotion once in a while.
|
|
58
|
-
</p>
|
|
59
|
-
|
|
60
|
-
<input
|
|
61
|
-
className="w-full rounded-lg border-effect border-black outline-none px-3 py-3 fontbrand text-lg box-border focus:border-brand"
|
|
62
|
-
disabled={submitting}
|
|
63
|
-
value={email}
|
|
64
|
-
onChange={(e) => setEmail(e.target.value)}
|
|
65
|
-
type={'email'}
|
|
66
|
-
required
|
|
67
|
-
placeholder="animator@gmail.com"
|
|
68
|
-
/>
|
|
69
|
-
<Spacer />
|
|
70
|
-
<Spacer />
|
|
71
|
-
<div>
|
|
72
|
-
<BlueButton
|
|
73
|
-
type="submit"
|
|
74
|
-
className="w-full"
|
|
75
|
-
loading={submitting}
|
|
76
|
-
disabled={submitting || subscribed}
|
|
77
|
-
size="sm"
|
|
78
|
-
>
|
|
79
|
-
{subscribed ? 'Subscribed!' : 'Subscribe'}
|
|
80
|
-
</BlueButton>
|
|
81
|
-
</div>
|
|
82
|
-
</form>
|
|
83
|
-
</div>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
);
|
|
88
|
-
};
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {CompanyPricing, EnterpriseLicense, FreePricing} from './FreePricing';
|
|
3
|
-
|
|
4
|
-
export const Pricing: React.FC = () => {
|
|
5
|
-
return (
|
|
6
|
-
<div
|
|
7
|
-
style={{
|
|
8
|
-
display: 'flex',
|
|
9
|
-
flexDirection: 'column',
|
|
10
|
-
gap: 20,
|
|
11
|
-
marginBottom: 40,
|
|
12
|
-
}}
|
|
13
|
-
>
|
|
14
|
-
<FreePricing />
|
|
15
|
-
<CompanyPricing />
|
|
16
|
-
<EnterpriseLicense />
|
|
17
|
-
<div
|
|
18
|
-
style={{
|
|
19
|
-
justifyContent: 'center',
|
|
20
|
-
display: 'flex',
|
|
21
|
-
}}
|
|
22
|
-
>
|
|
23
|
-
<div
|
|
24
|
-
style={{
|
|
25
|
-
fontFamily: 'GTPlanar',
|
|
26
|
-
}}
|
|
27
|
-
>
|
|
28
|
-
See our{' '}
|
|
29
|
-
<a
|
|
30
|
-
target="_blank"
|
|
31
|
-
className="bluelink"
|
|
32
|
-
href="https://remotion.pro/faq"
|
|
33
|
-
>
|
|
34
|
-
FAQ
|
|
35
|
-
</a>{' '}
|
|
36
|
-
and{' '}
|
|
37
|
-
<a
|
|
38
|
-
target="_blank"
|
|
39
|
-
className="bluelink"
|
|
40
|
-
href="https://www.remotion.pro/terms"
|
|
41
|
-
>
|
|
42
|
-
Terms and Conditions
|
|
43
|
-
</a>{' '}
|
|
44
|
-
for more details.
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
);
|
|
49
|
-
};
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
const container: React.CSSProperties = {
|
|
4
|
-
display: 'flex',
|
|
5
|
-
flexDirection: 'row',
|
|
6
|
-
alignItems: 'center',
|
|
7
|
-
gap: '10px',
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
const greyCircle: React.CSSProperties = {
|
|
11
|
-
width: 20,
|
|
12
|
-
height: 20,
|
|
13
|
-
borderRadius: 10,
|
|
14
|
-
backgroundColor: 'var(--footer-border)',
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export const PricingBulletPoint: React.FC<{
|
|
18
|
-
readonly text: React.ReactNode;
|
|
19
|
-
readonly checked: boolean;
|
|
20
|
-
readonly children?: React.ReactNode;
|
|
21
|
-
}> = ({text, checked, children}) => {
|
|
22
|
-
const checkmarkSVG = (
|
|
23
|
-
<svg
|
|
24
|
-
width="20"
|
|
25
|
-
height="20"
|
|
26
|
-
viewBox="0 0 20 20"
|
|
27
|
-
fill="none"
|
|
28
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
29
|
-
style={{
|
|
30
|
-
flexShrink: 0,
|
|
31
|
-
}}
|
|
32
|
-
>
|
|
33
|
-
<circle cx="10" cy="10" r="10" fill="#0B84F3" />
|
|
34
|
-
<path
|
|
35
|
-
d="M14.7908 7.20505C15.0697 7.47844 15.0697 7.92243 14.7908 8.19583L9.07711 13.795C8.79813 14.0683 8.34505 14.0683 8.06606 13.795L5.20924 10.9954C4.93025 10.722 4.93025 10.278 5.20924 10.0046C5.48823 9.73121 5.9413 9.73121 6.22029 10.0046L8.5727 12.3077L13.7819 7.20505C14.0609 6.93165 14.514 6.93165 14.793 7.20505H14.7908Z"
|
|
36
|
-
fill="white"
|
|
37
|
-
/>
|
|
38
|
-
</svg>
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<div style={container}>
|
|
43
|
-
{checked ? checkmarkSVG : <div style={greyCircle} />}
|
|
44
|
-
<div className={'fontbrand text-lg '}>
|
|
45
|
-
{text}
|
|
46
|
-
{children}
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
);
|
|
50
|
-
};
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import React, {useCallback, useEffect, useRef, useState} from 'react';
|
|
2
|
-
|
|
3
|
-
export const RealMP4Videos: React.FC = () => {
|
|
4
|
-
const ref = useRef<HTMLDivElement>(null);
|
|
5
|
-
const [isIntersecting, setIsIntersecting] = useState(false);
|
|
6
|
-
|
|
7
|
-
const callback: IntersectionObserverCallback = useCallback((data) => {
|
|
8
|
-
setIsIntersecting(data[0].isIntersecting);
|
|
9
|
-
}, []);
|
|
10
|
-
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
const {current} = ref;
|
|
13
|
-
if (!current) {
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const observer = new IntersectionObserver(callback, {
|
|
18
|
-
root: null,
|
|
19
|
-
threshold: 0.5,
|
|
20
|
-
});
|
|
21
|
-
observer.observe(current);
|
|
22
|
-
|
|
23
|
-
return () => observer.unobserve(current);
|
|
24
|
-
}, [callback]);
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<div ref={ref} className={'flex flex-col lg:flex-row'}>
|
|
28
|
-
<div>
|
|
29
|
-
<h2 className="text-4xl fontbrand">
|
|
30
|
-
Real <span className={'text-brand'}>.mp4</span> videos
|
|
31
|
-
</h2>
|
|
32
|
-
<p className="leading-relaxed">
|
|
33
|
-
Remotion renders all frames to images and <br /> encodes them to a
|
|
34
|
-
real video - audio support included. <br /> WebM and other formats are
|
|
35
|
-
also supported.
|
|
36
|
-
</p>
|
|
37
|
-
</div>
|
|
38
|
-
<div className="flex flex-1 justify-start lg:justify-end items-end">
|
|
39
|
-
<img
|
|
40
|
-
src="/img/mp4.png"
|
|
41
|
-
className="mb-[30px] lg:mb-0"
|
|
42
|
-
style={{
|
|
43
|
-
width: 110,
|
|
44
|
-
animationPlayState: isIntersecting ? 'running' : 'paused',
|
|
45
|
-
}}
|
|
46
|
-
/>
|
|
47
|
-
</div>
|
|
48
|
-
</div>
|
|
49
|
-
);
|
|
50
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {useMobileLayout} from './layout/use-mobile-layout';
|
|
3
|
-
|
|
4
|
-
const icon: React.CSSProperties = {
|
|
5
|
-
display: 'flex',
|
|
6
|
-
width: 36,
|
|
7
|
-
height: 36,
|
|
8
|
-
justifyContent: 'center',
|
|
9
|
-
alignItems: 'center',
|
|
10
|
-
margin: 0,
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const outer: React.CSSProperties = {
|
|
14
|
-
textAlign: 'center',
|
|
15
|
-
display: 'flex',
|
|
16
|
-
alignItems: 'center',
|
|
17
|
-
flexDirection: 'column',
|
|
18
|
-
color: 'var(--ifm-font-color-base)',
|
|
19
|
-
cursor: 'pointer',
|
|
20
|
-
filter: 'drop-shadow(0px 0px 4px var(--background))',
|
|
21
|
-
textDecoration: 'none',
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export const TemplateIcon: React.FC<{
|
|
25
|
-
readonly label: string;
|
|
26
|
-
readonly children: React.ReactNode;
|
|
27
|
-
}> = ({children, label}) => {
|
|
28
|
-
const mobileLayout = useMobileLayout();
|
|
29
|
-
|
|
30
|
-
return (
|
|
31
|
-
<span style={outer}>
|
|
32
|
-
<div style={icon}>{children}</div>
|
|
33
|
-
{mobileLayout ? null : <div className="text-xs fontbrand">{label}</div>}
|
|
34
|
-
</span>
|
|
35
|
-
);
|
|
36
|
-
};
|