@remotion/promo-pages 4.0.314 → 4.0.317
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/.turbo/turbo-make.log +2 -2
- package/dist/Homepage.js +11958 -12155
- package/dist/components/Homepage.js +4 -4
- package/dist/components/homepage/BackgroundAnimation.js +1 -1
- package/dist/components/homepage/CommunityStats.js +1 -1
- package/dist/components/homepage/CommunityStatsItems.js +1 -1
- package/dist/components/homepage/Counter.d.ts +1 -0
- package/dist/components/homepage/Counter.js +15 -7
- package/dist/components/homepage/Demo/DisplayedEmoji.js +17 -3
- package/dist/components/homepage/FreePricing.js +20 -25
- package/dist/components/homepage/GitHubButton.js +1 -1
- package/dist/components/homepage/IconForTemplate.js +4 -0
- package/dist/components/homepage/IfYouKnowReact.js +5 -2
- package/dist/components/homepage/MoreVideoPowerSection.d.ts +2 -0
- package/dist/components/homepage/MoreVideoPowerSection.js +16 -0
- package/dist/components/homepage/NewsletterButton.js +3 -2
- package/dist/components/homepage/ParameterizeAndEdit.d.ts +2 -0
- package/dist/components/homepage/ParameterizeAndEdit.js +22 -0
- package/dist/components/homepage/RealMp4Videos.js +10 -1
- package/dist/components/homepage/VideoAppsShowcase.js +6 -3
- package/dist/components/homepage/VideoAppsTitle.d.ts +0 -1
- package/dist/components/homepage/VideoAppsTitle.js +1 -4
- package/dist/components/icons/recorder.d.ts +3 -0
- package/dist/components/icons/recorder.js +4 -0
- package/dist/homepage/Pricing.js +131 -90
- package/dist/tailwind.css +115 -55
- package/package.json +10 -10
- package/public/img/editing-safari.mp4 +0 -0
- package/public/img/editing-vp9-chrome.webm +0 -0
- package/public/img/media-parser.png +0 -0
- package/public/img/recorder.png +0 -0
- package/public/img/webcodecs.png +0 -0
- package/src/components/Homepage.tsx +12 -12
- package/src/components/homepage/CommunityStats.tsx +1 -1
- package/src/components/homepage/Counter.tsx +17 -7
- package/src/components/homepage/Demo/DisplayedEmoji.tsx +22 -4
- package/src/components/homepage/FreePricing.tsx +88 -65
- package/src/components/homepage/IconForTemplate.tsx +5 -0
- package/src/components/homepage/IfYouKnowReact.tsx +26 -14
- package/src/components/homepage/MoreVideoPowerSection.tsx +95 -0
- package/src/components/homepage/NewsletterButton.tsx +6 -5
- package/src/components/homepage/ParameterizeAndEdit.tsx +89 -0
- package/src/components/homepage/RealMp4Videos.tsx +55 -13
- package/src/components/homepage/VideoAppsShowcase.tsx +21 -10
- package/src/components/homepage/VideoAppsTitle.tsx +0 -13
- package/src/components/icons/recorder.tsx +23 -0
- package/dist/components/homepage/Editor.d.ts +0 -2
- package/dist/components/homepage/Editor.js +0 -37
- package/public/img/player-demo.mp4 +0 -0
- package/src/components/homepage/Editor.tsx +0 -67
|
@@ -65,7 +65,7 @@ const SmallPriceTag: React.FC<{
|
|
|
65
65
|
return (
|
|
66
66
|
<div
|
|
67
67
|
className={
|
|
68
|
-
'fontbrand text-2xl font-medium w-auto min-w-[80px] text-right shrink-0
|
|
68
|
+
'fontbrand text-2xl font-medium w-auto min-w-[80px] text-right shrink-0'
|
|
69
69
|
}
|
|
70
70
|
>
|
|
71
71
|
{children}
|
|
@@ -137,10 +137,15 @@ const SEAT_PRICE = 25;
|
|
|
137
137
|
const RENDER_UNIT_PRICE = 10;
|
|
138
138
|
const WEBCODECS_UNIT_PRICE = 10;
|
|
139
139
|
|
|
140
|
+
const icon: React.CSSProperties = {
|
|
141
|
+
height: 16,
|
|
142
|
+
marginLeft: 4,
|
|
143
|
+
};
|
|
144
|
+
|
|
140
145
|
export const CompanyPricing: React.FC = () => {
|
|
141
146
|
const [devSeatCount, setDevSeatCount] = React.useState(1);
|
|
142
|
-
const [
|
|
143
|
-
const [
|
|
147
|
+
const [cloudRenders, setCloudRenders] = React.useState(1000);
|
|
148
|
+
const [creations, setCreations] = React.useState(1000);
|
|
144
149
|
|
|
145
150
|
const formatPrice = useCallback((price: number) => {
|
|
146
151
|
const formatter = new Intl.NumberFormat('en-US', {
|
|
@@ -155,29 +160,15 @@ export const CompanyPricing: React.FC = () => {
|
|
|
155
160
|
return Math.max(
|
|
156
161
|
100,
|
|
157
162
|
devSeatCount * SEAT_PRICE +
|
|
158
|
-
|
|
159
|
-
|
|
163
|
+
(cloudRenders / 1000) * RENDER_UNIT_PRICE +
|
|
164
|
+
(creations / 1000) * WEBCODECS_UNIT_PRICE,
|
|
160
165
|
);
|
|
161
|
-
}, [
|
|
166
|
+
}, [cloudRenders, devSeatCount, creations]);
|
|
162
167
|
|
|
163
168
|
const totalPriceString = useMemo(() => {
|
|
164
169
|
return formatPrice(totalPrice);
|
|
165
170
|
}, [formatPrice, totalPrice]);
|
|
166
171
|
|
|
167
|
-
const rendersPerMonth = useMemo(() => {
|
|
168
|
-
const formatter = new Intl.NumberFormat('en-US', {
|
|
169
|
-
maximumFractionDigits: 0,
|
|
170
|
-
});
|
|
171
|
-
return formatter.format(cloudUnitCount * 1000);
|
|
172
|
-
}, [cloudUnitCount]);
|
|
173
|
-
|
|
174
|
-
const conversionsPerMonth = useMemo(() => {
|
|
175
|
-
const formatter = new Intl.NumberFormat('en-US', {
|
|
176
|
-
maximumFractionDigits: 0,
|
|
177
|
-
});
|
|
178
|
-
return formatter.format(webcodecsUnits * 1000);
|
|
179
|
-
}, [webcodecsUnits]);
|
|
180
|
-
|
|
181
172
|
return (
|
|
182
173
|
<Container>
|
|
183
174
|
<Audience>For collaborations and companies of 4+ people</Audience>
|
|
@@ -189,80 +180,87 @@ export const CompanyPricing: React.FC = () => {
|
|
|
189
180
|
<InfoTooltip text="Credits for Mux.com. Applies only to new Mux customers." />
|
|
190
181
|
</PricingBulletPoint>
|
|
191
182
|
<div style={{height: 30}} />
|
|
192
|
-
<div className={'flex flex-row items-center'}>
|
|
183
|
+
<div className={'flex flex-col md:flex-row md:items-center'}>
|
|
193
184
|
<div style={textUnitWrapper}>
|
|
194
185
|
<div className={'fontbrand font-bold text-lg'}>Developer Seats</div>
|
|
195
186
|
<div className={'text-muted fontbrand text-sm'}>
|
|
196
187
|
Number of developers working with Remotion
|
|
197
188
|
</div>
|
|
198
189
|
</div>
|
|
199
|
-
<div style={{flex: 3}} />
|
|
200
|
-
<
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
190
|
+
<div style={{flex: 3}} className="hidden md:block" />
|
|
191
|
+
<div className="flex flex-row items-center justify-between mt-3 md:mt-0">
|
|
192
|
+
<Counter
|
|
193
|
+
count={devSeatCount}
|
|
194
|
+
setCount={setDevSeatCount}
|
|
195
|
+
minCount={1}
|
|
196
|
+
/>
|
|
197
|
+
<SmallPriceTag>
|
|
198
|
+
$
|
|
199
|
+
{new Intl.NumberFormat('en-US', {
|
|
200
|
+
maximumFractionDigits: 0,
|
|
201
|
+
}).format(SEAT_PRICE * devSeatCount)}
|
|
202
|
+
</SmallPriceTag>
|
|
203
|
+
</div>
|
|
207
204
|
</div>
|
|
208
205
|
<div style={{height: 14}} />
|
|
209
|
-
<div className={'flex flex-row items-center'}>
|
|
206
|
+
<div className={'flex flex-col md:flex-row md:items-center'}>
|
|
210
207
|
<div style={textUnitWrapper}>
|
|
211
|
-
<div className={'fontbrand font-bold text-lg'}>
|
|
212
|
-
Cloud Rendering Units
|
|
213
|
-
</div>
|
|
208
|
+
<div className={'fontbrand font-bold text-lg'}>Server renders</div>
|
|
214
209
|
<div className={'text-muted fontbrand text-sm'}>
|
|
215
|
-
Allows for {rendersPerMonth}{' '}
|
|
216
210
|
<a
|
|
217
211
|
href="https://www.remotion.dev/docs/compare-ssr"
|
|
218
212
|
className="underline underline-offset-4 text-inherit"
|
|
219
213
|
>
|
|
220
|
-
|
|
221
|
-
</a>
|
|
222
|
-
each
|
|
214
|
+
Renders per month (self-hosted)
|
|
215
|
+
</a>
|
|
223
216
|
</div>
|
|
224
217
|
</div>
|
|
225
|
-
<div style={{flex: 3}} />
|
|
226
|
-
<
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
218
|
+
<div style={{flex: 3}} className="hidden md:block" />
|
|
219
|
+
<div className="flex flex-row items-center justify-between mt-3 md:mt-0">
|
|
220
|
+
<Counter
|
|
221
|
+
count={cloudRenders}
|
|
222
|
+
setCount={setCloudRenders}
|
|
223
|
+
minCount={0}
|
|
224
|
+
step={1000}
|
|
225
|
+
/>
|
|
226
|
+
<SmallPriceTag>
|
|
227
|
+
$
|
|
228
|
+
{new Intl.NumberFormat('en-US', {
|
|
229
|
+
maximumFractionDigits: 0,
|
|
230
|
+
}).format((cloudRenders / 1000) * RENDER_UNIT_PRICE)}
|
|
231
|
+
</SmallPriceTag>
|
|
232
|
+
</div>
|
|
237
233
|
</div>
|
|
238
234
|
<div style={{height: 14}} />
|
|
239
|
-
<div className={'flex flex-row items-center'}>
|
|
235
|
+
<div className={'flex flex-col md:flex-row md:items-center'}>
|
|
240
236
|
<div style={textUnitWrapper}>
|
|
241
237
|
<div className={'fontbrand font-bold text-lg'}>
|
|
242
|
-
WebCodecs
|
|
238
|
+
WebCodecs video creations
|
|
243
239
|
</div>
|
|
244
240
|
<div className={'text-muted fontbrand text-sm'}>
|
|
245
|
-
Allows for{' '}
|
|
246
241
|
<a
|
|
247
242
|
className="underline underline-offset-4 text-inherit"
|
|
248
243
|
href="https://remotion.dev/webcodecs"
|
|
249
244
|
>
|
|
250
|
-
|
|
245
|
+
Client-side video creations per month
|
|
251
246
|
</a>
|
|
252
247
|
</div>
|
|
253
248
|
</div>
|
|
254
|
-
<div style={{flex: 3}} />
|
|
255
|
-
<
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
249
|
+
<div style={{flex: 3}} className="hidden md:block" />
|
|
250
|
+
<div className="flex flex-row items-center justify-between mt-3 md:mt-0">
|
|
251
|
+
<Counter
|
|
252
|
+
count={creations}
|
|
253
|
+
setCount={setCreations}
|
|
254
|
+
minCount={0}
|
|
255
|
+
step={1000}
|
|
256
|
+
/>
|
|
257
|
+
<SmallPriceTag>
|
|
258
|
+
$
|
|
259
|
+
{new Intl.NumberFormat('en-US', {
|
|
260
|
+
maximumFractionDigits: 0,
|
|
261
|
+
}).format((creations / 1000) * WEBCODECS_UNIT_PRICE)}
|
|
262
|
+
</SmallPriceTag>
|
|
263
|
+
</div>
|
|
266
264
|
</div>
|
|
267
265
|
<div style={{height: 20}} />
|
|
268
266
|
<div className={'flex flex-row justify-end'}>
|
|
@@ -276,6 +274,31 @@ export const CompanyPricing: React.FC = () => {
|
|
|
276
274
|
</BottomInfo>
|
|
277
275
|
</div>
|
|
278
276
|
</div>
|
|
277
|
+
<div className={'flex flex-row justify-end mt-4'}>
|
|
278
|
+
<div
|
|
279
|
+
style={{
|
|
280
|
+
...textUnitWrapper,
|
|
281
|
+
alignItems: 'flex-end',
|
|
282
|
+
}}
|
|
283
|
+
>
|
|
284
|
+
<a
|
|
285
|
+
href="https://remotion.pro/dashboard"
|
|
286
|
+
className="font-brand text-brand flex flex-row items-center gap-1 no-underline"
|
|
287
|
+
>
|
|
288
|
+
Buy now{' '}
|
|
289
|
+
<svg
|
|
290
|
+
style={icon}
|
|
291
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
292
|
+
viewBox="0 0 448 512"
|
|
293
|
+
>
|
|
294
|
+
<path
|
|
295
|
+
fill="currentColor"
|
|
296
|
+
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"
|
|
297
|
+
/>
|
|
298
|
+
</svg>
|
|
299
|
+
</a>
|
|
300
|
+
</div>
|
|
301
|
+
</div>
|
|
279
302
|
</Container>
|
|
280
303
|
);
|
|
281
304
|
};
|
|
@@ -7,6 +7,7 @@ import {JSIcon} from '../icons/js';
|
|
|
7
7
|
import {MusicIcon} from '../icons/music';
|
|
8
8
|
import {NextIcon} from '../icons/next';
|
|
9
9
|
import {OverlayIcon} from '../icons/overlay';
|
|
10
|
+
import {Recorder} from '../icons/recorder';
|
|
10
11
|
import {ReactRouterIcon} from '../icons/remix';
|
|
11
12
|
import {SkiaIcon} from '../icons/skia';
|
|
12
13
|
import {Stargazer} from '../icons/stargazer';
|
|
@@ -135,6 +136,10 @@ export const IconForTemplate: React.FC<{
|
|
|
135
136
|
return <OverlayIcon style={{height: scale * 42}} />;
|
|
136
137
|
}
|
|
137
138
|
|
|
139
|
+
if (template.cliId === 'recorder') {
|
|
140
|
+
return <Recorder style={{height: scale * 36}} />;
|
|
141
|
+
}
|
|
142
|
+
|
|
138
143
|
if (
|
|
139
144
|
template.cliId === 'next' ||
|
|
140
145
|
template.cliId === 'next-tailwind' ||
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import React, {useEffect, useState} from 'react';
|
|
2
|
-
import {BlueButton} from './layout/Button';
|
|
3
2
|
|
|
4
3
|
export const isWebkit = () => {
|
|
5
4
|
if (typeof window === 'undefined') {
|
|
@@ -14,6 +13,11 @@ export const isWebkit = () => {
|
|
|
14
13
|
return isSafariUserAgent || isChrome;
|
|
15
14
|
};
|
|
16
15
|
|
|
16
|
+
const icon: React.CSSProperties = {
|
|
17
|
+
height: 16,
|
|
18
|
+
marginLeft: 10,
|
|
19
|
+
};
|
|
20
|
+
|
|
17
21
|
export const IfYouKnowReact: React.FC = () => {
|
|
18
22
|
const [vid, setVid] = useState('/img/compose.webm');
|
|
19
23
|
|
|
@@ -24,31 +28,39 @@ export const IfYouKnowReact: React.FC = () => {
|
|
|
24
28
|
}, []);
|
|
25
29
|
|
|
26
30
|
return (
|
|
27
|
-
<div className="flex flex-col lg:flex-row text-left
|
|
31
|
+
<div className="flex flex-col lg:flex-row text-left justify-start lg:justify-end items-start lg:mb-0 gap-6 mt-8">
|
|
28
32
|
<video
|
|
29
33
|
src={vid}
|
|
30
34
|
muted
|
|
31
35
|
autoPlay
|
|
32
36
|
playsInline
|
|
33
37
|
loop
|
|
34
|
-
className="w-[
|
|
38
|
+
className="w-[500px] cursor-default! relative lg:-translate-x-8 -mb-40 lg:mt-0 lg:mb-0"
|
|
35
39
|
/>
|
|
36
|
-
<div
|
|
37
|
-
<div className="lg:text-right">
|
|
40
|
+
<div>
|
|
38
41
|
<h2 className="text-4xl fontbrand pt-20">
|
|
39
|
-
<span className="text-brand">Compose</span>
|
|
40
|
-
<br />
|
|
41
|
-
video with code.
|
|
42
|
+
<span className="text-brand">Compose</span> with code
|
|
42
43
|
</h2>
|
|
43
|
-
<p className="leading-relaxed">
|
|
44
|
+
<p className="leading-relaxed font-brand">
|
|
44
45
|
Use React, a powerful frontend technology, to create sophisticated
|
|
45
46
|
videos with code.
|
|
46
47
|
</p>
|
|
47
|
-
<div className="h-
|
|
48
|
-
<a
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
<div className="h-4" />
|
|
49
|
+
<a
|
|
50
|
+
className="no-underline text-brand font-brand font-bold inline-flex flex-row items-center"
|
|
51
|
+
href="/docs/the-fundamentals"
|
|
52
|
+
>
|
|
53
|
+
Learn Remotion{' '}
|
|
54
|
+
<svg
|
|
55
|
+
style={icon}
|
|
56
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
57
|
+
viewBox="0 0 448 512"
|
|
58
|
+
>
|
|
59
|
+
<path
|
|
60
|
+
fill="currentColor"
|
|
61
|
+
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"
|
|
62
|
+
/>
|
|
63
|
+
</svg>
|
|
52
64
|
</a>
|
|
53
65
|
</div>
|
|
54
66
|
</div>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const StepTitle: React.FC<{
|
|
4
|
+
readonly children: React.ReactNode;
|
|
5
|
+
}> = ({children}) => {
|
|
6
|
+
return (
|
|
7
|
+
<div className="text-left text-xl font-semibold fontbrand">{children}</div>
|
|
8
|
+
);
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const Subtitle: React.FC<{
|
|
12
|
+
readonly children: React.ReactNode;
|
|
13
|
+
}> = ({children}) => {
|
|
14
|
+
return (
|
|
15
|
+
<div className="text-left text-base fontbrand text-[var(--subtitle)]">
|
|
16
|
+
{children}
|
|
17
|
+
</div>
|
|
18
|
+
);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const Pane: React.FC<{
|
|
22
|
+
readonly children: React.ReactNode;
|
|
23
|
+
readonly className?: string;
|
|
24
|
+
}> = ({children, className}) => {
|
|
25
|
+
return (
|
|
26
|
+
<div
|
|
27
|
+
className={`border-effect bg-pane flex-1 flex flex-col ${className || ''}`}
|
|
28
|
+
>
|
|
29
|
+
{children}
|
|
30
|
+
</div>
|
|
31
|
+
);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const FeatureCard: React.FC<{
|
|
35
|
+
readonly title: string;
|
|
36
|
+
readonly subtitle: string;
|
|
37
|
+
readonly image: string;
|
|
38
|
+
readonly link: string;
|
|
39
|
+
}> = ({title, subtitle, image, link}) => {
|
|
40
|
+
return (
|
|
41
|
+
<a
|
|
42
|
+
href={link}
|
|
43
|
+
className="group lg:border-r-2 border-b lg:border-b-0 border-[var(--border)] cursor-pointer hover:bg-[var(--hover)] transition-colors no-underline text-inherit"
|
|
44
|
+
>
|
|
45
|
+
<div className="relative">
|
|
46
|
+
<img src={image} alt={title} className="w-full h-auto" />
|
|
47
|
+
</div>
|
|
48
|
+
<div className="p-4">
|
|
49
|
+
<div className="flex items-center gap-2">
|
|
50
|
+
<StepTitle>{title}</StepTitle>
|
|
51
|
+
<svg
|
|
52
|
+
width="16"
|
|
53
|
+
viewBox="0 0 448 512"
|
|
54
|
+
fill="currentColor"
|
|
55
|
+
className="opacity-0 group-hover:opacity-100 transition-opacity"
|
|
56
|
+
>
|
|
57
|
+
<path d="M438.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-160-160c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.8 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l306.7 0L233.4 393.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l160-160z" />
|
|
58
|
+
</svg>
|
|
59
|
+
</div>
|
|
60
|
+
<Subtitle>{subtitle}</Subtitle>
|
|
61
|
+
<br />
|
|
62
|
+
<div className="flex-1" />
|
|
63
|
+
</div>
|
|
64
|
+
</a>
|
|
65
|
+
);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const MoreVideoPowerSection: React.FC = () => {
|
|
69
|
+
return (
|
|
70
|
+
<div className="w-full">
|
|
71
|
+
<Pane className="overflow-hidden">
|
|
72
|
+
<div className="grid grid-cols-1 lg:grid-cols-3 h-full">
|
|
73
|
+
<FeatureCard
|
|
74
|
+
title="Media Parser"
|
|
75
|
+
subtitle="A new multimedia library for the web"
|
|
76
|
+
image="/img/media-parser.png"
|
|
77
|
+
link="/media-parser"
|
|
78
|
+
/>
|
|
79
|
+
<FeatureCard
|
|
80
|
+
title="WebCodecs"
|
|
81
|
+
subtitle="Read, process, transform and create videos on the frontend"
|
|
82
|
+
image="/img/webcodecs.png"
|
|
83
|
+
link="/webcodecs"
|
|
84
|
+
/>
|
|
85
|
+
<FeatureCard
|
|
86
|
+
title="Recorder"
|
|
87
|
+
subtitle="Produce engaging screencasts end-to-end in JavaScript"
|
|
88
|
+
image="/img/recorder.png"
|
|
89
|
+
link="/recorder"
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
</Pane>
|
|
93
|
+
</div>
|
|
94
|
+
);
|
|
95
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React, {useCallback, useState} from 'react';
|
|
2
2
|
import {BlueButton} from './layout/Button';
|
|
3
3
|
import {Spacer} from './Spacer';
|
|
4
|
+
import {SectionTitle} from './VideoAppsTitle';
|
|
4
5
|
|
|
5
6
|
export const NewsletterButton: React.FC<{}> = () => {
|
|
6
7
|
const [email, setEmail] = useState('');
|
|
@@ -44,18 +45,18 @@ export const NewsletterButton: React.FC<{}> = () => {
|
|
|
44
45
|
<div>
|
|
45
46
|
<div className="flex flex-col">
|
|
46
47
|
<div className={'w-full'}>
|
|
47
|
-
<div className={'
|
|
48
|
-
<
|
|
48
|
+
<div className={'flex flex-col flex-1'}>
|
|
49
|
+
<SectionTitle>Newsletter</SectionTitle>
|
|
49
50
|
<form
|
|
50
51
|
onSubmit={handleSubmit}
|
|
51
52
|
style={{
|
|
52
53
|
width: '100%',
|
|
53
54
|
}}
|
|
54
55
|
>
|
|
55
|
-
<
|
|
56
|
+
<div className={'fontbrand text-center mb-10 -mt-4'}>
|
|
56
57
|
Read about new features and noteworthy updates we have made on
|
|
57
|
-
Remotion once in a while.
|
|
58
|
-
</
|
|
58
|
+
Remotion once in a while.{' '}
|
|
59
|
+
</div>
|
|
59
60
|
|
|
60
61
|
<input
|
|
61
62
|
className="w-full dark:bg-[#121212] rounded-lg border-effect border-black outline-none px-3 py-3 fontbrand text-lg box-border focus:border-brand"
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import React, {useEffect, useRef, useState} from 'react';
|
|
2
|
+
import {isWebkit} from './IfYouKnowReact';
|
|
3
|
+
|
|
4
|
+
const icon: React.CSSProperties = {
|
|
5
|
+
height: 16,
|
|
6
|
+
marginLeft: 10,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const ParameterizeAndEdit: React.FC = () => {
|
|
10
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
11
|
+
const [vid, setVid] = useState('/img/editing-vp9-chrome.webm');
|
|
12
|
+
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (isWebkit()) {
|
|
15
|
+
setVid('/img/editing-safari.mp4');
|
|
16
|
+
}
|
|
17
|
+
}, []);
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
ref={ref}
|
|
22
|
+
className={
|
|
23
|
+
'flex flex-col lg:flex-row justify-start lg:justify-end items-start gap-6 mt-20 lg:mt-0'
|
|
24
|
+
}
|
|
25
|
+
>
|
|
26
|
+
<div>
|
|
27
|
+
<video
|
|
28
|
+
src={vid}
|
|
29
|
+
autoPlay
|
|
30
|
+
muted
|
|
31
|
+
playsInline
|
|
32
|
+
loop
|
|
33
|
+
style={{
|
|
34
|
+
width: 500,
|
|
35
|
+
maxWidth: '100%',
|
|
36
|
+
borderRadius: 7,
|
|
37
|
+
overflow: 'hidden',
|
|
38
|
+
}}
|
|
39
|
+
/>
|
|
40
|
+
</div>
|
|
41
|
+
<div style={{flex: 1}} className="font-brand pt-4">
|
|
42
|
+
<h2 className={'fontbrand text-4xl'}>
|
|
43
|
+
Edit <span className="text-brand">dynamically</span>
|
|
44
|
+
</h2>
|
|
45
|
+
<p className="leading-relaxed">
|
|
46
|
+
Parameterize your video by passing data.
|
|
47
|
+
<br />
|
|
48
|
+
Or embed it into your app and build an interface around it.
|
|
49
|
+
</p>
|
|
50
|
+
<div className="h-4" />
|
|
51
|
+
<div className="leading-6">
|
|
52
|
+
<a
|
|
53
|
+
className="no-underline text-brand font-brand font-bold inline-flex flex-row items-center"
|
|
54
|
+
href="/docs/studio"
|
|
55
|
+
>
|
|
56
|
+
Remotion Studio{' '}
|
|
57
|
+
<svg
|
|
58
|
+
style={icon}
|
|
59
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
60
|
+
viewBox="0 0 448 512"
|
|
61
|
+
>
|
|
62
|
+
<path
|
|
63
|
+
fill="currentColor"
|
|
64
|
+
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"
|
|
65
|
+
/>
|
|
66
|
+
</svg>
|
|
67
|
+
</a>
|
|
68
|
+
<br />
|
|
69
|
+
<a
|
|
70
|
+
className="no-underline text-brand font-brand font-bold inline-flex flex-row items-center"
|
|
71
|
+
href="/player"
|
|
72
|
+
>
|
|
73
|
+
Remotion Player{' '}
|
|
74
|
+
<svg
|
|
75
|
+
style={icon}
|
|
76
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
77
|
+
viewBox="0 0 448 512"
|
|
78
|
+
>
|
|
79
|
+
<path
|
|
80
|
+
fill="currentColor"
|
|
81
|
+
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"
|
|
82
|
+
/>
|
|
83
|
+
</svg>
|
|
84
|
+
</a>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
};
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import React, {useEffect, useRef, useState} from 'react';
|
|
2
2
|
import {isWebkit} from './IfYouKnowReact';
|
|
3
3
|
|
|
4
|
+
const icon: React.CSSProperties = {
|
|
5
|
+
height: 16,
|
|
6
|
+
marginLeft: 10,
|
|
7
|
+
};
|
|
8
|
+
|
|
4
9
|
export const RealMP4Videos: React.FC = () => {
|
|
5
10
|
const ref = useRef<HTMLDivElement>(null);
|
|
6
11
|
const videoRef = useRef<HTMLVideoElement>(null);
|
|
@@ -35,11 +40,8 @@ export const RealMP4Videos: React.FC = () => {
|
|
|
35
40
|
}, []);
|
|
36
41
|
|
|
37
42
|
return (
|
|
38
|
-
<div
|
|
39
|
-
|
|
40
|
-
className={'flex flex-col lg:flex-row-reverse items-center mt-20 lg:mt-0'}
|
|
41
|
-
>
|
|
42
|
-
<div className="flex flex-1 justify-start lg:justify-end items-end">
|
|
43
|
+
<div ref={ref} className={'flex flex-col lg:flex-row mt-40 lg:mt-30 gap-6'}>
|
|
44
|
+
<div className="flex w-[500px] justify-start lg:justify-start items-end">
|
|
43
45
|
<video
|
|
44
46
|
ref={videoRef}
|
|
45
47
|
src={vid}
|
|
@@ -47,19 +49,59 @@ export const RealMP4Videos: React.FC = () => {
|
|
|
47
49
|
autoPlay
|
|
48
50
|
playsInline
|
|
49
51
|
loop
|
|
50
|
-
style={{
|
|
51
|
-
|
|
52
|
+
style={{
|
|
53
|
+
width: 400,
|
|
54
|
+
maxWidth: '100%',
|
|
55
|
+
borderRadius: 7,
|
|
56
|
+
overflow: 'hidden',
|
|
57
|
+
}}
|
|
58
|
+
className="w-[550px] cursor-default! relative lg:translate-x-8 -mt-20 lg:mt-0"
|
|
52
59
|
/>
|
|
53
60
|
</div>{' '}
|
|
54
|
-
<div>
|
|
61
|
+
<div className="font-brand">
|
|
55
62
|
<h2 className="text-4xl fontbrand">
|
|
56
|
-
|
|
63
|
+
<span className={'text-brand'}>Scalable</span> rendering
|
|
57
64
|
</h2>
|
|
58
65
|
<p className="leading-relaxed">
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
Render the video .mp4 or other formats. <br />
|
|
67
|
+
Locally, on the server or serverless.
|
|
68
|
+
</p>{' '}
|
|
69
|
+
<div className="h-4" />
|
|
70
|
+
<div className="leading-6">
|
|
71
|
+
<a
|
|
72
|
+
className="no-underline text-brand font-brand font-bold inline-flex flex-row items-center"
|
|
73
|
+
href="/docs/render"
|
|
74
|
+
>
|
|
75
|
+
Render options{' '}
|
|
76
|
+
<svg
|
|
77
|
+
style={icon}
|
|
78
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
79
|
+
viewBox="0 0 448 512"
|
|
80
|
+
>
|
|
81
|
+
<path
|
|
82
|
+
fill="currentColor"
|
|
83
|
+
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"
|
|
84
|
+
/>
|
|
85
|
+
</svg>
|
|
86
|
+
</a>
|
|
87
|
+
<br />
|
|
88
|
+
<a
|
|
89
|
+
className="no-underline text-brand font-brand font-bold inline-flex flex-row items-center"
|
|
90
|
+
href="/lambda"
|
|
91
|
+
>
|
|
92
|
+
Remotion Lambda{' '}
|
|
93
|
+
<svg
|
|
94
|
+
style={icon}
|
|
95
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
96
|
+
viewBox="0 0 448 512"
|
|
97
|
+
>
|
|
98
|
+
<path
|
|
99
|
+
fill="currentColor"
|
|
100
|
+
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"
|
|
101
|
+
/>
|
|
102
|
+
</svg>
|
|
103
|
+
</a>
|
|
104
|
+
</div>
|
|
63
105
|
</div>
|
|
64
106
|
</div>
|
|
65
107
|
);
|