From 0072dc0362463588d2fbcd75b48e5cf629eb535a Mon Sep 17 00:00:00 2001 From: Rainnny7 Date: Mon, 15 Apr 2024 18:00:47 -0400 Subject: [PATCH] Frontend base --- Frontend/README.md | 2 +- Frontend/bun.lockb | Bin 143529 -> 159455 bytes Frontend/components.json | 17 ++++ Frontend/config.json | 37 +++++++++ Frontend/package.json | 62 +++++++++------ Frontend/public/media/logo.webp | Bin 0 -> 4288 bytes Frontend/src/app/(pages)/layout.tsx | 55 +++++++++++++ Frontend/src/app/(pages)/page.tsx | 11 ++- Frontend/src/app/components/navbar.tsx | 41 ++++++++++ Frontend/src/app/components/ui/button.tsx | 56 +++++++++++++ Frontend/src/app/components/ui/tooltip.tsx | 30 +++++++ Frontend/src/app/config.ts | 7 ++ Frontend/src/app/font/Minecrafter.ttf | Bin 0 -> 7564 bytes Frontend/src/app/globals.css | 52 +++++++++++- Frontend/src/app/layout.tsx | 23 ------ Frontend/src/app/lib/utils.ts | 6 ++ Frontend/src/app/provider/theme-provider.tsx | 12 +++ Frontend/src/app/types/config.d.ts | 42 ++++++++++ Frontend/tailwind.config.ts | 79 +++++++++++++++++-- Frontend/tsconfig.json | 8 +- 20 files changed, 479 insertions(+), 61 deletions(-) create mode 100644 Frontend/components.json create mode 100644 Frontend/config.json create mode 100644 Frontend/public/media/logo.webp create mode 100644 Frontend/src/app/(pages)/layout.tsx create mode 100644 Frontend/src/app/components/navbar.tsx create mode 100644 Frontend/src/app/components/ui/button.tsx create mode 100644 Frontend/src/app/components/ui/tooltip.tsx create mode 100644 Frontend/src/app/config.ts create mode 100644 Frontend/src/app/font/Minecrafter.ttf delete mode 100644 Frontend/src/app/layout.tsx create mode 100644 Frontend/src/app/lib/utils.ts create mode 100644 Frontend/src/app/provider/theme-provider.tsx create mode 100644 Frontend/src/app/types/config.d.ts diff --git a/Frontend/README.md b/Frontend/README.md index 986524d..b544e2c 100644 --- a/Frontend/README.md +++ b/Frontend/README.md @@ -1 +1 @@ -# Frontend +# RESTfulMC Frontend \ No newline at end of file diff --git a/Frontend/bun.lockb b/Frontend/bun.lockb index 1505dec6a8d3db0ca7997c75aaee6cf6f5343ed9..fc036320993a51ee80c0bf1826ed7ec25aadc554 100644 GIT binary patch delta 38395 zcmeIb2Ut``7eBoB%BqWEL6IUV#R4b@C`G{)?7D~@5bFY~pfqWUqKn2}(NV8r#ol}G zCH4|~!5$O4#*)Mm%lA9C;D$)@{@?d2&-XmpRDZ`@Xu4YL_{&+gN4u1}_Flg#f0 zwSas+%9RK08=n+KCB9Qj@(FQ?amhw~YU&vzXdp0Hrt^xcRAs@x1}y_RKu(`fLZvDP zei$fKJg}rxt_`R;cqdds)Eazg(9PhjL05p1AvcgtbS{Lb{8LaP75Jx$lnR_tD=DN@ zq=#apP&3p<6*rLSz}UFxSXdgDY8YeyJ%w~KXg&&4!^!%zSoi*h%=5g;C|bS?E+S2@ zL&_F(A82LJVAM|OE5TcVrWjI_;xi1Y8SrN{@Do7EfT5tISgbxZX<(vC^#l5m8fq@r zn~wgZ{OHtFLu#~2<%e|Qlaq|8X-HIMqhqN6j|{3XQJD2T!q(sZWTfzPo~8 zp{}x%<$^0o=$Wa+M3j#Ai@@svR8bXI9nNsH&vb7f?7oTc4PjpihgA z)u;3o#a5s_YUegM(!aTbM5lsMGv|>`jt&DQJCB2sz9|NMbQ-RAI7(`?caqY-2T%EX zkp~AFv)AK-Do!*EB6-#0>M9j{mVFMCLT4K&e3Ct1P9FnGA(SAecLpW7AW-TVH&Ap^ zwgV_B)XGKbspKRnGOUnJJ*NRJjd0D5N>7bS%2cTqxk{S8be3pZYJ6N26moTw_=iX* z%@-q$Mq_k*>L5~h0ze8YJXt{s`npRo{kD#zU~i<8f^EU0Z?elFzorovRqLu$4xo3C zK@~j#4=-h(08f@|mT9Dy95+SPc0Z*>Bl&L+a zE%+FNA=y1HRW%UhFyQ|(AC3-y|EXYq2$TkG0a^pJU#hz}KoNw=`jk|IKhh~i+(D`D z;`$~grC=he4xYM%Mvgu{Rpq3W_&#xoG4AQfs^#EGey&WD-Q$y@G1r5}CB&tv<~Ejt zqarFIi`;`GOH$$zQuKXPDrJiQF^C;f*EC*5Hr0ozP8>v8O(ecgygn_>5TjC~8Zy+7 znw}O1eGI7s(hVt@s?5 zMW?02C9=N7ZTXcg*ofjajae(^A>gUvS~8v0L8`~1qZHMn!Bg<{O-hb|OH}W{lMfa^o}!m^A|B&*91>`F zc*+?wI!g^@fv1MMfR+Uf1|4TC)fNaIvP zLWUuQ79nXl&q7R4L*gQU86XKfDH;syh^1XWN^peHoQ)d z(jS46XL_L`vh)R%BKd&>q~M}GWI|kOTEEn!L?1+df230v-j(IffKofg7(-M#yrgnQ zMbs4=kb#vxTMM4%^zN{l3a$Vx2O1*NG<~u@D&C+nha8P-rwnP8dXO#|@);B>W47-= zsl3v)%APh;A0H3>Slv>#PUi+mN_PXLfIo_|4xksHIeBfD59?Q|rps@GB`2fjM6q2% zq^fgrk}kAfc)7{|b*4`L>dO4h3rj!ZSWs!3&11{7=UmnqgfgEdU2v@Q*{S*d^%p0X zUUlwVL$kTDAp<;1)LHCXX+e$bI<-d`qS%H~F6E-P&1a3dK)&DU_#VAW?wrD|m5OB% zrGt#$s~&fHJ*jW)PPe<=?{+J@lubAO;LXp!_EY$lB@*1C8df{Mwr$$Dmp;dC`D`>V zRnIBWcgWBiKlH75Y*ou{_f(@!jh@c^mQrHOyPz9(TTc`pa=gQ*X*FhUyWBcBd}W6L z(ap>LKIZDmYWMfnU;SZC%Pq|w)hcy-@%(Co7R+0yAM|m@)Rk9i^q;fm?b7#|`CZq} zFB5-$Y@6NFN}C(B_OaF8+K!57T1DOSlD@-@xj*I)Yka-Lq=(^SCaqZ6uFCnj(=P1( zP&4+o0fSqp7A=WMKDv95<&E^k&AuG>8L1z6ShqZ-SEbF@%5G3^o@JHIslUL%p=@65 z0KOl`a;s|j?|7CE@`Y!1)wF#3Vk{D5bTO7&O{>0KOr_GYTlN8bH8W=Cpyj)mu}BB4 zhMB2USk|)5nBK#mGh_M4s;g#pj#_@Qnni-VRI^-1t;Pj+GXW4ZXO7l>d~|VU=cLuF zL1GIe^31U^HsvK)u9KE;R)Xb&%qhX_oVA);B~+@05Gl#>ocuI-B_*x|yXWGkc>pdD zdBv%?rjAD9)M90^8Wveyt2v3pFo+Zr3pijfVR1)gRJ^CmLH9QPCBcv(k}AKMv)me5 zjThonYTU7kpQb-JYOVw$Zn?~fjq~?QvD}(k-m5gruc_4}VJtO+q>7ByYz9ZI7H4`J zKg}y}t-wJeJ3mc33n|Y`taFmgp#>QGD>!dR@?^TYCI-GYyX6wVN0edtE?UiMB#_3E zY0ts=7gSpV6ErDqMvd^j%CdY{E&sYKvvbq(5#?B<8;WC`w-F2E)%4T+29A1yBOUn` z<(XY=t!4`*yFOwf+{N2jvfSEQKFpHkBX17IXMN;}%4u$bBV9O#%J`}kSZ*D}69_u_ zJZ2!0l=M_rlw2dZt#w6~>#o&ILZVch{PhDk@-s)h#M@diJA19BtrembiDu*sehv~n zw3<^$Br_#nsw+w5;7f!9QUi^_}cwaMZ6N$9vhZTu-eg12Z})fyhDe4d5heDPCWIlS2k7`C|&D;$nnqMuDSp zQY`P6In+|ck2kYpk=|O3kDW^83lUg^%F@A6WxNl}0R z@Y4(hMj&}{_AIi#Rug0|)r;;=t_sXw`3!*F>D!f*n~T z=Cq-X%+6Y?IfJ#X9%`^;_ZCzgw}u1*C*1<}Twn4OJQa~6r@ITeM3MK#>ZQSe|6 zRF!7uE7fM@tV{CSoLQueR_$CvrRv0b*aWCEaMguXsTyd8i*PZ?siu;dj;ju0+EHAE zvw3!bX0=G3N~YjSCtmHvRXe)kOS`aqJ1w8;!t5$*`He0t666txy_T=#%5p&xU0FWJ zI#*^_Ma#c%Wsx90ZY&q1uN%v+qE#<)!wnakXB$`=7c?ATf-0GvgAF--H6?2+kxw&P zA8-+((RtPU)cYup<{R}3T!oM~HSz8$Rd+}rybzDa!O=(&IkgQsss)?p6rkyet1u}Y zLB9oDzXDEMSEcG%z|930TELa^RH=FwaQ(s2{3OPxW@`aQAs6c<^%+{O?5AD?E|gUX z3@k|(1r=z$p>_c`9vn@(lIj=0wFHNt3-hyZMNH7z#KAY1q#eZm)r>)EW27PmZ2Z(m z!8M`p~*9vtL~oec%Lq-FxRwqnjaAP)ne7$y&C+|iWXxFL&dsMU-^BFz{o zmRG}1y&oL<#5zEuhJ9c#bI}CdIDkb4Xw^AL3}jU*2WU>?DhSz_UE$u+s5S+hWZ^_` z@+5@3L*QtDitD82130p3Y+M#`u`8RR%#pI!Mb_ND~&>M5`GiC!%reaE>&gy_4n-B+}f9Wu%IqI=Cq;VYea!xuz_) zsaCTcJn4&B+rf{2)0EjY)2cn;Wo*`}255%iih2@rVo!gr8Ov{`)s$&2bsv@zOu^yc zNCNvBEJ#zqwHG;Z={;~{fV6_ywqSNGv>F|hse?qUD#DOM>2>G$9y7opoVAHh-UQUHg*yWPP_Gye*3?Z6?-Q1x4I zT_g^k3Te&kT5B~sTVvLg3Sf~lZzGPI#+Vk+Q=~3pd_FjMrdD7{Ik}iTV-NQ20xh=B`(ekH5S!9S-vj<93 z`%<@?!#p^Zy1llax*fPC?3P1-CKp#yIM7^q4IDKITd|k3giQ@u4~GDChuOv{ zlNb6>T?48_uqvGb&2SOIs&or1i3?Au1_bAOaP8T=8UdQtos{)c3}|p@igc^)$G`2w z?AoJ$J1bKuZ9o@-ljGFRPkkGlxKwH!;C*y28G?ndPZt*1LCaqZXSp4;YWE0ba!U3;?pFzkwvAUT2h=@mGC(aWyAOm#{HN0SdC5R?8&a1>k^ z6!rboPr(I>8rJF!uZUVu1PlR3lM7-W++lD*QXbaGVtT1nOiGwmT7wHz%Be?zgKwep zbv?6-)N1NR6{u+EUlI%rPpp!({D32$NNrSzmLgj0P>rF0quud#aHNei#eV?@Q;CCa zJz}JN0Ok3Y1XCYbm`gDm{T{<|yKDJ+2A1Dlt4TIUT~m%iU$Y8a6R{G#wZ9oLqUSvN zC^})Oi3g0`NYdLTFqXlx{o;EIgHYD1eM%?Di3I6yJ1INtG!%kEY2F9`+#NPPkgAApl0P+!lF4@_W@(OQ0b z0?P&QNM!jSV-uNOj8=Uwkqk#LYU(B_hSPve1@~3M<>07c%u}%Vjx32yN|>LR+(E*wtaRvWTe>L;tW7AktNs8o^t4D6W;xar_%U`y-Ib#NHN5~pr55QB)OQOyWkk&CbZ z+WTp?fukuy+Bdue=L=5SQ`8)U4KcV+T5++~Tn9(BNaZSIO0%Ze z-|7zFy0Cfu0?lv{!g@HukGK-=1Ni2HS!AM?A2^uhg6ta1@)Nb1;zJ}Y#5JD}9Ks@# zwEXZPEEnYH5SE|R&}gL+A2+Hv&`L7ufR+I20rWAY#lXWbQQl9cP+$Cfi>i@>U6_go z8jDhYqHV;Af{;N91j_qLkj17<@#^)@D`fK&hCTL}|>d;)f`e?k#fPrc^E(Al)$+i64=&TUm{5 zDHY>V{FqXnxeu*nG($Qc_ESoC2-zYV3fGWY~06+~L2Iyl-Nulq>RHEoDDtJ^*_!gxC$K-sX#2=S=qUC|> zKyl!XOn(NYV0sLYBF|+0rOdwprCHzuMGFah0;qywsJ$$xB`7si0bf*+wM;96l6+NA zlCLiFwLr-bS5W#8rAs$_QF#wgb5MVo4+O>kDq|yjm%>FW(3+r$lqyqdAWi0pQUe*F zlr&II|2s+|gYZS=2Fvn=s8P(Iydko{e?mz#OO_`}4GfccqI5~4i)gk?mG^>(Qu+vd z6{G$iB`1sqC5tCgu1x82lFXY@YH*62PLwWlWd83ciA!cn4eC>abwMfJQ>I>I7CuBN z-CO2~QvJT5R4zcy50q&mnt!Q)78L)hf@D6J7<`D5Wi93ORx%$7N)>hjB}Kzz+Eu3A zL8;;1G9L|!|5XM#J&qWBjC4VQ38171y-P4KG+f|+)pYujDOD_hCz>m#6D5A0Oc#Pu!%Jj-xy-MY>3UF7 zd;=(Xa2seD(Cpd=UwN*|(7UZs_Jq9or;PH!Qn6Qw;zC@7V0C)4&a z759Kh2Q`Wngd>AKM5#c8%$rhbI8sh0N^;#m$<@7OUJpug(V+A(r6eCCr&AtnK&+_$ zDdYcx-MQFqP%|`63Iqf6AxaiBB?cd&q|F3b*%2?9o>W3%o}HC>t9?x{`ABK?{OCTTM54}K3KKu>vkpb?@k?Yzux<+i+o0n zc5nK}vn9-8j18+YRmT-$aZ|(D@i7+c3^+BjofggpjkRDyr|Gy7?8LNit|W70;hctL z;@g~^$9E~_Iz5~#&4%OKf?daV8Rj)3oGZ)5%?M|YCRniNGjv>e)?j8hn>Epb&6}y? zDzL}kT1~QGZ3P`?#byiP>>apI;H+8eS>bHOWDB--mX5P!@4-b(v0y!B>$u8net}JtYIJ*Y!7P#8XbwM~AJHvuaTA<_H*>!OKGc8!7 zg*vV-8@CYlfqM?li#5oDeFE&u({c6KV{olz!M;U0&WFuj1pB~!0_VqCFNS@yVc%jM z*MPkT7m*A5mgu+uwsHyVn*;ln>bOR%>r&VUZZEjT?A1irH`ju7nWW=_S>7brH_w7u zEz{vG3jH$J2kr>C=B)g3*f-yTr7zcUE!jbEE(;94!VV9nR)xGrq! z8rTQ!H*n!BcrEN(V!@WK)p1?fD{v7@q4hc)*Nx?^gMG^^n0mdA>%ls#hkf9-g6qY& z4X|&y1v6~WaeB59oXrZ@w^7GMGyO)`2krpV^GQto7X$oa9eyggu3UPfizDCgXV$p%wwQA0 z>@Tf7*Z+{-e{z|vle!eo3Tsy@uvz2#QM0#Kde<_tECw5=k_KIZikZI&WBzLpX>W9G z@z=yEk(T(p4giOgA7XJ5|o2XR8;p4O32hF|kVdBM;eP*4ou<#gc|vvn*qkXZqKwcI#tq zR36bGb?1DIrLI?#DU}+%Xz$Xuay8pNGplA~1>bL2e^y4_H=9yNeq6rxT)XKGU8=Hq z>uuPmu{ti3ogW*{4Q8(6!nq-AIKH#kb$kzHUgN{LVQd_}jqD!2vsr@);oNXGbprZ* zGh%6ij{A-UBj%59F2j~hY{QLW?-BEZwqUGG)^TIl%E{>Wtr#m)blf=Bbqe|&++J`K zm?j7Pz70K;qiZ{Mj-%zVg zfbF)QQZ`nuUE#Fv^3M*oYuY&7xz}s(=8vNfUt+hQ-CB!bQ;&b%cK+zOLo;lwtPidk zQL;zu7-O(?&SabZTg9HGRhd8`rSlBaMo03vKa7vh+w; ziuI|cuABZYbL`^gUCQ3?_vQZM+$*aye$Mhv^EY;Q)U|E<)YB_3yl8skWf?Bswq@m? zU+p`v>DkWI(|s0=J=V!`Ot5qIo`bJWu}M2@jAbYKUvwSLiPkisx2}efU+NsvX+b};!$(qjOo?f?ZGOLX^BWJ3=sqi|!953`3AWcJG~GP-X?)JPhBu!- zNU0jXAt!ZYd82khE%qGRwRxXuJGpuA{UHyJU2)rS`f>3;`klHuxTaxS=XafAt%mg~ zer$$nfB(`gn_O9ZI&Z^heg4S$gTlK$yt2aozSZ-60i8{>Q~ug1#$DOlr6vutTprTe zDr`m2!-4+4#JtE4?tM{6kBFIhxw74-oTQ6F#*W6e=5w59%=u&7+Ce(kq&s&?ZB`HO z(rxGbMVmP`Z8}^Ru`LbDP#RsK7hkPoQ zV5|M|VbcyXAFl(iir*Sg|3Ig>{PhF2A3Dms>M^ZHwkUZ=5PD%g^uWcgOaJ>6I6RCN`{ItKqwS={xJqZ)4}(E%j2| zvooyiZX08hR{Ki5@~~~*B)A?cJLgR;??kWGJrC}AQM-osAMeK0>%YOy?ZxlKdz#H@ zsd}Al8I34Qt`w;y?<_WY0_@ewB>bArytJ$ zangA0=$?k@zn*)#JF3#;%{$a4+9`jF7PT9#;2Xjdhd|L9+_3vPP; zb8E}rZ(Eco6WeIp`;EO!v|C`>vzgnTrbXJcJvIBnXV1!WdZxua{{807@S_{fo{m^n z^=^-l^>Z)02pPlMvdFE^rdFO85w6PHn>Y02*5k=z52>OSwDn*;_SzT^I)7d=g!^2- zeC)pUiyk~{`nzFG@0L|JFP>%l^y;+%QKdSb?|;C$xW2Yw%BRr{j`vD*2^vu@=;+ZO zU#;#GTzg(}MHB7vOtrIr*stNO^EdC!4_PrUcJ~R_;|{+}-?gpgxm*4V?me6LwsS3q z8LQ7-_{BDFKwR~*_g@ZPV&(MVW$&B)&v~5CmzZfkLSPpAY>X|EpO1e2;Pm_UcRH{6 zSn*}k?)OiR?SH$g&+wdde~-aqJ|$UR5ptTXZn)_EP<6=A!O3=)l6yU<6JwoH^+HIK zOx1c5?G~GA_nW81^1LYvPeq(5k??R_wPMaSf9SPh!_M#wi;=#&D*h7qbnE+09=i_N zevYW^`1`aWKd(E#zmd&y`*youb+;(JkT3I|?S*!Y4i0;FddY~G`!}7u8x%iT>|N8- zcb!&DdNBHl#r;uJ&BwRe+|6NO!-_vnNVz+wU%$q$Z)ab6{Qh#A#B!BeY~Ma>%Lfzf zmYQm}W%9Fj@7i zU7ruQlRV7Z=1gv%^cSahxQttIZt4CfY4G)o#Dj z$9!%5Q3s=v%TBx-GGtU&?)O)B+Z@|!=vR|pno;BV`58Zs4wyC3_T}O-mRBFOs#13D zn5AB~mU8|VZH~J6&0UID?+@67oG9yJJ9Ko|K^rgq#*_&!uH2g$Sf|TR<$Gm5@LKVH zT`?bT_s0EZFSc$~GJNUYO6yLx8oaDtT5imk{>Qw>wAPxn>TjamN|uR@>a_#7?bxE@ zRx{VF*uEUZZO2v}x0YQ8=YI&d9oux=dNytww&mcSgWJd&Y{xe7Fm5}x>$uJAF}POW zrP!M6N3wo-d^+(EVzoXrW`R_)bshgsZSY|p@*0e6Ji?!)%%ByOwr z>9}L;1UQ#dxUJf+<4&;5{jd+*EpVrp>jBtz8ulH~ac9_daQb`_JMm2 z?mTO72=<+YeTQ`1MfMn6s~=$BVI6mw%{~nKz^-=M^RVxT zj=RBD9)W!qVBb+4cZ+pB3j4tA1$T#Oj={c*u7&?7Iy6PUyIY>;yQME3ogRj(f~9Pr^QMx4=DRuBTw%RoHh*$317)!TDc+8+$YxcJnRFv7u*-7xd8ia!@dhTp5xfA3t`OW4h+1g zPu9CN!8 z#>V~#E3fEy3y$T3^}i1@uj=@+92 zx{kNPKgPTs#@>Pb1lF2kZSup|iU+VYU&q^W>;u?{hcNbrj<3wIRX4&|$w#pErjD<| zvB;ZYYzNrAV5@P={8ku?eGGeV>3B!j3)bcd?7b~M2e^$61$PD}ptcz_Ol0}~&L&jB8y zL&5C@*O+M@p+kR#fsg1pz)o;Bzrnu8^c*1WG3*0(23&Jy`vms=4*Q~?o;KEt!m$2_6?0ZSi0p5d)_yqf2(Q|;6uVCM2*!P;A19W{2 z`@ro5*Ng3Z1N*+fqF?DbK-{n4Gi*3m1TLD{{uVytIJlv|(Q|+kzlC#snB(u^cnXk- z?^t#o-*L?KZ8+DD4aawXb{*gG%JbVvi@9{l|b@&*Ld)k%w9?ZB;bWhtA-&t%UzK1f+XS%1= z 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 L+ox6MtxNx3oJe_O delta 27912 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 BU}*pV diff --git a/Frontend/components.json b/Frontend/components.json new file mode 100644 index 0000000..44d4078 --- /dev/null +++ b/Frontend/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/app/components", + "utils": "@/app/lib/utils" + } +} diff --git a/Frontend/config.json b/Frontend/config.json new file mode 100644 index 0000000..f2ff49e --- /dev/null +++ b/Frontend/config.json @@ -0,0 +1,37 @@ +{ + "siteName": "RESTfulMC", + "siteUrl": "http://localhost:3000", + "analyticsDomain": "mc.rainnny.club", + "metadata": { + "title": { + "default": "RESTfulMC", + "template": "%s 🞄 RESTfulMC" + }, + "description": "A simple, yet useful RESTful API for Minecraft utilizing Springboot.", + "keywords": [ + "java", + "minecraft", + "json", + "rest-api", + "restful", + "bedrock", + "springboot" + ], + "icons": [ + { + "rel": "icon", + "type": "image/png", + "sizes": "32x32", + "url": "/media/logo.webp" + } + ] + }, + "viewport": { + "themeColor": "minecraft-green-1" + }, + "navbarLinks": { + "Player": "/player", + "Server": "/player", + "Mojang": "/mojang" + } +} diff --git a/Frontend/package.json b/Frontend/package.json index 1cb7d23..8db2c28 100644 --- a/Frontend/package.json +++ b/Frontend/package.json @@ -1,28 +1,38 @@ { - "name": "restfulmc-frontend", - "version": "1.0.0", - "author": "Braydon (Rainnny) ", - "description": "A simple, yet useful RESTful API for Minecraft utilizing Springboot.", - "homepage": "https://mc.rainnny.club", - "scripts": { - "dev": "next dev --turbo", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "react": "^18", - "react-dom": "^18", - "next": "14.2.1" - }, - "devDependencies": { - "typescript": "^5", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "postcss": "^8", - "tailwindcss": "^3.4.1", - "eslint": "^8", - "eslint-config-next": "14.2.1" - } + "name": "restfulmc-frontend", + "version": "1.0.0", + "author": "Braydon (Rainnny) ", + "description": "A simple, yet useful RESTful API for Minecraft utilizing Springboot.", + "homepage": "https://mc.rainnny.club", + "scripts": { + "dev": "next dev --turbo", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-tooltip": "^1.0.7", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "lucide-react": "^0.368.0", + "next": "14.2.1", + "next-plausible": "^3.12.0", + "next-themes": "^0.3.0", + "react": "^18", + "react-dom": "^18", + "restfulmc-lib": "^1.0.7", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "postcss": "^8", + "tailwindcss": "^3.4.1", + "eslint": "^8", + "eslint-config-next": "14.2.1" + } } diff --git a/Frontend/public/media/logo.webp b/Frontend/public/media/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..885ff6080ecab085602c3fe99279b35050cb6ce5 GIT binary patch literal 4288 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 ijoKk-&`v?e+JHIoo>Oebn%ncsOYI{3@): JSX.Element => { + const analyticsDomain: string | undefined = config.analyticsDomain; + return ( + + + {analyticsDomain && ( + + )} + + + + + + {children} + + + + + ); +}; +export default RootLayout; diff --git a/Frontend/src/app/(pages)/page.tsx b/Frontend/src/app/(pages)/page.tsx index 5bf9429..29b254b 100644 --- a/Frontend/src/app/(pages)/page.tsx +++ b/Frontend/src/app/(pages)/page.tsx @@ -1,2 +1,11 @@ -const HomePage = (): JSX.Element =>
Hello World
; +/** + * The home page of the site. + * + * @returns the home page jsx + */ +const HomePage = (): JSX.Element => ( +
+ Hello World +
+); export default HomePage; diff --git a/Frontend/src/app/components/navbar.tsx b/Frontend/src/app/components/navbar.tsx new file mode 100644 index 0000000..2a18092 --- /dev/null +++ b/Frontend/src/app/components/navbar.tsx @@ -0,0 +1,41 @@ +import config from "@/config"; +import localFont from "next/font/local"; +import Link from "next/link"; + +/** + * The title font to use to brand the site. + */ +const minecrafter = localFont({ + src: "../font/Minecrafter.ttf", +}); + +/** + * The navbar for the site. + * + * @returns the navbar jsx + */ +const Navbar = () => ( + +); +export default Navbar; diff --git a/Frontend/src/app/components/ui/button.tsx b/Frontend/src/app/components/ui/button.tsx new file mode 100644 index 0000000..f705f1b --- /dev/null +++ b/Frontend/src/app/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/app/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/Frontend/src/app/components/ui/tooltip.tsx b/Frontend/src/app/components/ui/tooltip.tsx new file mode 100644 index 0000000..1a6c803 --- /dev/null +++ b/Frontend/src/app/components/ui/tooltip.tsx @@ -0,0 +1,30 @@ +"use client" + +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/app/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/Frontend/src/app/config.ts b/Frontend/src/app/config.ts new file mode 100644 index 0000000..1600248 --- /dev/null +++ b/Frontend/src/app/config.ts @@ -0,0 +1,7 @@ +import { Config } from "@/types/config"; + +/** + * The configuration for this app. + */ +const config: Config = require("@/configJson"); +export default config; diff --git a/Frontend/src/app/font/Minecrafter.ttf b/Frontend/src/app/font/Minecrafter.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c1be72b0d6d3f04835f0091b4fb7db24de16e877 GIT binary patch literal 7564 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 { - return ( - - {children} - - ); -} diff --git a/Frontend/src/app/lib/utils.ts b/Frontend/src/app/lib/utils.ts new file mode 100644 index 0000000..3200be2 --- /dev/null +++ b/Frontend/src/app/lib/utils.ts @@ -0,0 +1,6 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/Frontend/src/app/provider/theme-provider.tsx b/Frontend/src/app/provider/theme-provider.tsx new file mode 100644 index 0000000..de48665 --- /dev/null +++ b/Frontend/src/app/provider/theme-provider.tsx @@ -0,0 +1,12 @@ +"use client"; + +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes/dist/types"; + +/** + * The provider of themes!! + */ +const ThemeProvider = ({ children, ...props }: ThemeProviderProps) => ( + {children} +); +export default ThemeProvider; diff --git a/Frontend/src/app/types/config.d.ts b/Frontend/src/app/types/config.d.ts new file mode 100644 index 0000000..a24d120 --- /dev/null +++ b/Frontend/src/app/types/config.d.ts @@ -0,0 +1,42 @@ +import { Metadata, Viewport } from "next"; + +/** + * Options for configuration. + */ +interface Config { + /** + * The name of this site. + */ + siteName: string; + + /** + * The URL of this site. + */ + siteUrl: string; + + /** + * The optional domain to track analytics on. + */ + analyticsDomain: string | undefined; + + /** + * The metadata of this site. + */ + metadata: Metadata; + + /** + * The viewport of this site. + */ + viewport: Viewport; + + /** + * Links to display on the navbar. + *

+ * The key is the name of the + * link, and the value is the URL. + *

+ */ + navbarLinks: { + [name: string]: string; + }; +} diff --git a/Frontend/tailwind.config.ts b/Frontend/tailwind.config.ts index 2838159..c96165d 100644 --- a/Frontend/tailwind.config.ts +++ b/Frontend/tailwind.config.ts @@ -1,16 +1,79 @@ import type { Config } from "tailwindcss"; +const { fontFamily } = require("tailwindcss/defaultTheme"); -const config: Config = { - content: ["./src/app/**/*.{js,ts,jsx,tsx,mdx}"], +const config = { + darkMode: ["class"], + content: ["./src/app/**/*.{ts,tsx}"], theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, extend: { - backgroundImage: { - "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", - "gradient-conic": - "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + + // Custom Colors + "navbar-background": "hsl(var(--navbar-background))", + "minecraft-green-1": "hsl(var(--minecraft-green-1))", + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", }, }, }, - plugins: [], -}; + plugins: [require("tailwindcss-animate")], +} satisfies Config; + export default config; diff --git a/Frontend/tsconfig.json b/Frontend/tsconfig.json index 31dc15d..bce7d9a 100644 --- a/Frontend/tsconfig.json +++ b/Frontend/tsconfig.json @@ -19,7 +19,13 @@ ], "paths": { "@/*": ["./src/*"], - "@/lib/*": ["./src/lib/*"] + "@/config": ["./src/app/config.ts"], + "@/components/*": ["./src/app/components/*"], + "@/provider/*": ["./src/app/provider/*"], + "@/font/*": ["./src/app/font/*"], + "@/types/*": ["./src/app/types/*"], + "@/lib/*": ["./src/app/lib/*"], + "@/configJson": ["./config.json"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],