+ )
}
diff --git a/app/countdown/page.jsx b/app/countdown/page.jsx
new file mode 100644
index 0000000..77706c7
--- /dev/null
+++ b/app/countdown/page.jsx
@@ -0,0 +1,57 @@
+"use client";
+import { useState, useEffect } from "react";
+import { cn } from "@/lib/utils";
+import { Spotlight } from "@/components/SpotlightEffect";
+
+const Countdown = () => {
+ // const targetDate = new Date("2025-04-06T07:00:00").getTime();
+ // const [timeLeft, setTimeLeft] = useState(targetDate - new Date().getTime());
+
+ // useEffect(() => {
+ // const timer = setInterval(() => {
+ // setTimeLeft(targetDate - new Date().getTime());
+ // }, 1000);
+
+ // return () => clearInterval(timer);
+ // }, [targetDate]);
+
+ // const formatTime = (ms) => {
+ // const totalSeconds = Math.floor(ms / 1000);
+ // const hours = Math.floor(totalSeconds / 3600);
+ // const minutes = Math.floor((totalSeconds % 3600) / 60);
+ // const seconds = totalSeconds % 60;
+ // return {
+ // hours: String(hours).padStart(2, "0"),
+ // minutes: String(minutes).padStart(2, "0"),
+ // seconds: String(seconds).padStart(2, "0"),
+ // };
+ // };
+
+ // const { hours, minutes, seconds } = formatTime(timeLeft);
+
+ return (
+ <>>
+ //
+ );
+};
+
+export default Countdown;
diff --git a/app/faq/page.css b/app/faq/page.css
deleted file mode 100644
index aafea06..0000000
--- a/app/faq/page.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.rotatingContainer {
- animation: rotateAnimation 8s linear infinite;
-}
-
-@keyframes rotateAnimation {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
-}
diff --git a/app/faq/page.jsx b/app/faq/page.jsx
deleted file mode 100644
index 174dbe5..0000000
--- a/app/faq/page.jsx
+++ /dev/null
@@ -1,173 +0,0 @@
-import Navbar from "@/components/Navbar";
-import {
- Accordion,
- AccordionContent,
- AccordionItem,
- AccordionTrigger,
-} from "@/components/ui/accordion";
-import TextAnimation from "@/components/TextAnimation";
-
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
-import "./page.css";
-
-export const metadata = {
- title: "FAQ | HackByte",
- description: "Frequently asked questions about HackByte.",
- keywords: "FAQ, HackByte, IIITDMJ, Hackathon",
- openGraph: {
- title: "FAQ | HackByte",
- description: "Frequently asked questions about HackByte.",
- url: "https://hackbyte.in/faq",
- images:
- "https://res.cloudinary.com/drtmfrghg/image/upload/v1708016443/opengraph-image_vkiopn.jpg",
- siteName: "HackByte - IIITDMJ Hackathon",
- type: "website",
- locale: "en_US",
- },
-};
-
-export default function FAQ() {
- const data = [
- {
- title: "How do I register ?",
- content: "Pre-registration will be opening in January 2025",
- },
- {
- title: "How many team members do I need ?",
- content:
- "You can participate individually or in teams of 2 to 4 members. If you are participating in the hackathon individually and looking for a team, we will help you in connecting to other individual participants to get you a team.",
- },
- {
- title: "How much are the participation fees?",
- content:
- "Participation is absolutely free inclusive of food and accomodation. Isnt that great? So register ASAP!!",
- },
- {
- title: "Will the Hackathon be in person or online ?",
- content: "HackByte will be conducted in complete offline/in-person mode.",
- },
- {
- title: "What is the venue for HackByte 3.0 ?",
- content:
- "IIITDM Jabalpur, explore our beautiful campus while thinking about innovating some crazy thing.",
- },
- {
- title: "What are the prerequisites to participate in this hackathon ?",
- content:
- "No prerequisites are required to participate in this hackathon. This event is open to participants of all skill levels.",
- },
- {
- title:
- "Is the food and accommodation provided free of charge or are there any associated costs ?",
- content:
- "We've got you covered when it comes to food, water, and coffee – they're on us. However, any additional snacks can be purchased separately. As for accommodation, we will provide arrangements similar to those found in other hackathons, which typically involve a set of mattresses in a common hall.",
- },
- {
- title:
- "Can my friend join our team after we have already submitted the application for review ?",
- content:
- "Yes, your friend can join the team by submitting an individual application. Once both your friend's individual application and your team's application are accepted, you will be able to add your friend to the team.",
- },
- ];
-
- return (
- <>
-
- >
- );
-}
diff --git a/app/faq/page.tsx b/app/faq/page.tsx
new file mode 100644
index 0000000..c4b52b8
--- /dev/null
+++ b/app/faq/page.tsx
@@ -0,0 +1,151 @@
+import Image from "next/image";
+import { Mail } from "lucide-react";
+import {
+ Accordion,
+ AccordionContent,
+ AccordionItem,
+ AccordionTrigger,
+} from "@/components/ui/accordion";
+import faq from "@/public/Faq/question_mark.png";
+import Link from "next/link";
+import AnimatedTitle from "@/components/AnimatedTitle";
+
+export const metadata = {
+ title: "FAQ | HackByte",
+ description: "Frequently asked questions about HackByte.",
+ keywords: "FAQ, HackByte, IIITDMJ, Hackathon",
+ openGraph: {
+ title: "FAQ | HackByte",
+ description: "Frequently asked questions about HackByte.",
+ url: "https://hackbyte.in/faq",
+ images:
+ "https://res.cloudinary.com/dlsqbiwug/image/upload/v1736876616/Frame_463_zdbkgu.png",
+ siteName: "HackByte - IIITDMJ Hackathon",
+ type: "website",
+ locale: "en_US",
+ },
+};
+
+const faqs = [
+ {
+ question: "How do I register ?",
+ answer: "Pre-registration will begin Shortly. Stay tuned for updates!",
+ },
+ {
+ question: "How many team members do I need?",
+ answer:
+ "You can participate only in teams of 2 to 4 members. If you are interested in participating in the hackathon but do not have a team, we will assist you in connecting with other individual participants to form a team.",
+ },
+ {
+ question: "How much are the participation fees?",
+ answer:
+ "Participation is absolutely free inclusive of food and accomodation. Isnt that great? So register ASAP!!",
+ },
+ {
+ question: "Will the Hackathon be in person or online ?",
+ answer: "HackByte will be conducted in complete offline/in-person mode.",
+ },
+ {
+ question: "What is the venue for HackByte 4.0 ?",
+ answer:
+ "IIITDM Jabalpur, explore our beautiful campus while thinking about innovating some crazy thing.",
+ },
+ {
+ question: "What are the prerequisites to participate in this hackathon ?",
+ answer:
+ "No prerequisites are required to participate in this hackathon. This event is open to participants of all skill levels.",
+ },
+ {
+ question:
+ "Is the food and accommodation provided free of charge or are there any associated costs ?",
+ answer:
+ "We've got you covered when it comes to food, water, and coffee – they're on us. However, any additional snacks can be purchased separately. As for accommodation, we will provide arrangements similar to those found in other hackathons, which typically involve a set of mattresses in a common hall.",
+ },
+ {
+ question:
+ "Can my friend join our team after we have already submitted the application for review ?",
+ answer:
+ "Yes, your friend can join the team by submitting an individual application. Once both your friend's individual application and your team's application are accepted, you will be able to add your friend to the team.",
+ },
+ {
+ question: "Can we bring a pre-built project to the hackathon?",
+ answer:
+ "No, participants are not allowed to bring pre-built projects to the hackathon. All work must be started from scratch after the hackathon begins to ensure fairness",
+ },
+ {
+ question: "Do projects need to be related to the theme?",
+ answer:
+ "No. We want to encourage open innovation, so you're free to choose any idea you're passionate about and build something meaningful.",
+ },
+];
+
+export default function FAQSection() {
+ return (
+
+ );
+}
diff --git a/app/favicon.ico b/app/favicon.ico
index 303642d..7ee75df 100644
Binary files a/app/favicon.ico and b/app/favicon.ico differ
diff --git a/app/gallery/page.jsx b/app/gallery/page.jsx
index d6cf4cc..3af93ba 100644
--- a/app/gallery/page.jsx
+++ b/app/gallery/page.jsx
@@ -1,23 +1,22 @@
-import Navbar from "@/components/Navbar";
-import banner from "@/public/galleryPage/banner.jpg";
+import banner from "@/public/ImageGallery/banner.jpg";
+import HB3Logo from "@/public/HB3Logo.png";
import { GridImage, BannerImage } from "@/components/ImageGrid";
-
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
+import Image from "next/image";
+import AnimatedTitle from "@/components/AnimatedTitle";
export const metadata = {
title: "Gallery | HackByte",
description:
- "Discover memorable moments from past HackByte events at IIITDMJ, explore images, and feel the excitement of the coding community.",
+ "Discover memorable moments from HackByte 3.0 at IIITDMJ, explore images, and feel the excitement of the coding community.",
keywords:
"Hackathon, IIITDMJ, Hackbyte, Coding, Programming, Tech, Gallery, Photos, Videos, Past Events, Previous Events",
openGraph: {
title: "Gallery | HackByte",
description:
"Discover memorable moments from past HackByte events at IIITDMJ, explore images, and feel the excitement of the coding community.",
- url: "https://hackbyte.in/gallery",
+ url: "https://hackbyte3.vercel.app",
images:
- "https://res.cloudinary.com/drtmfrghg/image/upload/v1708016443/opengraph-image_vkiopn.jpg",
+ "https://res.cloudinary.com/dlsqbiwug/image/upload/v1736876616/Frame_463_zdbkgu.png",
siteName: "HackByte - IIITDMJ Hackathon",
type: "website",
locale: "en_US",
@@ -27,21 +26,22 @@ export const metadata = {
const Gallery = () => {
return (
<>
-
-
-
-
- Gallery
-
-
- Explore our gallery of memorable moments from HackByte 2.0 event at
- IIITDMJ. Immerse in the vibrant coding community, witness
- innovation, and get inspired.
-
+
+
+
+
+ HackByte 3.0
+ Highlights
+
+
+
+
+ Explore our gallery of memorable moments from HackByte 3.0 event at
+ IIITDM Jabalpur.
@@ -49,10 +49,10 @@ const Gallery = () => {
- COMMITTEE
CREW
+
COMMITTEE CREW
@@ -64,25 +64,6 @@ const Gallery = () => {
-
-
-
- Empower
- Your Digital
- Odyssey!
-
-
-
-
-
-
>
);
};
diff --git a/app/globals.css b/app/globals.css
index 36d4380..0aa3a98 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -1,45 +1,79 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-* {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
- font-family: "Clash Grotesk", sans-serif;
-}
-
-/* Scrollbar */
-::-webkit-scrollbar {
- width: 6px;
- height: 6px;
-}
-
-scrollbar {
- width: 6px;
- height: 6px;
-}
-
-::-webkit-scrollbar-thumb {
- background-color: rgba(127, 125, 125, 0.5);
- border-radius: 10px;
-}
-
-scrollbar-thumb {
- background-color: rgba(127, 125, 125, 0.5);
- border-radius: 10px;
-}
-
-.cursor {
- position: fixed;
- top: 0;
- left: 0;
- width: 20px;
- height: 20px;
- border-radius: 50%;
- background: #fff;
- transition: 0.1s;
- transform: translate(-50%, -50%);
- pointer-events: none;
- mix-blend-mode: difference;
-}
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer base {
+ :root {
+ /* This is for the dotted bg */
+ background-color: #161616;
+
+ --background: 0 0% 3.9%;
+ --foreground: 0 0% 98%;
+ --card: 0 0% 3.9%;
+ --card-foreground: 0 0% 98%;
+ --popover: 0 0% 3.9%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 0 0% 9%;
+ --secondary: 0 0% 14.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 14.9%;
+ --muted-foreground: 0 0% 63.9%;
+ --accent: 0 0% 14.9%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 14.9%;
+ --input: 0 0% 14.9%;
+ --ring: 0 0% 83.1%;
+ --chart-1: 220 70% 50%;
+ --chart-2: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-5: 340 75% 55%;
+ --sidebar-background: 240 5.9% 10%;
+ --sidebar-foreground: 240 4.8% 95.9%;
+ --sidebar-primary: 224.3 76.3% 48%;
+ --sidebar-primary-foreground: 0 0% 100%;
+ --sidebar-accent: 240 3.7% 15.9%;
+ --sidebar-accent-foreground: 240 4.8% 95.9%;
+ --sidebar-border: 240 3.7% 15.9%;
+ --sidebar-ring: 217.2 91.2% 59.8%;
+ }
+
+ ::-webkit-scrollbar {
+ width: 4px;
+ }
+
+ ::-webkit-scrollbar-track {
+ background: black;
+ }
+
+ ::-webkit-scrollbar-thumb {
+ background: #555555;
+ border-radius: 10px;
+ }
+
+ ::-webkit-scrollbar-thumb:hover {
+ background: #555555;
+ }
+
+ body {
+ @apply font-gotham;
+ overflow-x: hidden;
+ }
+
+ .clip-trapezium {
+ clip-path: polygon(25% 0, 75% 0, 100% 100%, 0% 100%);
+ }
+ .custom-border {
+ background-image: url("data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='40' ry='40' stroke='%23777' stroke-width='6' stroke-dasharray='6%2c 20' stroke-dashoffset='0' stroke-linecap='square'/%3e%3c/svg%3e");
+ border-radius: 40px;
+ }
+}
+
+@layer utilities {
+ .text-balance {
+ text-wrap: balance;
+ }
+}
diff --git a/app/humans/page.jsx b/app/humans/page.jsx
deleted file mode 100644
index 6c5959a..0000000
--- a/app/humans/page.jsx
+++ /dev/null
@@ -1,396 +0,0 @@
-import Navbar from "@/components/Navbar";
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
-import HumansCard from "@/components/HumansCard";
-
-// Organizers
-import priyansh from "@/public/humansPage/priyansh.jpg";
-import bhavik from "@/public/humansPage/bhavik.jpg";
-import samyak from "@/public/humansPage/samyak.jpeg";
-import divyansh from "@/public/humansPage/divyansh.jpeg";
-import vansh from "@/public/humansPage/vansh.jpeg";
-import aditya from "@/public/humansPage/aditya.jpg";
-import varun from "@/public/humansPage/varun.jpg";
-import deepanshu from "@/public/humansPage/deepanshu.jpg";
-import sambhav from "@/public/humansPage/sambhav.jpg";
-import tushir from "@/public/humansPage/tushir.jpeg";
-import aman from "@/public/humansPage/aman.jpeg";
-import aish from "@/public/humansPage/aish.jpg";
-import prajjwal from "@/public/humansPage/prajjwal.jpg";
-import aryan from "@/public/humansPage/aryan.jpg";
-import prajwal from "@/public/humansPage/prajwal.jpg";
-import manoj from "@/public/humansPage/manoj.jpeg";
-import nitya from "@/public/humansPage/nitya.jpg";
-
-// Mentors
-import aanchal from "@/public/humansPage/aanchal.jpeg";
-import khushi from "@/public/humansPage/khushi.jpg";
-import manan from "@/public/humansPage/manan.jpg";
-import priyansh_garg from "@/public/humansPage/priyansh_garg.jpeg";
-import akshat from "@/public/humansPage/akshat.jpg";
-import sanskriti from "@/public/humansPage/sanskriti.jpg";
-import yashika from "@/public/humansPage/yashika.jpeg";
-import sagar from "@/public/humansPage/sagar.jpg";
-import siddhant from "@/public/humansPage/siddhant.jpeg";
-import vedant from "@/public/humansPage/vedant.jpeg";
-import ashu from "@/public/humansPage/ashu.jpg";
-import ashish from "@/public/humansPage/ashish.jpg";
-import gautam from "@/public/humansPage/gautam.jpg";
-import chaitanya from "@/public/humansPage/chaitanaya.jpg";
-
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
-
-export const metadata = {
- title: "Humans | HackByte",
- description:
- "Meet the team behind HackByte 3.0! Discover the faces and roles of the passionate individuals who are working tirelessly to make the hackathon a grand success. Join us and be a part of the team!",
- keywords:
- "Humans, Team, Hackathon, IIITDMJ, Hackbyte, Coding, Programming, Tech",
- openGraph: {
- title: "Humans | HackByte",
- description:
- "Meet the team behind HackByte 3.0! Discover the faces and roles of the passionate individuals who are working tirelessly to make the hackathon a grand success. Join us and be a part of the team!",
- url: "https://hackbyte.in/humans",
- images:
- "https://res.cloudinary.com/drtmfrghg/image/upload/v1708016443/opengraph-image_vkiopn.jpg",
- siteName: "HackByte - IIITDMJ Hackathon",
- type: "website",
- locale: "en_US",
- },
-};
-
-export default function Team() {
- const organizerData = [
- {
- name: "Bhavik Agrawal",
- role: "Event Coordinator",
- profilepic: bhavik,
- linkedin: "https://www.linkedin.com/in/bhavikagarwal2001/",
- twitter: "https://twitter.com/BhavikAgarwal13",
- github: "https://github.com/Bhavik-ag",
- },
- {
- name: "Samyak Bhargava",
- role: "Event Coordinator",
- profilepic: samyak,
- linkedin: "https://www.linkedin.com/in/sammybh6/",
- twitter: "#",
- github: "https://github.com/sammybh6",
- },
- {
- name: "Priyansh Mehta",
- role: "Organizer",
- profilepic: priyansh,
- linkedin: "https://www.linkedin.com/in/Priyansh61/",
- twitter: "https://twitter.com/Priyansh_61",
- github: "https://github.com/Priyansh61",
- },
- {
- name: "Divyansh Tripathi",
- role: "Organizer",
- profilepic: divyansh,
- linkedin: "https://www.linkedin.com/in/tdivyansh/",
- twitter: "https://twitter.com/theoden42",
- github: "https://github.com/theoden42",
- },
- {
- name: "Vansh Mittal",
- role: "Web Lead",
- profilepic: vansh,
- linkedin: "https://www.linkedin.com/in/vansh-mittal-21869922a/",
- twitter: "https://twitter.com/mittalvansh_11",
- github: "https://github.com/mittalvansh",
- },
- {
- name: "Aditya Raj",
- role: "Design Lead",
- profilepic: aditya,
- linkedin: "https://www.linkedin.com/in/contactadityaraj/",
- twitter: "#",
- github: "#",
- },
- {
- name: "Varun Singh",
- role: "Organizer",
- profilepic: varun,
- linkedin: "https://www.linkedin.com/in/varun-singh-018242224/",
- twitter: "#",
- github: "https://github.com/varun7singh",
- },
- {
- name: "Deepanshu Singh",
- role: "PR & Marketing Lead",
- profilepic: deepanshu,
- linkedin: "https://www.linkedin.com/in/sdeepanshu17/",
- twitter: "https://twitter.com/sdeepanshu17",
- github: "#",
- },
- {
- name: "Sambhav Gupta",
- role: "Speaker & Workshop Lead",
- profilepic: sambhav,
- linkedin: "https://www.linkedin.com/in/sambhavgupta0705",
- twitter: "https://x.com/sambhavgupta75",
- github: "https://github.com/sambhavgupta0705",
- },
- {
- name: "Tushir Sahu",
- role: "Organizer",
- profilepic: tushir,
- linkedin: "https://www.linkedin.com/in/tushir-sahu-b95549205/",
- twitter: "https://twitter.com/Tushir_Sahu",
- github: "https://github.com/TushirSahu",
- },
- {
- name: "Aman Srivastava",
- role: "Organizer",
- profilepic: aman,
- linkedin: "https://www.linkedin.com/in/aman-srivastava-16726822a/",
- twitter: "#",
- github: "#",
- },
- {
- name: "Aishwarya Saxena",
- role: "Organizer",
- profilepic: aish,
- linkedin: "https://www.linkedin.com/in/aishwarya-saxena-05713618b/",
- twitter: "#",
- github: "#",
- },
- {
- name: "Prajjwal Kapoor",
- role: "Organizer",
- profilepic: prajjwal,
- linkedin: "https://www.linkedin.com/in/prajjwal-kapoor/",
- twitter: "https://twitter.com/the_prajjwal",
- github: "https://github.com/prajjwalkapoor",
- },
- {
- name: "Aryan Pandey",
- role: "Organizer",
- profilepic: aryan,
- linkedin: "https://linkedin.com/in/aryan1113",
- twitter: "https://twitter.com/aisehiaryan",
- github: "https://github.com/aryan1113",
- },
- {
- name: "Prajwal Rayal",
- role: "Organizer",
- profilepic: prajwal,
- linkedin: "http://linkedin.com/in/prajwal-rayal",
- twitter: "https://twitter.com/rayalprajwal",
- github: "https://github.com/PrajwalRayal",
- },
- {
- name: "Manoj Panjwani",
- role: "Organizer",
- profilepic: manoj,
- linkedin: "https://www.linkedin.com/in/manojpanjwani03/",
- twitter: "#",
- github: "#",
- },
- {
- name: "Nitya Tiwari",
- role: "Organizer",
- profilepic: nitya,
- linkedin: "https://www.linkedin.com/in/nitya-tiwari-960797229/",
- twitter: "https://twitter.com/nityatiwariii",
- github: "#",
- },
- ];
-
- const mentorData = [
- {
- name: "Aanchal Mishra",
- profilepic: aanchal,
- linkedin: "https://www.linkedin.com/in/mishra-aanchal/",
- twitter: "https://twitter.com/Aanchalmishra__",
- github: "https://github.com/mishra-aanchal",
- },
- {
- name: "Khushi Trivedi",
- profilepic: khushi,
- linkedin: "https://www.linkedin.com/in/trivedi-khushi/",
- twitter: "https://twitter.com/KhushiT113/",
- github: "https://github.com/trivedi-khushi",
- },
- {
- name: "Manan Jethwani",
- profilepic: manan,
- linkedin: "https://www.linkedin.com/in/manan-jethwani/",
- twitter: "https://twitter.com/manan_jethwani",
- github: "https://github.com/mananjethwani",
- },
- {
- name: "Priyansh Garg",
- profilepic: priyansh_garg,
- linkedin: "https://www.linkedin.com/in/priyansh3133/",
- twitter: "https://twitter.com/priyansh3133",
- github: "https://github.com/garg3133",
- },
- {
- name: "Akshat Virmani",
- profilepic: akshat,
- linkedin: "https://www.linkedin.com/in/akshatvirmani/",
- twitter: "https://twitter.com/VirmaniAkshat",
- github: "https://github.com/akshatvirmani",
- },
- {
- name: "Sanskriti Harmukh",
- profilepic: sanskriti,
- linkedin: "https://www.linkedin.com/in/sanskriti-harmukh/",
- twitter: "https://x.com/Senzkriti",
- github: "https://github.com/SanskritiHarmukh",
- },
- {
- name: "Yashika Jotwani",
- profilepic: yashika,
- linkedin: "https://www.linkedin.com/in/yashika-jotwani-03a0061b7",
- twitter: "https://twitter.com/yashika_jotwani",
- github: "https://github.com/yashikajotwani12",
- },
- {
- name: "Sagar Uprety",
- profilepic: sagar,
- linkedin: "https://www.linkedin.com/in/sagar-uprety/",
- twitter: "https://twitter.com/SagarUprety9",
- github: "https://github.com/sagar-uprety",
- },
- {
- name: "Siddhant Khare",
- profilepic: siddhant,
- linkedin: "https://www.linkedin.com/in/siddhantkhare24/",
- twitter: "https://twitter.com/Siddhant_K_code",
- github: "https://github.com/Siddhant-K-code",
- },
- {
- name: "Vedant Jain",
- profilepic: vedant,
- linkedin: "https://www.linkedin.com/in/vedant-jain-781006145",
- twitter: "https://twitter.com/vedantj_03",
- github: "https://vedant-jain03.github.io/portfolio/",
- },
- {
- name: "Ashu Kumar",
- profilepic: ashu,
- linkedin: "https://www.linkedin.com/in/ashu-kr/",
- twitter: "https://twitter.com/AshuKr40",
- github: "https://github.com/Ashu-kumar40",
- },
- {
- name: "Ashish Chanchal",
- profilepic: ashish,
- linkedin: "https://www.linkedin.com/in/ashishchanchal",
- twitter: "https://x.com/_ashishchanchal",
- github: "https://github.com/Ashish-chanchal",
- },
- {
- name: "Gautam Manak",
- profilepic: gautam,
- linkedin: "https://www.linkedin.com/in/gautammanak1/",
- twitter: "https://twitter.com/gautammanak02",
- github: "https://github.com/GAUTAMMANAK1",
- },
- {
- name: "Chaitanya Rai",
- profilepic: chaitanya,
- linkedin: "https://www.linkedin.com/in/chaitanya-rai/",
- twitter: "https://twitter.com/Chaitanyarai19",
- github: "https://github.com/chaitanyarai19/",
- },
- ];
-
- return (
- <>
-
-
-
-
-
-
- Meet the humans of
- Hackbyte 2.0
-
-
-
-
-
-
-
- Mentors
-
-
- Organizers
-
-
-
-
- {mentorData.map((human, index) => (
-
- ))}
-
-
-
-
- {organizerData.map((human, index) => (
-
- ))}
-
-
-
-
-
-
-
- Empower
- Your Digital
- Odyssey!
-
-
-
-
-
-
- >
- );
-}
diff --git a/app/humans/page.tsx b/app/humans/page.tsx
new file mode 100644
index 0000000..cb5e302
--- /dev/null
+++ b/app/humans/page.tsx
@@ -0,0 +1,136 @@
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
+import HumansCard from "@/components/HumansCard"
+import Image from "next/image"
+import { MagicCard } from "@/components/ui/magic-card"
+
+import humansSticker from "@/public/humansPage/humansSticker.svg"
+import { OrganizersData } from "@/data/organizersData"
+import { MentorsData } from "@/data/mentorsData"
+import { FamilyData } from "@/data/familyData"
+
+export const metadata = {
+ title: "Humans | HackByte",
+ description:
+ "Meet the team behind HackByte 3.0! Discover the faces and roles of the passionate individuals who are working tirelessly to make the hackathon a grand success. Join us and be a part of the team!",
+ keywords:
+ "Humans, Team, Hackathon, IIITDMJ, Hackbyte, Coding, Programming, Tech",
+ openGraph: {
+ title: "Humans | HackByte",
+ description:
+ "Meet the team behind HackByte 3.0! Discover the faces and roles of the passionate individuals who are working tirelessly to make the hackathon a grand success. Join us and be a part of the team!",
+ url: "https://hackbyte.in/humans",
+ images:
+ "https://res.cloudinary.com/dlsqbiwug/image/upload/v1736876616/Frame_463_zdbkgu.png",
+ siteName: "HackByte - IIITDMJ Hackathon",
+ type: "website",
+ locale: "en_US",
+ },
+}
+
+const Humans = () => {
+ return (
+ <>
+
+
+
+
+ Meet the Humans
+ of HackByte 3.0
+
+
+ Hacker Experience is what we prioritize! Have questions, need
+ assistance, or just want to connect? Feel free to reach out!
+
+
+
+
+
+
+
+
+ Organizers
+
+
+ Mentors
+
+
+ Our family
+
+
+
+
+ {OrganizersData.map((human, index) => (
+
+
+
+ ))}
+
+
+
+
+ {MentorsData.map((human, index) => (
+
+
+
+ ))}
+
+
+
+
+ {FamilyData.map((human, index) => (
+
+
+
+ ))}
+
+
+
+
+ >
+ )
+}
+
+export default Humans
diff --git a/app/layout.js b/app/layout.js
deleted file mode 100644
index bf6cb72..0000000
--- a/app/layout.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import "./globals.css";
-import Script from "next/script";
-import "react-toastify/dist/ReactToastify.css";
-import "./clash_grotesk.css";
-
-export const metadata = {
- title: "HackByte - IIITDMJ Hackathon",
- description:
- "HackByte is the IIITDMJ's student-run hackathon, which centers on bringing developers and problem solvers from different foundations together and enables them to develop projects that can bring out an impact.",
- keywords: "hackathon, IIITDMJ, hackbyte, coding, programming, tech",
- url: "https://hackbyte.in",
- openGraph: {
- title: "HackByte - IIITDMJ Hackathon",
- description:
- "HackByte is the IIITDMJ's student-run hackathon, which centers on bringing developers and problem solvers from different foundations together and enables them to develop projects that can bring out an impact.",
- url: "https://hackbyte.in",
- images:
- "https://res.cloudinary.com/drtmfrghg/image/upload/v1708016443/opengraph-image_vkiopn.jpg",
- siteName: "HackByte - IIITDMJ Hackathon",
- locale: "en_US",
- type: "website",
- },
-};
-
-export default function RootLayout({ children }) {
- return (
-
-
-
-
-
- {children}
-
- );
-}
diff --git a/app/layout.tsx b/app/layout.tsx
new file mode 100644
index 0000000..7f2c28d
--- /dev/null
+++ b/app/layout.tsx
@@ -0,0 +1,92 @@
+import type { Metadata } from "next";
+import Script from "next/script";
+import "./globals.css";
+import MobileSidebar from "@/components/MobileSidebar";
+import { Sidebar } from "@/components/sidebar";
+import Footer from "@/components/footer";
+import { Toaster } from "@/components/ui/toaster";
+import InteractiveBackground from "@/components/dotbg";
+
+import localFont from "next/font/local";
+
+export const metadata: Metadata = {
+ title: "Hackbyte 3.0",
+ description: "Hackbyte 3.0 is a flagship event of TPC of IIITDMJ.",
+ keywords: "MLH, hackathon, IIITDMJ, hackbyte, coding, programming, tech",
+ openGraph: {
+ title: "HackByte - IIITDMJ Hackathon",
+ description:
+ "HackByte is the IIITDMJ's student-run hackathon, which centers on bringing developers and problem solvers from different foundations together and enables them to develop projects that can bring out an impact.",
+ url: "https://hackbyte.in",
+ images:
+ "https://res.cloudinary.com/dlsqbiwug/image/upload/v1736876616/Frame_463_zdbkgu.png",
+ siteName: "HackByte - IIITDMJ Hackathon",
+ locale: "en_US",
+ type: "website",
+ },
+};
+
+const gotham = localFont({
+ src: [
+ {
+ path: "../public/fonts/Gotham-Bold.otf",
+ weight: "bold",
+ },
+ {
+ path: "../public/fonts/Gotham-Medium.otf",
+ weight: "500",
+ },
+ {
+ path: "../public/fonts/Gotham-Black.otf",
+ weight: "900",
+ },
+ {
+ path: "../public/fonts/Gotham-Light.otf",
+ weight: "300",
+ },
+ {
+ path: "../public/fonts/Gotham-Book.otf",
+ weight: "normal",
+ },
+ ],
+ variable: "--font-gotham",
+});
+
+export default function RootLayout({
+ children,
+}: Readonly<{
+ children: React.ReactNode;
+}>) {
+ return (
+
+
+
+
+
+
+
+ {/* */}
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+ );
+}
diff --git a/app/not-found.jsx b/app/not-found.jsx
deleted file mode 100644
index eaa9136..0000000
--- a/app/not-found.jsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import Navbar from "@/components/Navbar";
-import { Button } from "@/components/ui/button";
-import { ArrowTopRightIcon } from "@radix-ui/react-icons";
-import Link from "next/link";
-
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
-
-export default function NotFound() {
- return (
- <>
-
-
-
-
-
-
- Sorry, but the page you are looking for might have been removed or
- is temporarily unavailable.
-
-
-
-
-
- BACK TO HOME
-
-
-
-
-
-
-
-
- Empower
- Your Digital
- Odyssey!
-
-
-
-
-
-
- >
- );
-}
diff --git a/app/page.js b/app/page.js
deleted file mode 100644
index 0e105df..0000000
--- a/app/page.js
+++ /dev/null
@@ -1,344 +0,0 @@
-import Navbar from "@/components/Navbar";
-import ThemeTitle from "@/components/ThemeTitle";
-import { Button } from "@/components/ui/button";
-import { ArrowTopRightIcon } from "@radix-ui/react-icons";
-import { HackbyteLogo } from "@/components/HackbyteLogo";
-import {
- TwitterLogoIcon,
- InstagramLogoIcon,
- LinkedInLogoIcon,
- DiscordLogoIcon,
-} from "@radix-ui/react-icons";
-import Link from "next/link";
-import StatisticCard from "@/components/StatisticCard";
-import NewsLetter from "@/components/NewsLetter";
-
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
-
-const SocialMediaIcon = ({ Icon, href }) => (
-
-
-
-);
-
-export default function Home() {
- const statisticsData = [
- {
- number: 2400,
- label: "Registrations",
- description: "2400+ registrations from across the country.",
- },
- {
- number: 400,
- label: "Offline Participants",
- description: "400+ participants joined the offline hackathon!",
- },
- {
- number: 100,
- label: "Volunteers",
- description: "To help you, get the best out of HackByte.",
- },
- {
- number: 100,
- label: "Projects",
- description: "Innovative submissions from various domains.",
- },
- ];
-
- const aboutData = [
- {
- imgSrc: "/aboutPage/img1.svg",
- title: "Collaborate and skill up",
- description:
- "Connect with people, form a team, learn new skills and develop amazing projects!",
- },
- {
- imgSrc: "/aboutPage/img2.svg",
- title: "Exciting Prizes",
- description:
- "Top 3 teams plus best projects of each domain will win prizes which will be disclosed soon!",
- },
- {
- imgSrc: "/aboutPage/img3.svg",
- title: "Engaging Workshops",
- description:
- "Technical workshops and events like no-light event will keep the participants engaged throughout.",
- },
- {
- imgSrc: "/aboutPage/img4.svg",
- title: "Mentorship sessions",
- description:
- "Get mentorship and guidance from prominent technocrats of the industry.",
- },
- {
- imgSrc: "/aboutPage/img5.svg",
- title: "Recruitment offers",
- description:
- "Best performers will get recruitment offers from prestigious companies.",
- },
- {
- imgSrc: "/aboutPage/img6.svg",
- title: "Expand network",
- description:
- "Connect with industry professionals and recruiters and other teams to learn and grow more.",
- },
- ];
-
- return (
-
-
-
-
-
-
-
-
-
- Join us on 4th-6th April 2025,
- at IIIT Jabalpur for the hackathon.{" "}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Organised by
- The Programming Club of
- IIITDMJ
-
-
-
-
-
-
-
-
-
-
-
- We Think to Innovate
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {statisticsData.map((statistic, index) => (
-
- ))}
-
-
-
-
-
-
-
-
- Opportunities for Participants
-
-
- Why participate in Hackbyte 3.0?
-
-
-
- HackByte 3.0 promises a wonderful experience to the
- participants.
-
-
-
-
-
- {aboutData.map((item, index) => (
-
= 3 ? "xl:mt-9" : ""
- }`}
- >
-
-
-
- {item.title}
-
-
- {item.description}
-
-
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
- Join our mailing list!
-
-
- To stay up-to-date with HackByte 3.0, consider subscribing to
- our mailing list. Helps us share important updates right away
- with hackers and enthusiasts alike !
-
-
-
-
-
-
-
- Get updates about your application status
-
-
-
-
-
- Get notified for exciting events!
-
-
-
-
-
- Be the first ones to register for HackByte 3.0
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Empower
- Your Digital
- Odyssey!
-
-
-
-
-
-
-
- );
-}
diff --git a/app/page.tsx b/app/page.tsx
new file mode 100644
index 0000000..9adea43
--- /dev/null
+++ b/app/page.tsx
@@ -0,0 +1,300 @@
+import Image from "next/image"
+import stats from "@/public/HomePageLogo/redtape2.png"
+// import HeroSection from "@/components/Herosection"
+import DiscordCard from "@/components/DiscordCard"
+import whyParticipate from "@/public/HomePageLogo/whyParticipate.png"
+import g1 from "@/public/HomePageLogo/g1.svg"
+import g2 from "@/public/HomePageLogo/g2.svg"
+import g3 from "@/public/HomePageLogo/g3.svg"
+import g4 from "@/public/HomePageLogo/g4.svg"
+import g5 from "@/public/HomePageLogo/g5.svg"
+import g6 from "@/public/HomePageLogo/g6.svg"
+import g7 from "@/public/HomePageLogo/g7.svg"
+import g8 from "@/public/HomePageLogo/g8.svg"
+import g9 from "@/public/HomePageLogo/g9.svg"
+import g10 from "@/public/HomePageLogo/g10.svg"
+import bottomstats from "@/public/upper.svg"
+import topstats from "@/public/lower.svg"
+import * as motion from "motion/react-client"
+import AnimatedTitle from "@/components/AnimatedTitle"
+import CountAnimation from "@/components/CountAnimation"
+import Link from "next/link"
+import HB4Form from "@/components/HB4Form"
+import hackbyte4logo from "@/public/HB4Logo.svg"
+
+interface GuidlinesCard {
+ title: string
+ description: string
+ icon: string
+ index: number
+}
+
+function GuidelinesCard({ title, description, icon, index }: GuidlinesCard) {
+ // Define animation variants based on index
+ const animationVariants = {
+ hidden: { opacity: 0, x: index % 2 === 0 ? -50 : 50 },
+ visible: { opacity: 1, x: 0 },
+ }
+
+ return (
+
+
+
+
+ {title}
+
+
+ {description}
+
+
+
+ )
+}
+
+export default function Home() {
+ const Guidelines = [
+ {
+ icon: g1,
+ title: "Register with Ease",
+ description:
+ "Pre-registration opens Shortly—no red tape, just one click away!",
+ },
+ {
+ icon: g2,
+ title: "No Prerequisites",
+ description:
+ "Anyone can join, no prerequisites—just bring your creativity!",
+ },
+ {
+ icon: g3,
+ title: "Form Team",
+ description:
+ "Team up with 2-4 members; join our Discord to find teammates and get the latest updates!",
+ },
+ {
+ icon: g4,
+ title: "Flexible Teams",
+ description:
+ "Add teammates later by submitting an individual application, and they’ll be added once approved.",
+ },
+ {
+ icon: g5,
+ title: "Zero Fees, Full Perks",
+ description: "No cost to participate, plus free meals and accommodation.",
+ },
+ {
+ icon: g6,
+ title: "Free Food",
+ description:
+ "Enjoy complimentary meals, water, and coffee throughout the event.",
+ },
+ {
+ icon: g7,
+ title: "In-person Event",
+ description: "HackByte 4.0 is an in-person / offline hackathon event.",
+ },
+ {
+ icon: g8,
+ title: "Hassle-Free Stay",
+ description:
+ "Shared hall accommodations with mattresses—simple and sorted.",
+ },
+ {
+ icon: g9,
+ title: "Venue",
+ description:
+ "IIITDM Jabalpur awaits—explore the campus and bring ideas to life.",
+ },
+ ]
+
+ return (
+
+ {/*
*/}
+
+
+
+ Can't wait for Hackbyte 4.0?
+
+
+ Tentative dates are here!{" "}
+ April 3-5, 2026 !
+
+
+
+
+
+
+
+
+ We are coming back with a
+ brand new{" "}
+
+ Theme
+
+ , new determination and lots of
+ new Surprises🎁 !
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Registrations
+
+
+ 5100+ registrations from across the country.
+
+
+
+
+
+ Participants
+
+
+ 400+ participants joined the offline hackathon!
+
+
+
+
+
+ Volunteers
+
+
+ To help you, get the best out of HackByte.
+
+
+
+
+
+ Projects
+
+
+ Innovative submissions from various domains.
+
+
+
+
+
+ {/* Why Participate */}
+
+
+
+ Why Participate in Hackbyte 4.0?
+
+
+
+
+
+
+
+ {/* Guidelines */}
+
+
+
+ Guidelines for Hackbyte 4.0
+
+
+
+ {Guidelines.map((item, index) => (
+
+ ))}
+
+
+
+
+ Safe and Secure
+
+
+ We follow the MLH{" "}
+
+ Code of Conduct
+ {" "}
+ for a inclusive, and secure environment for everyone
+
+
+
+
+
+
+
+
+
+ Join our Discord Community
+
+
+
+
+
+ )
+}
diff --git a/app/partners/page.jsx b/app/partners/page.jsx
deleted file mode 100644
index cf0f645..0000000
--- a/app/partners/page.jsx
+++ /dev/null
@@ -1,249 +0,0 @@
-import Navbar from "@/components/Navbar";
-import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
-import TitleSponsorCard from "@/components/TitleSponsorCard";
-import SponsorCard from "@/components/ui/cards";
-
-import mlh from "@/public/partnersPage/mlh.webp";
-import github from "@/public/partnersPage/github.jpg";
-import postman from "@/public/partnersPage/postman.jpg";
-import bobble from "@/public/partnersPage/bobble.webp";
-import godspeed from "@/public/partnersPage/godSpeed.jpg";
-import devfolio from "@/public/partnersPage/devfolio.webp";
-import virtualProtocol from "@/public/partnersPage/virtualProtocol.jpg";
-import nextgen from "@/public/partnersPage/nextgen.jpg";
-import auth0 from "@/public/partnersPage/auth0.webp";
-import taipy from "@/public/partnersPage/taipy.jpg";
-import godaddy from "@/public/partnersPage/godaddy.webp";
-
-import balsamiq from "@/public/partnersPage/balsamiq.webp";
-import edubard from "@/public/partnersPage/edubard.webp";
-import wolfram from "@/public/partnersPage/wolfram.webp";
-import mongodb from "@/public/partnersPage/mongodb.webp";
-import finlatics from "@/public/partnersPage/finlatics.webp";
-import jdoodle from "@/public/partnersPage/jdoodle.png";
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
-
-export const metadata = {
- title: "Partners | HackByte",
- description:
- "Explore the invaluable support from our esteemed sponsors and partners at HackByte – the premier hackathon hosted by IIITDMJ. Discover their contributions and partnerships, playing a pivotal role in empowering the coding community.",
- keywords:
- "Sponsors, Partners, Hackathon, IIITDMJ, Hackbyte, Coding, Programming, Tech, Collaboration, Innovation, Community Support, Technology Events",
- openGraph: {
- title: "Partners | HackByte",
- description:
- "Explore the invaluable support from our esteemed sponsors and partners at HackByte – the premier hackathon hosted by IIITDMJ. Discover their contributions and partnerships, playing a pivotal role in empowering the coding community.",
- url: "https://hackbyte.in/partners",
- images:
- "https://res.cloudinary.com/drtmfrghg/image/upload/v1708016443/opengraph-image_vkiopn.jpg",
- siteName: "HackByte - IIITDMJ Hackathon",
- type: "website",
- locale: "en_US",
- },
-};
-
-const normalSponsorsData = [
- {
- sponsor: "MLH",
- category: "Platform Partner",
- sponsorimgsrc: mlh,
- site: "https://mlh.io",
- },
- {
- sponsor: "GitHub",
- category: "Gold Sponsor",
- sponsorimgsrc: github,
- site: "https://gh.io/hackbyte2",
- },
- {
- sponsor: "Postman",
- category: "Gold Sponsor",
- sponsorimgsrc: postman,
- site: "https://community.postman.com",
- },
- {
- sponsor: "Bobble Fan Store",
- category: "Merch Partner",
- sponsorimgsrc: bobble,
- site: "https://fanstore.bobble.ai",
- },
- {
- sponsor: "Godspeed Systems",
- category: "Silver Sponsor",
- sponsorimgsrc: godspeed,
- site: "https://godspeed.systems",
- },
- {
- sponsor: "Devfolio",
- category: "Platform Partner",
- sponsorimgsrc: devfolio,
- site: "https://devfolio.co",
- },
- {
- sponsor: "Virtual Protocol",
- category: "Bronze Sponsor",
- sponsorimgsrc: virtualProtocol,
- site: "https://www.virtuals.io/",
- },
- {
- sponsor: "NextGen",
- category: "Bronze Sponsor",
- sponsorimgsrc: nextgen,
- site: "https://nextgenglobalhub.github.io/opensourcecohort/",
- },
- {
- sponsor: "Auth0",
- category: "Track Sponsor",
- sponsorimgsrc: auth0,
- site: "http://hackp.ac/auth0",
- },
- {
- sponsor: "Taipy",
- category: "Track Sponsor",
- sponsorimgsrc: taipy,
- site: "https://hackp.ac/taipy-gettingstarted",
- },
- {
- sponsor: "Go Daddy Registry",
- category: "Track Sponsor",
- sponsorimgsrc: godaddy,
- site: "http://hackp.ac/godaddyregistry",
- },
-];
-
-const inKindSponsorsData = [
- {
- sponsor: "Balsamiq",
- category: "Community Sponsor",
- sponsorimgsrc: balsamiq,
- site: "https://balsamiq.com",
- },
- {
- sponsor: "Edubard",
- category: "Media Partner",
- sponsorimgsrc: edubard,
- site: "https://edubard.in",
- },
- {
- sponsor: "Wolfram",
- category: "Community Sponsor",
- sponsorimgsrc: wolfram,
- site: "https://www.wolfram.com/wolfram-one/",
- },
- {
- sponsor: "MongoDB",
- category: "Community Sponsor",
- sponsorimgsrc: mongodb,
- site: "https://www.mongodb.com/",
- },
- {
- sponsor: "Finlatics",
- category: "Community Sponsor",
- sponsorimgsrc: finlatics,
- site: "https://www.finlatics.com/",
- },
- {
- sponsor: "JDoodle",
- category: "Community Sponsor",
- sponsorimgsrc: jdoodle,
- site: "https://www.jdoodle.com/?utm_source=Event+Website&utm_medium=Event+Sponsorship&utm_campaign=HackByte+Sponsorship+2024&utm_id=HackByte+2.0",
- },
-];
-
-const Partners = () => {
- return (
-
-
-
-
-
- Partners
-
-
-
- We are proud to collaborate with visionary organizations that
- share our passion for innovation and technology. These esteemed
- partners play a crucial role in making our hackathon a success
-
-
-
-
-
-
-
- Sponsors
-
-
- In Kind Sponsors
-
-
-
-
-
-
-
- {normalSponsorsData.map((sponsor, index) => {
- return ;
- })}
-
-
-
-
-
- {inKindSponsorsData.map((sponsor, index) => {
- return ;
- })}
-
-
-
-
-
-
-
-
- Empower
- Your Digital
- Odyssey!
-
-
-
-
-
-
-
-
- );
-};
-
-export default Partners;
diff --git a/app/partners/page.tsx b/app/partners/page.tsx
new file mode 100644
index 0000000..6cb348f
--- /dev/null
+++ b/app/partners/page.tsx
@@ -0,0 +1,127 @@
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
+import Image from "next/image"
+import SponsorCard from "@/components/SponsorCard"
+
+import webdock from "@/public/partnersPage/webdock.png"
+import benq from "@/public/partnersPage/benq.png"
+import { inKindSponsorsData, normalSponsorsData } from "@/data/sponsorData"
+import TitleSponsorCard from "@/components/TitleSponsorCard"
+import HB3Logo from "@/public/HB3Logo.png"
+
+export const metadata = {
+ title: "Partners | HackByte",
+ description:
+ "Explore the invaluable support from our esteemed sponsors and partners at HackByte – the premier hackathon hosted by IIITDMJ. Discover their contributions and partnerships, playing a pivotal role in empowering the coding community.",
+ keywords:
+ "Sponsors, Partners, Hackathon, IIITDMJ, Hackbyte, Coding, Programming, Tech, Collaboration, Innovation, Community Support, Technology Events",
+ openGraph: {
+ title: "Partners | HackByte",
+ description:
+ "Explore the invaluable support from our esteemed sponsors and partners at HackByte – the premier hackathon hosted by IIITDMJ. Discover their contributions and partnerships, playing a pivotal role in empowering the coding community.",
+ url: "https://hackbyte.in/partners",
+ images:
+ "https://res.cloudinary.com/dlsqbiwug/image/upload/v1736876616/Frame_463_zdbkgu.png",
+ siteName: "HackByte - IIITDMJ Hackathon",
+ type: "website",
+ locale: "en_US",
+ },
+}
+
+const PartnersPage = () => {
+ const TitleSponsors = [
+ {
+ title: "Webdock.io",
+ description:
+ "Webdock.io is revolutionizing VPS hosting with a faster, more affordable, and developer-friendly platform. Built from the ground up, Webdock offers a powerful yet simple hosting experience with a custom control panel, predictable billing, and blazing-fast performance.",
+ imageSrc: webdock,
+ link: "https://webdock.io/en",
+ },
+ {
+ title: "BenQ",
+ description:
+ "BenQ is a world-leading human technology and solutions provider driven by the corporate vision of 'Bringing Enjoyment ‘N’ Quality to Life' to elevate and enrich the aspects of life that matter most to people today – lifestyle, business, healthcare, and education.",
+ imageSrc: benq,
+ link: "https://www.benq.com/en-in/campaign/best-coding-monitor-for-programmers.html?utm_source=event&utm_medium=referral&utm_campaign=wed_programming_webtraffic_others_programming%20series_hackbyte_traffic_202504",
+ },
+ ]
+ return (
+ <>
+
+
+
+
+
+ Our Past Partners
+ who Supported
+
+
+ We are proud to collaborate with visionary organizations that
+ share our passion for innovation and technology.
+
+
+
+
+
+
+
+
+
+ Sponsors
+
+
+ In Kind Sponsors
+
+
+
+
+
+ {TitleSponsors.map((sponsor, index) => (
+
+ ))}
+
+
+
+ {normalSponsorsData.map((sponsor, index) => {
+ return
+ })}
+
+
+
+
+
+ {inKindSponsorsData.map((sponsor, index) => {
+ return
+ })}
+
+
+
+
+ >
+ )
+}
+
+export default PartnersPage
diff --git a/app/prizes/page.jsx b/app/prizes/page.jsx
index 9e899d6..40506e9 100644
--- a/app/prizes/page.jsx
+++ b/app/prizes/page.jsx
@@ -1,37 +1,9 @@
-import Navbar from "@/components/Navbar";
-import { Button } from "@/components/ui/button";
-import { ArrowTopRightIcon } from "@radix-ui/react-icons";
-import PrizeCard from "@/components/PrizeCard";
-import TSPrizeCard from "@/components/TSPrizeCard";
-import LogitechTrackCard from "@/components/LogitechTrackCard";
+import PrizeSection from "@/components/PrizeSection";
import Image from "next/image";
-
-import bestBeginner from "@/public/prizesPage/best_beginner.png";
-import bestGirls from "@/public/prizesPage/best_girls.png";
-
-import leftLeaf from "@/public/schedulePage/leftLeaf.svg";
-import rightLeaf from "@/public/schedulePage/rightLeaf.svg";
-
-import img1 from "@/public/prizesPage/img1.svg";
-import img2 from "@/public/prizesPage/img2.svg";
-import img3 from "@/public/prizesPage/img3.svg";
-import img4 from "@/public/prizesPage/img4.svg";
-import prizeImg1 from "@/public/prizesPage/prizeImg1.webp";
-import prizeImg2 from "@/public/prizesPage/prizeImg2.webp";
-import prizeImg3 from "@/public/prizesPage/prizeImg3.webp";
-
-// Sponsor Logos
-import mongodbLogo from "@/public/prizesPage/mongodbLogo.svg";
-import godSpeedLogo from "@/public/prizesPage/godSpeedLogo.png";
-import godaddyLogo from "@/public/prizesPage/godaddyLogo.svg";
-import virtualProtocolLogo from "@/public/prizesPage/virtualProtocolLogo.png";
-import auth0Logo from "@/public/prizesPage/auth0Logo.svg";
-import taipyLogo from "@/public/prizesPage/taipyLogo.svg";
-import wolframLogo from "@/public/prizesPage/wolframLogo.png";
-import postmanLogo from "@/public/prizesPage/postmanLogo.jpg";
-
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
+import medal from "@/public/HomePageLogo/medal.webp";
+import cup4 from "@/public/prizesPageLogo/cup4 (2).svg";
+import { sponsorTrackPrizesData } from "../../data/sponsorTrackPrizesData";
+import TrackPrizeCard from "@/components/TrackPrizeCard";
export const metadata = {
title: "Prizes | HackByte",
@@ -45,238 +17,87 @@ export const metadata = {
"Discover the exciting prizes at HackByte! Explore the rewards, recognition, and opportunities awaiting you. Connect with us for more information on IIIT Jabalpur's hackathon.",
url: "https://hackbyte.in/prizes",
images:
- "https://res.cloudinary.com/drtmfrghg/image/upload/v1708016443/opengraph-image_vkiopn.jpg",
+ "https://res.cloudinary.com/dlsqbiwug/image/upload/v1736876616/Frame_463_zdbkgu.png",
siteName: "HackByte - IIITDMJ Hackathon",
type: "website",
locale: "en_US",
},
};
-const sponsorData = [
- {
- logo: postmanLogo,
- alt: "Postman",
- title: "Best API Design and use of postman for docs",
- supportText: "Postman Swag Kit",
- description:
- "Postman offers a complete toolkit for the API lifecycle, accelerating design, testing, documentation, and sharing among millions of developers.",
- docLink:
- "https://docs.google.com/document/d/1TXbfdm_3N70MC3S43Yuhl_p2LDFoXMuO5ha8WfAETpc/edit?usp=sharing",
- },
- {
- logo: mongodbLogo,
- alt: "MongoDB",
- title: "Best Use of MongoDB Atlas",
- supportText: "M5GO IoT Starter Kit",
- description:
- "MongoDB Atlas takes the leading modern database and makes it accessible in the cloud! Get started with a $50 credit for students or sign up for the Atlas free forever tier (no credit card required).",
- },
- {
- logo: godSpeedLogo,
- alt: "GodSpeed",
- title: "Innovative use of Godspeed Systems",
- supportText: "Godspeed Swag pack",
- description:
- "Unleash your creativity with Godspeed ! Make use of any offering that Godspeed provides to bring your ideas to life. This category welcomes truly silly and fun submissions, so feel free to dream big and get ridiculously creative!",
- docLink:
- "https://docs.google.com/document/d/15YHM6PuHMMrMLNhDJt_PxEELtkW_QXnlAubIQ9mFTFg/edit",
- },
- {
- logo: godaddyLogo,
- alt: "GoDaddy",
- title: "Best Domain Name from GoDaddy Registry",
- supportText: "Hack from Home Kit",
- description:
- "GoDaddy Registry is giving you everything you need to be the best hacker no matter where you are. Register your domain name with GoDaddy Registry for a chance to win a Hack from Home Kit!",
- },
- {
- logo: virtualProtocolLogo,
- alt: "Virtual Protocol",
- title: "Best AI use case",
- supportText: "Cash Prize of 15k",
- description:
- "Create an AI-driven solution revolutionizing Gaming, Social, or Digital Entertainment. Utilize Gen AI to enrich UX, simplify content creation, boost social interaction, or innovate entertainment experiences.",
- docLink:
- "https://docs.google.com/document/d/1ReAl3V-HbWDOqwfxRar0dn_IxAGD4wEFTKTtgXayWEs/edit?usp=sharing",
- },
- {
- logo: auth0Logo,
- alt: "Auth0",
- title: "Best Use of Auth0",
- supportText: "Wireless Headphones & Battery Pack",
- description:
- "Secure your applications with Auth0's hassle-free features like social sign-in and Multi-Factor Authentication. No credit card needed, try it free for up to 7,000 users. Plus, enter to win wireless headphones and battery packs for your team by using Auth0 APIs!",
- },
- {
- logo: taipyLogo,
- alt: "Taipy",
- title: "Best Use of Taipy",
- supportText: "Wireless Headphones",
- description:
- "Taipy empowers Python developers with rapid web app creation, simplifying UI design and backend integration. Win Wireless Headphones & website feature by incorporating Taipy into your hackathon project!",
- },
- {
- logo: wolframLogo,
- alt: "Wolfram",
- title: "The Top 7 teams",
- supportText: "The Wolfram Award",
- description:
- "Each member of the top 7 teams will receive the Wolfram Award, which includes a one-year subscription to Wolfram | One Personal Edition and Wolfram | Alpha Pro, worth $375.",
- },
-];
-
-const logitechTracksData = [
- {
- imgSrc: img1,
- title: "Blind Type",
- description:
- "Played in team of two, one person is blindfolded and the other one has to speak out the text and the blindfolded one types it. The team with most WordsPerMinute wins.",
- prize: "K950 Wireless Keyboard",
- prizeImg: prizeImg1,
- borderColor: "#E5F1FF",
- bgColor:
- "radial-gradient(355.69% 132.99% at 0% 6.53%, rgba(255, 209, 233, 0.10) 0%, rgba(255, 212, 234, 0.02) 100%)",
- },
- {
- imgSrc: img2,
- title: "Trending Tweet",
- description:
- "Tweet about the most fun and interesting moments during HackByte, tag HackByte and Logitech. The one with the maximum engagement gets the amazing POP Mouse.",
- prize: "Logitech POP Mouse",
- prizeImg: prizeImg2,
- borderColor: "#E5F1FF",
- bgColor:
- "radial-gradient(355.69% 132.99% at 0% 6.53%, rgba(128, 188, 255, 0.10) 0%, rgba(109, 160, 217, 0.02) 100%)",
- },
- {
- imgSrc: img3,
- title: "Stress Buster",
- description:
- "Feeling tense about finding that bug in your code? Join us for a fun game to recharge! The best moments will be recorded and compiled into a reel.",
- prize: "Logitech M240",
- prizeImg: prizeImg3,
- borderColor: "#E5FFF1",
- bgColor:
- "radial-gradient(355.69% 132.99% at 0% 6.53%, rgba(128, 255, 183, 0.10) 0%, rgba(109, 217, 156, 0.02) 100%)",
- },
- {
- imgSrc: img4,
- title: "Snap It if You Can",
- description:
- "A short insta pause game, we'll explain you this in subsequent announcements",
- prize: "Logitech POP Mouse",
- prizeImg: prizeImg2,
- borderColor: "#FFFAEF",
- bgColor:
- "radial-gradient(129.97% 124.9% at 0% 6.52%, #38351C 0%, rgba(56, 53, 28, 0.17) 100%)",
- },
-];
-
export default function Prizes() {
return (
-
-
-
-
-
- Prizes
-
-
-
- Collaborate and innovate to build something awesome ! All
- monetary prizes will be split equally among the winning team
- members.
+
+
+
+
+
+ Prizes for the Winners
-
+
- Winners will also get MLH winner pins 🌟
+ Collaborate and innovate to build something awesome ! All
+ monetary prizes will be split equally among the winning team
+ members.
+
+
+ Winners will also get MLH winner pins 🌟
+
+
+
-
-
-
-
-
+
+
+
-
+
-
+
Best Girls Team
+
+ ₹5,000 Cash Prize
+
Best performing All-Girls Team at HackByte
-
+
-
+
First Time Hacking?
+
+ ₹5,000 Cash Prize
+
For freshmen and novices
@@ -286,148 +107,28 @@ export default function Prizes() {
- {/* Logitech Tracks Section */}
- {/*
-
-
- Exclusive Tracks by Logitech
-
-
- Get to interact and learn more about the amazing{" "}
- Master Series by Logitech
- and win amazing prizes along the way!
-
-
-
-
-
-
-
-
- Logitech Macro Challenge
-
-
-
-
-
- Enter Logitech's Smart Action Hack challenge: automate tasks
- with a keystroke using MX Master series and Logi Options+ to win
- MX Master 3s and MX Keys S! 🚀
-
-
-
-
- Submit your macro idea
-
-
-
-
-
-
-
-
- Explore more tracks by Logitech
-
-
-
- {logitechTracksData.map((card, index) => (
-
- ))}
-
-
-
*/}
-
{/* Sponsor Tracks Section */}
-
-
-
- Sponsor Tracks
-
-
- Explore our sponsor tracks and leverage their technologies to
- bring your projects to life! All monetary prizes will be split
- equally among the winning team members.
-
-
-
-
- {sponsorData.map((sponsor, index) => (
-
- ))}
-
-
-
-
-
-
+
+
+ Sponsored Tracks
+
- Empower
- Your Digital
- Odyssey!
+ Explore our sponsor tracks and leverage their technologies to bring
+ your projects to life!
-
-
+
+ {sponsorTrackPrizesData.map((sponsor, index) => {
+ return ;
+ })}
+
-
);
}
diff --git a/app/schedule/page.jsx b/app/schedule/page.jsx
index 144bddc..3fac774 100644
--- a/app/schedule/page.jsx
+++ b/app/schedule/page.jsx
@@ -1,28 +1,6 @@
-import Navbar from "@/components/Navbar";
-import {
- Dialog,
- DialogTrigger,
- DialogContent,
- DialogTitle,
- DialogDescription,
- DialogHeader,
-} from "@/components/ui/dialog";
-import {
- Table,
- TableBody,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
-} from "@/components/ui/table";
-import { ScrollArea } from "@/components/ui/scroll-area";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import Image from "next/image";
-
-import leftLeaf from "@/public/schedulePage/leftLeaf.svg";
-import rightLeaf from "@/public/schedulePage/rightLeaf.svg";
-
-import FooterAnimation from "@/components/FooterAnimation";
-import Footer from "@/components/Footer";
+import schedule from "@/public/schedule.png";
export const metadata = {
title: "Schedule | HackByte",
@@ -36,548 +14,408 @@ export const metadata = {
"Check out the schedule for HackByte! Stay updated with the timeline of events and activities happening during IIIT Jabalpur's hackathon.",
url: "https://hackbyte.in/schedule",
images:
- "https://res.cloudinary.com/drtmfrghg/image/upload/v1708016443/opengraph-image_vkiopn.jpg",
+ "https://res.cloudinary.com/dlsqbiwug/image/upload/v1736876616/Frame_463_zdbkgu.png",
siteName: "HackByte - IIITDMJ Hackathon",
type: "website",
locale: "en_US",
},
};
-export default function Schedule() {
- const day1 = [
- {
- event: "Check in",
- time: "2:30 PM - 5:00 PM",
- duration: "150mins",
- },
- {
- event: "Opening Ceremony",
- time: "5:15 PM - 6:30 PM",
- duration: "75mins",
- },
- {
- event: "Logitech Keynote",
- time: "6:00 PM - 6:30 PM",
- duration: "30mins",
- },
- {
- event: "Hacking Begins",
- time: "7:00 PM",
- duration: "NA",
- },
- {
- event: "Dinner",
- time: "9:30 PM - 10:30 PM",
- duration: "60mins",
- },
- ];
-
- const day2 = [
- {
- event: "Logitech Workshop",
- time: "12:00 AM - 1:00 AM",
- duration: "60mins",
- },
- {
- event: "Mentorship Round 1",
- time: "1:30AM",
- duration: "NA",
- },
- {
- event: "Checkpoint 1/4",
- time: "2:00 AM",
- duration: "NA",
- },
- {
- event: "Logitech Event-Blind Type and Postman Trivia",
- time: "2:00 AM - 3:00 AM",
- duration: "60mins",
- },
- {
- event: "Midnight Snack",
- time: "4:00 AM",
- duration: "NA",
- },
- {
- event: "Breakfast",
- time: "7:30 AM - 8:30 AM",
- duration: "60mins",
- },
- {
- event: "Virtual Protocol Session",
- time: "9:15 AM - 9:45 AM",
- duration: "30mins",
- },
- {
- event: "GitHub Copilot by Sagar",
- time: "10:15 AM - 11:00 AM",
- duration: "45mins",
- },
- {
- event: "Postman Trivia and Logitech Event-Blind Type",
- time: "11:00 AM - 12:00 PM",
- duration: "60mins",
- },
- {
- event: "Lunch",
- time: "12:00 PM - 1:00 PM",
- duration: "60mins",
- },
- {
- event: "Checkpoint 2/4",
- time: "2:00 PM",
- duration: "NA",
- },
- {
- event: "Judging Round 1",
- time: "2:00 PM - 4:00 PM",
- duration: "120mins",
- },
- {
- event: "Codespaces session by Sanskriti",
- time: "4:00 PM - 5:30 PM",
- duration: "90mins",
- },
- {
- event: "Dinner",
- time: "7:00 PM - 8:15 PM",
- duration: "75mins",
- },
- {
- event: "Checkpoint 3/4",
- time: "10:00 PM",
- duration: "NA",
- },
- ];
-
- const day3 = [
- {
- event: "Postman session by Aanchal",
- time: "12:00 AM - 1:00 AM",
- duration: "60mins",
- },
- {
- event: "Menorship Round 2",
- time: "1:00 AM",
- duration: "NA",
- },
- {
- event: "Games",
- time: "2:00 AM - 3:00 AM",
- duration: "60mins",
- },
- {
- event: "Checkpoint 4/4",
- time: "3:00 AM",
- duration: "NA",
- },
- {
- event: "Midnight Snack",
- time: "3:30 AM",
- duration: "NA",
- },
- {
- event: "Soft Deadline",
- time: "5:30 AM",
- duration: "NA",
- },
- {
- event: "Hard Deadline",
- time: "7:00 AM",
- duration: "NA",
- },
- {
- event: "Breakfast",
- time: "7:30 AM - 8:30 AM",
- duration: "60mins",
- },
- {
- event: "Judging Round 2",
- time: "9:00 AM",
- duration: "NA",
- },
- {
- event: "Lunch",
- time: "12:00 PM - 1:10 PM",
- duration: "70mins",
- },
- {
- event: "Closing Ceremony",
- time: "2:15 PM",
- duration: "NA",
- },
- ];
-
- return (
- <>
-
-
-
-
-
- Run of Show
-
-
{
+ const EventFlowBox = ({ h, bgColor, title, description, time, snacks }) => {
+ return (
+
+
+ {time}
+
+
+
+
+
+ {title}
+
+
- Join us for a day packed with coding challenges, workshops, and
- networking. Elevate your skills and collaborate with fellow
- hackers!
-
+ + SNACKS TIME!
+
+ {description && (
+
+ {description}
+
+ )}
+
+ );
+ };
-
- {/* Day 1 */}
-
-
-
+
+
+
+
+
+ Run of show for the Event
+
+
+ Join us for days packed with coding challenges and workshops.
+ Elevate your skills and collaborate with fellow hackers!
+
+
+
+
+
+
+
+ Day 1
+
+
-
-
-
- Ideate and finalize your project
-
+ Day 2
+
+
+ Day 3
+
+
+
+
+
+ 4th April
-
-
- Meet and network with fellow hackers, shortlist the techstack
- your team will be working on
-
+ {/*
+ Hacking Time: 3.5 Hours
+
*/}
-
-
-
-
-
- Day 1 Timeline
-
-
-
-
-
-
- Event
- Time
- Duration
-
-
-
- {day1.map((event, index) => (
-
-
- {event.event}
-
-
- {event.time}
-
- {event.duration}
-
- ))}
-
-
-
-
-
-
-
-
- {/* Day 2 */}
-
-
-
-
-
-
- Coffee, mini events and yes, the MVP
-
+
+
+
+
+
+
+
+
+
+
+ 12:00 AM
-
-
- Seek help from mentors to make an MVP, along with some really
- cool workshop sessions 👀
-
-
-
-
-
- Day 2 Timeline
-
-
-
-
-
-
- Event
- Time
- Duration
-
-
-
- {day2.map((event, index) => (
-
-
- {event.event}
-
-
- {event.time}
-
- {event.duration}
-
- ))}
-
-
-
-
-
-
-
-
- {/* Day 3 */}
-
-
-
-
-
-
- The Final Sprint
-
+
+
+
+
+ 5th April
-
-
- Improve upon the MVP, polish your elevator pitch and submit
- your project on Devfolio with documentation
-
+ {/*
+ Hacking Time: 14.5 Hours
+
*/}
-
-
-
-
-
- Day 3 Timeline
-
-
-
-
-
-
- Event
- Time
- Duration
-
-
-
- {day3.map((event, index) => (
-
-
- {event.event}
-
-
- {event.time}
-
- {event.duration}
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
-
- Empower
- Your Digital
- Odyssey!
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 12:00 AM
+
+
+
+
+
+
+ 6th April
+
+ {/*
+ Hacking Time: 2.5 Hours
+
*/}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 4:00 PM
+
+
+
+
-
>
);
-}
+};
+
+export default Schedule;
diff --git a/app/sitemap.xml b/app/sitemap.xml
index 2681bb2..7187540 100644
--- a/app/sitemap.xml
+++ b/app/sitemap.xml
@@ -2,42 +2,42 @@
https://hackbyte.in/
- 2024-04-05
+ 2025-03-17
1.0
https://hackbyte.in/gallery
- 2024-04-05
+ 2025-03-17
0.6
https://hackbyte.in/partners
- 2024-04-05
+ 2025-03-23
0.9
https://hackbyte.in/prizes
- 2024-04-05
+ 2025-03-23
0.9
https://hackbyte.in/schedule
- 2024-04-05
+ 2025-03-23
0.8
https://hackbyte.in/humans
- 2024-04-05
+ 2025-03-17
0.8
https://hackbyte.in/faq
- 2024-04-05
+ 2025-03-17
0.8
https://hackbyte.in/contact
- 2024-04-05
+ 2025-03-17
0.8
\ No newline at end of file
diff --git a/app/template.jsx b/app/template.jsx
new file mode 100644
index 0000000..b0cca46
--- /dev/null
+++ b/app/template.jsx
@@ -0,0 +1,28 @@
+"use client";
+import { ReactLenis, useLenis } from "lenis/react";
+
+function Template({ children }) {
+ useLenis(({ scroll }) => {
+ // Trigger animations or state changes based on scroll position
+ // if (scroll > 200) {
+ // console.log("User scrolled past 200px");
+ // }
+ });
+
+ return (
+ 1 - Math.pow(1 - t, 3),
+ smooth: true,
+ smoothTouch: true,
+ smoothWheel: true,
+ }}
+ >
+ {children}
+
+ );
+}
+
+export default Template;
diff --git a/app/welcome/page.jsx b/app/welcome/page.jsx
new file mode 100644
index 0000000..aa77b9a
--- /dev/null
+++ b/app/welcome/page.jsx
@@ -0,0 +1,14 @@
+import FlipCard from "@/components/FlipCard";
+
+const Welcome = () => {
+ return (
+
+
+
+ );
+};
+
+export default Welcome;
diff --git a/components.json b/components.json
index 733348f..0492fb6 100644
--- a/components.json
+++ b/components.json
@@ -2,16 +2,20 @@
"$schema": "https://ui.shadcn.com/schema.json",
"style": "default",
"rsc": true,
- "tsx": false,
+ "tsx": true,
"tailwind": {
- "config": "tailwind.config.js",
+ "config": "tailwind.config.ts",
"css": "app/globals.css",
"baseColor": "slate",
- "cssVariables": true,
+ "cssVariables": false,
"prefix": ""
},
"aliases": {
"components": "@/components",
- "utils": "@/lib/utils"
- }
+ "utils": "@/lib/utils",
+ "ui": "@/components/ui",
+ "lib": "@/lib",
+ "hooks": "@/hooks"
+ },
+ "iconLibrary": "lucide"
}
\ No newline at end of file
diff --git a/components/AnimatedTitle/index.tsx b/components/AnimatedTitle/index.tsx
new file mode 100644
index 0000000..82dbcd3
--- /dev/null
+++ b/components/AnimatedTitle/index.tsx
@@ -0,0 +1,27 @@
+import * as motion from "motion/react-client";
+
+interface AnimatedTitleProps {
+ children: React.ReactNode;
+ delay?: number;
+ viewport?: boolean;
+}
+
+function AnimatedTitle({
+ children,
+ delay = 0,
+ viewport = false,
+}: AnimatedTitleProps) {
+ return (
+
+ {children}
+
+ );
+}
+
+export default AnimatedTitle;
diff --git a/components/BannerAnim/index.jsx b/components/BannerAnim/index.jsx
new file mode 100644
index 0000000..bd5d7c2
--- /dev/null
+++ b/components/BannerAnim/index.jsx
@@ -0,0 +1,379 @@
+"use client";
+import React, { useRef, useEffect } from "react";
+import tape from "@/public/HomePageLogo/tape.svg";
+
+const BannerAnim = () => {
+ const canvasRef = useRef(null);
+
+
+ useEffect(() => {
+ const canvas = canvasRef.current;
+ const ctx = canvas.getContext("2d");
+
+ const scale = Math.min(window.devicePixelRatio || 1, 1.5);
+ const aspectRatio = 1616 / 500;
+ const logicalWidth = window.innerWidth * 1.2;
+ const newLogicalHeight = logicalWidth / aspectRatio;
+
+ canvas.width = logicalWidth * scale;
+ canvas.height = newLogicalHeight * scale;
+ canvas.style.width = `${logicalWidth}px`;
+ canvas.style.height = `${newLogicalHeight}px`;
+
+ ctx.scale(scale, scale);
+
+ const tearVariation = 25;
+ const tearSegments = 30;
+ const animationSpeed = 4;
+ const healingSpeed = 0.1;
+ const maxSeparation = 70;
+ const maxTiltAngle = 4;
+ const lineWidth = 35;
+ const svgScale = logicalWidth / 1616;
+ const ribbonWidth = 400 * svgScale;
+ const diffinHeight = (newLogicalHeight - ribbonWidth) / 2;
+ const gridColWidth = 30;
+
+ async function loadSVGasPath2D(url) {
+ try {
+ const response = await fetch(url);
+ const svgText = await response.text();
+ const blob = new Blob([svgText], { type: "image/svg+xml" });
+ const blobURL = URL.createObjectURL(blob);
+ const img = new Image();
+
+ return new Promise((resolve, reject) => {
+ img.onload = () => resolve({ path: new Path2D(svgText), image: img, url: blobURL });
+ img.onerror = () => reject(new Error("Failed to load SVG"));
+ img.src = blobURL;
+ });
+ } catch (error) {
+ console.error("Error loading SVG:", error);
+ throw error;
+ }
+ }
+
+ async function loadSVG() {
+ try {
+ const svgData = await loadSVGasPath2D(tape.src);
+ setupTearEffect(svgData.image);
+ URL.revokeObjectURL(svgData.url);
+ } catch (error) {
+ console.warn("Using fallback image:", error);
+ }
+ }
+
+ loadSVG();
+
+ function setupTearEffect(img) {
+ const activeColumns = {};
+ let currentColumn = null;
+ let previousColumn = null;
+ let isHovering = false;
+ let animationRunning = false;
+
+ const imgWidth = img.width * svgScale;
+ const imgHeight = img.height * svgScale;
+ const centerX = (logicalWidth - imgWidth) / 2;
+ const centerY = (newLogicalHeight - imgHeight) / 2;
+
+ const originalCanvas = document.createElement("canvas");
+ originalCanvas.width = canvas.width;
+ originalCanvas.height = canvas.height;
+ const originalCtx = originalCanvas.getContext("2d");
+ originalCtx.scale(scale, scale);
+ originalCtx.drawImage(img, centerX, centerY, imgWidth, imgHeight);
+
+ ctx.drawImage(img, centerX, centerY, imgWidth, imgHeight);
+
+ canvas.addEventListener("mousemove", (e) => {
+ const rect = canvas.getBoundingClientRect();
+ const mouseX = e.clientX - rect.left;
+ const colX = Math.floor(mouseX / gridColWidth);
+ const colKey = `col_${colX}`;
+
+ previousColumn = currentColumn;
+ currentColumn = colKey;
+
+ const anyActiveTears = Object.keys(activeColumns).some((key) => {
+ const tear = activeColumns[key];
+ return !(tear.animationPhase === "healing" && tear.healingProgress >= 1);
+ });
+
+ if (isHovering && previousColumn !== currentColumn && !anyActiveTears) {
+ if (previousColumn && activeColumns[previousColumn]) {
+ activeColumns[previousColumn].healing = true;
+ }
+
+ if (!activeColumns[colKey]) {
+ const tearCenterX = colX * gridColWidth + gridColWidth / 2;
+ const tearPoints = [];
+
+ for (let i = 0; i <= tearSegments; i++) {
+ const y = (newLogicalHeight / tearSegments) * i;
+ const variance = tearVariation * Math.sin((i / tearSegments) * Math.PI);
+ const x = tearCenterX + (Math.random() * variance * 2 - variance);
+ tearPoints.push({ x, y, originalX: x });
+ }
+
+ const leftTearPath = new Path2D();
+ leftTearPath.moveTo(0, 0);
+ tearPoints.forEach(point => leftTearPath.lineTo(point.x, point.y));
+ leftTearPath.lineTo(0, newLogicalHeight);
+ leftTearPath.closePath();
+
+ const rightTearPath = new Path2D();
+ rightTearPath.moveTo(logicalWidth, 0);
+ tearPoints.forEach(point => rightTearPath.lineTo(point.x, point.y));
+ rightTearPath.lineTo(logicalWidth, newLogicalHeight);
+ rightTearPath.closePath();
+
+ activeColumns[colKey] = {
+ centerX: tearCenterX,
+ points: tearPoints,
+ leftPath: leftTearPath,
+ rightPath: rightTearPath,
+ animationProgress: 0,
+ healing: false,
+ healingProgress: 0,
+ separationAmount: 0,
+ tiltAngle: 0,
+ animationPhase: "tearing",
+ };
+ } else {
+ activeColumns[colKey].healing = false;
+ activeColumns[colKey].animationPhase = "tearing";
+ if (activeColumns[colKey].healingProgress > 0) {
+ activeColumns[colKey].animationProgress = 1 - activeColumns[colKey].healingProgress;
+ activeColumns[colKey].healingProgress = 0;
+ }
+ }
+
+ if (!animationRunning) {
+ animationRunning = true;
+ requestAnimationFrame(drawScene);
+ }
+ }
+ });
+
+ canvas.addEventListener("mouseenter", () => {
+ isHovering = true;
+ });
+
+ canvas.addEventListener("mouseleave", () => {
+ isHovering = false;
+ Object.keys(activeColumns).forEach((key) => {
+ if (activeColumns[key]) {
+ activeColumns[key].healing = true;
+ }
+ });
+
+ if (!animationRunning) {
+ animationRunning = true;
+ requestAnimationFrame(drawScene);
+ }
+ });
+
+ function drawScene() {
+ let needsMoreFrames = false;
+
+ ctx.clearRect(0, 0, logicalWidth, newLogicalHeight);
+ ctx.drawImage(originalCanvas, 0, 0, logicalWidth, newLogicalHeight);
+
+ Object.keys(activeColumns).forEach((key) => {
+ const tear = activeColumns[key];
+
+ if (tear.healing) {
+ if (tear.animationPhase === "tearing" || tear.animationPhase === "torn") {
+ tear.animationPhase = "healing";
+ tear.healingProgress = 0;
+ }
+
+ if (tear.healingProgress < 1) {
+ tear.healingProgress += healingSpeed;
+ needsMoreFrames = true;
+ tear.separationAmount = maxSeparation * (1 - tear.healingProgress);
+ tear.tiltAngle = maxTiltAngle * (1 - tear.healingProgress);
+
+ if (tear.healingProgress >= 1) {
+ tear.healingProgress = 1;
+ tear.separationAmount = 0;
+ tear.tiltAngle = 0;
+ }
+ }
+ } else {
+ if (tear.animationPhase === "tearing" && tear.animationProgress < 1) {
+ tear.animationProgress += animationSpeed / 30;
+ needsMoreFrames = true;
+ tear.separationAmount = maxSeparation * tear.animationProgress;
+ tear.tiltAngle = maxTiltAngle * tear.animationProgress;
+
+ if (tear.animationProgress >= 1) {
+ tear.animationProgress = 1;
+ tear.separationAmount = maxSeparation;
+ tear.tiltAngle = maxTiltAngle;
+ tear.animationPhase = "torn";
+ }
+ }
+ }
+
+ if (tear.animationPhase === "healing" && tear.healingProgress >= 1) {
+ return;
+ }
+
+ ctx.clearRect(0, 0, logicalWidth, newLogicalHeight);
+ const tearProgress = tear.animationPhase === "healing" ? 1 - tear.healingProgress : tear.animationProgress;
+ const activePoints = Math.ceil(tear.points.length * tearProgress);
+
+ const leftCanvas = document.createElement("canvas");
+ leftCanvas.width = canvas.width;
+ leftCanvas.height = canvas.height;
+ const leftCtx = leftCanvas.getContext("2d");
+ leftCtx.scale(scale, scale);
+
+ const rightCanvas = document.createElement("canvas");
+ rightCanvas.width = canvas.width;
+ rightCanvas.height = canvas.height;
+ const rightCtx = rightCanvas.getContext("2d");
+ rightCtx.scale(scale, scale);
+
+ const leftActivePath = new Path2D();
+ const rightActivePath = new Path2D();
+
+ leftActivePath.moveTo(0, 0);
+ rightActivePath.moveTo(logicalWidth, 0);
+
+ for (let i = 0; i < tear.points.length; i++) {
+ const point = tear.points[i];
+ if (i <= activePoints) {
+ leftActivePath.lineTo(point.x, point.y);
+ rightActivePath.lineTo(point.x, point.y);
+ } else {
+ const lastActive = tear.points[Math.min(activePoints, tear.points.length - 1)];
+ leftActivePath.lineTo(lastActive.x, point.y);
+ rightActivePath.lineTo(lastActive.x, point.y);
+ }
+ }
+
+ leftActivePath.lineTo(0, newLogicalHeight);
+ leftActivePath.closePath();
+
+ rightActivePath.lineTo(logicalWidth, newLogicalHeight);
+ rightActivePath.closePath();
+
+ leftCtx.save();
+ leftCtx.clip(leftActivePath);
+ leftCtx.drawImage(img, centerX, centerY, imgWidth, imgHeight);
+ leftCtx.restore();
+
+ rightCtx.save();
+ rightCtx.clip(rightActivePath);
+ rightCtx.drawImage(img, centerX, centerY, imgWidth, imgHeight);
+ rightCtx.restore();
+
+ const baseSep = tear.separationAmount / 2;
+ const tiltAngleRad = (tear.tiltAngle * Math.PI) / 180;
+
+ ctx.clearRect(0, 0, logicalWidth, newLogicalHeight);
+
+ ctx.save();
+ ctx.translate(tear.centerX + baseSep, newLogicalHeight / 2);
+ ctx.rotate(tiltAngleRad);
+ ctx.drawImage(rightCanvas, -tear.centerX, -newLogicalHeight / 2, logicalWidth, newLogicalHeight);
+ ctx.restore();
+
+ ctx.save();
+ ctx.translate(tear.centerX - baseSep, newLogicalHeight / 2);
+ ctx.rotate(-tiltAngleRad);
+ ctx.drawImage(leftCanvas, -tear.centerX, -newLogicalHeight / 2, logicalWidth, newLogicalHeight);
+ ctx.restore();
+
+ ctx.save();
+
+ if (activePoints > 0) {
+ const leftEdge = new Path2D();
+ let startPointIndex = 0;
+ while (startPointIndex < activePoints && tear.points[startPointIndex].y < diffinHeight) {
+ startPointIndex++;
+ }
+
+ let endPointIndex = activePoints - 1;
+ while (endPointIndex > 0 && tear.points[endPointIndex].y > newLogicalHeight - diffinHeight) {
+ endPointIndex--;
+ }
+
+ if (startPointIndex < activePoints && endPointIndex >= 0 && startPointIndex <= endPointIndex) {
+ const firstPoint = tear.points[startPointIndex];
+ const yFirst = firstPoint.y - newLogicalHeight / 2;
+ const leftXFirst = firstPoint.x - baseSep;
+ const leftRotatedXFirst = tear.centerX - baseSep + Math.cos(-tiltAngleRad) * (leftXFirst - (tear.centerX - baseSep)) - Math.sin(-tiltAngleRad) * yFirst;
+ const leftRotatedYFirst = newLogicalHeight / 2 + Math.sin(-tiltAngleRad) * (leftXFirst - (tear.centerX - baseSep)) + Math.cos(-tiltAngleRad) * yFirst;
+
+ leftEdge.moveTo(leftRotatedXFirst, leftRotatedYFirst);
+
+ for (let i = startPointIndex + 1; i <= endPointIndex; i++) {
+ const point = tear.points[i];
+ const y = point.y - newLogicalHeight / 2;
+ const leftX = point.x - baseSep;
+ const leftRotatedX = tear.centerX - baseSep + Math.cos(-tiltAngleRad) * (leftX - (tear.centerX - baseSep)) - Math.sin(-tiltAngleRad) * y;
+ const leftRotatedY = newLogicalHeight / 2 + Math.sin(-tiltAngleRad) * (leftX - (tear.centerX - baseSep)) + Math.cos(-tiltAngleRad) * y;
+
+ leftEdge.lineTo(leftRotatedX, leftRotatedY);
+ }
+ }
+
+ const rightEdge = new Path2D();
+
+ if (startPointIndex < activePoints && endPointIndex >= 0 && startPointIndex <= endPointIndex) {
+ const firstPoint = tear.points[startPointIndex];
+ const yFirst = firstPoint.y - newLogicalHeight / 2;
+ const rightXFirst = firstPoint.x + baseSep;
+ const rightRotatedXFirst = tear.centerX + baseSep + Math.cos(tiltAngleRad) * (rightXFirst - (tear.centerX + baseSep)) - Math.sin(tiltAngleRad) * yFirst;
+ const rightRotatedYFirst = newLogicalHeight / 2 + Math.sin(tiltAngleRad) * (rightXFirst - (tear.centerX + baseSep)) + Math.cos(tiltAngleRad) * yFirst;
+
+ rightEdge.moveTo(rightRotatedXFirst, rightRotatedYFirst);
+
+ for (let i = startPointIndex + 1; i <= endPointIndex; i++) {
+ const point = tear.points[i];
+ const y = point.y - newLogicalHeight / 2;
+ const rightX = point.x + baseSep;
+ const rightRotatedX = tear.centerX + baseSep + Math.cos(tiltAngleRad) * (rightX - (tear.centerX + baseSep)) - Math.sin(tiltAngleRad) * y;
+ const rightRotatedY = newLogicalHeight / 2 + Math.sin(tiltAngleRad) * (rightX - (tear.centerX + baseSep)) + Math.cos(tiltAngleRad) * y;
+
+ rightEdge.lineTo(rightRotatedX, rightRotatedY);
+ }
+
+ ctx.strokeStyle = "rgba(16, 16, 16, 0.5)";
+ ctx.lineWidth = lineWidth;
+ ctx.stroke(rightEdge);
+ }
+ }
+
+ ctx.restore();
+ });
+
+ if (needsMoreFrames || isHovering) {
+ requestAnimationFrame(drawScene);
+ } else {
+ animationRunning = false;
+ }
+ }
+ }
+ }, []);
+
+ return (
+
+
+
+ );
+};
+
+export default BannerAnim;
diff --git a/components/CountAnimation/index.jsx b/components/CountAnimation/index.jsx
index 302351f..19bd3e5 100644
--- a/components/CountAnimation/index.jsx
+++ b/components/CountAnimation/index.jsx
@@ -1,62 +1,42 @@
"use client";
-import { motion, useMotionValue, useTransform, animate } from "framer-motion";
+import { motion, useMotionValue, useTransform, animate } from "motion/react";
import { useEffect, useRef } from "react";
export default function CountAnimation({ targetValue }) {
const count = useMotionValue(0);
const rounded = useTransform(count, Math.round);
-
const ref = useRef();
+ const hasAnimated = useRef(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => {
- if (entry.isIntersecting) {
- const animation = animate(count, targetValue, {
+ if (entry.isIntersecting && !hasAnimated.current) {
+ hasAnimated.current = true;
+ animate(count, targetValue, {
duration: 1,
- ease: "linear",
- onUpdate: (latest) => count.set(latest),
+ ease: "easeInOut",
});
}
},
{
root: null,
rootMargin: "0px",
- threshold: 1,
+ threshold: 0.5,
}
);
- if (ref.current) {
- observer.observe(ref.current);
- }
-
- return () => {
- if (ref.current) {
- observer.unobserve(ref.current);
- }
- };
- }, []);
+ if (ref.current) observer.observe(ref.current);
- const styles = {
- background:
- "linear-gradient(80deg, #D06D30 6.67%, #FFD887 28.13%, #FFDCAD 64.87%, #FAB858 95.66%)",
- backgroundClip: "text",
- WebkitBackgroundClip: "text",
- WebkitTextFillColor: "transparent",
- };
+ return () => observer.disconnect();
+ }, [targetValue]);
return (
-
+
{rounded}
-
+
400 ? "hidden": "block"}`}>
+
diff --git a/components/CountDownAnim/RollingNumber.jsx b/components/CountDownAnim/RollingNumber.jsx
deleted file mode 100644
index 48a7ce9..0000000
--- a/components/CountDownAnim/RollingNumber.jsx
+++ /dev/null
@@ -1,40 +0,0 @@
-'use client'
-
-import React, { useEffect, useState } from 'react';
-
-const RollingNumber = ({ number, label }) => {
- const [mounted, setMounted] = useState(false);
- const digits = number.toString().padStart(2, '0').split('');
-
- useEffect(() => {
- setMounted(true);
- }, []);
-
- return (
-
-
- {digits.map((digit, index) => (
-
-
- {[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((n) => (
-
- {n}
-
- ))}
-
-
- ))}
-
-
{label}
-
- );
-};
-
-export default RollingNumber;
-
diff --git a/components/CountDownAnim/index.jsx b/components/CountDownAnim/index.jsx
deleted file mode 100644
index 2595334..0000000
--- a/components/CountDownAnim/index.jsx
+++ /dev/null
@@ -1,71 +0,0 @@
-'use client'
-
-import React from 'react';
-import { motion } from 'framer-motion';
-import RollingNumber from './RollingNumber';
-
-import { useState, useEffect } from 'react';
-
-const useCountdown = (targetDate) => {
- const calculateTimeLeft = () => {
- const difference = new Date(targetDate) - new Date();
- let timeLeft = {};
-
- if (difference > 0) {
- timeLeft = {
- days: Math.floor(difference / (1000 * 60 * 60 * 24)),
- hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
- minutes: Math.floor((difference / 1000 / 60) % 60),
- seconds: Math.floor((difference / 1000) % 60),
- };
- }
-
- return timeLeft;
- };
-
- const [timeLeft, setTimeLeft] = useState(calculateTimeLeft());
-
- useEffect(() => {
- const timer = setTimeout(() => {
- setTimeLeft(calculateTimeLeft());
- }, 1000);
-
- return () => clearTimeout(timer);
- }, [timeLeft]);
-
- return timeLeft;
-};
-
-
-
-const CountdownTimer = ({ targetDate }) => {
- const timeLeft = useCountdown(targetDate);
-
- if (Object.keys(timeLeft).length === 0) {
- return (
-
- Countdown finished!
-
- );
- }
-
- return (
-
- {Object.entries(timeLeft).map(([unit, value]) => (
-
- ))}
-
- );
-};
-
-export default CountdownTimer;
-
diff --git a/components/Countdown/index.jsx b/components/Countdown/index.jsx
new file mode 100644
index 0000000..d1a937e
--- /dev/null
+++ b/components/Countdown/index.jsx
@@ -0,0 +1,58 @@
+"use client";
+import { useState, useEffect } from "react";
+
+const Countdown = () => {
+ const targetDate = new Date("2025-04-06T07:00:00").getTime();
+ const [timeLeft, setTimeLeft] = useState(targetDate - new Date().getTime());
+
+ useEffect(() => {
+ const timer = setInterval(() => {
+ setTimeLeft(targetDate - new Date().getTime());
+ }, 1000);
+
+ return () => clearInterval(timer);
+ }, [targetDate]);
+
+ const formatTime = (ms) => {
+ const totalSeconds = Math.floor(ms / 1000);
+ const hours = Math.floor(totalSeconds / 3600);
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
+ const seconds = totalSeconds % 60;
+ return {
+ hours: String(hours).padStart(2, "0"),
+ minutes: String(minutes).padStart(2, "0"),
+ seconds: String(seconds).padStart(2, "0"),
+ };
+ };
+
+ const { hours, minutes, seconds } = formatTime(timeLeft);
+
+ return (
+
+
+ Hacking Time Remaining
+
+
+ {hours} :
+ {minutes} :
+ {seconds}
+
+
+ );
+};
+
+export default Countdown;
diff --git a/components/DiscordCard/index.jsx b/components/DiscordCard/index.jsx
new file mode 100644
index 0000000..7eb61b3
--- /dev/null
+++ b/components/DiscordCard/index.jsx
@@ -0,0 +1,100 @@
+import Image from "next/image";
+import HB3Logo from "@/public/HomePageLogo/HB3Logo.svg";
+import discord from "@/public/FooterLogo/discord.svg";
+import * as motion from "motion/react-client";
+import Link from "next/link";
+import HB4Logo from "@/public/HB4Logo.png";
+
+
+export default function DiscordCard() {
+ return (
+
+
+
+
+ Join our Discord Server!
+
+
+ To stay up-to-date with{" "}
+ HackByte 4.0 , consider joining our
+ discord.
+
+ {" "}
+ Helps us share important updates right away with hackers and
+ enthusiasts alike!
+
+
+
+
+
+
+ O
+ Get the latest news and announcements.
+
+
+ O Get notified
+ for exciting events!
+
+
+ O Connect with
+ like-minded individuals.
+
+
+
+ Join
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/FlipCard/index.jsx b/components/FlipCard/index.jsx
new file mode 100644
index 0000000..e491c33
--- /dev/null
+++ b/components/FlipCard/index.jsx
@@ -0,0 +1,91 @@
+"use client";
+import { cn } from "@/lib/utils";
+import bravehacker from "@/public/bravehacker.svg";
+import Image from "next/image";
+import tpclogo from "@/public/HomePageLogo/tpclogo.svg";
+import institutelogo from "@/public/HomePageLogo/Institutelogo.svg";
+import cardbg from "@/public/cardbg.svg";
+import hackthepro from "@/public/hackthepro.svg";
+import { useState } from "react";
+
+export default function FlipCard({
+ title,
+ description,
+ rotate = "y",
+ className,
+ ...props
+}) {
+ const [isFlipped, setIsFlipped] = useState(false);
+
+ const rotationClass = {
+ x: [
+ "group-hover:[transform:rotateX(180deg)]",
+ "[transform:rotateX(180deg)]",
+ ],
+ y: [
+ "group-hover:[transform:rotateY(180deg)]",
+ "[transform:rotateY(180deg)]",
+ ],
+ };
+ const self = rotationClass[rotate];
+
+ const handleClick = () => {
+ setIsFlipped((prev) => !prev);
+ };
+
+ return (
+
+
+ {/* Front */}
+
+
+ {/* Back */}
+
+
+
+ );
+}
diff --git a/components/Footer/index.jsx b/components/Footer/index.jsx
deleted file mode 100644
index cec22d7..0000000
--- a/components/Footer/index.jsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import Link from "next/link";
-import {
- TwitterLogoIcon,
- InstagramLogoIcon,
- LinkedInLogoIcon,
- DiscordLogoIcon,
-} from "@radix-ui/react-icons";
-
-const SocialMediaIcon = ({ Icon, href }) => (
-
-
-
-);
-
-const Footer = () => {
- const navigationItems = [
- { label: "Home", href: "/" },
- { label: "Gallery", href: "/gallery" },
- { label: "Partners", href: "/partners" },
- { label: "Prizes", href: "/prizes" },
- { label: "Schedule", href: "/schedule" },
- { label: "FAQs", href: "/faq" },
- { label: "Contact Us", href: "/contact" },
- ];
-
- return (
-
-
-
-
- {navigationItems.map(({ label, href }) => (
-
- {label}
-
- ))}
-
-
-
-
-
-
-
-
-
- © 2025 Hackbyte, All rights reserved
-
-
- );
-};
-
-export default Footer;
diff --git a/components/FooterAnimation/index.jsx b/components/FooterAnimation/index.jsx
deleted file mode 100644
index b9d4b20..0000000
--- a/components/FooterAnimation/index.jsx
+++ /dev/null
@@ -1,37 +0,0 @@
-"use client";
-
-import { useState, useEffect } from "react";
-import styles from "./index.module.css";
-
-const images = [
- "/footer/img1.svg",
- "/footer/img2.svg",
- "/footer/img3.svg",
- "/footer/img4.svg",
-];
-
-export default function FooterAnimation() {
- const [currentIndex, setCurrentIndex] = useState(0);
-
- useEffect(() => {
- const rotationInterval = setInterval(() => {
- setCurrentIndex((prevIndex) => (prevIndex + 1) % images.length);
- }, 0.5 * 1000);
-
- return () => {
- clearInterval(rotationInterval);
- };
- }, []);
-
- return (
-
-
-
-
-
- );
-}
diff --git a/components/FooterAnimation/index.module.css b/components/FooterAnimation/index.module.css
deleted file mode 100644
index aafea06..0000000
--- a/components/FooterAnimation/index.module.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.rotatingContainer {
- animation: rotateAnimation 8s linear infinite;
-}
-
-@keyframes rotateAnimation {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
-}
diff --git a/components/HB4Form/country.json b/components/HB4Form/country.json
new file mode 100644
index 0000000..bf9fea7
--- /dev/null
+++ b/components/HB4Form/country.json
@@ -0,0 +1 @@
+[{"Name":"Afghanistan","Code":"AF"},{"Name":"Albania","Code":"AL"},{"Name":"Algeria","Code":"DZ"},{"Name":"American Samoa","Code":"AS"},{"Name":"Andorra","Code":"AD"},{"Name":"Angola","Code":"AO"},{"Name":"Anguilla","Code":"AI"},{"Name":"Antarctica","Code":"AQ"},{"Name":"Antigua and Barbuda","Code":"AG"},{"Name":"Argentina","Code":"AR"},{"Name":"Armenia","Code":"AM"},{"Name":"Aruba","Code":"AW"},{"Name":"Australia","Code":"AU"},{"Name":"Austria","Code":"AT"},{"Name":"Azerbaijan","Code":"AZ"},{"Name":"Bahamas","Code":"BS"},{"Name":"Bahrain","Code":"BH"},{"Name":"Bangladesh","Code":"BD"},{"Name":"Barbados","Code":"BB"},{"Name":"Belarus","Code":"BY"},{"Name":"Belgium","Code":"BE"},{"Name":"Belize","Code":"BZ"},{"Name":"Benin","Code":"BJ"},{"Name":"Bermuda","Code":"BM"},{"Name":"Bhutan","Code":"BT"},{"Name":"Bolivia, Plurinational State of","Code":"BO"},{"Name":"Bonaire, Sint Eustatius and Saba","Code":"BQ"},{"Name":"Bosnia and Herzegovina","Code":"BA"},{"Name":"Botswana","Code":"BW"},{"Name":"Bouvet Island","Code":"BV"},{"Name":"Brazil","Code":"BR"},{"Name":"British Indian Ocean Territory","Code":"IO"},{"Name":"Brunei Darussalam","Code":"BN"},{"Name":"Bulgaria","Code":"BG"},{"Name":"Burkina Faso","Code":"BF"},{"Name":"Burundi","Code":"BI"},{"Name":"Cambodia","Code":"KH"},{"Name":"Cameroon","Code":"CM"},{"Name":"Canada","Code":"CA"},{"Name":"Cape Verde","Code":"CV"},{"Name":"Cayman Islands","Code":"KY"},{"Name":"Central African Republic","Code":"CF"},{"Name":"Chad","Code":"TD"},{"Name":"Chile","Code":"CL"},{"Name":"China","Code":"CN"},{"Name":"Christmas Island","Code":"CX"},{"Name":"Cocos (Keeling) Islands","Code":"CC"},{"Name":"Colombia","Code":"CO"},{"Name":"Comoros","Code":"KM"},{"Name":"Congo","Code":"CG"},{"Name":"Congo, the Democratic Republic of the","Code":"CD"},{"Name":"Cook Islands","Code":"CK"},{"Name":"Costa Rica","Code":"CR"},{"Name":"Croatia","Code":"HR"},{"Name":"Cuba","Code":"CU"},{"Name":"Curaçao","Code":"CW"},{"Name":"Cyprus","Code":"CY"},{"Name":"Czech Republic","Code":"CZ"},{"Name":"Côte d'Ivoire","Code":"CI"},{"Name":"Denmark","Code":"DK"},{"Name":"Djibouti","Code":"DJ"},{"Name":"Dominica","Code":"DM"},{"Name":"Dominican Republic","Code":"DO"},{"Name":"Ecuador","Code":"EC"},{"Name":"Egypt","Code":"EG"},{"Name":"El Salvador","Code":"SV"},{"Name":"Equatorial Guinea","Code":"GQ"},{"Name":"Eritrea","Code":"ER"},{"Name":"Estonia","Code":"EE"},{"Name":"Eswatini","Code":"SZ"},{"Name":"Ethiopia","Code":"ET"},{"Name":"Falkland Islands (Malvinas)","Code":"FK"},{"Name":"Faroe Islands","Code":"FO"},{"Name":"Fiji","Code":"FJ"},{"Name":"Finland","Code":"FI"},{"Name":"France","Code":"FR"},{"Name":"French Guiana","Code":"GF"},{"Name":"French Polynesia","Code":"PF"},{"Name":"French Southern Territories","Code":"TF"},{"Name":"Gabon","Code":"GA"},{"Name":"Gambia","Code":"GM"},{"Name":"Georgia","Code":"GE"},{"Name":"Germany","Code":"DE"},{"Name":"Ghana","Code":"GH"},{"Name":"Gibraltar","Code":"GI"},{"Name":"Greece","Code":"GR"},{"Name":"Greenland","Code":"GL"},{"Name":"Grenada","Code":"GD"},{"Name":"Guadeloupe","Code":"GP"},{"Name":"Guam","Code":"GU"},{"Name":"Guatemala","Code":"GT"},{"Name":"Guernsey","Code":"GG"},{"Name":"Guinea","Code":"GN"},{"Name":"Guinea-Bissau","Code":"GW"},{"Name":"Guyana","Code":"GY"},{"Name":"Haiti","Code":"HT"},{"Name":"Heard Island and McDonald Islands","Code":"HM"},{"Name":"Holy See (Vatican City State)","Code":"VA"},{"Name":"Honduras","Code":"HN"},{"Name":"Hong Kong","Code":"HK"},{"Name":"Hungary","Code":"HU"},{"Name":"Iceland","Code":"IS"},{"Name":"India","Code":"IN"},{"Name":"Indonesia","Code":"ID"},{"Name":"Iran, Islamic Republic of","Code":"IR"},{"Name":"Iraq","Code":"IQ"},{"Name":"Ireland","Code":"IE"},{"Name":"Isle of Man","Code":"IM"},{"Name":"Israel","Code":"IL"},{"Name":"Italy","Code":"IT"},{"Name":"Jamaica","Code":"JM"},{"Name":"Japan","Code":"JP"},{"Name":"Jersey","Code":"JE"},{"Name":"Jordan","Code":"JO"},{"Name":"Kazakhstan","Code":"KZ"},{"Name":"Kenya","Code":"KE"},{"Name":"Kiribati","Code":"KI"},{"Name":"Korea, Democratic People's Republic of","Code":"KP"},{"Name":"Korea, Republic of","Code":"KR"},{"Name":"Kuwait","Code":"KW"},{"Name":"Kyrgyzstan","Code":"KG"},{"Name":"Lao People's Democratic Republic","Code":"LA"},{"Name":"Latvia","Code":"LV"},{"Name":"Lebanon","Code":"LB"},{"Name":"Lesotho","Code":"LS"},{"Name":"Liberia","Code":"LR"},{"Name":"Libya","Code":"LY"},{"Name":"Liechtenstein","Code":"LI"},{"Name":"Lithuania","Code":"LT"},{"Name":"Luxembourg","Code":"LU"},{"Name":"Macao","Code":"MO"},{"Name":"Macedonia, the Former Yugoslav Republic of","Code":"MK"},{"Name":"Madagascar","Code":"MG"},{"Name":"Malawi","Code":"MW"},{"Name":"Malaysia","Code":"MY"},{"Name":"Maldives","Code":"MV"},{"Name":"Mali","Code":"ML"},{"Name":"Malta","Code":"MT"},{"Name":"Marshall Islands","Code":"MH"},{"Name":"Martinique","Code":"MQ"},{"Name":"Mauritania","Code":"MR"},{"Name":"Mauritius","Code":"MU"},{"Name":"Mayotte","Code":"YT"},{"Name":"Mexico","Code":"MX"},{"Name":"Micronesia, Federated States of","Code":"FM"},{"Name":"Moldova, Republic of","Code":"MD"},{"Name":"Monaco","Code":"MC"},{"Name":"Mongolia","Code":"MN"},{"Name":"Montenegro","Code":"ME"},{"Name":"Montserrat","Code":"MS"},{"Name":"Morocco","Code":"MA"},{"Name":"Mozambique","Code":"MZ"},{"Name":"Myanmar","Code":"MM"},{"Name":"Namibia","Code":"NA"},{"Name":"Nauru","Code":"NR"},{"Name":"Nepal","Code":"NP"},{"Name":"Netherlands","Code":"NL"},{"Name":"New Caledonia","Code":"NC"},{"Name":"New Zealand","Code":"NZ"},{"Name":"Nicaragua","Code":"NI"},{"Name":"Niger","Code":"NE"},{"Name":"Nigeria","Code":"NG"},{"Name":"Niue","Code":"NU"},{"Name":"Norfolk Island","Code":"NF"},{"Name":"Northern Mariana Islands","Code":"MP"},{"Name":"Norway","Code":"NO"},{"Name":"Oman","Code":"OM"},{"Name":"Pakistan","Code":"PK"},{"Name":"Palau","Code":"PW"},{"Name":"Palestine, State of","Code":"PS"},{"Name":"Panama","Code":"PA"},{"Name":"Papua New Guinea","Code":"PG"},{"Name":"Paraguay","Code":"PY"},{"Name":"Peru","Code":"PE"},{"Name":"Philippines","Code":"PH"},{"Name":"Pitcairn","Code":"PN"},{"Name":"Poland","Code":"PL"},{"Name":"Portugal","Code":"PT"},{"Name":"Puerto Rico","Code":"PR"},{"Name":"Qatar","Code":"QA"},{"Name":"Romania","Code":"RO"},{"Name":"Russian Federation","Code":"RU"},{"Name":"Rwanda","Code":"RW"},{"Name":"Réunion","Code":"RE"},{"Name":"Saint Barthélemy","Code":"BL"},{"Name":"Saint Helena, Ascension and Tristan da Cunha","Code":"SH"},{"Name":"Saint Kitts and Nevis","Code":"KN"},{"Name":"Saint Lucia","Code":"LC"},{"Name":"Saint Martin (French part)","Code":"MF"},{"Name":"Saint Pierre and Miquelon","Code":"PM"},{"Name":"Saint Vincent and the Grenadines","Code":"VC"},{"Name":"Samoa","Code":"WS"},{"Name":"San Marino","Code":"SM"},{"Name":"Sao Tome and Principe","Code":"ST"},{"Name":"Saudi Arabia","Code":"SA"},{"Name":"Senegal","Code":"SN"},{"Name":"Serbia","Code":"RS"},{"Name":"Seychelles","Code":"SC"},{"Name":"Sierra Leone","Code":"SL"},{"Name":"Singapore","Code":"SG"},{"Name":"Sint Maarten (Dutch part)","Code":"SX"},{"Name":"Slovakia","Code":"SK"},{"Name":"Slovenia","Code":"SI"},{"Name":"Solomon Islands","Code":"SB"},{"Name":"Somalia","Code":"SO"},{"Name":"South Africa","Code":"ZA"},{"Name":"South Georgia and the South Sandwich Islands","Code":"GS"},{"Name":"South Sudan","Code":"SS"},{"Name":"Spain","Code":"ES"},{"Name":"Sri Lanka","Code":"LK"},{"Name":"Sudan","Code":"SD"},{"Name":"Suriname","Code":"SR"},{"Name":"Svalbard and Jan Mayen","Code":"SJ"},{"Name":"Sweden","Code":"SE"},{"Name":"Switzerland","Code":"CH"},{"Name":"Syrian Arab Republic","Code":"SY"},{"Name":"Taiwan, Province of China","Code":"TW"},{"Name":"Tajikistan","Code":"TJ"},{"Name":"Tanzania, United Republic of","Code":"TZ"},{"Name":"Thailand","Code":"TH"},{"Name":"Timor-Leste","Code":"TL"},{"Name":"Togo","Code":"TG"},{"Name":"Tokelau","Code":"TK"},{"Name":"Tonga","Code":"TO"},{"Name":"Trinidad and Tobago","Code":"TT"},{"Name":"Tunisia","Code":"TN"},{"Name":"Turkey","Code":"TR"},{"Name":"Turkmenistan","Code":"TM"},{"Name":"Turks and Caicos Islands","Code":"TC"},{"Name":"Tuvalu","Code":"TV"},{"Name":"Uganda","Code":"UG"},{"Name":"Ukraine","Code":"UA"},{"Name":"United Arab Emirates","Code":"AE"},{"Name":"United Kingdom","Code":"GB"},{"Name":"United States","Code":"US"},{"Name":"United States Minor Outlying Islands","Code":"UM"},{"Name":"Uruguay","Code":"UY"},{"Name":"Uzbekistan","Code":"UZ"},{"Name":"Vanuatu","Code":"VU"},{"Name":"Venezuela, Bolivarian Republic of","Code":"VE"},{"Name":"Viet Nam","Code":"VN"},{"Name":"Virgin Islands, British","Code":"VG"},{"Name":"Virgin Islands, U.S.","Code":"VI"},{"Name":"Wallis and Futuna","Code":"WF"},{"Name":"Western Sahara","Code":"EH"},{"Name":"Yemen","Code":"YE"},{"Name":"Zambia","Code":"ZM"},{"Name":"Zimbabwe","Code":"ZW"},{"Name":"Åland Islands","Code":"AX"}]
\ No newline at end of file
diff --git a/components/HB4Form/index.jsx b/components/HB4Form/index.jsx
new file mode 100644
index 0000000..ef7f411
--- /dev/null
+++ b/components/HB4Form/index.jsx
@@ -0,0 +1,469 @@
+"use client"
+
+import { useState } from "react"
+import { useForm } from "react-hook-form"
+import { zodResolver } from "@hookform/resolvers/zod"
+import * as z from "zod"
+import { toast } from "@/hooks/use-toast"
+import { Button } from "@/components/ui/button"
+import {
+ Form,
+ FormControl,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+} from "@/components/ui/form"
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectValue,
+ SelectTrigger,
+} from "@/components/ui/select"
+import { Input } from "@/components/ui/input"
+import { Checkbox } from "@/components/ui/checkbox"
+import { Card, CardContent } from "@/components/ui/card"
+import axios from "axios"
+import countryData from "./country.json"
+
+// Define form schema with Zod
+const formSchema = z.object({
+ firstName: z.string().min(1, { message: "First name is required" }),
+ lastName: z.string().min(1, { message: "Last name is required" }),
+ age: z.string().min(1, { message: "Age is required" }),
+ phoneNumber: z
+ .string()
+ .min(10, { message: "Valid phone number is required" }),
+ email: z.string().email({ message: "Valid email is required" }),
+ school: z.string().min(1, { message: "School is required" }),
+ levelOfStudy: z.string().min(1, { message: "Level of study is required" }),
+ countryOfResidence: z.string().min(1, { message: "Country is required" }),
+ linkedinUrl: z
+ .string()
+ .url({ message: "Valid LinkedIn URL is required" })
+ .includes("linkedin.com", { message: "Invalid linkedin URL" }),
+
+ // MLH Checkboxes
+ mlhCodeOfConduct: z.literal(true, {
+ errorMap: () => ({ message: "You must accept the MLH Code of Conduct" }),
+ }),
+ mlhPrivacyPolicy: z.literal(true, {
+ errorMap: () => ({ message: "You must accept the MLH Privacy Policy" }),
+ }),
+ mlhEmailConsent: z.boolean(),
+})
+
+const HB4Form = () => {
+ const [isSubmitting, setIsSubmitting] = useState(false)
+
+ // Initialize form
+ const form = useForm({
+ resolver: zodResolver(formSchema),
+ defaultValues: {
+ firstName: "",
+ lastName: "",
+ age: "",
+ phoneNumber: "",
+ email: "",
+ school: "",
+ levelOfStudy: "",
+ countryOfResidence: "",
+ linkedinUrl: "",
+ mlhCodeOfConduct: false,
+ mlhPrivacyPolicy: false,
+ mlhEmailConsent: false,
+ },
+ })
+
+ const onSubmit = async (data) => {
+ setIsSubmitting(true)
+ try {
+ await axios.post("/api/hackbyte4", {
+ body: JSON.stringify(data),
+ })
+
+ toast({
+ title: "Registration submitted successfully!",
+ description: "Thank you for registering for HackByte 4!",
+ })
+ form.reset()
+ } catch (error) {
+ console.error("Error submitting form:", error)
+ toast({
+ title: "Failed to submit form. Please try again.",
+ variant: "destructive",
+ })
+ } finally {
+ setIsSubmitting(false)
+ }
+ }
+
+ return (
+
+
+
+
+
+
+ )
+}
+
+export default HB4Form
diff --git a/components/HackbyteLogo/index.jsx b/components/HackbyteLogo/index.jsx
deleted file mode 100644
index ca7b6df..0000000
--- a/components/HackbyteLogo/index.jsx
+++ /dev/null
@@ -1,54 +0,0 @@
-"use client";
-
-import { useEffect, useRef } from "react";
-import Sketch from "./sktech";
-import Image from "next/image";
-import hackbyteLogo from "@/public/hackbyte.png";
-import "./style.css";
-
-const HackbyteLogo = () => {
- const containerRef = useRef(null);
-
- useEffect(() => {
- let sketch;
- if (containerRef.current) {
- sketch = new Sketch({ dom: containerRef.current });
- }
- return () => {
- if (
- containerRef.current &&
- sketch &&
- containerRef.current.contains(sketch.renderer.domElement)
- ) {
- containerRef.current.removeChild(sketch.renderer.domElement);
- }
- };
- }, []);
-
- return (
-
-
-
-
-
-
- );
-};
-
-export { HackbyteLogo };
diff --git a/components/HackbyteLogo/sktech.js b/components/HackbyteLogo/sktech.js
deleted file mode 100644
index 8ad45bb..0000000
--- a/components/HackbyteLogo/sktech.js
+++ /dev/null
@@ -1,274 +0,0 @@
-import * as THREE from "three";
-
-const fragment = `
-uniform float time;
-uniform float progress;
-uniform sampler2D uDataTexture;
-uniform sampler2D uTexture;
-
-uniform vec4 resolution;
-varying vec2 vUv;
-varying vec3 vPosition;
-float PI = 3.141592653589793238;
-void main() {
- // vec2 newUV = (vUv - vec2(0.5))*resolution.zw + vec2(0.5);
- // vec4 color = texture2D(uTexture,newUV);
- vec4 offset = texture2D(uDataTexture,vUv);
- // gl_FragColor = vec4(vUv,0.0,1.);
- // gl_FragColor = vec4(offset.r,0.,0.,1.);
- // gl_FragColor = color;
- gl_FragColor = texture2D(uTexture,vUv - 0.02*offset.rg);
-}
-`;
-const vertex = `
-uniform float time;
-varying vec2 vUv;
-varying vec3 vPosition;
-uniform vec2 pixels;
-float PI = 3.141592653589793238;
-void main() {
- vUv = uv;
- gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
-}
-`;
-function clamp(number, min, max) {
- return Math.max(min, Math.min(number, max));
-}
-
-export default class Sketch {
- constructor(options) {
- this.scene = new THREE.Scene();
-
- this.container = options.dom;
- this.img = this.container.querySelector("img");
- this.width = this.container.offsetWidth;
- this.height = this.container.offsetHeight;
- this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
- this.renderer.setPixelRatio(1.8);
- this.renderer.setSize(this.width, this.height);
- this.renderer.setClearColor(0xffffff, 0);
- this.renderer.physicallyCorrectLights = true;
- this.renderer.outputEncoding = THREE.sRGBEncoding;
- this.renderer.domElement.style.position = "absolute";
- this.renderer.domElement.style.top = "0";
- this.renderer.domElement.style.left = "0";
- this.container.appendChild(this.renderer.domElement);
-
- var light = new THREE.AmbientLight(0xffffff);
- light.position.set(-100, 200, 100);
- this.scene.add(light);
-
- this.camera = new THREE.PerspectiveCamera(
- 70,
- window.innerWidth / window.innerHeight,
- 0.1,
- 100
- );
-
- var frustumSize = 1;
- var aspect = window.innerWidth / window.innerHeight;
- // this.camera = new THREE.OrthographicCamera(
- // frustumSize / -2,
- // frustumSize / 2,
- // frustumSize / 2,
- // frustumSize / -2,
- // -1000,
- // 1000
- // );
- this.camera.position.set(0, 0, 2);
-
- this.time = 0;
-
- this.mouse = {
- x: 0,
- y: 0,
- prevX: 0,
- prevY: 0,
- vX: 0,
- vY: 0,
- };
-
- this.isPlaying = true;
- this.settings();
- this.addObjects();
- this.resize();
- this.render();
- this.setupResize();
- this.mouseEvents();
- }
-
- getValue(val) {
- return parseFloat(this.container.getAttribute("data-" + val));
- }
-
- mouseEvents() {
- window.addEventListener("mousemove", (e) => {
- this.mouse.x = e.clientX / this.width;
- this.mouse.y = e.clientY / this.height;
-
- this.mouse.vX = this.mouse.x - this.mouse.prevX;
- this.mouse.vY = this.mouse.y - this.mouse.prevY;
-
- this.mouse.prevX = this.mouse.x;
- this.mouse.prevY = this.mouse.y;
- });
- }
-
- settings() {
- let that = this;
- this.settings = {
- grid: this.getValue("grid") || 34,
- mouse: this.getValue("mouse") || 0.25,
- strength: this.getValue("strength") || 1,
- relaxation: this.getValue("relaxation") || 0.9,
- };
- }
-
- setupResize() {
- window.addEventListener("resize", this.resize.bind(this));
- }
-
- resize() {
- this.width = this.container.offsetWidth;
- this.height = this.container.offsetHeight;
- this.renderer.setSize(this.width, this.height);
- this.camera.aspect = this.width / this.height;
-
- // image cover
- this.imageAspect = 1 / 1.5;
- let a1;
- let a2;
- if (this.height / this.width > this.imageAspect) {
- a1 = (this.width / this.height) * this.imageAspect;
- a2 = 1;
- } else {
- a1 = 1;
- a2 = this.height / this.width / this.imageAspect;
- }
- this.material.uniforms.resolution.value.x = this.width;
- this.material.uniforms.resolution.value.y = this.height;
- this.material.uniforms.resolution.value.z = a1;
- this.material.uniforms.resolution.value.w = a2;
-
- this.camera.updateProjectionMatrix();
- this.regenerateGrid();
- }
-
- regenerateGrid() {
- this.size = this.settings.grid;
- const width = this.size;
- const height = this.size;
-
- const size = width * height;
- const data = new Float32Array(3 * size);
- const color = new THREE.Color(0xffffff);
-
- const r = Math.floor(color.r * 255);
- const g = Math.floor(color.g * 255);
- const b = Math.floor(color.b * 255);
-
- for (let i = 0; i < size; i++) {
- let r = Math.random() * 255 - 125;
- let r1 = Math.random() * 255 - 125;
-
- const stride = i * 3;
-
- data[stride] = r;
- data[stride + 1] = r1;
- data[stride + 2] = r;
- }
- this.texture = new THREE.DataTexture(
- data,
- width,
- height,
- THREE.RGBFormat,
- THREE.FloatType
- );
-
- this.texture.magFilter = this.texture.minFilter = THREE.NearestFilter;
-
- if (this.material) {
- this.material.uniforms.uDataTexture.value = this.texture;
- this.material.uniforms.uDataTexture.value.needsUpdate = true;
- }
- }
-
- addObjects() {
- this.regenerateGrid();
- let texture = new THREE.Texture(this.img);
- texture.needsUpdate = true;
- this.material = new THREE.ShaderMaterial({
- extensions: {
- derivatives: "#extension GL_OES_standard_derivatives : enable",
- },
- side: THREE.DoubleSide,
- uniforms: {
- time: {
- value: 0,
- },
- resolution: {
- value: new THREE.Vector4(),
- },
- uTexture: {
- value: texture,
- },
- uDataTexture: {
- value: this.texture,
- },
- },
- vertexShader: vertex,
- fragmentShader: fragment,
- });
-
- this.geometry = new THREE.PlaneGeometry(2.3, 1.45, 1, 1);
-
- this.plane = new THREE.Mesh(this.geometry, this.material);
- this.plane.position.set(0, -0.25, 0);
- this.scene.add(this.plane);
- }
-
- updateDataTexture() {
- let data = this.texture.image.data;
- for (let i = 0; i < data.length; i += 3) {
- data[i] *= this.settings.relaxation;
- data[i + 1] *= this.settings.relaxation;
- }
- let gridMouseX = this.size * this.mouse.x;
- let gridMouseY = this.size * (1 - this.mouse.y);
- let maxDist = this.size * this.settings.mouse;
- let aspect = this.height / this.width;
- for (let i = 0; i < this.size; i++) {
- for (let j = 0; j < this.size; j++) {
- let distance = (gridMouseX - i) ** 2 / aspect + (gridMouseY - j) ** 2;
- let maxDistSq = maxDist ** 1.25;
- if (distance < maxDistSq) {
- let index = 3 * (i + this.size * j);
-
- let power = (maxDist * 1.5) / Math.sqrt(distance);
- power = clamp(power, 0, 10);
-
- data[index] += this.settings.strength * 100 * this.mouse.vX * power;
- data[index + 1] -=
- this.settings.strength * 100 * this.mouse.vY * power;
- }
- }
- }
-
- this.mouse.vX *= 0.9;
- this.mouse.vY *= 0.9;
- this.texture.needsUpdate = true;
- }
-
- render() {
- if (!this.isPlaying || this.container.offsetWidth <= 1240) {
- if (this.container.contains(this.renderer.domElement)) {
- this.container.removeChild(this.renderer.domElement);
- }
- return;
- }
- this.time += 0.05;
- this.updateDataTexture();
- requestAnimationFrame(this.render.bind(this));
- this.renderer.render(this.scene, this.camera);
- }
-}
diff --git a/components/HackbyteLogo/style.css b/components/HackbyteLogo/style.css
deleted file mode 100644
index 7620bd6..0000000
--- a/components/HackbyteLogo/style.css
+++ /dev/null
@@ -1,6 +0,0 @@
-#hackbyteLogo {
- width: auto !important;
- height: auto !important;
- max-width:none !important;
- display: none;
-}
diff --git a/components/Herosection/index.jsx b/components/Herosection/index.jsx
new file mode 100644
index 0000000..af6bf37
--- /dev/null
+++ b/components/Herosection/index.jsx
@@ -0,0 +1,134 @@
+import Image from "next/image";
+import linkedIn from "@/public/FooterLogo/linkedin.svg";
+import instagram from "@/public/FooterLogo/instagram.svg";
+import twitter from "@/public/FooterLogo/twitter.svg";
+import discord from "@/public/FooterLogo/discord.svg";
+import milaap from "@/public/FooterLogo/milaap.svg";
+import tpclogo from "@/public/HomePageLogo/tpclogo.svg";
+import institutelogo from "@/public/HomePageLogo/Institutelogo.svg";
+import redtapeImg from "@/public/HomePageLogo/Redtape1.svg";
+import HB3_powered_logo from "@/public/HB3_powered_logo.png";
+import Link from "next/link";
+import BannerAnim from "@/components/BannerAnim";
+// import { PulsatingButton } from "@/components/ui/pulsating-button";
+import Countdown from "@/components/Countdown";
+import HB4Banner from "@/public/HB4Banner.png";
+
+const HeroSection = () => {
+ {
+ return (
+ <>
+
+
+
+
+ Break the red tape
+
+
+ Our Theme
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Join us from
+
+
+
+ 4th-6th April 2025,
+
+
+ at IIITDM Jabalpur
+
+
+
+
+
+ {/* This btn is for the Desktop view */}
+
+
+ {/* This is the btn for the Mobile view */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+ }
+};
+
+export default HeroSection;
diff --git a/components/HumansCard/index.jsx b/components/HumansCard/index.jsx
deleted file mode 100644
index 731e638..0000000
--- a/components/HumansCard/index.jsx
+++ /dev/null
@@ -1,93 +0,0 @@
-"use client";
-
-import Image from "next/image";
-import { motion } from "framer-motion";
-import {
- TwitterLogoIcon,
- LinkedInLogoIcon,
- GitHubLogoIcon,
-} from "@radix-ui/react-icons";
-import behanceLogo from "../../public/behanceLogo.svg";
-
-const SocialMediaIcon = ({ Icon, href }) => (
-
-
-
-);
-
-const HumansCard = ({
- index,
- name,
- role,
- profilepic,
- linkedin,
- twitter,
- github,
-}) => {
- const defaultGradient =
- "radial-gradient(100% at center, #363636 100%, #1A1A1A 27%)";
-
- return (
- <>
-
-
-
-
-
-
{name}
- {role && (
-
- {role}
-
- )}
-
-
-
- {name !== "Aditya Raj" && (
-
- )}
- {name === "Aditya Raj" && (
-
-
-
- )}
-
-
-
-
- >
- );
-};
-
-export default HumansCard;
diff --git a/components/HumansCard/index.tsx b/components/HumansCard/index.tsx
new file mode 100644
index 0000000..056ec00
--- /dev/null
+++ b/components/HumansCard/index.tsx
@@ -0,0 +1,94 @@
+import Image, { StaticImageData } from "next/image";
+import {
+ TwitterLogoIcon,
+ LinkedInLogoIcon,
+ GitHubLogoIcon,
+} from "@radix-ui/react-icons";
+import behanceLogo from "../../public/behanceLogo.svg";
+import { IconProps } from "@radix-ui/react-icons/dist/types";
+import { ComponentType } from "react";
+import Link from "next/link";
+
+interface SocialMediaIconProps {
+ Icon: ComponentType;
+ href: string;
+}
+
+const SocialMediaIcon = ({ Icon, href }: SocialMediaIconProps) => (
+
+
+
+);
+
+interface HumansCardProps {
+ index: number;
+ name: string;
+ role?: string;
+ profilepic: StaticImageData;
+ linkedin: string;
+ twitter: string;
+ github: string;
+ behance?: string;
+}
+
+const HumansCard: React.FC = ({
+ name,
+ role,
+ profilepic,
+ linkedin,
+ twitter,
+ github,
+ behance
+}: HumansCardProps) => {
+ return (
+ <>
+
+
+
+
+
{name}
+ {role && (
+
+ {role}
+
+ )}
+
+
+
+ { !behance ? (
+
+ ) : (
+
+
+
+ )}
+
+
+
+ >
+ );
+};
+
+export default HumansCard;
diff --git a/components/ImageGrid/index.jsx b/components/ImageGrid/index.jsx
index bb0c057..d9b94da 100644
--- a/components/ImageGrid/index.jsx
+++ b/components/ImageGrid/index.jsx
@@ -1,105 +1,389 @@
+"use client";
+import { ArrowRight, ArrowLeft } from "lucide-react";
import Image from "next/image";
-
-import img1 from "@/public/galleryPage/img1.webp";
-import img2 from "@/public/galleryPage/img2.webp";
-import img3 from "@/public/galleryPage/img3.webp";
-import img4 from "@/public/galleryPage/img4.webp";
-import img5 from "@/public/galleryPage/img5.webp";
-import img6 from "@/public/galleryPage/img6.webp";
-import img7 from "@/public/galleryPage/img7.webp";
-import img8 from "@/public/galleryPage/img8.webp";
-import img9 from "@/public/galleryPage/img9.webp";
+import { useState, useEffect } from "react";
+import img1 from "@/public/ImageGallery/img1.webp";
+import img2 from "@/public/ImageGallery/img2.webp";
+import img3 from "@/public/ImageGallery/img3.webp";
+import img4 from "@/public/ImageGallery/img4.webp";
+import img5 from "@/public/ImageGallery/img5.webp";
+import img6 from "@/public/ImageGallery/img6.webp";
+import img7 from "@/public/ImageGallery/img7.webp";
+import img8 from "@/public/ImageGallery/img8.webp";
+import img9 from "@/public/ImageGallery/img9.webp";
+import img10 from "@/public/ImageGallery/img10.jpg";
+import img11 from "@/public/ImageGallery/img11.jpg";
+import img13 from "@/public/ImageGallery/img13.jpg";
+import img16 from "@/public/ImageGallery/img16.jpg";
+import img17 from "@/public/ImageGallery/img17.jpg";
+import img18 from "@/public/ImageGallery/img18.jpg";
+import img21 from "@/public/ImageGallery/img21.jpg";
+import img23 from "@/public/ImageGallery/img23.jpg";
+import img24 from "@/public/ImageGallery/img24.jpg";
+import img26 from "@/public/ImageGallery/img26.jpg";
+import img27 from "@/public/ImageGallery/img27.jpg";
+import img29 from "@/public/ImageGallery/img29.jpg";
+import img31 from "@/public/ImageGallery/img31.jpg";
+import img34 from "@/public/ImageGallery/img34.jpg";
+import img35 from "@/public/ImageGallery/img35.jpg";
+import img37 from "@/public/ImageGallery/img37.jpg";
+import img38 from "@/public/ImageGallery/img38.jpg";
const GridImage = () => {
+ const [currentIndex, setCurrentIndex] = useState(0);
+ const totalSlides = 3;
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setCurrentIndex((prevIndex) => (prevIndex + 1) % totalSlides);
+ }, 4000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ const goToNext = () => {
+ setCurrentIndex((prevIndex) => (prevIndex + 1) % totalSlides);
+ };
+
+ const goToPrev = () => {
+ setCurrentIndex((prevIndex) => (prevIndex - 1 + totalSlides) % totalSlides);
+ };
+
+ const ArrowButton = ({ direction, onClick }) => (
+
+ {direction === "left" ? (
+
+ ) : (
+
+ )}
+
+ );
+
+ const images = [img1, img2, img3, img4, img9, img6, img7, img21, img5];
+
return (
-
-
-
-
-
-
-
-
-
-
-
+ <>
+ {/* Grid layout for mobile screens */}
+
+ {images.map((img, index) => (
+
+ ))}
+
+
+ {/* Grid layout for desktop screens */}
+
+
-
-
-
-
-
-
-
-
-
+
-
+ >
);
};
@@ -108,7 +392,7 @@ const BannerImage = ({ imgsrc }) => {
diff --git a/components/LogitechTrackCard/index.jsx b/components/LogitechTrackCard/index.jsx
deleted file mode 100644
index 3a9b6b4..0000000
--- a/components/LogitechTrackCard/index.jsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import Image from "next/image";
-import leftLeaf from "@/public/schedulePage/leftLeaf.svg";
-import rightLeaf from "@/public/schedulePage/rightLeaf.svg";
-
-export default function LogitechTrackCard({
- imgSrc,
- title,
- description,
- prize,
- prizeImg,
- borderColor,
- bgColor,
-}) {
- return (
-
-
-
-
- {title}
-
-
- {description}
-
-
-
-
-
- );
-}
diff --git a/components/MobileSidebar/index.jsx b/components/MobileSidebar/index.jsx
new file mode 100644
index 0000000..2d63023
--- /dev/null
+++ b/components/MobileSidebar/index.jsx
@@ -0,0 +1,139 @@
+"use client"
+import { useAnimate } from "motion/react"
+import closesidebar from "@/public/closesidebar.svg"
+import opensidebar from "@/public/opensidebar.svg"
+import {
+ Calendar,
+ Handshake,
+ House,
+ Trophy,
+ Users,
+ Info,
+ Image as Gallery,
+ Phone,
+} from "lucide-react"
+import Image from "next/image"
+import { useState, useEffect, useRef } from "react"
+import Link from "next/link"
+import { usePathname } from "next/navigation"
+const sidebarLinks = [
+ { name: "Home", icon:
, href: "/" },
+ { name: "Gallery", icon:
, href: "/gallery" },
+ { name: "Partners", icon:
, href: "/partners" },
+ // { name: "Prizes", icon:
, href: "/prizes" },
+ // { name: "Schedule", icon:
, href: "/schedule" },
+ { name: "Humans", icon:
, href: "/humans" },
+ { name: "FAQs", icon:
, href: "/faq" },
+ { name: "Contact", icon:
, href: "/contact" },
+]
+
+const MobileSidebar = () => {
+ const [fullyopen, setFullyopen] = useState(false)
+ const [open, setOpen] = useState(false)
+ const [scope, animate] = useAnimate()
+ const pathname = usePathname()
+ const sidebarRef = useRef(null)
+ const ishome = pathname === "/"
+
+ useEffect(() => {
+ const handleClickOutside = (event) => {
+ if (sidebarRef.current && !sidebarRef.current.contains(event.target)) {
+ setOpen(false)
+ }
+ }
+
+ if (open) {
+ document.addEventListener("mousedown", handleClickOutside)
+ } else {
+ document.removeEventListener("mousedown", handleClickOutside)
+ }
+
+ return () => {
+ document.removeEventListener("mousedown", handleClickOutside)
+ }
+ }, [open])
+
+ useEffect(() => {
+ const animateSidebar = async () => {
+ if (open) {
+ await animate(
+ scope.current,
+ { height: "400px", width: "65px", borderRadius: "32px" },
+ { duration: 0.3 }
+ )
+ await animate(
+ scope.current,
+ { width: "170px", borderRadius: "32px" },
+ { delay: 0.3 }
+ )
+ setFullyopen(true)
+ } else {
+ await animate(
+ scope.current,
+ { height: "46px", width: "46px", borderRadius: "32px" },
+ {
+ type: "spring",
+ stiffness: 90,
+ damping: 15,
+ }
+ )
+ setFullyopen(false)
+ }
+ }
+
+ animateSidebar()
+ }, [open, animate, scope])
+
+ return (
+ <>
+
{
+ scope.current = el // For animations
+ sidebarRef.current = el // For outside click detection
+ }}
+ className={`backdrop-blur-xl bg-[#222222] h-[48px] w-[48px] fixed rounded-[32px] z-50 ${
+ ishome ? "left-4 top-5 " : "right-4 top-5"
+ }`}
+ style={{
+ background: "rgba(34, 34, 34, 0.50)",
+ boxShadow: "0px 0px 80px 0px rgba(0, 0, 0, 0.15)",
+ backdropFilter: "blur(20px)",
+ }}
+ >
+ {open ? (
+
setOpen(!open)}
+ src={opensidebar}
+ className="absolute right-3 top-3"
+ />
+ ) : (
+ setOpen(!open)}
+ src={closesidebar}
+ />
+ )}
+ {open && (
+
+ {sidebarLinks.map((link) => (
+ setOpen(false)}
+ >
+ {link.icon}
+ {fullyopen && {link.name} }
+
+ ))}
+
+ )}
+
+ >
+ )
+}
+
+export default MobileSidebar
diff --git a/components/Navbar/index.jsx b/components/Navbar/index.jsx
deleted file mode 100644
index 14e2afd..0000000
--- a/components/Navbar/index.jsx
+++ /dev/null
@@ -1,138 +0,0 @@
-"use client";
-
-import { useState, useEffect } from "react";
-import { usePathname } from "next/navigation";
-import classes from "./index.module.css";
-import Link from "next/link";
-import Image from "next/image";
-import HBMobileLogo from "@/public/HBMobileLogo.svg";
-import { AnimatePresence, motion } from "framer-motion";
-
-const navigationItems = [
- { label: "Home", href: "/" },
- { label: "Gallery", href: "/gallery" },
- { label: "Partners", href: "/partners" },
- { label: "Prizes", href: "/prizes" },
- { label: "Schedule", href: "/schedule" },
- { label: "Humans", href: "/humans" },
- { label: "FAQs", href: "/faq" },
- { label: "Contact", href: "/contact" },
-];
-
-const NavItem = ({ label, href }) => {
- const pathname = usePathname();
-
- return (
-
-
- {pathname === href && (
-
- )}
-
-
-
{label}
-
-
-
- );
-};
-
-export default function Navbar() {
- const [isMenuOpen, setMenuOpen] = useState(false);
-
- useEffect(() => {
- if (isMenuOpen) {
- document.body.classList.add("overflow-hidden");
- } else {
- document.body.classList.remove("overflow-hidden");
- }
- }, [isMenuOpen]);
-
- return (
- <>
-
-
-
- {navigationItems.map(({ label, href }) => (
-
- ))}
-
-
-
-
-
-
-
-
-
-
-
- >
- );
-}
diff --git a/components/Navbar/index.module.css b/components/Navbar/index.module.css
deleted file mode 100644
index 0be4dfc..0000000
--- a/components/Navbar/index.module.css
+++ /dev/null
@@ -1,45 +0,0 @@
-.hamburger {
- position: relative;
- display: flex;
- flex-direction: column;
- align-items: flex-end;
- cursor: pointer;
- transition: all 0.25s;
- border: 1.5px solid #9d9d9d;
- border-radius: 2rem;
- padding: 0.6rem 1.3rem;
- row-gap: 0.31rem;
-}
-
-.hamburgerTop,
-.hamburgerMiddle,
-.hamburgerBottom {
- width: 24px;
- height: 2.5px;
- top: 0;
- left: 0;
- background: #fff;
- transform: rotate(0);
- transition: all 0.5s;
-}
-
-.hamburgerBottom {
- width: calc(100% - 8px);
-}
-.open {
- border: none;
- position: relative;
- transform: rotate(90deg);
-}
-
-.open .hamburgerTop {
- transform: translateY(4px) rotate(45deg);
-}
-
-.open .hamburgerMiddle {
- transform: translateY(-4px) rotate(-45deg);
-}
-
-.open .hamburgerBottom {
- display: none;
-}
diff --git a/components/NewsLetter/index.jsx b/components/NewsLetter/index.jsx
deleted file mode 100644
index 01bd822..0000000
--- a/components/NewsLetter/index.jsx
+++ /dev/null
@@ -1,115 +0,0 @@
-"use client";
-
-import { useState } from "react";
-import { motion } from "framer-motion";
-import { db } from "@/app/firebase/config";
-import { collection, addDoc, getDocs, query, where } from "firebase/firestore";
-import { ToastContainer, toast } from "react-toastify";
-
-export default function NewsLetter() {
- const [email, setEmail] = useState("");
- const dbInstance = collection(db, "subscribers");
-
- function notify(message) {
- toast(message, {
- position: "bottom-right",
- autoClose: 3000,
- hideProgressBar: false,
- progress: undefined,
- });
- }
-
- const handleSubscribe = async (e) => {
- e.preventDefault();
-
- if (!email) {
- notify("Please enter your email address");
- return;
- }
-
- // Email format validation using regex
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
- if (!emailRegex.test(email)) {
- notify("Please enter a valid email address");
- return;
- }
-
- try {
- // Check if the email already exists in the database
- const querySnapshot = await getDocs(
- query(dbInstance, where("email", "==", email))
- );
-
- if (!querySnapshot.empty) {
- notify("Email already subscribed");
- return;
- }
-
- // If the email doesn't exist, add it to the database
- await addDoc(dbInstance, {
- email,
- timestamp: new Date(),
- });
-
- notify("Subscribed successfully!");
- setEmail("");
- } catch (error) {
- console.error("Error subscribing:", error.message);
- notify("An error occurred. Please try again later.");
- }
- };
-
- return (
- <>
-
-
-
-
-
- Join our newsletter
-
-
- Sign up to receive updates on our latest events.
-
-
-
-
-
- setEmail(e.target.value)}
- className="w-full py-3 px-3.5 bg-[#ffffff] rounded-lg text-gray-500
- border-2 border-[#D0D5DD] focus:outline-purple-300 focus:text-gray-900"
- />
-
-
- Subscribe
-
-
-
-
- >
- );
-}
diff --git a/components/Newsletter/index.jsx b/components/Newsletter/index.jsx
new file mode 100644
index 0000000..74fd994
--- /dev/null
+++ b/components/Newsletter/index.jsx
@@ -0,0 +1,137 @@
+"use client";
+import Image from "next/image";
+import HB3Logo from "@/public/HomePageLogo/HB3Logo.svg";
+import { useState } from "react";
+import axios from "axios";
+import { useToast } from "@/hooks/use-toast";
+import * as motion from "motion/react-client";
+
+export default function Newsletter() {
+ const [email, setEmail] = useState("");
+ const [loading, setLoading] = useState(false);
+
+ const host = process.env.NEXT_PUBLIC_HOST;
+ const { toast } = useToast();
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+
+ setLoading(true);
+ try {
+ const res = await axios.post(`${host}/api/subscribe`, { email });
+
+ const data = res.data;
+
+ if (data.success) {
+ setEmail("");
+ toast({
+ title: "Subscription successful!",
+ description: "You have successfully subscribed to our mailing list.",
+ });
+ } else {
+ }
+ } catch (error) {
+ console.error(error);
+ toast({
+ title: "Subscription failed!",
+ description: "Your email is Invalid -_- Please try again.",
+ });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+
+
+ Join our mailing list!
+
+
+ To stay up-to-date with{" "}
+ HackByte 3.0 , consider subscribing
+ to our mailing list. Helps us share important updates right away with
+ hackers and enthusiasts alike!
+
+
+
+
+ O Be the first
+ ones to register for HackByte 3.0
+
+
+ O Get updates
+ about your application status
+
+
+ O Get notified
+ for exciting events!
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/components/PrizeCard/index.jsx b/components/PrizeCard/index.jsx
deleted file mode 100644
index dc1331f..0000000
--- a/components/PrizeCard/index.jsx
+++ /dev/null
@@ -1,66 +0,0 @@
-"use client";
-import { motion } from "framer-motion";
-import { Tilt } from "react-tilt";
-
-const PrizeCard = ({ amount, category, default_bg, hover_bg }) => {
- const defaultOptions = {
- reverse: false,
- max: 4,
- perspective: 1000,
- scale: 1.02,
- speed: 200,
- transition: true,
- axis: null,
- reset: true,
- easing: "cubic-bezier(0.175, 0.885, 0.32, 1.275)",
- };
-
- return (
- <>
-
-
-
- (e.currentTarget.style.background = "var(--hover-gradient)")
- }
- onMouseLeave={(e) =>
- (e.currentTarget.style.background = "var(--default-gradient)")
- }
- >
-
- {amount}
-
-
- {category}
-
-
-
-
- >
- );
-};
-
-export default PrizeCard;
diff --git a/components/PrizeSection/index.jsx b/components/PrizeSection/index.jsx
new file mode 100644
index 0000000..2af0b01
--- /dev/null
+++ b/components/PrizeSection/index.jsx
@@ -0,0 +1,109 @@
+import Image from "next/image";
+import lamp_orange from "@/public/prizesPageLogo/lamp_orange.svg";
+import lamp_white from "@/public/prizesPageLogo/lamp_white.svg";
+import lamp_yellow from "@/public/prizesPageLogo/lamp_yellow.svg";
+import cup2 from "@/public/prizesPageLogo/cup2.svg";
+import cup3 from "@/public/prizesPageLogo/cup3.svg";
+import cup1 from "@/public/prizesPageLogo/cup1.svg";
+import AnimatedTitle from "../AnimatedTitle";
+
+const PrizeCard = ({
+ lampImage,
+ cupImage,
+ prizeAmount,
+ prizeDescription,
+ gradientColors,
+ gradientClasses,
+ textColor,
+}) => (
+
+);
+
+const PrizeSection = () => {
+ const prizeData = [
+ {
+ lampImage: lamp_yellow,
+ cupImage: cup1,
+ prizeAmount: "INR 40K",
+ prizeDescription: "1st Prize - Gold",
+ gradientColors:
+ "from-[#FFAE0C]/30 via-[#FFAE0C]/40 to-transparent to-85%",
+ gradientClasses: "clip-trapezium",
+ textColor: "text-[#FFAE0C]",
+ },
+ {
+ lampImage: lamp_white,
+ cupImage: cup2,
+ prizeAmount: "INR 25K",
+ prizeDescription: "2nd Prize - Silver",
+ gradientColors:
+ "from-supporting-mediumGray/30 via-supporting-mediumGray/40 to-transparent to-85%",
+ gradientClasses: "clip-trapezium",
+ textColor: "text-supporting-mediumGray",
+ },
+ {
+ lampImage: lamp_orange,
+ cupImage: cup3,
+ prizeAmount: "INR 15K",
+ prizeDescription: "3rd Prize - Bronze",
+ gradientColors:
+ "from-[#D76835]/30 via-[#D76835]/40 to-transparent to-85%",
+ gradientClasses: "clip-trapezium",
+ textColor: "text-[#D76835]",
+ },
+ ];
+
+ return (
+
+ {prizeData.map((prize, index) => (
+
+ ))}
+
+ );
+};
+
+export default PrizeSection;
diff --git a/components/SponsorCard/index.tsx b/components/SponsorCard/index.tsx
new file mode 100644
index 0000000..508ebc7
--- /dev/null
+++ b/components/SponsorCard/index.tsx
@@ -0,0 +1,82 @@
+import Image, { StaticImageData } from "next/image";
+import Link from "next/link";
+import AnimatedTitle from "@/components/AnimatedTitle";
+
+interface SponsorCardProps {
+ index: number;
+ sponsor: string;
+ category: string;
+ sponsorimgsrc: StaticImageData;
+ site: string;
+}
+
+const SponsorCard: React.FC
= ({
+ index,
+ sponsor,
+ category,
+ sponsorimgsrc,
+ site,
+}) => {
+ // card colors depends on the category of the sponsor
+ const defaultBgColor = "#262626";
+ const defaultTextColor = "#BBBBBB";
+ const sponsorColor: {
+ [key in SponsorCardProps["category"]]: {
+ bgColor: string;
+ textColor: string;
+ };
+ } = {
+ "Gold Sponsor": {
+ bgColor: "#4E3E1D",
+ textColor: "#FFDC96",
+ },
+ "Silver Sponsor": {
+ bgColor: "#3A3A3A",
+ textColor: "#BBBBBB",
+ },
+ "Bronze Sponsor": {
+ bgColor: "#463026",
+ textColor: "#E49977",
+ },
+ "Platform Partner": {
+ bgColor: "#483869",
+ textColor: "#C1A5FF",
+ },
+ };
+
+ const bgColor = sponsorColor[category]?.bgColor ?? defaultBgColor;
+ const textColor = sponsorColor[category]?.textColor ?? defaultTextColor;
+
+ return (
+ <>
+
+
+
+
+
+
+
{sponsor}
+
+ {category}
+
+
+
+
+
+
+ >
+ );
+};
+
+export default SponsorCard;
diff --git a/components/SpotlightCard/index.jsx b/components/SpotlightCard/index.jsx
new file mode 100644
index 0000000..b655625
--- /dev/null
+++ b/components/SpotlightCard/index.jsx
@@ -0,0 +1,61 @@
+"use client";
+import { useRef, useState } from "react";
+
+const SpotlightCard = ({
+ children,
+ className = "",
+ spotlightColor = "rgba(255, 255, 255, 0.25)",
+}) => {
+ const divRef = useRef(null);
+ const [isFocused, setIsFocused] = useState(false);
+ const [position, setPosition] = useState({ x: 0, y: 0 });
+ const [opacity, setOpacity] = useState(0);
+
+ const handleMouseMove = (e) => {
+ if (!divRef.current || isFocused) return;
+
+ const rect = divRef.current.getBoundingClientRect();
+ setPosition({ x: e.clientX - rect.left, y: e.clientY - rect.top });
+ };
+
+ const handleFocus = () => {
+ setIsFocused(true);
+ setOpacity(0.6);
+ };
+
+ const handleBlur = () => {
+ setIsFocused(false);
+ setOpacity(0);
+ };
+
+ const handleMouseEnter = () => {
+ setOpacity(0.6);
+ };
+
+ const handleMouseLeave = () => {
+ setOpacity(0);
+ };
+
+ return (
+
+ );
+};
+
+export default SpotlightCard;
diff --git a/components/SpotlightEffect/index.jsx b/components/SpotlightEffect/index.jsx
new file mode 100644
index 0000000..4b6674a
--- /dev/null
+++ b/components/SpotlightEffect/index.jsx
@@ -0,0 +1,42 @@
+import { cn } from "@/lib/utils";
+
+export const Spotlight = ({
+ className,
+ fill
+}) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/components/StatisticCard/index.jsx b/components/StatisticCard/index.jsx
deleted file mode 100644
index 6797548..0000000
--- a/components/StatisticCard/index.jsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import CountAnimation from "../CountAnimation";
-
-export default function StatisticCard({ number, label, description }) {
- return (
-
-
-
-
- {label}
-
-
- {description}
-
-
-
- );
-}
diff --git a/components/TSPrizeCard/index.jsx b/components/TSPrizeCard/index.jsx
deleted file mode 100644
index bbc3e19..0000000
--- a/components/TSPrizeCard/index.jsx
+++ /dev/null
@@ -1,117 +0,0 @@
-"use client";
-import React from "react";
-import Image from "next/image";
-import { motion } from "framer-motion";
-import { Tilt } from "react-tilt";
-
-const TSPrizeCard = ({
- index,
- logo,
- alt,
- title,
- supportText,
- description,
- docLink,
-}) => {
- const defaultOptions = {
- reverse: false,
- max: 4,
- perspective: 1000,
- scale: 1.02,
- speed: 200,
- transition: true,
- axis: null,
- reset: true,
- easing: "cubic-bezier(0.175, 0.885, 0.32, 1.275)",
- };
-
- const defaultGradient =
- "radial-gradient(371.89% 134.33% at 3.21% 1.26%,rgba(255, 255, 255, 0.07) 0%,rgba(217, 217, 217, 0.00) 100%)";
- const hoverGradient =
- "radial-gradient(80deg, #D06D30 6.67%, #FFD887 28.13%, #FFDCAD 64.87%, #FAB858 95.66%)";
-
- return (
- <>
-
-
-
- (e.currentTarget.style.background = "var(--hover-gradient)")
- }
- onMouseLeave={(e) =>
- (e.currentTarget.style.background = "var(--default-gradient)")
- }
- >
-
-
-
-
-
-
- {title}
-
-
-
-
- {supportText}
-
-
- {description}
-
-
-
-
-
-
- >
- );
-};
-
-export default TSPrizeCard;
diff --git a/components/TextAnimation/index.jsx b/components/TextAnimation/index.jsx
deleted file mode 100644
index c945414..0000000
--- a/components/TextAnimation/index.jsx
+++ /dev/null
@@ -1,27 +0,0 @@
-"use client";
-import { motion } from "framer-motion";
-
-export default function TextAnimation({ text }) {
- const textArray = text.split(" ");
-
- return (
-
- {textArray.map((el, i) => (
-
- {el === " " ? : el}{" "}
-
- ))}
-
- );
-}
diff --git a/components/ThemeTitle/index.jsx b/components/ThemeTitle/index.jsx
deleted file mode 100644
index ff77348..0000000
--- a/components/ThemeTitle/index.jsx
+++ /dev/null
@@ -1,76 +0,0 @@
-"use client";
-
-import { useEffect, useState } from "react";
-import { motion } from "framer-motion";
-import CountDownAnim from "../CountDownAnim";
-
-const ThemeTitle = () => {
- const [mousePosition, setMousePosition] = useState({
- x: 0,
- y: 0,
- });
- const [cursorVariant, setCursorVariant] = useState("default");
- const [display, setDisplay] = useState("block");
-
- useEffect(() => {
- const mouseMove = (e) => {
- setMousePosition({
- x: e.clientX,
- y: e.clientY,
- });
- };
-
- window.addEventListener("mousemove", mouseMove);
-
- return () => {
- window.removeEventListener("mousemove", mouseMove);
- };
- }, []);
-
- useEffect(() => {
- setDisplay(window.innerWidth < 450 ? "none" : "block");
- }, []);
-
- const variants = {
- default: {
- x: mousePosition.x - 16,
- y: mousePosition.y - 16,
- display: display,
- },
- text: {
- height: 120,
- width: 120,
- x: mousePosition.x - 75,
- y: mousePosition.y - 75,
- backgroundColor: "#DED9C6",
- mixBlendMode: "difference",
- },
- };
-
- const textEnter = () => setCursorVariant("text");
- const textLeave = () => setCursorVariant("default");
-
- return (
- <>
-
- Revealing soon :{" "}
-
-
-
-
-
-
- >
- );
-};
-
-export default ThemeTitle;
diff --git a/components/Timer/index.jsx b/components/Timer/index.jsx
deleted file mode 100644
index 9fc89f6..0000000
--- a/components/Timer/index.jsx
+++ /dev/null
@@ -1,64 +0,0 @@
-"use client";
-import React, { useState, useEffect } from "react";
-
-export default function Timer() {
- const [timeLeft, setTimeLeft] = useState({
- days: 0,
- hours: 0,
- minutes: 0,
- seconds: 0,
- });
-
- const deadline = "2024-03-28T00:00:00";
-
- useEffect(() => {
- const updateTimeLeft = () => {
- const time = Date.parse(deadline) - new Date().getTime();
- if (time < 0) {
- // Stop the countdown once the deadline has passed
- setTimeLeft({ days: 0, hours: 0, minutes: 0, seconds: 0 });
- return;
- }
-
- const days = Math.floor(time / (1000 * 60 * 60 * 24));
- const hours = Math.floor((time / (1000 * 60 * 60)) % 24);
- const minutes = Math.floor((time / 1000 / 60) % 60);
- const seconds = Math.floor((time / 1000) % 60);
-
- setTimeLeft({ days, hours, minutes, seconds });
- };
-
- const interval = setInterval(updateTimeLeft, 1000);
-
- // Cleanup the interval on component unmount
- return () => clearInterval(interval);
- }, [deadline]);
-
- // Destructure timeLeft for easier use in the JSX
- const { days, hours, minutes, seconds } = timeLeft;
-
- return (
-
- {[
- { value: days, label: "D" },
- { value: hours, label: "H" },
- { value: minutes, label: "M" },
- { value: seconds, label: "S" },
- ].map((item, index) => (
-
-
- {item.value}
- {item.label}
-
-
- ))}
-
- );
-}
diff --git a/components/TitleSponsorCard/index.jsx b/components/TitleSponsorCard/index.jsx
index 3b75a94..8ba1708 100644
--- a/components/TitleSponsorCard/index.jsx
+++ b/components/TitleSponsorCard/index.jsx
@@ -1,81 +1,50 @@
-"use client";
-
-import { useState } from "react";
-import Image from "next/image";
-import logitech from "@/public/partnersPage/logitech.jpg";
-import { ArrowRightIcon } from "@radix-ui/react-icons";
-import { Tilt } from "react-tilt";
-
-export default function TitleSponsorCard() {
- const [isHovered, setIsHovered] = useState(false);
- const defaultOptions = {
- reverse: false,
- max: 4,
- perspective: 1000,
- scale: 1.02,
- speed: 200,
- transition: true,
- axis: null,
- reset: true,
- easing: "cubic-bezier(0.175, 0.885, 0.32, 1.275)",
- };
-
- return (
-
-
- {
- setIsHovered(true);
- }}
- onMouseLeave={(e) => {
- setIsHovered(false);
- }}
- >
-
-
-
-
- Title Sponsor
-
-
- The MX Master Series is expertly designed for users, empowering
- coders to unleash productivity and optimize performance during
- intense coding marathons.
-
-
-
-
-
- );
-}
+import * as motion from "motion/react-client";
+import Image from "next/image";
+import Link from "next/link";
+
+const TitleSponsorCard = ({ title, description, imageSrc, link }) => {
+ return (
+
+
+
+
+
+
+
+
+ Title Sponsor
+
+
+
+ {title}
+
+
+
+ {description}
+
+
+
+
+
+ );
+};
+
+export default TitleSponsorCard;
diff --git a/components/TrackPrizeCard/index.tsx b/components/TrackPrizeCard/index.tsx
new file mode 100644
index 0000000..7700bb1
--- /dev/null
+++ b/components/TrackPrizeCard/index.tsx
@@ -0,0 +1,90 @@
+"use client";
+import React, { useState } from "react";
+import Image, { StaticImageData } from "next/image";
+import Link from "next/link";
+import AnimatedTitle from "@/components/AnimatedTitle";
+
+interface TrackPrizeCardProps {
+ index: number;
+ prizeimgsrc: StaticImageData;
+ prizeTitle: string;
+ prize: string;
+ link: string;
+ prizeDescription: string;
+}
+
+const TrackPrizeCard: React.FC = ({
+ index,
+ prizeimgsrc,
+ prizeTitle,
+ prize,
+ link,
+ prizeDescription,
+}) => {
+ const [isExpanded, setIsExpanded] = useState(false);
+
+ const toggleDescription = () => {
+ setIsExpanded(!isExpanded);
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
45 ? "sm:text-xl" : "sm:text-2xl"
+ } text-xl font-black my-[4px] sm:h-[68px] underline`}
+ >
+ {prizeTitle}
+
+
+ {prize.split(". ").map((sentence, index) => (
+
+ {sentence}.
+
+
+ ))}
+
+
+
+
+
+ {/* Description with smooth transition */}
+
+ {prizeDescription}
+
+
+ {/* Read more / Read less button */}
+
+ {isExpanded ? "Read less" : "Read more"}
+
+
+
+
+ >
+ );
+};
+
+export default TrackPrizeCard;
diff --git a/components/YetToBeDisclosed/index.tsx b/components/YetToBeDisclosed/index.tsx
new file mode 100644
index 0000000..6939de2
--- /dev/null
+++ b/components/YetToBeDisclosed/index.tsx
@@ -0,0 +1,77 @@
+import Image from "next/image";
+import { StaticImageData } from "next/image";
+
+import galleryPageSticker from "@/public/gallerySticker.webp";
+import faqsPageSticker from "@/public/faqsSticker.webp";
+import humansPageSticker from "@/public/humansSticker.webp";
+import Link from "next/link";
+
+const redirectingData = [
+ {
+ title: "Gallery",
+ link: "/gallery",
+ image: galleryPageSticker,
+ },
+ {
+ title: "FAQS",
+ link: "/faq",
+ image: faqsPageSticker,
+ },
+ {
+ title: "Humans",
+ link: "/humans",
+ image: humansPageSticker,
+ },
+];
+
+interface RedirectCardsProps {
+ title: string;
+ link: string;
+ image: StaticImageData;
+}
+
+const RedirectingCard = ({ title, link, image }: RedirectCardsProps) => {
+ return (
+
+
+
+ );
+};
+
+const YetToBeDisclosed: React.FC = () => {
+ return (
+
+
+ Yet to be disclosed
+
+
+ These details are not yet disclosed, so stay sharp.
+
+
Meanwhile,
+
+ why don't you check these out!
+
+
+ {redirectingData.map((data) => (
+
+ ))}
+
+
+ );
+};
+
+export default YetToBeDisclosed;
diff --git a/components/dotbg.jsx b/components/dotbg.jsx
new file mode 100644
index 0000000..5fd3357
--- /dev/null
+++ b/components/dotbg.jsx
@@ -0,0 +1,144 @@
+// components/DotBackground.js
+"use client";
+import { useRef, useEffect } from "react";
+
+const InteractiveBackground = ({ children }) => {
+ const canvasRef = useRef(null);
+ const hexes = useRef([]);
+
+ useEffect(() => {
+ const canvas = canvasRef.current;
+ const ctx = canvas.getContext("2d");
+ let cw = window.innerWidth;
+ let ch = window.innerHeight;
+ canvas.width = cw;
+ canvas.height = ch;
+
+ let offsetX, offsetY;
+
+ const reOffset = () => {
+ const BB = canvas.getBoundingClientRect();
+ offsetX = BB.left;
+ offsetY = BB.top;
+ };
+
+ const initHexes = () => {
+ const hexRadius = 1.5;
+ const hexPadding = 50;
+ hexes.current = [];
+
+ for (let y = hexRadius; y < ch; y += hexRadius * 2 + hexPadding) {
+ for (let x = hexRadius; x < cw; x += hexRadius * 2 + hexPadding) {
+ hexes.current.push({ startingX: x, startingY: y, x: x, y: y });
+ }
+ }
+ };
+
+ let mouseIsDown = false;
+ let mx, my;
+ const mouseRadius = 75;
+ const mouseRadiusSquared = mouseRadius * mouseRadius;
+ let ticktick = 0;
+
+ const draw = () => {
+ ctx.clearRect(0, 0, cw, ch);
+ ctx.fillStyle = "#848282";
+ ctx.beginPath();
+
+ hexes.current.forEach((h) => {
+ ctx.moveTo(h.x, h.y);
+ ctx.arc(h.x, h.y, 2, 0, Math.PI * 2);
+ });
+
+ ctx.closePath();
+ ctx.fill();
+ };
+
+ const tick = () => {
+ hexes.current.forEach((h) => {
+ const dx = h.x - mx;
+ const dy = h.y - my;
+
+ if (mouseIsDown && dx * dx + dy * dy < mouseRadiusSquared) {
+ h.x += dx / 30;
+ h.y += dy / 30;
+ ticktick++;
+ if (ticktick > 20) {
+ mouseIsDown = false;
+ ticktick = 0;
+ }
+ } else if (h.x === h.startingX && h.y === h.startingY) {
+ // Do nothing
+ } else {
+ const ddx = h.x - h.startingX;
+ const ddy = h.y - h.startingY;
+ h.x -= ddx / 20;
+ h.y -= ddy / 20;
+ }
+ });
+
+ draw();
+ requestAnimationFrame(tick);
+ };
+
+ const handleMouseDown = (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ mx = e.clientX - offsetX;
+ my = e.clientY - offsetY;
+
+ mouseIsDown = true;
+ ticktick = 0;
+ };
+
+ const handleMouseUp = () => {
+ mouseIsDown = false;
+ };
+
+ const handleResize = () => {
+ cw = window.innerWidth;
+ ch = window.innerHeight;
+ canvas.width = cw;
+ canvas.height = ch;
+ initHexes();
+ reOffset();
+ };
+
+ reOffset();
+ initHexes();
+ draw();
+ requestAnimationFrame(tick);
+
+ window.addEventListener("resize", handleResize);
+ window.addEventListener("mousemove", handleMouseDown);
+ window.addEventListener("mouseup", handleMouseUp);
+
+ return () => {
+ window.removeEventListener("resize", handleResize);
+ window.removeEventListener("mousemove", handleMouseDown);
+ window.removeEventListener("mouseup", handleMouseUp);
+ };
+ }, []);
+
+ return (
+
+
+ {children}
+
+ );
+};
+
+export default InteractiveBackground;
diff --git a/components/footer/index.jsx b/components/footer/index.jsx
new file mode 100644
index 0000000..3c53506
--- /dev/null
+++ b/components/footer/index.jsx
@@ -0,0 +1,112 @@
+import Image from "next/image"
+import Hackbyte3Logo from "../../public/FooterLogo/Hackbyte3Logo.png"
+import webdock from "../../public/FooterLogo/webdock_footer_logo.svg"
+import benq from "../../public/FooterLogo/benq_footer_logo.svg"
+import linkedIn from "../../public/FooterLogo/linkedin.svg"
+import instagram from "../../public/FooterLogo/instagram.svg"
+import twitter from "../../public/FooterLogo/twitter.svg"
+import discord from "../../public/FooterLogo/discord.svg"
+import milaap from "../../public/FooterLogo/milaap.svg"
+import Link from "next/link"
+import AnimatedTitle from "../AnimatedTitle"
+import hackbyte4logo from "@/public/HB4Logo.svg"
+
+const sidebarLinks = [
+ { name: "Home", href: "/" },
+ { name: "Gallery", href: "/gallery" },
+ { name: "Partners", href: "/partners" },
+ //{ name: "Prizes", href: "/prizes" },
+ //{ name: "Schedule", href: "/schedule" },
+ { name: "Humans", href: "/humans" },
+ { name: "FAQs", href: "/faq" },
+ { name: "Contact", href: "/contact" },
+]
+
+const Footer = () => {
+ return (
+
+
+
+
+
+
+
+
+ Will be back with
+
+
+
+ A Brand new Theme
+
+
+ Stronger{" "}
+ Determination
+
+
Cool Surprises🎁!
+
+
+
+
+
+
+
+ {sidebarLinks.map((link) => (
+
+ {link.name}
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ © 2025 Hackbyte, All rights reserved
+
+
+ )
+}
+
+export default Footer
diff --git a/components/sidebar/index.jsx b/components/sidebar/index.jsx
new file mode 100644
index 0000000..db5b331
--- /dev/null
+++ b/components/sidebar/index.jsx
@@ -0,0 +1,55 @@
+"use client";
+import {
+ Calendar,
+ Handshake,
+ House,
+ Trophy,
+ Users,
+ Info,
+ Image as Gallery,
+ Phone,
+} from "lucide-react";
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+
+const sidebarLinks = [
+ { name: "Home", icon: , href: "/" },
+ { name: "Gallery", icon: , href: "/gallery" },
+ { name: "Partners", icon: , href: "/partners" },
+ //{ name: "Prizes", icon: , href: "/prizes" },
+ //{ name: "Schedule", icon: , href: "/schedule" },
+ { name: "Humans", icon: , href: "/humans" },
+ { name: "FAQs", icon: , href: "/faq" },
+ { name: "Contact", icon: , href: "/contact" },
+];
+
+export const Sidebar = () => {
+ const pathname = usePathname();
+
+ return (
+
+
+ {sidebarLinks.map((link) => (
+
+ {link.icon}
+ {link.name}
+
+ ))}
+
+
+ );
+};
diff --git a/components/ui/accordion.jsx b/components/ui/accordion.jsx
deleted file mode 100644
index 6ab7493..0000000
--- a/components/ui/accordion.jsx
+++ /dev/null
@@ -1,70 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as AccordionPrimitive from "@radix-ui/react-accordion";
-import { PlusCircledIcon, MinusCircledIcon } from "@radix-ui/react-icons";
-
-import { cn } from "@/lib/utils";
-import { motion } from "framer-motion";
-
-const Accordion = AccordionPrimitive.Root;
-
-const AccordionItem = React.forwardRef(({ className, ...props }, ref) => (
- <>
-
-
-
- >
-));
-AccordionItem.displayName = "AccordionItem";
-
-const AccordionTrigger = React.forwardRef(
- ({ className, children, ...props }, ref) => (
-
- span]:hidden [&[data-state=closed]>svg]:hidden",
- className
- )}
- {...props}
- >
- {children}
-
-
-
-
-
-
- )
-);
-AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
-
-const AccordionContent = React.forwardRef(
- ({ className, children, ...props }, ref) => (
-
- {children}
-
- )
-);
-
-AccordionContent.displayName = AccordionPrimitive.Content.displayName;
-
-export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
diff --git a/components/ui/accordion.tsx b/components/ui/accordion.tsx
new file mode 100644
index 0000000..2f55a32
--- /dev/null
+++ b/components/ui/accordion.tsx
@@ -0,0 +1,57 @@
+"use client"
+
+import * as React from "react"
+import * as AccordionPrimitive from "@radix-ui/react-accordion"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Accordion = AccordionPrimitive.Root
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AccordionItem.displayName = "AccordionItem"
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+))
+AccordionContent.displayName = AccordionPrimitive.Content.displayName
+
+export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
diff --git a/components/ui/alert-dialog.tsx b/components/ui/alert-dialog.tsx
new file mode 100644
index 0000000..57760f2
--- /dev/null
+++ b/components/ui/alert-dialog.tsx
@@ -0,0 +1,141 @@
+"use client"
+
+import * as React from "react"
+import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
+
+import { cn } from "@/lib/utils"
+import { buttonVariants } from "@/components/ui/button"
+
+const AlertDialog = AlertDialogPrimitive.Root
+
+const AlertDialogTrigger = AlertDialogPrimitive.Trigger
+
+const AlertDialogPortal = AlertDialogPrimitive.Portal
+
+const AlertDialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName
+
+const AlertDialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+))
+AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName
+
+const AlertDialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+AlertDialogHeader.displayName = "AlertDialogHeader"
+
+const AlertDialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+AlertDialogFooter.displayName = "AlertDialogFooter"
+
+const AlertDialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName
+
+const AlertDialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogDescription.displayName =
+ AlertDialogPrimitive.Description.displayName
+
+const AlertDialogAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName
+
+const AlertDialogCancel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName
+
+export {
+ AlertDialog,
+ AlertDialogPortal,
+ AlertDialogOverlay,
+ AlertDialogTrigger,
+ AlertDialogContent,
+ AlertDialogHeader,
+ AlertDialogFooter,
+ AlertDialogTitle,
+ AlertDialogDescription,
+ AlertDialogAction,
+ AlertDialogCancel,
+}
diff --git a/components/ui/alert.tsx b/components/ui/alert.tsx
new file mode 100644
index 0000000..5afd41d
--- /dev/null
+++ b/components/ui/alert.tsx
@@ -0,0 +1,59 @@
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const alertVariants = cva(
+ "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
+ {
+ variants: {
+ variant: {
+ default: "bg-background text-foreground",
+ destructive:
+ "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+const Alert = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes & VariantProps
+>(({ className, variant, ...props }, ref) => (
+
+))
+Alert.displayName = "Alert"
+
+const AlertTitle = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+AlertTitle.displayName = "AlertTitle"
+
+const AlertDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+AlertDescription.displayName = "AlertDescription"
+
+export { Alert, AlertTitle, AlertDescription }
diff --git a/components/ui/aspect-ratio.tsx b/components/ui/aspect-ratio.tsx
new file mode 100644
index 0000000..d6a5226
--- /dev/null
+++ b/components/ui/aspect-ratio.tsx
@@ -0,0 +1,7 @@
+"use client"
+
+import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio"
+
+const AspectRatio = AspectRatioPrimitive.Root
+
+export { AspectRatio }
diff --git a/components/ui/avatar.tsx b/components/ui/avatar.tsx
new file mode 100644
index 0000000..51e507b
--- /dev/null
+++ b/components/ui/avatar.tsx
@@ -0,0 +1,50 @@
+"use client"
+
+import * as React from "react"
+import * as AvatarPrimitive from "@radix-ui/react-avatar"
+
+import { cn } from "@/lib/utils"
+
+const Avatar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+Avatar.displayName = AvatarPrimitive.Root.displayName
+
+const AvatarImage = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AvatarImage.displayName = AvatarPrimitive.Image.displayName
+
+const AvatarFallback = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName
+
+export { Avatar, AvatarImage, AvatarFallback }
diff --git a/components/ui/badge.tsx b/components/ui/badge.tsx
new file mode 100644
index 0000000..e87d62b
--- /dev/null
+++ b/components/ui/badge.tsx
@@ -0,0 +1,36 @@
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const badgeVariants = cva(
+ "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
+ {
+ variants: {
+ variant: {
+ default:
+ "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80",
+ secondary:
+ "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ destructive:
+ "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80",
+ outline: "text-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+export interface BadgeProps
+ extends React.HTMLAttributes,
+ VariantProps {}
+
+function Badge({ className, variant, ...props }: BadgeProps) {
+ return (
+
+ )
+}
+
+export { Badge, badgeVariants }
diff --git a/components/ui/breadcrumb.tsx b/components/ui/breadcrumb.tsx
new file mode 100644
index 0000000..60e6c96
--- /dev/null
+++ b/components/ui/breadcrumb.tsx
@@ -0,0 +1,115 @@
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { ChevronRight, MoreHorizontal } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Breadcrumb = React.forwardRef<
+ HTMLElement,
+ React.ComponentPropsWithoutRef<"nav"> & {
+ separator?: React.ReactNode
+ }
+>(({ ...props }, ref) => )
+Breadcrumb.displayName = "Breadcrumb"
+
+const BreadcrumbList = React.forwardRef<
+ HTMLOListElement,
+ React.ComponentPropsWithoutRef<"ol">
+>(({ className, ...props }, ref) => (
+
+))
+BreadcrumbList.displayName = "BreadcrumbList"
+
+const BreadcrumbItem = React.forwardRef<
+ HTMLLIElement,
+ React.ComponentPropsWithoutRef<"li">
+>(({ className, ...props }, ref) => (
+
+))
+BreadcrumbItem.displayName = "BreadcrumbItem"
+
+const BreadcrumbLink = React.forwardRef<
+ HTMLAnchorElement,
+ React.ComponentPropsWithoutRef<"a"> & {
+ asChild?: boolean
+ }
+>(({ asChild, className, ...props }, ref) => {
+ const Comp = asChild ? Slot : "a"
+
+ return (
+
+ )
+})
+BreadcrumbLink.displayName = "BreadcrumbLink"
+
+const BreadcrumbPage = React.forwardRef<
+ HTMLSpanElement,
+ React.ComponentPropsWithoutRef<"span">
+>(({ className, ...props }, ref) => (
+
+))
+BreadcrumbPage.displayName = "BreadcrumbPage"
+
+const BreadcrumbSeparator = ({
+ children,
+ className,
+ ...props
+}: React.ComponentProps<"li">) => (
+ svg]:w-3.5 [&>svg]:h-3.5", className)}
+ {...props}
+ >
+ {children ?? }
+
+)
+BreadcrumbSeparator.displayName = "BreadcrumbSeparator"
+
+const BreadcrumbEllipsis = ({
+ className,
+ ...props
+}: React.ComponentProps<"span">) => (
+
+
+ More
+
+)
+BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"
+
+export {
+ Breadcrumb,
+ BreadcrumbList,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+ BreadcrumbEllipsis,
+}
diff --git a/components/ui/button.jsx b/components/ui/button.jsx
deleted file mode 100644
index 9bdf65b..0000000
--- a/components/ui/button.jsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import * as React from "react"
-import { Slot } from "@radix-ui/react-slot"
-import { cva } from "class-variance-authority";
-
-import { cn } from "@/lib/utils"
-
-const buttonVariants = cva(
- "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
- {
- variants: {
- variant: {
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
- destructive:
- "bg-destructive text-destructive-foreground hover:bg-destructive/90",
- outline:
- "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
- secondary:
- "bg-secondary text-secondary-foreground hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
- link: "text-primary underline-offset-4 hover:underline",
- },
- size: {
- default: "h-10 px-4 py-2",
- sm: "h-9 rounded-md px-3",
- lg: "h-11 rounded-md px-8",
- icon: "h-10 w-10",
- },
- },
- defaultVariants: {
- variant: "default",
- size: "default",
- },
- }
-)
-
-const Button = React.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {
- const Comp = asChild ? Slot : "button"
- return (
- ( )
- );
-})
-Button.displayName = "Button"
-
-export { Button, buttonVariants }
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
new file mode 100644
index 0000000..65d4fcd
--- /dev/null
+++ b/components/ui/button.tsx
@@ -0,0 +1,57 @@
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary-foreground shadow hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2",
+ sm: "h-8 rounded-md px-3 text-xs",
+ lg: "h-10 rounded-md px-8",
+ icon: "h-9 w-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ }
+)
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes,
+ VariantProps {
+ asChild?: boolean
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : "button"
+ return (
+
+ )
+ }
+)
+Button.displayName = "Button"
+
+export { Button, buttonVariants }
diff --git a/components/ui/card.tsx b/components/ui/card.tsx
new file mode 100644
index 0000000..cabfbfc
--- /dev/null
+++ b/components/ui/card.tsx
@@ -0,0 +1,76 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+Card.displayName = "Card"
+
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardHeader.displayName = "CardHeader"
+
+const CardTitle = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardTitle.displayName = "CardTitle"
+
+const CardDescription = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardDescription.displayName = "CardDescription"
+
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardContent.displayName = "CardContent"
+
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+CardFooter.displayName = "CardFooter"
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/components/ui/cards.jsx b/components/ui/cards.jsx
deleted file mode 100644
index 06cc59d..0000000
--- a/components/ui/cards.jsx
+++ /dev/null
@@ -1,94 +0,0 @@
-"use client";
-
-import { useState } from "react";
-import Image from "next/image";
-import { motion } from "framer-motion";
-import { ArrowRightIcon } from "@radix-ui/react-icons";
-import { Tilt } from "react-tilt";
-
-const SponsorCard = ({ index, sponsor, category, sponsorimgsrc, site }) => {
- const [isHovered, setIsHovered] = useState(false);
- const defaultOptions = {
- reverse: false,
- max: 4,
- perspective: 1000,
- scale: 1.02,
- speed: 200,
- transition: true,
- axis: null,
- reset: true,
- easing: "cubic-bezier(0.175, 0.885, 0.32, 1.275)",
- };
-
- const defaultGradient =
- "radial-gradient(100% at center, #363636 100%, #1A1A1A 27%)";
- const hoverGradient =
- "radial-gradient(371.89% 134.33% at 3.21% 1.26%,rgba(255, 255, 255, 0.07) 0%,rgba(217, 217, 217, 0.00) 100%)";
-
- return (
- <>
-
-
-
- {
- e.currentTarget.style.background = "var(--hover-gradient)";
- setIsHovered(true);
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.background = "var(--default-gradient)";
- setIsHovered(false);
- }}
- >
-
-
-
-
{sponsor}
-
- {category}
-
-
-
-
-
-
-
-
- >
- );
-};
-
-export default SponsorCard;
diff --git a/components/ui/checkbox.tsx b/components/ui/checkbox.tsx
new file mode 100644
index 0000000..c6fdd07
--- /dev/null
+++ b/components/ui/checkbox.tsx
@@ -0,0 +1,30 @@
+"use client"
+
+import * as React from "react"
+import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
+import { Check } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Checkbox = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+))
+Checkbox.displayName = CheckboxPrimitive.Root.displayName
+
+export { Checkbox }
diff --git a/components/ui/collapsible.tsx b/components/ui/collapsible.tsx
new file mode 100644
index 0000000..9fa4894
--- /dev/null
+++ b/components/ui/collapsible.tsx
@@ -0,0 +1,11 @@
+"use client"
+
+import * as CollapsiblePrimitive from "@radix-ui/react-collapsible"
+
+const Collapsible = CollapsiblePrimitive.Root
+
+const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger
+
+const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent
+
+export { Collapsible, CollapsibleTrigger, CollapsibleContent }
diff --git a/components/ui/context-menu.tsx b/components/ui/context-menu.tsx
new file mode 100644
index 0000000..1306dd2
--- /dev/null
+++ b/components/ui/context-menu.tsx
@@ -0,0 +1,200 @@
+"use client"
+
+import * as React from "react"
+import * as ContextMenuPrimitive from "@radix-ui/react-context-menu"
+import { Check, ChevronRight, Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const ContextMenu = ContextMenuPrimitive.Root
+
+const ContextMenuTrigger = ContextMenuPrimitive.Trigger
+
+const ContextMenuGroup = ContextMenuPrimitive.Group
+
+const ContextMenuPortal = ContextMenuPrimitive.Portal
+
+const ContextMenuSub = ContextMenuPrimitive.Sub
+
+const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup
+
+const ContextMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName
+
+const ContextMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName
+
+const ContextMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName
+
+const ContextMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName
+
+const ContextMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+ContextMenuCheckboxItem.displayName =
+ ContextMenuPrimitive.CheckboxItem.displayName
+
+const ContextMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName
+
+const ContextMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName
+
+const ContextMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName
+
+const ContextMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+ContextMenuShortcut.displayName = "ContextMenuShortcut"
+
+export {
+ ContextMenu,
+ ContextMenuTrigger,
+ ContextMenuContent,
+ ContextMenuItem,
+ ContextMenuCheckboxItem,
+ ContextMenuRadioItem,
+ ContextMenuLabel,
+ ContextMenuSeparator,
+ ContextMenuShortcut,
+ ContextMenuGroup,
+ ContextMenuPortal,
+ ContextMenuSub,
+ ContextMenuSubContent,
+ ContextMenuSubTrigger,
+ ContextMenuRadioGroup,
+}
diff --git a/components/ui/dialog.jsx b/components/ui/dialog.jsx
deleted file mode 100644
index 85a2acc..0000000
--- a/components/ui/dialog.jsx
+++ /dev/null
@@ -1,106 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as DialogPrimitive from "@radix-ui/react-dialog";
-import { X } from "lucide-react";
-
-import { cn } from "@/lib/utils";
-
-const Dialog = DialogPrimitive.Root;
-
-const DialogTrigger = DialogPrimitive.Trigger;
-
-const DialogPortal = DialogPrimitive.Portal;
-
-const DialogClose = DialogPrimitive.Close;
-
-const DialogOverlay = React.forwardRef(({ className, ...props }, ref) => (
-
-));
-DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
-
-const DialogContent = React.forwardRef(
- ({ className, children, ...props }, ref) => (
-
-
-
- {children}
-
-
- Close
-
-
-
- )
-);
-DialogContent.displayName = DialogPrimitive.Content.displayName;
-
-const DialogHeader = ({ className, ...props }) => (
-
-);
-DialogHeader.displayName = "DialogHeader";
-
-const DialogFooter = ({ className, ...props }) => (
-
-);
-DialogFooter.displayName = "DialogFooter";
-
-const DialogTitle = React.forwardRef(({ className, ...props }, ref) => (
-
-));
-DialogTitle.displayName = DialogPrimitive.Title.displayName;
-
-const DialogDescription = React.forwardRef(({ className, ...props }, ref) => (
-
-));
-DialogDescription.displayName = DialogPrimitive.Description.displayName;
-
-export {
- Dialog,
- DialogPortal,
- DialogOverlay,
- DialogClose,
- DialogTrigger,
- DialogContent,
- DialogHeader,
- DialogFooter,
- DialogTitle,
- DialogDescription,
-};
diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx
new file mode 100644
index 0000000..1647513
--- /dev/null
+++ b/components/ui/dialog.tsx
@@ -0,0 +1,122 @@
+"use client"
+
+import * as React from "react"
+import * as DialogPrimitive from "@radix-ui/react-dialog"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Dialog = DialogPrimitive.Root
+
+const DialogTrigger = DialogPrimitive.Trigger
+
+const DialogPortal = DialogPrimitive.Portal
+
+const DialogClose = DialogPrimitive.Close
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+))
+DialogContent.displayName = DialogPrimitive.Content.displayName
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogHeader.displayName = "DialogHeader"
+
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+DialogFooter.displayName = "DialogFooter"
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogTitle.displayName = DialogPrimitive.Title.displayName
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DialogDescription.displayName = DialogPrimitive.Description.displayName
+
+export {
+ Dialog,
+ DialogPortal,
+ DialogOverlay,
+ DialogTrigger,
+ DialogClose,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription,
+}
diff --git a/components/ui/dropdown-menu.tsx b/components/ui/dropdown-menu.tsx
new file mode 100644
index 0000000..5a20503
--- /dev/null
+++ b/components/ui/dropdown-menu.tsx
@@ -0,0 +1,201 @@
+"use client"
+
+import * as React from "react"
+import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
+import { Check, ChevronRight, Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const DropdownMenu = DropdownMenuPrimitive.Root
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+DropdownMenuSubTrigger.displayName =
+ DropdownMenuPrimitive.SubTrigger.displayName
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSubContent.displayName =
+ DropdownMenuPrimitive.SubContent.displayName
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+ svg]:size-4 [&>svg]:shrink-0",
+ inset && "pl-8",
+ className
+ )}
+ {...props}
+ />
+))
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName
+
+const DropdownMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+DropdownMenuShortcut.displayName = "DropdownMenuShortcut"
+
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuRadioGroup,
+}
diff --git a/components/ui/form.tsx b/components/ui/form.tsx
new file mode 100644
index 0000000..ad1ae02
--- /dev/null
+++ b/components/ui/form.tsx
@@ -0,0 +1,178 @@
+"use client"
+
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { Slot } from "@radix-ui/react-slot"
+import {
+ Controller,
+ FormProvider,
+ useFormContext,
+ type ControllerProps,
+ type FieldPath,
+ type FieldValues,
+} from "react-hook-form"
+
+import { cn } from "@/lib/utils"
+import { Label } from "@/components/ui/label"
+
+const Form = FormProvider
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+> = {
+ name: TName
+}
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue
+)
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ )
+}
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext)
+ const itemContext = React.useContext(FormItemContext)
+ const { getFieldState, formState } = useFormContext()
+
+ const fieldState = getFieldState(fieldContext.name, formState)
+
+ if (!fieldContext) {
+ throw new Error("useFormField should be used within ")
+ }
+
+ const { id } = itemContext
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState,
+ }
+}
+
+type FormItemContextValue = {
+ id: string
+}
+
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue
+)
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId()
+
+ return (
+
+
+
+ )
+})
+FormItem.displayName = "FormItem"
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField()
+
+ return (
+
+ )
+})
+FormLabel.displayName = "FormLabel"
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField()
+
+ return (
+
+ )
+})
+FormControl.displayName = "FormControl"
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField()
+
+ return (
+
+ )
+})
+FormDescription.displayName = "FormDescription"
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField()
+ const body = error ? String(error?.message ?? "") : children
+
+ if (!body) {
+ return null
+ }
+
+ return (
+
+ {body}
+
+ )
+})
+FormMessage.displayName = "FormMessage"
+
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField,
+}
diff --git a/components/ui/hover-card.tsx b/components/ui/hover-card.tsx
new file mode 100644
index 0000000..74efa6b
--- /dev/null
+++ b/components/ui/hover-card.tsx
@@ -0,0 +1,29 @@
+"use client"
+
+import * as React from "react"
+import * as HoverCardPrimitive from "@radix-ui/react-hover-card"
+
+import { cn } from "@/lib/utils"
+
+const HoverCard = HoverCardPrimitive.Root
+
+const HoverCardTrigger = HoverCardPrimitive.Trigger
+
+const HoverCardContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+))
+HoverCardContent.displayName = HoverCardPrimitive.Content.displayName
+
+export { HoverCard, HoverCardTrigger, HoverCardContent }
diff --git a/components/ui/input.tsx b/components/ui/input.tsx
new file mode 100644
index 0000000..69b64fb
--- /dev/null
+++ b/components/ui/input.tsx
@@ -0,0 +1,22 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Input = React.forwardRef>(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ )
+ }
+)
+Input.displayName = "Input"
+
+export { Input }
diff --git a/components/ui/label.tsx b/components/ui/label.tsx
new file mode 100644
index 0000000..5341821
--- /dev/null
+++ b/components/ui/label.tsx
@@ -0,0 +1,26 @@
+"use client"
+
+import * as React from "react"
+import * as LabelPrimitive from "@radix-ui/react-label"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const labelVariants = cva(
+ "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
+)
+
+const Label = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, ...props }, ref) => (
+
+))
+Label.displayName = LabelPrimitive.Root.displayName
+
+export { Label }
diff --git a/components/ui/magic-card.tsx b/components/ui/magic-card.tsx
new file mode 100644
index 0000000..83ca7df
--- /dev/null
+++ b/components/ui/magic-card.tsx
@@ -0,0 +1,105 @@
+"use client"
+
+import { motion, useMotionTemplate, useMotionValue } from "motion/react"
+import React, { useCallback, useEffect, useRef } from "react"
+
+import { cn } from "@/lib/utils"
+
+interface MagicCardProps extends React.HTMLAttributes {
+ gradientSize?: number
+ gradientColor?: string
+ gradientOpacity?: number
+ gradientFrom?: string
+ gradientTo?: string
+}
+
+export function MagicCard({
+ children,
+ className,
+ gradientSize = 200,
+ gradientColor = "#262626",
+ gradientOpacity = 0.8,
+ gradientFrom = "#9E7AFF",
+ gradientTo = "#FE8BBB",
+}: MagicCardProps) {
+ const cardRef = useRef(null)
+ const mouseX = useMotionValue(-gradientSize)
+ const mouseY = useMotionValue(-gradientSize)
+
+ const handleMouseMove = useCallback(
+ (e: MouseEvent) => {
+ if (cardRef.current) {
+ const { left, top } = cardRef.current.getBoundingClientRect()
+ const clientX = e.clientX
+ const clientY = e.clientY
+ mouseX.set(clientX - left)
+ mouseY.set(clientY - top)
+ }
+ },
+ [mouseX, mouseY]
+ )
+
+ const handleMouseOut = useCallback(
+ (e: MouseEvent) => {
+ if (!e.relatedTarget) {
+ document.removeEventListener("mousemove", handleMouseMove)
+ mouseX.set(-gradientSize)
+ mouseY.set(-gradientSize)
+ }
+ },
+ [handleMouseMove, mouseX, gradientSize, mouseY]
+ )
+
+ const handleMouseEnter = useCallback(() => {
+ document.addEventListener("mousemove", handleMouseMove)
+ mouseX.set(-gradientSize)
+ mouseY.set(-gradientSize)
+ }, [handleMouseMove, mouseX, gradientSize, mouseY])
+
+ useEffect(() => {
+ document.addEventListener("mousemove", handleMouseMove)
+ document.addEventListener("mouseout", handleMouseOut)
+ document.addEventListener("mouseenter", handleMouseEnter)
+ return () => {
+ document.removeEventListener("mousemove", handleMouseMove)
+ document.removeEventListener("mouseout", handleMouseOut)
+ document.removeEventListener("mouseenter", handleMouseEnter)
+ }
+ }, [handleMouseEnter, handleMouseMove, handleMouseOut])
+
+ useEffect(() => {
+ mouseX.set(-gradientSize)
+ mouseY.set(-gradientSize)
+ }, [gradientSize, mouseX, mouseY])
+
+ return (
+
+ )
+}
diff --git a/components/ui/menubar.tsx b/components/ui/menubar.tsx
new file mode 100644
index 0000000..e364e46
--- /dev/null
+++ b/components/ui/menubar.tsx
@@ -0,0 +1,256 @@
+"use client"
+
+import * as React from "react"
+import * as MenubarPrimitive from "@radix-ui/react-menubar"
+import { Check, ChevronRight, Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+function MenubarMenu({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function MenubarGroup({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function MenubarPortal({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function MenubarRadioGroup({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function MenubarSub({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+const Menubar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+Menubar.displayName = MenubarPrimitive.Root.displayName
+
+const MenubarTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName
+
+const MenubarSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName
+
+const MenubarSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName
+
+const MenubarContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
+ ref
+ ) => (
+
+
+
+ )
+)
+MenubarContent.displayName = MenubarPrimitive.Content.displayName
+
+const MenubarItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+MenubarItem.displayName = MenubarPrimitive.Item.displayName
+
+const MenubarCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName
+
+const MenubarRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName
+
+const MenubarLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean
+ }
+>(({ className, inset, ...props }, ref) => (
+
+))
+MenubarLabel.displayName = MenubarPrimitive.Label.displayName
+
+const MenubarSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName
+
+const MenubarShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ )
+}
+MenubarShortcut.displayname = "MenubarShortcut"
+
+export {
+ Menubar,
+ MenubarMenu,
+ MenubarTrigger,
+ MenubarContent,
+ MenubarItem,
+ MenubarSeparator,
+ MenubarLabel,
+ MenubarCheckboxItem,
+ MenubarRadioGroup,
+ MenubarRadioItem,
+ MenubarPortal,
+ MenubarSubContent,
+ MenubarSubTrigger,
+ MenubarGroup,
+ MenubarSub,
+ MenubarShortcut,
+}
diff --git a/components/ui/navigation-menu.tsx b/components/ui/navigation-menu.tsx
new file mode 100644
index 0000000..056354b
--- /dev/null
+++ b/components/ui/navigation-menu.tsx
@@ -0,0 +1,128 @@
+import * as React from "react"
+import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu"
+import { cva } from "class-variance-authority"
+import { ChevronDown } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const NavigationMenu = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}
+
+
+))
+NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName
+
+const NavigationMenuList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName
+
+const NavigationMenuItem = NavigationMenuPrimitive.Item
+
+const navigationMenuTriggerStyle = cva(
+ "group inline-flex h-9 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:bg-accent/50 data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent"
+)
+
+const NavigationMenuTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+ {children}{" "}
+
+
+))
+NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName
+
+const NavigationMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName
+
+const NavigationMenuLink = NavigationMenuPrimitive.Link
+
+const NavigationMenuViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+NavigationMenuViewport.displayName =
+ NavigationMenuPrimitive.Viewport.displayName
+
+const NavigationMenuIndicator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+NavigationMenuIndicator.displayName =
+ NavigationMenuPrimitive.Indicator.displayName
+
+export {
+ navigationMenuTriggerStyle,
+ NavigationMenu,
+ NavigationMenuList,
+ NavigationMenuItem,
+ NavigationMenuContent,
+ NavigationMenuTrigger,
+ NavigationMenuLink,
+ NavigationMenuIndicator,
+ NavigationMenuViewport,
+}
diff --git a/components/ui/pagination.tsx b/components/ui/pagination.tsx
new file mode 100644
index 0000000..d331105
--- /dev/null
+++ b/components/ui/pagination.tsx
@@ -0,0 +1,117 @@
+import * as React from "react"
+import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import { ButtonProps, buttonVariants } from "@/components/ui/button"
+
+const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (
+
+)
+Pagination.displayName = "Pagination"
+
+const PaginationContent = React.forwardRef<
+ HTMLUListElement,
+ React.ComponentProps<"ul">
+>(({ className, ...props }, ref) => (
+
+))
+PaginationContent.displayName = "PaginationContent"
+
+const PaginationItem = React.forwardRef<
+ HTMLLIElement,
+ React.ComponentProps<"li">
+>(({ className, ...props }, ref) => (
+
+))
+PaginationItem.displayName = "PaginationItem"
+
+type PaginationLinkProps = {
+ isActive?: boolean
+} & Pick &
+ React.ComponentProps<"a">
+
+const PaginationLink = ({
+ className,
+ isActive,
+ size = "icon",
+ ...props
+}: PaginationLinkProps) => (
+
+)
+PaginationLink.displayName = "PaginationLink"
+
+const PaginationPrevious = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+
+ Previous
+
+)
+PaginationPrevious.displayName = "PaginationPrevious"
+
+const PaginationNext = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+ Next
+
+
+)
+PaginationNext.displayName = "PaginationNext"
+
+const PaginationEllipsis = ({
+ className,
+ ...props
+}: React.ComponentProps<"span">) => (
+
+
+ More pages
+
+)
+PaginationEllipsis.displayName = "PaginationEllipsis"
+
+export {
+ Pagination,
+ PaginationContent,
+ PaginationLink,
+ PaginationItem,
+ PaginationPrevious,
+ PaginationNext,
+ PaginationEllipsis,
+}
diff --git a/components/ui/popover.tsx b/components/ui/popover.tsx
new file mode 100644
index 0000000..70a28f6
--- /dev/null
+++ b/components/ui/popover.tsx
@@ -0,0 +1,33 @@
+"use client"
+
+import * as React from "react"
+import * as PopoverPrimitive from "@radix-ui/react-popover"
+
+import { cn } from "@/lib/utils"
+
+const Popover = PopoverPrimitive.Root
+
+const PopoverTrigger = PopoverPrimitive.Trigger
+
+const PopoverAnchor = PopoverPrimitive.Anchor
+
+const PopoverContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+PopoverContent.displayName = PopoverPrimitive.Content.displayName
+
+export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }
diff --git a/components/ui/progress.tsx b/components/ui/progress.tsx
new file mode 100644
index 0000000..4fc3b47
--- /dev/null
+++ b/components/ui/progress.tsx
@@ -0,0 +1,28 @@
+"use client"
+
+import * as React from "react"
+import * as ProgressPrimitive from "@radix-ui/react-progress"
+
+import { cn } from "@/lib/utils"
+
+const Progress = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, value, ...props }, ref) => (
+
+
+
+))
+Progress.displayName = ProgressPrimitive.Root.displayName
+
+export { Progress }
diff --git a/components/ui/radio-group.tsx b/components/ui/radio-group.tsx
new file mode 100644
index 0000000..0bdf685
--- /dev/null
+++ b/components/ui/radio-group.tsx
@@ -0,0 +1,44 @@
+"use client"
+
+import * as React from "react"
+import * as RadioGroupPrimitive from "@radix-ui/react-radio-group"
+import { Circle } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const RadioGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return (
+
+ )
+})
+RadioGroup.displayName = RadioGroupPrimitive.Root.displayName
+
+const RadioGroupItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return (
+
+
+
+
+
+ )
+})
+RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName
+
+export { RadioGroup, RadioGroupItem }
diff --git a/components/ui/scroll-area.jsx b/components/ui/scroll-area.jsx
deleted file mode 100644
index d133630..0000000
--- a/components/ui/scroll-area.jsx
+++ /dev/null
@@ -1,46 +0,0 @@
-"use client";
-
-import * as React from "react";
-import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
-
-import { cn } from "@/lib/utils";
-
-const ScrollArea = React.forwardRef(
- ({ className, children, ...props }, ref) => (
-
-
- {children}
-
-
-
-
- )
-);
-ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
-
-const ScrollBar = React.forwardRef(
- ({ className, orientation = "vertical", ...props }, ref) => (
-
-
-
- )
-);
-ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
-
-export { ScrollArea, ScrollBar };
diff --git a/components/ui/scroll-area.tsx b/components/ui/scroll-area.tsx
new file mode 100644
index 0000000..0b4a48d
--- /dev/null
+++ b/components/ui/scroll-area.tsx
@@ -0,0 +1,48 @@
+"use client"
+
+import * as React from "react"
+import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
+
+import { cn } from "@/lib/utils"
+
+const ScrollArea = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+ {children}
+
+
+
+
+))
+ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
+
+const ScrollBar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, orientation = "vertical", ...props }, ref) => (
+
+
+
+))
+ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
+
+export { ScrollArea, ScrollBar }
diff --git a/components/ui/select.tsx b/components/ui/select.tsx
new file mode 100644
index 0000000..6e637f7
--- /dev/null
+++ b/components/ui/select.tsx
@@ -0,0 +1,159 @@
+"use client"
+
+import * as React from "react"
+import * as SelectPrimitive from "@radix-ui/react-select"
+import { Check, ChevronDown, ChevronUp } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Select = SelectPrimitive.Root
+
+const SelectGroup = SelectPrimitive.Group
+
+const SelectValue = SelectPrimitive.Value
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1",
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+))
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = "popper", ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+))
+SelectContent.displayName = SelectPrimitive.Content.displayName
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SelectLabel.displayName = SelectPrimitive.Label.displayName
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+))
+SelectItem.displayName = SelectPrimitive.Item.displayName
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName
+
+export {
+ Select,
+ SelectGroup,
+ SelectValue,
+ SelectTrigger,
+ SelectContent,
+ SelectLabel,
+ SelectItem,
+ SelectSeparator,
+ SelectScrollUpButton,
+ SelectScrollDownButton,
+}
diff --git a/components/ui/separator.tsx b/components/ui/separator.tsx
new file mode 100644
index 0000000..12d81c4
--- /dev/null
+++ b/components/ui/separator.tsx
@@ -0,0 +1,31 @@
+"use client"
+
+import * as React from "react"
+import * as SeparatorPrimitive from "@radix-ui/react-separator"
+
+import { cn } from "@/lib/utils"
+
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, orientation = "horizontal", decorative = true, ...props },
+ ref
+ ) => (
+
+ )
+)
+Separator.displayName = SeparatorPrimitive.Root.displayName
+
+export { Separator }
diff --git a/components/ui/sheet.tsx b/components/ui/sheet.tsx
new file mode 100644
index 0000000..272cb72
--- /dev/null
+++ b/components/ui/sheet.tsx
@@ -0,0 +1,140 @@
+"use client"
+
+import * as React from "react"
+import * as SheetPrimitive from "@radix-ui/react-dialog"
+import { cva, type VariantProps } from "class-variance-authority"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const Sheet = SheetPrimitive.Root
+
+const SheetTrigger = SheetPrimitive.Trigger
+
+const SheetClose = SheetPrimitive.Close
+
+const SheetPortal = SheetPrimitive.Portal
+
+const SheetOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetOverlay.displayName = SheetPrimitive.Overlay.displayName
+
+const sheetVariants = cva(
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out",
+ {
+ variants: {
+ side: {
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
+ bottom:
+ "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
+ right:
+ "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
+ },
+ },
+ defaultVariants: {
+ side: "right",
+ },
+ }
+)
+
+interface SheetContentProps
+ extends React.ComponentPropsWithoutRef,
+ VariantProps {}
+
+const SheetContent = React.forwardRef<
+ React.ElementRef,
+ SheetContentProps
+>(({ side = "right", className, children, ...props }, ref) => (
+
+
+
+
+
+ Close
+
+ {children}
+
+
+))
+SheetContent.displayName = SheetPrimitive.Content.displayName
+
+const SheetHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+SheetHeader.displayName = "SheetHeader"
+
+const SheetFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+)
+SheetFooter.displayName = "SheetFooter"
+
+const SheetTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetTitle.displayName = SheetPrimitive.Title.displayName
+
+const SheetDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+SheetDescription.displayName = SheetPrimitive.Description.displayName
+
+export {
+ Sheet,
+ SheetPortal,
+ SheetOverlay,
+ SheetTrigger,
+ SheetClose,
+ SheetContent,
+ SheetHeader,
+ SheetFooter,
+ SheetTitle,
+ SheetDescription,
+}
diff --git a/components/ui/skeleton.tsx b/components/ui/skeleton.tsx
new file mode 100644
index 0000000..d7e45f7
--- /dev/null
+++ b/components/ui/skeleton.tsx
@@ -0,0 +1,15 @@
+import { cn } from "@/lib/utils"
+
+function Skeleton({
+ className,
+ ...props
+}: React.HTMLAttributes) {
+ return (
+
+ )
+}
+
+export { Skeleton }
diff --git a/components/ui/slider.tsx b/components/ui/slider.tsx
new file mode 100644
index 0000000..ab19d57
--- /dev/null
+++ b/components/ui/slider.tsx
@@ -0,0 +1,28 @@
+"use client"
+
+import * as React from "react"
+import * as SliderPrimitive from "@radix-ui/react-slider"
+
+import { cn } from "@/lib/utils"
+
+const Slider = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+
+))
+Slider.displayName = SliderPrimitive.Root.displayName
+
+export { Slider }
diff --git a/components/ui/switch.tsx b/components/ui/switch.tsx
new file mode 100644
index 0000000..5f4117f
--- /dev/null
+++ b/components/ui/switch.tsx
@@ -0,0 +1,29 @@
+"use client"
+
+import * as React from "react"
+import * as SwitchPrimitives from "@radix-ui/react-switch"
+
+import { cn } from "@/lib/utils"
+
+const Switch = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+Switch.displayName = SwitchPrimitives.Root.displayName
+
+export { Switch }
diff --git a/components/ui/table.jsx b/components/ui/table.jsx
deleted file mode 100644
index 31b58ed..0000000
--- a/components/ui/table.jsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import * as React from "react"
-
-import { cn } from "@/lib/utils"
-
-const Table = React.forwardRef(({ className, ...props }, ref) => (
-
-))
-Table.displayName = "Table"
-
-const TableHeader = React.forwardRef(({ className, ...props }, ref) => (
-
-))
-TableHeader.displayName = "TableHeader"
-
-const TableBody = React.forwardRef(({ className, ...props }, ref) => (
-
-))
-TableBody.displayName = "TableBody"
-
-const TableFooter = React.forwardRef(({ className, ...props }, ref) => (
- tr]:last:border-b-0", className)}
- {...props} />
-))
-TableFooter.displayName = "TableFooter"
-
-const TableRow = React.forwardRef(({ className, ...props }, ref) => (
-
-))
-TableRow.displayName = "TableRow"
-
-const TableHead = React.forwardRef(({ className, ...props }, ref) => (
-
-))
-TableHead.displayName = "TableHead"
-
-const TableCell = React.forwardRef(({ className, ...props }, ref) => (
-
-))
-TableCell.displayName = "TableCell"
-
-const TableCaption = React.forwardRef(({ className, ...props }, ref) => (
-
-))
-TableCaption.displayName = "TableCaption"
-
-export {
- Table,
- TableHeader,
- TableBody,
- TableFooter,
- TableHead,
- TableRow,
- TableCell,
- TableCaption,
-}
diff --git a/components/ui/table.tsx b/components/ui/table.tsx
new file mode 100644
index 0000000..c0df655
--- /dev/null
+++ b/components/ui/table.tsx
@@ -0,0 +1,120 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+const Table = React.forwardRef<
+ HTMLTableElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+Table.displayName = "Table"
+
+const TableHeader = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+TableHeader.displayName = "TableHeader"
+
+const TableBody = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+TableBody.displayName = "TableBody"
+
+const TableFooter = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+ tr]:last:border-b-0",
+ className
+ )}
+ {...props}
+ />
+))
+TableFooter.displayName = "TableFooter"
+
+const TableRow = React.forwardRef<
+ HTMLTableRowElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+))
+TableRow.displayName = "TableRow"
+
+const TableHead = React.forwardRef<
+ HTMLTableCellElement,
+ React.ThHTMLAttributes
+>(({ className, ...props }, ref) => (
+