Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
b084ae1
initial stats card render
AbhiramTadepalli Jul 8, 2025
d70b791
feat: Add init footer
raywa04 Jul 13, 2025
7961bfb
fix: Gradient stashing
raywa04 Jul 13, 2025
a573194
tweaked sizes
AbhiramTadepalli Jul 14, 2025
0f57a5d
Component-ize it
AbhiramTadepalli Jul 14, 2025
1958b2c
remove border on the card
AbhiramTadepalli Jul 14, 2025
87d3249
stack cards
AbhiramTadepalli Jul 14, 2025
2c7e29e
Hero Gradient version 1
AbhiramTadepalli Jul 24, 2025
fbcff9b
create intro section
AbhiramTadepalli Jul 29, 2025
40c8c79
changed background gradient
AbhiramTadepalli Jul 29, 2025
faf6d03
add gradients for headers
AbhiramTadepalli Jul 29, 2025
1aa02b2
remove unnecessary divs and use wh as height units
AbhiramTadepalli Jul 29, 2025
b783774
Open Source Section
AbhiramTadepalli Jul 29, 2025
84eaa42
Merge branch 'about-section' into stats-section
AbhiramTadepalli Jul 29, 2025
bbfe93a
Merge branch 'open-source-section' into stats-section
AbhiramTadepalli Jul 29, 2025
0f0cca2
open source section bg
AbhiramTadepalli Jul 29, 2025
35e05a7
Initial implementation of openSource and pastHackathons
5sansiva Jul 29, 2025
d8445a8
members.tsx componenet which displays all of the team memeber, as of …
AyroEscobar Jul 30, 2025
df9a81d
Added the pastHackathons part
5sansiva Jul 30, 2025
2c75eac
Adding improved pics and more members photos, as of this commit missi…
AyroEscobar Aug 1, 2025
1d57e8e
Finished adding links and mobile view
5sansiva Aug 4, 2025
3f6d17f
Fixed the boxes and added an image, need to adjust for mobile view an…
5sansiva Aug 4, 2025
abd4b74
Added the mobile view and fixed up the css
5sansiva Aug 5, 2025
8b0f9b0
Added a shadow but its on a black background and I already did it so …
5sansiva Aug 5, 2025
a759d03
try blur
AbhiramTadepalli Aug 6, 2025
6ecad52
asked me to commit, I forgot the change lol
5sansiva Aug 6, 2025
9087887
Stored the code, this is a temp push
5sansiva Aug 6, 2025
ed76f78
Finished merge
5sansiva Aug 6, 2025
4e683c7
Everything merged
5sansiva Aug 6, 2025
01e034a
Everything merged
5sansiva Aug 6, 2025
9f1cf9d
got gradient closer using blur (shaz) and blanket opacity
AbhiramTadepalli Aug 6, 2025
bfa3251
Embedded links
5sansiva Aug 6, 2025
5dc9132
fix openSource naming on import
AbhiramTadepalli Aug 6, 2025
2f23b45
tweak image width and radius
AbhiramTadepalli Aug 6, 2025
100a12a
use an array for past hackathons
AbhiramTadepalli Aug 6, 2025
d5a9f4c
use justify-between for the badges
AbhiramTadepalli Aug 6, 2025
1ea12be
add a better hover transition on opensource projects
AbhiramTadepalli Aug 6, 2025
8f9fe7f
add some glow -- should make it better, j inspo fn
AbhiramTadepalli Aug 6, 2025
78a8a91
make badges' widths proportional
AbhiramTadepalli Aug 6, 2025
7235a20
opensource -> openSource
AbhiramTadepalli Aug 6, 2025
75817bd
pages folder
AbhiramTadepalli Aug 6, 2025
86a3f84
Merge branch 'open-source-section' into stats-section
AbhiramTadepalli Aug 6, 2025
76ad4b3
pages
AbhiramTadepalli Aug 6, 2025
36e68c4
Merge branch 'addFooter' into develop
AbhiramTadepalli Aug 6, 2025
433fbc9
Add HackUTD Logo on Hero
AbhiramTadepalli Aug 6, 2025
6675214
Merge branch 'hero' into develop
AbhiramTadepalli Aug 6, 2025
582143a
Added the svgs
5sansiva Aug 7, 2025
fea681d
feat: Add gsap animations to hero and intro comp
raywa04 Aug 10, 2025
13cc124
fix: GSAP animations on intro comp
raywa04 Aug 10, 2025
91565ae
feat: Add gsap to stats + open source comp
raywa04 Aug 10, 2025
cd23dcb
feat: Add roster photo
raywa04 Aug 10, 2025
b39c4d3
feat: Make intro comp look less erratic
raywa04 Aug 10, 2025
a7a7528
feat: Make stats comp less erratic
raywa04 Aug 10, 2025
d438d82
feat: Add past hackathons comp
raywa04 Aug 10, 2025
5883016
feat: Add use client
raywa04 Aug 10, 2025
82667aa
feat: Add socials
raywa04 Aug 10, 2025
aece267
feat: Add sponsorship packet
raywa04 Aug 11, 2025
1d5aada
feat: Team in honeycomb
raywa04 Aug 11, 2025
4b51ed5
fix: Photo names
raywa04 Aug 11, 2025
9a990c9
Merge branch 'addGSAP' into ideaTeamMembers
raywa04 Aug 11, 2025
e87cbbf
fix: Package
raywa04 Aug 12, 2025
b031953
feat: Add members comp
raywa04 Aug 12, 2025
bb14b11
feat: Edits to open source
raywa04 Aug 12, 2025
538d974
fix: Footer mobile view
raywa04 Aug 12, 2025
0659610
feat: Add horizonatal scroll
raywa04 Aug 12, 2025
c7105c4
feat: More stuff
raywa04 Aug 12, 2025
29be7c6
added hero svg + stars + title
Aug 14, 2025
5ae0b91
Merge pull request #3 from hackutd/ideaTeamMembers
raywa04 Aug 16, 2025
17ccd9b
Merge pull request #4 from hackutd/addGSAP
raywa04 Aug 16, 2025
32a0e9a
navbar added
kumarshaswat Sep 19, 2025
46c9cb5
merge conflicts with develop
kumarshaswat Sep 19, 2025
13da01f
added liquid glass to stats elements
kumarshaswat Sep 19, 2025
544f3c6
Merge pull request #5 from hackutd/hero-gradient
raywa04 Sep 19, 2025
ba67698
feat: Fix hero import
raywa04 Sep 19, 2025
73df139
feat: Combine team member comp into intro comp
raywa04 Sep 22, 2025
58fa40b
feat: Added exclmarion mark
bhuvana108 Sep 23, 2025
31c6766
fixed footer
bhuvana108 Oct 5, 2025
ed4245d
feat: Minor footer changes
raywa04 Oct 5, 2025
dbd47b6
Merge pull request #12 from hackutd/changeFooter
raywa04 Oct 5, 2025
688e56e
refactor: Remove stats comp
raywa04 Oct 5, 2025
fb531ab
change open source text color
AbhiramTadepalli Oct 6, 2025
e96af4a
make the horizontal bezels smaller for each project image
AbhiramTadepalli Oct 6, 2025
129132f
feat: Add potenital starting design for horizontal scroll
raywa04 Oct 7, 2025
76a0080
feat: Add sponsor carousel
raywa04 Oct 7, 2025
09a42fb
fix: Errors with gif
raywa04 Oct 9, 2025
a5e2c9e
refactor: Remove uneeded lines
raywa04 Oct 11, 2025
7f3efa1
Attempt to fix jury photo resizing
AbhiramTadepalli Oct 13, 2025
d93b462
update open source color
AbhiramTadepalli Oct 13, 2025
4fd4df6
fix: Issues with turbopack
raywa04 Oct 14, 2025
ebea090
Merge pull request #15 from hackutd/horizontalScrollDesign
raywa04 Oct 14, 2025
292f94d
Merge pull request #6 from hackutd/combineIntroWithTeam
raywa04 Oct 14, 2025
0c2e7c4
fixed package-lock.json and updated capitalization
bhuvana108 Oct 27, 2025
0cefa92
updated icons
bhuvana108 Oct 27, 2025
c70f8da
Revert "fixed package-lock.json and updated capitalization"
raywa04 Oct 27, 2025
0650fc5
fix: Remove tiktok
raywa04 Oct 28, 2025
23f864e
Merge pull request #16 from hackutd/icons
raywa04 Oct 28, 2025
36fdeb5
Merge pull request #14 from hackutd/openSource-v2
raywa04 Oct 28, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions app/animations/heroAnimations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { gsap } from "gsap";

export const initHeroAnimations = (
logoRef: React.RefObject<HTMLElement | null>,
titleRef: React.RefObject<HTMLElement | null>,
skylineRef: React.RefObject<HTMLElement | null>,
setSkylineVisible: (visible: boolean) => void
) => {
const tl = gsap.timeline();

tl.fromTo(logoRef.current,
{ scale: 0, rotation: -180, opacity: 0 },
{ scale: 1, rotation: 0, opacity: 1, duration: 1.2, ease: "back.out(1.7)" }
);

tl.to(skylineRef.current, {
y: 0,
opacity: 1,
duration: 0.6,
ease: "power3.out",
onComplete: () => setSkylineVisible(true)
}, "-=0.8");

tl.fromTo(titleRef.current,
{ x: -100, opacity: 0, scale: 0.8 },
{ x: 0, opacity: 1, scale: 1, duration: 1, ease: "power3.out" }
);

tl.fromTo(".animate-twinkle",
{ scale: 0, opacity: 0 },
{ scale: 1, opacity: 1, duration: 2, stagger: 0.1, ease: "power2.out" }
);
gsap.to(logoRef.current, {
y: -10,
duration: 2,
ease: "power2.inOut",
yoyo: true,
repeat: -1,
delay: 5
});
};
181 changes: 181 additions & 0 deletions app/animations/introAnimations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";


if (typeof window !== "undefined") {
gsap.registerPlugin(ScrollTrigger);
}



export const initIntroAnimations = (
topRowRef: React.RefObject<HTMLElement | null>,
bottomRowRef: React.RefObject<HTMLElement | null>,
titleRefs: React.RefObject<HTMLHeadingElement | null>[],
textRefs: React.RefObject<HTMLParagraphElement | null>[],
imageRefs: React.RefObject<HTMLDivElement | null>[],
magneticRefs: React.RefObject<HTMLDivElement | null>[]
) => {

const titles = titleRefs.map(ref => ref.current).filter(Boolean) as HTMLElement[];
const texts = textRefs.map(ref => ref.current).filter(Boolean) as HTMLElement[];
const images = imageRefs.map(ref => ref.current).filter(Boolean) as HTMLElement[];
const magneticElements = magneticRefs.map(ref => ref.current).filter(Boolean) as HTMLElement[];


console.log('Animation elements found:', {
titles: titles.length,
texts: texts.length,
images: images.length,
magneticElements: magneticElements.length
});

if (titles.length === 0 && texts.length === 0 && images.length === 0) {
console.log('No elements found for animation');
return;
}


gsap.set([titles, texts, images], {
opacity: 0,
y: 50,
});



const topRowTl = gsap.timeline({
scrollTrigger: {
trigger: topRowRef.current,
start: "top 80%",
end: "bottom 20%",
toggleActions: "play none none reverse",
},
});

topRowTl
.to(titles[0], {
opacity: 1,
y: 0,
duration: 0.8,
ease: "power3.out",
})
.to(texts.slice(0, 2), {
opacity: 1,
y: 0,
duration: 0.6,
stagger: 0.2,
ease: "power2.out",
}, "-=0.4")
.to(images[0], {
opacity: 1,
y: 0,
duration: 0.8,
ease: "power3.out",
}, "-=0.6");


const bottomRowTl = gsap.timeline({
scrollTrigger: {
trigger: bottomRowRef.current,
start: "top 80%",
end: "bottom 20%",
toggleActions: "play none none reverse",
},
});

bottomRowTl
.to(images[1], {
opacity: 1,
y: 0,
duration: 0.8,
ease: "power3.out",
})
.to(titles[1], {
opacity: 1,
y: 0,
duration: 0.8,
ease: "power3.out",
}, "-=0.4")
.to(texts.slice(2, 4), {
opacity: 1,
y: 0,
duration: 0.6,
stagger: 0.2,
ease: "power2.out",
}, "-=0.4");




titles.forEach((title) => {
const chars = title.textContent?.split('') || [];
title.innerHTML = chars.map(char =>
char === ' ' ? ' ' : `<span class="char">${char}</span>`
).join('');

const charSpans = title.querySelectorAll('.char');
gsap.set(charSpans, { opacity: 0, y: 20 });

gsap.to(charSpans, {
opacity: 1,
y: 0,
duration: 0.5,
stagger: 0.03,
ease: "back.out(1.7)",
scrollTrigger: {
trigger: title,
start: "top 85%",
toggleActions: "play none none reverse",
},
});
});


magneticElements.forEach((element) => {
const handleMouseMove = (e: MouseEvent) => {
const rect = element.getBoundingClientRect();
const x = e.clientX - rect.left - rect.width / 2;
const y = e.clientY - rect.top - rect.height / 2;

const distance = Math.sqrt(x * x + y * y);
const maxDistance = Math.sqrt(rect.width * rect.width + rect.height * rect.height) / 2;
const strength = Math.max(0, 1 - distance / maxDistance);

const moveX = x * strength * 0.3;
const moveY = y * strength * 0.3;

gsap.to(element, {
x: moveX,
y: moveY,
scale: 1 + strength * 0.05,
duration: 0.3,
ease: "power2.out",
});
};

const handleMouseLeave = () => {
gsap.to(element, {
x: 0,
y: 0,
scale: 1,
duration: 0.5,
ease: "elastic.out(1, 0.3)",
});
};

element.addEventListener('mousemove', handleMouseMove);
element.addEventListener('mouseleave', handleMouseLeave);


return () => {
element.removeEventListener('mousemove', handleMouseMove);
element.removeEventListener('mouseleave', handleMouseLeave);
};
});


return () => {
ScrollTrigger.getAll().forEach(trigger => trigger.kill());
};
};

68 changes: 68 additions & 0 deletions app/animations/openSourceAnimations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import type { MutableRefObject } from "react";
import gsap from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";

gsap.registerPlugin(ScrollTrigger);

type El<T> = MutableRefObject<T | null>;
type Els<T> = MutableRefObject<T[]>;

export function initOpenSourceAnimations(
sectionRef: El<HTMLElement>,
headerRef: El<HTMLDivElement>,
titleRef: El<HTMLHeadingElement>,
subtitleRef: El<HTMLParagraphElement>,
projectsRef: El<HTMLDivElement>,
projectCardRefs: Els<HTMLDivElement>,
_projectImageRefs: Els<HTMLDivElement>,
_projectTitleRefs: Els<HTMLHeadingElement>,
_projectDescRefs: Els<HTMLParagraphElement>
) {
if (typeof window === "undefined") return () => {};

const sectionEl = sectionRef.current;
const headerEl = headerRef.current;
const titleEl = titleRef.current;
const subtitleEl = subtitleRef.current;
const projectsEl = projectsRef.current;
const cardEls = projectCardRefs.current.filter(Boolean);

if (!sectionEl) return () => {};

const ctx = gsap.context(() => {
gsap.set([headerEl, titleEl, subtitleEl], {
clearProps: "all",
opacity: 1,
visibility: "visible",
display: "block",
});

const intro = gsap.timeline({ defaults: { ease: "power2.out" } });
if (headerEl) intro.from(headerEl, { y: 16, duration: 0.4, immediateRender: false }, 0);
if (titleEl) intro.from(titleEl, { y: 10, duration: 0.35, immediateRender: false }, 0.05);
if (subtitleEl) intro.from(subtitleEl, { y: 10, duration: 0.35, immediateRender: false }, 0.12);

if (projectsEl && cardEls.length) {
gsap.from(cardEls, {
y: 24,
autoAlpha: 0,
duration: 0.5,
stagger: 0.08,
ease: "power2.out",
immediateRender: false,
scrollTrigger: {
trigger: projectsEl,
start: "top 80%",
once: true,
},
});
}

ScrollTrigger.refresh();
}, sectionEl);

return () => {
ctx.revert();
[headerEl, titleEl, subtitleEl].forEach((el) => el && gsap.set(el, { clearProps: "all" }));
};
}
69 changes: 69 additions & 0 deletions app/animations/pastHackathonsAnimations.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { gsap } from "gsap";
import { ScrollTrigger } from "gsap/ScrollTrigger";

if (typeof window !== "undefined") {
gsap.registerPlugin(ScrollTrigger);
}

export const initPastHackathonsAnimations = (
sectionRef: React.RefObject<HTMLDivElement | null>,
trackRef: React.RefObject<HTMLDivElement | null>
) => {
const section = sectionRef.current;
const track = trackRef.current;
if (!section || !track) return;


try {
ScrollTrigger.normalizeScroll?.(true);
} catch {}

const prefersReduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
const isDesktop = () => window.innerWidth >= 1024;
let tween: gsap.core.Tween | null = null;

const setup = () => {
if (prefersReduced || !isDesktop()) return;

const getAmount = () => track.scrollWidth - window.innerWidth;

tween = gsap.to(track, {
x: () => -getAmount(),
ease: 'none',
scrollTrigger: {
trigger: section,
start: 'top top',
end: () => '+=' + getAmount(),
scrub: 0.1,
pin: true,
anticipatePin: 1,
invalidateOnRefresh: true,
},
});
};

setup();


const refresh = () => ScrollTrigger.refresh();
const imgs = track.querySelectorAll('img');
imgs.forEach((img) => {
if (!img.complete) img.addEventListener('load', refresh, { once: true });
});

const onResize = () => {
ScrollTrigger.refresh();
if (!tween && isDesktop() && !prefersReduced) setup();
};
window.addEventListener('resize', onResize);


return () => {
window.removeEventListener('resize', onResize);
if (tween) {
tween.scrollTrigger?.kill();
tween.kill();
}
ScrollTrigger.getAll().forEach((st) => st.kill());
};
};
Loading