From f19e96aaca65c39274eff3eaf467f4a3be10067c Mon Sep 17 00:00:00 2001 From: Toby Chin <92127289+spagechi@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:25:59 -0800 Subject: [PATCH 1/4] implement footer and navbar redesigns, fix bugs, and improve maintainability Footer: - remove newsletter subscription - implement new desktop and mobile designs - make dynamic and resizable - add accessibility Navbar: - remove outdated application deadline countdown banner - implement new desktop and mobile designs - make dynamic and resizable Bug Fixes: - fix navbar width (horizontal scrolling issue) - update ACM Instagram handle (fix broken Instagram link) - fix mobile initial rendering on DevTools - fix component width issue happening at small viewport widths (add min-width of 320px to html and body in reset.scss) - fix import errors after updating next.js (image and vars.scss imports) Maintainability Improvements: - make major restructuring changes to footer TSX - move/nest styles in footer and navbar stylesheets - make spelling of gray consistent in global variable names - add a global function for calculating relative CSS property size used for resizing - switch to media queries for breakpoints for navbar to make adding more breakpoints easier - improve footer media query structure - calculate mobileNav margin-top instead of hardcoding --- app/layout.tsx | 4 +- public/assets/embeds/discord.svg | 6 +- public/assets/embeds/email.svg | 12 +- public/assets/embeds/instagram.svg | 5 +- public/assets/footer_proj_logo.svg | 5 + public/assets/proj_logo.png | Bin 38169 -> 0 bytes public/assets/proj_logo.svg | 5 + src/components/footer/index.tsx | 212 ++- src/components/footer/styles.module.scss | 226 ++++ src/components/footer/styles.scss | 299 ----- src/components/navbar/Navbar.module.scss | 298 ++-- src/components/navbar/index.tsx | 54 +- src/sections/About-Projects/style.module.scss | 2 +- src/sections/Photo-Gallery/style.module.scss | 2 +- src/styles/reset.scss | 1194 +++++++++-------- src/styles/vars.scss | 27 +- tsconfig.json | 24 +- 17 files changed, 1154 insertions(+), 1221 deletions(-) create mode 100644 public/assets/footer_proj_logo.svg delete mode 100644 public/assets/proj_logo.png create mode 100644 public/assets/proj_logo.svg create mode 100644 src/components/footer/styles.module.scss delete mode 100644 src/components/footer/styles.scss diff --git a/app/layout.tsx b/app/layout.tsx index c928218..a120171 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -17,7 +17,9 @@ export default function RootLayout({ }) { return ( - {children} + + {children} + ); } diff --git a/public/assets/embeds/discord.svg b/public/assets/embeds/discord.svg index 506add4..df30f09 100644 --- a/public/assets/embeds/discord.svg +++ b/public/assets/embeds/discord.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + diff --git a/public/assets/embeds/email.svg b/public/assets/embeds/email.svg index cf88e52..866200a 100644 --- a/public/assets/embeds/email.svg +++ b/public/assets/embeds/email.svg @@ -1 +1,11 @@ - \ No newline at end of file + + + + + + + + + + + diff --git a/public/assets/embeds/instagram.svg b/public/assets/embeds/instagram.svg index 8b01434..f265db9 100644 --- a/public/assets/embeds/instagram.svg +++ b/public/assets/embeds/instagram.svg @@ -1 +1,4 @@ - \ No newline at end of file + + + + diff --git a/public/assets/footer_proj_logo.svg b/public/assets/footer_proj_logo.svg new file mode 100644 index 0000000..6bd61bf --- /dev/null +++ b/public/assets/footer_proj_logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/proj_logo.png b/public/assets/proj_logo.png deleted file mode 100644 index 92ececa4c27ed7fa615ed4962c347d148166be90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38169 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 n9bjY!I3+XRKST?HK((86Y6u diff --git a/public/assets/proj_logo.svg b/public/assets/proj_logo.svg new file mode 100644 index 0000000..4109c05 --- /dev/null +++ b/public/assets/proj_logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/components/footer/index.tsx b/src/components/footer/index.tsx index f9f185d..ca5bb45 100644 --- a/src/components/footer/index.tsx +++ b/src/components/footer/index.tsx @@ -1,137 +1,121 @@ -import { useState } from "react"; -import Link from "next/link"; -import "src/components/footer/styles.scss"; -import FacebookIcon from "public/assets/embeds/facebook.svg"; -import MediumIcon from "public/assets/embeds/medium.svg"; -import GithubIcon from "public/assets/embeds/github.svg"; -import InstagramIcon from "public/assets/embeds/instagram.svg"; -import DiscordIcon from "public/assets/embeds/discord.svg"; -import EmailIcon from "public/assets/embeds/email.svg"; -import LinkedinIcon from "public/assets/embeds/linkedin.svg"; -import YoutubeIcon from "public/assets/embeds/youtube.svg"; -import VercelIcon from "public/assets/embeds/vercel.svg"; +import styles from "./styles.module.scss"; -const cardContents = [ - { title: "Email", value: "contact@acmucsd.org", icon: EmailIcon }, +const ProjLogo = "/assets/footer_proj_logo.svg"; +const DiscordIcon = "/assets/embeds/discord.svg"; +const InstagramIcon = "/assets/embeds/instagram.svg"; +const EmailIcon = "/assets/embeds/email.svg"; + +// Social links bundled with other associated content +const socials = [ { title: "Discord", value: "acmurl.com/discord", icon: DiscordIcon, }, - { title: "Medium", value: "medium.com/acmucsd", icon: MediumIcon }, - { - title: "Facebook", - value: "facebook.com/acmucsd", - icon: FacebookIcon, - }, - { title: "Github", value: "github.com/acmucsd", icon: GithubIcon }, { title: "Instagram", - value: "instagram.com/acm.ucsd", + value: "instagram.com/acm.at.ucsd", icon: InstagramIcon, }, + { title: "Email", + value: "contact@acmucsd.org", + icon: EmailIcon + }, +]; + +// Nav link sections/columns +const navLinkSections = [ { - title: "LinkedIn", - value: "acmurl.com/linkedin", - icon: LinkedinIcon, + title: "Projects", + pages: ["Resources", "Gallery", "Events", "About"] }, { - title: "YouTube", - value: "acmurl.com/youtube", - icon: YoutubeIcon, + title: "ACM at UCSD", + pages: ["Main", "AI", "Cyber", "Hack"] }, ]; + +// React component that represents the nav links +const NavLinks = () => { + return navLinkSections.map((section, sectionKey) => { + const links = section.pages.map((page, pageKey) => { + let link : string = "https://"; // set default link prefix + let pageTitle : string = page; + + if (section.title === "Projects") { + link = "/" + page.toLowerCase(); + } + else + { + // if page is main website, link will just take you to acmucsd.com + if (page !== "Main") { + link += page.toLowerCase() + "."; + } + + link += "acmucsd.com"; + pageTitle += " Website"; + } + + return ( + + ); + }); + + return ( +
+

+ {section.title} +

+ {links} +
+ ); + }); +} + +// React component that represents the contact section +const Contact = () => { + return socials.map((item, key) => { + const linkprefix = + item.title === "Email" ? "mailto:" : "https://"; + const href = `${linkprefix}${item.value}`; // assemble link + return ( +
+ + {item.title} + +
+ ); + }); +} + +// Main footer component const Footer: React.FC = () => { - const [email, setEmail] = useState(""); return ( -
-
-
-

Connect With Us!

-
-
- {cardContents.map((item, key) => { - const linkprefix = - item.title === "Email" ? "mailto:" : "https://"; - const href = `${linkprefix}${item.value}`; - return ( -
- - - {item.title} - - - -
- ); - })} -
-
-

Newsletter

-

Receive weekly events and news!

- - Subscribe! - - - Vercel - -
+
+
+
+ + {/* Projects Logo */} +
+ Projects Logo +

at UC San Diego

+
+ + {/* Nav Links */} +
+
-
-
-

Connect With Us!

- -
-

Newsletter

-

Receive weekly events and news!

- - Subscribe! - - - Vercel - + + {/* Contact Buttons */} +
+
+ + {/* Bottom Horizontal Line */} +
); diff --git a/src/components/footer/styles.module.scss b/src/components/footer/styles.module.scss new file mode 100644 index 0000000..99ce855 --- /dev/null +++ b/src/components/footer/styles.module.scss @@ -0,0 +1,226 @@ +@use "../../styles/vars.scss" as vars; + +$stmw: 834px; // small tablet max width +$mmw: 530px; // mobile max width +$mmmw: 375px; // medium mobile max width + +// Base styles (Regular desktop view) +.footer { + width: 100%; + height: 100%; + background-color: vars.$footer-blue; + color: vars.$white; + z-index: 0; + position: relative; +} + +.footerContainer { + padding: 3.625rem 7.5rem; + + hr { + display: flex; + border: none; // this removes border control over styling + height: 1px; + background-color: vars.$white; + margin-bottom: 0; + } + + .mainContent { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 5rem; + + .logo { + display: flex; + align-items: center; + gap: 1.5625rem; + + img { + width: 4.875rem; + height: 4.8125rem; + margin: 0; + } + + h2 { + margin: 0; + white-space: nowrap; + font-size: 3.25rem; + font-weight: 700; + } + } + + .navLinks { + display: flex; + flex-direction: row; + justify-content: space-between; + // finds gap size from line between points (1332px, 5rem) and + // (1844px, 15rem) + gap: vars.calc-relative-size(1332px, 5rem, 1844px, 15rem); + white-space: nowrap; + font-weight: 700; + + h3 { + margin: 0; + font-size: 1.75rem; + color: vars.$white; + } + + a { + font-size: 1.125rem; + color: vars.$white; + text-decoration: none; + } + + .navSection { + display: flex; + flex-direction: column; + gap: 1.25rem; + } + + .pageTitle { + a:hover { + // color change AND underline for accessibility reasons + color: #D6E2FF; + text-decoration: underline solid currentColor; + } + } + } + } + + .contact { + display: flex; + gap: 0.9375rem; + margin-bottom: 1rem; + + .contactIcon { + + a { + display: flex; + } + + img { + width: 2.625rem; + height: 2.625rem; + margin: 0; + } + + a:hover img { + transform: scale(1.05); + transition: transform 0.2s; + } + } + } +} + +// Medium tablet view +@media only screen and (max-width: 1331px) { + .footerContainer { + .mainContent { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 3.25rem; + + .navLinks { + // finds gap size from line between points (835px, 8rem) and + // (1090px, 15rem) + gap: vars.calc-relative-size($stmw + 1px, 8rem, 1090px, 15rem); + margin-bottom: 3.625rem; + } + } + } +} + +// Small tablet view (834px) +@media only screen and (max-width: $stmw) { + .footerContainer { + display: flex; + flex-direction: column; + padding: + // finds top padding size from line between points (531px, 1.6875rem) and + // (834px, 3.625rem) + vars.calc-relative-size($mmw + 1px, 1.6875rem, $stmw, 3.625rem) + // finds side padding size from line between points (531px, 3.1875rem) and + // (834px, 7.5rem) + vars.calc-relative-size($mmw + 1px, 3.1875rem, $stmw, 7.5rem) + // finds bottom padding size from line between points (531px, 2.0625rem) + // and (834px, 3.625rem) + vars.calc-relative-size($mmw + 1px, 2.0625rem, $stmw, 3.625rem); + + .mainContent { + .logo { + h2 { + // finds font size from line between points (531px, 1.25rem) and + // (834px, 3.25rem) + font-size: + vars.calc-relative-size($mmw + 1px, 1.25rem, $stmw, 3.25rem); + } + } + + .navLinks { + // finds gap size from line between points (531px, 4rem) and + // (834px, 8rem) + gap: vars.calc-relative-size($mmw + 1px, 4rem, $stmw, 8rem); + margin-bottom: 3.625rem; + } + } + } +} + +// Mobile view (530px) +@media only screen and (max-width: $mmw) { + .footerContainer { + display: flex; + flex-direction: column; + gap: 3.625rem; + padding: 1.6875rem 3.1875rem 2.0625rem; + + hr { + display: none; + } + + .mainContent { + .logo { + gap: 1.5625rem; + + h2 { + font-size: 1.25rem; + } + } + + .navLinks { + flex-direction: column; + justify-content: flex-start; + gap: 3.125rem; + } + } + + .contact { + margin: 0; + } + } +} + +// Medium mobile view (375px) +@media only screen and (max-width: $mmmw) { + .footerContainer { + .mainContent { + .logo { + // finds gap size from line between points (320px, 1rem) and + // (375px, 1.5625rem) + gap: vars.calc-relative-size(320px, 1rem, $mmmw, 1.5625rem); + + img { + // finds width from line between points (320px, 3.03896103rem) and + // (375px, 4.875rem) + width: vars.calc-relative-size(320px, 3.03896103rem, $mmmw, 4.875rem); + // finds width from line between points (320px, 3rem) and + // (375px, 4.8125rem) + height: vars.calc-relative-size(320px, 3rem, $mmmw, 4.8125rem); + } + } + } + } +} diff --git a/src/components/footer/styles.scss b/src/components/footer/styles.scss deleted file mode 100644 index bdef7a4..0000000 --- a/src/components/footer/styles.scss +++ /dev/null @@ -1,299 +0,0 @@ -@use "src/styles/vars.scss" as colors; - -.footer { - width: 100%; - height: 100%; - background-color: colors.$black; - color: colors.$white; - z-index: 0; - position: relative; - margin-top: 1rem; -} -.footerContainer { - padding-bottom: 80px; - display: flex; - justify-content: center; -} -.footerContents { - h2 { - font-size: 42px; - font-weight: 700; - width: 100%; - text-align: center; - padding-top: 56px; - } - &__wrapper { - display: flex; - align-items: flex-start; - @media only screen and (max-width: 985px) { - flex-wrap: wrap; - padding: 0 40px; - } - } - &__contact { - width: 100%; - display: grid; - grid-template-columns: 1fr 1fr; - &__card { - display: flex; - justify-content: center; - align-items: center; - width: 240px; - height: 75px; - margin: 10px 5px; - a:hover img { - transform: scale(1.05); - transition: transform 0.2s; - } - img { - float: left; - width: 45px; - margin: 10px; - } - div { - margin: 10px; - width: 140px; - h3 { - font-size: 20px; - font-weight: 500; - margin: 0px; - } - a { - font-size: 20px; - font-weight: 500; - margin: 0px; - color: white; - text-decoration: none; - } - } - } - } - &__newsletter { - width: 80%; - display: flex; - flex-direction: column; - justify-content: space-between; - flex-wrap: wrap; - padding-left: 20px; - h2 { - font-size: 20px; - font-weight: 700; - width: 100%; - text-align: left; - padding-top: 20px; - margin: 0px; - } - p { - width: 100%; - font-weight: 400; - font-size: 16px; - margin-bottom: 20px; - } - input { - color: rgba(0, 0, 0, 0.5); - padding: 2px 2px 2px 1em; - width: 272px; - margin-bottom: 24px; - border-radius: 8px; - border-color: colors.$black; - border-style: none; - font-weight: bold; - font-size: 16px; - outline: none; - } - .subscribe-btn { - text-decoration: none; - padding: 5px 30px; - cursor: pointer; - color: colors.$white; - background-color: colors.$dark-grey; - height: 2em; - width: fit-content; - height: 35px; - border-radius: 8px; - border-color: colors.$black; - border-style: none; - font-weight: bold; - font-size: 20px; - margin-bottom: 36px; - outline: none; - &:hover { - cursor: pointer; - color: colors.$black; - background-color: colors.$hover-blue; - transition-duration: 0.2s; - } - } - .vercel-btn { - text-decoration: none; - cursor: pointer; - color: colors.$white; - background-color: none; - height: 2em; - width: 165px; - height: 35px; - border-radius: 8px; - border-color: colors.$black; - border-style: none; - font-weight: bold; - font-size: 20px; - margin-bottom: 36px; - outline: none; - } - } -} -.acmBlueFade { - display: none; - margin: 0 !important; - position: absolute; - bottom: 10px; - right: 0px; - z-index: 0; -} -.mobileFooterContainer { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - margin-bottom: -7px !important; - h2 { - padding-top: 56px; - text-align: center; - font-size: 32px; - margin-bottom: 40px; - } - a { - text-align: center; - font-size: 15px; - font-weight: 400; - margin-bottom: 35px; - color: colors.$white; - text-decoration: underline; - } - &__newsletter { - width: 272px; - display: flex; - flex-direction: column; - justify-content: space-between; - flex-wrap: wrap; - margin-left: 0px !important; - h2 { - font-size: 20px; - font-weight: 700; - text-align: left; - padding-top: 6px; - margin: 0px; - } - p { - font-size: 16px; - margin-bottom: 11px; - text-align: left; - } - input { - color: rgba(0, 0, 0, 0.5); - padding: 2px 2px 2px 1em; - width: 100%; - margin-top: 11px !important; - margin-bottom: 23px !important; - border-radius: 8px; - border-color: colors.$black; - border-style: none; - font-weight: bold; - font-size: 16px; - outline: none; - } - .mobile-subscribe-btn { - text-decoration: none; - padding: 4px 0; - color: colors.$white; - background-color: colors.$blue; - height: 2em; - width: 165px; - height: 35px; - border-radius: 8px; - border-color: colors.$black; - border-style: none; - font-weight: bold; - font-size: 20px; - margin-bottom: 36px; - outline: none; - } - .mobile-vercel-btn { - text-decoration: none; - padding: 4px 0; - color: colors.$white; - background-color: none; - height: 2em; - width: 165px; - height: 35px; - border-radius: 8px; - border-color: colors.$black; - border-style: none; - font-weight: bold; - font-size: 20px; - margin-bottom: 36px; - outline: none; - } - .mobile-vercel-btn { - text-decoration: none; - padding: 4px 0; - color: colors.$white; - background-color: none; - height: 2em; - width: 165px; - height: 35px; - border-radius: 8px; - border-color: colors.$black; - border-style: none; - font-weight: bold; - font-size: 20px; - margin-bottom: 36px; - outline: none; - } - } -} -.community-links { - display: grid; - grid-template-columns: repeat(4, 1fr); - flex-direction: row; - padding-top: 4px; - width: 272px; - a { - height: 50px; - margin-bottom: 20px; - border: none; - background-color: transparent; - outline: none; - padding: 0px; - img { - width: 70%; - height: unset; - &:hover { - transform: scale(1.05); - } - } - } - img { - width: 45px; - height: 45px; - } -} -@media only screen and (min-width: 984px) { - .acmBlueFade { - display: block; - } - .mobileFooterContainer { - display: none; - } -} -@media only screen and (max-width: 986px) { - .footerContainer { - display: none; - } - .acmBlueFade { - display: none; - } - .mobileFooterContainer { - display: flex; - } -} \ No newline at end of file diff --git a/src/components/navbar/Navbar.module.scss b/src/components/navbar/Navbar.module.scss index c267c71..d6351a8 100644 --- a/src/components/navbar/Navbar.module.scss +++ b/src/components/navbar/Navbar.module.scss @@ -1,5 +1,13 @@ @use "../../styles/vars.scss" as vars; +$bottom-border-width: 4px; +// the next 3 variables exist to calculate the initial position of the mobile nav dropdown (determined via its height relative to its contents) so that it is positioned off-screen +$mobileNav-line-height: 3rem; +$navItem-margin-bottom: 0.5rem; +$num-navItems: 5; // change this according to how many navlinks there are +$stmw: 956px; // small tablet max width + +// Base styles (Regular desktop view) .navbarWrapper { position: sticky; top: 0; @@ -7,41 +15,21 @@ width: 100%; z-index: 10; white-space: nowrap; + background-color: vars.$white; // this is a placeholder; the navbar bg color needs to match the page's bg color (bc of the gradient on the landing page) // container for fixed navbar (desktop and mobile) .navbar { - background-color: vars.$white; + $vert-padding: 1.25rem; + + background-color: vars.$white; // this is a placeholder; the navbar bg color needs to match the page's bg color (bc of the gradient on the landing page) z-index: 20; - font-size: 18px; - width: 100vw; - height: 78px; + width: 100%; justify-content: space-between; + gap: 1rem; align-items: center; display: flex; flex-direction: row; - - // left side of navbar is just the acm logo - .left { - height: 60px; - margin-left: 2rem; - display: flex; - flex-flow: row nowrap; - } - - .logoText { - font-size: 16px; - } - - .navLinks { - display: flex; - flex-flow: row nowrap; - justify-content: flex-start; - gap: 1rem; - - &.hidden { - display: none; - } - } + padding: $vert-padding 4rem calc($vert-padding - $bottom-border-width); a { display: flex; @@ -54,189 +42,153 @@ margin: 0; } > p { - font-size: 18px; - font-weight: 800; + font-size: 1.125rem; + font-weight: 700; color: vars.$black; - margin-left: 4px; - margin-bottom: 2px; + margin: 0px; } } a:hover { cursor: pointer; } + // left side of navbar is just the acm logo + .left { + display: flex; + flex-flow: row nowrap; + + .logo { + width: 3.01644rem; + height: 3rem; + flex-shrink: 0; + } + + .logoText { + font-size: 1.375rem; + font-weight: 700; + color: vars.$proj-blue; + margin: 0; + margin-left: 0.5rem; + } + } + // navbar right side contains all navlinks on desktop .right { display: flex; flex-flow: row nowrap; - margin-right: 2rem; - - // justify-content: center; - // align-items: center; - - // a { - // display: flex; - // align-items: center; - // text-decoration: none; - // // padding: 0px 16px 0px 16px; - // flex-shrink: 0; - - // > img { - // height: 60px; - // margin: 0; - // } - // > p { - // font-size: 23px; - // color: vars.$black; - // margin-left: 4px; - // margin-bottom: 2px; - // } - // } - // a:hover { - // cursor: pointer; - // } - - // .divider { - // display: flex; - // align-items: center; - // text-decoration: none; - // padding-right: 16px; - // span { - // font-size: 23px; - // color: vars.$black; - // margin-left: 4px; - // margin-bottom: 2px; - // } - // } - - // .navItem { - // display: flex; - // align-items: center; - // flex-flow: row nowrap; - // text-decoration: none; - // color: vars.$black; - // margin-right: 32px; - // } - - // .loginButton { - // height: 100%; - // align-self: center; - - // display: flex; - // justify-content: center; - // align-items: center; - // text-decoration: none; - - // height: 35px; - // width: 150px; - - // color: vars.$white; - // background-color: vars.$black; - // border-radius: 0.5em; - // margin-right: 32px; - - // &:hover { - // opacity: 0.85; - // transition: 0.3s; - // } - // } - // &.hidden { - // display: none; - // } - } - // toggle button for mobile menu is only visible on mobile, otherwise hidden - .toggleIcon { - position: absolute; - top: 30px; - right: 0; - width: 40px; - height: 20px; - margin: 0 30px; - padding: 0; - border: none; - background-color: vars.$white; - - // the toggle icon is composed of two bars we can separately animate between a hamburger icon and an x icon (default is hamburger, we have .open class we can toggle to rotate into the shape of an x) - .bar1 { - width: 40px; - height: 5px; - border-radius: 2px; - background-color: vars.$black; - position: absolute; - top: 1.5px; - transition: 0.3s ease-in-out all; - - &.open { - transform: rotate(-45deg) translateY(-10px); - transform-origin: top right; - } + .navLinks { + display: flex; + flex-flow: row nowrap; + justify-content: flex-start; + // finds gap size from line between points (957px, 2rem) and + // (1488px, 5rem) + gap: vars.calc-relative-size($stmw + 1px, 2rem, 1488px, 5rem); } - .bar2 { - width: 23px; - height: 5px; - border-radius: 2px; - background-color: vars.$black; - position: absolute; - right: 0; - bottom: 1.5px; - transition: 0.3s ease-in-out all; - - &.open { - width: 40px; - transform: rotate(45deg) translateY(10px); - transform-origin: bottom right; - } - } - &.hidden { + // toggle button for mobile menu is only visible on mobile, otherwise hidden + .toggleIcon { display: none; + flex-flow: column nowrap; + justify-content: flex-start; + width: 1.8125rem; + height: 2.0625rem; + padding: 0.64rem 0; + gap: 0.257813333rem; + border: none; + background-color: vars.$white; + + // the toggle icon is composed of two bars we can separately animate between a hamburger icon and an x icon (default is hamburger, we have .open class we can toggle to rotate into the shape of an x) + .bar1 { + width: 1.8125rem; + height: 0.257813333rem; + border-radius: 4px; + background-color: vars.$black; + transition: 0.3s ease-in-out all; + + &.open { + transform-origin: top right; + transform: rotate(-45deg) translateY(-0.49rem); + } + } + + .bar2 { + width: 1.8125rem; + height: 0.257813333rem; + border-radius: 4px; + background-color: vars.$black; + transition: 0.3s ease-in-out all; + + &.open { + transform-origin: bottom right; + transform: rotate(45deg) translateY(0.49rem); + } + } + + &:hover { + cursor: pointer; + } } } } .mobileNav { - width: 100vw; + width: 100%; background-color: vars.$white; - position: relative; + position: absolute; z-index: -1; display: flex; flex-flow: column nowrap; justify-content: center; align-items: center; - line-height: 300%; - transition: 0.3s ease-in-out; - // mobile menu is hidden by positioning under fixed navbar, we open it by sliding it out - // if you want to add or remove nav options, change this - margin-top: -17.5rem; + line-height: $mobileNav-line-height; + // mobile menu is hidden by positioning under fixed navbar by moving the top margin up; we open it by sliding it out w/ transition and changing margin-top to 0 + margin-top: + -1 * $num-navItems * ($mobileNav-line-height + $navItem-margin-bottom); + border-bottom: $bottom-border-width solid vars.$proj-blue; + transition: margin-top 0.3s ease-in-out; + + a { + text-decoration: none; + } + &.open { margin-top: 0; } .navItem { - width: 100%; + margin-bottom: $navItem-margin-bottom; text-align: center; + font-size: 1.125rem; + font-weight: 700; color: vars.$black; - transition: 0.3s ease-in-out all; - text-decoration: underline solid transparent; + &:hover { text-decoration: underline solid currentColor; } } } +} + +// Small tablet view (956px) +@media only screen and (max-width: $stmw) { + .navbarWrapper { + .navbar { + $vert-padding: 0.72rem; - // rainbow bar is always visible below navbar, positioned to be at the bottom of the container even when mobile slides out and height changes - .rainbow { - width: 100vw; - height: 0.4em; - bottom: -0.4em; - background: linear-gradient( - 270deg, - vars.$red 0%, - vars.$orange 18.75%, - vars.$green-success 36.98%, - vars.$blue-ap 55.73%, - vars.$blue 75%, - vars.$purple 100% - ); + padding: + calc($vert-padding + 2.06rem) + 1.38rem + calc($vert-padding - $bottom-border-width); + + .right { + .navLinks { + display: none; + } + + .toggleIcon { + display: flex; + } + } + } } } diff --git a/src/components/navbar/index.tsx b/src/components/navbar/index.tsx index 2a7adfe..4297c0f 100644 --- a/src/components/navbar/index.tsx +++ b/src/components/navbar/index.tsx @@ -2,30 +2,31 @@ import Link from "next/link"; import { useEffect, useState } from "react"; -import ProjLogo from "../../../public/assets/proj_logo.png"; import s from "./Navbar.module.scss"; import { Size, useWindowSize } from "../../utils/general"; -import Banner from "../banner"; +const ProjLogo = "/assets/proj_logo.svg"; + +// Nav link properties const navLinks = [ - { href: "/", label: "Home" }, - // { href: "/", label: "Apply" }, - { href: "/about", label: "About" }, { href: "/archive", label: "Archive" }, + { href: "/resources", label: "Resources" }, { href: "/gallery", label: "Gallery" }, + { href: "/events", label: "Events" }, + { href: "/about", label: "About" }, ]; +// Main navbar component const NavigationBar: React.FC = () => { const size: Size = useWindowSize(); + // size.width !== undefined determines whether the viewport has rendered yet + const mobile = size.width !== undefined && size.width <= 956; + const [menuOpen, setMenuOpen] = useState(false); - const [mobile, setMobile] = useState(false); const toggleMenu = () => setMenuOpen(!menuOpen); - useEffect(() => { - size && size.width && setMobile(size.width <= 960); - }, [size]); - + // close the mobile menu if no longer within mobile viewport width useEffect(() => { if (!mobile) setMenuOpen(false); }, [mobile]); @@ -33,47 +34,46 @@ const NavigationBar: React.FC = () => { return (
- {/* Navbar ACM Logo */} + {/* Projects Logo */}
- ACM Logo + Projects Logo

at UC San Diego

+ + {/* Main Navbar Content */}
-
+ {/* Nav Links */} +
{navLinks.map((link, key) => (

{link.label}

))}
-
- {/* Mobile Navbar Toggle */} - + {/* Mobile Navbar Toggle */} + +
{/* Mobile Menu Dropdown */}
{navLinks.map((link, key) => ( -

setMenuOpen(false)}> +

setMenuOpen(false)}> {link.label}

))}
- - {/* Bottom Rainbow */} -
-
); }; diff --git a/src/sections/About-Projects/style.module.scss b/src/sections/About-Projects/style.module.scss index a4fdd2a..3d1f8f7 100644 --- a/src/sections/About-Projects/style.module.scss +++ b/src/sections/About-Projects/style.module.scss @@ -1,4 +1,4 @@ -@use "/src/styles/vars.scss" as vars; // allows you to use pre-defined colors +@use "../../styles/vars.scss" as vars; // allows you to use pre-defined colors .aboutSection { display: flex; diff --git a/src/sections/Photo-Gallery/style.module.scss b/src/sections/Photo-Gallery/style.module.scss index d42090f..79f0b6b 100644 --- a/src/sections/Photo-Gallery/style.module.scss +++ b/src/sections/Photo-Gallery/style.module.scss @@ -1,4 +1,4 @@ -@use "/src/styles/vars.scss" as vars; // allows you to use pre-defined color +@use "../../styles/vars.scss" as vars; // allows you to use pre-defined color .container { display: flex; diff --git a/src/styles/reset.scss b/src/styles/reset.scss index ea7b549..ba9c293 100644 --- a/src/styles/reset.scss +++ b/src/styles/reset.scss @@ -1,597 +1,599 @@ html { - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - font: 112.5%/1.45em 'DM Sans', sans-serif; - box-sizing: border-box; - overflow-y: scroll; - scroll-behavior: smooth; - } - - * { - scroll-margin-top: 88px; - } - - body { - margin: 0; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: hsla(0, 0%, 0%, 0.8); - // font-family: 'DM Sans', sans-serif; - font-weight: normal; - word-wrap: break-word; - font-kerning: normal; - -moz-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; - -ms-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; - -webkit-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; - font-feature-settings: 'kern', 'liga', 'clig', 'calt'; - } - article, - aside, - details, - figcaption, - figure, - footer, - header, - main, - menu, - nav, - section, - summary { - display: block; - } - audio, - canvas, - progress, - video { - display: inline-block; - } - audio:not([controls]) { - display: none; - height: 0; - } - progress { - vertical-align: baseline; - } - [hidden], - template { - display: none; - } - a { - background-color: transparent; - -webkit-text-decoration-skip: objects; - } - a:active, - a:hover { - outline-width: 0; - } - abbr[title] { - border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); - cursor: help; - text-decoration: none; - } - b, - strong { - font-weight: inherit; - font-weight: bolder; - } - dfn { - font-style: italic; - } - h1 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - // font-family: 'DM Sans', sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 2.25rem; - line-height: 1.1; - } - mark { - background-color: #ff0; - color: #000; - } - small { - font-size: 80%; - } - sub, - sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - } - sub { - bottom: -0.25em; - } - sup { - top: -0.5em; - } - img { - border-style: none; - max-width: 100%; - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - svg:not(:root) { - overflow: hidden; - } - code, - kbd, - pre, - samp { - font-family: monospace; - font-size: 1em; - } - figure { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - hr { - box-sizing: content-box; - overflow: visible; - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: calc(1.45rem - 1px); - background: hsla(0, 0%, 0%, 0.2); - border: none; - height: 1px; - } - button, - input, - optgroup, - select, - textarea { - font: inherit; - margin: 0; - } - optgroup { - font-weight: 700; - } - button, - input { - overflow: visible; - } - button, - select { - text-transform: none; - } - [type='reset'], - [type='submit'], - button, - html [type='button'] { - -webkit-appearance: button; - } - [type='button']::-moz-focus-inner, - [type='reset']::-moz-focus-inner, - [type='submit']::-moz-focus-inner, - button::-moz-focus-inner { - border-style: none; - padding: 0; - } - [type='button']:-moz-focusring, - [type='reset']:-moz-focusring, - [type='submit']:-moz-focusring, - button:-moz-focusring { - outline: 1px dotted ButtonText; - } - fieldset { - border: 1px solid silver; - padding: 0.35em 0.625em 0.75em; - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - legend { - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; - } - textarea { - overflow: auto; - } - [type='checkbox'], - [type='radio'] { - box-sizing: border-box; - padding: 0; - } - [type='number']::-webkit-inner-spin-button, - [type='number']::-webkit-outer-spin-button { - height: auto; - } - [type='search'] { - -webkit-appearance: textfield; - outline-offset: -2px; - } - [type='search']::-webkit-search-cancel-button, - [type='search']::-webkit-search-decoration { - -webkit-appearance: none; - } - ::-webkit-input-placeholder { - color: inherit; - opacity: 0.54; - } - ::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; - } - * { - box-sizing: inherit; - } - *:before { - box-sizing: inherit; - } - *:after { - box-sizing: inherit; - } - h2 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - // font-family: 'DM Sans', sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 1.62671rem; - line-height: 1.1; - } - h3 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - // font-family: 'DM Sans', sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 1.38316rem; - line-height: 1.1; - } - h4 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - // font-family: 'DM Sans', sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 1rem; - line-height: 1.1; - } - h5 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - // font-family: 'DM Sans', sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 0.85028rem; - line-height: 1.1; - } - h6 { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - color: inherit; - // font-family: 'DM Sans', sans-serif; - font-weight: bold; - text-rendering: optimizeLegibility; - font-size: 0.78405rem; - line-height: 1.1; - } - hgroup { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - ul { - margin-left: 1.45rem; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - list-style-position: outside; - list-style-image: none; - } - ol { - margin-left: 1.45rem; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - list-style-position: outside; - list-style-image: none; - } - dl { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - dd { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - p { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - pre { - margin-left: 0; - margin-right: 0; - margin-top: 0; - margin-bottom: 1.45rem; - font-size: 0.85rem; - line-height: 1.42; - background: hsla(0, 0%, 0%, 0.04); - border-radius: 3px; - overflow: auto; - word-wrap: normal; - padding: 1.45rem; - } - table { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - font-size: 1rem; - line-height: 1.45rem; - border-collapse: collapse; - width: 100%; - } - blockquote { - margin-left: 1.45rem; - margin-right: 1.45rem; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - form { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - noscript { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - iframe { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - address { - margin-left: 0; - margin-right: 0; - margin-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; - padding-top: 0; - margin-bottom: 1.45rem; - } - b { - font-weight: bold; - } - strong { - font-weight: bold; - } - dt { - font-weight: bold; - } - th { - font-weight: bold; - } - li { - margin-bottom: calc(1.45rem / 2); - } - ol li { - padding-left: 0; - } - ul li { - padding-left: 0; - } - li > ol { - margin-left: 1.45rem; - margin-bottom: calc(1.45rem / 2); - margin-top: calc(1.45rem / 2); - } - li > ul { - margin-left: 1.45rem; - margin-bottom: calc(1.45rem / 2); - margin-top: calc(1.45rem / 2); - } - blockquote *:last-child { - margin-bottom: 0; - } - li *:last-child { - margin-bottom: 0; - } - p *:last-child { - margin-bottom: 0; - } - li > p { - margin-bottom: calc(1.45rem / 2); - } - code { - font-size: 0.85rem; - line-height: 1.45rem; - } - kbd { - font-size: 0.85rem; - line-height: 1.45rem; - } - samp { - font-size: 0.85rem; - line-height: 1.45rem; - } - abbr { - border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); - cursor: help; - } - acronym { - border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); - cursor: help; - } - thead { - text-align: left; - } - td, - th { - text-align: left; - border-bottom: 1px solid hsla(0, 0%, 0%, 0.12); - font-feature-settings: 'tnum'; - -moz-font-feature-settings: 'tnum'; - -ms-font-feature-settings: 'tnum'; - -webkit-font-feature-settings: 'tnum'; - padding-left: 0.96667rem; - padding-right: 0.96667rem; - padding-top: 0.725rem; - padding-bottom: calc(0.725rem - 1px); - } - th:first-child, - td:first-child { - padding-left: 0; - } - th:last-child, - td:last-child { - padding-right: 0; - } - tt, - code { - background-color: hsla(0, 0%, 0%, 0.04); - border-radius: 3px; - font-family: 'SFMono-Regular', Consolas, 'Roboto Mono', 'Droid Sans Mono', 'Liberation Mono', Menlo, Courier, - monospace; - padding: 0; - padding-top: 0.2em; - padding-bottom: 0.2em; - } - pre code { - background: none; - line-height: 1.42; - } - code:before, - code:after, - tt:before, - tt:after { - letter-spacing: -0.2em; - content: ' '; - } - pre code:before, - pre code:after, - pre tt:before, - pre tt:after { - content: ''; - } - @media only screen and (max-width: 480px) { - html { - font-size: 100%; - } - } \ No newline at end of file + min-width: 320px; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + font: 112.5%/1.45em 'DM Sans', sans-serif; + box-sizing: border-box; + overflow-y: scroll; + scroll-behavior: smooth; +} + +* { + scroll-margin-top: 88px; +} + +body { + min-width: 320px; + margin: 0; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: hsla(0, 0%, 0%, 0.8); + // font-family: 'DM Sans', sans-serif; + font-weight: normal; + word-wrap: break-word; + font-kerning: normal; + -moz-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; + -ms-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; + -webkit-font-feature-settings: 'kern', 'liga', 'clig', 'calt'; + font-feature-settings: 'kern', 'liga', 'clig', 'calt'; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; +} +audio:not([controls]) { + display: none; + height: 0; +} +progress { + vertical-align: baseline; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} +a:active, +a:hover { + outline-width: 0; +} +abbr[title] { + border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); + cursor: help; + text-decoration: none; +} +b, +strong { + font-weight: inherit; + font-weight: bolder; +} +dfn { + font-style: italic; +} +h1 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + // font-family: 'DM Sans', sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 2.25rem; + line-height: 1.1; +} +mark { + background-color: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +img { + border-style: none; + max-width: 100%; + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +svg:not(:root) { + overflow: hidden; +} +code, +kbd, +pre, +samp { + font-family: monospace; + font-size: 1em; +} +figure { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +hr { + box-sizing: content-box; + overflow: visible; + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: calc(1.45rem - 1px); + background: hsla(0, 0%, 0%, 0.2); + border: none; + height: 1px; +} +button, +input, +optgroup, +select, +textarea { + font: inherit; + margin: 0; +} +optgroup { + font-weight: 700; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +[type='reset'], +[type='submit'], +button, +html [type='button'] { + -webkit-appearance: button; +} +[type='button']::-moz-focus-inner, +[type='reset']::-moz-focus-inner, +[type='submit']::-moz-focus-inner, +button::-moz-focus-inner { + border-style: none; + padding: 0; +} +[type='button']:-moz-focusring, +[type='reset']:-moz-focusring, +[type='submit']:-moz-focusring, +button:-moz-focusring { + outline: 1px dotted ButtonText; +} +fieldset { + border: 1px solid silver; + padding: 0.35em 0.625em 0.75em; + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; +} +textarea { + overflow: auto; +} +[type='checkbox'], +[type='radio'] { + box-sizing: border-box; + padding: 0; +} +[type='number']::-webkit-inner-spin-button, +[type='number']::-webkit-outer-spin-button { + height: auto; +} +[type='search'] { + -webkit-appearance: textfield; + outline-offset: -2px; +} +[type='search']::-webkit-search-cancel-button, +[type='search']::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} +::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; +} +* { + box-sizing: inherit; +} +*:before { + box-sizing: inherit; +} +*:after { + box-sizing: inherit; +} +h2 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + // font-family: 'DM Sans', sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1.62671rem; + line-height: 1.1; +} +h3 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + // font-family: 'DM Sans', sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1.38316rem; + line-height: 1.1; +} +h4 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + // font-family: 'DM Sans', sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1rem; + line-height: 1.1; +} +h5 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + // font-family: 'DM Sans', sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 0.85028rem; + line-height: 1.1; +} +h6 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + // font-family: 'DM Sans', sans-serif; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 0.78405rem; + line-height: 1.1; +} +hgroup { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +ul { + margin-left: 1.45rem; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + list-style-position: outside; + list-style-image: none; +} +ol { + margin-left: 1.45rem; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + list-style-position: outside; + list-style-image: none; +} +dl { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +dd { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +p { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +pre { + margin-left: 0; + margin-right: 0; + margin-top: 0; + margin-bottom: 1.45rem; + font-size: 0.85rem; + line-height: 1.42; + background: hsla(0, 0%, 0%, 0.04); + border-radius: 3px; + overflow: auto; + word-wrap: normal; + padding: 1.45rem; +} +table { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + font-size: 1rem; + line-height: 1.45rem; + border-collapse: collapse; + width: 100%; +} +blockquote { + margin-left: 1.45rem; + margin-right: 1.45rem; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +form { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +noscript { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +iframe { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +address { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; +} +b { + font-weight: bold; +} +strong { + font-weight: bold; +} +dt { + font-weight: bold; +} +th { + font-weight: bold; +} +li { + margin-bottom: calc(1.45rem / 2); +} +ol li { + padding-left: 0; +} +ul li { + padding-left: 0; +} +li > ol { + margin-left: 1.45rem; + margin-bottom: calc(1.45rem / 2); + margin-top: calc(1.45rem / 2); +} +li > ul { + margin-left: 1.45rem; + margin-bottom: calc(1.45rem / 2); + margin-top: calc(1.45rem / 2); +} +blockquote *:last-child { + margin-bottom: 0; +} +li *:last-child { + margin-bottom: 0; +} +p *:last-child { + margin-bottom: 0; +} +li > p { + margin-bottom: calc(1.45rem / 2); +} +code { + font-size: 0.85rem; + line-height: 1.45rem; +} +kbd { + font-size: 0.85rem; + line-height: 1.45rem; +} +samp { + font-size: 0.85rem; + line-height: 1.45rem; +} +abbr { + border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); + cursor: help; +} +acronym { + border-bottom: 1px dotted hsla(0, 0%, 0%, 0.5); + cursor: help; +} +thead { + text-align: left; +} +td, +th { + text-align: left; + border-bottom: 1px solid hsla(0, 0%, 0%, 0.12); + font-feature-settings: 'tnum'; + -moz-font-feature-settings: 'tnum'; + -ms-font-feature-settings: 'tnum'; + -webkit-font-feature-settings: 'tnum'; + padding-left: 0.96667rem; + padding-right: 0.96667rem; + padding-top: 0.725rem; + padding-bottom: calc(0.725rem - 1px); +} +th:first-child, +td:first-child { + padding-left: 0; +} +th:last-child, +td:last-child { + padding-right: 0; +} +tt, +code { + background-color: hsla(0, 0%, 0%, 0.04); + border-radius: 3px; + font-family: 'SFMono-Regular', Consolas, 'Roboto Mono', 'Droid Sans Mono', 'Liberation Mono', Menlo, Courier, + monospace; + padding: 0; + padding-top: 0.2em; + padding-bottom: 0.2em; +} +pre code { + background: none; + line-height: 1.42; +} +code:before, +code:after, +tt:before, +tt:after { + letter-spacing: -0.2em; + content: ' '; +} +pre code:before, +pre code:after, +pre tt:before, +pre tt:after { + content: ''; +} +@media only screen and (max-width: 480px) { + html { + font-size: 100%; + } +} \ No newline at end of file diff --git a/src/styles/vars.scss b/src/styles/vars.scss index 2b8ca23..d401e69 100644 --- a/src/styles/vars.scss +++ b/src/styles/vars.scss @@ -9,10 +9,35 @@ $red-warning: #ac303e; $green-success: #30ac9e; $blue-ap: #68b4fc; $blue-dark: #001d36; -$dark-grey: #8d8d8d; +$dark-gray: #8d8d8d; $hover-blue: #7cbdff; $turquoise: #51c0c0; $purple: #816dff; $black: #333333; $acm-blue-30: #a8d3ff; $acm-blue: #62b0ff; +$proj-blue: #5777C0; +$footer-blue: #4E78C6; + +// find the size relative to the viewport width between a min and max size +// size is calculated using a linear function between two points +// x-axis/input: viewport width (px) +// y-axis/output: size (rem) +@function calc-relative-size($minVW, $minSize, $maxVW, $maxSize) { + @return clamp( + $minSize, + calc( + /* relativeSize = (% of progress on line) * (change in size) + minSize */ + /* calculate fraction of progress between max and min viewport widths + relative to the current viewport width */ + ((100vw - #{$minVW}) / (#{$maxVW} - #{$minVW})) + /* multiply the fraction by the change in size between the max and min + sizes */ + * (#{$maxSize} - #{$minSize}) + /* add the min size to get the final size relative to the progress made + on the line between the min and max viewport widths */ + + #{$minSize} + ), + $maxSize + ); +} diff --git a/tsconfig.json b/tsconfig.json index c714696..b09cc80 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "es5", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -11,7 +15,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "plugins": [ { @@ -19,9 +23,19 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": [ + "./*" + ] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } From f40d8331c9fce43bb9b7f2e4cdcccb6456a1745b Mon Sep 17 00:00:00 2001 From: Toby Chin <92127289+spagechi@users.noreply.github.com> Date: Sun, 25 Jan 2026 16:38:28 -0800 Subject: [PATCH 2/4] attempt vercel deployment error fix --- .github/workflows/pr.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index e2a2fab..0fd6c58 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -7,6 +7,10 @@ jobs: Linux: runs-on: ubuntu-latest steps: + - name: Setup Node + uses: actions/setup-node@v1 + with: + node-version: 22.20.0 - name: Clone uses: actions/checkout@v2 - name: Install dependencies From 8c2840e104196d0fa3fdfba6169c64bbce1ad152 Mon Sep 17 00:00:00 2001 From: Toby Chin <92127289+spagechi@users.noreply.github.com> Date: Mon, 26 Jan 2026 16:21:38 -0800 Subject: [PATCH 3/4] add construction page to WIP pages --- app/events/page.tsx | 20 ++++++++++++++++++++ app/resources/page.tsx | 20 ++++++++++++++++++++ src/sections/WIP-Page/index.tsx | 12 ++++++++++++ src/sections/WIP-Page/styles.module.scss | 9 +++++++++ 4 files changed, 61 insertions(+) create mode 100644 app/events/page.tsx create mode 100644 app/resources/page.tsx create mode 100644 src/sections/WIP-Page/index.tsx create mode 100644 src/sections/WIP-Page/styles.module.scss diff --git a/app/events/page.tsx b/app/events/page.tsx new file mode 100644 index 0000000..c02c6be --- /dev/null +++ b/app/events/page.tsx @@ -0,0 +1,20 @@ +"use client" +import type { NextPage } from 'next'; +import '@/src/styles/reset.scss'; + +import WIP from "@/src/sections/WIP-Page"; +import NavigationBar from '@/src/components/navbar'; +import Footer from '@/src/components/footer' +// here we will compile all the sections of the website together + +const EventsPage: NextPage = () => { + return ( +
+ + +
+
+ ); +}; + +export default EventsPage; \ No newline at end of file diff --git a/app/resources/page.tsx b/app/resources/page.tsx new file mode 100644 index 0000000..d5d17ab --- /dev/null +++ b/app/resources/page.tsx @@ -0,0 +1,20 @@ +"use client" +import type { NextPage } from 'next'; +import '@/src/styles/reset.scss'; + +import WIP from "@/src/sections/WIP-Page"; +import NavigationBar from '@/src/components/navbar'; +import Footer from '@/src/components/footer' +// here we will compile all the sections of the website together + +const ResourcesPage: NextPage = () => { + return ( +
+ + +
+
+ ); +}; + +export default ResourcesPage; \ No newline at end of file diff --git a/src/sections/WIP-Page/index.tsx b/src/sections/WIP-Page/index.tsx new file mode 100644 index 0000000..6007eb8 --- /dev/null +++ b/src/sections/WIP-Page/index.tsx @@ -0,0 +1,12 @@ +"use client"; +import s from './styles.module.scss'; + +const WIP: React.FC = () => { + return ( +
+

Sorry, this page is under construction.

+
+ ); +}; + +export default WIP; \ No newline at end of file diff --git a/src/sections/WIP-Page/styles.module.scss b/src/sections/WIP-Page/styles.module.scss new file mode 100644 index 0000000..1621805 --- /dev/null +++ b/src/sections/WIP-Page/styles.module.scss @@ -0,0 +1,9 @@ +.WIPNotice { + display: flex; + justify-content: center; + padding: 8rem; + + h1 { + margin: 0; + } +} \ No newline at end of file From 41cef83f7a8a4ba11397402199832871a6fa2180 Mon Sep 17 00:00:00 2001 From: Angela Hu Date: Mon, 9 Feb 2026 17:20:45 -0800 Subject: [PATCH 4/4] Fixing node deployment --- src/sections/Photo-Gallery/NextJsImage.tsx | 32 ++-- src/sections/Photo-Gallery/index.tsx | 173 ++++++++++----------- 2 files changed, 101 insertions(+), 104 deletions(-) diff --git a/src/sections/Photo-Gallery/NextJsImage.tsx b/src/sections/Photo-Gallery/NextJsImage.tsx index d2cc0d4..b71dbd5 100644 --- a/src/sections/Photo-Gallery/NextJsImage.tsx +++ b/src/sections/Photo-Gallery/NextJsImage.tsx @@ -1,22 +1,22 @@ import Image from "next/image"; import type { RenderPhotoProps } from "react-photo-album"; -import { CldImage } from 'next-cloudinary'; -import s from "./style.module.scss" +import { CldImage } from "next-cloudinary"; +import s from "./style.module.scss"; export default function NextJsImage({ - photo, - imageProps: { alt, title, sizes, className, onClick }, - wrapperStyle, + photo, + imageProps: { alt, title, sizes, className, onClick }, + wrapperStyle, }: RenderPhotoProps) { - return ( -
- -
- ); + return ( +
+ +
+ ); } diff --git a/src/sections/Photo-Gallery/index.tsx b/src/sections/Photo-Gallery/index.tsx index 930a10b..290d928 100644 --- a/src/sections/Photo-Gallery/index.tsx +++ b/src/sections/Photo-Gallery/index.tsx @@ -2,106 +2,103 @@ import React, { useState, useEffect } from "react"; import s from "./style.module.scss"; -import PhotoAlbum from "react-photo-album"; +import PhotoAlbum, { Photo } from "react-photo-album"; import NextJsImage from "./NextJsImage"; const qtr_yr = [ - {value:"wtr_23", text: "Winter 2023", length: 16}, - {value: "spr_23", text: "Spring 2023", length: 24, vertical:[7, 24, 22]}, - // {value: "sum_23", text: "Summer 2023", length: 1} -] + { value: "wtr_23", text: "Winter 2023", length: 16 }, + { value: "spr_23", text: "Spring 2023", length: 24, vertical: [7, 24, 22] }, + // {value: "sum_23", text: "Summer 2023", length: 1} +]; const breakpoints = [1080, 640, 384, 256, 128, 96, 64, 48]; -type Photo = { - src: string; - width: number; - height: number; - srcSet: { - src: string; - width: number; - height: number; - }[]; - }; - const options = qtr_yr.map((option, index) => { - return -}) + return ( + + ); +}); const PhotoGallery: React.FC = () => { - const [selectedOption, setSelectedOption] = useState(qtr_yr[0].value); + const [selectedOption, setSelectedOption] = useState(qtr_yr[0].value); + + const handleChange = (e: React.ChangeEvent) => { + setSelectedOption(e.target.value); + }; + const [photos, setPhotos] = useState([]); - const handleChange = (e: React.ChangeEvent) => { - setSelectedOption(e.target.value); + useEffect(() => { + const rawPhotos = []; + //here i am trying to read the dimensions of the image from cloudinary, but doesn't work + // const cloudinary = require('cloudinary').v2; + // cloudinary.config({ + // cloud_name: 'dgnecfapo', + // api_key: '', + // api_secret: '' + // }); + const selectedQtrYr = qtr_yr.find((q) => q.value === selectedOption); + const numPhotos = selectedQtrYr?.length ?? 0; + const indexVertical = selectedQtrYr?.vertical ?? []; + for (let i = 1; i <= numPhotos; i++) { + const newPhoto = { + src: `${selectedOption}_showcase_${i}.jpg`, + width: 4032, + height: 3024, + }; + if (indexVertical.includes(i)) { + newPhoto.width = 4000; + newPhoto.height = 6000; + } + // trying to dynamically read the images from cloudinary + // cloudinary.uploader.explicit(newPhoto.src, {type: 'fetch'}, function(error: string, result: any) { + // newPhoto.width = result.width; + // newPhoto.height = result.height; + // }); + rawPhotos.push(newPhoto); } - const [photos, setPhotos] = useState([]); - useEffect(() => { - const rawPhotos = []; - //here i am trying to read the dimensions of the image from cloudinary, but doesn't work - // const cloudinary = require('cloudinary').v2; - // cloudinary.config({ - // cloud_name: 'dgnecfapo', - // api_key: '', - // api_secret: '' - // }); - const selectedQtrYr = qtr_yr.find(q => q.value === selectedOption); - const numPhotos = selectedQtrYr?.length ?? 0; - const indexVertical = selectedQtrYr?.vertical ?? []; - for (let i = 1; i <= numPhotos; i++) { - const newPhoto = {src: `${selectedOption}_showcase_${i}.jpg`, width:4032, height:3024}; - if (indexVertical.includes(i)) { - newPhoto.width = 4000; - newPhoto.height = 6000; - } - // trying to dynamically read the images from cloudinary - // cloudinary.uploader.explicit(newPhoto.src, {type: 'fetch'}, function(error: string, result: any) { - // newPhoto.width = result.width; - // newPhoto.height = result.height; - // }); - rawPhotos.push(newPhoto); - } + const updatedPhotos = rawPhotos.map((photo) => ({ + src: photo.src, + width: photo.width, + height: photo.height, + srcSet: breakpoints.map((breakpoint) => { + const height = Math.round((photo.height / photo.width) * breakpoint); + return { + src: photo.src, + width: breakpoint, + height, + }; + }), + })); - const updatedPhotos = rawPhotos.map((photo) => ({ - src: photo.src, - width: photo.width, - height: photo.height, - srcSet: breakpoints.map((breakpoint) => { - const height = Math.round((photo.height / photo.width) * breakpoint); - return { - src: photo.src, - width: breakpoint, - height, - }; - }), - })); + setPhotos(updatedPhotos); + }, [selectedOption]); - setPhotos(updatedPhotos); - }, [selectedOption]); + return ( + <> + - return ( - <> - - - - - ); -} + + + ); +}; -export default PhotoGallery; \ No newline at end of file +export default PhotoGallery;