@titas_mallick/wedding-site-gen 1.1.0 → 2.0.1

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 (123) hide show
  1. package/README.md +104 -170
  2. package/app/api/email-reminders/route.ts +240 -0
  3. package/app/couple/page.tsx +4 -4
  4. package/app/game/page.tsx +298 -0
  5. package/app/guestbook/page.tsx +270 -152
  6. package/app/invitation/[slug]/layout.tsx +4 -2
  7. package/app/invitation/[slug]/page.tsx +303 -84
  8. package/app/invitation/actions.ts +49 -0
  9. package/app/invitation/maker/auth.js +1 -1
  10. package/app/invitation/maker/guestAdder.js +4 -0
  11. package/app/invitation/maker/guestShower.js +39 -8
  12. package/app/invitation/maker/layout.tsx +1 -1
  13. package/app/invitation/maker/page.js +9 -7
  14. package/app/invitation/maker/rsvpViewer.js +90 -8
  15. package/app/layout.tsx +40 -14
  16. package/app/mark-the-dates/page.tsx +8 -2
  17. package/app/page.tsx +7 -1
  18. package/app/providers.tsx +1 -1
  19. package/app/sagun/page.tsx +224 -76
  20. package/app/song-requests/page.tsx +242 -105
  21. package/app/sukanya/page.tsx +9 -13
  22. package/app/titas/page.tsx +8 -24
  23. package/app/travel-guide/page.tsx +361 -120
  24. package/app/updates/maker/page.js +2 -2
  25. package/app/updates/overlay/page.tsx +65 -30
  26. package/app/updates/page.js +3 -3
  27. package/cli.mjs +26 -15
  28. package/components/AdminAuth.tsx +145 -0
  29. package/components/AdminLinks.tsx +120 -0
  30. package/components/ConciergeBot.tsx +104 -44
  31. package/components/CountdownTimer.tsx +37 -15
  32. package/components/Gallery.tsx +1 -1
  33. package/components/LiveVideos.tsx +27 -15
  34. package/components/OurStory.tsx +1 -1
  35. package/components/SchemaMarkup.tsx +74 -0
  36. package/components/certificate.jsx +287 -300
  37. package/components/footer.tsx +2 -0
  38. package/components/hero.tsx +47 -4
  39. package/components/icons.tsx +45 -0
  40. package/components/importantNews.js +168 -168
  41. package/components/navbar.tsx +113 -18
  42. package/components/updates.tsx +36 -26
  43. package/config/firebase-admin.js +14 -17
  44. package/config/firebase.ts +4 -2
  45. package/config/site.ts +10 -2
  46. package/firestore.rules +6 -1
  47. package/next-sitemap.config.js +21 -0
  48. package/package.json +4 -3
  49. package/public/corner1-01.svg +0 -0
  50. package/public/love-birds.png +0 -0
  51. package/public/next.svg +0 -0
  52. package/public/pubqr.png +0 -0
  53. package/public/pw/sample.jpg +0 -0
  54. package/public/qr.png +0 -0
  55. package/public/sample.jpg +0 -0
  56. package/public/vercel.svg +0 -0
  57. package/vercel.json +1 -0
  58. package/.recover +0 -9
  59. package/next-env.d.ts +0 -6
  60. package/public/DCV.gif +0 -0
  61. package/public/DCV2.gif +0 -0
  62. package/public/DCV3.gif +0 -0
  63. package/public/Images/1.jpg +0 -0
  64. package/public/Images/11.jpg +0 -0
  65. package/public/Images/12.jpg +0 -0
  66. package/public/Images/13.jpg +0 -0
  67. package/public/Images/14.jpg +0 -0
  68. package/public/Images/15.jpg +0 -0
  69. package/public/Images/16.jpg +0 -0
  70. package/public/Images/17.jpg +0 -0
  71. package/public/Images/18.jpg +0 -0
  72. package/public/Images/19.jpg +0 -0
  73. package/public/Images/2.jpg +0 -0
  74. package/public/Images/21.jpg +0 -0
  75. package/public/Images/22.jpg +0 -0
  76. package/public/Images/3.jpg +0 -0
  77. package/public/Images/4.jpg +0 -0
  78. package/public/Images/5.jpg +0 -0
  79. package/public/Images/6.jpg +0 -0
  80. package/public/Images/7.jpg +0 -0
  81. package/public/Images/8.jpg +0 -0
  82. package/public/Images/9.jpg +0 -0
  83. package/public/Images/9b.jpg +0 -0
  84. package/public/Images/Patipatra.jpeg +0 -0
  85. package/public/audio (1).mp3 +0 -0
  86. package/public/audio (2).mp3 +0 -0
  87. package/public/bride.jpg +0 -0
  88. package/public/groom.jpg +0 -0
  89. package/public/invite.png +0 -0
  90. package/public/pw/001.jpg +0 -0
  91. package/public/pw/002.jpg +0 -0
  92. package/public/pw/003.jpg +0 -0
  93. package/public/pw/004.jpg +0 -0
  94. package/public/pw/005.jpg +0 -0
  95. package/public/pw/006.jpg +0 -0
  96. package/public/pw/007.jpg +0 -0
  97. package/public/pw/008.jpg +0 -0
  98. package/public/pw/009.jpg +0 -0
  99. package/public/pw/010.jpg +0 -0
  100. package/public/pw/011.jpg +0 -0
  101. package/public/pw/012.jpg +0 -0
  102. package/public/pw/013.jpg +0 -0
  103. package/public/pw/014.jpg +0 -0
  104. package/public/pw/015.jpg +0 -0
  105. package/public/pw/016.jpg +0 -0
  106. package/public/pw/017.jpg +0 -0
  107. package/public/pw/018.jpg +0 -0
  108. package/public/pw/019.jpg +0 -0
  109. package/public/pw/020.jpg +0 -0
  110. package/public/pw/021.jpg +0 -0
  111. package/public/pw/022.jpg +0 -0
  112. package/public/pw/023.jpg +0 -0
  113. package/public/pw/024.jpg +0 -0
  114. package/public/pw/025.jpg +0 -0
  115. package/public/pw/026.jpg +0 -0
  116. package/public/pw/027.jpg +0 -0
  117. package/public/pw/028.jpg +0 -0
  118. package/public/pw/029.jpg +0 -0
  119. package/public/pw/030.jpg +0 -0
  120. package/public/pw/031.jpg +0 -0
  121. package/public/pw/032.jpg +0 -0
  122. package/tsconfig.tsbuildinfo +0 -1
  123. /package/public/Images/{20.jpg → sample.jpg} +0 -0
@@ -1,300 +1,287 @@
1
- "use client";
2
-
3
- import { motion } from "framer-motion";
4
- import Image from "next/image";
5
- import {
6
- Card,
7
- CardBody,
8
- CardFooter,
9
- Divider,
10
- Button,
11
- Link,
12
- } from "@heroui/react";
13
-
14
- console.log("CertificatePage imports:", {
15
- motion,
16
- Card,
17
- CardBody,
18
- CardFooter,
19
- Divider,
20
- Button,
21
- Link,
22
- });
23
-
24
- const certificateData = {
25
- documentHeader: {
26
- government: "Government of West Bengal",
27
- department: "Law Department",
28
- office: "Office of the Registrar General of Marriages",
29
- certificateTitle: "Certificate of Marriage",
30
- legalAct: "Under Section 13 of Act XLIII of 1954",
31
- certificateNumber: "WB33800200010100002125-2025-141480",
32
- issueDate: "23-11-2025",
33
- declarationText:
34
- "The following is the extract of SOLEMNISATION OF MARRIAGE between the parties who made declaration u/s 11 of the Act.",
35
- },
36
- parties: {
37
- groom: {
38
- name: "Titas Mallick",
39
- fatherName: "Hasir Mallick",
40
- motherName: "Rumana Begum",
41
- dateOfBirth: "02-04-1996",
42
- aadhaarNo: "********7664",
43
- presentAddress:
44
- "56/D S.C. DEB STREET, KONNAGAR, DIST HOOGHLY, PO- KONNAGAR, PS- UTTARPARA, WEST BENGAL, INDIA, PIN-712235",
45
- permanentAddress:
46
- "56/D S.C. DEB STREET, KONNAGAR, DIST-HOOGHLY PO-KONNAGAR, PS- UTTARPARA, WEST BENGAL, INDIA, PIN-712235",
47
- signatureDate: "23-11-25",
48
- },
49
- bride: {
50
- name: "Sukanya Saha",
51
- fatherName: "Subhasis Saha",
52
- motherName: "Nupur Saha",
53
- dateOfBirth: "23-02-1995",
54
- aadhaarNo: "********9148",
55
- presentAddress:
56
- "45/H BARABAGAN LANE, MALLICKPARA, DIST-HOOGHLY, PO-MALLICK PARA, PS-SERAMPORE, WEST BENGAL, INDIA, PIN-712203",
57
- permanentAddress:
58
- "45/H BARABAGAN LANE, MALLICKPARA, DIST- HOOGHLY, PO-MALLICK PARA, PS- SERAMPORE, WEST BENGAL, INDIA, PIN- 712203",
59
- signatureDate: "23.11.25",
60
- },
61
- },
62
- solemnizationDetails: {
63
- date: "23-11-2025",
64
- actualPlace:
65
- "MOHAN JYOTI BANQUET HALL, 54A, G.T. ROAD, SERAMPORE, PS-SERAMPORE, PO-SERAMPORE, PIN-712201, DIST- HOOGHLY, WEST BENGAL",
66
- noticeDetails: {
67
- serialNumber: "2025-141480",
68
- date: "16-09-2025",
69
- section: "U/S-5",
70
- },
71
- },
72
- marriageOfficer: {
73
- name: "Srimonta Prosad Mondal",
74
- id: "WB33800200010100002125",
75
- officeAddress:
76
- "154, S.C CHATTERJEE STREET RAJRAJESWARITALA, SERAMPORE, HOOGHLY, WEST BENGAL, INDIA, PIN- 712235",
77
- contact: {
78
- phone: "9051920765",
79
- email: "spmondal1961@gmail.com",
80
- },
81
- },
82
- witnesses: [
83
- {
84
- name: "Subhasis Saha",
85
- relationshipDetails: "S/O Subodh Saha",
86
- address:
87
- "45/H, Barabagan Lane, P.O- Mallickpara, Pin-712203, Dist-Hooghly, W.B, India, P.S- Serampore",
88
- signatureDate: "23-11.2025",
89
- },
90
- {
91
- name: "Hasir Mallick",
92
- relationshipDetails: "S/O Golam Mallick",
93
- address:
94
- "56/D, S.C.Deb Street, P.O- Konnagar, Pin-712235, Dist-Hooghly, W.B, India, P.S- Uttarpara",
95
- signatureDate: "23.11.2025",
96
- },
97
- {
98
- name: "Nupur Saha",
99
- relationshipDetails: "W/O Subhasis Saha",
100
- address:
101
- "45/H, Barabagan Lane, P.O- Mallickpara, Pin-712203, Dist-Hooghly, W.B, India, P.S- Serampore",
102
- signatureDate: "23.11.2025",
103
- },
104
- ],
105
- verificationAndAuthority: {
106
- issueStatement:
107
- "Issued under Seal of Authority on this 24th day of, November (month), 2025 (year).",
108
- verificationStatement:
109
- "All the LTIs and Signatures are captured infront of me and those are duly verified by me.",
110
- systemNote: "System generated certificate & does not require signature.",
111
- contactEmails: ["rgm-wb@nic.in", "support.rgm-wb@gov.in"],
112
- verificationLink: "https://bit.ly/sukanya-titas-mar-reg",
113
- },
114
- };
115
-
116
- export default function CertificatePage() {
117
- return (
118
- <div className="min-h-screen p-4 sm:p-8 flex items-center justify-center font-sans">
119
- <motion.div
120
- className="w-full"
121
- initial={{ opacity: 0, scale: 0.95 }}
122
- animate={{ opacity: 1, scale: 1 }}
123
- transition={{ duration: 0.5 }}
124
- >
125
- <Card className="relative w-full max-w-4xl mx-auto rounded-2xl overflow-hidden shadow-2xl border border-gray-100 dark:border-gray-800 bg-white dark:bg-black/80 font-sans print:shadow-none print:border-none">
126
- {/* Verification Badge */}
127
- <div className="relative md:absolute md:top-4 md:right-4 mx-auto md:mx-0 mt-6 md:mt-0 w-fit bg-blue-100 dark:bg-blue-900 px-3 py-1 rounded-full shadow-lg border border-blue-200/50 flex items-center gap-2 z-10 print:hidden">
128
- <svg
129
- xmlns="http://www.w3.org/2000/svg"
130
- fill="none"
131
- viewBox="0 0 24 24"
132
- strokeWidth={1.5}
133
- stroke="currentColor"
134
- className="size-6"
135
- >
136
- <path
137
- strokeLinecap="round"
138
- strokeLinejoin="round"
139
- d="M9 12.75 11.25 15 15 9.75M21 12c0 1.268-.63 2.39-1.593 3.068a3.745 3.745 0 0 1-1.043 3.296 3.745 3.745 0 0 1-3.296 1.043A3.745 3.745 0 0 1 12 21c-1.268 0-2.39-.63-3.068-1.593a3.746 3.746 0 0 1-3.296-1.043 3.745 3.745 0 0 1-1.043-3.296A3.745 3.745 0 0 1 3 12c0-1.268.63-2.39 1.593-3.068a3.745 3.745 0 0 1 1.043-3.296 3.746 3.746 0 0 1 3.296-1.043A3.746 3.746 0 0 1 12 3c1.268 0 2.39.63 3.068 1.593a3.746 3.746 0 0 1 3.296 1.043 3.746 3.746 0 0 1 1.043 3.296A3.745 3.745 0 0 1 21 12Z"
140
- />
141
- </svg>
142
-
143
- <span className="text-xs font-bold text-blue-600 dark:text-blue-300 tracking-wide">
144
- VERIFIED
145
- </span>
146
- </div>
147
-
148
- <CardBody className="p-8 md:p-12">
149
- {/* Header */}
150
- <div className="text-center mb-8">
151
- <p className="text-sm font-semibold tracking-widest text-blue-500 uppercase">
152
- {certificateData.documentHeader.government}
153
- </p>
154
- <h1 className="text-2xl md:text-3xl font-bold font-serif text-gray-800 dark:text-gray-200 mt-2">
155
- {certificateData.documentHeader.certificateTitle}
156
- </h1>
157
- <p className="text-xs text-gray-500 mt-1">
158
- {certificateData.documentHeader.legalAct}
159
- </p>
160
- <p className="text-xs text-gray-400 mt-4 italic max-w-2xl mx-auto border-t border-b border-gray-100 dark:border-gray-800 py-2">
161
- "{certificateData.documentHeader.declarationText}"
162
- </p>
163
- </div>
164
-
165
- {/* Parties */}
166
- <div className="grid md:grid-cols-2 gap-8 my-8 border-t border-b border-gray-100 dark:border-gray-800 py-8">
167
- <div className="text-center md:text-left">
168
- <p className="text-xs text-gray-500 uppercase font-bold tracking-widest mb-2">
169
- Groom
170
- </p>
171
- <h2 className="text-xl font-serif font-bold text-gray-800 dark:text-gray-200 break-words">
172
- {certificateData.parties.groom.name}
173
- </h2>
174
- <div className="text-xs text-gray-500/80 mt-2 space-y-1">
175
- <p>S/O {certificateData.parties.groom.fatherName}</p>
176
- <p>& {certificateData.parties.groom.motherName}</p>
177
- <p>Born: {certificateData.parties.groom.dateOfBirth}</p>
178
- <p>Aadhaar: {certificateData.parties.groom.aadhaarNo}</p>
179
- </div>
180
- <p className="text-xs text-gray-500/80 mt-2">
181
- <strong className="font-semibold">Address:</strong>{" "}
182
- {certificateData.parties.groom.presentAddress}
183
- </p>
184
- </div>
185
- <div className="text-center md:text-right">
186
- <p className="text-xs text-gray-500 uppercase font-bold tracking-widest mb-2">
187
- Bride
188
- </p>
189
- <h2 className="text-xl font-serif font-bold text-gray-800 dark:text-gray-200 break-words">
190
- {certificateData.parties.bride.name}
191
- </h2>
192
- <div className="text-xs text-gray-500/80 mt-2 space-y-1">
193
- <p>D/O {certificateData.parties.bride.fatherName}</p>
194
- <p>& {certificateData.parties.bride.motherName}</p>
195
- <p>Born: {certificateData.parties.bride.dateOfBirth}</p>
196
- <p>Aadhaar: {certificateData.parties.bride.aadhaarNo}</p>
197
- </div>
198
- <p className="text-xs text-gray-500/80 mt-2">
199
- <strong className="font-semibold">Address:</strong>{" "}
200
- {certificateData.parties.bride.presentAddress}
201
- </p>
202
- </div>
203
- </div>
204
-
205
- {/* Details Grid */}
206
- <div className="grid md:grid-cols-3 gap-8 text-sm text-default-600 dark:text-default-300">
207
- {/* Solemnization Details */}
208
- <div className="space-y-2">
209
- <h3 className="font-bold text-gray-800 dark:text-gray-100 tracking-wider uppercase">
210
- Solemnization
211
- </h3>
212
- <p>
213
- <strong className="text-gray-900 dark:text-gray-100">Date:</strong>{" "}
214
- {certificateData.solemnizationDetails.date}
215
- </p>
216
- <p>
217
- <strong className="text-gray-900 dark:text-gray-100">Place:</strong>{" "}
218
- {certificateData.solemnizationDetails.actualPlace}
219
- </p>
220
- <div className="mt-2 pt-2 border-t border-dashed border-gray-200 dark:border-gray-700">
221
- <p className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase">Notice Details</p>
222
- <p className="text-xs">No: {certificateData.solemnizationDetails.noticeDetails.serialNumber}</p>
223
- <p className="text-xs">Date: {certificateData.solemnizationDetails.noticeDetails.date}</p>
224
- <p className="text-xs">Sec: {certificateData.solemnizationDetails.noticeDetails.section}</p>
225
- </div>
226
-
227
- <h3 className="font-bold text-gray-800 dark:text-gray-100 tracking-wider uppercase mt-6 pt-4 border-t border-gray-100 dark:border-gray-800">
228
- Marriage Officer
229
- </h3>
230
- <p>
231
- <strong className="text-gray-900 dark:text-gray-100">Name:</strong> {certificateData.marriageOfficer.name}
232
- </p>
233
- <p>
234
- <strong className="text-gray-900 dark:text-gray-100">ID:</strong> {certificateData.marriageOfficer.id}
235
- </p>
236
- <p className="text-xs text-gray-600 dark:text-default-400 mt-1">
237
- {certificateData.marriageOfficer.officeAddress}
238
- </p>
239
- <div className="mt-1 text-xs text-gray-500 dark:text-default-500">
240
- <p>Ph: {certificateData.marriageOfficer.contact.phone}</p>
241
- <p>Email: {certificateData.marriageOfficer.contact.email}</p>
242
- </div>
243
- </div>
244
-
245
- {/* Witnesses */}
246
- <div className="space-y-4 md:col-span-2">
247
- <h3 className="font-bold text-gray-800 dark:text-gray-100 tracking-wider uppercase border-b border-gray-100 dark:border-gray-800 pb-2">
248
- Witnesses
249
- </h3>
250
- <div className="grid sm:grid-cols-1 lg:grid-cols-3 gap-6">
251
- {certificateData.witnesses.map((witness, index) => (
252
- <div key={index} className="space-y-1">
253
- <p className="font-bold text-gray-800 dark:text-gray-100">
254
- {witness.name}
255
- </p>
256
- <p className="text-[10px] text-gray-500 dark:text-default-500 italic">
257
- {witness.relationshipDetails}
258
- </p>
259
- <p className="text-[10px] leading-relaxed text-gray-600 dark:text-default-400">
260
- {witness.address}
261
- </p>
262
- <p className="text-[10px] font-mono text-blue-500/70 dark:text-blue-400/80">
263
- Signed: {witness.signatureDate}
264
- </p>
265
- </div>
266
- ))}
267
- </div>
268
- </div>
269
- </div>
270
- </CardBody>
271
-
272
- <Divider className="my-0" />
273
-
274
- <CardFooter className="bg-gray-50 dark:bg-black/50 p-6 flex flex-col md:flex-row justify-between items-center gap-4 text-xs print:hidden">
275
- <div className="text-center md:text-left">
276
- <p className="font-mono text-gray-500/80">
277
- {certificateData.documentHeader.certificateNumber}
278
- </p>
279
- <p className="text-gray-500 mt-1">
280
- {certificateData.verificationAndAuthority.issueStatement}
281
- </p>
282
- </div>
283
- <div className="flex gap-2 mt-4 md:mt-0">
284
- <Button
285
- as={Link}
286
- href={certificateData.verificationAndAuthority.verificationLink}
287
- isExternal
288
- size="sm"
289
- color="primary"
290
- variant="flat"
291
- >
292
- Verify Certificate
293
- </Button>
294
- </div>
295
- </CardFooter>
296
- </Card>
297
- </motion.div>
298
- </div>
299
- );
300
- }
1
+ "use client";
2
+
3
+ import { motion } from "framer-motion";
4
+ import Image from "next/image";
5
+ import {
6
+ Card,
7
+ CardBody,
8
+ CardFooter,
9
+ Divider,
10
+ Button,
11
+ Link,
12
+ } from "@heroui/react";
13
+
14
+ const certificateData = {
15
+ documentHeader: {
16
+ government: "Government of State",
17
+ department: "Law Department",
18
+ office: "Office of the Registrar General of Marriages",
19
+ certificateTitle: "Certificate of Marriage",
20
+ legalAct: "Under Section 13 of Act XLIII of 1954",
21
+ certificateNumber: "XX********************-2025-******",
22
+ issueDate: "01-01-2026",
23
+ declarationText:
24
+ "The following is the extract of SOLEMNISATION OF MARRIAGE between the parties who made declaration u/s 11 of the Act.",
25
+ },
26
+ parties: {
27
+ groom: {
28
+ name: "Groom Name",
29
+ fatherName: "Father Name",
30
+ motherName: "Mother Name",
31
+ dateOfBirth: "DD-MM-YYYY",
32
+ aadhaarNo: "********0000",
33
+ presentAddress:
34
+ "SAMPLE ADDRESS, CITY, DIST, STATE, INDIA, PIN-000000",
35
+ permanentAddress:
36
+ "SAMPLE ADDRESS, CITY, DIST, STATE, INDIA, PIN-000000",
37
+ signatureDate: "DD-MM-YY",
38
+ },
39
+ bride: {
40
+ name: "Bride Name",
41
+ fatherName: "Father Name",
42
+ motherName: "Mother Name",
43
+ dateOfBirth: "DD-MM-YYYY",
44
+ aadhaarNo: "********0000",
45
+ presentAddress:
46
+ "SAMPLE ADDRESS, CITY, DIST, STATE, INDIA, PIN-000000",
47
+ permanentAddress:
48
+ "SAMPLE ADDRESS, CITY, DIST, STATE, INDIA, PIN-000000",
49
+ signatureDate: "DD-MM-YY",
50
+ },
51
+ },
52
+ solemnizationDetails: {
53
+ date: "DD-MM-YYYY",
54
+ actualPlace:
55
+ "SAMPLE VENUE NAME, ADDRESS, CITY, STATE, PIN-000000",
56
+ noticeDetails: {
57
+ serialNumber: "2025-******",
58
+ date: "DD-MM-YYYY",
59
+ section: "U/S-5",
60
+ },
61
+ },
62
+ marriageOfficer: {
63
+ name: "Officer Name",
64
+ id: "XX********************",
65
+ officeAddress:
66
+ "SAMPLE OFFICE ADDRESS, CITY, STATE, PIN-000000",
67
+ contact: {
68
+ phone: "**********",
69
+ email: "**********@example.com",
70
+ },
71
+ },
72
+ witnesses: [
73
+ {
74
+ name: "Witness 1",
75
+ relationshipDetails: "S/O Sample Name",
76
+ address: "Sample Address, City, Pin-000000",
77
+ signatureDate: "DD-MM-YYYY",
78
+ },
79
+ {
80
+ name: "Witness 2",
81
+ relationshipDetails: "S/O Sample Name",
82
+ address: "Sample Address, City, Pin-000000",
83
+ signatureDate: "DD-MM-YYYY",
84
+ },
85
+ {
86
+ name: "Witness 3",
87
+ relationshipDetails: "W/O Sample Name",
88
+ address: "Sample Address, City, Pin-000000",
89
+ signatureDate: "DD-MM-YYYY",
90
+ },
91
+ ],
92
+ verificationAndAuthority: {
93
+ issueStatement:
94
+ "Issued under Seal of Authority on this day.",
95
+ verificationStatement:
96
+ "All the LTIs and Signatures are captured infront of me and those are duly verified by me.",
97
+ systemNote: "System generated certificate & does not require signature.",
98
+ contactEmails: ["support@example.gov"],
99
+ verificationLink: "#",
100
+ },
101
+ };
102
+
103
+ export default function CertificatePage() {
104
+ return (
105
+ <div className="min-h-screen p-4 sm:p-8 flex items-center justify-center font-sans">
106
+ <motion.div
107
+ className="w-full"
108
+ initial={{ opacity: 0, scale: 0.95 }}
109
+ animate={{ opacity: 1, scale: 1 }}
110
+ transition={{ duration: 0.5 }}
111
+ >
112
+ <Card className="relative w-full max-w-4xl mx-auto rounded-2xl overflow-hidden shadow-2xl border border-gray-100 dark:border-gray-800 bg-white dark:bg-black/80 font-sans print:shadow-none print:border-none">
113
+ {/* Verification Badge */}
114
+ <div className="relative md:absolute md:top-4 md:right-4 mx-auto md:mx-0 mt-6 md:mt-0 w-fit bg-blue-100 dark:bg-blue-900 px-3 py-1 rounded-full shadow-lg border border-blue-200/50 flex items-center gap-2 z-10 print:hidden">
115
+ <svg
116
+ xmlns="http://www.w3.org/2000/svg"
117
+ fill="none"
118
+ viewBox="0 0 24 24"
119
+ strokeWidth={1.5}
120
+ stroke="currentColor"
121
+ className="size-6"
122
+ >
123
+ <path
124
+ strokeLinecap="round"
125
+ strokeLinejoin="round"
126
+ d="M9 12.75 11.25 15 15 9.75M21 12c0 1.268-.63 2.39-1.593 3.068a3.745 3.745 0 0 1-1.043 3.296 3.745 3.745 0 0 1-3.296 1.043A3.745 3.745 0 0 1 12 21c-1.268 0-2.39-.63-3.068-1.593a3.746 3.746 0 0 1-3.296-1.043 3.745 3.745 0 0 1-1.043-3.296A3.745 3.745 0 0 1 3 12c0-1.268.63-2.39 1.593-3.068a3.745 3.745 0 0 1 1.043-3.296 3.746 3.746 0 0 1 3.296-1.043A3.746 3.746 0 0 1 12 3c1.268 0 2.39.63 3.068 1.593a3.746 3.746 0 0 1 3.296 1.043 3.746 3.746 0 0 1 1.043 3.296A3.745 3.745 0 0 1 21 12Z"
127
+ />
128
+ </svg>
129
+
130
+ <span className="text-xs font-bold text-blue-600 dark:text-blue-300 tracking-wide">
131
+ VERIFIED
132
+ </span>
133
+ </div>
134
+
135
+ <CardBody className="p-8 md:p-12">
136
+ {/* Header */}
137
+ <div className="text-center mb-8">
138
+ <p className="text-sm font-semibold tracking-widest text-blue-500 uppercase">
139
+ {certificateData.documentHeader.government}
140
+ </p>
141
+ <h1 className="text-2xl md:text-3xl font-bold font-serif text-gray-800 dark:text-gray-200 mt-2">
142
+ {certificateData.documentHeader.certificateTitle}
143
+ </h1>
144
+ <p className="text-xs text-gray-500 mt-1">
145
+ {certificateData.documentHeader.legalAct}
146
+ </p>
147
+ <p className="text-xs text-gray-400 mt-4 italic max-w-2xl mx-auto border-t border-b border-gray-100 dark:border-gray-800 py-2">
148
+ "{certificateData.documentHeader.declarationText}"
149
+ </p>
150
+ </div>
151
+
152
+ {/* Parties */}
153
+ <div className="grid md:grid-cols-2 gap-8 my-8 border-t border-b border-gray-100 dark:border-gray-800 py-8">
154
+ <div className="text-center md:text-left">
155
+ <p className="text-xs text-gray-500 uppercase font-bold tracking-widest mb-2">
156
+ Groom
157
+ </p>
158
+ <h2 className="text-xl font-serif font-bold text-gray-800 dark:text-gray-200 break-words">
159
+ {certificateData.parties.groom.name}
160
+ </h2>
161
+ <div className="text-xs text-gray-500/80 mt-2 space-y-1">
162
+ <p>S/O {certificateData.parties.groom.fatherName}</p>
163
+ <p>& {certificateData.parties.groom.motherName}</p>
164
+ <p>Born: {certificateData.parties.groom.dateOfBirth}</p>
165
+ <p>Aadhaar: {certificateData.parties.groom.aadhaarNo}</p>
166
+ </div>
167
+ <p className="text-xs text-gray-500/80 mt-2">
168
+ <strong className="font-semibold">Address:</strong>{" "}
169
+ {certificateData.parties.groom.presentAddress}
170
+ </p>
171
+ </div>
172
+ <div className="text-center md:text-right">
173
+ <p className="text-xs text-gray-500 uppercase font-bold tracking-widest mb-2">
174
+ Bride
175
+ </p>
176
+ <h2 className="text-xl font-serif font-bold text-gray-800 dark:text-gray-200 break-words">
177
+ {certificateData.parties.bride.name}
178
+ </h2>
179
+ <div className="text-xs text-gray-500/80 mt-2 space-y-1">
180
+ <p>D/O {certificateData.parties.bride.fatherName}</p>
181
+ <p>& {certificateData.parties.bride.motherName}</p>
182
+ <p>Born: {certificateData.parties.bride.dateOfBirth}</p>
183
+ <p>Aadhaar: {certificateData.parties.bride.aadhaarNo}</p>
184
+ </div>
185
+ <p className="text-xs text-gray-500/80 mt-2">
186
+ <strong className="font-semibold">Address:</strong>{" "}
187
+ {certificateData.parties.bride.presentAddress}
188
+ </p>
189
+ </div>
190
+ </div>
191
+
192
+ {/* Details Grid */}
193
+ <div className="grid md:grid-cols-3 gap-8 text-sm text-default-600 dark:text-default-300">
194
+ {/* Solemnization Details */}
195
+ <div className="space-y-2">
196
+ <h3 className="font-bold text-gray-800 dark:text-gray-100 tracking-wider uppercase">
197
+ Solemnization
198
+ </h3>
199
+ <p>
200
+ <strong className="text-gray-900 dark:text-gray-100">Date:</strong>{" "}
201
+ {certificateData.solemnizationDetails.date}
202
+ </p>
203
+ <p>
204
+ <strong className="text-gray-900 dark:text-gray-100">Place:</strong>{" "}
205
+ {certificateData.solemnizationDetails.actualPlace}
206
+ </p>
207
+ <div className="mt-2 pt-2 border-t border-dashed border-gray-200 dark:border-gray-700">
208
+ <p className="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase">Notice Details</p>
209
+ <p className="text-xs">No: {certificateData.solemnizationDetails.noticeDetails.serialNumber}</p>
210
+ <p className="text-xs">Date: {certificateData.solemnizationDetails.noticeDetails.date}</p>
211
+ <p className="text-xs">Sec: {certificateData.solemnizationDetails.noticeDetails.section}</p>
212
+ </div>
213
+
214
+ <h3 className="font-bold text-gray-800 dark:text-gray-100 tracking-wider uppercase mt-6 pt-4 border-t border-gray-100 dark:border-gray-800">
215
+ Marriage Officer
216
+ </h3>
217
+ <p>
218
+ <strong className="text-gray-900 dark:text-gray-100">Name:</strong> {certificateData.marriageOfficer.name}
219
+ </p>
220
+ <p>
221
+ <strong className="text-gray-900 dark:text-gray-100">ID:</strong> {certificateData.marriageOfficer.id}
222
+ </p>
223
+ <p className="text-xs text-gray-600 dark:text-default-400 mt-1">
224
+ {certificateData.marriageOfficer.officeAddress}
225
+ </p>
226
+ <div className="mt-1 text-xs text-gray-500 dark:text-default-500">
227
+ <p>Ph: {certificateData.marriageOfficer.contact.phone}</p>
228
+ <p>Email: {certificateData.marriageOfficer.contact.email}</p>
229
+ </div>
230
+ </div>
231
+
232
+ {/* Witnesses */}
233
+ <div className="space-y-4 md:col-span-2">
234
+ <h3 className="font-bold text-gray-800 dark:text-gray-100 tracking-wider uppercase border-b border-gray-100 dark:border-gray-800 pb-2">
235
+ Witnesses
236
+ </h3>
237
+ <div className="grid sm:grid-cols-1 lg:grid-cols-3 gap-6">
238
+ {certificateData.witnesses.map((witness, index) => (
239
+ <div key={index} className="space-y-1">
240
+ <p className="font-bold text-gray-800 dark:text-gray-100">
241
+ {witness.name}
242
+ </p>
243
+ <p className="text-[10px] text-gray-500 dark:text-default-500 italic">
244
+ {witness.relationshipDetails}
245
+ </p>
246
+ <p className="text-[10px] leading-relaxed text-gray-600 dark:text-default-400">
247
+ {witness.address}
248
+ </p>
249
+ <p className="text-[10px] font-mono text-blue-500/70 dark:text-blue-400/80">
250
+ Signed: {witness.signatureDate}
251
+ </p>
252
+ </div>
253
+ ))}
254
+ </div>
255
+ </div>
256
+ </div>
257
+ </CardBody>
258
+
259
+ <Divider className="my-0" />
260
+
261
+ <CardFooter className="bg-gray-50 dark:bg-black/50 p-6 flex flex-col md:flex-row justify-between items-center gap-4 text-xs print:hidden">
262
+ <div className="text-center md:text-left">
263
+ <p className="font-mono text-gray-500/80">
264
+ {certificateData.documentHeader.certificateNumber}
265
+ </p>
266
+ <p className="text-gray-500 mt-1">
267
+ {certificateData.verificationAndAuthority.issueStatement}
268
+ </p>
269
+ </div>
270
+ <div className="flex gap-2 mt-4 md:mt-0">
271
+ <Button
272
+ as={Link}
273
+ href={certificateData.verificationAndAuthority.verificationLink}
274
+ isExternal
275
+ size="sm"
276
+ color="primary"
277
+ variant="flat"
278
+ >
279
+ Verify Certificate
280
+ </Button>
281
+ </div>
282
+ </CardFooter>
283
+ </Card>
284
+ </motion.div>
285
+ </div>
286
+ );
287
+ }
@@ -3,6 +3,7 @@ import { Divider } from "@heroui/divider";
3
3
 
4
4
  import { fontCursive } from "@/config/fonts";
5
5
  import { HeartFilledIcon } from "@/components/icons";
6
+ import { AdminAuth } from "./AdminAuth";
6
7
 
7
8
  export const Footer = () => {
8
9
  const currentYear = new Date().getFullYear();
@@ -75,6 +76,7 @@ export const Footer = () => {
75
76
  <span>&copy; {currentYear} Made with</span>
76
77
  <HeartFilledIcon className="text-wedding-pink-500 w-3 h-3 animate-pulse" />
77
78
  <span>by Titas Mallick</span>
79
+ <AdminAuth />
78
80
  </div>
79
81
 
80
82
  <div className="flex gap-6">