Hacker Registration
-
+
@@ -221,6 +247,9 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
for (let obj of sponsorInfoQuestions) {
errors = setErrors(obj, values, errors);
}
+ for (let obj of minorsFormQuestions) {
+ errors = setErrors(obj, values, errors);
+ }
//additional custom error validation
if (
@@ -230,6 +259,9 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
//regex matches characters before @, characters after @, and 2 or more characters after . (domain)
errors.preferredEmail = 'Invalid email address';
}
+ if (values.phone && !/^\d{3}-\d{3}-\d{4}$/.test(values.phone)) {
+ errors.phone = 'Phone number must be in XXX-XXX-XXXX format';
+ }
if ((values.age && values.age < 1) || values.age > 100) {
errors.age = 'Not a valid age';
}
@@ -244,16 +276,16 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
}}
onSubmit={async (values, { setSubmitting }) => {
await new Promise((r) => setTimeout(r, 500));
- let finalValues: any = values;
+ let finalValues: any = { ...values };
//add user object
const userValues: any = {
- id: values.id,
- firstName: values.firstName,
- lastName: values.lastName,
- preferredEmail: values.preferredEmail,
- permissions: values.permissions,
+ id: user?.id,
+ firstName: user?.firstName?.split(' ')[0] || values.firstName,
+ lastName: user?.lastName || values.lastName,
+ preferredEmail: user?.preferredEmail || values.preferredEmail,
+ permissions: user?.permissions || values.permissions,
};
- finalValues['user'] = userValues;
+ finalValues.user = userValues;
//delete unnecessary values
delete finalValues.firstName;
delete finalValues.lastName;
@@ -261,7 +293,8 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
delete finalValues.preferredEmail;
//submitting
- handleSubmit(values);
+ console.log('SUBMIT USER ID:', finalValues.user?.id); // debugging
+ await handleSubmit(finalValues);
setSubmitting(false);
// alert(JSON.stringify(values, null, 2)); //Displays form results on submit for testing purposes
}}
@@ -278,7 +311,7 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
{registrationSection == 0 && (
)}
+ {registrationSection === 3 && (
+
+ Media Release
+
+
+ Event Date: March 28, 2026
+
+ Location: The University of Texas at Dallas
+
+
+ I, the undersigned, hereby grant NTHS Hackathon and its organizers the right to
+ take photographs, video recordings, and/or audio recordings of me/my child
+ during the event. I understand that these media materials may be used in
+ promotional materials, websites, social media, and other marketing efforts.
+
I waive any rights to inspect or approve the media in which my/my child’s
+ likeness appears. I understand that no compensation will be provided for the use
+ of these materials.
+
+
+ Participant Information & Consent (To be signed by parent/guardian if under 18):
+ I, the parent/guardian of the minor participant named above, authorize the use
+ of my child’s image and recordings for promotional purposes as outlined in this
+ release.
+
+
+ {mediaReleaseQuestions.map((obj, idx) => (
+
+ ))}
+
+ )}
+ {registrationSection === 4 && (
+
+ Liability Waiver & Release
+
+
+ Event Date: March 28, 2026
+
+ Location: The University of Texas at Dallas
+
+
+ I, the undersigned, acknowledge that participation in NTHS Hackathon is
+ voluntary and involves activities that may have inherent risks. I agree to
+ release, indemnify, and hold harmless NTHS Hackathon organizers, The University
+ of Texas at Dallas, event sponsors, and affiliated personnel from any claims,
+ injuries, damages, or liabilities that may arise during my/my child’s
+ participation in the event.
+
I understand that organizers will take reasonable safety precautions, but
+ I assume full responsibility for any personal injury or property damage
+ resulting from my/my child’s participation.
+
+
+ Participant Information & Consent (To be signed by parent/guardian if under 18):
+ I, the parent/guardian of the minor participant named above, understand and
+ accept the terms of this waiver and grant permission for my child to
+ participate.
+
+
+ {liabilityWaiverQuestions.map((obj, idx) => (
+
+ ))}
+
+ )}
+ {registrationSection === 5 && (
+
+ Code of Conduct
+
+
+ Event Date: March 28, 2026
+
+ Location: The University of Texas at Dallas
+
+
+ NTHS Hackathon is committed to fostering a safe, inclusive, and respectful
+ environment for all participants. By attending, you agree to follow these
+ guidelines:
+
+ 1. Respect – Treat fellow participants, mentors, and organizers with kindness
+ and professionalism. Harassment, discrimination, or inappropriate behavior will
+ not be tolerated.
+
+ 2. Integrity – No plagiarism, cheating, or sabotage of others’ work.
+
+ 3. Safety – Follow all event safety guidelines and UTD’s campus policies.
+
+ 4. Teamwork – Collaboration is encouraged, but all submissions must be the
+ team’s own work.
+
+ 5. Consequences – Violations of this Code of Conduct may result in
+ disqualification, removal from the event, and/or notification of school
+ officials.
+
+
+
+ Participant Agreement & Parental Consent (For Participants Under 18): I, the
+ parent/guardian of the minor participant named above, have reviewed and agree to
+ this Code of Conduct.
+
+
+ {codeOfConductQuestions.map((obj, idx) => (
+
+ ))}
+
+ )}
+ {registrationSection === 6 && (
+
+ Minor Participant Form
+
+ Event Date: March 28, 2026
+
+ Location: The University of Texas at Dallas
+
+
+ I, the parent/guardian of [Participant's Name], give my permission for my
+ child to attend and participate in NTHS Hackathon. I understand that this event
+ is hosted at The University of Texas at Dallas and will include supervised
+ activities related to coding, design, and technology.
+
+
+ I acknowledge that the nature of the Activity or Trip may expose Participant to
+ hazards or risks that may result in Participant's illness, personal injury,
+ or death and I understand and appreciate the nature of such hazards and risks.
+
+
+
+ {minorsFormQuestions.map((obj, idx) => (
+
+ ))}
+
+ )}
+ {registrationSection === 7 && (
+
+ Parental Consent Form
+
+
+ Event Date: March 28, 2026
+
+ Location: The University of Texas at Dallas
+
+
+ I, the parent/guardian of [Participant’s Name], give my permission for my child
+ to attend and participate in NTHS Hackathon. I understand that this event is
+ hosted at The University of Texas at Dallas and will include supervised
+ activities related to coding, design, and technology.
+
I acknowledge that my child will be responsible for their own
+ transportation to and from the event (unless otherwise stated) and agree to the
+ event’s liability waiver and code of conduct policies.
+
+
+ Emergency Contact Information & Consent Acknowledgment:
+
+
+ {parentalConsentQuestions.map((obj, idx) => (
+
+ ))}
+
+ )}
{/* Event Questions */}
- {registrationSection == 3 && (
+ {registrationSection == 8 && (
Event Info
@@ -364,11 +565,24 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
);
})}
+ {/* Submit */}
+
+
+ {!isValid && !formValid && (
+
Error: The form has invalid fields
+ )}
+
)}
{/* Sponsor Questions */}
- {registrationSection == 4 && (
+ {false && registrationSection == 4 && (
Sponsor Info
@@ -398,19 +612,6 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
Accepted file types: .pdf, .doc, .docx, .png, .jpeg, .txt, .tex, .rtf
- {/* Submit */}
-
-
- {!isValid && !formValid && (
-
Error: The form has invalid fields
- )}
-
)}
@@ -426,7 +627,7 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
className={`lg:block ${
registrationSection == 0
? 'justify-end'
- : registrationSection >= 4
+ : registrationSection >= 3
? 'justify-start'
: 'justify-between'
} lg:pb-4 pb-8 lg:px-4 sm:px-8 px-6 text-primaryDark font-semibold text-primaryDark font-semibold text-md`}
@@ -441,7 +642,7 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
>
prev page
@@ -450,7 +651,7 @@ export default function Register({ allowedRegistrations }: RegisterPageProps) {
)}
- {Array.from({ length: 5 }).map((_, i) => (
+ {Array.from({ length: 9 }).map((_, i) => (
- {registrationSection < 4 && (
+ {registrationSection < 8 && (
-
+
next page
diff --git a/pages/schedule/index.tsx b/pages/schedule/index.tsx
index 9429619b..0bd5985c 100644
--- a/pages/schedule/index.tsx
+++ b/pages/schedule/index.tsx
@@ -4,7 +4,6 @@ import LocationOnIcon from '@mui/icons-material/LocationOn';
/* Calendar */
export default function Calendar() {
- const [dateCard, setDateCard] = useState([]);
const [scheduleCard, setScheduleCard] = useState([]);
const [filter, setFilter] = useState('All');
@@ -16,11 +15,6 @@ export default function Calendar() {
`${window.location.protocol}//${window.location.host}/api/schedule`,
).then((res) => res.json());
setScheduleCard(scheduleData);
-
- const dateData = await fetch(
- `${window.location.protocol}//${window.location.host}/api/dates`,
- ).then((res) => res.json());
- setDateCard(dateData);
} catch (error) {
console.error(error);
}
@@ -29,7 +23,7 @@ export default function Calendar() {
fetchData();
}, []);
- if (dateCard.length === 0 || scheduleCard.length === 0) {
+ if (scheduleCard.length === 0) {
return
Fetching Data
;
}
@@ -49,40 +43,6 @@ export default function Calendar() {
'Workshop-Filter': 'border-[#5200FF] bg-[#5200FF] text-white',
};
- /* Dates Values */
- const dateValues = {
- year: dateCard[0].year,
- day1: dateCard[0].day1,
- day1Month: dateCard[0].day1Month,
- day2: dateCard[0].day2,
- day2Month: dateCard[0].day2Month,
- endTime: dateCard[0].endTime,
- startTime: dateCard[0].startTime,
- };
-
- /* Set event dates and times */
- const day1StartDateAndTime = new Date(
- dateValues['year'],
- dateValues['day1Month'],
- dateValues['day1'],
- dateValues['startTime'],
- 0,
- );
- const day2StartDateAndTime = new Date(
- dateValues['year'],
- dateValues['day2Month'],
- dateValues['day2'],
- dateValues['startTime'],
- 0,
- );
- const eventEndDateAndTime = new Date(
- dateValues['year'],
- dateValues['day1Month'],
- dateValues['day2'] + 1,
- dateValues['endTime'],
- 0,
- );
-
/* Filter Functionality */
const changeFilter = (newFilter: string) => {
@@ -96,13 +56,29 @@ export default function Calendar() {
/* Event Component */
const Event = ({ data, index, arrayLength }) => {
const startDate = new Date(data.startDate);
+ const endDate = new Date(data.endDate);
const formattedTime = startDate
.toLocaleString([], { hour: 'numeric', minute: 'numeric' })
.replace(' ', '')
.replace('AM', 'am')
.replace('PM', 'pm');
-
- const showEvent = filter === 'All' || filter === data.type;
+ const formattedEndTime = endDate
+ .toLocaleString([], { hour: 'numeric', minute: 'numeric' })
+ .replace(' ', '')
+ .replace('AM', 'am')
+ .replace('PM', 'pm');
+ const eventTypes = Array.isArray(data.type)
+ ? data.type.filter(Boolean)
+ : typeof data.type === 'string' && data.type.includes(',')
+ ? data.type
+ .split(',')
+ .map((value) => value.trim())
+ .filter(Boolean)
+ : data.type
+ ? [data.type]
+ : ['All'];
+
+ const showEvent = filter === 'All' || eventTypes.includes(filter);
const showFilteredEvents = filter !== 'All';
const isLastEvent = index === arrayLength - 1;
@@ -125,16 +101,23 @@ export default function Calendar() {
`}
>
-
{formattedTime}
+
+ {formattedTime} - {formattedEndTime}
+
{data.title}
-
- {data.type}
+
+ {eventTypes.map((eventType) => (
+
+ {eventType}
+
+ ))}
@@ -147,23 +130,9 @@ export default function Calendar() {
);
};
- /* Filter Daily Events */
- const getDailyEvents = (startTime, endTime) => {
- return scheduleCard
- .sort((a, b) => {
- return +new Date(a.startDate) - +new Date(b.startDate);
- })
- .filter((event) => {
- const eventDate = new Date(event.startDate);
- return eventDate >= startTime && eventDate <= endTime;
- })
- .map((event, index, array) => (
-
- ));
- };
-
- const day1Events = getDailyEvents(day1StartDateAndTime, day2StartDateAndTime);
- const day2Events = getDailyEvents(day2StartDateAndTime, eventEndDateAndTime);
+ const sortedEvents = [...scheduleCard].sort((a, b) => {
+ return +new Date(a.startDate) - +new Date(b.startDate);
+ });
return (
@@ -230,20 +199,17 @@ export default function Calendar() {
{/* Calendar */}
-
-
-
- Day 1: Saturday
-
-
- {day1Events}
-
-
-
-
-
Day 2: Sunday
-
- {day2Events}
+
+
+
+ {sortedEvents.map((event, index, array) => (
+
+ ))}
diff --git a/public/assets/10.png b/public/assets/10.png
new file mode 100644
index 00000000..a06d75bc
Binary files /dev/null and b/public/assets/10.png differ
diff --git a/public/assets/11.png b/public/assets/11.png
new file mode 100644
index 00000000..f83f30c8
Binary files /dev/null and b/public/assets/11.png differ
diff --git a/public/assets/13.png b/public/assets/13.png
new file mode 100644
index 00000000..3f583330
Binary files /dev/null and b/public/assets/13.png differ
diff --git a/public/assets/14.png b/public/assets/14.png
new file mode 100644
index 00000000..44710c74
Binary files /dev/null and b/public/assets/14.png differ
diff --git a/public/assets/8.png b/public/assets/8.png
new file mode 100644
index 00000000..d2c1e0a6
Binary files /dev/null and b/public/assets/8.png differ
diff --git a/public/assets/9.png b/public/assets/9.png
new file mode 100644
index 00000000..10586879
Binary files /dev/null and b/public/assets/9.png differ
diff --git a/public/assets/ArmadilloONLY.PNG.png b/public/assets/ArmadilloONLY.PNG.png
new file mode 100644
index 00000000..6cd08e1b
Binary files /dev/null and b/public/assets/ArmadilloONLY.PNG.png differ
diff --git a/public/assets/BuffaloONLY.PNG.png b/public/assets/BuffaloONLY.PNG.png
new file mode 100644
index 00000000..0f52a8e6
Binary files /dev/null and b/public/assets/BuffaloONLY.PNG.png differ
diff --git a/public/assets/BuffaloONLY.png b/public/assets/BuffaloONLY.png
new file mode 100644
index 00000000..e4e310c6
Binary files /dev/null and b/public/assets/BuffaloONLY.png differ
diff --git a/public/assets/HorseONLY.PNG.png b/public/assets/HorseONLY.PNG.png
new file mode 100644
index 00000000..e8d7d511
Binary files /dev/null and b/public/assets/HorseONLY.PNG.png differ
diff --git a/public/assets/LassoCow1ONLY.png b/public/assets/LassoCow1ONLY.png
new file mode 100644
index 00000000..777aeaf6
Binary files /dev/null and b/public/assets/LassoCow1ONLY.png differ
diff --git a/public/assets/NTHS Hackathon Website-2.png b/public/assets/NTHS Hackathon Website-2.png
new file mode 100644
index 00000000..507209cc
Binary files /dev/null and b/public/assets/NTHS Hackathon Website-2.png differ
diff --git a/public/assets/NTHS Hackathon Website-3.png b/public/assets/NTHS Hackathon Website-3.png
new file mode 100644
index 00000000..b3577801
Binary files /dev/null and b/public/assets/NTHS Hackathon Website-3.png differ
diff --git a/public/assets/NTHS Hackathon Website.png b/public/assets/NTHS Hackathon Website.png
new file mode 100644
index 00000000..7e9f6958
Binary files /dev/null and b/public/assets/NTHS Hackathon Website.png differ
diff --git a/public/assets/WesternAnimalMarch.PNG b/public/assets/WesternAnimalMarch.PNG
new file mode 100644
index 00000000..a3d2bf42
Binary files /dev/null and b/public/assets/WesternAnimalMarch.PNG differ
diff --git a/public/assets/bg-1.png b/public/assets/bg-1.png
new file mode 100644
index 00000000..61d3032f
Binary files /dev/null and b/public/assets/bg-1.png differ
diff --git a/public/assets/bg-2.png b/public/assets/bg-2.png
new file mode 100644
index 00000000..9a6605aa
Binary files /dev/null and b/public/assets/bg-2.png differ
diff --git a/public/assets/bg-3.png b/public/assets/bg-3.png
new file mode 100644
index 00000000..cdf53dae
Binary files /dev/null and b/public/assets/bg-3.png differ
diff --git a/public/assets/bg-5.png b/public/assets/bg-5.png
new file mode 100644
index 00000000..287d92b0
Binary files /dev/null and b/public/assets/bg-5.png differ
diff --git a/public/assets/bg-6.png b/public/assets/bg-6.png
new file mode 100644
index 00000000..c2df5105
Binary files /dev/null and b/public/assets/bg-6.png differ
diff --git a/public/assets/bg-7.png b/public/assets/bg-7.png
new file mode 100644
index 00000000..8ae5d415
Binary files /dev/null and b/public/assets/bg-7.png differ
diff --git a/public/assets/bg-8.png b/public/assets/bg-8.png
new file mode 100644
index 00000000..ba07a6bc
Binary files /dev/null and b/public/assets/bg-8.png differ
diff --git a/public/assets/bg-9.png b/public/assets/bg-9.png
new file mode 100644
index 00000000..3a4b6d53
Binary files /dev/null and b/public/assets/bg-9.png differ
diff --git a/public/assets/bg.png b/public/assets/bg.png
new file mode 100644
index 00000000..f933e81b
Binary files /dev/null and b/public/assets/bg.png differ
diff --git a/public/assets/foreground.png b/public/assets/foreground.png
new file mode 100644
index 00000000..581fa2b9
Binary files /dev/null and b/public/assets/foreground.png differ
diff --git a/public/assets/full-bg.png b/public/assets/full-bg.png
new file mode 100644
index 00000000..b00f1278
Binary files /dev/null and b/public/assets/full-bg.png differ
diff --git a/public/assets/infosys.png b/public/assets/infosys.png
new file mode 100644
index 00000000..01e12ee9
Binary files /dev/null and b/public/assets/infosys.png differ
diff --git a/public/assets/mcf.png b/public/assets/mcf.png
new file mode 100644
index 00000000..5bb79c19
Binary files /dev/null and b/public/assets/mcf.png differ
diff --git a/public/assets/minorsForm.pdf b/public/assets/minorsForm.pdf
new file mode 100644
index 00000000..4e7df8a4
Binary files /dev/null and b/public/assets/minorsForm.pdf differ
diff --git a/public/assets/path.png b/public/assets/path.png
new file mode 100644
index 00000000..b51b3020
Binary files /dev/null and b/public/assets/path.png differ
diff --git a/public/assets/sign1.png b/public/assets/sign1.png
new file mode 100644
index 00000000..2ef882e2
Binary files /dev/null and b/public/assets/sign1.png differ
diff --git a/public/assets/sign2.png b/public/assets/sign2.png
new file mode 100644
index 00000000..9bf455b8
Binary files /dev/null and b/public/assets/sign2.png differ
diff --git a/public/assets/sign3.png b/public/assets/sign3.png
new file mode 100644
index 00000000..f018d040
Binary files /dev/null and b/public/assets/sign3.png differ
diff --git a/public/assets/sky.png b/public/assets/sky.png
new file mode 100644
index 00000000..e1ab37b7
Binary files /dev/null and b/public/assets/sky.png differ
diff --git a/public/districts.json b/public/districts.json
new file mode 100644
index 00000000..6a162efe
--- /dev/null
+++ b/public/districts.json
@@ -0,0 +1,3 @@
+ [
+ { "district" : "Plano District"}
+ ]
diff --git a/public/favicon.ico b/public/favicon.ico
old mode 100755
new mode 100644
index c6d38dd4..777aeaf6
Binary files a/public/favicon.ico and b/public/favicon.ico differ
diff --git a/styles/globals.css b/styles/globals.css
index c492a396..26d3d3ae 100644
--- a/styles/globals.css
+++ b/styles/globals.css
@@ -6,6 +6,8 @@
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300...700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Fredoka:wght@300..700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Rye&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Alfa+Slab+One&display=swap');
@tailwind base;
@tailwind components;
@@ -16,6 +18,8 @@ body {
padding: 0;
margin: 0;
font-family: sans-serif;
+ overflow-x: hidden;
+
}
@font-face {
@@ -57,11 +61,21 @@ a.link {
font-family: 'wavehaus';
}
+/* Alfa Slab One font for navbar */
+.alfa-slab-font {
+ font-family: 'Alfa Slab One', cursive;
+}
+
/* Fredoka font class for specific elements */
.fredoka-font {
font-family: 'Fredoka', sans-serif;
}
+/* Rye font for titles */
+.rye-font {
+ font-family: 'Rye', cursive;
+}
+
.profile-view {
display: grid;
grid-template-areas:
@@ -196,7 +210,7 @@ a.link {
display: block;
font-size: 1rem !important;
font-weight: 600;
- color: #7b81ff;
+ color: #8b5a2b;
}
.swiper-pagination-bullet,
@@ -210,3 +224,427 @@ a.link {
transition: opacity 0.5s ease-in;
transition-delay: 3s;
}
+
+.section-bg {
+ background-repeat: repeat-x;
+ background-position: center;
+ background-size: cover;
+}
+
+/* Responsive background sizing for different screen sizes */
+@media (max-width: 767px) {
+ .section-bg {
+ background-size: auto 100%;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 1023px) {
+ /* iPad/Tablet */
+ .section-bg {
+ background-size: 150% auto;
+ }
+}
+
+@media (min-width: 1024px) and (max-width: 1366px) {
+ /* Laptop/Desktop (smaller) */
+ .section-bg {
+ background-size: 120% auto;
+ }
+}
+
+@media (min-width: 1367px) {
+ /* Large Desktop */
+ .section-bg {
+ background-size: cover;
+ }
+}
+
+/* Hero background */
+/*
+.bg-sky {
+ background-image: url('/assets/sky.png');
+ background-repeat: no-repeat;
+ background-position: top center;
+ background-size: cover;
+}
+*/
+
+@keyframes skyDrift {
+ 0%, 100% {
+ transform: translateX(0);
+ }
+ 50% {
+ transform: translateX(-30px);
+ }
+}
+
+@keyframes float {
+ 0%, 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-10px);
+ }
+}
+
+.parallax-sky {
+ position: absolute;
+ bottom: -170px;
+ left: 0;
+ width: 110%;
+ height: 100%;
+ background-image: url('/assets/sky.png');
+ background-repeat: no-repeat;
+ background-position: center top;
+ background-size: 100% auto;
+ z-index: 1;
+ animation: skyDrift 25s cubic-bezier(0.45, 0.05, 0.55, 0.95) infinite;
+ will-change: transform;
+}
+
+@media (min-width: 1600) {
+ .parallax-sky {
+ bottom: 550px;
+ }
+}
+/* Laptop/Desktop */
+@media (min-width: 1024px) and (max-width: 1599px) {
+ .parallax-sky {
+ bottom: 150px;
+ }
+}
+
+
+/* Adjust sky for smaller viewport heights - placed last to override width-based queries */
+
+@media (max-height: 1100px) {
+ .parallax-sky {
+ height: 95% !important;
+ bottom: 550px !important;
+ background-size: 140% auto !important;
+ }
+
+
+}
+@media (max-height: 1000px) {
+ .parallax-sky {
+ height: 90% !important;
+ bottom: 500px !important;
+ background-size: 120% auto !important;
+ }
+
+
+}
+@media (max-height: 900px) {
+ .parallax-sky {
+ height: 90% !important;
+ bottom: 300px !important;
+ background-size: 110% auto !important;
+ }
+
+}
+@media (max-height: 800px) {
+ .parallax-sky {
+ height: 90% !important;
+ bottom: 300px !important;
+ background-size: 110% auto !important;
+ }
+
+
+
+}
+@media (max-height: 700px) {
+ .parallax-sky {
+ height: 90% !important;
+ bottom: 300px !important;
+ background-size: 100% auto !important;
+ }
+
+
+}
+
+@media (max-height: 600px) {
+ .parallax-sky {
+ height: 85% !important;
+ bottom: 300px !important;
+ background-size: 100% auto !important;
+ }
+
+
+}
+
+@media (max-height: 500px) {
+ .parallax-sky {
+ height: 80% !important;
+ bottom: 350px !important;
+ background-size: 100% auto !important;
+ }
+
+
+}
+
+/* Adjust for 1080p width screens with reduced heights */
+@media (min-width: 1024px) and (max-width: 1920px) and (max-height: 900px) {
+ .parallax-sky {
+ height: 90% !important;
+ bottom: 400px !important;
+ background-size: 120% auto !important;
+ }
+
+}
+
+@media (min-width: 1024px) and (max-width: 1920px) and (max-height: 800px) {
+ .parallax-sky {
+ height: 90% !important;
+ bottom: 360px !important;
+ background-size: 120% auto !important;
+ }
+}
+
+@media (min-width: 1024px) and (max-width: 1920px) and (max-height: 700px) {
+ .parallax-sky {
+ height: 90% !important;
+ bottom: 250px !important;
+ background-size: 100% auto !important;
+ }
+}
+
+@media (min-width: 1024px) and (max-width: 1920px) and (max-height: 600px) {
+ .parallax-sky {
+ height: 85% !important;
+ bottom: 300px !important;
+ background-size: 100% auto !important;
+ }
+}
+
+@media (min-width: 1024px) and (max-width: 1920px) and (max-height: 500px) {
+ .parallax-sky {
+ height: 80% !important;
+ bottom: 490px !important;
+ background-size: 100% auto !important;
+ }
+}
+
+/* Unified gradient background wrapping schedule to sponsors */
+.bg-unified-gradient {
+ background: linear-gradient(
+ to bottom,
+ #2B0800 0%,
+ #2B0800 10%,
+ #702D11 30%,
+ #A74A1B 50%,
+ #CA6F30 70%,
+ #FDD7B1 100%
+ );
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: cover;
+}
+
+.bg-7 {
+ /* Top of continuous diagonal gradient */
+ background-image: linear-gradient(
+ 135deg,
+ #2d1508 0%,
+ #5c3a1e 50%,
+ #8c3f1f 100%
+ );
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: cover;
+}
+.bg-8 {
+ /* Middle of continuous diagonal gradient */
+ background-image: linear-gradient(
+ 135deg,
+ #8b5a2b 0%,
+ #2d1508 50%,
+ #8c3f1f 100%
+ );
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: cover;
+}
+
+.bg-9 {
+ /* Bottom of continuous diagonal gradient */
+ background-image: linear-gradient(
+ 135deg,
+ #d4a574 0%,
+ #b57d48 50%,
+ #f5e6d3 100%
+ );
+ background-repeat: no-repeat;
+ background-position: center;
+ background-size: cover;
+}
+
+.header-sponsors {
+ position: absolute;
+ left: 50%;
+ transform: translateX(-50%) translateY(-210px); /* Center horizontally and move upwards */
+
+ font-family: "Alfa Slab One", cursive;
+ font-weight: 400;
+ font-size: clamp(28px, 4vw, 68px);
+
+ letter-spacing: 2px;
+ text-align: center;
+
+ color: #ffffff;
+ text-shadow: 0 6px 18px rgba(0, 0, 0, 0.5);
+
+ margin: 0;
+ z-index: 4;
+}
+
+
+/* Keep backgrounds stable on reduced viewport heights without cutting off content */
+@media (min-width: 1024px) and (max-height: 500px) {
+ /* Keep backgrounds from shifting - but allow sections to scroll naturally */
+ .bg-2,
+ .bg-3,
+ .bg-4,
+ .bg-5,
+ .bg-6,
+ .bg-unified-gradient {
+ background-size: cover !important;
+ background-position: center !important;
+ }
+}
+
+/* Large screens - keep contain to avoid zooming */
+/*
+@media (min-width: 1920px) {
+ .bg-3 {
+ background-size: contain;
+ background-position: center center;
+ }
+}
+*/
+
+/* Force Alfa Slab One for all text inside schedule section */
+.schedule-alfa * {
+ font-family: 'Alfa Slab One', cursive !important;
+ -webkit-font-smoothing: antialiased;
+ color: #5C2E12 !important; /* default brown text color */
+}
+
+/* Override for white text headings */
+.white-text {
+ color: white !important;
+}
+
+
+/* Stats heading to match the reference image (Alfa Slab One) */
+.stats-title {
+ font-family: 'Alfa Slab One', cursive;
+ color: #FF9A2E; /* bright orange */
+ font-weight: 900;
+ letter-spacing: 0.02em;
+ -webkit-text-stroke: 1.5px #7a3a00; /* thin dark outline */
+ text-shadow: 0 2px 0 #8c3d00, 0 6px 12px rgba(0,0,0,0.35); /* softened drop shadow */
+ position: relative;
+ display: inline-block;
+ -webkit-font-smoothing: antialiased;
+ transform: translateZ(0);
+}
+@media (min-width: 768px) {
+ .stats-title {
+ -webkit-text-stroke: 1px #7a3a00;
+ }
+}
+@media (min-width: 1024px) {
+ .stats-title {
+ -webkit-text-stroke: 1px #7a3a00;
+ }
+}
+/* subtle top bevel highlight to mimic embossed look */
+.stats-title::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ box-shadow: inset 0 4px 0 rgba(255,255,255,0.06);
+}
+.stats-subtitle {
+ font-family: 'Alfa Slab One', cursive;
+ color: #8c3d00;
+ -webkit-text-stroke: 0.8px #6a2f00;
+ text-shadow: 0 2px 0 rgba(0,0,0,0.28);
+}
+
+/* Sponsor card hover effect - dim others when hovering */
+.sponsor-grid:has(.sponsor-card:hover) .sponsor-card:not(:hover) {
+ opacity: 0.5;
+ filter: brightness(0.7);
+}
+
+.sponsor-card {
+ transition: all 0.3s ease;
+}
+
+
+@media (min-height: 840px) {
+ .stats-container {
+ padding-top: 45px !important;
+ }
+}
+
+@media (max-width: 767px) {
+ .parallax-sky {
+ position: absolute;
+ top: 0 !important;
+ bottom: auto !important;
+ height: 100vh !important;
+ width: 100%;
+ background-size: cover !important;
+ background-position: center top !important;
+ transform: none !important;
+ animation: none !important;
+ z-index: 0;
+ }
+}
+
+@media (max-width: 767px) {
+ .homeHeroMobileFix {
+ position: relative;
+ min-height: 100vh !important;
+ overflow: hidden;
+ }
+
+ .homeHeroMobileFix h1,
+ .homeHeroMobileFix p {
+ position: relative;
+ z-index: 2;
+ }
+}
+
+
+@media (max-width: 767px) {
+ .home-about h1 {
+ font-size: clamp(12px, 4vw, 18px);
+ }
+ .home-about p {
+ font-size: clamp(7px, 2.6vw, 8px);
+ line-height: 1.2;
+ }
+}
+
+@media (max-width: 767px) {
+ .stats-title {
+ font-size: clamp(10px, 4vw, 16px) !important;
+ -webkit-text-stroke: 0.4px #7a3a00 !important;
+ }
+
+ .home-stats-wrapper {
+ transform: translateY(-21px);
+ font-size: clamp(10px, 5vw, 16px) !important;
+ -webkit-text-stroke: 0.4px #7a3a00 !important;
+ }
+
+ .home-stats-wrapper .space-y-3 > * + * {
+ margin-top: 4px !important; /* smaller space between stats */
+ }
+
+}
\ No newline at end of file