diff --git a/src/components/Hero/hero.css b/src/components/Hero/hero.css
deleted file mode 100644
index 86009253..00000000
--- a/src/components/Hero/hero.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.hero-background {
- @apply bg-acmdark;
- background-image: none;
-}
-
-@media screen(lg) {
- .hero-background {
- background-image: url('vertical.svg');
- background-position: top right -25vw;
- background-repeat: no-repeat;
- background-size: auto 150%;
- }
-}
-
-@media screen(xl) {
- .hero-background {
- background-image: url('horizontal.svg'), url('vertical.svg');
- background-position:
- top 35vh left -10vw,
- top right -15vw;
- background-repeat: no-repeat, no-repeat;
- background-size:
- auto 120%,
- auto 150%;
- }
-}
diff --git a/src/components/Hero/horizontal.svg b/src/components/Hero/horizontal.svg
deleted file mode 100644
index a5ad2b12..00000000
--- a/src/components/Hero/horizontal.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/Hero/index.tsx b/src/components/Hero/index.tsx
index 928943f0..7f217b66 100644
--- a/src/components/Hero/index.tsx
+++ b/src/components/Hero/index.tsx
@@ -7,15 +7,20 @@ import {
FaCalendarPlus,
FaDiscord,
FaInstagram,
+ FaArrowRight,
+ FaUsers,
+ FaTrophy,
+ FaCode,
+ FaChevronLeft,
+ FaChevronRight,
} from 'react-icons/fa';
import EventCard from '@/components/Card/EventCard';
-import './hero.css';
import headerJpg from './header.jpg';
import headerWebp from './header.webp';
import { IEvent } from '@/components/Events/events';
-import { useEffect, useState } from 'react';
+import { useEffect, useState, useRef } from 'react';
import {
Button,
Dropdown,
@@ -31,47 +36,54 @@ import {
useDisclosure,
} from '@heroui/react';
import config from '../../config.json';
+import { AllOrganizationList } from '@acm-uiuc/js-shared';
interface HeroProps {
upcomingEvents: IEvent[];
eventsLoading: boolean;
}
+export const buttonStyles =
+ 'bg-cambridge_blue-300 hover:bg-cambridge_blue-500 transform hover:scale-105 hover:shadow-xl';
+
export default function Hero({ upcomingEvents, eventsLoading }: HeroProps) {
- const [featuredEvents, setFeaturedEvents] = useState
([]);
- const [numEvents, setNumEvents] = useState(3);
+ upcomingEvents = upcomingEvents.slice(0, 3);
+ const [currentEventIndex, setCurrentEventIndex] = useState(0);
+ const hasAnimated = useRef(false);
+ const prevEventsLoading = useRef(eventsLoading);
useEffect(() => {
- if (eventsLoading) return;
-
- // Filter out events that have already passed or are not featured
- const now = moment();
- const filteredEvents = upcomingEvents.filter((event) => {
- return moment(event.start).isAfter(now) && event.featured !== false;
- });
-
- // Max 3 events
- const firstFilteredEvents = filteredEvents.slice(0, 3);
- setFeaturedEvents(firstFilteredEvents);
- setNumEvents(Math.min(firstFilteredEvents.length, 3));
- }, [upcomingEvents, eventsLoading]);
-
- const featuredEventsHTML =
- featuredEvents.length > 0 ? (
-
- {featuredEvents.map((object, i) => {
- return ;
- })}
-
- ) : eventsLoading ? (
-
-
-
- ) : (
- No featured events coming up
+ if (prevEventsLoading.current === true && eventsLoading === false) {
+ hasAnimated.current = true;
+ }
+ prevEventsLoading.current = eventsLoading;
+ }, [eventsLoading]);
+
+ const nextEvent = () => {
+ setCurrentEventIndex(prev => (prev + 1) % upcomingEvents.length);
+ };
+
+ const prevEvent = () => {
+ setCurrentEventIndex(
+ prev => (prev - 1 + upcomingEvents.length) % upcomingEvents.length
);
+ };
+
+ useEffect(() => {
+ if (upcomingEvents.length <= 1) return;
+
+ const interval = setInterval(() => {
+ setCurrentEventIndex(prev => (prev + 1) % upcomingEvents.length);
+ }, 4000);
+
+ return () => clearInterval(interval);
+ }, [upcomingEvents.length]);
+
+ const featuredEvent = upcomingEvents[currentEventIndex];
+ const upcomingEventsFiltered = upcomingEvents
+ .filter((_, index) => index !== currentEventIndex)
+ .slice(0, 3);
+
const { isOpen, onOpen, onOpenChange } = useDisclosure();
const [selectedCalPlatform, setCalPlatform] = useState<
'google' | 'ical' | null
@@ -81,104 +93,285 @@ export default function Hero({ upcomingEvents, eventsLoading }: HeroProps) {
ical: 'Other',
};
+ // Skeleton component for the events section
+ const EventsSkeleton = () => (
+
+ {/* Header with skeleton navigation */}
+
+
+ Featured Events
+
+
+
+
+ {/* Featured event skeleton */}
+
+
+ {/* Event indicators skeleton */}
+
+
+
+
+ {[...Array(2)].map((_, index) => (
+
+
+
+ ))}
+
+
+ {/* Upcoming events skeleton */}
+
+
+ {[...Array(2)].map((_, index) => (
+
+
+
+ ))}
+
+
+
+ {/* Action buttons skeleton */}
+
+
+ );
+
return (
-
-
-
-
-
-
- UIUC's Largest Computer Science Organization
-
-
- For over 50 years, ACM@UIUC has been a hub for innovation and
- leadership for students everywhere. Our inclusivity has created a
- strong network of students and alumni, bringing their diverse
- interests to ACM.
-
-
+
+ {/* Background decorative elements */}
+
+
+
+
+
+
+
+ UIUC's Largest Computer Science Organization
+
+
+
+ ACM @ UIUC is dedicated to exploring almost every aspect of
+ computer science. We serve to advance the field of CS at the
+ University of Illinois by providing hands-on projects,
+ workshops, and networking opportunities for students of all
+ skill levels.
+
+
+
+ {/* Enhanced Stats Row */}
+
+
+
+
+
+
+
{config.numMembers}+
+
Members
+
+
+
+
+
+
+
+
+
+ {AllOrganizationList.length}
+
+
SIGs + Committees
+
+
+
+
+ {/* CTA Buttons */}
+
-
-
-
Featured Events
- {featuredEventsHTML}
-
-
-
- View all events
-
-
-
- Subscribe to calendar
-
+
+ {eventsLoading ? (
+
+ ) : (
+
+
+
+ Featured Events
+
+ {upcomingEvents.length > 1 && (
+
+
+
+
+
+
+
+
+ )}
+
+
+ {upcomingEvents.length > 0 ? (
+
+ ) : (
+
+
+
+
+ No events scheduled
+
+
+
+ )}
+
+ {/* Event indicators - only show if more than 1 event */}
+ {upcomingEvents.length > 1 && (
+
+ {upcomingEvents.map((_, index) => (
+ setCurrentEventIndex(index)}
+ className={`h-2 rounded-full transition-all duration-300 ${index === currentEventIndex
+ ? 'bg-white w-8'
+ : 'bg-white/40 hover:bg-white/60 w-2'
+ }`}
+ />
+ ))}
+
+ )}
+
+ {/* Upcoming Events List */}
+ {upcomingEventsFiltered.length > 0 && (
+
+
+
+ {upcomingEventsFiltered.map(event => (
+
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Calendar Action Buttons */}
+
+
+ )}
+
+ {/* Modal remains the same */}
- {(onClose) => (
+ {onClose => (
<>
Subscribe to ACM@UIUC's Events Calendar
@@ -204,8 +397,7 @@ export default function Hero({ upcomingEvents, eventsLoading }: HeroProps) {
: 'Select an option'}
- setCalPlatform(key as any)}>
- {/* Dropdown Items */}
+ setCalPlatform(key as any)}>
Google Calendar
Other
@@ -224,7 +416,7 @@ export default function Hero({ upcomingEvents, eventsLoading }: HeroProps) {
}
const url =
config['addCalendarLinks']['majorEvents'][
- selectedCalPlatform
+ selectedCalPlatform
];
window.open(url, '_blank')?.focus();
}}
@@ -236,6 +428,38 @@ export default function Hero({ upcomingEvents, eventsLoading }: HeroProps) {
)}
+
+
);
}
diff --git a/src/components/Hero/vertical.svg b/src/components/Hero/vertical.svg
deleted file mode 100644
index bdfe29b6..00000000
--- a/src/components/Hero/vertical.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx
index f259c316..1ef2a861 100644
--- a/src/components/Navbar/index.tsx
+++ b/src/components/Navbar/index.tsx
@@ -31,10 +31,10 @@ export default function Navbar() {
};
return (
-
+
{!prod ?
: null}
-
+
@@ -110,7 +110,7 @@ export default function Navbar() {
*/}
- Merch
+ Store
diff --git a/src/components/NewsletterPopup/index.tsx b/src/components/NewsletterPopup/index.tsx
index 58d7bbe3..1fc31fe1 100644
--- a/src/components/NewsletterPopup/index.tsx
+++ b/src/components/NewsletterPopup/index.tsx
@@ -1,6 +1,7 @@
'use client';
import { useEffect, useState } from 'react';
import { FaRegTimesCircle } from 'react-icons/fa';
+import config from "@/config.json"
import styles from './index.module.css';
@@ -42,8 +43,8 @@ export default function NewsletterPopup() {
our newsletter!
diff --git a/src/config.json b/src/config.json
index 9d3e67ac..8a0ac7d4 100644
--- a/src/config.json
+++ b/src/config.json
@@ -5,5 +5,11 @@
"google": "https://calendar.google.com/calendar/r?cid=http%3A%2F%2Fical.acm.illinois.edu%2FACM",
"ical": "webcal://ical.acm.illinois.edu/ACM"
}
- }
-}
+ },
+ "paidMemberGuide": "https://go.acm.illinois.edu/paid-member-guide",
+ "discordInvite": "https://go.acm.illinois.edu/discord",
+ "instagramPage": "https://instagram.com/acm.uiuc",
+ "mailingListSignup": "https://listmonk.acm.illinois.edu/subscription/form",
+ "donateUrl": "https://go.acm.illinois.edu/donate",
+ "numMembers": 600
+}
\ No newline at end of file
diff --git a/src/styles/global.css b/src/styles/global.css
index bda96df4..c9e66f84 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -5,16 +5,24 @@
@keyframes rainbowBackground {
0% {
background-color: #5386e4;
- } /* ACM Muted Primary Color */
+ }
+
+ /* ACM Muted Primary Color */
33% {
background-color: #00635d;
- } /* ACM Additional Color 1 */
+ }
+
+ /* ACM Additional Color 1 */
66% {
background-color: #260c1a;
- } /* ACM Additional Color 2 */
+ }
+
+ /* ACM Additional Color 2 */
100% {
background-color: #0053b3;
- } /* ACM Primary Color */
+ }
+
+ /* ACM Primary Color */
}
.rainbow-background {
@@ -28,15 +36,22 @@
}
:root {
- --rgb-acmdark: 62 72 111; /* #3E486F */
- --rgb-primary: 69 119 248; /* #4577F8 */
- --rgb-secondary: 56 98 201; /* #3862C9 */
- --rgb-surface-000: 255 255 255; /* #FFFFFF */
- --rgb-surface-050: 250 250 250; /* #FAFAFA */
- --rgb-surface-100: 239 239 239; /* #EFEFEF */
- --rgb-surface-150: 224 224 224; /* #E0E0E0 */
- --rgb-surface-200: 189 189 189; /* #BDBDBD */
- --rgb-surface-250: 158 158 158; /* #9E9E9E */
+ --rgb-primary: 0 57 122;
+ /* #4577F8 */
+ --rgb-secondary: 56 98 201;
+ /* #3862C9 */
+ --rgb-surface-000: 255 255 255;
+ /* #FFFFFF */
+ --rgb-surface-050: 250 250 250;
+ /* #FAFAFA */
+ --rgb-surface-100: 239 239 239;
+ /* #EFEFEF */
+ --rgb-surface-150: 224 224 224;
+ /* #E0E0E0 */
+ --rgb-surface-200: 189 189 189;
+ /* #BDBDBD */
+ --rgb-surface-250: 158 158 158;
+ /* #9E9E9E */
--font-size-body: 1.125rem;
--font-size-bodylarge: 1.25rem;
@@ -62,25 +77,32 @@ body {
h1 {
font-size: var(--font-size-h1);
}
+
h2 {
font-size: var(--font-size-h2);
}
+
h3 {
font-size: var(--font-size-h3);
}
+
h4 {
font-size: var(--font-size-h4);
}
+
h5 {
font-size: var(--font-size-h5);
}
+
h6 {
font-size: var(--font-size-h6);
}
+
h1,
h2 {
- color: rgb(var(--rgb-acmdark));
+ color: rgb(var(--rgb-primary));
}
+
h1,
h2,
h3,
@@ -92,4 +114,4 @@ h6 {
.no-scroll {
overflow-y: hidden;
-}
+}
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
index 2a3b1d5a..981e7aa1 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -15,9 +15,6 @@ module.exports = {
},
extend: {
colors: {
- acmdark: 'rgb(var(--rgb-acmdark) / )',
- primary: 'rgb(var(--rgb-primary) / )',
- secondary: 'rgb(var(--rgb-secondary) / )',
surface: {
'000': 'rgb(var(--rgb-surface-000) / )',
'050': 'rgb(var(--rgb-surface-050) / )',
@@ -26,6 +23,66 @@ module.exports = {
200: 'rgb(var(--rgb-surface-200) / )',
250: 'rgb(var(--rgb-surface-200) / )',
},
+ 'primary': {
+ DEFAULT: '#00397a',
+ 100: '#000b18',
+ 200: '#001731',
+ 300: '#002249',
+ 400: '#002e62',
+ 500: '#00397a',
+ 600: '#005dc8',
+ 700: '#1683ff',
+ 800: '#64acff',
+ 900: '#b1d6ff'
+ },
+ 'secondary': {
+ DEFAULT: '#83a8ec',
+ 100: '#0a1d40',
+ 200: '#14397f',
+ 300: '#1e56bf',
+ 400: '#447be2',
+ 500: '#83a8ec',
+ 600: '#9cb9f0',
+ 700: '#b5cbf3',
+ 800: '#cedcf7',
+ 900: '#e6eefb'
+ },
+ 'atomic_tangerine': {
+ DEFAULT: '#ea9571',
+ 100: '#3c1809',
+ 200: '#793112',
+ 300: '#b5491b',
+ 400: '#e16835',
+ 500: '#ea9571',
+ 600: '#eeaa8d',
+ 700: '#f2c0aa',
+ 800: '#f7d5c6',
+ 900: '#fbeae3'
+ },
+ 'cambridge_blue': {
+ DEFAULT: '#8cba9b',
+ 100: '#18291e',
+ 200: '#31523c',
+ 300: '#497a5a',
+ 400: '#63a278',
+ 500: '#8cba9b',
+ 600: '#a3c8af',
+ 700: '#bad6c3',
+ 800: '#d1e3d7',
+ 900: '#e8f1eb'
+ },
+ 'blush': {
+ DEFAULT: '#c9697f',
+ 100: '#2d1017',
+ 200: '#5a202e',
+ 300: '#873145',
+ 400: '#b4415c',
+ 500: '#c9697f',
+ 600: '#d48799',
+ 700: '#dfa5b2',
+ 800: '#e9c3cc',
+ 900: '#f4e1e5'
+ }
},
container: {
center: true,
@@ -33,7 +90,6 @@ module.exports = {
},
},
},
- plugins: [],
- darkMode: 'class',
plugins: [heroui()],
+ darkMode: 'class',
};