@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,140 @@
1
+ import React from "react";
2
+ import {
3
+ AbsoluteFill,
4
+ Img,
5
+ useCurrentFrame,
6
+ useVideoConfig,
7
+ interpolate,
8
+ Easing,
9
+ staticFile,
10
+ } from "remotion";
11
+ import { WordReveal28012026 } from "../Elements/WordReveal28012026";
12
+ import { HangingLamp05022026 } from "../Elements/HangingLamp05022026";
13
+
14
+ export const F05022026_04 = ({
15
+ familyMember,
16
+ }) => {
17
+ const frame = useCurrentFrame();
18
+ const { fps, durationInFrames } = useVideoConfig();
19
+
20
+ const plateStart = fps * 3.5;
21
+
22
+ const plateX = interpolate(
23
+ frame,
24
+ [plateStart, plateStart + 40],
25
+ [900, 0], // comes from right
26
+ {
27
+ easing: Easing.out(Easing.cubic),
28
+ extrapolateLeft: "clamp",
29
+ extrapolateRight: "clamp",
30
+ }
31
+ );
32
+
33
+ const plateOpacity = interpolate(frame, [plateStart, plateStart + 30], [0, 1], {
34
+ extrapolateLeft: "clamp",
35
+ extrapolateRight: "clamp",
36
+ });
37
+
38
+ // Last 1 second family message exit
39
+ const textExitStart = durationInFrames - fps * 2;
40
+
41
+ // Fade out
42
+ const familyOpacity = interpolate(
43
+ frame,
44
+ [textExitStart, durationInFrames],
45
+ [1, 0],
46
+ {
47
+ extrapolateLeft: "clamp",
48
+ extrapolateRight: "clamp",
49
+ easing: Easing.out(Easing.cubic),
50
+ }
51
+ );
52
+
53
+ // Small upward move
54
+ const familyY = interpolate(
55
+ frame,
56
+ [textExitStart, durationInFrames],
57
+ [0, -40],
58
+ {
59
+ extrapolateLeft: "clamp",
60
+ extrapolateRight: "clamp",
61
+ easing: Easing.out(Easing.cubic),
62
+ }
63
+ );
64
+
65
+
66
+ // Peacock head shake (small rotation)
67
+ const headShake = Math.sin(frame / 10) * 3;
68
+
69
+ // Tiny breathing float
70
+ const peacockFloat = Math.sin(frame / 25) * 4;
71
+
72
+ return (
73
+ <AbsoluteFill style={{ overflow: "hidden" }}>
74
+ <HangingLamp05022026 side="left" offset={-50} />
75
+ <HangingLamp05022026 side="right" offset={-50} />
76
+ <HangingLamp05022026 side="left" offset={0} />
77
+ <HangingLamp05022026 side="right" offset={0} />
78
+
79
+ <Img
80
+ src={staticFile("video-images/05022026-Nameplate.webp")}
81
+ style={{
82
+ position: "absolute",
83
+ right: 60,
84
+ bottom: -450,
85
+ transform: `translateX(${plateX}px)`,
86
+ opacity: plateOpacity,
87
+ width: 800,
88
+ maxWidth: "90%",
89
+ }}
90
+ />
91
+
92
+ <Img
93
+ src={staticFile("video-images/05022026-LeftPeacock.webp")}
94
+ style={{
95
+ position: "absolute",
96
+ left: -100,
97
+ bottom: -120,
98
+ width: 600,
99
+ maxWidth: "90%",
100
+ transform: `
101
+ translateY(${peacockFloat}px)
102
+ rotate(${headShake}deg)
103
+ `,
104
+ transformOrigin: "70% 25%", // head/neck area
105
+ }}
106
+ />
107
+
108
+
109
+ <div
110
+ style={{
111
+ position: "absolute",
112
+ top: "30%",
113
+ left: "50%",
114
+ transform: `translateX(-50%) translateY(${familyY}px)`,
115
+ width: "100%",
116
+ textAlign: "center",
117
+ opacity: familyOpacity,
118
+ }}
119
+ >
120
+ <div
121
+ style={{
122
+ maxWidth: "60%",
123
+ margin: "0 auto",
124
+ }}
125
+ >
126
+ <WordReveal28012026
127
+ text={familyMember}
128
+ start={20}
129
+ fontSize={70}
130
+ color="#CDB89A"
131
+ fontFamily="Dancing Script"
132
+ letterSpacing="3px"
133
+ lineHeight="1.2"
134
+ fontWeight="600"
135
+ />
136
+ </div>
137
+ </div>
138
+ </AbsoluteFill>
139
+ );
140
+ };
@@ -1,12 +1,10 @@
1
1
  import React from "react";
2
2
  import {
3
3
  AbsoluteFill,
4
- Img,
5
4
  useCurrentFrame,
6
5
  useVideoConfig,
7
6
  interpolate,
8
7
  Easing,
9
- staticFile
10
8
  } from "remotion";
11
9
 
12
10
  import { Butterflies20012026 } from "../Elements/Butterflies20012026.jsx";
@@ -11,7 +11,7 @@ import {
11
11
 
12
12
  import { SideTrees20012026 } from "../Elements/SideTrees20012026.jsx";
13
13
  import { PeacockDance20012026 } from "../Elements/PeacockDance20012026.jsx";
14
- import { SmoothRevealFromTop } from "../Elements/SmoothRevealFromTop.jsx";
14
+ import { SmoothRevealFromTop20012026 } from "../Elements/SmoothRevealFromTop20012026.jsx";
15
15
 
16
16
  export const F20012026_02 = ({
17
17
  firstName,
@@ -103,7 +103,7 @@ export const F20012026_02 = ({
103
103
  color: "#4A3A2A",
104
104
  fontSize: 40,
105
105
  letterSpacing: 2,
106
- ...SmoothRevealFromTop({ frame, startFrame: DETAILS_START, delay: 0 }),
106
+ ...SmoothRevealFromTop20012026({ frame, startFrame: DETAILS_START, delay: 0 }),
107
107
  }}
108
108
  >
109
109
  {invitationMessage}
@@ -116,7 +116,7 @@ export const F20012026_02 = ({
116
116
  color: "#7A1E2E",
117
117
  fontSize: 60,
118
118
  letterSpacing: 3,
119
- ...SmoothRevealFromTop({ frame, startFrame: DETAILS_START, delay: 25 }),
119
+ ...SmoothRevealFromTop20012026({ frame, startFrame: DETAILS_START, delay: 25 }),
120
120
  }}
121
121
  >
122
122
  {firstName}
@@ -128,7 +128,7 @@ export const F20012026_02 = ({
128
128
  color: "#B87A6A",
129
129
  fontSize: 35,
130
130
  maxWidth:"70%",
131
- ...SmoothRevealFromTop({ frame, startFrame: DETAILS_START, delay: 50 }),
131
+ ...SmoothRevealFromTop20012026({ frame, startFrame: DETAILS_START, delay: 50 }),
132
132
  }}
133
133
  >
134
134
  {firstSideNote}
@@ -139,7 +139,7 @@ export const F20012026_02 = ({
139
139
  fontSize: 40,
140
140
  color: "#C9A24D",
141
141
  letterSpacing: 6,
142
- ...SmoothRevealFromTop({ frame, startFrame: DETAILS_START, delay: 70 }),
142
+ ...SmoothRevealFromTop20012026({ frame, startFrame: DETAILS_START, delay: 70 }),
143
143
  }}
144
144
  >
145
145
  ❁ ❁ ❁
@@ -152,7 +152,7 @@ export const F20012026_02 = ({
152
152
  color: "#7A1E2E",
153
153
  fontSize: 60,
154
154
  letterSpacing: 3,
155
- ...SmoothRevealFromTop({ frame, startFrame: DETAILS_START, delay: 95 }),
155
+ ...SmoothRevealFromTop20012026({ frame, startFrame: DETAILS_START, delay: 95 }),
156
156
  }}
157
157
  >
158
158
  {secondName}
@@ -164,7 +164,7 @@ export const F20012026_02 = ({
164
164
  color: "#B87A6A",
165
165
  fontSize: 35,
166
166
  maxWidth:"70%",
167
- ...SmoothRevealFromTop({ frame, startFrame: DETAILS_START, delay: 120 }),
167
+ ...SmoothRevealFromTop20012026({ frame, startFrame: DETAILS_START, delay: 120 }),
168
168
  }}
169
169
  >
170
170
  {secondSideNote}
@@ -173,7 +173,7 @@ export const F20012026_02 = ({
173
173
  <div
174
174
  style={{
175
175
  textAlign: "center",
176
- ...SmoothRevealFromTop({ frame, startFrame: DETAILS_START, delay: 145 }),
176
+ ...SmoothRevealFromTop20012026({ frame, startFrame: DETAILS_START, delay: 145 }),
177
177
  }}
178
178
  >
179
179
  <div
@@ -10,7 +10,7 @@ import {
10
10
  } from "remotion";
11
11
 
12
12
  import { GroomBrideLoveScene20012026 } from "../Elements/GroomBrideLoveScene20012026.jsx";
13
- import { SmoothRevealFromTop } from "../Elements/SmoothRevealFromTop.jsx"
13
+ import { SmoothRevealFromTop20012026 } from "../Elements/SmoothRevealFromTop20012026.jsx"
14
14
 
15
15
  export const F20012026_03 = ({
16
16
  eventDateTime,
@@ -130,7 +130,7 @@ export const F20012026_03 = ({
130
130
  whiteSpace: "normal",
131
131
  wordBreak: "break-word",
132
132
  overflowWrap: "break-word",
133
- ...SmoothRevealFromTop({
133
+ ...SmoothRevealFromTop20012026({
134
134
  frame,
135
135
  startFrame: DETAILS_START,
136
136
  delay: 0,
@@ -152,7 +152,7 @@ export const F20012026_03 = ({
152
152
  whiteSpace: "normal",
153
153
  wordBreak: "break-word",
154
154
  overflowWrap: "break-word",
155
- ...SmoothRevealFromTop({
155
+ ...SmoothRevealFromTop20012026({
156
156
  frame,
157
157
  startFrame: DETAILS_START,
158
158
  delay: 25,
@@ -173,7 +173,7 @@ export const F20012026_03 = ({
173
173
  whiteSpace: "normal",
174
174
  wordBreak: "break-word",
175
175
  overflowWrap: "break-word",
176
- ...SmoothRevealFromTop({
176
+ ...SmoothRevealFromTop20012026({
177
177
  frame,
178
178
  startFrame: DETAILS_START,
179
179
  delay: 50,
@@ -197,7 +197,7 @@ export const F20012026_03 = ({
197
197
  whiteSpace: "normal",
198
198
  wordBreak: "break-word",
199
199
  overflowWrap: "break-word",
200
- ...SmoothRevealFromTop({
200
+ ...SmoothRevealFromTop20012026({
201
201
  frame,
202
202
  startFrame: DETAILS_START,
203
203
  delay: 70,
@@ -220,7 +220,7 @@ export const F20012026_03 = ({
220
220
  whiteSpace: "normal",
221
221
  wordBreak: "break-word",
222
222
  overflowWrap: "break-word",
223
- ...SmoothRevealFromTop({
223
+ ...SmoothRevealFromTop20012026({
224
224
  frame,
225
225
  startFrame: DETAILS_START,
226
226
  delay: 95,
@@ -241,7 +241,7 @@ export const F20012026_03 = ({
241
241
  whiteSpace: "normal",
242
242
  wordBreak: "break-word",
243
243
  overflowWrap: "break-word",
244
- ...SmoothRevealFromTop({
244
+ ...SmoothRevealFromTop20012026({
245
245
  frame,
246
246
  startFrame: DETAILS_START,
247
247
  delay: 115,
@@ -265,7 +265,7 @@ export const F20012026_03 = ({
265
265
  whiteSpace: "normal",
266
266
  wordBreak: "break-word",
267
267
  overflowWrap: "break-word",
268
- ...SmoothRevealFromTop({
268
+ ...SmoothRevealFromTop20012026({
269
269
  frame,
270
270
  startFrame: DETAILS_START,
271
271
  delay: 125,
@@ -0,0 +1,51 @@
1
+ import React from "react";
2
+ import {
3
+ AbsoluteFill,
4
+ } from "remotion";
5
+ import { FlowerReveal_TR_BL_28012026 } from "../Elements/FlowerReveal_TR_BL_28012026";
6
+ import { GaneshBorder28012026 } from "../Elements/GaneshBorder28012026";
7
+ import { BlowingLeaves28012026 } from "../Elements/BlowingLeaves28012026";
8
+ import { WordReveal28012026 } from "../Elements/WordReveal28012026";
9
+
10
+ export const F28012026_01 = ({
11
+ welcomeMessage,
12
+ }) => {
13
+ return (
14
+ <AbsoluteFill style={{ overflow: "hidden" }}>
15
+ <FlowerReveal_TR_BL_28012026 />
16
+ <GaneshBorder28012026 />
17
+ <BlowingLeaves28012026 startAfter={2} />
18
+
19
+ <div
20
+ style={{
21
+ position: "absolute",
22
+ bottom: "2%",
23
+ right: "6%",
24
+ maxWidth: "50%",
25
+ textAlign: "right",
26
+ }}
27
+ >
28
+ <h1
29
+ style={{
30
+ fontFamily: "Dancing Script",
31
+ letterSpacing: 3,
32
+ lineHeight: 1.3,
33
+ fontWeight: 600,
34
+ margin: 0,
35
+ whiteSpace: "normal",
36
+ wordBreak: "break-word",
37
+ }}
38
+ >
39
+ <WordReveal28012026
40
+ text={welcomeMessage}
41
+ start={50}
42
+ fontSize={70}
43
+ color="#D4A24C"
44
+ />
45
+ </h1>
46
+ </div>
47
+
48
+
49
+ </AbsoluteFill>
50
+ );
51
+ };
@@ -0,0 +1,246 @@
1
+ import React from "react";
2
+ import {
3
+ AbsoluteFill,
4
+ Img,
5
+ useCurrentFrame,
6
+ useVideoConfig,
7
+ interpolate,
8
+ Easing,
9
+ staticFile,
10
+ } from "remotion";
11
+ import { FlowerReveal_TL_BR_28012026 } from "../Elements/FlowerReveal_TL_BR_28012026";
12
+ import { HeartDraw28012026 } from "../Elements/HeartDraw28012026";
13
+ import { WordReveal28012026 } from "../Elements/WordReveal28012026";
14
+
15
+ export const F28012026_02 = ({
16
+ firstName, secondName, invitationMessage, occasionDate
17
+ }) => {
18
+ const frame = useCurrentFrame();
19
+
20
+ const firstInitial = firstName?.charAt(0)?.toUpperCase();
21
+ const secondInitial = secondName?.charAt(0)?.toUpperCase();
22
+
23
+ const formatDate = (date) => {
24
+ if (!date) return "";
25
+
26
+ let d;
27
+
28
+ // Handle DD-MM-YYYY
29
+ if (typeof date === "string" && date.includes("-")) {
30
+ const parts = date.split("-");
31
+ if (parts[0].length === 2) {
32
+ d = new Date(`${parts[2]}-${parts[1]}-${parts[0]}`);
33
+ } else {
34
+ d = new Date(date);
35
+ }
36
+ } else {
37
+ d = new Date(date);
38
+ }
39
+
40
+ if (isNaN(d.getTime())) return "";
41
+
42
+ return d.toLocaleDateString("en-IN", {
43
+ day: "numeric",
44
+ month: "long",
45
+ year: "numeric",
46
+ });
47
+ };
48
+
49
+ const { fps } = useVideoConfig();
50
+
51
+ const initialsStart = fps * 3.5;
52
+ const heartStart = initialsStart + fps * 1.2;
53
+ const openDuration = fps * 1;
54
+
55
+ const initialsOpacity = interpolate(
56
+ frame,
57
+ [initialsStart + fps * 0.1, initialsStart + openDuration],
58
+ [0, 1],
59
+ {
60
+ extrapolateLeft: "clamp",
61
+ extrapolateRight: "clamp",
62
+ easing: Easing.out(Easing.cubic),
63
+ }
64
+ );
65
+ // 🌿 INITIALS SCALE (soft overshoot)
66
+ const initialsScale = interpolate(
67
+ frame,
68
+ [
69
+ initialsStart,
70
+ initialsStart + openDuration * 0.7,
71
+ initialsStart + openDuration,
72
+ ],
73
+ [0.45, 1.05, 1],
74
+ {
75
+ extrapolateLeft: "clamp",
76
+ extrapolateRight: "clamp",
77
+ easing: Easing.out(Easing.cubic),
78
+ }
79
+ );
80
+
81
+ // ☁️ FLOAT UP
82
+ const initialsY = interpolate(
83
+ frame,
84
+ [initialsStart, initialsStart + openDuration],
85
+ [20, 0],
86
+ {
87
+ extrapolateLeft: "clamp",
88
+ extrapolateRight: "clamp",
89
+ }
90
+ );
91
+
92
+
93
+ return (
94
+ <AbsoluteFill style={{ overflow: "hidden" }}>
95
+ <FlowerReveal_TL_BR_28012026 />
96
+ <div
97
+ style={{
98
+ position: "absolute",
99
+ inset: 0, // fills whole screen
100
+ display: "flex",
101
+ justifyContent: "center", // vertical center
102
+ alignItems: "center", // horizontal center
103
+ textAlign: "center",
104
+ }}
105
+ >
106
+ <div
107
+ style={{
108
+ display: "flex",
109
+ flexDirection: "column",
110
+ alignItems: "center",
111
+ gap: "30px",
112
+ width: "100%",
113
+ whiteSpace: "normal",
114
+ wordBreak: "break-word",
115
+ overflowWrap: "break-word",
116
+ lineHeight: "1.2",
117
+ }}
118
+ >
119
+
120
+ <div
121
+ style={{
122
+ display: "flex",
123
+ flexDirection: "column",
124
+ alignItems: "center",
125
+ textAlign: "center",
126
+ gap: "100px",
127
+ width: "100%",
128
+ whiteSpace: "normal",
129
+ wordBreak: "break-word",
130
+ overflowWrap: "break-word",
131
+ lineHeight: "1.2",
132
+ marginTop: "16%"
133
+ }}
134
+ >
135
+ <h1
136
+ style={{
137
+ fontFamily: "Dancing Script",
138
+ color: "#B76E79",
139
+ letterSpacing: 3,
140
+ lineHeight: 1.3,
141
+ fontWeight: 600,
142
+ maxWidth: "80%",
143
+ }}
144
+ >
145
+ <WordReveal28012026
146
+ text={invitationMessage}
147
+ start={40}
148
+ fontSize={60}
149
+ color="#B76E79"
150
+ />
151
+ </h1>
152
+
153
+ <div
154
+ style={{
155
+ position: "relative",
156
+ width: "400px",
157
+ height: "350px",
158
+ display: "flex",
159
+ justifyContent: "center",
160
+ alignItems: "center",
161
+ opacity: initialsOpacity,
162
+ transform: `translateY(${initialsY}px) scale(${initialsScale})`,
163
+ }}
164
+ >
165
+ <HeartDraw28012026 startAfter={heartStart} />
166
+ {/* Bride Initial – Top */}
167
+ <span
168
+ style={{
169
+ position: "absolute",
170
+ top: 0,
171
+ transform: "translate(-80px, -10px)",
172
+ fontFamily: "Dancing Script",
173
+ fontSize: 200,
174
+ color: "#D4A24C",
175
+ fontWeight: 600,
176
+ zIndex: 2,
177
+ }}
178
+ >
179
+ {firstInitial}
180
+ </span>
181
+
182
+ {/* Ampersand – Center */}
183
+ <span
184
+ style={{
185
+ position: "absolute",
186
+ fontFamily: "Dancing Script",
187
+ fontSize: 200,
188
+ color: "#D4A24C",
189
+ opacity: 0.2,
190
+ zIndex: 1,
191
+ }}
192
+ >
193
+ &
194
+ </span>
195
+
196
+ {/* Groom Initial – Bottom */}
197
+ <span
198
+ style={{
199
+ position: "absolute",
200
+ bottom: 0,
201
+ transform: "translate(50px, 50px)",
202
+ fontFamily: "Dancing Script",
203
+ fontSize: 200,
204
+ color: "#D4A24C",
205
+ fontWeight: 600,
206
+ zIndex: 2,
207
+
208
+ opacity: interpolate(
209
+ frame,
210
+ [initialsStart + fps * 0.3, initialsStart + fps * 0.6],
211
+ [0, 1],
212
+ { extrapolateRight: "clamp" }
213
+ ),
214
+ }}
215
+ >
216
+ {secondInitial}
217
+ </span>
218
+
219
+ </div>
220
+
221
+ <div
222
+ style={{
223
+ fontSize: 65,
224
+ fontWeight: "600",
225
+ color: "#B76E79",
226
+ lineHeight: 1.2,
227
+ marginTop: "15px",
228
+ letterSpacing: "4px",
229
+ whiteSpace: "nowrap",
230
+ }}
231
+ >
232
+ <WordReveal28012026
233
+ text={formatDate(occasionDate)}
234
+ start={140}
235
+ fontSize={65}
236
+ color="#B76E79"
237
+ />
238
+
239
+ </div>
240
+ </div>
241
+ </div>
242
+ </div>
243
+
244
+ </AbsoluteFill>
245
+ );
246
+ };