1-
21import React from 'react' ;
32import clsx from 'clsx' ;
43import Link from '@docusaurus/Link' ;
@@ -10,40 +9,46 @@ import { Tag, TagList, Tags, TagType, User } from '@site/src/data/users';
109import { sortBy } from '@site/src/utils/jsUtils' ;
1110import IdealImage from '@theme/IdealImage' ;
1211
13- const TagComp = React . forwardRef < HTMLLIElement , Tag > (
14- ( { label, color, description} , ref ) => (
15- < li ref = { ref } className = { styles . tag } title = { description } >
16- < span className = { styles . textLabel } > { label . toLowerCase ( ) } </ span >
17- < span className = { styles . colorLabel } style = { { backgroundColor : color } } />
18- </ li >
19- ) ,
20- ) ;
12+ const TagComp = React . forwardRef <
13+ HTMLLIElement ,
14+ Tag & { label : string }
15+ > ( ( { label, color, description} , ref ) => (
16+ < li
17+ ref = { ref }
18+ className = { styles . enhancedTag }
19+ style = { {
20+ '--tag-color' : color ,
21+ backgroundColor : `${ color } 20` ,
22+ borderColor : `${ color } 40`
23+ } as React . CSSProperties }
24+ >
25+ < span className = { styles . tagDot } style = { { backgroundColor : color } } > </ span >
26+ { label . toLowerCase ( ) }
27+ </ li >
28+ ) ) ;
2129
2230function ShowcaseCardTag ( { tags} : { tags : TagType [ ] } ) {
2331 const tagObjects = tags . map ( ( tag ) => ( { tag, ...Tags [ tag ] } ) ) ;
24-
25- // Keep same order for all tags
2632 const tagObjectsSorted = sortBy ( tagObjects , ( tagObject ) =>
2733 TagList . indexOf ( tagObject . tag ) ,
2834 ) ;
2935
3036 return (
31- < >
37+ < ul className = { styles . enhancedTagsList } >
3238 { tagObjectsSorted . map ( ( tagObject , index ) => {
3339 const id = `showcase_card_tag_${ tagObject . tag } ` ;
34-
3540 return (
3641 < Tooltip
3742 key = { index }
3843 text = { tagObject . description }
39- anchorEl = "#__docusaurus"
44+ anchorEl = { `# ${ id } ` }
4045 id = { id }
4146 >
4247 < TagComp key = { index } { ...tagObject } />
4348 </ Tooltip >
4449 ) ;
4550 } ) }
46- </ >
51+ </ ul >
4752 ) ;
4853}
4954
@@ -54,50 +59,59 @@ function ShowcaseCard({user}: {user: User}) {
5459
5560 const handleSourceClick = ( e : React . MouseEvent ) => {
5661 e . stopPropagation ( ) ;
57- // The link will handle the navigation
5862 } ;
5963
64+ console . log ( user . preview )
65+
6066 return (
61- < li key = { user . title } className = { clsx ( 'card shadow--md' , styles . card ) } >
62- < div className = { styles . cardLink } onClick = { handleCardClick } />
63- < div className = { clsx ( 'card__image' , styles . showcaseCardImage ) } >
67+ < div className = { styles . enhancedShowcaseCard } >
68+ { /* Image Section */ }
69+ < div className = { styles . showcaseCardImage } >
6470 < IdealImage img = { user . preview } alt = { user . title } />
71+ { user . tags . includes ( 'favorite' ) && (
72+ < div className = { styles . favoriteIcon } >
73+ < FavoriteIcon svgClass = { styles . svgIconFavorite } size = "small" />
74+ </ div >
75+ ) }
76+ { user . source && (
77+ < a
78+ href = { user . source }
79+ target = "_blank"
80+ rel = "noopener noreferrer"
81+ className = { styles . sourceButton }
82+ onClick = { handleSourceClick }
83+ title = "View Source Code"
84+ >
85+ < span className = { styles . sourceIcon } > 💻</ span >
86+ < span className = { styles . sourceText } > source</ span >
87+ </ a >
88+ ) }
6589 </ div >
66- < div className = "card__body" >
90+
91+ { /* Content Section */ }
92+ < div className = { styles . showcaseCardContent } >
6793 < div className = { styles . showcaseCardHeader } >
68- < h4 className = { styles . showcaseCardTitle } >
69- < Link
70- href = { user . website }
71- className = { styles . showcaseCardLink }
72- target = "_blank"
73- >
74- { user . title }
75- </ Link >
76- </ h4 >
77- { user . tags . includes ( 'favorite' ) && (
78- < FavoriteIcon svgClass = { styles . svgIconFavorite } size = "small" />
79- ) }
80- { user . source && (
81- < Link
82- href = { user . source }
83- className = { clsx (
84- 'button button--secondary button--sm' ,
85- styles . showcaseCardSrcBtn ,
86- ) }
87- target = "_blank"
88- rel = "noopener noreferrer"
89- onClick = { handleSourceClick }
90- >
91- < Translate id = "showcase.card.sourceLink" > source</ Translate >
92- </ Link >
93- ) }
94+ < h3 className = { styles . showcaseCardTitle } > { user . title } </ h3 >
9495 </ div >
95- < p className = { styles . showcaseCardBody } > { user . description } </ p >
96- </ div >
97- < ul className = { clsx ( 'card__footer' , styles . cardFooter ) } >
96+
97+ < p className = { styles . showcaseCardDescription } > { user . description } </ p >
98+
99+ { /* Tags */ }
98100 < ShowcaseCardTag tags = { user . tags } />
99- </ ul >
100- </ li >
101+
102+ { /* Footer */ }
103+ < div className = { styles . showcaseCardFooter } >
104+ < button className = { styles . viewButton } onClick = { handleCardClick } >
105+
106+ < span className = { styles . viewIcon } > 👁️</ span >
107+ View Project
108+ </ button >
109+ </ div >
110+ </ div >
111+
112+ { /* Card Effects */ }
113+ < div className = { styles . cardGlow } > </ div >
114+ </ div >
101115 ) ;
102116}
103117
0 commit comments