@titas_mallick/wedding-site-gen 1.0.0

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 (141) hide show
  1. package/.eslintignore +20 -0
  2. package/.eslintrc.json +93 -0
  3. package/.recover +9 -0
  4. package/.vscode/settings.json +3 -0
  5. package/LICENSE +21 -0
  6. package/README.md +83 -0
  7. package/app/Neo-Lucentism/layout.tsx +7 -0
  8. package/app/Neo-Lucentism/page.tsx +259 -0
  9. package/app/couple/layout.tsx +7 -0
  10. package/app/couple/page.tsx +164 -0
  11. package/app/error.tsx +31 -0
  12. package/app/guestbook/page.tsx +470 -0
  13. package/app/invitation/[slug]/layout.tsx +36 -0
  14. package/app/invitation/[slug]/page.tsx +462 -0
  15. package/app/invitation/maker/auth.js +165 -0
  16. package/app/invitation/maker/dashboard.js +81 -0
  17. package/app/invitation/maker/guestAdder.js +204 -0
  18. package/app/invitation/maker/guestShower.js +287 -0
  19. package/app/invitation/maker/layout.tsx +11 -0
  20. package/app/invitation/maker/page.js +168 -0
  21. package/app/invitation/maker/rsvpViewer.js +122 -0
  22. package/app/layout.tsx +98 -0
  23. package/app/mark-the-dates/layout.tsx +7 -0
  24. package/app/mark-the-dates/page.tsx +196 -0
  25. package/app/memories/layout.tsx +7 -0
  26. package/app/memories/page.tsx +29 -0
  27. package/app/page.tsx +5 -0
  28. package/app/providers.tsx +33 -0
  29. package/app/sagun/layout.tsx +7 -0
  30. package/app/sagun/page.tsx +348 -0
  31. package/app/song-requests/page.tsx +354 -0
  32. package/app/sukanya/layout.tsx +7 -0
  33. package/app/sukanya/page.tsx +167 -0
  34. package/app/titas/layout.tsx +7 -0
  35. package/app/titas/page.tsx +175 -0
  36. package/app/travel-guide/page.tsx +400 -0
  37. package/app/updates/maker/page.js +323 -0
  38. package/app/updates/overlay/page.tsx +144 -0
  39. package/app/updates/page.js +207 -0
  40. package/cli.mjs +196 -0
  41. package/components/ConciergeBot.tsx +203 -0
  42. package/components/CountdownTimer.tsx +137 -0
  43. package/components/Gallery.tsx +372 -0
  44. package/components/LiveVideos.tsx +173 -0
  45. package/components/OurStory.tsx +160 -0
  46. package/components/certificate.jsx +300 -0
  47. package/components/counter.tsx +14 -0
  48. package/components/footer.tsx +89 -0
  49. package/components/hero.tsx +136 -0
  50. package/components/icons.tsx +283 -0
  51. package/components/importantNews.js +168 -0
  52. package/components/navbar.tsx +106 -0
  53. package/components/primitives.ts +53 -0
  54. package/components/sagun.js +22 -0
  55. package/components/theme-switch.tsx +81 -0
  56. package/components/updates.tsx +118 -0
  57. package/components/weddingcard.js +68 -0
  58. package/components/weddingcard2.js +58 -0
  59. package/config/firebase-admin.js +17 -0
  60. package/config/firebase.ts +36 -0
  61. package/config/fonts.ts +21 -0
  62. package/config/site.ts +74 -0
  63. package/next-env.d.ts +6 -0
  64. package/next.config.js +4 -0
  65. package/package.json +64 -0
  66. package/postcss.config.js +6 -0
  67. package/public/DCV.gif +0 -0
  68. package/public/DCV2.gif +0 -0
  69. package/public/DCV3.gif +0 -0
  70. package/public/Images/1.jpg +0 -0
  71. package/public/Images/11.jpg +0 -0
  72. package/public/Images/12.jpg +0 -0
  73. package/public/Images/13.jpg +0 -0
  74. package/public/Images/14.jpg +0 -0
  75. package/public/Images/15.jpg +0 -0
  76. package/public/Images/16.jpg +0 -0
  77. package/public/Images/17.jpg +0 -0
  78. package/public/Images/18.jpg +0 -0
  79. package/public/Images/19.jpg +0 -0
  80. package/public/Images/2.jpg +0 -0
  81. package/public/Images/20.jpg +0 -0
  82. package/public/Images/21.jpg +0 -0
  83. package/public/Images/22.jpg +0 -0
  84. package/public/Images/3.jpg +0 -0
  85. package/public/Images/4.jpg +0 -0
  86. package/public/Images/5.jpg +0 -0
  87. package/public/Images/6.jpg +0 -0
  88. package/public/Images/7.jpg +0 -0
  89. package/public/Images/8.jpg +0 -0
  90. package/public/Images/9.jpg +0 -0
  91. package/public/Images/9b.jpg +0 -0
  92. package/public/Images/Patipatra.jpeg +0 -0
  93. package/public/audio (1).mp3 +0 -0
  94. package/public/audio (2).mp3 +0 -0
  95. package/public/bride.jpg +0 -0
  96. package/public/corner1-01.svg +1 -0
  97. package/public/favicon.ico +0 -0
  98. package/public/groom.jpg +0 -0
  99. package/public/invite.png +0 -0
  100. package/public/love-birds.png +0 -0
  101. package/public/next.svg +1 -0
  102. package/public/pubqr.png +0 -0
  103. package/public/pw/001.jpg +0 -0
  104. package/public/pw/002.jpg +0 -0
  105. package/public/pw/003.jpg +0 -0
  106. package/public/pw/004.jpg +0 -0
  107. package/public/pw/005.jpg +0 -0
  108. package/public/pw/006.jpg +0 -0
  109. package/public/pw/007.jpg +0 -0
  110. package/public/pw/008.jpg +0 -0
  111. package/public/pw/009.jpg +0 -0
  112. package/public/pw/010.jpg +0 -0
  113. package/public/pw/011.jpg +0 -0
  114. package/public/pw/012.jpg +0 -0
  115. package/public/pw/013.jpg +0 -0
  116. package/public/pw/014.jpg +0 -0
  117. package/public/pw/015.jpg +0 -0
  118. package/public/pw/016.jpg +0 -0
  119. package/public/pw/017.jpg +0 -0
  120. package/public/pw/018.jpg +0 -0
  121. package/public/pw/019.jpg +0 -0
  122. package/public/pw/020.jpg +0 -0
  123. package/public/pw/021.jpg +0 -0
  124. package/public/pw/022.jpg +0 -0
  125. package/public/pw/023.jpg +0 -0
  126. package/public/pw/024.jpg +0 -0
  127. package/public/pw/025.jpg +0 -0
  128. package/public/pw/026.jpg +0 -0
  129. package/public/pw/027.jpg +0 -0
  130. package/public/pw/028.jpg +0 -0
  131. package/public/pw/029.jpg +0 -0
  132. package/public/pw/030.jpg +0 -0
  133. package/public/pw/031.jpg +0 -0
  134. package/public/pw/032.jpg +0 -0
  135. package/public/qr.png +0 -0
  136. package/public/vercel.svg +1 -0
  137. package/styles/globals.css +3 -0
  138. package/tailwind.config.js +51 -0
  139. package/tsconfig.json +45 -0
  140. package/tsconfig.tsbuildinfo +1 -0
  141. package/types/index.ts +5 -0
@@ -0,0 +1,372 @@
1
+ "use client";
2
+
3
+ import { Card, CardHeader, CardFooter, Image } from "@heroui/react";
4
+
5
+ import { fontSans, fontCursive } from "@/config/fonts";
6
+
7
+ const images = [
8
+ {
9
+ src: "/Images/1.jpg",
10
+ alt: "In tuition back in 2016",
11
+ description: "One of our first pictures together.",
12
+ width: 1200,
13
+ height: 800,
14
+ label: "2016",
15
+ },
16
+ {
17
+ src: "/Images/2.jpg",
18
+ alt: "Getting slightly close together",
19
+ description: "Tried makeing a film together back then, but it was a flop.",
20
+ width: 1200,
21
+ height: 800,
22
+ label: "2016",
23
+ },
24
+ {
25
+ src: "/Images/3.jpg",
26
+ alt: "Our College Days",
27
+ description: "Hazy, but beautiful memories.",
28
+ width: 1200,
29
+ height: 800,
30
+ label: "2016",
31
+ },
32
+ {
33
+ src: "/Images/4.jpg",
34
+ alt: "Our College Excursion",
35
+ description: "Something happened that day, did not know it was love.",
36
+ width: 1200,
37
+ height: 800,
38
+ label: "2016",
39
+ },
40
+ {
41
+ src: "/Images/5.jpg",
42
+ alt: "Getting back from the Excursion",
43
+ description: "I may have fallen for her till then.",
44
+ width: 1200,
45
+ height: 800,
46
+ label: "2016",
47
+ },
48
+ {
49
+ src: "/Images/6.jpg",
50
+ alt: "In Kolakham",
51
+ description:
52
+ "This picture has so many stories attatched to it. Maybe one day.",
53
+ width: 1200,
54
+ height: 800,
55
+ label: "2016",
56
+ },
57
+ {
58
+ src: "/Images/7.jpg",
59
+ alt: "Last few days of college",
60
+ description: "We were still not sure about our feelings.",
61
+ width: 1200,
62
+ height: 800,
63
+ label: "2017",
64
+ },
65
+ {
66
+ src: "/Images/8.jpg",
67
+ alt: "College ended in a blink",
68
+ description: "We were sure about our feelings, but not about our future.",
69
+ width: 1200,
70
+ height: 800,
71
+ label: "2017",
72
+ },
73
+ {
74
+ src: "/Images/9.jpg",
75
+ alt: "University Days",
76
+ description:
77
+ "The days of our lives were getting busier, but we were still together.",
78
+ width: 1200,
79
+ height: 800,
80
+ label: "2018",
81
+ },
82
+ {
83
+ src: "/Images/9b.jpg",
84
+ alt: "We were sure about our future",
85
+ description: "We knew now a common path leads to the destination.",
86
+ width: 1200,
87
+ height: 800,
88
+ label: "2018",
89
+ },
90
+ {
91
+ src: "/Images/11.jpg",
92
+ alt: "Eventually, the university days ended",
93
+ description: "We grew together, and so did our love.",
94
+ width: 1200,
95
+ height: 800,
96
+ label: "2019",
97
+ },
98
+ {
99
+ src: "/Images/12.jpg",
100
+ alt: "We never counted the days",
101
+ description: "We just lived them.",
102
+ width: 1200,
103
+ height: 800,
104
+ label: "2020",
105
+ },
106
+ {
107
+ src: "/Images/13.jpg",
108
+ alt: "Our FoodyCouple days",
109
+ description: "Belive us or not, we were famous online for a while.",
110
+ width: 1200,
111
+ height: 800,
112
+ label: "2021",
113
+ },
114
+ {
115
+ src: "/Images/14.jpg",
116
+ alt: "Our exploration days began",
117
+ description:
118
+ "We had entered a new phase of the relationship, one which gets pleased by the mountains and seas.",
119
+ width: 1200,
120
+ height: 800,
121
+ label: "2021",
122
+ },
123
+ {
124
+ src: "/Images/15.jpg",
125
+ alt: "The buzz of the city",
126
+ description: "Kolkata, a major city that nourishes our love.",
127
+ width: 1200,
128
+ height: 800,
129
+ label: "2022",
130
+ },
131
+ {
132
+ src: "/Images/16.jpg",
133
+ alt: "Ahh, the mountains",
134
+ description: "Another part of the story begins here.",
135
+ width: 1200,
136
+ height: 800,
137
+ label: "2023",
138
+ },
139
+ {
140
+ src: "/Images/17.jpg",
141
+ alt: "We were full blown mountain-holics",
142
+ description: "Once we started, we could not stop.",
143
+ width: 1200,
144
+ height: 800,
145
+ label: "2024",
146
+ },
147
+ {
148
+ src: "/Images/18.jpg",
149
+ alt: "The Proposal",
150
+ description:
151
+ "After all the adventures, we finally decided to take the next step.",
152
+ width: 1200,
153
+ height: 800,
154
+ label: "2025",
155
+ },
156
+ ];
157
+
158
+ const pwImages = Array.from({ length: 32 }, (_, i) => {
159
+ const num = String(i + 1).padStart(3, "0");
160
+
161
+ return {
162
+ src: `/pw/${num}.jpg`,
163
+ alt: `Memory ${num}`,
164
+ description: `A cherished moment number ${num}.`,
165
+ width: 1200,
166
+ height: 800,
167
+ label: "Pre-Wedding",
168
+ };
169
+ });
170
+
171
+ export default function Gallery() {
172
+ return (
173
+ <div className="container mx-auto max-w-7xl px-4">
174
+ <div className="max-w-3xl mx-auto mb-16 text-center">
175
+ <p
176
+ className={`${fontSans.className} text-lg md:text-xl leading-relaxed text-default-800 dark:text-gray-100`}
177
+ >
178
+ This is our journey from 2016 into the unfolding future. Fueled by a
179
+ quiet juvenoia, we found ourselves drawn more to the nostalgia of the
180
+ past than the immediacy of the present — choosing frames that echo
181
+ where we began rather than where we stand.
182
+ </p>
183
+ </div>
184
+
185
+ {/* Pre-Wedding Video */}
186
+ <section className="w-full py-10 flex flex-col items-center gap-8 mb-16">
187
+ <h3
188
+ className={`${fontCursive.className} text-4xl md:text-5xl text-center text-wedding-gold-600 dark:text-wedding-gold-400`}
189
+ >
190
+ Our Pre-Wedding Video
191
+ </h3>
192
+ <div className="w-full max-w-4xl aspect-video rounded-2xl overflow-hidden shadow-2xl border-4 border-white dark:border-white/10">
193
+ <iframe
194
+ allowFullScreen
195
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
196
+ className="w-full h-full"
197
+ referrerPolicy="strict-origin-when-cross-origin"
198
+ src="https://www.youtube.com/embed/a_RV8HevyBE"
199
+ title="... For . Life"
200
+ />
201
+ </div>
202
+ </section>
203
+
204
+ {/* Pre-Wedding Photos */}
205
+ <section className="mb-20">
206
+ <div className="flex items-center justify-center mb-10">
207
+ <h3
208
+ className={`${fontCursive.className} text-4xl md:text-5xl text-center text-wedding-pink-600 dark:text-wedding-pink-400`}
209
+ >
210
+ The Pre-Wedding
211
+ </h3>
212
+ </div>
213
+
214
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
215
+ {pwImages.map((img, index) => (
216
+ <Card
217
+ key={index}
218
+ className="w-full aspect-[4/5] border-none shadow-lg hover:shadow-xl transition-shadow duration-300"
219
+ >
220
+ <CardHeader className="absolute z-10 top-2 left-2 flex-col items-start p-0">
221
+ <div className="bg-black/40 backdrop-blur-md px-3 py-1 rounded-lg">
222
+ <p className="text-tiny text-white/90 uppercase font-bold tracking-wider">
223
+ {img.label}
224
+ </p>
225
+ </div>
226
+ </CardHeader>
227
+
228
+ <Image
229
+ removeWrapper
230
+ alt={img.alt}
231
+ className="z-0 w-full h-full object-cover hover:scale-105 transition-transform duration-700"
232
+ src={img.src}
233
+ />
234
+
235
+ <CardFooter className="absolute bottom-0 z-10 bg-gradient-to-t from-black/80 via-black/40 to-transparent w-full p-4 pt-12">
236
+ <p
237
+ className={`${fontSans.className} text-white/90 text-sm font-medium`}
238
+ >
239
+ {img.description}
240
+ </p>
241
+ </CardFooter>
242
+ </Card>
243
+ ))}
244
+ </div>
245
+ </section>
246
+
247
+ {/* The Memories */}
248
+ <section className="mb-20">
249
+ <div className="flex items-center justify-center mb-10">
250
+ <h3
251
+ className={`${fontCursive.className} text-4xl md:text-5xl text-center text-wedding-pink-600 dark:text-wedding-pink-400`}
252
+ >
253
+ The Memories
254
+ </h3>
255
+ </div>
256
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
257
+ {images.map((img, index) => (
258
+ <Card
259
+ key={index}
260
+ className="w-full aspect-[4/5] border-none shadow-lg hover:shadow-xl transition-shadow duration-300"
261
+ >
262
+ <CardHeader className="absolute z-10 top-2 left-2 flex-col items-start p-0">
263
+ <div className="bg-black/40 backdrop-blur-md px-3 py-1 rounded-lg">
264
+ <p className="text-tiny text-white/90 uppercase font-bold tracking-wider">
265
+ {img.label}
266
+ </p>
267
+ </div>
268
+ </CardHeader>
269
+
270
+ <Image
271
+ removeWrapper
272
+ alt={img.alt}
273
+ className="z-0 w-full h-full object-cover hover:scale-105 transition-transform duration-700"
274
+ src={img.src}
275
+ />
276
+
277
+ <CardFooter className="absolute bottom-0 z-10 bg-gradient-to-t from-black/80 via-black/40 to-transparent w-full p-4 pt-12 text-left">
278
+ <div>
279
+ <h4 className="text-white font-bold text-lg mb-1 drop-shadow-md">
280
+ {img.alt}
281
+ </h4>
282
+ <p className={`${fontSans.className} text-white/80 text-sm`}>
283
+ {img.description}
284
+ </p>
285
+ </div>
286
+ </CardFooter>
287
+ </Card>
288
+ ))}
289
+ </div>
290
+ </section>
291
+
292
+ {/* Videos Section */}
293
+ <section className="grid md:grid-cols-2 gap-8 mb-20">
294
+ <div className="flex flex-col items-center gap-6">
295
+ <h3
296
+ className={`${fontCursive.className} text-3xl text-center text-wedding-pink-600 dark:text-wedding-pink-400`}
297
+ >
298
+ The Proposal
299
+ </h3>
300
+ <div className="w-full aspect-video rounded-xl overflow-hidden shadow-lg border border-default-200 dark:border-default-800">
301
+ <iframe
302
+ allowFullScreen
303
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
304
+ className="w-full h-full"
305
+ referrerPolicy="strict-origin-when-cross-origin"
306
+ src="https://www.youtube.com/embed/F1fJ9kvXvPQ"
307
+ title="And... I asked Her..."
308
+ />
309
+ </div>
310
+ </div>
311
+
312
+ <div className="flex flex-col items-center gap-6">
313
+ <h3
314
+ className={`${fontCursive.className} text-3xl text-center text-wedding-pink-600 dark:text-wedding-pink-400`}
315
+ >
316
+ Our Theme Song
317
+ </h3>
318
+ <div className="w-full aspect-video rounded-xl overflow-hidden shadow-lg border border-default-200 dark:border-default-800">
319
+ <iframe
320
+ allowFullScreen
321
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
322
+ className="w-full h-full"
323
+ referrerPolicy="strict-origin-when-cross-origin"
324
+ src="https://www.youtube.com/embed/mzrBfpUExVM"
325
+ title="... For . Life"
326
+ />
327
+ </div>
328
+ </div>
329
+ </section>
330
+
331
+ {/* Travel Diary */}
332
+ <section className="w-full pb-10">
333
+ <h3
334
+ className={`${fontCursive.className} text-4xl md:text-5xl text-center mb-10 text-wedding-gold-600 dark:text-wedding-gold-400`}
335
+ >
336
+ Our Travel Diary
337
+ </h3>
338
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
339
+ {[
340
+ "https://www.youtube.com/embed/-LY7GQCjsJo",
341
+ "https://www.youtube.com/embed/pY8kd0KWLGo",
342
+ "https://www.youtube.com/embed/EoH4BgPsaRo",
343
+ "https://www.youtube.com/embed/8vvfKYIVdBw",
344
+ "https://www.youtube.com/embed/aSB7BP9rlC4",
345
+ "https://www.youtube.com/embed/5I9YNmre_0Q",
346
+ "https://www.youtube.com/embed/l_vWvQVCZdk",
347
+ "https://www.youtube.com/embed/qDuK8hCnvzc",
348
+ "https://www.youtube.com/embed/gF_q7YOFN1c",
349
+ "https://www.youtube.com/embed/4Yo80j89xvE",
350
+ "https://www.youtube.com/embed/UMkCb9lCY_M",
351
+ "https://www.youtube.com/embed/X-U-rSav8_s",
352
+ "https://www.youtube.com/embed/GUslhHpDtYs",
353
+ ].map((src, index) => (
354
+ <div
355
+ key={index}
356
+ className="aspect-video rounded-xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 border border-default-100 dark:border-default-800"
357
+ >
358
+ <iframe
359
+ allowFullScreen
360
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
361
+ className="w-full h-full"
362
+ referrerPolicy="strict-origin-when-cross-origin"
363
+ src={src}
364
+ title={`Travel Video ${index + 1}`}
365
+ />
366
+ </div>
367
+ ))}
368
+ </div>
369
+ </section>
370
+ </div>
371
+ );
372
+ }
@@ -0,0 +1,173 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { motion } from "framer-motion";
5
+
6
+ import { fontCursive } from "@/config/fonts";
7
+
8
+ const fadeInUp = {
9
+ initial: { opacity: 0, y: 20 },
10
+ whileInView: { opacity: 1, y: 0 },
11
+ viewport: { once: true },
12
+ transition: { duration: 0.8 },
13
+ };
14
+
15
+ const LiveVideos = () => {
16
+ const [weddingStatus, setWeddingStatus] = useState({ show: false, isLive: false });
17
+ const [receptionStatus, setReceptionStatus] = useState({ show: false, isLive: false });
18
+
19
+ useEffect(() => {
20
+ const today = new Date();
21
+ // Normalize today to start of day for accurate comparison
22
+ const startOfToday = new Date(today.getFullYear(), today.getMonth(), today.getDate());
23
+
24
+ // Dates from CountdownTimer: Wedding Jan 23, Reception Jan 25 (2026)
25
+ const weddingDate = new Date(2026, 0, 23);
26
+ const receptionDate = new Date(2026, 0, 25);
27
+
28
+ setWeddingStatus({
29
+ show: startOfToday >= weddingDate,
30
+ isLive: startOfToday.getTime() === weddingDate.getTime()
31
+ });
32
+
33
+ setReceptionStatus({
34
+ show: startOfToday >= receptionDate,
35
+ isLive: startOfToday.getTime() === receptionDate.getTime()
36
+ });
37
+ }, []);
38
+
39
+ const VideoFallback = ({ title, date }: { title: string; date: string }) => (
40
+ <div className="group relative w-full aspect-square md:aspect-video rounded-[1.5rem] md:rounded-[2rem] overflow-hidden flex flex-col items-center justify-center p-6 md:p-8 text-center border border-wedding-pink-100 dark:border-white/10 shadow-xl transition-all duration-500 hover:shadow-2xl">
41
+ {/* Background with subtle animation */}
42
+ <div className="absolute inset-0 bg-gradient-to-br from-wedding-pink-50/80 via-white to-wedding-gold-50/50 dark:from-wedding-pink-950/20 dark:via-black dark:to-wedding-gold-950/10 -z-10" />
43
+ <div className="absolute top-0 left-0 w-full h-full bg-[url('/corner1-01.svg')] opacity-[0.03] dark:opacity-[0.05] bg-cover bg-center pointer-events-none" />
44
+
45
+ {/* Animated glowing rings */}
46
+ <div className="absolute w-32 h-32 md:w-40 md:h-40 rounded-full border border-wedding-pink-200/30 dark:border-wedding-pink-500/10 animate-[ping_3s_infinite]" />
47
+ <div className="absolute w-24 h-24 md:w-32 md:h-32 rounded-full border border-wedding-gold-200/30 dark:border-wedding-gold-500/10 animate-[ping_4s_infinite]" />
48
+
49
+ <motion.div
50
+ className="relative z-10 flex flex-col items-center"
51
+ initial={{ opacity: 0, scale: 0.9 }}
52
+ whileInView={{ opacity: 1, scale: 1 }}
53
+ transition={{ duration: 0.5 }}
54
+ >
55
+ <div className="w-16 h-16 md:w-20 md:h-20 mb-4 md:mb-6 rounded-full bg-white dark:bg-zinc-900 shadow-xl flex items-center justify-center border border-wedding-pink-100 dark:border-wedding-pink-900 group-hover:scale-110 transition-transform duration-500">
56
+ <svg
57
+ className="w-8 h-8 md:w-10 md:h-10 text-wedding-pink-500 animate-pulse"
58
+ fill="none"
59
+ stroke="currentColor"
60
+ viewBox="0 0 24 24"
61
+ >
62
+ <path
63
+ d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z"
64
+ strokeLinecap="round"
65
+ strokeLinejoin="round"
66
+ strokeWidth={1.5}
67
+ />
68
+ </svg>
69
+ </div>
70
+
71
+ <h4 className={`${fontCursive.className} text-2xl md:text-4xl text-wedding-gold-600 dark:text-wedding-gold-400 mb-2 md:mb-3`}>
72
+ {title} Stream
73
+ </h4>
74
+
75
+ <div className="h-px w-16 md:w-24 bg-gradient-to-r from-transparent via-wedding-pink-200 dark:via-wedding-pink-800 to-transparent mb-3 md:mb-4" />
76
+
77
+ <p className="text-default-600 dark:text-gray-300 max-w-[240px] md:max-w-sm mx-auto leading-relaxed text-sm md:text-base">
78
+ Our hearts are filled with joy as we prepare for our big day.
79
+ </p>
80
+ <p className="mt-2 font-bold text-wedding-pink-600 dark:text-wedding-pink-400 tracking-wide uppercase text-[10px] md:text-xs">
81
+ Available on {date}
82
+ </p>
83
+
84
+ <div className="mt-6 md:mt-8 px-4 md:px-6 py-1.5 md:py-2 rounded-full border border-wedding-gold-200 dark:border-wedding-gold-800 bg-white/50 dark:bg-black/20 backdrop-blur-sm text-[9px] md:text-[10px] uppercase tracking-[0.2em] text-default-500 font-bold">
85
+ Reserved for Guests
86
+ </div>
87
+ </motion.div>
88
+ </div>
89
+ );
90
+
91
+ return (
92
+ <section className="container mx-auto px-4">
93
+ <motion.div {...fadeInUp}>
94
+ <div className="text-center mb-12">
95
+ <h2
96
+ className={`${fontCursive.className} text-5xl md:text-6xl text-wedding-gold-600 dark:text-wedding-gold-400`}
97
+ >
98
+ Live Feed
99
+ </h2>
100
+ <p className="mt-4 text-default-500 italic">
101
+ Witness our special moments from wherever you are
102
+ </p>
103
+ </div>
104
+
105
+ <div className="flex flex-col gap-16 max-w-4xl mx-auto">
106
+ {/* Wedding Video Section */}
107
+ <div className="flex flex-col items-center gap-6 w-full">
108
+ <div className="flex flex-col items-center gap-2">
109
+ {weddingStatus.isLive && (
110
+ <span className="px-3 py-1 bg-red-500 text-white text-xs font-bold rounded-full animate-pulse uppercase tracking-wider">
111
+ Live Now
112
+ </span>
113
+ )}
114
+ <h3
115
+ className={`${fontCursive.className} text-4xl text-center text-wedding-pink-600 dark:text-wedding-pink-400`}
116
+ >
117
+ The Wedding
118
+ </h3>
119
+ </div>
120
+
121
+ {weddingStatus.show ? (
122
+ <div className="w-full aspect-video rounded-2xl overflow-hidden shadow-2xl border-2 md:border-4 border-white dark:border-white/10 hover:scale-[1.01] transition-transform duration-500">
123
+ <iframe
124
+ allowFullScreen
125
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
126
+ className="w-full h-full"
127
+ referrerPolicy="strict-origin-when-cross-origin"
128
+ src="https://www.youtube.com/embed/lKZoK6F5b3I"
129
+ title="Wedding Live Stream"
130
+ />
131
+ </div>
132
+ ) : (
133
+ <VideoFallback date="January 23, 2026" title="Wedding" />
134
+ )}
135
+ </div>
136
+
137
+ {/* Reception Video Section */}
138
+ <div className="flex flex-col items-center gap-6 w-full">
139
+ <div className="flex flex-col items-center gap-2">
140
+ {receptionStatus.isLive && (
141
+ <span className="px-3 py-1 bg-red-500 text-white text-xs font-bold rounded-full animate-pulse uppercase tracking-wider">
142
+ Live Now
143
+ </span>
144
+ )}
145
+ <h3
146
+ className={`${fontCursive.className} text-4xl text-center text-wedding-pink-600 dark:text-wedding-pink-400`}
147
+ >
148
+ The Reception
149
+ </h3>
150
+ </div>
151
+
152
+ {receptionStatus.show ? (
153
+ <div className="w-full aspect-video rounded-2xl overflow-hidden shadow-2xl border-2 md:border-4 border-white dark:border-white/10 hover:scale-[1.01] transition-transform duration-500">
154
+ <iframe
155
+ allowFullScreen
156
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
157
+ className="w-full h-full"
158
+ referrerPolicy="strict-origin-when-cross-origin"
159
+ src="https://www.youtube.com/embed/bE2fxBPD5NU"
160
+ title="Reception Live Stream"
161
+ />
162
+ </div>
163
+ ) : (
164
+ <VideoFallback date="January 25, 2026" title="Reception" />
165
+ )}
166
+ </div>
167
+ </div>
168
+ </motion.div>
169
+ </section>
170
+ );
171
+ };
172
+
173
+ export default LiveVideos;