@remotion/promo-pages 5.0.0-canary → 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 +1 -1
- package/dist/homepage/Pricing.js +1 -1
- package/package.json +15 -12
- package/.turbo/turbo-make.log +0 -8
- package/bundle.ts +0 -38
- 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,92 +0,0 @@
|
|
|
1
|
-
// Adjustments to the EvaluateRemotionSection.tsx to separate the flex box into two boxes
|
|
2
|
-
// with specified alignment and positioning requirements.
|
|
3
|
-
|
|
4
|
-
import React, {useEffect, useState} from 'react';
|
|
5
|
-
import {BlueButton} from './layout/Button';
|
|
6
|
-
|
|
7
|
-
const EvaluateRemotionSection: React.FC = () => {
|
|
8
|
-
const [dailyAvatars, setDailyAvatars] = useState<string[]>([]);
|
|
9
|
-
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
const avatars = [
|
|
12
|
-
'/img/freelancers/alex.jpeg',
|
|
13
|
-
'/img/freelancers/antoine.jpeg',
|
|
14
|
-
'/img/freelancers/ayush.png',
|
|
15
|
-
'/img/freelancers/benjamin.jpeg',
|
|
16
|
-
'/img/freelancers/florent.jpeg',
|
|
17
|
-
'/img/freelancers/karel.jpeg',
|
|
18
|
-
'/img/freelancers/lorenzo.jpeg',
|
|
19
|
-
'/img/freelancers/mickael.jpeg',
|
|
20
|
-
'/img/freelancers/mohit.jpeg',
|
|
21
|
-
'/img/freelancers/pramod.jpg',
|
|
22
|
-
'/img/freelancers/pranav.jpg',
|
|
23
|
-
'/img/freelancers/rahul.png',
|
|
24
|
-
'/img/freelancers/ray.jpeg',
|
|
25
|
-
'/img/freelancers/stephen.png',
|
|
26
|
-
'/img/freelancers/umungo.png',
|
|
27
|
-
'/img/freelancers/yehor.jpeg',
|
|
28
|
-
// Add more avatar paths here
|
|
29
|
-
];
|
|
30
|
-
|
|
31
|
-
const selectedAvatars: string[] = [];
|
|
32
|
-
for (let i = 0; i < 3; i++) {
|
|
33
|
-
const index = Math.floor(Math.random() * avatars.length);
|
|
34
|
-
selectedAvatars.push(avatars[index]);
|
|
35
|
-
avatars.splice(index, 1); // Remove selected avatar to avoid duplicates
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
setDailyAvatars(selectedAvatars);
|
|
39
|
-
}, []);
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<div className="flex flex-col lg:flex-row gap-2">
|
|
43
|
-
<div className={'card flex-1 flex flex-col'}>
|
|
44
|
-
<div className={'fontbrand text-2xl font-bold'}>
|
|
45
|
-
Evaluate Remotion for your company
|
|
46
|
-
</div>
|
|
47
|
-
<p className={'text-muted fontbrand leading-snug'}>
|
|
48
|
-
Book a 20 minute call with us to get all your questions answered.
|
|
49
|
-
</p>
|
|
50
|
-
<div className="flex-1" />
|
|
51
|
-
<a
|
|
52
|
-
target="_blank"
|
|
53
|
-
href="https://cal.com/remotion/evaluate"
|
|
54
|
-
style={{textDecoration: 'none'}}
|
|
55
|
-
>
|
|
56
|
-
<BlueButton size="sm" loading={false}>
|
|
57
|
-
Schedule a call
|
|
58
|
-
</BlueButton>
|
|
59
|
-
</a>
|
|
60
|
-
</div>
|
|
61
|
-
<div className={'card flex-1 flex flex-col'}>
|
|
62
|
-
<div className={'fontbrand text-2xl font-bold'}>
|
|
63
|
-
Get help for your projects
|
|
64
|
-
</div>
|
|
65
|
-
<p className={'text-muted fontbrand leading-snug'}>
|
|
66
|
-
Contact our experts for help and work.
|
|
67
|
-
</p>
|
|
68
|
-
<div className="flex-1" />
|
|
69
|
-
<div className={'flex flex-row justify-between'}>
|
|
70
|
-
<a href="/experts" style={{textDecoration: 'none'}}>
|
|
71
|
-
<BlueButton size="sm" loading={false}>
|
|
72
|
-
Remotion Experts
|
|
73
|
-
</BlueButton>
|
|
74
|
-
</a>
|
|
75
|
-
<div className={'flex justify-end items-end gap-3'}>
|
|
76
|
-
{dailyAvatars.map((avatar) => (
|
|
77
|
-
<div
|
|
78
|
-
key={avatar}
|
|
79
|
-
className={
|
|
80
|
-
'w-12 h-12 rounded-full bg-muted bg-cover bg-center -ml-5 border-2 border-black'
|
|
81
|
-
}
|
|
82
|
-
style={{backgroundImage: `url(${avatar})`}}
|
|
83
|
-
/>
|
|
84
|
-
))}
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
export default EvaluateRemotionSection;
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
import React, {useCallback, useMemo} from 'react';
|
|
2
|
-
import {cn} from '../../cn';
|
|
3
|
-
import {Counter} from './Counter';
|
|
4
|
-
import {InfoTooltip} from './InfoTooltip';
|
|
5
|
-
import {PricingBulletPoint} from './PricingBulletPoint';
|
|
6
|
-
|
|
7
|
-
const Container: React.FC<{readonly children: React.ReactNode}> = ({
|
|
8
|
-
children,
|
|
9
|
-
}) => {
|
|
10
|
-
return (
|
|
11
|
-
<div className={'flex flex-col border-effect rounded-xl p-5 bg-pane'}>
|
|
12
|
-
{children}
|
|
13
|
-
</div>
|
|
14
|
-
);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const Title: React.FC<{
|
|
18
|
-
readonly children: React.ReactNode;
|
|
19
|
-
}> = ({children}) => {
|
|
20
|
-
return (
|
|
21
|
-
<div className="text-4xl font-bold leading-none fontbrand mt-2 mb-5">
|
|
22
|
-
{children}
|
|
23
|
-
</div>
|
|
24
|
-
);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const Audience: React.FC<{
|
|
28
|
-
readonly children: React.ReactNode;
|
|
29
|
-
}> = ({children}) => {
|
|
30
|
-
return <div className={'fontbrand text-lg leading-none'}>{children}</div>;
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const BottomInfo: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({
|
|
34
|
-
children,
|
|
35
|
-
className,
|
|
36
|
-
...props
|
|
37
|
-
}) => {
|
|
38
|
-
return (
|
|
39
|
-
<div
|
|
40
|
-
className={cn(className, 'text-[var(--subtitle)] fontbrand text-sm')}
|
|
41
|
-
{...props}
|
|
42
|
-
>
|
|
43
|
-
{children}
|
|
44
|
-
</div>
|
|
45
|
-
);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
const PriceTag: React.FC<{
|
|
49
|
-
readonly children: React.ReactNode;
|
|
50
|
-
}> = ({children}) => {
|
|
51
|
-
return (
|
|
52
|
-
<div
|
|
53
|
-
className={
|
|
54
|
-
'fontbrand text-2xl font-bold min-w-[80px] w-auto text-right shrink-0 ml-4'
|
|
55
|
-
}
|
|
56
|
-
>
|
|
57
|
-
{children}
|
|
58
|
-
</div>
|
|
59
|
-
);
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
const SmallPriceTag: React.FC<{
|
|
63
|
-
readonly children: React.ReactNode;
|
|
64
|
-
}> = ({children}) => {
|
|
65
|
-
return (
|
|
66
|
-
<div
|
|
67
|
-
className={
|
|
68
|
-
'fontbrand text-2xl font-medium w-auto min-w-[80px] text-right shrink-0 ml-4'
|
|
69
|
-
}
|
|
70
|
-
>
|
|
71
|
-
{children}
|
|
72
|
-
</div>
|
|
73
|
-
);
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export const FreePricing: React.FC = () => {
|
|
77
|
-
return (
|
|
78
|
-
<Container>
|
|
79
|
-
<Audience>For individuals and companies of up to 3 people</Audience>
|
|
80
|
-
<Title>Free License</Title>
|
|
81
|
-
<PricingBulletPoint text="Unlimited videos" checked />
|
|
82
|
-
<PricingBulletPoint text="Commercial use allowed" checked />
|
|
83
|
-
<PricingBulletPoint text="Self-hosted cloud rendering allowed" checked />
|
|
84
|
-
<PricingBulletPoint
|
|
85
|
-
text="Must upgrade when your team grows"
|
|
86
|
-
checked={false}
|
|
87
|
-
/>
|
|
88
|
-
</Container>
|
|
89
|
-
);
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const textUnitWrapper: React.CSSProperties = {
|
|
93
|
-
display: 'flex',
|
|
94
|
-
flexDirection: 'column',
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
export const EnterpriseLicense: React.FC = () => {
|
|
98
|
-
return (
|
|
99
|
-
<Container>
|
|
100
|
-
<Audience>For advanced needs</Audience>
|
|
101
|
-
<Title>Enterprise License</Title>
|
|
102
|
-
<PricingBulletPoint text="Everything in Company License" checked />
|
|
103
|
-
<PricingBulletPoint text="Custom terms, billing and pricing" checked />
|
|
104
|
-
<PricingBulletPoint text="Compliance forms" checked />
|
|
105
|
-
<PricingBulletPoint text="Prioritized feature requests" checked />
|
|
106
|
-
<PricingBulletPoint text="Private support channel" checked />
|
|
107
|
-
<PricingBulletPoint text="Monthly consulting session" checked />
|
|
108
|
-
<div style={{height: 30}} />
|
|
109
|
-
<div className={'flex flex-row justify-end'}>
|
|
110
|
-
<div
|
|
111
|
-
style={{
|
|
112
|
-
...textUnitWrapper,
|
|
113
|
-
alignItems: 'flex-end',
|
|
114
|
-
}}
|
|
115
|
-
>
|
|
116
|
-
<PriceTag>
|
|
117
|
-
<a
|
|
118
|
-
className={
|
|
119
|
-
'cursor-pointer no-underline text-inherit hover:text-brand'
|
|
120
|
-
}
|
|
121
|
-
target={'_blank'}
|
|
122
|
-
href="https://www.remotion.pro/contact"
|
|
123
|
-
>
|
|
124
|
-
Contact us
|
|
125
|
-
</a>
|
|
126
|
-
</PriceTag>
|
|
127
|
-
<div className={'text-[var(--subtitle)] fontbrand text-sm'}>
|
|
128
|
-
Starting at $500 per month
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
</div>
|
|
132
|
-
</Container>
|
|
133
|
-
);
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
const SEAT_PRICE = 25;
|
|
137
|
-
const RENDER_UNIT_PRICE = 10;
|
|
138
|
-
const WEBCODECS_UNIT_PRICE = 10;
|
|
139
|
-
|
|
140
|
-
export const CompanyPricing: React.FC = () => {
|
|
141
|
-
const [devSeatCount, setDevSeatCount] = React.useState(1);
|
|
142
|
-
const [cloudUnitCount, setCloudUnitCount] = React.useState(1);
|
|
143
|
-
const [webcodecsUnits, setWebcodecsUnits] = React.useState(1);
|
|
144
|
-
|
|
145
|
-
const formatPrice = useCallback((price: number) => {
|
|
146
|
-
const formatter = new Intl.NumberFormat('en-US', {
|
|
147
|
-
style: 'currency',
|
|
148
|
-
currency: 'USD',
|
|
149
|
-
maximumFractionDigits: 0,
|
|
150
|
-
});
|
|
151
|
-
return formatter.format(price);
|
|
152
|
-
}, []);
|
|
153
|
-
|
|
154
|
-
const totalPrice = useMemo(() => {
|
|
155
|
-
return Math.max(
|
|
156
|
-
100,
|
|
157
|
-
devSeatCount * SEAT_PRICE +
|
|
158
|
-
cloudUnitCount * RENDER_UNIT_PRICE +
|
|
159
|
-
webcodecsUnits * WEBCODECS_UNIT_PRICE,
|
|
160
|
-
);
|
|
161
|
-
}, [cloudUnitCount, devSeatCount, webcodecsUnits]);
|
|
162
|
-
|
|
163
|
-
const totalPriceString = useMemo(() => {
|
|
164
|
-
return formatPrice(totalPrice);
|
|
165
|
-
}, [formatPrice, totalPrice]);
|
|
166
|
-
|
|
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
|
-
return (
|
|
182
|
-
<Container>
|
|
183
|
-
<Audience>For collaborations and companies of 4+ people</Audience>
|
|
184
|
-
<Title>Company License</Title>
|
|
185
|
-
<PricingBulletPoint text="Commercial use allowed" checked />
|
|
186
|
-
<PricingBulletPoint text="Self-hosted cloud rendering allowed" checked />
|
|
187
|
-
<PricingBulletPoint text="Prioritized Support" checked />
|
|
188
|
-
<PricingBulletPoint
|
|
189
|
-
text={
|
|
190
|
-
<span>
|
|
191
|
-
<a
|
|
192
|
-
href="https://remotion.dev/recorder"
|
|
193
|
-
className="underline underline-offset-4 text-inherit"
|
|
194
|
-
>
|
|
195
|
-
Remotion Recorder
|
|
196
|
-
</a>{' '}
|
|
197
|
-
included
|
|
198
|
-
</span>
|
|
199
|
-
}
|
|
200
|
-
checked
|
|
201
|
-
/>
|
|
202
|
-
<PricingBulletPoint text="$250 Mux credits" checked>
|
|
203
|
-
<InfoTooltip text="Credits for Mux.com. Applies only to new Mux customers." />
|
|
204
|
-
</PricingBulletPoint>
|
|
205
|
-
<div style={{height: 30}} />
|
|
206
|
-
<div className={'flex flex-row items-center'}>
|
|
207
|
-
<div style={textUnitWrapper}>
|
|
208
|
-
<div className={'fontbrand font-bold text-lg'}>Developer Seats</div>
|
|
209
|
-
<div className={'text-muted fontbrand text-sm'}>
|
|
210
|
-
Number of developers working with Remotion
|
|
211
|
-
</div>
|
|
212
|
-
</div>
|
|
213
|
-
<div style={{flex: 3}} />
|
|
214
|
-
<Counter count={devSeatCount} setCount={setDevSeatCount} minCount={1} />
|
|
215
|
-
<SmallPriceTag>
|
|
216
|
-
$
|
|
217
|
-
{new Intl.NumberFormat('en-US', {
|
|
218
|
-
maximumFractionDigits: 0,
|
|
219
|
-
}).format(SEAT_PRICE * devSeatCount)}
|
|
220
|
-
</SmallPriceTag>
|
|
221
|
-
</div>
|
|
222
|
-
<div style={{height: 14}} />
|
|
223
|
-
<div className={'flex flex-row items-center'}>
|
|
224
|
-
<div style={textUnitWrapper}>
|
|
225
|
-
<div className={'fontbrand font-bold text-lg'}>
|
|
226
|
-
Cloud Rendering Units
|
|
227
|
-
</div>
|
|
228
|
-
<div className={'text-muted fontbrand text-sm'}>
|
|
229
|
-
Allows for {rendersPerMonth}{' '}
|
|
230
|
-
<a
|
|
231
|
-
href="https://www.remotion.dev/docs/compare-ssr"
|
|
232
|
-
className="underline underline-offset-4 text-inherit"
|
|
233
|
-
>
|
|
234
|
-
self-hosted renders per month
|
|
235
|
-
</a>{' '}
|
|
236
|
-
each
|
|
237
|
-
</div>
|
|
238
|
-
</div>
|
|
239
|
-
<div style={{flex: 3}} />
|
|
240
|
-
<Counter
|
|
241
|
-
count={cloudUnitCount}
|
|
242
|
-
setCount={setCloudUnitCount}
|
|
243
|
-
minCount={0}
|
|
244
|
-
/>
|
|
245
|
-
<SmallPriceTag>
|
|
246
|
-
$
|
|
247
|
-
{new Intl.NumberFormat('en-US', {
|
|
248
|
-
maximumFractionDigits: 0,
|
|
249
|
-
}).format(RENDER_UNIT_PRICE * cloudUnitCount)}
|
|
250
|
-
</SmallPriceTag>
|
|
251
|
-
</div>
|
|
252
|
-
<div style={{height: 14}} />
|
|
253
|
-
<div className={'flex flex-row items-center'}>
|
|
254
|
-
<div style={textUnitWrapper}>
|
|
255
|
-
<div className={'fontbrand font-bold text-lg'}>
|
|
256
|
-
WebCodec Conversion Units
|
|
257
|
-
</div>
|
|
258
|
-
<div className={'text-muted fontbrand text-sm'}>
|
|
259
|
-
Allows for{' '}
|
|
260
|
-
<a
|
|
261
|
-
className="underline underline-offset-4 text-inherit"
|
|
262
|
-
href="https://remotion.dev/webcodecs"
|
|
263
|
-
>
|
|
264
|
-
{conversionsPerMonth} client-side video conversions{' '}
|
|
265
|
-
</a>
|
|
266
|
-
</div>
|
|
267
|
-
</div>
|
|
268
|
-
<div style={{flex: 3}} />
|
|
269
|
-
<Counter
|
|
270
|
-
count={webcodecsUnits}
|
|
271
|
-
setCount={setWebcodecsUnits}
|
|
272
|
-
minCount={0}
|
|
273
|
-
/>
|
|
274
|
-
<SmallPriceTag>
|
|
275
|
-
$
|
|
276
|
-
{new Intl.NumberFormat('en-US', {
|
|
277
|
-
maximumFractionDigits: 0,
|
|
278
|
-
}).format(RENDER_UNIT_PRICE * webcodecsUnits)}
|
|
279
|
-
</SmallPriceTag>
|
|
280
|
-
</div>
|
|
281
|
-
<div style={{height: 20}} />
|
|
282
|
-
<div className={'flex flex-row justify-end'}>
|
|
283
|
-
<div style={{...textUnitWrapper, alignItems: 'flex-end'}}>
|
|
284
|
-
<PriceTag>{totalPriceString}/mo</PriceTag>
|
|
285
|
-
<BottomInfo
|
|
286
|
-
data-visible={totalPrice <= 100}
|
|
287
|
-
className="opacity-0 data-[visible=true]:opacity-100 transition-opacity"
|
|
288
|
-
>
|
|
289
|
-
The minimum is $100 per month
|
|
290
|
-
</BottomInfo>
|
|
291
|
-
</div>
|
|
292
|
-
</div>
|
|
293
|
-
</Container>
|
|
294
|
-
);
|
|
295
|
-
};
|
|
@@ -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
|
-
};
|