@@ -10,97 +10,15 @@ import { placeholderImage } from "../utils/placeholder";
1010type ProjectCardProps = {
1111 project : Project ;
1212 minimal ?: boolean ;
13- featured ?: boolean ;
1413} ;
1514
16- const ProjectCard = ( {
17- project,
18- minimal = false ,
19- featured = false ,
20- } : ProjectCardProps ) => {
15+ const ProjectCard = ( { project, minimal = false } : ProjectCardProps ) => {
2116 const styleVars = {
2217 "--project-accent" : project . accentColor || undefined ,
2318 } as CSSProperties ;
2419
2520 const technologies = project . technologies ?? [ ] ;
26-
27- if ( featured ) {
28- return (
29- < article className = "project-card project-card-featured" style = { styleVars } >
30- < Link
31- to = { entryPath ( project ) }
32- className = "project-image-container"
33- tabIndex = { - 1 }
34- aria-hidden
35- >
36- { project . featured && (
37- < span
38- className = "featured-star"
39- aria-label = "Featured project"
40- title = "Featured project"
41- >
42- < Icon name = "star" />
43- </ span >
44- ) }
45- { project . icon && (
46- < span className = "project-icon-badge" aria-hidden = "true" >
47- < Icon name = { project . icon } />
48- </ span >
49- ) }
50- < img
51- src = { project . thumbnail || placeholderImage ( project . title ) }
52- alt = { project . title }
53- className = "project-image"
54- loading = "lazy"
55- />
56- </ Link >
57- < div className = "project-info" >
58- < div className = "flex flex-wrap items-center gap-2 mb-2" >
59- { project . categories . map ( ( cat ) => (
60- < span
61- key = { cat }
62- className = "px-2 py-0.5 rounded-full bg-accent/10 text-accent text-xs font-semibold"
63- >
64- { cat }
65- </ span >
66- ) ) }
67- { project . date && (
68- < span className = "text-xs text-muted" > { project . date } </ span >
69- ) }
70- </ div >
71- < h3 className = "project-title" >
72- < Link to = { entryPath ( project ) } className = "project-card-link" >
73- { project . title }
74- </ Link >
75- </ h3 >
76- < p className = "project-subtitle" > { project . tagline } </ p >
77- < p className = "project-description" > { project . description } </ p >
78- { technologies . length > 0 && (
79- < div className = "project-tech tech-row tech-row-tech" >
80- { technologies . slice ( 0 , 4 ) . map ( ( t ) => (
81- < span key = { `tech-${ t } ` } >
82- < Link to = { `/tech/${ toSlug ( t ) } ` } className = "tech-tag" >
83- { t }
84- </ Link >
85- </ span >
86- ) ) }
87- { technologies . length > 4 && (
88- < Link
89- to = { entryPath ( project ) }
90- className = "tech-tag tech-tag-more"
91- >
92- +{ technologies . length - 4 }
93- </ Link >
94- ) }
95- </ div >
96- ) }
97- < Link to = { entryPath ( project ) } className = "project-view-link" >
98- View Project < Icon name = "arrow-right" size = "0.7em" />
99- </ Link >
100- </ div >
101- </ article >
102- ) ;
103- }
21+ const primaryCategory = project . categories ?. [ 0 ] ;
10422
10523 return (
10624 < article
@@ -138,23 +56,52 @@ const ProjectCard = ({
13856 className = "pc-thumbnail"
13957 loading = "lazy"
14058 />
59+ < span className = "pc-icon-overlay" aria-hidden = "true" >
60+ < Icon name = { project . icon || "cube" } />
61+ </ span >
14162 </ Link >
14263 ) }
14364 < div className = "pc-accent-bar" />
14465 < div className = "pc-body" >
145- < div className = "pc-header" >
146- < span className = "pc-icon-badge" aria-hidden = "true" >
66+ < div
67+ className = { `pc-inline-strip${ minimal ? " pc-inline-strip--always" : "" } ` }
68+ aria-hidden = "true"
69+ >
70+ < span className = "pc-icon-inline" >
14771 < Icon name = { project . icon || "cube" } />
14872 </ span >
149- < div className = "pc-header-meta" >
150- < h3 className = "project-title" >
151- < Link to = { entryPath ( project ) } className = "project-card-link" >
152- { project . title }
153- </ Link >
154- </ h3 >
155- { project . date && < span className = "pc-date" > { project . date } </ span > }
156- </ div >
73+ { project . featured && (
74+ < span
75+ className = "pc-inline-badge pc-inline-badge--featured"
76+ title = "Featured project"
77+ >
78+ < Icon name = "star" />
79+ </ span >
80+ ) }
81+ { project . archived && (
82+ < span
83+ className = "pc-inline-badge pc-inline-badge--archived"
84+ title = "This project is archived"
85+ >
86+ < Icon name = "archive" />
87+ </ span >
88+ ) }
15789 </ div >
90+ { ( primaryCategory || project . date ) && (
91+ < div className = "pc-meta-line" >
92+ { primaryCategory && (
93+ < span className = "pc-meta-category" > { primaryCategory } </ span >
94+ ) }
95+ { project . date && (
96+ < span className = "pc-meta-date" > { project . date } </ span >
97+ ) }
98+ </ div >
99+ ) }
100+ < h3 className = "project-title" >
101+ < Link to = { entryPath ( project ) } className = "project-card-link" >
102+ { project . title }
103+ </ Link >
104+ </ h3 >
158105 < p className = "project-subtitle" > { project . tagline } </ p >
159106 { ! minimal && technologies . length > 0 && (
160107 < div className = "project-tech tech-row tech-row-tech" >
0 commit comments