@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.
Files changed (107) hide show
  1. package/dist/Homepage.js +26 -27
  2. package/dist/Users/jonathanburger/remotion/packages/promo-pages/dist/Homepage.js +26 -27
  3. package/package.json +10 -10
  4. package/.turbo/turbo-lint.log +0 -15
  5. package/.turbo/turbo-make.log +0 -5
  6. package/bundle.ts +0 -54
  7. package/eslint.config.mjs +0 -7
  8. package/server.ts +0 -26
  9. package/src/cn.ts +0 -6
  10. package/src/components/Homepage.tsx +0 -87
  11. package/src/components/TeamPicture.tsx +0 -11
  12. package/src/components/homepage/BackgroundAnimation.tsx +0 -108
  13. package/src/components/homepage/ChooseTemplate.tsx +0 -57
  14. package/src/components/homepage/CommunityStats.tsx +0 -54
  15. package/src/components/homepage/CommunityStatsItems.tsx +0 -304
  16. package/src/components/homepage/Counter.tsx +0 -120
  17. package/src/components/homepage/Demo/Card.tsx +0 -273
  18. package/src/components/homepage/Demo/Cards.tsx +0 -129
  19. package/src/components/homepage/Demo/Comp.tsx +0 -157
  20. package/src/components/homepage/Demo/CurrentCountry.tsx +0 -97
  21. package/src/components/homepage/Demo/DemoError.tsx +0 -18
  22. package/src/components/homepage/Demo/DemoErrorIcon.tsx +0 -32
  23. package/src/components/homepage/Demo/DemoRender.tsx +0 -166
  24. package/src/components/homepage/Demo/DigitWheel.tsx +0 -179
  25. package/src/components/homepage/Demo/DisplayedEmoji.tsx +0 -93
  26. package/src/components/homepage/Demo/DoneCheckmark.tsx +0 -39
  27. package/src/components/homepage/Demo/DownloadNudge.tsx +0 -62
  28. package/src/components/homepage/Demo/DragAndDropNudge.tsx +0 -57
  29. package/src/components/homepage/Demo/EmojiCard.tsx +0 -200
  30. package/src/components/homepage/Demo/Minus.tsx +0 -21
  31. package/src/components/homepage/Demo/PlayPauseButton.tsx +0 -66
  32. package/src/components/homepage/Demo/PlayerControls.tsx +0 -48
  33. package/src/components/homepage/Demo/PlayerSeekBar.tsx +0 -325
  34. package/src/components/homepage/Demo/PlayerVolume.tsx +0 -83
  35. package/src/components/homepage/Demo/Progress.tsx +0 -38
  36. package/src/components/homepage/Demo/Spinner.tsx +0 -60
  37. package/src/components/homepage/Demo/Switcher.tsx +0 -54
  38. package/src/components/homepage/Demo/Temperature.tsx +0 -44
  39. package/src/components/homepage/Demo/TemperatureNumber.tsx +0 -68
  40. package/src/components/homepage/Demo/ThemeNudge.tsx +0 -72
  41. package/src/components/homepage/Demo/TimeDisplay.tsx +0 -43
  42. package/src/components/homepage/Demo/TrendingRepos.tsx +0 -106
  43. package/src/components/homepage/Demo/icons.tsx +0 -114
  44. package/src/components/homepage/Demo/index.tsx +0 -158
  45. package/src/components/homepage/Demo/math.ts +0 -43
  46. package/src/components/homepage/Demo/types.ts +0 -6
  47. package/src/components/homepage/EditorStarterSection.tsx +0 -76
  48. package/src/components/homepage/EvaluateRemotion.tsx +0 -92
  49. package/src/components/homepage/FreePricing.tsx +0 -283
  50. package/src/components/homepage/GetStartedStrip.tsx +0 -77
  51. package/src/components/homepage/GitHubButton.tsx +0 -23
  52. package/src/components/homepage/IconForTemplate.tsx +0 -170
  53. package/src/components/homepage/IfYouKnowReact.tsx +0 -68
  54. package/src/components/homepage/InfoTooltip.tsx +0 -25
  55. package/src/components/homepage/MoreTemplatesButton.tsx +0 -29
  56. package/src/components/homepage/MoreVideoPowerSection.tsx +0 -95
  57. package/src/components/homepage/MuxVideo.tsx +0 -68
  58. package/src/components/homepage/NewsletterButton.tsx +0 -89
  59. package/src/components/homepage/ParameterizeAndEdit.tsx +0 -106
  60. package/src/components/homepage/Pricing.tsx +0 -49
  61. package/src/components/homepage/PricingBulletPoint.tsx +0 -50
  62. package/src/components/homepage/RealMp4Videos.tsx +0 -108
  63. package/src/components/homepage/Spacer.tsx +0 -5
  64. package/src/components/homepage/TemplateIcon.tsx +0 -36
  65. package/src/components/homepage/TextInput.tsx +0 -62
  66. package/src/components/homepage/TrustedByBanner.tsx +0 -145
  67. package/src/components/homepage/VideoApps.tsx +0 -231
  68. package/src/components/homepage/VideoAppsShowcase.tsx +0 -270
  69. package/src/components/homepage/VideoAppsTitle.tsx +0 -11
  70. package/src/components/homepage/VideoPlayerWithControls.tsx +0 -189
  71. package/src/components/homepage/WriteInReact.tsx +0 -34
  72. package/src/components/homepage/YouAreHere.tsx +0 -30
  73. package/src/components/homepage/layout/Button.tsx +0 -93
  74. package/src/components/homepage/layout/colors.ts +0 -17
  75. package/src/components/homepage/layout/use-color-mode.tsx +0 -44
  76. package/src/components/homepage/layout/use-el-size.ts +0 -51
  77. package/src/components/homepage/layout/use-mobile-layout.ts +0 -8
  78. package/src/components/homepage/video-player.css +0 -24
  79. package/src/components/icons/blank.tsx +0 -13
  80. package/src/components/icons/clone.tsx +0 -10
  81. package/src/components/icons/code-hike.tsx +0 -15
  82. package/src/components/icons/cubes.tsx +0 -13
  83. package/src/components/icons/js.tsx +0 -17
  84. package/src/components/icons/music.tsx +0 -9
  85. package/src/components/icons/next.tsx +0 -64
  86. package/src/components/icons/overlay.tsx +0 -24
  87. package/src/components/icons/recorder.tsx +0 -23
  88. package/src/components/icons/remix.tsx +0 -27
  89. package/src/components/icons/skia.tsx +0 -13
  90. package/src/components/icons/stargazer.tsx +0 -13
  91. package/src/components/icons/still.tsx +0 -13
  92. package/src/components/icons/tailwind.tsx +0 -22
  93. package/src/components/icons/tiktok.tsx +0 -13
  94. package/src/components/icons/ts.tsx +0 -18
  95. package/src/components/icons/tts.tsx +0 -13
  96. package/src/components/icons/undo.tsx +0 -11
  97. package/src/components/icons/waveform.tsx +0 -13
  98. package/src/components/team/TeamCards.tsx +0 -167
  99. package/src/components/team/TitleTeamCards.tsx +0 -22
  100. package/src/components/team.css +0 -22
  101. package/src/components/team.tsx +0 -51
  102. package/src/fonts.css +0 -30
  103. package/src/index.css +0 -140
  104. package/src/main.tsx +0 -12
  105. package/src/team.tsx +0 -12
  106. package/tsconfig.json +0 -11
  107. package/vite.config.ts +0 -9
@@ -1,77 +0,0 @@
1
- import React, {useState} from 'react';
2
- import {GithubButton} from './GitHubButton';
3
- import {PlainButton} from './layout/Button';
4
-
5
- export const GetStarted: React.FC = () => {
6
- const [clicked, setClicked] = useState<number | null>(null);
7
-
8
- return (
9
- <div className="flex flex-col lg:flex-row items-center justify-center text-center w-full">
10
- <div className="w-full lg:w-auto">
11
- <div className="flex flex-row w-full ">
12
- {clicked ? (
13
- <div
14
- key={clicked}
15
- style={{
16
- animation: 'click 0.7s linear',
17
- animationFillMode: 'forwards',
18
- }}
19
- className="absolute z-0 top-0 font-mono text-sm text-center w-full"
20
- >
21
- Copied!
22
- </div>
23
- ) : null}
24
- <div
25
- className="bg-[#333] text-white rounded-lg px-4 font-mono hover:[#444] cursor-pointer justify-center items-center flex flex-1 min-h-12"
26
- onClick={() => {
27
- navigator.clipboard.writeText('npx create-video@latest');
28
-
29
- setClicked(Date.now());
30
- }}
31
- title="Click to copy"
32
- >
33
- $ npx create-video@latest
34
- </div>
35
- </div>
36
- </div>
37
- <div className="w-2 h-2" />
38
- <div className="w-full lg:w-auto">
39
- <a
40
- className={'no-underline w-full block'}
41
- href="https://www.youtube.com/watch?v=deg8bOoziaE"
42
- target="_blank"
43
- >
44
- <PlainButton size="sm" loading={false} className="w-full">
45
- Watch demo
46
- </PlainButton>
47
- </a>
48
- </div>
49
- <div style={{width: 10, height: 10}} />
50
- <a className={'no-underline w-full lg:w-auto'} href="/docs">
51
- <PlainButton size="sm" loading={false} className="w-full">
52
- Docs
53
- </PlainButton>
54
- </a>
55
- <div className="w-2 h-2" />
56
- <a
57
- className="no-underline w-full lg:w-auto"
58
- href="https://remotion.dev/discord"
59
- target="_blank"
60
- >
61
- <PlainButton size="sm" loading={false} className="w-full">
62
- Discord
63
- </PlainButton>
64
- </a>
65
- <div className="w-2 h-2" />
66
- <a
67
- className="no-underline w-full lg:w-auto"
68
- href="https://github.com/remotion-dev/remotion"
69
- target="_blank"
70
- >
71
- <PlainButton size="sm" loading={false} className="w-full">
72
- <GithubButton />
73
- </PlainButton>
74
- </a>
75
- </div>
76
- );
77
- };
@@ -1,23 +0,0 @@
1
- import React from 'react';
2
-
3
- const GithubIcon: React.FC = () => {
4
- return (
5
- <svg viewBox="0 0 496 512" style={{height: 24, marginRight: 8}}>
6
- <path
7
- fill="currentColor"
8
- d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"
9
- />
10
- </svg>
11
- );
12
- };
13
-
14
- export const GithubButton: React.FC = () => {
15
- return (
16
- <div className="flex flex-row items-center text-base">
17
- <GithubIcon /> <span>GitHub</span>{' '}
18
- <div className="text-xs inline-block ml-2 leading-none mt-[3px] self-center">
19
- {'24k'}
20
- </div>
21
- </div>
22
- );
23
- };
@@ -1,170 +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 {MusicIcon} from '../icons/music';
8
- import {NextIcon} from '../icons/next';
9
- import {OverlayIcon} from '../icons/overlay';
10
- import {Recorder} from '../icons/recorder';
11
- import {ReactRouterIcon} from '../icons/remix';
12
- import {SkiaIcon} from '../icons/skia';
13
- import {Stargazer} from '../icons/stargazer';
14
- import {StillIcon} from '../icons/still';
15
- import {TikTok} from '../icons/tiktok';
16
- import {TypeScriptIcon} from '../icons/ts';
17
- import {TTSIcon} from '../icons/tts';
18
- import {Waveform} from '../icons/waveform';
19
-
20
- export const IconForTemplate: React.FC<{
21
- readonly template: Template;
22
- readonly scale: number;
23
- }> = ({template, scale = 1}) => {
24
- if (template.cliId === 'hello-world') {
25
- return (
26
- <TypeScriptIcon
27
- style={{
28
- height: scale * 48,
29
- }}
30
- />
31
- );
32
- }
33
-
34
- if (template.cliId === 'blank') {
35
- return (
36
- <Blank
37
- style={{
38
- height: scale * 36,
39
- overflow: 'visible',
40
- }}
41
- />
42
- );
43
- }
44
-
45
- if (template.cliId === 'javascript') {
46
- return (
47
- <JSIcon
48
- style={{
49
- height: scale * 40,
50
- }}
51
- />
52
- );
53
- }
54
-
55
- if (template.cliId === 'three') {
56
- return (
57
- <Cubes
58
- style={{
59
- height: scale * 36,
60
- }}
61
- />
62
- );
63
- }
64
-
65
- if (template.cliId === 'still') {
66
- return (
67
- <StillIcon
68
- style={{
69
- height: scale * 36,
70
- }}
71
- />
72
- );
73
- }
74
-
75
- if (template.cliId === 'audiogram') {
76
- return (
77
- <Waveform
78
- style={{
79
- height: scale * 36,
80
- }}
81
- />
82
- );
83
- }
84
-
85
- if (template.cliId === 'tts') {
86
- return (
87
- <TTSIcon
88
- style={{
89
- height: scale * 36,
90
- }}
91
- />
92
- );
93
- }
94
-
95
- if (template.cliId === 'google-tts') {
96
- return (
97
- <TTSIcon
98
- style={{
99
- height: scale * 36,
100
- }}
101
- />
102
- );
103
- }
104
-
105
- if (template.cliId === 'skia') {
106
- return (
107
- <SkiaIcon
108
- style={{
109
- height: scale * 32,
110
- }}
111
- />
112
- );
113
- }
114
-
115
- if (template.cliId === 'music-visualization') {
116
- return (
117
- <MusicIcon
118
- style={{
119
- height: scale * 32,
120
- }}
121
- />
122
- );
123
- }
124
-
125
- if (template.cliId === 'react-router') {
126
- return (
127
- <ReactRouterIcon
128
- style={{
129
- height: scale * 32,
130
- }}
131
- />
132
- );
133
- }
134
-
135
- if (template.cliId === 'overlay') {
136
- return <OverlayIcon style={{height: scale * 42}} />;
137
- }
138
-
139
- if (template.cliId === 'recorder') {
140
- return <Recorder style={{height: scale * 36}} />;
141
- }
142
-
143
- if (
144
- template.cliId === 'next' ||
145
- template.cliId === 'next-tailwind' ||
146
- template.cliId === 'next-pages-dir'
147
- ) {
148
- return <NextIcon style={{height: scale * 36}} />;
149
- }
150
-
151
- if (template.cliId === 'stargazer') {
152
- return <Stargazer style={{height: scale * 36}} />;
153
- }
154
-
155
- if (template.cliId === 'tiktok') {
156
- return <TikTok style={{height: scale * 36}} />;
157
- }
158
-
159
- if (template.cliId === 'code-hike') {
160
- return <CodeHike style={{height: scale * 36}} />;
161
- }
162
-
163
- return (
164
- <Blank
165
- style={{
166
- height: scale * 40,
167
- }}
168
- />
169
- );
170
- };
@@ -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
- };