diff --git a/app/(with-layout)/event/schedule/page.tsx b/app/(with-layout)/event/schedule/page.tsx index 10624bf7..509c4d49 100644 --- a/app/(with-layout)/event/schedule/page.tsx +++ b/app/(with-layout)/event/schedule/page.tsx @@ -4,12 +4,7 @@ import NavBar from "@/components/nav-bar/nav-bar"; import "@/app/globals.css"; import { useState, useEffect } from "react"; import type { Event } from "@/data/schedule"; -import { - saturdayTimes, - sundayTimes, - SATURDAY_START, - SUNDAY_START -} from "@/data/schedule"; +import { saturdayTimes, sundayTimes, SATURDAY_START, SUNDAY_START } from "@/data/schedule"; import Schedule from "@/components/schedule/schedule"; import HackRPILink from "@/components/themed-components/hackrpi-link"; @@ -24,9 +19,9 @@ type RawEvent = { eventType: "workshop" | "constant" | "important" | "food" | "deadline"; visible: boolean; column: number; - width: number; // Added width for multi-column spanning + width: number; // Added width for multi-column spanning startMinutesFromDayStart: number; // minutes offset - durationMinutes: number; // length + durationMinutes: number; // length }; export default function Page() { @@ -54,7 +49,7 @@ export default function Page() { eventType: ev.eventType ?? "general", visible: ev.visible, column: ev.column, - width: ev.width // New property to handle multi-column span + width: ev.width, // New property to handle multi-column span }; }); @@ -73,7 +68,7 @@ export default function Page() { eventType: ev.eventType ?? "general", visible: ev.visible, column: ev.column, - width: ev.width // New property to handle multi-column span + width: ev.width, // New property to handle multi-column span }; }); @@ -102,7 +97,10 @@ export default function Page() { return (
-
+
{/*

{modalEvent.title}

diff --git a/components/about-us.tsx b/components/about-us.tsx index af57ebed..a410a5df 100644 --- a/components/about-us.tsx +++ b/components/about-us.tsx @@ -58,58 +58,6 @@ export default function AboutUs() {
-
-
-
- {/* Registration Banner */} -
- REGISTER NOW! -
- {/* Event Info Box */} -
-
- -

- When & Where{" "} - - - -

- -
-
-

- November 15-16, 2025 -

-

- Rensselaer Polytechnic Institute -

-

- Darrin Communications Center -

-
-
-
-
-
-
); } diff --git a/components/faq/faq.tsx b/components/faq/faq.tsx index 0f0aca5e..b82a885d 100644 --- a/components/faq/faq.tsx +++ b/components/faq/faq.tsx @@ -1,102 +1,14 @@ import React, { useState } from "react"; import "../../app/globals.css"; import RegistrationButton from "@/components/themed-components/registration-link"; +import faqs from "@/data/faqData"; type FAQ = { title: string; content: React.ReactNode; }; -const faqs: FAQ[] = [ - { - title: "What is HackRPI?", - content: - "Teams of 1-4 have 24 hours to build a project relating to our theme Retro V. Modern. Teams will then present their projects, and the best projects win prizes!", - }, - { - title: "When is HackRPI?", - content: - "HackRPI takes place on November 15th and 16th, 2025. Arrival and check-in takes place from 9-10 AM. Our opening ceremony starts at 10 AM, and hacking begins at 11am. Your projects must be on Devpost by 10 AM Sunday, and all coding must stop at 11 AM Sunday. Teams will present, and the event will end around 4PM on Sunday. We are excited to see you there!", - }, - { - title: "Where is HackRPI?", - content: - "HackRPI takes place at Rensselaer Polytechnic Institute, in the Darrin Communication Center. Darrin Communications Center, 51 College Ave, Troy, NY 12180. See our event information page for more details.", - }, - { - title: "Is HackRPI free to attend?", - content: "Yes! Thanks to our many wonderful sponsors, all food and swag are completely free for participants!", - }, - { - title: "How do I register?", - content: ( -
-

You can click here to register with Major League Hacking (MLH).

- {/* This is a custom button component will update later */} -
- ), - }, - { - title: "Who can participate?", - content: - "Everyone is welcome to participate, whether you are a hackathon veteran or this is your first hackathon, this is a great opportunity to learn, experiment with new technologies, and grow your skills. Our team of experienced mentors is here to help you in every step of the way.", - }, - { - title: "I'm under 18, can I still participate?", - content: - "Students under 18 are welcome to attend, but are not allowed to stay overnight in the sleep rooms. Students under the age of 17 must have an adult (21+) chaperone with them at all times during the event.", - }, - { - title: "Do I have to be an RPI student?", - content: - "No! HackRPI is open to everyone, students of all experience levels from all colleges and universities are welcome to attend. Did you know that students from over 45 other colleges attended HackRPI!", - }, - { - title: "Does HackRPI provide travel reimbursement?", - content: ( -

- Unfortunately, we are unable to provide travel reimbursement at this time, however, we have sleep rooms on - campus for students 18 and older, and we are more than happy to recommend local accommodations if you email us - at{" "} - - hackrpi@rpi.edu - - . -

- ), - }, - { - title: "What should I bring?", - content: "Bring your team, your laptop, chargers, any hardware you need, and a good night's sleep!", - }, - { - title: "What is the theme?", - //TODO: Change the description - content: - "The theme for 2025's HackRPI is Retro vs Modern. In a world where nostalgia meets innovation, our 12th annual hackathon, Retro vs Modern, invites creators to explore the contrasts and possibilities between the past and the future. Join us in shaping the future through a creative lens that honors the old while embracing the new.", - }, - { - title: "Is it okay if I am late to the event?", - content: - "Yes! You can arrive at any time during the event, but we recommend arriving before 11 AM on Saturday. Remember, the later you are, the less time you have to work on your project!", - }, - { - title: "When are submissions due?", - content: - "All projects must be submitted to Devpost by 10 AM on Sunday. You will be able to modify your submission until 11am. After 11an, no coding or changes to your project are allowed.", - }, - { - title: "How do I submit my project?", - content: - // eslint-disable-next-line - 'You will submit your project on Devpost. See our "Event Information" and "Resources" pages for more details.', - }, - { - title: "When and how will prizes be awarded?", - content: - "Prizes are announced at the closing ceremony, which will take place around 4 PM on Sunday. Physical prizes will be distributed during the closing ceremony. Winners of cash prizes will be contacted by our team after the event. ", - }, -]; + const FAQPage = () => { const [expandedIndex, setExpandedIndex] = useState(null); @@ -107,10 +19,52 @@ const FAQPage = () => { return (
+
+
+ {/* Registration Banner */} +
+ REGISTER NOW! +
+ {/* Event Info Box */} +
+
+ +

+ When & Where{" "} + + + +

+ +
+
+

+ November 15-16, 2025 +

+

+ Rensselaer Polytechnic Institute +

+

+ Darrin Communications Center +

+
+
+
+
+

FAQs

@@ -167,4 +121,4 @@ const FAQPage = () => { ); }; -export default FAQPage; +export default FAQPage; \ No newline at end of file diff --git a/components/nav-bar/nav-bar.tsx b/components/nav-bar/nav-bar.tsx index ecae7ccc..23f0d452 100644 --- a/components/nav-bar/nav-bar.tsx +++ b/components/nav-bar/nav-bar.tsx @@ -94,9 +94,9 @@ export default function NavBar({ showOnScroll }: { showOnScroll: boolean }) { ); return ( -
- - -
+
+ + +
); } diff --git a/components/schedule/schedule.tsx b/components/schedule/schedule.tsx index b421f647..cb253611 100644 --- a/components/schedule/schedule.tsx +++ b/components/schedule/schedule.tsx @@ -2,125 +2,130 @@ import { useState } from "react"; import type { Event } from "@/data/schedule"; export default function Schedule(props: { - events: Event[]; - times: { str: string; unix: number }[]; - currentTime: Date; - onEventClick: (event: Event) => void; + events: Event[]; + times: { str: string; unix: number }[]; + currentTime: Date; + onEventClick: (event: Event) => void; }) { - // Group events by their column (1-4) - const eventsByColumn = [[], [], [], []]; // 4 columns - props.events.forEach((event) => { - if (event.column) { - eventsByColumn[event.column - 1].push(event); // 0-indexed array for columns - } - }); + // Group events by their column (1-4) + const eventsByColumn = [[], [], [], []]; // 4 columns + props.events.forEach((event) => { + if (event.column) { + eventsByColumn[event.column - 1].push(event); // 0-indexed array for columns + } + }); - return ( -
- {/* Time Labels */} -
- {props.times.map((time) => ( - - ))} -
+ return ( +
+ {/* Time Labels */} +
+ {props.times.map((time) => ( + + ))} +
- {/* Column Containers */} -
- {eventsByColumn.map((columnEvents, columnIndex) => ( -
- {columnEvents.map((event) => { - const { top, height } = calculateTopAndHeightOfEvent(event, props.times); - let color = "bg-hackrpi-primary-blue text-black border-black"; + {/* Column Containers */} +
+ {eventsByColumn.map((columnEvents, columnIndex) => ( +
+ {columnEvents.map((event) => { + const { top, height } = calculateTopAndHeightOfEvent(event, props.times); + let color = "bg-hackrpi-primary-blue text-black border-black"; - const eventPassed = props.currentTime.getTime() > event.endTime; - const eventStarted = props.currentTime.getTime() > event.startTime; + const eventPassed = props.currentTime.getTime() > event.endTime; + const eventStarted = props.currentTime.getTime() > event.startTime; - if (event.eventType === "workshop") { - color = "bg-hackrpi-light-purple text-black border-black"; - } else if (event.eventType === "deadline") { - color = "bg-hackrpi-pink text-black border-black"; - } else if (event.eventType === "food") { - color = "bg-hackrpi-yellow text-black border-black"; - } else if (event.eventType === "important") { - color = "bg-hackrpi-dark-purple text-gray-300 border-gray-300"; - } else if (event.eventType === "constant") { - color = "bg-hackrpi-orange text-black border-black"; - } + if (event.eventType === "workshop") { + color = "bg-hackrpi-light-purple text-black border-black"; + } else if (event.eventType === "deadline") { + color = "bg-hackrpi-pink text-black border-black"; + } else if (event.eventType === "food") { + color = "bg-hackrpi-yellow text-black border-black"; + } else if (event.eventType === "important") { + color = "bg-hackrpi-dark-purple text-gray-300 border-gray-300"; + } else if (event.eventType === "constant") { + color = "bg-hackrpi-orange text-black border-black"; + } - if (eventStarted) { - color = "bg-hackrpi-secondary-yellow text-black border-black"; - } - if (eventPassed) { - color = "bg-hackrpi-secondary-light-blue text-gray-300 border-gray-300"; - } + if (eventStarted) { + color = "bg-hackrpi-secondary-yellow text-black border-black"; + } + if (eventPassed) { + color = "bg-hackrpi-secondary-light-blue text-gray-300 border-gray-300"; + } - return ( -
props.onEventClick(event)} - data-testid="event-card" - > -

{event.title}

-

- {event.location} {event.speaker != "" ? `• ${event.speaker}` : ""} -

-

{event.description}

-
- ); - })} -
- ))} -
-
- ); + return ( +
props.onEventClick(event)} + data-testid="event-card" + > +

{event.title}

+

+ {event.location} {event.speaker != "" ? `• ${event.speaker}` : ""} +

+

{event.description}

+
+ ); + })} +
+ ))} +
+
+ ); } function TimelineElement(props: { time: { str: string; unix: number }; currentTime: Date }) { - return ( -
-
-

props.time.unix && - props.currentTime.getTime() < props.time.unix + 60 * 60 * 1000 - ? "font-bold text-sm xs:text-base sm:text-lg" - : "font-normal text-xs xs:text-sm sm:text-base" - }`} - > - {props.time.str} -

-
-
-
-
-
- ); + return ( +
+
+

props.time.unix && + props.currentTime.getTime() < props.time.unix + 60 * 60 * 1000 + ? "font-bold text-sm xs:text-base sm:text-lg" + : "font-normal text-xs xs:text-sm sm:text-base" + }`} + > + {props.time.str} +

+
+
+
+
+
+ ); } -function calculateTopAndHeightOfEvent(event: Event, times: { str: string; unix: number }[]): { top: number; height: number } { - const HOUR_HEIGHT = 96; // 96px for each hour of height - let nearestStartTime = times[0]; - for (let i = 0; i < times.length; i++) { - if (times[i].unix <= event.startTime) { - nearestStartTime = times[i]; - } - } +function calculateTopAndHeightOfEvent( + event: Event, + times: { str: string; unix: number }[], +): { top: number; height: number } { + const HOUR_HEIGHT = 96; // 96px for each hour of height + let nearestStartTime = times[0]; + for (let i = 0; i < times.length; i++) { + if (times[i].unix <= event.startTime) { + nearestStartTime = times[i]; + } + } - const top = (document.getElementById(`${nearestStartTime.unix}`)?.offsetTop || 0) + ((event.startTime - nearestStartTime.unix) / 3600000) * HOUR_HEIGHT; - const height = ((event.endTime - event.startTime) / 3600000) * HOUR_HEIGHT - 4; + const top = + (document.getElementById(`${nearestStartTime.unix}`)?.offsetTop || 0) + + ((event.startTime - nearestStartTime.unix) / 3600000) * HOUR_HEIGHT; + const height = ((event.endTime - event.startTime) / 3600000) * HOUR_HEIGHT - 4; - return { top, height }; + return { top, height }; } diff --git a/data/faqData.tsx b/data/faqData.tsx new file mode 100644 index 00000000..af892534 --- /dev/null +++ b/data/faqData.tsx @@ -0,0 +1,97 @@ +import RegistrationButton from "@/components/themed-components/registration-link"; + +type FAQ = { + title: string; + content: React.ReactNode; +}; +const faqs: FAQ[] = [ + { + title: "What is HackRPI?", + content: + "Teams of 1-4 have 24 hours to build a project relating to our theme Retro V. Modern. Teams will then present their projects, and the best projects win prizes!", + }, + { + title: "When is HackRPI?", + content: + "HackRPI takes place on November 15th and 16th, 2025. Arrival and check-in takes place from 9-10 AM. Our opening ceremony starts at 10 AM, and hacking begins at 11am. Your projects must be on Devpost by 10 AM Sunday, and all coding must stop at 11 AM Sunday. Teams will present, and the event will end around 4PM on Sunday. We are excited to see you there!", + }, + { + title: "Where is HackRPI?", + content: + "HackRPI takes place at Rensselaer Polytechnic Institute, in the Darrin Communication Center. Darrin Communications Center, 51 College Ave, Troy, NY 12180. See our event information page for more details.", + }, + { + title: "Is HackRPI free to attend?", + content: "Yes! Thanks to our many wonderful sponsors, all food and swag are completely free for participants!", + }, + { + title: "How do I register?", + content: ( +
+

You can click here to register with Major League Hacking (MLH).

+ {/* This is a custom button component will update later */} +
+ ), + }, + { + title: "Who can participate?", + content: + "Everyone is welcome to participate, whether you are a hackathon veteran or this is your first hackathon, this is a great opportunity to learn, experiment with new technologies, and grow your skills. Our team of experienced mentors is here to help you in every step of the way.", + }, + { + title: "I'm under 18, can I still participate?", + content: + "Students under 18 are welcome to attend, but are not allowed to stay overnight in the sleep rooms. Students under the age of 17 must have an adult (21+) chaperone with them at all times during the event.", + }, + { + title: "Do I have to be an RPI student?", + content: + "No! HackRPI is open to everyone, students of all experience levels from all colleges and universities are welcome to attend. Did you know that students from over 45 other colleges attended HackRPI!", + }, + { + title: "Does HackRPI provide travel reimbursement?", + content: ( +

+ Unfortunately, we are unable to provide travel reimbursement at this time, however, we have sleep rooms on + campus for students 18 and older, and we are more than happy to recommend local accommodations if you email us + at{" "} + + hackrpi@rpi.edu + + . +

+ ), + }, + { + title: "What should I bring?", + content: "Bring your team, your laptop, chargers, any hardware you need, and a good night's sleep!", + }, + { + title: "What is the theme?", + //TODO: Change the description + content: + "The theme for 2025's HackRPI is Retro vs Modern. In a world where nostalgia meets innovation, our 12th annual hackathon, Retro vs Modern, invites creators to explore the contrasts and possibilities between the past and the future. Join us in shaping the future through a creative lens that honors the old while embracing the new.", + }, + { + title: "Is it okay if I am late to the event?", + content: + "Yes! You can arrive at any time during the event, but we recommend arriving before 11 AM on Saturday. Remember, the later you are, the less time you have to work on your project!", + }, + { + title: "When are submissions due?", + content: + "All projects must be submitted to Devpost by 10 AM on Sunday. You will be able to modify your submission until 11am. After 11an, no coding or changes to your project are allowed.", + }, + { + title: "How do I submit my project?", + content: + // eslint-disable-next-line + 'You will submit your project on Devpost. See our "Event Information" and "Resources" pages for more details.', + }, + { + title: "When and how will prizes be awarded?", + content: + "Prizes are announced at the closing ceremony, which will take place around 4 PM on Sunday. Physical prizes will be distributed during the closing ceremony. Winners of cash prizes will be contacted by our team after the event. ", + }, +]; +export default faqs \ No newline at end of file diff --git a/data/schedule.ts b/data/schedule.ts index ff4d2657..5e9c3331 100644 --- a/data/schedule.ts +++ b/data/schedule.ts @@ -5,13 +5,13 @@ export type Event = { title: string; description: string; startTime: number; // computed in page.tsx - endTime: number; // computed in page.tsx + endTime: number; // computed in page.tsx location: string; speaker: string; eventType: "workshop" | "constant" | "important" | "food" | "deadline"; visible: boolean; column?: number; // 1-4 - width: number; + width: number; }; // ───────────────────────────────────────────── @@ -32,44 +32,44 @@ export const SUNDAY_END = new Date("2025-11-16T20:00:00-05:00").getTime(); // timeline labels for Saturday (9 AM → 11 PM) export const saturdayTimes = [ - { str: "9:00 AM", unix: SATURDAY_START + 0 * 3600000 }, + { str: "9:00 AM", unix: SATURDAY_START + 0 * 3600000 }, { str: "10:00 AM", unix: SATURDAY_START + 1 * 3600000 }, { str: "11:00 AM", unix: SATURDAY_START + 2 * 3600000 }, { str: "12:00 PM", unix: SATURDAY_START + 3 * 3600000 }, - { str: "1:00 PM", unix: SATURDAY_START + 4 * 3600000 }, - { str: "2:00 PM", unix: SATURDAY_START + 5 * 3600000 }, - { str: "3:00 PM", unix: SATURDAY_START + 6 * 3600000 }, - { str: "4:00 PM", unix: SATURDAY_START + 7 * 3600000 }, - { str: "5:00 PM", unix: SATURDAY_START + 8 * 3600000 }, - { str: "6:00 PM", unix: SATURDAY_START + 9 * 3600000 }, - { str: "7:00 PM", unix: SATURDAY_START + 10 * 3600000 }, - { str: "8:00 PM", unix: SATURDAY_START + 11 * 3600000 }, - { str: "9:00 PM", unix: SATURDAY_START + 12 * 3600000 }, + { str: "1:00 PM", unix: SATURDAY_START + 4 * 3600000 }, + { str: "2:00 PM", unix: SATURDAY_START + 5 * 3600000 }, + { str: "3:00 PM", unix: SATURDAY_START + 6 * 3600000 }, + { str: "4:00 PM", unix: SATURDAY_START + 7 * 3600000 }, + { str: "5:00 PM", unix: SATURDAY_START + 8 * 3600000 }, + { str: "6:00 PM", unix: SATURDAY_START + 9 * 3600000 }, + { str: "7:00 PM", unix: SATURDAY_START + 10 * 3600000 }, + { str: "8:00 PM", unix: SATURDAY_START + 11 * 3600000 }, + { str: "9:00 PM", unix: SATURDAY_START + 12 * 3600000 }, { str: "10:00 PM", unix: SATURDAY_START + 13 * 3600000 }, - { str: "11:00 PM", unix: SATURDAY_START + 14 * 3600000 } + { str: "11:00 PM", unix: SATURDAY_START + 14 * 3600000 }, ]; // timeline labels for Sunday (12 AM → 8 PM) export const sundayTimes = [ { str: "12:00 AM", unix: SUNDAY_START + 0 * 3600000 }, - { str: "1:00 AM", unix: SUNDAY_START + 1 * 3600000 }, - { str: "2:00 AM", unix: SUNDAY_START + 2 * 3600000 }, - { str: "3:00 AM", unix: SUNDAY_START + 3 * 3600000 }, - { str: "4:00 AM", unix: SUNDAY_START + 4 * 3600000 }, - { str: "5:00 AM", unix: SUNDAY_START + 5 * 3600000 }, - { str: "6:00 AM", unix: SUNDAY_START + 6 * 3600000 }, - { str: "7:00 AM", unix: SUNDAY_START + 7 * 3600000 }, - { str: "8:00 AM", unix: SUNDAY_START + 8 * 3600000 }, - { str: "9:00 AM", unix: SUNDAY_START + 9 * 3600000 }, + { str: "1:00 AM", unix: SUNDAY_START + 1 * 3600000 }, + { str: "2:00 AM", unix: SUNDAY_START + 2 * 3600000 }, + { str: "3:00 AM", unix: SUNDAY_START + 3 * 3600000 }, + { str: "4:00 AM", unix: SUNDAY_START + 4 * 3600000 }, + { str: "5:00 AM", unix: SUNDAY_START + 5 * 3600000 }, + { str: "6:00 AM", unix: SUNDAY_START + 6 * 3600000 }, + { str: "7:00 AM", unix: SUNDAY_START + 7 * 3600000 }, + { str: "8:00 AM", unix: SUNDAY_START + 8 * 3600000 }, + { str: "9:00 AM", unix: SUNDAY_START + 9 * 3600000 }, { str: "10:00 AM", unix: SUNDAY_START + 10 * 3600000 }, { str: "11:00 AM", unix: SUNDAY_START + 11 * 3600000 }, { str: "12:00 PM", unix: SUNDAY_START + 12 * 3600000 }, - { str: "1:00 PM", unix: SUNDAY_START + 13 * 3600000 }, - { str: "2:00 PM", unix: SUNDAY_START + 14 * 3600000 }, - { str: "3:00 PM", unix: SUNDAY_START + 15 * 3600000 }, - { str: "4:00 PM", unix: SUNDAY_START + 16 * 3600000 }, - { str: "5:00 PM", unix: SUNDAY_START + 17 * 3600000 }, - { str: "6:00 PM", unix: SUNDAY_START + 18 * 3600000 }, - { str: "7:00 PM", unix: SUNDAY_START + 19 * 3600000 }, - { str: "8:00 PM", unix: SUNDAY_START + 20 * 3600000 } + { str: "1:00 PM", unix: SUNDAY_START + 13 * 3600000 }, + { str: "2:00 PM", unix: SUNDAY_START + 14 * 3600000 }, + { str: "3:00 PM", unix: SUNDAY_START + 15 * 3600000 }, + { str: "4:00 PM", unix: SUNDAY_START + 16 * 3600000 }, + { str: "5:00 PM", unix: SUNDAY_START + 17 * 3600000 }, + { str: "6:00 PM", unix: SUNDAY_START + 18 * 3600000 }, + { str: "7:00 PM", unix: SUNDAY_START + 19 * 3600000 }, + { str: "8:00 PM", unix: SUNDAY_START + 20 * 3600000 }, ]; diff --git a/data/scheduleData.json b/data/scheduleData.json index c0bb0991..cf1d503b 100644 --- a/data/scheduleData.json +++ b/data/scheduleData.json @@ -1,391 +1,390 @@ { - "saturdayEvents": [ - { - "id": "sat-0", - "title": "Participant Check-In", - "description": "", - "location": "DCC Lobby", - "speaker": "", - "eventType": "important", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 0, - "durationMinutes": 60 - }, - { - "id": "sat-1", - "title": "Opening Ceremony", - "description": "Join the HackRPI team to open the Hackathon to our Hackers, Sponsors, and Judges!", - "location": "DCC 308", - "speaker": "HackRPI Team", - "eventType": "important", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 60, - "durationMinutes": 60 - }, - { - "id": "sat-2", - "title": "Coding Starts!", - "description": "Ready! Set! Code! Start working on your projects!", - "location": "DCC 308", - "speaker": "", - "eventType": "important", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 120, - "durationMinutes": 60 - }, - { - "id": "sat-food1", - "title": "Lunch", - "description": "", - "location": "DCC Lounge", - "speaker": "", - "eventType": "food", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 180, - "durationMinutes": 60 - }, - { - "id": "sat-food2", - "title": "Dinner", - "description": "", - "location": "DCC Lounge", - "speaker": "", - "eventType": "food", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 600, - "durationMinutes": 60 - }, - { - "id": "sat-food3", - "title": "Boba from Taichi", - "description": "", - "location": "DCC Lounge", - "speaker": "", - "eventType": "food", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 840, - "durationMinutes": 30 - }, - { - "id": "sat-workshop1", - "title": "Intro to Tech Stack Workshop", - "description": "Learn everything you need to know about Git, Open Source Licensing, and the t3 tech stack to be able to build an amazing hackathon project!", - "location": "DCC 308", - "speaker": "Professor Turner, CJ Marino, Jackson Baimel", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 120, - "durationMinutes": 60 - }, - { - "id": "sat-workshop2", - "title": "Accenture Fireside Chat", - "description": "", - "location": "DCC 308", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 270, - "durationMinutes": 60 - }, - { - "id": "sat-workshop3", - "title": "Mercer XLab Open Hours", - "description": "", - "location": "JEC 6204", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 3, - "startMinutesFromDayStart": 240, - "durationMinutes": 180 - }, - { - "id": "sat-workshop4", - "title": "Quantum Computer Tour", - "description": "Join the Quantum Computing Club to tour RPI's state-of-the-art quantum computer!", - "location": "Meet at Check-In-Desk", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 330, - "durationMinutes": 30 - }, - { - "id": "sat-workshop5", - "title": "Agile Development Workshop", - "description": "Join John Sturman for a presentation about agile development and how to work in a development group for maximum productivity. We will explore Scrum and iterative development doing a fun simulation exercise to give you some hands-on experience. This is a good workshop to support you in working in a group creating a project efficiently and effectively.", - "location": "DCC 318", - "speaker": "Professor John Sturman, lecturer in CS at RPI", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 360, - "durationMinutes": 60 - }, - { - "id": "sat-workshop6", - "title": "RPISEC Workshop", - "description": "", - "location": "DCC 308", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 420, - "durationMinutes": 60 - }, - { - "id": "sat-workshop7", - "title": "Quantum Computer Tour", - "description": "Join the Quantum Computing Club to tour RPI's state-of-the-art quantum computer!", - "location": "Meet at Check-In-Desk", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 3, - "startMinutesFromDayStart": 480, - "durationMinutes": 30 - }, - { - "id": "sat-workshop8", - "title": "MLH GitHub Copilot & Google AI Studio Workshop", - "description": "", - "location": "Meet at Check-In-Desk", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 510, - "durationMinutes": 60 - }, - { - "id": "sat-workshop8abc", - "title": "Making AI Agents Workshop with RPai", - "description": "", - "location": "DCC 308", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 3, - "startMinutesFromDayStart": 570, - "durationMinutes": 60 - }, - { - "id": "sat-workshop9", - "title": "Forge Sticker Workshop", - "description": "", - "location": "The Forge", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 630, - "durationMinutes": 90 - }, - { - "id": "sat-workshop10", - "title": "Code Golf", - "description": "", - "location": "DCC 308", - "speaker": "Code Golf challenges participants to solve programming problems using the fewest possible characters. Compete to showcase your coding efficiency and creativity in a race to create the shortest, cleverest solutions!", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 720, - "durationMinutes": 60 - }, - { - "id": "sat-workshop11", - "title": "Ugliest Code Compeititon", - "description": "Show off your messiest, most chaotic code in the Ugliest Code Competition, where the least readable, most convoluted solutions win! Embrace bad habits and unleash your inner code gremlin for the ultimate anti-aesthetic challenge!", - "location": "DCC 308", - "speaker": "", - "eventType": "workshop", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 780, - "durationMinutes": 60 - }, - { - "id": "sat-mentoring1", - "title": "Mentoring with Girls Who Code", - "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", - "location": "Great Hall Mentoring Desk", - "speaker": "", - "eventType": "constant", - "visible": true, - "column": 4, - "startMinutesFromDayStart": 180, - "durationMinutes": 90 - }, - { - "id": "sat-mentoring2", - "title": "Mentoring with ACM-W", - "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", - "location": "Great Hall Mentoring Desk", - "speaker": "", - "eventType": "constant", - "visible": true, - "column": 4, - "startMinutesFromDayStart": 270, - "durationMinutes": 90 - }, - { - "id": "sat-mentoring3", - "title": "General Mentoring", - "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", - "location": "Great Hall Mentoring Desk", - "speaker": "", - "eventType": "constant", - "visible": true, - "column": 4, - "startMinutesFromDayStart": 360, - "durationMinutes": 510 - }, - { - "id": "sat-sleepingrooms", - "title": "Sleeping Rooms", - "description": "Need a break? Take a nap in our Sleeping Rooms!", - "location": "LOW 3112 / 3116 / 3130", - "speaker": "", - "eventType": "constant", - "visible": true, - "column": 3, - "startMinutesFromDayStart": 780, - "durationMinutes": 120 - } - - ], - "sundayEvents": [ - { - "id": "sun-food1", - "title": "Midnight Snacks", - "description": "", - "location": "DCC Lounge", - "speaker": "", - "eventType": "food", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 0, - "durationMinutes": 120 - }, - { - "id": "sun-food2", - "title": "Breakfast", - "description": "", - "location": "DCC Lounge", - "speaker": "", - "eventType": "food", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 420, - "durationMinutes": 120 - }, - { - "id": "sun-food3", - "title": "Lunch", - "description": "", - "location": "DCC Lounge", - "speaker": "", - "eventType": "food", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 720, - "durationMinutes": 60 - }, - { - "id": "sun-sleepingrooms", - "title": "Sleeping Rooms", - "description": "Need a break? Take a nap in our Sleeping Rooms!", - "location": "LOW 3112 / 3116 / 3130", - "speaker": "", - "eventType": "constant", - "visible": true, - "column": 3, - "startMinutesFromDayStart": 0, - "durationMinutes": 360 - }, - { - "id": "sun-sleepingrooms", - "title": "Last Chance Mentoring", - "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", - "location": "Great Hall Mentoring Desk", - "speaker": "", - "eventType": "constant", - "visible": true, - "column": 3, - "startMinutesFromDayStart": 360, - "durationMinutes": 240 - }, - { - "id": "sun-submission1", - "title": "Devpost Submissions Due", - "description": "You must create a Devpost submission before 11 am Sunday. You can edit your submission and project until coding ends at noon.", - "location": "", - "speaker": "", - "eventType": "deadline", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 540, - "durationMinutes": 60 - }, - { - "id": "sun-submission2", - "title": "Coding Ends", - "description": "Hands off the keyboard! No work on your project should occur until after the event ends!", - "location": "", - "speaker": "", - "eventType": "deadline", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 630, - "durationMinutes": 30 - }, - { - "id": "sun-judging1", - "title": "Science Fair Presentation Block 1", - "description": "Get ready to demo and explain your projects to a panel of industry professionals, professors, and fellow students! See the discord announcement for informatin on your block and table!", - "location": "Great Hall", - "speaker": "", - "eventType": "important", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 660, - "durationMinutes": 60 - }, - { - "id": "sun-judging2", - "title": "Science Fair Presentation Block 2", - "description": "Get ready to demo and explain your projects to a panel of industry professionals, professors, and fellow students! See the discord announcement for informatin on your block and table!", - "location": "Great Hall", - "speaker": "", - "eventType": "important", - "visible": true, - "column": 2, - "startMinutesFromDayStart": 780, - "durationMinutes": 60 - }, - { - "id": "sun-closing1", - "title": "Closing Ceremony", - "description": "Join us in announcing the winners, and celebrating a great event!", - "location": "DCC 308", - "speaker": "HackRPI Team", - "eventType": "important", - "visible": true, - "column": 1, - "startMinutesFromDayStart": 900, - "durationMinutes": 60 - } - ] + "saturdayEvents": [ + { + "id": "sat-0", + "title": "Participant Check-In", + "description": "", + "location": "DCC Lobby", + "speaker": "", + "eventType": "important", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 0, + "durationMinutes": 60 + }, + { + "id": "sat-1", + "title": "Opening Ceremony", + "description": "Join the HackRPI team to open the Hackathon to our Hackers, Sponsors, and Judges!", + "location": "DCC 308", + "speaker": "HackRPI Team", + "eventType": "important", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 60, + "durationMinutes": 60 + }, + { + "id": "sat-2", + "title": "Coding Starts!", + "description": "Ready! Set! Code! Start working on your projects!", + "location": "DCC 308", + "speaker": "", + "eventType": "important", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 120, + "durationMinutes": 60 + }, + { + "id": "sat-food1", + "title": "Lunch", + "description": "", + "location": "DCC Lounge", + "speaker": "", + "eventType": "food", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 180, + "durationMinutes": 60 + }, + { + "id": "sat-food2", + "title": "Dinner", + "description": "", + "location": "DCC Lounge", + "speaker": "", + "eventType": "food", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 600, + "durationMinutes": 60 + }, + { + "id": "sat-food3", + "title": "Boba from Taichi", + "description": "", + "location": "DCC Lounge", + "speaker": "", + "eventType": "food", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 840, + "durationMinutes": 30 + }, + { + "id": "sat-workshop1", + "title": "Intro to Tech Stack Workshop", + "description": "Learn everything you need to know about Git, Open Source Licensing, and the t3 tech stack to be able to build an amazing hackathon project!", + "location": "DCC 308", + "speaker": "Professor Turner, CJ Marino, Jackson Baimel", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 120, + "durationMinutes": 60 + }, + { + "id": "sat-workshop2", + "title": "Accenture Fireside Chat", + "description": "", + "location": "DCC 308", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 270, + "durationMinutes": 60 + }, + { + "id": "sat-workshop3", + "title": "Mercer XLab Open Hours", + "description": "", + "location": "JEC 6204", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 3, + "startMinutesFromDayStart": 240, + "durationMinutes": 180 + }, + { + "id": "sat-workshop4", + "title": "Quantum Computer Tour", + "description": "Join the Quantum Computing Club to tour RPI's state-of-the-art quantum computer!", + "location": "Meet at Check-In-Desk", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 330, + "durationMinutes": 30 + }, + { + "id": "sat-workshop5", + "title": "Agile Development Workshop", + "description": "Join John Sturman for a presentation about agile development and how to work in a development group for maximum productivity. We will explore Scrum and iterative development doing a fun simulation exercise to give you some hands-on experience. This is a good workshop to support you in working in a group creating a project efficiently and effectively.", + "location": "DCC 318", + "speaker": "Professor John Sturman, lecturer in CS at RPI", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 360, + "durationMinutes": 60 + }, + { + "id": "sat-workshop6", + "title": "RPISEC Workshop", + "description": "", + "location": "DCC 308", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 420, + "durationMinutes": 60 + }, + { + "id": "sat-workshop7", + "title": "Quantum Computer Tour", + "description": "Join the Quantum Computing Club to tour RPI's state-of-the-art quantum computer!", + "location": "Meet at Check-In-Desk", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 3, + "startMinutesFromDayStart": 480, + "durationMinutes": 30 + }, + { + "id": "sat-workshop8", + "title": "MLH GitHub Copilot & Google AI Studio Workshop", + "description": "", + "location": "Meet at Check-In-Desk", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 510, + "durationMinutes": 60 + }, + { + "id": "sat-workshop8abc", + "title": "Making AI Agents Workshop with RPai", + "description": "", + "location": "DCC 308", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 3, + "startMinutesFromDayStart": 570, + "durationMinutes": 60 + }, + { + "id": "sat-workshop9", + "title": "Forge Sticker Workshop", + "description": "", + "location": "The Forge", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 630, + "durationMinutes": 90 + }, + { + "id": "sat-workshop10", + "title": "Code Golf", + "description": "", + "location": "DCC 308", + "speaker": "Code Golf challenges participants to solve programming problems using the fewest possible characters. Compete to showcase your coding efficiency and creativity in a race to create the shortest, cleverest solutions!", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 720, + "durationMinutes": 60 + }, + { + "id": "sat-workshop11", + "title": "Ugliest Code Compeititon", + "description": "Show off your messiest, most chaotic code in the Ugliest Code Competition, where the least readable, most convoluted solutions win! Embrace bad habits and unleash your inner code gremlin for the ultimate anti-aesthetic challenge!", + "location": "DCC 308", + "speaker": "", + "eventType": "workshop", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 780, + "durationMinutes": 60 + }, + { + "id": "sat-mentoring1", + "title": "Mentoring with Girls Who Code", + "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", + "location": "Great Hall Mentoring Desk", + "speaker": "", + "eventType": "constant", + "visible": true, + "column": 4, + "startMinutesFromDayStart": 180, + "durationMinutes": 90 + }, + { + "id": "sat-mentoring2", + "title": "Mentoring with ACM-W", + "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", + "location": "Great Hall Mentoring Desk", + "speaker": "", + "eventType": "constant", + "visible": true, + "column": 4, + "startMinutesFromDayStart": 270, + "durationMinutes": 90 + }, + { + "id": "sat-mentoring3", + "title": "General Mentoring", + "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", + "location": "Great Hall Mentoring Desk", + "speaker": "", + "eventType": "constant", + "visible": true, + "column": 4, + "startMinutesFromDayStart": 360, + "durationMinutes": 510 + }, + { + "id": "sat-sleepingrooms", + "title": "Sleeping Rooms", + "description": "Need a break? Take a nap in our Sleeping Rooms!", + "location": "LOW 3112 / 3116 / 3130", + "speaker": "", + "eventType": "constant", + "visible": true, + "column": 3, + "startMinutesFromDayStart": 780, + "durationMinutes": 120 + } + ], + "sundayEvents": [ + { + "id": "sun-food1", + "title": "Midnight Snacks", + "description": "", + "location": "DCC Lounge", + "speaker": "", + "eventType": "food", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 0, + "durationMinutes": 120 + }, + { + "id": "sun-food2", + "title": "Breakfast", + "description": "", + "location": "DCC Lounge", + "speaker": "", + "eventType": "food", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 420, + "durationMinutes": 120 + }, + { + "id": "sun-food3", + "title": "Lunch", + "description": "", + "location": "DCC Lounge", + "speaker": "", + "eventType": "food", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 720, + "durationMinutes": 60 + }, + { + "id": "sun-sleepingrooms", + "title": "Sleeping Rooms", + "description": "Need a break? Take a nap in our Sleeping Rooms!", + "location": "LOW 3112 / 3116 / 3130", + "speaker": "", + "eventType": "constant", + "visible": true, + "column": 3, + "startMinutesFromDayStart": 0, + "durationMinutes": 360 + }, + { + "id": "sun-sleepingrooms", + "title": "Last Chance Mentoring", + "description": "The Mentoring Desk is here to support you throughout HackRPI! Get guidance, troubleshoot problems, and ask questions at any stage of your project — our mentors are ready to help you bring your ideas to life.", + "location": "Great Hall Mentoring Desk", + "speaker": "", + "eventType": "constant", + "visible": true, + "column": 3, + "startMinutesFromDayStart": 360, + "durationMinutes": 240 + }, + { + "id": "sun-submission1", + "title": "Devpost Submissions Due", + "description": "You must create a Devpost submission before 11 am Sunday. You can edit your submission and project until coding ends at noon.", + "location": "", + "speaker": "", + "eventType": "deadline", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 540, + "durationMinutes": 60 + }, + { + "id": "sun-submission2", + "title": "Coding Ends", + "description": "Hands off the keyboard! No work on your project should occur until after the event ends!", + "location": "", + "speaker": "", + "eventType": "deadline", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 630, + "durationMinutes": 30 + }, + { + "id": "sun-judging1", + "title": "Science Fair Presentation Block 1", + "description": "Get ready to demo and explain your projects to a panel of industry professionals, professors, and fellow students! See the discord announcement for informatin on your block and table!", + "location": "Great Hall", + "speaker": "", + "eventType": "important", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 660, + "durationMinutes": 60 + }, + { + "id": "sun-judging2", + "title": "Science Fair Presentation Block 2", + "description": "Get ready to demo and explain your projects to a panel of industry professionals, professors, and fellow students! See the discord announcement for informatin on your block and table!", + "location": "Great Hall", + "speaker": "", + "eventType": "important", + "visible": true, + "column": 2, + "startMinutesFromDayStart": 780, + "durationMinutes": 60 + }, + { + "id": "sun-closing1", + "title": "Closing Ceremony", + "description": "Join us in announcing the winners, and celebrating a great event!", + "location": "DCC 308", + "speaker": "HackRPI Team", + "eventType": "important", + "visible": true, + "column": 1, + "startMinutesFromDayStart": 900, + "durationMinutes": 60 + } + ] } diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index fd98d586..329134eb 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -83,7 +83,6 @@ We use a hybrid testing approach with Jest for unit/component tests and Playwrig When contributing, please ensure that your code is well-tested by following these guidelines: 1. **Write Tests for New Features** - - All new functionality should have corresponding tests. - For utility functions, write unit tests in the `__tests__/unit/` directory. - For components, write component tests in the `__tests__/components/` directory. @@ -91,7 +90,6 @@ When contributing, please ensure that your code is well-tested by following thes - For critical user journeys, write E2E tests in the `e2e/` directory. 2. **Run Tests Before Submitting** - - Before creating a pull request, run the test suite to make sure all tests pass: ```bash npm test @@ -103,7 +101,6 @@ When contributing, please ensure that your code is well-tested by following thes - If your tests fail, fix the issues before submitting your PR. 3. **Test Coverage** - - Aim for high test coverage in your code changes. - You can check test coverage by running: ```bash diff --git a/e2e/README.md b/e2e/README.md index 2fa01dea..29de4f63 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -231,19 +231,16 @@ e2e/ ### Test Types 1. **Smoke Tests** (`smoke.spec.ts`): - - Verify that core pages load correctly - Check meta tags and SEO elements - Verify accessibility basics 2. **Navigation Tests** (`navigation.spec.ts`): - - Test navigation between pages - Verify mobile navigation behavior - Check responsive design elements 3. **Form Tests** (`forms.spec.ts`): - - Test form submissions and validation - Verify error handling - Test success scenarios diff --git a/public/lastYearPhotos/route.ts b/public/lastYearPhotos/route.ts index a10c03be..24b60913 100644 --- a/public/lastYearPhotos/route.ts +++ b/public/lastYearPhotos/route.ts @@ -5,41 +5,44 @@ import { NextResponse } from "next/server"; const VALID = new Set([".jpg", ".jpeg", ".png", ".webp", ".gif", ".avif"]); function naturalKey(name: string) { - return name.toLowerCase().split(/(\d+)/).map((p) => (/\d+/.test(p) ? Number(p) : p)); + return name + .toLowerCase() + .split(/(\d+)/) + .map((p) => (/\d+/.test(p) ? Number(p) : p)); } export async function GET() { - try { - const dir = path.join(process.cwd(), "public", "lastYearPhotos"); - const entries = await fs.readdir(dir, { withFileTypes: true }); + try { + const dir = path.join(process.cwd(), "public", "lastYearPhotos"); + const entries = await fs.readdir(dir, { withFileTypes: true }); - const files = entries - .filter((e) => e.isFile()) - .map((e) => e.name) - .filter((n) => VALID.has(path.extname(n).toLowerCase())) - .sort((a, b) => { - const ak = naturalKey(a); - const bk = naturalKey(b); - const len = Math.max(ak.length, bk.length); - for (let i = 0; i < len; i++) { - const av = ak[i]; - const bv = bk[i]; - if (av === undefined) return -1; - if (bv === undefined) return 1; - if (av === bv) continue; - if (typeof av === "number" && typeof bv === "number") return av - bv; - if (typeof av === "number") return -1; - if (typeof bv === "number") return 1; - return av < bv ? -1 : 1; - } - return 0; - }); + const files = entries + .filter((e) => e.isFile()) + .map((e) => e.name) + .filter((n) => VALID.has(path.extname(n).toLowerCase())) + .sort((a, b) => { + const ak = naturalKey(a); + const bk = naturalKey(b); + const len = Math.max(ak.length, bk.length); + for (let i = 0; i < len; i++) { + const av = ak[i]; + const bv = bk[i]; + if (av === undefined) return -1; + if (bv === undefined) return 1; + if (av === bv) continue; + if (typeof av === "number" && typeof bv === "number") return av - bv; + if (typeof av === "number") return -1; + if (typeof bv === "number") return 1; + return av < bv ? -1 : 1; + } + return 0; + }); - // Return URLs relative to public/ - const urls = files.map((f) => `/lastYearPhotos/${f}`); - return NextResponse.json({ photos: urls }); - } catch (err: any) { - console.error("Error reading lastYearPhotos:", err); - return NextResponse.json({ error: "Failed to load photos" }, { status: 500 }); - } + // Return URLs relative to public/ + const urls = files.map((f) => `/lastYearPhotos/${f}`); + return NextResponse.json({ photos: urls }); + } catch (err: any) { + console.error("Error reading lastYearPhotos:", err); + return NextResponse.json({ error: "Failed to load photos" }, { status: 500 }); + } } diff --git a/public/sponsors/sponsors.json b/public/sponsors/sponsors.json index c2c06de7..d88feca3 100644 --- a/public/sponsors/sponsors.json +++ b/public/sponsors/sponsors.json @@ -1,53 +1,49 @@ { "OBSIDIAN": [ - { - "name": "Nuvalence", - "logoPath": "/Nuvalence.png", - "url": "https://nuvalence.io/" - }, - { + { + "name": "Nuvalence", + "logoPath": "/Nuvalence.png", + "url": "https://nuvalence.io/" + }, + { "name": "Severino Center for Technological Entrepreneurship", "logoPath": "/Severino.jpg", "url": "https://severinocenter.rpi.edu/" } - ], - "GOLD": [ ], + "GOLD": [], "SILVER": [ - { "name": "Accenture", - "logoPath": "/AccentureWhite.png", - "url": "https://www.accenture.com" - }, - { - "name": "Global Foundries", - "logoPath": "/GlobalFoundries.png", - "url": "https://gf.com/" - }, - { - "name": "RPI School of Science", - "logoPath": "/RPI_SOS.png", - "url": "https://science.rpi.edu/" - }, - { - "name": "Velan Studios", - "logoPath": "/Velan_Studios_Logo.png", - "url": "https://www.velanstudios.com/" - } + { "name": "Accenture", "logoPath": "/AccentureWhite.png", "url": "https://www.accenture.com" }, + { + "name": "Global Foundries", + "logoPath": "/GlobalFoundries.png", + "url": "https://gf.com/" + }, + { + "name": "RPI School of Science", + "logoPath": "/RPI_SOS.png", + "url": "https://science.rpi.edu/" + }, + { + "name": "Velan Studios", + "logoPath": "/Velan_Studios_Logo.png", + "url": "https://www.velanstudios.com/" + } ], "BRONZE": [ - { + { "name": "Troy Web Consulting", "logoPath": "/troywebconsulting.png", "url": "https://troyweb.com/" } ], "COLLABORATORS": [ - { + { "name": "Awake Chocolate", "logoPath": "/Awake_Chocolate.png", "url": "https://awakechocolate.com/" }, - { + { "name": "DeFazio's Pizza", "logoPath": "/DeFazios.png", "url": "https://defaziospizza.com/" @@ -62,12 +58,12 @@ "logoPath": "/github-logo.svg", "url": "https://github.com/" }, - { - "name": "Monster Energy", - "logoPath": "/MonsterEnergy.png", - "url": "https://www.monsterenergy.com/en-us/" - }, - { + { + "name": "Monster Energy", + "logoPath": "/MonsterEnergy.png", + "url": "https://www.monsterenergy.com/en-us/" + }, + { "name": "Photon", "logoPath": "/Photon.png", "url": "https://photon.codes/" @@ -77,7 +73,7 @@ "logoPath": "/Pure-Buttons-Blue-Gradient-Logo-RGB.svg", "url": "https://hackp.ac/mlh-standoutstickers-hackathons" }, - { + { "name": "Taichi Bubble Tea", "logoPath": "/Taichi.png", "url": "https://www.taichibubbletea.com/" diff --git a/tailwind.config.ts b/tailwind.config.ts index a7370b47..41a5fe97 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -2,7 +2,6 @@ import type { Config } from "tailwindcss"; import plugin from "tailwindcss/plugin"; const config: Config = { - content: [ "./pages/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}", @@ -115,7 +114,6 @@ const config: Config = { addUtilities(newUtilities); }), ], - }; export default config; diff --git a/tsconfig.json b/tsconfig.json index 0e19872e..c2042b2f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,6 +21,7 @@ "paths": { "@/*": ["./*"] } + }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "app/(layout)/not-found.tsx"], "exclude": ["node_modules", "**/tests/**/*", "**/*.test.*"]