Skip to content
Merged
Show file tree
Hide file tree
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] May 9, 2026
5ef558b
Address PR comments: revert firebase.json and update Makefile/workflow
google-labs-jules[bot] May 9, 2026
09b01f9
Rename deploy-dev to preview in Makefile and workflow
google-labs-jules[bot] May 9, 2026
d021313
Use area-to-skills map for unified filtering
google-labs-jules[bot] May 9, 2026
79674fe
Reduce Cognitive Complexity and cleanup test-results
google-labs-jules[bot] May 9, 2026
a5fe76a
Refine section headings and sticky filter bar layout
google-labs-jules[bot] May 9, 2026
8e88cbe
Implement modal-based unified filtering in bottom bar
google-labs-jules[bot] May 9, 2026
8cfc6db
Reorganize section components into a dedicated folder
google-labs-jules[bot] May 9, 2026
8ac85c3
Final UI refinements for unified single-page portfolio
google-labs-jules[bot] May 10, 2026
7736107
Fix filter bar visibility and dark mode button colors
google-labs-jules[bot] May 10, 2026
1292241
Refine header navigation and scroll behavior
google-labs-jules[bot] May 10, 2026
0ebba9d
Disable education search filtering and add empty states
google-labs-jules[bot] May 10, 2026
aeaf8c1
Redesign portfolio into unified single-page with cross-filtering
google-labs-jules[bot] May 10, 2026
411a0cd
Address PR feedback: reorder sections and fix accessibility
google-labs-jules[bot] May 10, 2026
e3a6d0c
Refine section layout and fix GitHub links
google-labs-jules[bot] May 10, 2026
c7bd1b4
Fix cross-section skill filtering
google-labs-jules[bot] May 10, 2026
c1d85f7
Remove deleted pages from sitemap
amrabed May 10, 2026
055039c
drop preview workflow
amrabed May 10, 2026
2366273
Update dependencies
amrabed May 10, 2026
b165906
Remove deleted page folders
amrabed May 10, 2026
5d9a3db
Fix mobile-menu background
amrabed May 10, 2026
a0062b2
Simplify GitHub link
amrabed May 10, 2026
2b6900d
Address sonar issues
amrabed May 10, 2026
2169a9d
Update hero section
amrabed May 10, 2026
ec03dce
Update about section
amrabed May 10, 2026
e1f7247
Fix hero loading
amrabed May 10, 2026
ebdff26
Use arrow down for mobile menu
amrabed May 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ deploy: build
firebase deploy --only hosting

clean:
rm -rf node_modules .next out
rm -rf node_modules .next out
Comment thread
amrabed marked this conversation as resolved.
26 changes: 13 additions & 13 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added public/amrabed.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ div {

/* Section */
.section {
@apply min-h-[100vh] w-full flex flex-col overflow-x-hidden content-evenly items-center justify-evenly shadow-sm overflow-hidden;
@apply h-fit w-full flex flex-col overflow-x-hidden content-start items-center justify-start shadow-sm overflow-hidden;
}

.section-heading {
Expand Down
134 changes: 52 additions & 82 deletions src/app/page.tsx
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;
13 changes: 0 additions & 13 deletions src/app/positions/layout.tsx

This file was deleted.

53 changes: 0 additions & 53 deletions src/app/positions/page.tsx

This file was deleted.

13 changes: 0 additions & 13 deletions src/app/projects/layout.tsx

This file was deleted.

63 changes: 0 additions & 63 deletions src/app/projects/page.tsx

This file was deleted.

12 changes: 0 additions & 12 deletions src/app/sitemap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,6 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
changeFrequency: "yearly",
priority: 1,
},
{
url: "https://amrabed.com/projects",
lastModified: new Date(),
changeFrequency: "yearly",
priority: 0.8,
},
{
url: "https://amrabed.com/positions",
lastModified: new Date(),
changeFrequency: "yearly",
priority: 0.5,
},
];

try {
Expand Down
Loading