@@ -233,8 +233,6 @@ export default function Blogs() {
233233
234234const BlogCard = ( { blog } : { blog : ( typeof blogs ) [ number ] } ) => {
235235 const authors = getAuthorProfiles ( blog . authors || [ ] ) ;
236- // Use only the first author for the bottom row (matches reference design)
237- const primaryAuthor = authors [ 0 ] ;
238236
239237 // Tags — use blog.tags if present, fallback to blog.category as single tag
240238 const tags : string [ ] =
@@ -289,45 +287,64 @@ const BlogCard = ({ blog }: { blog: (typeof blogs)[number] }) => {
289287 </ div >
290288 ) }
291289
292- { /* Bottom row: avatar + author + date ··· Read → */ }
290+ { /* Bottom row: avatar stack + author names + date ··· Read → */ }
293291 < div className = "card-footer" >
294292 < div className = "card-author-row" >
295- { /* Avatar */ }
296- { primaryAuthor && (
297- < div className = "card-avatar" >
298- { primaryAuthor . imageUrl ? (
299- < img
300- src = { primaryAuthor . imageUrl }
301- alt = { primaryAuthor . name }
302- className = "card-avatar-img"
303- onError = { ( e ) => {
304- const t = e . currentTarget ;
305- t . style . display = "none" ;
306- const fb = t . nextElementSibling as HTMLElement | null ;
307- if ( fb ) fb . style . display = "flex" ;
308- } }
309- />
310- ) : null }
311- < span
312- className = "card-avatar-fallback"
313- style = { { display : primaryAuthor . imageUrl ? "none" : "flex" } }
314- >
315- { primaryAuthor . name . charAt ( 0 ) . toUpperCase ( ) }
316- </ span >
293+ { /* Avatar stack */ }
294+ { authors . length > 0 && (
295+ < div className = "card-avatar-stack" >
296+ { authors . slice ( 0 , 3 ) . map ( ( author , idx ) => (
297+ < Link
298+ key = { author . id }
299+ href = { author . githubUrl }
300+ className = "card-avatar"
301+ style = { { zIndex : authors . length - idx } as React . CSSProperties }
302+ target = "_blank"
303+ rel = "noopener noreferrer"
304+ title = { author . name }
305+ >
306+ { author . imageUrl ? (
307+ < img
308+ src = { author . imageUrl }
309+ alt = { author . name }
310+ className = "card-avatar-img"
311+ onError = { ( e ) => {
312+ const t = e . currentTarget ;
313+ t . style . display = "none" ;
314+ const fb = t . nextElementSibling as HTMLElement | null ;
315+ if ( fb ) fb . style . display = "flex" ;
316+ } }
317+ />
318+ ) : null }
319+ < span
320+ className = "card-avatar-fallback"
321+ style = { { display : author . imageUrl ? "none" : "flex" } }
322+ >
323+ { author . name . charAt ( 0 ) . toUpperCase ( ) }
324+ </ span >
325+ </ Link >
326+ ) ) }
317327 </ div >
318328 ) }
319329
320- { /* Name + date stacked */ }
330+ { /* Author names + date stacked */ }
321331 < div className = "card-author-info" >
322- { primaryAuthor && (
323- < Link
324- href = { primaryAuthor . githubUrl }
325- className = "card-author-handle"
326- target = "_blank"
327- rel = "noopener noreferrer"
328- >
329- By @{ primaryAuthor . id || primaryAuthor . name . toLowerCase ( ) . replace ( / \s + / g, "" ) }
330- </ Link >
332+ { authors . length > 0 && (
333+ < span className = "card-author-names" >
334+ { authors . map ( ( author , idx ) => (
335+ < React . Fragment key = { author . id } >
336+ { idx > 0 && < span className = "card-author-sep" > , </ span > }
337+ < Link
338+ href = { author . githubUrl }
339+ className = "card-author-handle"
340+ target = "_blank"
341+ rel = "noopener noreferrer"
342+ >
343+ { author . name }
344+ </ Link >
345+ </ React . Fragment >
346+ ) ) }
347+ </ span >
331348 ) }
332349 { ( blog as any ) . date && (
333350 < span className = "card-date" > { formatDate ( ( blog as any ) . date ) } </ span >
0 commit comments