Skip to content

Commit 5c665f3

Browse files
Style projects as cards and split em-dash descriptions
Render project descriptions on em dashes into summary text plus a styled tag pill, keeping all fact words intact. Add a responsive card grid layout for the projects section. Co-authored-by: parse-nip <parse-nip@users.noreply.github.com>
1 parent 4671c4d commit 5c665f3

2 files changed

Lines changed: 91 additions & 5 deletions

File tree

src/app/globals.css

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,64 @@
10081008
color: inherit;
10091009
}
10101010

1011+
#locked-resume .locked-resume-projects {
1012+
margin-top: 2rem;
1013+
}
1014+
1015+
#locked-resume .locked-resume-projects-list {
1016+
list-style: none;
1017+
display: grid;
1018+
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
1019+
gap: 1rem;
1020+
margin-top: 1.25rem;
1021+
padding: 0;
1022+
}
1023+
1024+
#locked-resume .locked-resume-project-card {
1025+
display: flex;
1026+
flex-direction: column;
1027+
align-items: center;
1028+
gap: 0.625rem;
1029+
padding: 1.25rem 1.5rem;
1030+
border: 1px solid #e8e8e6;
1031+
border-radius: 18px;
1032+
background: #f6f6f5;
1033+
}
1034+
1035+
#locked-resume .locked-resume-project-title {
1036+
margin: 0;
1037+
font-size: 1.05rem;
1038+
letter-spacing: -0.02em;
1039+
}
1040+
1041+
#locked-resume .locked-resume-project-title a {
1042+
color: #111111;
1043+
text-decoration: none;
1044+
font-weight: 600;
1045+
}
1046+
1047+
#locked-resume .locked-resume-project-title a:hover {
1048+
text-decoration: underline;
1049+
}
1050+
1051+
#locked-resume .locked-resume-project-description {
1052+
margin: 0;
1053+
font-size: 0.9375rem;
1054+
line-height: 1.6;
1055+
color: #666666;
1056+
}
1057+
1058+
#locked-resume .locked-resume-project-tag {
1059+
display: inline-block;
1060+
margin-top: 0.25rem;
1061+
padding: 0.25rem 0.75rem;
1062+
border-radius: 999px;
1063+
background: #ffffff;
1064+
border: 1px solid #e8e8e6;
1065+
font-size: 0.8125rem;
1066+
color: #666666;
1067+
}
1068+
10111069
.design-select-overlay {
10121070
pointer-events: none;
10131071
position: fixed;

src/components/locked/LockedResume.tsx

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
import { getExperience } from "@/lib/experience";
22

3+
const PROJECT_DESCRIPTION_SPLIT = " — ";
4+
5+
function ProjectDescription({ description }: { description: string }) {
6+
const splitIndex = description.indexOf(PROJECT_DESCRIPTION_SPLIT);
7+
8+
if (splitIndex === -1) {
9+
return <p className="locked-resume-project-description">{description}</p>;
10+
}
11+
12+
const summary = description.slice(0, splitIndex);
13+
const detail = description.slice(splitIndex + PROJECT_DESCRIPTION_SPLIT.length);
14+
15+
return (
16+
<p className="locked-resume-project-description">
17+
<span className="locked-resume-project-summary">{summary}</span>{" "}
18+
<span className="locked-resume-project-tag">{detail}</span>
19+
</p>
20+
);
21+
}
22+
323
/**
424
* Renders owner facts from locked JSON. Community contributors may restyle
525
* this component and target #locked-resume in CSS — but must not change
@@ -65,15 +85,23 @@ export function LockedResume() {
6585
</ul>
6686
</section>
6787

68-
<section id="projects" className="locked-resume-projects">
88+
<section
89+
id="projects"
90+
className="locked-resume-projects"
91+
data-contribution-id="styled-projects-cards"
92+
>
6993
<h2>Selected Projects</h2>
70-
<ul>
94+
<ul className="locked-resume-projects-list">
7195
{data.projects.map((project) => (
72-
<li key={project.id} data-fact-id={project.id}>
73-
<h3>
96+
<li
97+
key={project.id}
98+
className="locked-resume-project-card"
99+
data-fact-id={project.id}
100+
>
101+
<h3 className="locked-resume-project-title">
74102
<a href={project.href}>{project.name}</a>
75103
</h3>
76-
<p>{project.description}</p>
104+
<ProjectDescription description={project.description} />
77105
</li>
78106
))}
79107
</ul>

0 commit comments

Comments
 (0)