Skip to content

Commit e30e624

Browse files
author
marcus
committed
feat(portfolio): redesign landing page sections and navv bar
1 parent 3a9bf94 commit e30e624

11 files changed

Lines changed: 1395 additions & 504 deletions

File tree

.impeccable.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## Design Context
2+
3+
### Users
4+
This portfolio serves three audiences at once: recruiters scanning for clear evidence of capability, clients evaluating taste and execution quality, and engineering peers assessing technical depth. The landing page should help each audience quickly understand Marcus as someone who can both ship production systems and shape polished frontend experiences.
5+
6+
### Brand Personality
7+
Modern, creative, attractive. The interface should project sharp competence first, then reveal creative range through layout, typography, and interaction detail. It should feel intentional, contemporary, and confidently designed rather than playful for its own sake.
8+
9+
### Aesthetic Direction
10+
Lean into an editorial-meets-technical visual language: strong typography, asymmetrical compositions, warm amber accents, cool supporting tones, and tactile surface treatment that feels custom rather than generated. Support both light and dark themes. The work should explicitly avoid generic AI-generated aesthetics, especially repetitive card grids, default gradients, and safe templated compositions.
11+
12+
### Design Principles
13+
1. Lead with competence: every section should communicate clarity, credibility, and production readiness before decoration.
14+
2. Show creative range through composition: use asymmetry, scale shifts, and varied visual rhythm instead of repetitive modules.
15+
3. Keep the interface unmistakably authored: avoid anything that looks like stock AI portfolio output.
16+
4. Let typography do the heavy lifting: use the existing display type confidently and preserve a clear reading hierarchy.
17+
5. Use motion and accent color sparingly but deliberately: every flourish should reinforce craft, not distract from it.

app/components/MobileMenu.tsx

Lines changed: 77 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,56 +4,95 @@ import { Camera, CircleUserRound, FolderKanban, Newspaper, X } from "lucide-reac
44
import Link from "next/link";
55
import Logo from "./Logo";
66

7+
const navItems = [
8+
{
9+
title: "About",
10+
href: "/about",
11+
icon: CircleUserRound,
12+
},
13+
{
14+
title: "Projects",
15+
href: "/projects",
16+
icon: FolderKanban,
17+
},
18+
{
19+
title: "Blog",
20+
href: "/blog",
21+
icon: Newspaper,
22+
},
23+
{
24+
title: "Photos",
25+
href: "/photos",
26+
icon: Camera,
27+
},
28+
];
29+
730
export default function MobileMenu() {
8-
const data = [
9-
{
10-
title: "About",
11-
href: "/about",
12-
icon: CircleUserRound,
13-
},
14-
{
15-
title: "Projects",
16-
href: "/projects",
17-
icon: FolderKanban,
18-
},
19-
{
20-
title: "Blog",
21-
href: "/blog",
22-
icon: Newspaper,
23-
},
24-
{
25-
title: "Photos",
26-
href: "/photos",
27-
icon: Camera,
28-
},
29-
];
3031
return (
31-
<div>
32-
<div className="w-full flex items-center justify-between text-sm py-6 md:px-16 px-6 border-b z-30">
33-
<Link href={"/"}>
32+
<div className="flex min-h-screen flex-col">
33+
<div className="flex items-center justify-between border-b border-border/70 px-6 py-5">
34+
<Link href="/" className="flex items-center gap-3">
3435
<Logo />
3536
</Link>
36-
<SheetClose>
37-
<Button variant="outline" size="icon" className="rounded-full w-10 h-10">
37+
38+
<SheetClose asChild>
39+
<Button variant="outline" size="icon" className="h-10 w-10 rounded-full">
3840
<X />
3941
</Button>
4042
</SheetClose>
4143
</div>
4244

43-
<div className="grid gap-4 p-4">
44-
{data.map((item) => {
45-
return (
45+
<div
46+
aria-hidden="true"
47+
className="pointer-events-none absolute inset-x-0 top-0 h-[28rem] opacity-90"
48+
style={{
49+
background:
50+
"radial-gradient(circle at 18% 12%, color-mix(in oklch, var(--primary) 16%, transparent), transparent 28%), radial-gradient(circle at 82% 18%, color-mix(in oklch, var(--secondary) 14%, transparent), transparent 28%)",
51+
}}
52+
/>
53+
54+
<div className="relative flex flex-1 flex-col justify-between px-6 py-8">
55+
<div className="space-y-3">
56+
{navItems.map((item) => {
57+
const Icon = item.icon;
58+
59+
return (
60+
<SheetClose asChild key={item.href}>
61+
<Link
62+
href={item.href}
63+
prefetch={false}
64+
className="group flex items-center justify-between border-b border-border/65 py-4"
65+
>
66+
<div className="flex items-center gap-3">
67+
<span className="inline-flex h-11 w-11 items-center justify-center rounded-full border border-border/70 bg-background/70 text-muted-foreground transition-colors group-hover:text-foreground">
68+
<Icon className="h-5 w-5" />
69+
</span>
70+
<span className="font-incognito text-[2rem] leading-none tracking-[-0.03em]">
71+
{item.title}
72+
</span>
73+
</div>
74+
<span className="text-[0.72rem] uppercase tracking-[0.22em] text-muted-foreground transition-colors group-hover:text-foreground">
75+
Open
76+
</span>
77+
</Link>
78+
</SheetClose>
79+
);
80+
})}
81+
</div>
82+
83+
<div className="space-y-4 border-t border-border/65 pt-6">
84+
<p className="max-w-sm text-sm leading-7 text-muted-foreground">
85+
Browse selected work, writing, and the rest of the portfolio from here.
86+
</p>
87+
<SheetClose asChild>
4688
<Link
47-
key={item.href}
48-
href={item.href}
49-
className="font-incognito text-sm font-medium flex gap-2 items-center"
50-
prefetch={false}
89+
href="#contact"
90+
className="inline-flex items-center gap-2 text-[0.78rem] uppercase tracking-[0.22em] text-primary"
5191
>
52-
<item.icon aria-hidden="true" />
53-
{item.title}
92+
Contact
5493
</Link>
55-
);
56-
})}
94+
</SheetClose>
95+
</div>
5796
</div>
5897
</div>
5998
);

app/components/Navbar.tsx

Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,33 @@
1-
// import Logo from "@/public/logo.png";
2-
import Link from "next/link";
3-
import Theme from "./Theme";
4-
// import UnmountStudio from "./Unmount";
51
import { Button } from "@/components/ui/button";
62
import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet";
73
import { MenuIcon } from "lucide-react";
4+
import Link from "next/link";
85
import Logo from "./Logo";
96
import MobileMenu from "./MobileMenu";
7+
import Theme from "./Theme";
108

11-
export default function Navbar() {
12-
const data = [
13-
{
14-
title: "About",
15-
href: "/about",
16-
},
17-
{
18-
title: "Projects",
19-
href: "/projects",
20-
},
21-
{
22-
title: "Blog",
23-
href: "/blog",
24-
},
25-
{
26-
title: "Photos",
27-
href: "/photos",
28-
},
29-
];
9+
const navItems = [
10+
{ title: "About", href: "/about" },
11+
{ title: "Projects", href: "/projects" },
12+
{ title: "Blog", href: "/blog" },
13+
{ title: "Photos", href: "/photos" },
14+
];
3015

16+
export default function Navbar() {
3117
return (
32-
<header className="flex justify-center items-center fixed top-3 w-full z-50 px-6">
33-
<div className="w-full max-w-6xl mx-auto items-center justify-between flex gap-1 p-2 border dark:border-white/20 border-black/20 rounded-lg bg-background/80 backdrop-blur-lg supports-[backdrop-filter]:bg-background/30 shadow-lg">
34-
<Link href="/">
18+
<header className="pointer-events-none fixed inset-x-0 top-0 z-50 px-4 pt-4 md:px-6 md:pt-5">
19+
<div className="pointer-events-auto mx-auto flex w-full max-w-6xl items-center justify-between gap-4 rounded-[1.7rem] border border-border/70 bg-background/88 px-4 py-3 shadow-[0_10px_40px_rgba(0,0,0,0.08)] backdrop-blur-xl supports-[backdrop-filter]:bg-background/72 md:px-5">
20+
<Link href="/" className="flex min-w-0 items-center gap-3">
3521
<Logo />
3622
</Link>
3723

38-
<nav className="md:block hidden">
39-
<ul className="flex items-center gap-x-8">
40-
{data.map((link, id) => (
41-
<li key={id}>
24+
<nav className="hidden md:block">
25+
<ul className="flex items-center gap-2 px-2 py-1.5">
26+
{navItems.map((link) => (
27+
<li key={link.href}>
4228
<Link
4329
href={link.href}
44-
className="font-incognito dark:text-white duration-300 text-base"
30+
className="inline-flex rounded-full px-4 py-2 text-[0.78rem] uppercase tracking-[0.22em] text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
4531
>
4632
{link.title}
4733
</Link>
@@ -50,15 +36,23 @@ export default function Navbar() {
5036
</ul>
5137
</nav>
5238

53-
<div className="flex items-center gap-4 sm:gap-0">
54-
<Theme />
39+
<div className="flex items-center gap-2">
40+
<div className="shrink-0">
41+
<Theme />
42+
</div>
43+
5544
<Sheet>
5645
<SheetTrigger asChild>
57-
<Button variant="outline" size="icon" className="rounded-full w-10 h-10 md:hidden">
46+
<Button
47+
variant="outline"
48+
size="icon"
49+
className="h-10 w-10 rounded-full md:hidden"
50+
aria-label="Open menu"
51+
>
5852
<MenuIcon />
5953
</Button>
6054
</SheetTrigger>
61-
<SheetContent className="w-screen">
55+
<SheetContent className="w-screen border-none bg-background/96 p-0 shadow-none">
6256
<MobileMenu />
6357
</SheetContent>
6458
</Sheet>

app/globals.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ html {
155155
}
156156

157157
body {
158-
background-image: url("../public/noise.png");
158+
/* background-image: url("../public/noise.png"); */
159159
overflow-x: hidden !important;
160160
}
161161

0 commit comments

Comments
 (0)