22
33import Image from 'next/image' ;
44import { Crown } from 'lucide-react' ;
5+ import { useTranslations } from 'next-intl' ;
56import { cn } from '@/lib/utils' ;
67import { User } from './types' ;
78
89export function LeaderboardPodium ( { topThree } : { topThree : User [ ] } ) {
10+ const t = useTranslations ( 'leaderboard' ) ;
11+
912 return (
1013 < ol
11- className = "flex items-end justify-center gap-4 md:gap-8 pb-4 pt-8 min-h-[350px ] list-none m-0 p-0"
12- aria-label = "Top 3 Leaders"
14+ className = "flex items-end justify-center gap-2 md:gap-8 pb-4 pt-16 min-h-[340px ] list-none m-0 p-0"
15+ aria-label = { t ( 'topThreeLabel' ) }
1316 >
1417 { topThree . map ( user => {
1518 if ( ! user ) return null ;
@@ -21,95 +24,81 @@ export function LeaderboardPodium({ topThree }: { topThree: User[] }) {
2124 < li
2225 key = { user . id }
2326 className = { cn (
24- 'flex flex-col items-center transition-all duration-500 relative' ,
25-
26- isFirst ? 'order-2 z-10 -mt-8' : 'z-0' ,
27+ 'flex flex-col items-center transition-all duration-500 relative z-0' ,
28+ isFirst ? 'order-2 z-10 -mt-8 md:-mt-12' : '' ,
2729 isSecond ? 'order-1' : '' ,
2830 isThird ? 'order-3' : ''
2931 ) }
3032 >
31- < article className = "flex flex-col items-center" >
32- < div className = "relative mb-4 group cursor-pointer " >
33+ < div className = "flex flex-col items-center group " >
34+ < div className = "relative mb-3 md:mb-5 transition-transform duration-300 group-hover:scale-105 " >
3335 { isFirst && (
3436 < Crown
35- className = "absolute -top-12 left-1/2 -translate-x-1/2 w-10 h-10 text-yellow-500 fill-yellow-500 animate-bounce drop-shadow-lg"
36- strokeWidth = { 1.5 }
37+ className = "absolute -top-10 md:-top-12 left-1/2 -translate-x-1/2 w-10 h-10 md:w-12 md:h-12 text-yellow-400 animate-bounce drop-shadow-[0_0_15px_rgba(250,204,21,0.5)]"
3738 aria-hidden = "true"
3839 />
3940 ) }
4041
4142 < div
4243 className = { cn (
43- 'relative flex items-center justify-center rounded-full overflow-hidden shadow-2xl transition-transform duration-300 group-hover:scale-105 border-4 ' ,
44+ 'relative rounded-full p-[3px] shadow-2xl' ,
4445 isFirst
45- ? 'w-28 h-28 border-yellow-400 dark:border-yellow-500'
46- : '' ,
47- isSecond
48- ? 'w-20 h-20 border-slate-300 dark:border-slate-500'
49- : '' ,
50- isThird
51- ? 'w-20 h-20 border-orange-300 dark:border-orange-400'
52- : '' ,
53- 'bg-white dark:bg-slate-800'
46+ ? 'bg-gradient-to-tr from-yellow-300 via-yellow-100 to-yellow-500'
47+ : isSecond
48+ ? 'bg-gradient-to-tr from-slate-300 via-slate-100 to-slate-400'
49+ : 'bg-gradient-to-tr from-orange-300 via-orange-100 to-orange-400'
5450 ) }
5551 >
56- { user . avatar ? (
52+ < div className = "relative w-16 h-16 md:w-24 md:h-24 rounded-full overflow-hidden border-4 border-white dark:border-slate-900 bg-slate-200" >
5753 < Image
5854 src = { user . avatar }
5955 alt = { `${ user . username } 's avatar` }
60- width = { 64 }
61- height = { 64 }
62- className = "w-full h-full object-cover"
56+ fill
57+ className = "object-cover"
6358 />
64- ) : (
65- < span className = "text-2xl font-bold text-slate-700 dark:text-slate-200" >
66- { user . username . slice ( 0 , 2 ) . toUpperCase ( ) }
67- </ span >
68- ) }
59+ </ div >
6960 </ div >
7061
7162 < div
7263 className = { cn (
73- 'absolute -bottom-3 left-1/2 -translate-x-1/2 flex items-center justify-center w-8 h-8 rounded-full text-sm font-bold border-2 border-white dark:border-slate-900 shadow-md' ,
74- isFirst ? 'bg-yellow-500 text-white' : '' ,
75- isSecond ? 'bg-slate-400 text-white' : '' ,
76- isThird ? 'bg-orange-400 text-white' : ''
64+ 'absolute -bottom-3 left-1/2 -translate-x-1/2 flex items-center justify-center w-7 h-7 md:w-9 md:h-9 rounded-full font-bold text-xs md:text-sm border-[3px] border-white dark:border-slate-900 shadow-lg' ,
65+ isFirst
66+ ? 'bg-yellow-500 text-white'
67+ : isSecond
68+ ? 'bg-slate-400 text-white'
69+ : 'bg-orange-400 text-white'
7770 ) }
78- aria-label = { `Rank ${ user . rank } ` }
7971 >
8072 { user . rank }
8173 </ div >
8274 </ div >
8375
84- < div className = "text-center mb-3" >
85- < h3 className = "font-bold text-slate-800 dark:text-slate-100 text-base mb-1 truncate max-w-[120px ]" >
76+ < div className = "text-center mb-3 md:mb-5 " >
77+ < div className = "font-bold text-slate-800 dark:text-slate-100 text-xs md:text-lg mb-1 truncate max-w-[85px] md:max-w-[140px ]" >
8678 { user . username }
87- </ h3 >
88- < div className = "font-mono font-bold text-xl text- slate-900 dark:text-white tracking-tight " >
89- { user . points } { ' ' }
90- < span className = "text-xs font-normal text-slate-500" >
91- pts
92- </ span >
79+ </ div >
80+ < div className = "inline-block px-2 py-0.5 rounded-full bg- slate-100 dark:bg-slate-800 border border-slate-200 dark:border-slate-700 " >
81+ < div className = "font-mono font-bold text-xs md:text-sm text-slate-700 dark:text-slate-300" >
82+ { user . points } { ' ' }
83+ < span className = "text-slate-400" > { t ( ' pts' ) } </ span >
84+ </ div >
9385 </ div >
9486 </ div >
9587
9688 < div
9789 aria-hidden = "true"
9890 className = { cn (
99- 'w-24 md:w-36 rounded-t-2xl border-x border-t shadow-lg backdrop-blur-sm' ,
100- 'bg-gradient-to-b from-white/80 via-white/40 to-transparent dark:from-slate-800/80 dark:via-slate-800/40' ,
91+ 'w-20 md:w-40 rounded-t-2xl backdrop-blur-xl transition-all duration-300' ,
92+ 'border-t-2 border-x-2 border-white/60 dark:border-white/10' ,
93+
10194 isFirst
102- ? 'h-40 border-yellow-400/30 dark:border-yellow-500/30'
103- : '' ,
104- isSecond
105- ? 'h-24 border-slate-300/30 dark:border-slate-500/30'
106- : '' ,
107- isThird
108- ? 'h-16 border-orange-300/30 dark:border-orange-500/30'
109- : ''
95+ ? 'h-40 md:h-56 bg-gradient-to-b from-yellow-200/30 to-yellow-500/5 dark:from-yellow-400/20 dark:to-transparent shadow-[0_0_50px_-10px_rgba(234,179,8,0.4)]'
96+ : isSecond
97+ ? 'h-28 md:h-40 bg-gradient-to-b from-slate-200/30 to-slate-500/5 dark:from-slate-400/20 dark:to-transparent shadow-[0_0_40px_-10px_rgba(148,163,184,0.3)]'
98+ : 'h-20 md:h-28 bg-gradient-to-b from-orange-200/30 to-orange-500/5 dark:from-orange-400/20 dark:to-transparent shadow-[0_0_40px_-10px_rgba(251,146,60,0.3)]'
11099 ) }
111100 />
112- </ article >
101+ </ div >
113102 </ li >
114103 ) ;
115104 } ) }
0 commit comments