@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evatril/video-templates",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "description": "",
5
5
  "main": "src/index.js",
6
6
  "remotion": {
Binary file
@@ -0,0 +1,68 @@
1
+ import React, { useMemo } from "react";
2
+ import { useCurrentFrame, useVideoConfig, interpolate } from "remotion";
3
+
4
+ export const BlowingLeaves28012026 = ({ startAfter = 2, count = 30 }) => {
5
+ const frame = useCurrentFrame();
6
+ const { fps = 30 } = useVideoConfig();
7
+
8
+ const delayFrames = fps * startAfter;
9
+
10
+ // 🍃 Generate leaves once
11
+ const leaves = useMemo(() => {
12
+ return Array.from({ length: count }).map(() => ({
13
+ x: Math.random() * 100,
14
+ 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,
20
+ phase: Math.random() * 200,
21
+ }));
22
+ }, [count]);
23
+
24
+ return (
25
+ <>
26
+ {leaves.map((l, i) => {
27
+ const local = frame - delayFrames;
28
+
29
+ const appear = interpolate(local, [0, fps], [0, 1], {
30
+ extrapolateLeft: "clamp",
31
+ extrapolateRight: "clamp",
32
+ });
33
+
34
+ // Horizontal flow
35
+ const moveX = ((local * l.speedX + l.phase) % 120) - 10;
36
+
37
+ // Gentle vertical float
38
+ const moveY =
39
+ l.y +
40
+ Math.sin((local + l.phase) / 40) * 20 +
41
+ local * l.speedY;
42
+
43
+ // Rotation
44
+ const rotate = Math.sin((local + l.phase) / 30) * 25;
45
+
46
+ return (
47
+ <div
48
+ key={i}
49
+ style={{
50
+ position: "absolute",
51
+ left: `${moveX}%`,
52
+ top: `${moveY % 110}%`,
53
+ fontSize: l.size,
54
+ opacity: appear,
55
+ transform: `
56
+ translate(-50%, -50%)
57
+ rotate(${rotate}deg)
58
+ `,
59
+ pointerEvents: "none",
60
+ }}
61
+ >
62
+ 🍁
63
+ </div>
64
+ );
65
+ })}
66
+ </>
67
+ );
68
+ };
@@ -46,7 +46,7 @@ export const Butterflies20012026 = ({ frame, fps, width, height }) => {
46
46
  return (
47
47
  <Img
48
48
  key={i}
49
- src={staticFile("video-images/20012026-butterfly.png")}
49
+ src={staticFile("video-images/20012026-butterfly.webp")}
50
50
  style={{
51
51
  position: "absolute",
52
52
  left: x,
@@ -0,0 +1,45 @@
1
+ import React from "react";
2
+ import {
3
+ AbsoluteFill,
4
+ interpolate,
5
+ useCurrentFrame,
6
+ Easing,
7
+ } from "remotion";
8
+
9
+ export const CornerFlipTransition = ({ children, duration }) => {
10
+ const frame = useCurrentFrame();
11
+
12
+ // Smooth cinematic progress
13
+ const p = interpolate(frame, [0, duration], [0, 1], {
14
+ easing: Easing.inOut(Easing.cubic),
15
+ extrapolateLeft: "clamp",
16
+ extrapolateRight: "clamp",
17
+ });
18
+
19
+ // Softer motion values
20
+ const rotateY = interpolate(p, [0, 1], [55, 0]);
21
+ const rotateX = interpolate(p, [0, 1], [10, 0]);
22
+ const move = interpolate(p, [0, 1], [160, 0]);
23
+ const opacity = interpolate(p, [0, 0.2, 1], [0, 1, 1]);
24
+ const shadow = interpolate(p, [0, 1], [0, 40]);
25
+
26
+ return (
27
+ <AbsoluteFill
28
+ style={{
29
+ opacity,
30
+ transformOrigin: "100% 100%",
31
+ transform: `
32
+ perspective(1600px)
33
+ rotateY(${rotateY}deg)
34
+ rotateX(${rotateX}deg)
35
+ translateX(${move}px)
36
+ translateY(${move}px)
37
+ scale(${0.95 + p * 0.05})
38
+ `,
39
+ boxShadow: `0 0 ${shadow}px rgba(0,0,0,${0.3 * p})`,
40
+ }}
41
+ >
42
+ {children}
43
+ </AbsoluteFill>
44
+ );
45
+ };
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import {
3
+ Img,
4
+ staticFile,
5
+ useCurrentFrame,
6
+ useVideoConfig,
7
+ interpolate,
8
+ } from "remotion";
9
+
10
+ export const DucksFrame05022026 = () => {
11
+ const frame = useCurrentFrame();
12
+ const { fps } = useVideoConfig();
13
+
14
+ // Horizontal swim
15
+ const swim = interpolate(frame, [0, fps * 8], [300, 0], {
16
+ extrapolateRight: "wrap",
17
+ });
18
+
19
+ // Water bob
20
+ const bob = Math.sin(frame / 12) * 6;
21
+
22
+ // Tiny tilt
23
+ const tilt = Math.sin(frame / 20) * 2;
24
+
25
+ return (
26
+ <Img
27
+ src={staticFile("video-images/05022026-Duck.webp")}
28
+ style={{
29
+ position: "absolute",
30
+ bottom: "-5%",
31
+ left: swim,
32
+ height: "55%", // ✅ control by height
33
+ width: "auto",
34
+ transform: `translateY(${bob}px) rotate(${tilt}deg)`,
35
+ }}
36
+ />
37
+ );
38
+ };
@@ -0,0 +1,70 @@
1
+ import React from "react";
2
+ import {
3
+ AbsoluteFill,
4
+ Img,
5
+ useCurrentFrame,
6
+ useVideoConfig,
7
+ interpolate,
8
+ staticFile,
9
+ } from "remotion";
10
+
11
+ const Flower = ({ side = "left", delay = 0, xOffset = 0, yOffset = 0 }) => {
12
+ const frame = useCurrentFrame();
13
+ const { height } = useVideoConfig();
14
+
15
+ const localFrame = Math.max(frame - delay, 0) % 240;
16
+
17
+ // Bottom → Top with Y offset
18
+ const top = interpolate(
19
+ localFrame,
20
+ [0, 240],
21
+ [height + 200 + yOffset, -200 + yOffset]
22
+ );
23
+
24
+ const swing = Math.sin(frame / 20) * 10;
25
+
26
+ return (
27
+ <Img
28
+ src={staticFile("video-images/05022026-Flower.webp")}
29
+ style={{
30
+ position: "absolute",
31
+ top,
32
+ width: 70,
33
+
34
+ left: side === "left" ? 20 + xOffset + swing : undefined,
35
+ right: side === "right" ? 20 + xOffset + swing : undefined,
36
+ }}
37
+ />
38
+ );
39
+ };
40
+
41
+ export const FloatingFlowersBottom = () => {
42
+ return (
43
+ <AbsoluteFill>
44
+ {/* LEFT */}
45
+ <Flower side="left" delay={0} xOffset={0} yOffset={0} />
46
+ <Flower side="left" delay={0} xOffset={50} yOffset={50} />
47
+ <Flower side="left" delay={40} xOffset={20} yOffset={0} />
48
+ <Flower side="left" delay={40} xOffset={70} yOffset={50} />
49
+ <Flower side="left" delay={80} xOffset={40} yOffset={0} />
50
+ <Flower side="left" delay={80} xOffset={90} yOffset={50} />
51
+ <Flower side="left" delay={120} xOffset={60} yOffset={0} />
52
+ <Flower side="left" delay={120} xOffset={110} yOffset={50} />
53
+ <Flower side="left" delay={160} xOffset={80} yOffset={0} />
54
+ <Flower side="left" delay={160} xOffset={130} yOffset={50} />
55
+
56
+ {/* RIGHT */}
57
+ <Flower side="right" delay={10} xOffset={0} yOffset={0} />
58
+ <Flower side="right" delay={10} xOffset={50} yOffset={50} />
59
+ <Flower side="right" delay={50} xOffset={20} yOffset={0} />
60
+ <Flower side="right" delay={50} xOffset={70} yOffset={50} />
61
+ <Flower side="right" delay={90} xOffset={40} yOffset={0} />
62
+ <Flower side="right" delay={90} xOffset={90} yOffset={50} />
63
+ <Flower side="right" delay={130} xOffset={60} yOffset={0} />
64
+ <Flower side="right" delay={130} xOffset={110} yOffset={50} />
65
+ <Flower side="right" delay={170} xOffset={80} yOffset={0} />
66
+ <Flower side="right" delay={170} xOffset={130} yOffset={50} />
67
+ </AbsoluteFill>
68
+ );
69
+ };
70
+
@@ -0,0 +1,114 @@
1
+ import React from "react";
2
+ import {
3
+ Img,
4
+ staticFile,
5
+ useCurrentFrame,
6
+ useVideoConfig,
7
+ interpolate,
8
+ Easing,
9
+ } from "remotion";
10
+
11
+ export const FlowerReveal_TL_BR_28012026 = ({ startAfter = 0 }) => {
12
+ const frame = useCurrentFrame();
13
+ const { fps } = useVideoConfig();
14
+
15
+ const delayFrames = fps * startAfter;
16
+ const bloomDuration = fps * 2.5; // 🌸 slower cinematic bloom
17
+ const localFrame = frame - delayFrames;
18
+
19
+ const progress = interpolate(localFrame, [0, bloomDuration], [0, 1], {
20
+ extrapolateRight: "clamp",
21
+ easing: Easing.out(Easing.cubic),
22
+ });
23
+
24
+ // 🌿 Opacity
25
+ const opacity = interpolate(localFrame, [0, bloomDuration * 0.5], [0, 1], {
26
+ extrapolateLeft: "clamp",
27
+ extrapolateRight: "clamp",
28
+ });
29
+
30
+ // 🌷 Scale
31
+ const scale = interpolate(localFrame, [0, bloomDuration], [0.6, 1], {
32
+ extrapolateLeft: "clamp",
33
+ extrapolateRight: "clamp",
34
+ easing: Easing.out(Easing.cubic),
35
+ });
36
+
37
+ // 🌺 Gentle settle
38
+ const settle = interpolate(
39
+ localFrame,
40
+ [bloomDuration * 0.7, bloomDuration],
41
+ [1.04, 1],
42
+ {
43
+ extrapolateRight: "clamp",
44
+ }
45
+ );
46
+
47
+ // 🍃 Slide in from corners
48
+ const slideTLX = interpolate(localFrame, [0, bloomDuration], [-180, 0], {
49
+ extrapolateRight: "clamp",
50
+ easing: Easing.out(Easing.cubic),
51
+ });
52
+
53
+ const slideTLY = interpolate(localFrame, [0, bloomDuration], [-180, 0], {
54
+ extrapolateRight: "clamp",
55
+ easing: Easing.out(Easing.cubic),
56
+ });
57
+
58
+ const slideBRX = interpolate(localFrame, [0, bloomDuration], [180, 0], {
59
+ extrapolateRight: "clamp",
60
+ easing: Easing.out(Easing.cubic),
61
+ });
62
+
63
+ const slideBRY = interpolate(localFrame, [0, bloomDuration], [180, 0], {
64
+ extrapolateRight: "clamp",
65
+ easing: Easing.out(Easing.cubic),
66
+ });
67
+
68
+ // 🌿 Organic sway
69
+ const swing = Math.sin(frame / 18) * 0.6;
70
+
71
+ const finalScale = scale * settle;
72
+
73
+ return (
74
+ <>
75
+ {/* 🌸 TOP LEFT */}
76
+ <Img
77
+ src={staticFile("video-images/28012026-TopLeftFlower.webp")}
78
+ style={{
79
+ position: "absolute",
80
+ top: "-170px",
81
+ left: "-50px",
82
+ width: "100%",
83
+ opacity,
84
+ transformOrigin: "top left",
85
+ transform: `
86
+ translate(${slideTLX}px, ${slideTLY}px)
87
+ scale(${finalScale})
88
+ rotate(${-swing}deg)
89
+ `,
90
+ pointerEvents: "none",
91
+ }}
92
+ />
93
+
94
+ {/* 🌸 BOTTOM RIGHT */}
95
+ <Img
96
+ src={staticFile("video-images/28012026-BottomRightFlower.webp")}
97
+ style={{
98
+ position: "absolute",
99
+ bottom: "-300px",
100
+ right: -10,
101
+ width: "100%",
102
+ opacity,
103
+ transformOrigin: "bottom right",
104
+ transform: `
105
+ translate(${slideBRX}px, ${slideBRY}px)
106
+ scale(${finalScale})
107
+ rotate(${swing}deg)
108
+ `,
109
+ pointerEvents: "none",
110
+ }}
111
+ />
112
+ </>
113
+ );
114
+ };
@@ -0,0 +1,116 @@
1
+ import React from "react";
2
+ import {
3
+ Img,
4
+ staticFile,
5
+ useCurrentFrame,
6
+ useVideoConfig,
7
+ interpolate,
8
+ Easing,
9
+ } from "remotion";
10
+
11
+ export const FlowerReveal_TR_BL_28012026 = () => {
12
+ const frame = useCurrentFrame();
13
+ const { fps } = useVideoConfig();
14
+
15
+ const bloomDuration = fps * 2.5;
16
+
17
+ // Main bloom progress
18
+ const progress = interpolate(frame, [0, bloomDuration], [0, 1], {
19
+ extrapolateRight: "clamp",
20
+ easing: Easing.out(Easing.quad),
21
+ });
22
+
23
+ // 🌿 Opacity
24
+ const opacity = interpolate(frame, [0, bloomDuration * 0.4], [0, 1], {
25
+ extrapolateRight: "clamp",
26
+ });
27
+
28
+ // Bloom scale (petal opening feel)
29
+ const scale = interpolate(
30
+ frame,
31
+ [0, bloomDuration * 0.7, bloomDuration],
32
+ [0.4, 1.05, 1],
33
+ {
34
+ extrapolateRight: "clamp",
35
+ easing: Easing.out(Easing.cubic),
36
+ }
37
+ );
38
+
39
+ // 🌺 Soft settle
40
+ const settle = interpolate(
41
+ frame,
42
+ [bloomDuration * 0.7, bloomDuration],
43
+ [1.04, 1],
44
+ {
45
+ extrapolateRight: "clamp",
46
+ }
47
+ );
48
+
49
+ // 🍃 Slide positions
50
+ const slideTRX = interpolate(frame, [0, bloomDuration], [180, 0], {
51
+ extrapolateRight: "clamp",
52
+ easing: Easing.out(Easing.cubic),
53
+ });
54
+
55
+ const slideTRY = interpolate(frame, [0, bloomDuration], [-180, 0], {
56
+ extrapolateRight: "clamp",
57
+ easing: Easing.out(Easing.cubic),
58
+ });
59
+
60
+ const slideBLX = interpolate(frame, [0, bloomDuration], [-180, 0], {
61
+ extrapolateRight: "clamp",
62
+ easing: Easing.out(Easing.cubic),
63
+ });
64
+
65
+ const slideBLY = interpolate(frame, [0, bloomDuration], [180, 0], {
66
+ extrapolateRight: "clamp",
67
+ easing: Easing.out(Easing.cubic),
68
+ });
69
+
70
+ // 🌿 Gentle sway
71
+ const swing = Math.sin(frame / 18) * 0.6;
72
+
73
+ const finalScale = scale * settle;
74
+
75
+ return (
76
+ <>
77
+ {/* 🌸 TOP RIGHT */}
78
+ <Img
79
+ src={staticFile("video-images/28012026-TopRightFlower.webp")}
80
+ style={{
81
+ position: "absolute",
82
+ top: "-130px",
83
+ right: 0,
84
+ width: "55%",
85
+ opacity,
86
+ transformOrigin: "top right",
87
+ transform: `
88
+ translate(${slideTRX}px, ${slideTRY}px)
89
+ scale(${finalScale})
90
+ rotate(${swing}deg)
91
+ `,
92
+ pointerEvents: "none",
93
+ }}
94
+ />
95
+
96
+ {/* 🌸 BOTTOM LEFT */}
97
+ <Img
98
+ src={staticFile("video-images/28012026-BottomLeftFlower.webp")}
99
+ style={{
100
+ position: "absolute",
101
+ bottom: "-250px",
102
+ left: "-80px",
103
+ width: "100%",
104
+ opacity,
105
+ transformOrigin: "bottom left",
106
+ transform: `
107
+ translate(${slideBLX}px, ${slideBLY}px)
108
+ scale(${finalScale})
109
+ rotate(${-swing}deg)
110
+ `,
111
+ pointerEvents: "none",
112
+ }}
113
+ />
114
+ </>
115
+ );
116
+ };
@@ -0,0 +1,95 @@
1
+ import React from "react";
2
+ import {
3
+ Img,
4
+ staticFile,
5
+ useCurrentFrame,
6
+ useVideoConfig,
7
+ interpolate,
8
+ Easing,
9
+ } from "remotion";
10
+
11
+ export const GaneshBorder28012026 = () => {
12
+ const frame = useCurrentFrame();
13
+ const { fps } = useVideoConfig();
14
+
15
+ const borderDelay = fps * 0.5; // 0.5 second delay
16
+
17
+ const borderProgress = interpolate(
18
+ frame,
19
+ [borderDelay, borderDelay + fps * 3],
20
+ [0, 1],
21
+ {
22
+ extrapolateLeft: "clamp",
23
+ extrapolateRight: "clamp",
24
+ easing: Easing.out(Easing.cubic),
25
+ }
26
+ );
27
+
28
+
29
+ const borderScale = interpolate(borderProgress, [0, 1], [0.9, 1]);
30
+ const borderOpacity = borderProgress;
31
+
32
+ const ganeshProgress = interpolate(
33
+ frame,
34
+ [fps * 0.5, fps * 2.5],
35
+ [0, 1],
36
+ {
37
+ extrapolateLeft: "clamp",
38
+ extrapolateRight: "clamp",
39
+ easing: Easing.inOut(Easing.cubic),
40
+ }
41
+ );
42
+
43
+ const ganeshScale = interpolate(ganeshProgress, [0, 1], [0.45, 1]);
44
+ const ganeshOpacity = ganeshProgress;
45
+
46
+ /* 🌿 Gentle border rotation */
47
+ // const rotate = Math.max(0, frame - delayFrames) * 0.20;
48
+ const rotate = frame * 0.15;
49
+ return (
50
+ <div
51
+ style={{
52
+ position: "absolute",
53
+ top: "10%",
54
+ width: "100%",
55
+ display: "flex",
56
+ justifyContent: "center",
57
+ pointerEvents: "none",
58
+ zIndex: 2,
59
+ }}
60
+ >
61
+ <div style={{ width: "100%", position: "relative" }}>
62
+ {/* 🌸 BORDER */}
63
+ <Img
64
+ src={staticFile("video-images/28012026-FlowerBorder.webp")}
65
+ style={{
66
+ width: "100%",
67
+ transformOrigin: "50% 50%",
68
+ opacity: borderOpacity,
69
+ transform: `
70
+ scale(${borderScale})
71
+ rotate(${rotate}deg)
72
+ `,
73
+ }}
74
+ />
75
+
76
+ {/* 🕉 GANESH SMOOTH ENTRY */}
77
+ <Img
78
+ src={staticFile("video-images/28012026-Ganesh.webp")}
79
+ style={{
80
+ position: "absolute",
81
+ left: "53%",
82
+ top: "45%",
83
+ width: "55%",
84
+ opacity: ganeshOpacity,
85
+ transformOrigin: "50% 50%",
86
+ transform: `
87
+ translate(-50%, -50%)
88
+ scale(${ganeshScale})
89
+ `,
90
+ }}
91
+ />
92
+ </div>
93
+ </div>
94
+ );
95
+ };