From 880e238fd3f97f1c692130b12567b4ee466ce60c Mon Sep 17 00:00:00 2001 From: ImAlpha Date: Sun, 14 Apr 2024 19:17:50 -0700 Subject: [PATCH] shadcn working with tailwind --- bun.lockb | Bin 78322 -> 112878 bytes components.json | 17 +++++ package.json | 12 +++- postcss.config.js | 6 ++ src/App.css | 45 +----------- src/App.tsx | 28 ++++---- src/components/ui/button.tsx | 56 +++++++++++++++ src/index.css | 128 +++++++++++++++++++---------------- src/lib/utils.ts | 6 ++ tailwind.config.js | 77 +++++++++++++++++++++ tsconfig.json | 6 ++ vite.config.ts | 6 ++ 12 files changed, 271 insertions(+), 116 deletions(-) create mode 100644 components.json create mode 100644 postcss.config.js create mode 100644 src/components/ui/button.tsx create mode 100644 src/lib/utils.ts create mode 100644 tailwind.config.js diff --git a/bun.lockb b/bun.lockb index 671e8e39762a11bce97194ca9a1acef4f55a1497..72dc5655cdd9a0640e2b4a0275530fc3a1eefce4 100755 GIT binary patch delta 35838 zcmeGFcT^Nh*9MMGk01<6GBGGw5mASnlVTPyppsNngpnL1sF(%=iXf&^G3T6f&RI;D z6Xu9w4o8oQ_u1XkI_JE;-@R+y-}n3L>$RTVwQE=H+Lf!jXR6*m(t7=_`V@zzozl0Q z)yvLzv0S{h+{#_{On1YN6IOn19YZE3>u%3-k)Ne(H7*XiD`)$s+g>-y458T83G)EfanwOhM+z=5{UumZnghq@J8TI zfRf^axw;z~v(i%rDJ6GMo|fP*gHi^LgOXthF9N8xYnV_Wb z7$_wuCY+R*ok)rkvlM)L+FD--Ut67k9w>!RRc6L3U0}T0e-w(7s%k(?R`x)|&s64Q zk&UWWWMHA%?|=41A2i{qwWk!ZB3cgKPOR@5+^z3Ad%F9$97OEiN&B~`DC^KFg2f`mWQkT zTdDneR6?qiEK?-s}DPTWP>TV&RB==Cu zZPdIGC@CmIaZ+Pl14=nlW~C&iWlJP8JO%$EHErW1)P0I_P#S_te85vY6EBoMIjrG9 zMINVAW+)P~B*PJr8sWc3#3COdVg}??_rahj&Ag;61>Zx_*fL@=vy}euH-NtjD7C4? z__Xv)r9@&6p4t#~otTs?iJgC>;4vUEElz<}vCdzJuvkqq6e;Pk80|q5Qxmf#ivt9? zDHKs_c4;9Pl$n^C88bj45y$vvE!fa%jaB6kQ~DU|_+B(BP~Zoo#AIhH<0N`eL-|x@ zOZ zJvKWtG0k2Xr|h3Y{Vz3(%3UHse@saR-OyGjAPkra7!%K?XvtNh+6l4aK{2f49fCF! z&?TVMpvQw!H81HPH0TlFsrFJqsW7H=6s#NzN>&8~3Dg->AN*NRD*YY^PqpmZZd^jlL?GT|@%0Q|3j)9W@S~YFdS!k~q%VSbv;*=)fDS>LBl>Jobk%MmUA|&{@ ztB|2mHQfeU5AwO7WXMQRekf3?JvxDs0uN9s0Sh&+2TBP@Kq==RkpLOiL&!m1dYCX2 zxPnsrU{D%5#)J#uvXrTVl$q#U)dj zbG=diloLDig5tMN9J2>%=LW~TyS5} zu3u2Sg_pWr$$uA_(^~tlxW_LZO>lbuVO_Itx9)Y)F5!dnrScV)xDG-cDb_A&~&3HbDIYZ z56NtH_vGf?Zui&1j2|i7rVN`lx7MXQZ%cU{yPz_zXV@LTLv1=c9$8{qdbCdefsOoI z)-d$C7`djbfqz05nbD3VPGx?eVTc4_^Ask>?% z+c3CQEw0V5C9c;xFI@iBvwMe|@3ls{&yHH#@P&TNkCy{(*Ee6iW9@DN6+=2xIB$5s_E2HR5oGWwFs^7nui9D9q`nl zOOCtV{0Fzj>O68?Fm7+_RX+??IJa14JA90B{f{eZ&67?WFh%rdRyDj-2S>+kT{|Z@ zVza)*;|ay974e4(qZ_nv+_P)SXp{Wc1$S*MOH9pex)rrC+_W;gxU4X4;*Rjd@&&KI zv~l-Z4Yj|JgMfIvN9j7c?kh^ z9Uewh?0G!p*^RrVQ;toSULTlO66nHyRyXxJCaLKDzBs;F_q)9w^}3T+L*7ezxV-9P zlE@Dmar;7ios(Fg+u$(GLEA+uPknQ3i3HOFZ?BXY z8wj=xhOY~JG1f}R%9^4r`qv=AK!;TfVWlVj~S7)bL^tIrz{toV8%sDPuW(r4EYE5M$Ped$eLkzr_{Ass0HGI zqx57f)ZSCJ6I>f`627Fqsb$q!C{pmo9DxZRcA}oNOTY!NbC$lctK@<|@@(ZP^D_`? z3U!B+(|&Q3w?*KDvL@~WILeKXZ+9$zsK$8hvQ%)C8=+0C1Q!GjuJg@bXj;B4*-Xm zJP(bJzl_8*rDtkW3zV5+bwQDZ!s!IA4F%^L>C`%`w03~(Dm(>^)T&MDimd^*N@MD> z!a4!68Sw0kcxXN_;So3|a8h>B%u`kyd8Hy23cM3I${e~hl+6T3s)dGj0~}?~kZ(-B zCK?IJ27?oHQUhHHt}CyFO!^BPH4JqHW9dP85V%}$>hx-R$_{`dTcrH(@CBTZce2{U zR0yfVccMISZTL=f4lar#bTys&qK1o>p86r+oFStst&5@+Dr5wFJ>aWF4OP0oJ}b2f zkbQ+G8Cjh#B2O%9eZZkmke#XE$Pn}}6xeZa6jJCn)y&l64l_3Nl!lqHLdO7E0X!)M zM6mUg9x!8iP60AQtiM_co+y+);HVEE2>Sjqa5Q?MpivBuz&Y@;P&-eVvBj@~M$ha7 z&I>Xcjy$Ezf(01{$j)eb%BookC5-w-xkZAbPJ`yx#8Z0-I4{=8&R2E|E=ok3&#uQe;w50K_svr>><)=bYJ zKx%Bmf(!z*gKaSSvUB>r(#bZg)F42=6du&NpjVQCNeZ>&BGYXsHYBRRC~%SLAiw97 z&A-B+jcY#u*N*991nSvH7(qF{d+cq*^b7-}rnaomFhJYFP9o{WiVc0WbK#2OU6+3O zDVkuU;QjL8isoH+;7a6O?d&Cz7~ZuKEYx99$iE*E+Za>Dym^Ug&c| zxRG$RVV&fDT5t#v^w9J}SaE$nEjR?P1#op{=j!raA-q~I%%^G1-i}{hdhTj%(w^?Dw0?keraRMX5Fq6|SWtri z*+NgDee-jT^tLApG7FIQ@M47^^SoH8S%B;;T0D&s5;Q+gsjfE*G7pfp@n(e}le}4} zd4TpYZ?a0?z*nm0!-6az_F;t<82ZqSg{TsA`N=KqmAF4P~k?D~0Dtcv8<2 zRscVJS&&tLc5B4N^k(iW9p%S@tOK;S!^4M9=ZzmLg@=mES%97!tUXOtR&2lHW z0M^OCSN4fq@W=Ft>CP2SN`?<5O9n@AFwmf{t^-FQQ54`_z)2IWFkSn#5Hf<07(Rx8 zqag{yfTgE&T?nW&m`2 zN|m49q@jVVuyKHFqS~_>KM|CI6U@ZAO)6={g6slh?a+D26T<|?(c!IFDLnVVlgb;z zio%OSz$O7w_tvZsWK3&T3Ua?S)3Xnd)^5Xs>;q)I+Xy2qzp~Mu39c(&XiwoH6ZvUE zYSESjH4Tt;#q@)|Ln&g(G8`NlDvjgd_JKnjTIykuMPn<*IWz~acC1u^b^s45Fsvky z<XwP#r}S}aCAWc49_U-@8H6Cjv7&D2NvWUAUlAf4i$7D z`-UC)#@wc(Fvw%<#ZqZ0IGT5bx%Hh|hC0JY9E3r+C7;zoxM&>Yt4($loOg#7EoJUJjh-^LX(SxFBzv!Lj7V+uj5%e z4IHw=&xwd6Ieq#x#$H=?$Xlih5lsRpBdl|LU^$;@3We*}x?g)1Bq&@9U*j^kS|f&3 z2qG~MO{i5HrAHQXkdSfrr4Tiy2MU=IB3c~?Q`mtntk5k$TMtDU$%@^4wfp~a?SZQ+ z@23Y<;k>IKTzz=gfnR=gx=SQIc)tX=y78_(zx)h(@WY^+ue4_m7UUTqn+gx~bt)Z9 zuV=wgdFb#DD3g$5#8h(+z|o3FkTnj+p#F=S46Y?OJlJ4~P!5iomk`n@La0N&$7=_H z^WbYb4=#6vs=@c~L*QJ%2`i!Z;DiQGZOk>2=1f^?q)>IjRK6A*)rgRYBubMj1oz8S z>FX#~7!V+}@5xF70%Ykug~rUslOE{Ff?8no?ZpaP1Za2a#T#emD;?8|>9zFWANfwf z6XR)K9aLORKv?3obd}ZYtzIU;vp!bfjw%zl2vpBZMC`CYl@E6hQ0D2Ms*oaokhet!?FQQ}^ zS`>e2Qpy-w1Rowvg};bW_z1kN<^`x2{vt{OlplZniIQPxM*KyT!uJCxp%{QJqQv(n z2G^e`#Zw}EKBw^%3fG?~1x(_l|D=>aGC(v%EhkC_rm1;NO8yxD>B~~f+lmfNO8tGX zI)El61-WW}q7-ffz_HX;c7Y_#1L(>F$gELnI$BM~fYS9R%CT3iOjOif3i&VsB`rk& zX)gwdp9IiFl>DavwluUkk95r36$c^0f^3(NZ8)i##ASg`ErGj1#P`DLpx)PKwqU67d7+gfDJlEm9Egx|sm>R$yz!*3K(DlDh z`TYMmAsQ(j@@D)mQg!%d7|X3ucq|rm3T9{sVOHG*^csN(MNpd7|WWQu9QmRR1n&fvZ|Tl$`Wi z4x;XKQ&Td`Q|<4i_9sf+$xrR?ulE1{g{sKHmg)$aR0jW!YJZ}XaIl&uO3n~9uSqFf zXSKWws1EpWb+|uJ6>oV@1Rz7A)dBxRNpWAu^+8kA;r{=p>i$QHNN1{AF;QwPS)i0~ zj@q9njjAI+$!nyVs?;=(JaG}F_~X<(QF4w~^S>xXqy#2_QqE?AQUVLq0W~R27faz! zqGh;IycOzjnv}d&s{P^QmpuP%*`v~2?@(aksVe>-T=(z>w}MWxsWm_sQDi{%|H8UQ zNchjo9@PK;`npHR=^vLnH2&}cD)RrWb&uw92g&g3AsR1exnoZr|F`ZDn#ljHduYM+ zf9oFV6aTmF`M-6~|E+ue*Va9eSPT5Gtb5qkknEOeeO4?Rak;Yiib;cwHQSy!>3DTl z??5*5_W9W{udkkZd3uw}1pSyhsh^h~wupM)Md#N2siPmce!afLJ%5~{^|#7pY<(xW zs{3B&R$ZRmyL))9h0J`*z^X=*e5%@g8SSZxvUiy25%|RMv8Q3qvC4kC(>9m9xNAfm0=Yq&F}f~acTWCWZ+{CJFy*Z2ice+rPX;78ulk_a5YutV@nus(FO&t0b(6E`&T>`k z=e7HHS8dq$S0kI{9~~O?xPEzr{f?>_`^P=DJ`OhRP_3Q6eb)`sJ3Kyb*re}@#sj@? zxla14^)r7v&u;r~cdF@@r(qqfE5%D|^O8!-?F(YYJTy!THh6fk?c|5w7T@wO{JTN- z>C^B0SW^DDqhHX1rx#5>)p-}JDrNJVU(=t^nahZhl$FkI_3Y#L0ZhM(Ty^1GJGa-* z=8w@Dw|Vi$om=LN^7>l%vFFH;j7(Ff4ZTN5mVYU`e))`afVSCRRTC|S?6*$NcSwyY z&py)U)z(iRhThb$jvgSyORG(JSIfT(K71RzqwZ-#o#xwH?>hHl)yv7#&-`5H-Xrj2 z{<9lTs=OB_s9HRqFz;g0iqPcb0X@PVj_$aARanB#E=4nDX(*;;ws>i^4ew^%r$d8i z9X5F7l3NcB`q%zcu_w#=utVU_e$~^Ot{k3ks+VtfL_Xf|#&UUC>v!|Z54o8Z&+L7z zMfGK0cl8mTh=j_-Y!m*ojcJ|nitut># ziix31m*w5M4?lYM_=>%2O~)2l#2!~ge2Ggdugb6Nb)Zq%^XRX(wZhNX+LxDy8JS1y z8rV5z^8Mc3G!)aT7xB`1W1l(WrD^LAS8v~VVB|eG^vm;#8Q=1nPS`kgnBSTgS$E#N z`hKZ2Ij8zOt?s7}g%0yu>-T0&y+>m=bRA$Yap$|o)k&{P-R|jqtaxdKG)#a0e&opj zqrzns!ymS+9CqX2%TCtDr6byIs@k~mmS;cD@pCUcob~zQ=En<~nf++;VM1|>`}UR_ z#h6j%w+yM??bD8^?I-5!Xh+Y+;=o2P-Nj4mTUcCi*~gZ(E-b#d*0%kc zq|M)ZNF7_=Kb5Yl8qtS+4Q{edwWCR^8nPxI+AdjB)T-BkFvC}2&8(d*mM{8X_pZzQ z01d@;MXjJ(zNgBIS6okunAD)G?DBo%=mCM9zFv3`+j6b%l13YzluVM$H7-2(evs?f z3zOwH?s*@UeLLK{_v_5m)WhZZr#B}Vak0NGrg#40r4`w;`YJMYOhJ%@*XPaHOUuSQqKR8-<;Koa)0rry)JIPX_9_|W#?ql4i zq?LxD4K$5&ZgS(?@nSE1i$h$+h1Sl?N2MPz*fLqsslo8np@mytPO7Un`C@?VrRnu| z<90ruch{!-IYX_z*>_y~)Jm3J?G`ikIh!9YXZwc)bLLEz8^IzY^jT_du*y<1ku45o zk(0J|E!|zQxmLZ;i*}@(&5m8a)a2q()ICVtTF&Sz>xcDJjc(s?lP zl=)oi6OpEKF1)oqUw4sP?dj>K_IGQhwRqd}rZ*SNZ+dW7+&~S*)|!eJGQVdfrRj0& zh99x1)3fe6N&7~QM%#whJy|h6@<&-l&?xhQ1q%YA&6_k#Z_w&ujA?Yyki&=mKEF+C zy6b~_Px}qW`1h-a*k~%Y$UHAIe^Y$IFZG4K!}W&o3!j}BF=u3~){DqwgPn7i1Wim@ zSd#i=-@+@`m%Tl|`eNbJmAZGwev~h}_ENIf=+ul=8U{Di)a%%{TEbkDjvYO|6|X*c zx@fCv*6A(@N%aETJoMjwsA5rS(7O19;5V@;p`E`!H4N>e=ef0Ar%_QuZhDPhIVjcV z=hadT#f>x-H@r|gX2!fvLuQ%R@%lN~dxO`#(H$N*+U}V7pdkOj*tT1{K7ZJwG^H?fNrvmZv;f^=!-9@%3NZyr5;CI9AwdDo(lk<2~0mP_?m0|KgjbC!*@F zTz6+xyTC@>yq?@=@%Ot_KUwe5w$$Tkn{};=pM3a|d^kjRNaOUPu@2s@Uz~!j?$OZO zSW|Dvkulve6{=w??xoMZc5u6D;1c(jm&cF(-Y|Xpke=Y|w$ET$!HlI@ht8F<|?_6cXjBYh1XT6weJz{GehmVV!`tQ-K1xHQ24PCwu z7*)-xPIztaRs-do6Pm4#ZJ0ailHOMX)xwmBE(QkUSC3q}qLpIdrsFm<_A6>$Z?Ndz z=R>|<9R9TvC#I9!}iy{rlT_{mxIcuMuVS`N-Nw@_trc zHKnF0(_#kSSlS@FY;;^m-+hV$!wjpphh{TOIGy=AH7^7{5i%o1G#%h7Rca@ua=OrJkFd zZl=FY9I8qr)hbdgFzWF!s&%SFYcGFb6X!!!a=1I%%=1<>yA|kBEWsBQWzOK-{WqZ==tZGc}^Lft#kJMYo zjm-EKwQ$y+g^&9h#*Zip&RVwmM8yR6muCykXy_H+0h4;IC3ou0&))AdQYS8NyoLYk zsb)9bBMk%QJi1kJY-z6f)wk>St}P3^w(Zy*^Tf(wA1{Pwau=Fc^m_Bw#U-k0-<3m( z%dEJsT-Dqq%Rf}h=;O#UlU@JHa5KK+5`EBKVm7Yld^_F&t9fKXZReaOsJ=nP1+T*skB$e%7k6u)z2J zvF)Es!v8qAS3Bp0w9UJ+gZ+W|?{hdy9NSp2B{QZcr`_V-P`@%P! z8MI9A^PQNA=cN}-r{6uUZJnq$r)qKcZ6*i2CUh|Vka*hp-Hs0I6|Ae)Cam%HD(jAQ zmD_jf^?cqodF{}h+T-jN?8_MZzV!3oefxB^4_Px|LHX{nbA~8A9e2CzAKUNls2eLb z{Z-w3@RRmM8rJ!0T4(h3>)Ku=r+Rl>*7VFgJNJ3HFYZ>G^V}nF@gd!UVwPx?_p0lJ ztF2m_IKW*Y1{_GsIrlRt(Zik_S1Wp-!Ykq*nZcbWa_al7M-YW}2e zKw?Mn*R*a{(2!#vY@TeJS#Y9q^q6}YRbOTvFS2OUKzXh*_W8A#ySrr}ChOZV)0OR? zdd%E*wL~jqb%#;y+j@Sm4^D~NvE)Y%>(pP)w8MkB7A!P8g6YQUv+dvl85a@3cE#$e zQf*^SO)a_{QZszam9yF{=WlM(tLfAe9p1bw>QPd>x5MfS>sqI-UDfe$P{R#lTyJ(A z**aqW90%Qzn+%t)Uh*WYpJuJM*0g+C{)a^q=B$Z7zwW@RAxduN$8T}o?}zjYKb_6( zdlKW&w#akji9SE|O`W#vy1ZOoab@?FlJb_r8V^kCZ8yn1Wr&Xhi;k14eEZs~cE8`3 zT|TYiLZod@bnA%jJ^SzNlzH>Op^*9ZE7~@~uM1a)japxDTC2H^fzwZAyk+Sow-yC@ zwYo$Y)X;yE!T4s6(8cd4(_o%wC>#- zwO7t*X!@;mZmktHpKU7|asG>af*<$ew>riZ-t9R#^-x~&&gB~vA9bD5a;~j*T;e@> zM}mfR?KQ0%H>b+3bKs4z$gbKahpdl0RlKKi;hmaZA>9`Z&20AceVtj?JY@6gzB4_$ zsMO%BYvbf#i+yV+nI4_AX7$g>sc*a17{>O)I$xdi@4bfExGtLeW!s4lt>e4BY*Q_C zM5R}HQnE?bOlRpk#kZZQj@scy>(*OMY&IeE*$V&D8}mBXuf5EP9kXBEM#DP%?(Ns5 zwfjbMZt}v;!`{4Z<(s&!*IMo3^p-jW=1sNU`1?rC&xoI#}#CxZv&2O{qJodLDP^P%yMcV)ypB8rB8>vJE43Tl*g- z8x1F_+ON5py4n6kKSe~J`~@H7ub;ize#dfn#>Ms9SNX3k&olM*yOUPB(R#xzkF@X+ zZ=>qXn6+`h%ncpGt182x%=-vj9@q7_1XG~!CV*i z6GPnZLQilPoWD&lYb+ z?%0;Ie#_UzFZUcd@k1jUVQf@<1e=wl&z{5wa}lf}F@kkS)@MJ8g1IO*yC{Nv0jHc4 zjGv{Q9u~n?rRX!o@L(>Qn!?^i^MSGj}$5 z;Tvy#hM{<@{dH-LX^=T`sa0kFE%~y!mlqUPo_n{|@8DeP??>+sY1?8- z?>f!*Rhyrc^WJpMqN9GpbE;Rnzqw5E#Kvaigj*l3DcWcqy}+W=>5@yU z>o;xH>r$JRHP#uu3#jF2SF-W`{jM!%P1q)XROIq>znjzZ@9wKFPI1=TUmma_YFYgi zep*)g*LJi}TSuQ4mF#qv2qw?aSB-tV?ZYj*cP448uRYjr5Or^pn{kuMwE=79n^=xK zTIb&6+_WY0&wo|wD(^_j*GPcAOD9BN)+@uZrWj&W#Z(amtH{CSou zT6Z|}bD#Gqx8xj$pmDBAU$>OhD2l4K@UCh0B-fe^HLOe2w64jqK6QgW>J*JMd^BpB z+hF^`jf+bMMK9axyP!vg#fnkY%*$7l*RGgp+NIgmh)qAwpKOzI^J>LP({3;03bIZ1 z`+RE8QU}Ua{sr&rJS=TpzPoa6S%viZyD}?}wNB%Yy0ZUe&=nUf@^JBG`x64_?3+CVlr9Nx^6oqT9&&~gN{qg8q9orN-OC4 zk)A$4^P+opy(Zz>gcd} z=@tFEi8nWP)IFH0b99cWclVsaLtnlQU-odA-(TPR_zWmJpc7O%x^6Z*mnjd)nef2E z+^+E$%LVOHo+qvt8)YYnOLp`=zjt=|$0Jon^V%KQH`H=(pWQECgfH6Qf3)=HkGlqY z9;UPQlzjX51NrS++jQ=^V^uvBTh=gR|`t+$l#h zA6p9Fhi_V%|1{s{-%I>k1eQpY;T`J?|(`e}%`G7!J?lZ{#vyZKqy z^vXYb%Q3HpRe4hLwq>dD`jf^kn>lWm_1cBKZIUahZ?bFdYr5lc=H>>?YM=F3S!HFq zF39HIgT6zzejj)A3iBT%SFP6{IrUW4j*BPCj?9qPH95R)v~G05cvYaulu0(zvvyfK zzCGLUVB6Q3TRdvl?(U=NFn!lTxqW!xasTQ&I=B0lq4^GterG9OS}~6+_G~cE?Yqa| zrDIszU4?J^EeL#TWb05SFMgEywX4vazK#`qB*$ra@yL4yE1{*U)*I;f0%k3J$jbs;b zS26q02riF}!hICGiTh~g+%19|!zSQ9mOa2dpLutW;Ks43xQ}NQxEHX%9ueFGHXHXs z_73+V)-f!CH5q~VGc1@ZW>FCl+$6Rc_sL8a8Np3qF}P1;AXOcxR>}=SnSJjFZXO$j`+Rm2_XW&3I)YosCPZVh z8mrGnRlNEZV8);`%+ec`!W{TH-cNvX5+qsy~BMa>)0=Xof-#Q`vr5W+3J`G zHe@_z_x{1$S{BtG`6$q5`@yYevRJGNz@^3pa~s)ia0L_enR#3=x0xlzp(7RQvvc6K zGE*fw61c0%U~W6J9)M}MNT1~o2y#AC9b~hUkh95{zQG-49g{H)gIk{*%pGN4!6i(=3MD0&JI+?8 zV7{7)JfsG5Cs|Y~@&|4|xYJCQhWt%K9@2ujGi-NS1b3Dhr$=z-SR(G{*SXPxle7cby(wtQj_JAw1BbnjY{&9buju zx+*O{E)E#_YV+U?UB_QxIl=n(w8)Xew^hy=?19TeEdJ zI&*VsO}CF6Y4$BWtD*hR{Kf0iN?zPOvmxU4*NTcq_3rFEziR2RxU)wUi9bhu-r-&5 zJbCriB*`g_lK85rH!xkN;9SbMI-l!TK0eS9pCXQonGh3U_AFmFuf@2BT@DRvUZUeN zNaowO^7FZ&Z3BkW~o z>og6;-!v81+BDv&@q+8OFTVd+eb{_wo8t*{6(cqnEUNdaYU7Z{Mz4LgJUkm|+I)ZS zRrR&%{_VQ34KOpXe<`>%UntIPfJ9#G$SDl`d)F*aPyGh@o79X2a z&!}H)%a;xwSKhC)&mY_D#LTayc`NEYUq9u+>hFc?ceL@mGukukv;B^RvB|!%8V3K+ zRNVH(--pk=pSN>)lgnPy?=O1u{X(l23cvfKZkZju7km9Lox$U@LW?dt8}D9Lr)eY0 zbBC?lcDM2F_GsS0{$s9N3}3kCtA^q#wt92~_mgpBBBc1MK+iGZQjTL=K%^Yg8yhaI z#ifT)0%mu}ly>j+KJc;F!($aA{4B4F%EX z*d-7Hjx{X^ml|?xG>8$$Zh;tc%wCvfj+9(Xuw%d#ZA(H$PmkdQd zjC{7EwaPcK=6<{Dz3!F9)|o%-d+X{_-z}exXcTZGO}&k~PV{}YIJ=eJn$Ur4iDh_R z9f$A)*H_1V&$f8*X;AiB&sCePpLU(m`CKE%{bOfE!y0n}Z+2AWNzQyM?2Q^|- zOV04V;`VN1@CSw(@SV*2ikr3>;!CL>e7p0$;tp-y@tM;Az9!^rDDKnNKQYZAH7RRr z;L<>j4=(PT7FZvuw`$sAu+EzQ*Aq4lOLR!eVu4F{Pz<(->6&iBmmGZA&!eB&i2H`= z;UkP8G_)2J^SgLq6R-2le<^-DcL-k^*c!s1A?eZ+H^%ztzI9RwngHpqoTaNh1}_&4 zpv#f>+L|yYgVVl_7h|%2Sg4YNv|5k?8*w)z!EWKVK;q6wf*-QKM@Xz} zk*@SYI1=y4vA1(0x3*kb-gs-*r846hk@UF+*Yk!Pvn%zdpIub_6fW|nzYb6U@#DM5 zQ;DPtF(qAt@$#4W7XxY)=4wCTK}sS)a}a(s3o8EgfPU#sUlwR*KK_3Qq?>-X zB7PGwS0_S0Ik6-mE(^6Eel9|PLgmAgjKuUyj{tx!E43f}NJD(>NdILZCX%lnSLD64xk8);Xy{x?;7a68~M@y94H)>iukt6ULB5pP7nl8IQpbPap?~^JpoEg zp^jS%Zv2ao*WsY{t4(EvN~S%V_&+_sUm{m`*c(kawzo7&MaGdalsJVW<)n;$pg=z+ zK!@P}mPZdQ^c(l(zyzQWpcmT{fns11Fd3KvOa-O^44`R=s+Rsi&;{rUgaY()m+n+T zJ>YnRM4kXofoH&TpaOUSyaXzNSHK(KE$|L_4}1VV0<;FA^$IO5Xca&+HchTHtyBR& z0V-k+kOI{JEucDwE~5j7E|7sRnSdNH1*q{g0L%btbXI^hU;{J+8ZpH=OVviWHUnFL zRlsUs5wH{}fmWJ6Y4tM_7y|SK`T;ROe}HDeI6w&u0OA39IZNw=Bp?Ea1fqbpKnK7d zD1!cp^us1^Fg}1UK<}JAfM^K&0DS=`@bspf-V0J|p}*x&zoULu4;X_mbwLdQBY=Kq zs|VBo41ms%PX(p{(}5BoA1DA+^jFxSaL{9HHjo0)djonalmH|G4uB)z1ULgO0DX~j zW3sc&R9E4;23!Yj05^eKz-^!$xC7h;?g96K2f!X+AFv-d02~Ak0f&Jjz)|2Ba2z-R zoCHn*r-4#n0k9ar5ug~LKk;+}^#qLp?FZ2CLBjUH> zy15RJ2iY881ds&u2V#LZzz0BSN&JBTz#Z^F`m}8f|F@K2D3}5_y^3uLHw|#3;7$gV zKyRQm&<5}VtRbi2mS%QafQA+t07paC7U&4jFcJwG1#|^g0yHo((D6W4AKU@~KfnqC za<>3zylM}00BHQ_33LHMfe4@nK;sP!FP#ALBTyJ!N)^{KOhkK2ZB=9->88@6Ow|Oc zAg5kS22l@Q0Z^$(f#tw3AQu=63<7ch>Y!ObIzSB#YWVO}KvddP%2e7^>Xd1+CyW{? z8B3)~hLXX-KudrUq)bw2wF0PWsG8h>YJej^t+ysn1E>yY16qI#&;xV;T{Yhrv^HP_ z(3q+Z7*Z7zV+_;+>H>8D8-RuxE5HP>1nL210Qr-j9B2U4SM%ne7Jw~4@vQ)Bpb^jz zumYL@c7OtC2G}EgNmHOX;0jP5bONX!lG_vT0Nep;SKa_M2WqTT8dOSwKuds{2DLwG zhvZLFJ2e$@Q!}CFLZwGMwLfYOs?NAk4>V@x3y+EmLMFCVjgPnYZxLuAFaan4#slMkd|)gv1{e*D0`dT=myy5- zmU_`rH6N~dz+7MsFdLW!lmIh<8NhUa0n>n~z!YFIFbP-*d;s19mB34&0(cHkAwL5i z0{4I>z#X6*xDDJSW3It*6}Svs0xkl_fCE4Tun*V^>;ZNIRQkJs9l&;AEwByP3~T~c z1Js6B0qcQ{zy@F)Kw;Mabfz7&rnP1&#w{zoS z2q`ftR&rD6Q7KUgy#}acNd5|V3%mi|0hBOR7vU@L1yKEk+h?F95Cl+rBf$^gJMcH~ z4QL5aq@TbrfTn4hu4MqNVrVr}9nc17iBk=b0vtdiCbembL(>*b?=zEyAdAS8 zEF=m6?@x0Z)wdB~3^%P4mcvbJ1)BTBwL~QRDECnSttn`oA?kS#KT4G5O`4`e-9npE z3XMioPE!OKLoJ#nTUxYeT1??cPS%q$GMy>eSiuFY0&g@7aD?e38`Y@^YtFOYaSxO*bf zR5k)S*C1vC#Qb~O$9cVsp0N=RHBoJm5hit;Az zaLLDU_3(0V5;xiYwI3#O?d9O2jaap~X;6i3`LUEHXYwCOsyQUTVMvVG-p_PV0J zN_>GJZg(nZreYSiW*0X^g+yKcc4}*0rXHIc`7HDdByK1Wcg*6DP$7yts#2PeAW3nj zcyZ5FwL}}DASo-qE@#rKCMp+KiMZvwxOpoAI=l1r-d~-pxXr6NS=61loxQj*>~9G@ zcauTt4P^I0;vv+xxQD*DJ+!!YE+kZ1$hi0-N!&bGszO2(%h|~Wk&I!txW6!Of-`kO z@puMthhj)DXplPb00(goV|79(AMuC>ahGFAkWmM34CY9OTClLMvFe0ApAc`Ic+P{k z)$wn2;>i%==E%R}h-XEJ+a+Ur9xb7-{xc!Xbi~sZu;H+Z-*Fh~Pz01C@q`F*lVnI- zP&_DwBicftirXqf;w{uGfBXbapAdIoh6JTUJG+SoRET>tL*k60MjeU!R(HU5&HQf7 zB!U1o{HHpL>ijbJ*Kro&j?RdK2sD)V=&(aCkgg!zz>%Du~v|Sx7DR&A!G)^9)NYcD^}Z`l5>Md}H=^b(;RA>VeTaKqL!ur{{);`_nMrFKFuzA3D)EF8y^09) z7Kkx^@r--|a^O5+@CBBOn_Zx>qT|VLwE8>pi>V!~Nf0{t3+@1epon*u>l#nMkcJO)w zsW9KE#IsqNU0s@aF?maGUNa3jf0}vK)`;H$#GTI(hXzCpZvS4J)!_pCX|(Z{WM?VT z(&Lnpv5_7Fj8EO|LlTUYC=-cz%!{~TI$L}QnmgNyU8qhG{L)DcHL2#ANo zh}*668R856PZO#NoeoQ=KPJRS63?0ucWqba73I@keW=W#Iyb8CIr_{J5-K0m$#yIy zWoVgU{VIR{JtgL|Iu2U1cmR$6heMl7jocHY%(qfzCLTwl73tFBT=g}_5nkQpkD0Q5 zm2y+@92#-=cU~c84GDWy(ZEbROr|Jq`sRJNPT%9Dydk3+uqiL)QY^IAymXP;N!i_( zwB9n&hAFMg*s8}Ne~3&26&6vFYUa%7iCiTfS>tQjq0i81LBY^YT@%?951|pai$nam15z z#69kL<1i>Pi)&`8KUNSw+=vJ4h+E;S%MuFz`=auX+W5J?*h&~v#0~SI4G&Ik_0i~W zLPSe+aSwfn(B$3N<|}penxgdST4&A5uE@>AGkTt{Dm1)yt$K!(`(iE3!a@M)I2$(a zii=d>*yGDaDkH9DL;fxOuLFC2Kfh4@B0rKp8ixVT*~zXE|G=Lo?#VCZFeTGq%)fx6 zXP)|XZH-4Y?0&WmC))atXCBt#ine=eXrYC{e@_S9gnxq4(8iiwG1V1gvgcP4>R=JT zuMNdV)H>YDMl9~Cm9(l68+SEN+S!)rUUQN5vSohPkD((y1}4d0lQMo^mv8lv&isL7$rZ4luPbYk6JnAs&m=LML=U zX2I#W-vPvflgx*9;hqe?n)h4sq%oTW-JG3J(*>Dx?d}wG)c+m8NWqM5$USTn!oum4 zPS=ul&r^?Rap;PCZxoLn>K0Je%*@<)x* zZYCb<)W6<$nW1H!&%XnNJFrdAEuI5aptUZcud&aN-vPvvqA+GROe&sJ@LMw3fmI>u zVwgo)KJ_`za`>_^_B()h_>``3K(k%k^s~PuryN+wEf=W=_6ofv_Ye>7c~EdWdvoVf zU5pBN=RsXhJO)TPvSM&%)Pt4$z~oGG?g$Td9#O~Rd4yh=_;=38HP1idCk!Z;x0b+x_lV$p+n+zyeB(r06DhnR^c9Zg!iCG5wD3t_w&{HXEL zgH_&^OaJm>-{{Ro7_q-l3DzX7To7z{f{EPiAme?(v89sd~99o{bfD^Fgy( zmcc{$Lf}_3CSGjNT^BQJV|&s-vQA5ViR|x!HdY@T5BHcTX-Ap2(y{K5Y6u7Y{ps zVU=*WmhY#&A=Bvng}MtZhJ+r6!$Z$>jxpMH5)$>p$~u4MbU#G8IDn13FPFNsV6*P$ zNy}TX`VT^+N3>bO0~aX{$C~$GfZ3=(K}V{+MgKL^`*)FYGy~HZzNHnjc<5p#o^~~B zddp*1c16mO2ww8gNQuf#dDv8Me{10hvwIu1=%L(9JT)uXe|o{d%jIO0JJtcH6)3#& zFvRQ+k2DxsDZqxd?7$-zGx0nw(^FGrck(w;(Nc}WrucTO&+8v>}; zif4n^rl)*sE`8cmwI*2TLH~X=X~bEE@SlEu9g!s-E5mDYLBUGIL$t($XQbRt#KGK^ zCmypU9!}7xsTz^0|{>NwvJ+Ru z6MsS@mX;AW85YpOczYKnf94|n*oB2Wlbg}UFnXVy{;_pncPD> zAnaYo&e3aXwiu&@^$404I<0tw*v%IOB@L&oI`>=BsVh5=sN$JpVKpoAl~F_6{|+D= zOD4$+ymasAyk0AEe@o_eWoFOiX5u+!b`@vNjj7$K@OOaHuB_{Gxrcc0*|xa{ua`ev zI_GzQD&&ZkNoT@mp1X8qbl*BuvHS~hWO>1JtjNRI_e#0cHH>Wl2@YeG@JtV5L9bkx zS4DkMAPlo2r1oJTVEOBTN1` zKj9sflSIgonRqnX)SX92+EA!q#q(8ouLg(`4ddgEeChqzGy@gOMv$;HJ3GqAiDUbEx6(Tihu z-n39<$0Vi<#*v5ZdtGY$y4hyCRS;A4lvKI4O4$@#>o~${zOVnc{NJy4m*MR(g})s( zY+1xwE7OhO$&yhfVFo|zxZT|g-U$40@4nqz4D!LRwyoYe)$fe{L!ricxu4~R7*y%@ z7OV{4#gg9oXwkzsoBuYoW=u|YI?h2HkT^t{$@Jd2tJK!353|dP%}mV5ZkZVqmpDX` zljz8=^A%Ys>DjS3O)pC^C?+#8CM{N}fS!c(%*5>6l$_YaIHiIQD1?qnPZb=AvFT}9 zV(}>WQ&dF`$thye5>sQO*-94kcY`kfA;?xbDjfgdtDwbQDv$k%4T*%LhdUiX5jPtIHUz5hszV z-~B64je;e@xzWUv0lzsk8(LKH&Blr*E+;ELD>sT$TOCRxylcrteXd~xjYJ{T;1td! zZ|iamE&pK(g8YM5xRq?SJcfB3;X7ff<6FAir|Ix4eL9fhCWQbR7e-;~oT zQ5bW&Uc#3e7YaB4r?AFnrsq)oBqXN9CB?)hXJsg3lIiOK-!}Q9p|fIhGBa~a7T4#@ z+R;(b0uLKBq)46r@&K*q1B%!fR4)Hcitk+fYSe|gneg_vBvg;Hteb%ffEMvng@XUy z!K}Ynmb|s+>S>X_l2Aj=x};xI&a$LPj|(Z;*OZeP;H+30K;qEcaH26)KuOmcTpQnC z=0oW(HyQxGyijgiCT7LN#AZ?NΠUksP0tg&d$a;L9eJk=4Ka$Tm@)#W%V#E3TnR zQwu`y+7$c;5=tbC4tkAO3{H&8PDsm0_0i;8V%EeQtLdePO~MhN7%cZ#Kw|yqc%Tak`wG^C&U4;2OGWX6oO0ReX=I>&H4ku$YjW1D|J@T2 z@!wtweyvP~VdB8tmz5DS7}Xb_7L%etEo9SJZD#hHr+oe9P<2A7?EG4fo6Xe|M`(ol zHCn5O8`Xaq)e%%r(1K&JiHAUIa z60);1vV0s_!ryg+G<5zW42<{(&zs@$A9kqU+$(Z26H#$yt{UpH{%H*r(?5MMl%cTP zF%Vfb(TJy^5^*#*suRxaE+<9F54il8l$Db~D}gLbX-drJgOrM_+*Hg7$-)8B)EFB1{8>gO{m-#6 zIZ-bxxv$`~<$Q98^E++i1M8=f#rm98!+)5EQ2(?SgRe7sG+KCL;rkXs2o6Zl6)1-T za?)b66R}Ms3MGz8!}=dSi181eCK~E#LH}iCLzW7^_fh<7&7iSPFX!)lHpJ(1)sypGk8^tpgoCq&C)B~8cXoIi{(=bZ#PzVDNi~nZEiocyJ znPJG8HU0n8b@eb!MNv3M4XEWW5(F)kAFYV^u;rf^jDK--(80tQ-km<9DG;O;FUHJzZtMQ>!f z*uRLMi6>@iSC{)_Fks)UZd-CdEybix{fWw_y23(^6AS2?)?ijeV)7w^yH;oypP0<0 zW?0vXi$Z$fudr7WKQ)BGEIZQw=dQOPk4ChwSl{ zD~z&h6@**fAxJQil0QJDCK+g(j(<>4YF&ydfbNUm)qo3`N&>bk@A^Z)98R$KgKO$Z6AZr!u+zi738z|g`)E*s19pEx@(835~)4@Arwh1OPtEXP~ zZ6q7U?uMkF^q^wbflyz-5X$42=@UKQBAo*a z+iVyJE386BM~3=G2S*58%M;!5uvT3JtWc}HlBdatt5Z-63jf$~p!~v;w_8hRf48eQ r390F3^L{V9>)f1D1O_sxjOE;#)BfQ>BTxNnW~nTxNg#!<>^}VmB4{V< delta 14541 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 diff --git a/components.json b/components.json new file mode 100644 index 0000000..1c6facd --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/package.json b/package.json index 89cd57f..0d668ae 100644 --- a/package.json +++ b/package.json @@ -10,19 +10,29 @@ "preview": "vite preview" }, "dependencies": { + "@radix-ui/react-slot": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.0", + "lucide-react": "^0.368.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-icons": "^5.0.1" + "react-icons": "^5.0.1", + "tailwind-merge": "^2.2.2", + "tailwindcss-animate": "^1.0.7" }, "devDependencies": { + "@types/node": "^20.12.7", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", "typescript": "^5.2.2", "vite": "^5.2.0" } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/App.css b/src/App.css index b9d355d..b5c61c9 100644 --- a/src/App.css +++ b/src/App.css @@ -1,42 +1,3 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/src/App.tsx b/src/App.tsx index 68da7f5..dd2eae4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,31 +1,33 @@ -import * as React from 'react' -import './App.css' +import * as React from "react"; +import "./App.css"; import { FaRegPlusSquare } from "react-icons/fa"; - +import { Button } from "./components/ui/button"; function App() { - return ( -
-

KEVO'S ATTIRE BACKEND

-
+
+

KEVO'S ATTIRE BACKEND

+
{/* Add item */} - +
+ +
{/* Table headings */} -
+
Item Design Number isActive
-
+
- - ) + ); } -export default App +export default App; diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..0ba4277 --- /dev/null +++ b/src/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 "@/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/src/index.css b/src/index.css index 6119ad9..b0e6fff 100644 --- a/src/index.css +++ b/src/index.css @@ -1,68 +1,76 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; +@tailwind base; + @tailwind components; + @tailwind utilities; - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; + @layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; -h1 { - font-size: 3.2em; - line-height: 1.1; -} + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} + + @layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } + } \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..d084cca --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..7cb7e37 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,77 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + content: [ + './pages/**/*.{ts,tsx}', + './components/**/*.{ts,tsx}', + './app/**/*.{ts,tsx}', + './src/**/*.{ts,tsx}', + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + 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))", + }, + }, + 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: [require("tailwindcss-animate")], +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index a7fc6fb..51ef919 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,12 @@ "lib": ["ES2020", "DOM", "DOM.Iterable"], "module": "ESNext", "skipLibCheck": true, + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ] + }, /* Bundler mode */ "moduleResolution": "bundler", diff --git a/vite.config.ts b/vite.config.ts index 861b04b..99c7b27 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,13 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react-swc' +import path from "path" // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, })