@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,387 @@
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
+ import { HangingLamp05022026 } from "../Elements/HangingLamp05022026";
12
+ import { DucksFrame05022026 } from "../Elements/DucksFrame05022026";
13
+ import { WordReveal28012026 } from "../Elements/WordReveal28012026";
14
+
15
+ export const F05022026_02 = ({
16
+ firstName,
17
+ firstSideNote,
18
+ secondName,
19
+ secondSideNote,
20
+ invitationMessage,
21
+ occasionDate
22
+
23
+ }) => {
24
+ const frame = useCurrentFrame();
25
+ const { fps } = useVideoConfig();
26
+ const opacity = interpolate(frame, [0, 25], [0, 1], {
27
+ extrapolateRight: "clamp",
28
+ });
29
+
30
+ const translateY = interpolate(frame, [0, 25], [-40, 0], {
31
+ extrapolateRight: "clamp",
32
+ easing: Easing.out(Easing.ease),
33
+ });
34
+
35
+ // timing (30fps based)
36
+ const dividerStart = fps * 1.2;
37
+ const firstTextStart = fps * 1.5;
38
+ const divider2Start = fps * 2;
39
+ const secondTextStart = fps * 2.5;
40
+
41
+ const formatDate = (date) => {
42
+ if (!date) return { datemonth: "", year: "" };
43
+
44
+ let d;
45
+
46
+ // Handle DD-MM-YYYY
47
+ if (typeof date === "string" && date.includes("-")) {
48
+ const parts = date.split("-");
49
+ if (parts[0].length === 2) {
50
+ d = new Date(`${parts[2]}-${parts[1]}-${parts[0]}`);
51
+ } else {
52
+ d = new Date(date);
53
+ }
54
+ } else {
55
+ d = new Date(date);
56
+ }
57
+
58
+ if (isNaN(d.getTime())) return { datemonth: "", year: "" };
59
+ const dayMonth = d.toLocaleDateString("en-IN", {
60
+ day: "numeric",
61
+ month: "long",
62
+ });
63
+ const year = d.getFullYear();
64
+
65
+ // return d.toLocaleDateString("en-IN", {
66
+ // day: "numeric",
67
+ // month: "long",
68
+ // year: "numeric",
69
+ // });
70
+ return {
71
+ datemonth: dayMonth,
72
+ year: year.toString(),
73
+ };
74
+ };
75
+
76
+ const dateParts = formatDate(occasionDate);
77
+
78
+ // DIVIDER
79
+ const dividerX = interpolate(
80
+ frame,
81
+ [dividerStart, dividerStart + 20],
82
+ [-30, 0],
83
+ {
84
+ extrapolateRight: "clamp",
85
+ easing: Easing.out(Easing.ease),
86
+ }
87
+ );
88
+ const dividerOpacity = interpolate(
89
+ frame,
90
+ [dividerStart, dividerStart + 10],
91
+ [0, 1],
92
+ { extrapolateRight: "clamp" }
93
+ );
94
+
95
+ // FIRST TEXT
96
+ const firstTextX = interpolate(
97
+ frame,
98
+ [firstTextStart, firstTextStart + 20],
99
+ [-60, 0],
100
+ {
101
+ extrapolateRight: "clamp",
102
+ easing: Easing.out(Easing.ease),
103
+ }
104
+ );
105
+
106
+ const firstTextOpacity = interpolate(
107
+ frame,
108
+ [firstTextStart, firstTextStart + 10],
109
+ [0, 1],
110
+ { extrapolateRight: "clamp" }
111
+ );
112
+
113
+ // DIVIDER
114
+ const divider2X = interpolate(
115
+ frame,
116
+ [divider2Start, divider2Start + 20],
117
+ [-30, 0],
118
+ {
119
+ extrapolateRight: "clamp",
120
+ easing: Easing.out(Easing.ease),
121
+ }
122
+ );
123
+ const divider2Opacity = interpolate(
124
+ frame,
125
+ [divider2Start, divider2Start + 10],
126
+ [0, 1],
127
+ { extrapolateRight: "clamp" }
128
+ );
129
+
130
+ // SECOND TEXT
131
+ const secondTextX = interpolate(
132
+ frame,
133
+ [secondTextStart, secondTextStart + 20],
134
+ [60, 0], // 👉 from RIGHT to center
135
+ {
136
+ extrapolateRight: "clamp",
137
+ easing: Easing.out(Easing.ease),
138
+ }
139
+ );
140
+
141
+ const secondTextOpacity = interpolate(
142
+ frame,
143
+ [secondTextStart, secondTextStart + 10],
144
+ [0, 1],
145
+ { extrapolateRight: "clamp" }
146
+ );
147
+
148
+ const totalFrames = fps * 7;
149
+
150
+ const exitStart = totalFrames - fps * 1;
151
+
152
+ const exitOpacity = interpolate(
153
+ frame,
154
+ [exitStart, totalFrames],
155
+ [1, 0],
156
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
157
+ );
158
+ const exitTopY = interpolate(
159
+ frame,
160
+ [exitStart, totalFrames],
161
+ [0, -35],
162
+ {
163
+ extrapolateLeft: "clamp",
164
+ extrapolateRight: "clamp",
165
+ easing: Easing.bezier(0.22, 1, 0.36, 1),
166
+ }
167
+ );
168
+ const exitLeftX = interpolate(
169
+ frame,
170
+ [exitStart, totalFrames],
171
+ [0, -60],
172
+ {
173
+ extrapolateLeft: "clamp",
174
+ extrapolateRight: "clamp",
175
+ easing: Easing.in(Easing.ease),
176
+ }
177
+ );
178
+ const exitRightX = interpolate(
179
+ frame,
180
+ [exitStart, totalFrames],
181
+ [0, 60],
182
+ {
183
+ extrapolateLeft: "clamp",
184
+ extrapolateRight: "clamp",
185
+ easing: Easing.in(Easing.ease),
186
+ }
187
+ );
188
+
189
+ return (
190
+ <AbsoluteFill
191
+ style={{
192
+ overflow: "hidden",
193
+ }}
194
+ >
195
+ {/* LEFT CORNER LAMP */}
196
+ <HangingLamp05022026 side="left" offset={-200} />
197
+ <HangingLamp05022026 side="left" offset={-100} />
198
+ {/* Right CORNER LAMP */}
199
+ <HangingLamp05022026 side="right" offset={-200} />
200
+ <HangingLamp05022026 side="right" offset={-100} />
201
+
202
+ <DucksFrame05022026 />
203
+ <div
204
+ style={{
205
+ display: "flex",
206
+ flexDirection: "column",
207
+ alignItems: "center",
208
+ gap: 10,
209
+ justifyContent: "flex-start",
210
+ paddingTop: "18%",
211
+ alignItems: "center",
212
+ }}
213
+ >
214
+
215
+ {/* INVITATION */}
216
+ <h1
217
+ style={{
218
+ maxWidth: "60%",
219
+ textAlign: "center",
220
+ opacity: opacity * exitOpacity,
221
+ transform: `translateY(${translateY + exitTopY}px)`,
222
+ }}
223
+ >
224
+ <WordReveal28012026
225
+ text={invitationMessage}
226
+ start={20}
227
+ fontSize={50}
228
+ color="#2F6B4F"
229
+ fontFamily="Dancing Script"
230
+ letterSpacing="3px"
231
+ lineHeight="1.2"
232
+ fontWeight="800"
233
+ />
234
+ </h1>
235
+ <div
236
+ style={{
237
+ color: "#D4AF37",
238
+ fontSize: 40,
239
+ textAlign: "center",
240
+ opacity: dividerOpacity * exitOpacity,
241
+ transform: `translateY(${dividerX + exitTopY}px)`,
242
+ }}>
243
+ ༺━━✦━━༻
244
+ </div>
245
+
246
+ {/* FIRST PERSON */}
247
+ <div
248
+ style={{
249
+ display: "flex",
250
+ flexDirection: "column",
251
+ textAlign: "center",
252
+ transform: `translateX(${firstTextX + exitLeftX}px)`,
253
+ opacity: firstTextOpacity * exitOpacity,
254
+ marginTop: "2%",
255
+ gap: "10px"
256
+ }}
257
+ >
258
+ <h1
259
+ style={{
260
+ fontFamily: "Dancing Script",
261
+ color: "#1F5E3B",
262
+ fontSize: 60,
263
+ fontWeight: 600,
264
+ maxWidth: "70%",
265
+ margin: "0 auto",
266
+ textAlign: "center",
267
+ wordWrap: "break-word",
268
+ lineHeight: "1.2",
269
+ letterSpacing: "2px"
270
+ }}>
271
+ {firstName}
272
+ </h1>
273
+
274
+ <div
275
+ style={{
276
+ fontFamily: "Playfair Display",
277
+ color: "#3B4A2F",
278
+ fontSize: 32,
279
+ maxWidth: "60%",
280
+ fontWeight: 600,
281
+ margin: "0 auto",
282
+ textAlign: "center",
283
+ wordWrap: "break-word",
284
+ lineHeight: "1.3",
285
+ letterSpacing: "2px"
286
+ }}>
287
+ {firstSideNote}
288
+ </div>
289
+ </div>
290
+
291
+ <div
292
+ style={{
293
+ fontSize: 40,
294
+ textAlign: "center",
295
+ marginTop: "10px",
296
+ transform: `translateX(${divider2X + exitTopY}px)`,
297
+ opacity: divider2Opacity * exitOpacity,
298
+ }} >
299
+ 🌿🌿🌿🌿
300
+ </div>
301
+
302
+ {/* SECOND PERSON */}
303
+ <div
304
+ style={{
305
+ display: "flex",
306
+ flexDirection: "column",
307
+ gap: "10px",
308
+ textAlign: "center",
309
+ transform: `translateX(${secondTextX + exitRightX}px)`,
310
+ opacity: secondTextOpacity * exitOpacity,
311
+ }}
312
+ >
313
+ <h1
314
+ style={{
315
+ fontFamily: "Dancing Script",
316
+ color: "#1F5E3B",
317
+ fontSize: 60,
318
+ fontWeight: 600,
319
+ maxWidth: "70%",
320
+ margin: "0 auto",
321
+ textAlign: "center",
322
+ wordWrap: "break-word",
323
+ lineHeight: "1.2",
324
+ letterSpacing: "2px"
325
+ }}>
326
+ {secondName}
327
+ </h1>
328
+
329
+
330
+
331
+ <div
332
+ style={{
333
+ fontFamily: "Playfair Display",
334
+ fontSize: 32,
335
+ color: "#3B4A2F",
336
+ maxWidth: "60%",
337
+ fontWeight: 600,
338
+ margin: "0 auto",
339
+ textAlign: "center",
340
+ wordWrap: "break-word",
341
+ lineHeight: "1.3",
342
+ letterSpacing: "2px"
343
+ }}>
344
+ {secondSideNote}
345
+ </div>
346
+ </div>
347
+
348
+ </div>
349
+ {/* OCCASION DATE – BOTTOM LEFT */}
350
+ <div
351
+ style={{
352
+ position: "absolute",
353
+ bottom: 50,
354
+ left: "13%",
355
+ lineHeight: 1.2,
356
+ whiteSpace: "nowrap",
357
+ // opacity: exitOpacity,
358
+ // transform: `translateY(${exitTopY}px)`,
359
+ }}
360
+ >
361
+ <WordReveal28012026
362
+ text={dateParts.datemonth}
363
+ start={50}
364
+ fontSize={55}
365
+ color="#C9A24D"
366
+ fontFamily="Playfair Display"
367
+ letterSpacing="2px"
368
+ lineHeight="1.2"
369
+ fontWeight="600"
370
+ />
371
+ <WordReveal28012026
372
+ text={dateParts.year}
373
+ start={70}
374
+ fontSize={50}
375
+ color="#C9A24D"
376
+ fontFamily="Playfair Display"
377
+ letterSpacing="4px"
378
+ lineHeight="1"
379
+ fontWeight="600"
380
+ />
381
+ </div>
382
+
383
+ </AbsoluteFill>
384
+ );
385
+
386
+
387
+ };
@@ -0,0 +1,328 @@
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
+ import { HangingJumar05022026 } from "../Elements/HangingJumar05022026";
12
+ import { FloatingFlowersBottom } from "../Elements/FloatingFlowersBottom";
13
+
14
+ export const F05022026_03 = ({
15
+ eventDateTime, venueName, venueAddress
16
+ }) => {
17
+ const frame = useCurrentFrame();
18
+ const { fps } = useVideoConfig();
19
+
20
+ const getDateParts = (iso) => {
21
+ if (!iso) return { day: "", month: "", year: "", time: "" };
22
+
23
+ const d = new Date(iso);
24
+
25
+ return {
26
+ day: d.getDate(),
27
+ month: d.toLocaleString("en-US", { month: "long" }),
28
+ year: d.getFullYear(),
29
+ time: d.toLocaleTimeString("en-US", {
30
+ hour: "2-digit",
31
+ minute: "2-digit",
32
+ hour12: true,
33
+ }),
34
+ };
35
+ };
36
+
37
+ const { day, month, year, time } = getDateParts(eventDateTime);
38
+
39
+ const wedStart = fps * 1;
40
+ const dateStart = fps * 1.5;
41
+ const venueStart = fps * 2;
42
+ const addressStart = fps * 2.5;
43
+
44
+ const wedX = interpolate(
45
+ frame,
46
+ [wedStart, wedStart + fps * 2],
47
+ [-200, 0],
48
+ {
49
+ extrapolateRight: "clamp",
50
+ easing: Easing.out(Easing.cubic),
51
+ }
52
+ );
53
+
54
+ const wedOpacity = interpolate(
55
+ frame,
56
+ [wedStart, wedStart + 10],
57
+ [0, 1],
58
+ { extrapolateRight: "clamp" }
59
+ );
60
+
61
+ // FIRST TEXT
62
+ const venueX = interpolate(
63
+ frame,
64
+ [venueStart, venueStart + fps * 2],
65
+ [-200, 0],
66
+ {
67
+ extrapolateRight: "clamp",
68
+ easing: Easing.out(Easing.ease),
69
+ }
70
+ );
71
+
72
+ const venueOpacity = interpolate(
73
+ frame,
74
+ [venueStart, venueStart + 10],
75
+ [0, 1],
76
+ { extrapolateRight: "clamp" }
77
+ );
78
+
79
+ // SECOND PHOTO (from right)
80
+ const dateX = interpolate(
81
+ frame,
82
+ [dateStart, dateStart + fps * 2],
83
+ [200, 0],
84
+ {
85
+ extrapolateRight: "clamp",
86
+ easing: Easing.out(Easing.cubic),
87
+ }
88
+ );
89
+
90
+ const dateOpacity = interpolate(
91
+ frame,
92
+ [dateStart, dateStart + 10],
93
+ [0, 1],
94
+ { extrapolateRight: "clamp" }
95
+ );
96
+
97
+ // SECOND TEXT
98
+ const addressX = interpolate(
99
+ frame,
100
+ [addressStart, addressStart + 20],
101
+ [60, 0], // 👉 from RIGHT to center
102
+ {
103
+ extrapolateRight: "clamp",
104
+ easing: Easing.out(Easing.ease),
105
+ }
106
+ );
107
+
108
+ const addressOpacity = interpolate(
109
+ frame,
110
+ [addressStart, addressStart + 10],
111
+ [0, 1],
112
+ { extrapolateRight: "clamp" }
113
+ );
114
+
115
+ const totalFrames = fps * 7;
116
+
117
+ const exitStart = totalFrames - fps * 1;
118
+
119
+ const exitOpacity = interpolate(
120
+ frame,
121
+ [exitStart, totalFrames],
122
+ [1, 0],
123
+ { extrapolateLeft: "clamp", extrapolateRight: "clamp" }
124
+ );
125
+ const exitLeftX = interpolate(
126
+ frame,
127
+ [exitStart, totalFrames],
128
+ [0, -60],
129
+ {
130
+ extrapolateLeft: "clamp",
131
+ extrapolateRight: "clamp",
132
+ easing: Easing.in(Easing.ease),
133
+ }
134
+ );
135
+ const exitRightX = interpolate(
136
+ frame,
137
+ [exitStart, totalFrames],
138
+ [0, 60],
139
+ {
140
+ extrapolateLeft: "clamp",
141
+ extrapolateRight: "clamp",
142
+ easing: Easing.in(Easing.ease),
143
+ }
144
+ );
145
+
146
+ const coupleStart = fps * 1;
147
+ const coupleEnd = fps * 6;
148
+
149
+ const coupleScale = interpolate(
150
+ frame,
151
+ [coupleStart, coupleEnd],
152
+ [2, 1],
153
+ {
154
+ extrapolateLeft: "clamp",
155
+ extrapolateRight: "clamp",
156
+ easing: Easing.out(Easing.ease),
157
+ }
158
+ );
159
+
160
+ const coupleY = interpolate(
161
+ frame,
162
+ [coupleStart, coupleEnd],
163
+ [20, 0],
164
+ {
165
+ extrapolateLeft: "clamp",
166
+ extrapolateRight: "clamp",
167
+ }
168
+ );
169
+
170
+ const walkBob = Math.sin(frame / 6) * 2;
171
+
172
+ const coupleOpacity = interpolate(
173
+ frame,
174
+ [coupleStart, coupleStart + 10],
175
+ [0, 1],
176
+ { extrapolateRight: "clamp" }
177
+ );
178
+
179
+
180
+ return (
181
+ <AbsoluteFill
182
+ style={{
183
+ overflow: "hidden",
184
+ }}
185
+ >
186
+ <FloatingFlowersBottom/>
187
+
188
+ <Img
189
+ src={staticFile("video-images/20012026-couple-walk.webp")}
190
+ style={{
191
+ position: "absolute",
192
+ left: "50%",
193
+ bottom: "-2%",
194
+ width: "50%",
195
+ opacity: coupleOpacity,
196
+ transform: `
197
+ translateX(-50%)
198
+ translateY(${coupleY + walkBob}px)
199
+ scale(${coupleScale})
200
+ `,
201
+ }}
202
+ />
203
+
204
+ <HangingJumar05022026 side="left" offset={-40} />
205
+ <HangingJumar05022026 side="right" offset={-40} />
206
+
207
+ <div
208
+ style={{
209
+ display: "flex",
210
+ flexDirection: "column",
211
+ justifyContent: "flex-start",
212
+ alignItems: "center",
213
+ textAlign: "center",
214
+ paddingTop: "20%",
215
+ gap: 20,
216
+ }}>
217
+
218
+ {/* Wedding */}
219
+ <h1
220
+ style={{
221
+ color: "#A11C2F",
222
+ fontFamily: "Dancing Script",
223
+ letterSpacing: 2,
224
+ lineHeight: 1,
225
+ fontWeight: 600,
226
+ fontSize: 140,
227
+ margin: 0,
228
+ transform: `translateX(${wedX + exitLeftX}px)`,
229
+ opacity: wedOpacity * exitOpacity,
230
+ }}
231
+ >
232
+ Wedding
233
+ </h1>
234
+
235
+ {/* Date */}
236
+ <div
237
+ style={{
238
+ fontSize: 60,
239
+ color: "#4A2C1A",
240
+ letterSpacing: 3,
241
+ fontFamily: "Playfair Display",
242
+ transform: `translateX(${dateX + exitRightX}px)`,
243
+ opacity: dateOpacity * exitOpacity,
244
+ }}
245
+ >
246
+ {day}-{month}-{year},
247
+ </div>
248
+
249
+ {/* Time */}
250
+ <div
251
+ style={{
252
+ fontSize: 60,
253
+ color: "#B11226",
254
+ fontFamily: "Playfair Display",
255
+ transform: `translateX(${dateX + exitRightX}px)`,
256
+ opacity: dateOpacity * exitOpacity,
257
+ }}
258
+ >
259
+ At {time}
260
+ </div>
261
+ {/* Wedding */}
262
+ <h1
263
+ style={{
264
+ color: "#A11C2F",
265
+ fontFamily: "Dancing Script",
266
+ letterSpacing: 2,
267
+ lineHeight: 1,
268
+ fontWeight: 600,
269
+ fontSize: 140,
270
+ margin: 0,
271
+ transform: `translateX(${venueX + exitLeftX}px)`,
272
+ opacity: venueOpacity * exitOpacity,
273
+ }}
274
+ >
275
+ Venue:
276
+ </h1>
277
+
278
+ {/* Venue Name */}
279
+ <div
280
+ style={{
281
+ fontSize: 55,
282
+ color: "#4A2C1A",
283
+ fontFamily: "Playfair Display",
284
+ width: "80%",
285
+ maxWidth: "80%",
286
+ lineHeight: 1.2,
287
+ letterSpacing: 2,
288
+ textAlign: "center",
289
+ wordBreak: "break-word",
290
+ overflowWrap: "anywhere",
291
+ marginLeft: "auto",
292
+ marginRight: "auto",
293
+ transform: `translateX(${addressX + exitRightX}px)`,
294
+ opacity: addressOpacity * exitOpacity,
295
+ }}
296
+ >
297
+ {venueName}
298
+ </div>
299
+
300
+ {/* Venue Address */}
301
+ <div
302
+ style={{
303
+ fontSize: 50,
304
+ color: "#4A2C1A",
305
+ fontFamily: "Playfair Display",
306
+ width: "80%",
307
+ maxWidth: "70%",
308
+ lineHeight: 1.2,
309
+ letterSpacing: 2,
310
+ textAlign: "center",
311
+ wordBreak: "break-word",
312
+ overflowWrap: "anywhere",
313
+ marginLeft: "auto",
314
+ marginRight: "auto",
315
+ marginTop: "10px",
316
+ transform: `translateX(${addressX + exitRightX}px)`,
317
+ opacity: addressOpacity * exitOpacity,
318
+ }}
319
+ >
320
+ {venueAddress}
321
+ </div>
322
+
323
+
324
+ </div>
325
+
326
+ </AbsoluteFill>
327
+ );
328
+ };