@remotion/promo-pages 4.0.361 → 4.0.363

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 (189) hide show
  1. package/dist/Homepage.js +689 -621
  2. package/dist/Users/jonathanburger/remotion/packages/promo-pages/dist/Homepage.js +689 -621
  3. package/dist/cn.d.ts +2 -0
  4. package/dist/cn.js +5 -0
  5. package/dist/components/Homepage.d.ts +6 -0
  6. package/dist/components/Homepage.js +21 -0
  7. package/dist/components/TeamPicture.d.ts +1 -0
  8. package/dist/components/TeamPicture.js +4 -0
  9. package/dist/components/homepage/BackgroundAnimation.d.ts +2 -0
  10. package/dist/components/homepage/BackgroundAnimation.js +66 -0
  11. package/dist/components/homepage/ChooseTemplate.d.ts +2 -0
  12. package/dist/components/homepage/ChooseTemplate.js +27 -0
  13. package/dist/components/homepage/CommunityStats.d.ts +3 -0
  14. package/dist/components/homepage/CommunityStats.js +6 -0
  15. package/dist/components/homepage/CommunityStatsItems.d.ts +7 -0
  16. package/dist/components/homepage/CommunityStatsItems.js +58 -0
  17. package/dist/components/homepage/Counter.d.ts +9 -0
  18. package/dist/components/homepage/Counter.js +55 -0
  19. package/dist/components/homepage/Demo/Card.d.ts +15 -0
  20. package/dist/components/homepage/Demo/Card.js +174 -0
  21. package/dist/components/homepage/Demo/Cards.d.ts +15 -0
  22. package/dist/components/homepage/Demo/Cards.js +57 -0
  23. package/dist/components/homepage/Demo/Comp.d.ts +38 -0
  24. package/dist/components/homepage/Demo/Comp.js +71 -0
  25. package/dist/components/homepage/Demo/CurrentCountry.d.ts +9 -0
  26. package/dist/components/homepage/Demo/CurrentCountry.js +48 -0
  27. package/dist/components/homepage/Demo/DemoError.d.ts +2 -0
  28. package/dist/components/homepage/Demo/DemoError.js +10 -0
  29. package/dist/components/homepage/Demo/DemoErrorIcon.d.ts +2 -0
  30. package/dist/components/homepage/Demo/DemoErrorIcon.js +16 -0
  31. package/dist/components/homepage/Demo/DemoRender.d.ts +102 -0
  32. package/dist/components/homepage/Demo/DemoRender.js +95 -0
  33. package/dist/components/homepage/Demo/DigitWheel.d.ts +9 -0
  34. package/dist/components/homepage/Demo/DigitWheel.js +94 -0
  35. package/dist/components/homepage/Demo/DisplayedEmoji.d.ts +5 -0
  36. package/dist/components/homepage/Demo/DisplayedEmoji.js +64 -0
  37. package/dist/components/homepage/Demo/DoneCheckmark.d.ts +2 -0
  38. package/dist/components/homepage/Demo/DoneCheckmark.js +20 -0
  39. package/dist/components/homepage/Demo/DownloadNudge.d.ts +2 -0
  40. package/dist/components/homepage/Demo/DownloadNudge.js +27 -0
  41. package/dist/components/homepage/Demo/DragAndDropNudge.d.ts +3 -0
  42. package/dist/components/homepage/Demo/DragAndDropNudge.js +26 -0
  43. package/dist/components/homepage/Demo/EmojiCard.d.ts +10 -0
  44. package/dist/components/homepage/Demo/EmojiCard.js +120 -0
  45. package/dist/components/homepage/Demo/Minus.d.ts +5 -0
  46. package/dist/components/homepage/Demo/Minus.js +11 -0
  47. package/dist/components/homepage/Demo/PlayPauseButton.d.ts +5 -0
  48. package/dist/components/homepage/Demo/PlayPauseButton.js +47 -0
  49. package/dist/components/homepage/Demo/PlayerControls.d.ts +8 -0
  50. package/dist/components/homepage/Demo/PlayerControls.js +15 -0
  51. package/dist/components/homepage/Demo/PlayerSeekBar.d.ts +11 -0
  52. package/dist/components/homepage/Demo/PlayerSeekBar.js +216 -0
  53. package/dist/components/homepage/Demo/PlayerVolume.d.ts +5 -0
  54. package/dist/components/homepage/Demo/PlayerVolume.js +53 -0
  55. package/dist/components/homepage/Demo/Progress.d.ts +4 -0
  56. package/dist/components/homepage/Demo/Progress.js +14 -0
  57. package/dist/components/homepage/Demo/Spinner.d.ts +5 -0
  58. package/dist/components/homepage/Demo/Spinner.js +37 -0
  59. package/dist/components/homepage/Demo/Switcher.d.ts +6 -0
  60. package/dist/components/homepage/Demo/Switcher.js +25 -0
  61. package/dist/components/homepage/Demo/Temperature.d.ts +6 -0
  62. package/dist/components/homepage/Demo/Temperature.js +21 -0
  63. package/dist/components/homepage/Demo/TemperatureNumber.d.ts +5 -0
  64. package/dist/components/homepage/Demo/TemperatureNumber.js +36 -0
  65. package/dist/components/homepage/Demo/ThemeNudge.d.ts +3 -0
  66. package/dist/components/homepage/Demo/ThemeNudge.js +35 -0
  67. package/dist/components/homepage/Demo/TimeDisplay.d.ts +6 -0
  68. package/dist/components/homepage/Demo/TimeDisplay.js +27 -0
  69. package/dist/components/homepage/Demo/TrendingRepos.d.ts +6 -0
  70. package/dist/components/homepage/Demo/TrendingRepos.js +65 -0
  71. package/dist/components/homepage/Demo/icons.d.ts +10 -0
  72. package/dist/components/homepage/Demo/icons.js +22 -0
  73. package/dist/components/homepage/Demo/index.d.ts +2 -0
  74. package/dist/components/homepage/Demo/index.js +95 -0
  75. package/dist/components/homepage/Demo/math.d.ts +10 -0
  76. package/dist/components/homepage/Demo/math.js +29 -0
  77. package/dist/components/homepage/Demo/types.d.ts +6 -0
  78. package/dist/components/homepage/Demo/types.js +0 -0
  79. package/dist/components/homepage/EditorStarterSection.d.ts +3 -0
  80. package/dist/components/homepage/EditorStarterSection.js +8 -0
  81. package/dist/components/homepage/EvaluateRemotion.d.ts +3 -0
  82. package/dist/components/homepage/EvaluateRemotion.js +38 -0
  83. package/dist/components/homepage/FreePricing.d.ts +4 -0
  84. package/dist/components/homepage/FreePricing.js +69 -0
  85. package/dist/components/homepage/GetStartedStrip.d.ts +2 -0
  86. package/dist/components/homepage/GetStartedStrip.js +14 -0
  87. package/dist/components/homepage/GitHubButton.d.ts +2 -0
  88. package/dist/components/homepage/GitHubButton.js +7 -0
  89. package/dist/components/homepage/IconForTemplate.d.ts +6 -0
  90. package/dist/components/homepage/IconForTemplate.js +98 -0
  91. package/dist/components/homepage/IfYouKnowReact.d.ts +3 -0
  92. package/dist/components/homepage/IfYouKnowReact.js +23 -0
  93. package/dist/components/homepage/InfoTooltip.d.ts +6 -0
  94. package/dist/components/homepage/InfoTooltip.js +6 -0
  95. package/dist/components/homepage/MoreTemplatesButton.d.ts +2 -0
  96. package/dist/components/homepage/MoreTemplatesButton.js +10 -0
  97. package/dist/components/homepage/MoreVideoPowerSection.d.ts +2 -0
  98. package/dist/components/homepage/MoreVideoPowerSection.js +16 -0
  99. package/dist/components/homepage/MuxVideo.d.ts +7 -0
  100. package/dist/components/homepage/MuxVideo.js +45 -0
  101. package/dist/components/homepage/NewsletterButton.d.ts +2 -0
  102. package/dist/components/homepage/NewsletterButton.js +39 -0
  103. package/dist/components/homepage/ParameterizeAndEdit.d.ts +2 -0
  104. package/dist/components/homepage/ParameterizeAndEdit.js +22 -0
  105. package/dist/components/homepage/Pricing.d.ts +2 -0
  106. package/dist/components/homepage/Pricing.js +15 -0
  107. package/dist/components/homepage/PricingBulletPoint.d.ts +6 -0
  108. package/dist/components/homepage/PricingBulletPoint.js +19 -0
  109. package/dist/components/homepage/RealMp4Videos.d.ts +2 -0
  110. package/dist/components/homepage/RealMp4Videos.js +41 -0
  111. package/dist/components/homepage/Spacer.d.ts +2 -0
  112. package/dist/components/homepage/Spacer.js +4 -0
  113. package/dist/components/homepage/TemplateIcon.d.ts +5 -0
  114. package/dist/components/homepage/TemplateIcon.js +24 -0
  115. package/dist/components/homepage/TextInput.d.ts +7 -0
  116. package/dist/components/homepage/TextInput.js +34 -0
  117. package/dist/components/homepage/TrustedByBanner.d.ts +2 -0
  118. package/dist/components/homepage/TrustedByBanner.js +27 -0
  119. package/dist/components/homepage/VideoApps.d.ts +4 -0
  120. package/dist/components/homepage/VideoApps.js +72 -0
  121. package/dist/components/homepage/VideoAppsShowcase.d.ts +3 -0
  122. package/dist/components/homepage/VideoAppsShowcase.js +133 -0
  123. package/dist/components/homepage/VideoAppsTitle.d.ts +4 -0
  124. package/dist/components/homepage/VideoAppsTitle.js +4 -0
  125. package/dist/components/homepage/VideoPlayerWithControls.d.ts +20 -0
  126. package/dist/components/homepage/VideoPlayerWithControls.js +105 -0
  127. package/dist/components/homepage/WriteInReact.d.ts +2 -0
  128. package/dist/components/homepage/WriteInReact.js +10 -0
  129. package/dist/components/homepage/YouAreHere.d.ts +2 -0
  130. package/dist/components/homepage/YouAreHere.js +23 -0
  131. package/dist/components/homepage/layout/Button.d.ts +19 -0
  132. package/dist/components/homepage/layout/Button.js +29 -0
  133. package/dist/components/homepage/layout/colors.d.ts +13 -0
  134. package/dist/components/homepage/layout/colors.js +14 -0
  135. package/dist/components/homepage/layout/use-color-mode.d.ts +21 -0
  136. package/dist/components/homepage/layout/use-color-mode.js +22 -0
  137. package/dist/components/homepage/layout/use-el-size.d.ts +5 -0
  138. package/dist/components/homepage/layout/use-el-size.js +40 -0
  139. package/dist/components/homepage/layout/use-mobile-layout.d.ts +1 -0
  140. package/dist/components/homepage/layout/use-mobile-layout.js +6 -0
  141. package/dist/components/icons/blank.d.ts +3 -0
  142. package/dist/components/icons/blank.js +4 -0
  143. package/dist/components/icons/clone.d.ts +2 -0
  144. package/dist/components/icons/clone.js +2 -0
  145. package/dist/components/icons/code-hike.d.ts +3 -0
  146. package/dist/components/icons/code-hike.js +4 -0
  147. package/dist/components/icons/cubes.d.ts +3 -0
  148. package/dist/components/icons/cubes.js +4 -0
  149. package/dist/components/icons/js.d.ts +3 -0
  150. package/dist/components/icons/js.js +4 -0
  151. package/dist/components/icons/music.d.ts +2 -0
  152. package/dist/components/icons/music.js +4 -0
  153. package/dist/components/icons/next.d.ts +4 -0
  154. package/dist/components/icons/next.js +4 -0
  155. package/dist/components/icons/overlay.d.ts +3 -0
  156. package/dist/components/icons/overlay.js +4 -0
  157. package/dist/components/icons/recorder.d.ts +3 -0
  158. package/dist/components/icons/recorder.js +4 -0
  159. package/dist/components/icons/remix.d.ts +3 -0
  160. package/dist/components/icons/remix.js +4 -0
  161. package/dist/components/icons/skia.d.ts +3 -0
  162. package/dist/components/icons/skia.js +4 -0
  163. package/dist/components/icons/stargazer.d.ts +3 -0
  164. package/dist/components/icons/stargazer.js +4 -0
  165. package/dist/components/icons/still.d.ts +3 -0
  166. package/dist/components/icons/still.js +4 -0
  167. package/dist/components/icons/tailwind.d.ts +3 -0
  168. package/dist/components/icons/tailwind.js +4 -0
  169. package/dist/components/icons/tiktok.d.ts +3 -0
  170. package/dist/components/icons/tiktok.js +4 -0
  171. package/dist/components/icons/ts.d.ts +3 -0
  172. package/dist/components/icons/ts.js +4 -0
  173. package/dist/components/icons/tts.d.ts +3 -0
  174. package/dist/components/icons/tts.js +4 -0
  175. package/dist/components/icons/undo.d.ts +3 -0
  176. package/dist/components/icons/undo.js +2 -0
  177. package/dist/components/icons/waveform.d.ts +3 -0
  178. package/dist/components/icons/waveform.js +4 -0
  179. package/dist/components/team/TeamCards.d.ts +6 -0
  180. package/dist/components/team/TeamCards.js +19 -0
  181. package/dist/components/team/TitleTeamCards.d.ts +2 -0
  182. package/dist/components/team/TitleTeamCards.js +6 -0
  183. package/dist/components/team.d.ts +3 -0
  184. package/dist/components/team.js +14 -0
  185. package/dist/main.d.ts +1 -0
  186. package/dist/main.js +6 -0
  187. package/dist/team.d.ts +1 -0
  188. package/package.json +10 -10
  189. package/src/components/homepage/VideoPlayerWithControls.tsx +1 -0
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { BlueButton } from './layout/Button';
4
+ import { useColorMode } from './layout/use-color-mode';
5
+ import { Spacer } from './Spacer';
6
+ import { YouAreHere } from './YouAreHere';
7
+ const row = {
8
+ display: 'flex',
9
+ flexDirection: 'row',
10
+ };
11
+ const flex = {
12
+ flex: 1,
13
+ };
14
+ const list = {
15
+ listStyleType: 'none',
16
+ textAlign: 'center',
17
+ paddingLeft: 0,
18
+ display: 'flex',
19
+ flexDirection: 'column',
20
+ alignItems: 'center',
21
+ };
22
+ const hr = {
23
+ width: 20,
24
+ textAlign: 'center',
25
+ borderTop: 0,
26
+ marginTop: 10,
27
+ marginBottom: 10,
28
+ };
29
+ const docsButton = {
30
+ textDecoration: 'none',
31
+ };
32
+ const StepTitle = ({ children }) => {
33
+ return (_jsx("div", { className: "text-center text-xl font-semibold fontbrand mt-2", children: children }));
34
+ };
35
+ const Subtitle = ({ children }) => {
36
+ return (_jsx("div", { className: "text-center text-base fontbrand text-[var(--subtitle)]", children: children }));
37
+ };
38
+ const Pane = ({ children }) => {
39
+ return (_jsx("div", { className: "border-effect bg-pane flex-1 p-3 rounded-lg min-h-[500px] flex flex-col text-center", children: children }));
40
+ };
41
+ export const VideoApps = ({ active }) => {
42
+ const { colorMode } = useColorMode();
43
+ const [src, setSrc] = useState('/img/player-example.png');
44
+ const [src2, setSrc2] = useState('/img/player-example-dark.png');
45
+ useEffect(() => {
46
+ if (colorMode === 'dark') {
47
+ setSrc('/img/player-example-dark.png');
48
+ }
49
+ else {
50
+ setSrc('/img/player-example.png');
51
+ }
52
+ }, [colorMode]);
53
+ useEffect(() => {
54
+ setSrc2(colorMode === 'dark' ? '/img/cluster-dark.png' : '/img/cluster.png');
55
+ }, [colorMode]);
56
+ return (_jsx("div", { className: "w-full", children: _jsxs("div", { className: 'flex flex-col lg:flex-row gap-2', children: [_jsxs(Pane, { children: [active === 'remotion' ? _jsx(YouAreHere, {}) : null, _jsx(StepTitle, { children: "Remotion" }), _jsx(Subtitle, { children: "Make videos programmatically" }), _jsx("br", {}), _jsx("div", { style: {
57
+ display: 'flex',
58
+ justifyContent: 'center',
59
+ alignItems: 'center',
60
+ flex: 1,
61
+ }, children: _jsx("img", { className: "max-w-[300px]", src: "/img/writeinreact.png" }) }), _jsxs("ul", { style: list, children: [_jsx("li", { children: "Use the Web to create graphics" }), _jsx("hr", { style: hr }), _jsx("li", { children: "Consume user input and APIs" }), _jsx("hr", { style: hr }), _jsx("li", { children: "Render real MP4 videos" })] }), _jsxs("div", { style: row, children: [active === 'remotion' ? null : (_jsxs(_Fragment, { children: [_jsx("div", { style: flex, children: _jsx("a", { style: docsButton, href: "/", children: _jsx(BlueButton, { loading: false, size: "sm", children: "Learn more" }) }) }), _jsx(Spacer, {}), _jsx(Spacer, {})] })), _jsx("div", { style: flex, children: _jsx("a", { style: docsButton, href: "/docs", children: _jsx(BlueButton, { className: "w-full", loading: false, size: "sm", children: "Read docs" }) }) })] })] }), _jsxs(Pane, { children: [active === 'player' ? _jsx(YouAreHere, {}) : null, _jsx(StepTitle, { children: "Remotion Player" }), _jsx(Subtitle, { children: "Embeddable interactive videos" }), _jsx("br", {}), _jsx("div", { style: {
62
+ display: 'flex',
63
+ justifyContent: 'center',
64
+ alignItems: 'center',
65
+ flex: 1,
66
+ }, children: _jsx("img", { className: "max-w-[300px]", src: src }) }), _jsxs("ul", { style: list, children: [_jsx("li", { children: "Preview videos in the browser" }), _jsx("hr", { style: hr }), _jsx("li", { children: "React to user input" }), _jsx("hr", { style: hr }), _jsx("li", { children: "Customize look and behavior" })] }), _jsxs("div", { style: row, children: [active === 'player' ? null : (_jsxs(_Fragment, { children: [_jsx("div", { style: flex, children: _jsx("a", { style: docsButton, href: "/player", children: _jsx(BlueButton, { className: "w-full", loading: false, size: "sm", children: "Learn more" }) }) }), _jsx(Spacer, {}), _jsx(Spacer, {})] })), _jsx("div", { style: flex, children: _jsx("a", { style: docsButton, href: "/docs/player", children: _jsx(BlueButton, { className: "w-full", loading: false, size: "sm", children: "Read docs" }) }) })] })] }), _jsxs(Pane, { children: [active === 'lambda' ? _jsx(YouAreHere, {}) : null, _jsx(StepTitle, { children: "Remotion Lambda" }), _jsx(Subtitle, { children: "Render at scale" }), _jsx("br", {}), _jsx("div", { style: {
67
+ display: 'flex',
68
+ justifyContent: 'center',
69
+ alignItems: 'center',
70
+ flex: 1,
71
+ }, children: _jsx("img", { className: "max-w-[300px]", src: src2 }) }), _jsx("div", { className: "flex-1" }), _jsxs("ul", { style: list, children: [_jsx("li", { children: "Render videos in the cloud" }), _jsx("hr", { style: hr }), _jsx("li", { children: "Scale according to your volume" }), _jsx("hr", { style: hr }), _jsx("li", { children: "Fast because distributed" })] }), _jsxs("div", { style: row, children: [active === 'lambda' ? null : (_jsxs(_Fragment, { children: [_jsx("div", { style: flex, children: _jsx("a", { style: docsButton, href: "/lambda", children: _jsx(BlueButton, { className: "w-full", loading: false, size: "sm", children: "Learn more" }) }) }), _jsx(Spacer, {}), _jsx(Spacer, {})] })), _jsx("div", { style: flex, children: _jsx("a", { style: docsButton, href: "/docs/lambda", children: _jsx(BlueButton, { className: "w-full", loading: false, size: "sm", children: "Read docs" }) }) })] })] })] }) }));
72
+ };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const VideoAppsShowcase: React.FC;
3
+ export default VideoAppsShowcase;
@@ -0,0 +1,133 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from 'react';
3
+ import { IsMutedIcon, NotMutedIcon, PausedIcon, PlayingIcon } from './Demo/icons';
4
+ import { MuxVideo } from './MuxVideo';
5
+ import { SectionTitle } from './VideoAppsTitle';
6
+ const tabs = [
7
+ 'Music visualization',
8
+ 'Captions',
9
+ 'Screencast',
10
+ 'Year in review',
11
+ ];
12
+ const videoApps = [
13
+ {
14
+ title: 'Banger.Show',
15
+ description: 'The all-in-one 3D visual creation tool for ambitious artists. Seamlessly craft visuals that match your sound and propel your brand forward.',
16
+ link: 'https://banger.show?ref=remotion',
17
+ videoWidth: 1080,
18
+ videoHeight: 1080,
19
+ muxId: 'Kg02XHfkR6x8400BtO4Ica54XlSPimmmTRpqDHHUaeACk',
20
+ buttonText: 'Banger.Show website',
21
+ },
22
+ {
23
+ title: 'Submagic',
24
+ description: 'A video editor for creating short-form content fast. Designed for creators, teams and agencies, it accelerates video editing with AI-powered features such as descriptions, zooms, sound effects and music.',
25
+ additionalInfo: '',
26
+ link: 'https://www.submagic.co/?ref=remotion',
27
+ videoWidth: 540,
28
+ videoHeight: 1080,
29
+ muxId: 'pxqGEjlBBntnXrEe4v00pYUBw3FPgUPKumfhSym00Vs004',
30
+ buttonText: 'Submagic website',
31
+ },
32
+ {
33
+ title: 'Remotion Recorder',
34
+ description: 'The Remotion Recorder is a video production tool built entirely in JavaScript. Create high-quality videos that feel native on each platform while only editing them once.',
35
+ link: 'https://www.remotion.dev/recorder',
36
+ videoWidth: 1080,
37
+ videoHeight: 1080,
38
+ muxId: 'pHlwqDZFUH00Aubo9M001ty3gZ6YW8z689XTd9R479ayE',
39
+ buttonText: 'More infos',
40
+ },
41
+ {
42
+ title: 'GitHub Unwrapped',
43
+ description: 'Your coding year in review. Get a personalized video of your GitHub activity.',
44
+ additionalInfo: 'Uncover your go-to language, peak productivity hours, and track your GitHub impact – all in one video.',
45
+ link: 'https://githubunwrapped.com/',
46
+ videoWidth: 1080,
47
+ videoHeight: 1080,
48
+ muxId: 'OwQFvqomOR00q6yj5SWwaA7DBg01NaCPKcOvczoZqCty00',
49
+ buttonText: 'GitHub Unwrapped website',
50
+ },
51
+ ];
52
+ const icon = {
53
+ height: 16,
54
+ marginLeft: 10,
55
+ };
56
+ const VideoAppsShowcase = () => {
57
+ const [activeTab, setActiveTab] = useState(0);
58
+ const [isMuted, setIsMuted] = useState(true);
59
+ const [isPlaying, setIsPlaying] = useState(false);
60
+ const videoRef = useRef(null);
61
+ const containerRef = useRef(null);
62
+ // Remove the intersection observer autoplay logic
63
+ useEffect(() => {
64
+ const video = videoRef.current;
65
+ if (video) {
66
+ video.pause();
67
+ setIsPlaying(false);
68
+ video.currentTime = 0;
69
+ video.load();
70
+ }
71
+ }, [activeTab]);
72
+ const handlePlayPause = () => {
73
+ if (videoRef.current) {
74
+ if (videoRef.current.paused) {
75
+ const playPromise = videoRef.current.play();
76
+ if (playPromise !== undefined) {
77
+ playPromise
78
+ .then(() => {
79
+ setIsPlaying(true);
80
+ })
81
+ .catch((error) => {
82
+ // eslint-disable-next-line no-console
83
+ console.error('Playback error:', error);
84
+ setIsPlaying(false);
85
+ });
86
+ }
87
+ }
88
+ else {
89
+ videoRef.current.pause();
90
+ setIsPlaying(false);
91
+ }
92
+ }
93
+ };
94
+ const handleMuteToggle = () => {
95
+ if (videoRef.current) {
96
+ const newMutedState = !videoRef.current.muted;
97
+ videoRef.current.muted = newMutedState;
98
+ setIsMuted(newMutedState);
99
+ }
100
+ };
101
+ return (_jsxs("div", { ref: containerRef, children: [_jsx(SectionTitle, { children: "Use Cases" }), _jsx("div", { className: 'grid justify-center grid-flow-col grid-rows-1 gap-2.5 justify-self-center mb-4 w-[90vw] md:w-auto -mt-4', children: tabs.map((tab, index) => (_jsx("button", { type: "button", "data-active": index === activeTab, className: `bg-transparent border-none m-0 p-0 lg:mx-3 my-4 cursor-pointer text-base fontbrand font-bold transition-colors text-muted data-[active=true]:text-brand`, onClick: () => setActiveTab(index), children: tab }, tab))) }), _jsx("div", { className: 'card flex p-0 overflow-hidden', children: _jsxs("div", { className: 'flex-1 flex flex-col lg:flex-row justify-center', children: [_jsxs("div", { className: 'w-full max-w-[500px] aspect-square relative overflow-hidden bg-[#eee] cursor-pointer', onClick: handlePlayPause, children: [_jsx(MuxVideo, { ref: videoRef, muxId: videoApps[activeTab].muxId, className: 'absolute left-0 top-0 w-full h-full object-contain rounded-sm rounded-tr-none rounded-br-none', loop: true, playsInline: true, muted: isMuted }), _jsx("button", { type: "button", className: 'absolute bottom-2.5 left-2.5 bg-white text-black rounded-full w-8 h-8 flex justify-center items-center text-base cursor-pointer transition-colors border-2 border-black border-solid', onClick: (e) => {
102
+ e.stopPropagation();
103
+ handlePlayPause();
104
+ }, children: isPlaying ? (_jsx(PlayingIcon, { style: {
105
+ width: 12,
106
+ height: 20,
107
+ marginLeft: '2px',
108
+ marginTop: '1px',
109
+ } })) : (_jsx(PausedIcon, { style: {
110
+ width: 14,
111
+ height: 16,
112
+ marginLeft: '2px',
113
+ marginTop: '0.5px',
114
+ } })) }), _jsx("button", { type: "button", className: 'absolute bottom-2.5 right-2.5 bg-white text-black rounded-full w-8 h-8 flex justify-center items-center text-base cursor-pointer transition-colors border-2 border-black border-solid', onClick: (e) => {
115
+ e.stopPropagation();
116
+ handleMuteToggle();
117
+ }, children: isMuted ? (_jsx(IsMutedIcon, { style: {
118
+ width: 16,
119
+ height: 16,
120
+ marginTop: '1px',
121
+ } })) : (_jsx(NotMutedIcon, { style: {
122
+ width: 16,
123
+ height: 16,
124
+ marginTop: '1px',
125
+ } })) })] }), _jsxs("div", { className: 'p-6 flex-1 flex flex-col h-full', children: [_jsx("div", { className: "text-4xl font-bold fontbrand mt-0", children: videoApps[activeTab].title }), _jsx("div", { className: "text-muted mt-4 text-base fontbrand", children: videoApps[activeTab].description }), videoApps[activeTab].additionalInfo ? (_jsx("div", { className: "text-muted mt-4 text-base fontbrand", children: videoApps[activeTab].additionalInfo })) : null, _jsx("div", { className: "h-5" }), _jsxs("a", { className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center", href: videoApps[activeTab].link, children: [videoApps[activeTab].buttonText, _jsx("svg", { style: icon, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 448 512", children: _jsx("path", { fill: "currentColor", 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" }) })] })] })] }) }), _jsx("div", { style: {
126
+ marginTop: '1rem',
127
+ justifyContent: 'center',
128
+ display: 'flex',
129
+ }, children: _jsxs("div", { style: {
130
+ fontFamily: 'GTPlanar',
131
+ }, children: ["For more examples see our", ' ', _jsx("a", { href: "/showcase", className: "bluelink", children: "Showcase page" }), "."] }) })] }));
132
+ };
133
+ export default VideoAppsShowcase;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const SectionTitle: React.FC<{
3
+ readonly children: React.ReactNode;
4
+ }>;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const SectionTitle = ({ children, }) => {
3
+ return (_jsx("div", { className: 'text-center', children: _jsx("h2", { className: 'fontbrand text-4xl', children: children }) }));
4
+ };
@@ -0,0 +1,20 @@
1
+ import type Plyr from 'plyr';
2
+ import 'plyr/dist/plyr.css';
3
+ import './video-player.css';
4
+ export interface HTMLVideoElementWithPlyr extends HTMLVideoElement {
5
+ plyr: Plyr;
6
+ }
7
+ type Props = {
8
+ readonly playbackId: string;
9
+ readonly poster: string;
10
+ readonly currentTime?: number;
11
+ readonly onLoaded: () => void;
12
+ readonly onError: (error: ErrorEvent) => void;
13
+ readonly onSize: (dim: {
14
+ width: number;
15
+ height: number;
16
+ }) => void;
17
+ readonly autoPlay?: boolean;
18
+ };
19
+ export declare const VideoPlayerWithControls: import("react").ForwardRefExoticComponent<Props & import("react").RefAttributes<HTMLVideoElementWithPlyr>>;
20
+ export {};
@@ -0,0 +1,105 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /* eslint-disable no-console */
3
+ /* eslint-disable react/require-default-props */
4
+ import Hls from 'hls.js';
5
+ // eslint-disable-next-line no-restricted-imports
6
+ import 'plyr/dist/plyr.css';
7
+ import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
8
+ import './video-player.css';
9
+ const useCombinedRefs = function (...refs) {
10
+ const targetRef = useRef(null);
11
+ useEffect(() => {
12
+ refs.forEach((ref) => {
13
+ if (!ref)
14
+ return;
15
+ if (typeof ref === 'function') {
16
+ ref(targetRef.current);
17
+ }
18
+ else {
19
+ ref.current = targetRef.current;
20
+ }
21
+ });
22
+ }, [refs]);
23
+ return targetRef;
24
+ };
25
+ export const VideoPlayerWithControls = forwardRef(({ playbackId, poster, currentTime, onLoaded, onError, onSize, autoPlay }, ref) => {
26
+ const videoRef = useRef(null);
27
+ const metaRef = useCombinedRefs(ref, videoRef);
28
+ const playerRef = useRef(null);
29
+ const [playerInitTime] = useState(Date.now());
30
+ const videoError = useCallback((event) => onError(event), [onError]);
31
+ const onImageLoad = useCallback((event) => {
32
+ const [w, h] = [event.target.width, event.target.height];
33
+ if (w && h) {
34
+ onSize({ width: w, height: h });
35
+ onLoaded();
36
+ }
37
+ else {
38
+ onLoaded();
39
+ console.error('Error getting img dimensions', event);
40
+ }
41
+ }, [onLoaded, onSize]);
42
+ /*
43
+ * See comment above -- we're loading the poster image just so we can grab the dimensions
44
+ * which determines styles for the player
45
+ */
46
+ useEffect(() => {
47
+ const img = new Image();
48
+ img.onload = (evt) => onImageLoad(evt);
49
+ img.src = poster;
50
+ }, [onImageLoad, poster]);
51
+ useEffect(() => {
52
+ const video = videoRef.current;
53
+ const src = `https://stream.mux.com/${playbackId}.m3u8`;
54
+ let hls;
55
+ hls = null;
56
+ if (video) {
57
+ video.addEventListener('error', videoError);
58
+ const Plyr = require('plyr');
59
+ playerRef.current = new Plyr(video, {
60
+ previewThumbnails: {
61
+ enabled: true,
62
+ src: `https://image.mux.com/${playbackId}/storyboard.vtt`,
63
+ },
64
+ storage: { enabled: false },
65
+ fullscreen: {
66
+ iosNative: true,
67
+ },
68
+ captions: { active: true, language: 'auto', update: true },
69
+ });
70
+ if (video.canPlayType('application/vnd.apple.mpegurl')) {
71
+ // This will run in safari, where HLS is supported natively
72
+ video.src = src;
73
+ }
74
+ else if (Hls.isSupported()) {
75
+ // This will run in all other modern browsers
76
+ hls = new Hls();
77
+ hls.loadSource(src);
78
+ hls.attachMedia(video);
79
+ hls.on(Hls.Events.ERROR, (_event, data) => {
80
+ if (data.fatal) {
81
+ videoError(new ErrorEvent('HLS.js fatal error'));
82
+ }
83
+ });
84
+ }
85
+ else {
86
+ console.error('This is an old browser that does not support MSE https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API');
87
+ }
88
+ }
89
+ return () => {
90
+ if (video) {
91
+ video.removeEventListener('error', videoError);
92
+ }
93
+ if (hls) {
94
+ hls.destroy();
95
+ }
96
+ };
97
+ }, [playbackId, playerInitTime, videoError, videoRef]);
98
+ useEffect(() => {
99
+ const video = videoRef.current;
100
+ if (currentTime && video) {
101
+ video.currentTime = currentTime;
102
+ }
103
+ }, [currentTime]);
104
+ return (_jsx("div", { className: "video-container", children: _jsx("video", { ref: metaRef, autoPlay: autoPlay, poster: poster, controls: true, playsInline: true }) }));
105
+ });
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const WriteInReact: React.FC;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ChooseTemplate } from './ChooseTemplate';
3
+ import { GetStarted } from './GetStartedStrip';
4
+ export const WriteInReact = () => {
5
+ return (_jsxs("div", { children: [_jsx("h1", { className: "text-5xl lg:text-[5em] text-center fontbrand font-black leading-none ", style: {
6
+ textShadow: '0 5px 30px var(--background)',
7
+ }, children: "Make videos programmatically." }), _jsxs("p", { style: {
8
+ textShadow: '0 5px 30px var(--background)',
9
+ }, className: "font-medium text-center text-lg", children: ["Create real MP4 videos with React. ", _jsx("br", {}), "Parametrize content, render server-side and build applications."] }), _jsx("br", {}), _jsx("div", { children: _jsx(GetStarted, {}) }), _jsx("br", {}), _jsx("br", {}), _jsx(ChooseTemplate, {})] }));
10
+ };
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const YouAreHere: React.FC;
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ const container = {
3
+ width: '100%',
4
+ display: 'inline-flex',
5
+ justifyContent: 'center',
6
+ position: 'relative',
7
+ };
8
+ const label = {
9
+ backgroundColor: 'var(--ifm-color-primary)',
10
+ fontWeight: 'bold',
11
+ color: 'white',
12
+ paddingLeft: 8,
13
+ paddingRight: 8,
14
+ paddingTop: 4,
15
+ paddingBottom: 4,
16
+ borderRadius: 6,
17
+ fontSize: 13,
18
+ position: 'absolute',
19
+ marginTop: -25,
20
+ };
21
+ export const YouAreHere = () => {
22
+ return (_jsx("div", { style: container, children: _jsx("div", { style: label, children: "YOU ARE HERE" }) }));
23
+ };
@@ -0,0 +1,19 @@
1
+ import type { ButtonHTMLAttributes, DetailedHTMLProps } from 'react';
2
+ import React from 'react';
3
+ type ExtraProps = {
4
+ readonly size: Size;
5
+ readonly background: string;
6
+ readonly hoverColor?: string;
7
+ readonly color: string;
8
+ readonly loading: boolean;
9
+ };
10
+ type Size = 'sm' | 'bg';
11
+ type Props = DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement> & ExtraProps;
12
+ type MandatoryProps = Omit<ExtraProps, 'background' | 'color' | 'hoverColor'>;
13
+ type PrestyledProps = DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement> & MandatoryProps;
14
+ export declare const Button: React.FC<Props>;
15
+ export declare const BlueButton: React.FC<PrestyledProps>;
16
+ export declare const PlainButton: React.FC<PrestyledProps>;
17
+ export declare const RedButton: React.FC<PrestyledProps>;
18
+ export declare const ClearButton: React.FC<PrestyledProps>;
19
+ export {};
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { opacify } from 'polished';
3
+ import { cn } from '../../../cn';
4
+ import { RED, UNDERLAY_RED } from './colors';
5
+ export const Button = (props) => {
6
+ var _a, _b, _c;
7
+ const { children, loading, hoverColor, color, size, className, ...other } = props;
8
+ const actualDisabled = other.disabled || loading;
9
+ return (_jsx("button", { type: "button", className: cn('text-base rounded-lg font-bold appearance-none border-2 border-solid border-black border-b-4 font-sans flex flex-row items-center justify-center ', className), disabled: actualDisabled, ...other, style: {
10
+ ...((_a = props.style) !== null && _a !== void 0 ? _a : {}),
11
+ padding: (_c = (_b = props.style) === null || _b === void 0 ? void 0 : _b.padding) !== null && _c !== void 0 ? _c : (props.size === 'sm' ? '10px 16px' : '16px 22px'),
12
+ color: props.color,
13
+ cursor: props.disabled ? 'default' : 'pointer',
14
+ backgroundColor: props.background,
15
+ opacity: props.disabled ? 0.7 : 1,
16
+ }, children: children }));
17
+ };
18
+ export const BlueButton = (props) => {
19
+ return _jsx(Button, { ...props, background: "var(--blue-underlay)", color: "white" });
20
+ };
21
+ export const PlainButton = (props) => {
22
+ return (_jsx(Button, { ...props, background: "var(--plain-button)", color: "var(--text-color)" }));
23
+ };
24
+ export const RedButton = (props) => {
25
+ return (_jsx(Button, { ...props, background: UNDERLAY_RED, hoverColor: opacify(0.1, UNDERLAY_RED), color: RED }));
26
+ };
27
+ export const ClearButton = (props) => {
28
+ return (_jsx(Button, { ...props, background: "transparent", color: "var(--text-color)", hoverColor: "var(--clear-hover)" }));
29
+ };
@@ -0,0 +1,13 @@
1
+ export declare const PALETTE: {
2
+ BOX_STROKE: string;
3
+ TEXT_COLOR: string;
4
+ BORDER_COLOR: string;
5
+ BRAND: string;
6
+ };
7
+ export declare const FONTS: {
8
+ GTPLANAR: string;
9
+ };
10
+ export declare const UNDERLAY_BLUE: string;
11
+ export declare const RED = "#e74c3c";
12
+ export declare const UNDERLAY_RED: string;
13
+ export declare const BLUE_TEXT: string;
@@ -0,0 +1,14 @@
1
+ import { darken, transparentize } from 'polished';
2
+ export const PALETTE = {
3
+ BOX_STROKE: 'var(--box-stroke)',
4
+ TEXT_COLOR: 'var(--text-color)',
5
+ BORDER_COLOR: 'var(--border-color)',
6
+ BRAND: 'var(--ifm-color-primary)',
7
+ };
8
+ export const FONTS = {
9
+ GTPLANAR: 'GTPlanar',
10
+ };
11
+ export const UNDERLAY_BLUE = transparentize(0.85, '#42e9f5');
12
+ export const RED = '#e74c3c';
13
+ export const UNDERLAY_RED = transparentize(0.9, RED);
14
+ export const BLUE_TEXT = darken(0.3, '#42e9f5');
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import React, { type ReactNode } from 'react';
8
+ type ContextValue = {
9
+ /** Current color mode. */
10
+ readonly colorMode: ColorMode;
11
+ /** Set new color mode. */
12
+ readonly setColorMode: (colorMode: ColorMode) => void;
13
+ };
14
+ export type ColorMode = 'light' | 'dark';
15
+ export declare const ColorModeProvider: ({ children, colorMode, setColorMode, }: {
16
+ readonly children: React.ReactNode;
17
+ readonly setColorMode: (colorMode: ColorMode) => void;
18
+ readonly colorMode: ColorMode;
19
+ }) => ReactNode;
20
+ export declare function useColorMode(): ContextValue;
21
+ export {};
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * Copyright (c) Facebook, Inc. and its affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import React, { useContext, useMemo } from 'react';
9
+ const Context = React.createContext(undefined);
10
+ export const ColorModeProvider = ({ children, colorMode, setColorMode, }) => {
11
+ const value = useMemo(() => {
12
+ return { colorMode, setColorMode };
13
+ }, [colorMode, setColorMode]);
14
+ return _jsx(Context.Provider, { value: value, children: children });
15
+ };
16
+ export function useColorMode() {
17
+ const context = useContext(Context);
18
+ if (context === null || context === undefined) {
19
+ throw new Error('ColorModeProvider');
20
+ }
21
+ return context;
22
+ }
@@ -0,0 +1,5 @@
1
+ export type Size = {
2
+ width: number;
3
+ height: number;
4
+ };
5
+ export declare const useElementSize: (ref: HTMLElement | null) => Size | null;
@@ -0,0 +1,40 @@
1
+ import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ export const useElementSize = (ref) => {
3
+ const [size, setSize] = useState(null);
4
+ const observer = useMemo(() => {
5
+ if (typeof ResizeObserver === 'undefined') {
6
+ return;
7
+ }
8
+ return new ResizeObserver((entries) => {
9
+ setSize({
10
+ width: entries[0].contentRect.width,
11
+ height: entries[0].contentRect.height,
12
+ });
13
+ });
14
+ }, []);
15
+ const updateSize = useCallback(() => {
16
+ if (ref === null) {
17
+ return;
18
+ }
19
+ const rect = ref.getClientRects();
20
+ setSize({
21
+ width: rect[0].width,
22
+ height: rect[0].height,
23
+ });
24
+ }, [ref]);
25
+ useEffect(() => {
26
+ updateSize();
27
+ if (!observer) {
28
+ return;
29
+ }
30
+ if (ref) {
31
+ observer.observe(ref);
32
+ }
33
+ return () => {
34
+ if (ref) {
35
+ observer.unobserve(ref);
36
+ }
37
+ };
38
+ }, [observer, ref, updateSize]);
39
+ return size;
40
+ };
@@ -0,0 +1 @@
1
+ export declare const useMobileLayout: () => boolean;
@@ -0,0 +1,6 @@
1
+ import { useElementSize } from './use-el-size';
2
+ export const useMobileLayout = () => {
3
+ var _a;
4
+ const containerSize = useElementSize(typeof document === 'undefined' ? null : document.body);
5
+ return ((_a = containerSize === null || containerSize === void 0 ? void 0 : containerSize.width) !== null && _a !== void 0 ? _a : Infinity) < 900;
6
+ };
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from 'react';
2
+ import React from 'react';
3
+ export declare const Blank: React.FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const Blank = (props) => {
3
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 384 512", ...props, children: _jsx("path", { fill: "currentColor", d: "M0 64C0 28.65 28.65 0 64 0H220.1C232.8 0 245.1 5.057 254.1 14.06L369.9 129.9C378.9 138.9 384 151.2 384 163.9V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM352 192H240C213.5 192 192 170.5 192 144V32H64C46.33 32 32 46.33 32 64V448C32 465.7 46.33 480 64 480H320C337.7 480 352 465.7 352 448V192zM347.3 152.6L231.4 36.69C229.4 34.62 226.8 33.18 224 32.48V144C224 152.8 231.2 160 240 160H351.5C350.8 157.2 349.4 154.6 347.3 152.6z" }) }));
4
+ };
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const CloneIcon: React.FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,2 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const CloneIcon = (props) => (_jsx("svg", { ...props, viewBox: "0 0 512 512", children: _jsx("path", { fill: "currentcolor", d: "M288 448L64 448l0-224 64 0 0-64-64 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-64-64 0 0 64zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z" }) }));
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from 'react';
2
+ import React from 'react';
3
+ export declare const CodeHike: React.FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const CodeHike = (props) => {
3
+ return (_jsxs("svg", { ...props, viewBox: "-100 -100 200 200", fill: "currentColor", children: [_jsx("path", { d: "M 70 60 L 42 -27 L 72 -27 L 100 60 Z" }), _jsx("path", { d: "M 20.419540229885058 40.05357142857142 L 42 -27 L 72 -27 L 50.41954022988506 40.05357142857142 Z" }), _jsx("path", { d: "M 20.419540229885058 40.05357142857142 L -15 -70 L 15 -70 L 50.41954022988506 40.05357142857142 Z" }), _jsx("path", { d: "M -50.41954022988506 40.05357142857142 L -15 -70 L 15 -70 L -20.419540229885058 40.05357142857142 Z" }), _jsx("path", { d: "M -50.41954022988506 40.05357142857142 L -72 -27 L -42 -27 L -20.419540229885058 40.05357142857142 Z" }), _jsx("path", { d: "M -100 60 L -72 -27 L -42 -27 L -70 60 Z" })] }));
4
+ };
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from 'react';
2
+ import React from 'react';
3
+ export declare const Cubes: React.FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const Cubes = (props) => {
3
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props, children: _jsx("path", { fill: "currentColor", d: "M239.5 5.018C250.1 1.106 261.9 1.106 272.5 5.018L480.5 81.28C499.4 88.22 512 106.2 512 126.4V385.7C512 405.8 499.4 423.8 480.5 430.7L272.5 506.1C261.9 510.9 250.1 510.9 239.5 506.1L31.48 430.7C12.57 423.8 0 405.8 0 385.7V126.4C0 106.2 12.57 88.22 31.48 81.28L239.5 5.018zM261.5 35.06C257.1 33.76 254 33.76 250.5 35.06L44.14 110.7L256 193.1L467.9 110.7L261.5 35.06zM42.49 400.7L240 473.1V222L32 140.3V385.7C32 392.4 36.19 398.4 42.49 400.7V400.7zM272 473.1L469.5 400.7C475.8 398.4 480 392.4 480 385.7V140.3L272 222V473.1z" }) }));
4
+ };
@@ -0,0 +1,3 @@
1
+ import type { SVGProps } from 'react';
2
+ import React from 'react';
3
+ export declare const JSIcon: React.FC<SVGProps<SVGSVGElement>>;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const JSIcon = (props) => {
3
+ return (_jsx("svg", { className: "svg-inline--fa fa-js-square fa-w-14", viewBox: "0 0 448 512", ...props, children: _jsx("path", { fill: "currentColor", d: "M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM243.8 381.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V237.7h42.1v143.7zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L368 290c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z" }) }));
4
+ };