@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.
- package/.eslintignore +20 -0
- package/.eslintrc.json +93 -0
- package/.recover +9 -0
- package/.vscode/settings.json +3 -0
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/app/Neo-Lucentism/layout.tsx +7 -0
- package/app/Neo-Lucentism/page.tsx +259 -0
- package/app/couple/layout.tsx +7 -0
- package/app/couple/page.tsx +164 -0
- package/app/error.tsx +31 -0
- package/app/guestbook/page.tsx +470 -0
- package/app/invitation/[slug]/layout.tsx +36 -0
- package/app/invitation/[slug]/page.tsx +462 -0
- package/app/invitation/maker/auth.js +165 -0
- package/app/invitation/maker/dashboard.js +81 -0
- package/app/invitation/maker/guestAdder.js +204 -0
- package/app/invitation/maker/guestShower.js +287 -0
- package/app/invitation/maker/layout.tsx +11 -0
- package/app/invitation/maker/page.js +168 -0
- package/app/invitation/maker/rsvpViewer.js +122 -0
- package/app/layout.tsx +98 -0
- package/app/mark-the-dates/layout.tsx +7 -0
- package/app/mark-the-dates/page.tsx +196 -0
- package/app/memories/layout.tsx +7 -0
- package/app/memories/page.tsx +29 -0
- package/app/page.tsx +5 -0
- package/app/providers.tsx +33 -0
- package/app/sagun/layout.tsx +7 -0
- package/app/sagun/page.tsx +348 -0
- package/app/song-requests/page.tsx +354 -0
- package/app/sukanya/layout.tsx +7 -0
- package/app/sukanya/page.tsx +167 -0
- package/app/titas/layout.tsx +7 -0
- package/app/titas/page.tsx +175 -0
- package/app/travel-guide/page.tsx +400 -0
- package/app/updates/maker/page.js +323 -0
- package/app/updates/overlay/page.tsx +144 -0
- package/app/updates/page.js +207 -0
- package/cli.mjs +196 -0
- package/components/ConciergeBot.tsx +203 -0
- package/components/CountdownTimer.tsx +137 -0
- package/components/Gallery.tsx +372 -0
- package/components/LiveVideos.tsx +173 -0
- package/components/OurStory.tsx +160 -0
- package/components/certificate.jsx +300 -0
- package/components/counter.tsx +14 -0
- package/components/footer.tsx +89 -0
- package/components/hero.tsx +136 -0
- package/components/icons.tsx +283 -0
- package/components/importantNews.js +168 -0
- package/components/navbar.tsx +106 -0
- package/components/primitives.ts +53 -0
- package/components/sagun.js +22 -0
- package/components/theme-switch.tsx +81 -0
- package/components/updates.tsx +118 -0
- package/components/weddingcard.js +68 -0
- package/components/weddingcard2.js +58 -0
- package/config/firebase-admin.js +17 -0
- package/config/firebase.ts +36 -0
- package/config/fonts.ts +21 -0
- package/config/site.ts +74 -0
- package/next-env.d.ts +6 -0
- package/next.config.js +4 -0
- package/package.json +64 -0
- package/postcss.config.js +6 -0
- package/public/DCV.gif +0 -0
- package/public/DCV2.gif +0 -0
- package/public/DCV3.gif +0 -0
- package/public/Images/1.jpg +0 -0
- package/public/Images/11.jpg +0 -0
- package/public/Images/12.jpg +0 -0
- package/public/Images/13.jpg +0 -0
- package/public/Images/14.jpg +0 -0
- package/public/Images/15.jpg +0 -0
- package/public/Images/16.jpg +0 -0
- package/public/Images/17.jpg +0 -0
- package/public/Images/18.jpg +0 -0
- package/public/Images/19.jpg +0 -0
- package/public/Images/2.jpg +0 -0
- package/public/Images/20.jpg +0 -0
- package/public/Images/21.jpg +0 -0
- package/public/Images/22.jpg +0 -0
- package/public/Images/3.jpg +0 -0
- package/public/Images/4.jpg +0 -0
- package/public/Images/5.jpg +0 -0
- package/public/Images/6.jpg +0 -0
- package/public/Images/7.jpg +0 -0
- package/public/Images/8.jpg +0 -0
- package/public/Images/9.jpg +0 -0
- package/public/Images/9b.jpg +0 -0
- package/public/Images/Patipatra.jpeg +0 -0
- package/public/audio (1).mp3 +0 -0
- package/public/audio (2).mp3 +0 -0
- package/public/bride.jpg +0 -0
- package/public/corner1-01.svg +1 -0
- package/public/favicon.ico +0 -0
- package/public/groom.jpg +0 -0
- package/public/invite.png +0 -0
- package/public/love-birds.png +0 -0
- package/public/next.svg +1 -0
- package/public/pubqr.png +0 -0
- package/public/pw/001.jpg +0 -0
- package/public/pw/002.jpg +0 -0
- package/public/pw/003.jpg +0 -0
- package/public/pw/004.jpg +0 -0
- package/public/pw/005.jpg +0 -0
- package/public/pw/006.jpg +0 -0
- package/public/pw/007.jpg +0 -0
- package/public/pw/008.jpg +0 -0
- package/public/pw/009.jpg +0 -0
- package/public/pw/010.jpg +0 -0
- package/public/pw/011.jpg +0 -0
- package/public/pw/012.jpg +0 -0
- package/public/pw/013.jpg +0 -0
- package/public/pw/014.jpg +0 -0
- package/public/pw/015.jpg +0 -0
- package/public/pw/016.jpg +0 -0
- package/public/pw/017.jpg +0 -0
- package/public/pw/018.jpg +0 -0
- package/public/pw/019.jpg +0 -0
- package/public/pw/020.jpg +0 -0
- package/public/pw/021.jpg +0 -0
- package/public/pw/022.jpg +0 -0
- package/public/pw/023.jpg +0 -0
- package/public/pw/024.jpg +0 -0
- package/public/pw/025.jpg +0 -0
- package/public/pw/026.jpg +0 -0
- package/public/pw/027.jpg +0 -0
- package/public/pw/028.jpg +0 -0
- package/public/pw/029.jpg +0 -0
- package/public/pw/030.jpg +0 -0
- package/public/pw/031.jpg +0 -0
- package/public/pw/032.jpg +0 -0
- package/public/qr.png +0 -0
- package/public/vercel.svg +1 -0
- package/styles/globals.css +3 -0
- package/tailwind.config.js +51 -0
- package/tsconfig.json +45 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/types/index.ts +5 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { Button } from "@heroui/button";
|
|
6
|
+
|
|
7
|
+
import ImportantNews from "./importantNews";
|
|
8
|
+
import CertificatePage from "./certificate";
|
|
9
|
+
import WeddingCard from "./weddingcard";
|
|
10
|
+
import { HeartFilledIcon } from "./icons";
|
|
11
|
+
import Updates from "./updates";
|
|
12
|
+
import CountdownTimer from "./CountdownTimer";
|
|
13
|
+
import LiveVideos from "./LiveVideos";
|
|
14
|
+
|
|
15
|
+
import { fontCursive, fontMono } from "@/config/fonts";
|
|
16
|
+
|
|
17
|
+
const fadeInUp = {
|
|
18
|
+
initial: { opacity: 0, y: 20 },
|
|
19
|
+
whileInView: { opacity: 1, y: 0 },
|
|
20
|
+
viewport: { once: true },
|
|
21
|
+
transition: { duration: 0.8 },
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const Herohome = () => {
|
|
25
|
+
return (
|
|
26
|
+
<div className="flex flex-col gap-16 md:gap-32 pb-20 overflow-hidden">
|
|
27
|
+
{/* Latest Update Bar */}
|
|
28
|
+
<div className="mt-8">
|
|
29
|
+
<Updates />
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
{/* 1. Hero Banner */}
|
|
33
|
+
<section className="relative min-h-[50vh] md:min-h-[70vh] flex flex-col items-center justify-center text-center px-4">
|
|
34
|
+
{/* Abstract Background Element */}
|
|
35
|
+
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[500px] h-[500px] bg-wedding-pink-100/30 dark:bg-wedding-pink-900/10 rounded-full blur-[100px] pointer-events-none" />
|
|
36
|
+
|
|
37
|
+
<motion.div
|
|
38
|
+
{...fadeInUp}
|
|
39
|
+
className={`${fontCursive.className} text-6xl md:text-8xl lg:text-9xl leading-tight z-10`}
|
|
40
|
+
>
|
|
41
|
+
<span className="block text-default-800 dark:text-default-900">
|
|
42
|
+
A Journey of
|
|
43
|
+
</span>
|
|
44
|
+
<span className="block mt-2 bg-gradient-to-r from-wedding-pink-400 via-purple-400 to-wedding-gold-400 bg-clip-text text-transparent drop-shadow-[0_0_15px_rgba(236,72,153,0.3)] dark:drop-shadow-[0_0_20px_rgba(236,72,153,0.5)]">
|
|
45
|
+
Forever
|
|
46
|
+
</span>
|
|
47
|
+
<span className="block text-default-800 dark:text-default-900 mt-4">
|
|
48
|
+
Begins.
|
|
49
|
+
</span>
|
|
50
|
+
</motion.div>
|
|
51
|
+
|
|
52
|
+
<motion.p
|
|
53
|
+
animate={{ opacity: 1 }}
|
|
54
|
+
className="mt-8 text-lg md:text-xl text-default-500 uppercase tracking-[0.2em] font-light"
|
|
55
|
+
initial={{ opacity: 0 }}
|
|
56
|
+
transition={{ delay: 1, duration: 1 }}
|
|
57
|
+
>
|
|
58
|
+
Titas & Sukanya
|
|
59
|
+
</motion.p>
|
|
60
|
+
</section>
|
|
61
|
+
|
|
62
|
+
{/* Countdown Section */}
|
|
63
|
+
<section className="container mx-auto px-4">
|
|
64
|
+
<motion.div {...fadeInUp}>
|
|
65
|
+
<CountdownTimer />
|
|
66
|
+
</motion.div>
|
|
67
|
+
</section>
|
|
68
|
+
|
|
69
|
+
{/* 2. The Invitation */}
|
|
70
|
+
<section className="container mx-auto px-4">
|
|
71
|
+
<motion.div {...fadeInUp}>
|
|
72
|
+
<div className="text-center mb-10">
|
|
73
|
+
<h2
|
|
74
|
+
className={`${fontCursive.className} text-4xl text-wedding-gold-600 dark:text-wedding-gold-400`}
|
|
75
|
+
>
|
|
76
|
+
The Invitation
|
|
77
|
+
</h2>
|
|
78
|
+
</div>
|
|
79
|
+
<div className="relative z-10">
|
|
80
|
+
<WeddingCard />
|
|
81
|
+
{/* <WeddingCard2 /> */}
|
|
82
|
+
</div>
|
|
83
|
+
</motion.div>
|
|
84
|
+
</section>
|
|
85
|
+
|
|
86
|
+
{/* Live Videos Section */}
|
|
87
|
+
<LiveVideos />
|
|
88
|
+
|
|
89
|
+
{/* 3. The Couple Intro */}
|
|
90
|
+
<section className="relative py-20 bg-wedding-pink-50/50 dark:bg-white/5 rounded-3xl mx-4 md:mx-0">
|
|
91
|
+
<motion.div
|
|
92
|
+
{...fadeInUp}
|
|
93
|
+
className="container mx-auto px-4 flex flex-col items-center text-center max-w-4xl"
|
|
94
|
+
>
|
|
95
|
+
<HeartFilledIcon className="text-wedding-pink-500 w-12 h-12 mb-6" />
|
|
96
|
+
|
|
97
|
+
<p
|
|
98
|
+
className={`${fontMono.className} text-lg md:text-xl leading-relaxed text-default-600 dark:text-white`}
|
|
99
|
+
>
|
|
100
|
+
From college classmates to soulmates, our journey of ten beautiful
|
|
101
|
+
years has been filled with shared laughter, quiet strength, and a
|
|
102
|
+
deep love for the mountains. Now, we are ready to write the next
|
|
103
|
+
chapter as one.
|
|
104
|
+
</p>
|
|
105
|
+
|
|
106
|
+
<Button
|
|
107
|
+
as={Link}
|
|
108
|
+
className="mt-10 bg-wedding-pink-500 text-white font-medium shadow-lg hover:bg-wedding-pink-600 hover:shadow-wedding-pink-500/30 transition-all transform hover:-translate-y-1"
|
|
109
|
+
href="/couple"
|
|
110
|
+
radius="full"
|
|
111
|
+
size="lg"
|
|
112
|
+
>
|
|
113
|
+
Read Our Story
|
|
114
|
+
</Button>
|
|
115
|
+
</motion.div>
|
|
116
|
+
</section>
|
|
117
|
+
|
|
118
|
+
{/* 4. Important News / Events */}
|
|
119
|
+
<section>
|
|
120
|
+
<ImportantNews />
|
|
121
|
+
</section>
|
|
122
|
+
|
|
123
|
+
{/* 5. Official Record */}
|
|
124
|
+
<section className="container mx-auto px-4 pb-10">
|
|
125
|
+
<motion.div
|
|
126
|
+
{...fadeInUp}
|
|
127
|
+
className="opacity-90 hover:opacity-100 transition-opacity"
|
|
128
|
+
>
|
|
129
|
+
<CertificatePage />
|
|
130
|
+
</motion.div>
|
|
131
|
+
</section>
|
|
132
|
+
</div>
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export default Herohome;
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { IconSvgProps } from "@/types";
|
|
4
|
+
|
|
5
|
+
export const Logo: React.FC<IconSvgProps> = ({
|
|
6
|
+
size = 36,
|
|
7
|
+
width,
|
|
8
|
+
height,
|
|
9
|
+
...props
|
|
10
|
+
}) => (
|
|
11
|
+
<svg
|
|
12
|
+
fill="none"
|
|
13
|
+
height={size || height}
|
|
14
|
+
viewBox="0 0 32 32"
|
|
15
|
+
width={size || width}
|
|
16
|
+
{...props}
|
|
17
|
+
>
|
|
18
|
+
<path
|
|
19
|
+
d="M16 4C9.925 4 5 8.925 5 14s4.925 10 11 10c4.25 0 7.975-2.5 9.5-6.5 1.525 4 5.25 6.5 9.5 6.5 6.075 0 11-4.925 11-10s-4.925-10-11-10c-4.25 0-7.975 2.5-9.5 6.5C23.975 6.5 20.25 4 16 4z"
|
|
20
|
+
fill="currentColor"
|
|
21
|
+
/>
|
|
22
|
+
</svg>
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
export const DiscordIcon: React.FC<IconSvgProps> = ({
|
|
26
|
+
size = 24,
|
|
27
|
+
width,
|
|
28
|
+
height,
|
|
29
|
+
...props
|
|
30
|
+
}) => {
|
|
31
|
+
return (
|
|
32
|
+
<svg
|
|
33
|
+
height={size || height}
|
|
34
|
+
viewBox="0 0 24 24"
|
|
35
|
+
width={size || width}
|
|
36
|
+
{...props}
|
|
37
|
+
>
|
|
38
|
+
<path
|
|
39
|
+
d="M14.82 4.26a10.14 10.14 0 0 0-.53 1.1 14.66 14.66 0 0 0-4.58 0 10.14 10.14 0 0 0-.53-1.1 16 16 0 0 0-4.13 1.3 17.33 17.33 0 0 0-3 11.59 16.6 16.6 0 0 0 5.07 2.59A12.89 12.89 0 0 0 8.23 18a9.65 9.65 0 0 1-1.71-.83 3.39 3.39 0 0 0 .42-.33 11.66 11.66 0 0 0 10.12 0q.21.18.42.33a10.84 10.84 0 0 1-1.71.84 12.41 12.41 0 0 0 1.08 1.78 16.44 16.44 0 0 0 5.06-2.59 17.22 17.22 0 0 0-3-11.59 16.09 16.09 0 0 0-4.09-1.35zM8.68 14.81a1.94 1.94 0 0 1-1.8-2 1.93 1.93 0 0 1 1.8-2 1.93 1.93 0 0 1 1.8 2 1.93 1.93 0 0 1-1.8 2zm6.64 0a1.94 1.94 0 0 1-1.8-2 1.93 1.93 0 0 1 1.8-2 1.92 1.92 0 0 1 1.8 2 1.92 1.92 0 0 1-1.8 2z"
|
|
40
|
+
fill="currentColor"
|
|
41
|
+
/>
|
|
42
|
+
</svg>
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const TwitterIcon: React.FC<IconSvgProps> = ({
|
|
47
|
+
size = 24,
|
|
48
|
+
width,
|
|
49
|
+
height,
|
|
50
|
+
...props
|
|
51
|
+
}) => {
|
|
52
|
+
return (
|
|
53
|
+
<svg
|
|
54
|
+
height={size || height}
|
|
55
|
+
viewBox="0 0 24 24"
|
|
56
|
+
width={size || width}
|
|
57
|
+
{...props}
|
|
58
|
+
>
|
|
59
|
+
<path
|
|
60
|
+
d="M19.633 7.997c.013.175.013.349.013.523 0 5.325-4.053 11.461-11.46 11.461-2.282 0-4.402-.661-6.186-1.809.324.037.636.05.973.05a8.07 8.07 0 0 0 5.001-1.721 4.036 4.036 0 0 1-3.767-2.793c.249.037.499.062.761.062.361 0 .724-.05 1.061-.137a4.027 4.027 0 0 1-3.23-3.953v-.05c.537.299 1.16.486 1.82.511a4.022 4.022 0 0 1-1.796-3.354c0-.748.199-1.434.548-2.032a11.457 11.457 0 0 0 8.306 4.215c-.062-.3-.1-.611-.1-.923a4.026 4.026 0 0 1 4.028-4.028c1.16 0 2.207.486 2.943 1.272a7.957 7.957 0 0 0 2.556-.973 4.02 4.02 0 0 1-1.771 2.22 8.073 8.073 0 0 0 2.319-.624 8.645 8.645 0 0 1-2.019 2.083z"
|
|
61
|
+
fill="currentColor"
|
|
62
|
+
/>
|
|
63
|
+
</svg>
|
|
64
|
+
);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export const GithubIcon: React.FC<IconSvgProps> = ({
|
|
68
|
+
size = 24,
|
|
69
|
+
width,
|
|
70
|
+
height,
|
|
71
|
+
...props
|
|
72
|
+
}) => {
|
|
73
|
+
return (
|
|
74
|
+
<svg
|
|
75
|
+
height={size || height}
|
|
76
|
+
viewBox="0 0 24 24"
|
|
77
|
+
width={size || width}
|
|
78
|
+
{...props}
|
|
79
|
+
>
|
|
80
|
+
<path
|
|
81
|
+
clipRule="evenodd"
|
|
82
|
+
d="M12.026 2c-5.509 0-9.974 4.465-9.974 9.974 0 4.406 2.857 8.145 6.821 9.465.499.09.679-.217.679-.481 0-.237-.008-.865-.011-1.696-2.775.602-3.361-1.338-3.361-1.338-.452-1.152-1.107-1.459-1.107-1.459-.905-.619.069-.605.069-.605 1.002.07 1.527 1.028 1.527 1.028.89 1.524 2.336 1.084 2.902.829.091-.645.351-1.085.635-1.334-2.214-.251-4.542-1.107-4.542-4.93 0-1.087.389-1.979 1.024-2.675-.101-.253-.446-1.268.099-2.64 0 0 .837-.269 2.742 1.021a9.582 9.582 0 0 1 2.496-.336 9.554 9.554 0 0 1 2.496.336c1.906-1.291 2.742-1.021 2.742-1.021.545 1.372.203 2.387.099 2.64.64.696 1.024 1.587 1.024 2.675 0 3.833-2.33 4.675-4.552 4.922.355.308.675.916.675 1.846 0 1.334-.012 2.41-.012 2.737 0 .267.178.577.687.479C19.146 20.115 22 16.379 22 11.974 22 6.465 17.535 2 12.026 2z"
|
|
83
|
+
fill="currentColor"
|
|
84
|
+
fillRule="evenodd"
|
|
85
|
+
/>
|
|
86
|
+
</svg>
|
|
87
|
+
);
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const MoonFilledIcon = ({
|
|
91
|
+
size = 24,
|
|
92
|
+
width,
|
|
93
|
+
height,
|
|
94
|
+
...props
|
|
95
|
+
}: IconSvgProps) => (
|
|
96
|
+
<svg
|
|
97
|
+
aria-hidden="true"
|
|
98
|
+
focusable="false"
|
|
99
|
+
height={size || height}
|
|
100
|
+
role="presentation"
|
|
101
|
+
viewBox="0 0 24 24"
|
|
102
|
+
width={size || width}
|
|
103
|
+
{...props}
|
|
104
|
+
>
|
|
105
|
+
<path
|
|
106
|
+
d="M21.53 15.93c-.16-.27-.61-.69-1.73-.49a8.46 8.46 0 01-1.88.13 8.409 8.409 0 01-5.91-2.82 8.068 8.068 0 01-1.44-8.66c.44-1.01.13-1.54-.09-1.76s-.77-.55-1.83-.11a10.318 10.318 0 00-6.32 10.21 10.475 10.475 0 007.04 8.99 10 10 0 002.89.55c.16.01.32.02.48.02a10.5 10.5 0 008.47-4.27c.67-.93.49-1.519.32-1.79z"
|
|
107
|
+
fill="currentColor"
|
|
108
|
+
/>
|
|
109
|
+
</svg>
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
export const SunFilledIcon = ({
|
|
113
|
+
size = 24,
|
|
114
|
+
width,
|
|
115
|
+
height,
|
|
116
|
+
...props
|
|
117
|
+
}: IconSvgProps) => (
|
|
118
|
+
<svg
|
|
119
|
+
aria-hidden="true"
|
|
120
|
+
focusable="false"
|
|
121
|
+
height={size || height}
|
|
122
|
+
role="presentation"
|
|
123
|
+
viewBox="0 0 24 24"
|
|
124
|
+
width={size || width}
|
|
125
|
+
{...props}
|
|
126
|
+
>
|
|
127
|
+
<g fill="currentColor">
|
|
128
|
+
<path d="M19 12a7 7 0 11-7-7 7 7 0 017 7z" />
|
|
129
|
+
<path d="M12 22.96a.969.969 0 01-1-.96v-.08a1 1 0 012 0 1.038 1.038 0 01-1 1.04zm7.14-2.82a1.024 1.024 0 01-.71-.29l-.13-.13a1 1 0 011.41-1.41l.13.13a1 1 0 010 1.41.984.984 0 01-.7.29zm-14.28 0a1.024 1.024 0 01-.71-.29 1 1 0 010-1.41l.13-.13a1 1 0 011.41 1.41l-.13.13a1 1 0 01-.7.29zM22 13h-.08a1 1 0 010-2 1.038 1.038 0 011.04 1 .969.969 0 01-.96 1zM2.08 13H2a1 1 0 010-2 1.038 1.038 0 011.04 1 .969.969 0 01-.96 1zm16.93-7.01a1.024 1.024 0 01-.71-.29 1 1 0 010-1.41l.13-.13a1 1 0 011.41 1.41l-.13.13a.984.984 0 01-.7.29zm-14.02 0a1.024 1.024 0 01-.71-.29l-.13-.14a1 1 0 011.41-1.41l.13.13a1 1 0 010 1.41.97.97 0 01-.7.3zM12 3.04a.969.969 0 01-1-.96V2a1 1 0 012 0 1.038 1.038 0 01-1 1.04z" />
|
|
130
|
+
</g>
|
|
131
|
+
</svg>
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
export const HeartFilledIcon = ({
|
|
135
|
+
size = 24,
|
|
136
|
+
width,
|
|
137
|
+
height,
|
|
138
|
+
...props
|
|
139
|
+
}: IconSvgProps) => (
|
|
140
|
+
<svg
|
|
141
|
+
aria-hidden="true"
|
|
142
|
+
focusable="false"
|
|
143
|
+
height={size || height}
|
|
144
|
+
role="presentation"
|
|
145
|
+
viewBox="0 0 24 24"
|
|
146
|
+
width={size || width}
|
|
147
|
+
{...props}
|
|
148
|
+
>
|
|
149
|
+
<path
|
|
150
|
+
d="M12.62 20.81c-.34.12-.9.12-1.24 0C8.48 19.82 2 15.69 2 8.69 2 5.6 4.49 3.1 7.56 3.1c1.82 0 3.43.88 4.44 2.24a5.53 5.53 0 0 1 4.44-2.24C19.51 3.1 22 5.6 22 8.69c0 7-6.48 11.13-9.38 12.12Z"
|
|
151
|
+
fill="currentColor"
|
|
152
|
+
strokeLinecap="round"
|
|
153
|
+
strokeLinejoin="round"
|
|
154
|
+
strokeWidth={1.5}
|
|
155
|
+
/>
|
|
156
|
+
</svg>
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
export const CalendarIcon = ({
|
|
160
|
+
size = 24,
|
|
161
|
+
width,
|
|
162
|
+
height,
|
|
163
|
+
...props
|
|
164
|
+
}: IconSvgProps) => (
|
|
165
|
+
<svg
|
|
166
|
+
aria-hidden="true"
|
|
167
|
+
focusable="false"
|
|
168
|
+
height={size || height}
|
|
169
|
+
role="presentation"
|
|
170
|
+
viewBox="0 0 24 24"
|
|
171
|
+
width={size || width}
|
|
172
|
+
{...props}
|
|
173
|
+
>
|
|
174
|
+
<path
|
|
175
|
+
d="M8 2v4m8-4v4m-12 4h16m-16 4h16m-16 4h16M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"
|
|
176
|
+
fill="none"
|
|
177
|
+
stroke="currentColor"
|
|
178
|
+
strokeLinecap="round"
|
|
179
|
+
strokeLinejoin="round"
|
|
180
|
+
strokeWidth={2}
|
|
181
|
+
/>
|
|
182
|
+
</svg>
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
export const MapPinIcon = ({
|
|
186
|
+
size = 24,
|
|
187
|
+
width,
|
|
188
|
+
height,
|
|
189
|
+
...props
|
|
190
|
+
}: IconSvgProps) => (
|
|
191
|
+
<svg
|
|
192
|
+
aria-hidden="true"
|
|
193
|
+
focusable="false"
|
|
194
|
+
height={size || height}
|
|
195
|
+
role="presentation"
|
|
196
|
+
viewBox="0 0 24 24"
|
|
197
|
+
width={size || width}
|
|
198
|
+
{...props}
|
|
199
|
+
>
|
|
200
|
+
<path
|
|
201
|
+
d="M12 21s-8-4.5-8-11.8A8 8 0 0 1 12 2a8 8 0 0 1 8 7.2c0 7.3-8 11.8-8 11.8z"
|
|
202
|
+
fill="none"
|
|
203
|
+
stroke="currentColor"
|
|
204
|
+
strokeLinecap="round"
|
|
205
|
+
strokeLinejoin="round"
|
|
206
|
+
strokeWidth={2}
|
|
207
|
+
/>
|
|
208
|
+
<circle
|
|
209
|
+
cx="12"
|
|
210
|
+
cy="10"
|
|
211
|
+
fill="none"
|
|
212
|
+
r="3"
|
|
213
|
+
stroke="currentColor"
|
|
214
|
+
strokeLinecap="round"
|
|
215
|
+
strokeLinejoin="round"
|
|
216
|
+
strokeWidth={2}
|
|
217
|
+
/>
|
|
218
|
+
</svg>
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
export const ClockIcon = ({
|
|
222
|
+
size = 24,
|
|
223
|
+
width,
|
|
224
|
+
height,
|
|
225
|
+
...props
|
|
226
|
+
}: IconSvgProps) => (
|
|
227
|
+
<svg
|
|
228
|
+
aria-hidden="true"
|
|
229
|
+
focusable="false"
|
|
230
|
+
height={size || height}
|
|
231
|
+
role="presentation"
|
|
232
|
+
viewBox="0 0 24 24"
|
|
233
|
+
width={size || width}
|
|
234
|
+
{...props}
|
|
235
|
+
>
|
|
236
|
+
<circle
|
|
237
|
+
cx="12"
|
|
238
|
+
cy="12"
|
|
239
|
+
fill="none"
|
|
240
|
+
r="10"
|
|
241
|
+
stroke="currentColor"
|
|
242
|
+
strokeLinecap="round"
|
|
243
|
+
strokeLinejoin="round"
|
|
244
|
+
strokeWidth={2}
|
|
245
|
+
/>
|
|
246
|
+
<polyline
|
|
247
|
+
fill="none"
|
|
248
|
+
points="12 6 12 12 16 14"
|
|
249
|
+
stroke="currentColor"
|
|
250
|
+
strokeLinecap="round"
|
|
251
|
+
strokeLinejoin="round"
|
|
252
|
+
strokeWidth={2}
|
|
253
|
+
/>
|
|
254
|
+
</svg>
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
export const SearchIcon = (props: IconSvgProps) => (
|
|
258
|
+
<svg
|
|
259
|
+
aria-hidden="true"
|
|
260
|
+
fill="none"
|
|
261
|
+
focusable="false"
|
|
262
|
+
height="1em"
|
|
263
|
+
role="presentation"
|
|
264
|
+
viewBox="0 0 24 24"
|
|
265
|
+
width="1em"
|
|
266
|
+
{...props}
|
|
267
|
+
>
|
|
268
|
+
<path
|
|
269
|
+
d="M11.5 21C16.7467 21 21 16.7467 21 11.5C21 6.25329 16.7467 2 11.5 2C6.25329 2 2 6.25329 2 11.5C2 16.7467 6.25329 21 11.5 21Z"
|
|
270
|
+
stroke="currentColor"
|
|
271
|
+
strokeLinecap="round"
|
|
272
|
+
strokeLinejoin="round"
|
|
273
|
+
strokeWidth="2"
|
|
274
|
+
/>
|
|
275
|
+
<path
|
|
276
|
+
d="M22 22L20 20"
|
|
277
|
+
stroke="currentColor"
|
|
278
|
+
strokeLinecap="round"
|
|
279
|
+
strokeLinejoin="round"
|
|
280
|
+
strokeWidth="2"
|
|
281
|
+
/>
|
|
282
|
+
</svg>
|
|
283
|
+
);
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import { Card, CardBody, Button, Link } from "@heroui/react";
|
|
5
|
+
import { CalendarIcon, ClockIcon, MapPinIcon } from "./icons";
|
|
6
|
+
import { useEffect, useState } from "react";
|
|
7
|
+
|
|
8
|
+
export default function ImportantNews() {
|
|
9
|
+
const [currentDate, setCurrentDate] = useState(null);
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
setCurrentDate(new Date());
|
|
13
|
+
}, []);
|
|
14
|
+
|
|
15
|
+
const events = {
|
|
16
|
+
registration: {
|
|
17
|
+
title: "Engagement Ceremony",
|
|
18
|
+
date: "23rd November 2025",
|
|
19
|
+
venue: "Srerampore",
|
|
20
|
+
map: "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d229.96354422747754!2d88.34617843336005!3d22.749911773448982!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x39f89b1ee7f14647%3A0xe44dfacd65bb5f48!2sMohan%20Joyti%20Banquet%20Hall!5e0!3m2!1sen!2sin!4v1758679491438!5m2!1sen!2sin",
|
|
21
|
+
mapHref: "https://maps.app.goo.gl/diSeycey1hyqqtAu8",
|
|
22
|
+
time: "10:00 AM",
|
|
23
|
+
direction: "Near Battala",
|
|
24
|
+
},
|
|
25
|
+
wedding: {
|
|
26
|
+
title: "Wedding Ceremony",
|
|
27
|
+
date: "23rd January 2026",
|
|
28
|
+
venue: "Serampore",
|
|
29
|
+
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",
|
|
30
|
+
mapHref: "https://maps.app.goo.gl/G5R3bkcTwwa2d54R8",
|
|
31
|
+
time: "06:00 PM",
|
|
32
|
+
direction: "Near Belting Bazar",
|
|
33
|
+
},
|
|
34
|
+
reception: {
|
|
35
|
+
title: "Reception Celebration",
|
|
36
|
+
date: "25th January 2026",
|
|
37
|
+
venue: "Konnagar",
|
|
38
|
+
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",
|
|
39
|
+
mapHref: "https://maps.app.goo.gl/ubdTsy6tnYMsvSSXA",
|
|
40
|
+
time: "06:00 PM",
|
|
41
|
+
direction: "Near GT Road",
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const parseDate = (dateStr) => {
|
|
46
|
+
// Remove ordinal suffixes (st, nd, rd, th) from the day
|
|
47
|
+
const cleanedDate = dateStr.replace(/(\d+)(st|nd|rd|th)/, "$1");
|
|
48
|
+
return new Date(cleanedDate);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div className="w-full flex items-center justify-center font-sans my-12 px-4">
|
|
53
|
+
<motion.div
|
|
54
|
+
className="w-full max-w-6xl"
|
|
55
|
+
initial={{ opacity: 0, y: 20 }}
|
|
56
|
+
whileInView={{ opacity: 1, y: 0 }}
|
|
57
|
+
viewport={{ once: true }}
|
|
58
|
+
transition={{ duration: 0.8, ease: "easeOut" }}
|
|
59
|
+
>
|
|
60
|
+
<Card className="relative w-full rounded-3xl overflow-hidden shadow-2xl border border-white/20 dark:border-white/10 bg-white/80 dark:bg-black/80 backdrop-blur-xl">
|
|
61
|
+
{/* Decorative background gradients */}
|
|
62
|
+
<div className="absolute top-0 left-0 w-full h-2 bg-gradient-to-r from-pink-300 via-purple-300 to-indigo-300 dark:from-pink-900 dark:via-purple-900 dark:to-indigo-900" />
|
|
63
|
+
<div className="absolute -top-24 -right-24 w-64 h-64 bg-pink-100/50 dark:bg-pink-900/20 rounded-full blur-3xl pointer-events-none" />
|
|
64
|
+
<div className="absolute -bottom-24 -left-24 w-64 h-64 bg-blue-100/50 dark:bg-blue-900/20 rounded-full blur-3xl pointer-events-none" />
|
|
65
|
+
|
|
66
|
+
<CardBody className="p-8 md:p-12 relative z-10">
|
|
67
|
+
{/* Header */}
|
|
68
|
+
<div className="text-center mb-12">
|
|
69
|
+
<motion.span
|
|
70
|
+
initial={{ opacity: 0 }}
|
|
71
|
+
whileInView={{ opacity: 1 }}
|
|
72
|
+
transition={{ delay: 0.2 }}
|
|
73
|
+
className="inline-block px-3 py-1 rounded-full bg-pink-50 dark:bg-pink-900/30 text-pink-600 dark:text-pink-300 text-xs font-bold tracking-widest uppercase mb-3 border border-pink-100 dark:border-pink-800"
|
|
74
|
+
>
|
|
75
|
+
Save The Dates
|
|
76
|
+
</motion.span>
|
|
77
|
+
<h1 className="text-3xl md:text-5xl font-bold font-serif bg-gradient-to-r from-pink-600 to-purple-600 bg-clip-text text-transparent mb-4">
|
|
78
|
+
Wedding Events
|
|
79
|
+
</h1>
|
|
80
|
+
<p className="text-gray-500 dark:text-gray-400 text-sm md:text-base max-w-2xl mx-auto italic leading-relaxed">
|
|
81
|
+
"We invite you to share in our joy at the following events as we begin our new journey together."
|
|
82
|
+
</p>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
{/* Events Grid */}
|
|
86
|
+
<div className="grid md:grid-cols-3 gap-6 lg:gap-8">
|
|
87
|
+
{Object.entries(events).map(([key, event], index) => {
|
|
88
|
+
const eventDate = parseDate(event.date);
|
|
89
|
+
// Set time to end of day to consider event active today
|
|
90
|
+
eventDate.setHours(23, 59, 59, 999);
|
|
91
|
+
const isPast = currentDate ? currentDate > eventDate : false;
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<motion.div
|
|
95
|
+
key={key}
|
|
96
|
+
initial={{ opacity: 0, y: 20 }}
|
|
97
|
+
whileInView={{ opacity: 1, y: 0 }}
|
|
98
|
+
viewport={{ once: true }}
|
|
99
|
+
transition={{ delay: index * 0.1 + 0.3 }}
|
|
100
|
+
className={`group relative flex flex-col items-center bg-white dark:bg-white/5 border border-gray-100 dark:border-white/10 rounded-2xl p-6 transition-all duration-300
|
|
101
|
+
${isPast
|
|
102
|
+
? "opacity-60 grayscale hover:opacity-80 hover:grayscale-0"
|
|
103
|
+
: "hover:shadow-xl hover:shadow-pink-500/10 dark:hover:shadow-pink-500/5 hover:-translate-y-1"
|
|
104
|
+
}`}
|
|
105
|
+
>
|
|
106
|
+
{isPast && (
|
|
107
|
+
<div className="absolute top-4 right-4 bg-gray-100 dark:bg-gray-800 text-gray-500 text-[10px] font-bold px-2 py-1 rounded-full uppercase tracking-wider border border-gray-200 dark:border-gray-700">
|
|
108
|
+
Completed
|
|
109
|
+
</div>
|
|
110
|
+
)}
|
|
111
|
+
|
|
112
|
+
<div className={`absolute top-0 inset-x-0 h-1 bg-gradient-to-r from-transparent via-pink-200 dark:via-pink-800 to-transparent transition-opacity ${isPast ? 'opacity-0' : 'opacity-0 group-hover:opacity-100'}`} />
|
|
113
|
+
|
|
114
|
+
<h3 className="font-serif font-bold text-xl text-gray-800 dark:text-gray-100 mb-6 text-center">
|
|
115
|
+
{event.title}
|
|
116
|
+
</h3>
|
|
117
|
+
|
|
118
|
+
<div className="w-full space-y-4 flex-grow">
|
|
119
|
+
<div className="flex items-start gap-3 text-gray-600 dark:text-gray-300">
|
|
120
|
+
<CalendarIcon className="w-5 h-5 text-pink-500 mt-0.5 shrink-0" />
|
|
121
|
+
<div>
|
|
122
|
+
<p className="font-semibold">{event.date}</p>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div className="flex items-start gap-3 text-gray-600 dark:text-gray-300">
|
|
127
|
+
<ClockIcon className="w-5 h-5 text-purple-500 mt-0.5 shrink-0" />
|
|
128
|
+
<p>{event.time}</p>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
<div className="flex items-start gap-3 text-gray-600 dark:text-gray-300">
|
|
132
|
+
<MapPinIcon className="w-5 h-5 text-indigo-500 mt-0.5 shrink-0" />
|
|
133
|
+
<div>
|
|
134
|
+
<p className="font-medium">{event.venue}</p>
|
|
135
|
+
<p className="text-xs text-gray-400 mt-0.5">{event.direction}</p>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
<Button
|
|
141
|
+
as={Link}
|
|
142
|
+
href={event.mapHref}
|
|
143
|
+
isExternal
|
|
144
|
+
className={`mt-8 w-full font-medium shadow-sm border
|
|
145
|
+
${isPast
|
|
146
|
+
? "bg-gray-100 dark:bg-gray-800 text-gray-400 border-gray-200 dark:border-gray-700 cursor-not-allowed"
|
|
147
|
+
: "bg-gradient-to-r from-pink-50 to-purple-50 dark:from-pink-900/20 dark:to-purple-900/20 hover:from-pink-100 hover:to-purple-100 dark:hover:from-pink-900/40 dark:hover:to-purple-900/40 text-pink-700 dark:text-pink-300 border-pink-100 dark:border-pink-800/50"
|
|
148
|
+
}`}
|
|
149
|
+
variant="flat"
|
|
150
|
+
isDisabled={isPast}
|
|
151
|
+
endContent={
|
|
152
|
+
<MapPinIcon className="w-4 h-4 opacity-50" />
|
|
153
|
+
}
|
|
154
|
+
>
|
|
155
|
+
{isPast ? "Event Concluded" : "View Map"}
|
|
156
|
+
</Button>
|
|
157
|
+
</motion.div>
|
|
158
|
+
);})}
|
|
159
|
+
</div>
|
|
160
|
+
</CardBody>
|
|
161
|
+
</Card>
|
|
162
|
+
</motion.div>
|
|
163
|
+
</div>
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Navbar as HeroUINavbar,
|
|
5
|
+
NavbarContent,
|
|
6
|
+
NavbarMenu,
|
|
7
|
+
NavbarMenuToggle,
|
|
8
|
+
NavbarBrand,
|
|
9
|
+
NavbarItem,
|
|
10
|
+
NavbarMenuItem,
|
|
11
|
+
} from "@heroui/navbar";
|
|
12
|
+
import { Button } from "@heroui/button";
|
|
13
|
+
import { Link } from "@heroui/link";
|
|
14
|
+
import { link as linkStyles } from "@heroui/theme";
|
|
15
|
+
import NextLink from "next/link";
|
|
16
|
+
import clsx from "clsx";
|
|
17
|
+
import { useState } from "react";
|
|
18
|
+
|
|
19
|
+
import { siteConfig } from "@/config/site";
|
|
20
|
+
import { ThemeSwitch } from "@/components/theme-switch";
|
|
21
|
+
import { HeartFilledIcon } from "@/components/icons";
|
|
22
|
+
import { fontCursive } from "@/config/fonts";
|
|
23
|
+
|
|
24
|
+
export const Navbar = () => {
|
|
25
|
+
const [, setIsMenuOpen] = useState(false);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<HeroUINavbar
|
|
29
|
+
className="bg-wedding-cream/80 dark:bg-black/80 backdrop-blur-md"
|
|
30
|
+
maxWidth="xl"
|
|
31
|
+
position="sticky"
|
|
32
|
+
onMenuOpenChange={setIsMenuOpen}
|
|
33
|
+
>
|
|
34
|
+
<NavbarContent className="basis-1/5 sm:basis-full" justify="start">
|
|
35
|
+
<NavbarBrand as="li" className="gap-3 max-w-fit">
|
|
36
|
+
<NextLink className="flex justify-start items-center gap-1" href="/">
|
|
37
|
+
<p
|
|
38
|
+
className={`${fontCursive.className} font-bold text-2xl md:text-3xl text-wedding-pink-600 dark:text-wedding-pink-400`}
|
|
39
|
+
>
|
|
40
|
+
T & S
|
|
41
|
+
</p>
|
|
42
|
+
</NextLink>
|
|
43
|
+
</NavbarBrand>
|
|
44
|
+
<ul className="hidden lg:flex gap-4 justify-start ml-4">
|
|
45
|
+
{siteConfig.navItems.map((item) => (
|
|
46
|
+
<NavbarItem key={item.href}>
|
|
47
|
+
<NextLink
|
|
48
|
+
className={clsx(
|
|
49
|
+
linkStyles({ color: "foreground" }),
|
|
50
|
+
"data-[active=true]:text-wedding-pink-500 data-[active=true]:font-medium hover:text-wedding-pink-500 transition-colors",
|
|
51
|
+
)}
|
|
52
|
+
color="foreground"
|
|
53
|
+
href={item.href}
|
|
54
|
+
>
|
|
55
|
+
{item.label}
|
|
56
|
+
</NextLink>
|
|
57
|
+
</NavbarItem>
|
|
58
|
+
))}
|
|
59
|
+
</ul>
|
|
60
|
+
</NavbarContent>
|
|
61
|
+
|
|
62
|
+
<NavbarContent
|
|
63
|
+
className="hidden sm:flex basis-1/5 sm:basis-full"
|
|
64
|
+
justify="end"
|
|
65
|
+
>
|
|
66
|
+
<NavbarItem className="hidden sm:flex gap-2">
|
|
67
|
+
<ThemeSwitch />
|
|
68
|
+
</NavbarItem>
|
|
69
|
+
<NavbarItem className="hidden md:flex">
|
|
70
|
+
<Button
|
|
71
|
+
as={Link}
|
|
72
|
+
className="text-sm font-normal bg-wedding-pink-100 text-wedding-pink-700 hover:bg-wedding-pink-200 dark:bg-wedding-pink-900/30 dark:text-wedding-pink-200 dark:hover:bg-wedding-pink-900/50"
|
|
73
|
+
href={"/sagun"}
|
|
74
|
+
startContent={<HeartFilledIcon className="text-wedding-pink-500" />}
|
|
75
|
+
variant="flat"
|
|
76
|
+
>
|
|
77
|
+
Send Wishes
|
|
78
|
+
</Button>
|
|
79
|
+
</NavbarItem>
|
|
80
|
+
</NavbarContent>
|
|
81
|
+
|
|
82
|
+
<NavbarContent className="sm:hidden basis-1 pl-4" justify="end">
|
|
83
|
+
<ThemeSwitch />
|
|
84
|
+
<NavbarMenuToggle />
|
|
85
|
+
</NavbarContent>
|
|
86
|
+
|
|
87
|
+
<NavbarMenu>
|
|
88
|
+
<div className="mx-4 mt-8 flex flex-col gap-4">
|
|
89
|
+
{siteConfig.navMenuItems.map((item, index) => (
|
|
90
|
+
<NavbarMenuItem key={`${item}-${index}`}>
|
|
91
|
+
<Link
|
|
92
|
+
className="w-full text-lg py-2 hover:text-wedding-pink-500"
|
|
93
|
+
color="foreground"
|
|
94
|
+
href={item.href}
|
|
95
|
+
size="lg"
|
|
96
|
+
onPress={() => setIsMenuOpen(false)}
|
|
97
|
+
>
|
|
98
|
+
{item.label}
|
|
99
|
+
</Link>
|
|
100
|
+
</NavbarMenuItem>
|
|
101
|
+
))}
|
|
102
|
+
</div>
|
|
103
|
+
</NavbarMenu>
|
|
104
|
+
</HeroUINavbar>
|
|
105
|
+
);
|
|
106
|
+
};
|