@evatril/video-templates 2.0.10 → 2.0.11

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evatril/video-templates",
3
- "version": "2.0.10",
3
+ "version": "2.0.11",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "remotion": {
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  import {
3
3
  Img,
4
- staticFile,
5
4
  useCurrentFrame,
6
5
  useVideoConfig,
7
6
  interpolate,
@@ -74,7 +73,7 @@ export const FlowerReveal_TL_BR_28012026 = ({ startAfter = 0 }) => {
74
73
  <>
75
74
  {/* 🌸 TOP LEFT */}
76
75
  <Img
77
- src={staticFile("video-images/28012026-TopLeftFlower.webp")}
76
+ src="https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/28012026-TopLeftFlower.webp"
78
77
  style={{
79
78
  position: "absolute",
80
79
  top: "-170px",
@@ -93,7 +92,7 @@ export const FlowerReveal_TL_BR_28012026 = ({ startAfter = 0 }) => {
93
92
 
94
93
  {/* 🌸 BOTTOM RIGHT */}
95
94
  <Img
96
- src={staticFile("video-images/28012026-BottomRightFlower.webp")}
95
+ src="https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/28012026-BottomRightFlower.webp"
97
96
  style={{
98
97
  position: "absolute",
99
98
  bottom: "-300px",
@@ -31,7 +31,7 @@ export const SideTrees20012026 = ({ startAfter = 1 }) => {
31
31
  const leftTreeX = interpolate(
32
32
  frame,
33
33
  [delay, delay + duration],
34
- [-600, -380], // hidden → edge
34
+ [-600, -370],
35
35
  {
36
36
  extrapolateLeft: "clamp",
37
37
  extrapolateRight: "clamp",
@@ -42,7 +42,7 @@ export const SideTrees20012026 = ({ startAfter = 1 }) => {
42
42
  const rightTreeX = interpolate(
43
43
  frame,
44
44
  [delay, delay + duration],
45
- [600, 380], // hidden → edge
45
+ [600, 400],
46
46
  {
47
47
  extrapolateLeft: "clamp",
48
48
  extrapolateRight: "clamp",
@@ -50,53 +50,41 @@ export const SideTrees20012026 = ({ startAfter = 1 }) => {
50
50
  }
51
51
  );
52
52
 
53
- /* ---------------- 🌬️ TREE SWING (WIND) ---------------- */
54
- const swingSpeed = 20; // higher = slower swing
55
- const swingAngle = 2; // degrees (keep small)
56
-
57
- const swing =
58
- frame > delay
59
- ? Math.sin((frame - delay) / swingSpeed) * swingAngle
60
- : 0;
61
-
62
- const swayX =
53
+ /* ---------------- 🍃 LEAF SWAY ONLY ---------------- */
54
+ const leafSway =
63
55
  frame > delay
64
- ? Math.sin((frame - delay) / (swingSpeed * 1.3)) * 6
56
+ ? Math.sin((frame - delay) / 28) * 8 // adjust 8 for more/less sway
65
57
  : 0;
66
58
 
67
59
  return (
68
60
  <>
69
61
  {/* 🌳 LEFT TREE */}
70
62
  <Img
71
- src={staticFile("video-images/20012026-tree-left.webp")}
63
+ src={staticFile("video-images/20012026-tree-left1.webp")}
72
64
  style={{
73
65
  position: "absolute",
74
66
  left: 0,
75
67
  bottom: 0,
76
- height: "100%",
68
+ width: "100%",
77
69
  opacity,
78
70
  transform: `
79
- translateX(${leftTreeX + swayX}px)
80
- rotate(${swing}deg)
71
+ translateX(${leftTreeX + leafSway}px)
81
72
  `,
82
- transformOrigin: "bottom left", // 🌳 root fixed
83
73
  }}
84
74
  />
85
75
 
86
76
  {/* 🌳 RIGHT TREE */}
87
77
  <Img
88
- src={staticFile("video-images/20012026-tree-right.webp")}
78
+ src={staticFile("video-images/20012026-tree-right2.webp")}
89
79
  style={{
90
80
  position: "absolute",
91
81
  right: 0,
92
- bottom: 0,
82
+ bottom: "-25%",
93
83
  height: "100%",
94
84
  opacity,
95
85
  transform: `
96
- translateX(${rightTreeX - swayX}px)
97
- rotate(${-swing}deg)
86
+ translateX(${rightTreeX - leafSway}px)
98
87
  `,
99
- transformOrigin: "bottom right", // 🌳 root fixed
100
88
  }}
101
89
  />
102
90
  </>
@@ -2,7 +2,6 @@ import React from "react";
2
2
  import {
3
3
  AbsoluteFill,
4
4
  Img,
5
- staticFile,
6
5
  useCurrentFrame,
7
6
  useVideoConfig,
8
7
  interpolate,
@@ -64,7 +63,7 @@ export const F03022026_01 = () => {
64
63
  // Scene timing
65
64
  const sceneDuration = fps * 5;
66
65
 
67
- // Exit starts near end
66
+ // Exit starts near end
68
67
  const exitStart = sceneDuration - fps * 1;
69
68
 
70
69
  // Wedding exit
@@ -151,7 +150,7 @@ export const F03022026_01 = () => {
151
150
  }}
152
151
  >
153
152
  <Img
154
- src={staticFile("video-images/03022026-krishnaradha.webp")}
153
+ src="https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/03022026-krishnaradha.webp"
155
154
  style={{
156
155
  position: "absolute",
157
156
  top: "40%",
@@ -211,4 +210,4 @@ export const F03022026_01 = () => {
211
210
 
212
211
  </AbsoluteFill>
213
212
  );
214
- };
213
+ };
@@ -6,7 +6,6 @@ import {
6
6
  useVideoConfig,
7
7
  interpolate,
8
8
  Easing,
9
- staticFile,
10
9
  } from "remotion";
11
10
  import { WordReveal28012026 } from "../Elements/WordReveal28012026";
12
11
 
@@ -153,7 +152,6 @@ export const F03022026_02 = ({
153
152
  overflow: "hidden",
154
153
  }}
155
154
  >
156
-
157
155
  <div
158
156
  style={{
159
157
  position: "absolute",
@@ -164,7 +162,7 @@ export const F03022026_02 = ({
164
162
  }}
165
163
  >
166
164
  <Img
167
- src={staticFile("video-images/03022026-krishnaradha-2.webp")}
165
+ src="https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/03022026-krishnaradha-2.webp"
168
166
  style={{
169
167
  position: "absolute",
170
168
  bottom: "-15%",
@@ -202,7 +200,7 @@ export const F03022026_02 = ({
202
200
  overflowWrap: "break-word",
203
201
  lineHeight: "1.2",
204
202
  }}
205
- >
203
+ >
206
204
  <h1
207
205
  style={{
208
206
  fontFamily: "Dancing Script",
@@ -6,7 +6,6 @@ import {
6
6
  interpolate,
7
7
  Easing,
8
8
  Img,
9
- staticFile,
10
9
  } from "remotion";
11
10
 
12
11
  export const F03022026_03 = ({
@@ -254,11 +253,11 @@ export const F03022026_03 = ({
254
253
 
255
254
  {secondPhoto && (
256
255
  <div
257
- style={{
256
+ style={{
258
257
  position: "absolute",
259
258
  bottom: "10%",
260
259
  right: "8%",
261
- width: 420,
260
+ width: 420,
262
261
  height: 420,
263
262
  zIndex: 2,
264
263
  transform: `translateX(${secondPhotoX + exitRightX}px)`,
@@ -6,7 +6,6 @@ import {
6
6
  interpolate,
7
7
  Easing,
8
8
  Img,
9
- staticFile,
10
9
  } from "remotion";
11
10
 
12
11
  export const F03022026_04 = ({
@@ -171,12 +170,12 @@ export const F03022026_04 = ({
171
170
  }}
172
171
  >
173
172
  <Img
174
- src={staticFile("video-images/03022026-krishnaradha-41.webp")}
173
+ src="https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/03022026-krishnaradha-4.webp"
175
174
  style={{
176
175
  position: "absolute",
177
176
  left: "50%",
178
177
  bottom: "-12%",
179
- width: "80%",
178
+ width: "80%",
180
179
  transform: `
181
180
  translate(-50%, ${translateY}px)
182
181
  translateX(${sway}px)
@@ -6,7 +6,6 @@ import {
6
6
  useVideoConfig,
7
7
  interpolate,
8
8
  Easing,
9
- staticFile,
10
9
  } from "remotion";
11
10
  import { WordReveal28012026 } from "../Elements/WordReveal28012026";
12
11
 
@@ -159,7 +158,7 @@ export const F03022026_05 = ({
159
158
  }}
160
159
  >
161
160
  <Img
162
- src={staticFile("video-images/03022026-krishnaradha-52.webp")}
161
+ src="https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/03022026-krishnaradha-5.webp"
163
162
  style={{
164
163
  position: "absolute",
165
164
  top: "40%",
@@ -179,7 +178,7 @@ export const F03022026_05 = ({
179
178
  display: "flex",
180
179
  justifyContent: "center",
181
180
  alignItems: "center",
182
- opacity: msgOpacity * msgExitOpacity,
181
+ opacity: msgOpacity * msgExitOpacity,
183
182
  transform: `translateY(-20%) translateY(${msgY + msgExitY}px)`,
184
183
  }}
185
184
  >
@@ -67,9 +67,10 @@ export const F20012026_02 = ({
67
67
  >
68
68
  {/* Curtain */}
69
69
  <Img
70
- src={staticFile("video-images/20012026-curtain-floral.webp")}
70
+ src={staticFile("video-images/20012026-curtain-floral3.webp")}
71
71
  style={{
72
72
  position: "absolute",
73
+ top:"-12%",
73
74
  left: "50%",
74
75
  width: "100%",
75
76
  opacity: imageOpacity,
@@ -9,272 +9,256 @@ import {
9
9
  staticFile,
10
10
  } from "remotion";
11
11
 
12
- import { GroomBrideLoveScene20012026 } from "../Elements/GroomBrideLoveScene20012026.jsx";
13
- import { SmoothRevealFromTop20012026 } from "../Elements/SmoothRevealFromTop20012026.jsx"
14
-
15
12
  export const F20012026_03 = ({
16
- eventDateTime,
17
- venueName,
18
- venueAddress,
19
- familyMember,
20
- fadeInDuration = 30,
13
+ firstName,
14
+ firstPhoto,
15
+ secondName,
16
+ secondPhoto,
21
17
  }) => {
22
18
  const frame = useCurrentFrame();
23
19
  const { fps } = useVideoConfig();
20
+ const opacity = interpolate(frame, [0, 25], [0, 1], {
21
+ extrapolateRight: "clamp",
22
+ });
23
+
24
+ const translateY = interpolate(frame, [0, 25], [-40, 0], {
25
+ extrapolateRight: "clamp",
26
+ easing: Easing.out(Easing.ease),
27
+ });
24
28
 
25
- /* ---------------- DATE UTILS ---------------- */
26
- const getDateParts = (iso) => {
27
- if (!iso) return { day: "", month: "", year: "", time: "" };
29
+ // timing (30fps based)
30
+ const firstPhotoStart = fps * 1; // 1 second
31
+ const firstTextStart = fps * 1.5; // +0.5s
32
+ const secondPhotoStart = fps * 2; // +1s after first
33
+ const secondTextStart = fps * 2.5; // +0.5s
28
34
 
29
- const d = new Date(iso);
30
- if (isNaN(d.getTime())) {
31
- return { day: "", month: "", year: "", time: "" };
35
+ // FIRST PHOTO (from left)
36
+ const firstPhotoX = interpolate(
37
+ frame,
38
+ [firstPhotoStart, firstPhotoStart + fps * 2],
39
+ [-200, 0],
40
+ {
41
+ extrapolateRight: "clamp",
42
+ easing: Easing.out(Easing.cubic),
32
43
  }
44
+ );
33
45
 
34
- return {
35
- day: d.getDate(),
36
- month: d.toLocaleString("en-US", { month: "long" }),
37
- year: d.getFullYear(),
38
- time: d.toLocaleTimeString("en-US", {
39
- hour: "2-digit",
40
- minute: "2-digit",
41
- hour12: true,
42
- }),
43
- };
44
- };
46
+ const firstPhotoOpacity = interpolate(
47
+ frame,
48
+ [firstPhotoStart, firstPhotoStart + 10],
49
+ [0, 1],
50
+ { extrapolateRight: "clamp" }
51
+ );
45
52
 
46
- const { day, month, year, time } = getDateParts(eventDateTime);
53
+ // FIRST TEXT
54
+ const firstTextX = interpolate(
55
+ frame,
56
+ [firstTextStart, firstTextStart + 20],
57
+ [-30, 0],
58
+ {
59
+ extrapolateRight: "clamp",
60
+ easing: Easing.out(Easing.ease),
61
+ }
62
+ );
47
63
 
48
- const DETAILS_START = fps * 4;
64
+ const firstTextOpacity = interpolate(
65
+ frame,
66
+ [firstTextStart, firstTextStart + 10],
67
+ [0, 1],
68
+ { extrapolateRight: "clamp" }
69
+ );
49
70
 
50
- /* ================= IMAGE ANIMATION ================= */
51
- const showImageAfter = fadeInDuration * 2;
71
+ // SECOND PHOTO (from right)
72
+ const secondPhotoX = interpolate(
73
+ frame,
74
+ [secondPhotoStart, secondPhotoStart + fps * 2],
75
+ [200, 0],
76
+ {
77
+ extrapolateRight: "clamp",
78
+ easing: Easing.out(Easing.cubic),
79
+ }
80
+ );
52
81
 
53
- const imageOpacity = interpolate(
82
+ const secondPhotoOpacity = interpolate(
54
83
  frame,
55
- [showImageAfter, showImageAfter + fps * 1.2],
84
+ [secondPhotoStart, secondPhotoStart + 10],
56
85
  [0, 1],
86
+ { extrapolateRight: "clamp" }
87
+ );
88
+
89
+ // SECOND TEXT
90
+ const secondTextX = interpolate(
91
+ frame,
92
+ [secondTextStart, secondTextStart + 20],
93
+ [60, 0], // 👉 from RIGHT to center
57
94
  {
58
95
  extrapolateRight: "clamp",
59
96
  easing: Easing.out(Easing.ease),
60
97
  }
61
98
  );
62
99
 
63
- const imageScale = interpolate(
100
+ const secondTextOpacity = interpolate(
101
+ frame,
102
+ [secondTextStart, secondTextStart + 10],
103
+ [0, 1],
104
+ { extrapolateRight: "clamp" }
105
+ );
106
+
107
+ const totalFrames = fps * 7;
108
+
109
+ const exitStart = totalFrames - fps * 2; // last 1 second
110
+
111
+ const exitOpacity = interpolate(
112
+ frame,
113
+ [exitStart, totalFrames],
114
+ [1, 0],
115
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
116
+ );
117
+ const exitTopY = interpolate(
64
118
  frame,
65
- [showImageAfter, showImageAfter + fps * 1.2],
66
- [0.95, 1],
119
+ [exitStart, totalFrames],
120
+ [0, -40],
67
121
  {
122
+ extrapolateLeft: "clamp",
68
123
  extrapolateRight: "clamp",
69
- easing: Easing.out(Easing.cubic),
124
+ easing: Easing.in(Easing.ease),
70
125
  }
71
126
  );
72
- const imageTranslateY = interpolate(
127
+ const exitLeftX = interpolate(
73
128
  frame,
74
- [showImageAfter, showImageAfter + fps * 1.2],
75
- [-200, 0], // 🔥 starts above and comes down
129
+ [exitStart, totalFrames],
130
+ [0, -60],
76
131
  {
132
+ extrapolateLeft: "clamp",
77
133
  extrapolateRight: "clamp",
78
- easing: Easing.out(Easing.ease),
134
+ easing: Easing.in(Easing.ease),
135
+ }
136
+ );
137
+ const exitRightX = interpolate(
138
+ frame,
139
+ [exitStart, totalFrames],
140
+ [0, 60],
141
+ {
142
+ extrapolateLeft: "clamp",
143
+ extrapolateRight: "clamp",
144
+ easing: Easing.in(Easing.ease),
79
145
  }
80
146
  );
81
147
 
82
- return (
148
+ return (
83
149
  <AbsoluteFill
84
150
  style={{
85
- transformOrigin: "center center",
86
151
  overflow: "hidden",
87
152
  }}
88
153
  >
89
- <Img
90
- src={staticFile("video-images/20012026-wedding-gate.webp")}
91
- style={{
92
- position: "absolute",
93
- top: 0,
94
- left: "50%",
95
- width: "100%",
96
- height: "100%",
97
- opacity: imageOpacity,
98
- transform: `
99
- translateX(-50%)
100
- translateY(${imageTranslateY}px)
101
- scale(${imageScale})
102
- `,
103
- }}
104
- />
105
154
 
106
- <GroomBrideLoveScene20012026 startAfter={3.5} />
155
+ {firstPhoto && (
156
+ <div
157
+ style={{
158
+ position: "absolute",
159
+ top: "28%",
160
+ left: "8%",
161
+ width: 420,
162
+ height: 420,
163
+ zIndex: 2,
164
+ transform: `translateX(${firstPhotoX + exitLeftX}px)`,
165
+ opacity: firstPhotoOpacity * exitOpacity,
166
+ }}
167
+ >
168
+ <Img
169
+ src={firstPhoto}
170
+ style={{
171
+ width: "100%",
172
+ height: "100%",
173
+ objectFit: "cover",
174
+ border: "4px solid #C65A7A",
175
+ borderRadius: "50%",
176
+ }}
177
+ />
178
+ </div>
179
+ )}
107
180
 
181
+ {/* FIRST NAME + SIDE NOTE */}
108
182
  <div
109
183
  style={{
110
184
  position: "absolute",
111
- top: "24%",
112
- width: "100%",
185
+ top: "35%",
186
+ left: "35%",
187
+ lineHeight: 1.2,
113
188
  display: "flex",
114
189
  flexDirection: "column",
115
190
  alignItems: "center",
116
- textAlign: "center",
117
- zIndex: 5,
118
- gap: "30px"
191
+ transform: `translateX(${firstTextX + exitLeftX}px)`,
192
+ opacity: firstTextOpacity * exitOpacity,
193
+
119
194
  }}
120
195
  >
121
- <div
122
- style={{
123
- maxWidth: "50%",
124
- fontFamily: "Playfair Display",
125
- fontSize: 55,
126
- fontWeight: "600",
127
- color: "#3B2F2F",
128
- lineHeight: 1.2,
129
- letterSpacing: "2px",
130
- whiteSpace: "normal",
131
- wordBreak: "break-word",
132
- overflowWrap: "break-word",
133
- ...SmoothRevealFromTop20012026({
134
- frame,
135
- startFrame: DETAILS_START,
136
- delay: 0,
137
- })
138
- }}
139
- >
140
- {venueName}
141
- </div>
142
-
143
- <div
144
- style={{
145
- maxWidth: "80%",
146
- fontFamily: "Playfair Display",
147
- fontSize: 50,
148
- fontWeight: "600",
149
- color: "#5A4A42",
150
- lineHeight: 1.2,
151
- letterSpacing: "2px",
152
- whiteSpace: "normal",
153
- wordBreak: "break-word",
154
- overflowWrap: "break-word",
155
- ...SmoothRevealFromTop20012026({
156
- frame,
157
- startFrame: DETAILS_START,
158
- delay: 25,
159
- })
160
-
161
- }}
162
- >
163
- {venueAddress}
164
- </div>
165
- <div
166
- style={{
167
- fontFamily: "Great Vibes",
168
- fontSize: 55,
169
- fontWeight: "600",
170
- color: "#6B1E2E",
171
- lineHeight: 1.2,
172
- letterSpacing: "3px",
173
- whiteSpace: "normal",
174
- wordBreak: "break-word",
175
- overflowWrap: "break-word",
176
- ...SmoothRevealFromTop20012026({
177
- frame,
178
- startFrame: DETAILS_START,
179
- delay: 50,
180
- })
181
-
182
- }}
183
- >
184
- On the joyous occasion
185
- </div>
186
- <div
196
+ <h1
187
197
  style={{
188
- maxWidth: "80%",
189
- display: "flex",
190
- gap: 18,
191
- fontFamily: "Playfair Display",
192
- fontSize: 50,
193
- fontWeight: "600",
194
- color: "#6B1E2E",
195
- lineHeight: 1.2,
196
- letterSpacing: "2px",
197
- whiteSpace: "normal",
198
- wordBreak: "break-word",
199
- overflowWrap: "break-word",
200
- ...SmoothRevealFromTop20012026({
201
- frame,
202
- startFrame: DETAILS_START,
203
- delay: 70,
204
- })
205
-
198
+ fontFamily: "Dancing Script",
199
+ color: "#C65A7A",
200
+ fontSize: 80,
201
+ maxWidth: "70%",
202
+ textAlign: "center",
203
+ wordWrap: "break-word",
206
204
  }}
207
205
  >
208
- <span>{day}</span>
209
- <span>{month}</span>
210
- <span>{year}</span>
211
- </div>
212
- <div
213
- style={{
214
- fontFamily: "Great Vibes",
215
- fontSize: 55,
216
- fontWeight: "600",
217
- color: "#4B3A28",
218
- lineHeight: 1.2,
219
- letterSpacing: "2px",
220
- whiteSpace: "normal",
221
- wordBreak: "break-word",
222
- overflowWrap: "break-word",
223
- ...SmoothRevealFromTop20012026({
224
- frame,
225
- startFrame: DETAILS_START,
226
- delay: 95,
227
- })
206
+ {firstName}
207
+ </h1>
208
+ </div>
228
209
 
229
- }}
230
- >
231
- Wedding Time
232
- </div>
210
+ {secondPhoto && (
233
211
  <div
234
- style={{
235
- fontSize: 50,
236
- fontWeight: "600",
237
- color: "#4B3A28",
238
- fontFamily: "Playfair Display",
239
- lineHeight: 1.2,
240
- letterSpacing: "2px",
241
- whiteSpace: "normal",
242
- wordBreak: "break-word",
243
- overflowWrap: "break-word",
244
- ...SmoothRevealFromTop20012026({
245
- frame,
246
- startFrame: DETAILS_START,
247
- delay: 115,
248
- })
249
-
212
+ style={{
213
+ position: "absolute",
214
+ bottom: "10%",
215
+ right: "8%",
216
+ width: 420,
217
+ height: 420,
218
+ zIndex: 2,
219
+ transform: `translateX(${secondPhotoX + exitRightX}px)`,
220
+ opacity: secondPhotoOpacity * exitOpacity,
250
221
  }}
251
222
  >
252
- {time}
223
+ <Img
224
+ src={secondPhoto}
225
+ style={{
226
+ width: "100%",
227
+ height: "100%",
228
+ objectFit: "cover",
229
+ border: "4px solid #C65A7A",
230
+ borderRadius: "50%",
231
+ }}
232
+ />
253
233
  </div>
234
+ )}
254
235
 
255
- <div
236
+ {/* SECOND NAME + SIDE NOTE */}
237
+ <div
238
+ style={{
239
+ position: "absolute",
240
+ bottom: "23%",
241
+ right: "30%",
242
+ lineHeight: 1.2,
243
+ display: "flex",
244
+ flexDirection: "column",
245
+ alignItems: "center",
246
+ transform: `translateX(${secondTextX + exitRightX}px)`,
247
+ opacity: secondTextOpacity * exitOpacity,
248
+ }}
249
+ >
250
+ <h1
256
251
  style={{
257
- maxWidth: "70%",
258
- fontFamily: "Playfair Display",
259
- fontSize: 40,
260
- fontWeight: "600",
261
- lineHeight: 1.2,
262
- color: "#7A5C3E",
263
- lineHeight: 1.2,
264
- letterSpacing: "2px",
265
- whiteSpace: "normal",
266
- wordBreak: "break-word",
267
- overflowWrap: "break-word",
268
- ...SmoothRevealFromTop20012026({
269
- frame,
270
- startFrame: DETAILS_START,
271
- delay: 125,
272
- })
273
-
252
+ fontFamily: "Dancing Script",
253
+ color: "#C65A7A",
254
+ fontSize: 80,
255
+ maxWidth: "90%",
256
+ textAlign: "center",
257
+ wordWrap: "break-word",
274
258
  }}
275
259
  >
276
- {familyMember}
277
- </div>
260
+ {secondName}
261
+ </h1>
278
262
  </div>
279
263
 
280
264
  </AbsoluteFill>
@@ -0,0 +1,282 @@
1
+ import React from "react";
2
+ import {
3
+ AbsoluteFill,
4
+ useCurrentFrame,
5
+ useVideoConfig,
6
+ interpolate,
7
+ Easing,
8
+ Img,
9
+ staticFile,
10
+ } from "remotion";
11
+
12
+ import { GroomBrideLoveScene20012026 } from "../Elements/GroomBrideLoveScene20012026.jsx";
13
+ import { SmoothRevealFromTop20012026 } from "../Elements/SmoothRevealFromTop20012026.jsx"
14
+
15
+ export const F20012026_04 = ({
16
+ eventDateTime,
17
+ venueName,
18
+ venueAddress,
19
+ familyMember,
20
+ fadeInDuration = 30,
21
+ }) => {
22
+ const frame = useCurrentFrame();
23
+ const { fps } = useVideoConfig();
24
+
25
+ /* ---------------- DATE UTILS ---------------- */
26
+ const getDateParts = (iso) => {
27
+ if (!iso) return { day: "", month: "", year: "", time: "" };
28
+
29
+ const d = new Date(iso);
30
+ if (isNaN(d.getTime())) {
31
+ return { day: "", month: "", year: "", time: "" };
32
+ }
33
+
34
+ return {
35
+ day: d.getDate(),
36
+ month: d.toLocaleString("en-US", { month: "long" }),
37
+ year: d.getFullYear(),
38
+ time: d.toLocaleTimeString("en-US", {
39
+ hour: "2-digit",
40
+ minute: "2-digit",
41
+ hour12: true,
42
+ }),
43
+ };
44
+ };
45
+
46
+ const { day, month, year, time } = getDateParts(eventDateTime);
47
+
48
+ const DETAILS_START = fps * 4;
49
+
50
+ /* ================= IMAGE ANIMATION ================= */
51
+ const showImageAfter = fadeInDuration * 2;
52
+
53
+ const imageOpacity = interpolate(
54
+ frame,
55
+ [showImageAfter, showImageAfter + fps * 1.2],
56
+ [0, 1],
57
+ {
58
+ extrapolateRight: "clamp",
59
+ easing: Easing.out(Easing.ease),
60
+ }
61
+ );
62
+
63
+ const imageScale = interpolate(
64
+ frame,
65
+ [showImageAfter, showImageAfter + fps * 1.2],
66
+ [0.95, 1],
67
+ {
68
+ extrapolateRight: "clamp",
69
+ easing: Easing.out(Easing.cubic),
70
+ }
71
+ );
72
+ const imageTranslateY = interpolate(
73
+ frame,
74
+ [showImageAfter, showImageAfter + fps * 1.2],
75
+ [-200, 0], // 🔥 starts above and comes down
76
+ {
77
+ extrapolateRight: "clamp",
78
+ easing: Easing.out(Easing.ease),
79
+ }
80
+ );
81
+
82
+ return (
83
+ <AbsoluteFill
84
+ style={{
85
+ transformOrigin: "center center",
86
+ overflow: "hidden",
87
+ }}
88
+ >
89
+ <Img
90
+ src={staticFile("video-images/20012026-wedding-gate.webp")}
91
+ style={{
92
+ position: "absolute",
93
+ top: 0,
94
+ left: "50%",
95
+ width: "100%",
96
+ height: "100%",
97
+ opacity: imageOpacity,
98
+ transform: `
99
+ translateX(-50%)
100
+ translateY(${imageTranslateY}px)
101
+ scale(${imageScale})
102
+ `,
103
+ }}
104
+ />
105
+
106
+ <GroomBrideLoveScene20012026 startAfter={3.5} />
107
+
108
+ <div
109
+ style={{
110
+ position: "absolute",
111
+ top: "24%",
112
+ width: "100%",
113
+ display: "flex",
114
+ flexDirection: "column",
115
+ alignItems: "center",
116
+ textAlign: "center",
117
+ zIndex: 5,
118
+ gap: "30px"
119
+ }}
120
+ >
121
+ <div
122
+ style={{
123
+ maxWidth: "50%",
124
+ fontFamily: "Playfair Display",
125
+ fontSize: 55,
126
+ fontWeight: "600",
127
+ color: "#3B2F2F",
128
+ lineHeight: 1.2,
129
+ letterSpacing: "2px",
130
+ whiteSpace: "normal",
131
+ wordBreak: "break-word",
132
+ overflowWrap: "break-word",
133
+ ...SmoothRevealFromTop20012026({
134
+ frame,
135
+ startFrame: DETAILS_START,
136
+ delay: 0,
137
+ })
138
+ }}
139
+ >
140
+ {venueName}
141
+ </div>
142
+
143
+ <div
144
+ style={{
145
+ maxWidth: "80%",
146
+ fontFamily: "Playfair Display",
147
+ fontSize: 50,
148
+ fontWeight: "600",
149
+ color: "#5A4A42",
150
+ lineHeight: 1.2,
151
+ letterSpacing: "2px",
152
+ whiteSpace: "normal",
153
+ wordBreak: "break-word",
154
+ overflowWrap: "break-word",
155
+ ...SmoothRevealFromTop20012026({
156
+ frame,
157
+ startFrame: DETAILS_START,
158
+ delay: 25,
159
+ })
160
+
161
+ }}
162
+ >
163
+ {venueAddress}
164
+ </div>
165
+ <div
166
+ style={{
167
+ fontFamily: "Great Vibes",
168
+ fontSize: 55,
169
+ fontWeight: "600",
170
+ color: "#6B1E2E",
171
+ lineHeight: 1.2,
172
+ letterSpacing: "3px",
173
+ whiteSpace: "normal",
174
+ wordBreak: "break-word",
175
+ overflowWrap: "break-word",
176
+ ...SmoothRevealFromTop20012026({
177
+ frame,
178
+ startFrame: DETAILS_START,
179
+ delay: 50,
180
+ })
181
+
182
+ }}
183
+ >
184
+ On the joyous occasion
185
+ </div>
186
+ <div
187
+ style={{
188
+ maxWidth: "80%",
189
+ display: "flex",
190
+ gap: 18,
191
+ fontFamily: "Playfair Display",
192
+ fontSize: 50,
193
+ fontWeight: "600",
194
+ color: "#6B1E2E",
195
+ lineHeight: 1.2,
196
+ letterSpacing: "2px",
197
+ whiteSpace: "normal",
198
+ wordBreak: "break-word",
199
+ overflowWrap: "break-word",
200
+ ...SmoothRevealFromTop20012026({
201
+ frame,
202
+ startFrame: DETAILS_START,
203
+ delay: 70,
204
+ })
205
+
206
+ }}
207
+ >
208
+ <span>{day}</span>
209
+ <span>{month}</span>
210
+ <span>{year}</span>
211
+ </div>
212
+ <div
213
+ style={{
214
+ fontFamily: "Great Vibes",
215
+ fontSize: 55,
216
+ fontWeight: "600",
217
+ color: "#4B3A28",
218
+ lineHeight: 1.2,
219
+ letterSpacing: "2px",
220
+ whiteSpace: "normal",
221
+ wordBreak: "break-word",
222
+ overflowWrap: "break-word",
223
+ ...SmoothRevealFromTop20012026({
224
+ frame,
225
+ startFrame: DETAILS_START,
226
+ delay: 95,
227
+ })
228
+
229
+ }}
230
+ >
231
+ Wedding Time
232
+ </div>
233
+ <div
234
+ style={{
235
+ fontSize: 50,
236
+ fontWeight: "600",
237
+ color: "#4B3A28",
238
+ fontFamily: "Playfair Display",
239
+ lineHeight: 1.2,
240
+ letterSpacing: "2px",
241
+ whiteSpace: "normal",
242
+ wordBreak: "break-word",
243
+ overflowWrap: "break-word",
244
+ ...SmoothRevealFromTop20012026({
245
+ frame,
246
+ startFrame: DETAILS_START,
247
+ delay: 115,
248
+ })
249
+
250
+ }}
251
+ >
252
+ {time}
253
+ </div>
254
+
255
+ <div
256
+ style={{
257
+ maxWidth: "70%",
258
+ fontFamily: "Playfair Display",
259
+ fontSize: 40,
260
+ fontWeight: "600",
261
+ lineHeight: 1.2,
262
+ color: "#7A5C3E",
263
+ lineHeight: 1.2,
264
+ letterSpacing: "2px",
265
+ whiteSpace: "normal",
266
+ wordBreak: "break-word",
267
+ overflowWrap: "break-word",
268
+ ...SmoothRevealFromTop20012026({
269
+ frame,
270
+ startFrame: DETAILS_START,
271
+ delay: 125,
272
+ })
273
+
274
+ }}
275
+ >
276
+ {familyMember}
277
+ </div>
278
+ </div>
279
+
280
+ </AbsoluteFill>
281
+ );
282
+ };
@@ -3,7 +3,6 @@ import {
3
3
  Sequence,
4
4
  useVideoConfig,
5
5
  Audio,
6
- staticFile,
7
6
  AbsoluteFill,
8
7
  Img,
9
8
  useCurrentFrame,
@@ -114,18 +113,19 @@ export const T03022026_01 = ({
114
113
  venue?.address || formData?.venue_address || "";
115
114
 
116
115
  /* ---------------- PRELOAD IMAGES ---------------- */
116
+ const S3_BASE = "https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/";
117
117
 
118
118
  const imagesToPreload = useMemo(
119
119
  () => [
120
- staticFile("video-images/03022026-bg.webp"),
121
- staticFile("video-images/03022026-bg-2.webp"),
122
- staticFile("video-images/03022026-bg-3.webp"),
123
- staticFile("video-images/03022026-bg-4.webp"),
124
- staticFile("video-images/03022026-bg-5.webp"),
125
- staticFile("video-images/03022026-krishnaradha.webp"),
126
- staticFile("video-images/03022026-krishnaradha-2.webp"),
127
- staticFile("video-images/03022026-krishnaradha-4.webp"),
128
- staticFile("video-images/03022026-krishnaradha-5.webp"),
120
+ `${S3_BASE}03022026-bg.webp`,
121
+ `${S3_BASE}03022026-bg-2.webp`,
122
+ `${S3_BASE}03022026-bg-3.webp`,
123
+ `${S3_BASE}03022026-bg-4.webp`,
124
+ `${S3_BASE}03022026-bg-5.webp`,
125
+ `${S3_BASE}03022026-krishnaradha.webp`,
126
+ `${S3_BASE}03022026-krishnaradha-2.webp`,
127
+ `${S3_BASE}03022026-krishnaradha-4.webp`,
128
+ `${S3_BASE}03022026-krishnaradha-5.webp`,
129
129
  ],
130
130
  []
131
131
  );
@@ -150,20 +150,20 @@ export const T03022026_01 = ({
150
150
 
151
151
  const backgrounds = useMemo(
152
152
  () => [
153
- staticFile("video-images/03022026-bg.webp"),
154
- staticFile("video-images/03022026-bg-2.webp"),
155
- staticFile("video-images/03022026-bg-3.webp"),
156
- staticFile("video-images/03022026-bg-4.webp"),
157
- staticFile("video-images/03022026-bg-5.webp"),
153
+ `${S3_BASE}03022026-bg.webp`,
154
+ `${S3_BASE}03022026-bg-2.webp`,
155
+ `${S3_BASE}03022026-bg-3.webp`,
156
+ `${S3_BASE}03022026-bg-4.webp`,
157
+ `${S3_BASE}03022026-bg-5.webp`,
158
158
  ],
159
- []
159
+ [S3_BASE]
160
160
  );
161
161
 
162
162
  return (
163
163
  <AbsoluteFill>
164
164
  {/* 🎵 MUSIC */}
165
165
  <Audio
166
- src={staticFile("video-images/wedding2.mp3")}
166
+ src={`${S3_BASE}wedding2.mp3`}
167
167
  volume={musicVolume}
168
168
  />
169
169
 
@@ -14,6 +14,7 @@ import {
14
14
  import { F20012026_01 } from "../Frames/F20012026_01.jsx";
15
15
  import { F20012026_02 } from "../Frames/F20012026_02.jsx";
16
16
  import { F20012026_03 } from "../Frames/F20012026_03.jsx";
17
+ import { F20012026_04 } from "../Frames/F20012026_04.jsx";
17
18
  import { InkSmokeTransition20012026 } from "../Elements/InkSmokeTransition20012026.jsx";
18
19
  import { usePreloadImages } from "../hooks/usePreloadImages.js";
19
20
 
@@ -149,6 +150,7 @@ export const T20012026_01 = ({
149
150
  const backgrounds = useMemo(
150
151
  () => [
151
152
  staticFile("video-images/20012026-bg.webp"),
153
+ staticFile("video-images/20012026-bg-2.webp"),
152
154
  ],
153
155
  []
154
156
  );
@@ -178,7 +180,7 @@ export const T20012026_01 = ({
178
180
  from={scene1Duration}
179
181
  durationInFrames={transitionDuration}
180
182
  >
181
- <Page bg={backgrounds[0]}>
183
+ <Page bg={backgrounds[1]}>
182
184
  <InkSmokeTransition20012026 />
183
185
  </Page>
184
186
  </Sequence>
@@ -188,7 +190,7 @@ export const T20012026_01 = ({
188
190
  from={scene1Duration + transitionDuration}
189
191
  durationInFrames={scene2Duration}
190
192
  >
191
- <Page bg={backgrounds[0]}>
193
+ <Page bg={backgrounds[1]}>
192
194
  <F20012026_02
193
195
  firstName={firstName}
194
196
  secondName={secondName}
@@ -206,7 +208,7 @@ export const T20012026_01 = ({
206
208
  from={scene1Duration + transitionDuration + scene2Duration}
207
209
  durationInFrames={transitionDuration}
208
210
  >
209
- <Page bg={backgrounds[0]}>
211
+ <Page bg={backgrounds[1]}>
210
212
  <InkSmokeTransition20012026 />
211
213
  </Page>
212
214
  </Sequence>
@@ -218,6 +220,31 @@ export const T20012026_01 = ({
218
220
  >
219
221
  <Page bg={backgrounds[0]}>
220
222
  <F20012026_03
223
+ firstName={firstName}
224
+ firstPhoto={firstPhoto}
225
+ secondName={secondName}
226
+ secondPhoto={secondPhoto}
227
+ />
228
+ </Page>
229
+ </Sequence>
230
+
231
+ {/* ☁️ TRANSITION 3 */}
232
+ <Sequence
233
+ from={scene1Duration + transitionDuration + scene2Duration}
234
+ durationInFrames={transitionDuration}
235
+ >
236
+ <Page bg={backgrounds[1]}>
237
+ <InkSmokeTransition20012026 />
238
+ </Page>
239
+ </Sequence>
240
+
241
+ {/* ================= SCENE 4================= */}
242
+ <Sequence
243
+ from={scene1Duration + transitionDuration + scene2Duration + transitionDuration}
244
+ durationInFrames={scene3Duration}
245
+ >
246
+ <Page bg={backgrounds[0]}>
247
+ <F20012026_04
221
248
  eventDateTime={eventDateTime}
222
249
  venueName={venueName}
223
250
  venueAddress={venueAddress}
@@ -230,4 +257,4 @@ export const T20012026_01 = ({
230
257
  );
231
258
  };
232
259
 
233
- T20012026_01.duration = 24 * 30;
260
+ T20012026_01.duration = 24 * 40;
@@ -1,6 +1,3 @@
1
-
2
- import { staticFile } from "remotion";
3
-
4
1
  let registered = false;
5
2
 
6
3
  export const registerFonts = () => {
@@ -10,21 +7,19 @@ export const registerFonts = () => {
10
7
  const fonts = [
11
8
  {
12
9
  family: "Great Vibes",
13
- url: staticFile("Fonts/GreatVibes-Regular.ttf"),
10
+ url: "https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/Fonts/GreatVibes-Regular.ttf",
14
11
  format: "truetype",
15
12
  weight: "400",
16
13
  },
17
14
  {
18
15
  family: "Dancing Script",
19
- url: staticFile("Fonts/DancingScript-VariableFont_wght.ttf"
20
- ),
16
+ url: "https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/Fonts/DancingScript-VariableFont_wght.ttf",
21
17
  format: "truetype",
22
18
  weight: "100 700",
23
19
  },
24
20
  {
25
21
  family: "Playfair Display",
26
- url: staticFile("Fonts/PlayfairDisplay-Italic-VariableFont_wght.ttf"
27
- ),
22
+ url:"https://evatril-images.s3.ap-south-1.amazonaws.com/video-themes/hindu-wedding-1/v1/Fonts/PlayfairDisplay-Italic-VariableFont_wght.ttf",
28
23
  format: "truetype",
29
24
  weight: "100 900",
30
25
  },