@remotion/promo-pages 4.0.504 → 4.0.506

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.
@@ -3,6 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { BackgroundAnimation } from './homepage/BackgroundAnimation';
4
4
  import CommunityStats from './homepage/CommunityStats';
5
5
  import { Demo } from './homepage/Demo';
6
+ import { DiscoverRemotion } from './homepage/DiscoverRemotion';
6
7
  import EvaluateRemotionSection from './homepage/EvaluateRemotion';
7
8
  import { ColorModeProvider } from './homepage/layout/use-color-mode';
8
9
  import { MakeVideosAgentically } from './homepage/MakeVideosAgentically';
@@ -10,6 +11,7 @@ import { MakeVideosInteractively } from './homepage/MakeVideosInteractively';
10
11
  import { MakeVideosProgrammatically } from './homepage/MakeVideosProgrammatically';
11
12
  import { NewsletterButton } from './homepage/NewsletterButton';
12
13
  import { Pricing } from './homepage/Pricing';
14
+ import { ReactSourceOfTruth } from './homepage/ReactSourceOfTruth';
13
15
  import TrustedByBanner from './homepage/TrustedByBanner';
14
16
  import { BuiltWithRemotionShowcase } from './homepage/VideoAppsShowcase';
15
17
  import { SectionTitle } from './homepage/VideoAppsTitle';
@@ -19,7 +21,7 @@ export const NewLanding = ({ colorMode, setColorMode }) => {
19
21
  return (_jsx(ColorModeProvider, { colorMode: colorMode, setColorMode: setColorMode, children: _jsx("div", { className: "w-full relative", children: _jsxs("div", { style: { overflow: 'hidden' }, children: [_jsx("div", { children: _jsx(BackgroundAnimation, {}) }), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsxs("div", { className: "max-w-[500px] lg:max-w-[1000px] m-auto pl-5 pr-5 overflow-x-clip md:overflow-x-visible relative", children: [_jsx(WriteInReact, {}), _jsx("br", {}), _jsxs("div", { className: makeVideosRowClassName, children: [_jsx(MakeVideosAgentically, { videoSrc: "/img/homepage-assets-master.webm", fallbackVideoSrc: "/img/homepage-assets-master.mp4" }), _jsx(MakeVideosInteractively, {}), _jsx(MakeVideosProgrammatically, { links: [
20
22
  { label: 'API Docs', href: '/docs/api' },
21
23
  { label: 'Resources', href: '/docs/resources' },
22
- ] })] }), _jsx("br", {}), _jsx("br", {}), _jsxs("div", { className: makeVideosRowClassName, children: [_jsx(MakeVideosProgrammatically, { title: "Design systems", description: "Create a library of animated assets for your organization.", videoSrc: "/img/design-systems.webm", fallbackVideoSrc: "/img/design-systems.mp4", links: [
24
+ ] })] }), _jsx(ReactSourceOfTruth, {}), _jsxs("div", { className: makeVideosRowClassName, children: [_jsx(MakeVideosProgrammatically, { title: "Design systems", description: "Create a library of animated assets for your organization.", videoSrc: "/img/design-systems.webm", fallbackVideoSrc: "/img/design-systems.mp4", links: [
23
25
  { label: 'Motion design systems', href: '/design-systems' },
24
26
  ] }), _jsx(MakeVideosAgentically, { title: "Batch rendering", description: "Render millions of videos on your own infrastructure.", links: [
25
27
  {
@@ -33,5 +35,5 @@ export const NewLanding = ({ colorMode, setColorMode }) => {
33
35
  ] }), _jsx(MakeVideosInteractively, { title: "Applications", description: "Publish a simple tool or a complex video editor.", videoSrc: "/img/applications.webm", fallbackVideoSrc: "/img/applications.mp4", links: [
34
36
  { label: 'Player', href: '/docs/player' },
35
37
  { label: 'Editor Starter', href: '/editor-starter' },
36
- ] })] }), _jsx(Demo, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(BuiltWithRemotionShowcase, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(SectionTitle, { children: "Pricing" }), _jsx(Pricing, {}), _jsx(TrustedByBanner, {}), _jsx("br", {}), _jsx(EvaluateRemotionSection, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(CommunityStats, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(NewsletterButton, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {})] })] }) }) }));
38
+ ] })] }), _jsx(DiscoverRemotion, {}), _jsx(Demo, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(BuiltWithRemotionShowcase, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(SectionTitle, { children: "Pricing" }), _jsx(Pricing, {}), _jsx(TrustedByBanner, {}), _jsx("br", {}), _jsx(EvaluateRemotionSection, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(CommunityStats, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {}), _jsx(NewsletterButton, {}), _jsx("br", {}), _jsx("br", {}), _jsx("br", {})] })] }) }) }));
37
39
  };
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import './DiscoverRemotion.css';
3
+ type Orientation = {
4
+ readonly x: number;
5
+ readonly y: number;
6
+ };
7
+ export declare const DiscoverRemotion: React.FC<{
8
+ readonly initialOrientation?: Orientation;
9
+ }>;
10
+ export {};
@@ -0,0 +1,114 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from '@remotion/design';
3
+ import { reduceMatrices, rotateX, rotateY } from '@remotion/svg-3d-engine';
4
+ import { useEffect, useState } from 'react';
5
+ import './DiscoverRemotion.css';
6
+ import { SectionTitle } from './VideoAppsTitle';
7
+ const meritRows = [
8
+ [
9
+ {
10
+ label: '1,000+ pages of docs',
11
+ href: '/docs',
12
+ },
13
+ {
14
+ label: '5M monthly npm downloads',
15
+ href: 'https://www.npmjs.com/package/remotion',
16
+ },
17
+ {
18
+ label: '55,000 GitHub stars',
19
+ href: 'https://github.com/remotion-dev/remotion',
20
+ },
21
+ ],
22
+ [
23
+ {
24
+ label: '20+ ready-to-use templates',
25
+ href: '/templates',
26
+ },
27
+ { label: 'Remotion Convert', href: '/convert' },
28
+ { label: 'Editor Starter', href: '/editor-starter' },
29
+ { label: 'Experts for hire', href: '/experts' },
30
+ ],
31
+ [
32
+ { label: 'Make videos in React', href: '/docs' },
33
+ { label: 'Server rendering', href: '/docs/ssr' },
34
+ {
35
+ label: 'Browser rendering',
36
+ href: '/docs/client-side-rendering',
37
+ },
38
+ { label: 'Drag & drop effects', href: '/docs/effects' },
39
+ { label: 'Animated captions', href: '/docs/captions' },
40
+ ],
41
+ [
42
+ { label: 'Elements library', href: '/elements' },
43
+ { label: 'Sound effects', href: '/docs/sfx' },
44
+ { label: 'Transition library', href: '/docs/transitions' },
45
+ { label: 'AI-native tooling', href: '/docs/ai' },
46
+ ],
47
+ [
48
+ {
49
+ label: 'Loved by OpenAI & Anthropic',
50
+ href: '/showcase',
51
+ },
52
+ {
53
+ label: 'Independent team, no VCs',
54
+ href: '/about',
55
+ },
56
+ {
57
+ label: 'Join us on Discord',
58
+ href: 'https://remotion.dev/discord',
59
+ },
60
+ ],
61
+ ];
62
+ const positionedRows = meritRows.map((row, rowIndex) => {
63
+ return row.map((merit, columnIndex) => {
64
+ const itemIndex = meritRows.slice(0, rowIndex).reduce((sum, items) => {
65
+ return sum + items.length;
66
+ }, 0) + columnIndex;
67
+ const x = row.length === 1 ? 0 : columnIndex / (row.length - 1) - 0.5;
68
+ const y = rowIndex / (meritRows.length - 1) - 0.5;
69
+ const mobileRow = Math.floor(itemIndex / 2);
70
+ const mobileRows = Math.ceil(meritRows.flat().length / 2);
71
+ const mobileY = mobileRow / Math.max(1, mobileRows - 1) - 0.5;
72
+ return {
73
+ ...merit,
74
+ desktopSizeFactor: 1 + Math.max(0, 1 - Math.hypot(x * 2, y * 2)) * 0.3,
75
+ isLast: itemIndex === meritRows.flat().length - 1,
76
+ mobileColumn: itemIndex % 2 === 0 ? 'left' : 'right',
77
+ rotationX: y * 40,
78
+ rotationY: x * -50,
79
+ mobileRotationX: mobileY * 26,
80
+ mobileRotationY: (itemIndex % 2 === 0 ? 1 : -1) * 12,
81
+ mobileSizeFactor: 1 + (1 - Math.abs(mobileY) * 2) * 0.3,
82
+ };
83
+ });
84
+ });
85
+ const MeritButton = ({ initialOrientation, isMobile, merit }) => {
86
+ const isExternal = merit.href.startsWith('http');
87
+ return (_jsx("div", { className: `discovery-merit discovery-merit-${merit.mobileColumn}${merit.isLast ? ' discovery-merit-last' : ''}`, style: {
88
+ '--discovery-size-factor': isMobile
89
+ ? merit.mobileSizeFactor
90
+ : merit.desktopSizeFactor,
91
+ }, children: _jsx(Button, { href: merit.href, target: isExternal ? '_blank' : undefined, rel: isExternal ? 'noreferrer' : undefined, depth: 1.5, initialTransform: reduceMatrices([
92
+ rotateX(((isMobile ? merit.mobileRotationX : merit.rotationX) +
93
+ initialOrientation.x) *
94
+ (Math.PI / 180)),
95
+ rotateY(((isMobile ? merit.mobileRotationY : merit.rotationY) +
96
+ initialOrientation.y) *
97
+ (Math.PI / 180)),
98
+ ]), className: "discovery-merit-button", children: merit.label }) }));
99
+ };
100
+ export const DiscoverRemotion = ({ initialOrientation = { x: 0, y: 0 } }) => {
101
+ const [isMobile, setIsMobile] = useState(false);
102
+ useEffect(() => {
103
+ const mediaQuery = window.matchMedia('(max-width: 767px)');
104
+ const updateLayout = () => setIsMobile(mediaQuery.matches);
105
+ updateLayout();
106
+ mediaQuery.addEventListener('change', updateLayout);
107
+ return () => mediaQuery.removeEventListener('change', updateLayout);
108
+ }, []);
109
+ return (_jsxs("section", { className: "discovery-section", children: [_jsx(SectionTitle, { children: "Discover Remotion" }), _jsx("p", { className: "discovery-subtitle", children: "The most complete ecosystem for programmatic video creation." }), _jsx("div", { className: "discovery-perspective", children: _jsx("div", { className: "discovery-cluster", children: positionedRows.map((row, rowIndex) => {
110
+ return (_jsx("div", { className: "discovery-row", children: row.map((merit) => {
111
+ return (_jsx(MeritButton, { initialOrientation: initialOrientation, isMobile: isMobile, merit: merit }, `${merit.label}-${isMobile ? 'mobile' : 'desktop'}`));
112
+ }) }, rowIndex));
113
+ }) }) })] }));
114
+ };
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const ReactSourceOfTruth: React.FC;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const ReactSourceOfTruth = () => {
3
+ return (_jsx("section", { "aria-labelledby": "react-source-of-truth", className: "mb-16 mt-[60px] hidden items-center justify-center gap-2 lg:flex", children: _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsxs("svg", { "aria-hidden": "true", className: "h-6 w-6 text-[var(--subtitle)]", fill: "none", viewBox: "0 0 64 64", children: [_jsx("ellipse", { cx: "32", cy: "32", rx: "26", ry: "10", stroke: "currentColor", strokeWidth: "5" }), _jsx("ellipse", { cx: "32", cy: "32", rx: "26", ry: "10", stroke: "currentColor", strokeWidth: "5", transform: "rotate(60 32 32)" }), _jsx("ellipse", { cx: "32", cy: "32", rx: "26", ry: "10", stroke: "currentColor", strokeWidth: "5", transform: "rotate(120 32 32)" }), _jsx("circle", { cx: "32", cy: "32", fill: "currentColor", r: "3.5" })] }), _jsx("p", { id: "react-source-of-truth", className: "m-0 font-brand leading-relaxed", children: "Switch workflows at any time. Code is always the source of truth." }), _jsx("svg", { "aria-hidden": "true", className: "h-6 w-6 text-[var(--subtitle)]", fill: "currentColor", viewBox: "0 0 640 640", children: _jsx("path", { d: "M176 168C189.3 168 200 157.3 200 144C200 130.7 189.3 120 176 120C162.7 120 152 130.7 152 144C152 157.3 162.7 168 176 168zM256 144C256 176.8 236.3 205 208 217.3L208 288L384 288C410.5 288 432 266.5 432 240L432 217.3C403.7 205 384 176.8 384 144C384 99.8 419.8 64 464 64C508.2 64 544 99.8 544 144C544 176.8 524.3 205 496 217.3L496 240C496 301.9 445.9 352 384 352L208 352L208 422.7C236.3 435 256 463.2 256 496C256 540.2 220.2 576 176 576C131.8 576 96 540.2 96 496C96 463.2 115.7 435 144 422.7L144 217.4C115.7 205 96 176.8 96 144C96 99.8 131.8 64 176 64C220.2 64 256 99.8 256 144zM488 144C488 130.7 477.3 120 464 120C450.7 120 440 130.7 440 144C440 157.3 450.7 168 464 168C477.3 168 488 157.3 488 144zM176 520C189.3 520 200 509.3 200 496C200 482.7 189.3 472 176 472C162.7 472 152 482.7 152 496C152 509.3 162.7 520 176 520z" }) })] }) }));
4
+ };