diff --git a/client/src/pages/Initial/LandingPage.jsx b/client/src/pages/Initial/LandingPage.jsx
index c56e0d15..8c66e0d9 100644
--- a/client/src/pages/Initial/LandingPage.jsx
+++ b/client/src/pages/Initial/LandingPage.jsx
@@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react';
// F!rosh 2T4 Landing Pages
import { AshLanding } from './AshLanding/AshLanding';
+import { WilliamLanding } from './WilliamLanding/WilliamLanding';
import { AlissaLanding } from './AlissaLanding/AlissaLanding';
import { AsmitaLanding } from './AsmitaLanding/AsmitaLanding';
@@ -14,6 +15,11 @@ const landingPages = [
key: 1,
component: ,
},
+ {
+ key: 1,
+ component: ,
+ year: '2T4',
+ },
];
function randomNumber(min, max) {
@@ -37,6 +43,12 @@ export const LandingPage = () => {
setPageIndex(JSON.parse(randIdx));
}, []);
+ useEffect(() => {
+ console.log('pageIndex updated:', pageIndex);
+ }, [pageIndex]);
+
+ console.log('Current pageIndex:', pageIndex);
+
return (
<>
{landingPages.map((item) => {
diff --git a/client/src/pages/Initial/WilliamLanding/WilliamLanding.jsx b/client/src/pages/Initial/WilliamLanding/WilliamLanding.jsx
new file mode 100644
index 00000000..559439eb
--- /dev/null
+++ b/client/src/pages/Initial/WilliamLanding/WilliamLanding.jsx
@@ -0,0 +1,89 @@
+import React, { useState, useEffect } from 'react';
+import PropTypes from 'prop-types';
+import './WilliamLanding.scss';
+import InstagramIcon from '../../../assets/social/instagram-brands-dark-purple.svg';
+
+const InstagramButton = ({ link, text }) => (
+
+
+
+
{text}
+
+
+);
+
+InstagramButton.propTypes = {
+ link: PropTypes.string.isRequired,
+ text: PropTypes.string.isRequired,
+};
+
+const WilliamLanding = () => {
+ const calculateTimeLeft = () => {
+ const difference = +new Date('2024-09-01') - +new Date();
+ let timeLeft = {};
+
+ if (difference > 0) {
+ timeLeft = {
+ days: Math.floor(difference / (1000 * 60 * 60 * 24)),
+ hours: Math.floor((difference / (1000 * 60 * 60)) % 24),
+ minutes: Math.floor((difference / 1000 / 60) % 60),
+ seconds: Math.floor((difference / 1000) % 60),
+ };
+ }
+
+ return timeLeft;
+ };
+
+ const [timeLeft, setTimeLeft] = useState(calculateTimeLeft());
+
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ setTimeLeft(calculateTimeLeft());
+ }, 1000);
+ return () => clearTimeout(timer);
+ });
+
+ const timerComponents = [];
+ Object.keys(timeLeft).forEach((interval) => {
+ if (!timeLeft[interval]) return;
+ timerComponents.push(
+
+ {timeLeft[interval]} {interval}{' '}
+ ,
+ );
+ });
+
+ return (
+
+
+
+
COMING SOON!
+
+ Hey F!rosh! Our website is currently under construction. Check back soon!
+
+
+ {timerComponents.length ? timerComponents : Time is up!}
+
+
Stay Tuned
+
+
+
+
Made with 💜 by the F!rosh Week 2T4 Tech Team
+
+
+
+ );
+};
+
+export { WilliamLanding };
diff --git a/client/src/pages/Initial/WilliamLanding/WilliamLanding.scss b/client/src/pages/Initial/WilliamLanding/WilliamLanding.scss
new file mode 100644
index 00000000..9d7387f1
--- /dev/null
+++ b/client/src/pages/Initial/WilliamLanding/WilliamLanding.scss
@@ -0,0 +1,174 @@
+// Variables
+$primary-purple: #6a1b9a;
+$secondary-purple: #b39ddb;
+$dark-purple: #4527a0;
+$highlight-yellow: #ffeb3b;
+$white: #ffffff;
+$muted-purple: #9575cd;
+
+.jw-landing-page {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 100vh;
+ background: linear-gradient(135deg, $primary-purple, $secondary-purple);
+ color: $white;
+ text-align: center;
+ padding: 20px;
+ overflow: hidden;
+ animation: jw-enchantedBackground 10s infinite alternate;
+}
+
+.jw-container {
+ max-width: 1200px;
+ width: 100%;
+}
+
+.jw-title-section {
+ margin-bottom: 50px;
+}
+
+.jw-title-text {
+ font-size: 64px;
+ font-weight: bold;
+ margin-bottom: 20px;
+ text-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
+}
+
+.jw-subtitle {
+ font-size: 20px;
+ margin-bottom: 30px;
+}
+
+.jw-countdown {
+ font-size: 24px;
+ margin-bottom: 20px;
+ color: $highlight-yellow;
+}
+
+.jw-stay-tuned {
+ font-size: 24px;
+ margin-top: 10px;
+ color: $white;
+ text-shadow: 1px 1px 5px rgba(0, 0, 0, 0.5);
+ animation: jw-glow 1.5s infinite alternate;
+}
+
+.jw-info-section {
+ margin-bottom: 50px;
+}
+
+.jw-button-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 20px;
+}
+
+.jw-button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 250px;
+ padding: 15px;
+ background: $white;
+ color: $primary-purple;
+ border-radius: 50px;
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+ transition: background 0.3s, transform 0.3s;
+
+ &:hover {
+ background: $highlight-yellow;
+ color: $dark-purple;
+ transform: translateY(-5px);
+ }
+
+ .jw-button-icon {
+ width: 24px;
+ height: 24px;
+ margin-right: 10px;
+ }
+
+ .jw-button-text {
+ font-size: 16px;
+ font-weight: bold;
+ }
+}
+
+.jw-footer-section {
+ position: absolute;
+ bottom: 20px;
+ width: 100%;
+ text-align: center;
+ color: $white;
+}
+
+.jw-footer-text {
+ font-size: 18px;
+ font-weight: bold;
+}
+
+// Animations
+@keyframes jw-fadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+@keyframes jw-glow {
+ 0% {
+ text-shadow: 0 0 5px $highlight-yellow, 0 0 10px $highlight-yellow, 0 0 15px $highlight-yellow,
+ 0 0 20px $highlight-yellow;
+ }
+ 100% {
+ text-shadow: 0 0 10px $highlight-yellow, 0 0 20px $highlight-yellow, 0 0 30px $highlight-yellow,
+ 0 0 40px $highlight-yellow;
+ }
+}
+
+@keyframes jw-enchantedBackground {
+ 0% {
+ background-position: 0% 50%;
+ }
+ 100% {
+ background-position: 100% 50%;
+ }
+}
+
+.jw-animate-fadeIn {
+ animation: jw-fadeIn 1s ease-in-out;
+}
+
+// Mobile View
+@media screen and (max-width: 768px) {
+ .jw-title-text {
+ font-size: 36px;
+ }
+
+ .jw-subtitle {
+ font-size: 16px;
+ }
+
+ .jw-countdown {
+ font-size: 18px;
+ }
+
+ .jw-stay-tuned {
+ font-size: 18px;
+ }
+
+ .jw-button {
+ width: 200px;
+ padding: 10px;
+ .jw-button-text {
+ font-size: 14px;
+ }
+ }
+
+ .jw-footer-text {
+ font-size: 14px;
+ }
+}