about us and what we do
This commit is contained in:
30
package-lock.json
generated
30
package-lock.json
generated
@@ -9,6 +9,8 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource-variable/orbitron": "^5.2.8",
|
"@fontsource-variable/orbitron": "^5.2.8",
|
||||||
|
"@gsap/react": "^2.1.2",
|
||||||
|
"@lottiefiles/dotlottie-react": "^0.17.13",
|
||||||
"@react-three/drei": "^10.7.6",
|
"@react-three/drei": "^10.7.6",
|
||||||
"@react-three/fiber": "^9.3.0",
|
"@react-three/fiber": "^9.3.0",
|
||||||
"@react-three/postprocessing": "^3.0.4",
|
"@react-three/postprocessing": "^3.0.4",
|
||||||
@@ -522,6 +524,16 @@
|
|||||||
"url": "https://github.com/sponsors/ayuhito"
|
"url": "https://github.com/sponsors/ayuhito"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@gsap/react": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@gsap/react/-/react-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-JqliybO1837UcgH2hVOM4VO+38APk3ECNrsuSM4MuXp+rbf+/2IG2K1YJiqfTcXQHH7XlA0m3ykniFYstfq0Iw==",
|
||||||
|
"license": "SEE LICENSE AT https://gsap.com/standard-license",
|
||||||
|
"peerDependencies": {
|
||||||
|
"gsap": "^3.12.5",
|
||||||
|
"react": ">=17"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@humanfs/core": {
|
"node_modules/@humanfs/core": {
|
||||||
"version": "0.19.1",
|
"version": "0.19.1",
|
||||||
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
|
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
|
||||||
@@ -1061,6 +1073,24 @@
|
|||||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@lottiefiles/dotlottie-react": {
|
||||||
|
"version": "0.17.13",
|
||||||
|
"resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.17.13.tgz",
|
||||||
|
"integrity": "sha512-Ui8bqFlxqxLqB3G4bE9nsSw05lUn7eiZ24dSi/NVHFjTMAlb/JxdS8xWt1cdF2W1yJPNCeQuze6kkqNC5OMbJg==",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@lottiefiles/dotlottie-web": "0.61.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^17 || ^18 || ^19"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@lottiefiles/dotlottie-web": {
|
||||||
|
"version": "0.61.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.61.0.tgz",
|
||||||
|
"integrity": "sha512-1QwcDchh/TXTvP9zXUHA5oJOdhEdUrn6U7gAiQ1AXEUrcK6PTU6v5D3byP76BK56fQjoY2WQ2A4pYDCCvoVRqw==",
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/@mediapipe/tasks-vision": {
|
"node_modules/@mediapipe/tasks-vision": {
|
||||||
"version": "0.10.17",
|
"version": "0.10.17",
|
||||||
"resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz",
|
"resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz",
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource-variable/orbitron": "^5.2.8",
|
"@fontsource-variable/orbitron": "^5.2.8",
|
||||||
|
"@gsap/react": "^2.1.2",
|
||||||
|
"@lottiefiles/dotlottie-react": "^0.17.13",
|
||||||
"@react-three/drei": "^10.7.6",
|
"@react-three/drei": "^10.7.6",
|
||||||
"@react-three/fiber": "^9.3.0",
|
"@react-three/fiber": "^9.3.0",
|
||||||
"@react-three/postprocessing": "^3.0.4",
|
"@react-three/postprocessing": "^3.0.4",
|
||||||
|
|||||||
169
src/app/components/AboutUs.jsx
Normal file
169
src/app/components/AboutUs.jsx
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { motion } from "framer-motion";
|
||||||
|
import { useRef, useEffect, useState } from "react";
|
||||||
|
import { DotLottieReact } from "@lottiefiles/dotlottie-react";
|
||||||
|
|
||||||
|
/* Glow */
|
||||||
|
const Glow = ({ className = "" }) => (
|
||||||
|
<div
|
||||||
|
className={`pointer-events-none absolute inset-0 -z-10 opacity-60 blur-2xl
|
||||||
|
[background:
|
||||||
|
radial-gradient(60%_60%_at_20%_0%,rgba(0,255,255,.15),transparent_60%),
|
||||||
|
radial-gradient(50%_50%_at_90%_20%,rgba(0,255,200,.12),transparent_60%),
|
||||||
|
radial-gradient(40%_40%_at_50%_120%,rgba(0,200,255,.1),transparent_60%)]
|
||||||
|
${className}`}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Grid */
|
||||||
|
function GridPattern() {
|
||||||
|
return (
|
||||||
|
<div className="absolute inset-0 pointer-events-none">
|
||||||
|
<svg className="w-full h-full opacity-30">
|
||||||
|
<defs>
|
||||||
|
<pattern
|
||||||
|
id="grid-about"
|
||||||
|
width="48"
|
||||||
|
height="48"
|
||||||
|
patternUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M 48 0 L 0 0 0 48"
|
||||||
|
fill="none"
|
||||||
|
stroke="#00ffee"
|
||||||
|
strokeWidth="0.6"
|
||||||
|
/>
|
||||||
|
</pattern>
|
||||||
|
</defs>
|
||||||
|
<rect width="100%" height="100%" fill="url(#grid-about)" />
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function AboutUs() {
|
||||||
|
const sectionRef = useRef(null);
|
||||||
|
const [visible, setVisible] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const observer = new IntersectionObserver(
|
||||||
|
([entry]) => entry.isIntersecting && setVisible(true),
|
||||||
|
{ threshold: 0.15 }
|
||||||
|
);
|
||||||
|
|
||||||
|
if (sectionRef.current) observer.observe(sectionRef.current);
|
||||||
|
return () => observer.disconnect();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section
|
||||||
|
ref={sectionRef}
|
||||||
|
id="about"
|
||||||
|
className="relative min-h-screen bg-[#03070d] py-28 overflow-hidden"
|
||||||
|
>
|
||||||
|
<GridPattern />
|
||||||
|
<Glow />
|
||||||
|
|
||||||
|
<div className="relative z-10 max-w-7xl mx-auto px-6">
|
||||||
|
|
||||||
|
{/* TITLE */}
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 40 }}
|
||||||
|
animate={visible ? { opacity: 1, y: 0 } : {}}
|
||||||
|
transition={{ duration: 0.7 }}
|
||||||
|
className="mb-20 text-center"
|
||||||
|
>
|
||||||
|
<h2
|
||||||
|
className="
|
||||||
|
flex justify-center items-center
|
||||||
|
mb-12 text-4xl md:text-6xl
|
||||||
|
font-extrabold tracking-widest
|
||||||
|
font-[Orbitron]
|
||||||
|
text-transparent bg-clip-text
|
||||||
|
bg-gradient-to-r from-green-400 via-cyan-400 to-teal-400
|
||||||
|
drop-shadow-[0_0_15px_rgba(16,185,129,0.5)]
|
||||||
|
"
|
||||||
|
>
|
||||||
|
AB
|
||||||
|
|
||||||
|
{/* LOTTIE O */}
|
||||||
|
<span
|
||||||
|
className="inline-block relative align-middle mx-[-0.15em]"
|
||||||
|
style={{ height: "1em", width: "1em" }}
|
||||||
|
>
|
||||||
|
<DotLottieReact
|
||||||
|
src="https://lottie.host/beca5865-363c-4433-bdf1-ddb5824f8f78/j0Jl3duHmb.lottie"
|
||||||
|
autoplay
|
||||||
|
loop
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
UT US
|
||||||
|
</h2>
|
||||||
|
</motion.div>
|
||||||
|
|
||||||
|
{/* ABOUT CARD */}
|
||||||
|
<motion.div
|
||||||
|
initial={{ opacity: 0, y: 40 }}
|
||||||
|
animate={visible ? { opacity: 1, y: 0 } : {}}
|
||||||
|
transition={{ delay: 0.15, duration: 0.7 }}
|
||||||
|
className="
|
||||||
|
group relative rounded-3xl border border-cyan-400/30
|
||||||
|
cursor-pointer overflow-hidden
|
||||||
|
backdrop-blur-xl p-10 md:p-16
|
||||||
|
shadow-[0_0_80px_rgba(0,255,255,.15)]
|
||||||
|
hover:shadow-[0_0_120px_rgba(0,255,255,.35)]
|
||||||
|
transition-all duration-500
|
||||||
|
bg-gradient-to-br from-[#021526] via-[#0b2c4d] to-[#1a3a5f]
|
||||||
|
"
|
||||||
|
>
|
||||||
|
|
||||||
|
{/* Glow on hover */}
|
||||||
|
<Glow className="opacity-40 group-hover:opacity-80 transition duration-500" />
|
||||||
|
|
||||||
|
{/* Corners */}
|
||||||
|
{["tl", "tr", "bl", "br"].map((p) => (
|
||||||
|
<div
|
||||||
|
key={p}
|
||||||
|
className={`absolute w-10 h-10 border-cyan-300/60
|
||||||
|
${p === "tl" && "top-0 left-0 border-t border-l"}
|
||||||
|
${p === "tr" && "top-0 right-0 border-t border-r"}
|
||||||
|
${p === "bl" && "bottom-0 left-0 border-b border-l"}
|
||||||
|
${p === "br" && "bottom-0 right-0 border-b border-r"}
|
||||||
|
`}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
|
||||||
|
{/* TEXT */}
|
||||||
|
<p
|
||||||
|
className="
|
||||||
|
relative z-10 text-blue-200 leading-relaxed text-lg max-md:text-base
|
||||||
|
transition-all duration-500
|
||||||
|
group-hover:text-cyan-200
|
||||||
|
group-hover:drop-shadow-[0_0_10px_rgba(0,255,255,.4)]
|
||||||
|
"
|
||||||
|
>
|
||||||
|
The Machine Learning for Everyone (ML4E) Club at the National Institute
|
||||||
|
of Technology Rourkela is a dynamic and vibrant community dedicated to
|
||||||
|
fostering knowledge, innovation, and collaboration in the field of
|
||||||
|
machine learning and artificial intelligence. As one of the leading
|
||||||
|
technical clubs on campus, it serves as a hub for students passionate
|
||||||
|
about exploring the cutting-edge advancements in these transformative
|
||||||
|
technologies. The club envisions a future where machine learning is a
|
||||||
|
fundamental skill accessible to all, empowering students to solve
|
||||||
|
real-world problems and innovate across various domains. Membership is
|
||||||
|
open to all students of NIT Rourkela who have an interest in machine
|
||||||
|
learning and artificial intelligence. The club values enthusiasm,
|
||||||
|
curiosity, and a willingness to learn. By joining, members gain access
|
||||||
|
to a wealth of resources, including hackathons, project opportunities,
|
||||||
|
and a network of like-minded peers.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</motion.div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -535,7 +535,7 @@ export default function Home() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-screen min-h-screen border-t border-cyan-500/20 bg-[#0b1117] overflow-y-auto">
|
<div className="relative w-full min-h-screen bg-[#0b1117] overflow-hidden" suppressHydrationWarning>
|
||||||
<Navbar/>
|
<Navbar/>
|
||||||
|
|
||||||
{/* Content Section */}
|
{/* Content Section */}
|
||||||
|
|||||||
@@ -67,13 +67,17 @@ export default function Navbar() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleOpenNav = () => setIsOpen(true);
|
||||||
|
|
||||||
if (typeof window !== "undefined") {
|
if (typeof window !== "undefined") {
|
||||||
window.addEventListener("keydown", handleKeyDown);
|
window.addEventListener("keydown", handleKeyDown);
|
||||||
|
window.addEventListener("open-navigation", handleOpenNav);
|
||||||
}
|
}
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
if (typeof window !== "undefined") {
|
if (typeof window !== "undefined") {
|
||||||
window.removeEventListener("keydown", handleKeyDown);
|
window.removeEventListener("keydown", handleKeyDown);
|
||||||
|
window.removeEventListener("open-navigation", handleOpenNav);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
236
src/app/components/WhatWeDo.tsx
Normal file
236
src/app/components/WhatWeDo.tsx
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
"use client";
|
||||||
|
import React, { useRef } from "react";
|
||||||
|
import { gsap } from "gsap";
|
||||||
|
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
||||||
|
import { useGSAP } from "@gsap/react";
|
||||||
|
import { DotLottieReact } from "@lottiefiles/dotlottie-react";
|
||||||
|
|
||||||
|
gsap.registerPlugin(ScrollTrigger);
|
||||||
|
|
||||||
|
const WhatWeDo = () => {
|
||||||
|
const container = useRef<HTMLElement>(null);
|
||||||
|
const blackLine = useRef<HTMLDivElement>(null);
|
||||||
|
const blackLine2 = useRef<HTMLDivElement>(null);
|
||||||
|
const blackLine3 = useRef<HTMLDivElement>(null);
|
||||||
|
const lottieRef1 = useRef<HTMLDivElement>(null);
|
||||||
|
const lottieRef2 = useRef<HTMLDivElement>(null);
|
||||||
|
const lottieRef3 = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
useGSAP(
|
||||||
|
() => {
|
||||||
|
// Header Animation
|
||||||
|
gsap.from("#processhead", {
|
||||||
|
scale: 1.5,
|
||||||
|
scrollTrigger: {
|
||||||
|
trigger: "#processhead",
|
||||||
|
scrub: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Lines Animation - Logic updated to use fromTo for robust animation
|
||||||
|
[blackLine, blackLine2, blackLine3].forEach((ref) => {
|
||||||
|
if (ref.current) {
|
||||||
|
gsap.fromTo(
|
||||||
|
ref.current,
|
||||||
|
{ width: "0%" },
|
||||||
|
{
|
||||||
|
width: "100%",
|
||||||
|
scrollTrigger: {
|
||||||
|
trigger: ref.current,
|
||||||
|
scrub: true,
|
||||||
|
start: "top bottom",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Lottie Scale Animation - Logic aligned with user's reference
|
||||||
|
[lottieRef1, lottieRef2, lottieRef3].forEach((ref) => {
|
||||||
|
if (ref.current) {
|
||||||
|
gsap.from(ref.current, {
|
||||||
|
scale: 0.1,
|
||||||
|
scrollTrigger: {
|
||||||
|
trigger: ref.current,
|
||||||
|
scrub: true,
|
||||||
|
start: "top bottom",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Text Slide Animations - Logic aligned with user's reference
|
||||||
|
gsap.from("#textLeftFirst", {
|
||||||
|
x: -100,
|
||||||
|
scrollTrigger: {
|
||||||
|
trigger: "#textLeftFirst",
|
||||||
|
scrub: true,
|
||||||
|
start: "top bottom",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
gsap.from("#textRight", {
|
||||||
|
x: 100,
|
||||||
|
scrollTrigger: {
|
||||||
|
trigger: "#textRight",
|
||||||
|
scrub: true,
|
||||||
|
start: "top bottom",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
gsap.from("#textLeftSecond", {
|
||||||
|
x: -100,
|
||||||
|
scrollTrigger: {
|
||||||
|
trigger: "#textLeftSecond",
|
||||||
|
scrub: true,
|
||||||
|
start: "top bottom",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ scope: container }
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<section
|
||||||
|
ref={container}
|
||||||
|
className="w-full min-h-screen py-[180px] max-md:py-[80px] relative flex justify-center items-center flex-col overflow-x-hidden"
|
||||||
|
>
|
||||||
|
<div className="w-[1200px] max-lg:w-[90%] max-sm:w-[95%] flex flex-col gap-[64px] items-center">
|
||||||
|
{/* Heading */}
|
||||||
|
<h1
|
||||||
|
id="processhead"
|
||||||
|
className="
|
||||||
|
font-orbitron
|
||||||
|
text-[7vw] max-lg:text-[10vw] max-sm:text-[11vw]
|
||||||
|
font-black
|
||||||
|
leading-[100%]
|
||||||
|
text-center
|
||||||
|
bg-gradient-to-r from-blue-400 via-cyan-300 to-blue-600
|
||||||
|
bg-clip-text text-transparent
|
||||||
|
drop-shadow-[0_0_25px_rgba(0,200,255,0.6)]
|
||||||
|
"
|
||||||
|
>
|
||||||
|
WHAT WE DO
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
{/* Steps */}
|
||||||
|
<div className="flex flex-col gap-[64px]">
|
||||||
|
{/* STEP 1 */}
|
||||||
|
<div className="flex max-md:flex-col-reverse items-center">
|
||||||
|
<div className="w-1/2 max-md:w-full flex flex-col gap-[28px]">
|
||||||
|
<div id="textLeftFirst" className="text-right text-white">
|
||||||
|
<h2 className="font-orbitron text-[36px] font-bold">Open Source</h2>
|
||||||
|
<p className="text-[20px] opacity-90">
|
||||||
|
Collaborate globally and build real-world machine learning products with developers and researchers.
|
||||||
|
Work on scalable systems, AI tools, and community-driven innovations used worldwide.
|
||||||
|
Leave your mark on open-source while accelerating your growth as a machine learning engineer.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="h-[30px] bg-white rounded-full">
|
||||||
|
<div className="h-full flex justify-end">
|
||||||
|
<div
|
||||||
|
ref={blackLine}
|
||||||
|
className="bg-black w-0 h-full rounded-full"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
ref={lottieRef1}
|
||||||
|
className="w-1/2 max-md:w-full my-24 max-md:my-4"
|
||||||
|
>
|
||||||
|
<DotLottieReact
|
||||||
|
src="https://lottie.host/f1899756-1dc6-496f-a81c-a0104d02d048/UgBJ4PguFT.lottie"
|
||||||
|
loop
|
||||||
|
autoplay
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* STEP 2 */}
|
||||||
|
<div className="flex flex-row-reverse max-md:flex-col-reverse items-center">
|
||||||
|
<div className="w-1/2 max-md:w-full flex flex-col gap-[28px]">
|
||||||
|
<div id="textRight" className="text-left text-white">
|
||||||
|
<h2 className="font-orbitron text-[36px] font-bold">Hackathons</h2>
|
||||||
|
<p className="text-[20px] opacity-90">
|
||||||
|
Participate in global hackathons, workshops, and collaborative tech events to sharpen your skills.
|
||||||
|
Build real-world AI solutions, compete with top innovators, and gain hands-on industry experience.
|
||||||
|
Showcase your talent, expand your network, and turn ideas into impactful projects.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="h-[30px] bg-white rounded-full">
|
||||||
|
<div className="h-full flex justify-start">
|
||||||
|
<div
|
||||||
|
ref={blackLine2}
|
||||||
|
className="bg-black w-0 h-full rounded-full"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div ref={lottieRef2} className="w-1/2 max-md:w-full">
|
||||||
|
<DotLottieReact
|
||||||
|
src="https://assets10.lottiefiles.com/packages/lf20_tfb3estd.json"
|
||||||
|
loop
|
||||||
|
autoplay
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* STEP 3 */}
|
||||||
|
<div className="flex max-md:flex-col-reverse items-center">
|
||||||
|
<div className="w-1/2 max-md:w-full flex flex-col gap-[28px]">
|
||||||
|
<div id="textLeftSecond" className="text-right text-white">
|
||||||
|
<h2 className="font-orbitron text-[36px] font-bold">
|
||||||
|
Data Science & Much More
|
||||||
|
</h2>
|
||||||
|
<p className="text-[20px] opacity-90">
|
||||||
|
Learn AI, data science, deep learning, MLOps, and many more industry-ready technologies.
|
||||||
|
Master modern tools, frameworks, and workflows used by top tech companies.
|
||||||
|
Transform your learning into deployable solutions and job-ready expertise.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="h-[30px] bg-white rounded-full">
|
||||||
|
<div className="h-full flex justify-end">
|
||||||
|
<div
|
||||||
|
ref={blackLine3}
|
||||||
|
className="bg-black w-0 h-full rounded-full"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
ref={lottieRef3}
|
||||||
|
className="w-1/2 max-md:w-full my-24 max-md:my-4"
|
||||||
|
>
|
||||||
|
<DotLottieReact
|
||||||
|
src="https://assets5.lottiefiles.com/packages/lf20_w51pcehl.json"
|
||||||
|
loop
|
||||||
|
autoplay
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Button */}
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
if (typeof window !== "undefined") {
|
||||||
|
window.dispatchEvent(new Event("open-navigation"));
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
className="mt-12 rounded-full bg-white px-10 py-4 text-[20px] font-orbitron font-bold text-black border-2 border-white hover:bg-transparent hover:text-white transition-all duration-300 cursor-pointer"
|
||||||
|
>
|
||||||
|
LEARN MORE
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default WhatWeDo;
|
||||||
@@ -107,11 +107,12 @@ const AchievementForm: React.FC = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]">
|
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]" suppressHydrationWarning>
|
||||||
<form
|
<form
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
||||||
encType="multipart/form-data"
|
encType="multipart/form-data"
|
||||||
|
suppressHydrationWarning
|
||||||
>
|
>
|
||||||
<h2 className="text-3xl font-bold mb-8 text-center">Submit Your Achievement</h2>
|
<h2 className="text-3xl font-bold mb-8 text-center">Submit Your Achievement</h2>
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ body {
|
|||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@layer utilities {
|
@layer utilities {
|
||||||
.special-font b {
|
.special-font b {
|
||||||
font-family: "Zentry";
|
font-family: "Zentry";
|
||||||
@@ -49,10 +50,12 @@ body {
|
|||||||
opacity: 0.34;
|
opacity: 0.34;
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
50% {
|
50% {
|
||||||
opacity: 0.46;
|
opacity: 0.46;
|
||||||
transform: scale(1.02);
|
transform: scale(1.02);
|
||||||
}
|
}
|
||||||
|
|
||||||
100% {
|
100% {
|
||||||
opacity: 0.34;
|
opacity: 0.34;
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
@@ -72,6 +75,41 @@ body {
|
|||||||
.pointer-events-none>.breath {
|
.pointer-events-none>.breath {
|
||||||
animation: soft-breath 5.5s ease-in-out infinite;
|
animation: soft-breath 5.5s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
html {
|
|
||||||
scroll-behavior: smooth;
|
/* Border Animation */
|
||||||
|
@property --angle {
|
||||||
|
syntax: "<angle>";
|
||||||
|
initial-value: 0deg;
|
||||||
|
inherits: false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
from {
|
||||||
|
--angle: 0deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
--angle: 360deg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-border::after,
|
||||||
|
.animate-border::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
inset: -5px;
|
||||||
|
/* Extends beyond the container */
|
||||||
|
background-image: conic-gradient(from var(--angle), #ff4545, #00ff99, #006aff, #ff0095, #ff4545);
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
translate: -50% -50%;
|
||||||
|
z-index: -1;
|
||||||
|
border-radius: inherit;
|
||||||
|
/* Inherits rounded-3xl from parent */
|
||||||
|
animation: 3s spin linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-border::before {
|
||||||
|
filter: blur(1.5rem);
|
||||||
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
@@ -28,6 +28,7 @@ export default function RootLayout({
|
|||||||
return (
|
return (
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<body
|
<body
|
||||||
|
suppressHydrationWarning
|
||||||
className={`${geistSans.variable} ${geistMono.variable} ${roboto.variable} ${orbitron.variable} antialiased`}
|
className={`${geistSans.variable} ${geistMono.variable} ${roboto.variable} ${orbitron.variable} antialiased`}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
|
|||||||
@@ -12,16 +12,38 @@
|
|||||||
// );
|
// );
|
||||||
// }
|
// }
|
||||||
"use client"
|
"use client"
|
||||||
import { useState, useEffect } from "react";
|
import { useState, useEffect, useMemo } from "react";
|
||||||
import dynamic from "next/dynamic";
|
import dynamic from "next/dynamic";
|
||||||
import { motion, AnimatePresence } from "framer-motion";
|
import { motion, AnimatePresence } from "framer-motion";
|
||||||
import Footer from "./components/Footer";
|
|
||||||
|
|
||||||
const Home = dynamic(() => import("./components/Home"), { ssr: false });
|
const Home = dynamic(() => import("./components/Home"), { ssr: false });
|
||||||
|
const AboutUs = dynamic(() => import("./components/AboutUs"), { ssr: false });
|
||||||
|
const WhatWeDo = dynamic(() => import("./components/WhatWeDo"), { ssr: false });
|
||||||
|
|
||||||
// Preloader Component
|
// Preloader Component
|
||||||
function Preloader({ onComplete }: { onComplete: () => void }) {
|
function Preloader({ onComplete }: { onComplete: () => void }) {
|
||||||
const [progress, setProgress] = useState(0);
|
const [progress, setProgress] = useState(0);
|
||||||
|
const [dots, setDots] = useState<Array<{ left: string; top: string; duration: number; delay: number }>>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
// Generate dots only on client-side to avoid hydration mismatch
|
||||||
|
const mulberry32 = (seed: number) => {
|
||||||
|
return () => {
|
||||||
|
let t = (seed += 0x6d2b79f5);
|
||||||
|
t = Math.imul(t ^ (t >>> 15), t | 1);
|
||||||
|
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
||||||
|
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
const rand = mulberry32(123456); // deterministic seed
|
||||||
|
const generatedDots = Array.from({ length: 20 }).map(() => ({
|
||||||
|
left: `${rand() * 100}%`,
|
||||||
|
top: `${rand() * 100}%`,
|
||||||
|
duration: 2 + rand() * 2,
|
||||||
|
delay: rand() * 2,
|
||||||
|
}));
|
||||||
|
setDots(generatedDots);
|
||||||
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Simulate loading progress
|
// Simulate loading progress
|
||||||
@@ -56,22 +78,22 @@ function Preloader({ onComplete }: { onComplete: () => void }) {
|
|||||||
|
|
||||||
{/* Neural Network Animation */}
|
{/* Neural Network Animation */}
|
||||||
<div className="absolute inset-0 pointer-events-none opacity-30">
|
<div className="absolute inset-0 pointer-events-none opacity-30">
|
||||||
{[...Array(20)].map((_, i) => (
|
{dots.map((dot, i) => (
|
||||||
<motion.div
|
<motion.div
|
||||||
key={i}
|
key={i}
|
||||||
className="absolute w-2 h-2 bg-cyan-400 rounded-full"
|
className="absolute w-2 h-2 bg-cyan-400 rounded-full"
|
||||||
style={{
|
style={{
|
||||||
left: `${Math.random() * 100}%`,
|
left: dot.left,
|
||||||
top: `${Math.random() * 100}%`,
|
top: dot.top,
|
||||||
}}
|
}}
|
||||||
animate={{
|
animate={{
|
||||||
scale: [0, 1, 0],
|
scale: [0, 1, 0],
|
||||||
opacity: [0, 1, 0],
|
opacity: [0, 1, 0],
|
||||||
}}
|
}}
|
||||||
transition={{
|
transition={{
|
||||||
duration: 2 + Math.random() * 2,
|
duration: dot.duration,
|
||||||
repeat: Infinity,
|
repeat: Infinity,
|
||||||
delay: Math.random() * 2,
|
delay: dot.delay,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
@@ -178,11 +200,13 @@ export default function App() {
|
|||||||
</AnimatePresence>
|
</AnimatePresence>
|
||||||
|
|
||||||
{/* Home component loads in background while preloader shows */}
|
{/* Home component loads in background while preloader shows */}
|
||||||
<div style={{ display: isLoading ? "none" : "block" }}>
|
<div style={{ display: isLoading ? "none" : "block" }} className="w-full">
|
||||||
{showHome && (
|
{showHome && (
|
||||||
<>
|
<div className="w-full">
|
||||||
<Home />
|
<Home />
|
||||||
</>
|
<AboutUs />
|
||||||
|
<WhatWeDo />
|
||||||
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -92,11 +92,12 @@ const UploadPage: React.FC = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]">
|
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]" suppressHydrationWarning>
|
||||||
<form
|
<form
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
||||||
encType="multipart/form-data"
|
encType="multipart/form-data"
|
||||||
|
suppressHydrationWarning
|
||||||
>
|
>
|
||||||
<h2 className="text-3xl font-bold mb-8 text-center">Submit Your Project</h2>
|
<h2 className="text-3xl font-bold mb-8 text-center">Submit Your Project</h2>
|
||||||
|
|
||||||
|
|||||||
@@ -86,11 +86,12 @@ const UploadPage: React.FC = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]">
|
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]" suppressHydrationWarning>
|
||||||
<form
|
<form
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
||||||
encType="multipart/form-data"
|
encType="multipart/form-data"
|
||||||
|
suppressHydrationWarning
|
||||||
>
|
>
|
||||||
<h2 className="text-3xl font-bold mb-8 text-center">Submit Event</h2>
|
<h2 className="text-3xl font-bold mb-8 text-center">Submit Event</h2>
|
||||||
|
|
||||||
|
|||||||
@@ -91,11 +91,12 @@ const UploadPage: React.FC = () => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]">
|
<div className="w-full md:w-1/2 min-h-screen flex items-center justify-center p-6 sm:p-10 bg-gradient-to-b from-[#0A0A23] via-[#1B1B3A] to-[#3C4EC0]" suppressHydrationWarning>
|
||||||
<form
|
<form
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
className="w-full max-w-xl text-white p-6 sm:p-8 rounded-xl border border-blue-500 shadow-[0_0_15px_2px_rgba(100,149,237,0.4)] backdrop-blur-sm"
|
||||||
encType="multipart/form-data"
|
encType="multipart/form-data"
|
||||||
|
suppressHydrationWarning
|
||||||
>
|
>
|
||||||
<h2 className="text-3xl font-bold mb-8 text-center">Submit Your Details</h2>
|
<h2 className="text-3xl font-bold mb-8 text-center">Submit Your Details</h2>
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
"moduleResolution": "bundler",
|
"moduleResolution": "bundler",
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"jsx": "preserve",
|
"jsx": "react-jsx",
|
||||||
"incremental": true,
|
"incremental": true,
|
||||||
"plugins": [
|
"plugins": [
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user