@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,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
+ &quot;We invite you to share in our joy at the following events as we begin our new journey together.&quot;
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
+ };