@evatril/video-templates 2.0.9 → 2.0.10

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 (53) hide show
  1. package/package.json +1 -1
  2. package/public/video-images/03022026-bg.webp +0 -0
  3. package/public/video-images/03022026-krishnaradha-2.webp +0 -0
  4. package/public/video-images/03022026-krishnaradha-41.webp +0 -0
  5. package/public/video-images/03022026-krishnaradha-52.webp +0 -0
  6. package/public/video-images/03022026-krishnaradha.webp +0 -0
  7. package/public/video-images/05022026-Duck.webp +0 -0
  8. package/public/video-images/05022026-Flower.webp +0 -0
  9. package/public/video-images/05022026-Ganesh.webp +0 -0
  10. package/public/video-images/05022026-HangingJumar.webp +0 -0
  11. package/public/video-images/05022026-HangingLamps.webp +0 -0
  12. package/public/video-images/05022026-LeftPeacock.webp +0 -0
  13. package/public/video-images/05022026-Nameplate.webp +0 -0
  14. package/public/video-images/05022026-bg-2.webp +0 -0
  15. package/public/video-images/05022026-bg-3.webp +0 -0
  16. package/public/video-images/05022026-bg-4.webp +0 -0
  17. package/public/video-images/05022026-bg.webp +0 -0
  18. package/public/video-images/20012026-bg.webp +0 -0
  19. package/public/video-images/20012026-bride.webp +0 -0
  20. package/public/video-images/20012026-butterfly.webp +0 -0
  21. package/public/video-images/20012026-couple-walk.webp +0 -0
  22. package/public/video-images/20012026-curtain-floral.webp +0 -0
  23. package/public/video-images/20012026-floral-left.webp +0 -0
  24. package/public/video-images/20012026-floral-right.webp +0 -0
  25. package/public/video-images/20012026-groom.webp +0 -0
  26. package/public/video-images/20012026-opening-gate.webp +0 -0
  27. package/public/video-images/20012026-peacock.webp +0 -0
  28. package/public/video-images/20012026-tree-left.webp +0 -0
  29. package/public/video-images/20012026-tree-right.webp +0 -0
  30. package/public/video-images/20012026-wedding-gate.webp +0 -0
  31. package/public/video-images/28012026-Heart.webp +0 -0
  32. package/public/video-images/28012026-PinkLeaf.webp +0 -0
  33. package/src/Invitations/Elements/BlowingLeaves28012026.jsx +28 -22
  34. package/src/Invitations/Elements/CoupleWalk20012026.jsx +2 -2
  35. package/src/Invitations/Elements/FlowersSide20012026.jsx +45 -52
  36. package/src/Invitations/Elements/GroomBrideLoveScene20012026.jsx +27 -28
  37. package/src/Invitations/Elements/HeartFlight28012026.jsx +91 -4
  38. package/src/Invitations/Elements/PeacockDance20012026.jsx +1 -1
  39. package/src/Invitations/Elements/SideTrees20012026.jsx +2 -2
  40. package/src/Invitations/Frames/F03022026_01.jsx +1 -1
  41. package/src/Invitations/Frames/F03022026_04.jsx +1 -1
  42. package/src/Invitations/Frames/F03022026_05.jsx +4 -3
  43. package/src/Invitations/Frames/F05022026_01.jsx +2 -2
  44. package/src/Invitations/Frames/F20012026_01.jsx +58 -8
  45. package/src/Invitations/Frames/F20012026_02.jsx +2 -2
  46. package/src/Invitations/Frames/F20012026_03.jsx +2 -2
  47. package/src/Invitations/Frames/F28012026_03.jsx +1 -1
  48. package/src/Invitations/Frames/F28012026_04.jsx +1 -2
  49. package/src/Invitations/Themes/T03022026_01.jsx +4 -3
  50. package/src/Invitations/Themes/T05022026_01.jsx +3 -3
  51. package/src/Invitations/Themes/T20012026_01.jsx +43 -42
  52. package/src/Invitations/Themes/T28012026_01.jsx +4 -3
  53. package/src/compositions.jsx +8 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evatril/video-templates",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "remotion": {
@@ -1,22 +1,24 @@
1
1
  import React, { useMemo } from "react";
2
- import { useCurrentFrame, useVideoConfig, interpolate } from "remotion";
2
+ import { useCurrentFrame, useVideoConfig, interpolate, Img, staticFile } from "remotion";
3
3
 
4
- export const BlowingLeaves28012026 = ({ startAfter = 2, count = 30 }) => {
4
+ export const BlowingLeaves28012026 = ({ startAfter = 2, count = 5 }) => {
5
5
  const frame = useCurrentFrame();
6
6
  const { fps = 30 } = useVideoConfig();
7
7
 
8
8
  const delayFrames = fps * startAfter;
9
+ const leafSrc = staticFile("video-images/28012026-PinkLeaf.webp");
9
10
 
10
- // 🍃 Generate leaves once
11
+ // 🍃 Generate leaves once (ULTRA SLOW SETTINGS)
11
12
  const leaves = useMemo(() => {
12
13
  return Array.from({ length: count }).map(() => ({
13
14
  x: Math.random() * 100,
14
15
  y: Math.random() * 100,
15
- size: 20 + Math.random() * 25,
16
- speedX: 0.3 + Math.random() * 0.8,
17
- speedY: 0.1 + Math.random() * 0.4,
18
- drift: 40 + Math.random() * 80,
19
- rotateSpeed: 0.3 + Math.random() * 1,
16
+ size: 40 + Math.random() * 25,
17
+
18
+ // 🌿 VERY slow speeds
19
+ speedX: 1 + Math.random() * 1, // % per second
20
+ speedY: 0.1 + Math.random() * 0.1, // % per second
21
+
20
22
  phase: Math.random() * 200,
21
23
  }));
22
24
  }, [count]);
@@ -24,33 +26,39 @@ export const BlowingLeaves28012026 = ({ startAfter = 2, count = 30 }) => {
24
26
  return (
25
27
  <>
26
28
  {leaves.map((l, i) => {
27
- const local = frame - delayFrames;
29
+ const local = Math.max(0, frame - delayFrames);
30
+
31
+ // ⭐ Convert frame → seconds (IMPORTANT)
32
+ const time = local / fps;
28
33
 
29
- const appear = interpolate(local, [0, fps], [0, 1], {
34
+ const appear = interpolate(local, [0, fps * 2], [0, 1], {
30
35
  extrapolateLeft: "clamp",
31
36
  extrapolateRight: "clamp",
32
37
  });
33
38
 
34
- // Horizontal flow
35
- const moveX = ((local * l.speedX + l.phase) % 120) - 10;
39
+ // 🌿 Slow horizontal blowing
40
+ const moveX = ((l.x + time * l.speedX + l.phase) % 120) - 10;
36
41
 
37
- // Gentle vertical float
42
+ // 🌿 Gentle floating vertical
38
43
  const moveY =
39
44
  l.y +
40
- Math.sin((local + l.phase) / 40) * 20 +
41
- local * l.speedY;
45
+ Math.sin((time * 2 + l.phase) / 2) * 10 +
46
+ time * l.speedY;
42
47
 
43
- // Rotation
44
- const rotate = Math.sin((local + l.phase) / 30) * 25;
48
+ // 🌿 Super slow rotation
49
+ const rotate =
50
+ Math.sin((time + l.phase) / 2) * 15;
45
51
 
46
52
  return (
47
- <div
53
+ <Img
48
54
  key={i}
55
+ src={leafSrc}
49
56
  style={{
50
57
  position: "absolute",
51
58
  left: `${moveX}%`,
52
59
  top: `${moveY % 110}%`,
53
- fontSize: l.size,
60
+ width: l.size,
61
+ height: "auto",
54
62
  opacity: appear,
55
63
  transform: `
56
64
  translate(-50%, -50%)
@@ -58,9 +66,7 @@ export const BlowingLeaves28012026 = ({ startAfter = 2, count = 30 }) => {
58
66
  `,
59
67
  pointerEvents: "none",
60
68
  }}
61
- >
62
- 🍁
63
- </div>
69
+ />
64
70
  );
65
71
  })}
66
72
  </>
@@ -13,7 +13,7 @@ export const CoupleWalk20012026 = () => {
13
13
  const { fps, height } = useVideoConfig();
14
14
 
15
15
  /* -----------------------------⏳ WALK SETTINGS ------------------------------*/
16
- const delaySeconds = 0.5;
16
+ const delaySeconds = 0;
17
17
  const walkDurationSeconds = 5;
18
18
  const delayFrames = fps * delaySeconds;
19
19
  const walkFrames = fps * walkDurationSeconds;
@@ -56,7 +56,7 @@ export const CoupleWalk20012026 = () => {
56
56
 
57
57
  {/* 👰🤵 COUPLE (BOTTOM-CENTER) */}
58
58
  <Img
59
- src={staticFile("video-images/20012026-couple-walk.png")}
59
+ src={staticFile("video-images/20012026-couple-walk.webp")}
60
60
  style={{
61
61
  position: "absolute",
62
62
  left: "50%",
@@ -9,7 +9,7 @@ import {
9
9
  } from "remotion";
10
10
 
11
11
  /* 🌸 FALLING EMOJI FLOWER – MULTI LINE */
12
- const FallingEmojiFlower = ({ index, row = 0, startAfter = 6 }) => {
12
+ const FallingEmojiFlower = ({ index, row = 0, startAfter = 0 }) => {
13
13
  const frame = useCurrentFrame();
14
14
  const { height, width, fps } = useVideoConfig();
15
15
 
@@ -20,7 +20,7 @@ const FallingEmojiFlower = ({ index, row = 0, startAfter = 6 }) => {
20
20
  const baseX =
21
21
  width / 2 - stripWidth / 2 + ((index * 50) % stripWidth);
22
22
 
23
- /* 🌸 ROW OFFSET (2–3 LINES) */
23
+ /* 🌸 ROW OFFSET */
24
24
  const rowOffsetY = row * 60;
25
25
 
26
26
  const individualDelay = index * 10 + row * 15;
@@ -28,15 +28,10 @@ const FallingEmojiFlower = ({ index, row = 0, startAfter = 6 }) => {
28
28
 
29
29
  const localFrame = frame - delayFrames - individualDelay;
30
30
 
31
- const progress = interpolate(
32
- localFrame,
33
- [0, duration],
34
- [0, 1],
35
- {
36
- extrapolateLeft: "clamp",
37
- extrapolateRight: "clamp",
38
- }
39
- );
31
+ const progress = interpolate(localFrame, [0, duration], [0, 1], {
32
+ extrapolateLeft: "clamp",
33
+ extrapolateRight: "clamp",
34
+ });
40
35
 
41
36
  const translateY = interpolate(
42
37
  progress,
@@ -51,24 +46,22 @@ const FallingEmojiFlower = ({ index, row = 0, startAfter = 6 }) => {
51
46
 
52
47
  const rotate = progress * 360;
53
48
 
54
- // ❌ Do not render before start or after finish
55
49
  if (localFrame < 0 || localFrame > duration) return null;
56
50
 
57
51
  return (
58
- <div
52
+ <Img
53
+ src={staticFile("video-images/05022026-Flower.webp")}
59
54
  style={{
60
55
  position: "absolute",
61
56
  left: baseX,
62
57
  top: translateY,
63
- fontSize: 44,
64
- opacity: 0.85,
58
+ width: "10%",
59
+ opacity: 0.9,
65
60
  transform: `translateX(${sway}px) rotate(${rotate}deg)`,
66
61
  pointerEvents: "none",
67
62
  userSelect: "none",
68
63
  }}
69
- >
70
- {["🌸", "🌺"][index % 2]}
71
- </div>
64
+ />
72
65
  );
73
66
  };
74
67
 
@@ -77,18 +70,18 @@ export const FlowersSide20012026 = ({ startAfter = 1 }) => {
77
70
  const { fps } = useVideoConfig();
78
71
 
79
72
  const delayFrames = fps * startAfter;
80
- const revealDuration = fps * 2.5; // ⏱ 2 seconds
73
+ const revealDuration = fps * 2.5; // ⏱ 2 seconds
81
74
 
82
- const revealProgress = interpolate(
83
- frame - delayFrames,
84
- [0, revealDuration],
85
- [0, 1],
86
- {
87
- extrapolateLeft: "clamp",
88
- extrapolateRight: "clamp",
89
- easing: Easing.out(Easing.cubic),
90
- }
91
- );
75
+ const revealProgress = interpolate(
76
+ frame - delayFrames,
77
+ [0, revealDuration],
78
+ [0, 1],
79
+ {
80
+ extrapolateLeft: "clamp",
81
+ extrapolateRight: "clamp",
82
+ easing: Easing.out(Easing.cubic),
83
+ }
84
+ );
92
85
 
93
86
  return (
94
87
  <>
@@ -105,36 +98,36 @@ const revealProgress = interpolate(
105
98
  )}
106
99
  {/* 🌸 LEFT FLOWER DECOR */}
107
100
  <Img
108
- src={staticFile("video-images/20012026-floral-left.png")}
109
- style={{
110
- position: "absolute",
111
- left: 0,
112
- bottom: 370,
113
- width: "100%",
114
- opacity: revealProgress,
115
- transform: `
101
+ src={staticFile("video-images/20012026-floral-left.webp")}
102
+ style={{
103
+ position: "absolute",
104
+ left: 0,
105
+ bottom: 370,
106
+ width: "100%",
107
+ opacity: revealProgress,
108
+ transform: `
116
109
  translateX(${interpolate(revealProgress, [0, 1], [-120, -30])}px)
117
110
  scale(${interpolate(revealProgress, [0, 1], [0.96, 1])})
118
111
  `,
119
- pointerEvents: "none",
120
- }}
121
- />
112
+ pointerEvents: "none",
113
+ }}
114
+ />
122
115
  {/* 🌸 RIGHT FLOWER DECOR */}
123
- <Img
124
- src={staticFile("video-images/20012026-floral-right.png")}
125
- style={{
126
- position: "absolute",
127
- right: 0,
128
- bottom: 370,
129
- width: "100%",
130
- opacity: revealProgress,
131
- transform: `
116
+ <Img
117
+ src={staticFile("video-images/20012026-floral-right.webp")}
118
+ style={{
119
+ position: "absolute",
120
+ right: 0,
121
+ bottom: 370,
122
+ width: "100%",
123
+ opacity: revealProgress,
124
+ transform: `
132
125
  translateX(${interpolate(revealProgress, [0, 1], [120, 30])}px)
133
126
  scale(${interpolate(revealProgress, [0, 1], [0.96, 1])})
134
127
  `,
135
- pointerEvents: "none",
136
- }}
137
- />
128
+ pointerEvents: "none",
129
+ }}
130
+ />
138
131
 
139
132
  </>
140
133
  );
@@ -8,7 +8,7 @@ import {
8
8
  Easing,
9
9
  } from "remotion";
10
10
 
11
- export const GroomBrideLoveScene20012026 = ({ startAfter = 3.5}) => {
11
+ export const GroomBrideLoveScene20012026 = ({ startAfter = 3.5 }) => {
12
12
  const frame = useCurrentFrame();
13
13
  const { fps, width } = useVideoConfig();
14
14
 
@@ -60,10 +60,10 @@ export const GroomBrideLoveScene20012026 = ({ startAfter = 3.5}) => {
60
60
  const depthScale = 1 + Math.sin(walkFrame / 18) * 0.03;
61
61
  const rotateZ = Math.sin(walkFrame / 30) * 1.2;
62
62
 
63
- /* ---------------- BRIDE TURN (SAFE FLIP) ---------------- */
64
- const meetFrame = walkDelay + walkDuration;
65
- const brideTurnDuration = fps * 0.6;
66
- const brideFlip = interpolate(
63
+ /* ---------------- BRIDE TURN (SAFE FLIP) ---------------- */
64
+ const meetFrame = walkDelay + walkDuration;
65
+ const brideTurnDuration = fps * 0.6;
66
+ const brideFlip = interpolate(
67
67
  frame,
68
68
  [meetFrame, meetFrame + brideTurnDuration],
69
69
  [1, -1], // RIGHT → LEFT
@@ -75,12 +75,12 @@ const brideFlip = interpolate(
75
75
  );
76
76
 
77
77
  /* ---------------- LOVE EMOJI ---------------- */
78
- const loveStart = meetFrame + brideTurnDuration;
78
+ const loveStart = meetFrame + brideTurnDuration;
79
79
  return (
80
80
  <>
81
81
  {/* 🤵 GROOM (SHOW → PAUSE → WALK) */}
82
82
  <Img
83
- src={staticFile("video-images/20012026-groom.png")}
83
+ src={staticFile("video-images/20012026-groom.webp")}
84
84
  style={{
85
85
  position: "absolute",
86
86
  bottom: 0,
@@ -97,20 +97,20 @@ const brideFlip = interpolate(
97
97
  />
98
98
 
99
99
  {/* 👰 BRIDE (FIXED, SHOWS SAME TIME) */}
100
- <Img
101
- src={staticFile("video-images/20012026-bride.png")}
102
- style={{
103
- position: "absolute",
104
- bottom: 0,
105
- width: "40%",
106
- opacity,
107
- transform: `
100
+ <Img
101
+ src={staticFile("video-images/20012026-bride.webp")}
102
+ style={{
103
+ position: "absolute",
104
+ bottom: 0,
105
+ width: "40%",
106
+ opacity,
107
+ transform: `
108
108
  translateX(${brideX}px)
109
109
  scaleX(${brideFlip})
110
110
  `,
111
- transformOrigin: "bottom center",
112
- }}
113
- />
111
+ transformOrigin: "bottom center",
112
+ }}
113
+ />
114
114
  {/* ❤️ MULTIPLE FLOATING LOVE EMOJIS */}
115
115
  {frame > loveStart &&
116
116
  Array.from({ length: 16 }).map((_, i) => {
@@ -134,28 +134,27 @@ const brideFlip = interpolate(
134
134
  );
135
135
 
136
136
  const spreadX =
137
- brideX + 60 + Math.sin(i * 35) * 100;
137
+ brideX + 60 + Math.sin(i * 35) * 100;
138
138
 
139
139
  const scale = 0.7 + (i % 5) * 0.12;
140
140
 
141
141
  return (
142
- <div
143
- key={i}
142
+ <Img
143
+ key={i}
144
+ src={staticFile("video-images/28012026-Heart.webp")}
144
145
  style={{
145
146
  position: "absolute",
146
147
  bottom: "30%",
147
148
  left: spreadX,
148
- fontSize: 66,
149
+ width: 60,
149
150
  opacity: emojiOpacity,
150
151
  transform: `
151
- translateY(${floatY}px)
152
- scale(${scale})
153
- `,
152
+ translateY(${floatY}px)
153
+ scale(${scale})
154
+ `,
154
155
  pointerEvents: "none",
155
156
  }}
156
- >
157
- 💖
158
- </div>
157
+ />
159
158
  );
160
159
  })}
161
160
  </>
@@ -1,9 +1,91 @@
1
+ // import React from "react";
2
+ // import { useCurrentFrame, useVideoConfig, interpolate, Easing } from "remotion";
3
+
4
+ // export const HeartFlight28012026 = ({
5
+ // emoji = "💖",
6
+ // startAfter = 3,
7
+ // }) => {
8
+ // const frame = useCurrentFrame();
9
+ // const { fps, width, height } = useVideoConfig();
10
+
11
+ // const GLOBAL_DELAY = fps * startAfter;
12
+
13
+ // const hearts = [
14
+ // { sx: 0.1, sy: 0.9, ex: 0.8, ey: 0.2, delay: 0 },
15
+ // { sx: 0.9, sy: 0.85, ex: 0.2, ey: 0.1, delay: 20 },
16
+ // { sx: 0.3, sy: 1.0, ex: 0.7, ey: 0.3, delay: 40 },
17
+ // { sx: 0.4, sy: 0.9, ex: 0.8, ey: 0.2, delay: 10 },
18
+ // { sx: 0.5, sy: 0.85, ex: 0.2, ey: 0.1, delay: 30 },
19
+ // { sx: 0.8, sy: 1.0, ex: 0.7, ey: 0.3, delay: 50 },
20
+ // ];
21
+
22
+ // return (
23
+ // <>
24
+ // {hearts.map((h, i) => {
25
+ // const localFrame = frame - GLOBAL_DELAY - h.delay;
26
+
27
+ // const progress = interpolate(localFrame, [0, fps * 6], [0, 1], {
28
+ // extrapolateLeft: "clamp",
29
+ // extrapolateRight: "clamp",
30
+ // easing: Easing.inOut(Easing.ease),
31
+ // });
32
+
33
+ // const x = interpolate(progress, [0, 1], [
34
+ // h.sx * width,
35
+ // h.ex * width,
36
+ // ]);
37
+
38
+ // const y =
39
+ // interpolate(progress, [0, 1], [
40
+ // h.sy * height,
41
+ // h.ey * height,
42
+ // ]) +
43
+ // Math.sin(frame / 10 + i * 20) * 25;
44
+
45
+ // const scale = interpolate(progress, [0, 0.1, 0.9, 1], [0, 1, 1, 0.6]);
46
+
47
+ // const opacity = progress > 0.05 && progress < 0.95 ? 1 : 0;
48
+
49
+ // return (
50
+ // <div
51
+ // key={i}
52
+ // style={{
53
+ // position: "absolute",
54
+ // left: x,
55
+ // top: y,
56
+ // fontSize: 70,
57
+ // opacity,
58
+ // transform: `
59
+ // translate(-50%, -50%)
60
+ // scale(${scale})
61
+ // rotate(${Math.sin(localFrame / 15 + i) * 15}deg)
62
+ // `,
63
+ // pointerEvents: "none",
64
+ // }}
65
+ // >
66
+ // {emoji}
67
+ // </div>
68
+ // );
69
+ // })}
70
+ // </>
71
+ // );
72
+ // };
73
+
74
+
75
+
1
76
  import React from "react";
2
- import { useCurrentFrame, useVideoConfig, interpolate, Easing } from "remotion";
77
+ import {
78
+ useCurrentFrame,
79
+ useVideoConfig,
80
+ interpolate,
81
+ Easing,
82
+ Img,
83
+ staticFile,
84
+ } from "remotion";
3
85
 
4
86
  export const HeartFlight28012026 = ({
5
- emoji = "💖",
6
87
  startAfter = 3,
88
+ heartImage = "heart.png", // image file name from public folder
7
89
  }) => {
8
90
  const frame = useCurrentFrame();
9
91
  const { fps, width, height } = useVideoConfig();
@@ -53,7 +135,6 @@ export const HeartFlight28012026 = ({
53
135
  position: "absolute",
54
136
  left: x,
55
137
  top: y,
56
- fontSize: 70,
57
138
  opacity,
58
139
  transform: `
59
140
  translate(-50%, -50%)
@@ -63,7 +144,13 @@ export const HeartFlight28012026 = ({
63
144
  pointerEvents: "none",
64
145
  }}
65
146
  >
66
- {emoji}
147
+ <Img
148
+ src={staticFile("video-images/28012026-Heart.webp")}
149
+ style={{
150
+ width: 70,
151
+ height: 70,
152
+ }}
153
+ />
67
154
  </div>
68
155
  );
69
156
  })}
@@ -51,7 +51,7 @@ export const PeacockDance20012026 = ({
51
51
 
52
52
  return (
53
53
  <Img
54
- src={staticFile("video-images/20012026-peacock.png")}
54
+ src={staticFile("video-images/20012026-peacock.webp")}
55
55
  style={{
56
56
  position: "absolute",
57
57
  top: "55%",
@@ -68,7 +68,7 @@ export const SideTrees20012026 = ({ startAfter = 1 }) => {
68
68
  <>
69
69
  {/* 🌳 LEFT TREE */}
70
70
  <Img
71
- src={staticFile("video-images/20012026-tree-left.png")}
71
+ src={staticFile("video-images/20012026-tree-left.webp")}
72
72
  style={{
73
73
  position: "absolute",
74
74
  left: 0,
@@ -85,7 +85,7 @@ export const SideTrees20012026 = ({ startAfter = 1 }) => {
85
85
 
86
86
  {/* 🌳 RIGHT TREE */}
87
87
  <Img
88
- src={staticFile("video-images/20012026-tree-right.png")}
88
+ src={staticFile("video-images/20012026-tree-right.webp")}
89
89
  style={{
90
90
  position: "absolute",
91
91
  right: 0,
@@ -154,7 +154,7 @@ export const F03022026_01 = () => {
154
154
  src={staticFile("video-images/03022026-krishnaradha.webp")}
155
155
  style={{
156
156
  position: "absolute",
157
- top: "32%",
157
+ top: "40%",
158
158
  left: "50%",
159
159
  width: "80%",
160
160
  objectFit: "cover",
@@ -171,7 +171,7 @@ export const F03022026_04 = ({
171
171
  }}
172
172
  >
173
173
  <Img
174
- src={staticFile("video-images/03022026-krishnaradha-4.webp")}
174
+ src={staticFile("video-images/03022026-krishnaradha-41.webp")}
175
175
  style={{
176
176
  position: "absolute",
177
177
  left: "50%",
@@ -159,11 +159,12 @@ export const F03022026_05 = ({
159
159
  }}
160
160
  >
161
161
  <Img
162
- src={staticFile("video-images/03022026-krishnaradha-5.webp")}
162
+ src={staticFile("video-images/03022026-krishnaradha-52.webp")}
163
163
  style={{
164
164
  position: "absolute",
165
- top: "30%",
165
+ top: "40%",
166
166
  left: "50%",
167
+ width:"80%",
167
168
  objectFit: "cover",
168
169
  opacity: imageOpacity * imageExitOpacity,
169
170
  transform: `translateX(-50%) translateX(${moveX}px) translateY(${imageExitY}px)`
@@ -179,7 +180,7 @@ export const F03022026_05 = ({
179
180
  justifyContent: "center",
180
181
  alignItems: "center",
181
182
  opacity: msgOpacity * msgExitOpacity,
182
- transform: `translateY(-18%) translateY(${msgY + msgExitY}px)`,
183
+ transform: `translateY(-20%) translateY(${msgY + msgExitY}px)`,
183
184
  }}
184
185
  >
185
186
  <div
@@ -99,7 +99,7 @@ export const F05022026_01 = () => {
99
99
  <AbsoluteFill
100
100
  style={{
101
101
  display: "flex",
102
- paddingTop: "10%",
102
+ paddingTop: "15%",
103
103
  alignItems: "center",
104
104
  opacity: fade(ganeshStart) * ganeshExitOpacity,
105
105
  transform: `translateY(${ganeshExitY}px)`,
@@ -108,7 +108,7 @@ export const F05022026_01 = () => {
108
108
  <Img
109
109
  src={staticFile("video-images/05022026-Ganesh.webp")}
110
110
  style={{
111
- width: "60%",
111
+ width: "50%",
112
112
  objectFit: "contain",
113
113
  transform: `scale(${ganeshScale * ganeshExitScale})`,
114
114
  }}
@@ -20,7 +20,7 @@ export const F20012026_01 = ({
20
20
  const { fps, width, height } = useVideoConfig();
21
21
 
22
22
  /* -------------------- MESSAGE REVEAL -------------------- */
23
- const messageStart = fps * 4;
23
+ const messageStart = fps * 2;
24
24
  const messageOpacity = interpolate(
25
25
  frame,
26
26
  [messageStart, messageStart + 15],
@@ -54,6 +54,49 @@ export const F20012026_01 = ({
54
54
  const brideAnim = reveal(brideStart);
55
55
  const wedsAnim = reveal(wedsStart);
56
56
  const groomAnim = reveal(groomStart);
57
+
58
+ const sceneDuration = fps * 8;
59
+ const exitDuration = fps * 1.3; // last 1 sec
60
+ const exitStart = sceneDuration - exitDuration;
61
+
62
+ const parts = 5;
63
+ const partDuration = exitDuration / parts;
64
+
65
+
66
+ const getExitAnim = (index) => {
67
+ const start = exitStart + partDuration * index;
68
+ const end = start + partDuration;
69
+
70
+ return {
71
+ opacity: interpolate(
72
+ frame,
73
+ [start, end],
74
+ [1, 0],
75
+ {
76
+ extrapolateLeft: "clamp",
77
+ extrapolateRight: "clamp",
78
+ easing: Easing.out(Easing.cubic),
79
+ }
80
+ ),
81
+
82
+ translateY: interpolate(
83
+ frame,
84
+ [start, end],
85
+ [0, -80],
86
+ {
87
+ extrapolateLeft: "clamp",
88
+ extrapolateRight: "clamp",
89
+ }
90
+ ),
91
+ };
92
+ };
93
+
94
+ const messageExit = getExitAnim(0);
95
+ const brideExit = getExitAnim(1);
96
+ const wedsExit = getExitAnim(2);
97
+ const groomExit = getExitAnim(3);
98
+ const coupleExit = getExitAnim(4);
99
+
57
100
  return (
58
101
  <AbsoluteFill style={{ overflow: "hidden" }}>
59
102
 
@@ -91,6 +134,8 @@ export const F20012026_01 = ({
91
134
  lineHeight: 1.2,
92
135
  opacity: messageOpacity,
93
136
  transform: `translateY(${messageTranslateY}px)`,
137
+ opacity: messageOpacity * messageExit.opacity,
138
+ transform: `translateY(${messageTranslateY + messageExit.translateY}px)`,
94
139
  }}
95
140
  >
96
141
  {welcomeMessage}
@@ -120,8 +165,10 @@ export const F20012026_01 = ({
120
165
  whiteSpace: "normal",
121
166
  wordBreak: "break-word",
122
167
  overflowWrap: "break-word",
123
- opacity: brideAnim.opacity,
124
- transform: `translateY(${brideAnim.translateY}px)`,
168
+ // opacity: brideAnim.opacity,
169
+ // transform: `translateY(${brideAnim.translateY}px)`,
170
+ opacity: brideAnim.opacity * brideExit.opacity,
171
+ transform: `translateY(${brideAnim.translateY + brideExit.translateY}px)`,
125
172
  }}
126
173
  >
127
174
  {firstName}
@@ -133,8 +180,10 @@ export const F20012026_01 = ({
133
180
  fontFamily: "Great Vibes",
134
181
  color: "#D4AF37",
135
182
  margin: "10px 0",
136
- opacity: wedsAnim.opacity,
137
- transform: `translateY(${wedsAnim.translateY}px)`,
183
+ // opacity: wedsAnim.opacity,
184
+ // transform: `translateY(${wedsAnim.translateY}px)`,
185
+ opacity: wedsAnim.opacity * wedsExit.opacity,
186
+ transform: `translateY(${wedsAnim.translateY + wedsExit.translateY}px)`,
138
187
  }}
139
188
  >
140
189
  weds
@@ -154,9 +203,10 @@ export const F20012026_01 = ({
154
203
  whiteSpace: "normal",
155
204
  wordBreak: "break-word",
156
205
  overflowWrap: "break-word",
157
- opacity: groomAnim.opacity,
158
- transform: `translateY(${groomAnim.translateY}px)`,
159
-
206
+ // opacity: groomAnim.opacity,
207
+ // transform: `translateY(${groomAnim.translateY}px)`,
208
+ opacity: groomAnim.opacity * groomExit.opacity,
209
+ transform: `translateY(${groomAnim.translateY + groomExit.translateY}px)`,
160
210
  }}
161
211
  >
162
212
  {secondName}
@@ -67,7 +67,7 @@ export const F20012026_02 = ({
67
67
  >
68
68
  {/* Curtain */}
69
69
  <Img
70
- src={staticFile("video-images/20012026-curtain-floral.png")}
70
+ src={staticFile("video-images/20012026-curtain-floral.webp")}
71
71
  style={{
72
72
  position: "absolute",
73
73
  left: "50%",
@@ -179,7 +179,7 @@ export const F20012026_02 = ({
179
179
  <div
180
180
  style={{
181
181
  fontSize: 40,
182
- fontWeight:"400",
182
+ fontWeight:"400",
183
183
  fontFamily: "Great Vibes",
184
184
  color: "#2F6B4F",
185
185
  }}
@@ -79,7 +79,7 @@ export const F20012026_03 = ({
79
79
  }
80
80
  );
81
81
 
82
- return (
82
+ return (
83
83
  <AbsoluteFill
84
84
  style={{
85
85
  transformOrigin: "center center",
@@ -87,7 +87,7 @@ export const F20012026_03 = ({
87
87
  }}
88
88
  >
89
89
  <Img
90
- src={staticFile("video-images/20012026-wedding-gate.png")}
90
+ src={staticFile("video-images/20012026-wedding-gate.webp")}
91
91
  style={{
92
92
  position: "absolute",
93
93
  top: 0,
@@ -132,7 +132,7 @@ const nameTranslateX = interpolate(
132
132
  overflow: "hidden",
133
133
  }}
134
134
  >
135
- <HeartFlight28012026 emoji="💗" />
135
+ <HeartFlight28012026 />
136
136
 
137
137
  {/* Top Border */}
138
138
  <div
@@ -135,8 +135,7 @@ const nameTranslateX = interpolate(
135
135
  overflow: "hidden",
136
136
  }}
137
137
  >
138
- {/* <MultiHeartFloat28012026 startAfter={3} count={18} emoji="💖" /> */}
139
- <HeartFlight28012026 emoji="💗" />
138
+ <HeartFlight28012026 />
140
139
 
141
140
  {/* Top Border */}
142
141
  <div
@@ -37,14 +37,15 @@ export const T03022026_01 = ({
37
37
  const fadeOutStart = durationInFrames - fadeDuration;
38
38
  const musicVolume = interpolate(
39
39
  frame,
40
- [0, fadeOutStart, durationInFrames],
41
- [0.4, 0.4, 0],
40
+ [0, fps, fadeOutStart, durationInFrames],
41
+ [0, 0.4, 0.4, 0],
42
42
  {
43
43
  easing: Easing.inOut(Easing.ease),
44
44
  extrapolateLeft: "clamp",
45
45
  extrapolateRight: "clamp",
46
46
  }
47
47
  );
48
+
48
49
  const slideDuration = 1 * fps;
49
50
 
50
51
  const firstSceneContent = 5 * fps;
@@ -266,4 +267,4 @@ export const T03022026_01 = ({
266
267
  );
267
268
  };
268
269
 
269
- T03022026_01.duration = 30 * 38;
270
+ T03022026_01.duration = 24 * 38;
@@ -36,8 +36,8 @@ export const T05022026_01 = ({
36
36
  const fadeOutStart = durationInFrames - fadeDuration;
37
37
  const musicVolume = interpolate(
38
38
  frame,
39
- [0, fadeOutStart, durationInFrames],
40
- [0.4, 0.4, 0],
39
+ [0, fps, fadeOutStart, durationInFrames],
40
+ [0, 0.4, 0.4, 0],
41
41
  {
42
42
  easing: Easing.inOut(Easing.ease),
43
43
  extrapolateLeft: "clamp",
@@ -256,4 +256,4 @@ export const T05022026_01 = ({
256
256
  );
257
257
  };
258
258
 
259
- T05022026_01.duration = 30 * 30;
259
+ T05022026_01.duration = 24 * 30;
@@ -35,8 +35,8 @@ export const T20012026_01 = ({
35
35
  const fadeOutStart = durationInFrames - fadeDuration;
36
36
  const musicVolume = interpolate(
37
37
  frame,
38
- [0, fadeOutStart, durationInFrames],
39
- [0.4, 0.4, 0],
38
+ [0, fps, fadeOutStart, durationInFrames],
39
+ [0, 0.4, 0.4, 0],
40
40
  {
41
41
  easing: Easing.inOut(Easing.ease),
42
42
  extrapolateLeft: "clamp",
@@ -44,6 +44,13 @@ export const T20012026_01 = ({
44
44
  }
45
45
  );
46
46
 
47
+ // 🎬 Change timing here
48
+ const scene1Duration = 8 * fps;
49
+ const scene2Duration = 10 * fps;
50
+ const scene3Duration = 12 * fps;
51
+
52
+ const transitionDuration = 1 * fps;
53
+
47
54
  /* ---------------- SAFE DATA ---------------- */
48
55
 
49
56
  const whoIsCreating =
@@ -98,11 +105,6 @@ export const T20012026_01 = ({
98
105
  const venueAddress =
99
106
  venue?.address || formData?.venue_address || "";
100
107
 
101
- /* ---------------- TIMING ---------------- */
102
-
103
- const framesPerPage = Math.floor(durationInFrames / 3);
104
- const transitionDuration = Math.floor(framesPerPage * 0.25);
105
-
106
108
  /* ---------------- PRELOAD IMAGES ---------------- */
107
109
 
108
110
  const imagesToPreload = useMemo(
@@ -114,7 +116,9 @@ export const T20012026_01 = ({
114
116
  staticFile("video-images/20012026-curtain-floral.webp"),
115
117
  staticFile("video-images/20012026-floral-left.webp"),
116
118
  staticFile("video-images/20012026-floral-right.webp"),
119
+ staticFile("video-images/05022026-Flower.webp"),
117
120
  staticFile("video-images/20012026-groom.webp"),
121
+ staticFile("video-images/28012026-Heart.webp"),
118
122
  staticFile("video-images/20012026-opening-gate.webp"),
119
123
  staticFile("video-images/20012026-peacock.webp"),
120
124
  staticFile("video-images/20012026-tree-left.webp"),
@@ -158,29 +162,33 @@ export const T20012026_01 = ({
158
162
  volume={musicVolume}
159
163
  />
160
164
 
161
-
162
165
  {/* ================= SCENE 1 ================= */}
163
- <Sequence from={0} durationInFrames={framesPerPage + 2}>
164
- <>
165
- <Img
166
- src={staticFile("video-images/20012026-bg.png")}
167
- style={{ position: "absolute", width: "100%", height: "100%", objectFit: "cover" }}
168
- />
166
+ <Sequence from={0} durationInFrames={scene1Duration}>
167
+ <Page bg={backgrounds[0]}>
169
168
  <F20012026_01
170
169
  firstName={firstName}
171
170
  secondName={secondName}
172
171
  welcomeMessage={welcomeMessage}
173
172
  />
174
- </>
173
+ </Page>
174
+ </Sequence>
175
+
176
+ {/* ☁️ TRANSITION 1 */}
177
+ <Sequence
178
+ from={scene1Duration}
179
+ durationInFrames={transitionDuration}
180
+ >
181
+ <Page bg={backgrounds[0]}>
182
+ <InkSmokeTransition20012026 />
183
+ </Page>
175
184
  </Sequence>
176
185
 
177
186
  {/* ================= SCENE 2 ================= */}
178
- <Sequence from={framesPerPage - 2} durationInFrames={framesPerPage + 2}>
179
- <>
180
- <Img
181
- src={staticFile("video-images/20012026-bg.png")}
182
- style={{ position: "absolute", width: "100%", height: "100%", objectFit: "cover" }}
183
- />
187
+ <Sequence
188
+ from={scene1Duration + transitionDuration}
189
+ durationInFrames={scene2Duration}
190
+ >
191
+ <Page bg={backgrounds[0]}>
184
192
  <F20012026_02
185
193
  firstName={firstName}
186
194
  secondName={secondName}
@@ -190,43 +198,36 @@ export const T20012026_01 = ({
190
198
  occasionDate={occasionDate}
191
199
  fadeInDuration={transitionDuration}
192
200
  />
193
- </>
201
+ </Page>
194
202
  </Sequence>
195
203
 
196
- {/* ☁️ TRANSITION 1 → 2 */}
204
+ {/* ☁️ TRANSITION 2 */}
197
205
  <Sequence
198
- from={framesPerPage - 2}
199
- durationInFrames={transitionDuration + 2}
206
+ from={scene1Duration + transitionDuration + scene2Duration}
207
+ durationInFrames={transitionDuration}
200
208
  >
201
- <InkSmokeTransition20012026 />
209
+ <Page bg={backgrounds[0]}>
210
+ <InkSmokeTransition20012026 />
211
+ </Page>
202
212
  </Sequence>
203
213
 
204
214
  {/* ================= SCENE 3 ================= */}
205
- <Sequence from={framesPerPage * 2 - 2} durationInFrames={framesPerPage + 2}>
206
- <>
207
- <Img
208
- src={staticFile("video-images/20012026-bg.png")}
209
- style={{ position: "absolute", width: "100%", height: "100%", objectFit: "cover" }}
210
- />
215
+ <Sequence
216
+ from={scene1Duration + transitionDuration + scene2Duration + transitionDuration}
217
+ durationInFrames={scene3Duration}
218
+ >
219
+ <Page bg={backgrounds[0]}>
211
220
  <F20012026_03
212
221
  eventDateTime={eventDateTime}
213
222
  venueName={venueName}
214
223
  venueAddress={venueAddress}
215
224
  familyMember={familyMember}
216
225
  />
217
- </>
218
- </Sequence>
219
-
220
- {/* ☁️ TRANSITION 2 → 3 */}
221
- <Sequence
222
- from={framesPerPage * 2 - 2}
223
- durationInFrames={transitionDuration + 2}
224
- >
225
- <InkSmokeTransition20012026 />
226
+ </Page>
226
227
  </Sequence>
227
228
 
228
229
  </AbsoluteFill>
229
230
  );
230
231
  };
231
232
 
232
- T20012026_01.duration = 30 * 30;
233
+ T20012026_01.duration = 24 * 30;
@@ -36,14 +36,15 @@ export const T28012026_01 = ({
36
36
  const fadeOutStart = durationInFrames - fadeDuration;
37
37
  const musicVolume = interpolate(
38
38
  frame,
39
- [0, fadeOutStart, durationInFrames],
40
- [0.4, 0.4, 0],
39
+ [0, fps, fadeOutStart, durationInFrames],
40
+ [0, 0.4, 0.4, 0],
41
41
  {
42
42
  easing: Easing.inOut(Easing.ease),
43
43
  extrapolateLeft: "clamp",
44
44
  extrapolateRight: "clamp",
45
45
  }
46
46
  );
47
+
47
48
  const firstSceneDuration = fps * 5;
48
49
  const otherSceneDuration = fps * 8;
49
50
 
@@ -238,4 +239,4 @@ export const T28012026_01 = ({
238
239
  );
239
240
  }
240
241
 
241
- T28012026_01.duration = 30 * 37;
242
+ T28012026_01.duration = 24 * 37;
@@ -11,32 +11,32 @@ export const VideoCompositions = () => {
11
11
  <Composition
12
12
  id="T20012026-01"
13
13
  component={T20012026_01}
14
- fps={30}
15
- durationInFrames={30 * 30}
14
+ fps={24}
15
+ durationInFrames={24 * 30}
16
16
  width={1080}
17
17
  height={1920}
18
18
  />
19
19
  <Composition
20
20
  id="T28012026-01"
21
21
  component={T28012026_01}
22
- fps={30}
23
- durationInFrames={30 * 37}
22
+ fps={24}
23
+ durationInFrames={24 * 37}
24
24
  width={1080}
25
25
  height={1920}
26
26
  />
27
27
  <Composition
28
28
  id="T03022026-01"
29
29
  component={T03022026_01}
30
- fps={30}
31
- durationInFrames={30 * 38}
30
+ fps={24}
31
+ durationInFrames={24 * 38}
32
32
  width={1080}
33
33
  height={1920}
34
34
  />
35
35
  <Composition
36
36
  id="T05022026-01"
37
37
  component={T05022026_01}
38
- fps={30}
39
- durationInFrames={30 * 38}
38
+ fps={24}
39
+ durationInFrames={24 * 30}
40
40
  width={1080}
41
41
  height={1920}
42
42
  />