diff --git a/src/components/Sponsor.jsx b/src/components/Sponsor.jsx index fb986ad..158bc31 100644 --- a/src/components/Sponsor.jsx +++ b/src/components/Sponsor.jsx @@ -4,68 +4,84 @@ import sponsors from "../config/sponsors"; import "./sponsor.css"; const SponsorsSection = () => { - const scrollRef = useRef(null); - const [isHovered, setIsHovered] = useState(false); - const pageIndex = useRef(0); - const [visibleCount, setVisibleCount] = useState(1); + const containerRef = useRef(null); + const [isPaused, setIsPaused] = useState(false); + const currentIndex = useRef(0); + const [itemsToShow, setItemsToShow] = useState(1); useEffect(() => { - const handleResize = () => { - const width = window.innerWidth; - if (width < 640) setVisibleCount(1); - else if (width < 1024) setVisibleCount(2); - else setVisibleCount(3); + const updateItemsToShow = () => { + if (window.innerWidth >= 1024) { + setItemsToShow(3); + } else if (window.innerWidth >= 640) { + setItemsToShow(2); + } else { + setItemsToShow(1); + } }; - handleResize(); - window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); + updateItemsToShow(); + window.addEventListener("resize", updateItemsToShow); + return () => window.removeEventListener("resize", updateItemsToShow); }, []); - const scrollToPage = (index) => { - const container = scrollRef.current; - if (!container) return; + const scrollToIndex = (index) => { + if (!containerRef.current) return; - const cardWidth = container.scrollWidth / sponsors.length; - const scrollX = cardWidth * visibleCount * index; - container.scrollTo({ left: scrollX, behavior: "smooth" }); + const itemWidth = containerRef.current.scrollWidth / sponsors.length; + const scrollPosition = itemWidth * itemsToShow * index; + + containerRef.current.scrollTo({ + left: scrollPosition, + behavior: "smooth", + }); + }; + + const getTotalPages = () => { + return Math.ceil(sponsors.length / itemsToShow); }; - const totalPages = () => { - return Math.ceil(sponsors.length / visibleCount); + const goToNext = () => { + const totalPages = getTotalPages(); + currentIndex.current = (currentIndex.current + 1) % totalPages; + scrollToIndex(currentIndex.current); }; - const handleManualScroll = (direction) => { - const pages = totalPages(); - if (direction === "left") { - pageIndex.current = - pageIndex.current === 0 ? pages - 1 : pageIndex.current - 1; - } else { - pageIndex.current = (pageIndex.current + 1) % pages; - } - scrollToPage(pageIndex.current); + const goToPrevious = () => { + const totalPages = getTotalPages(); + currentIndex.current = + currentIndex.current === 0 ? totalPages - 1 : currentIndex.current - 1; + scrollToIndex(currentIndex.current); }; useEffect(() => { - const autoScroll = () => { - const container = scrollRef.current; - if (!container) return; + if (isPaused) return; - const pages = totalPages(); - pageIndex.current = (pageIndex.current + 1) % pages; - scrollToPage(pageIndex.current); - }; + const autoPlay = setInterval(() => { + goToNext(); + }, 5000); + + return () => clearInterval(autoPlay); + }, [isPaused, itemsToShow]); - let interval; - if (!isHovered) { - interval = setInterval(autoScroll, 5000); - } - return () => clearInterval(interval); - }, [isHovered, visibleCount]); + const handleMouseEnter = () => setIsPaused(true); + const handleMouseLeave = () => setIsPaused(false); + + const handlePrevClick = () => { + goToPrevious(); + setIsPaused(true); + setTimeout(() => setIsPaused(false), 200); + }; + + const handleNextClick = () => { + goToNext(); + setIsPaused(true); + setTimeout(() => setIsPaused(false), 200); + }; return ( -
-
+
+

Our Sponsors and Partners @@ -76,22 +92,21 @@ const SponsorsSection = () => {

setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} + className="relative px-12" + onMouseEnter={handleMouseEnter} + onMouseLeave={handleMouseLeave} > - {/* Left Arrow */} - {/* Sponsor Scroll Area */}
{sponsors.map((sponsor, index) => ( { href={sponsor.link} target="_blank" rel="noopener noreferrer" - className="flex-shrink-0 px-2 box-border" - style={{ width: `${100 / visibleCount}%` }} + className="flex-shrink-0 px-2" + style={{ width: `${100 / itemsToShow}%` }} > -
+
{sponsor.name}
@@ -114,10 +129,10 @@ const SponsorsSection = () => {
diff --git a/src/components/Team.jsx b/src/components/Team.jsx index 234b345..f1e8652 100644 --- a/src/components/Team.jsx +++ b/src/components/Team.jsx @@ -2,114 +2,151 @@ import { useState, useEffect } from "react"; import teamMembers from "../config/teammate"; import { ArrowLeft, ArrowRight } from "lucide-react"; import { FaLinkedin, FaXTwitter } from "react-icons/fa6"; +import { useNavigate } from "react-router"; const TeamSlider = () => { - const [currentIndex, setCurrentIndex] = useState(0); - const [visibleCount, setVisibleCount] = useState(1); - - const getVisibleCount = () => { - if (window.innerWidth < 640) return 1; - if (window.innerWidth < 768) return 1; - if (window.innerWidth < 1024) return 2; - if (window.innerWidth < 1280) return 3; - return 4; - }; + const [currentSlideIndex, setCurrentSlideIndex] = useState(0); + const [cardsPerView, setCardsPerView] = useState(1); + const navigate = useNavigate(); useEffect(() => { - const handleResize = () => { - const count = getVisibleCount(); - setVisibleCount(count); - const maxIndex = Math.max(0, teamMembers.length - count); - if (currentIndex > maxIndex) { - setCurrentIndex(maxIndex); + const handleScreenResize = () => { + const screenWidth = window.innerWidth; + + if (screenWidth >= 1200) { + setCardsPerView(4); + } else if (screenWidth >= 850) { + setCardsPerView(3); + } else if (screenWidth >= 500) { + setCardsPerView(2); + } else { + setCardsPerView(1); } }; - setVisibleCount(getVisibleCount()); - window.addEventListener("resize", handleResize); - return () => window.removeEventListener("resize", handleResize); - }, [currentIndex]); + handleScreenResize(); + window.addEventListener("resize", handleScreenResize); + + return () => window.removeEventListener("resize", handleScreenResize); + }, []); + + const uniqueTeamMembers = Array.from( + new Map(teamMembers.map((member) => [member.name, member])).values(), + ); + + const maxSlideIndex = Math.max(0, uniqueTeamMembers.length - cardsPerView); + + const showNextMembers = () => { + setCurrentSlideIndex((currentIndex) => { + if (currentIndex >= maxSlideIndex) { + return 0; + } - const nextSlide = () => { - const maxIndex = Math.max(0, teamMembers.length - visibleCount); - setCurrentIndex((prev) => Math.min(prev + visibleCount, maxIndex)); + const remainingCards = maxSlideIndex - currentIndex; + const cardsToMove = Math.min(cardsPerView, remainingCards); + + return currentIndex + cardsToMove; + }); }; - const prevSlide = () => { - setCurrentIndex((prev) => Math.max(prev - visibleCount, 0)); + const showPreviousMembers = () => { + setCurrentSlideIndex((currentIndex) => { + if (currentIndex <= 0) { + return maxSlideIndex; + } + + return Math.max(0, currentIndex - cardsPerView); + }); + }; + + const viewFullTeam = () => { + navigate("/Team"); + window.scrollTo(0, 0); }; return ( -
+
-

Our team

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. -

-
- - -
+
- {teamMembers.map((member, index) => ( + {uniqueTeamMembers.map((teamMember, memberIndex) => (
-
- {member.name} +
+
+ {`${teamMember.name} +
+
+
-

{member.name}

-

{member.title}

-

- {member.description} +

+ {teamMember.name} +

+

+ {teamMember.title}

+

+ {teamMember.team} +

+

+ {teamMember.description} +

+
- - - - - - + {teamMember.linkedin && ( + + + + )} + {teamMember.twitter && ( + + + + )}
@@ -117,14 +154,23 @@ const TeamSlider = () => { ))}
+ +
-

Join Us Today!

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. +

Join Us Today!

+

+ Ready to be part of our amazing team? We're always looking for + talented individuals who share our passion.

-
diff --git a/src/config/sponsors.js b/src/config/sponsors.js index 2f95aee..4d555e2 100644 --- a/src/config/sponsors.js +++ b/src/config/sponsors.js @@ -1,46 +1,41 @@ // sponsors.js const sponsors = [ { - name: "Sponsor One", - image: "https://via.placeholder.com/200x100?text=Sponsor+1", - link: "https://sponsor1.com", + name: "NIT Rourkela Alumini ", + image: + "https://res.cloudinary.com/dm406z4pf/image/upload/v1754590523/Sponsor_5_jkviya.jpg", + link: "https://www.nitraa.org/", }, { - name: "Sponsor Two", - image: "https://via.placeholder.com/200x100?text=Sponsor+2", - link: "https://sponsor2.com", + name: "NALCO", + image: + "https://res.cloudinary.com/dm406z4pf/image/upload/v1754590523/Sponsor_4_c44gxu.jpg", + link: "https://nalcoindia.com/", }, { - name: "Sponsor Three", - image: "https://via.placeholder.com/200x100?text=Sponsor+3", - link: "https://sponsor3.com", + name: "SOLID WORKS", + image: + "https://res.cloudinary.com/dm406z4pf/image/upload/v1754590497/Sponsors_2_p8nglm.jpg", + link: "https://www.solidworks.com/", }, { - name: "Sponsor Three", - image: "https://via.placeholder.com/200x100?text=Sponsor+3", - link: "https://sponsor3.com", + name: "PHOENIX ROBOTIC", + image: + "https://res.cloudinary.com/dm406z4pf/image/upload/v1754590497/Sponsors_n6wktj.jpg", + link: "https://www.phoenixrobotic.com/", }, { - name: "Sponsor Three", - image: "https://via.placeholder.com/200x100?text=Sponsor+3", - link: "https://sponsor3.com", + name: "ANSYS", + image: + "https://res.cloudinary.com/dm406z4pf/image/upload/v1754590497/Sponsors_3_a2nmqj.jpg", + link: "https://www.ansys.com/", }, { - name: "Sponsor Three", - image: "https://via.placeholder.com/200x100?text=Sponsor+3", - link: "https://sponsor3.com", + name: "SAIL", + image: + "https://res.cloudinary.com/dm406z4pf/image/upload/v1754590497/Sponsor_6_bqcx5l.jpg", + link: "https://www.sail.co.in/", }, - { - name: "Sponsor Three", - image: "https://via.placeholder.com/200x100?text=Sponsor+3", - link: "https://sponsor3.com", - }, - { - name: "Sponsor Three", - image: "https://via.placeholder.com/200x100?text=Sponsor+3", - link: "https://sponsor3.com", - }, - // Add more sponsors freely ]; export default sponsors; diff --git a/src/config/teammate.js b/src/config/teammate.js index 372db12..ad393fa 100644 --- a/src/config/teammate.js +++ b/src/config/teammate.js @@ -1,94 +1,164 @@ -// config/team.js -import Frame from "../assets/Frame 136.png"; - const teamMembers = [ { - name: "Krish Agarwal1", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Soumya Mohanty", + title: "President", + team: "Executive Body", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119368/Photo_from_Soumya_Mohanty_yv6fsd.jpg", + description: "", + linkedin: "https://www.linkedin.com/in/soumya-mohanty-me0409", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal2", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Pratyush Prateek Dash", + title: "Vice President", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754122254/pratyush__d0cpcx.jpg", + description: "", + team: "Executive Body", + linkedin: "https://www.linkedin.com/in/pratyush-prateek-dash-b8298128a/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal3", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Sahil Singh", + title: "General Secretary", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119373/sahil_ixmnve.jpg", + description: "", + team: "Executive Body", + linkedin: "https://linkedin.com/in/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal4", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Gurudutta Sutar", + title: "Treasurer", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119361/Gurudutta_taaaxv.jpg", + description: "", + team: "Executive Body", + linkedin: "https://linkedin.com/in/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal5", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long6", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Samidha Behera", + title: "Sponsorship Head", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119375/samidha_kxwkkb.jpg", + description: "", + team: "Executive Body", + linkedin: "https://www.linkedin.com/in/samidha-behera-09297828a/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal7", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Nikhil Kumar Dalai", + title: "PR Head", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754122159/nikhil_co92yf.jpg", + description: "", + team: "Executive Body", + linkedin: "https://www.linkedin.com/in/nikhil-dalai/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal8", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Aaditya Sahu", + title: "Captain", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754117969/aaditya_kwvlki.jpg", + team: "Team Bluestreak", + description: "", + linkedin: "https://www.linkedin.com/in/aaditya-sahoo-9605a4279/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal8", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Komal Hitesh", + title: "Vice Captain", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754122332/komal_aucker.jpg", + description: "", + team: "Team Bluestreak", + linkedin: "https://www.linkedin.com/in/komal-hitesh-gude-a1402830a/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal8", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Somanchi Shanmukh", + title: "Chassis Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119380/shanmukh_abvqy1.jpg", + description: "", + team: "Team Bluestreak", + linkedin: "https://www.linkedin.com/in/shanmukhsomanchi/", }, { - name: "Krish Agarwal8", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Aryan Dongare", + title: "Drivetrain Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119212/aryan_exaoug.jpg", + description: "", + team: "Team Bluestreak", + linkedin: "https://www.linkedin.com/in/aryan-dongare-82aa40325/", + twitter: "https://x.com/home", }, { - name: "Krish Agarwal8", - title: "Frontend Developer", - img: Frame, - description: "Eat good live long", - - linkedin: "https://linkedin.com/in/krishagarwal", + name: "Mayukh Thakuria", + title: "Aero Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119366/mayukh_m0mqw1.jpg", + description: "", + team: "Team Bluestreak", + linkedin: "https://www.linkedin.com/in/mayukh-thakuria-509ab8306/", + twitter: "https://x.com/home", + }, + { + name: "Smruti Satabdi Prusty", + title: "Vehicle Dynamics Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119380/smruti_xxnpss.jpg", + description: "", + team: "Team Bluestreak", + linkedin: "https://www.linkedin.com/in/smruti-satabdi-prusty-a35a3a2a2/", + twitter: "https://x.com/home", + }, + { + name: "Chittaranjan Behera", + title: "Captain", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119322/Chittaranjan_pccfs6.jpg", + description: "", + team: "Team Blueprint", + linkedin: "https://www.linkedin.com/in/chittaranjan-behera-012b64292/", + twitter: "https://x.com/home", + }, + { + name: "Dharitri", + title: "Aero Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119358/dharitri__sf7nbd.jpg", + description: "", + team: "Team Blueprint", + linkedin: "https://www.linkedin.com/in/dharitri-pradhan-a92b98269/", + twitter: "https://x.com/home", + }, + { + name: "Nikhil Raj Kiran Sahoo", + title: "Vice Captain & Electonics Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754122413/raju_lp7qbe.jpg", + description: "", + team: "Team Blueprint", + linkedin: "https://www.linkedin.com/in/nikhil-rajkiran-sahoo-515397277/", + twitter: "https://x.com/home", + }, + { + name: "Soaham Tripathy", + title: "CAD Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119383/soaham__g318im.jpg", + description: "", + team: "Team Blueprint", + linkedin: "https://www.linkedin.com/in/soaham-tripathy-223582336/", + twitter: "https://x.com/home", + }, + { + name: "Soaham Tripathy", + title: "Captain", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119383/soaham__g318im.jpg", + description: "", + team: "Team Bluebird", + linkedin: "https://www.linkedin.com/in/soaham-tripathy-223582336/", + twitter: "https://x.com/home", + }, + { + name: "Dev Soni", + title: "Code Lead", + img: "https://res.cloudinary.com/dm406z4pf/image/upload/v1754119356/dev_soni_zsexxk.jpg", + description: "", + team: "Team Bluebird", + linkedin: "https://www.linkedin.com/in/dev-soni-80020228a/", + twitter: "https://x.com/home", }, ]; diff --git a/src/pages/team/TeamPage.jsx b/src/pages/team/TeamPage.jsx index 83d9795..378ceaf 100644 --- a/src/pages/team/TeamPage.jsx +++ b/src/pages/team/TeamPage.jsx @@ -5,22 +5,25 @@ import teamMembers from "../../config/teammate"; const TeamPage = () => { const [activeTeam, setActiveTeam] = useState("All"); - const teams = ["All", "Team 1", "Team 2", "Team 3", "Team 4"]; + const teams = [ + "All", + "Executive Body", + "Team Bluebird", + "Team Bluestreak", + "Team Blueprint", + ]; const filteredMembers = activeTeam === "All" - ? teamMembers + ? Array.from(new Map(teamMembers.map((m) => [m.name, m])).values()) : teamMembers.filter((member) => member.team === activeTeam); - return (

Meet Our Team

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit... -

+

@@ -28,7 +31,7 @@ const TeamPage = () => { ))}
- +
+ {activeTeam === "Team Bluestreak" && ( +

+ Bluestreak, a team within ASME at NIT Rourkela, is a dedicated team + focused on research, analysis, and innovation. They specialize in + designing human-powered vehicles from scratch, incorporating + indigenous elements. Bluestreak actively participates in the eHPV + competition at ASME Efest, showcasing their commitment to pushing + the boundaries of human-powered vehicle design and contributing to + the advancement of sustainable transportation solutions. +

+ )} + {activeTeam === "Team Bluebird" && ( +

+ Bluebird, a team from ASME NIT Rourkela, specializes in CAD modeling + and coding for virtual competitions. Their expertise extends to + designing vehicles for diverse challenges, including autonomous + vehicle competitions, lunar lander simulations, and ocean cleanup + missions. Through innovation and technical prowess, Team Bluebird + consistently participates in and excels at a variety of virtual + events, showcasing their commitment to engineering excellence and + problem-solving in the digital realm. +

+ )} + {activeTeam === "Team Blueprint" && ( +

+ Team Blueprint, a team of ASME NIT Rourkela, engages in research, + innovation, and design. They utilize CAD software to create diverse + models, subsequently manufacturing them through 3D printing + technology . The team actively participates in the IAM3D competition + as part of ASME Efest, showcasing their skills and expertise in + engineering and design within the ASME community +

+ )} +
{filteredMembers.map((member, index) => (
@@ -53,10 +90,11 @@ const TeamPage = () => {
-

{member.name || "Full name"}

-

- {member.title || "Job title"} -

+

+ {member.name || "Full name"} +

+

{member.title || ""}

+

{member.team || ""}