From ad9754312fee52e091317a1d750cbf8c1b4d8f63 Mon Sep 17 00:00:00 2001 From: Krishna Das Date: Thu, 30 Jul 2026 21:15:45 +0530 Subject: [PATCH 01/54] FED KIIT Clone in Next.js Pixel-for-pixel port of FED-Frontend (React 18 + Vite) and FED-Backend (Express) into a single Next.js 16 App Router application, running against the same MongoDB. The original SCSS modules are carried over verbatim (84 stylesheets, 24 image assets) and components keep their original markup and class names, which is what makes the replica indistinguishable from the original rather than merely similar. URLs keep the original casing (/Events, /Team, /Login). Verified against both apps running side by side: - /Events and /Team render at identical total page height (6109px, 9461px) with matching element counts and computed styles - All five public API responses are byte-identical to the Express server - typecheck clean, eslint 0 errors, build 68 routes, npm audit 0 vulns Includes all 48 Express endpoints, ported as Route Handlers preserving the original JSON contracts. Security fixes (npm audit 44 -> 0): - xlsx moved to the official SheetJS distribution (prototype pollution) - react-share-social removed for a local react-share component (-530 pkgs) - postcss and sharp pinned to patched versions via overrides - JWT_SECRET was 4 characters; replaced with 64 bytes of CSPRNG entropy, which rotates existing sessions - BCRYPT_SALT_ROUNDS held a bcrypt salt string rather than a cost factor - contact endpoint now validates email format and message length See MIGRATION.md for the full record, including known issues. --- .env.example | 86 + .gitignore | 2 + MIGRATION.md | 273 + app/(auth)/ForgotPassword/page.jsx | 9 + app/(auth)/Login/page.jsx | 9 + app/(auth)/SignUp/page.jsx | 9 + app/(auth)/completeProfile/page.jsx | 9 + app/(auth)/layout.jsx | 11 + app/(auth)/otp/page.jsx | 9 + app/(main)/Alumni/page.jsx | 9 + app/(main)/Blog/page.jsx | 9 + app/(main)/Events/[eventId]/Form/page.jsx | 26 + app/(main)/Events/[eventId]/page.jsx | 19 + app/(main)/Events/[eventId]/team/page.jsx | 21 + app/(main)/Events/page.jsx | 9 + app/(main)/Events/pastEvents/page.jsx | 9 + app/(main)/PrivacyPolicy/page.jsx | 9 + app/(main)/Social/page.jsx | 9 + app/(main)/Team/page.jsx | 9 + app/(main)/TermsAndConditions/page.jsx | 9 + app/(main)/layout.jsx | 36 + app/(main)/page.jsx | 9 + app/(main)/profile/BlogForm/page.jsx | 9 + app/(main)/profile/Form/page.jsx | 9 + app/(main)/profile/attendance/page.jsx | 9 + app/(main)/profile/certificates/page.jsx | 9 + app/(main)/profile/events/page.jsx | 18 + app/(main)/profile/layout.jsx | 106 + app/(main)/profile/members/page.jsx | 9 + app/(main)/profile/page.jsx | 9 + app/(main)/verify/certificate/page.jsx | 21 + app/api/auth/changePassword/route.ts | 49 + app/api/auth/forgotPassword/route.ts | 34 + app/api/auth/googleAuth/route.ts | 35 + app/api/auth/login/route.ts | 57 + app/api/auth/logout/route.ts | 13 + app/api/auth/register/route.ts | 94 + app/api/auth/verifyEmail/route.ts | 36 + app/api/blog/createBlog/route.ts | 73 + app/api/blog/deleteBlog/[id]/route.ts | 34 + app/api/blog/getBlog/route.ts | 21 + app/api/blog/updateBlog/[id]/route.ts | 79 + .../addCertificateTemplate/route.ts | 35 + app/api/certificate/dummyCertificate/route.ts | 28 + .../sendCertificatesAndEvents/route.ts | 36 + .../testCertificateSending/route.ts | 33 + .../certificate/verifyCertificate/route.ts | 22 + app/api/chatbot/health/route.ts | 21 + app/api/chatbot/message/route.ts | 48 + app/api/chatbot/send-email/route.ts | 72 + app/api/form/addForm/route.ts | 104 + app/api/form/allJoinRequestUpdates/route.ts | 21 + app/api/form/attendanceCode/[id]/route.ts | 23 + app/api/form/contact/route.ts | 68 + app/api/form/createTeam/route.ts | 19 + app/api/form/deleteForm/[id]/route.ts | 48 + app/api/form/download/[id]/route.ts | 32 + app/api/form/editForm/[id]/route.ts | 117 + app/api/form/export-attendance/[id]/route.ts | 29 + app/api/form/getAllForms/route.ts | 37 + app/api/form/getFormAnalytics/[id]/route.ts | 48 + app/api/form/inviteLink/[formId]/route.ts | 22 + app/api/form/inviteTeamMember/route.ts | 29 + .../form/joinRequestUpdates/[formId]/route.ts | 22 + app/api/form/joinTeam/route.ts | 19 + app/api/form/leaveTeam/route.ts | 19 + app/api/form/markAttendance/route.ts | 25 + app/api/form/register/route.ts | 237 + app/api/form/removeTeamMember/route.ts | 19 + app/api/form/renameTeam/route.ts | 19 + app/api/form/respondJoinRequest/route.ts | 64 + app/api/form/searchTeams/[formId]/route.ts | 24 + app/api/form/sendJoinRequest/route.ts | 26 + app/api/form/teamDetails/[formId]/route.ts | 67 + app/api/gemini/autofill/route.ts | 29 + app/api/gemini/summary/route.ts | 24 + app/api/user/addMember/route.ts | 97 + app/api/user/deleteMember/[id]/route.ts | 42 + app/api/user/editDetails/route.ts | 76 + app/api/user/editProfileImage/route.ts | 59 + app/api/user/fetchAccessTypes/route.ts | 14 + app/api/user/fetchAlumni/route.ts | 31 + app/api/user/fetchProfile/route.ts | 24 + app/api/user/fetchTeam/route.ts | 32 + app/globals.css | 26 - app/globals.scss | 102 + app/layout.tsx | 113 +- app/not-found.tsx | 20 + app/opengraph-image.tsx | 130 + app/page.tsx | 11 - app/robots.ts | 36 + app/sitemap.ts | 65 + components/seo/JsonLd.tsx | 26 + data/Carousel.json | 18 + data/Feedback.json | 47 + data/SocialLink.json | 10 + data/Sponser.json | 98 + data/Team.json | 534 ++ eslint.config.mjs | 40 + lib/api/errors.ts | 37 + lib/api/express.ts | 57 + lib/api/rate-limit.ts | 87 + lib/api/respond.ts | 99 + lib/auth/access.ts | 97 + lib/auth/password.ts | 53 + lib/auth/session.ts | 100 + lib/content/legal.ts | 172 + lib/db.ts | 28 + lib/email/mailer.ts | 104 + lib/email/templates.ts | 260 + lib/env.ts | 77 + lib/seo/metadata.ts | 92 + lib/seo/structured-data.ts | 192 + lib/services/attendance.ts | 227 + lib/services/auth.ts | 261 + lib/services/auth.types.ts | 17 + lib/services/blogs.ts | 123 + lib/services/certificates.ts | 244 + lib/services/chatbot.ts | 207 + lib/services/contact.ts | 44 + lib/services/events.ts | 247 + lib/services/gemini-blog.ts | 218 + lib/services/otp.ts | 170 + lib/services/people.ts | 201 + lib/services/registration.ts | 297 + lib/services/team-invites.ts | 418 ++ lib/services/teams.ts | 303 + lib/services/upload.ts | 94 + lib/site.ts | 116 + lib/types/event.ts | 80 + lib/utils.ts | 76 + lib/validation/auth.ts | 116 + next.config.ts | 59 +- package-lock.json | 6624 +++++++++++++---- package.json | 65 +- postcss.config.mjs | 7 - prisma/schema.prisma | 285 + proxy.ts | 113 + scripts/with-env.mjs | 91 + src/assets/animations/AnimatedBox.jsx | 39 + src/assets/animations/socialPageAnimation.jsx | 45 + src/assets/images/Complete.svg | 1 + src/assets/images/FedLogo.png | Bin 0 -> 3571 bytes src/assets/images/Logo/FED.svg | 9 + src/assets/images/Logo/logo.svg | 45 + src/assets/images/SocialMedia/instaLogo.svg | 9 + .../images/SocialMedia/linkedinLogo.svg | 9 + src/assets/images/camera.svg | 4 + src/assets/images/contact.png | Bin 0 -> 563121 bytes src/assets/images/defaultEventModal.png | Bin 0 -> 44383 bytes src/assets/images/defaultImg.jpg | Bin 0 -> 5472 bytes src/assets/images/errorPage.jpg | Bin 0 -> 52563 bytes src/assets/images/fedShow.svg | 9 + src/assets/images/geminiLogo.svg | 1 + src/assets/images/google.png | Bin 0 -> 4814 bytes src/assets/images/googleIcon.svg | 49 + src/assets/images/groups.svg | 10 + src/assets/images/lock.svg | 8 + src/assets/images/quote.png | Bin 0 -> 8885 bytes src/assets/images/ring.svg | 9 + src/assets/images/rupeeIcon.svg | 3 + src/assets/images/shareOutline.svg | 6 + src/assets/styles/Global.scss | 21 + .../Login/ForgotPassword/OTPInput.jsx | 25 + .../Login/ForgotPassword/SendOtp.jsx | 161 + .../styles/OTPInput.module.scss | 284 + .../styles/forgotPassword.module.scss | 205 + src/authentication/Login/GoogleLogin.jsx | 161 + src/authentication/Login/Login.jsx | 269 + .../Login/styles/Login.module.scss | 195 + src/authentication/SignUp/CompleteProfile.jsx | 272 + src/authentication/SignUp/GoogleSignup.jsx | 151 + src/authentication/SignUp/SignUP.jsx | 577 ++ .../SignUp/style/CompleteProfile.module.scss | 185 + .../SignUp/style/Signup.module.scss | 254 + src/components/BlogCard/BlogCard.jsx | 168 + .../BlogCard/styles/BlogCard.module.scss | 483 ++ src/components/Carousel/Carousel.jsx | 127 + .../Carousel/styles/Carousel.module.scss | 241 + src/components/Chatbot/Chatbot.jsx | 529 ++ src/components/Chatbot/Chatbot.module.scss | 701 ++ src/components/Chatbot/index.jsx | 8 + src/components/Core/Button.jsx | 46 + src/components/Core/Input.jsx | 584 ++ src/components/Core/Text.jsx | 73 + src/components/Core/index.jsx | 6 + src/components/Core/styles/Core.module.scss | 109 + src/components/EventCard/EventCard.jsx | 674 ++ .../EventCard/styles/EventCard.module.scss | 318 + src/components/Form/FormField.jsx | 306 + src/components/Form/PopField.jsx | 184 + src/components/Form/Section.jsx | 657 ++ src/components/Form/SectionValidation.jsx | 135 + src/components/Form/index.jsx | 5 + src/components/Form/styles/Form.module.scss | 113 + .../LiveEvents/Accordian/Accordian.jsx | 117 + .../Accordian/styles/Accordion.module.scss | 372 + src/components/OtpInput/OtpInput.jsx | 342 + .../OtpInput/style/otpinput.module.scss | 263 + src/components/ProtectedRoute.jsx | 47 + src/components/ShareSocial/ShareSocial.jsx | 145 + src/components/SocialEmbed/SocialEmbed.jsx | 67 + src/components/TeamCard/TeamCard.jsx | 271 + .../TeamCard/styles/TeamCard.module.scss | 302 + src/components/index.jsx | 11 + src/context/AuthContext.tsx | 356 + src/context/Providers.jsx | 29 + src/context/RecoveryContext.jsx | 69 + src/data/Access.json | 20 + src/data/Carousel.json | 18 + src/data/Feedback.json | 47 + src/data/FormData.json | 1810 +++++ src/data/SocialLink.json | 10 + src/data/Sponser.json | 98 + src/data/Team.json | 534 ++ .../Pixel_AI_Hack/Pixel_AI_Hack.json | 50 + src/data/liveEvents/gsoc/Gsoc.json | 42 + src/data/liveEvents/omega/Accordion.json | 89 + src/data/liveEvents/omega/Event.json | 23 + src/data/liveEvents/omega/Speakers.json | 27 + src/data/liveEvents/omega/Sponsor.json | 33 + src/data/user.json | 98 + src/features/Modals/EditProfile/EditImage.jsx | 328 + .../Modals/EditProfile/EditProfile.jsx | 392 + .../styles/EditProfile.module.scss | 183 + .../EditProfile/styles/editImage.module.scss | 138 + .../Modals/Event/EventModal/EventModal.jsx | 615 ++ .../EventModal/styles/EventModal.module.scss | 500 ++ .../Modals/Event/EventStats/EventStats.jsx | 472 ++ .../EventStats/styles/EventStats.module.scss | 0 .../Event/LiveEventPopup/LiveEventPopup.jsx | 88 + .../styles/LiveEventPopup.module.scss | 132 + .../Modals/Event/QRCodeModal/QRCodeModal.jsx | 144 + .../Modals/Event/QRCodeModal/index.jsx | 3 + .../styles/QRCodeModal.module.scss | 396 + .../Modals/Event/ShareModal/ShareModal.jsx | 127 + .../Modals/Event/ShareModal/ShareTeamData.jsx | 181 + .../ShareModal/styles/ShareModal.module.scss | 48 + .../styles/ShareTeamData.module.scss | 163 + .../TeamDetailsModal/TeamDetailsModal.jsx | 223 + .../Modals/Event/TeamDetailsModal/index.jsx | 3 + .../style/TeamDetailsModal.module.scss | 373 + .../Modals/Profile/Admin/PreviewForm.jsx | 771 ++ .../Modals/Profile/Admin/SectionModal.jsx | 147 + .../Profile/Admin/styles/Preview.module.scss | 150 + .../Modals/authentication/OtpInputModal.jsx | 56 + src/features/Modals/index.jsx | 19 + src/features/index.jsx | 3 + src/index.scss | 80 + src/layouts/Blog/LeftSidebar/LeftSidebar.jsx | 83 + .../styles/LeftSidebar.module.scss | 182 + .../Blog/RightSidebar/RightSidebar.jsx | 95 + .../styles/RightSidebar.module.scss | 159 + src/layouts/Blog/TabBar/TabBar.jsx | 44 + .../Blog/TabBar/styles/TabBar.module.scss | 111 + src/layouts/Footer/Footer.jsx | 196 + src/layouts/Footer/styles/Footer.module.scss | 255 + src/layouts/Navbar/Navbar.tsx | 276 + src/layouts/Navbar/styles/Navbar.module.scss | 418 ++ .../Profile/ProfileLayout/ProfileLayout.jsx | 21 + .../styles/ProfileLayout.module.scss | 28 + src/layouts/Profile/Sidebar/Sidebar.jsx | 350 + .../Sidebar/styles/Sidebar.module.scss | 215 + src/layouts/Profile/index.jsx | 5 + src/layouts/Skeleton/Carousel/Carousel.jsx | 20 + .../Carousel/styles/Carousel.module.scss | 70 + .../Skeleton/EventCard/EventCardSkeleton.jsx | 28 + .../styles/eventskeleton.module.scss | 25 + src/layouts/Skeleton/Sponser/Sponser.jsx | 14 + .../Sponser/styles/Sponser.module.scss | 59 + src/layouts/Skeleton/TeamCard/TeamCard.jsx | 20 + .../TeamCard/styles/TeamCard.module.scss | 67 + src/layouts/index.jsx | 6 + src/microInteraction/Alert/Alert.tsx | 114 + .../Alert/styles/Alert.module.scss | 0 src/microInteraction/Load/ComponentLoad.tsx | 45 + src/microInteraction/Load/Load.tsx | 20 + src/microInteraction/Load/MicroLoad.tsx | 30 + .../Load/styles/MicroLoad.module.scss | 10 + .../Load/styles/load.module.scss | 30 + src/microInteraction/index.ts | 6 + src/sections/Home/About/About.jsx | 56 + .../Home/About/styles/About.module.scss | 714 ++ src/sections/Home/Contact/Contact.jsx | 142 + .../Home/Contact/styles/Contact.module.scss | 273 + src/sections/Home/Feedback/Feedback.jsx | 80 + .../Home/Feedback/styles/Feedback.module.scss | 217 + src/sections/Home/Hero/Hero.jsx | 102 + .../Home/Hero/styles/Hero.module.scss | 219 + src/sections/Home/Sponser/Sponser.jsx | 94 + .../Home/Sponser/styles/Sponser.module.scss | 256 + src/sections/Home/index.jsx | 9 + .../LiveEvents/Omega/Accordion/Accordion.jsx | 113 + .../Accordion/styles/Accordion.module.scss | 161 + .../LiveEvents/Omega/Attend/Attend.jsx | 51 + .../Omega/Attend/styles/Attend.module.scss | 197 + src/sections/LiveEvents/Omega/Event/Event.jsx | 249 + .../Omega/Event/styles/Event.module.scss | 189 + .../LiveEvents/Omega/FedShow/FedShow.jsx | 175 + .../Omega/FedShow/styles/FedShow.module.scss | 333 + src/sections/LiveEvents/Omega/Hero/Hero.jsx | 302 + .../Omega/Hero/styles/Hero.module.scss | 153 + .../LiveEvents/Omega/Sponsors/Sponsors.jsx | 44 + .../Sponsors/styles/Sponsors.module.scss | 105 + .../LiveEvents/Omega/TeamImage/TeamImage.jsx | 15 + .../TeamImage/styles/TeamImage.module.scss | 11 + .../Pixel_AI_Hack/Attend/Attend.jsx | 47 + .../Attend/styles/Attend.module.scss | 161 + .../LiveEvents/Pixel_AI_Hack/Faqs/Faqs.jsx | 16 + .../Faqs/styles/Faqs.module.scss | 75 + .../LiveEvents/Pixel_AI_Hack/Hero/Hero.jsx | 222 + .../Hero/styles/Hero.module.scss | 135 + .../LiveInsights/LiveInsights.jsx | 39 + .../styles/LiveInsights.module.scss | 99 + .../Pixel_AI_Hack/Sponsor/Sponsor.jsx | 26 + .../Sponsor/styles/Sponsor.module.scss | 67 + .../Pixel_AI_Hack/TeamPage/TeamPage.jsx | 15 + .../TeamPage/styles/TeamPages.module.scss | 10 + .../Admin/Form/BlogForm/AddBlogForm.jsx | 958 +++ .../BlogForm/styles/AddBlogForm.module.scss | 421 ++ .../CertificatesForm/CertificatesForm.jsx | 428 ++ .../Form/CertificatesForm/SendCertificate.jsx | 707 ++ .../styles/CertificateManagement.module.scss | 71 + .../styles/CertificatesForm.module.scss | 100 + .../tools/certificateTools.js | 150 + .../Admin/Form/EventForm/AddEventForm.jsx | 120 + .../EventForm/styles/AddEventForm.module.scss | 83 + .../Admin/Form/MemberForm/AddMemberForm.jsx | 325 + .../styles/AddMemberForm.module.scss | 46 + .../Profile/Admin/Form/NewForm/NewForm.jsx | 1378 ++++ .../Form/NewForm/styles/NewForm.module.scss | 68 + .../CertificatePreview/CertificatePreview.jsx | 247 + .../styles/CertificatePreview.module.scss | 120 + .../VerifyCertificate/VerifyCertificate.jsx | 178 + .../styles/VerifyCertificate.module.scss | 212 + .../Admin/View/ViewEvent/VIewEvent.jsx | 219 + .../ViewEvent/styles/ViewEvent.module.scss | 148 + .../Admin/View/ViewMember/ViewMember.jsx | 283 + .../ViewMember/styles/ViewMember.module.scss | 137 + .../CertificatesView/CertificatesView.jsx | 212 + .../styles/CertificatesView.module.scss | 205 + .../Profile/General/EventsView/EventsView.jsx | 292 + .../EventsView/styles/EventsView.module.scss | 204 + .../General/ProfileView/ProfileView.jsx | 139 + .../styles/ProfileView.module.scss | 229 + src/sections/Profile/index.jsx | 20 + src/sections/index.jsx | 4 + src/services/chatbot/chatbotService.js | 96 + src/services/chatbot/index.js | 8 + src/services/client/axiosClient.ts | 16 + src/services/index.ts | 3 + src/utils/hooks/useDimensions.js | 87 + src/utils/hooks/useWindowWidth.js | 26 + src/views/Alumni/Alumni.jsx | 122 + src/views/Alumni/styles/Alumni.module.scss | 149 + src/views/AttendancePage/AttendancePage.jsx | 431 ++ .../styles/AttendancePage.module.scss | 196 + .../CompleteProfile/CompleteProfile.jsx | 14 + .../ForgotPassword/ForgotPassword.jsx | 13 + src/views/Authentication/Login/Login.jsx | 11 + src/views/Authentication/Signup/Signup.jsx | 11 + src/views/Blog/Blog.jsx | 326 + src/views/Blog/FullBlog.jsx | 219 + src/views/Blog/styles/Blog.module.scss | 425 ++ src/views/Blog/styles/FullBlog.module.scss | 282 + src/views/Error/Error.jsx | 37 + src/views/Error/styles/Error.module.scss | 101 + src/views/Event/Event.jsx | 360 + src/views/Event/EventForm.jsx | 133 + src/views/Event/PastEvent.jsx | 137 + src/views/Event/styles/Event.module.scss | 430 ++ src/views/Event/styles/PastEvent.module.scss | 457 ++ src/views/Home/Home.jsx | 32 + src/views/LiveEvents/Omega/Omega.jsx | 181 + .../LiveEvents/Omega/styles/Omega.module.scss | 26 + .../Pixel_AI_Hack/Pixel_AI_Hack.jsx | 136 + .../styles/Pixel_AI_Hack.module.scss | 5 + src/views/PrivacyPolicy/PrivacyPolicy.jsx | 218 + .../styles/PrivacyPolicy.module.scss | 51 + src/views/Profile/styles/Profile.module.scss | 17 + src/views/Social/Social.jsx | 82 + src/views/Social/styles/Social.module.scss | 820 ++ src/views/Team/Team.jsx | 327 + src/views/Team/styles/Team.module.scss | 402 + src/views/TeamManagement/TeamManagement.jsx | 450 ++ .../components/ConfirmDialog.jsx | 46 + .../components/InviteSection.jsx | 188 + .../TeamManagement/components/MemberCard.jsx | 61 + .../components/TeamlessState.jsx | 284 + .../styles/TeamManagement.module.scss | 1114 +++ src/views/TermsAndConditions/T&C.jsx | 229 + .../TermsAndConditions/styles/T&C.module.scss | 53 + src/views/index.jsx | 26 + 393 files changed, 59446 insertions(+), 1397 deletions(-) create mode 100644 .env.example create mode 100644 MIGRATION.md create mode 100644 app/(auth)/ForgotPassword/page.jsx create mode 100644 app/(auth)/Login/page.jsx create mode 100644 app/(auth)/SignUp/page.jsx create mode 100644 app/(auth)/completeProfile/page.jsx create mode 100644 app/(auth)/layout.jsx create mode 100644 app/(auth)/otp/page.jsx create mode 100644 app/(main)/Alumni/page.jsx create mode 100644 app/(main)/Blog/page.jsx create mode 100644 app/(main)/Events/[eventId]/Form/page.jsx create mode 100644 app/(main)/Events/[eventId]/page.jsx create mode 100644 app/(main)/Events/[eventId]/team/page.jsx create mode 100644 app/(main)/Events/page.jsx create mode 100644 app/(main)/Events/pastEvents/page.jsx create mode 100644 app/(main)/PrivacyPolicy/page.jsx create mode 100644 app/(main)/Social/page.jsx create mode 100644 app/(main)/Team/page.jsx create mode 100644 app/(main)/TermsAndConditions/page.jsx create mode 100644 app/(main)/layout.jsx create mode 100644 app/(main)/page.jsx create mode 100644 app/(main)/profile/BlogForm/page.jsx create mode 100644 app/(main)/profile/Form/page.jsx create mode 100644 app/(main)/profile/attendance/page.jsx create mode 100644 app/(main)/profile/certificates/page.jsx create mode 100644 app/(main)/profile/events/page.jsx create mode 100644 app/(main)/profile/layout.jsx create mode 100644 app/(main)/profile/members/page.jsx create mode 100644 app/(main)/profile/page.jsx create mode 100644 app/(main)/verify/certificate/page.jsx create mode 100644 app/api/auth/changePassword/route.ts create mode 100644 app/api/auth/forgotPassword/route.ts create mode 100644 app/api/auth/googleAuth/route.ts create mode 100644 app/api/auth/login/route.ts create mode 100644 app/api/auth/logout/route.ts create mode 100644 app/api/auth/register/route.ts create mode 100644 app/api/auth/verifyEmail/route.ts create mode 100644 app/api/blog/createBlog/route.ts create mode 100644 app/api/blog/deleteBlog/[id]/route.ts create mode 100644 app/api/blog/getBlog/route.ts create mode 100644 app/api/blog/updateBlog/[id]/route.ts create mode 100644 app/api/certificate/addCertificateTemplate/route.ts create mode 100644 app/api/certificate/dummyCertificate/route.ts create mode 100644 app/api/certificate/sendCertificatesAndEvents/route.ts create mode 100644 app/api/certificate/testCertificateSending/route.ts create mode 100644 app/api/certificate/verifyCertificate/route.ts create mode 100644 app/api/chatbot/health/route.ts create mode 100644 app/api/chatbot/message/route.ts create mode 100644 app/api/chatbot/send-email/route.ts create mode 100644 app/api/form/addForm/route.ts create mode 100644 app/api/form/allJoinRequestUpdates/route.ts create mode 100644 app/api/form/attendanceCode/[id]/route.ts create mode 100644 app/api/form/contact/route.ts create mode 100644 app/api/form/createTeam/route.ts create mode 100644 app/api/form/deleteForm/[id]/route.ts create mode 100644 app/api/form/download/[id]/route.ts create mode 100644 app/api/form/editForm/[id]/route.ts create mode 100644 app/api/form/export-attendance/[id]/route.ts create mode 100644 app/api/form/getAllForms/route.ts create mode 100644 app/api/form/getFormAnalytics/[id]/route.ts create mode 100644 app/api/form/inviteLink/[formId]/route.ts create mode 100644 app/api/form/inviteTeamMember/route.ts create mode 100644 app/api/form/joinRequestUpdates/[formId]/route.ts create mode 100644 app/api/form/joinTeam/route.ts create mode 100644 app/api/form/leaveTeam/route.ts create mode 100644 app/api/form/markAttendance/route.ts create mode 100644 app/api/form/register/route.ts create mode 100644 app/api/form/removeTeamMember/route.ts create mode 100644 app/api/form/renameTeam/route.ts create mode 100644 app/api/form/respondJoinRequest/route.ts create mode 100644 app/api/form/searchTeams/[formId]/route.ts create mode 100644 app/api/form/sendJoinRequest/route.ts create mode 100644 app/api/form/teamDetails/[formId]/route.ts create mode 100644 app/api/gemini/autofill/route.ts create mode 100644 app/api/gemini/summary/route.ts create mode 100644 app/api/user/addMember/route.ts create mode 100644 app/api/user/deleteMember/[id]/route.ts create mode 100644 app/api/user/editDetails/route.ts create mode 100644 app/api/user/editProfileImage/route.ts create mode 100644 app/api/user/fetchAccessTypes/route.ts create mode 100644 app/api/user/fetchAlumni/route.ts create mode 100644 app/api/user/fetchProfile/route.ts create mode 100644 app/api/user/fetchTeam/route.ts delete mode 100644 app/globals.css create mode 100644 app/globals.scss create mode 100644 app/not-found.tsx create mode 100644 app/opengraph-image.tsx delete mode 100644 app/page.tsx create mode 100644 app/robots.ts create mode 100644 app/sitemap.ts create mode 100644 components/seo/JsonLd.tsx create mode 100644 data/Carousel.json create mode 100644 data/Feedback.json create mode 100644 data/SocialLink.json create mode 100644 data/Sponser.json create mode 100644 data/Team.json create mode 100644 lib/api/errors.ts create mode 100644 lib/api/express.ts create mode 100644 lib/api/rate-limit.ts create mode 100644 lib/api/respond.ts create mode 100644 lib/auth/access.ts create mode 100644 lib/auth/password.ts create mode 100644 lib/auth/session.ts create mode 100644 lib/content/legal.ts create mode 100644 lib/db.ts create mode 100644 lib/email/mailer.ts create mode 100644 lib/email/templates.ts create mode 100644 lib/env.ts create mode 100644 lib/seo/metadata.ts create mode 100644 lib/seo/structured-data.ts create mode 100644 lib/services/attendance.ts create mode 100644 lib/services/auth.ts create mode 100644 lib/services/auth.types.ts create mode 100644 lib/services/blogs.ts create mode 100644 lib/services/certificates.ts create mode 100644 lib/services/chatbot.ts create mode 100644 lib/services/contact.ts create mode 100644 lib/services/events.ts create mode 100644 lib/services/gemini-blog.ts create mode 100644 lib/services/otp.ts create mode 100644 lib/services/people.ts create mode 100644 lib/services/registration.ts create mode 100644 lib/services/team-invites.ts create mode 100644 lib/services/teams.ts create mode 100644 lib/services/upload.ts create mode 100644 lib/site.ts create mode 100644 lib/types/event.ts create mode 100644 lib/utils.ts create mode 100644 lib/validation/auth.ts delete mode 100644 postcss.config.mjs create mode 100644 prisma/schema.prisma create mode 100644 proxy.ts create mode 100644 scripts/with-env.mjs create mode 100644 src/assets/animations/AnimatedBox.jsx create mode 100644 src/assets/animations/socialPageAnimation.jsx create mode 100644 src/assets/images/Complete.svg create mode 100644 src/assets/images/FedLogo.png create mode 100644 src/assets/images/Logo/FED.svg create mode 100644 src/assets/images/Logo/logo.svg create mode 100644 src/assets/images/SocialMedia/instaLogo.svg create mode 100644 src/assets/images/SocialMedia/linkedinLogo.svg create mode 100644 src/assets/images/camera.svg create mode 100644 src/assets/images/contact.png create mode 100644 src/assets/images/defaultEventModal.png create mode 100644 src/assets/images/defaultImg.jpg create mode 100644 src/assets/images/errorPage.jpg create mode 100644 src/assets/images/fedShow.svg create mode 100644 src/assets/images/geminiLogo.svg create mode 100644 src/assets/images/google.png create mode 100644 src/assets/images/googleIcon.svg create mode 100644 src/assets/images/groups.svg create mode 100644 src/assets/images/lock.svg create mode 100644 src/assets/images/quote.png create mode 100644 src/assets/images/ring.svg create mode 100644 src/assets/images/rupeeIcon.svg create mode 100644 src/assets/images/shareOutline.svg create mode 100644 src/assets/styles/Global.scss create mode 100644 src/authentication/Login/ForgotPassword/OTPInput.jsx create mode 100644 src/authentication/Login/ForgotPassword/SendOtp.jsx create mode 100644 src/authentication/Login/ForgotPassword/styles/OTPInput.module.scss create mode 100644 src/authentication/Login/ForgotPassword/styles/forgotPassword.module.scss create mode 100644 src/authentication/Login/GoogleLogin.jsx create mode 100644 src/authentication/Login/Login.jsx create mode 100644 src/authentication/Login/styles/Login.module.scss create mode 100644 src/authentication/SignUp/CompleteProfile.jsx create mode 100644 src/authentication/SignUp/GoogleSignup.jsx create mode 100644 src/authentication/SignUp/SignUP.jsx create mode 100644 src/authentication/SignUp/style/CompleteProfile.module.scss create mode 100644 src/authentication/SignUp/style/Signup.module.scss create mode 100644 src/components/BlogCard/BlogCard.jsx create mode 100644 src/components/BlogCard/styles/BlogCard.module.scss create mode 100644 src/components/Carousel/Carousel.jsx create mode 100644 src/components/Carousel/styles/Carousel.module.scss create mode 100644 src/components/Chatbot/Chatbot.jsx create mode 100644 src/components/Chatbot/Chatbot.module.scss create mode 100644 src/components/Chatbot/index.jsx create mode 100644 src/components/Core/Button.jsx create mode 100644 src/components/Core/Input.jsx create mode 100644 src/components/Core/Text.jsx create mode 100644 src/components/Core/index.jsx create mode 100644 src/components/Core/styles/Core.module.scss create mode 100644 src/components/EventCard/EventCard.jsx create mode 100644 src/components/EventCard/styles/EventCard.module.scss create mode 100644 src/components/Form/FormField.jsx create mode 100644 src/components/Form/PopField.jsx create mode 100644 src/components/Form/Section.jsx create mode 100644 src/components/Form/SectionValidation.jsx create mode 100644 src/components/Form/index.jsx create mode 100644 src/components/Form/styles/Form.module.scss create mode 100644 src/components/LiveEvents/Accordian/Accordian.jsx create mode 100644 src/components/LiveEvents/Accordian/styles/Accordion.module.scss create mode 100644 src/components/OtpInput/OtpInput.jsx create mode 100644 src/components/OtpInput/style/otpinput.module.scss create mode 100644 src/components/ProtectedRoute.jsx create mode 100644 src/components/ShareSocial/ShareSocial.jsx create mode 100644 src/components/SocialEmbed/SocialEmbed.jsx create mode 100644 src/components/TeamCard/TeamCard.jsx create mode 100644 src/components/TeamCard/styles/TeamCard.module.scss create mode 100644 src/components/index.jsx create mode 100644 src/context/AuthContext.tsx create mode 100644 src/context/Providers.jsx create mode 100644 src/context/RecoveryContext.jsx create mode 100644 src/data/Access.json create mode 100644 src/data/Carousel.json create mode 100644 src/data/Feedback.json create mode 100644 src/data/FormData.json create mode 100644 src/data/SocialLink.json create mode 100644 src/data/Sponser.json create mode 100644 src/data/Team.json create mode 100644 src/data/liveEvents/Pixel_AI_Hack/Pixel_AI_Hack.json create mode 100644 src/data/liveEvents/gsoc/Gsoc.json create mode 100644 src/data/liveEvents/omega/Accordion.json create mode 100644 src/data/liveEvents/omega/Event.json create mode 100644 src/data/liveEvents/omega/Speakers.json create mode 100644 src/data/liveEvents/omega/Sponsor.json create mode 100644 src/data/user.json create mode 100644 src/features/Modals/EditProfile/EditImage.jsx create mode 100644 src/features/Modals/EditProfile/EditProfile.jsx create mode 100644 src/features/Modals/EditProfile/styles/EditProfile.module.scss create mode 100644 src/features/Modals/EditProfile/styles/editImage.module.scss create mode 100644 src/features/Modals/Event/EventModal/EventModal.jsx create mode 100644 src/features/Modals/Event/EventModal/styles/EventModal.module.scss create mode 100644 src/features/Modals/Event/EventStats/EventStats.jsx create mode 100644 src/features/Modals/Event/EventStats/styles/EventStats.module.scss create mode 100644 src/features/Modals/Event/LiveEventPopup/LiveEventPopup.jsx create mode 100644 src/features/Modals/Event/LiveEventPopup/styles/LiveEventPopup.module.scss create mode 100644 src/features/Modals/Event/QRCodeModal/QRCodeModal.jsx create mode 100644 src/features/Modals/Event/QRCodeModal/index.jsx create mode 100644 src/features/Modals/Event/QRCodeModal/styles/QRCodeModal.module.scss create mode 100644 src/features/Modals/Event/ShareModal/ShareModal.jsx create mode 100644 src/features/Modals/Event/ShareModal/ShareTeamData.jsx create mode 100644 src/features/Modals/Event/ShareModal/styles/ShareModal.module.scss create mode 100644 src/features/Modals/Event/ShareModal/styles/ShareTeamData.module.scss create mode 100644 src/features/Modals/Event/TeamDetailsModal/TeamDetailsModal.jsx create mode 100644 src/features/Modals/Event/TeamDetailsModal/index.jsx create mode 100644 src/features/Modals/Event/TeamDetailsModal/style/TeamDetailsModal.module.scss create mode 100644 src/features/Modals/Profile/Admin/PreviewForm.jsx create mode 100644 src/features/Modals/Profile/Admin/SectionModal.jsx create mode 100644 src/features/Modals/Profile/Admin/styles/Preview.module.scss create mode 100644 src/features/Modals/authentication/OtpInputModal.jsx create mode 100644 src/features/Modals/index.jsx create mode 100644 src/features/index.jsx create mode 100644 src/index.scss create mode 100644 src/layouts/Blog/LeftSidebar/LeftSidebar.jsx create mode 100644 src/layouts/Blog/LeftSidebar/styles/LeftSidebar.module.scss create mode 100644 src/layouts/Blog/RightSidebar/RightSidebar.jsx create mode 100644 src/layouts/Blog/RightSidebar/styles/RightSidebar.module.scss create mode 100644 src/layouts/Blog/TabBar/TabBar.jsx create mode 100644 src/layouts/Blog/TabBar/styles/TabBar.module.scss create mode 100644 src/layouts/Footer/Footer.jsx create mode 100644 src/layouts/Footer/styles/Footer.module.scss create mode 100644 src/layouts/Navbar/Navbar.tsx create mode 100644 src/layouts/Navbar/styles/Navbar.module.scss create mode 100644 src/layouts/Profile/ProfileLayout/ProfileLayout.jsx create mode 100644 src/layouts/Profile/ProfileLayout/styles/ProfileLayout.module.scss create mode 100644 src/layouts/Profile/Sidebar/Sidebar.jsx create mode 100644 src/layouts/Profile/Sidebar/styles/Sidebar.module.scss create mode 100644 src/layouts/Profile/index.jsx create mode 100644 src/layouts/Skeleton/Carousel/Carousel.jsx create mode 100644 src/layouts/Skeleton/Carousel/styles/Carousel.module.scss create mode 100644 src/layouts/Skeleton/EventCard/EventCardSkeleton.jsx create mode 100644 src/layouts/Skeleton/EventCard/styles/eventskeleton.module.scss create mode 100644 src/layouts/Skeleton/Sponser/Sponser.jsx create mode 100644 src/layouts/Skeleton/Sponser/styles/Sponser.module.scss create mode 100644 src/layouts/Skeleton/TeamCard/TeamCard.jsx create mode 100644 src/layouts/Skeleton/TeamCard/styles/TeamCard.module.scss create mode 100644 src/layouts/index.jsx create mode 100644 src/microInteraction/Alert/Alert.tsx create mode 100644 src/microInteraction/Alert/styles/Alert.module.scss create mode 100644 src/microInteraction/Load/ComponentLoad.tsx create mode 100644 src/microInteraction/Load/Load.tsx create mode 100644 src/microInteraction/Load/MicroLoad.tsx create mode 100644 src/microInteraction/Load/styles/MicroLoad.module.scss create mode 100644 src/microInteraction/Load/styles/load.module.scss create mode 100644 src/microInteraction/index.ts create mode 100644 src/sections/Home/About/About.jsx create mode 100644 src/sections/Home/About/styles/About.module.scss create mode 100644 src/sections/Home/Contact/Contact.jsx create mode 100644 src/sections/Home/Contact/styles/Contact.module.scss create mode 100644 src/sections/Home/Feedback/Feedback.jsx create mode 100644 src/sections/Home/Feedback/styles/Feedback.module.scss create mode 100644 src/sections/Home/Hero/Hero.jsx create mode 100644 src/sections/Home/Hero/styles/Hero.module.scss create mode 100644 src/sections/Home/Sponser/Sponser.jsx create mode 100644 src/sections/Home/Sponser/styles/Sponser.module.scss create mode 100644 src/sections/Home/index.jsx create mode 100644 src/sections/LiveEvents/Omega/Accordion/Accordion.jsx create mode 100644 src/sections/LiveEvents/Omega/Accordion/styles/Accordion.module.scss create mode 100644 src/sections/LiveEvents/Omega/Attend/Attend.jsx create mode 100644 src/sections/LiveEvents/Omega/Attend/styles/Attend.module.scss create mode 100644 src/sections/LiveEvents/Omega/Event/Event.jsx create mode 100644 src/sections/LiveEvents/Omega/Event/styles/Event.module.scss create mode 100644 src/sections/LiveEvents/Omega/FedShow/FedShow.jsx create mode 100644 src/sections/LiveEvents/Omega/FedShow/styles/FedShow.module.scss create mode 100644 src/sections/LiveEvents/Omega/Hero/Hero.jsx create mode 100644 src/sections/LiveEvents/Omega/Hero/styles/Hero.module.scss create mode 100644 src/sections/LiveEvents/Omega/Sponsors/Sponsors.jsx create mode 100644 src/sections/LiveEvents/Omega/Sponsors/styles/Sponsors.module.scss create mode 100644 src/sections/LiveEvents/Omega/TeamImage/TeamImage.jsx create mode 100644 src/sections/LiveEvents/Omega/TeamImage/styles/TeamImage.module.scss create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Attend/Attend.jsx create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Attend/styles/Attend.module.scss create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Faqs/Faqs.jsx create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Faqs/styles/Faqs.module.scss create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Hero/Hero.jsx create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Hero/styles/Hero.module.scss create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/LiveInsights/LiveInsights.jsx create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/LiveInsights/styles/LiveInsights.module.scss create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Sponsor/Sponsor.jsx create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/Sponsor/styles/Sponsor.module.scss create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/TeamPage/TeamPage.jsx create mode 100644 src/sections/LiveEvents/Pixel_AI_Hack/TeamPage/styles/TeamPages.module.scss create mode 100644 src/sections/Profile/Admin/Form/BlogForm/AddBlogForm.jsx create mode 100644 src/sections/Profile/Admin/Form/BlogForm/styles/AddBlogForm.module.scss create mode 100644 src/sections/Profile/Admin/Form/CertificatesForm/CertificatesForm.jsx create mode 100644 src/sections/Profile/Admin/Form/CertificatesForm/SendCertificate.jsx create mode 100644 src/sections/Profile/Admin/Form/CertificatesForm/styles/CertificateManagement.module.scss create mode 100644 src/sections/Profile/Admin/Form/CertificatesForm/styles/CertificatesForm.module.scss create mode 100644 src/sections/Profile/Admin/Form/CertificatesForm/tools/certificateTools.js create mode 100644 src/sections/Profile/Admin/Form/EventForm/AddEventForm.jsx create mode 100644 src/sections/Profile/Admin/Form/EventForm/styles/AddEventForm.module.scss create mode 100644 src/sections/Profile/Admin/Form/MemberForm/AddMemberForm.jsx create mode 100644 src/sections/Profile/Admin/Form/MemberForm/styles/AddMemberForm.module.scss create mode 100644 src/sections/Profile/Admin/Form/NewForm/NewForm.jsx create mode 100644 src/sections/Profile/Admin/Form/NewForm/styles/NewForm.module.scss create mode 100644 src/sections/Profile/Admin/View/CertificatePreview/CertificatePreview.jsx create mode 100644 src/sections/Profile/Admin/View/CertificatePreview/styles/CertificatePreview.module.scss create mode 100644 src/sections/Profile/Admin/View/VerifyCertificate/VerifyCertificate.jsx create mode 100644 src/sections/Profile/Admin/View/VerifyCertificate/styles/VerifyCertificate.module.scss create mode 100644 src/sections/Profile/Admin/View/ViewEvent/VIewEvent.jsx create mode 100644 src/sections/Profile/Admin/View/ViewEvent/styles/ViewEvent.module.scss create mode 100644 src/sections/Profile/Admin/View/ViewMember/ViewMember.jsx create mode 100644 src/sections/Profile/Admin/View/ViewMember/styles/ViewMember.module.scss create mode 100644 src/sections/Profile/General/CertificatesView/CertificatesView.jsx create mode 100644 src/sections/Profile/General/CertificatesView/styles/CertificatesView.module.scss create mode 100644 src/sections/Profile/General/EventsView/EventsView.jsx create mode 100644 src/sections/Profile/General/EventsView/styles/EventsView.module.scss create mode 100644 src/sections/Profile/General/ProfileView/ProfileView.jsx create mode 100644 src/sections/Profile/General/ProfileView/styles/ProfileView.module.scss create mode 100644 src/sections/Profile/index.jsx create mode 100644 src/sections/index.jsx create mode 100644 src/services/chatbot/chatbotService.js create mode 100644 src/services/chatbot/index.js create mode 100644 src/services/client/axiosClient.ts create mode 100644 src/services/index.ts create mode 100644 src/utils/hooks/useDimensions.js create mode 100644 src/utils/hooks/useWindowWidth.js create mode 100644 src/views/Alumni/Alumni.jsx create mode 100644 src/views/Alumni/styles/Alumni.module.scss create mode 100644 src/views/AttendancePage/AttendancePage.jsx create mode 100644 src/views/AttendancePage/styles/AttendancePage.module.scss create mode 100644 src/views/Authentication/CompleteProfile/CompleteProfile.jsx create mode 100644 src/views/Authentication/ForgotPassword/ForgotPassword.jsx create mode 100644 src/views/Authentication/Login/Login.jsx create mode 100644 src/views/Authentication/Signup/Signup.jsx create mode 100644 src/views/Blog/Blog.jsx create mode 100644 src/views/Blog/FullBlog.jsx create mode 100644 src/views/Blog/styles/Blog.module.scss create mode 100644 src/views/Blog/styles/FullBlog.module.scss create mode 100644 src/views/Error/Error.jsx create mode 100644 src/views/Error/styles/Error.module.scss create mode 100644 src/views/Event/Event.jsx create mode 100644 src/views/Event/EventForm.jsx create mode 100644 src/views/Event/PastEvent.jsx create mode 100644 src/views/Event/styles/Event.module.scss create mode 100644 src/views/Event/styles/PastEvent.module.scss create mode 100644 src/views/Home/Home.jsx create mode 100644 src/views/LiveEvents/Omega/Omega.jsx create mode 100644 src/views/LiveEvents/Omega/styles/Omega.module.scss create mode 100644 src/views/LiveEvents/Pixel_AI_Hack/Pixel_AI_Hack.jsx create mode 100644 src/views/LiveEvents/Pixel_AI_Hack/styles/Pixel_AI_Hack.module.scss create mode 100644 src/views/PrivacyPolicy/PrivacyPolicy.jsx create mode 100644 src/views/PrivacyPolicy/styles/PrivacyPolicy.module.scss create mode 100644 src/views/Profile/styles/Profile.module.scss create mode 100644 src/views/Social/Social.jsx create mode 100644 src/views/Social/styles/Social.module.scss create mode 100644 src/views/Team/Team.jsx create mode 100644 src/views/Team/styles/Team.module.scss create mode 100644 src/views/TeamManagement/TeamManagement.jsx create mode 100644 src/views/TeamManagement/components/ConfirmDialog.jsx create mode 100644 src/views/TeamManagement/components/InviteSection.jsx create mode 100644 src/views/TeamManagement/components/MemberCard.jsx create mode 100644 src/views/TeamManagement/components/TeamlessState.jsx create mode 100644 src/views/TeamManagement/styles/TeamManagement.module.scss create mode 100644 src/views/TermsAndConditions/T&C.jsx create mode 100644 src/views/TermsAndConditions/styles/T&C.module.scss create mode 100644 src/views/index.jsx diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..66c1eef --- /dev/null +++ b/.env.example @@ -0,0 +1,86 @@ +# FED KIIT — environment template +# +# Copy to `.env.local` and fill in. The real values were carried over from the +# Express backend's .env and the Vite frontend's .env during the migration. +# +# `lib/env.ts` validates this on first access, so a missing required value fails +# loudly at boot rather than as a 500 halfway through a request. + +# --- Database --------------------------------------------------------------- +# MongoDB Atlas connection string (required). +DATABASE_URL= + +# --- Auth ------------------------------------------------------------------- +# Must match the old backend's JWT_SECRET so sessions issued before the cutover +# keep verifying and nobody is logged out by the migration. Min 16 chars. +JWT_SECRET= +SESSION_SECRET= +# bcrypt cost. Was VITE_BCRYPT on the frontend, which hashed in the browser; +# hashing is now server-side. Stored hash format is unchanged. +BCRYPT_SALT_ROUNDS=10 + +# --- Google OAuth ----------------------------------------------------------- +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +NEXT_PUBLIC_GOOGLE_CLIENT_ID= + +# --- Email (Resend) --------------------------------------------------------- +# Two senders: the app tries the primary, then falls back to the secondary. +RESEND_API_KEY= +EMAIL_FROM= +RESEND_API_KEY_2= +EMAIL_FROM_2= + +# --- Cloudinary ------------------------------------------------------------- +CLOUDINARY_URL= +CLOUDINARY_NAME= +CLOUDINARY_API_KEY= +CLOUDINARY_SECRET_KEY= + +# --- Razorpay --------------------------------------------------------------- +RAZORPAY_KEY_ID= +RAZORPAY_KEY_SECRET= +NEXT_PUBLIC_RAZORPAY_KEY_ID= + +# --- Gemini / chatbot ------------------------------------------------------- +# Up to ten keys; the chatbot rotates to the next one when a key is rate limited. +GEMINI_API_KEY_1= +GEMINI_API_KEY_2= +GEMINI_API_KEY_3= +GEMINI_API_KEY_4= +GEMINI_API_KEY_5= +GEMINI_API_KEY_6= +GEMINI_API_KEY_7= +GEMINI_API_KEY_8= +GEMINI_API_KEY_9= +GEMINI_API_KEY_10= +GEMINI_MODEL=gemini-2.0-flash +CHATBOT_NAME=FEDI +NEXT_PUBLIC_CHATBOT_NAME=FEDI + +# --- Certificates ----------------------------------------------------------- +CERT_ORG= +NEXT_PUBLIC_CERT_ORG= + +# --- Server ----------------------------------------------------------------- +# Port the Next.js server listens on, for both `npm run dev` and `npm start`. +# +# Next cannot read PORT from a .env file on its own — the HTTP server boots +# before any application code is initialised. The npm scripts therefore load +# these files with Node's own `--env-file-if-exists` flag before invoking next. +# +# Precedence: shell environment > .env.local > .env, so a hosting platform that +# injects PORT (Vercel, Render, Railway…) still wins over anything set here. +PORT=3000 + +# --- Site ------------------------------------------------------------------- +# The PUBLIC canonical origin, with no trailing slash. +# +# This must be the live domain even in development: it is what every +# `rel=canonical`, OpenGraph URL and sitemap entry is built from. The old +# backend's DOMAIN variable held "http://localhost:5173/" (the Vite dev server), +# which would have published a sitemap full of localhost URLs. +NEXT_PUBLIC_SITE_URL=https://www.fedkiit.com + +LOG_REQ=false +DEBUG=false diff --git a/.gitignore b/.gitignore index 5ef6a52..00822be 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,8 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* +# ...but the template carries no secrets and documents the contract. +!.env.example # vercel .vercel diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..4af73cd --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,273 @@ +# FED KIIT — 1:1 Next.js replica of FED-Frontend + FED-Backend + +A pixel-for-pixel port of the React/Vite frontend and Express backend into a +single Next.js 16 App Router application. + +The approach is deliberate: rather than re-approximating the design in Tailwind +(the first attempt, which drifted visibly), **the original SCSS modules were +carried over verbatim** — all 86 of them, plus every image asset. The components +keep their original markup and class names. That is what makes the replica +indistinguishable from the original rather than merely similar. + +--- + +## Verified + +Both apps were run side by side (Vite on :5173 + Express on :5000, Next on :3111) +and compared in the browser. + +**Pixel parity — /Events** + +| Measure | Vite original | Next replica | +|---|---|---| +| Total page height | 6109px | **6109px** | +| Page width | 1430px | **1430px** | +| `` / `