From 3a6175e53c79b6405cf8d376cedb0222bc7b832e Mon Sep 17 00:00:00 2001 From: vuonghuuhung Date: Sat, 5 Apr 2025 17:15:52 +0700 Subject: [PATCH 1/2] feat: add Radix UI Tabs component and integrate it into the Events page; update Tailwind CSS colors and add new assets for event tiers --- package.json | 1 + pnpm-lock.yaml | 62 ++++++++++++ src/app/_assets/bronze-cup.png | Bin 0 -> 4345 bytes src/app/_assets/globals.css | 6 ++ src/app/_assets/golden-cup.png | Bin 0 -> 4058 bytes src/app/_assets/silver-cup.png | Bin 0 -> 3356 bytes src/app/_assets/tier-one.png | Bin 0 -> 21949 bytes src/app/_assets/tier-three.png | Bin 0 -> 1748 bytes src/app/_assets/tier-two.png | Bin 0 -> 1484 bytes src/app/events/columns.tsx | 50 ++++++++++ src/app/events/data-table.tsx | 91 ++++++++++++++++++ src/app/events/page.tsx | 170 +++++++++++++++++++++++++++++++++ src/app/pools/page.tsx | 9 +- src/components/BottomNav.tsx | 19 ++-- src/components/Input/Input.tsx | 2 +- src/components/ui/tabs.tsx | 55 +++++++++++ src/icons/fixed/Vector 94.tsx | 25 ----- src/icons/fixed/lightning.tsx | 21 ++++ src/icons/fixed/polygon.tsx | 10 ++ src/icons/fixed/target.tsx | 21 ++++ tailwind.config.js | 3 + 21 files changed, 503 insertions(+), 42 deletions(-) create mode 100644 src/app/_assets/bronze-cup.png create mode 100644 src/app/_assets/golden-cup.png create mode 100644 src/app/_assets/silver-cup.png create mode 100644 src/app/_assets/tier-one.png create mode 100644 src/app/_assets/tier-three.png create mode 100644 src/app/_assets/tier-two.png create mode 100644 src/app/events/columns.tsx create mode 100644 src/app/events/data-table.tsx create mode 100644 src/app/events/page.tsx create mode 100644 src/components/ui/tabs.tsx delete mode 100644 src/icons/fixed/Vector 94.tsx create mode 100644 src/icons/fixed/lightning.tsx create mode 100644 src/icons/fixed/polygon.tsx create mode 100644 src/icons/fixed/target.tsx diff --git a/package.json b/package.json index 4b379a5..337014d 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@radix-ui/react-separator": "^1.1.2", "@radix-ui/react-slider": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-toast": "^1.2.6", "@radix-ui/react-visually-hidden": "^1.1.2", "@tanstack/react-table": "^8.20.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b1df75d..409db3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: '@radix-ui/react-slot': specifier: ^1.1.2 version: 1.1.2(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-tabs': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-toast': specifier: ^1.2.6 version: 1.2.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1404,6 +1407,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-roving-focus@1.1.2': + resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-select@2.1.6': resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} peerDependencies: @@ -1452,6 +1468,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-tabs@1.1.3': + resolution: {integrity: sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-toast@1.2.6': resolution: {integrity: sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA==} peerDependencies: @@ -5999,6 +6028,23 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.20)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.20 + '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@radix-ui/react-select@2.1.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.0 @@ -6063,6 +6109,22 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-tabs@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-context': 1.1.1(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.20)(react@18.3.1) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.20)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.20 + '@types/react-dom': 18.3.5(@types/react@18.3.20) + '@radix-ui/react-toast@1.2.6(@types/react-dom@18.3.5(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.1 diff --git a/src/app/_assets/bronze-cup.png b/src/app/_assets/bronze-cup.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ca4f6c099a38b4e1dc13631a0d9b5c4eac41be GIT binary patch literal 4345 zcmV*ES9bMX+2VLBZfatMX6@`vnpDK=K9@30wUGNT5i4BYCS-AkItGKG{eR zXkX$yv=m;lJXA&Ewjo3UTAGa-NaDoy+H3D+uKm6{+Jei4GJ&af)E$7SRf`3;8012see$ z`DgCSf~-wR5)XC#c!2#(EI96`<#JN1&B-}7U=bw9EQU>X1 z9P|tlkcB~lkqnED10T+wIJ*Eh5CbQ4{`m)|BnMtaRh?>gj%hofTMkro3oP0o%-a3|Ly%I}#Z6q>eTYE|CP?bi7Zy zF3o0(_UQUF61#giifxL+L|YqCrUyl8PlUQ^D?QB|2%rZB^so{X9gt6fCNGMeW0I*O znVy{_BEMU$GD#FcDjFw=LP?@e+WZ6W9YiYKXQO7K{Q|#z~QeZXNL3c&PvpCD-c%=s1F2?4R38LzVvWn}<(UD%2@}OT`*oTC3GhBN9hb z8VtuZR8N_y>2PWoQpqIPP=%UV0!4AV#6Lw?XlHG-tqyt{%W}UP21+TC=m=6u1eeg9 zT*iCX%!V=EyE_R(aTRX4MWgm}Prm-?bkF0IAm=#Jo86pTTS6CpJ#h?seh9VzS(E0* zM3;g zbTGJ6)19_tMxrtsFKx8n3VL{) z&j_aJ@2sXpU{L5)$_h&r9E*yoAH`X&)pVT58y;4h>^HTKegQU0zH25uu8xR5`sl|{ z=hgZ?Ign8eQYqCXQ<8Fc`U28*+}$UVBpBZnfq1+*=G*XMO%5$GI6`{?MFA9Ml{O9b z-3d$_Nb_jCt(+nKMm*41#pAg5Vo*x!66%Hw=1lztDTNV+7Zq(uI=KI}Pjcdg?;XPM zNKw$%!X$`hlYfj<|N;x3rWohXzvaO$t3Kb%NL@SMPWx?!dA#M z@M~K^Q92VVOM@le^6YlG);y>6k%?p4|HfwvL?-<}W8eS!r!&L@eJ3GHr5k;fz$$zQk4 zA4ENEbR7Fl=mOa=>U^{_Z9>?jU{cnd1KXZ8*eJz~EDcE6A6)0>HZ)#f>3`itzE=b#bYv96q%n8agkfR6o4ONZ%c|Q;K0&~UV9j?9-|=cQtaLzgamTee zQ}6xmu`Kiew70&p!}_K_;5T&Lcm9o@E%79Y=INw3Q9=89w3jw8Hh+P&RTV=-c~Lya zXG7789cQ05O(8ugHH>-a0kSC{#$GZ~udLKyW!>;Of}qOxi_TsxiOvaC8bikMPFE~z z%KdoMjQ!;>iM>q2_aR&wHbK0;^TI=jg7e?WwqT*9W_f9a7|p$ndv`#AsP zYoF{R)n6{THx$*ZS}ps|x4>_UR3!?7f-a=+;zA~$A`~8Pb^>XsEJ?>`pK=v-&BN$s z_FccJX!7!o3@olBDdpK1e3D20@$#edCyz{aby9e4VJP8tx}rA*5|q$>seCU^sU|oi z?t~;yo4VnHSALGw2jet3Xv$rb1nG1vbvAf@6QLxf4$arS&I-wonRrS0yqir$+k0lr zOOc6ld2&j%YNhc#D53J;=K5kk;ylK7x`%`xy!_~kj%}aD-7M#V0~t9Qlukm+ICS>J zmxoZ&SX@R=MaUas;mtVT$pm1jBu{FkVN$u~)qOb1n;T+>e9*S3^1VnXC2BYlp30+J zIn(a^lSig9@4x)$NqppUTr#g+YdBdFIOOO^t83c^_OoxFo#CYNWNfA4N|k2<&bN|Q zib?5nB&{(r%fgheT4_kA;rLB}s%%d}?H($oWkEvI-V_-_!j>xk_m>|%kSLYTW2-DD zOg3|6#i)CACYdO3?e5iaro>3a256s1T`L;6nH{B-$E0J!uG()11+$IyhL$?4U;uKLb+5TAty;HDQqNrNgE>*>-*T>*>;l2(UDLBHQ+cD61g^q z60Ibyl<{T*a;5dOD6QE2Q@cmp&Qnc?BWOpB02>i40b4~kl^4~W+jd0Z34HMU3#I7d zrPAkIDw&F3HR{y|R`PJLS|8&b(+En^Y#T3K{_5-Qr!sJbb{vb*E#lk7X@Jzo%|lI$dDoFMIa$3m&x zBAJA3Wpz(|dAYcFcIo)j6T4_iObLS+73XT04Ub}+he>9d0K}-;Ny!CP9?W zy|?=%zqM4N{9OOhi^TDv^I+t!MYi)324UbiH4#=CCwc5VR8SzgH`4QbG26-`+I)C{)3 ztI!8rm&ymh@&JxA&0|(db8(fr3ss*ag_biem2~Eu)>c>8v6|D6G@3E>65x{-v;wI* z59CSJ#q1Kz^n7I67+b#eWe)m?z7k5H_3fB!K1lmy9?P4Jfztqgf+~1%rOE>SrArr? zqz1ixDn8cn9`ulOy;(Zh!&=w9dnN0houe!U>O|(d{a+*6cR~s5se6v98c<8}wlvs_ zv}Uwoz@>{97@4{duBun*jog0&ikEY(d$s_5-$(L*ve()K=;vi~7b^l;%?g{k*1ewqoA$+Gc= zkYoni$iaZnw>mFdv}(g?w^eCQTwA((PZZc90msSGk{0ngB76hmNy}7W;@$~}MqK+@ z(Mxb?_3NhlkR7BM4F^dkE$St2PAaa6tDrH7OjQI-daUY(ovF{Nuz&dcK9pqVRZM)m zxt##M9r`Ds!pakoOkvq0Thc;h1MxDNveJsTRN97b{&x=6Hr%;>Jd%c3B;9nI4IxyD z#uV6lX9A}8jWVeWl36j$Y1SQpH&vmQME#Q_=OiAOp?`$R{`xdWg4R4ynbun$ z_2g@xPSXH`=TVJ3nX=(>@f-Ml`8>|+OBl1><~xUnVzjo1@&_X$YU>3Dl9VGddA$gy znsYcgD>hb%_^_=RQ9JaFP;x{(cgjJ7jVIKcW10uW-$_#WI-wwFF;>-F#w5wtaAoaV z-!WR{!IxOJA&1C3jA}kD7T>7mE?M$4YC<9S0BGGj^bvhuD>MJhWENy=iuN-ZC4cab z?bBY~l1P@Mfa?WHrEHpqpP1`>zp4&X#Z_;mp#qEjjzdGS_=xhTm@s+4eQn3ZGA2~0 zzAvsop(*U{k!Zcp#(+eUX0%#zc{326)m-385T=}_a{1NyO09iv4!wEd{=1V$tA@KM z7D9wj5lT4pST<`b_W4fdU?L@d{GS*0K?pIBnbM$vGpnu(E^Zc72pKYIEwfT~Q*T3w z1jNu@nwE~6!`AKlW;`K8=m?EQmCW9B5@$Z+@W4Iy`(6m68P&?F4izK3q=ruAcW1N= zy`+_hxkWwGs`-x7TgJn2HQVZ?t1uvZHq>@Qr&uJ`bjTN!3vaE2385nt6ZenPXCmHQ z0rkCLVsGJv*BgjX5z1bTbXXM?l5w{VL=K5V)jGe$76ychQ2uHprSSM`-y&rHTO}Fs zz0|NEG=#d+>CDjnP-?jTyCu|{sC?h;UCWz|&=4xVxO?09PwKzhf#o5A*R3<+bzwj# z2%Ud!Vunj6{mG1^=a5AE$)N`SE(s=!gJqYSiJML+`=c)s9OK`|M|aha8G#s-5Q#LW zA29nq&rC)La8n5-`^Wx*j`!z?$g}Sf2(_K&j1!eqq~;fNSvz5{r#Cd)^xA<3=Ed)t z0+R|rJwPXC6cqw`-7K>$h-%gUZaxRnUob3x%?i&t^U7lXig4XpRq$|pAo8j=tKA21GnBXx}|Hr`087@ za%}~|g3u6}OvD+XTgBaX+!iWAcT~R5*desf7?{c*J208G!CgVZ;W+)T1*H=4j>j<$ z&AxsBa|Iq`Q1XWtdwYp%I~W+DCYV|8#j2iQ7zXGV=|{A!b!m02)bY4O!MNc8w*8Q?UU=Pg0?_dWz_|f72|CcW@yOpDW00000NkvXXu0mjf`X5E_ literal 0 HcmV?d00001 diff --git a/src/app/_assets/globals.css b/src/app/_assets/globals.css index e4412b9..74c613a 100644 --- a/src/app/_assets/globals.css +++ b/src/app/_assets/globals.css @@ -66,6 +66,9 @@ --color-navy-1: hsla(251, 78%, 10%, 1); --color-purple-1: hsla(266, 69%, 63%, 1); --color-purple-2: hsla(251, 34%, 26%, 1); + --color-purple-3: hsla(251, 23%, 14%, 1); + --color-purple-4: hsla(252, 40%, 17%, 1); + --color-purple-5: hsla(266, 100%, 64%, 1); --gr-border-1: #052b2f; --gr-border-2: #073438; --gr-border-3: #22174F; @@ -97,6 +100,9 @@ --color-navy-1: hsla(251, 78%, 10%, 1); --color-purple-1: hsla(266, 69%, 63%, 1); --color-purple-2: hsla(251, 34%, 26%, 1); + --color-purple-3: hsla(251, 23%, 14%, 1); + --color-purple-4: hsla(252, 40%, 17%, 1); + --color-purple-5: hsla(266, 100%, 64%, 1); --gr-border-1: #052b2f; --gr-border-2: #073438; --gr-border-3: #22174F; diff --git a/src/app/_assets/golden-cup.png b/src/app/_assets/golden-cup.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f574fd398dd8a09164b907fbef0ea7b29f0019 GIT binary patch literal 4058 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 M07*qoM6N<$f&K~#7F?VQPS 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 mmR<2shY*j`8 literal 0 HcmV?d00001 diff --git a/src/app/_assets/tier-one.png b/src/app/_assets/tier-one.png new file mode 100644 index 0000000000000000000000000000000000000000..c8dce60261a8984a33489bb90db9abc556111ed7 GIT binary patch literal 21949 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 UtC6ndr2qf`07*qoM6N<$g5=&O&;S4c literal 0 HcmV?d00001 diff --git a/src/app/_assets/tier-three.png b/src/app/_assets/tier-three.png new file mode 100644 index 0000000000000000000000000000000000000000..bd34bcbbff8aede9ccfc3caaad8a15550584247c GIT binary patch literal 1748 zcmd6o|3A|S9LGP_(iq#am9OXPS*%tPrsfzn>=7mw;jXEN?~F3v#>&khbmziFsWbB> z-)*IoZU`%-3#oi>M836RM;*;(xBCz7$9p_p&-d%`djItP;r)2L@_fAAHP!Xh0RYe> zdk}qtOsh#r(WB>pZ`7bI!*-ahgQib8`?gF$77%VFTIKtV>831no z3YDGN2>_~5WTG=QRprxLil;#mYL^6ek6Kc8YA@Zl;=H9A+6ClxHg-QbW=HL~=dPb!>giWv9GeI2BA6XW#>1%c$t-Hpv z=QkF%$adHlaj!x<<#J{huGKq!L#9!9!yt+IOo%4;`VsMvnLAB9 zh136x)G?tlkO$>B1~+}Bqk=;)HhpBC#)-%jF>o}|QU`<>n))2n_cfu4v=6lV@G>c) z4T}NoCNE<@Or2YZWD|(j?zh<&wJ!d@c`g^}DKA@0ibsl1V|DrwumT3d4py z>Bc=^6MaK+85}Je-8@yK+PO)lTTxYKh4tuYW_^L3tE*p)LQi1tTq-EFYXEgCit*k? z2cOpQ3)|+th%)aA^|4PpkSEzoACJur%7bg>$39q8TcV;rARN46!*qu2QHSD&KT|a@ zpzg~ZC8noQ8PcbBvhV$pPmt`iM8ke6Ing7v1#6e}?@unSC-E@Mu*iPip>x?q+ST7T z&3+?fh;orQ8J?Ln%op<=5np~edCQ1f_`G<#tq|%RCEI$xRz#~2Bqx=4r$ed5J`#)b zj~agzNia9;S}*p`Sl`Wi+1P3`|IlIQ;OdPEnOTCmYnt8;n6rPUE}`_2z;tBT}E z>!B@sRMqt0mAp-4SSVgxt8p4yT@nE5QjD-9ea`FLl4mP5HsN~*K0TEZJ|||l-v~Ri za*(8{7n(5S8*IfUyhre?f{~Gtd}rf?y7(r$G{xQdVDB74X!qlT#aQg2INL;j6NGrC zA#Cdzx=OvSM3n1+8*jOUZ=Rso>g~CnnmChLs#>THrl>Rr!g|ieMCjJ!;Gr$yLLC>~ht_|3f;t-UWXy|{$*FL^$e9@N} zD%$4crCW$^VC0Touh5f)T(UTR?0jyx*&YZ|kQ!?nyQ)~~b#4@E89+RB10{d2_0NaM zOQT*~(h9|cO?Sbv$%{$rP}>onIU?7ia3jsf`J)WFN zh&8^dE}9+e$HKGTMCeXUha{+^Zc;2Au3)}x-0_mdf0BVB_;Awt-k@VZ;aiGSKYxnu ztzPD*SK%9MDd(^t<@MkGti~O;6DOPe^6qD&7hw+4YssguL89-%l8kTF{y8CH29J#= z+4xwbHbB;mwI+lAYKDR1)x5OxSlpwi@exCosM}oJk}~o0C|vItuX**_?Ao2>>pN&m z0kn+r35w%!s7z<>-kHv5#T@q-@71QWS)1}{rly|`rl|W_FF*%lvV!`JeuX_?#OTjh z&JB;wQ9WhxGm9ZH6_vh6t!=_s)`1=uIP!`Gk%n!Jm?!Pa*UIlKH;OuYfE-j8-Mi=` zk-UAlbFlfnev&l3<>lQwtHVAiG}R5OEM`-M+6&x=x;XB-5tG$afPoHGJu-tkT`fr8 zckg0=>iwbmPR8Z?nX=h|r3F{Y*KR9I(t5j)7el)(qzK;Fn}+5Kn_05N3HEl)B`1c( zgSZoh)7X3;R`=IO2acwc?$uW069H?|n#h|D?RIhLLqQd!A%mJmQD Lc@tY)LNfmW5}Wfg literal 0 HcmV?d00001 diff --git a/src/app/_assets/tier-two.png b/src/app/_assets/tier-two.png new file mode 100644 index 0000000000000000000000000000000000000000..82eb6387572fe651ac590bd3a73e1018b09e255b GIT binary patch literal 1484 zcmc(fX;9J$7{>qZR&FYqnxrOqR#s}3SCM!iinJ+K2&0IlW~Zoml8U6;w5F>VHoD$3 zo@omPt%-`2n`tAdxt46JfM6)fk=>+sTKeL zAe2AioZ881J^W#ZdJZIt+SRr*-ajM}0JIIiN&_gXFjkiuiRX}TfH7z$Rfla?yaT)e zfJxQfjMxqU+apj2ZwyIeetaMf6TQ1{$?2~WX-?oZI$fh)+iOn)`#QnpCEUROw0JC+ z#=hCKxid*Lia?!t-}Cr!or8^y>wN^+7%OJ*v&weh>p|egvk|rpy!2e3+wk-uh;7B^ z4KnS(9i45{r<8)3TMJHY79i6vG1LAmJ8O9C?mCUh+9!PmD1m;$ew?DHuVL&)YeUgJ zf8W=TM8(puRDdWO%CYH!I}ll%)zyPfS{&Jw(poBY5K~v^NCHZ0D9h3}BE>qnA*e9L zQaPH>IM13wco=9!4P==$UOL8if;L`a(sKt7g=D0Ljhx*7GX99VIf1Q7Jbkxb{_1BZ zWLa5}zNK-%bF|P{KRYrsz0uehva9y{$Rw{{baRF^jzKN_GSor!hfsOU_ho;H|Wb$QuPUI*?h~N)JxkAN|o5-zkTe74Dm=M36cE#xVEQ6DjH9oTPr2 zh(Hy%S&;}sPr%a!lf*+3D&`s?=S`B|a;03scFKP0OR9 zD~?y=7m=OZtcra^EEL#S+IW?ufBD)J&lEi~O_pW|nkndz!K&t5+(M1)Y%Gi}gL9>Z zIBY&=2u%o>5e1ug#O&QG(e%S9rzv;?>UgC<^KkTtZ01i#!zjvlYIATvNyNckhrD3r zQ}9xMa1w-x7tXbKR$oxMbj&q-f?;?QvJdC+OIOlJVVcdAo0+rbOxxnBT`gh0ZTkqt zg?T2PX32CS2bC*gy^mJG?c_;nj$7#&lw4>p;6;7n$-Gs-O zlVLJ;V(l3;BMH_|mn{|zwxPR`JpAuq=m}0C<3sum2svH|{%jx0x0OO-lK3iTwlKw> zM_}rw^uqmkvQ>QVR%}`*HU7a7wxojq9TGr6;UE@9+X$8_KhJz72aL8_d8Yz|&`+RxT9BAB0KDF<|! zWhXLC4zRTh2|ww9Jgu=Ef4i>vyt%?1N9Rb=`t0K5S052W*i=S$GK_y%{OLN@a-U}; z+28Bk)cfDYJu_|4@`v0z1j66!&U3+3EQ zO`~A+jC1c?NCEy$Q+v5Q^Ok}Z6h*50R_wkV(EojNU2kh5Z)K$yW2b(;0LnKI!GK@P F{s%M#zc>H@ literal 0 HcmV?d00001 diff --git a/src/app/events/columns.tsx b/src/app/events/columns.tsx new file mode 100644 index 0000000..57f4c1c --- /dev/null +++ b/src/app/events/columns.tsx @@ -0,0 +1,50 @@ +import { truncateHash } from "@/helper/format"; +import { ColumnDef } from "@tanstack/react-table"; + +export type Account = { + index: number; + address: string; + points: number; +} + +export const columns: ColumnDef[] = [ + { + accessorKey: "index", + header: "Rank", + cell: ({ row }) => { + const original = row.original; + + return ( +
+ {original.index} +
+ ); + }, + }, + { + accessorKey: "address", + header: "Address", + cell: ({ row }) => { + const original = row.original; + + return ( +
+

{truncateHash(original.address)}

+
+ ); + }, + }, + { + accessorKey: "points", + header: "Points", + cell: ({ row }) => { + const original = row.original; + + return ( +
+

{original.points} XP

+
+ ); + }, + }, +]; diff --git a/src/app/events/data-table.tsx b/src/app/events/data-table.tsx new file mode 100644 index 0000000..cc96cc2 --- /dev/null +++ b/src/app/events/data-table.tsx @@ -0,0 +1,91 @@ +"use client"; + +import { + ColumnDef, + ColumnFiltersState, + flexRender, + getCoreRowModel, + getFilteredRowModel, + getSortedRowModel, + SortingState, + useReactTable, +} from "@tanstack/react-table"; + +import { + Table, + TableBody, + TableCell, + TableRow +} from "@/components/ui/table"; +import React from "react"; + +interface DataTableProps { + columns: ColumnDef[]; + data: TData[]; +} + +export function DataTable({ + columns, + data, +}: DataTableProps) { + const [sorting, setSorting] = React.useState([]); + const [columnFilters, setColumnFilters] = React.useState( + [] + ); + + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + onSortingChange: setSorting, + getSortedRowModel: getSortedRowModel(), + onColumnFiltersChange: setColumnFilters, + getFilteredRowModel: getFilteredRowModel(), + state: { + sorting, + columnFilters, + }, + }); + + return ( +
+
+ + + {table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row, index) => { + return ( + + {row.getVisibleCells().map((cell, cellIndex) => ( + + {flexRender( + cell.column.columnDef.cell, + cell.getContext() + )} + + ))} + + ); + }) + ) : ( + + + No results. + + + )} + +
+
+
+ ); +} diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx new file mode 100644 index 0000000..677fa47 --- /dev/null +++ b/src/app/events/page.tsx @@ -0,0 +1,170 @@ +"use client"; + +import { Page } from "@/components/Page"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; +import { truncateHash } from "@/helper/format"; +import { IconLightning } from "@/icons/fixed/lightning"; +import { IconPolygon } from "@/icons/fixed/polygon"; +import { IconTarget } from "@/icons/fixed/target"; +import { Avatar, AvatarImage } from "@radix-ui/react-avatar"; +import { useRef } from "react"; +import bronzeCup from "../../app/_assets/bronze-cup.png"; +import goldenCup from "../../app/_assets/golden-cup.png"; +import silverCup from "../../app/_assets/silver-cup.png"; +import tierOne from "../../app/_assets/tier-one.png"; +import tierThree from "../../app/_assets/tier-three.png"; +import tierTwo from "../../app/_assets/tier-two.png"; +import { columns as newColumns } from "./columns"; +import { DataTable } from "./data-table"; + +const data = [ + { + index: 1, + address: "0x1234567890123456789012345678901234567890", + points: 1000, + }, + { + index: 2, + address: "0x1234567890123456789012345678901234567890", + points: 1000, + }, + { + index: 3, + address: "0x1234567890123456789012345678901234567890", + points: 1000, + }, + { + index: 4, + address: "0x1234567890123456789012345678901234567890", + points: 1000, + }, +]; + +export default function EventsPage() { + const tabList = useRef(null); + + return ( + +
+ + + + Task + + + Ranking + + + +
+
+ + + +
+ {truncateHash("0x1234567890123456789012345678901234567890", 3, 3)} +
+ 654 XP +
+
+ + + +
+
+
+ + + +
+
+ {truncateHash("0x1234567890123456789012345678901234567890", 3, 3)} +
+ 987 XP +
+
+ + + +
+
+ + + +
+ {truncateHash("0x1234567890123456789012345678901234567890", 3, 3)} +
+ 321 XP +
+
+ + + +
+
+ +
+ +
+
+ +
+

Your Point: 241 XP

+
+

Begin Missions 🎯

+
+
+ + + Join Telegram Chat + +
+ +
+ + + Follow Twitter + +
+ +
+ + + Repost Campaign Post + +
+
+
+ +
+

Challenge Events 🗓

+
+
+ + + Join Telegram Chat + +
+
+
+
+
+
+
+
+ ); +} diff --git a/src/app/pools/page.tsx b/src/app/pools/page.tsx index a07ca64..ddb4843 100644 --- a/src/app/pools/page.tsx +++ b/src/app/pools/page.tsx @@ -4,12 +4,11 @@ import { DataTable } from "@/app/pools/data-table"; import { ActionButton } from "@/components/ActionButton/ActionButton"; import { Page } from "@/components/Page"; import { PageTitle } from "@/components/PageTitle/PageTitle"; -import { CardSkeleton, ListSkeleton } from "@/components/ui/card-skeleton"; import { usePoolList } from "@/hooks/pools/usePoolList"; +import { IconLoading } from "@/icons/fixed/loading"; import Link from "next/link"; import { useEffect } from "react"; import { columns as newColumns } from "./columns"; -import { IconLoading } from "@/icons/fixed/loading"; export default function PoolsPage() { const { poolList, loading, refetch } = usePoolList(); @@ -26,13 +25,13 @@ export default function PoolsPage() { - {/* {loading ? ( + {loading ? (
- ) : ( */} + ) : ( - {/* )} */} + )} diff --git a/src/components/BottomNav.tsx b/src/components/BottomNav.tsx index a807286..098c19a 100644 --- a/src/components/BottomNav.tsx +++ b/src/components/BottomNav.tsx @@ -1,7 +1,4 @@ -import { IconExplore } from "@/icons/fixed/explore"; -import { IconPool } from "@/icons/fixed/pool"; -import { IconPortfolio } from "@/icons/fixed/portfolio"; -import { IconSwap } from "@/icons/fixed/swap"; +import { ArrowDownUpIcon, DropletsIcon, GiftIcon, TelescopeIcon } from "lucide-react"; import { usePathname } from "next/navigation"; import { AnimatedLink } from "./ui/animated-link"; @@ -9,22 +6,22 @@ export const TABS = [ { id: "swap", text: "Swap", - Icon: IconSwap, + Icon: ({ isActive }: { isActive: boolean }) => , }, { id: "pools", text: "Pools", - Icon: IconPool, + Icon: ({ isActive }: { isActive: boolean }) => , }, { id: "explore", text: "Explore", - Icon: IconExplore, + Icon: ({ isActive }: { isActive: boolean }) => , }, { - id: "portfolio", - text: "Portfolio", - Icon: IconPortfolio, + id: "events", + text: "Events", + Icon: ({ isActive }: { isActive: boolean }) => , }, ]; @@ -34,7 +31,7 @@ export function BottomNav() { return (
-
+
{TABS.map(({ id, text, Icon }) => { const selected = id === currentTab; return ( diff --git a/src/components/Input/Input.tsx b/src/components/Input/Input.tsx index da908bc..411fbb0 100644 --- a/src/components/Input/Input.tsx +++ b/src/components/Input/Input.tsx @@ -34,7 +34,7 @@ export const Input: FC = ({ onFocus={onFocus} placeholder="0.0" className={`w-[100%] text-right text-base bg-transparent overflow-visible ${value ? "text-white2" : "text-white1" - } py-[8px] border-none focus:ring-transparent ${disabled ? "opacity-50" : ""}`} + } py-[8px] border-none focus:ring-transparent ${disabled && !value ? "opacity-50" : ""}`} type="number" value={displayValue} onChange={(e) => handleSetValue(e.target.value)} diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx new file mode 100644 index 0000000..1553abb --- /dev/null +++ b/src/components/ui/tabs.tsx @@ -0,0 +1,55 @@ +"use client" + +import * as React from "react" +import * as TabsPrimitive from "@radix-ui/react-tabs" + +import { cn } from "@/lib/utils" + +const Tabs = TabsPrimitive.Root + +const TabsList = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsList.displayName = TabsPrimitive.List.displayName + +const TabsTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsTrigger.displayName = TabsPrimitive.Trigger.displayName + +const TabsContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +TabsContent.displayName = TabsPrimitive.Content.displayName + +export { Tabs, TabsList, TabsTrigger, TabsContent } diff --git a/src/icons/fixed/Vector 94.tsx b/src/icons/fixed/Vector 94.tsx deleted file mode 100644 index 788075f..0000000 --- a/src/icons/fixed/Vector 94.tsx +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - -; diff --git a/src/icons/fixed/lightning.tsx b/src/icons/fixed/lightning.tsx new file mode 100644 index 0000000..37dd0f7 --- /dev/null +++ b/src/icons/fixed/lightning.tsx @@ -0,0 +1,21 @@ + +import { Icon } from "../../types/Icon"; + +export const IconLightning = ({ ...restProps }: Icon) => ( + + + + + + + + + + + + + + + + +); diff --git a/src/icons/fixed/polygon.tsx b/src/icons/fixed/polygon.tsx new file mode 100644 index 0000000..158f7fa --- /dev/null +++ b/src/icons/fixed/polygon.tsx @@ -0,0 +1,10 @@ + +import { Icon } from "../../types/Icon"; + +export const IconPolygon = ({ ...restProps }: Icon) => ( + + + + + +); diff --git a/src/icons/fixed/target.tsx b/src/icons/fixed/target.tsx new file mode 100644 index 0000000..1652342 --- /dev/null +++ b/src/icons/fixed/target.tsx @@ -0,0 +1,21 @@ + +import { Icon } from "../../types/Icon"; + +export const IconTarget = ({ ...restProps }: Icon) => ( + + + + + + + + + + + + + + + + +); diff --git a/tailwind.config.js b/tailwind.config.js index 0e69b32..fa8ca3b 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -35,6 +35,9 @@ module.exports = { navy1: "var(--color-navy-1)", purple1: "var(--color-purple-1)", purple2: "var(--color-purple-2)", + purple3: "var(--color-purple-3)", + purple4: "var(--color-purple-4)", + purple5: "var(--color-purple-5)", grBorder1: "var(--gr-border-1)", grBorder2: "var(--gr-border-2)", grBorder3: "var(--gr-border-3)", From 72c923ba2fa49c0357343bc25d4d785c34224620 Mon Sep 17 00:00:00 2001 From: vuonghuuhung Date: Sat, 5 Apr 2025 18:41:32 +0700 Subject: [PATCH 2/2] feat: enhance Events page with new challenges and missions components; add new color variables in Tailwind CSS and include additional assets for event graphics --- src/app/_assets/globals.css | 12 ++ src/app/_assets/water-cool.png | Bin 0 -> 8398 bytes src/app/_assets/water-dance.png | Bin 0 -> 8929 bytes src/app/_assets/water-patient.png | Bin 0 -> 6487 bytes src/app/events/page.tsx | 165 ++++++++++----------- src/components/events/ChallengeEvent.tsx | 50 +++++++ src/components/events/ChallengesList.tsx | 40 +++++ src/components/events/EventProgressBar.tsx | 31 ++++ src/components/events/MissionItem.tsx | 15 ++ src/components/events/MissionsList.tsx | 26 ++++ src/components/events/TopRankings.tsx | 70 +++++++++ src/components/ui/page-transition.tsx | 2 +- tailwind.config.js | 6 + 13 files changed, 329 insertions(+), 88 deletions(-) create mode 100644 src/app/_assets/water-cool.png create mode 100644 src/app/_assets/water-dance.png create mode 100644 src/app/_assets/water-patient.png create mode 100644 src/components/events/ChallengeEvent.tsx create mode 100644 src/components/events/ChallengesList.tsx create mode 100644 src/components/events/EventProgressBar.tsx create mode 100644 src/components/events/MissionItem.tsx create mode 100644 src/components/events/MissionsList.tsx create mode 100644 src/components/events/TopRankings.tsx diff --git a/src/app/_assets/globals.css b/src/app/_assets/globals.css index 74c613a..3914648 100644 --- a/src/app/_assets/globals.css +++ b/src/app/_assets/globals.css @@ -56,6 +56,8 @@ --color-green-3: hsla(251, 58%, 27%, 1); --color-green-4: hsla(145, 91%, 41%, 1); --color-green-5: hsla(120, 83%, 69%, 1); + --color-green-6: hsla(159, 84%, 45%, 1); + --color-green-7: hsla(159, 67%, 67%, 1); --color-white-1: hsl(0, 0%, 70%); --color-white-2: hsl(68, 57%, 97%); --color-white-3: hsl(0, 0%, 100%); @@ -63,12 +65,16 @@ --color-black-2: hsl(0, 0%, 12%); --color-black-3: hsla(252, 16%, 9%, 1); --color-yellow-1: hsla(72, 71%, 57%, 1); + --color-yellow-2: hsla(35, 100%, 49%, 1); + --color-yellow-3: hsla(35, 100%, 61%, 1); --color-navy-1: hsla(251, 78%, 10%, 1); --color-purple-1: hsla(266, 69%, 63%, 1); --color-purple-2: hsla(251, 34%, 26%, 1); --color-purple-3: hsla(251, 23%, 14%, 1); --color-purple-4: hsla(252, 40%, 17%, 1); --color-purple-5: hsla(266, 100%, 64%, 1); + --color-pink-1: hsla(358, 100%, 68%, 1); + --color-pink-2: hsla(351, 100%, 77%, 1); --gr-border-1: #052b2f; --gr-border-2: #073438; --gr-border-3: #22174F; @@ -90,6 +96,8 @@ --color-green-3: hsla(251, 58%, 27%, 1); --color-green-4: hsla(145, 91%, 41%, 1); --color-green-5: hsla(120, 83%, 69%, 1); + --color-green-6: hsla(159, 84%, 45%, 1); + --color-green-7: hsla(159, 67%, 67%, 1); --color-white-1: hsl(0, 0%, 70%); --color-white-2: hsl(68, 57%, 97%); --color-white-3: hsl(0, 0%, 100%); @@ -97,12 +105,16 @@ --color-black-2: hsl(0, 0%, 12%); --color-black-3: hsla(252, 16%, 9%, 1); --color-yellow-1: hsla(72, 71%, 57%, 1); + --color-yellow-2: hsla(35, 100%, 49%, 1); + --color-yellow-3: hsla(35, 100%, 61%, 1); --color-navy-1: hsla(251, 78%, 10%, 1); --color-purple-1: hsla(266, 69%, 63%, 1); --color-purple-2: hsla(251, 34%, 26%, 1); --color-purple-3: hsla(251, 23%, 14%, 1); --color-purple-4: hsla(252, 40%, 17%, 1); --color-purple-5: hsla(266, 100%, 64%, 1); + --color-pink-1: hsla(358, 100%, 68%, 1); + --color-pink-2: hsla(351, 100%, 77%, 1); --gr-border-1: #052b2f; --gr-border-2: #073438; --gr-border-3: #22174F; diff --git a/src/app/_assets/water-cool.png b/src/app/_assets/water-cool.png new file mode 100644 index 0000000000000000000000000000000000000000..93c4308ff7dbe75ac661a3535d05d9a0c9f85ef6 GIT binary patch literal 8398 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 klYq&(P<&xl&g{%4^EqeP zWOgy1YeVi8$Qkb&KQdXl)!zV=*g=DvJY>bx}N2&=G`Eupy3UEM)nVs0SR*yY4l z>9^yaOoWPciLxUN6xgZQ=eQ>mpkiHTNT>{pVhI?Aa6kT24mQBCGzLTQ3l;0aA{Zzb zMuA-dVn;LvBB#>^xFc2Ul72gZut6*<+JJAUSPmwG0r4QK17atpNfFj;3<+yRQ7nZt zAO*zbU?GmBNdYN-;mVFC&KeH6d0yD_-cd*q%hPYi(&&VOQnWB{L6Yk3%p1nQil5Ae zp`!+{@7La6jl!vi6u``k6$v+kML43-L0A1nTt_wjc;x1L;qKM5;Mzr(M;$-%X(ObH zD6;h1GSN8MlSU}uWr9h-(9r|nk>B1FBbXgq4#DZ;7a>)sAGK_96(j-92kdjt-mwaz(+66;cRUvjPO&q#2q$E&=wD9gp zF~^U5)(B6cU|KE&z)Y;D5IdGe1)dCvQtJEG%vBW(S(vpysy1CPgcTzbPWGgLMl!J_ zknoKl!BD_E_R7IAkD2X~ln5YP4{646PZB*nq{M5D;-%C?x&meSKCmy+|;Ou$Vq;(~7Y zN1dsHAw4z^;OkNQ;Z=^`bFCFa%i`YC_tb zbhxNqEgGW)^W3AmGD0u}je?r(qI#`pj1tVtPwj?3Z#e{+gxM}iwaXn028%mw=`|upBafqg; zbb6uw3$I`Zc9=ljqa*>Wdss`QG2@D}g+v`jW$ zEhb%4ccv0HZ#c`<*4F0Z6bwVK;oi2qt$|36e0nbC*n!G-Pip!Wl2wdYkTHfm>vo`JHeDym~ON(KC~WMo@43WD3NH{ zwLuMvTQWR$Nr+jyg6gT$*y2@ARWN-6b3zG$YBFeTs(GJ)Y4s{1YPbh>k&h!0XG3?4EoI7W(SUoEyt-h}0a_CE#u`Y^_hd(0n9;ywqLHe+3C%s8Qz41V5@>BT@9vot!^CS3 zY<#BgxF#8+tHVq*ot>R(uW$`?xg)wS%g)X&2aBNM9nWHXg5sFFe==M3F%nFQ``u+G z23Ln!mz!!eisMaQuXjG!0J(U_d;aa;ovM1A8jzcw?Y%Xbgmmqi#T&OKMRrd<#c@B_ z0G3*7ti|MDcBG_h>#{y7m@W#8+@p_)#^rKFeLTbA@DZ>9EVb5Hy!%kGPp>=--iz7; zy5PN%9S^d5ii)mLM1HUswnvPPtC;MNrtGd=G#=_dYlLktAM70s$P{r2!XmumiVKs$ znod~Ui&_9rnUa-(FRf3aFBYWMf`ic**7cS}3+Zi@-r2MlIX5g{7f5Mik7y zz?OqCagC~IREmA363{r`>!6>IXp(5s3A>D+6UU?t!GK`cQqfR7CLPy(bcjGmJs6fn zt;6L>%|)qN8Whb~Fp*_bDoc}X^z2|F zDF(yxXhc+38{N|&FbQ%?V3UiI_f=9Y@~K)H<*0;_IBv;$QZ4eys}cN)<32Ef6__nK zZpj`5g8JWM+0w*}wV6@i3p?48ZAfJ(iw$9UJRW~A7>s&=R$hXEyD4=Q@$?C?QwYG3 ztb@?#Itgt;*FaT&aR9pw4v&Cg;W6MAz2LwP#x=S_5GERQPfaSTEDf6}?Yi2m{vzJr zyxZY|5WP{NES_UoU6XpFLzm-iJPbk+IV49A^uNEZo*yD8U6f(LFbjTlay;vBj9}Ct z@sPOcJiEFD!?rX_A^0Viqy-Ysj_i$a*xmOQ#c4!$Ww={3 zw1cPehe~lxN`wWrSYJ03x9H)JyB2n%<)L`UK^?b8pJC`0joa-e(L{}TVv(;HQh+MI zsn%phVVvU88RU|c`kN!1xP-#`-kZpnh6EF3ZG@CNqN!JY$$DnFaA}WgVniclQ8kKV_X8(_nEoBjBgHc|Gzs!CaE^pBFN%d6 zRM7DOSG{x(#xd&^H5yjvOSXO5GP*uNr*T_aXobXcRj^AO6u&e}?FSN(V`btXYM;_n zoe{?Ba1AI5eHhmyjZ=gWzeO?|5(#y{>E;L~KA3jlKHK6SWoCDoJO+ zD&r815)B~*#N5^<5VFoKIi!G&m8}V{q=8uz2`9?spcR_07TYW@s;W+98Z0;83lnD! zhasZ|ur29jS}z9R^s$TV!d(YOa6la`)<4?0N;fkf^R(bUC}x-g=IBjKS?@agCq%{G@BS%&@j4$mP0tzNYfmfm_(%y}!& zdig&)hZ$DSOtB}YKV*5_&_6$)eV^s=fXfs8CkI>GAQbF`P-hSV_%(gs*T4dw@uDH5 zi;2}hbXr}Uo9}6AIUh{;T)N1G+Er0VB=hY6}f=T)x zs$JxQ1T%ldDkh56-&x5lNF*ep>Q`RqJ|~jrUf+n%Z-HMuzB=kS#W-KP^9tDcUJIl` zzk&JemOo;6_pvVVG(+>rQ_ylI`I4GcXh5OVxpzV^&iqeSM3Jy^Xmw zC9~${Kz2XlH~7lEWH4NEnGeRzxdtZOSPYj={|e*|84N~4g4yeNFRoye&?xJE&rY^% zCtYj4G{3qO6w70wWNDJ2W@X-Zdpo}A+u7Im-nAs*^NS|LPpKdI&tJz_p?>`Y_{xla zU?yISl?uj;?iSD>{F;s#!C`kT=!MpN(XyR}ta>mLT^~sl4qZFQU;laX7+9?q^VEwy zS2dJln0VBEo_HYq=@(I-d)1w~E! z5$O_*G^n+hu5ywHs`@G~JW4@tq;;U6HXaoCs=1&@w!XhBChHnD(gW#+f^M=tvg^_- zp1}sKMW@ArysK03{WLG8iDcF6SN*LQ5@!@cM&-sFQ(BIvUVKUQxg?mC4?Py+ew4`d zok++<4J^n4t03`=zkV(ZyYdRq3QZsylo6S>G+DQ3cy_*4S{Xw525+s|3G@bZmbDD-``RV_n$5LDq?epqkLID=+Vkd3Yhg%n97a##U2B>pFN|^c6A)DhP>* zPf_by*PnF^leLDIC41b0`qBa7r{=D%gVvD-T%Q~S>>4rdeblOoW^csHO{$C zv3p(%LhIo95R#|C5$Lxx98>IPR4xOUKfoA&9f?|6-eEJ*5M*`8U6I8(`***Vr*_Xf zkC(O$BH>WQxDkca?z$M2bA7z3QHr=h)fGL_)o-adT!HDx7p+dWx}QOKdt!tpgrw!#dw8jZ7J`GE30{DcSQu zD`X1P7`0qD0{^HdVY+B&5WKZHy7@+edFkmVKo9S}zmwgQU^b)WQBwc+K*m@a84?b; zDywj57%G>}*M}hTsgqpP%TMi&IZhTsIohCv3VmB^x)OA%#Zb|Y8l5DV4ZnCICYB-o zxHU5e&8dq{0kS2C+C*b&_9R0q2WS9X*}Rm4+mic!9JgI?&%;0Mc4Z_SCbq{`s|sfK zuGWmRGKJ&3Fkzw>1`f`G;UlkxU~5-4M5`?1B|8WAoHBLQ1y=X{TF%$F@T7<3lPez( zg|2PuX{=Ii(8Zf_qn5&>l{c})aB95q_BOO4e_+-{35kZ%YMSheHz$1lTnL`|#aYM% zvavTddu|TQoYNosWPHY+5(@h8sl|w?@>*S~CLQP&4edkY?VnT0O5~SB4P;P1QZQ!r)ul?oupf$<00nn6>E_MJf%fKRHoQ&d zw&DCGFlk19+!w81wwDRz3SS|+4a1*L$KpYO@5Wb~Z7-OCgIsXOih(eFc7JfYb$?bN z7yEe&S4?7`c5+*(fC4#7VenP+Gkq4IS6nSSx zD9&j>w=;5bPliC_3%A~$2Zfhuo3tar?L@(3f;*B06K}qUVz_rPLwsk)E+&}n=SguK z%~0Q*po+ffnOfNRtp2$f>~KH$`X^=Uv^*yz(cClR)h~T>X8Za{>x%S3;+Zfpn`IHh zM!92L7sV`;71e(kWP-7Kiy)F)m*m3~m6>H4GW%i0Q%p4XVU>H%)l->UCMy#;Lro-F z??tS^7)M!o=fwr${8#GAYP38jCDGh9rLro!f6hv^U^o?MH33cE5j5hENg|1a#6qG` zLi0mZW*CSaf2uc4QE9l+Y6}uoB)1gLW90^=)uG_{k#GJUTAH7s5hA7Wwy8r) ze4)~=$KKv95gK5>fO z)EGD960m}ye|Z#gk8ERKPkn-7J`s*@+XTnoc^cYA&Vj}m4?}Rk7%&pGwO3E$n=Mzq z)dZm=UKT~|6pC*mMMtBxGv<$hKWi!exnMKsASFvfzEDu?ij|0PF#RR|?8Z-+RgpRJ zyDAuca|v9(sTvkl?|`f4kAz7d+yTRP{0RD=`~ZxAGA3nuO;#o{xUD~t*p<-vv^*ys z&%YkKv}e*xjmuxcplfAb%3W^E^WWz^Hxx|&wF&y4h<@Rl>T03p_W9s{a|7gz@uB5e z3%Bh45*9wP6lRAufbY$jOhDOjJLj`2?`_I?R_1E1CN$T5=;4zO?|d&n9AE zWHi@|aMLUM%X9_7gdy`Z_!4anEA|^!gWMC=bs)=~mN6a%xtGqoG2p&%6g-}63{r^+d4h4_b3&B7DT3Vao^yy=8rr{Wz{-B242oeoho`T6;;~1{MdB{8TCbK$Pp+cU~ z34Z>7*k#Yu6i$i&x&=cR^6rs~S~jK1&$AY)^-Lq=jTi>$q~V&MVV$NF7JPjvAB`WXgo`2{${?gIYgIZLOISm&oTC z;yxdYg7X(?PLr9Aq-E^QaCZ8`@c+Bsf!5XwanBnvbTlmZ+MO_R)Matc3FIY@X&O$% z4xuI6Qbj8y80A13S(&8q3}#JQdre9V6OGpm>jaJg<>r$O%tfV}#u*R6-^Z1~j+(dN zi2u{L=aCDWIeP(CbBCxt-Zo+mB!e2ON+?6py55Ug3G&h%W$S>}k1646T8b5rB8F|P zP7iH&}U-oWuB;=D`=3cqa(ojNjy*rzOC}VVCIxbtny3E z%E(^SOHcnSMuflrO&z<2L?Xg&c(Cr|7EKLGC5A3x$r7Q8=RDf%&?=g*xD)*^hkIb#)|cSW7yICR)0wFAa&q(F@(DddP9zvgxq12gK&+df^(8ZPNs(dZV_?4=G}38Y9(gYLZ=zg?7iJ^xMdB3N28rh1?b0sKwB5 zON$= z4@OM3XgO+{pe%|kPO{A-DUNBDVwo`<0W%3^)3Zq$)mWEl%@U_?);Q9c_(z&V>9op% zKuFljQzh;TZi<9+$MS*L0XHW1;1UcWh-I(sFRKC#&_&=xQDor-ZU5_byVv8rzxzjm ziSP!+v>s|an(B1+q^x4z4Y_dbf?UuG1-;K<48v8((-{1=wYB-Ova%{cCHqCulzTj$ zimo4PGU%q(;eV5~nQ6yt$}Gt0ka$=DkaNG|11J(218X-6lbtIMYUNtAa=}i}h00E{4XZUYcxm>xuIy&s(;5nB*S*dK7+FNMVcrh}%7RBOKlQmU+Q7}{%@o9L%J7jA^YD+iT%z1}L|BoGMDZsnRr4$@wV^|-~w zyt_$~#X0%OK}+Uu?1a2sOXTGdl`MPcY7z|S`SG9)f7(Su3+yNr^$3jU`PVsvT$%4w>b{HM`gv@xBi2?-RMn z!Z%7MH+_BCmEGTCpgI<`p=n;23VfDz3bhJ{Hbwf!-u-Z__Tye@b$I_K5=?&gV7^%K z%^yvTdegB0r^!c2*Cgedv!U~-onUEuS*vge+MU9`>#x1a>d+NgXvYnT-+08sVmuLx zcXeguC=!3QoO5-IHd`#hpvcNC6ii@ z?r2?Pvy!ldXk>W%R7wV6a5xlGbDoVO?ZSnVr|P{}h|kqp{MasY}b z4=bx|Q%MtszR04qoH;Aq>)R!RtP6gKs8e0ebAEe!`vaIYt&KRODHv8-Dx?OVKR@32 zmXFHC>9E$K(&y8tq4fPYnmHCQNEWr1y}M~Y-^^}QWhO{C}Ox#x`c8fXgj(P#x7b`4&ZB8iz16WR6y~eS`e!Q&!fb{r#QSJ z$?s?#=$0PGKek+PxEBA|>1yXMomS}+LQu}LJSJ60KrT=0XUeRNnMf=G7VGpb&R3?( zREU%7D)ERIi||DpjvD|+{I1pzXYj`_Sr~t!=cZFUW|OK|WK`msxF0?lm5hl<+9kJ4 zG-|;Y`sKxLx0`!?PPceKxZa4EC!H8278$iK@=9@n}`3W{>)1Y0^256+-H_WiAREEDAaJI z42wQQ#VSu-kHX>}M7KmVDs_dVL7NfKstA`0d?68vT_8*q1$=Q+h=pjxlCH@)yfCk6 z&!3J|2w|wb=!RM&m%wTzP7f(Ac2DD;-QDtH*%B5q?KEhlI9!~G)<$x-HIc{A z-A;vGilytGXrUG;3VSG|%1kuv)NoZC@8$EmU{1@AGPWsGTht!V7B2kZ6916o%I8U+m~ zp_QXpi!7jgxCweaw4@QV9DcEA)q#oHgxQ}AyAyLdcSTJoeFp%o6buaikYL1 zV&;HFDag_R{w2g!S=#)(Bkvu?@hzU;o9+}V-oq8g^=MdQdV z87N3fH@s%uR85O!)?zqtOGawkP1S5hSfBMJk0eO$er7nGr5dAVEsbI+$`A~wRX0_W zqJdjNKuhIPqi(9^+*2jol95_-Q#EI4rt*nhl@tu9H8)jLqH&zWb4!i6shSdvnkr$0piAOZA5tpx7L=S#h zFPLA`+egn)B|z;BMVLs7X4Wm4_i7$|ViPT2y=di@Zwb>KZpg6LkL0n-d5TE1mzrCmE^^t=o=mHC;!n7%~8X`z^ zElt8Y_|JDlQ9Or;9C`TOGc2pp@%8ZXq z(GLZ*GIL-Q9IiG*gibV5`NU&xtjy0}I^{=IUS*M`ePK%Yg-SGb^OwvDtiZPg41i4t zRl+Y+qOnWlnOPYGzrtIYIl@zO6B^Oj4HsZ`N- zTN|NQ_k3jIV8)4PBFacZQodzyC_O@gA*`iwYGopfu+~Oc(ZsjN0b<5BLW)MQGDKZg z?=Ng^P!?Cj&_Tp$o17NU+9pXrre;_$HVZ`m{r~*ITvxk&-BSAI*N#$DkrL7_ei|Tw z5Y#l1{UnXUKTT(k{| zysNt8UKA0nmRKm!C@03o%6!fw@C{k{gJ%k)#5O`8lxSp0dd%*9qiYIh`GaSAMCpDD zBN`_IlVO<4OvH5XJ4Otl#F_L}4h{i6N2QU>yKY9%-6Q26tiqXb7 ztRAW|LJU~WcC(#L8r#CXCkUwatjsLjVA*Gf`?{%$2w`a?***Z)^Xf~dYF02ngzk6M zMN?{=DP}$es;-Nwx@h9jY%fTURWl&2x@cl6bwWGtSLamY`i!;G&VH<6cwc3D$B4 z@1A1U)nv?y>}XjXb_;qwKKsG z#CZ-xH2Hj-n+XajDx!(wnE;Xe4~7E~O&rezO52y#`FqdrpaS98Jq1Xj-d`8xyJ%1f z5$9(DM)vn2^<6ZHnYeZ)X#5Tbd>2h29y$mdzbgrR7fslL;Q9s4mX8qOYcL$d;?u$f z!FBcZwD5+dv~bx{MGVcYtsFeo^Y+rGV`e%})8pebH8DZgu8h*viMVC*Xp`ei@|1MZxMN^Q2w=_Xn7AHWkYc_w9ZumrsP91$MP`4#Z z{)Gj;iiUr9N(#u*Ah=y|$8Aaji3Z}I+kdx<&cAz{AHSkN@NsULuU+nhEVWYr;EKL= z+dV=GMh`>{@dV{E{pxo6ou~1==hSxdO)QwtRwZ`v0)A)e?oTUj)Nc}X{+xebMdPPm z1&Cd4>fGokzakP4&Mhn)zb#`T;g5^*_iUHpSM$;oT}qszG3hc*NY_^;Pf`Ol7Z%Z) zRqGUUA4Vqg<8=J|Q956Ll0IJWo{}&G+OaK_S5ix%d`ndD$ z#JWY1Frqo1IPFO=8W7I0Gg%Ummpuwb<4p3n661-2Frul%Nx3j~l0*Yy#-kkaB-TAT zg%Qn?!b&QaYXZ8b#`=X+E(nUf#58^(jA)h?R?(Un?_KC7Zk+Br{)9vWy}Hlb`bSg_ z>+*MzNC?&C?wGzuu{h{OjY*dr#W)bldhT{_x%mNVZ5FflbT^A;G5e)RLg(L66SJgcHAM}GqLkRRa@4CIUm~wa2^t|E@HeKB z%BxYuU}PWNTDRZVdGs1x!^K@Op%DM+&CRA$SK<#)lO zKpVSguQb%xn59{AllPMqC0e~-JR^fc=}^WrL*xONWRyt8aIdPh#gmKTZn39x?*xBE zQ|Il6*Lp0YXZ8YWA-BjR`!>qyYnPi7-#IU%Cg^IS_5^h&NZ4&y9oV|cRRyE;$IfPH za(bLLtl2i#EpKXVb=~!red;*@Uqu6-+PiTu=eC0H^^dPLoggo)PBb&GM7u zJFi^R)dTDK?(ox!creDaTonV%IT{9II;gqTv$)FRQ2NpB!|#5BUOn{!ZE1gi)-G9J z^!qQ2<>;k%zM(uDftvz}q`N>^J?FmRyJ!k^lufuO`)rYyDua+_gL=o#98n%lSYAad zqx}Cx?R5O3>q3UxIn3g4!%a)qE6;AH=lB@}1K&#{{&Ogub2FTJ=dV%WOuKt{(ZM-IE1b1#&dWI26$cg%y(c#oM-zM5qERbcn zZE|w5FOf)Kos%OC4Gn|XJ~cJf$?xrvBx$6+zJ4!1=g0w%bPQg0vdSm?H|9HQXwy^> z>{@|F`JGREQE>?(;`A6cbCAEqVh-2v|Ghv?NJ#RIXWmSg6wdVYbXTEJ*oF4vw%v_w z6B84uy1KeO+`cEd-Lu@jS+mbd7GH=DK1sSp<}dHYm#}Ew=a(sUbB?!lI}uKAM`nP( zWfwW1;}0L0w+$yAy{GeICuu4_8ze7pX;%VX^hm-0j^X^TPtt|aoRT5{PL2Ufv%USo zi&PSh9iMx%@0L=#sqNdZ+mwb;FtjZ&ZQrEH7w%I9Qv|EBi?!=}iXxy|w8DYz#7VkIrj&)xjATfY;(@5q8U?L}Q19i^D-U=`6)U{w3L zV`-QCjhIgLlV)#o3i~$h~XMp$JuiMlH z6GtWB0oy@7xRNy<6Qg4ka~%|!mqM28tqfps=#2t8GCTBcr@6TqLGd65!M5U4VjB1} zR#_LDp&^c*(WqJg4Ab;JyB~bfA&3g%;D5A%4s_$1Bb^Hi4%*J4F}fJLrLFYqYuB?oZ(9^`h^ zXFj`F2+SR4L{B~9trhvz5;R`;U)4lb+= ztOR)*%+zb5FA0|;NuKA-<@mE{t0a&WPOJ^q-fdeO>=YJ^G$RkB)wDF$FQC?@6||zY zy=s&4O0Ple%*tpWj$vyt!0qOBtR<(Y1z*BXh*45bKgp(QcVlDYpi{SG9v9VQuIDZ5M9K1;j=!uUTd$iv#}w|;hRZPYhxmy_We3-oQ5GrRcJnkh{abML#V+(TiG z{x$#L9&!l+VA3g^X3gH1%m1tC-rdQ;4atSKK44dXGOnp+`VO4~Vp2WrXauj9YmaKx`0?BC<>0_{% zirb*it+hcX#IVWP6b}_IHNyJQ?Ub8fOpVz4benSeTn~mAa5Y&8=fmN*9gX;g5%iX< zgI{^?^J)nv+yslnXl*j&j-v3uZARau&(NVr2-m!RB-V4{Q-(q5Ix}09Ts%z5kn{`^}t>IcUsw!QZN7eW0_sdyjl##Sj zN(@begZKu1KPtk(ah&E0!Ms{=zF>eFlonlZe7-VH+QB3|*iSC;G=;^jd1SY=%cRWE zcA(8pIPm*X5DtF7avY{{jJaSmRBNN}%_3AdfNrwYXH;v{r`weCG8E)VG#2L3G>YeL zIo#KPVe?Z?eyk=Ovlu7r!a;0yBKu=cg3)1|acn zMyc6s_H&gQ$^pGV1odXP zUHjLp9cVUlzgN33)nqCJlhW^_W`A8%*5cFrgOSzkGI>j1GOEY%JSig(PF-F)AX^My zEW0&Dt2W$8B7g zp5Bg3zg3N~b{}jJmtTWBLW0sF4>MHY9F@{@^hgQe6oE0t#>U2e@<`ds+&dJGGD=>q zU^I4a%=8pU+Gn-G){>jo&~hHDYG|(h9dr?MK`ho~4)RmuN$NjXft5IUY_Oltv0a9E zgh#6PHZ?Ulc7JA+EgB70dLPXnR?qTdf4Rk4X24xZGt@81)@6&;6b~#55_VQaR2bR6 zrDIuo_djnp53==|TT-g-Ds|yjOf(v5%X9K9kLiyzdN?ar$;gs?MHxJW zPzp3OUQfA7I_WKV+KLD($gDIv*uwp5j`*KZURc3^P*(0)6tTOe5~Il$ zqwj91$Si@N2uq%(2*cWNp1Y=4>z~SmMUx`$WHAQ`6W7923K8m?52#aP2GyFBE}G4A zY*L?{xP`@3CRmTo;jVBwIl{!aLg9_Z#>Ru9SLj(0i91%{mNWb`Xxy&#s?;D9Q&C6s z%i8(@?u~^&9REwVEk_X|(ziJ=Yb=h3^e?YanHcXaAyTi+FG3m9c*VHjve`}1+@dbn zZ23Q;NKJ``<`Cm2 x=3-oectb6zyj;oHLoIw)z8A?piiwFS<~Jc1&LUd>w`TwV002ovPDHLkV1fjOhkO74 literal 0 HcmV?d00001 diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx index 677fa47..951dbde 100644 --- a/src/app/events/page.tsx +++ b/src/app/events/page.tsx @@ -1,12 +1,13 @@ "use client"; +import { ChallengesList } from "@/components/events/ChallengesList"; +import { MissionsList } from "@/components/events/MissionsList"; +import { TopRankings } from "@/components/events/TopRankings"; import { Page } from "@/components/Page"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; -import { truncateHash } from "@/helper/format"; import { IconLightning } from "@/icons/fixed/lightning"; import { IconPolygon } from "@/icons/fixed/polygon"; import { IconTarget } from "@/icons/fixed/target"; -import { Avatar, AvatarImage } from "@radix-ui/react-avatar"; import { useRef } from "react"; import bronzeCup from "../../app/_assets/bronze-cup.png"; import goldenCup from "../../app/_assets/golden-cup.png"; @@ -14,6 +15,9 @@ import silverCup from "../../app/_assets/silver-cup.png"; import tierOne from "../../app/_assets/tier-one.png"; import tierThree from "../../app/_assets/tier-three.png"; import tierTwo from "../../app/_assets/tier-two.png"; +import waterCool from "../../app/_assets/water-cool.png"; +import waterDance from "../../app/_assets/water-dance.png"; +import waterPatient from "../../app/_assets/water-patient.png"; import { columns as newColumns } from "./columns"; import { DataTable } from "./data-table"; @@ -43,9 +47,57 @@ const data = [ export default function EventsPage() { const tabList = useRef(null); + const missions = [ + { + icon: , + text: "Join Telegram Chat" + }, + { + icon: , + text: "Follow Twitter" + }, + { + icon: , + text: "Repost Campaign Post" + } + ]; + + const challenges = [ + { + backgroundColor: "bg-gradient-to-r from-yellow2 via-yellow2 to-yellow3", + buttonText: "Swap", + title: "Let's become a trader!", + description: "Each swap will gain 1 points.", + image: waterDance, + progress: 50, + currentValue: 100, + totalValue: 200 + }, + { + backgroundColor: "bg-gradient-to-r from-pink1 via-pink1 to-pink2", + buttonText: "Add Liquidity", + title: "Be a liquidity provider!", + description: "Each add lp will gain 2 point.", + image: waterCool, + progress: 50, + currentValue: 100, + totalValue: 200 + }, + { + backgroundColor: "bg-gradient-to-r from-green6 via-green6 to-green7", + buttonText: "Remove Liquidity", + title: "Be a clear-minded guy!", + description: "Each remove lp will gain 3 point.", + image: waterPatient, + progress: 50, + currentValue: 100, + totalValue: 200 + } + ]; + return ( -
+
-
-
- - - -
- {truncateHash("0x1234567890123456789012345678901234567890", 3, 3)} -
- 654 XP -
-
- - - -
-
-
- - - -
-
- {truncateHash("0x1234567890123456789012345678901234567890", 3, 3)} -
- 987 XP -
-
- - - -
-
- - - -
- {truncateHash("0x1234567890123456789012345678901234567890", 3, 3)} -
- 321 XP -
-
- - - -
-
- +
@@ -124,43 +150,8 @@ export default function EventsPage() {

Your Point: 241 XP

-
-

Begin Missions 🎯

-
-
- - - Join Telegram Chat - -
- -
- - - Follow Twitter - -
- -
- - - Repost Campaign Post - -
-
-
- -
-

Challenge Events 🗓

-
-
- - - Join Telegram Chat - -
-
-
+ +
diff --git a/src/components/events/ChallengeEvent.tsx b/src/components/events/ChallengeEvent.tsx new file mode 100644 index 0000000..f2d6b0b --- /dev/null +++ b/src/components/events/ChallengeEvent.tsx @@ -0,0 +1,50 @@ +import { Avatar, AvatarImage } from "@radix-ui/react-avatar"; +import { StaticImageData } from "next/image"; +import { EventProgressBar } from "./EventProgressBar"; + +interface ChallengeEventProps { + backgroundColor: string; + buttonText: string; + title: string; + description: string; + image: StaticImageData; + progress: number; + currentValue: number; + totalValue: number; +} + +export function ChallengeEvent({ + backgroundColor, + buttonText, + title, + description, + image, + progress, + currentValue, + totalValue +}: ChallengeEventProps) { + return ( +
+
+
+ +

{title}

+

{description}

+
+ + + + +
+
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/components/events/ChallengesList.tsx b/src/components/events/ChallengesList.tsx new file mode 100644 index 0000000..af77e66 --- /dev/null +++ b/src/components/events/ChallengesList.tsx @@ -0,0 +1,40 @@ +import { StaticImageData } from "next/image"; +import { ChallengeEvent } from "./ChallengeEvent"; + +interface ChallengeInfo { + backgroundColor: string; + buttonText: string; + title: string; + description: string; + image: StaticImageData; + progress: number; + currentValue: number; + totalValue: number; +} + +interface ChallengesListProps { + challenges: ChallengeInfo[]; +} + +export function ChallengesList({ challenges }: ChallengesListProps) { + return ( +
+

Challenge Events 🗓

+
+ {challenges.map((challenge, index) => ( + + ))} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/events/EventProgressBar.tsx b/src/components/events/EventProgressBar.tsx new file mode 100644 index 0000000..b1f19bb --- /dev/null +++ b/src/components/events/EventProgressBar.tsx @@ -0,0 +1,31 @@ +import * as Progress from "@radix-ui/react-progress"; + +interface EventProgressBarProps { + value: number; + currentValue: number; + totalValue: number; +} + +export function EventProgressBar({ value, currentValue, totalValue }: EventProgressBarProps) { + return ( +
+ + + + +
+

Your Progress

+

{currentValue}/{totalValue}

+
+
+ ); +} \ No newline at end of file diff --git a/src/components/events/MissionItem.tsx b/src/components/events/MissionItem.tsx new file mode 100644 index 0000000..6a12b9f --- /dev/null +++ b/src/components/events/MissionItem.tsx @@ -0,0 +1,15 @@ +import { ReactNode } from "react"; + +interface MissionItemProps { + icon: ReactNode; + text: string; +} + +export function MissionItem({ icon, text }: MissionItemProps) { + return ( +
+ {icon} + {text} +
+ ); +} \ No newline at end of file diff --git a/src/components/events/MissionsList.tsx b/src/components/events/MissionsList.tsx new file mode 100644 index 0000000..c8a5bc7 --- /dev/null +++ b/src/components/events/MissionsList.tsx @@ -0,0 +1,26 @@ +import { ReactNode } from "react"; +import { MissionItem } from "./MissionItem"; + +interface MissionsListProps { + missions: Array<{ + icon: ReactNode; + text: string; + }>; +} + +export function MissionsList({ missions }: MissionsListProps) { + return ( +
+

Begin Missions 🎯

+
+ {missions.map((mission, index) => ( + + ))} +
+
+ ); +} \ No newline at end of file diff --git a/src/components/events/TopRankings.tsx b/src/components/events/TopRankings.tsx new file mode 100644 index 0000000..3c84417 --- /dev/null +++ b/src/components/events/TopRankings.tsx @@ -0,0 +1,70 @@ +import { truncateHash } from "@/helper/format"; +import { Avatar, AvatarImage } from "@radix-ui/react-avatar"; +import { StaticImageData } from "next/image"; + +interface TopRankingProps { + address: string; + points: number; + cupImage: StaticImageData; + tierImage: StaticImageData; + highlight?: boolean; +} + +interface TopRankingsProps { + firstPlace: TopRankingProps; + secondPlace: TopRankingProps; + thirdPlace: TopRankingProps; +} + +export function TopRankings({ firstPlace, secondPlace, thirdPlace }: TopRankingsProps) { + return ( +
+
+ + + +
+ {truncateHash(secondPlace.address, 3, 3)} +
+ {secondPlace.points} XP +
+
+ + + +
+ +
+
+ + + +
+
+ {truncateHash(firstPlace.address, 3, 3)} +
+ {firstPlace.points} XP +
+
+ + + +
+ +
+ + + +
+ {truncateHash(thirdPlace.address, 3, 3)} +
+ {thirdPlace.points} XP +
+
+ + + +
+
+ ); +} \ No newline at end of file diff --git a/src/components/ui/page-transition.tsx b/src/components/ui/page-transition.tsx index ea82069..79a4ed9 100644 --- a/src/components/ui/page-transition.tsx +++ b/src/components/ui/page-transition.tsx @@ -22,7 +22,7 @@ export function PageTransition({ animate="enter" exit="exit" transition={{ duration: 0.3, type: "spring", stiffness: 200, damping: 25 }} - className={className} + className={`${className} w-full flex-grow`} > {children} diff --git a/tailwind.config.js b/tailwind.config.js index fa8ca3b..49238d8 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -25,6 +25,8 @@ module.exports = { green3: "var(--color-green-3)", green4: "var(--color-green-4)", green5: "var(--color-green-5)", + green6: "var(--color-green-6)", + green7: "var(--color-green-7)", white1: "var(--color-white-1)", white2: "var(--color-white-2)", white3: "var(--color-white-3)", @@ -32,12 +34,16 @@ module.exports = { black2: "var(--color-black-2)", black3: "var(--color-black-3)", yellow1: "var(--color-yellow-1)", + yellow2: "var(--color-yellow-2)", + yellow3: "var(--color-yellow-3)", navy1: "var(--color-navy-1)", purple1: "var(--color-purple-1)", purple2: "var(--color-purple-2)", purple3: "var(--color-purple-3)", purple4: "var(--color-purple-4)", purple5: "var(--color-purple-5)", + pink1: "var(--color-pink-1)", + pink2: "var(--color-pink-2)", grBorder1: "var(--gr-border-1)", grBorder2: "var(--gr-border-2)", grBorder3: "var(--gr-border-3)",