diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..7a282ac --- /dev/null +++ b/.prettierignore @@ -0,0 +1,7 @@ +/.vscode +/node_modules +./dist + +*.env +.env +.env.* \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..b4f6bfd --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "singleQuote": false, + "bracketSpacing": true, + "tabWidth": 2, + "trailingComma": "es5", + "semi": true +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 15f41e9..83fed32 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,6 @@ "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }, - "editor.wordWrap": "on" + "editor.wordWrap": "on", + "postman.settings.dotenv-detection-notification-visibility": false } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..f7b9c59 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,95 @@ +# Contributing Guidelines + +Thank you for your interest in contributing to this project! We welcome contributions from the community. Please read the following guidelines to help us maintain a high standard and streamline the contribution process. + +## How to Contribute + +1. **Fork the Repository** + + - Click the 'Fork' button at the top right of this repository page to create your own copy. + +2. **Clone Your Fork** + + - Clone your forked repository to your local machine: + ```bash + git clone https://github.com//ElixirV3.git + cd ElixirV3 + ``` + +3. **Create a New Branch** + + - Create a branch for your feature or bugfix: + ```bash + git checkout -b + ``` + +4. **Make Your Changes** + + - Make your changes or additions. Please ensure your code follows the existing style and conventions. + +5. **Test Your Changes** + + - Run the application and ensure your changes work as expected and do not break existing functionality. + +6. **Commit Your Changes** + + - Use clear and descriptive commit messages. Follow the commit message format below. + +7. **Push to Your Fork** + + - Push your branch to your forked repository: + ```bash + git push origin + ``` + +8. **Open a Pull Request** + - Go to the original repository and open a pull request. Provide a clear description of your changes and reference any related issues. + +## Commit Message Format + +``` + | (): +``` + +### Examples + +``` +GFG | feat(event): new card designs +GFG | fix(event): api request improve +GFG | chore(event): title copy change +GFG | refactor(event): mentor's search logic + +ELX | feat(event): new card designs +GDG | fix(event): api request improve +CC | chore(event): title copy change +``` + +- ``: Team code. If you are a member of one of the Elixir clubs, use your club's code: + + - `GFG` for GeeksforGeeks ABESEC + - `GDG` for Google Developer Group ABESEC + - `CC` for CodeChef ABESEC + - `ELX` for external contributers + +- ``: Type of change (feat, fix, chore, refactor, etc.) +- ``: Area affected (e.g., event) +- ``: Short summary of the change + +## Code Style & Standards + +- Follow the existing code style and formatting. +- Write clear, concise, and well-documented code. +- Add comments where necessary, especially for complex logic. +- Write tests for new features or bug fixes if applicable. + +## Community Standards + +- Be respectful and inclusive in all interactions. +- Provide constructive feedback in code reviews. +- Report issues or bugs using the issue tracker. + +## Need Help? + +If you have any questions or need guidance, feel free to open an issue or reach out to the maintainers. + +Thank you for contributing! diff --git a/app/dashboard/admin/page.tsx b/app/dashboard/admin/page.tsx new file mode 100644 index 0000000..93d8ea4 --- /dev/null +++ b/app/dashboard/admin/page.tsx @@ -0,0 +1,254 @@ +"use client"; +import { useState } from "react"; +import { AnimatePresence } from "framer-motion"; +import WelcomeSection from "../components/WelcomeSection"; +import ManagementSection from "../components/ManagementSection"; +import Modal from "../components/Modal"; +import StatsCards from "../components/StatsCards"; +import { ColorScheme } from "../types"; + +// Mock Data +const mockStudents = [ + { + id: 1, + name: "Vaibhav Tripathi", + email: "vxtr@abes.ac.in", + role: "Student", + joinDate: "2024-01-15", + }, + { + id: 2, + name: "Akash Chaudhary", + email: "akash@abes.ac.in", + role: "Student", + joinDate: "2024-02-01", + }, + { + id: 3, + name: "Shreyash Singh", + email: "shreyash@abes.ac.in", + role: "Club Head", + joinDate: "2024-01-20", + }, +]; + +const mockMentors = [ + { + id: 1, + name: "Dewank Rastogi", + expertise: "Frontend", + achievements: "3+ years experience", + status: "Active", + }, + { + id: 2, + name: "Rudraksh Tyagi", + expertise: "Open Source", + achievements: "LFX", + status: "Active", + }, + { + id: 3, + name: "Vandit Singh", + expertise: "DevOps", + achievements: "Google Summer of Code", + status: "Active", + }, +]; + +const mockEvents = [ + { + id: 1, + name: "Binary Vault", + club: "GFG_ABESEC", + date: "2024-03-15", + participants: 450, + }, + { + id: 2, + name: "Hackhaven", + club: "GDG_ABESEC", + date: "2024-03-20", + participants: 320, + }, + { + id: 3, + name: "Some Event", + club: "CodeChef_ABESEC", + date: "2024-03-25", + participants: 280, + }, +]; + +const mockBlogs = [ + { + id: 1, + title: "Future of AI", + author: "Priya Kumari", + status: "Pending", + date: "2024-03-10", + }, + { + id: 2, + title: "Web Development Trends", + author: "Radhika Chauhan", + status: "Approved", + date: "2024-03-08", + }, + { + id: 3, + title: "Cloud Computing Basics", + author: "Granth Agarwal", + status: "Pending", + date: "2024-03-09", + }, +]; + +const AdminDashboard = () => { + const [activeModal, setActiveModal] = useState(null); + const [selectedItem, setSelectedItem] = useState(null); + + const openModal = (modalType: string, item?: any) => { + setActiveModal(modalType); + if (item) setSelectedItem(item); + }; + + const closeModal = () => { + setActiveModal(null); + setSelectedItem(null); + }; + + const adminStats = [ + { + heading: "1.2k", + subheading: "Total Students", + description: "+120 this month", + colorScheme: "purple" as ColorScheme, + }, + { + heading: "45", + subheading: "Upcoming Events", + description: "Next: 3 days", + colorScheme: "blue" as ColorScheme, + }, + { + heading: "8", + subheading: "Blog Submissions", + description: "3 pending approval", + colorScheme: "green" as ColorScheme, + }, + { + heading: "24", + subheading: "Mentors", + description: "5 new additions", + colorScheme: "orange" as ColorScheme, + }, + ]; + + const renderModalContent = () => { + if (!selectedItem) return null; + return ( +
+ + + {Object.entries(selectedItem).map(([key, value]) => ( + + + + + ))} + +
+ {key} + {String(value)}
+
+ ); + }; + + return ( + <> +
+ + +
+ {adminStats.map((stat, idx) => ( + + ))} +
+ +
+ row.name }, + { header: "Role", accessor: (row) => row.role }, + { header: "Join Date", accessor: (row) => row.joinDate }, + ]} + onViewAll={() => openModal("students")} + onRowClick={(item) => openModal("Student Details", item)} + /> + + row.name }, + { header: "Expertise", accessor: (row) => row.expertise }, + { header: "Status", accessor: (row) => row.status }, + ]} + onViewAll={() => openModal("mentors")} + onRowClick={(item) => openModal("Mentor Details", item)} + /> + + row.name }, + { header: "Club", accessor: (row) => row.club }, + { header: "Date", accessor: (row) => row.date }, + ]} + onViewAll={() => openModal("events")} + onRowClick={(item) => openModal("Event Details", item)} + /> + + row.title }, + { header: "Author", accessor: (row) => row.author }, + { header: "Status", accessor: (row) => row.status }, + ]} + onViewAll={() => openModal("blogs")} + onRowClick={(item) => openModal("Blog Details", item)} + /> +
+
+ + + {activeModal && ( + + {renderModalContent()} + + )} + + + ); +}; + +export default AdminDashboard; diff --git a/app/dashboard/components/ManagementSection.tsx b/app/dashboard/components/ManagementSection.tsx new file mode 100644 index 0000000..0d92b04 --- /dev/null +++ b/app/dashboard/components/ManagementSection.tsx @@ -0,0 +1,58 @@ +import { ManagementSectionProps, Column } from "../types"; +import { managementStyles } from "../styles"; + +interface ExtendedManagementSectionProps extends ManagementSectionProps { + onRowClick?: (row: any) => void; +} + +const ManagementSection: React.FC = ({ + title, + columns, + data = [], + onViewAll, + className = "", + onRowClick, +}) => { + return ( +
+
+

{title}

+ {onViewAll && ( + + )} +
+
+ + + + {columns.map((column: Column, index: number) => ( + + ))} + + + + {data.map((row, rowIndex) => ( + onRowClick(row) : undefined} + > + {columns.map((column: Column, colIndex: number) => ( + + ))} + + ))} + +
+ {column.header} +
+ {column.accessor(row)} +
+
+
+ ); +}; + +export default ManagementSection; diff --git a/app/dashboard/components/Modal.tsx b/app/dashboard/components/Modal.tsx new file mode 100644 index 0000000..f07cdc6 --- /dev/null +++ b/app/dashboard/components/Modal.tsx @@ -0,0 +1,52 @@ +import { useEffect } from "react"; +import { ModalProps } from "../types"; +import { modalStyles } from "../styles"; +import { motion, AnimatePresence } from "framer-motion"; + +const Modal: React.FC = ({ + isOpen, + onClose, + title, + children, + className = "", +}) => { + useEffect(() => { + const handleEscapeKey = (event: KeyboardEvent) => { + if (event.key === "Escape" && isOpen) { + onClose(); + } + }; + + document.addEventListener("keydown", handleEscapeKey); + return () => { + document.removeEventListener("keydown", handleEscapeKey); + }; + }, [isOpen, onClose]); + + return ( + + {isOpen && ( +
+ e.stopPropagation()} + > +
+

{title}

+ +
+
{children}
+
+
+ )} +
+ ); +}; + +export default Modal; diff --git a/app/dashboard/components/QuickStats.tsx b/app/dashboard/components/QuickStats.tsx new file mode 100644 index 0000000..fb4d649 --- /dev/null +++ b/app/dashboard/components/QuickStats.tsx @@ -0,0 +1,65 @@ +type StatColorScheme = "purple" | "blue" | "green" | "orange"; + +interface StatItem { + value: string; + label: string; + subtext: string; + colorScheme: StatColorScheme; +} + +interface QuickStatsProps { + stats: StatItem[]; +} + +const colorSchemes = { + purple: { + gradient: "from-purple to-blue-500", + hover: "hover:border-purple/50", + subtext: "text-purple", + }, + blue: { + gradient: "from-blue-400 to-cyan-400", + hover: "hover:border-blue-400/50", + subtext: "text-blue-400", + }, + green: { + gradient: "from-green-400 to-emerald-400", + hover: "hover:border-green-400/50", + subtext: "text-green-400", + }, + orange: { + gradient: "from-orange-400 to-red-400", + hover: "hover:border-orange-400/50", + subtext: "text-orange-400", + }, +}; + +const QuickStats: React.FC = ({ stats }) => { + return ( +
+ {stats.map((stat, index) => { + const colors = colorSchemes[stat.colorScheme]; + return ( +
+
+ + {stat.value} + + {stat.label} + + {stat.subtext} + +
+
+ ); + })} +
+ ); +}; + +export default QuickStats; diff --git a/app/dashboard/components/RecentActivity.tsx b/app/dashboard/components/RecentActivity.tsx new file mode 100644 index 0000000..4ab0f6b --- /dev/null +++ b/app/dashboard/components/RecentActivity.tsx @@ -0,0 +1,39 @@ +import { ActivityItem } from "../types"; +import { baseCardStyles } from "../styles"; + +interface RecentActivityProps { + heading: string; + activities: ActivityItem[]; + className?: string; +} + +const RecentActivity: React.FC = ({ + heading, + activities, + className = "", +}) => { + return ( +
+

{heading}

+
+ {activities.map((activity, index) => ( +
+
+ {activity.icon} +
+
+

{activity.title}

+

{activity.description}

+

{activity.time}

+
+
+ ))} +
+
+ ); +}; + +export default RecentActivity; diff --git a/app/dashboard/components/StatsCards.tsx b/app/dashboard/components/StatsCards.tsx new file mode 100644 index 0000000..ce6a00f --- /dev/null +++ b/app/dashboard/components/StatsCards.tsx @@ -0,0 +1,32 @@ +import { StatCardProps } from "../types"; +import { colorSchemes, baseCardStyles } from "../styles"; + +const StatsCards: React.FC = ({ + heading, + subheading, + description, + colorScheme, + className = "", +}) => { + const colors = colorSchemes[colorScheme]; + + return ( +
+
+ + {heading} + + {subheading} + + {description} + +
+
+ ); +}; + +export default StatsCards; diff --git a/app/dashboard/components/WelcomeCard.tsx b/app/dashboard/components/WelcomeCard.tsx new file mode 100644 index 0000000..49f0c20 --- /dev/null +++ b/app/dashboard/components/WelcomeCard.tsx @@ -0,0 +1,20 @@ +const WelcomeCard = ({ name }: { name: string }) => { + return ( + <> +
+
+
+

+ Welcome back, {name}! +

+

+ Here's what's happening today. +

+
+
+
+ + ); +}; + +export default WelcomeCard; diff --git a/app/dashboard/components/WelcomeSection.tsx b/app/dashboard/components/WelcomeSection.tsx new file mode 100644 index 0000000..a648aec --- /dev/null +++ b/app/dashboard/components/WelcomeSection.tsx @@ -0,0 +1,22 @@ +interface WelcomeSectionProps { + title: string; + description: string; +} + +const WelcomeSection: React.FC = ({ + title, + description, +}) => { + return ( +
+
+
+

{title}

+

{description}

+
+
+
+ ); +}; + +export default WelcomeSection; diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx new file mode 100644 index 0000000..aabe112 --- /dev/null +++ b/app/dashboard/page.tsx @@ -0,0 +1,62 @@ +import StatsCards from "./components/StatsCards"; +import WelcomeCard from "./components/WelcomeCard"; +import RecentActivity from "./components/RecentActivity"; + +const Dashboard = () => { + const recentActivities = [ + { + icon: 📝, + iconBg: "bg-green-400/20", + title: "Added a new note", + description: "Next.js Tips", + time: "2 hours ago", + }, + { + icon: 🎉, + iconBg: "bg-blue-400/20", + title: "Attended Event", + description: "Elixir Community Meetup", + time: "Yesterday", + }, + { + icon: 📝, + iconBg: "bg-purple/20", + title: "Created a new project", + description: "", + time: "2 days ago", + }, + ]; + + return ( + <> +
+ +
+ + + +
+ + + +
+ + ); +}; + +export default Dashboard; diff --git a/app/dashboard/styles/index.ts b/app/dashboard/styles/index.ts new file mode 100644 index 0000000..453e6d5 --- /dev/null +++ b/app/dashboard/styles/index.ts @@ -0,0 +1,60 @@ +export const colorSchemes = { + purple: { + gradient: "from-purple to-blue-500", + hover: "hover:border-purple/50", + text: "text-purple", + bg: "bg-purple/20", + }, + blue: { + gradient: "from-blue-400 to-cyan-400", + hover: "hover:border-blue-400/50", + text: "text-blue-400", + bg: "bg-blue-400/20", + }, + green: { + gradient: "from-green-400 to-emerald-400", + hover: "hover:border-green-400/50", + text: "text-green-400", + bg: "bg-green-400/20", + }, + orange: { + gradient: "from-orange-400 to-red-400", + hover: "hover:border-orange-400/50", + text: "text-orange-400", + bg: "bg-orange-400/20", + }, +}; + +export const baseCardStyles = { + container: + "rounded-xl p-6 bg-[rgba(17,25,40,0.75)] backdrop-blur-md border border-white/10 shadow transition-all duration-300", + heading: "text-4xl font-bold bg-clip-text text-transparent", + subheading: "text-white/80 mt-2 block", + description: "text-sm mt-1 block", +}; + +export const managementStyles = { + container: + "rounded-2xl p-6 bg-[rgba(17,25,40,0.80)] backdrop-blur-lg border border-white/10 shadow", + header: "flex justify-between items-center mb-6", + title: "text-xl font-semibold text-white", + viewAll: "text-sm text-blue-400 hover:text-blue-300 transition-colors", + table: { + container: "overflow-x-auto", + table: "w-full", + header: "text-left text-white/60 text-sm", + headerCell: "pb-4", + row: "cursor-pointer hover:bg-white/5 transition-colors", + cell: "py-3 text-white", + }, +}; + +export const modalStyles = { + overlay: + "fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center", + container: + "bg-[rgba(17,25,40,0.95)] border border-white/10 rounded-2xl p-6 w-full max-w-2xl mx-4", + header: "flex justify-between items-center mb-4", + title: "text-xl font-semibold text-white", + closeButton: "text-white/60 text-3xl hover:text-white", +}; diff --git a/app/dashboard/types/index.ts b/app/dashboard/types/index.ts new file mode 100644 index 0000000..fd7891e --- /dev/null +++ b/app/dashboard/types/index.ts @@ -0,0 +1,54 @@ +export type ColorScheme = "purple" | "blue" | "green" | "orange"; + +export interface BaseCardProps { + className?: string; + children: React.ReactNode; +} + +export interface StatCardProps { + heading: string; + subheading: string; + description: string; + colorScheme: ColorScheme; + className?: string; +} + +export interface ActivityItem { + icon: React.ReactNode; + iconBg: string; + title: string; + description: string; + time: string; +} + +export interface ManagementItem { + id: number; + [key: string]: any; +} + +export interface Column { + header: string; + accessor: (row: any) => React.ReactNode; +} + +export interface ManagementSectionProps { + title: string; + columns: Column[]; + data: any[]; + onViewAll?: () => void; + className?: string; +} + +export interface ModalProps { + isOpen: boolean; + onClose: () => void; + title: string; + children: React.ReactNode; + className?: string; +} + +export interface WelcomeSectionProps { + title: string; + description: string; + className?: string; +} diff --git a/app/layout.tsx b/app/layout.tsx index 43542c1..bbec3f7 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,12 +1,19 @@ import type { Metadata } from "next"; -import { Inter } from "next/font/google"; +import { DM_Sans } from "next/font/google"; import "./globals.css"; -import ClientAppLayout from "@/layouts/ClientAppLayout"; import { ThemeProvider } from "./provider"; import { Toaster } from "@/components/ui/toaster"; +import dynamic from "next/dynamic"; -const inter = Inter({ subsets: ["latin"] }); +const ServerWrapperLayout = dynamic( + () => import("@/layouts/WrapperLayout/Server/ServerWrapperLayout"), + { + ssr: true, + } +); + +const dmSans = DM_Sans({ subsets: ["latin"] }); export const metadata: Metadata = { title: { @@ -24,20 +31,24 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - + - - + + - + - - + + - {children} + {children} diff --git a/app/page.tsx b/app/page.tsx index 92eae56..61c31c6 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,29 +1,28 @@ -"use client"; import Hero from "@/components/Hero"; -import Grid from "@/components/Grid"; import Testimonials from "@/components/Testimonials"; import ChapterSection from "@/components/ChapterSection"; -import { GlobeSection } from "@/components/GlobeSection"; import Image from "next/image"; -import { motion } from "framer-motion"; -import LogoHero from "@/public/Elixir-logo.png"; -import useEventApi from "@/hooks/useEventApi"; - -const Home = () => { - useEventApi(); +import HeroLogo from "@/public/Elixir-logo.webp"; +async function Home() { return ( -
- - tect - +
+
+ Elixir Logo +
- -
); -}; +} export default Home; diff --git a/app/provider.tsx b/app/provider.tsx index b0ff266..7ff3288 100644 --- a/app/provider.tsx +++ b/app/provider.tsx @@ -2,8 +2,8 @@ import * as React from "react"; import { ThemeProvider as NextThemesProvider } from "next-themes"; -import { type ThemeProviderProps } from "next-themes/dist/types"; +import { type PropsWithChildren } from "react"; -export function ThemeProvider({ children, ...props }: ThemeProviderProps) { +export function ThemeProvider({ children, ...props }: PropsWithChildren) { return {children}; } diff --git a/components/Approach.tsx b/components/Approach.tsx deleted file mode 100644 index bdd4208..0000000 --- a/components/Approach.tsx +++ /dev/null @@ -1,197 +0,0 @@ -import React from "react"; -import { AnimatePresence, motion } from "framer-motion"; - -import { CanvasRevealEffect } from "./ui/CanvasRevealEffect"; - -const Approach = () => { - return ( -
-

- Our Core -

- {/* remove bg-white dark:bg-black */} -
- {/* add des prop */} - } - des="We'll collaborate to map out your website's goals, target audience, - and key functionalities. We'll discuss things like site structure, - navigation, and content requirements." - > - rounded-3xl overflow-hidden - containerClassName='bg-emerald-900 rounded-3xl overflow-hidden' - /> - - } - des='Once we agree on the plan, I cue my lofi playlist and dive into - coding. From initial sketches to polished code, I keep you updated - every step of the way.' - > - - {/* Radial gradient for the cute fade */} - {/* remove this one */} - {/*
*/} - - } - des="This is where the magic happens! Based on the approved design, - I'll translate everything into functional code, building your website - from the ground up." - > - - -
-
- ); -}; - -export default Approach; - -const Card = ({ - title, - icon, - children, - // add this one for the desc - des, -}: { - title: string; - icon: React.ReactNode; - children?: React.ReactNode; - des: string; -}) => { - const [hovered, setHovered] = React.useState(false); - return ( -
setHovered(true)} - onMouseLeave={() => setHovered(false)} - // change h-[30rem] to h-[35rem], add rounded-3xl - className='border border-black/[0.2] group/canvas-card flex items-center justify-center - dark:border-white/[0.2] max-w-sm w-full mx-auto p-4 relative lg:h-[35rem] rounded-3xl ' - style={{ - // add these two - // you can generate the color from here https://cssgradient.io/ - background: "rgb(4,7,29)", - backgroundColor: "linear-gradient(90deg, rgba(4,7,29,1) 0%, rgba(12,14,35,1) 100%)", - }} - > - {/* change to h-10 w-10 , add opacity-30 */} - - - - - - - {hovered && ( - - {children} - - )} - - -
-
- {icon} -
-

- {title} -

- {/* add this one for the description */} -

- {des} -

-
-
- ); -}; -// add order prop for the Phase number change -const AceternityIcon = ({ order }: { order: string }) => { - return ( -
- {/* this btn is from https://ui.aceternity.com/components/tailwindcss-buttons border magic */} - {/* change rounded-lg, text-purple px-5 py-2 */} - {/* remove focus:outline-none focus:ring-2 focus:ring-slate-400 focus:ring-offset-2 focus:ring-offset-slate-50 cuz we don't need to focus */} - {/* remove text-sm font-medium h-12 , add font-bold text-2xl */} - -
- // remove the svg and add the button - // - // - // - ); -}; - -export const Icon = ({ className, ...rest }: any) => { - return ( - - - - ); -}; diff --git a/components/BackDrop/BackDrop.tsx b/components/BackDrop/BackDrop.tsx new file mode 100644 index 0000000..821c494 --- /dev/null +++ b/components/BackDrop/BackDrop.tsx @@ -0,0 +1,25 @@ +import { cn } from "@/lib/utils"; +import { GridPattern } from "../magicui/grid-pattern"; +import { Spotlight } from "../ui/Spotlight"; + +export default function BackDrop() { + return ( + <> + + + + + + + ); +} diff --git a/components/ChapterSection.tsx b/components/ChapterSection.tsx index de199ad..d5af852 100644 --- a/components/ChapterSection.tsx +++ b/components/ChapterSection.tsx @@ -1,42 +1,49 @@ "use client"; -import { Chapters } from "@/data"; +import { Chapters } from "@/constants/constants"; import { PinContainer } from "./ui/Pin"; import Image from "next/image"; import Link from "next/link"; const ChapterSection = () => { return ( -
-

- Our Core Societies +
+

+ Our Core Societies

-
+
{Chapters.map((item, idx) => ( -
- +
+
-

{item.title}

-
- {item.des} +

+ {item.title} +

+
+ {item.des}
-
+
tect
-
))} diff --git a/components/EventsCard.tsx b/components/EventsCard.tsx index 64598f4..6a66b6c 100644 --- a/components/EventsCard.tsx +++ b/components/EventsCard.tsx @@ -31,57 +31,68 @@ export default function EventsCard({ formLink, }: EventsCardProps): JSX.Element { return ( - - -
- + + +
+ {title} {/* Event organizing club logo */} - -
- +
+ {clubName}
- + {eventName} {description} -
-
-
+
+
+

{String(deadline)}

{isOver(deadline) ? null : ( - + Register diff --git a/components/Experience.tsx b/components/Experience.tsx deleted file mode 100644 index 58ecb93..0000000 --- a/components/Experience.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from "react"; - -import { workExperience } from "@/data"; -import { Button } from "./ui/MovingBorders"; -import Image from "next/image"; - -const Experience = () => { - return ( -
-

- My work experience -

- -
- {workExperience.map((card) => ( - - ))} -
-
- ); -}; - -export default Experience; diff --git a/components/Footer.tsx b/components/Footer.tsx index 2ac4626..06a79e0 100644 --- a/components/Footer.tsx +++ b/components/Footer.tsx @@ -1,56 +1,30 @@ import { FaLocationArrow } from "react-icons/fa6"; - -import { socialMedia } from "@/data"; +import { socialMedia } from "@/constants/constants"; import MagicButton from "./MagicButton"; import Image from "next/image"; +import MinFooter from "./MinFooter"; const Footer = () => { return ( -