@remotion/promo-pages 4.0.363 → 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 +26 -27
- package/dist/Users/jonathanburger/remotion/packages/promo-pages/dist/Homepage.js +26 -27
- 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,158 +0,0 @@
|
|
|
1
|
-
import type {PlayerRef} from '@remotion/player';
|
|
2
|
-
import {Player} from '@remotion/player';
|
|
3
|
-
import React, {
|
|
4
|
-
useCallback,
|
|
5
|
-
useEffect,
|
|
6
|
-
useMemo,
|
|
7
|
-
useRef,
|
|
8
|
-
useState,
|
|
9
|
-
type CSSProperties,
|
|
10
|
-
} from 'react';
|
|
11
|
-
|
|
12
|
-
import {PALETTE} from '../layout/colors';
|
|
13
|
-
import {useColorMode} from '../layout/use-color-mode';
|
|
14
|
-
import {SectionTitle} from '../VideoAppsTitle';
|
|
15
|
-
import {
|
|
16
|
-
getDataAndProps,
|
|
17
|
-
HomepageVideoComp,
|
|
18
|
-
type DemoPlayerProps,
|
|
19
|
-
type LocationAndTrending,
|
|
20
|
-
type RemoteData,
|
|
21
|
-
} from './Comp';
|
|
22
|
-
import {DemoError} from './DemoError';
|
|
23
|
-
import {RenderButton} from './DemoRender';
|
|
24
|
-
import {DownloadNudge} from './DownloadNudge';
|
|
25
|
-
import {DragAndDropNudge} from './DragAndDropNudge';
|
|
26
|
-
import {PlayerControls} from './PlayerControls';
|
|
27
|
-
import {ThemeNudge} from './ThemeNudge';
|
|
28
|
-
import type {Location} from './types';
|
|
29
|
-
|
|
30
|
-
const style: React.CSSProperties = {
|
|
31
|
-
width: '100%',
|
|
32
|
-
aspectRatio: '640 / 360',
|
|
33
|
-
borderBottom: `2px solid ${PALETTE.BOX_STROKE}`,
|
|
34
|
-
touchAction: 'none', // prevent page from scrolling when dragging children on mobile
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
const playerWrapper: CSSProperties = {
|
|
38
|
-
border: `2px solid ${PALETTE.BOX_STROKE}`,
|
|
39
|
-
borderBottom: `4px solid ${PALETTE.BOX_STROKE}`,
|
|
40
|
-
borderRadius: 8,
|
|
41
|
-
width: '100%',
|
|
42
|
-
overflow: 'hidden',
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export const Demo: React.FC = () => {
|
|
46
|
-
const {colorMode} = useColorMode();
|
|
47
|
-
const [data, setData] = useState<LocationAndTrending | null>(null);
|
|
48
|
-
const ref = useRef<PlayerRef>(null);
|
|
49
|
-
|
|
50
|
-
const [isFullscreen, setIsFullscreen] = useState(false);
|
|
51
|
-
const [cardOrder, setCardOrder] = useState([0, 1, 2, 3]);
|
|
52
|
-
const [emojiIndex, setEmojiIndex] = useState<number>(0);
|
|
53
|
-
const [error, setError] = useState(false);
|
|
54
|
-
|
|
55
|
-
useEffect(() => {
|
|
56
|
-
getDataAndProps()
|
|
57
|
-
.then((d) => {
|
|
58
|
-
setData(d);
|
|
59
|
-
})
|
|
60
|
-
.catch((err) => {
|
|
61
|
-
// eslint-disable-next-line no-console
|
|
62
|
-
console.log(err);
|
|
63
|
-
setError(true);
|
|
64
|
-
});
|
|
65
|
-
}, []);
|
|
66
|
-
|
|
67
|
-
useEffect(() => {
|
|
68
|
-
const {current: playerRef} = ref;
|
|
69
|
-
if (!playerRef || !data) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const onFullscreenChange = () => {
|
|
74
|
-
setIsFullscreen(playerRef.isFullscreen());
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
playerRef.addEventListener('fullscreenchange', onFullscreenChange);
|
|
78
|
-
|
|
79
|
-
return () => {
|
|
80
|
-
playerRef.removeEventListener('fullscreenchange', onFullscreenChange);
|
|
81
|
-
};
|
|
82
|
-
}, [data]);
|
|
83
|
-
|
|
84
|
-
const updateCardOrder = useCallback((newCardOrder: number[]) => {
|
|
85
|
-
setCardOrder(newCardOrder);
|
|
86
|
-
}, []);
|
|
87
|
-
|
|
88
|
-
const props: DemoPlayerProps = useMemo(() => {
|
|
89
|
-
return {
|
|
90
|
-
theme: colorMode,
|
|
91
|
-
onToggle: () => {
|
|
92
|
-
ref.current?.toggle();
|
|
93
|
-
},
|
|
94
|
-
cardOrder,
|
|
95
|
-
updateCardOrder,
|
|
96
|
-
location: data?.location ?? null,
|
|
97
|
-
trending: data?.trending ?? null,
|
|
98
|
-
onClickLeft: () => {
|
|
99
|
-
setEmojiIndex((e) => e - 1);
|
|
100
|
-
},
|
|
101
|
-
onClickRight: () => {
|
|
102
|
-
setEmojiIndex((e) => e + 1);
|
|
103
|
-
},
|
|
104
|
-
emojiIndex,
|
|
105
|
-
};
|
|
106
|
-
}, [cardOrder, emojiIndex, colorMode, data, updateCardOrder]);
|
|
107
|
-
|
|
108
|
-
const onError = useCallback(() => {
|
|
109
|
-
setError(true);
|
|
110
|
-
}, []);
|
|
111
|
-
|
|
112
|
-
return (
|
|
113
|
-
<div>
|
|
114
|
-
<br />
|
|
115
|
-
<br />
|
|
116
|
-
<SectionTitle>Demo</SectionTitle>
|
|
117
|
-
<div style={{height: 140, position: 'relative'}}>
|
|
118
|
-
<DragAndDropNudge />
|
|
119
|
-
<ThemeNudge />
|
|
120
|
-
</div>
|
|
121
|
-
<div style={playerWrapper}>
|
|
122
|
-
<Player
|
|
123
|
-
ref={ref}
|
|
124
|
-
component={HomepageVideoComp}
|
|
125
|
-
compositionWidth={640}
|
|
126
|
-
compositionHeight={360}
|
|
127
|
-
durationInFrames={120}
|
|
128
|
-
fps={30}
|
|
129
|
-
autoPlay
|
|
130
|
-
controls={isFullscreen}
|
|
131
|
-
clickToPlay={false}
|
|
132
|
-
style={style}
|
|
133
|
-
initiallyMuted
|
|
134
|
-
inputProps={props}
|
|
135
|
-
loop
|
|
136
|
-
/>
|
|
137
|
-
<PlayerControls playerRef={ref} durationInFrames={120} fps={30}>
|
|
138
|
-
<RenderButton
|
|
139
|
-
onError={onError}
|
|
140
|
-
renderData={
|
|
141
|
-
data
|
|
142
|
-
? {
|
|
143
|
-
cardOrder,
|
|
144
|
-
emojiIndex,
|
|
145
|
-
location: data.location as Location,
|
|
146
|
-
theme: colorMode,
|
|
147
|
-
trending: data.trending as RemoteData,
|
|
148
|
-
}
|
|
149
|
-
: null
|
|
150
|
-
}
|
|
151
|
-
/>
|
|
152
|
-
</PlayerControls>
|
|
153
|
-
</div>
|
|
154
|
-
{error ? <DemoError /> : null}
|
|
155
|
-
<DownloadNudge />
|
|
156
|
-
</div>
|
|
157
|
-
);
|
|
158
|
-
};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
export type Position = {
|
|
2
|
-
x: number;
|
|
3
|
-
y: number;
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
export const paddingAndMargin = 20;
|
|
7
|
-
const height = 360;
|
|
8
|
-
const width = 640;
|
|
9
|
-
export const cardHeight = (height - paddingAndMargin * 3) / 2;
|
|
10
|
-
export const cardWidth = (width - paddingAndMargin * 3) / 2;
|
|
11
|
-
|
|
12
|
-
export const getPositionForIndex = (index: number): Position => {
|
|
13
|
-
const x =
|
|
14
|
-
index % 2 === 0 ? paddingAndMargin : cardWidth + paddingAndMargin * 2;
|
|
15
|
-
const y = index < 2 ? paddingAndMargin : cardHeight + paddingAndMargin * 2;
|
|
16
|
-
|
|
17
|
-
return {x, y};
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export const getInitialPositions = () => {
|
|
21
|
-
return new Array(4).fill(true).map((_, i) => getPositionForIndex(i));
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export const getIndexFromPosition = (clientX: number, clientY: number) => {
|
|
25
|
-
const left = clientX < cardWidth / 2 + paddingAndMargin;
|
|
26
|
-
const top = clientY < cardHeight / 2 + paddingAndMargin;
|
|
27
|
-
|
|
28
|
-
if (left && top) {
|
|
29
|
-
return 0;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
if (!left && top) {
|
|
33
|
-
return 1;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (left && !top) {
|
|
37
|
-
return 2;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (!left && !top) {
|
|
41
|
-
return 3;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import {BlueButton, ClearButton} from './layout/Button';
|
|
4
|
-
import {MuxVideo} from './MuxVideo';
|
|
5
|
-
import {SectionTitle} from './VideoAppsTitle';
|
|
6
|
-
|
|
7
|
-
const EditorStarterSection: React.FC = () => {
|
|
8
|
-
return (
|
|
9
|
-
<div>
|
|
10
|
-
<SectionTitle>Build your own video editor</SectionTitle>
|
|
11
|
-
<br />
|
|
12
|
-
<div className={'card flex p-0 overflow-hidden'}>
|
|
13
|
-
<div className={'flex-1 flex flex-col lg:flex-row justify-center'}>
|
|
14
|
-
<div
|
|
15
|
-
className={
|
|
16
|
-
'w-full max-w-[500px] aspect-square relative overflow-hidden bg-[#eee]'
|
|
17
|
-
}
|
|
18
|
-
>
|
|
19
|
-
<MuxVideo
|
|
20
|
-
muxId={'YIvIidbcAc7009B00Wr7gIbGyq67YGNlytGvMXwdsLRtc'}
|
|
21
|
-
className={
|
|
22
|
-
'absolute left-0 top-0 w-full h-full object-cover object-top rounded-sm rounded-tr-none rounded-br-none'
|
|
23
|
-
}
|
|
24
|
-
loop
|
|
25
|
-
autoPlay
|
|
26
|
-
playsInline
|
|
27
|
-
muted
|
|
28
|
-
/>
|
|
29
|
-
</div>
|
|
30
|
-
<div className={'p-6 flex-1 flex flex-col h-full'}>
|
|
31
|
-
<div className="text-4xl font-bold fontbrand mt-0">
|
|
32
|
-
Editor Starter
|
|
33
|
-
</div>
|
|
34
|
-
<div className="text-muted mt-4 text-base fontbrand">
|
|
35
|
-
A comprehensive template that includes everything you need to
|
|
36
|
-
create custom video editing applications with React and
|
|
37
|
-
TypeScript.
|
|
38
|
-
</div>
|
|
39
|
-
<div className="h-5" />
|
|
40
|
-
<div className="flex gap-2 items-center">
|
|
41
|
-
<a
|
|
42
|
-
href="https://www.remotion.pro/editor-starter?ref=remotion.dev"
|
|
43
|
-
target="_blank"
|
|
44
|
-
className="no-underline"
|
|
45
|
-
>
|
|
46
|
-
<BlueButton size="sm" loading={false}>
|
|
47
|
-
Purchase
|
|
48
|
-
</BlueButton>
|
|
49
|
-
</a>
|
|
50
|
-
<a
|
|
51
|
-
href="https://editor-starter.remotion.dev?ref=remotion.dev"
|
|
52
|
-
target="_blank"
|
|
53
|
-
className="no-underline"
|
|
54
|
-
>
|
|
55
|
-
<ClearButton size="sm" loading={false}>
|
|
56
|
-
Demo
|
|
57
|
-
</ClearButton>
|
|
58
|
-
</a>{' '}
|
|
59
|
-
<a
|
|
60
|
-
href="https://remotion.dev/editor-starter"
|
|
61
|
-
className="no-underline"
|
|
62
|
-
>
|
|
63
|
-
<ClearButton size="sm" loading={false}>
|
|
64
|
-
Docs
|
|
65
|
-
</ClearButton>
|
|
66
|
-
</a>
|
|
67
|
-
</div>
|
|
68
|
-
<br />
|
|
69
|
-
</div>
|
|
70
|
-
</div>
|
|
71
|
-
</div>
|
|
72
|
-
</div>
|
|
73
|
-
);
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export default EditorStarterSection;
|
|
@@ -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/karel.jpeg',
|
|
17
|
-
'/img/freelancers/lorenzo.jpeg',
|
|
18
|
-
'/img/freelancers/mickael.jpeg',
|
|
19
|
-
'/img/freelancers/mohit.jpeg',
|
|
20
|
-
'/img/freelancers/pramod.jpg',
|
|
21
|
-
'/img/freelancers/pranav.jpg',
|
|
22
|
-
'/img/freelancers/rahul.png',
|
|
23
|
-
'/img/freelancers/ray.jpeg',
|
|
24
|
-
'/img/freelancers/stephen.png',
|
|
25
|
-
'/img/freelancers/umungo.png',
|
|
26
|
-
'/img/freelancers/yehor.jpeg',
|
|
27
|
-
'/img/freelancers/andrei.png',
|
|
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,283 +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'
|
|
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="Private Slack or Discord" checked />
|
|
104
|
-
<PricingBulletPoint text="Monthly consulting session" checked />
|
|
105
|
-
<PricingBulletPoint text="Custom terms, billing and pricing" checked />
|
|
106
|
-
<PricingBulletPoint text="Compliance forms" checked />
|
|
107
|
-
<PricingBulletPoint text="Prioritized feature requests" checked />
|
|
108
|
-
<PricingBulletPoint
|
|
109
|
-
text={
|
|
110
|
-
<span>
|
|
111
|
-
<a
|
|
112
|
-
href="https://www.remotion.dev/editor-starter"
|
|
113
|
-
className="underline underline-offset-4 text-inherit"
|
|
114
|
-
>
|
|
115
|
-
Editor Starter
|
|
116
|
-
</a>{' '}
|
|
117
|
-
included
|
|
118
|
-
</span>
|
|
119
|
-
}
|
|
120
|
-
checked
|
|
121
|
-
/>
|
|
122
|
-
<div style={{height: 30}} />
|
|
123
|
-
<div className={'flex flex-row justify-end'}>
|
|
124
|
-
<div
|
|
125
|
-
style={{
|
|
126
|
-
...textUnitWrapper,
|
|
127
|
-
alignItems: 'flex-end',
|
|
128
|
-
}}
|
|
129
|
-
>
|
|
130
|
-
<PriceTag>
|
|
131
|
-
<a
|
|
132
|
-
className={
|
|
133
|
-
'cursor-pointer no-underline text-inherit hover:text-brand'
|
|
134
|
-
}
|
|
135
|
-
target={'_blank'}
|
|
136
|
-
href="https://www.remotion.pro/contact"
|
|
137
|
-
>
|
|
138
|
-
Contact us
|
|
139
|
-
</a>
|
|
140
|
-
</PriceTag>
|
|
141
|
-
<div className={'text-[var(--subtitle)] fontbrand text-sm'}>
|
|
142
|
-
Starting at $500 per month
|
|
143
|
-
</div>
|
|
144
|
-
</div>
|
|
145
|
-
</div>
|
|
146
|
-
</Container>
|
|
147
|
-
);
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
const SEAT_PRICE = 25;
|
|
151
|
-
const RENDER_UNIT_PRICE = 10;
|
|
152
|
-
|
|
153
|
-
const icon: React.CSSProperties = {
|
|
154
|
-
height: 16,
|
|
155
|
-
marginLeft: 4,
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
export const CompanyPricing: React.FC = () => {
|
|
159
|
-
const [devSeatCount, setDevSeatCount] = React.useState(1);
|
|
160
|
-
const [cloudRenders, setCloudRenders] = React.useState(1000);
|
|
161
|
-
|
|
162
|
-
const formatPrice = useCallback((price: number) => {
|
|
163
|
-
const formatter = new Intl.NumberFormat('en-US', {
|
|
164
|
-
style: 'currency',
|
|
165
|
-
currency: 'USD',
|
|
166
|
-
maximumFractionDigits: 0,
|
|
167
|
-
});
|
|
168
|
-
return formatter.format(price);
|
|
169
|
-
}, []);
|
|
170
|
-
|
|
171
|
-
const totalPrice = useMemo(() => {
|
|
172
|
-
return Math.max(
|
|
173
|
-
100,
|
|
174
|
-
devSeatCount * SEAT_PRICE + (cloudRenders / 1000) * RENDER_UNIT_PRICE,
|
|
175
|
-
);
|
|
176
|
-
}, [cloudRenders, devSeatCount]);
|
|
177
|
-
|
|
178
|
-
const totalPriceString = useMemo(() => {
|
|
179
|
-
return formatPrice(totalPrice);
|
|
180
|
-
}, [formatPrice, totalPrice]);
|
|
181
|
-
|
|
182
|
-
return (
|
|
183
|
-
<Container>
|
|
184
|
-
<Audience>For collaborations and companies of 4+ people</Audience>
|
|
185
|
-
<Title>Company License</Title>
|
|
186
|
-
<PricingBulletPoint text="Commercial use allowed" checked />
|
|
187
|
-
<PricingBulletPoint text="Self-hosted cloud rendering allowed" checked />
|
|
188
|
-
<PricingBulletPoint text="Prioritized Support" checked />
|
|
189
|
-
<PricingBulletPoint text="$250 Mux credits" checked>
|
|
190
|
-
<InfoTooltip text="Credits for Mux.com. Applies only to new Mux customers." />
|
|
191
|
-
</PricingBulletPoint>
|
|
192
|
-
<div style={{height: 30}} />
|
|
193
|
-
<div className={'flex flex-col md:flex-row md:items-center'}>
|
|
194
|
-
<div style={textUnitWrapper}>
|
|
195
|
-
<div className={'fontbrand font-bold text-lg'}>Developer Seats</div>
|
|
196
|
-
<div className={'text-muted fontbrand text-sm'}>
|
|
197
|
-
Number of developers working with Remotion
|
|
198
|
-
</div>
|
|
199
|
-
</div>
|
|
200
|
-
<div style={{flex: 3}} className="hidden md:block" />
|
|
201
|
-
<div className="flex flex-row items-center justify-between mt-3 md:mt-0">
|
|
202
|
-
<Counter
|
|
203
|
-
count={devSeatCount}
|
|
204
|
-
setCount={setDevSeatCount}
|
|
205
|
-
minCount={1}
|
|
206
|
-
/>
|
|
207
|
-
<SmallPriceTag>
|
|
208
|
-
$
|
|
209
|
-
{new Intl.NumberFormat('en-US', {
|
|
210
|
-
maximumFractionDigits: 0,
|
|
211
|
-
}).format(SEAT_PRICE * devSeatCount)}
|
|
212
|
-
</SmallPriceTag>
|
|
213
|
-
</div>
|
|
214
|
-
</div>
|
|
215
|
-
<div style={{height: 14}} />
|
|
216
|
-
<div className={'flex flex-col md:flex-row md:items-center'}>
|
|
217
|
-
<div style={textUnitWrapper}>
|
|
218
|
-
<div className={'fontbrand font-bold text-lg'}>Video renders</div>
|
|
219
|
-
<div className={'text-muted fontbrand text-sm'}>
|
|
220
|
-
<a
|
|
221
|
-
href="https://www.remotion.dev/docs/render"
|
|
222
|
-
className="underline underline-offset-4 text-inherit"
|
|
223
|
-
>
|
|
224
|
-
Renders per month (self-hosted)
|
|
225
|
-
</a>
|
|
226
|
-
</div>
|
|
227
|
-
</div>
|
|
228
|
-
<div style={{flex: 3}} className="hidden md:block" />
|
|
229
|
-
<div className="flex flex-row items-center justify-between mt-3 md:mt-0">
|
|
230
|
-
<Counter
|
|
231
|
-
count={cloudRenders}
|
|
232
|
-
setCount={setCloudRenders}
|
|
233
|
-
minCount={0}
|
|
234
|
-
step={1000}
|
|
235
|
-
/>
|
|
236
|
-
<SmallPriceTag>
|
|
237
|
-
$
|
|
238
|
-
{new Intl.NumberFormat('en-US', {
|
|
239
|
-
maximumFractionDigits: 0,
|
|
240
|
-
}).format((cloudRenders / 1000) * RENDER_UNIT_PRICE)}
|
|
241
|
-
</SmallPriceTag>
|
|
242
|
-
</div>
|
|
243
|
-
</div>
|
|
244
|
-
<div style={{height: 14}} />
|
|
245
|
-
<div className={'flex flex-row justify-end'}>
|
|
246
|
-
<div style={{...textUnitWrapper, alignItems: 'flex-end'}}>
|
|
247
|
-
<PriceTag>{totalPriceString}/mo</PriceTag>
|
|
248
|
-
<BottomInfo
|
|
249
|
-
data-visible={totalPrice <= 100}
|
|
250
|
-
className="opacity-0 data-[visible=true]:opacity-100 transition-opacity"
|
|
251
|
-
>
|
|
252
|
-
The minimum is $100 per month
|
|
253
|
-
</BottomInfo>
|
|
254
|
-
</div>
|
|
255
|
-
</div>
|
|
256
|
-
<div className={'flex flex-row justify-end mt-4'}>
|
|
257
|
-
<div
|
|
258
|
-
style={{
|
|
259
|
-
...textUnitWrapper,
|
|
260
|
-
alignItems: 'flex-end',
|
|
261
|
-
}}
|
|
262
|
-
>
|
|
263
|
-
<a
|
|
264
|
-
href="https://remotion.pro/dashboard"
|
|
265
|
-
className="font-brand text-brand flex flex-row items-center gap-1 no-underline"
|
|
266
|
-
>
|
|
267
|
-
Buy now{' '}
|
|
268
|
-
<svg
|
|
269
|
-
style={icon}
|
|
270
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
271
|
-
viewBox="0 0 448 512"
|
|
272
|
-
>
|
|
273
|
-
<path
|
|
274
|
-
fill="currentColor"
|
|
275
|
-
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"
|
|
276
|
-
/>
|
|
277
|
-
</svg>
|
|
278
|
-
</a>
|
|
279
|
-
</div>
|
|
280
|
-
</div>
|
|
281
|
-
</Container>
|
|
282
|
-
);
|
|
283
|
-
};
|