@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,175 @@
1
+ "use client";
2
+
3
+ import { Image, Button, Card, CardBody } from "@heroui/react";
4
+ import { Link } from "@heroui/link";
5
+
6
+ import { fontCursive, fontSans, fontMono } from "@/config/fonts";
7
+ import { HeartFilledIcon } from "@/components/icons";
8
+
9
+ export default function TitasPage() {
10
+ return (
11
+ <div className="w-full min-h-screen pb-20">
12
+ {/* Hero / Intro */}
13
+ <section className="relative py-16 md:py-24 px-4 bg-wedding-gold-50/50 dark:bg-wedding-pink-900/10 rounded-md">
14
+ <div className="container mx-auto max-w-6xl flex flex-col md:flex-row items-center gap-12">
15
+ {/* Image */}
16
+ <div className="w-full md:w-1/2 flex justify-center md:justify-end">
17
+ <div className="relative w-72 h-72 md:w-96 md:h-96">
18
+ <div className="absolute inset-0 bg-wedding-gold-200 dark:bg-wedding-gold-800 rounded-full blur-2xl opacity-50 transform translate-x-4 translate-y-4" />
19
+ <Image
20
+ alt="Titas Mallick"
21
+ className="rounded-full object-cover w-full h-full border-4 border-white dark:border-default-100 shadow-2xl z-10"
22
+ src="/groom.jpg"
23
+ />
24
+ </div>
25
+ </div>
26
+
27
+ {/* Text */}
28
+ <div className="w-full md:w-1/2 text-center md:text-left space-y-6">
29
+ <h1
30
+ className={`${fontCursive.className} text-6xl md:text-7xl text-wedding-gold-600 dark:text-wedding-gold-400`}
31
+ >
32
+ Titas Mallick
33
+ </h1>
34
+ <p
35
+ className={`${fontMono.className} text-xl md:text-2xl text-default-600 dark:text-white font-medium`}
36
+ >
37
+ Visionary Edupreneur &amp; Changemaker
38
+ </p>
39
+ <p
40
+ className={`${fontSans.className} text-lg text-default-700 dark:text-white leading-relaxed max-w-lg mx-auto md:mx-0`}
41
+ >
42
+ An educator by profession and a changemaker by passion.
43
+ Transforming traditional education into a holistic, value-driven
44
+ journey.
45
+ </p>
46
+ </div>
47
+ </div>
48
+ </section>
49
+
50
+ {/* Content Grid */}
51
+ <section className="container mx-auto max-w-5xl px-4 py-16 space-y-16">
52
+ {/* About */}
53
+ <div className="grid md:grid-cols-12 gap-8 items-start">
54
+ <div className="md:col-span-4">
55
+ <h2
56
+ className={`${fontCursive.className} text-4xl text-wedding-gold-500 dark:text-wedding-gold-400 md:text-right`}
57
+ >
58
+ The Journey
59
+ </h2>
60
+ </div>
61
+ <div className="md:col-span-8 space-y-4 text-default-700 dark:text-white text-lg leading-relaxed">
62
+ <p>
63
+ With over a decade of experience, I have dedicated my life to
64
+ nurturing young minds. From my roots at{" "}
65
+ <strong>Konnagar High School</strong> to achieving a state rank at{" "}
66
+ <strong>Raja Peary Mohan College</strong>
67
+ and mastering Microbiology at the{" "}
68
+ <strong>University of Calcutta</strong>, my academic path has been
69
+ driven by curiosity.
70
+ </p>
71
+ <p>
72
+ Today, I serve at <strong>Pearls Of God School</strong> and
73
+ founded <strong>EugenicsErudite</strong>, where I mentor students
74
+ to look beyond textbooks and understand the beautiful complexity
75
+ of life.
76
+ </p>
77
+ </div>
78
+ </div>
79
+
80
+ {/* Philosophy */}
81
+ <div className="grid md:grid-cols-12 gap-8 items-start">
82
+ <div className="md:col-span-4">
83
+ <h2
84
+ className={`${fontCursive.className} text-4xl text-wedding-gold-500 dark:text-wedding-gold-400 md:text-right`}
85
+ >
86
+ My Philosophy
87
+ </h2>
88
+ </div>
89
+ <div className="md:col-span-8 space-y-4 text-default-700 dark:text-white text-lg leading-relaxed">
90
+ <p>
91
+ Education is not just about grades; it&apos;s about empowerment. I
92
+ advocate for inquiry-based learning and ethical living. My
93
+ practice is grounded in creating balanced, interdisciplinary
94
+ learning environments that foster critical thinking and empathy.
95
+ </p>
96
+ </div>
97
+ </div>
98
+
99
+ {/* Interests */}
100
+ <div className="grid md:grid-cols-12 gap-8 items-start">
101
+ <div className="md:col-span-4">
102
+ <h2
103
+ className={`${fontCursive.className} text-4xl text-wedding-gold-500 dark:text-wedding-gold-400 md:text-right`}
104
+ >
105
+ Beyond Work
106
+ </h2>
107
+ </div>
108
+ <div className="md:col-span-8 space-y-4 text-default-700 dark:text-white text-lg leading-relaxed">
109
+ <p>
110
+ My mind wanders through philosophy, literature, and the quiet
111
+ wisdom of nature. I am developing{" "}
112
+ <Link
113
+ className="text-wedding-gold-600 font-bold hover:underline"
114
+ href="/Neo-Lucentism"
115
+ >
116
+ Neo-Lucentism
117
+ </Link>
118
+ , a belief system blending humanism, secular spirituality, and
119
+ optimistic nihilism.
120
+ </p>
121
+ <p>
122
+ You&apos;ll often find me exploring heritage landscapes, writing
123
+ reflectively, or simply advocating for a more mindful, ethical
124
+ world.
125
+ </p>
126
+ </div>
127
+ </div>
128
+
129
+ {/* Partner / Values */}
130
+ <div className="grid md:grid-cols-12 gap-8 items-start">
131
+ <div className="md:col-span-4">
132
+ <h2
133
+ className={`${fontCursive.className} text-4xl text-wedding-gold-500 dark:text-wedding-gold-400 md:text-right`}
134
+ >
135
+ Love & Life
136
+ </h2>
137
+ </div>
138
+ <div className="md:col-span-8 space-y-6 text-default-700 dark:text-white text-lg leading-relaxed">
139
+ <p>
140
+ I believe in a partnership rooted in intellectual resonance and
141
+ shared growth. I come from a family that values integrity and
142
+ emotional intelligence, and I sought a partner who shares this
143
+ vision.
144
+ </p>
145
+
146
+ <Card className="bg-wedding-pink-50 dark:bg-wedding-pink-900/20 border-none shadow-sm mt-6">
147
+ <CardBody className="flex flex-col md:flex-row items-center gap-6 p-6">
148
+ <HeartFilledIcon className="text-wedding-pink-500 w-12 h-12 flex-shrink-0" />
149
+ <div>
150
+ <h3
151
+ className={`${fontCursive.className} text-2xl text-wedding-pink-600 dark:text-wedding-pink-300 mb-2`}
152
+ >
153
+ My Partner
154
+ </h3>
155
+ <p className="text-default-600 dark:text-white text-sm mb-4">
156
+ I found that resonance in Sukanya—graceful, strong, and my
157
+ companion in every adventure.
158
+ </p>
159
+ <Button
160
+ as={Link}
161
+ className="bg-wedding-gold-100 text-wedding-gold-700 font-semibold hover:bg-wedding-gold-200 dark:bg-wedding-gold-500 dark:text-black dark:hover:bg-wedding-gold-400"
162
+ href="/sukanya"
163
+ size="sm"
164
+ >
165
+ Meet Sukanya
166
+ </Button>
167
+ </div>
168
+ </CardBody>
169
+ </Card>
170
+ </div>
171
+ </div>
172
+ </section>
173
+ </div>
174
+ );
175
+ }
@@ -0,0 +1,400 @@
1
+ "use client";
2
+
3
+ import { useState } from "react";
4
+ import { motion } from "framer-motion";
5
+ import {
6
+ Card,
7
+ CardBody,
8
+ Divider,
9
+ Button,
10
+ Link,
11
+ Image,
12
+ Tabs,
13
+ Tab,
14
+ Accordion,
15
+ AccordionItem
16
+ } from "@heroui/react";
17
+ import { fontCursive, fontSans, fontMono } from "@/config/fonts";
18
+ import { MapPinIcon, ClockIcon } from "@/components/icons";
19
+
20
+ const transportHubs = [
21
+ {
22
+ name: "From Howrah Station",
23
+ details: "Take any 'Bandel Local' or 'Burdwan Local' from Howrah Station. Serampore is about a 30-40 minute journey.",
24
+ icon: "🚆"
25
+ },
26
+ {
27
+ name: "By Road (Kolkata)",
28
+ details: "Serampore is roughly 25km from Central Kolkata via the Grand Trunk (GT) Road or the Delhi Road.",
29
+ icon: "🚗"
30
+ },
31
+ {
32
+ name: "Local Transport",
33
+ details: "Auto-rickshaws and Totomod (E-rickshaws) are the lifeline here. They are available 24/7 at the stations.",
34
+ icon: "🛺"
35
+ }
36
+ ];
37
+
38
+ const stayOptions = [
39
+ {
40
+ name: "The Denmark Tavern",
41
+ distance: "Heritage Stay",
42
+ type: "Premium / Historic",
43
+ desc: "A beautifully restored 230-year-old Danish tavern overlooking the Hooghly river.",
44
+ href: "https://www.denmarktavern.com/",
45
+ },
46
+ {
47
+ name: "Avenue Plaza",
48
+ distance: "3 mins from Station",
49
+ type: "Convenient",
50
+ desc: "Located right next to the Serampore station, perfect for guests coming by train.",
51
+ href: "https://www.goibibo.com/hotels/avenue-plaza-hotel-in-serampore-6841243141434114141/",
52
+ },
53
+ {
54
+ name: "The Peerless Inn",
55
+ distance: "20 km (Kolkata)",
56
+ type: "Luxury",
57
+ desc: "If you prefer staying in the heart of Kolkata and traveling for the events.",
58
+ href: "https://www.peerlesshotels.com/",
59
+ }
60
+ ];
61
+
62
+ const highlights = [
63
+ {
64
+ title: "St. Olav's Church",
65
+ desc: "A stunning piece of Danish architecture from 1800, restored to its former glory.",
66
+ img: "https://static.toiimg.com/photo/52947147/.jpg"
67
+ },
68
+ {
69
+ title: "Serampore College",
70
+ desc: "One of the oldest Western university institutions in Asia, established in 1818.",
71
+ img: "https://images.unsplash.com/photo-1562774053-701939374585?auto=format&fit=crop&q=80&w=600"
72
+ },
73
+ {
74
+ title: "The Riverfront",
75
+ desc: "Take a peaceful walk along the Hooghly river during sunset for a magical view.",
76
+ img: "https://images.unsplash.com/photo-1582510003544-4d00b7f74220?auto=format&fit=crop&q=80&w=600"
77
+ }
78
+ ];
79
+
80
+ const foodSpots = [
81
+ {
82
+ name: "Mahesh Chandra Dutta",
83
+ special: "Gutka Sandesh",
84
+ type: "Legendary Sweets",
85
+ desc: "Over 160 years old! You must try their signature Gutka Sandesh."
86
+ },
87
+ {
88
+ name: "Denmark Tavern",
89
+ special: "Heritage Dining",
90
+ type: "Restaurant",
91
+ desc: "Great for a colonial-style lunch by the river."
92
+ },
93
+ {
94
+ name: "Mukherjee's",
95
+ special: "Fish Fry & Mughlai",
96
+ type: "Bengali Cuisine",
97
+ desc: "A local favorite for authentic Bengali snacks and meals."
98
+ }
99
+ ];
100
+
101
+ export default function TravelGuidePage() {
102
+ const [activeVenue, setActiveVenue] = useState<string>("wedding");
103
+
104
+ const venueData: any = {
105
+ wedding: {
106
+ name: "Anandamayee Bhawan",
107
+ location: "Serampore",
108
+ address: "54A, G.T. Road, Serampore, W.B.",
109
+ transport: [
110
+ { name: "Serampore Station", details: "3 mins by Auto/Toto from the station. Located on the main G.T. Road.", icon: "🚆" },
111
+ { name: "Parking", details: "Limited parking available near the banquet hall. We recommend using local transport.", icon: "🅿️" },
112
+ { name: "Landmark", details: "Near Belting Bazar / Serampore Court area.", icon: "📍" }
113
+ ],
114
+ stay: stayOptions.filter(s => s.name !== "The Peerless Inn"),
115
+ map: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3679.3779465759876!2d88.33077587399126!3d22.75135112639763!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x39f89b287ddfb39b%3A0xc67348083f7cea9d!2sAnandamayee%20Bhawan!5e0!3m2!1sen!2sin!4v1765848206729!5m2!1sen!2sin"
116
+ },
117
+ reception: {
118
+ name: "Friends Union Club",
119
+ location: "Konnagar",
120
+ address: "Gangadhar Chatterjee Bhaban, Konnagar, W.B.",
121
+ transport: [
122
+ { name: "Konnagar Station", details: "5-7 mins by Toto from Konnagar station (East side).", icon: "🚆" },
123
+ { name: "By Road", details: "Accessible via G.T. Road. Look for the Friends Union Club signage.", icon: "🚗" },
124
+ { name: "Landmark", details: "Near Konnagar Ferry Ghat / G.T. Road junction.", icon: "📍" }
125
+ ],
126
+ stay: [stayOptions[2], { name: "Konnagar Guest Houses", distance: "Local", type: "Budget", desc: "Basic local stays available nearby." }],
127
+ map: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3680.8284397695707!2d88.35295167398938!3d22.697429628386114!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x39f89c85a91d38fd%3A0x19dcd2c61895f79f!2sKonnagar%20Friends%20Union%20Club%20Community%20Centre%2FGangadhar%20Chatterjee%20Bhaban!5e0!3m2!1sen!2sin!4v1765848530552!5m2!1sen!2sin"
128
+ }
129
+ };
130
+
131
+ const renderTransport = () => (
132
+ <div className="grid md:grid-cols-3 gap-6 md:gap-8 py-4 px-1">
133
+ {venueData[activeVenue].transport.map((hub: any, i: number) => (
134
+ <Card key={i} className="bg-white/50 dark:bg-zinc-900/50 backdrop-blur-md border border-default-100 dark:border-default-800 p-5 md:p-6 shadow-sm">
135
+ <div className="text-3xl md:text-4xl mb-3 md:mb-4">{hub.icon}</div>
136
+ <h3 className="text-lg md:text-xl font-bold text-default-900 dark:text-white mb-2">{hub.name}</h3>
137
+ <p className="text-default-500 text-xs md:text-sm leading-relaxed">{hub.details}</p>
138
+ </Card>
139
+ ))}
140
+ </div>
141
+ );
142
+
143
+ const renderStay = () => (
144
+ <div className="grid md:grid-cols-3 gap-6 md:gap-8 py-4 px-1">
145
+ {venueData[activeVenue].stay.map((stay: any, i: number) => (
146
+ <Card key={i} className="bg-white/50 dark:bg-zinc-900/50 backdrop-blur-md border border-wedding-gold-200/50 dark:border-wedding-gold-800/50 p-5 md:p-6 shadow-md hover:border-wedding-pink-400 transition-colors">
147
+ <div className="flex justify-between items-start mb-3 md:mb-4">
148
+ <span className="bg-wedding-gold-100 dark:bg-wedding-gold-900/30 text-wedding-gold-700 text-[8px] md:text-[10px] px-2 py-1 rounded-full font-black uppercase">{stay.type}</span>
149
+ <span className="text-[8px] md:text-[10px] text-default-400 font-mono italic">{stay.distance}</span>
150
+ </div>
151
+ <h3 className="text-lg md:text-xl font-bold text-default-900 dark:text-white mb-2">{stay.name}</h3>
152
+ <p className="text-xs md:text-sm text-default-500 mb-4 md:mb-6 flex-grow">{stay.desc}</p>
153
+ {stay.href && <Button as={Link} href={stay.href} isExternal color="danger" variant="flat" size="sm" className="w-full font-bold">Book Now</Button>}
154
+ </Card>
155
+ ))}
156
+ </div>
157
+ );
158
+
159
+ const renderExplore = () => (
160
+ <div className="grid md:grid-cols-3 gap-6 md:gap-8 py-4 px-1">
161
+ {highlights.map((item, i) => (
162
+ <Card key={i} className="h-full border-none shadow-xl overflow-hidden group">
163
+ <div className="relative h-40 md:h-48 overflow-hidden">
164
+ <Image src={item.img} alt={item.title} removeWrapper className="w-full h-full object-cover group-hover:scale-110 transition-transform duration-700" />
165
+ <div className="absolute inset-0 bg-gradient-to-t from-black/60 to-transparent" />
166
+ <h3 className="absolute bottom-3 left-3 text-white font-bold text-lg">{item.title}</h3>
167
+ </div>
168
+ <CardBody className="p-4 bg-white dark:bg-zinc-900">
169
+ <p className="text-default-500 text-xs md:text-sm italic leading-relaxed">{item.desc}</p>
170
+ </CardBody>
171
+ </Card>
172
+ ))}
173
+ </div>
174
+ );
175
+
176
+ const renderFood = () => (
177
+ <div className="grid md:grid-cols-3 gap-6 md:gap-8 py-4 px-1">
178
+ {foodSpots.map((spot, i) => (
179
+ <Card key={i} className="bg-wedding-pink-50/30 dark:bg-wedding-pink-900/10 border-2 border-dashed border-wedding-pink-200 p-5 md:p-6">
180
+ <span className="text-[8px] md:text-[9px] font-black bg-wedding-pink-500 text-white px-2 py-0.5 rounded-full w-fit mb-2 md:mb-3">{spot.type}</span>
181
+ <h3 className="text-lg md:text-xl font-bold text-wedding-pink-700 dark:text-wedding-pink-300 mb-1">{spot.name}</h3>
182
+ <p className="text-[10px] md:text-xs font-bold text-wedding-gold-600 mb-2 md:mb-3 underline decoration-wedding-gold-200">Try: {spot.special}</p>
183
+ <p className="text-default-500 text-xs md:text-sm leading-relaxed">{spot.desc}</p>
184
+ </Card>
185
+ ))}
186
+ </div>
187
+ );
188
+
189
+ const renderTips = () => (
190
+ <div className="space-y-10 py-4 px-1">
191
+ <div className="flex flex-col lg:grid lg:grid-cols-2 gap-8 md:gap-10">
192
+ <div className="space-y-6">
193
+ <div className="bg-blue-50 dark:bg-blue-900/20 p-5 md:p-6 rounded-[24px] md:rounded-[32px] border border-blue-100 dark:border-blue-800">
194
+ <h4 className="font-bold text-blue-700 dark:text-blue-300 mb-2 flex items-center gap-2 text-sm md:text-base">❄️ Winter in Bengal</h4>
195
+ <p className="text-xs md:text-sm text-default-600 dark:text-gray-300 leading-relaxed">
196
+ January is the peak of winter. Temperatures can drop to 12°C at night.
197
+ <strong> We recommend packing light woolens</strong> for the evening ceremonies.
198
+ </p>
199
+ </div>
200
+ <div className="bg-amber-50 dark:bg-amber-900/20 p-5 md:p-6 rounded-[24px] md:rounded-[32px] border border-amber-100 dark:border-amber-800">
201
+ <h4 className="font-bold text-amber-700 dark:text-amber-300 mb-2 flex items-center gap-2 text-sm md:text-base">🛺 Auto Estimates</h4>
202
+ <ul className="text-xs md:text-sm text-default-600 dark:text-gray-300 space-y-1">
203
+ <li>• Station to Venue (Reserved): ₹40 - ₹60</li>
204
+ <li>• Station to Venue (Shared): ₹10 - ₹15</li>
205
+ </ul>
206
+ </div>
207
+ </div>
208
+
209
+ <div className="bg-zinc-50 dark:bg-zinc-900 p-6 md:p-8 rounded-[24px] md:rounded-[32px] border border-default-200">
210
+ <h4 className="font-bold text-default-800 dark:text-white mb-4 flex items-center gap-2 text-sm md:text-base">🗣️ Bengali 101</h4>
211
+ <div className="space-y-3 md:space-y-4">
212
+ {[
213
+ { en: "Hello/Greetings", bn: "Nomoshkar" },
214
+ { en: "Thank You", bn: "Dhanyabaad" },
215
+ { en: "How are you?", bn: "Kemon achen?" },
216
+ { en: "Very Good", bn: "Khub bhalo" },
217
+ ].map((p, i) => (
218
+ <div key={i} className="flex justify-between border-b border-default-100 pb-2 last:border-none">
219
+ <span className="text-xs md:text-sm text-default-500">{p.en}</span>
220
+ <span className={`${fontSans.className} font-bold text-wedding-pink-600 text-sm md:text-base`}>{p.bn}</span>
221
+ </div>
222
+ ))}
223
+ </div>
224
+ </div>
225
+ </div>
226
+
227
+ <Divider className="my-8 md:my-10 opacity-50" />
228
+
229
+ {/* History, Legal & Bengal Context Section */}
230
+ <motion.div
231
+ initial={{ opacity: 0, y: 20 }}
232
+ whileInView={{ opacity: 1, y: 0 }}
233
+ className="bg-wedding-gold-50/50 dark:bg-wedding-gold-900/10 p-6 md:p-12 rounded-[32px] md:rounded-[40px] border border-wedding-gold-200/50"
234
+ >
235
+ <div className="max-w-4xl mx-auto space-y-6 md:space-y-8">
236
+ <div className="text-center space-y-2">
237
+ <h3 className={`${fontSans.className} text-2xl md:text-3xl font-black text-default-800 dark:text-white uppercase tracking-tight leading-tight`}>
238
+ Our Union: A Secular & Social Milestone
239
+ </h3>
240
+ <p className="text-wedding-pink-600 dark:text-wedding-pink-400 font-mono text-[9px] md:text-xs uppercase tracking-widest font-bold">
241
+ United under the Special Marriage Act, 1954
242
+ </p>
243
+ </div>
244
+ <div className="flex flex-col md:grid md:grid-cols-2 gap-8 md:gap-10 text-xs md:text-sm leading-relaxed text-default-600 dark:text-gray-300">
245
+ <div className="space-y-3 md:space-y-4">
246
+ <h4 className="font-bold text-default-900 dark:text-white text-base md:text-lg flex items-center gap-2">
247
+ <span className="text-xl">⚖️</span> Legal Equality
248
+ </h4>
249
+ <p>
250
+ Our marriage is solemnized under <strong>Section 13 of Act XLIII of 1954</strong>. In a country where marriage is often tied to religious conversion, the Special Marriage Act (SMA) provides a truly secular alternative. It allows individuals from different religious backgrounds—like ours—to unite as equal partners under the law, <strong>without the need for conversion or the renunciation of one's own faith.</strong>
251
+ </p>
252
+ <p>
253
+ This legal framework ensures that our 10-year journey of love is recognized by the state as a civil union, prioritizing mutual consent and individual rights above all else.
254
+ </p>
255
+ </div>
256
+ <div className="space-y-3 md:space-y-4">
257
+ <h4 className="font-bold text-default-900 dark:text-white text-base md:text-lg flex items-center gap-2">
258
+ <span className="text-xl">🌾</span> The Bengal Legacy
259
+ </h4>
260
+ <p>
261
+ West Bengal has long been a beacon of progressive thought and communal harmony in India. In the land of <strong>Rabindranath Tagore and Kazi Nazrul Islam</strong>, our union finds its natural home. Bengal's rich history of syncretism—often called the <em>Ganga-Jamuni Tehzeeb</em>—celebrates the beauty of diverse cultures coexisting.
262
+ </p>
263
+ <p>
264
+ A profound detail of our marriage is the role of our fathers—<strong>Hasir Mallick</strong> and <strong>Subhasis Saha</strong>—who stood together as legal witnesses. Their presence and signatures represent more than just a formality; they symbolize the inclusive and secular spirit of our families, proving that love and respect transcend all religious boundaries.
265
+ </p>
266
+ </div>
267
+ </div>
268
+ <div className="pt-4 md:pt-6 border-t border-wedding-gold-200/30 text-center">
269
+ <p className="text-[10px] md:text-xs italic text-default-400">
270
+ &quot;Our union is a small part of a larger story—one where modern India embraces love as the ultimate bridge between different worlds.&quot;
271
+ </p>
272
+ </div>
273
+ </div>
274
+ </motion.div>
275
+ </div>
276
+ );
277
+
278
+ return (
279
+ <div className="min-h-screen pb-20 pt-6 md:pt-10 px-4 max-w-full overflow-x-hidden">
280
+ {/* Header */}
281
+ <section className="text-center mb-10 md:mb-16 space-y-4 max-w-full">
282
+ <motion.div
283
+ initial={{ opacity: 0, scale: 0.9 }}
284
+ animate={{ opacity: 1, scale: 1 }}
285
+ className="bg-wedding-pink-50 dark:bg-wedding-pink-900/20 w-fit px-4 py-1 rounded-full mx-auto mb-2 border border-wedding-pink-200"
286
+ >
287
+ <span className="text-[9px] md:text-[10px] font-black uppercase tracking-[0.3em] text-wedding-pink-600 dark:text-wedding-pink-400">Visitor's Companion</span>
288
+ </motion.div>
289
+ <h1 className={`${fontCursive.className} text-5xl md:text-8xl text-wedding-pink-600 dark:text-wedding-pink-400 py-2 leading-tight`}>
290
+ Travel Guide
291
+ </h1>
292
+ </section>
293
+
294
+ {/* Venue Selector - High Level */}
295
+ <div className="max-w-xl mx-auto mb-12">
296
+ <div className="flex flex-col items-center mb-6 text-center space-y-2">
297
+ <h2 className={`${fontSans.className} text-xl md:text-2xl font-black text-default-800 dark:text-white uppercase tracking-tight`}>Which event are you attending?</h2>
298
+ <p className="text-xs text-default-400 italic">Information will update based on your selection</p>
299
+ </div>
300
+ <Tabs
301
+ aria-label="Venue Selector"
302
+ color="danger"
303
+ variant="solid"
304
+ fullWidth
305
+ selectedKey={activeVenue}
306
+ onSelectionChange={(key) => setActiveVenue(key as string)}
307
+ classNames={{
308
+ tabList: "p-1 rounded-xl bg-default-100 dark:bg-zinc-900 border border-default-200 dark:border-zinc-800 shadow-sm",
309
+ cursor: "bg-white dark:bg-zinc-800 shadow-md rounded-lg",
310
+ tab: "h-12",
311
+ tabContent: "font-bold text-default-600 group-data-[selected=true]:text-wedding-pink-600"
312
+ }}
313
+ >
314
+ <Tab key="wedding" title="Wedding Ceremony" />
315
+ <Tab key="reception" title="Reception Party" />
316
+ </Tabs>
317
+ </div>
318
+
319
+ <motion.div
320
+ key={activeVenue}
321
+ initial={{ opacity: 0, x: 10 }}
322
+ animate={{ opacity: 1, x: 0 }}
323
+ transition={{ duration: 0.4 }}
324
+ className="space-y-16"
325
+ >
326
+ {/* Map Section Integrated */}
327
+ <section className="px-2 md:px-0">
328
+ <Card className="w-full h-[350px] md:h-[500px] border-none shadow-2xl rounded-[32px] md:rounded-[40px] overflow-hidden relative">
329
+ <div className="absolute top-4 left-4 z-10 bg-white/90 dark:bg-black/80 backdrop-blur-md px-4 py-2 rounded-xl border border-wedding-gold-200 flex items-center gap-2">
330
+ <MapPinIcon size={16} className="text-wedding-pink-500" />
331
+ <div className="flex flex-col">
332
+ <span className="text-[10px] font-black uppercase text-wedding-gold-600 leading-none mb-1">Destination</span>
333
+ <span className="text-xs font-bold text-default-800 dark:text-white leading-none">{venueData[activeVenue].name}</span>
334
+ </div>
335
+ </div>
336
+ <iframe
337
+ src={venueData[activeVenue].map}
338
+ className="w-full h-full border-none"
339
+ allowFullScreen
340
+ loading="lazy"
341
+ />
342
+ </Card>
343
+ </section>
344
+
345
+ {/* Dynamic Content: Tabs for Desktop, Accordion for Mobile */}
346
+ <div className="hidden md:block">
347
+ <Tabs aria-label="Guide Categories" color="danger" variant="underlined" fullWidth
348
+ classNames={{
349
+ tabList: "gap-8 w-full relative rounded-none p-0 border-b border-divider mb-12",
350
+ cursor: "w-full bg-wedding-pink-500",
351
+ tab: "px-0 h-12",
352
+ tabContent: "group-data-[selected=true]:text-wedding-pink-500 font-bold text-lg"
353
+ }}
354
+ >
355
+ <Tab key="transport" title="Travel Tips">{renderTransport()}</Tab>
356
+ <Tab key="stay" title="Nearby Stay">{renderStay()}</Tab>
357
+ <Tab key="explore" title="Highlights">{renderExplore()}</Tab>
358
+ <Tab key="food" title="Food">{renderFood()}</Tab>
359
+ <Tab key="tips" title="Other Tips">{renderTips()}</Tab>
360
+ </Tabs>
361
+ </div>
362
+
363
+ <div className="md:hidden">
364
+ <Accordion variant="splitted" selectionMode="multiple" defaultExpandedKeys={["transport"]}>
365
+ <AccordionItem key="transport" aria-label="Travel Tips" title={<span className="font-bold text-wedding-pink-600">Travel Tips</span>}>
366
+ {renderTransport()}
367
+ </AccordionItem>
368
+ <AccordionItem key="stay" aria-label="Nearby Stay" title={<span className="font-bold text-wedding-pink-600">Nearby Stay</span>}>
369
+ {renderStay()}
370
+ </AccordionItem>
371
+ <AccordionItem key="explore" aria-label="Highlights" title={<span className="font-bold text-wedding-pink-600">Highlights</span>}>
372
+ {renderExplore()}
373
+ </AccordionItem>
374
+ <AccordionItem key="food" aria-label="Food" title={<span className="font-bold text-wedding-pink-600">Food</span>}>
375
+ {renderFood()}
376
+ </AccordionItem>
377
+ <AccordionItem key="tips" aria-label="Other Tips" title={<span className="font-bold text-wedding-pink-600">Other Tips</span>}>
378
+ {renderTips()}
379
+ </AccordionItem>
380
+ </Accordion>
381
+ </div>
382
+ </motion.div>
383
+
384
+ {/* Support Section */}
385
+ <motion.div initial={{ opacity: 0 }} whileInView={{ opacity: 1 }} className="mt-20 md:mt-32 bg-gradient-to-r from-wedding-pink-500 to-wedding-gold-500 p-[1px] rounded-[32px] md:rounded-[40px] shadow-2xl shadow-wedding-pink-500/20">
386
+ <div className="bg-white dark:bg-zinc-950 p-8 md:p-16 rounded-[31px] md:rounded-[39px] text-center space-y-6">
387
+ <div className="bg-wedding-pink-100 w-12 h-12 md:w-16 md:h-16 rounded-full flex items-center justify-center mx-auto mb-2">
388
+ <MapPinIcon className="text-wedding-pink-500 w-6 h-6 md:w-8 md:h-8" />
389
+ </div>
390
+ <h2 className={`${fontCursive.className} text-4xl md:text-5xl text-default-900 dark:text-white`}>Need a hand with your travel?</h2>
391
+ <p className="text-default-500 max-w-xl mx-auto text-sm md:text-lg leading-relaxed">If you need any assistance with local bookings, station pickups, or have special requirements, Titas is just a message away.</p>
392
+ <div className="pt-4 md:pt-6 flex flex-col sm:flex-row justify-center gap-3 md:gap-4">
393
+ <Button as={Link} href="https://wa.me/919123774239" color="success" variant="shadow" radius="full" size="lg" className="font-bold text-white px-8 md:px-10 h-12 md:h-14">WhatsApp Titas</Button>
394
+ <Button as={Link} href="/" color="default" variant="flat" radius="full" size="lg" className="font-bold px-8 md:px-10 h-12 md:h-14">Return Home</Button>
395
+ </div>
396
+ </div>
397
+ </motion.div>
398
+ </div>
399
+ );
400
+ }