Skip to content

Commit c00bb47

Browse files
authored
Merge pull request #6 from grillinr/card-heigt
Small updates
2 parents e962886 + 7d5143d commit c00bb47

11 files changed

Lines changed: 249 additions & 37 deletions

File tree

index.html

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,26 @@
55
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
66
<meta
77
name="description"
8-
content="Nathan Grilliot portfolio, projects, and technical writing."
8+
content="Computer Science student at the University of Cincinnati (2026) building practical tools across web, data, and systems."
99
/>
10+
<meta property="og:type" content="website" />
11+
<meta property="og:url" content="https://nathangrilliot.com" />
12+
<meta property="og:title" content="Nathan Grilliot | Portfolio" />
13+
<meta
14+
property="og:description"
15+
content="Computer Science student at the University of Cincinnati (2026) building practical tools across web, data, and systems."
16+
/>
17+
<meta property="og:image" content="/preview.png" />
18+
<meta property="og:image:alt" content="Preview of Nathan Grilliot portfolio" />
19+
<meta name="twitter:card" content="summary_large_image" />
20+
<meta name="twitter:url" content="https://nathangrilliot.com" />
21+
<meta name="twitter:title" content="Nathan Grilliot | Portfolio" />
22+
<meta
23+
name="twitter:description"
24+
content="Computer Science student at the University of Cincinnati (2026) building practical tools across web, data, and systems."
25+
/>
26+
<meta name="twitter:image" content="/preview.png" />
27+
<link rel="canonical" href="https://nathangrilliot.com" />
1028
<link rel="icon" type="image/png" href="/favicon.png" />
1129
<link rel="preconnect" href="https://fonts.googleapis.com" />
1230
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />

public/preview.png

433 KB
Loading

src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { SiteShell } from "@/components/layout/site-shell";
44
import { AboutPage } from "@/pages/about-page";
55
import { BlogIndexPage } from "@/pages/blog-index-page";
66
import { BlogPostPage } from "@/pages/blog-post-page";
7+
import { ContactPage } from "@/pages/contact-page";
78
import { HomePage } from "@/pages/home-page";
89
import { ProjectDetailPage } from "@/pages/project-detail-page";
910
import { ProjectsPage } from "@/pages/projects-page";
@@ -38,6 +39,7 @@ function App() {
3839
<Route path="resume" element={<ResumePage />} />
3940
<Route path="posts" element={<BlogIndexPage />} />
4041
<Route path="posts/:slug" element={<BlogPostPage />} />
42+
<Route path="contact" element={<ContactPage />} />
4143
</Route>
4244
<Route path="*" element={<Navigate to="/" replace />} />
4345
</Routes>

src/components/content/content-overview-card.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export function ContentOverviewCard({
2323
const reduceMotion = useReducedMotion();
2424

2525
return (
26-
<Card className={cn("group", className)}>
26+
<Card className={cn("group flex h-full flex-col", className)}>
2727
<p className="m-0 text-xs uppercase tracking-wide text-[var(--fg-dim)]">
2828
{formatDate(entry.date)}
2929
</p>
@@ -38,7 +38,7 @@ export function ContentOverviewCard({
3838
</div>
3939
<Link
4040
to={href}
41-
className="link-accent mt-5 inline-flex items-center gap-1 text-sm text-[var(--aqua)]"
41+
className="link-accent mt-auto inline-flex items-center gap-1 pt-5 text-sm text-[var(--aqua)]"
4242
>
4343
{ctaLabel}
4444
<motion.span

src/components/layout/navbar.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ export function Navbar() {
1414
return (
1515
<header className="site-nav relative">
1616
<div className="container flex h-16 items-center justify-between gap-6">
17-
<Link to="/" className="font-['Space_Grotesk','IBM_Plex_Sans',sans-serif] text-lg font-semibold">
17+
<Link
18+
to="/"
19+
className="nav-brand font-['Space_Grotesk','IBM_Plex_Sans',sans-serif] text-lg font-semibold"
20+
>
1821
{profile.name}
1922
</Link>
2023

src/components/sections/skills-grid.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export function SkillsGrid() {
6767
<MotionStagger className="grid gap-4 md:grid-cols-3">
6868
{skillGroups.map((group) => (
6969
<MotionStaggerItem key={group.label}>
70-
<Card className="h-full">
70+
<Card className="skill-card relative z-0 h-full hover:z-30 focus-within:z-30">
7171
<h3 className="m-0 font-['Space_Grotesk','IBM_Plex_Sans',sans-serif] text-lg">
7272
{group.label}
7373
</h3>
@@ -78,7 +78,12 @@ export function SkillsGrid() {
7878
categoryColorMap[group.label] ?? "text-[var(--fg-dim)]";
7979

8080
return (
81-
<li key={value} aria-label={value} title={value}>
81+
<li
82+
key={value}
83+
aria-label={value}
84+
className="skill-tooltip"
85+
data-tooltip={value}
86+
>
8287
{Icon ? (
8388
<motion.span
8489
className="inline-flex"

src/content/posts/first-blog-post.mdx

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: Redesigning my portfolio
3+
date: 2026-03-08
4+
summary: My philosophy and process for redoing my personal website.
5+
tags:
6+
- Writing
7+
- Workflow
8+
- Portfolio
9+
type: post
10+
featured: true
11+
draft: false
12+
---
13+
14+
Until recently, UI and UX design felt like more of a chore than a creative outlet. I had a personal website that was functional but lacked personality and engagement. It was time for a change.
15+
This semester, I have been working with a team of UI and UX designers, creating a design system used across my company. At first
16+
I thought, "Design is optional for a software engineer, right?" But as I dove into the world of design, I realized how much it can enhance the user experience and make users really want to use a product.
17+
While working on other projects ([NQ](#/projects/nq), [DevBits](#/projects/devbits)), I got to a point where the backend was mature enough to support a more dynamic and engaging frontend. While there is always room for optimization, if the
18+
frontend is not engaging, users won't stick around long enough to experience the benefits of a well-designed backend. So I decided to redesign my portfolio to be more engaging and reflective of my personality and work.
19+
20+
## Goals
21+
22+
- Make the site more engaging and visually appealing.
23+
- Add interactive elements to showcase my projects and skills.
24+
- Keep it easy to add new content and share what I'm working on.
25+
26+
## Why MDX
27+
28+
- I can write like normal Markdown, keeping it simple but still allowing for flexibility.
29+
- I still have the option to embed React components later.
30+
- The content stays version controlled and easy to review.
31+
32+
## How I made it
33+
34+
- React for the frontend, with a simple and clean design.
35+
- shadcn/ui for the design system, ensuring consistency and responsiveness.
36+
- MDX for content management, allowing me to write blog posts and project updates in a familiar way.
37+
- Gruvbox color scheme for a visually appealing and cohesive look that reflects the same colors I use for my IDEs and Hyprland setup.
38+
39+
As the project grows, this site becomes a changelog of ideas, experiments, and outcomes. I can share what I want
40+
without relying on social media.

src/index.css

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ a {
156156
}
157157

158158
.grain-overlay {
159-
position: absolute;
159+
position: fixed;
160160
inset: 0;
161161
pointer-events: none;
162162
opacity: 0.15;
@@ -277,6 +277,74 @@ a {
277277
opacity: 1;
278278
}
279279

280+
.surface.skill-card {
281+
overflow: visible;
282+
}
283+
284+
.skill-tooltip {
285+
position: relative;
286+
display: inline-flex;
287+
}
288+
289+
.skill-tooltip::after {
290+
content: attr(data-tooltip);
291+
position: absolute;
292+
left: 50%;
293+
bottom: calc(100% + 0.7rem);
294+
transform: translate(-50%, 0.3rem);
295+
padding: 0.28rem 0.55rem;
296+
border: 1px solid var(--border);
297+
border-radius: 0.45rem;
298+
background: linear-gradient(135deg, var(--bg-soft), var(--bg-float));
299+
box-shadow: 0 10px 18px var(--shadow-lift);
300+
color: var(--fg-main);
301+
font-size: 0.72rem;
302+
line-height: 1.2;
303+
letter-spacing: 0.01em;
304+
white-space: nowrap;
305+
opacity: 0;
306+
pointer-events: none;
307+
transition:
308+
opacity var(--motion-fast) var(--motion-ease),
309+
transform var(--motion-fast) var(--motion-ease);
310+
transition-delay: 0ms;
311+
z-index: 80;
312+
}
313+
314+
.skill-tooltip::before {
315+
content: "";
316+
position: absolute;
317+
left: 50%;
318+
bottom: calc(100% + 0.32rem);
319+
width: 0.52rem;
320+
height: 0.52rem;
321+
border-right: 1px solid var(--border);
322+
border-bottom: 1px solid var(--border);
323+
background: var(--bg-float);
324+
transform: translateX(-50%) rotate(45deg) scale(0.9);
325+
opacity: 0;
326+
transition:
327+
opacity var(--motion-fast) var(--motion-ease),
328+
transform var(--motion-fast) var(--motion-ease);
329+
transition-delay: 0ms;
330+
pointer-events: none;
331+
z-index: 79;
332+
}
333+
334+
.skill-tooltip:hover::after,
335+
.skill-tooltip:hover::before,
336+
.skill-tooltip:focus-within::after,
337+
.skill-tooltip:focus-within::before {
338+
opacity: 1;
339+
transform: translate(-50%, 0);
340+
transition-delay: 200ms;
341+
}
342+
343+
.skill-tooltip:hover::before,
344+
.skill-tooltip:focus-within::before {
345+
transform: translateX(-50%) rotate(45deg) scale(1);
346+
}
347+
280348
.site-nav {
281349
position: sticky;
282350
top: 0;
@@ -286,6 +354,31 @@ a {
286354
backdrop-filter: blur(10px);
287355
}
288356

357+
.nav-brand {
358+
position: relative;
359+
display: inline-flex;
360+
align-items: center;
361+
padding: 0.25rem 0.55rem;
362+
border: 1px solid transparent;
363+
border-radius: 0.6rem;
364+
color: var(--fg-main);
365+
transition:
366+
color var(--motion-fast) var(--motion-ease),
367+
border-color var(--motion-fast) var(--motion-ease),
368+
background-color var(--motion-fast) var(--motion-ease),
369+
box-shadow var(--motion-base) var(--motion-ease),
370+
transform var(--motion-fast) var(--motion-ease);
371+
}
372+
373+
.nav-brand:hover,
374+
.nav-brand:focus-visible {
375+
color: var(--yellow);
376+
border-color: var(--kicker-border);
377+
background-color: var(--nav-link-active);
378+
box-shadow: 0 8px 16px var(--shadow-soft);
379+
transform: translateY(-1px);
380+
}
381+
289382
.nav-link {
290383
position: relative;
291384
}

src/lib/site-data.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ export const navigation = [
8383
{ label: "Home", to: "/" },
8484
{ label: "About", to: "/about" },
8585
{ label: "Projects", to: "/projects" },
86-
{ label: "Resume", to: "/resume" },
8786
{ label: "Posts", to: "/posts" },
87+
{ label: "Contact", to: "/contact" },
88+
{ label: "Resume", to: "/resume" },
8889
];

0 commit comments

Comments
 (0)