diff --git a/package.json b/package.json index 97227eca..d5eccdd2 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@tanstack/react-query": "^5.66.0", "@types/luxon": "^3.3.2", "@types/node": "^24.1.0", - "@types/react": "19.2.9", + "@types/react": "19.2.10", "@types/react-dom": "19.2.3", "@vercel/analytics": "^1.5.0", "@vercel/speed-insights": "^1.2.0", @@ -46,7 +46,7 @@ "clsx": "^2.1.1", "cmdk": "^1.1.1", "eslint": "9.39.2", - "eslint-config-next": "16.1.4", + "eslint-config-next": "16.1.6", "firebase": "^12.0.0", "form-data": "^4.0.0", "framer-motion": "^12.0.0", @@ -55,7 +55,7 @@ "lint-staged": "^16.0.0", "lucide-react": "^0.563.0", "luxon": "^3.4.2", - "next": "16.1.4", + "next": "16.1.6", "posthog-js": "^1.257.0", "posthog-node": "^5.5.1", "prettier": "^3.3.3", diff --git a/public/event/event_13.webp b/public/event/event_13.webp new file mode 100644 index 00000000..86a38e1e Binary files /dev/null and b/public/event/event_13.webp differ diff --git a/public/event/event_14.webp b/public/event/event_14.webp new file mode 100644 index 00000000..318f3835 Binary files /dev/null and b/public/event/event_14.webp differ diff --git a/public/event/event_15.webp b/public/event/event_15.webp new file mode 100644 index 00000000..6a44fe12 Binary files /dev/null and b/public/event/event_15.webp differ diff --git a/public/event/event_16.webp b/public/event/event_16.webp new file mode 100644 index 00000000..88f3807b Binary files /dev/null and b/public/event/event_16.webp differ diff --git a/public/event/event_17.webp b/public/event/event_17.webp new file mode 100644 index 00000000..bcba91cc Binary files /dev/null and b/public/event/event_17.webp differ diff --git a/public/event/event_18.webp b/public/event/event_18.webp new file mode 100644 index 00000000..0037f564 Binary files /dev/null and b/public/event/event_18.webp differ diff --git a/public/event/event_19.webp b/public/event/event_19.webp new file mode 100644 index 00000000..c1800624 Binary files /dev/null and b/public/event/event_19.webp differ diff --git a/public/event/event_20.webp b/public/event/event_20.webp new file mode 100644 index 00000000..81dfd5cd Binary files /dev/null and b/public/event/event_20.webp differ diff --git a/public/event/event_21.webp b/public/event/event_21.webp new file mode 100644 index 00000000..ef585831 Binary files /dev/null and b/public/event/event_21.webp differ diff --git a/public/event/event_22.webp b/public/event/event_22.webp new file mode 100644 index 00000000..102c26ac Binary files /dev/null and b/public/event/event_22.webp differ diff --git a/public/event/event_23.webp b/public/event/event_23.webp new file mode 100644 index 00000000..6a2aa9f1 Binary files /dev/null and b/public/event/event_23.webp differ diff --git a/public/event/event_24.webp b/public/event/event_24.webp new file mode 100644 index 00000000..6d98cfd6 Binary files /dev/null and b/public/event/event_24.webp differ diff --git a/public/logo.png b/public/logo.png index ec63d568..0b5ea3cf 100644 Binary files a/public/logo.png and b/public/logo.png differ diff --git a/public/sp26/BoxClosed3.png b/public/sp26/BoxClosed3.png new file mode 100644 index 00000000..bccf09eb Binary files /dev/null and b/public/sp26/BoxClosed3.png differ diff --git a/public/sp26/BoxOpened2.png b/public/sp26/BoxOpened2.png new file mode 100644 index 00000000..9d079c85 Binary files /dev/null and b/public/sp26/BoxOpened2.png differ diff --git a/public/sp26/Bridge.PNG b/public/sp26/Bridge.PNG new file mode 100644 index 00000000..44fafd62 Binary files /dev/null and b/public/sp26/Bridge.PNG differ diff --git a/public/sp26/Graffiti.png b/public/sp26/Graffiti.png new file mode 100644 index 00000000..fe19aabd Binary files /dev/null and b/public/sp26/Graffiti.png differ diff --git a/public/sp26/GraffitiText.png b/public/sp26/GraffitiText.png new file mode 100644 index 00000000..21513c71 Binary files /dev/null and b/public/sp26/GraffitiText.png differ diff --git a/public/sp26/LogoStatic(cyan&blue)p1.png b/public/sp26/LogoStatic(cyan&blue)p1.png new file mode 100644 index 00000000..efb5c6e8 Binary files /dev/null and b/public/sp26/LogoStatic(cyan&blue)p1.png differ diff --git a/public/sp26/LogoStaticp1.png b/public/sp26/LogoStaticp1.png new file mode 100644 index 00000000..a8db0853 Binary files /dev/null and b/public/sp26/LogoStaticp1.png differ diff --git a/public/sp26/about buttons.png b/public/sp26/about buttons.png new file mode 100644 index 00000000..64030981 Binary files /dev/null and b/public/sp26/about buttons.png differ diff --git a/public/sp26/about2.png b/public/sp26/about2.png new file mode 100644 index 00000000..4b1bbfa1 Binary files /dev/null and b/public/sp26/about2.png differ diff --git a/public/sp26/about3.png b/public/sp26/about3.png new file mode 100644 index 00000000..40f2462e Binary files /dev/null and b/public/sp26/about3.png differ diff --git a/public/sp26/activities2.png b/public/sp26/activities2.png new file mode 100644 index 00000000..3e5b2672 Binary files /dev/null and b/public/sp26/activities2.png differ diff --git a/public/sp26/alien.png b/public/sp26/alien.png new file mode 100644 index 00000000..089e4396 Binary files /dev/null and b/public/sp26/alien.png differ diff --git a/public/sp26/billboard.png b/public/sp26/billboard.png new file mode 100644 index 00000000..8c50ec3b Binary files /dev/null and b/public/sp26/billboard.png differ diff --git a/public/sp26/billboard2.png b/public/sp26/billboard2.png new file mode 100644 index 00000000..c258a6e8 Binary files /dev/null and b/public/sp26/billboard2.png differ diff --git a/public/sp26/checkin2.png b/public/sp26/checkin2.png new file mode 100644 index 00000000..124779f3 Binary files /dev/null and b/public/sp26/checkin2.png differ diff --git a/public/sp26/computer_backgrounds/faq_fifth_page_computer.png b/public/sp26/computer_backgrounds/faq_fifth_page_computer.png new file mode 100644 index 00000000..11bc635f Binary files /dev/null and b/public/sp26/computer_backgrounds/faq_fifth_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/first_page_computer.png b/public/sp26/computer_backgrounds/first_page_computer.png new file mode 100644 index 00000000..2531a264 Binary files /dev/null and b/public/sp26/computer_backgrounds/first_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/first_page_computer2.png b/public/sp26/computer_backgrounds/first_page_computer2.png new file mode 100644 index 00000000..04365d03 Binary files /dev/null and b/public/sp26/computer_backgrounds/first_page_computer2.png differ diff --git a/public/sp26/computer_backgrounds/gallery_sixth_page_computer.png b/public/sp26/computer_backgrounds/gallery_sixth_page_computer.png new file mode 100644 index 00000000..54a8bb3b Binary files /dev/null and b/public/sp26/computer_backgrounds/gallery_sixth_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/madewlove_eigth_page_computer.png b/public/sp26/computer_backgrounds/madewlove_eigth_page_computer.png new file mode 100644 index 00000000..2974e6b8 Binary files /dev/null and b/public/sp26/computer_backgrounds/madewlove_eigth_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/prizeschallenges_third_page_computer.png b/public/sp26/computer_backgrounds/prizeschallenges_third_page_computer.png new file mode 100644 index 00000000..40dea4fd Binary files /dev/null and b/public/sp26/computer_backgrounds/prizeschallenges_third_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/schedule_fourth_page_computer.png b/public/sp26/computer_backgrounds/schedule_fourth_page_computer.png new file mode 100644 index 00000000..7b0a2587 Binary files /dev/null and b/public/sp26/computer_backgrounds/schedule_fourth_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/second_page_computer.png b/public/sp26/computer_backgrounds/second_page_computer.png new file mode 100644 index 00000000..921fe5c5 Binary files /dev/null and b/public/sp26/computer_backgrounds/second_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/sponsors_seventh_page_computer.png b/public/sp26/computer_backgrounds/sponsors_seventh_page_computer.png new file mode 100644 index 00000000..f66d0a12 Binary files /dev/null and b/public/sp26/computer_backgrounds/sponsors_seventh_page_computer.png differ diff --git a/public/sp26/computer_backgrounds/sponsors_seventh_page_computer2.png b/public/sp26/computer_backgrounds/sponsors_seventh_page_computer2.png new file mode 100644 index 00000000..14aee95f Binary files /dev/null and b/public/sp26/computer_backgrounds/sponsors_seventh_page_computer2.png differ diff --git a/public/sp26/cyber_hacky.png b/public/sp26/cyber_hacky.png new file mode 100644 index 00000000..b6716034 Binary files /dev/null and b/public/sp26/cyber_hacky.png differ diff --git a/public/sp26/drone.png b/public/sp26/drone.png new file mode 100644 index 00000000..faaa48c8 Binary files /dev/null and b/public/sp26/drone.png differ diff --git a/public/sp26/general2.png b/public/sp26/general2.png new file mode 100644 index 00000000..a3b5cdd9 Binary files /dev/null and b/public/sp26/general2.png differ diff --git a/public/sp26/glitchy lion.png b/public/sp26/glitchy lion.png new file mode 100644 index 00000000..bc4e34b0 Binary files /dev/null and b/public/sp26/glitchy lion.png differ diff --git a/public/sp26/graffiti_2.PNG b/public/sp26/graffiti_2.PNG new file mode 100644 index 00000000..a131b534 Binary files /dev/null and b/public/sp26/graffiti_2.PNG differ diff --git a/public/sp26/graffiti_animated.png b/public/sp26/graffiti_animated.png new file mode 100644 index 00000000..06e8f373 Binary files /dev/null and b/public/sp26/graffiti_animated.png differ diff --git a/public/sp26/holo.png b/public/sp26/holo.png new file mode 100644 index 00000000..a8edb6a0 Binary files /dev/null and b/public/sp26/holo.png differ diff --git a/public/sp26/phone_backgrounds/phone_faq.png b/public/sp26/phone_backgrounds/phone_faq.png new file mode 100644 index 00000000..9092ec05 Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_faq.png differ diff --git a/public/sp26/phone_backgrounds/phone_first.png b/public/sp26/phone_backgrounds/phone_first.png new file mode 100644 index 00000000..1faf5332 Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_first.png differ diff --git a/public/sp26/phone_backgrounds/phone_gallery.png b/public/sp26/phone_backgrounds/phone_gallery.png new file mode 100644 index 00000000..55c59006 Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_gallery.png differ diff --git a/public/sp26/phone_backgrounds/phone_schedule.png b/public/sp26/phone_backgrounds/phone_schedule.png new file mode 100644 index 00000000..92d9653a Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_schedule.png differ diff --git a/public/sp26/phone_backgrounds/phone_schedule2.png b/public/sp26/phone_backgrounds/phone_schedule2.png new file mode 100644 index 00000000..4643364e Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_schedule2.png differ diff --git a/public/sp26/phone_backgrounds/phone_second_about.png b/public/sp26/phone_backgrounds/phone_second_about.png new file mode 100644 index 00000000..6974cb78 Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_second_about.png differ diff --git a/public/sp26/phone_backgrounds/phone_second_about2.png b/public/sp26/phone_backgrounds/phone_second_about2.png new file mode 100644 index 00000000..6203e086 Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_second_about2.png differ diff --git a/public/sp26/phone_backgrounds/phone_sponsors.png b/public/sp26/phone_backgrounds/phone_sponsors.png new file mode 100644 index 00000000..76aa3e9a Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_sponsors.png differ diff --git a/public/sp26/phone_backgrounds/phone_sponsors3.png b/public/sp26/phone_backgrounds/phone_sponsors3.png new file mode 100644 index 00000000..fb5ba85f Binary files /dev/null and b/public/sp26/phone_backgrounds/phone_sponsors3.png differ diff --git a/public/sp26/phone_backgrounds/third_page_phone.png b/public/sp26/phone_backgrounds/third_page_phone.png new file mode 100644 index 00000000..142561da Binary files /dev/null and b/public/sp26/phone_backgrounds/third_page_phone.png differ diff --git a/public/sp26/phone_backgrounds/third_page_phone2.png b/public/sp26/phone_backgrounds/third_page_phone2.png new file mode 100644 index 00000000..fc136933 Binary files /dev/null and b/public/sp26/phone_backgrounds/third_page_phone2.png differ diff --git a/public/sp26/phone_backgrounds/third_page_phone3.png b/public/sp26/phone_backgrounds/third_page_phone3.png new file mode 100644 index 00000000..62d9d32a Binary files /dev/null and b/public/sp26/phone_backgrounds/third_page_phone3.png differ diff --git a/public/sp26/register3.png b/public/sp26/register3.png new file mode 100644 index 00000000..6c7a5f42 Binary files /dev/null and b/public/sp26/register3.png differ diff --git a/public/sp26/robot.png b/public/sp26/robot.png new file mode 100644 index 00000000..61ba45b5 Binary files /dev/null and b/public/sp26/robot.png differ diff --git a/public/sp26/workshops2.png b/public/sp26/workshops2.png new file mode 100644 index 00000000..7fbcaf94 Binary files /dev/null and b/public/sp26/workshops2.png differ diff --git a/src/app/(default)/account-deletion/page.tsx b/src/app/(default)/account-deletion/page.tsx index 4f0a43c9..51ca4f01 100644 --- a/src/app/(default)/account-deletion/page.tsx +++ b/src/app/(default)/account-deletion/page.tsx @@ -12,7 +12,10 @@ const AccountDeletionPolicy = () => { ]; return ( -
+
{/* Header */}
diff --git a/src/app/(default)/expo/page.tsx b/src/app/(default)/expo/page.tsx index eae8f505..3e1e7110 100644 --- a/src/app/(default)/expo/page.tsx +++ b/src/app/(default)/expo/page.tsx @@ -70,7 +70,10 @@ export default function ExpoPage() { if (error) { return ( -
+
@@ -86,7 +89,10 @@ export default function ExpoPage() { } return ( -
+
diff --git a/src/app/(default)/map/page.tsx b/src/app/(default)/map/page.tsx index db6f4662..d6fc7778 100644 --- a/src/app/(default)/map/page.tsx +++ b/src/app/(default)/map/page.tsx @@ -2,7 +2,11 @@ import VenueMap from "@/components/VenueMap"; import React from "react"; const mapPage = () => { - return ; + return ( +
+ +
+ ); }; export default mapPage; diff --git a/src/app/(default)/organizer-application/page.tsx b/src/app/(default)/organizer-application/page.tsx index de2214b2..c137cb81 100644 --- a/src/app/(default)/organizer-application/page.tsx +++ b/src/app/(default)/organizer-application/page.tsx @@ -421,7 +421,10 @@ export default function OrganizerApplicationPage() { return ( <> -
+
diff --git a/src/app/(default)/privacy/page.tsx b/src/app/(default)/privacy/page.tsx index 534bb0ad..fa8c55dc 100644 --- a/src/app/(default)/privacy/page.tsx +++ b/src/app/(default)/privacy/page.tsx @@ -17,7 +17,10 @@ const PrivacyPolicy = () => { ]; return ( -
+
{/* Header */}
diff --git a/src/app/(default)/travel/page.tsx b/src/app/(default)/travel/page.tsx index 36a9ed9a..6bd51aa2 100644 --- a/src/app/(default)/travel/page.tsx +++ b/src/app/(default)/travel/page.tsx @@ -49,7 +49,10 @@ const TravelReimbursementPolicy = () => { ]; return ( -
+
{/* Header */}
diff --git a/src/app/(protected)/extra-credit/page.tsx b/src/app/(protected)/extra-credit/page.tsx index 3049a9be..64f2c92f 100644 --- a/src/app/(protected)/extra-credit/page.tsx +++ b/src/app/(protected)/extra-credit/page.tsx @@ -96,7 +96,10 @@ export default function ExtraCredit() { } return ( -
+
+ {(userData?.registration as any)?.application_status === + "confirmed" && ( + + + + + Check-in QR Code + + + Use this QR code to sign in for hackathons and workshops + + + + - {showQRCode && ( -
-
- + {showQRCode && ( +
+
+ +
-
- )} - - + )} + + + )} {/* Wallet Integration */} diff --git a/src/app/(protected)/project/page.tsx b/src/app/(protected)/project/page.tsx index 4ef72dbb..23145a78 100644 --- a/src/app/(protected)/project/page.tsx +++ b/src/app/(protected)/project/page.tsx @@ -248,7 +248,10 @@ export default function Project() { if (!userTeam) { return ( -
+
diff --git a/src/app/(protected)/register/page.tsx b/src/app/(protected)/register/page.tsx index 7f7f385b..947b7543 100644 --- a/src/app/(protected)/register/page.tsx +++ b/src/app/(protected)/register/page.tsx @@ -56,6 +56,11 @@ type FormData = Omit & | "shareAddressSponsors" | "driving" | "shareAddressMlh" + | "application_status" + | "accepted_at" + | "rsvp_deadline" + | "rsvp_at" + | "accepted_by" > & { resume: File | null; hasDietaryRestrictions: boolean; @@ -137,6 +142,7 @@ export default function RegistrationPage() { travel_cost: 0, travel_method: "", travel_additional: "", + }); const [races, setRaces] = useState([]); @@ -455,7 +461,10 @@ export default function RegistrationPage() { return ( <> -
+
{/* Sidebar - Hidden on mobile, floating and vertically centered */}
@@ -512,14 +521,14 @@ export default function RegistrationPage() {
-

+

Register for our {hackathon?.name} hackathon

-

+

Feel free to reach out to us at{" "} technology@hackpsu.org {" "} diff --git a/src/app/(protected)/reimbursements/page.tsx b/src/app/(protected)/reimbursements/page.tsx index 6c832dd8..3cfcdb63 100644 --- a/src/app/(protected)/reimbursements/page.tsx +++ b/src/app/(protected)/reimbursements/page.tsx @@ -445,7 +445,10 @@ export default function ReimbursementPage() { // Show loading state while flag is being fetched if (flagLoading) { return ( -

+
@@ -464,7 +467,10 @@ export default function ReimbursementPage() { participantReimbursementFlag?.isEnabled ?? false; return ( -
+
diff --git a/src/app/(protected)/reservation/page.tsx b/src/app/(protected)/reservation/page.tsx index dbe79092..82ef199d 100644 --- a/src/app/(protected)/reservation/page.tsx +++ b/src/app/(protected)/reservation/page.tsx @@ -2,7 +2,11 @@ import ReservationSystem from "@/components/ReservationSystem"; import React from "react"; const ReservationPage = () => { - return ; + return ( +
+ +
+ ); }; export default ReservationPage; diff --git a/src/app/(protected)/team/page.tsx b/src/app/(protected)/team/page.tsx index 9c8659a1..fafcec78 100644 --- a/src/app/(protected)/team/page.tsx +++ b/src/app/(protected)/team/page.tsx @@ -304,7 +304,10 @@ export default function Team() { } return ( -
+
{/* Team Header */} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 77f429a2..0feb798a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -44,7 +44,7 @@ export const metadata: Metadata = { "Join HackPSU Spring 2026 at Penn State University for 24 hours of innovation, coding, and collaboration. Open to all skill levels with workshops, mentorship, and amazing prizes.", images: [ { - url: "/logo.svg", + url: "/logo.png", alt: "HackPSU Spring 2026 Logo", }, ], diff --git a/src/app/page.tsx b/src/app/page.tsx index 88ab228b..1032037d 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -9,11 +9,7 @@ import FAQ from "@/components/FAQ"; import PrizesChallenges from "@/components/PrizesChallenges"; import Sponsors from "@/components/Sponsors"; import Footer from "@/components/Footer"; -import Submissions from "@/components/common/Submissions"; -import { Fireworks } from "@fireworks-js/react"; -import FerrisWheel from "@/components/FerrisWheel"; import InfoSections from "@/components/InfoSections"; -import Wave from "@/components/Wave"; import PhotoGallery from "@/components/PhotoGallery"; export default function Home() { @@ -29,71 +25,60 @@ export default function Home() { return () => window.removeEventListener("resize", checkMobile); }, []); - const wavePoints = isMobile ? 3 : 6; - return ( <>
- - {/* Wave transition after Hero */} - - - - - - - {" "} - - -
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
); diff --git a/src/components/FAQ.tsx b/src/components/FAQ.tsx index 2c778b5d..aa891ab3 100644 --- a/src/components/FAQ.tsx +++ b/src/components/FAQ.tsx @@ -46,7 +46,7 @@ const faqs: FAQItem[] = [ { question: "How should I submit a project?", answer: - "All projects will be submitted through the HackPSU Devpost. We will then have a judging expo in the building main area. Do NOT submit your project via email, Discord, DM, messenger pigeon, drone, etc. Both hardware and software projects are allowed. Only one Devpost submission per team is needed.", + "All projects will be submitted through the HackPSU Devpost AND through the HackPSU main website. To submit on the main website, go to the profile page and select Submit Project. We will then have a judging expo in the building main area. Do NOT submit your project via email, Discord, DM, messenger pigeon, drone, etc. Both hardware and software projects are allowed. Only one Devpost submission per team is needed.", link: { target: "http://devpost.hackpsu.org/", text: "devpost.hackpsu.org", @@ -110,7 +110,6 @@ const AccordionItem: React.FC = ({ className="text-white font-medium pr-4 group-hover:text-[#86CFFC] transition-colors duration-200" style={{ fontSize: "clamp(16px, 2.5vw, 20px)", - fontFamily: "Monomaniac One, monospace", }} > {faq.question} @@ -139,7 +138,9 @@ const AccordionItem: React.FC = ({ animate={{ y: 0, opacity: 1 }} transition={{ duration: 0.2, delay: 0.1 }} className="text-white/90 leading-relaxed mb-4" - style={{ fontSize: "clamp(14px, 2vw, 16px)" }} + style={{ + fontSize: "clamp(14px, 2vw, 16px)", + }} > {faq.answer} @@ -149,7 +150,10 @@ const AccordionItem: React.FC = ({ target="_blank" rel="noopener noreferrer" className="inline-block text-[#86CFFC] hover:text-white underline decoration-[#86CFFC] hover:decoration-white transition-colors duration-200" - style={{ fontSize: "clamp(14px, 2vw, 16px)" }} + style={{ + fontSize: "clamp(14px, 2vw, 16px)", + fontFamily: "Orbitron, monospace", + }} initial={{ y: -10, opacity: 0 }} animate={{ y: 0, opacity: 1 }} transition={{ duration: 0.2, delay: 0.2 }} @@ -189,8 +193,13 @@ const FAQ: React.FC = () => { return (
{/* Centered Header */}
@@ -200,59 +209,18 @@ const FAQ: React.FC = () => { transition={{ duration: 0.8 }} >

FAQ

-
- - - {/* Fish Animation */} - - Swimming Fish +
@@ -275,7 +243,7 @@ const FAQ: React.FC = () => { }} > FAQ Illustration - ); -} - -// Base SVG for the Ferris Wheel. -function BaseSVG() { - return ( - Ferris Wheel Base - ); -} - -const FerrisWheel = () => { - const [wheelRotation, setWheelRotation] = useState(0); - - // Handle scroll wheel events to update the rotation. - const handleWheel = (e: React.WheelEvent) => { - const rotationSpeed = 0.5; - setWheelRotation((prev) => prev + e.deltaY * rotationSpeed); - }; - - return ( -
- {/* Rotating wheel */} - - - - -
- -
-
- ); -}; - -export default FerrisWheel; diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx index a1c3b97e..4a985f58 100644 --- a/src/components/Footer/index.tsx +++ b/src/components/Footer/index.tsx @@ -112,40 +112,7 @@ const Footer = () => { }; return ( -
- {/* Floating Bubbles - Disabled when fish is chasing */} - {!isChasing && ( -
- {[...Array(120)].map((_, i) => { - const size = Math.random() * 12 + 6; - const leftPos = Math.random() * 100; - const delay = Math.random() * 15; - const duration = Math.random() * 10 + 15; - - return ( -
- ); - })} -
- )} - +
{/* Social Links Section */}
@@ -203,50 +170,6 @@ const Footer = () => { />
- - {/* Deep Fish - Bobbing animation on the right */} - - Deep-sea fish - {isChasing && ( -
-
-
- )} -
{/* Privacy Policy */} @@ -266,399 +189,6 @@ const Footer = () => { Made with ❤️ in Happy Valley.

- - {/* Underwater Plants at Bottom */} -
- {/* Green Plants with Varied Z-Index for Layering */} - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - Underwater seaweed plant - - - {/* Coral Plants with Varied Z-Index for Layering */} - - Underwater coral plant - - - Underwater coral plant - - - Underwater coral plant - - - Underwater coral plant - - - Underwater coral plant - - - {/* Additional 5 Red Coral Plants */} - - Underwater coral plant - - - Underwater coral plant - - - Underwater coral plant - - - Underwater coral plant - - - Underwater coral plant - -
); }; diff --git a/src/components/FullScreenLoading/FullScreenLoading.tsx b/src/components/FullScreenLoading/FullScreenLoading.tsx index f7370276..8f474903 100644 --- a/src/components/FullScreenLoading/FullScreenLoading.tsx +++ b/src/components/FullScreenLoading/FullScreenLoading.tsx @@ -1,7 +1,6 @@ "use client"; import React from "react"; import { motion } from "framer-motion"; -import Image from "next/image"; const FullScreenLoading: React.FC = () => { return ( @@ -9,151 +8,12 @@ const FullScreenLoading: React.FC = () => { className="w-full h-screen overflow-hidden relative flex items-center justify-center" style={{ background: - "linear-gradient(to bottom, #B1E8FF 0%, #84cefe 50%, #215172 100%)", + "linear-gradient(to bottom, #1a0033 0%, #2d1b4e 50%, #0a001a 100%)", }} > - {/* Animated Beach Ball */} - - Beach Ball Loading - - - {/* Floating Starfish */} - - Floating Starfish - - - {/* Swimming Fish */} - - Swimming Fish - - - {/* Dancing Crab */} - - Dancing Crab - - - {/* Floating Surfboard */} - - Floating Surfboard - - {/* Loading Text */} {

@@ -191,38 +50,6 @@ const FullScreenLoading: React.FC = () => { ))}

- - {/* Animated Waves at Bottom */} -
- - -
); }; diff --git a/src/components/Hero/index.tsx b/src/components/Hero/index.tsx index 08dd4f54..73ca1eac 100644 --- a/src/components/Hero/index.tsx +++ b/src/components/Hero/index.tsx @@ -1,14 +1,8 @@ "use client"; -import React, { - useCallback, - useEffect, - useMemo, - useState, - useRef, -} from "react"; -import { motion, useAnimation } from "framer-motion"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import Image from "next/image"; +import { motion, useAnimation } from "framer-motion"; import { useRouter } from "next/navigation"; import { useActiveHackathonForStatic } from "@/lib/api/hackathon/hook"; import { useFirebase } from "@/lib/providers/FirebaseProvider"; @@ -34,106 +28,15 @@ const Hero = () => { const [bannerMessage, setBannerMessage] = useState(""); const [targetDate, setTargetDate] = useState(new Date()); const [state, setState] = useState(-1); // -1 = uninitialized, 0 = before hackathon, 1 = during hackathon, 2 = after hackathon - const [crabClicked, setCrabClicked] = useState(false); - const [crabArmy, setCrabArmy] = useState< - Array<{ - id: number; - x: number; - y: number; - delay: number; - endX: number; - endY: number; - direction: number; - }> - >([]); - const [showCrabArmy, setShowCrabArmy] = useState(false); const [showMemoryGame, setShowMemoryGame] = useState(false); - const [crabRaveAudio, setCrabRaveAudio] = useState( - null - ); - const [hackySpeech, setHackySpeech] = useState(""); const secondsControls = useAnimation(); - // Handle crab click to animate it up and away - const handleCrabClick = useCallback(() => { - if (!crabClicked) { - setCrabClicked(true); - } - }, [crabClicked]); - - // Handle HackPSU title click to spawn crab army - const handleTitleClick = useCallback(() => { - if (showCrabArmy) return; // Prevent multiple armies - - // Generate 15-25 random crabs - const numCrabs = Math.floor(Math.random() * 11) + 45; - const newCrabs = Array.from({ length: numCrabs }, (_, i) => ({ - id: i, - x: Math.random() * 100, // Random x position (0-100%) - y: Math.random() * 100, // Random y position (0-100%) - delay: Math.random() * 2, // Random animation delay (0-2s) - // Random walking path endpoints - endX: Math.random() * 100, - endY: Math.random() * 100, - // Random walking direction (for facing left/right) - direction: Math.random() > 0.5 ? 1 : -1, - })); - - setCrabArmy(newCrabs); - setShowCrabArmy(true); - - // Play crab rave audio - if (crabRaveAudio) { - crabRaveAudio.currentTime = 0; - crabRaveAudio.play().catch(console.error); - } - - // Hide crabs and stop audio after 15 seconds - setTimeout(() => { - setShowCrabArmy(false); - setCrabArmy([]); - if (crabRaveAudio) { - crabRaveAudio.pause(); - crabRaveAudio.currentTime = 0; - } - }, 15000); - }, [showCrabArmy, crabRaveAudio]); - // Handle starfish click to show memory game const handleStarfishClick = useCallback(() => { setShowMemoryGame(true); }, []); - // Handle Chill Hacky click to show random quote - const handleChillHackyClick = useCallback(() => { - // Random HackPSU messages - const speechMessages = [ - "I'm so excited for HackPSU!", - "Hope to see you at HackPSU!", - "Have you registered for HackPSU yet?", - "I can't wait for HackPSU!", - "What are you most excited for at HackPSU?", - "Have you checked out the schedule for HackPSU?", - "Don't forget to register for HackPSU!", - "Have you joined the HackPSU Discord?", - "Have you seen the HackPSU sponsors?", - "Have you applied to be an organizer for HackPSU?", - "Ready to dive into 24 hours of coding?", - "The beach vibes are perfect for hacking!", - "Let's make some waves at HackPSU!", - "Time to surf the code waves! 🏄‍♂️", - "Beach + Code = Perfect hackathon!", - ]; - - const message = - speechMessages[Math.floor(Math.random() * speechMessages.length)]; - setHackySpeech(message); - - // Clear speech after 4 seconds - setTimeout(() => setHackySpeech(""), 4000); - }, []); - // This function initializes the timer fields based on hackathon data. const initializeFields = useCallback((data: any) => { let initialDate = new Date(data.startTime); @@ -224,19 +127,6 @@ const Hero = () => { return () => clearInterval(interval); }, [updateCountdown]); - // Initialize crab rave audio - useEffect(() => { - const audio = new Audio("/f25/crab_rave.mp3"); - audio.loop = true; - audio.volume = 0.7; - setCrabRaveAudio(audio); - - return () => { - audio.pause(); - audio.src = ""; - }; - }, []); - // Console easter egg - show on component mount useEffect(() => { const showConsoleMessage = () => { @@ -345,268 +235,48 @@ Happy hacking!
- {/* Decorative elements - kept at normal size */} - {/* Animated Starfish Elements */} + {/* Billboard Image - Left Side */} Starfish + {/* Drone Image - Right Side, Full Height Oscillation */} Starfish - Click for Memory Game! - {/* Chill Hacky Character */} - - Chill Hacky - Click for a quote! - - {/* Speech Bubble */} - {hackySpeech && ( - -
-

- {hackySpeech} -

- {/* Speech bubble tail */} -
-
-
-
- )} -
- - {/* Rotating Beach Ball */} - - Beach Ball - - - {/* Additional Decorative Images */} - {/* Starfish */} - - Starfish - - - {/* Orange Starfish */} - - Orange Starfish - - - {/* Crab */} - - Number 5 - - - {/* Sand */} - - Sand - - {/* Container for scaled content (title and countdown only) */}
@@ -651,7 +322,7 @@ Happy hacking! {/* Countdown Numbers */}
{/* Days */}
@@ -659,7 +330,7 @@ Happy hacking! className="font-bold" style={{ fontSize: "clamp(24px, 6vw, 80px)", - color: "#000080", + color: "#ffffff", }} initial={{ scaleY: 0 }} animate={{ scaleY: 1 }} @@ -670,8 +341,8 @@ Happy hacking! className="font-semibold" style={{ fontSize: "clamp(10px, 1.5vw, 18px)", - color: "#000080", - fontFamily: "Monomaniac One, monospace", + color: "#ffffff", + fontFamily: "Orbitron, monospace", }} > {days === 1 ? "Day" : "Days"} @@ -683,7 +354,7 @@ Happy hacking! className="font-bold mb-[2vw]" style={{ fontSize: "clamp(24px, 6vw, 80px)", - color: "#000080", + color: "#ffffff", }} > : @@ -695,7 +366,7 @@ Happy hacking! className="font-bold" style={{ fontSize: "clamp(24px, 6vw, 80px)", - color: "#000080", + color: "#ffffffff", }} initial={{ scaleY: 0 }} animate={{ scaleY: 1 }} @@ -706,8 +377,8 @@ Happy hacking! className="font-semibold" style={{ fontSize: "clamp(10px, 1.5vw, 18px)", - color: "#000080", - fontFamily: "Monomaniac One, monospace", + color: "#ffffffff", + fontFamily: "Orbitron, monospace", }} > {hours === 1 ? "Hour" : "Hours"} @@ -719,7 +390,7 @@ Happy hacking! className="font-bold mb-[2vw]" style={{ fontSize: "clamp(24px, 6vw, 80px)", - color: "#000080", + color: "#ffffffff", }} > : @@ -731,7 +402,7 @@ Happy hacking! className="font-bold" style={{ fontSize: "clamp(24px, 6vw, 80px)", - color: "#000080", + color: "#ffffff", }} initial={{ scaleY: 0 }} animate={{ scaleY: 1 }} @@ -742,8 +413,8 @@ Happy hacking! className="font-semibold" style={{ fontSize: "clamp(10px, 1.5vw, 18px)", - color: "#000080", - fontFamily: "Monomaniac One, monospace", + color: "#ffffff", + fontFamily: "Orbitron, monospace", }} > {minutes === 1 ? "Minute" : "Minutes"} @@ -755,7 +426,7 @@ Happy hacking! className="font-bold mb-[2vw]" style={{ fontSize: "clamp(24px, 6vw, 80px)", - color: "#000080", + color: "#ffffff", }} > : @@ -767,7 +438,7 @@ Happy hacking! className="font-bold" style={{ fontSize: "clamp(24px, 6vw, 80px)", - color: "#000080", + color: "#ffffff", }} animate={secondsControls} initial={{ scaleY: 1 }} @@ -778,8 +449,8 @@ Happy hacking! className="font-semibold" style={{ fontSize: "clamp(10px, 1.5vw, 18px)", - color: "#000080", - fontFamily: "Monomaniac One, monospace", + color: "#ffffff", + fontFamily: "Orbitron, monospace", }} > {seconds === 1 ? "Second" : "Seconds"} @@ -793,8 +464,8 @@ Happy hacking! className="text-center font-bold mb-[1.5vw]" style={{ fontSize: "clamp(14px, 2.5vw, 32px)", - color: "#000080", - fontFamily: "Monomaniac One, monospace", + color: "#ffffff", + fontFamily: "Orbitron, monospace", }} > {bannerMessage} @@ -806,8 +477,8 @@ Happy hacking! className="text-center font-semibold" style={{ fontSize: "clamp(16px, 3vw, 24px)", - color: "#000080", - fontFamily: "Monomaniac One, monospace", + color: "#ffffff", + fontFamily: "Orbitron, monospace", }} initial={{ opacity: 0, y: -30 }} animate={{ opacity: 1, y: 0 }} @@ -823,8 +494,8 @@ Happy hacking! className="text-center font-bold mb-[2vw] relative z-10" style={{ fontSize: "clamp(14px, 2.5vw, 32px)", - color: "#000080", - fontFamily: "Monomaniac One, monospace", + color: "#ffffff", + fontFamily: "Orbitron, monospace", }} > {bannerMessage} @@ -835,7 +506,7 @@ Happy hacking! {/* Register & Discord Buttons - kept at original size */} Register Now Register now @@ -874,16 +544,16 @@ Happy hacking! {/* Discord Button */} window.open("http://discord.hackpsu.org", "_blank")} - className="relative overflow-hidden rounded-full hover:scale-105 transition-transform duration-300 flex items-center justify-center mt-[-60px] md:mt-0" + className="relative overflow-hidden rounded-full hover:scale-105 transition-transform duration-300 flex items-center justify-center" style={{ width: "clamp(400px, 50vw, 700px)", - height: "clamp(160px, 20vw, 280px)", + height: "clamp(80px, 20vw, 280px)", }} whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} > Join Discord
@@ -924,59 +593,6 @@ Happy hacking! - {/* Crab Army Easter Egg */} - {showCrabArmy && - crabArmy.map((crab) => ( - - Crab Army - - ))} - {/* Memory Game Modal */} { const [order, setOrder] = useState(SECTIONS); + const [graffittiKey, setGraffittiKey] = useState(0); + const graffittiRef = useRef(null); const { data: statsSectionFlag } = useFlagState("StatsSectionEnabled"); - // Easter egg; spinning the floaties - const [clicked1, setClicked1] = useState(false); - const [clicked2, setClicked2] = useState(false); - const [clicked3, setClicked3] = useState(false); + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + setGraffittiKey((prev) => prev + 1); + } + }); + }, + { threshold: 0.1 } + ); + + if (graffittiRef.current) { + observer.observe(graffittiRef.current); + } + + return () => { + if (graffittiRef.current) { + observer.unobserve(graffittiRef.current); + } + }; + }, []); function rotateLeft(steps: number) { setOrder((prev) => { @@ -70,242 +94,15 @@ const InfoSections: React.FC = () => { return (
- {/* Animated Float Elements */} - { - setClicked1(true); - setTimeout(() => setClicked1(false), 1000); - }} - > - Duck Float - - - { - setClicked2(true); - setTimeout(() => setClicked2(false), 1000); - }} - > - Donut Float - - - { - setClicked3(true); - setTimeout(() => setClicked3(false), 1000); - }} - > - Flamingo Float - - {/* Header */}
{ className="text-center" >

Info

-
+ {/* Graffiti Image - Bottom Right (Desktop Only) */} +
+ Graffiti +
+ + {/* Cyber Hacky Image - Bottom Left (Desktop Only) with Oscillation */} + + Cyber Hacky + + {/* Main Content Container */} -
+
{/* Hexagon Section + Info Panel */} -
+
{/* Hexagon Container */} { {/* Info Panel */}

{order[0].label}

{order[0].content}

@@ -401,7 +245,7 @@ const InfoSections: React.FC = () => { style={{ fontSize: "clamp(24px, 5vw, 48px)", color: colors[i % colors.length], - fontFamily: "Monomaniac One, monospace", + fontFamily: "Orbitron, monospace", }} > {s.value} @@ -484,23 +328,29 @@ function Hex({ section, slot, containerRotation, onClick }: HexProps) { duration: 0.8, }} > - + = ({ isOpen, onClose }) => {

Memory Match

diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 61783218..1559f9bc 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -23,8 +23,14 @@ const NavItem: React.FC = ({ }) => { const content = ( @@ -65,8 +71,14 @@ const MobileNavItem: React.FC = ({ }) => { const content = ( @@ -192,7 +204,12 @@ const Navbar: React.FC = () => { <> {/* Main Navbar */} { whileTap={{ scale: 0.95 }} > HackPSU Logo { {/* Menu Content */} { {/* Close instruction */} = ({ images, variant = "default", }) => { - const isPhotosPage = variant === "photos"; + // Split images into two rows: first 12 for row 1, next 12 for row 2 + const firstRow = images.slice(0, 12); + const secondRow = images.slice(12, 24); return ( -
{/* Header */}

Gallery

-
+
- - {images.map((src, idx) => ( - -
- {`Event -
-
+ + {/* First Row */} + + {firstRow.map((src, idx) => ( +
+ {`Event +
))} - +
- {/* - Responsive scaling: more subtle on mobile, more dramatic on desktop - */} - -
+ {/* Second Row */} + + {secondRow.map((src, idx) => ( +
+ {`Event +
+ ))} +
+
); }; diff --git a/src/components/PrizesChallenges/index.tsx b/src/components/PrizesChallenges/index.tsx index 7e587fa8..73a3929e 100644 --- a/src/components/PrizesChallenges/index.tsx +++ b/src/components/PrizesChallenges/index.tsx @@ -1,13 +1,28 @@ -import React from "react"; +import React, { useState, useEffect } from "react"; import Image from "next/image"; import Divider from "../common/Divider"; import { useFlagState } from "../../lib/api/flag/hook"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogClose, +} from "../ui/dialog"; interface Prize { place: string; amount: string; } +interface AwardData { + id: number; + title: string; + description: string; + prizes?: Prize[]; + extra?: string; +} + interface AwardBoxProps { title: string; description: string; @@ -23,7 +38,7 @@ const AwardBox: React.FC = ({ }) => { return (
-
+

{title}

@@ -59,80 +74,277 @@ const AwardBox: React.FC = ({ ); }; +const PrizeButton: React.FC<{ + award: AwardData; + onClick: (award: AwardData) => void; + style?: React.CSSProperties; + width?: string; + height?: string; + isModalOpen?: boolean; + selectedAwardId?: number; +}> = ({ + award, + onClick, + style, + width = "6rem", + height = "6rem", + isModalOpen = false, + selectedAwardId, +}) => { + const [isHovered, setIsHovered] = useState(false); + const isAwardSelected = selectedAwardId === award.id; + const showOpen = isHovered || (isModalOpen && isAwardSelected); + + return ( + + ); +}; + +const TerminalModal: React.FC<{ + award: AwardData | null; + isOpen: boolean; + onClose: () => void; +}> = ({ award, isOpen, onClose }) => { + if (!award) return null; + + return ( + + + +
+ + > {award.title.toUpperCase()} + + + + +
+
+ +
+ {award.description && ( +
+ > Description: +

{award.description}

+
+ )} + + {award.prizes && award.prizes.length > 0 && ( +
+ > Prize Breakdown: +
+ {award.prizes.map((prize, index) => ( +
+ {prize.place}: + {prize.amount} +
+ ))} +
+
+ )} + + {award.extra && ( +
+ > Additional Info: +

{award.extra}

+
+ )} + +
+ > _ +
+
+
+
+ ); +}; + const PrizesChallenges: React.FC = () => { const { data: prizesAndChallengesFlag } = useFlagState("PrizesEnabled"); + const [selectedAward, setSelectedAward] = useState(null); + const [isModalOpen, setIsModalOpen] = useState(false); + const [isMobile, setIsMobile] = useState(false); + + useEffect(() => { + // Check initial screen size + const checkMobile = () => { + setIsMobile(window.innerWidth < 768); + }; + + checkMobile(); + + // Add resize listener + window.addEventListener("resize", checkMobile); + return () => window.removeEventListener("resize", checkMobile); + }, []); + + // Configurable button sizes + const mobileButtonWidth = "6.5rem"; + const mobileButtonHeight = "6.5rem"; + const desktopButtonWidth = "12rem"; + const desktopButtonHeight = "12rem"; + + const awards: AwardData[] = [ + { + id: 1, + title: "HackPSU Grand Prize", + description: + "The standard HackPSU experience: work together alone or in a team to build something awesome! All monetary prizes will be split among the winning team members equally.", + prizes: [ + { place: "1st Place", amount: "$500 in cash" }, + { place: "2nd Place", amount: "$300 in cash" }, + { place: "3rd Place", amount: "$100 in cash" }, + ], + }, + { + id: 2, + title: "Best UX/UI Design", + description: + "Create a project where the user interface is accessible, functional, and intuitive. Information can be perceived in multiple ways, such as adjustable color contrast, font size, or captions. Navigation is operable and user-friendly. Content is understandable and robust across devices and assistive technologies.", + prizes: [ + { + place: "Prize", + amount: "Peraton swag bag and Beats Headphones for each team member", + }, + ], + }, + { + id: 3, + title: "Nittany AI Challenge", + description: + "Use the power of AI to address real-world problems in: Health, Humanitarianism, Education, Environment, and Agriculture.", + prizes: [ + { + place: "1st Place", + amount: "$99 Amazon Gift Card per team member (up to 5)", + }, + { + place: "2nd Place", + amount: "$50 Amazon Gift Card per team member (up to 5)", + }, + { + place: "3rd Place", + amount: "$25 Amazon Gift Card per team member (up to 5)", + }, + ], + extra: "Total prize pool: $870 in cash", + }, + ]; + + const handleAwardClick = (award: AwardData) => { + setSelectedAward(award); + setIsModalOpen(true); + }; return (
-
+

Prizes & Challenges

-
- - {/* {prizesAndChallengesFlag?.isEnabled ? ( */} +
+
+
{prizesAndChallengesFlag?.isEnabled ? ( -
- - - +
+ {/* Diagonal Button Container */} + {awards.map((award, index) => { + // Desktop alignment values + const desktopBaseLeft = index * 12; + const desktopBaseTop = index * 35; + const desktopHorizontalOffset = 39; + + // Mobile alignment values - adjust these as needed + const mobileBaseLeft = index * 30; + const mobileBaseTop = index * 27; + const mobileHorizontalOffset = 15; + + // Select values based on screen size + const baseLeft = isMobile ? mobileBaseLeft : desktopBaseLeft; + const baseTop = isMobile ? mobileBaseTop : desktopBaseTop; + const horizontalOffset = isMobile + ? mobileHorizontalOffset + : desktopHorizontalOffset; + const buttonWidth = isMobile + ? mobileButtonWidth + : desktopButtonWidth; + const buttonHeight = isMobile + ? mobileButtonHeight + : desktopButtonHeight; + + return ( + + ); + })}
) : ( -
+
{/* Small Coming Soon Message */} -
+

Coming Soon!

@@ -141,62 +353,15 @@ const PrizesChallenges: React.FC = () => {

- - {/* Placeholder Cards - Hidden on mobile */} -
- {/* Card 1 - Click Side */} -
- Challenge Card Placeholder -
- - {/* Card 2 - Write Side */} -
- Challenge Card Placeholder -
- - {/* Card 3 - Click Side */} -
- Challenge Card Placeholder -
- - {/* Card 4 - Write Side */} -
- Challenge Card Placeholder -
- - {/* Card 5 - Click Side */} -
- Challenge Card Placeholder -
-
)}
+ + setIsModalOpen(false)} + />
); }; diff --git a/src/components/Schedule/index.tsx b/src/components/Schedule/index.tsx index 1baf5af2..73954265 100644 --- a/src/components/Schedule/index.tsx +++ b/src/components/Schedule/index.tsx @@ -12,6 +12,7 @@ import Image from "next/image"; import { useAllEvents } from "@/lib/api/event/hook"; import { EventEntityResponse, EventType } from "@/lib/api/event/entity"; import { useFlagState } from "@/lib/api/flag/hook"; +import { useAllHackathons } from "@/lib/api/hackathon/hook"; // Event type color mapping with jellyfish assets const eventTypeColors = { @@ -20,28 +21,28 @@ const eventTypeColors = { border: "border-[#f5b90c]", text: "text-[#DC2626]", label: "Activity", - jellyfishAsset: "/f25/9.png", + jellyfishAsset: "/sp26/activities2.png", }, [EventType.food]: { bg: "bg-[#2b98a1]", border: "border-[#2b98a1]", text: "text-[#16A34A]", label: "General", - jellyfishAsset: "/f25/10.png", + jellyfishAsset: "/sp26/general2.png", }, [EventType.workshop]: { bg: "bg-[#88d960]", border: "border-[#88d960]", text: "text-[#D97706]", label: "Workshop", - jellyfishAsset: "/f25/11.png", + jellyfishAsset: "/sp26/workshops2.png", }, [EventType.checkIn]: { bg: "bg-[#e295fd]", border: "border-[#e295fd]", text: "text-[#4338CA]", label: "Check-in", - jellyfishAsset: "/f25/12.png", + jellyfishAsset: "/sp26/checkin2.png", }, }; @@ -108,13 +109,13 @@ const EventDetailsModal: React.FC = ({

{event.name}

{colors.label} @@ -275,7 +276,6 @@ const EventItem: React.FC = ({ left: leftOffset, width: `calc(${columnWidth} - 8px)`, // More margin between columns height: `${height}px`, - fontFamily: "Monomaniac One, monospace", marginLeft: "4px", marginRight: "4px", }} @@ -432,7 +432,7 @@ const DayColumn: React.FC = ({ >
{hour === 0 ? "12 AM" @@ -594,7 +594,7 @@ const PreHackathonList: React.FC<{ ${isMobile ? "w-full mb-4 rounded-3xl" : "w-64 mr-6 min-w-[220px] max-h-[600px] overflow-y-auto"} `} style={{ - fontFamily: "Monomaniac One, monospace", + fontFamily: "Orbitron, monospace", }} >
@@ -668,8 +668,41 @@ const PreHackathonList: React.FC<{ }; const Schedule: React.FC = () => { - const { data: events, isLoading, error } = useAllEvents(); + // Feature flag checks const { data: twoHourFlag } = useFlagState("TwoHourIncrement"); + const { data: sampleScheduleFlag } = useFlagState("SampleSchedule"); + + // Fetch all hackathons to find the previous one when sample schedule flag is enabled + const { data: allHackathons, isLoading: isLoadingHackathons } = + useAllHackathons(); + + // Find the previous hackathon (most recent inactive hackathon) + const previousHackathonId = useMemo(() => { + if (!sampleScheduleFlag?.isEnabled || !allHackathons) return undefined; + + // Filter out active hackathons and sort by endTime descending + const inactiveHackathons = allHackathons + .filter((h) => !h.active) + .sort((a, b) => b.endTime - a.endTime); + + // Return the most recent inactive hackathon ID + return inactiveHackathons.length > 0 ? inactiveHackathons[0].id : undefined; + }, [sampleScheduleFlag?.isEnabled, allHackathons]); + + // Fetch previous hackathon events when the flag is enabled, otherwise current + const { + data: fetchedEvents, + isLoading: isLoadingEvents, + error, + } = useAllEvents( + sampleScheduleFlag?.isEnabled ? previousHackathonId : undefined + ); + + // Use fetched events directly; default to empty array while loading + const events = fetchedEvents ?? []; + + // Combine loading states: loading if either hackathons or events are loading + const isLoading = isLoadingHackathons || isLoadingEvents; // Ref for tracking scroll position of schedule section const scheduleRef = useRef(null); @@ -682,7 +715,6 @@ const Schedule: React.FC = () => { // pick the real scrollYProgress only after mount const scrollYProgress = tempScroll.scrollYProgress; - const surfboardX = useTransform(scrollYProgress, [0, 1], ["0vw", "70vw"]); // Mobile detection const [isMobile, setIsMobile] = useState(false); @@ -993,7 +1025,7 @@ const Schedule: React.FC = () => { > @@ -1011,7 +1043,7 @@ const Schedule: React.FC = () => { >

Error loading schedule.

@@ -1023,32 +1055,15 @@ const Schedule: React.FC = () => {
- {/* Animated Surfboard - Scroll-linked */} - - Surfboard - - {/* Header */} { transition={{ duration: 0.8 }} >

Schedule

@@ -1081,7 +1102,7 @@ const Schedule: React.FC = () => { ? `${colors.bg} ${colors.border} text-white` : "bg-white/80 border-gray-300 text-gray-700 hover:bg-gray-100" }`} - style={{ fontFamily: "Monomaniac One, monospace" }} + style={{ fontFamily: "Orbitron, monospace" }} initial={{ opacity: 0, scale: 0.8 }} animate={{ opacity: 1, scale: 1 }} transition={{ duration: 0.4, delay: index * 0.1 }} @@ -1095,7 +1116,7 @@ const Schedule: React.FC = () => {
) : ( /* Desktop: Jellyfish Buttons */ -
+
{Object.entries(eventTypeColors).map(([type, colors], index) => { const eventType = type as EventType; const isSelected = selectedCategories.has(eventType); @@ -1135,7 +1156,7 @@ const Schedule: React.FC = () => { : "text-gray-600 bg-white/70" }`} style={{ - fontFamily: "Monomaniac One, monospace", + fontFamily: "Orbitron, monospace", fontSize: "clamp(12px, 2vw, 16px)", }} > @@ -1151,8 +1172,8 @@ const Schedule: React.FC = () => { {/* Show selected count */}
{selectedCategories.size === Object.keys(EventType).length ? "Showing all categories" @@ -1170,7 +1191,7 @@ const Schedule: React.FC = () => { ? "bg-[#215172] border-[#215172] text-white" : "bg-white/80 border-[#215172] text-[#215172] hover:bg-white" }`} - style={{ fontFamily: "Monomaniac One, monospace" }} + style={{ fontFamily: "Orbitron, monospace" }} whileHover={{ scale: 1.05 }} whileTap={{ scale: 0.95 }} > @@ -1239,7 +1260,7 @@ const Schedule: React.FC = () => { ? "bg-[#215172] text-white" : "bg-[#1a3f5c] text-white/70 hover:text-white hover:bg-[#215172]/80" }`} - style={{ fontFamily: "Monomaniac One, monospace" }} + style={{ fontFamily: "Orbitron, monospace" }} whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} initial={{ opacity: 0, y: -20 }} @@ -1303,10 +1324,10 @@ const Schedule: React.FC = () => {
{/* Download .ics Button */} -
+