@remotion/promo-pages 4.0.458 → 4.0.459

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 (276) hide show
  1. package/dist/Homepage.js +98 -103
  2. package/dist/cn.d.ts +2 -0
  3. package/dist/cn.js +5 -0
  4. package/dist/components/3DEngine/ButtonDemo.d.ts +2 -0
  5. package/dist/components/3DEngine/ButtonDemo.js +43 -0
  6. package/dist/components/3DEngine/Faces.d.ts +5 -0
  7. package/dist/components/3DEngine/Faces.js +7 -0
  8. package/dist/components/3DEngine/Outer.d.ts +8 -0
  9. package/dist/components/3DEngine/Outer.js +56 -0
  10. package/dist/components/3DEngine/Switch.d.ts +4 -0
  11. package/dist/components/3DEngine/Switch.js +4 -0
  12. package/dist/components/3DEngine/get-child-node-from.d.ts +1 -0
  13. package/dist/components/3DEngine/get-child-node-from.js +14 -0
  14. package/dist/components/3DEngine/hover-transforms.d.ts +9 -0
  15. package/dist/components/3DEngine/hover-transforms.js +177 -0
  16. package/dist/components/BackButton.d.ts +6 -0
  17. package/dist/components/BackButton.js +9 -0
  18. package/dist/components/CommandCopyButton.d.ts +5 -0
  19. package/dist/components/CommandCopyButton.js +4 -0
  20. package/dist/components/Homepage.d.ts +6 -0
  21. package/dist/components/Homepage.js +20 -0
  22. package/dist/components/ManageTeamMembers.d.ts +2 -0
  23. package/dist/components/ManageTeamMembers.js +42 -0
  24. package/dist/components/Spinner.d.ts +3 -0
  25. package/dist/components/Spinner.js +4 -0
  26. package/dist/components/TeamPicture.d.ts +1 -0
  27. package/dist/components/TeamPicture.js +4 -0
  28. package/dist/components/design.d.ts +1 -0
  29. package/dist/components/design.js +33 -0
  30. package/dist/components/experts/ExpertsPage.d.ts +11 -0
  31. package/dist/components/experts/ExpertsPage.js +50 -0
  32. package/dist/components/experts/experts-data.d.ts +15 -0
  33. package/dist/components/experts/experts-data.js +289 -0
  34. package/dist/components/experts/experts-icons.d.ts +7 -0
  35. package/dist/components/experts/experts-icons.js +36 -0
  36. package/dist/components/experts.d.ts +3 -0
  37. package/dist/components/experts.js +2 -0
  38. package/dist/components/homepage/BackgroundAnimation.d.ts +2 -0
  39. package/dist/components/homepage/BackgroundAnimation.js +66 -0
  40. package/dist/components/homepage/ChooseTemplate.d.ts +2 -0
  41. package/dist/components/homepage/ChooseTemplate.js +25 -0
  42. package/dist/components/homepage/CommunityStats.d.ts +3 -0
  43. package/dist/components/homepage/CommunityStats.js +6 -0
  44. package/dist/components/homepage/CommunityStatsItems.d.ts +7 -0
  45. package/dist/components/homepage/CommunityStatsItems.js +58 -0
  46. package/dist/components/homepage/Demo/Card.d.ts +15 -0
  47. package/dist/components/homepage/Demo/Card.js +174 -0
  48. package/dist/components/homepage/Demo/Cards.d.ts +15 -0
  49. package/dist/components/homepage/Demo/Cards.js +57 -0
  50. package/dist/components/homepage/Demo/Comp.d.ts +38 -0
  51. package/dist/components/homepage/Demo/Comp.js +72 -0
  52. package/dist/components/homepage/Demo/CurrentCountry.d.ts +9 -0
  53. package/dist/components/homepage/Demo/CurrentCountry.js +48 -0
  54. package/dist/components/homepage/Demo/DemoError.d.ts +2 -0
  55. package/dist/components/homepage/Demo/DemoError.js +10 -0
  56. package/dist/components/homepage/Demo/DemoErrorIcon.d.ts +2 -0
  57. package/dist/components/homepage/Demo/DemoErrorIcon.js +16 -0
  58. package/dist/components/homepage/Demo/DemoRender.d.ts +33 -0
  59. package/dist/components/homepage/Demo/DemoRender.js +107 -0
  60. package/dist/components/homepage/Demo/DigitWheel.d.ts +9 -0
  61. package/dist/components/homepage/Demo/DigitWheel.js +94 -0
  62. package/dist/components/homepage/Demo/DisplayedEmoji.d.ts +5 -0
  63. package/dist/components/homepage/Demo/DisplayedEmoji.js +59 -0
  64. package/dist/components/homepage/Demo/DoneCheckmark.d.ts +2 -0
  65. package/dist/components/homepage/Demo/DoneCheckmark.js +20 -0
  66. package/dist/components/homepage/Demo/DownloadNudge.d.ts +2 -0
  67. package/dist/components/homepage/Demo/DownloadNudge.js +27 -0
  68. package/dist/components/homepage/Demo/DragAndDropNudge.d.ts +3 -0
  69. package/dist/components/homepage/Demo/DragAndDropNudge.js +26 -0
  70. package/dist/components/homepage/Demo/EmojiCard.d.ts +10 -0
  71. package/dist/components/homepage/Demo/EmojiCard.js +120 -0
  72. package/dist/components/homepage/Demo/Minus.d.ts +5 -0
  73. package/dist/components/homepage/Demo/Minus.js +11 -0
  74. package/dist/components/homepage/Demo/PlayPauseButton.d.ts +5 -0
  75. package/dist/components/homepage/Demo/PlayPauseButton.js +47 -0
  76. package/dist/components/homepage/Demo/PlayerControls.d.ts +8 -0
  77. package/dist/components/homepage/Demo/PlayerControls.js +15 -0
  78. package/dist/components/homepage/Demo/PlayerSeekBar.d.ts +11 -0
  79. package/dist/components/homepage/Demo/PlayerSeekBar.js +216 -0
  80. package/dist/components/homepage/Demo/PlayerVolume.d.ts +5 -0
  81. package/dist/components/homepage/Demo/PlayerVolume.js +53 -0
  82. package/dist/components/homepage/Demo/Progress.d.ts +4 -0
  83. package/dist/components/homepage/Demo/Progress.js +14 -0
  84. package/dist/components/homepage/Demo/Spinner.d.ts +5 -0
  85. package/dist/components/homepage/Demo/Spinner.js +37 -0
  86. package/dist/components/homepage/Demo/Switcher.d.ts +6 -0
  87. package/dist/components/homepage/Demo/Switcher.js +25 -0
  88. package/dist/components/homepage/Demo/Temperature.d.ts +6 -0
  89. package/dist/components/homepage/Demo/Temperature.js +21 -0
  90. package/dist/components/homepage/Demo/TemperatureNumber.d.ts +5 -0
  91. package/dist/components/homepage/Demo/TemperatureNumber.js +36 -0
  92. package/dist/components/homepage/Demo/ThemeNudge.d.ts +3 -0
  93. package/dist/components/homepage/Demo/ThemeNudge.js +35 -0
  94. package/dist/components/homepage/Demo/TimeDisplay.d.ts +6 -0
  95. package/dist/components/homepage/Demo/TimeDisplay.js +27 -0
  96. package/dist/components/homepage/Demo/TrendingRepos.d.ts +6 -0
  97. package/dist/components/homepage/Demo/TrendingRepos.js +65 -0
  98. package/dist/components/homepage/Demo/icons.d.ts +10 -0
  99. package/dist/components/homepage/Demo/icons.js +22 -0
  100. package/dist/components/homepage/Demo/index.d.ts +2 -0
  101. package/dist/components/homepage/Demo/index.js +95 -0
  102. package/dist/components/homepage/Demo/math.d.ts +10 -0
  103. package/dist/components/homepage/Demo/math.js +29 -0
  104. package/dist/components/homepage/Demo/types.d.ts +6 -0
  105. package/dist/components/homepage/Demo/types.js +0 -0
  106. package/dist/components/homepage/EditorStarterSection.d.ts +3 -0
  107. package/dist/components/homepage/EditorStarterSection.js +8 -0
  108. package/dist/components/homepage/EvaluateRemotion.d.ts +3 -0
  109. package/dist/components/homepage/EvaluateRemotion.js +21 -0
  110. package/dist/components/homepage/FreePricing.d.ts +4 -0
  111. package/dist/components/homepage/FreePricing.js +133 -0
  112. package/dist/components/homepage/GetStartedStrip.d.ts +2 -0
  113. package/dist/components/homepage/GetStartedStrip.js +14 -0
  114. package/dist/components/homepage/GitHubButton.d.ts +2 -0
  115. package/dist/components/homepage/GitHubButton.js +7 -0
  116. package/dist/components/homepage/IconForTemplate.d.ts +6 -0
  117. package/dist/components/homepage/IconForTemplate.js +105 -0
  118. package/dist/components/homepage/IfYouKnowReact.d.ts +3 -0
  119. package/dist/components/homepage/IfYouKnowReact.js +23 -0
  120. package/dist/components/homepage/MoreTemplatesButton.d.ts +2 -0
  121. package/dist/components/homepage/MoreTemplatesButton.js +11 -0
  122. package/dist/components/homepage/MuxVideo.d.ts +7 -0
  123. package/dist/components/homepage/MuxVideo.js +45 -0
  124. package/dist/components/homepage/NewsletterButton.d.ts +2 -0
  125. package/dist/components/homepage/NewsletterButton.js +38 -0
  126. package/dist/components/homepage/ParameterizeAndEdit.d.ts +2 -0
  127. package/dist/components/homepage/ParameterizeAndEdit.js +22 -0
  128. package/dist/components/homepage/Pricing.d.ts +2 -0
  129. package/dist/components/homepage/Pricing.js +15 -0
  130. package/dist/components/homepage/PricingBulletPoint.d.ts +6 -0
  131. package/dist/components/homepage/PricingBulletPoint.js +19 -0
  132. package/dist/components/homepage/RealMp4Videos.d.ts +2 -0
  133. package/dist/components/homepage/RealMp4Videos.js +41 -0
  134. package/dist/components/homepage/Spacer.d.ts +2 -0
  135. package/dist/components/homepage/Spacer.js +4 -0
  136. package/dist/components/homepage/TemplateIcon.d.ts +5 -0
  137. package/dist/components/homepage/TemplateIcon.js +24 -0
  138. package/dist/components/homepage/TextInput.d.ts +7 -0
  139. package/dist/components/homepage/TextInput.js +34 -0
  140. package/dist/components/homepage/TrustedByBanner.d.ts +2 -0
  141. package/dist/components/homepage/TrustedByBanner.js +27 -0
  142. package/dist/components/homepage/VideoApps.d.ts +4 -0
  143. package/dist/components/homepage/VideoApps.js +72 -0
  144. package/dist/components/homepage/VideoAppsShowcase.d.ts +3 -0
  145. package/dist/components/homepage/VideoAppsShowcase.js +139 -0
  146. package/dist/components/homepage/VideoAppsTitle.d.ts +4 -0
  147. package/dist/components/homepage/VideoAppsTitle.js +4 -0
  148. package/dist/components/homepage/VideoPlayerWithControls.d.ts +20 -0
  149. package/dist/components/homepage/VideoPlayerWithControls.js +105 -0
  150. package/dist/components/homepage/WriteInReact.d.ts +2 -0
  151. package/dist/components/homepage/WriteInReact.js +10 -0
  152. package/dist/components/homepage/YouAreHere.d.ts +2 -0
  153. package/dist/components/homepage/YouAreHere.js +23 -0
  154. package/dist/components/homepage/layout/Button.d.ts +22 -0
  155. package/dist/components/homepage/layout/Button.js +30 -0
  156. package/dist/components/homepage/layout/colors.d.ts +13 -0
  157. package/dist/components/homepage/layout/colors.js +14 -0
  158. package/dist/components/homepage/layout/use-color-mode.d.ts +21 -0
  159. package/dist/components/homepage/layout/use-color-mode.js +22 -0
  160. package/dist/components/homepage/layout/use-el-size.d.ts +5 -0
  161. package/dist/components/homepage/layout/use-el-size.js +40 -0
  162. package/dist/components/homepage/layout/use-mobile-layout.d.ts +1 -0
  163. package/dist/components/homepage/layout/use-mobile-layout.js +6 -0
  164. package/dist/components/icons/blank.d.ts +3 -0
  165. package/dist/components/icons/blank.js +4 -0
  166. package/dist/components/icons/brain.d.ts +2 -0
  167. package/dist/components/icons/brain.js +4 -0
  168. package/dist/components/icons/clone.d.ts +2 -0
  169. package/dist/components/icons/clone.js +2 -0
  170. package/dist/components/icons/code-hike.d.ts +3 -0
  171. package/dist/components/icons/code-hike.js +4 -0
  172. package/dist/components/icons/cubes.d.ts +3 -0
  173. package/dist/components/icons/cubes.js +4 -0
  174. package/dist/components/icons/editor.d.ts +3 -0
  175. package/dist/components/icons/editor.js +4 -0
  176. package/dist/components/icons/electron.d.ts +4 -0
  177. package/dist/components/icons/electron.js +4 -0
  178. package/dist/components/icons/js.d.ts +3 -0
  179. package/dist/components/icons/js.js +4 -0
  180. package/dist/components/icons/music.d.ts +2 -0
  181. package/dist/components/icons/music.js +4 -0
  182. package/dist/components/icons/next.d.ts +4 -0
  183. package/dist/components/icons/next.js +4 -0
  184. package/dist/components/icons/overlay.d.ts +3 -0
  185. package/dist/components/icons/overlay.js +4 -0
  186. package/dist/components/icons/prompt-to-video.d.ts +2 -0
  187. package/dist/components/icons/prompt-to-video.js +4 -0
  188. package/dist/components/icons/recorder.d.ts +3 -0
  189. package/dist/components/icons/recorder.js +4 -0
  190. package/dist/components/icons/remix.d.ts +3 -0
  191. package/dist/components/icons/remix.js +4 -0
  192. package/dist/components/icons/render-server.d.ts +3 -0
  193. package/dist/components/icons/render-server.js +4 -0
  194. package/dist/components/icons/skia.d.ts +3 -0
  195. package/dist/components/icons/skia.js +4 -0
  196. package/dist/components/icons/stargazer.d.ts +3 -0
  197. package/dist/components/icons/stargazer.js +4 -0
  198. package/dist/components/icons/still.d.ts +3 -0
  199. package/dist/components/icons/still.js +4 -0
  200. package/dist/components/icons/tailwind.d.ts +3 -0
  201. package/dist/components/icons/tailwind.js +4 -0
  202. package/dist/components/icons/tiktok.d.ts +3 -0
  203. package/dist/components/icons/tiktok.js +4 -0
  204. package/dist/components/icons/timeline.d.ts +3 -0
  205. package/dist/components/icons/timeline.js +4 -0
  206. package/dist/components/icons/ts.d.ts +3 -0
  207. package/dist/components/icons/ts.js +4 -0
  208. package/dist/components/icons/undo.d.ts +3 -0
  209. package/dist/components/icons/undo.js +2 -0
  210. package/dist/components/icons/vercel.d.ts +4 -0
  211. package/dist/components/icons/vercel.js +4 -0
  212. package/dist/components/icons/waveform.d.ts +3 -0
  213. package/dist/components/icons/waveform.js +4 -0
  214. package/dist/components/prompts/CardLikeButton.d.ts +5 -0
  215. package/dist/components/prompts/CardLikeButton.js +49 -0
  216. package/dist/components/prompts/ClipboardIcon.d.ts +5 -0
  217. package/dist/components/prompts/ClipboardIcon.js +4 -0
  218. package/dist/components/prompts/CopyPromptButton.d.ts +4 -0
  219. package/dist/components/prompts/CopyPromptButton.js +13 -0
  220. package/dist/components/prompts/LikeButton.d.ts +5 -0
  221. package/dist/components/prompts/LikeButton.js +49 -0
  222. package/dist/components/prompts/MuxPlayer.d.ts +8 -0
  223. package/dist/components/prompts/MuxPlayer.js +21 -0
  224. package/dist/components/prompts/NewBackButton.d.ts +5 -0
  225. package/dist/components/prompts/NewBackButton.js +8 -0
  226. package/dist/components/prompts/Page.d.ts +8 -0
  227. package/dist/components/prompts/Page.js +7 -0
  228. package/dist/components/prompts/PromptsGallery.d.ts +7 -0
  229. package/dist/components/prompts/PromptsGallery.js +60 -0
  230. package/dist/components/prompts/PromptsShow.d.ts +5 -0
  231. package/dist/components/prompts/PromptsShow.js +17 -0
  232. package/dist/components/prompts/PromptsSubmit.d.ts +2 -0
  233. package/dist/components/prompts/PromptsSubmit.js +173 -0
  234. package/dist/components/prompts/config.d.ts +1 -0
  235. package/dist/components/prompts/config.js +1 -0
  236. package/dist/components/prompts/prompt-helpers.d.ts +8 -0
  237. package/dist/components/prompts/prompt-helpers.js +76 -0
  238. package/dist/components/prompts/prompt-types.d.ts +14 -0
  239. package/dist/components/prompts/prompt-types.js +0 -0
  240. package/dist/components/prompts/use-heart-animation.d.ts +5 -0
  241. package/dist/components/prompts/use-heart-animation.js +29 -0
  242. package/dist/components/team/TeamCards.d.ts +6 -0
  243. package/dist/components/team/TeamCards.js +19 -0
  244. package/dist/components/team/TitleTeamCards.d.ts +2 -0
  245. package/dist/components/team/TitleTeamCards.js +6 -0
  246. package/dist/components/team/TrustSection.d.ts +2 -0
  247. package/dist/components/team/TrustSection.js +59 -0
  248. package/dist/components/team.d.ts +3 -0
  249. package/dist/components/team.js +15 -0
  250. package/dist/components/template-modal-content.d.ts +5 -0
  251. package/dist/components/template-modal-content.js +73 -0
  252. package/dist/components/templates.d.ts +2 -0
  253. package/dist/components/templates.js +27 -0
  254. package/dist/design.js +36 -41
  255. package/dist/experts.js +33 -38
  256. package/dist/helpers/mobile-layout.d.ts +1 -0
  257. package/dist/helpers/mobile-layout.js +6 -0
  258. package/dist/helpers/use-el-size.d.ts +5 -0
  259. package/dist/helpers/use-el-size.js +40 -0
  260. package/dist/homepage/Pricing.js +36 -41
  261. package/dist/main.d.ts +1 -0
  262. package/dist/main.js +6 -0
  263. package/dist/prompts/PromptsGallery.js +40 -45
  264. package/dist/prompts/PromptsShow.js +38 -43
  265. package/dist/prompts/PromptsSubmit.js +38 -43
  266. package/dist/prompts-show.d.ts +1 -0
  267. package/dist/prompts-show.js +20 -0
  268. package/dist/prompts-submit.d.ts +1 -0
  269. package/dist/prompts-submit.js +6 -0
  270. package/dist/prompts.d.ts +1 -0
  271. package/dist/prompts.js +6 -0
  272. package/dist/team.d.ts +1 -0
  273. package/dist/team.js +36 -41
  274. package/dist/template-modal-content.js +45 -50
  275. package/dist/templates.js +36 -41
  276. package/package.json +13 -13
@@ -0,0 +1,174 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useRef } from 'react';
3
+ import { AbsoluteFill, spring } from 'remotion';
4
+ import { cardHeight, cardWidth, getIndexFromPosition, getInitialPositions, getPositionForIndex, } from './math';
5
+ import { Switcher } from './Switcher';
6
+ const arePositionsEqual = (a, b) => {
7
+ return a.every((pos, i) => {
8
+ return pos.x === b[i].x && pos.y === b[i].y;
9
+ });
10
+ };
11
+ export const Card = ({ positions, shouldBePositions, index, refsToUse, onUpdate, content, indices, theme, withSwitcher, onClickLeft, onClickRight, }) => {
12
+ const refToUse = refsToUse[index];
13
+ const stopPrevious = useRef([]);
14
+ // eslint-disable-next-line react-hooks/exhaustive-deps
15
+ let newIndices = [...indices];
16
+ const applyPositions = useCallback((except) => {
17
+ let stopped = false;
18
+ stopPrevious.current.forEach((s) => {
19
+ s();
20
+ });
21
+ stopPrevious.current.push(() => {
22
+ stopped = true;
23
+ });
24
+ positions.current.forEach((_, i) => {
25
+ const shouldBe = shouldBePositions.current[i];
26
+ const ref = refsToUse[i].current;
27
+ if (!ref) {
28
+ return;
29
+ }
30
+ if (except === null) {
31
+ ref.style.pointerEvents = 'none';
32
+ }
33
+ if (i === except) {
34
+ ref.style.left = getPositionForIndex(i).x + 'px';
35
+ ref.style.top = getPositionForIndex(i).y + 'px';
36
+ return;
37
+ }
38
+ let animationI = 1;
39
+ const duration = 20;
40
+ const releasePositionX = positions.current[i].x;
41
+ const releasePositionY = positions.current[i].y;
42
+ const finishAnimation = () => {
43
+ refsToUse.forEach((r) => {
44
+ r.current.style.zIndex = '1';
45
+ r.current.style.scale = '1';
46
+ r.current.style.opacity = '1';
47
+ });
48
+ if (i === 0) {
49
+ setTimeout(() => {
50
+ onUpdate([...newIndices]);
51
+ }, 200);
52
+ }
53
+ };
54
+ if (releasePositionX === shouldBe.x &&
55
+ releasePositionY === shouldBe.y &&
56
+ animationI === duration &&
57
+ except === null) {
58
+ finishAnimation();
59
+ return;
60
+ }
61
+ const update = () => {
62
+ if (stopped) {
63
+ return;
64
+ }
65
+ const progress = spring({
66
+ fps: 60,
67
+ frame: animationI,
68
+ config: {
69
+ damping: 200,
70
+ },
71
+ durationInFrames: duration,
72
+ durationRestThreshold: 0.001,
73
+ });
74
+ const newX = progress * (shouldBe.x - releasePositionX) + releasePositionX;
75
+ const newY = progress * (shouldBe.y - releasePositionY) + releasePositionY;
76
+ ref.style.left = `${newX}px`;
77
+ ref.style.top = `${newY}px`;
78
+ positions.current[i] = {
79
+ x: newX,
80
+ y: newY,
81
+ };
82
+ animationI++;
83
+ if (animationI === duration && except === null) {
84
+ finishAnimation();
85
+ return;
86
+ }
87
+ requestAnimationFrame(update);
88
+ };
89
+ update();
90
+ });
91
+ }, [newIndices, onUpdate, positions, refsToUse, shouldBePositions]);
92
+ const onPointerDown = useCallback((e) => {
93
+ e.currentTarget.setPointerCapture(e.pointerId);
94
+ const cardLeft = refToUse.current.offsetLeft;
95
+ const cardTop = refToUse.current.offsetTop;
96
+ const startX = e.clientX;
97
+ const startY = e.clientY;
98
+ if (e.button === 2) {
99
+ return;
100
+ }
101
+ let translateX = 0;
102
+ let translateY = 0;
103
+ refToUse.current.style.scale = '1.05';
104
+ refToUse.current.style.cursor = 'grabbing';
105
+ const onMove = (evt) => {
106
+ refsToUse.forEach((r) => {
107
+ if (r !== refToUse) {
108
+ r.current.style.opacity = '0';
109
+ }
110
+ });
111
+ const scale = refToUse.current.getBoundingClientRect().width / cardWidth;
112
+ translateX = (evt.clientX - startX) * (1 / scale);
113
+ translateY = (evt.clientY - startY) * (1 / scale);
114
+ const position = getIndexFromPosition(cardLeft + translateX, cardTop + translateY);
115
+ if (position === undefined) {
116
+ throw new Error('pos');
117
+ }
118
+ if (position === index) {
119
+ if (!arePositionsEqual(getInitialPositions(), shouldBePositions.current)) {
120
+ shouldBePositions.current = getInitialPositions();
121
+ applyPositions(index);
122
+ }
123
+ }
124
+ else {
125
+ const newPos = getInitialPositions();
126
+ newPos[position] = getPositionForIndex(index);
127
+ newPos[index] = getPositionForIndex(position);
128
+ // eslint-disable-next-line react-hooks/exhaustive-deps
129
+ newIndices = [...indices];
130
+ const prevIndexPosition = newIndices[position];
131
+ newIndices[position] = newIndices[index];
132
+ newIndices[index] = prevIndexPosition;
133
+ if (!arePositionsEqual(newPos, shouldBePositions.current)) {
134
+ shouldBePositions.current = newPos;
135
+ applyPositions(index);
136
+ }
137
+ }
138
+ refToUse.current.style.transform = `translateX(${translateX}px) translateY(${translateY}px)`;
139
+ refToUse.current.style.zIndex = '2';
140
+ };
141
+ refToUse.current.addEventListener('pointerup', () => {
142
+ positions.current[index] = {
143
+ x: cardLeft + translateX,
144
+ y: cardTop + translateY,
145
+ };
146
+ refToUse.current.style.left = `${cardLeft + translateX}px`;
147
+ refToUse.current.style.top = `${cardTop + translateY}px`;
148
+ refToUse.current.style.transform = `translateX(0px) translateY(0px)`;
149
+ refToUse.current.style.cursor = 'grab';
150
+ refToUse.current.removeEventListener('pointermove', onMove);
151
+ applyPositions(null);
152
+ }, { once: true });
153
+ refToUse.current.addEventListener('pointermove', onMove);
154
+ }, [applyPositions, index, positions, refToUse, shouldBePositions]);
155
+ const onPointerUp = useCallback((e) => {
156
+ e.currentTarget.releasePointerCapture(e.pointerId);
157
+ }, []);
158
+ const { x, y } = getPositionForIndex(index);
159
+ const color = theme === 'light' ? ' #EAEAEA' : '#333';
160
+ return (_jsx("div", { ref: refToUse, className: 'transition-opacity duration-200', onPointerDown: onPointerDown, onPointerUp: onPointerUp, style: {
161
+ width: cardWidth,
162
+ height: cardHeight,
163
+ position: 'absolute',
164
+ left: x,
165
+ top: y,
166
+ userSelect: 'none',
167
+ border: `1px solid ${color}`,
168
+ borderRadius: 13,
169
+ cursor: 'grab',
170
+ }, children: _jsxs(AbsoluteFill, { style: {
171
+ backgroundColor: color,
172
+ borderRadius: 12,
173
+ }, className: 'transition-opacity duration-200', children: [content, withSwitcher ? (_jsxs(_Fragment, { children: [_jsx(Switcher, { onTap: onClickLeft, type: "left", theme: theme }), _jsx(Switcher, { onTap: onClickRight, type: "right", theme: theme })] })) : null] }) }));
174
+ };
@@ -0,0 +1,15 @@
1
+ import type { EmojiName } from '@remotion/animated-emoji';
2
+ import React from 'react';
3
+ import type { RemoteData } from './Comp';
4
+ import type { Location } from './types';
5
+ export declare const Cards: React.FC<{
6
+ readonly onUpdate: (newIndices: number[]) => void;
7
+ readonly indices: number[];
8
+ readonly theme: 'dark' | 'light';
9
+ readonly location: Location | null;
10
+ readonly trending: RemoteData | null;
11
+ readonly onToggle: () => void;
12
+ readonly onLeft: () => void;
13
+ readonly onRight: () => void;
14
+ readonly emojiName: EmojiName;
15
+ }>;
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRef, useCallback, useEffect, useRef, useState, } from 'react';
3
+ import { AbsoluteFill, useRemotionEnvironment } from 'remotion';
4
+ import { Card } from './Card';
5
+ import { CurrentCountry } from './CurrentCountry';
6
+ import { EmojiCard } from './EmojiCard';
7
+ import { getInitialPositions } from './math';
8
+ import { Temperature } from './Temperature';
9
+ import { TrendingRepos } from './TrendingRepos';
10
+ export const Cards = ({ onUpdate, indices, theme, onToggle, onLeft: onLeftPress, onRight: onRightPress, emojiName, location, trending, }) => {
11
+ const container = useRef(null);
12
+ const [refs] = useState(() => {
13
+ return new Array(4).fill(true).map(() => {
14
+ return createRef();
15
+ });
16
+ });
17
+ const positions = useRef(getInitialPositions());
18
+ const shouldBePositions = useRef(getInitialPositions());
19
+ const { isRendering } = useRemotionEnvironment();
20
+ useEffect(() => {
21
+ const { current } = container;
22
+ if (!current) {
23
+ return;
24
+ }
25
+ const onClick = (e) => {
26
+ if (e.target !== current) {
27
+ return;
28
+ }
29
+ onToggle();
30
+ };
31
+ current.addEventListener('click', onClick);
32
+ return () => {
33
+ current.removeEventListener('click', onClick);
34
+ };
35
+ }, [onToggle]);
36
+ const ref = useRef(null);
37
+ const onLeft = useCallback(() => {
38
+ var _a;
39
+ (_a = ref.current) === null || _a === void 0 ? void 0 : _a.onRight();
40
+ onRightPress();
41
+ }, [onRightPress]);
42
+ const onRight = useCallback(() => {
43
+ var _a;
44
+ (_a = ref.current) === null || _a === void 0 ? void 0 : _a.onLeft();
45
+ onLeftPress();
46
+ }, [onLeftPress]);
47
+ return (_jsx(AbsoluteFill, { ref: container, children: new Array(4).fill(true).map((_, i) => {
48
+ var _a, _b, _c;
49
+ const index = indices[i];
50
+ const content = index === 0 ? (_jsx(TrendingRepos, { trending: trending, theme: theme })) : index === 1 ? (_jsx(Temperature, { city: (location === null || location === void 0 ? void 0 : location.city) ? decodeURIComponent(location === null || location === void 0 ? void 0 : location.city) : null, theme: theme, temperatureInCelsius: (_a = trending === null || trending === void 0 ? void 0 : trending.temperatureInCelsius) !== null && _a !== void 0 ? _a : null })) : index === 2 ? (_jsx(CurrentCountry, { countryPaths: (_b = trending === null || trending === void 0 ? void 0 : trending.countryPaths) !== null && _b !== void 0 ? _b : null, countryLabel: (_c = trending === null || trending === void 0 ? void 0 : trending.countryLabel) !== null && _c !== void 0 ? _c : null, theme: theme })) : (_jsx(EmojiCard, { ref: ref, emojiIndex: emojiName }));
51
+ return (_jsx(Card
52
+ // eslint-disable-next-line react/no-array-index-key
53
+ , { onUpdate: onUpdate,
54
+ // @ts-expect-error
55
+ refsToUse: refs, index: i, content: content, positions: positions, shouldBePositions: shouldBePositions, indices: indices, theme: theme, withSwitcher: index === 3 && !isRendering, onClickLeft: onLeft, onClickRight: onRight }, i));
56
+ }) }));
57
+ };
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { type CalculateMetadataFunction } from 'remotion';
3
+ import type { Location } from './types';
4
+ export type RemoteData = {
5
+ repos: string[];
6
+ date: string | number;
7
+ temperatureInCelsius: number;
8
+ countryLabel: string;
9
+ countryPaths: {
10
+ d: string;
11
+ class: string;
12
+ }[];
13
+ };
14
+ export type LocationAndTrending = {
15
+ readonly location: Location | null;
16
+ readonly trending: RemoteData | null;
17
+ };
18
+ export declare const getDataAndProps: () => Promise<{
19
+ trending: {
20
+ repos: any;
21
+ date: any;
22
+ temperatureInCelsius: number;
23
+ countryLabel: any;
24
+ countryPaths: any;
25
+ };
26
+ location: Location;
27
+ }>;
28
+ export declare const calculateMetadata: CalculateMetadataFunction<DemoPlayerProps>;
29
+ export type DemoPlayerProps = {
30
+ readonly onToggle: () => void;
31
+ readonly cardOrder: number[];
32
+ readonly updateCardOrder: (newCardOrder: number[]) => void;
33
+ readonly theme: 'dark' | 'light';
34
+ readonly onClickLeft: () => void;
35
+ readonly onClickRight: () => void;
36
+ readonly emojiIndex: number;
37
+ } & LocationAndTrending;
38
+ export declare const HomepageVideoComp: React.FC<DemoPlayerProps>;
@@ -0,0 +1,72 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Audio } from '@remotion/media';
3
+ import { useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { AbsoluteFill, prefetch, staticFile, } from 'remotion';
5
+ import { Cards } from './Cards';
6
+ export const getDataAndProps = async () => {
7
+ const location = (await fetch('https://bugs-five.vercel.app/api/location').then((res) => res.json()));
8
+ const trending = await fetch(`https://bugs.remotion.dev/trending?lat=${location.latitude}&lng=${location.longitude}&country=${location.country}`)
9
+ .then((res) => res.json())
10
+ .then((data) => {
11
+ return {
12
+ repos: data.trending.repos.slice(0, 3),
13
+ date: data.trending.dateFetched,
14
+ temperatureInCelsius: Math.round(data.temperature),
15
+ countryLabel: data.countryLabel,
16
+ countryPaths: data.countryPaths,
17
+ };
18
+ });
19
+ return { trending, location };
20
+ };
21
+ export const calculateMetadata = ({ props, }) => {
22
+ return {
23
+ durationInFrames: 120,
24
+ fps: 30,
25
+ height: 360,
26
+ width: 640,
27
+ props: {
28
+ ...props,
29
+ },
30
+ };
31
+ };
32
+ const fireAudio = staticFile('fire.mp3');
33
+ const partyHornAudio = staticFile('partyhorn.mp3');
34
+ const sadAudio = staticFile('sad.mp3');
35
+ export const HomepageVideoComp = ({ theme, onToggle, cardOrder, updateCardOrder, location, trending, emojiIndex, onClickLeft, onClickRight, }) => {
36
+ const [rerenders, setRerenders] = useState(0);
37
+ const onUpdate = useCallback((newIndices) => {
38
+ setRerenders(rerenders + 1);
39
+ updateCardOrder(newIndices);
40
+ }, [rerenders, updateCardOrder]);
41
+ const emoji = useMemo(() => {
42
+ if ((emojiIndex + 10000 * 3) % 3 === 1) {
43
+ return 'melting';
44
+ }
45
+ if ((emojiIndex + 10000 * 3) % 3 === 2) {
46
+ return 'fire';
47
+ }
48
+ return 'partying-face';
49
+ }, [emojiIndex]);
50
+ const audioSrc = useMemo(() => {
51
+ if (emoji === 'fire') {
52
+ return fireAudio;
53
+ }
54
+ if (emoji === 'partying-face') {
55
+ return partyHornAudio;
56
+ }
57
+ return sadAudio;
58
+ }, [emoji]);
59
+ useEffect(() => {
60
+ const a = prefetch(fireAudio);
61
+ const b = prefetch(partyHornAudio);
62
+ const c = prefetch(sadAudio);
63
+ return () => {
64
+ a.free();
65
+ b.free();
66
+ c.free();
67
+ };
68
+ }, []);
69
+ return (_jsxs(AbsoluteFill, { style: {
70
+ backgroundColor: theme === 'dark' ? '#222' : '#fafafa',
71
+ }, children: [_jsx(Cards, { onUpdate: onUpdate, indices: cardOrder, theme: theme, location: location, trending: trending, onToggle: onToggle, onLeft: onClickLeft, onRight: onClickRight, emojiName: emoji }, rerenders), audioSrc ? _jsx(Audio, { src: audioSrc }) : null] }));
72
+ };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export declare const CurrentCountry: React.FC<{
3
+ readonly theme: 'dark' | 'light';
4
+ readonly countryPaths: {
5
+ d: string;
6
+ class: string;
7
+ }[] | null;
8
+ readonly countryLabel: string | null;
9
+ }>;
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { getBoundingBox, resetPath } from '@remotion/paths';
3
+ import { AbsoluteFill, interpolate, spring, useCurrentFrame, useVideoConfig, } from 'remotion';
4
+ export const CurrentCountry = ({ theme, countryPaths, countryLabel }) => {
5
+ const { fps } = useVideoConfig();
6
+ const frame = useCurrentFrame();
7
+ if (!countryPaths) {
8
+ return null;
9
+ }
10
+ const joined = countryPaths.map((p) => p.d).join(' ');
11
+ const reset = resetPath(joined);
12
+ const boundingBox = getBoundingBox(reset);
13
+ const progress = spring({
14
+ fps,
15
+ frame,
16
+ delay: 10,
17
+ });
18
+ return (_jsxs(AbsoluteFill, { style: { overflow: 'hidden' }, children: [_jsx(AbsoluteFill, { style: {
19
+ transform: `scale(${progress})`,
20
+ }, children: _jsx("svg", { viewBox: boundingBox.viewBox, style: {
21
+ scale: '0.8',
22
+ }, children: _jsx("path", { fill: theme === 'light' ? '#bbb' : '#222', d: reset }) }) }), _jsxs(AbsoluteFill, { style: {
23
+ alignItems: 'center',
24
+ justifyContent: 'center',
25
+ }, children: [_jsx("div", { style: {
26
+ color: '#0b84f3',
27
+ fontFamily: 'GTPlanar',
28
+ fontWeight: '500',
29
+ fontSize: 13,
30
+ textAlign: 'center',
31
+ marginTop: -10,
32
+ width: '100%',
33
+ paddingLeft: 20,
34
+ paddingRight: 20,
35
+ transform: 'translateX(' + interpolate(progress, [0, 1], [-100, 0]) + '%)',
36
+ }, children: "Your country" }), _jsx("div", { style: {
37
+ lineHeight: 1.1,
38
+ fontFamily: 'GTPlanar',
39
+ textAlign: 'center',
40
+ fontWeight: '500',
41
+ fontSize: 30,
42
+ color: theme === 'dark' ? 'white' : 'black',
43
+ width: '100%',
44
+ paddingLeft: 20,
45
+ paddingRight: 20,
46
+ transform: 'translateX(' + interpolate(progress, [0, 1], [100, 0]) + '%)',
47
+ }, children: countryLabel })] })] }));
48
+ };
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const DemoError: React.FC;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { FONTS, RED } from '../layout/colors';
3
+ export const DemoError = () => {
4
+ return (_jsx("div", { style: {
5
+ color: RED,
6
+ fontFamily: FONTS.GTPLANAR,
7
+ position: 'absolute',
8
+ paddingTop: 15,
9
+ }, children: "Sorry, we limit the amount of renders possible per day on this page. Come back tomorrow!" }));
10
+ };
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const DemoErrorIcon: React.FC;
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { RED } from '../layout/colors';
3
+ export const DemoErrorIcon = () => {
4
+ return (_jsx("div", { style: {
5
+ height: 26,
6
+ width: 26,
7
+ borderRadius: 13,
8
+ display: 'flex',
9
+ alignItems: 'center',
10
+ justifyContent: 'center',
11
+ animation: 'jump 0.2s ease-out',
12
+ }, children: _jsx("svg", { style: {
13
+ flexShrink: 0,
14
+ width: 26,
15
+ }, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", children: _jsx("path", { fill: RED, d: "M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zM256 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z" }) }) }));
16
+ };
@@ -0,0 +1,33 @@
1
+ import type { PlayerRef } from '@remotion/player';
2
+ import React from 'react';
3
+ import { z } from 'zod';
4
+ declare const data: z.ZodObject<{
5
+ trending: z.ZodObject<{
6
+ repos: z.ZodArray<z.ZodString>;
7
+ date: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
8
+ temperatureInCelsius: z.ZodNumber;
9
+ countryLabel: z.ZodString;
10
+ countryPaths: z.ZodArray<z.ZodObject<{
11
+ d: z.ZodString;
12
+ class: z.ZodString;
13
+ }, z.core.$strip>>;
14
+ }, z.core.$strip>;
15
+ location: z.ZodObject<{
16
+ country: z.ZodString;
17
+ city: z.ZodString;
18
+ latitude: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
19
+ longitude: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
20
+ }, z.core.$strip>;
21
+ emojiIndex: z.ZodNumber;
22
+ theme: z.ZodEnum<{
23
+ light: "light";
24
+ dark: "dark";
25
+ }>;
26
+ cardOrder: z.ZodArray<z.ZodNumber>;
27
+ }, z.core.$strip>;
28
+ export declare const RenderButton: React.FC<{
29
+ readonly renderData: z.infer<typeof data> | null;
30
+ readonly onError: () => void;
31
+ readonly playerRef: React.RefObject<PlayerRef | null>;
32
+ }>;
33
+ export {};
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { renderMediaOnWeb } from '@remotion/web-renderer';
3
+ import React, { useCallback } from 'react';
4
+ import { z } from 'zod';
5
+ import { PALETTE } from '../layout/colors';
6
+ import { HomepageVideoComp } from './Comp';
7
+ import { DemoErrorIcon } from './DemoErrorIcon';
8
+ import { DoneCheckmark } from './DoneCheckmark';
9
+ import { Progress } from './Progress';
10
+ import { Spinner } from './Spinner';
11
+ const countryPath = z.object({
12
+ d: z.string(),
13
+ class: z.string(),
14
+ });
15
+ const remoteData = z.object({
16
+ repos: z.array(z.string()),
17
+ date: z.string().or(z.number()),
18
+ temperatureInCelsius: z.number(),
19
+ countryLabel: z.string(),
20
+ countryPaths: z.array(countryPath),
21
+ });
22
+ const location = z.object({
23
+ country: z.string(),
24
+ city: z.string(),
25
+ latitude: z.number().or(z.string()),
26
+ longitude: z.number().or(z.string()),
27
+ });
28
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
29
+ const data = z.object({
30
+ trending: remoteData,
31
+ location,
32
+ emojiIndex: z.number(),
33
+ theme: z.enum(['light', 'dark']),
34
+ cardOrder: z.array(z.number()),
35
+ });
36
+ const style = {
37
+ appearance: 'none',
38
+ border: 'none',
39
+ outline: 'none',
40
+ backgroundColor: 'transparent',
41
+ cursor: 'pointer',
42
+ width: 55,
43
+ height: 50,
44
+ display: 'flex',
45
+ alignItems: 'center',
46
+ justifyContent: 'center',
47
+ };
48
+ export const RenderButton = ({ renderData, onError, playerRef }) => {
49
+ const [state, setState] = React.useState({
50
+ type: 'idle',
51
+ });
52
+ const triggerRender = useCallback(async () => {
53
+ if (renderData === null) {
54
+ return;
55
+ }
56
+ try {
57
+ setState({ type: 'invoking' });
58
+ const durationInFrames = 120;
59
+ const inputProps = {
60
+ ...renderData,
61
+ onToggle: () => { },
62
+ updateCardOrder: () => { },
63
+ onClickLeft: () => { },
64
+ onClickRight: () => { },
65
+ };
66
+ playerRef.current.pause();
67
+ const { getBlob } = await renderMediaOnWeb({
68
+ composition: {
69
+ component: HomepageVideoComp,
70
+ durationInFrames,
71
+ fps: 30,
72
+ width: 640,
73
+ height: 360,
74
+ id: 'homepage-demo',
75
+ defaultProps: inputProps,
76
+ },
77
+ muted: typeof AudioEncoder === 'undefined',
78
+ scale: 1,
79
+ inputProps,
80
+ onProgress: ({ progress }) => {
81
+ setState({
82
+ type: 'progress',
83
+ progress,
84
+ });
85
+ },
86
+ });
87
+ const blob = await getBlob();
88
+ const url = URL.createObjectURL(blob);
89
+ const a = document.createElement('a');
90
+ a.href = url;
91
+ a.download = 'remotion.dev.mp4';
92
+ a.click();
93
+ URL.revokeObjectURL(url);
94
+ setState({ type: 'done' });
95
+ }
96
+ catch (error) {
97
+ // eslint-disable-next-line no-console
98
+ console.error(error);
99
+ setState({ type: 'error' });
100
+ onError();
101
+ }
102
+ }, [onError, renderData, playerRef]);
103
+ return (_jsx("button", { type: "button", onClick: triggerRender, style: style, disabled: !renderData || state.type !== 'idle', children: state.type === 'error' ? (_jsx(DemoErrorIcon, {})) : state.type === 'done' ? (_jsx(DoneCheckmark, {})) : state.type === 'progress' ? (_jsx(Progress, { progress: state.progress })) : state.type === 'invoking' ? (_jsx(Spinner, { size: 20, duration: 1 })) : (_jsx("svg", { style: {
104
+ width: 18,
105
+ opacity: renderData ? 1 : 0.5,
106
+ }, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 384 512", children: _jsx("path", { fill: PALETTE.TEXT_COLOR, d: "M214.6 342.6L192 365.3l-22.6-22.6-128-128L18.7 192 64 146.7l22.6 22.6L160 242.7 160 64l0-32 64 0 0 32 0 178.7 73.4-73.4L320 146.7 365.3 192l-22.6 22.6-128 128zM32 416l320 0 32 0 0 64-32 0L32 480 0 480l0-64 32 0z" }) })) }));
107
+ };
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ export declare const NUM_WIDTH = 36;
3
+ export declare const Wheel: React.FC<{
4
+ readonly delay: number;
5
+ readonly digits: number[];
6
+ readonly renderDigit: (i: number) => React.ReactNode;
7
+ readonly isLeadingDigit: boolean;
8
+ readonly isNegative: boolean[];
9
+ }>;