@evatril/video-templates 2.0.7 → 2.0.9

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 (63) 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/Butterflies20012026.jsx +1 -1
  24. package/src/Invitations/Elements/CornerFlipTransition05022026.jsx +45 -0
  25. package/src/Invitations/Elements/DucksFrame05022026.jsx +38 -0
  26. package/src/Invitations/Elements/FloatingFlowersBottom.jsx +70 -0
  27. package/src/Invitations/Elements/FlowerReveal_TL_BR_28012026.jsx +114 -0
  28. package/src/Invitations/Elements/FlowerReveal_TR_BL_28012026.jsx +116 -0
  29. package/src/Invitations/Elements/GaneshBorder28012026.jsx +95 -0
  30. package/src/Invitations/Elements/GaneshGoldenHalo.jsx +90 -0
  31. package/src/Invitations/Elements/HangingJumar05022026.jsx +40 -0
  32. package/src/Invitations/Elements/HangingLamp05022026.jsx +40 -0
  33. package/src/Invitations/Elements/HeartDraw28012026.jsx +51 -0
  34. package/src/Invitations/Elements/HeartFlight28012026.jsx +72 -0
  35. package/src/Invitations/Elements/HoldSlide.jsx +54 -0
  36. package/src/Invitations/Elements/LetterReveal28012026.jsx +47 -0
  37. package/src/Invitations/Elements/OpeningGate20012026.jsx +2 -2
  38. package/src/Invitations/Elements/PageFlipTransition.jsx +180 -0
  39. package/src/Invitations/Elements/{SmoothRevealFromTop.jsx → SmoothRevealFromTop20012026.jsx} +1 -1
  40. package/src/Invitations/Elements/WordReveal28012026.jsx +94 -0
  41. package/src/Invitations/Frames/F03022026_01.jsx +214 -0
  42. package/src/Invitations/Frames/F03022026_02.jsx +313 -0
  43. package/src/Invitations/Frames/F03022026_03.jsx +332 -0
  44. package/src/Invitations/Frames/F03022026_04.jsx +298 -0
  45. package/src/Invitations/Frames/F03022026_05.jsx +235 -0
  46. package/src/Invitations/Frames/F05022026_01.jsx +173 -0
  47. package/src/Invitations/Frames/F05022026_02.jsx +387 -0
  48. package/src/Invitations/Frames/F05022026_03.jsx +328 -0
  49. package/src/Invitations/Frames/F05022026_04.jsx +140 -0
  50. package/src/Invitations/Frames/F20012026_01.jsx +0 -2
  51. package/src/Invitations/Frames/F20012026_02.jsx +8 -8
  52. package/src/Invitations/Frames/F20012026_03.jsx +8 -8
  53. package/src/Invitations/Frames/F28012026_01.jsx +51 -0
  54. package/src/Invitations/Frames/F28012026_02.jsx +246 -0
  55. package/src/Invitations/Frames/F28012026_03.jsx +268 -0
  56. package/src/Invitations/Frames/F28012026_04.jsx +275 -0
  57. package/src/Invitations/Frames/F28012026_05.jsx +179 -0
  58. package/src/Invitations/Themes/T03022026_01.jsx +269 -0
  59. package/src/Invitations/Themes/T05022026_01.jsx +259 -0
  60. package/src/Invitations/Themes/T20012026_01.jsx +74 -21
  61. package/src/Invitations/Themes/T28012026_01.jsx +241 -0
  62. package/src/compositions.jsx +29 -2
  63. package/src/index.js +4 -1
@@ -0,0 +1,269 @@
1
+ import React, { useMemo } from "react";
2
+ import {
3
+ Sequence,
4
+ useVideoConfig,
5
+ Audio,
6
+ staticFile,
7
+ AbsoluteFill,
8
+ Img,
9
+ useCurrentFrame,
10
+ interpolate,
11
+ Easing,
12
+ } from "remotion";
13
+
14
+ import { usePreloadImages } from "../hooks/usePreloadImages.js";
15
+ import { F03022026_01 } from "../Frames/F03022026_01.jsx";
16
+ import { F03022026_02 } from "../Frames/F03022026_02.jsx";
17
+ import { F03022026_03 } from "../Frames/F03022026_03.jsx";
18
+ import { F03022026_04 } from "../Frames/F03022026_04.jsx";
19
+ import { F03022026_05 } from "../Frames/F03022026_05.jsx";
20
+ import { HoldSlide } from "../Elements/HoldSlide.jsx";
21
+
22
+ export const T03022026_01 = ({
23
+ event,
24
+ formData,
25
+ eventDateTime,
26
+ occasionDate,
27
+ venue,
28
+ welcomeMessage,
29
+ invitationMessage,
30
+ familyMember,
31
+ }) => {
32
+ const frame = useCurrentFrame();
33
+ const { fps, durationInFrames } = useVideoConfig();
34
+
35
+ /* ---------------- MUSIC FADE ---------------- */
36
+ const fadeDuration = 2 * fps;
37
+ const fadeOutStart = durationInFrames - fadeDuration;
38
+ const musicVolume = interpolate(
39
+ frame,
40
+ [0, fadeOutStart, durationInFrames],
41
+ [0.4, 0.4, 0],
42
+ {
43
+ easing: Easing.inOut(Easing.ease),
44
+ extrapolateLeft: "clamp",
45
+ extrapolateRight: "clamp",
46
+ }
47
+ );
48
+ const slideDuration = 1 * fps;
49
+
50
+ const firstSceneContent = 5 * fps;
51
+ const secondSceneContent = 6 * fps;
52
+ const thirdSceneContent = 7 * fps;
53
+ const fourSceneContent = 7 * fps;
54
+ const fiveSceneContent = 9 * fps;
55
+ const firstSceneDuration = firstSceneContent + slideDuration;
56
+ const secondSceneDuration = secondSceneContent + slideDuration;
57
+ const thirdSceneDuration = thirdSceneContent + slideDuration;
58
+ const fourSceneDuration = fourSceneContent + slideDuration;
59
+ const fiveSceneDuration = fiveSceneContent + slideDuration;
60
+
61
+ /* ---------------- SAFE DATA ---------------- */
62
+ const whoIsCreating =
63
+ event?.eventData?.occasion_data?.who_is_creating ??
64
+ event?.occasion_data?.who_is_creating ??
65
+ event?.who_is_creating;
66
+
67
+ const isBrideCreating =
68
+ whoIsCreating === "Bride" || !whoIsCreating;
69
+
70
+ const brideName =
71
+ event?.eventData?.occasion_data?.bride_name ??
72
+ event?.occasion_data?.bride_name ??
73
+ formData?.bride_name ??
74
+ "";
75
+
76
+ const groomName =
77
+ event?.eventData?.occasion_data?.groom_name ??
78
+ event?.occasion_data?.groom_name ??
79
+ formData?.groom_name ??
80
+ "";
81
+
82
+ const bridePhoto =
83
+ event?.eventData?.occasion_data?.bride_photo?.url ??
84
+ event?.occasion_data?.bride_photo?.url ??
85
+ formData?.bride_photo ??
86
+ "";
87
+
88
+ const groomPhoto =
89
+ event?.eventData?.occasion_data?.groom_photo?.url ??
90
+ event?.occasion_data?.groom_photo?.url ??
91
+ formData?.groom_photo ??
92
+ "";
93
+
94
+ const firstName = isBrideCreating ? brideName : groomName;
95
+ const secondName = isBrideCreating ? groomName : brideName;
96
+
97
+ const firstPhoto = isBrideCreating ? bridePhoto : groomPhoto;
98
+ const secondPhoto = isBrideCreating ? groomPhoto : bridePhoto;
99
+
100
+
101
+ const firstSideNote = isBrideCreating
102
+ ? formData?.bride_side_note || ""
103
+ : formData?.groom_side_note || "";
104
+
105
+ const secondSideNote = isBrideCreating
106
+ ? formData?.groom_side_note || ""
107
+ : formData?.bride_side_note || "";
108
+
109
+ const venueName =
110
+ venue?.name || formData?.venue_name || "";
111
+
112
+ const venueAddress =
113
+ venue?.address || formData?.venue_address || "";
114
+
115
+ /* ---------------- PRELOAD IMAGES ---------------- */
116
+
117
+ const imagesToPreload = useMemo(
118
+ () => [
119
+ staticFile("video-images/03022026-bg.webp"),
120
+ staticFile("video-images/03022026-bg-2.webp"),
121
+ staticFile("video-images/03022026-bg-3.webp"),
122
+ staticFile("video-images/03022026-bg-4.webp"),
123
+ staticFile("video-images/03022026-bg-5.webp"),
124
+ staticFile("video-images/03022026-krishnaradha.webp"),
125
+ staticFile("video-images/03022026-krishnaradha-2.webp"),
126
+ staticFile("video-images/03022026-krishnaradha-4.webp"),
127
+ staticFile("video-images/03022026-krishnaradha-5.webp"),
128
+ ],
129
+ []
130
+ );
131
+
132
+ usePreloadImages(imagesToPreload);
133
+
134
+ const Page = ({ bg, children }) => (
135
+ <AbsoluteFill>
136
+ <Img
137
+ src={bg}
138
+ style={{
139
+ position: "absolute",
140
+ inset: 0,
141
+ width: "100%",
142
+ height: "100%",
143
+ objectFit: "cover",
144
+ }}
145
+ />
146
+ {children}
147
+ </AbsoluteFill>
148
+ );
149
+
150
+ const backgrounds = useMemo(
151
+ () => [
152
+ staticFile("video-images/03022026-bg.webp"),
153
+ staticFile("video-images/03022026-bg-2.webp"),
154
+ staticFile("video-images/03022026-bg-3.webp"),
155
+ staticFile("video-images/03022026-bg-4.webp"),
156
+ staticFile("video-images/03022026-bg-5.webp"),
157
+ ],
158
+ []
159
+ );
160
+
161
+ return (
162
+ <AbsoluteFill>
163
+ {/* 🎵 MUSIC */}
164
+ <Audio
165
+ src={staticFile("video-images/wedding2.mp3")}
166
+ volume={musicVolume}
167
+ />
168
+
169
+ {/* 🌸 SCENE 1 (0–10s) */}
170
+ <Sequence from={0} durationInFrames={firstSceneDuration}>
171
+ <HoldSlide
172
+ contentDuration={firstSceneContent}
173
+ slideDuration={slideDuration}
174
+ nextBg={backgrounds[1]}
175
+ >
176
+ <Page bg={backgrounds[0]}>
177
+ <F03022026_01 />
178
+ </Page>
179
+ </HoldSlide>
180
+ </Sequence>
181
+
182
+ {/* 🌸 SCENE 2 (10–20s) */}
183
+ <Sequence from={firstSceneDuration} durationInFrames={secondSceneDuration}>
184
+ <HoldSlide
185
+ contentDuration={secondSceneContent}
186
+ slideDuration={slideDuration}
187
+ nextBg={backgrounds[2]}
188
+ >
189
+ <Page bg={backgrounds[1]}>
190
+ <F03022026_02
191
+ firstName={firstName}
192
+ secondName={secondName}
193
+ welcomeMessage={welcomeMessage}
194
+ occasionDate={occasionDate}
195
+ />
196
+ </Page>
197
+ </HoldSlide>
198
+ </Sequence>
199
+
200
+ {/* 🌸 SCENE 3 (20–30s) */}
201
+ <Sequence
202
+ from={firstSceneDuration + secondSceneDuration}
203
+ durationInFrames={thirdSceneDuration}
204
+ >
205
+ <HoldSlide
206
+ contentDuration={thirdSceneContent}
207
+ slideDuration={slideDuration}
208
+ nextBg={backgrounds[3]}
209
+
210
+ >
211
+ <Page bg={backgrounds[2]}>
212
+ <F03022026_03
213
+ firstName={firstName}
214
+ firstPhoto={firstPhoto}
215
+ firstSideNote={firstSideNote}
216
+ secondName={secondName}
217
+ secondPhoto={secondPhoto}
218
+ secondSideNote={secondSideNote}
219
+ invitationMessage={invitationMessage}
220
+ />
221
+ </Page>
222
+ </HoldSlide>
223
+ </Sequence>
224
+
225
+ {/* SCENE 4 */}
226
+ <Sequence
227
+ from={firstSceneDuration + secondSceneDuration + thirdSceneDuration}
228
+ durationInFrames={fourSceneDuration}
229
+ >
230
+ <HoldSlide
231
+ contentDuration={fourSceneContent}
232
+ slideDuration={slideDuration}
233
+ nextBg={backgrounds[4]}
234
+ >
235
+ <Page bg={backgrounds[3]}>
236
+ <F03022026_04
237
+ eventDateTime={eventDateTime}
238
+ venueName={venueName}
239
+ venueAddress={venueAddress}
240
+ />
241
+ </Page>
242
+ </HoldSlide>
243
+ </Sequence>
244
+
245
+ {/* SCENE 5 */}
246
+ <Sequence
247
+ from={
248
+ firstSceneDuration +
249
+ secondSceneDuration +
250
+ thirdSceneDuration +
251
+ fourSceneDuration
252
+ }
253
+ durationInFrames={fiveSceneDuration}
254
+ >
255
+ <HoldSlide
256
+ contentDuration={fiveSceneContent}
257
+ slideDuration={slideDuration}
258
+ >
259
+ <Page bg={backgrounds[4]}>
260
+ <F03022026_05 familyMember={familyMember} />
261
+ </Page>
262
+ </HoldSlide>
263
+ </Sequence>
264
+
265
+ </AbsoluteFill>
266
+ );
267
+ };
268
+
269
+ T03022026_01.duration = 30 * 38;
@@ -0,0 +1,259 @@
1
+ import React, { useMemo } from "react";
2
+ import {
3
+ Sequence,
4
+ useVideoConfig,
5
+ Audio,
6
+ staticFile,
7
+ AbsoluteFill,
8
+ Img,
9
+ useCurrentFrame,
10
+ interpolate,
11
+ Easing,
12
+ } from "remotion";
13
+
14
+ import { usePreloadImages } from "../hooks/usePreloadImages.js";
15
+ import { F05022026_01 } from "../Frames/F05022026_01.jsx";
16
+ import { F05022026_02 } from "../Frames/F05022026_02.jsx";
17
+ import { F05022026_03 } from "../Frames/F05022026_03.jsx";
18
+ import { F05022026_04 } from "../Frames/F05022026_04.jsx";
19
+ import { CornerFlipTransition } from "../Elements/CornerFlipTransition05022026.jsx";
20
+
21
+ export const T05022026_01 = ({
22
+ event,
23
+ formData,
24
+ eventDateTime,
25
+ occasionDate,
26
+ venue,
27
+ welcomeMessage,
28
+ invitationMessage,
29
+ familyMember,
30
+ }) => {
31
+ const frame = useCurrentFrame();
32
+ const { fps, durationInFrames } = useVideoConfig();
33
+
34
+ /* ---------------- MUSIC FADE ---------------- */
35
+ const fadeDuration = 2 * fps;
36
+ const fadeOutStart = durationInFrames - fadeDuration;
37
+ const musicVolume = interpolate(
38
+ frame,
39
+ [0, fadeOutStart, durationInFrames],
40
+ [0.4, 0.4, 0],
41
+ {
42
+ easing: Easing.inOut(Easing.ease),
43
+ extrapolateLeft: "clamp",
44
+ extrapolateRight: "clamp",
45
+ }
46
+ );
47
+
48
+ const flipDuration = 1 * fps;
49
+
50
+ const firstSceneDuration = 7 * fps;
51
+ const secondSceneDuration = 7 * fps;
52
+ const thirdSceneDuration = 7 * fps;
53
+ const fourSceneDuration = 9 * fps;
54
+
55
+ const s1 = 0;
56
+ const f1 = s1 + firstSceneDuration;
57
+
58
+ const s2 = f1 + flipDuration;
59
+ const f2 = s2 + secondSceneDuration;
60
+
61
+ const s3 = f2 + flipDuration;
62
+ const f3 = s3 + thirdSceneDuration;
63
+
64
+ const s4 = f3 + flipDuration;
65
+
66
+ /* ---------------- SAFE DATA ---------------- */
67
+ const whoIsCreating =
68
+ event?.eventData?.occasion_data?.who_is_creating ??
69
+ event?.occasion_data?.who_is_creating ??
70
+ event?.who_is_creating;
71
+
72
+ const isBrideCreating =
73
+ whoIsCreating === "Bride" || !whoIsCreating;
74
+
75
+ const brideName =
76
+ event?.eventData?.occasion_data?.bride_name ??
77
+ event?.occasion_data?.bride_name ??
78
+ formData?.bride_name ??
79
+ "";
80
+
81
+ const groomName =
82
+ event?.eventData?.occasion_data?.groom_name ??
83
+ event?.occasion_data?.groom_name ??
84
+ formData?.groom_name ??
85
+ "";
86
+
87
+ const bridePhoto =
88
+ event?.eventData?.occasion_data?.bride_photo?.url ??
89
+ event?.occasion_data?.bride_photo?.url ??
90
+ formData?.bride_photo ??
91
+ "";
92
+
93
+ const groomPhoto =
94
+ event?.eventData?.occasion_data?.groom_photo?.url ??
95
+ event?.occasion_data?.groom_photo?.url ??
96
+ formData?.groom_photo ??
97
+ "";
98
+
99
+ const firstName = isBrideCreating ? brideName : groomName;
100
+ const secondName = isBrideCreating ? groomName : brideName;
101
+
102
+ const firstPhoto = isBrideCreating ? bridePhoto : groomPhoto;
103
+ const secondPhoto = isBrideCreating ? groomPhoto : bridePhoto;
104
+
105
+
106
+ const firstSideNote = isBrideCreating
107
+ ? formData?.bride_side_note || ""
108
+ : formData?.groom_side_note || "";
109
+
110
+ const secondSideNote = isBrideCreating
111
+ ? formData?.groom_side_note || ""
112
+ : formData?.bride_side_note || "";
113
+
114
+ const venueName =
115
+ venue?.name || formData?.venue_name || "";
116
+
117
+ const venueAddress =
118
+ venue?.address || formData?.venue_address || "";
119
+
120
+ /* ---------------- PRELOAD IMAGES ---------------- */
121
+
122
+ const imagesToPreload = useMemo(
123
+ () => [
124
+ staticFile("video-images/05022026-bg.webp"),
125
+ staticFile("video-images/05022026-bg-2.webp"),
126
+ staticFile("video-images/05022026-bg-3.webp"),
127
+ staticFile("video-images/05022026-bg-4.webp"),
128
+ staticFile("video-images/05022026-Duck.webp"),
129
+ staticFile("video-images/05022026-HangingLamps.webp"),
130
+ staticFile("video-images/05022026-Ganesh.webp"),
131
+ staticFile("video-images/05022026-Flower.webp"),
132
+ staticFile("video-images/20012026-couple-walk.webp"),
133
+ staticFile("video-images/05022026-HangingJumar.webp"),
134
+ staticFile("video-images/05022026-Nameplate.webp"),
135
+ staticFile("video-images/05022026-LeftPeacock.webp"),
136
+ ],
137
+ []
138
+ );
139
+
140
+ usePreloadImages(imagesToPreload);
141
+
142
+ const Page = ({ bg, children }) => (
143
+ <AbsoluteFill>
144
+ <Img
145
+ src={bg}
146
+ style={{
147
+ position: "absolute",
148
+ inset: 0,
149
+ width: "100%",
150
+ height: "100%",
151
+ objectFit: "cover",
152
+ }}
153
+ />
154
+ {children}
155
+ </AbsoluteFill>
156
+ );
157
+
158
+ const backgrounds = useMemo(
159
+ () => [
160
+ staticFile("video-images/05022026-bg.webp"),
161
+ staticFile("video-images/05022026-bg-2.webp"),
162
+ staticFile("video-images/05022026-bg-3.webp"),
163
+ staticFile("video-images/05022026-bg-4.webp"),
164
+ ],
165
+ []
166
+ );
167
+
168
+ return (
169
+ <AbsoluteFill>
170
+ <Audio
171
+ src={staticFile("video-images/wedding2.mp3")} volume={musicVolume}
172
+ />
173
+
174
+ {/* SCENE 1 */}
175
+ <Sequence from={s1} durationInFrames={firstSceneDuration}>
176
+ <Page bg={backgrounds[0]}>
177
+ <F05022026_01 />
178
+ </Page>
179
+ </Sequence>
180
+
181
+ {/* SCENE 2 */}
182
+ <Sequence from={f1 - flipDuration} durationInFrames={flipDuration + secondSceneDuration}>
183
+
184
+ {/* OLD scene stays underneath */}
185
+ <Page bg={backgrounds[0]}>
186
+ <F05022026_01 />
187
+ </Page>
188
+
189
+ {/* NEW scene flips in */}
190
+ <CornerFlipTransition duration={flipDuration}>
191
+ <Page bg={backgrounds[1]}>
192
+ <F05022026_02
193
+ firstName={firstName}
194
+ firstSideNote={firstSideNote}
195
+ secondName={secondName}
196
+ secondSideNote={secondSideNote}
197
+ invitationMessage={invitationMessage}
198
+ occasionDate={occasionDate}
199
+ />
200
+ </Page>
201
+ </CornerFlipTransition>
202
+
203
+ </Sequence>
204
+
205
+ {/* SCENE 3 */}
206
+ <Sequence from={f2 - flipDuration} durationInFrames={flipDuration + thirdSceneDuration}>
207
+
208
+ {/* OLD scene stays visible underneath */}
209
+ <Page bg={backgrounds[1]}>
210
+ <F05022026_02
211
+ firstName={firstName}
212
+ firstSideNote={firstSideNote}
213
+ secondName={secondName}
214
+ secondSideNote={secondSideNote}
215
+ invitationMessage={invitationMessage}
216
+ occasionDate={occasionDate}
217
+ />
218
+ </Page>
219
+
220
+ {/* NEW scene flips in smoothly */}
221
+ <CornerFlipTransition duration={flipDuration}>
222
+ <Page bg={backgrounds[2]}>
223
+ <F05022026_03
224
+ eventDateTime={eventDateTime}
225
+ venueName={venueName}
226
+ venueAddress={venueAddress}
227
+ />
228
+ </Page>
229
+ </CornerFlipTransition>
230
+
231
+ </Sequence>
232
+
233
+ {/* SCENE 4 */}
234
+ <Sequence from={f3 - flipDuration} durationInFrames={flipDuration + fourSceneDuration}>
235
+
236
+ {/* OLD Scene (Scene-3) stays underneath */}
237
+ <Page bg={backgrounds[2]}>
238
+ <F05022026_03
239
+ eventDateTime={eventDateTime}
240
+ venueName={venueName}
241
+ venueAddress={venueAddress}
242
+ />
243
+ </Page>
244
+
245
+ {/* NEW Scene flips in */}
246
+ <CornerFlipTransition duration={flipDuration}>
247
+ <Page bg={backgrounds[3]}>
248
+ <F05022026_04 familyMember={familyMember} />
249
+ </Page>
250
+ </CornerFlipTransition>
251
+
252
+ </Sequence>
253
+
254
+ </AbsoluteFill>
255
+
256
+ );
257
+ };
258
+
259
+ T05022026_01.duration = 30 * 30;
@@ -7,6 +7,8 @@ import {
7
7
  AbsoluteFill,
8
8
  useCurrentFrame,
9
9
  Img,
10
+ interpolate,
11
+ Easing,
10
12
  } from "remotion";
11
13
 
12
14
  import { F20012026_01 } from "../Frames/F20012026_01.jsx";
@@ -25,12 +27,27 @@ export const T20012026_01 = ({
25
27
  invitationMessage,
26
28
  familyMember,
27
29
  }) => {
28
- const { durationInFrames } = useVideoConfig();
30
+ const { fps, durationInFrames } = useVideoConfig();
29
31
  const frame = useCurrentFrame();
30
32
 
33
+ /* ---------------- MUSIC FADE ---------------- */
34
+ const fadeDuration = 2 * fps;
35
+ const fadeOutStart = durationInFrames - fadeDuration;
36
+ const musicVolume = interpolate(
37
+ frame,
38
+ [0, fadeOutStart, durationInFrames],
39
+ [0.4, 0.4, 0],
40
+ {
41
+ easing: Easing.inOut(Easing.ease),
42
+ extrapolateLeft: "clamp",
43
+ extrapolateRight: "clamp",
44
+ }
45
+ );
46
+
31
47
  /* ---------------- SAFE DATA ---------------- */
32
48
 
33
49
  const whoIsCreating =
50
+ event?.eventData?.occasion_data?.who_is_creating ??
34
51
  event?.occasion_data?.who_is_creating ??
35
52
  event?.who_is_creating;
36
53
 
@@ -38,20 +55,35 @@ export const T20012026_01 = ({
38
55
  whoIsCreating === "Bride" || !whoIsCreating;
39
56
 
40
57
  const brideName =
58
+ event?.eventData?.occasion_data?.bride_name ??
41
59
  event?.occasion_data?.bride_name ??
42
- event?.bride_name ??
43
60
  formData?.bride_name ??
44
61
  "";
45
62
 
46
63
  const groomName =
64
+ event?.eventData?.occasion_data?.groom_name ??
47
65
  event?.occasion_data?.groom_name ??
48
- event?.groom_name ??
49
66
  formData?.groom_name ??
50
67
  "";
51
68
 
69
+ const bridePhoto =
70
+ event?.eventData?.occasion_data?.bride_photo?.url ??
71
+ event?.occasion_data?.bride_photo?.url ??
72
+ formData?.bride_photo ??
73
+ "";
74
+
75
+ const groomPhoto =
76
+ event?.eventData?.occasion_data?.groom_photo?.url ??
77
+ event?.occasion_data?.groom_photo?.url ??
78
+ formData?.groom_photo ??
79
+ "";
80
+
52
81
  const firstName = isBrideCreating ? brideName : groomName;
53
82
  const secondName = isBrideCreating ? groomName : brideName;
54
83
 
84
+ const firstPhoto = isBrideCreating ? bridePhoto : groomPhoto;
85
+ const secondPhoto = isBrideCreating ? groomPhoto : bridePhoto;
86
+
55
87
  const firstSideNote = isBrideCreating
56
88
  ? formData?.bride_side_note || ""
57
89
  : formData?.groom_side_note || "";
@@ -75,26 +107,47 @@ export const T20012026_01 = ({
75
107
 
76
108
  const imagesToPreload = useMemo(
77
109
  () => [
78
- staticFile("video-images/20012026-bg.png"),
79
- staticFile("video-images/20012026-bride.png"),
80
- staticFile("video-images/20012026-butterfly.png"),
81
- staticFile("video-images/20012026-couple-walk.png"),
82
- staticFile("video-images/20012026-curtain-floral.png"),
83
- staticFile("video-images/20012026-floral-left.png"),
84
- staticFile("video-images/20012026-floral-right.png"),
85
- staticFile("video-images/20012026-groom.png"),
86
- staticFile("video-images/20012026-opening-gate.png"),
87
- staticFile("video-images/20012026-peacock.png"),
88
- staticFile("video-images/20012026-tree-left.png"),
89
- staticFile("video-images/20012026-tree-right.png"),
90
- staticFile("video-images/20012026-wedding-gate.png"),
110
+ staticFile("video-images/20012026-bg.webp"),
111
+ staticFile("video-images/20012026-bride.webp"),
112
+ staticFile("video-images/20012026-butterfly.webp"),
113
+ staticFile("video-images/20012026-couple-walk.webp"),
114
+ staticFile("video-images/20012026-curtain-floral.webp"),
115
+ staticFile("video-images/20012026-floral-left.webp"),
116
+ staticFile("video-images/20012026-floral-right.webp"),
117
+ staticFile("video-images/20012026-groom.webp"),
118
+ staticFile("video-images/20012026-opening-gate.webp"),
119
+ staticFile("video-images/20012026-peacock.webp"),
120
+ staticFile("video-images/20012026-tree-left.webp"),
121
+ staticFile("video-images/20012026-tree-right.webp"),
122
+ staticFile("video-images/20012026-wedding-gate.webp"),
91
123
  ],
92
124
  []
93
125
  );
94
126
 
95
127
  usePreloadImages(imagesToPreload);
96
128
 
97
- /* ---------------- RENDER ---------------- */
129
+ const Page = ({ bg, children }) => (
130
+ <AbsoluteFill>
131
+ <Img
132
+ src={bg}
133
+ style={{
134
+ position: "absolute",
135
+ inset: 0,
136
+ width: "100%",
137
+ height: "100%",
138
+ objectFit: "cover",
139
+ }}
140
+ />
141
+ {children}
142
+ </AbsoluteFill>
143
+ );
144
+
145
+ const backgrounds = useMemo(
146
+ () => [
147
+ staticFile("video-images/20012026-bg.webp"),
148
+ ],
149
+ []
150
+ );
98
151
 
99
152
  return (
100
153
  <AbsoluteFill>
@@ -102,9 +155,7 @@ export const T20012026_01 = ({
102
155
  {/* 🎵 MUSIC */}
103
156
  <Audio
104
157
  src={staticFile("video-images/wedding.mp3")}
105
- startFrom={0}
106
- endAt={durationInFrames}
107
- volume={0.4}
158
+ volume={musicVolume}
108
159
  />
109
160
 
110
161
 
@@ -176,4 +227,6 @@ export const T20012026_01 = ({
176
227
 
177
228
  </AbsoluteFill>
178
229
  );
179
- };
230
+ };
231
+
232
+ T20012026_01.duration = 30 * 30;