-
Notifications
You must be signed in to change notification settings - Fork 0
Redesign portfolio into a unified single-page experience #48
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
7e19cf6
Redesign portfolio into a unified single-page experience
google-labs-jules[bot] 5ef558b
Address PR comments: revert firebase.json and update Makefile/workflow
google-labs-jules[bot] 09b01f9
Rename deploy-dev to preview in Makefile and workflow
google-labs-jules[bot] d021313
Use area-to-skills map for unified filtering
google-labs-jules[bot] 79674fe
Reduce Cognitive Complexity and cleanup test-results
google-labs-jules[bot] a5fe76a
Refine section headings and sticky filter bar layout
google-labs-jules[bot] 8e88cbe
Implement modal-based unified filtering in bottom bar
google-labs-jules[bot] 8cfc6db
Reorganize section components into a dedicated folder
google-labs-jules[bot] 8ac85c3
Final UI refinements for unified single-page portfolio
google-labs-jules[bot] 7736107
Fix filter bar visibility and dark mode button colors
google-labs-jules[bot] 1292241
Refine header navigation and scroll behavior
google-labs-jules[bot] 0ebba9d
Disable education search filtering and add empty states
google-labs-jules[bot] aeaf8c1
Redesign portfolio into unified single-page with cross-filtering
google-labs-jules[bot] 411a0cd
Address PR feedback: reorder sections and fix accessibility
google-labs-jules[bot] e3a6d0c
Refine section layout and fix GitHub links
google-labs-jules[bot] c7bd1b4
Fix cross-section skill filtering
google-labs-jules[bot] c1d85f7
Remove deleted pages from sitemap
amrabed 055039c
drop preview workflow
amrabed 2366273
Update dependencies
amrabed b165906
Remove deleted page folders
amrabed 5d9a3db
Fix mobile-menu background
amrabed a0062b2
Simplify GitHub link
amrabed 2b6900d
Address sonar issues
amrabed 2169a9d
Update hero section
amrabed ec03dce
Update about section
amrabed e1f7247
Fix hero loading
amrabed ebdff26
Use arrow down for mobile menu
amrabed File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -21,4 +21,4 @@ deploy: build | |
| firebase deploy --only hosting | ||
|
|
||
| clean: | ||
| rm -rf node_modules .next out | ||
| rm -rf node_modules .next out | ||
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,92 +1,62 @@ | ||
| import dynamic from "next/dynamic"; | ||
| import Image from "next/image"; | ||
| "use client"; | ||
|
|
||
| import { useEffect, useState } from "react"; | ||
|
|
||
| import { Banner } from "@/components/banner"; | ||
| import { MainHeader } from "@/components/header"; | ||
| import { Section } from "@/components/section"; | ||
| import certificates from "@/data/certifications"; | ||
| import degrees from "@/data/degrees"; | ||
| import skills from "@/data/skills"; | ||
| import type { Certification, Degree, Skill } from "@/types"; | ||
| import "@/types"; | ||
| import Intro from "@/components/sections/hero"; | ||
| import { AboutSection } from "@/components/sections/about"; | ||
| import { CertificationsSection } from "@/components/sections/certifications"; | ||
| import { EducationSection } from "@/components/sections/education"; | ||
| import { ExperienceSection } from "@/components/sections/experience"; | ||
| import { ProjectsSection } from "@/components/sections/projects"; | ||
| import { SkillsSection } from "@/components/sections/skills"; | ||
| import { UnifiedFilterBar } from "@/components/unified-filter-bar"; | ||
|
|
||
| const Home = () => { | ||
| const [showFilter, setShowFilter] = useState(false); | ||
|
|
||
| const Intro = dynamic(() => import("@/components/intro")); | ||
| useEffect(() => { | ||
| const handleScroll = () => { | ||
| const skillsSection = document.getElementById("skills"); | ||
| const experienceSection = document.getElementById("experience"); | ||
|
|
||
| const Skills = () => ( | ||
| <Section id="skills" title="Technical Skills"> | ||
| {Object.values(skills).map((skill: Skill) => ( | ||
| <div | ||
| className="transition-all duration-700 section-item md:py-5 w-[120px] md:w-[150px]" | ||
| key={skill.name} | ||
| > | ||
| <p className="md:text-4xl text-2xl">{skill.icon}</p> | ||
| <p>{skill.name}</p> | ||
| </div> | ||
| ))} | ||
| </Section> | ||
| ); | ||
| if (skillsSection && experienceSection) { | ||
| const skillsTop = skillsSection.offsetTop; | ||
| const experienceBottom = | ||
| experienceSection.offsetTop + experienceSection.offsetHeight; | ||
|
|
||
| const Certifications = () => ( | ||
| <Section id="certifications" title="Certifications"> | ||
| {certificates.map((certificate: Certification) => ( | ||
| <div className="transition-all duration-700" key={certificate.title}> | ||
| <a href={certificate.link} target="_blank" rel="noopener noreferrer"> | ||
| <div className="section-item p-3"> | ||
| <Image | ||
| src={certificate.badge} | ||
| alt={`Badge for ${certificate.title}`} | ||
| width={150} | ||
| height={150} | ||
| /> | ||
| <p className="md:text-xl text-foreground">{certificate.title}</p> | ||
| <p className="text-primary">{certificate.organization.name}</p> | ||
| <p className="text-secondary">{certificate.date}</p> | ||
| </div> | ||
| </a> | ||
| </div> | ||
| ))} | ||
| </Section> | ||
| ); | ||
| // Show filter bar when between skills top and experience bottom | ||
| // Adjusted to hide when reaching the About section | ||
| setShowFilter( | ||
| window.scrollY > skillsTop - 200 && | ||
| window.scrollY + window.innerHeight < experienceBottom + 100, | ||
| ); | ||
| } | ||
| }; | ||
|
|
||
| const Degrees = () => ( | ||
| <Section id="degrees" title="Education"> | ||
| {degrees.map((degree: Degree) => ( | ||
| <div className="transition-all duration-700 gap-6" key={degree.title}> | ||
| <a | ||
| href={degree.university.url} | ||
| target="_blank" | ||
| rel="noopener noreferrer" | ||
| > | ||
| <div className="section-item p-3"> | ||
| <Image | ||
| src={degree.university.logo ?? ""} | ||
| alt={`${degree.university.name} logo`} | ||
| height={150} | ||
| width={150} | ||
| /> | ||
| <p className="text-xl md:text-2xl text-foreground"> | ||
| {degree.title} | ||
| </p> | ||
| <p className="dark:text-primary-dark text-primary"> | ||
| {degree.university.name} | ||
| </p> | ||
| <p className="text-secondary">{degree.duration}</p> | ||
| </div> | ||
| </a> | ||
| </div> | ||
| ))} | ||
| </Section> | ||
| ); | ||
| window.addEventListener("scroll", handleScroll); | ||
| return () => window.removeEventListener("scroll", handleScroll); | ||
| }, []); | ||
|
|
||
| const Home = () => ( | ||
| <> | ||
| <Banner /> | ||
| <MainHeader /> | ||
| <Intro /> | ||
| <Skills /> | ||
| <Certifications /> | ||
| <Degrees /> | ||
| </> | ||
| ); | ||
| return ( | ||
| <div className="flex flex-col min-h-screen"> | ||
| <Banner /> | ||
| <MainHeader /> | ||
| <Intro /> | ||
| <main className="flex-grow"> | ||
| <div className="space-y-0"> | ||
| <SkillsSection /> | ||
| <CertificationsSection /> | ||
| <ProjectsSection /> | ||
| <ExperienceSection /> | ||
| <EducationSection /> | ||
| <AboutSection /> | ||
| </div> | ||
| </main> | ||
| {showFilter && <UnifiedFilterBar />} | ||
| </div> | ||
| ); | ||
| }; | ||
|
|
||
| export default Home; |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.