@evatril/video-templates 2.0.7 → 2.0.8

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 (51) hide show
  1. package/package.json +1 -1
  2. package/public/video-images/03022026-bg-2.webp +0 -0
  3. package/public/video-images/03022026-bg-3.webp +0 -0
  4. package/public/video-images/03022026-bg-4.webp +0 -0
  5. package/public/video-images/03022026-bg-5.webp +0 -0
  6. package/public/video-images/03022026-bg.webp +0 -0
  7. package/public/video-images/03022026-krishnaradha-2.webp +0 -0
  8. package/public/video-images/03022026-krishnaradha-4.webp +0 -0
  9. package/public/video-images/03022026-krishnaradha-5.webp +0 -0
  10. package/public/video-images/03022026-krishnaradha.webp +0 -0
  11. package/public/video-images/28012026-BottomLeftFlower.webp +0 -0
  12. package/public/video-images/28012026-BottomRightFlower.webp +0 -0
  13. package/public/video-images/28012026-FlowerBorder.webp +0 -0
  14. package/public/video-images/28012026-Ganesh.webp +0 -0
  15. package/public/video-images/28012026-TopBorder.webp +0 -0
  16. package/public/video-images/28012026-TopLeftFlower.webp +0 -0
  17. package/public/video-images/28012026-TopRightFlower.webp +0 -0
  18. package/public/video-images/28012026-bg.webp +0 -0
  19. package/public/video-images/28012026-border.webp +0 -0
  20. package/public/video-images/28012026-frame.webp +0 -0
  21. package/public/video-images/wedding2.mp3 +0 -0
  22. package/src/Invitations/Elements/BlowingLeaves28012026.jsx +68 -0
  23. package/src/Invitations/Elements/FlowerReveal_TL_BR_28012026.jsx +114 -0
  24. package/src/Invitations/Elements/FlowerReveal_TR_BL_28012026.jsx +116 -0
  25. package/src/Invitations/Elements/GaneshBorder28012026.jsx +95 -0
  26. package/src/Invitations/Elements/GaneshGoldenHalo.jsx +90 -0
  27. package/src/Invitations/Elements/HeartDraw28012026.jsx +51 -0
  28. package/src/Invitations/Elements/HeartFlight28012026.jsx +72 -0
  29. package/src/Invitations/Elements/HoldSlide.jsx +103 -0
  30. package/src/Invitations/Elements/LetterReveal28012026.jsx +47 -0
  31. package/src/Invitations/Elements/PageFlipTransition.jsx +180 -0
  32. package/src/Invitations/Elements/{SmoothRevealFromTop.jsx → SmoothRevealFromTop20012026.jsx} +1 -1
  33. package/src/Invitations/Elements/WordReveal28012026.jsx +92 -0
  34. package/src/Invitations/Frames/F03022026_01.jsx +214 -0
  35. package/src/Invitations/Frames/F03022026_02.jsx +312 -0
  36. package/src/Invitations/Frames/F03022026_03.jsx +332 -0
  37. package/src/Invitations/Frames/F03022026_04.jsx +300 -0
  38. package/src/Invitations/Frames/F03022026_05.jsx +235 -0
  39. package/src/Invitations/Frames/F20012026_01.jsx +0 -2
  40. package/src/Invitations/Frames/F20012026_02.jsx +8 -8
  41. package/src/Invitations/Frames/F20012026_03.jsx +8 -8
  42. package/src/Invitations/Frames/F28012026_01.jsx +51 -0
  43. package/src/Invitations/Frames/F28012026_02.jsx +246 -0
  44. package/src/Invitations/Frames/F28012026_03.jsx +268 -0
  45. package/src/Invitations/Frames/F28012026_04.jsx +275 -0
  46. package/src/Invitations/Frames/F28012026_05.jsx +179 -0
  47. package/src/Invitations/Themes/T03022026_01.jsx +269 -0
  48. package/src/Invitations/Themes/T20012026_01.jsx +21 -3
  49. package/src/Invitations/Themes/T28012026_01.jsx +241 -0
  50. package/src/compositions.jsx +20 -2
  51. package/src/index.js +3 -1
@@ -0,0 +1,103 @@
1
+ // import React from "react";
2
+ // import { AbsoluteFill, useCurrentFrame, interpolate } from "remotion";
3
+
4
+ // export const HoldSlide = ({
5
+ // children,
6
+ // nextChildren,
7
+ // contentDuration,
8
+ // slideDuration,
9
+ // }) => {
10
+ // const frame = useCurrentFrame();
11
+
12
+ // const progress = interpolate(
13
+ // frame,
14
+ // [contentDuration, contentDuration + slideDuration],
15
+ // [0, 1],
16
+ // {
17
+ // extrapolateLeft: "clamp",
18
+ // extrapolateRight: "clamp",
19
+ // }
20
+ // );
21
+
22
+ // const width = 100;
23
+
24
+ // return (
25
+ // <AbsoluteFill style={{ overflow: "hidden" }}>
26
+ // {/* CURRENT */}
27
+ // <AbsoluteFill
28
+ // style={{
29
+ // transform: `translateX(${-progress * width}%)`,
30
+ // }}
31
+ // >
32
+ // {children}
33
+ // </AbsoluteFill>
34
+
35
+ // {/* NEXT */}
36
+ // {nextChildren && (
37
+ // <AbsoluteFill
38
+ // style={{
39
+ // transform: `translateX(${100 - progress * width}%)`,
40
+ // }}
41
+ // >
42
+ // {nextChildren}
43
+ // </AbsoluteFill>
44
+ // )}
45
+ // </AbsoluteFill>
46
+ // );
47
+ // };
48
+
49
+
50
+ import React from "react";
51
+ import { AbsoluteFill, Img, useCurrentFrame, interpolate } from "remotion";
52
+
53
+ export const HoldSlide = ({
54
+ children,
55
+ nextBg,
56
+ contentDuration,
57
+ slideDuration,
58
+ }) => {
59
+ const frame = useCurrentFrame();
60
+
61
+ const progress = interpolate(
62
+ frame,
63
+ [contentDuration, contentDuration + slideDuration],
64
+ [0, 1],
65
+ {
66
+ extrapolateLeft: "clamp",
67
+ extrapolateRight: "clamp",
68
+ }
69
+ );
70
+
71
+ return (
72
+ <AbsoluteFill style={{ overflow: "hidden" }}>
73
+ {/* CURRENT */}
74
+ <AbsoluteFill
75
+ style={{
76
+ transform: `translateX(${-progress * 100}%)`,
77
+ }}
78
+ >
79
+ {children}
80
+ </AbsoluteFill>
81
+
82
+ {/* NEXT BACKGROUND */}
83
+ {nextBg && (
84
+ <AbsoluteFill
85
+ style={{
86
+ transform: `translateX(${100 - progress * 100}%)`,
87
+ }}
88
+ >
89
+ <Img
90
+ src={nextBg}
91
+ style={{
92
+ position: "absolute",
93
+ inset: 0,
94
+ width: "100%",
95
+ height: "100%",
96
+ objectFit: "cover",
97
+ }}
98
+ />
99
+ </AbsoluteFill>
100
+ )}
101
+ </AbsoluteFill>
102
+ );
103
+ };
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import { useCurrentFrame, interpolate } from "remotion";
3
+
4
+ export const LetterReveal28012026 = ({
5
+ text = "",
6
+ start = 0,
7
+ stagger = 4, // frames between letters
8
+ }) => {
9
+ const frame = useCurrentFrame();
10
+
11
+ return (
12
+ <>
13
+ {text.split("").map((char, i) => {
14
+ const appear = interpolate(
15
+ frame,
16
+ [start + i * stagger, start + i * stagger + 10],
17
+ [0, 1],
18
+ {
19
+ extrapolateRight: "clamp",
20
+ }
21
+ );
22
+
23
+ const y = interpolate(
24
+ frame,
25
+ [start + i * stagger, start + i * stagger + 10],
26
+ [15, 0],
27
+ {
28
+ extrapolateRight: "clamp",
29
+ }
30
+ );
31
+
32
+ return (
33
+ <span
34
+ key={i}
35
+ style={{
36
+ display: "inline-block",
37
+ opacity: appear,
38
+ transform: `translateY(${y}px)`,
39
+ }}
40
+ >
41
+ {char === " " ? "\u00A0" : char}
42
+ </span>
43
+ );
44
+ })}
45
+ </>
46
+ );
47
+ };
@@ -0,0 +1,180 @@
1
+ // import React from "react";
2
+ // import {
3
+ // AbsoluteFill,
4
+ // useCurrentFrame,
5
+ // interpolate,
6
+ // Easing,
7
+ // staticFile,
8
+ // } from "remotion";
9
+
10
+ // export const PageFlipTransition = ({
11
+ // children,
12
+ // background,
13
+ // sceneDuration = 192,
14
+ // flipDuration = 24,
15
+ // }) => {
16
+ // const frame = useCurrentFrame();
17
+
18
+ // const flipStart = sceneDuration - flipDuration;
19
+
20
+ // const rotateY = interpolate(
21
+ // frame,
22
+ // [flipStart + flipDuration * 0.35, sceneDuration],
23
+ // [0, 90],
24
+ // {
25
+ // extrapolateLeft: "clamp",
26
+ // extrapolateRight: "clamp",
27
+ // easing: Easing.inOut(Easing.ease),
28
+ // }
29
+ // );
30
+
31
+ // // reveal next page only at end
32
+ // const bgOpacity = interpolate(
33
+ // frame,
34
+ // [flipStart + flipDuration * 0.5, sceneDuration],
35
+ // [0, 1],
36
+ // {
37
+ // extrapolateLeft: "clamp",
38
+ // extrapolateRight: "clamp",
39
+ // }
40
+ // );
41
+
42
+
43
+ // return (
44
+ // <AbsoluteFill style={{ perspective: 2500 }}>
45
+
46
+ // {/* FAKE BACK OF PAGE (prevents black void) */}
47
+ // <AbsoluteFill>
48
+ // <img
49
+ // src={staticFile("video-images/28012026-bg.png")}
50
+ // style={{
51
+ // position: "absolute",
52
+ // inset: 0,
53
+ // width: "100%",
54
+ // height: "100%",
55
+ // objectFit: "cover",
56
+ // }}
57
+ // />
58
+ // </AbsoluteFill>
59
+
60
+ // {/* REAL NEXT PAGE (appears only after flip) */}
61
+ // <AbsoluteFill style={{ opacity: bgOpacity }}>
62
+ // {background}
63
+ // </AbsoluteFill>
64
+
65
+ // {/* CURRENT PAGE */}
66
+ // <AbsoluteFill
67
+ // style={{
68
+ // transformOrigin: "left center",
69
+ // transformStyle: "preserve-3d",
70
+ // backfaceVisibility: "hidden",
71
+ // transform: `rotateY(-${rotateY}deg)`,
72
+ // boxShadow: "20px 0 40px rgba(0,0,0,0.25)",
73
+ // }}
74
+ // >
75
+ // {children}
76
+ // </AbsoluteFill>
77
+
78
+ // </AbsoluteFill>
79
+ // );
80
+ // };
81
+
82
+
83
+
84
+
85
+
86
+ import React from "react";
87
+ import {
88
+ AbsoluteFill,
89
+ useCurrentFrame,
90
+ interpolate,
91
+ Easing,
92
+ staticFile,
93
+ } from "remotion";
94
+
95
+ export const PageFlipTransition = ({
96
+ children,
97
+ background,
98
+ sceneDuration = 192,
99
+ flipDuration = 30,
100
+ direction = "left", // "left" | "right"
101
+ }) => {
102
+ const frame = useCurrentFrame();
103
+
104
+ const flipStart = sceneDuration - flipDuration;
105
+
106
+ // const rotate = interpolate(
107
+ // frame,
108
+ // [flipStart + flipDuration * 0.35, sceneDuration],
109
+ // [0, 100],
110
+ // {
111
+ // extrapolateLeft: "clamp",
112
+ // extrapolateRight: "clamp",
113
+ // easing: Easing.inOut(Easing.ease),
114
+ // }
115
+ // );
116
+ const rotate = interpolate(
117
+ frame,
118
+ [flipStart, sceneDuration],
119
+ [0, 80],
120
+ {
121
+ extrapolateLeft: "clamp",
122
+ extrapolateRight: "clamp",
123
+ easing: Easing.inOut(Easing.cubic),
124
+ }
125
+ );
126
+
127
+ const signedRotate = direction === "left" ? -rotate : rotate;
128
+
129
+ const bgOpacity = interpolate(
130
+ frame,
131
+ [flipStart + flipDuration * 0.5, sceneDuration],
132
+ [0, 1],
133
+ {
134
+ extrapolateLeft: "clamp",
135
+ extrapolateRight: "clamp",
136
+ }
137
+ );
138
+
139
+ return (
140
+ <AbsoluteFill style={{ perspective: 2500 }}>
141
+
142
+ {/* Fake back of page */}
143
+ <AbsoluteFill>
144
+ <img
145
+ src={staticFile("video-images/28012026-bg.png")}
146
+ style={{
147
+ position: "absolute",
148
+ inset: 0,
149
+ width: "100%",
150
+ height: "100%",
151
+ objectFit: "cover",
152
+ }}
153
+ />
154
+ </AbsoluteFill>
155
+
156
+ {/* Next page */}
157
+ <AbsoluteFill style={{ opacity: bgOpacity }}>
158
+ {background}
159
+ </AbsoluteFill>
160
+
161
+ {/* Current page */}
162
+ <AbsoluteFill
163
+ style={{
164
+ transformOrigin:
165
+ direction === "left" ? "left center" : "right center",
166
+ transformStyle: "preserve-3d",
167
+ backfaceVisibility: "hidden",
168
+ transform: `rotateY(${signedRotate}deg)`,
169
+ boxShadow:
170
+ direction === "left"
171
+ ? "20px 0 40px rgba(0,0,0,0.25)"
172
+ : "-20px 0 40px rgba(0,0,0,0.25)",
173
+ }}
174
+ >
175
+ {children}
176
+ </AbsoluteFill>
177
+
178
+ </AbsoluteFill>
179
+ );
180
+ };
@@ -1,6 +1,6 @@
1
1
  import { interpolate, Easing } from "remotion";
2
2
 
3
- export const SmoothRevealFromTop = ({
3
+ export const SmoothRevealFromTop20012026 = ({
4
4
  frame,
5
5
  startFrame,
6
6
  delay = 0,
@@ -0,0 +1,92 @@
1
+ import React from "react";
2
+ import {
3
+ useCurrentFrame,
4
+ useVideoConfig,
5
+ interpolate,
6
+ Easing,
7
+ } from "remotion";
8
+
9
+ export const WordReveal28012026 = ({
10
+ text = "",
11
+ start = 0,
12
+ fontSize = 80,
13
+ color = "#000",
14
+ fontFamily = "Dancing Script",
15
+ letterSpacing = 2,
16
+ }) => {
17
+ const frame = useCurrentFrame();
18
+ const { fps } = useVideoConfig();
19
+
20
+ const words = text.split(" ");
21
+
22
+ const wordDelay = fps * 0.15; // ⏱ 150ms between words
23
+ const animDuration = fps * 0.4; // ⏱ 400ms animation
24
+
25
+ return (
26
+ <div
27
+ style={{
28
+ display: "flex",
29
+ flexWrap: "wrap",
30
+ justifyContent: "center",
31
+ width: "100%",
32
+ textAlign: "center",
33
+ }}
34
+ >
35
+ {words.map((word, i) => {
36
+ const delay = start + i * wordDelay;
37
+
38
+ const opacity = interpolate(
39
+ frame,
40
+ [delay, delay + animDuration],
41
+ [0, 1],
42
+ {
43
+ extrapolateLeft: "clamp",
44
+ extrapolateRight: "clamp",
45
+ easing: Easing.out(Easing.cubic),
46
+ }
47
+ );
48
+
49
+ const translateY = interpolate(
50
+ frame,
51
+ [delay, delay + animDuration],
52
+ [30, 0],
53
+ {
54
+ extrapolateLeft: "clamp",
55
+ extrapolateRight: "clamp",
56
+ easing: Easing.out(Easing.cubic),
57
+ }
58
+ );
59
+
60
+ const scale = interpolate(
61
+ frame,
62
+ [delay, delay + animDuration],
63
+ [0.95, 1],
64
+ {
65
+ extrapolateLeft: "clamp",
66
+ extrapolateRight: "clamp",
67
+ }
68
+ );
69
+
70
+ return (
71
+ <span
72
+ key={i}
73
+ style={{
74
+ opacity,
75
+ transform: `translateY(${translateY}px) scale(${scale})`,
76
+ margin: "0 12px 8px 0",
77
+ fontSize,
78
+ color,
79
+ fontFamily,
80
+ letterSpacing,
81
+ lineHeight: 1.3,
82
+ fontWeight: 600,
83
+ display: "inline-block",
84
+ }}
85
+ >
86
+ {word}
87
+ </span>
88
+ );
89
+ })}
90
+ </div>
91
+ );
92
+ };
@@ -0,0 +1,214 @@
1
+ import React from "react";
2
+ import {
3
+ AbsoluteFill,
4
+ Img,
5
+ staticFile,
6
+ useCurrentFrame,
7
+ useVideoConfig,
8
+ interpolate,
9
+ Easing
10
+ } from "remotion";
11
+ import { FlowerReveal_TL_BR_28012026 } from "../Elements/FlowerReveal_TL_BR_28012026";
12
+
13
+ export const F03022026_01 = () => {
14
+ const frame = useCurrentFrame();
15
+ const { fps } = useVideoConfig();
16
+
17
+ const moveDuration = fps * 3;
18
+ const moveX = interpolate(
19
+ frame,
20
+ [0, moveDuration],
21
+ [-80, 80],
22
+ {
23
+ easing: Easing.inOut(Easing.ease),
24
+ extrapolateRight: "clamp",
25
+ }
26
+ );
27
+
28
+ const start = fps * 0.8;
29
+
30
+ // Image animation (same timing as Wedding)
31
+ const imageOpacity = interpolate(frame, [start, start + 25], [0, 1], {
32
+ extrapolateLeft: "clamp",
33
+ extrapolateRight: "clamp",
34
+ easing: Easing.out(Easing.cubic),
35
+ });
36
+
37
+ // Wedding animation
38
+ const weddingOpacity = interpolate(frame, [start, start + 20], [0, 1], {
39
+ extrapolateLeft: "clamp",
40
+ extrapolateRight: "clamp",
41
+ easing: Easing.out(Easing.cubic),
42
+ });
43
+
44
+ const weddingY = interpolate(frame, [start, start + 20], [60, 0], {
45
+ extrapolateLeft: "clamp",
46
+ extrapolateRight: "clamp",
47
+ });
48
+
49
+ // Invitation animation (slightly delayed)
50
+ const inviteStart = start + 10;
51
+
52
+ const inviteOpacity = interpolate(frame, [inviteStart, inviteStart + 20], [0, 1], {
53
+ extrapolateLeft: "clamp",
54
+ extrapolateRight: "clamp",
55
+ easing: Easing.out(Easing.cubic),
56
+ });
57
+
58
+ const inviteY = interpolate(frame, [inviteStart, inviteStart + 20], [60, 0], {
59
+ extrapolateLeft: "clamp",
60
+ extrapolateRight: "clamp",
61
+ });
62
+
63
+
64
+ // Scene timing
65
+ const sceneDuration = fps * 5;
66
+
67
+ // Exit starts near end
68
+ const exitStart = sceneDuration - fps * 1;
69
+
70
+ // Wedding exit
71
+ const weddingExitOpacity = interpolate(
72
+ frame,
73
+ [exitStart, exitStart + 25],
74
+ [1, 0],
75
+ {
76
+ extrapolateLeft: "clamp",
77
+ extrapolateRight: "clamp",
78
+ easing: Easing.out(Easing.cubic),
79
+ }
80
+ );
81
+
82
+ const weddingExitY = interpolate(
83
+ frame,
84
+ [exitStart, exitStart + 25],
85
+ [0, -80], // moves UP
86
+ {
87
+ extrapolateLeft: "clamp",
88
+ extrapolateRight: "clamp",
89
+ }
90
+ );
91
+
92
+ // Invitation exit (slightly delayed)
93
+ const inviteExitStart = exitStart;
94
+
95
+ const inviteExitOpacity = interpolate(
96
+ frame,
97
+ [inviteExitStart, inviteExitStart + 25],
98
+ [1, 0],
99
+ {
100
+ extrapolateLeft: "clamp",
101
+ extrapolateRight: "clamp",
102
+ easing: Easing.out(Easing.cubic),
103
+ }
104
+ );
105
+
106
+ const inviteExitY = interpolate(
107
+ frame,
108
+ [inviteExitStart, inviteExitStart + 25],
109
+ [0, -80],
110
+ {
111
+ extrapolateLeft: "clamp",
112
+ extrapolateRight: "clamp",
113
+ }
114
+ );
115
+
116
+ // Image exit (same timing as Wedding but slower for elegance)
117
+ const imageExitOpacity = interpolate(
118
+ frame,
119
+ [exitStart, exitStart + 35],
120
+ [1, 0],
121
+ {
122
+ extrapolateLeft: "clamp",
123
+ extrapolateRight: "clamp",
124
+ easing: Easing.out(Easing.cubic),
125
+ }
126
+ );
127
+
128
+ const imageExitY = interpolate(
129
+ frame,
130
+ [exitStart, exitStart + 35],
131
+ [0, -120], // image moves UP more
132
+ {
133
+ extrapolateLeft: "clamp",
134
+ extrapolateRight: "clamp",
135
+ }
136
+ );
137
+
138
+ return (
139
+ <AbsoluteFill
140
+ style={{
141
+ overflow: "hidden",
142
+ }}
143
+ >
144
+ <div
145
+ style={{
146
+ position: "absolute",
147
+ bottom: 0,
148
+ width: "100%",
149
+ height: "100%",
150
+ overflow: "hidden",
151
+ }}
152
+ >
153
+ <Img
154
+ src={staticFile("video-images/03022026-krishnaradha.webp")}
155
+ style={{
156
+ position: "absolute",
157
+ top: "32%",
158
+ left: "50%",
159
+ width: "170%",
160
+ objectFit: "cover",
161
+ opacity: imageOpacity * imageExitOpacity,
162
+ transform: `translateX(${moveX}px) translateX(-50%) translateY(${imageExitY}px)`,
163
+ }}
164
+ />
165
+ </div>
166
+
167
+ <FlowerReveal_TL_BR_28012026 />
168
+
169
+ <div
170
+ style={{
171
+ position: "absolute",
172
+ top: "30%",
173
+ left: "50%",
174
+ transform: "translate(-50%, -50%)",
175
+ textAlign: "center",
176
+ }}
177
+ >
178
+ <h1
179
+ style={{
180
+ fontFamily: "Dancing Script",
181
+ color: "#C47A8A",
182
+ letterSpacing: 3,
183
+ lineHeight: 1.3,
184
+ fontWeight: 600,
185
+ fontSize: 150,
186
+ margin: 0,
187
+ opacity: weddingOpacity * weddingExitOpacity,
188
+ transform: `translateY(${weddingY + weddingExitY}px)`,
189
+ }}
190
+ >
191
+ Wedding
192
+ </h1>
193
+
194
+ <h1
195
+ style={{
196
+ fontFamily: "Dancing Script",
197
+ color: "#C47A8A",
198
+ letterSpacing: 3,
199
+ lineHeight: 1.3,
200
+ fontWeight: 600,
201
+ fontSize: 150,
202
+ margin: 0,
203
+ opacity: inviteOpacity * inviteExitOpacity,
204
+ transform: `translateY(${inviteY + inviteExitY}px)`,
205
+ }}
206
+ >
207
+ Invitation
208
+ </h1>
209
+ </div>
210
+
211
+
212
+ </AbsoluteFill>
213
+ );
214
+ };