1+ import { Student } from "@/models/student.model"
2+ import { IconCrown } from "@tabler/icons-react"
3+ import { ReactNode } from "react"
4+
5+ const Container = ( props : {
6+ steps_count : number ,
7+ className ?: string ,
8+ steps : {
9+ order : number ,
10+ children : ReactNode
11+ } [ ]
12+ } ) => {
13+
14+ const { steps_count, className = "" , steps } = props
15+
16+ return < div className = { `flex gap-3 h-full w-full items-end ${ className } ` } >
17+ { steps . map ( step => {
18+ return < div style = { {
19+ height : `${ ( ( ( ( 0.8 ) / steps_count ) * ( steps_count - step . order ) ) + 0.2 ) * 100 } %`
20+ } } className = "flex-grow" key = { step . order } >
21+ { step . children }
22+ </ div >
23+ } ) }
24+ </ div >
25+ }
26+
27+ const Step = ( props : {
28+ className ?: string ,
29+ bg_color : string ,
30+ student : {
31+ student : Student ,
32+ order : number
33+ } ,
34+ showNumber ?: boolean ,
35+ showAvatar ?: boolean ,
36+ showUserInfo ?: boolean ,
37+ showCrown ?: boolean
38+ } ) => {
39+ const {
40+ bg_color = "#000" ,
41+ className = "" ,
42+ student,
43+ showNumber = false ,
44+ showAvatar = false ,
45+ showUserInfo = false ,
46+ showCrown = false
47+ } = props
48+
49+ const val = 1 - ( student . order * 0.045 )
50+
51+ return < div className = "flex flex-col gap-2 w-full h-full relative transition hover:scale-105 cursor-pointer" >
52+ < div style = { {
53+ backdropFilter : `brightness(${ val } )`
54+ } } className = { `flex flex-col items-center justify-center rounded-3xl flex-grow ${ bg_color } ${ className } shadow-md` } >
55+ < div className = "h-[1.5rem] w-full" > </ div >
56+
57+ { showNumber && < b className = "text-6xl text-white" > { student . order + 1 } °</ b > }
58+
59+ </ div >
60+
61+ {
62+ showAvatar &&
63+ < div className = "absolute -top-[2rem] lg:-top-[3.5rem] left-1/2 transform -translate-x-1/2 mx-auto rounded-full border-2 border-[--azul-niebla] bg-[--azul-niebla] h-[4rem] lg:h-[7rem] aspect-square overflow-hidden" >
64+ { /* eslint-disable-next-line @next/next/no-img-element */ }
65+ < img src = { student . student . avatar } alt = { `Avatar de ${ student . student . name } ` } className = "w-full h-full object-cover" />
66+ </ div >
67+ }
68+
69+ { showCrown && < div className = { `absolute z-10 -top-[3.5rem] lg:-top-[5.5rem] left-[40%] transform -translate-x-1/2 -rotate-12 lg:-rotate-[24deg] ${ student . order == 0 ? 'text-yellow-500' : student . order == 1 ? 'text-neutral-300' : "text-amber-600" } ` } >
70+ < IconCrown className = "hidden lg:flex" size = { 65 } />
71+ < IconCrown className = "flex lg:hidden" size = { 45 } />
72+ </ div > }
73+
74+ {
75+ showUserInfo && < div className = "glassmorphic dark:glassmorphic-dark dark:text-white flex flex-col items-center justify-center p-2 text-center text-xs lg:text-base h-16 shadow" >
76+ < p className = "m-0" title = { `${ student . student . name } ${ student . student . surname } ` } >
77+ < b > { student . student . name } </ b >
78+ </ p >
79+ < p className = "m-0 flex gap-1 items-center" > < IconCrown className = "text-yellow-500" size = { 15 } /> { student . student . victory_count } < span className = "hidden lg:flex" > Victorias</ span > </ p >
80+ </ div >
81+ }
82+ </ div >
83+
84+ }
85+
86+ // eslint-disable-next-line import/no-anonymous-default-export
87+ export default {
88+ Step,
89+ Container
90+ }
0 commit comments