diff --git a/index.html b/index.html index 0c589ec..15ca4a2 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ - + - Vite + React + HackFed
diff --git a/package-lock.json b/package-lock.json index e44069b..8aa78bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,10 @@ "name": "hackfed", "version": "0.0.0", "dependencies": { + "@react-spring/web": "^9.7.5", + "@vercel/analytics": "^1.5.0", "flowbite-react": "^0.10.2", + "framer-motion": "^12.6.0", "prop-types": "^15.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -1001,6 +1004,78 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@react-spring/animated": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", + "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", + "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/rafz": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", + "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", + "license": "MIT" + }, + "node_modules/@react-spring/shared": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", + "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", + "license": "MIT", + "dependencies": { + "@react-spring/rafz": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", + "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", + "license": "MIT" + }, + "node_modules/@react-spring/web": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", + "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.5", + "@react-spring/core": "~9.7.5", + "@react-spring/shared": "~9.7.5", + "@react-spring/types": "~9.7.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@remix-run/router": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.20.0.tgz", @@ -1180,6 +1255,44 @@ "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "license": "MIT" }, + "node_modules/@vercel/analytics": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.5.0.tgz", + "integrity": "sha512-MYsBzfPki4gthY5HnYN7jgInhAZ7Ac1cYDoRWFomwGHWEX7odTEzbtg9kf/QSo7XEsEAqlQugA6gJ2WS2DEa3g==", + "license": "MPL-2.0", + "peerDependencies": { + "@remix-run/react": "^2", + "@sveltejs/kit": "^1 || ^2", + "next": ">= 13", + "react": "^18 || ^19 || ^19.0.0-rc", + "svelte": ">= 4", + "vue": "^3", + "vue-router": "^4" + }, + "peerDependenciesMeta": { + "@remix-run/react": { + "optional": true + }, + "@sveltejs/kit": { + "optional": true + }, + "next": { + "optional": true + }, + "react": { + "optional": true + }, + "svelte": { + "optional": true + }, + "vue": { + "optional": true + }, + "vue-router": { + "optional": true + } + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz", @@ -7878,6 +7991,33 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/framer-motion": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.6.0.tgz", + "integrity": "sha512-91XLZ3VwDlXe9u2ABhTzYBiFQ/qdoiqyTiTCQDDJ4es5/5lzp76hdB+WG7gcNklcQlOmfDZQqVO48tqzY9Z/bQ==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.6.0", + "motion-utils": "^12.5.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -9316,6 +9456,21 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/motion-dom": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.6.0.tgz", + "integrity": "sha512-1s/+/V0ny/gfhocSSf0qhkspZK2da7jrwGw7xHzgiQPcimdHaPRcRCoJ3OxEZYBNzy3ma1ERUD+eUStk6a9pQw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.5.0" + } + }, + "node_modules/motion-utils": { + "version": "12.5.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.5.0.tgz", + "integrity": "sha512-+hFFzvimn0sBMP9iPxBa9OtRX35ZQ3py0UHnb8U29VD+d8lQ8zH3dTygJWqK7av2v6yhg7scj9iZuvTS0f4+SA==", + "license": "MIT" + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -13850,6 +14005,12 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/update-browserslist-db": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", diff --git a/package.json b/package.json index 60c8ef2..5876b7f 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,10 @@ "preview": "vite preview" }, "dependencies": { + "@react-spring/web": "^9.7.5", + "@vercel/analytics": "^1.5.0", "flowbite-react": "^0.10.2", + "framer-motion": "^12.6.0", "prop-types": "^15.8.1", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/src/App.jsx b/src/App.jsx index 6488c68..f17c9e0 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,29 +1,326 @@ import { useEffect } from 'react'; import './App.css'; -import Footer from './components/Fotter'; // Ensure the spelling matches +import Footer from './components/Fotter'; import Navbar from './components/Navbar'; import Home from './pages/Home'; -import AboutUs from './pages/AboutUs'; -import { BrowserRouter as Router, Route, Routes } from 'react-router-dom'; -import StickyNav from './components/StickeyNav'; +import Events from './pages/Events'; +import { BrowserRouter as Router, Route, Routes, Navigate } from 'react-router-dom'; +import AboutHackfed from './components/AboutHackfed'; +import Gallery from './components/Gallery'; +import Team from './components/Team'; +import AskQuestion from './pages/AskQuestion'; +import ConnectWithUs from './components/ConnectWithUs'; function App() { useEffect(() => { document.body.style.overflow = 'hidden'; const timer = setTimeout(() => { - document.body.style.overflow = 'auto'; // Enable scrolling + document.body.style.overflow = 'auto'; }, 3000); return () => clearTimeout(timer); }, []); + return ( -
{/* Added wrapper div */} +
- +
{/* Add padding top to account for fixed navbar */} } exact /> - } exact /> + } exact /> + +
+

GBU Hackathons

+ + {/* Featured Hackathon */} +
+
+
+ GBU Ignition Hackathon +
+
+ Official GBU Event + 24 Hours + Coming Soon +
+

GBU Ignition Hackathon

+
+
+ +
+
+
+

Event Highlights

+

+ A dynamic 24-hour Hackathon, intensive boot camp, coding competitions, and cybersecurity challenges set the stage for skill elevation. Engage in interactive workshops, enjoy an evening cultural show, and connect with tech communities and industry experts. +

+

+ Explore tech trends through exhibitions, gaming tournaments, and AI/Robotics demos. Foster collaboration with start-up showcases, networking sessions, and project displays. Elevate learning, innovation, and cultural celebration in this vibrant tech extravaganza. +

+ +
+ +
+

Event Details

+
    +
  • +
    + + + +
    +
    +

    Coming Soon

    +

    Check official website for dates

    +
    +
  • +
  • +
    + + + + +
    +
    +

    Gautam Buddha University

    +

    Greater Noida, Uttar Pradesh

    +
    +
  • +
  • +
    + + + +
    +
    +

    24 Hours

    +

    Non-stop coding challenge

    +
    +
  • +
  • +
    + + + +
    +
    +

    Open to All

    +

    Students, professionals & enthusiasts

    +
    +
  • +
+
+
+
+
+ +

Past Hackathons

+ +
+
+
+ Entrepreneur Hackathon +
+
+

Entrepreneur Hackathon

+

April 2023

+
+
+
+

A hackathon focused on building innovative startup solutions and business models.

+
+
+ +
+
+ Glitch Hackathon +
+
+

Glitch Hackathon

+

September 2023

+
+
+
+

A creative coding challenge focused on experimental digital art and web experiences.

+
+
+ +
+
+ 24-Hour Code Marathon +
+
+

24-Hour Code Marathon

+

December 2023

+
+
+
+

A full-day non-stop coding challenge pushing participants to build complete projects within 24 hours.

+
+
+
+
+
+ } /> + } /> + +
+
+

About GBU Community

+

Discover the innovative tech community at Gautam Buddha University.

+
+ + {/* Import and include the AboutUs components here */} + + + + +
+

Join Our Community

+

Connect with like-minded tech enthusiasts at Gautam Buddha University.

+
+
+

For Students

+

Join our vibrant community to enhance your technical skills and participate in events.

+ + Student membership + + + + +
+
+

For Mentors

+

Share your expertise with the next generation of tech innovators.

+ + Become a mentor + + + + +
+
+
+
+
+ } /> + +
+

Contact Us

+

Have questions about HackFed or want to collaborate? Get in touch with our team.

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+ } /> + +
+

Join HackFed

+

Become part of our innovative tech community at Gautam Buddha University.

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + } /> + } /> + } /> +
diff --git a/src/assets/1727719864699 (1).jpeg b/src/assets/1727719864699 (1).jpeg new file mode 100644 index 0000000..2080339 Binary files /dev/null and b/src/assets/1727719864699 (1).jpeg differ diff --git a/src/assets/gbu.webp b/src/assets/gbu.webp new file mode 100644 index 0000000..b6e00f5 Binary files /dev/null and b/src/assets/gbu.webp differ diff --git a/src/assets/h1.png b/src/assets/h1.png new file mode 100644 index 0000000..5c955e6 Binary files /dev/null and b/src/assets/h1.png differ diff --git a/src/assets/hackfed_community_cover.jpeg b/src/assets/hackfed_community_cover.jpeg new file mode 100644 index 0000000..d377081 Binary files /dev/null and b/src/assets/hackfed_community_cover.jpeg differ diff --git a/src/assets/hackfed_community_logo.jpeg b/src/assets/hackfed_community_logo.jpeg new file mode 100644 index 0000000..4b8dbd8 Binary files /dev/null and b/src/assets/hackfed_community_logo.jpeg differ diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/AboutHackfed.jsx b/src/components/AboutHackfed.jsx index bac57aa..f511f96 100644 --- a/src/components/AboutHackfed.jsx +++ b/src/components/AboutHackfed.jsx @@ -1,31 +1,278 @@ -import React from 'react' +import React, { useRef } from 'react'; +import './Styles/Landing.css'; +import hackfedLogo from '../assets/hackfed_community_logo.jpeg'; +import hackathonCover from '../assets/hackfed_community_cover.jpeg'; +import hackathonEvent from '../assets/1727719864699 (1).jpeg'; +import gbuImage from '../assets/gbu.webp'; const AboutHackfed = () => { return ( -
-
-
-
- content +
+ {/* Background elements */} +
+
+
+
+
+ + {/* Banner with logo and tagline */} +
+
+ HackFed Cover +
+
+ HackFed Logo +
+

+ + HackFed + +

+
+ + Code • Innovate • Dominate + + +
+
+
+ + {/* Hero section - Reduced vertical spacing */} +
+
+

+ Fostering innovation and collaboration at Gautam Buddha University +

+
+
+ + {/* Featured hackathon event - Reduced padding */} +
+
+
+

+ + Latest Hackathon Event + +

+
+
+ HackFed Hackathon +
+
+ March 2024 +
+

+ HackFed 2024 +

+

+ Our flagship 48-hour hackathon bringing together the brightest minds at Gautam Buddha University to solve real-world problems through innovation and technology. +

+
+
+
+
+
+ + {/* Mission statement - Adjusted spacing */} +
+
+
+ +
+
+
+

+ + Our Mission + +

+

+ HackFed is a premier tech community fostering innovation and collaboration among students at Gautam Buddha University. We believe in the power of technology to solve real-world problems and create positive change. +

+

+ Our mission is to provide a platform where students can develop their technical skills, connect with industry professionals, and transform innovative ideas into reality through hackathons, workshops, and collaborative projects. +

+
+
+
+
+
+ Students collaborating at a hackathon +
+
+
+
+
+
+ + {/* University connection - Adjusted spacing */} +
+
+
+
+

+ GBU Partnership +

+

+ Proudly affiliated with Gautam Buddha University, HackFed leverages the university's + state-of-the-art infrastructure and academic excellence to provide exceptional learning + experiences for students. +

+

+ Located in Greater Noida, Uttar Pradesh, GBU's commitment to innovation and + technological advancement aligns perfectly with HackFed's mission to nurture the next + generation of tech leaders and entrepreneurs. +

+
+
+
+
+
+ Gautam Buddha University campus +
+
+
+
+
-
-
-
- - - -

Edison bulb retro cloud bread echo park, helvetica stumptown taiyaki taxidermy 90's cronut +1 kinfolk. Single-origin coffee ennui shaman taiyaki vape DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware. Man bun next level coloring book skateboard four loko knausgaard. Kitsch keffiyeh master cleanse direct trade indigo juice before they sold out gentrify plaid gastropub normcore XOXO 90's pickled cindigo jean shorts. Slow-carb next level shoindigoitch ethical authentic, yr scenester sriracha forage franzen organic drinking vinegar.

- -

HOLDEN CAULFIELD

-

Senior Product Designer

+ {/* What we do - Adjusted spacing and enhanced cards */} +
+
+
+

+ + What We Do + +

+ +
+ {/* Card 1 */} +
+
+ + + +
+

Hackathons

+

+ We organize multiple hackathons throughout the year, bringing together students to solve real-world problems through technology and innovation. +

+
+ + {/* Card 2 */} +
+
+ + + +
+

Workshops

+

+ Regular workshops and training sessions on cutting-edge technologies, helping students develop new skills and stay ahead in the tech industry. +

+
+ + {/* Card 3 */} +
+
+ + + +
+

Networking

+

+ Connecting students with industry professionals, mentors, and peers to build valuable relationships that can lead to internships and job opportunities. +

+
+
+
+
+
+ + {/* Statistics - Enhanced with animation and glow effects */} +
+
+
+
+

+ Our Impact +

+ +
+ {/* Stat 1 - Added animation and styling */} +
+

15+

+

Hackathons

+
+ + {/* Stat 2 */} +
+

50+

+

Workshops

+
+ + {/* Stat 3 */} +
+

1,000+

+

Students Engaged

+
+ + {/* Stat 4 */} +
+

30+

+

Projects Launched

-
+
+
+
+ + {/* Vision statement - Enhanced with more visual elements */} +
+
+
+
+

+ Our Vision +

+
+

+ "To transform Gautam Buddha University into a hub for technological innovation and entrepreneurship, + where students are empowered to create solutions that impact the world." +

+
+
+
+

HackFed Team

+
+
+
- ) -} + ); +}; -export default AboutHackfed +export default AboutHackfed; diff --git a/src/components/AnimatedList.jsx b/src/components/AnimatedList.jsx new file mode 100644 index 0000000..8d84fd1 --- /dev/null +++ b/src/components/AnimatedList.jsx @@ -0,0 +1,175 @@ +import { useRef, useState, useEffect } from 'react'; +import { motion, useInView, AnimatePresence } from 'framer-motion'; + +const AnimatedItem = ({ children, delay = 0, index, onMouseEnter, onClick }) => { + const ref = useRef(null); + const inView = useInView(ref, { amount: 0.3, triggerOnce: false }); + return ( + + {children} + + ); +}; + +const AnimatedList = ({ + items = [ + 'Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', + 'Item 6', 'Item 7', 'Item 8', 'Item 9', 'Item 10', + 'Item 11', 'Item 12', 'Item 13', 'Item 14', 'Item 15' + ], + onItemSelect, + showGradients = true, + enableArrowNavigation = true, + className = '', + itemClassName = '', + displayScrollbar = true, + initialSelectedIndex = -1, + renderItem, + gridLayout = false, + gridCols = 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4', + maxHeight = null +}) => { + const listRef = useRef(null); + const [selectedIndex, setSelectedIndex] = useState(initialSelectedIndex); + const [keyboardNav, setKeyboardNav] = useState(false); + const [topGradientOpacity, setTopGradientOpacity] = useState(0); + const [bottomGradientOpacity, setBottomGradientOpacity] = useState(1); + + const handleScroll = (e) => { + const { scrollTop, scrollHeight, clientHeight } = e.target; + setTopGradientOpacity(Math.min(scrollTop / 50, 1)); + const bottomDistance = scrollHeight - (scrollTop + clientHeight); + setBottomGradientOpacity( + scrollHeight <= clientHeight ? 0 : Math.min(bottomDistance / 50, 1) + ); + }; + + // Keyboard navigation: arrow keys, tab, and enter selection + useEffect(() => { + if (!enableArrowNavigation) return; + const handleKeyDown = (e) => { + if (e.key === 'ArrowDown' || (e.key === 'Tab' && !e.shiftKey)) { + e.preventDefault(); + setKeyboardNav(true); + setSelectedIndex((prev) => Math.min(prev + 1, items.length - 1)); + } else if (e.key === 'ArrowUp' || (e.key === 'Tab' && e.shiftKey)) { + e.preventDefault(); + setKeyboardNav(true); + setSelectedIndex((prev) => Math.max(prev - 1, 0)); + } else if (e.key === 'Enter') { + if (selectedIndex >= 0 && selectedIndex < items.length) { + e.preventDefault(); + if (onItemSelect) { + onItemSelect(items[selectedIndex], selectedIndex); + } + } + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [items, selectedIndex, onItemSelect, enableArrowNavigation]); + + // Scroll the selected item into view if needed + useEffect(() => { + if (!keyboardNav || selectedIndex < 0 || !listRef.current) return; + const container = listRef.current; + const selectedItem = container.querySelector(`[data-index="${selectedIndex}"]`); + if (selectedItem) { + const extraMargin = 50; + const containerScrollTop = container.scrollTop; + const containerHeight = container.clientHeight; + const itemTop = selectedItem.offsetTop; + const itemBottom = itemTop + selectedItem.offsetHeight; + if (itemTop < containerScrollTop + extraMargin) { + container.scrollTo({ top: itemTop - extraMargin, behavior: 'smooth' }); + } else if (itemBottom > containerScrollTop + containerHeight - extraMargin) { + container.scrollTo({ + top: itemBottom - containerHeight + extraMargin, + behavior: 'smooth', + }); + } + } + setKeyboardNav(false); + }, [selectedIndex, keyboardNav]); + + // When an item is selected via click + const handleItemSelect = (item, index) => { + setSelectedIndex(index === selectedIndex ? null : index); + if (onItemSelect) { + onItemSelect(item, index); + } + }; + + return ( +
+
+
+ {items.map((item, index) => ( + enableArrowNavigation && setSelectedIndex(index)} + onClick={() => handleItemSelect(item, index)} + className={gridLayout ? "mb-0" : "mb-4"} + > + {renderItem ? renderItem(item, index, selectedIndex === index) : ( +
+

{typeof item === 'string' ? item : JSON.stringify(item)}

+
+ )} +
+ ))} +
+
+ {showGradients && ( + + + + + )} +
+ ); +}; + +export default AnimatedList; \ No newline at end of file diff --git a/src/components/CallToAction.jsx b/src/components/CallToAction.jsx index 0a03d32..03578c1 100644 --- a/src/components/CallToAction.jsx +++ b/src/components/CallToAction.jsx @@ -1,33 +1,73 @@ function CallToAction() { return (
-
-
-
+
+ {/* Tech pattern overlay */} +
+
+
+
+
+
+
+ + {/* Glow effect */} + {/*
*/} + +
+
-
-
-

- Start building automated serverless forms

-

+

+
+

+ + Join GBU's Premier Tech Community + +

+

+ + Connect with like-minded innovators, enhance your skills, and build your tech portfolio with HackFed. +

- - - - + + {/* Animated particle dots */} +
+ {[...Array(6)].map((_, i) => ( +
+ ))} +
+ + {/* Circuit line */} +
) diff --git a/src/components/CommunityBanner.jsx b/src/components/CommunityBanner.jsx new file mode 100644 index 0000000..8df0bde --- /dev/null +++ b/src/components/CommunityBanner.jsx @@ -0,0 +1,49 @@ +import React from 'react'; + +function CommunityBanner() { + return ( +
+
+ {/* Background particle dots */} +
+ {[...Array(6)].map((_, i) => ( +
+ ))} +
+ + {/* Content */} +
+

Join GBU's Premier Tech Community

+

+ Connect with like-minded innovators, enhance your skills, and build your tech portfolio with HackFed. +

+
+ + {/* CTA Button */} + +
+
+ ); +} + +export default CommunityBanner; \ No newline at end of file diff --git a/src/components/ConnectWithUs.jsx b/src/components/ConnectWithUs.jsx new file mode 100644 index 0000000..808d5bf --- /dev/null +++ b/src/components/ConnectWithUs.jsx @@ -0,0 +1,203 @@ +import React, { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; + +const ConnectCard = ({ platform, icon: Icon, description, link, color, memberCount }) => { + const [isLoading, setIsLoading] = useState(false); + + const handleClick = async () => { + setIsLoading(true); + await new Promise(resolve => setTimeout(resolve, 1000)); + window.open(link, '_blank'); + setIsLoading(false); + }; + + return ( + e.key === 'Enter' && handleClick()} + > +
+ + {/* Icon and Content */} +
+
+ +
+
+

+ {platform} +

+

+ {description} +

+
+ {memberCount && ( +
+ {memberCount}+ +
+ )} +
+ + {/* Arrow Icon */} +
+ + → + +
+ + {/* Loading Overlay */} + {isLoading && ( +
+
+
+ )} +
+ ); +}; + +const FloatingDot = ({ delay }) => ( +
+); + +const ConnectWithUs = () => { + const [stats, setStats] = useState({ + discord: 2500, + whatsapp: 500, + instagram: 1000, + email: 200 + }); + + // Simulate live stats updates + useEffect(() => { + const interval = setInterval(() => { + setStats(prev => ({ + discord: prev.discord + Math.floor(Math.random() * 10), + whatsapp: prev.whatsapp + Math.floor(Math.random() * 5), + instagram: prev.instagram + Math.floor(Math.random() * 7), + email: prev.email + Math.floor(Math.random() * 3) + })); + }, 5000); + + return () => clearInterval(interval); + }, []); + + return ( +
+ {/* Animated Background */} +
+
+ {Array.from({ length: 30 }).map((_, i) => ( + + ))} +
+ +
+ {/* Section Header */} + +

+ Connect With Us +

+

+ Join our thriving community of developers, innovators, and tech enthusiasts +

+
+ + 24/7 Active Community + + + Instant Support + + + Regular Events + +
+
+ + {/* Connect Cards Grid */} +
+ } + description="Join our community chat" + link="https://discord.gg/your-server" + color="[#5865F2]" + memberCount={stats.discord} + /> + + } + description="Join hackathon discussions" + link="https://chat.whatsapp.com/your-group" + color="[#25D366]" + memberCount={stats.whatsapp} + /> + + } + description="Follow our hackathon journey" + link="https://instagram.com/your-profile" + color="[#E4405F]" + memberCount={stats.instagram} + /> + + } + description="contact@hackfed.com" + link="mailto:contact@hackfed.com" + color="blue" + memberCount={stats.email} + /> +
+ + {/* Stats Bar */} + +
+ {stats.discord.toLocaleString()}+ + Discord Members +
+
+ {stats.whatsapp.toLocaleString()}+ + WhatsApp Members +
+
+ {stats.instagram.toLocaleString()}+ + Instagram Followers +
+
+ {stats.email.toLocaleString()}+ + Email Subscribers +
+
+
+
+ ); +}; + +export default ConnectWithUs; \ No newline at end of file diff --git a/src/components/EventCategories.jsx b/src/components/EventCategories.jsx new file mode 100644 index 0000000..d5a2495 --- /dev/null +++ b/src/components/EventCategories.jsx @@ -0,0 +1,92 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +function EventCategories() { + const categories = [ + { + id: 1, + title: "Workshops", + description: "Hands-on technical workshops to enhance your skills in various technologies.", + icon: ( + + + + ), + link: "/events?category=workshop" + }, + { + id: 2, + title: "Tech Talks", + description: "Informative sessions from industry professionals and academic experts.", + icon: ( + + + + ), + link: "/events?category=talk" + }, + { + id: 3, + title: "Networking", + description: "Connect with like-minded individuals and industry professionals.", + icon: ( + + + + ), + link: "/events?category=networking" + }, + { + id: 4, + title: "Hackathons", + description: "Intensive coding challenges to build innovative solutions.", + icon: ( + + + + ), + link: "/hackathons" + }, + ]; + + return ( +
+
+
+

+ Explore Tech Events +

+

+ Discover a variety of technology events designed to enhance your skills and expand your network +

+
+ +
+ {categories.map((category) => ( +
+
+ {category.icon} +
+

{category.title}

+

{category.description}

+ + Explore {category.title.toLowerCase()} + + + + +
+ ))} +
+
+
+ ); +} + +export default EventCategories; \ No newline at end of file diff --git a/src/components/Faq.jsx b/src/components/Faq.jsx index efb795e..da5044e 100644 --- a/src/components/Faq.jsx +++ b/src/components/Faq.jsx @@ -1,151 +1,429 @@ -// import React from 'react' - -// function Faq() { -// function toggleFAQ(button) { -// const content = button.nextElementSibling; -// button.setAttribute("aria-expanded", button.getAttribute("aria-expanded") === "false" ? "true" : "false"); -// content.style.maxHeight = button.getAttribute("aria-expanded") === "true" ? content.scrollHeight + "px" : "0"; -// } -// return ( -//
-//
-//
-//

Insurance FAQ

-//

Frequently Asked Questions

-//
-//
    -//
  • -// -//
    -//
    -//
    We prioritize the security of your insurance information. We use advanced encryption and strict data protection measures to ensure your data is safe and confidential.
    -//
    -//
    -//
  • -//
  • -// -//
    -//
    -//
    Our insurance plans are customizable. You can tailor your coverage to meet your specific needs and budget.
    -//
    -//
    -//
  • -//
  • -// -//
    -//
    -//
    There may be a waiting period for certain insurance claims, depending on the policy terms and conditions. Please refer to your policy documents for details.
    -//
    -//
    -//
  • -//
-//
- -// {/* */} - -//
-// ) -// } - -// export default Faq - -import { useState } from 'react'; +import { useState, useRef, useEffect } from 'react'; +import './Styles/Landing.css'; +import { motion, AnimatePresence } from 'framer-motion'; +import AnimatedList from './AnimatedList'; function Faq() { - const [expandedIndex, setExpandedIndex] = useState(null); + const [activeIndex, setActiveIndex] = useState(null); + const [searchTerm, setSearchTerm] = useState(''); + const [activeCategory, setActiveCategory] = useState('all'); + const [helpfulFeedback, setHelpfulFeedback] = useState({}); + const contentRefs = useRef([]); + const [selectedFaq, setSelectedFaq] = useState(null); - const toggleFAQ = (index) => { - setExpandedIndex(expandedIndex === index ? null : index); + // Set up content refs + useEffect(() => { + contentRefs.current = contentRefs.current.slice(0, faqData.length); + }, []); + + const toggleQuestion = (index) => { + setActiveIndex(activeIndex === index ? null : index); }; - return ( -
-
-
-

Insurance FAQ

-

Frequently Asked Questions

+ const handleHelpfulFeedback = (index, isHelpful) => { + setHelpfulFeedback(prev => ({ + ...prev, + [index]: isHelpful + })); + }; + + // Filter FAQs based on search term and category + const filteredFaqs = faqData.filter(faq => { + const matchesSearch = faq.question.toLowerCase().includes(searchTerm.toLowerCase()) || + faq.answer.toLowerCase().includes(searchTerm.toLowerCase()); + const matchesCategory = activeCategory === 'all' || faq.category === activeCategory; + return matchesSearch && matchesCategory; + }); + + // Get popular questions (those with most helpful votes) + const popularQuestions = [...faqData] + .filter(faq => faq.popular) + .slice(0, 3); + + const handleFaqSelect = (item, index) => { + setSelectedFaq(index === selectedFaq ? null : index); + }; + + const renderFaqItem = (item, index, isSelected) => { + return ( + +
+
+
+ {getIconForCategory(item.category)} +
+

+ {item.question} +

+
+ + + + +
-
    - {faqData.map((faq, index) => ( -
  • - -
    + + {/* Helpful feedback section */} + -
    -
    {faq.answer}
    +

    Was this answer helpful?

    +
    + +
    -
    -
  • - ))} -
+
+ + )} + + + ); + }; + + return ( +
+ {/* Background elements */} +
+
+
+
+
+ + {/* Background glow effects */} +
+
+ +
+ +

+ + Frequently Asked Questions + +

+

+ + Everything you need to know about HackFed and our hackathons + +

+
+ + {/* Search and Filter */} + + {/* Search Bar */} +
+
+ + + +
+ setSearchTerm(e.target.value)} + /> +
+ + {/* Category Filters */} +
+ {['all', 'general', 'hackathons', 'gbu', 'resources'].map((category) => ( + setActiveCategory(category)} + whileHover={{ scale: 1.05 }} + whileTap={{ scale: 0.95 }} + className={`px-4 py-2 rounded-full text-sm transition-all duration-300 ${ + activeCategory === category + ? 'bg-blue-500/70 text-white' + : 'bg-white/5 text-gray-300 hover:bg-white/10' + }`} + > + {category === 'all' ? 'All Questions' : + category === 'gbu' ? 'GBU Specific' : + category.charAt(0).toUpperCase() + category.slice(1)} + + ))} +
+
+ + {/* Popular Questions */} + {searchTerm === '' && activeCategory === 'all' && ( + +

+ + + + Popular Questions +

+
+ {popularQuestions.map((faq, idx) => ( + { + // Find matching FAQ in filtered list + const mainIndex = filteredFaqs.findIndex(f => f.question === faq.question); + if (mainIndex !== -1) { + setSelectedFaq(mainIndex); + } + }} + className="border border-white/5 rounded-lg p-3 cursor-pointer transition-colors duration-300 flex items-center" + > +
+ {getIconForCategory(faq.category)} +
+ {faq.question} +
+ ))} +
+
+ )} + + {/* Main FAQ list */} + + {filteredFaqs.length > 0 ? ( + + ) : ( + + + + +

No questions found matching your criteria

+ { + setSearchTerm(''); + setActiveCategory('all'); + }} + whileHover={{ scale: 1.05 }} + whileTap={{ scale: 0.95 }} + className="mt-4 text-blue-400 hover:text-blue-300 transition-colors" + > + Reset filters + +
+ )} +
+ + {/* Ask your own question */} + +

Can't find what you're looking for?

+ + Ask Us Your Question + + + + +
-
+
); } +// Helper function to get icon based on category +function getIconForCategory(category) { + switch(category) { + case 'general': + return ( + + + + ); + case 'hackathons': + return ( + + + + ); + case 'gbu': + return ( + + + + ); + case 'resources': + return ( + + + + ); + default: + return ( + + + + ); + } +} + const faqData = [ { - question: 'How secure is my insurance information?', - answer: - 'We prioritize the security of your insurance information. We use advanced encryption and strict data protection measures to ensure your data is safe and confidential.', - contentHeight: 100, // approximate height in pixels + question: "What is HackFed?", + answer: "HackFed is a cutting-edge hackathon platform designed for college communities at Gautam Buddha University, fostering innovation and collaboration through technology. We organize and host hackathons that bring together developers, designers, and problem solvers to create impactful solutions within short timeframes.", + category: "general", + popular: true }, { - question: 'How can I customize my insurance coverage?', - answer: - 'Our insurance plans are customizable. You can tailor your coverage to meet your specific needs and budget.', - contentHeight: 80, + question: "How do I participate in a HackFed hackathon?", + answer: "To participate in a HackFed hackathon, simply create an account on our platform, browse upcoming events, and register for the one that interests you. Once registered, you'll receive details about the event schedule, rules, and resources. You can participate individually or form teams with other participants.", + category: "hackathons", + popular: true }, { - question: 'Is there a waiting period for insurance claims?', - answer: - 'There may be a waiting period for certain insurance claims, depending on the policy terms and conditions. Please refer to your policy documents for details.', - contentHeight: 90, + question: "What resources does HackFed provide to participants?", + answer: "HackFed provides a comprehensive suite of resources including access to mentors, workshops, technical support, and starter kits for various technologies. We also offer cloud credits from our sponsors, API access to specialized tools, and networking opportunities with industry professionals.", + category: "resources" }, + { + question: "Are HackFed events open to beginners?", + answer: "Absolutely! HackFed events welcome participants of all skill levels, including complete beginners. We design our hackathons to be inclusive learning experiences, with starter tracks for newcomers, mentorship opportunities, and workshops to help you build your skills as you go. The collaborative environment makes it perfect for first-time hackers.", + category: "hackathons" + }, + { + question: "How are projects judged at HackFed hackathons?", + answer: "Projects are evaluated by a panel of industry experts and sponsors based on innovation, technical complexity, design, completion, and potential impact. We use a transparent rubric that considers both the technical achievement and the problem-solving aspects. Winners are selected across multiple categories, giving teams various opportunities to showcase their strengths.", + category: "hackathons" + }, + { + question: "Can students from other universities participate?", + answer: "Yes! While HackFed is based at Gautam Buddha University, our hackathons are typically open to students from other universities as well. We believe in fostering a diverse community of innovators across different institutions. Check the specific event details for any eligibility criteria.", + category: "gbu", + popular: true + }, + { + question: "Where are HackFed events hosted at GBU?", + answer: "HackFed events are primarily hosted in the Computer Science block and Central Library of Gautam Buddha University. For larger hackathons, we sometimes use the Convention Center. All venues are equipped with high-speed internet, power outlets, and comfortable workspaces for participants.", + category: "gbu" + }, + { + question: "Do I need to bring my own computer?", + answer: "Yes, participants are expected to bring their own laptops for hackathons. However, GBU students can request access to lab computers if needed by contacting the organizers at least 48 hours before the event. We provide power strips, internet connectivity, and some hardware components for prototyping.", + category: "hackathons" + }, + { + question: "How can I join the HackFed organizing team?", + answer: "We recruit new team members at the beginning of each semester. To join, attend our orientation session announced on our social media channels and submit an application highlighting your skills and interests. We look for passionate individuals with skills in development, design, event management, marketing, and community building.", + category: "gbu" + }, + { + question: "Does HackFed provide accommodation for non-GBU participants?", + answer: "For major hackathons, we arrange limited accommodation in GBU hostels for participants from other universities. This is subject to availability and must be requested during registration. For other events, we can recommend nearby affordable accommodation options.", + category: "gbu" + }, + { + question: "What technologies should I learn before participating?", + answer: "There's no specific technology requirement to participate. However, having basic knowledge of programming (any language), version control (Git), and web/mobile development fundamentals is helpful. For specialized tracks, we provide pre-event learning resources to help you prepare. Remember, hackathons are learning experiences too!", + category: "resources" + } ]; export default Faq; diff --git a/src/components/Fotter.jsx b/src/components/Fotter.jsx index 4f1e8a1..ae15399 100644 --- a/src/components/Fotter.jsx +++ b/src/components/Fotter.jsx @@ -1,44 +1,127 @@ +import hackfedLogo from '../assets/h1.png'; + function Fotter() { return ( - <> - - +
+
) } diff --git a/src/components/FuzzyText.jsx b/src/components/FuzzyText.jsx new file mode 100644 index 0000000..997fd31 --- /dev/null +++ b/src/components/FuzzyText.jsx @@ -0,0 +1,201 @@ +import React, { useEffect, useRef } from "react"; + +const FuzzyText = ({ + children, + fontSize = "clamp(2rem, 10vw, 10rem)", + fontWeight = 900, + fontFamily = "inherit", + color = "#fff", + enableHover = true, + baseIntensity = 0.18, + hoverIntensity = 0.5, +}) => { + const canvasRef = useRef(null); + + useEffect(() => { + let animationFrameId; + let isCancelled = false; + const canvas = canvasRef.current; + if (!canvas) return; + + const init = async () => { + if (document.fonts?.ready) { + await document.fonts.ready; + } + if (isCancelled) return; + + const ctx = canvas.getContext("2d"); + if (!ctx) return; + + const computedFontFamily = + fontFamily === "inherit" + ? window.getComputedStyle(canvas).fontFamily || "sans-serif" + : fontFamily; + + const fontSizeStr = + typeof fontSize === "number" ? `${fontSize}px` : fontSize; + let numericFontSize; + if (typeof fontSize === "number") { + numericFontSize = fontSize; + } else { + const temp = document.createElement("span"); + temp.style.fontSize = fontSize; + document.body.appendChild(temp); + const computedSize = window.getComputedStyle(temp).fontSize; + numericFontSize = parseFloat(computedSize); + document.body.removeChild(temp); + } + + const text = React.Children.toArray(children).join(""); + + // Create offscreen canvas + const offscreen = document.createElement("canvas"); + const offCtx = offscreen.getContext("2d"); + if (!offCtx) return; + + offCtx.font = `${fontWeight} ${fontSizeStr} ${computedFontFamily}`; + offCtx.textBaseline = "alphabetic"; + const metrics = offCtx.measureText(text); + + const actualLeft = metrics.actualBoundingBoxLeft ?? 0; + const actualRight = metrics.actualBoundingBoxRight ?? metrics.width; + const actualAscent = metrics.actualBoundingBoxAscent ?? numericFontSize; + const actualDescent = + metrics.actualBoundingBoxDescent ?? numericFontSize * 0.2; + + const textBoundingWidth = Math.ceil(actualLeft + actualRight); + const tightHeight = Math.ceil(actualAscent + actualDescent); + + const extraWidthBuffer = 10; + const offscreenWidth = textBoundingWidth + extraWidthBuffer; + + offscreen.width = offscreenWidth; + offscreen.height = tightHeight; + + const xOffset = extraWidthBuffer / 2; + offCtx.font = `${fontWeight} ${fontSizeStr} ${computedFontFamily}`; + offCtx.textBaseline = "alphabetic"; + offCtx.fillStyle = color; + offCtx.fillText(text, xOffset - actualLeft, actualAscent); + + const horizontalMargin = 50; + const verticalMargin = 0; + canvas.width = offscreenWidth + horizontalMargin * 2; + canvas.height = tightHeight + verticalMargin * 2; + ctx.translate(horizontalMargin, verticalMargin); + + const interactiveLeft = horizontalMargin + xOffset; + const interactiveTop = verticalMargin; + const interactiveRight = interactiveLeft + textBoundingWidth; + const interactiveBottom = interactiveTop + tightHeight; + + let isHovering = false; + const fuzzRange = 30; + + const run = () => { + if (isCancelled) return; + ctx.clearRect( + -fuzzRange, + -fuzzRange, + offscreenWidth + 2 * fuzzRange, + tightHeight + 2 * fuzzRange + ); + const intensity = isHovering ? hoverIntensity : baseIntensity; + for (let j = 0; j < tightHeight; j++) { + const dx = Math.floor(intensity * (Math.random() - 0.5) * fuzzRange); + ctx.drawImage( + offscreen, + 0, + j, + offscreenWidth, + 1, + dx, + j, + offscreenWidth, + 1 + ); + } + animationFrameId = window.requestAnimationFrame(run); + }; + + run(); + + const isInsideTextArea = (x, y) => { + return ( + x >= interactiveLeft && + x <= interactiveRight && + y >= interactiveTop && + y <= interactiveBottom + ); + }; + + const handleMouseMove = (e) => { + if (!enableHover) return; + const rect = canvas.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + isHovering = isInsideTextArea(x, y); + }; + + const handleMouseLeave = () => { + isHovering = false; + }; + + const handleTouchMove = (e) => { + if (!enableHover) return; + e.preventDefault(); + const rect = canvas.getBoundingClientRect(); + const touch = e.touches[0]; + const x = touch.clientX - rect.left; + const y = touch.clientY - rect.top; + isHovering = isInsideTextArea(x, y); + }; + + const handleTouchEnd = () => { + isHovering = false; + }; + + if (enableHover) { + canvas.addEventListener("mousemove", handleMouseMove); + canvas.addEventListener("mouseleave", handleMouseLeave); + canvas.addEventListener("touchmove", handleTouchMove, { passive: false }); + canvas.addEventListener("touchend", handleTouchEnd); + } + + const cleanup = () => { + window.cancelAnimationFrame(animationFrameId); + if (enableHover) { + canvas.removeEventListener("mousemove", handleMouseMove); + canvas.removeEventListener("mouseleave", handleMouseLeave); + canvas.removeEventListener("touchmove", handleTouchMove); + canvas.removeEventListener("touchend", handleTouchEnd); + } + }; + + canvas.cleanupFuzzyText = cleanup; + }; + + init(); + + return () => { + isCancelled = true; + window.cancelAnimationFrame(animationFrameId); + if (canvas && canvas.cleanupFuzzyText) { + canvas.cleanupFuzzyText(); + } + }; + }, [ + children, + fontSize, + fontWeight, + fontFamily, + color, + enableHover, + baseIntensity, + hoverIntensity, + ]); + + return ; +}; + +export default FuzzyText; \ No newline at end of file diff --git a/src/components/Gallery.jsx b/src/components/Gallery.jsx index 9c5a0a3..67c4302 100644 --- a/src/components/Gallery.jsx +++ b/src/components/Gallery.jsx @@ -1,40 +1,179 @@ -import React from 'react' +import React, { useState } from 'react'; +import './Styles/Landing.css'; const Gallery = () => { + const [activeTab, setActiveTab] = useState('hackathons'); + + const images = { + hackathons: [ + { + src: "https://images.unsplash.com/photo-1504384308090-c894fdcc538d?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "HackFed 2023 Coding Challenge", + title: "HackFed 2023", + description: "Our flagship 48-hour hackathon at GBU" + }, + { + src: "https://images.unsplash.com/photo-1526378722484-bd91ca387e72?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Code Sprint 2023", + title: "Code Sprint 2023", + description: "24-hour coding challenge for beginners" + }, + { + src: "https://images.unsplash.com/photo-1517245386807-bb43f82c33c4?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "AI Innovate 2023", + title: "AI Innovate 2023", + description: "Specialized hackathon focused on AI solutions" + }, + { + src: "https://images.unsplash.com/photo-1573164574001-518958d9baa2?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Hack GBU 2022", + title: "Hack GBU 2022", + description: "University-wide innovation challenge" + } + ], + workshops: [ + { + src: "https://images.unsplash.com/photo-1531482615713-2afd69097998?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Web Development Workshop", + title: "Web Dev Bootcamp", + description: "3-day intensive training on modern web technologies" + }, + { + src: "https://images.unsplash.com/photo-1558346490-a72e53ae2d4f?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Machine Learning Workshop", + title: "ML Fundamentals", + description: "Hands-on workshop on machine learning basics" + }, + { + src: "https://images.unsplash.com/photo-1557838923-2985c318be48?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Cloud Computing Workshop", + title: "Cloud Technologies", + description: "Workshop on AWS and Azure fundamentals" + }, + { + src: "https://images.unsplash.com/photo-1552581234-26160f608093?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Mobile App Development", + title: "App Development", + description: "Mobile app development with React Native" + } + ], + networking: [ + { + src: "https://images.unsplash.com/photo-1511578314322-379afb476865?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Tech Meetup 2023", + title: "Tech Meetup 2023", + description: "Annual networking event for tech enthusiasts" + }, + { + src: "https://images.unsplash.com/photo-1556761175-b413da4baf72?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Industry Connect", + title: "Industry Connect", + description: "Connecting GBU students with tech companies" + }, + { + src: "https://images.unsplash.com/photo-1540317580384-e5d43867caa6?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Tech Talks 2023", + title: "Tech Talks 2023", + description: "Speaker series featuring industry experts" + }, + { + src: "https://images.unsplash.com/photo-1507537297725-24a1c029d3ca?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1000&q=80", + alt: "Alumni Meetup", + title: "Alumni Meetup", + description: "Connecting current students with GBU alumni" + } + ] + }; + return ( -
-
-
-

Master Cleanse Reliac Heirloom

-

Whatever cardigan tote bag tumblr hexagon brooklyn asymmetrical gentrify, subway tile poke farm-to-table. Franzen you probably haven't heard of them man bun deep jianbing selfies heirloom.

-
-
-
-
- gallery -
-
- gallery -
-
- gallery -
+
+ {/* Background elements */} +
+
+
+
+ + {/* Enhanced background glow */} +
+
+ +
+
+
+

+ HackFed Gallery +

+

+ Explore highlights from our events and activities at Gautam Buddha University +

-
-
- gallery -
-
- gallery -
-
- gallery + + {/* Tabs - Enhanced with better styling */} +
+
+ + +
+ + {/* Gallery grid - Updated with better card styling */} +
+ {images[activeTab].map((image, index) => ( +
+
+
+ {image.alt} +
+

{image.title}

+
+
+
+

{image.title}

+

{image.description}

+
+
+ ))} +
+ + {/* View all button - Enhanced styling */} +
- ) + ); } -export default Gallery +export default Gallery; diff --git a/src/components/Hero.jsx b/src/components/Hero.jsx index e501b62..4dc8939 100644 --- a/src/components/Hero.jsx +++ b/src/components/Hero.jsx @@ -1,11 +1,72 @@ -import { useEffect } from "react"; +import { useEffect, useState, useRef } from "react"; import "./Styles/Landing.css" import Partners from "./Partners"; import Term from "./Term"; +import FuzzyText from "./FuzzyText"; // import UpComing from "./UpComing"; // import Footer from "./Footer"; function Hero() { + const [glitching, setGlitching] = useState(false); + const [isDaytime, setIsDaytime] = useState(true); + const [greeting, setGreeting] = useState(""); + const [showScrollIndicator, setShowScrollIndicator] = useState(true); + const [hoverIntensity, setHoverIntensity] = useState(0.5); + const scrollIndicatorRef = useRef(null); + const greetingRef = useRef(null); + useEffect(() => { + // Set greeting based on time of day + const hour = new Date().getHours(); + if (hour >= 5 && hour < 12) { + setGreeting("Good Morning"); + setIsDaytime(true); + } else if (hour >= 12 && hour < 18) { + setGreeting("Good Afternoon"); + setIsDaytime(true); + } else { + setGreeting("Good Evening"); + setIsDaytime(false); + } + + // Handle scroll behavior for the page + const handleScroll = () => { + const scrollPosition = window.scrollY; + const windowHeight = window.innerHeight; + + // Calculate opacity based on scroll position for a smoother transition + const maxScrollThreshold = windowHeight * 0.2; + + if (scrollPosition <= maxScrollThreshold) { + // Gradually decrease opacity as user scrolls + if (scrollIndicatorRef.current) { + const newOpacity = 1 - (scrollPosition / maxScrollThreshold); + scrollIndicatorRef.current.style.opacity = Math.max(0, newOpacity).toFixed(2); + } + + if (scrollPosition === 0) { + setShowScrollIndicator(true); + } + } else if (showScrollIndicator) { + setShowScrollIndicator(false); + } + }; + + window.addEventListener('scroll', handleScroll); + + const glitchInterval = setInterval(() => { + if (!glitching) { + setGlitching(true); + setHoverIntensity(0.8); + setTimeout(() => { + setGlitching(false); + setHoverIntensity(0.5); + }, 350); + } + }, Math.random() * 6000 + 4000); + + // Set background mode based on time + document.body.classList.toggle('night-mode', !isDaytime); + const canvas = document.getElementById('particleCanvas'); const ctx = canvas.getContext('2d'); @@ -54,7 +115,10 @@ function Hero() { } draw() { - ctx.fillStyle = `rgba(${255 - (Math.random() * 255 / 2)}, 255, 255, ${this.opacity})`; + // Adjust particle colors based on day/night mode + const blueValue = isDaytime ? 255 : 200; + const redValue = isDaytime ? (255 - (Math.random() * 255 / 2)) : (100 + (Math.random() * 50)); + ctx.fillStyle = `rgba(${redValue}, ${isDaytime ? 255 : 160}, ${blueValue}, ${this.opacity})`; ctx.fillRect(this.x, this.y, 0.4, Math.random() * 2 + 1); } } @@ -91,14 +155,25 @@ function Hero() { initParticles(); animate(); - // Clean up event listener on component unmount + // Clean up event listener and intervals on component unmount return () => { window.removeEventListener('resize', onResize); + window.removeEventListener('scroll', handleScroll); + clearInterval(glitchInterval); + document.body.classList.remove('night-mode'); }; - }, []); + }, [glitching, showScrollIndicator]); + + // Function to scroll down to the next section + const scrollToNextSection = () => { + window.scrollTo({ + top: window.innerHeight, + behavior: 'smooth' + }); + }; return ( -
+
{/*

RAFA

@@ -131,21 +206,87 @@ function Hero() {
-
-

Introducing

+
+

{greeting}

-
-

HackFed

-

HackFed

+
+
+ + HackFed + +
+ {glitching && ( + <> +
+ + HackFed + +
+
+ + HackFed + +
+ + )}
-

The world's best Community,
+

+ The world's best Community,
Code, Inovate & Dominate

+
+ + {/* Minimalistic Scroll down indicator */} +
+
+ explore +
+
+
+ +
+
+
+ {/*
@@ -167,7 +308,6 @@ function Hero() {

At the core lies our revolutionary framework,
ensuring adaptability across all application architectures.

*/}
- ) } diff --git a/src/components/JoinUs.jsx b/src/components/JoinUs.jsx new file mode 100644 index 0000000..ed676b3 --- /dev/null +++ b/src/components/JoinUs.jsx @@ -0,0 +1,105 @@ +import React from 'react'; +import './Styles/Landing.css'; + +function JoinUs() { + // Email functionality could be added here + const contactEmail = "contact@hackfed.com"; + + return ( +
+ {/* Background subtle dots */} +
+ {[...Array(6)].map((_, i) => ( +
+ ))} +
+ +
+
+

+ Connect With Us +

+

+ Connect with fellow developers, innovators, and tech enthusiasts. +

+
+ + +
+
+ ); +} + +export default JoinUs; \ No newline at end of file diff --git a/src/components/MobileImage.jsx b/src/components/MobileImage.jsx new file mode 100644 index 0000000..c261267 --- /dev/null +++ b/src/components/MobileImage.jsx @@ -0,0 +1,70 @@ +import React, { useState, useEffect } from 'react'; + +const MobileImage = ({ src, alt, className = '' }) => { + const [isLoaded, setIsLoaded] = useState(false); + const [isInView, setIsInView] = useState(false); + const [imageSrc, setImageSrc] = useState(null); + + useEffect(() => { + // Create an intersection observer + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + setIsInView(true); + // Load the image when it comes into view + const img = new Image(); + img.src = src; + img.onload = () => { + setImageSrc(src); + setIsLoaded(true); + }; + observer.unobserve(entry.target); + } + }); + }, + { + rootMargin: '50px', + threshold: 0.1, + } + ); + + // Start observing the placeholder + const placeholder = document.getElementById(`image-placeholder-${src}`); + if (placeholder) { + observer.observe(placeholder); + } + + return () => { + if (placeholder) { + observer.unobserve(placeholder); + } + }; + }, [src]); + + return ( +
+ {/* Placeholder with blur effect */} +
+ + {/* Actual image */} + {imageSrc && ( + {alt} + )} +
+ ); +}; + +export default MobileImage; \ No newline at end of file diff --git a/src/components/MobileInput.jsx b/src/components/MobileInput.jsx new file mode 100644 index 0000000..a329db8 --- /dev/null +++ b/src/components/MobileInput.jsx @@ -0,0 +1,171 @@ +import React, { useState, useRef, useEffect } from 'react'; + +const MobileInput = ({ + type = 'text', + label, + placeholder, + value, + onChange, + error, + required = false, + className = '', + validation = {}, + ...props +}) => { + const [isFocused, setIsFocused] = useState(false); + const [isValid, setIsValid] = useState(true); + const [validationMessage, setValidationMessage] = useState(''); + const inputRef = useRef(null); + + useEffect(() => { + validateInput(value); + }, [value]); + + const validateInput = (value) => { + if (required && !value) { + setIsValid(false); + setValidationMessage('This field is required'); + return; + } + + if (validation.pattern && !validation.pattern.test(value)) { + setIsValid(false); + setValidationMessage(validation.message || 'Invalid input'); + return; + } + + if (validation.minLength && value.length < validation.minLength) { + setIsValid(false); + setValidationMessage(`Minimum ${validation.minLength} characters required`); + return; + } + + setIsValid(true); + setValidationMessage(''); + }; + + const handleFocus = () => { + setIsFocused(true); + // Scroll input into view on mobile + if (inputRef.current) { + inputRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } + }; + + const handleBlur = () => { + setIsFocused(false); + validateInput(value); + }; + + const handleChange = (e) => { + const newValue = e.target.value; + onChange(e); + validateInput(newValue); + }; + + const getInputType = () => { + switch (type) { + case 'email': + return 'email'; + case 'phone': + return 'tel'; + case 'password': + return 'password'; + default: + return 'text'; + } + }; + + return ( +
+ {/* Label */} + + + {/* Input */} + + + {/* Error Message */} + {(error || validationMessage) && ( +

+ {error || validationMessage} +

+ )} + + {/* Focus Indicator */} +
+ + {/* Validation Icon */} + {value && ( +
+ {isValid ? ( + + + + ) : ( + + + + )} +
+ )} + + {/* Character Count (if maxLength is set) */} + {props.maxLength && ( +
+ {value.length}/{props.maxLength} +
+ )} +
+ ); +}; + +export default MobileInput; \ No newline at end of file diff --git a/src/components/MobileNav.jsx b/src/components/MobileNav.jsx new file mode 100644 index 0000000..9afe31c --- /dev/null +++ b/src/components/MobileNav.jsx @@ -0,0 +1,189 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { Link, useLocation } from 'react-router-dom'; + +const MobileNav = () => { + const [isOpen, setIsOpen] = useState(false); + const [scrollProgress, setScrollProgress] = useState(0); + const [showScrollIndicator, setShowScrollIndicator] = useState(true); + const [pullToRefresh, setPullToRefresh] = useState(0); + const [isRefreshing, setIsRefreshing] = useState(false); + const location = useLocation(); + const touchStartY = useRef(0); + const pullThreshold = 100; + + // Handle scroll progress + useEffect(() => { + const handleScroll = () => { + const scrollTop = window.scrollY; + const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; + const progress = (scrollTop / scrollHeight) * 100; + setScrollProgress(progress); + setShowScrollIndicator(scrollTop < 100); + }; + + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }, []); + + // Handle pull-to-refresh + const handleTouchStart = (e) => { + if (window.scrollY === 0) { + touchStartY.current = e.touches[0].clientY; + } + }; + + const handleTouchMove = (e) => { + if (window.scrollY === 0) { + const touchY = e.touches[0].clientY; + const pull = touchY - touchStartY.current; + if (pull > 0) { + setPullToRefresh(Math.min(pull, pullThreshold)); + } + } + }; + + const handleTouchEnd = () => { + if (pullToRefresh >= pullThreshold) { + setIsRefreshing(true); + // Simulate refresh + setTimeout(() => { + window.location.reload(); + }, 1000); + } + setPullToRefresh(0); + }; + + // Close menu on route change + useEffect(() => { + setIsOpen(false); + }, [location]); + + // Handle swipe gestures for menu + const handleSwipe = (e) => { + const touchX = e.touches[0].clientX; + const touchY = e.touches[0].clientY; + const startX = e.touches[0].clientX; + const startY = e.touches[0].clientY; + + const deltaX = touchX - startX; + const deltaY = touchY - startY; + + if (Math.abs(deltaX) > Math.abs(deltaY)) { + if (deltaX > 50 && !isOpen) { + setIsOpen(true); + } else if (deltaX < -50 && isOpen) { + setIsOpen(false); + } + } + }; + + return ( + <> + {/* Pull to refresh indicator */} +
0 ? 1 : 0 + }} + > + {isRefreshing && ( +
+ )} +
+ + {/* Mobile Menu Toggle Button */} + + + {/* Mobile Menu */} +
+ +
+ + {/* Scroll Progress Bar */} +
+
+
+ + {/* Touch Gesture Indicator */} + {showScrollIndicator && ( +
+
+
+
+
+ )} + + ); +}; + +export default MobileNav; \ No newline at end of file diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index 586f524..6959eb5 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -1,37 +1,116 @@ +import { useState } from 'react'; +import { Link, useLocation } from 'react-router-dom'; +import hackfedLogo from '../assets/h1.png'; + function Navbar() { + const [isMenuOpen, setIsMenuOpen] = useState(false); + const location = useLocation(); + + const toggleMenu = () => { + setIsMenuOpen(!isMenuOpen); + }; + + const isActive = (path) => { + return location.pathname === path; + }; + return ( -
- -
) } diff --git a/src/components/PastEvents.jsx b/src/components/PastEvents.jsx index f8229e9..e206977 100644 --- a/src/components/PastEvents.jsx +++ b/src/components/PastEvents.jsx @@ -1,51 +1,52 @@ function PastEvents() { return ( -
-
-
-
-
-

Pitchfork Kickstarter Taxidermy

-
-
-

Whatever cardigan tote bag tumblr hexagon brooklyn asymmetrical gentrify, subway tile poke farm-to-table. Franzen you probably haven't heard of them man bun deep jianbing selfies heirloom prism food truck ugh squid celiac humblebrag.

+
+
+
+
+

Past Hackathons

+
-
-
-
- content -

SUBTITLE

-

Chichen Itza

-

Fingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.

-
+

+ Explore our previous hackathon events that brought together talented developers, designers, and innovators at Gautam Buddha University. +

+
+
+
+
+ 24-Hour Code Marathon +

WINTER 2023

+

24-Hour Code Marathon

+

A full-day non-stop coding challenge pushing participants to build complete projects within 24 hours.

-
-
- content -

SUBTITLE

-

Colosseum Roma

-

Fingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.

-
+
+
+
+ Glitch Hackathon +

FALL 2023

+

Glitch Hackathon

+

A creative coding challenge focused on experimental digital art and web experiences.

-
-
- content -

SUBTITLE

-

Great Pyramid of Giza

-

Fingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.

-
+
+
+
+ Entrepreneur Hackathon +

SPRING 2023

+

Entrepreneur Hackathon

+

A hackathon focused on building innovative startup solutions and business models.

-
-
- content -

SUBTITLE

-

San Francisco

-

Fingerstache flexitarian street art 8-bit waistcoat. Distillery hexagon disrupt edison bulbche.

-
+
+
+
+ HackFed Workshop Series +

SUMMER 2023

+

HackFed Workshop Series

+

A series of intensive technical workshops preparing students for hackathons through hands-on project development.

-
+
+
); } diff --git a/src/components/RegistrationModal.jsx b/src/components/RegistrationModal.jsx new file mode 100644 index 0000000..2a9422d --- /dev/null +++ b/src/components/RegistrationModal.jsx @@ -0,0 +1,374 @@ +import React, { useState } from 'react'; + +function RegistrationModal({ isOpen, onClose, eventTitle }) { + const [formData, setFormData] = useState({ + name: '', + email: '', + studentId: '', + phone: '', + course: '', + year: '', + skills: '', + expectation: '', + termsAccepted: false + }); + + const [step, setStep] = useState(1); + const [isSubmitting, setIsSubmitting] = useState(false); + const [isSuccess, setIsSuccess] = useState(false); + + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + setFormData({ + ...formData, + [name]: type === 'checkbox' ? checked : value + }); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + + // Validation + if (step === 1) { + if (!formData.name || !formData.email || !formData.studentId || !formData.phone) { + alert('Please fill all required fields'); + return; + } + setStep(2); + return; + } + + // For step 2 + if (!formData.termsAccepted) { + alert('Please accept the terms and conditions'); + return; + } + + // Submit the form + setIsSubmitting(true); + + // Simulate API call + setTimeout(() => { + setIsSubmitting(false); + setIsSuccess(true); + + // Reset after animation duration (5 seconds) + setTimeout(() => { + setIsSuccess(false); + onClose(); + setFormData({ + name: '', + email: '', + studentId: '', + phone: '', + course: '', + year: '', + skills: '', + expectation: '', + termsAccepted: false + }); + setStep(1); + }, 5000); + }, 1500); + }; + + if (!isOpen) return null; + + return ( +
+
+ +
+ {isSuccess ? ( +
+ {/* Background elements */} +
+
+ {[...Array(30)].map((_, i) => ( +
+ ))} +
+
+
+
+ + {/* Success checkmark animation */} +
+ + + + +
+ + {/* Success text */} +
+

Registration Successful!

+

+ You have successfully registered for {eventTitle}.
Check your email for confirmation. +

+
+ + {/* Confetti */} +
+ {[...Array(40)].map((_, i) => ( +
+ ))} +
+
+ ) : ( + <> +
+
+

Register for {eventTitle}

+ +
+
+ +
+ {step === 1 ? ( + <> +
+
+
+
+
+ Personal Info + Additional Details +
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + ) : ( + <> +
+
+
+
+
+ Personal Info + Additional Details +
+
+ +
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+
+ + )} + +
+ {step === 2 && ( + + )} + +
+
+ + )} +
+
+ ); +} + +export default RegistrationModal; \ No newline at end of file diff --git a/src/components/Stats.jsx b/src/components/Stats.jsx index 5505d58..86573eb 100644 --- a/src/components/Stats.jsx +++ b/src/components/Stats.jsx @@ -1,40 +1,242 @@ +import { useState, useEffect, useRef } from 'react'; +import { motion } from 'framer-motion'; +import AnimatedList from './AnimatedList'; function Stats() { - return ( -
-
-
-
-
-

Empowering Businesses Globally

-

- Our platform is trusted by organizations worldwide to boost productivity, streamline operations, and enhance - customer experiences. -

+ const [animatedStats, setAnimatedStats] = useState({ + students: 0, + events: 0, + projects: 0, + partners: 0 + }); + + const [isVisible, setIsVisible] = useState(false); + const statsRef = useRef(null); + const [selectedStat, setSelectedStat] = useState(null); + + // Target values for the counters + const targetStats = { + students: 1200, + events: 25, + projects: 150, + partners: 18 + }; + + useEffect(() => { + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting) { + setIsVisible(true); + observer.disconnect(); + } + }, + { threshold: 0.2 } + ); + + if (statsRef.current) { + observer.observe(statsRef.current); + } + + return () => { + if (statsRef.current) { + observer.disconnect(); + } + }; + }, []); + + useEffect(() => { + if (!isVisible) return; + + // Animate the counters + const duration = 2000; // 2 seconds + const startTime = Date.now(); + + const interval = setInterval(() => { + const elapsedTime = Date.now() - startTime; + const progress = Math.min(elapsedTime / duration, 1); + + // Easing function for smoother animation + const easeOutQuad = t => t * (2 - t); + const easedProgress = easeOutQuad(progress); + + setAnimatedStats({ + students: Math.floor(easedProgress * targetStats.students), + events: Math.floor(easedProgress * targetStats.events), + projects: Math.floor(easedProgress * targetStats.projects), + partners: Math.floor(easedProgress * targetStats.partners) + }); + + if (progress >= 1) { + clearInterval(interval); + } + }, 16); // ~60fps + + return () => clearInterval(interval); + }, [isVisible]); + + // Stat data with details + const statData = [ + { + name: "Students Engaged", + value: animatedStats.students, + suffix: "+", + icon: ( + + + + ), + description: "Students from GBU and other universities who have participated in our events and initiatives.", + achievement: "Including 200+ first-time hackathon participants and 100+ women in tech." + }, + { + name: "Tech Events Hosted", + value: animatedStats.events, + suffix: "+", + icon: ( + + + + ), + description: "From hackathons to workshops, webinars to tech talks across various domains.", + achievement: "With an average participant satisfaction rating of 4.8/5." + }, + { + name: "Projects Developed", + value: animatedStats.projects, + suffix: "+", + icon: ( + + + + ), + description: "Innovative solutions created by students during our hackathons and project-based learning sessions.", + achievement: "Including 12 projects that secured external funding and 3 startup incorporations." + }, + { + name: "Tech Partners", + value: animatedStats.partners, + suffix: "", + icon: ( + + + + ), + description: "Industry collaborators who provide resources, mentorship, and opportunities to our community.", + achievement: "Including 5 Fortune 500 companies and 7 leading tech startups." + } + ]; + + const handleStatSelect = (item, index) => { + setSelectedStat(index === selectedStat ? null : index); + }; + + const renderStatItem = (item, index, isSelected) => { + return ( + +
+
+
+ {item.icon}
-
-
-
Active Users
-
12,345
-
-
-
Transactions Today
-
1.23M
-
-
-
Total Revenue
-
$5.6B
-
-
-
Happy Customers
-
98%
-
-
+

+ {item.name} +

+ +
+ {item.value.toLocaleString()}{item.suffix} +
+ + {isSelected && ( + +

+ {item.description} +

+
+

+ {item.achievement} +

+
+
+ )} + + + + + + +
+
+ ); + }; + + return ( +
+ {/* Enhanced background with glow effects */} +
+
+
+
+
+ + {/* Decorative elements */} +
+
+ +
+
+ +

+ + HackFed Impact at GBU + +

+

+ + Since our inception, HackFed has fostered innovation and technical growth in the Gautam Buddha University community. + +

+
+ +
- ) + ); } -export default Stats \ No newline at end of file +export default Stats; \ No newline at end of file diff --git a/src/components/StickeyNav.jsx b/src/components/StickeyNav.jsx deleted file mode 100644 index be8bfb5..0000000 --- a/src/components/StickeyNav.jsx +++ /dev/null @@ -1,12 +0,0 @@ - -import React from "react"; - -function StickyNav() { - return ( - <> - nandu - - ); -} - -export default StickyNav; diff --git a/src/components/Styles/Landing.css b/src/components/Styles/Landing.css index dc87a71..927ad25 100644 --- a/src/components/Styles/Landing.css +++ b/src/components/Styles/Landing.css @@ -307,7 +307,7 @@ p { --p:0%; transition:--p 3s linear; - animation: pulse 10s linear 1.2s infinite; + animation: pulse 10s linear 1.2s infinite, float 6s ease-in-out infinite; } .heroT h2:nth-child(2) { @@ -342,7 +342,7 @@ p { height: fit-content; width: fit-content; text-align: center; opacity: 0; translate: 0 1em; - animation: load 2s ease-out 2s forwards, up 1.4s ease-out 2s forwards; + animation: load 2s ease-out 2s forwards, up 1.4s ease-out 2s forwards, gentleFloat 4s ease-in-out infinite; color: #d8ecf8; text-shadow: 0 2px 16px rgba(174,207,242,.24); background: linear-gradient(0deg, #d8ecf8 0, #98c0ef 100%); @@ -355,11 +355,16 @@ p { } .heroSubP { - position: absolute; left: 0; right: 0; top: 13em; margin: auto; + position: absolute; + left: 0; + right: 0; + top: 5em; + margin: auto; height: fit-content; opacity: 0; translate: 0 -1em; animation: load3 2s ease-in 0s forwards, up 1.4s ease-out 0s forwards; + z-index: 10; } @keyframes load3 { 0% { opacity: 0;} @@ -367,13 +372,17 @@ p { } .heroSubP p { font-size: 1em; - position: relative; width: fit-content; margin: auto; + position: relative; + width: fit-content; + margin: auto; color: #d8ecf8; text-shadow: 0 2px 16px rgba(174,207,242,.24); background: linear-gradient(0deg, #d8ecf8 0, #98c0ef 100%); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; + transform: translateZ(0); + transition: transform 0.3s ease-out; } .heroSubP p::before, .heroSubP p::after { @@ -398,6 +407,19 @@ p { translate: 5em 0; } +/* Add parallax effect on scroll */ +@media (min-width: 768px) { + .heroSubP { + /* Removed the transform that was causing issues */ + will-change: opacity; + } + + .heroSubP p { + /* Adjusted for better appearance */ + transform: none; + } +} + .accent-lines { pointer-events: none; position: absolute; top: 0; left: 0; right: 0; @@ -515,11 +537,9 @@ p { .term{ position: absolute; left: 0; right: 0; top: 38em; margin: auto; - - animation: fadeIn 4.5s forwards; /* Apply the fadeIn animation */ + animation: fadeIn 4.5s forwards; /* Apply the fadeIn animation */ } - @keyframes fadeIn { 0% { opacity: 0; /* Start with opacity 0 */ @@ -532,6 +552,31 @@ p { } } +/* Improve terminal component for mobile */ +@media (max-width: 768px) { + .term { + position: absolute; + top: auto; + bottom: 10%; + width: 90% !important; + margin: 0 auto; + transform: scale(0.9); + z-index: 5; + } + + .term .coding { + font-size: 0.8rem; + padding: 0.75rem; + } + + .term .top { + margin-bottom: 0.5rem; + } + + .term .mt-4 { + margin-top: 0.5rem; + } +} .mountains { position: absolute; left: 0; right: 0; top: 31em; margin: auto; @@ -680,3 +725,1982 @@ p { inset 0.2em 0.3em 0.2em -0.2em #c2ccff, inset 10.8em 11.3em 2em -10.5em #d4e6ff2f; } + +/* Glitch Effect for HackFed title - Improved */ +.heroT.glitch { + animation: glitch-effect 0.3s ease-in-out; + position: relative; +} + +.heroT.glitch h2 { + position: relative; +} + +.heroT.glitch h2:before, +.heroT.glitch h2:after { + content: "HackFed"; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0.8; + background: transparent; + transform: translateZ(0); +} + +.heroT.glitch h2:before { + left: 2px; + text-shadow: -2px 0 #00ffea; + clip-path: polygon(0 0, 100% 0, 100% 33%, 0 33%); + animation: glitch-before 0.3s linear alternate-reverse; +} + +.heroT.glitch h2:after { + left: -2px; + text-shadow: 2px 0 #ff00c1; + clip-path: polygon(0 67%, 100% 67%, 100% 100%, 0 100%); + animation: glitch-after 0.3s linear alternate-reverse; +} + +@keyframes glitch-effect { + 0% { + transform: translate(0); + } + 10% { + transform: translate(-2px, 2px); + } + 20% { + transform: translate(-2px, -2px); + } + 30% { + transform: translate(2px, 2px); + } + 40% { + transform: translate(2px, -2px); + } + 50% { + transform: translate(-1px, 1px); + } + 60% { + transform: translate(1px, 1px); + } + 70% { + transform: translate(0, 2px); + } + 80% { + transform: translate(1px, 0); + } + 90% { + transform: translate(-1px, -1px); + } + 100% { + transform: translate(0); + } +} + +@keyframes glitch-before { + 0% { + clip-path: polygon(0 0, 100% 0, 100% 25%, 0 25%); + } + 100% { + clip-path: polygon(0 15%, 100% 15%, 100% 45%, 0 45%); + } +} + +@keyframes glitch-after { + 0% { + clip-path: polygon(0 65%, 100% 65%, 100% 90%, 0 90%); + } + 100% { + clip-path: polygon(0 55%, 100% 55%, 100% 80%, 0 80%); + } +} + +/* New Minimalistic Scroll Down Indicator */ +.scroll-indicator { + position: absolute; + bottom: 32px; + left: 50%; + transform: translateX(-50%); + display: flex; + flex-direction: column; + align-items: center; + cursor: pointer; + z-index: 10; + transition: opacity 0.3s ease, transform 0.3s ease; + opacity: 0; + animation: fade-in 2s ease 4s forwards; +} + +@keyframes fade-in { + 0% { + opacity: 0; + } + 100% { + opacity: 0.7; + } +} + +.scroll-indicator:hover { + opacity: 1; + transform: translateX(-50%) translateY(-3px); +} + +.minimal-indicator { + margin-bottom: 12px; + position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.indicator-text { + font-family: 'Hubot-Sans', sans-serif; + font-size: 14px; + font-weight: 300; + letter-spacing: 3px; + text-transform: lowercase; + color: rgba(152, 192, 239, 0.9); + position: relative; + transition: all 0.3s ease; +} + +.indicator-text::after { + content: ''; + position: absolute; + bottom: -4px; + left: 0; + width: 0; + height: 1px; + background: linear-gradient(to right, rgba(152, 192, 239, 0), rgba(152, 192, 239, 0.8), rgba(152, 192, 239, 0)); + transition: width 0.3s ease-in-out; +} + +.scroll-indicator:hover .indicator-text::after { + width: 100%; +} + +.body.night-mode .indicator-text { + color: rgba(139, 174, 217, 0.9); +} + +.body.night-mode .indicator-text::after { + background: linear-gradient(to right, rgba(139, 174, 217, 0), rgba(139, 174, 217, 0.8), rgba(139, 174, 217, 0)); +} + +.arrow-container { + height: 40px; + position: relative; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + width: 60px; +} + +.arrow { + position: relative; + display: flex; + justify-content: center; + width: 100%; + height: 40px; + overflow: hidden; +} + +.arrow::before, +.arrow::after { + content: ''; + position: absolute; + background-color: #98c0ef; + width: 12px; + border-radius: 4px; + filter: drop-shadow(0 0 6px rgba(152, 192, 239, 0.8)); +} + +.arrow::before { + height: 2px; + left: 18px; + animation: wave-left 2s infinite ease-in-out; +} + +.arrow::after { + height: 2px; + right: 18px; + animation: wave-right 2s infinite ease-in-out; +} + +.arrow::after { + animation-delay: 0.5s; +} + +@keyframes wave-left { + 0% { + top: 20px; + width: 0; + opacity: 0; + } + 20% { + top: 20px; + width: 12px; + opacity: 1; + } + 40% { + top: 30px; + width: 8px; + opacity: 0.8; + } + 60% { + top: 35px; + width: 4px; + opacity: 0.6; + } + 80% { + top: 38px; + width: 2px; + opacity: 0.3; + } + 100% { + top: 40px; + width: 0; + opacity: 0; + } +} + +@keyframes wave-right { + 0% { + top: 20px; + width: 0; + opacity: 0; + } + 20% { + top: 20px; + width: 12px; + opacity: 1; + } + 40% { + top: 30px; + width: 8px; + opacity: 0.8; + } + 60% { + top: 35px; + width: 4px; + opacity: 0.6; + } + 80% { + top: 38px; + width: 2px; + opacity: 0.3; + } + 100% { + top: 40px; + width: 0; + opacity: 0; + } +} + +/* Additional wave elements */ +.arrow::before { + box-shadow: 0 0 8px rgba(152, 192, 239, 0.6); +} + +.arrow::after { + box-shadow: 0 0 8px rgba(152, 192, 239, 0.6); +} + +.arrow span { + content: ''; + position: absolute; + height: 2px; + background-color: #98c0ef; + width: 12px; + border-radius: 4px; + filter: drop-shadow(0 0 6px rgba(152, 192, 239, 0.8)); + left: 24px; + animation: wave-middle 2s infinite ease-in-out; + animation-delay: 0.25s; +} + +@keyframes wave-middle { + 0% { + top: 20px; + width: 0; + opacity: 0; + } + 20% { + top: 20px; + width: 12px; + opacity: 1; + } + 40% { + top: 30px; + width: 8px; + opacity: 0.8; + } + 60% { + top: 35px; + width: 4px; + opacity: 0.6; + } + 80% { + top: 38px; + width: 2px; + opacity: 0.3; + } + 100% { + top: 40px; + width: 0; + opacity: 0; + } +} + +/* Pulse animation for dots */ +@keyframes pulse-dot { + 0% { + transform: scale(0.8); + opacity: 0.3; + } + 100% { + transform: scale(1.2); + opacity: 0.7; + } +} + +/* Day/Night Mode Styles */ +body.night-mode { + background: #03040a linear-gradient(0deg, rgba(125, 146, 216, 0.03), rgba(78, 123, 181, 0.05)); +} + +.body.night-mode .accent-lines { + --accent-lines-clr: rgba(137, 162, 193, 0.15); +} + +.body.night-mode .heroT > h2 { + color: #8baed9; + background: + radial-gradient( 2em 2em at 50% 50%, + transparent calc(var(--p) - 2em), + #d9e1f1 calc(var(--p) - 1em), + #d9e1f1 calc(var(--p) - 0.4em), + transparent var(--p) + ), + linear-gradient(0deg, #8baed9 30%, #7a9acf 100%); + background-clip: text; + -webkit-background-clip: text; +} + +.body.night-mode .heroP, +.body.night-mode .heroSubP p { + color: #c8d7f0; + background: linear-gradient(0deg, #c8d7f0 0, #8baed9 100%); + background-clip: text; + -webkit-background-clip: text; +} + +/* Adjust arrow for night mode */ +.body.night-mode .arrow::before, +.body.night-mode .arrow::after, +.body.night-mode .arrow span { + background-color: #8baed9; + box-shadow: 0 0 8px rgba(139, 174, 217, 0.7); +} + +/* Keep these for backwards compatibility */ +.body.night-mode .prompt-cursor { + background-color: #8baed9; +} + +.body.night-mode .prompt-symbol { + color: #52b788; +} + +/* JoinUs Component Styles */ +.night-mode .joinus-section { + background: #000000; +} + +.joinus-form input:focus { + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3); +} + +.social-link { + transition: all 0.3s ease-in-out; +} + +.social-link:hover .icon-wrapper { + transform: scale(1.1); +} + +.newsletter-form-wrapper { + position: relative; +} + +.newsletter-form-wrapper::before { + content: ''; + position: absolute; + top: -1px; + left: -1px; + right: -1px; + bottom: -1px; + background: linear-gradient(45deg, rgba(79, 70, 229, 0.6), rgba(6, 182, 212, 0.6)); + border-radius: 0.5rem; + z-index: -1; + opacity: 0; + transition: opacity 0.3s ease; +} + +.newsletter-form-wrapper:hover::before { + opacity: 0.2; +} + +@keyframes pulse-border { + 0% { + box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.2); + } + 70% { + box-shadow: 0 0 0 8px rgba(59, 130, 246, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); + } +} + +.pulse-animation { + animation: pulse-border 3s infinite; +} + +/* Override night mode text colors for JoinUs */ +.night-mode .join-title { + color: rgba(255, 255, 255, 0.9); +} + +.night-mode .join-text { + color: rgba(209, 213, 219, 0.7); +} + +/* Responsive adjustments for JoinUs section */ +@media (max-width: 768px) { + .join-us-grid { + grid-template-columns: 1fr; + } +} + +/* FAQ Component Styles */ +.faq-accordion { + position: relative; + transition: all 0.3s ease; +} + +.faq-accordion:hover { + box-shadow: 0 0 15px rgba(255, 255, 255, 0.05); + transform: translateY(-2px); +} + +.faq-accordion::before { + content: ''; + position: absolute; + inset: 0; + border-radius: 0.75rem; + padding: 1px; + background: linear-gradient( + to right, + rgba(255, 255, 255, 0.05), + rgba(128, 153, 219, 0.08) + ); + -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + pointer-events: none; + opacity: 0; + transition: opacity 0.3s ease; +} + +.faq-accordion:hover::before { + opacity: 1; +} + +.faq-button:focus { + outline: none; +} + +.faq-button:hover .faq-question { + color: rgba(191, 203, 245, 0.9); +} + +.faq-content { + position: relative; +} + +.faq-content::before { + content: ''; + position: absolute; + left: 1.25rem; + top: 0; + height: 100%; + width: 1px; + background: linear-gradient(to bottom, rgba(255, 255, 255, 0.05), transparent); + opacity: 0.5; +} + +/* Adjust plus/minus icon */ +.faq-icon { + transition: all 0.3s ease; +} + +.faq-button:hover .faq-icon { + color: rgba(191, 203, 245, 0.9); +} + +/* Subtle animation for the FAQ answers */ +@keyframes fadeInContent { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.faq-answer-visible { + animation: fadeInContent 0.4s ease-out forwards; +} + +/* FAQ section background effects */ +.faq-bg-glow { + position: absolute; + width: 350px; + height: 350px; + border-radius: 50%; + background: radial-gradient( + circle, + rgba(114, 134, 211, 0.03) 0%, + rgba(29, 42, 90, 0.015) 50%, + transparent 70% + ); + filter: blur(40px); + opacity: 0.4; + z-index: 0; +} + +/* About Page Styles */ +.about-hero-bg { + background: radial-gradient(circle at center, rgba(16, 24, 39, 0.5) 0%, rgba(0, 0, 0, 0) 70%); + filter: blur(100px); + width: 80%; + height: 60%; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: -1; +} + +.about-stat-item { + position: relative; + transition: transform 0.3s ease-out; +} + +.about-stat-item:hover { + transform: translateY(-5px); +} + +.about-stat-item::before { + content: ''; + position: absolute; + top: -8px; + left: -8px; + right: -8px; + bottom: -8px; + border-radius: 16px; + background: linear-gradient(45deg, rgba(59, 130, 246, 0.1), rgba(6, 182, 212, 0.1)); + z-index: -1; + opacity: 0; + transition: opacity 0.3s ease-out; +} + +.about-stat-item:hover::before { + opacity: 1; +} + +.about-section-title { + position: relative; + display: inline-block; +} + +.about-section-title::after { + content: ''; + position: absolute; + bottom: -10px; + left: 0; + width: 60px; + height: 3px; + background: linear-gradient(to right, #3b82f6, #06b6d4); + border-radius: 3px; +} + +.university-image { + position: relative; + overflow: hidden; + border-radius: 0.75rem; +} + +.university-image::before { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.8) 100%); + z-index: 1; +} + +.university-image img { + transition: transform 0.5s ease; +} + +.university-image:hover img { + transform: scale(1.05); +} + +/* Gallery Hover Effects */ +.gallery-image-wrapper { + overflow: hidden; + position: relative; +} + +.gallery-image-wrapper img { + transition: transform 0.5s ease; +} + +.gallery-image-wrapper:hover img { + transform: scale(1.1); +} + +.gallery-overlay { + position: absolute; + inset: 0; + background: linear-gradient(to top, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0) 100%); + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 1.5rem; + opacity: 0; + transition: opacity 0.3s ease; +} + +.gallery-image-wrapper:hover .gallery-overlay { + opacity: 1; +} + +/* Team Member Card Styles */ +.team-member-card { + position: relative; + overflow: hidden; +} + +.team-member-card::before { + content: ''; + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: linear-gradient(45deg, rgba(59, 130, 246, 0.3), rgba(6, 182, 212, 0.3)); + border-radius: inherit; + z-index: -1; + opacity: 0; + transition: opacity 0.3s ease; +} + +.team-member-card:hover::before { + opacity: 1; +} + +.social-icon { + transition: all 0.2s ease; +} + +.social-icon:hover { + transform: translateY(-3px); + color: #3b82f6; +} + +/* Animation for About Page */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.about-animate-1 { + animation: fadeInUp 0.6s ease forwards; +} + +.about-animate-2 { + animation: fadeInUp 0.6s 0.2s ease forwards; + opacity: 0; +} + +.about-animate-3 { + animation: fadeInUp 0.6s 0.4s ease forwards; + opacity: 0; +} + +.about-animate-4 { + animation: fadeInUp 0.6s 0.6s ease forwards; + opacity: 0; +} + +/* Mission Statement */ +.mission-card { + position: relative; + overflow: hidden; +} + +.mission-card::after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(45deg, rgba(59, 130, 246, 0.05) 0%, rgba(6, 182, 212, 0.05) 100%); + opacity: 0; + transition: opacity 0.3s ease; +} + +.mission-card:hover::after { + opacity: 1; +} + +/* Vision Statement */ +.vision-bg { + background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%233b82f6' fill-opacity='0.05' fill-rule='evenodd'/%3E%3C/svg%3E"); +} + +/* About page stats */ +.about-stats-container { + position: relative; + overflow: hidden; +} + +.about-stats-container::before { + content: ''; + position: absolute; + top: -50px; + right: -50px; + width: 150px; + height: 150px; + background: radial-gradient(circle, rgba(59, 130, 246, 0.1) 0%, rgba(59, 130, 246, 0) 70%); + border-radius: 50%; +} + +.about-stats-container::after { + content: ''; + position: absolute; + bottom: -50px; + left: -50px; + width: 150px; + height: 150px; + background: radial-gradient(circle, rgba(6, 182, 212, 0.1) 0%, rgba(6, 182, 212, 0) 70%); + border-radius: 50%; +} + +/* ========== Success Animation Styles ========== */ +.success-animation { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-height: 400px; + padding: 3rem 1.5rem; + overflow: hidden; + z-index: 1; +} + +/* Background elements */ +.success-animation-background { + position: absolute; + inset: 0; + z-index: -1; +} + +.success-ripple { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 0; + height: 0; + border-radius: 50%; + background: radial-gradient(circle, rgba(72, 187, 120, 0.15) 0%, rgba(72, 187, 120, 0) 70%); + animation: ripple 1.5s ease-out forwards; +} + +.success-glow { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 150px; + height: 150px; + border-radius: 50%; + background: radial-gradient(circle, rgba(72, 187, 120, 0.3) 0%, rgba(72, 187, 120, 0) 70%); + filter: blur(10px); + animation: glow 3s ease-in-out infinite alternate; +} + +/* Checkmark animation */ +.checkmark-container { + width: 100px; + height: 100px; + margin-bottom: 2rem; +} + +.checkmark { + width: 100px; + height: 100px; + border-radius: 50%; + display: block; + stroke-width: 3; + stroke: #4BB543; + stroke-miterlimit: 10; + box-shadow: 0 0 20px rgba(75, 181, 67, 0.3); + animation: fill 0.4s ease-in-out 0.4s forwards, scale 0.3s ease-in-out 0.9s both; +} + +.checkmark-circle { + stroke-dasharray: 166; + stroke-dashoffset: 166; + stroke-width: 2; + stroke-miterlimit: 10; + stroke: #4BB543; + fill: none; + animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards; +} + +.checkmark-check { + transform-origin: 50% 50%; + stroke-dasharray: 48; + stroke-dashoffset: 48; + animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards; +} + +/* Text animation */ +.success-text { + text-align: center; + animation: fadeInUp 0.8s ease-out 1.2s both; +} + +.success-title { + font-size: 2rem; + font-weight: 700; + color: white; + margin-bottom: 0.5rem; +} + +.success-message { + color: rgba(255, 255, 255, 0.8); + max-width: 400px; + line-height: 1.5; +} + +/* Particles animation */ +.particle-container { + position: absolute; + inset: 0; + pointer-events: none; +} + +.particle { + position: absolute; + left: var(--x); + top: var(--y); + width: var(--size); + height: var(--size); + border-radius: 50%; + background-color: var(--color); + opacity: 0; + transform: scale(0); + animation: particle 1.5s cubic-bezier(0.22, 1, 0.36, 1) var(--delay) forwards; +} + +/* Confetti animation */ +.confetti-container { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + z-index: 1; +} + +.confetti { + position: absolute; + top: -5%; + left: 50%; + width: var(--size); + height: var(--size); + transform: rotate(var(--rotation)); + opacity: 0; + animation: confetti 4s ease-in-out var(--delay) forwards; +} + +/* Animations */ +@keyframes stroke { + 100% { + stroke-dashoffset: 0; + } +} + +@keyframes scale { + 0%, 100% { + transform: none; + } + 50% { + transform: scale3d(1.1, 1.1, 1); + } +} + +@keyframes fill { + 100% { + box-shadow: inset 0 0 0 100px rgba(75, 181, 67, 0.2); + } +} + +@keyframes ripple { + 0% { + width: 0; + height: 0; + opacity: 1; + } + 100% { + width: 500px; + height: 500px; + opacity: 0; + } +} + +@keyframes glow { + 0% { + opacity: 0.5; + transform: translate(-50%, -50%) scale(0.8); + } + 100% { + opacity: 1; + transform: translate(-50%, -50%) scale(1.1); + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes particle { + 0% { + opacity: 0; + transform: scale(0); + } + 20% { + opacity: 0.8; + transform: scale(1); + } + 50%, 80% { + opacity: 0.5; + } + 100% { + opacity: 0; + transform: scale(0.5) translate3d(50px, -50px, 0); + } +} + +@keyframes confetti { + 0% { + opacity: 0; + transform: translateX(-50%) rotate(var(--rotation)) translateY(0); + } + 10% { + opacity: 1; + } + 100% { + opacity: 0; + transform: translateX(calc(-50% + var(--distance))) rotate(calc(var(--rotation) + 720deg)) translateY(100vh); + } +} + +.fuzzy-text-container { + position: relative; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + height: 100%; + margin: 0 auto; +} + +.fuzzy-text-container canvas { + max-width: 100%; + height: auto; + display: block; +} + +.glitch-container { + position: relative; + width: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +.glitch-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + mix-blend-mode: difference; + filter: blur(1px); + animation: glitch-animation 0.3s ease-in-out; +} + +@keyframes glitch-animation { + 0% { + transform: translate(0); + } + 20% { + transform: translate(-5px, 5px); + } + 40% { + transform: translate(-5px, -5px); + } + 60% { + transform: translate(5px, 5px); + } + 80% { + transform: translate(5px, -5px); + } + 100% { + transform: translate(0); + } +} + +/* Floating animation for greeting text */ +.heroSubP { + position: absolute; + left: 0; + right: 0; + top: 5em; + margin: auto; + height: fit-content; + opacity: 0; + translate: 0 -1em; + animation: load3 2s ease-in 0s forwards, up 1.4s ease-out 0s forwards; + z-index: 10; +} +@keyframes load3 { + 0% { opacity: 0;} + 100% { opacity: 0.7;} +} +.heroSubP p { + font-size: 1em; + position: relative; + width: fit-content; + margin: auto; + color: #d8ecf8; + text-shadow: 0 2px 16px rgba(174,207,242,.24); + background: linear-gradient(0deg, #d8ecf8 0, #98c0ef 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + transform: translateZ(0); + transition: transform 0.3s ease-out; +} +.heroSubP p::before, +.heroSubP p::after { + position: absolute; top: 60%; + display: block; content: ''; + width: 5em; height: 1px; + opacity: 0; + animation: load2 1.4s ease-in-out 0s forwards, up 1.4s ease-out 0s forwards; +} +@keyframes load2 { + 0% { opacity: 0;} + 100% { opacity: 0.3;} +} +.heroSubP p::before{ + background: linear-gradient( -90deg, #9dc3f7 0%, transparent 100%); + right: 120%; + translate: -5em 0; +} +.heroSubP p::after { + background: linear-gradient( 90deg, #9dc3f7 0%, transparent 100%); + left: 120%; + translate: 5em 0; +} + +/* Add parallax effect on scroll */ +@media (min-width: 768px) { + .heroSubP { + /* Removed the transform that was causing issues */ + will-change: opacity; + } + + .heroSubP p { + /* Adjusted for better appearance */ + transform: none; + } +} + +/* Floating animation for tagline */ +.heroP { + font-size: 1.2em; + position: absolute; left: 0; right: 0; top: 20.6em; margin: auto; + height: fit-content; width: fit-content; text-align: center; + opacity: 0; + translate: 0 1em; + animation: load 2s ease-out 2s forwards, up 1.4s ease-out 2s forwards, gentleFloat 4s ease-in-out infinite; + color: #d8ecf8; + text-shadow: 0 2px 16px rgba(174,207,242,.24); + background: linear-gradient(0deg, #d8ecf8 0, #98c0ef 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +/* New keyframe animations */ +@keyframes float { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-10px); + } +} + +@keyframes gentleFloat { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-5px); + } +} + +/* Navigation Menu Animations */ +.nav-menu-item { + position: relative; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.nav-menu-item:hover { + transform: translateY(-2px); +} + +.nav-menu-item::after { + content: ''; + position: absolute; + bottom: -2px; + left: 0; + width: 100%; + height: 2px; + background: linear-gradient(to right, rgba(59, 130, 246, 0.5), rgba(6, 182, 212, 0.5)); + transform: scaleX(0); + transform-origin: right; + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.nav-menu-item:hover::after { + transform: scaleX(1); + transform-origin: left; +} + +/* Sticky Nav Animation */ +.sticky-nav { + backdrop-filter: blur(8px); + background: rgba(17, 24, 39, 0.8); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); +} + +.sticky-nav.hidden { + transform: translateY(-100%); + opacity: 0; +} + +.sticky-nav.visible { + transform: translateY(0); + opacity: 1; +} + +/* Nav Logo Animation */ +.nav-logo { + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.nav-logo:hover { + transform: translateY(-2px); +} + +/* Mobile Menu Animation */ +.mobile-menu { + position: fixed; + top: 0; + right: -100%; + width: 100%; + height: 100vh; + background: rgba(0, 0, 0, 0.95); + backdrop-filter: blur(10px); + z-index: 50; + transition: right 0.3s ease-in-out; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +.mobile-menu.visible { + right: 0; +} + +.mobile-menu-content { + padding: 2rem; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.mobile-menu-item { + font-size: 1.25rem; + padding: 1rem 0; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.mobile-menu-item::before { + content: ''; + position: absolute; + left: 0; + bottom: 0; + width: 0; + height: 2px; + background: linear-gradient(90deg, #3b82f6, #60a5fa); + transition: width 0.3s ease; +} + +.mobile-menu-item:hover::before { + width: 100%; +} + +.mobile-menu-item.active { + color: #3b82f6; + font-weight: 500; +} + +.mobile-menu-item.active::before { + width: 100%; +} + +/* Touch Gesture Styles */ +.touch-gesture { + position: fixed; + bottom: 2rem; + left: 50%; + transform: translateX(-50%); + width: 40px; + height: 40px; + background: rgba(59, 130, 246, 0.2); + border: 2px solid rgba(59, 130, 246, 0.5); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + z-index: 100; + transition: all 0.3s ease; +} + +.touch-gesture::before { + content: ''; + width: 20px; + height: 20px; + border-right: 2px solid rgba(59, 130, 246, 0.8); + border-bottom: 2px solid rgba(59, 130, 246, 0.8); + transform: rotate(45deg); + margin-top: -5px; + animation: bounce 2s infinite; +} + +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% { + transform: translateY(0) rotate(45deg); + } + 40% { + transform: translateY(-10px) rotate(45deg); + } + 60% { + transform: translateY(-5px) rotate(45deg); + } +} + +/* Mobile Form Input Styles */ +.mobile-input { + width: 100%; + padding: 1rem; + background: rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 0.5rem; + color: white; + font-size: 1rem; + transition: all 0.3s ease; + -webkit-appearance: none; + appearance: none; +} + +.mobile-input:focus { + outline: none; + border-color: #3b82f6; + background: rgba(255, 255, 255, 0.1); + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2); +} + +.mobile-input::placeholder { + color: rgba(255, 255, 255, 0.5); +} + +/* Mobile Image Optimization */ +.mobile-image { + width: 100%; + height: auto; + max-width: 100%; + object-fit: cover; + transition: transform 0.3s ease; +} + +.mobile-image:hover { + transform: scale(1.02); +} + +/* Mobile Scroll Indicator */ +.mobile-scroll-indicator { + position: fixed; + bottom: 2rem; + left: 50%; + transform: translateX(-50%); + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + opacity: 0; + transition: opacity 0.3s ease; +} + +.mobile-scroll-indicator.visible { + opacity: 1; +} + +.mobile-scroll-text { + font-size: 0.875rem; + color: rgba(255, 255, 255, 0.7); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +/* Mobile Menu Toggle Button */ +.mobile-menu-toggle { + position: relative; + width: 30px; + height: 20px; + cursor: pointer; + z-index: 51; + transition: all 0.3s ease; +} + +.mobile-menu-toggle span { + position: absolute; + width: 100%; + height: 2px; + background: white; + border-radius: 2px; + transition: all 0.3s ease; +} + +.mobile-menu-toggle span:nth-child(1) { + top: 0; +} + +.mobile-menu-toggle span:nth-child(2) { + top: 50%; + transform: translateY(-50%); +} + +.mobile-menu-toggle span:nth-child(3) { + bottom: 0; +} + +.mobile-menu-toggle.active span:nth-child(1) { + transform: translateY(9px) rotate(45deg); +} + +.mobile-menu-toggle.active span:nth-child(2) { + opacity: 0; +} + +.mobile-menu-toggle.active span:nth-child(3) { + transform: translateY(-9px) rotate(-45deg); +} + +/* Mobile Container Padding */ +@media (max-width: 768px) { + .container { + padding-left: 1rem; + padding-right: 1rem; + } +} + +/* Mobile Touch Feedback */ +.touch-feedback { + position: relative; + overflow: hidden; +} + +.touch-feedback::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 100px; + height: 100px; + background: radial-gradient(circle, rgba(59, 130, 246, 0.2) 0%, transparent 70%); + transform: translate(-50%, -50%) scale(0); + opacity: 0; + transition: transform 0.3s ease, opacity 0.3s ease; +} + +.touch-feedback:active::after { + transform: translate(-50%, -50%) scale(1); + opacity: 1; +} + +/* Mobile Scroll Progress */ +.mobile-scroll-progress { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 2px; + background: linear-gradient(to right, #3b82f6 var(--scroll), transparent 0); + z-index: 1000; + transition: opacity 0.3s ease; +} + +.mobile-scroll-progress.hidden { + opacity: 0; +} + +/* Mobile-specific animations */ +@keyframes slideInUp { + from { + transform: translateY(20px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +@keyframes slideInDown { + from { + transform: translateY(-20px); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes scaleIn { + from { + transform: scale(0.95); + opacity: 0; + } + to { + transform: scale(1); + opacity: 1; + } +} + +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 25% { transform: translateX(-5px); } + 75% { transform: translateX(5px); } +} + +/* Mobile-specific classes */ +.mobile-slide-up { + animation: slideInUp 0.3s ease-out forwards; +} + +.mobile-slide-down { + animation: slideInDown 0.3s ease-out forwards; +} + +.mobile-fade-in { + animation: fadeIn 0.3s ease-out forwards; +} + +.mobile-scale-in { + animation: scaleIn 0.3s ease-out forwards; +} + +.mobile-shake { + animation: shake 0.3s ease-in-out; +} + +/* Enhanced mobile input styles */ +.mobile-input { + @apply w-full px-4 py-3 bg-black/50 border border-gray-700 rounded-lg text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-400/50 transition-all duration-300; + font-size: 16px; /* Prevents zoom on iOS */ +} + +/* Mobile menu animations */ +.mobile-menu-enter { + opacity: 0; + transform: translateX(100%); +} + +.mobile-menu-enter-active { + opacity: 1; + transform: translateX(0); + transition: opacity 300ms, transform 300ms; +} + +.mobile-menu-exit { + opacity: 1; + transform: translateX(0); +} + +.mobile-menu-exit-active { + opacity: 0; + transform: translateX(100%); + transition: opacity 300ms, transform 300ms; +} + +/* Mobile scroll indicator */ +@keyframes scrollIndicator { + 0% { + transform: translateY(0); + opacity: 1; + } + 50% { + transform: translateY(10px); + opacity: 0.5; + } + 100% { + transform: translateY(0); + opacity: 1; + } +} + +.animate-scroll { + animation: scrollIndicator 2s infinite; +} + +/* Mobile touch feedback */ +.touch-feedback { + position: relative; + overflow: hidden; +} + +.touch-feedback::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 100px; + height: 100px; + background: rgba(255, 255, 255, 0.1); + border-radius: 50%; + transform: translate(-50%, -50%) scale(0); + opacity: 0; + transition: transform 0.3s, opacity 0.3s; +} + +.touch-feedback:active::after { + transform: translate(-50%, -50%) scale(1); + opacity: 1; +} + +/* Mobile pull-to-refresh */ +.pull-to-refresh { + position: fixed; + top: 0; + left: 0; + right: 0; + height: 3px; + background: linear-gradient(to right, #3b82f6, #60a5fa); + transform-origin: left; + transition: transform 0.3s; +} + +/* Mobile-specific media queries */ +@media (max-width: 768px) { + .container { + padding-left: 1rem; + padding-right: 1rem; + } + + .mobile-stack { + display: flex; + flex-direction: column; + gap: 1rem; + } + + .mobile-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 1rem; + } + + .mobile-text-center { + text-align: center; + } + + .mobile-mt-4 { + margin-top: 1rem; + } + + .mobile-mb-4 { + margin-bottom: 1rem; + } +} + +/* Mobile-specific transitions */ +.mobile-transition { + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.mobile-transition-slow { + transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Mobile-specific hover effects */ +@media (hover: none) { + .mobile-hover-none:hover { + transform: none !important; + opacity: 1 !important; + } +} + +/* Mobile-specific focus styles */ +.mobile-focus-ring { + @apply focus:outline-none focus:ring-2 focus:ring-blue-400/50 focus:ring-offset-2 focus:ring-offset-black; +} + +/* Mobile-specific active states */ +.mobile-active-scale { + @apply active:scale-95 transition-transform duration-200; +} + +/* Mobile-specific loading states */ +.mobile-loading { + position: relative; + overflow: hidden; +} + +.mobile-loading::after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient( + 90deg, + transparent, + rgba(255, 255, 255, 0.1), + transparent + ); + animation: loading 1.5s infinite; +} + +@keyframes loading { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(100%); + } +} + +/* Mobile-specific scrollbar */ +@media (max-width: 768px) { + ::-webkit-scrollbar { + width: 4px; + } + + ::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.1); + } + + ::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.2); + border-radius: 2px; + } + + ::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.3); + } +} + +/* Mobile-specific text selection */ +@media (max-width: 768px) { + ::selection { + background: rgba(59, 130, 246, 0.3); + color: white; + } +} + +/* Mobile-specific tap highlight */ +@media (max-width: 768px) { + * { + -webkit-tap-highlight-color: transparent; + } +} + +/* Mobile-specific font smoothing */ +@media (max-width: 768px) { + body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } +} + +/* Mobile-specific viewport height */ +@media (max-width: 768px) { + .mobile-vh-100 { + min-height: 100vh; + min-height: -webkit-fill-available; + } +} + +/* Mobile-specific safe areas */ +@media (max-width: 768px) { + .mobile-safe-top { + padding-top: env(safe-area-inset-top); + } + + .mobile-safe-bottom { + padding-bottom: env(safe-area-inset-bottom); + } +} + +/* Connect Section Styles */ +.connect-bg-glow { + position: absolute; + width: 150%; + height: 150%; + top: -25%; + left: -25%; + background: radial-gradient( + circle at center, + rgba(99, 102, 241, 0.05) 0%, + rgba(168, 85, 247, 0.05) 25%, + rgba(236, 72, 153, 0.05) 50%, + transparent 70% + ); + animation: rotate 20s linear infinite; + pointer-events: none; +} + +@keyframes rotate { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} + +@keyframes float { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-20px); + } +} + +/* Card hover effects */ +.connect-card { + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.connect-card:hover { + transform: translateY(-4px); +} + +.connect-card:active { + transform: scale(0.98); +} + +/* Stats animation */ +.stat-item { + position: relative; +} + +.stat-item::after { + content: ''; + position: absolute; + bottom: -2px; + left: 50%; + width: 0; + height: 2px; + background: linear-gradient(90deg, transparent, currentColor, transparent); + transform: translateX(-50%); + transition: width 0.3s ease; +} + +.stat-item:hover::after { + width: 80%; +} + +/* Loading animation */ +@keyframes pulse { + 0%, 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +/* Floating dots animation */ +@keyframes float-dot { + 0%, 100% { + transform: translate(0, 0); + } + 25% { + transform: translate(10px, -10px); + } + 50% { + transform: translate(0, -20px); + } + 75% { + transform: translate(-10px, -10px); + } +} + +.floating-dot { + animation: float-dot 5s ease-in-out infinite; +} + +/* Card hover transition */ +.connect-card-content { + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.connect-card:hover .connect-card-content { + transform: translateY(-4px); +} + +/* Stats counter animation */ +@keyframes countUp { + from { + transform: translateY(100%); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +.stat-number { + display: inline-block; + animation: countUp 0.5s cubic-bezier(0.4, 0, 0.2, 1) forwards; +} + +/* Card click effect */ +.connect-card:active::after { + content: ''; + position: absolute; + inset: 0; + background: radial-gradient(circle at var(--x) var(--y), rgba(255,255,255,0.1) 0%, transparent 50%); + pointer-events: none; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .connect-cards-grid { + grid-template-columns: 1fr; + } + + .stat-bar { + flex-wrap: wrap; + gap: 2rem; + } +} + +/* Add this section to improve mobile display of hero elements */ +@media (max-width: 768px) { + .heroSubP { + top: 3em !important; + } + + .hero { + padding-top: 0; + margin-top: -2em; + } + + .fuzzy-text-container { + margin-top: 0; + line-height: 1; + } + + .heroP { + top: auto !important; + bottom: 35%; + line-height: 1.4; + } + + .term { + margin-top: 1em; + } + + .scroll-indicator { + bottom: 10% !important; + } +} + +/* Improve scroll indicator visibility */ +.scroll-indicator { + position: absolute; + bottom: 5%; + left: 50%; + transform: translateX(-50%); + cursor: pointer; + text-align: center; + z-index: 10; +} diff --git a/src/components/Team.jsx b/src/components/Team.jsx index 58b0164..ca6ca07 100644 --- a/src/components/Team.jsx +++ b/src/components/Team.jsx @@ -1,128 +1,163 @@ -import React from 'react' +import React from 'react'; +import './Styles/Landing.css'; const Team = () => { return ( -
-
-
-
-

OUR TEAM

-

Whatever cardigan tote bag tumblr hexagon brooklyn asymmetrical gentrify, subway tile poke farm-to-table. Franzen you probably haven't heard of them.

+
+ {/* Background elements */} +
+
+
+
+ + {/* Background glow */} +
+ +
+
+
+

+ Our Leadership Team +

+

+ Meet the dedicated individuals from Gautam Buddha University who make HackFed possible +

-
-
-
- team -
-

Holden Caulfield

-

UI Developer

-

DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware.

- - - - - - - - - - - - - - - - - -
+ +
+ {/* Team Member 1 */} +
+
+
+ Prof. Rajesh Kumar
-
-
-
- team -
-

Alper Kamu

-

Designer

-

DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware.

- - - - - - - - - - - - - - - - - +
+

Prof. Rajesh Kumar

+

Faculty Advisor

+ +

+ Professor of Computer Science at GBU with 15+ years of experience in technology education and research. +

-
-
- team -
-

Atticus Finch

-

UI Developer

-

DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware.

- - - - - - - - - - - - - - - - - + + {/* Team Member 2 */} +
+
+
+ Dr. Priya Sharma +
+
+

Dr. Priya Sharma

+

Technical Director

+ +

+ Leading technology innovation at GBU with expertise in AI and machine learning applications. +

-
-
- team -
-

Henry Letham

-

Designer

-

DIY tote bag drinking vinegar cronut adaptogen squid fanny pack vaporware.

- - - - - - - - - - - - - - - - - + + {/* Team Member 3 */} +
+
+
+ Amit Patel +
+
+

Amit Patel

+

Student Coordinator

+ +

+ Final year Computer Science student and hackathon champion leading student initiatives. +

+ + {/* Join the team CTA */} +
+
+

+ Join Our Team +

+

+ Are you a GBU student passionate about technology and innovation? We're always looking for talented individuals to join our organizing team. +

+ + Apply Now + + + + +
+
-
-
- ) +
+
+ ); } -export default Team +export default Team; diff --git a/src/components/Term.jsx b/src/components/Term.jsx index ae53ab9..6e9075e 100644 --- a/src/components/Term.jsx +++ b/src/components/Term.jsx @@ -2,23 +2,23 @@ const Term = () => { return (
-
+
-
- Hackfed@Community:~$ - +
+ Hackfed@GBU:~$ + sudo rm -rf /limits && echo "No limits, just innovation."
-
- Hackfed@Community:~$ - +
+ Hackfed@GBU:~$ + echo "Deploying creativity..." && ./build-dreams --target=world diff --git a/src/components/UpcommingEvent.jsx b/src/components/UpcommingEvent.jsx index 24d7d49..bc36f6d 100644 --- a/src/components/UpcommingEvent.jsx +++ b/src/components/UpcommingEvent.jsx @@ -1,33 +1,103 @@ +import React, { useState } from 'react'; +import RegistrationModal from './RegistrationModal'; + function UpcomingEvent() { + const [isModalOpen, setIsModalOpen] = useState(false); + + const handleRegisterClick = (e) => { + e.preventDefault(); + setIsModalOpen(true); + }; + return (
-
+
-

- Moon hashtag pop-up try-hard offal truffaut -

-
- Pour-over craft beer pug drinking vinegar live-edge gastropub, keytar neutra sustainable fingerstache kickstarter. Pour-over craft beer pug drinking vinegar live-edge gastropub, keytar neutra sustainable fingerstache kickstarter. -
- Pour-over craft beer pug drinking vinegar live-edge gastropub, keytar neutra sustainable fingerstache kickstarter. +
+ Official GBU Event
-
Create Your First Form +

+ Ignition Hackathon 2025 +

+
+ A dynamic 24-hour Hackathon, intensive boot camp, coding competitions, and cybersecurity challenges set the stage for skill elevation. Engage in interactive workshops, enjoy an evening cultural show, and connect with tech communities and industry experts. +
+
+
+
+ + + +
+
+

24-Hour Challenge

+

Non-stop coding experience

+
+
+
+
+ + + + +
+
+

Greater Noida, UP

+

Greater Noida, UP

+
+
+
+
+ + + Learn More + + + +
-
- stats +
+
+
+ GBU Ignition Hackathon +
+
+ + Registration Open +
+
+
+ + {/* Registration Modal */} + setIsModalOpen(false)} + eventTitle="GBU Ignition Hackathon 2024" + />
); } diff --git a/src/main.jsx b/src/main.jsx index 89f91e5..7431a78 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,10 +1,12 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' +import { Analytics } from '@vercel/analytics/react' import App from './App.jsx' import './index.css' createRoot(document.getElementById('root')).render( + , ) diff --git a/src/pages/AskQuestion.jsx b/src/pages/AskQuestion.jsx new file mode 100644 index 0000000..fff6c03 --- /dev/null +++ b/src/pages/AskQuestion.jsx @@ -0,0 +1,275 @@ +import { useState } from 'react'; + +function AskQuestion() { + const [formData, setFormData] = useState({ + name: '', + email: '', + topic: 'general', + question: '', + agree: false + }); + + const [formStatus, setFormStatus] = useState({ + submitting: false, + submitted: false, + error: null + }); + + const handleChange = (e) => { + const { name, value, type, checked } = e.target; + setFormData(prev => ({ + ...prev, + [name]: type === 'checkbox' ? checked : value + })); + }; + + const handleSubmit = (e) => { + e.preventDefault(); + + // Validate form + if (!formData.name || !formData.email || !formData.question || !formData.agree) { + setFormStatus({ + submitting: false, + submitted: false, + error: 'Please fill out all required fields' + }); + return; + } + + // Submit form + setFormStatus({ + submitting: true, + submitted: false, + error: null + }); + + // Simulate API call + setTimeout(() => { + // Success response + setFormStatus({ + submitting: false, + submitted: true, + error: null + }); + + // Reset form + setFormData({ + name: '', + email: '', + topic: 'general', + question: '', + agree: false + }); + }, 1500); + }; + + return ( +
+ {/* Hero Section */} +
+ {/* Background elements */} +
+
+
+
+
+ + {/* Animated glow */} +
+ +
+
+

+ Ask Your Question +

+

+ Can't find the answer you're looking for? Submit your question to the HackFed team, and we'll get back to you as soon as possible. +

+
+
+
+ + {/* Form Section */} +
+
+ {/* Tech pattern overlay on the form */} +
+
+
+ + {/* Form content */} +
+ {formStatus.submitted ? ( +
+
+ + + +
+

+ Question Submitted Successfully +

+

+ Thank you for reaching out! Our team will review your question and get back to you via email soon. +

+ +
+ ) : ( +
+ {formStatus.error && ( +
+ {formStatus.error} +
+ )} + +
+
+ + +
+ +
+ + +
+
+ +
+ + +
+ +
+ + +

+ {formData.question.length}/500 characters +

+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ )} +
+
+ + {/* FAQ Link Section */} +
+

Looking for quick answers?

+ + + + + Check our FAQ section + +
+
+
+ ); +} + +export default AskQuestion; \ No newline at end of file diff --git a/src/pages/Events.jsx b/src/pages/Events.jsx new file mode 100644 index 0000000..d19c597 --- /dev/null +++ b/src/pages/Events.jsx @@ -0,0 +1,281 @@ +import React, { useState, useEffect } from 'react'; +import RegistrationModal from '../components/RegistrationModal'; + +function Events() { + const [filter, setFilter] = useState('all'); + const [isModalOpen, setIsModalOpen] = useState(false); + const [selectedEvent, setSelectedEvent] = useState(null); + const [searchParams, setSearchParams] = useState(new URLSearchParams(window.location.search)); + + // Parse URL query parameters on component mount + useEffect(() => { + const categoryParam = searchParams.get('category'); + if (categoryParam) { + setFilter(categoryParam); + } + }, []); + + // Event data - in a real app this would come from an API + const events = [ + { + id: 1, + title: "React Workshop", + description: "Build modern UIs with React and Next.js", + image: "https://images.unsplash.com/photo-1519389950473-47ba0277781c?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", + date: "29 July 2024", + time: "10:00 AM - 2:00 PM", + duration: "4 hours", + status: "registration-open", + category: "workshop", + location: "Computer Lab, Academic Block 1, GBU", + }, + { + id: 2, + title: "AI/ML Workshop", + description: "Introduction to Machine Learning with Python", + image: "https://images.unsplash.com/photo-1591267990532-e5bdb1b0ceb8?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", + date: "15 August 2024", + time: "1:00 PM - 5:00 PM", + duration: "4 hours", + status: "coming-soon", + category: "workshop", + location: "Computer Lab, Academic Block 1, GBU", + }, + { + id: 3, + title: "Career in Tech", + description: "Panel discussion with industry experts", + image: "https://images.unsplash.com/photo-1540575467063-178a50c2df87?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", + date: "5 August 2024", + time: "3:00 PM - 5:00 PM", + duration: "2 hours", + status: "registration-open", + category: "talk", + location: "Auditorium, Academic Block 2, GBU", + }, + { + id: 4, + title: "Tech Networking Mixer", + description: "Connect with peers and industry professionals", + image: "https://images.unsplash.com/photo-1511795409834-ef04bbd61622?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", + date: "20 August 2024", + time: "5:00 PM - 7:00 PM", + duration: "2 hours", + status: "coming-soon", + category: "networking", + location: "Student Activity Center, GBU", + }, + ]; + const filteredEvents = filter === 'all' + ? events + : events.filter(event => event.category === filter); + + const handleRegisterClick = (event) => { + setSelectedEvent(event); + setIsModalOpen(true); + }; + + const handleFilterChange = (newFilter) => { + setFilter(newFilter); + const newSearchParams = new URLSearchParams(window.location.search); + if (newFilter === 'all') { + newSearchParams.delete('category'); + } else { + newSearchParams.set('category', newFilter); + } + + window.history.pushState( + {}, + '', + `${window.location.pathname}?${newSearchParams.toString()}` + ); + }; + + return ( +
+ {/* Hero Banner */} +
+
+ Tech Events at GBU +
+

Tech Events at GBU

+

Discover workshops, tech talks, and networking events hosted by HackFed

+
+
+ + {/* Main Content */} +
+ {/* Category Filter */} +
+ + + + +
+ + {/* Events Grid */} +
+ {filteredEvents.map((event) => ( +
+
+
+ {event.title} +
+ {event.date} +
+
+

{event.title}

+

{event.description}

+
+
+
+
+
+ + + +
+
+

{event.time}

+

{event.duration}

+
+
+ {event.status === 'registration-open' ? ( + + Registration Open + + ) : ( + + Coming Soon + + )} +
+
+
+
+ + + + +
+
+

{event.location}

+
+
+ {event.status === 'registration-open' ? ( + + ) : ( + + )} +
+
+ ))} +
+ + {/* No Events Message */} + {filteredEvents.length === 0 && ( +
+
+ + + +
+

No events found

+

+ We couldn't find any events in this category. Please check back later or try a different category. +

+
+ )} + + {/* Join the Community Banner */} +
+
+
+

Join GBU's Premier Tech Community

+

Connect with like-minded innovators, enhance your skills, and build your tech portfolio with HackFed.

+
+ + Become a Member + + + + +
+
+
+ + {/* Registration Modal */} + setIsModalOpen(false)} + eventTitle={selectedEvent?.title || ''} + /> +
+ ); +} + +export default Events; \ No newline at end of file diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index 719f12d..3112f1a 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -6,6 +6,7 @@ import Partners from '../components/Partners' import PastEvents from '../components/PastEvents' import Stats from '../components/Stats' import UpcommingEvent from '../components/UpcommingEvent' +import JoinUs from '../components/JoinUs' function Home() { return ( @@ -21,6 +22,7 @@ function Home() { +
)