@remotion/promo-pages 4.0.364 → 4.0.365
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 +7 -3
- package/dist/Users/jonathanburger/remotion/packages/promo-pages/dist/Homepage.js +7 -3
- package/package.json +10 -10
- package/.turbo/turbo-lint.log +0 -15
- package/.turbo/turbo-make.log +0 -5
- package/bundle.ts +0 -54
- package/eslint.config.mjs +0 -7
- package/server.ts +0 -26
- package/src/cn.ts +0 -6
- package/src/components/Homepage.tsx +0 -87
- package/src/components/TeamPicture.tsx +0 -11
- package/src/components/homepage/BackgroundAnimation.tsx +0 -108
- package/src/components/homepage/ChooseTemplate.tsx +0 -57
- package/src/components/homepage/CommunityStats.tsx +0 -54
- package/src/components/homepage/CommunityStatsItems.tsx +0 -304
- package/src/components/homepage/Counter.tsx +0 -120
- 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 -93
- 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 -200
- 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/EditorStarterSection.tsx +0 -76
- package/src/components/homepage/EvaluateRemotion.tsx +0 -92
- package/src/components/homepage/FreePricing.tsx +0 -283
- package/src/components/homepage/GetStartedStrip.tsx +0 -77
- package/src/components/homepage/GitHubButton.tsx +0 -23
- package/src/components/homepage/IconForTemplate.tsx +0 -170
- package/src/components/homepage/IfYouKnowReact.tsx +0 -68
- package/src/components/homepage/InfoTooltip.tsx +0 -25
- package/src/components/homepage/MoreTemplatesButton.tsx +0 -29
- package/src/components/homepage/MoreVideoPowerSection.tsx +0 -95
- package/src/components/homepage/MuxVideo.tsx +0 -68
- package/src/components/homepage/NewsletterButton.tsx +0 -89
- package/src/components/homepage/ParameterizeAndEdit.tsx +0 -106
- package/src/components/homepage/Pricing.tsx +0 -49
- package/src/components/homepage/PricingBulletPoint.tsx +0 -50
- package/src/components/homepage/RealMp4Videos.tsx +0 -108
- 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 -145
- package/src/components/homepage/VideoApps.tsx +0 -231
- package/src/components/homepage/VideoAppsShowcase.tsx +0 -270
- package/src/components/homepage/VideoAppsTitle.tsx +0 -11
- package/src/components/homepage/VideoPlayerWithControls.tsx +0 -189
- package/src/components/homepage/WriteInReact.tsx +0 -34
- package/src/components/homepage/YouAreHere.tsx +0 -30
- 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/music.tsx +0 -9
- package/src/components/icons/next.tsx +0 -64
- package/src/components/icons/overlay.tsx +0 -24
- package/src/components/icons/recorder.tsx +0 -23
- package/src/components/icons/remix.tsx +0 -27
- 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/components/team/TeamCards.tsx +0 -167
- package/src/components/team/TitleTeamCards.tsx +0 -22
- package/src/components/team.css +0 -22
- package/src/components/team.tsx +0 -51
- package/src/fonts.css +0 -30
- package/src/index.css +0 -140
- package/src/main.tsx +0 -12
- package/src/team.tsx +0 -12
- package/tsconfig.json +0 -11
- package/vite.config.ts +0 -9
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import React, {useEffect, useState} from 'react';
|
|
2
|
-
|
|
3
|
-
export const isWebkit = () => {
|
|
4
|
-
if (typeof window === 'undefined') {
|
|
5
|
-
return false;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const isSafariUserAgent = Boolean(
|
|
9
|
-
navigator.userAgent.match(/Version\/[\d.]+.*Safari/),
|
|
10
|
-
);
|
|
11
|
-
|
|
12
|
-
const isChrome = Boolean(navigator.userAgent.match(/CriOS\//));
|
|
13
|
-
return isSafariUserAgent || isChrome;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const icon: React.CSSProperties = {
|
|
17
|
-
height: 16,
|
|
18
|
-
marginLeft: 10,
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
export const IfYouKnowReact: React.FC = () => {
|
|
22
|
-
const [vid, setVid] = useState('/img/compose.webm');
|
|
23
|
-
|
|
24
|
-
useEffect(() => {
|
|
25
|
-
if (isWebkit()) {
|
|
26
|
-
setVid('/img/compose.mp4');
|
|
27
|
-
}
|
|
28
|
-
}, []);
|
|
29
|
-
|
|
30
|
-
return (
|
|
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">
|
|
32
|
-
<video
|
|
33
|
-
src={vid}
|
|
34
|
-
muted
|
|
35
|
-
autoPlay
|
|
36
|
-
playsInline
|
|
37
|
-
loop
|
|
38
|
-
className="w-[500px] cursor-default! relative lg:-translate-x-8 -mb-40 lg:mt-0 lg:mb-0"
|
|
39
|
-
/>
|
|
40
|
-
<div>
|
|
41
|
-
<h2 className="text-4xl fontbrand pt-20">
|
|
42
|
-
<span className="text-brand">Compose</span> with code
|
|
43
|
-
</h2>
|
|
44
|
-
<p className="leading-relaxed font-brand">
|
|
45
|
-
Use React, a powerful frontend technology, to create sophisticated
|
|
46
|
-
videos with code.
|
|
47
|
-
</p>
|
|
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>
|
|
64
|
-
</a>
|
|
65
|
-
</div>
|
|
66
|
-
</div>
|
|
67
|
-
);
|
|
68
|
-
};
|
|
@@ -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,95 +0,0 @@
|
|
|
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,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,89 +0,0 @@
|
|
|
1
|
-
import React, {useCallback, useState} from 'react';
|
|
2
|
-
import {BlueButton} from './layout/Button';
|
|
3
|
-
import {Spacer} from './Spacer';
|
|
4
|
-
import {SectionTitle} from './VideoAppsTitle';
|
|
5
|
-
|
|
6
|
-
export const NewsletterButton: React.FC<{}> = () => {
|
|
7
|
-
const [email, setEmail] = useState('');
|
|
8
|
-
const [submitting, setSubmitting] = useState(false);
|
|
9
|
-
const [subscribed, setSubscribed] = useState(false);
|
|
10
|
-
|
|
11
|
-
const handleSubmit = useCallback(
|
|
12
|
-
async (e: React.FormEvent<HTMLFormElement>) => {
|
|
13
|
-
try {
|
|
14
|
-
setSubmitting(true);
|
|
15
|
-
e.preventDefault();
|
|
16
|
-
|
|
17
|
-
const response = await fetch(
|
|
18
|
-
'https://www.remotion.pro/api/newsletter',
|
|
19
|
-
{
|
|
20
|
-
method: 'POST',
|
|
21
|
-
body: JSON.stringify({email}),
|
|
22
|
-
headers: {
|
|
23
|
-
'content-type': 'application/json',
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
);
|
|
27
|
-
const json = await response.json();
|
|
28
|
-
if (json.success) {
|
|
29
|
-
setSubscribed(true);
|
|
30
|
-
} else {
|
|
31
|
-
// eslint-disable-next-line no-alert
|
|
32
|
-
alert('Something went wrong. Please try again later.');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
setSubmitting(false);
|
|
36
|
-
} catch {
|
|
37
|
-
// eslint-disable-next-line no-alert
|
|
38
|
-
alert('Something went wrong. Please try again later.');
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
[email],
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
return (
|
|
45
|
-
<div>
|
|
46
|
-
<div className="flex flex-col">
|
|
47
|
-
<div className={'w-full'}>
|
|
48
|
-
<div className={'flex flex-col flex-1'}>
|
|
49
|
-
<SectionTitle>Newsletter</SectionTitle>
|
|
50
|
-
<form
|
|
51
|
-
onSubmit={handleSubmit}
|
|
52
|
-
style={{
|
|
53
|
-
width: '100%',
|
|
54
|
-
}}
|
|
55
|
-
>
|
|
56
|
-
<div className={'fontbrand text-center mb-10 -mt-4'}>
|
|
57
|
-
Read about new features and noteworthy updates we have made on
|
|
58
|
-
Remotion once in a while.{' '}
|
|
59
|
-
</div>
|
|
60
|
-
|
|
61
|
-
<input
|
|
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"
|
|
63
|
-
disabled={submitting}
|
|
64
|
-
value={email}
|
|
65
|
-
onChange={(e) => setEmail(e.target.value)}
|
|
66
|
-
type={'email'}
|
|
67
|
-
required
|
|
68
|
-
placeholder="animator@gmail.com"
|
|
69
|
-
/>
|
|
70
|
-
<Spacer />
|
|
71
|
-
<Spacer />
|
|
72
|
-
<div>
|
|
73
|
-
<BlueButton
|
|
74
|
-
type="submit"
|
|
75
|
-
className="w-full"
|
|
76
|
-
loading={submitting}
|
|
77
|
-
disabled={submitting || subscribed}
|
|
78
|
-
size="sm"
|
|
79
|
-
>
|
|
80
|
-
{subscribed ? 'Subscribed!' : 'Subscribe'}
|
|
81
|
-
</BlueButton>
|
|
82
|
-
</div>
|
|
83
|
-
</form>
|
|
84
|
-
</div>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
</div>
|
|
88
|
-
);
|
|
89
|
-
};
|
|
@@ -1,106 +0,0 @@
|
|
|
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
|
-
<br />
|
|
86
|
-
<a
|
|
87
|
-
className="no-underline text-brand font-brand font-bold inline-flex flex-row items-center"
|
|
88
|
-
href="/docs/editor-starter"
|
|
89
|
-
>
|
|
90
|
-
Remotion Editor Starter{' '}
|
|
91
|
-
<svg
|
|
92
|
-
style={icon}
|
|
93
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
94
|
-
viewBox="0 0 448 512"
|
|
95
|
-
>
|
|
96
|
-
<path
|
|
97
|
-
fill="currentColor"
|
|
98
|
-
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"
|
|
99
|
-
/>
|
|
100
|
-
</svg>
|
|
101
|
-
</a>
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
);
|
|
106
|
-
};
|
|
@@ -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,108 +0,0 @@
|
|
|
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 RealMP4Videos: React.FC = () => {
|
|
10
|
-
const ref = useRef<HTMLDivElement>(null);
|
|
11
|
-
const videoRef = useRef<HTMLVideoElement>(null);
|
|
12
|
-
|
|
13
|
-
const [vid, setVid] = useState('/img/render-progress.webm');
|
|
14
|
-
|
|
15
|
-
useEffect(() => {
|
|
16
|
-
if (isWebkit()) {
|
|
17
|
-
setVid('/img/render-progress.mp4');
|
|
18
|
-
}
|
|
19
|
-
}, []);
|
|
20
|
-
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
const {current} = ref;
|
|
23
|
-
if (!current) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const callback = (data: IntersectionObserverEntry[]) => {
|
|
28
|
-
if (data[0].isIntersecting) {
|
|
29
|
-
videoRef.current?.play();
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const observer = new IntersectionObserver(callback, {
|
|
34
|
-
root: null,
|
|
35
|
-
threshold: 0.5,
|
|
36
|
-
});
|
|
37
|
-
observer.observe(current);
|
|
38
|
-
|
|
39
|
-
return () => observer.unobserve(current);
|
|
40
|
-
}, []);
|
|
41
|
-
|
|
42
|
-
return (
|
|
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">
|
|
45
|
-
<video
|
|
46
|
-
ref={videoRef}
|
|
47
|
-
src={vid}
|
|
48
|
-
muted
|
|
49
|
-
autoPlay
|
|
50
|
-
playsInline
|
|
51
|
-
loop
|
|
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"
|
|
59
|
-
/>
|
|
60
|
-
</div>{' '}
|
|
61
|
-
<div className="font-brand">
|
|
62
|
-
<h2 className="text-4xl fontbrand">
|
|
63
|
-
<span className={'text-brand'}>Scalable</span> rendering
|
|
64
|
-
</h2>
|
|
65
|
-
<p className="leading-relaxed">
|
|
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>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
);
|
|
108
|
-
};
|