From f139be1c97444ecb68dfc70301f534ab93d6e93f Mon Sep 17 00:00:00 2001 From: ngc2207 Date: Wed, 29 Jan 2025 01:05:54 +0800 Subject: [PATCH] feat: implement dark mode with next-themes and ThemeProvider --- bun.lockb | Bin 161036 -> 161505 bytes package.json | 1 + src/app/layout.tsx | 22 ++++++--- src/components/theme-provider.tsx | 11 +++++ src/components/theme-switcher.tsx | 74 ++++++++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 src/components/theme-provider.tsx create mode 100644 src/components/theme-switcher.tsx diff --git a/bun.lockb b/bun.lockb index def0529e2ad25af56b74a5e2bbb789bcd03c4eaa..099e70a0ded95046ed6369d2b1b93b4b904730d3 100755 GIT binary patch delta 28736 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 delta 28380 zcmeIbd3;UR*FS#ul}ipnj1fr;q2`24ZX%K^sOg%gP-8+!%p``Gl2FR0hO(=>sx`Nz zs_1|iszF<-TCJLgnrj|fEz#olexE^74}E^m_x1eq{l0p5-?i7;Ywx|*-fIu{oa;Dy zLz{I~do8%;rOUUrH$T&=lfme~@t2x#i)exnjnlWgzKTjrDTS^-0tmYg&!Wk9-Z zoXJlG^@8&2sJaB`z#+pES??H!p+7WbSjvcm)YRSJHRSgNEejfN^7jkcY{kKMC}gu0 z18r-{e+BOi{vs&q&&a&wX;hF6S{NA%Q5)%W@I^sG!T5ky2c`9GkxyD3A2e`0DE0rl zdaUwap;Fx-y`BtPW-KhDMfXq}E52^hvB@d@lHqYmYSOqQ(CH{ekCO1ghDRi%B?k>o zN`DnS#2(-v(9rd$%olV4s2`|5x{vZq@MSd3SAnwOlAy3H^L0=*@JDr<4gO|M2G53$f=54OCY$^glkaTmFV^)D_*qDx12Ypr z(KVTEKpCL*LFrLy($FzUqinX?;5j<|h7TDI*5(mn^mb=Z_S^@c%r6X284ga29C<4) zAHiDAwB|sSk9;Uo&^S|f+>NLuo1Z8WNLD{)5K=<-) z3&XlWsX_X>kuYlDh=ft88A+Fs!2-dp3|bkK4eti!XmDmH!0kP#kcLRN5moEJ`+}bb zO2aJoeN4FrD7)iSTO;~jX=iln?vBRvsM?9$TELcBRhIDd$#8ctva7c@?A{MbGZsS5 z-aihW=1d1AKgs0Z=wg_?p|jD7TXue;%2^h-vA9;O_N+^D31N#n+$A{tT~`QD)AK}&#^F!dLqJi})N%F&SZJ&lGc z_A>ZyL0K-ex8Z0Foyuxj`HZ=!nq#&JDx6PCL482ygK}bKfwHOVeGPsid|>|D35HK& z+8Oy9Q4dYX0%f^bFok-4;A#43lkaDm*b=ln_wEoR*h&7NG@ukH3;d3P?3)XqB|yIe zW#{!BVDQ-9xO1lFK+Zv11lcAC+W%~0i^ zj*1xHF=GwA1E6$-=ewaPscC~!hYyRuny?#k4oO{8&wniXpAGa+N*p~93X4$@yYTTC zV^{edlnrD&&!E-3m5=JB>4oR~83^{|c5ajHEX{d)o zk~rDet*T8n$0`oQGVN_TUd?oNnC_s8D)9~m^P*$`GGyt>~@_j%{f>J(C&MaEp zzIEy+9~Yfo;FCt)_dUgjGRoH_{A4;lqhvNdvt=$mi^-_+F401!<8zVB#^)88i_a=D z%FiW|WI8_A$ZULSG8dm&GRog2ev#?;tRl1VnJ9DdxkW|=xU@orY_?V~z%E6AQ}mJ9 zki8FCEMx^_j=xjbWmE;1*22?}dCHssr{;}OqDCQ^74Fo!gKGq?AnVXpn4Ck3Zjmy* zqDyOup}>NJ`l!7E9CnvXPo2AHavn0yr@)0-jBu;yi%UCAYO%iKyX&5q$>8-=8( z?9>{Y99jf71sryyOoz;Zy+6s^$}Uk>Mg_V=ZIIhwlj$$Gw3%2b+8UbvPVERd)+uCGpi|V5QPo`95=`AehAiCa&=BU0WQ=dLXeo1% zJ0E-`at#ZQfTI;CkJQLoo+wz0Qg8GQEyV z+XWdz5g`M61-6DrT_Y|g(i4mkGjwGhI2J}+!n||fo`2D`+|GODgi+vacN=+S3?jTN0`Ze5pnRYuiwi7#b( zJ(pI#f)S*GJ+BP~XAXQtr?v@P6TPW8nDzi%C^%@=a%y#OIyU-Bpxh8}Mxf;&TsN8= ze6Q=&e*Ifsa3#ZC1I#8)txHhauF; zI~@nWx#XnqXi-k4hr2{OnH}!3FA9_mB4Qnlum;AUl zm!%?Q$i6mYDGfb>&7#_Pr23$PFi@Bd$G|1%g&Neg*^*>TbVCm$46E-T)m1)>Y$$UZ zy0lsK49hV#K~Bea;Ofgs6{Cf>%#Lwsi6KV6+ayNZ{#l4@5F4xAgOFk1kZ}=CZ8*k^ z(Fm0Qr+q`Hd=MLJzaAjjxhPa6{|gl(4`kebU9)% z@uJw}Vyw(=nN!KB-9*xu45Eosi;OmACMG#n zbLcm9Y5O2!9lF1wh|F#3a|APVRB-nnG24Z z9y<4f$zi!fUa44PW*M68z_DBbefGQ#&S-&i=`c8MC&mU=2c1dN^i@v`k-5!X+8W5H z4;O+WJ;4}N!5~L<=(f_Q-bkbyUWS(12rbAO;*;)nh`N2d*zT zeO0pGc~L%S6RSmIpI}I09wCUvgM*e)z_9~dcZ@QZo!quA(N9LTb7{-)h0@Sr6PLiz zK%2~J;uOI$x1GyAxP^QW7ptv=9L8ZJXnUcSM)zS{P;4ML4gh)pqq+{|1n+c)ePb_XfOi0-b|p?f~7w5{OS zcgVxIG=1qw8{npZGnWx`z_;Kyp3ua|d-lk$*$fsBF+%#uDt0y_5MuRiV;F0Nja7K5KtJwd^ zIM#8B44IqgvY+TL8}y6SLX)gYxD<^5XAB& z7-BIzQVfs}`p1em8I|O6{AZvZOxXO-A=OkLlWNIED_9Cpb_6&qEoP7H1jh-k_n#v= zMGs1Z=Uk*(>*0I?DKkiLDz7;RBcpdm3R0$hm^3-yu)6z2YefbdU7;^@jvnB!{bQrAC_;7u_>e0{>2@Vh9qK?z?F1QwQQr~F%jp4GvkXWtx z2rDRXnsj^wuA|;@wvk3~Vb$#G)LMWuW-{m1hv1A6&qAR81&#w^I2}1kccxOb_Bv8# zl%VFDx_nZTXwgb$4|8cX(u_3^X4Q)H0E5LfG1`71O^zQPtHq6e(jL|k366notl1~P zVG{?JGt8-#8)M{Q8-QkCaGX5)=4f9!Mm`u3D<;UOkuL4nSfhL35XRDH9E_IR>qa{| zAyuC)i>JR8#&N>N;9Lzb9sY@3Lpu1@=#>9Rp;tm6TM10+1s`i?iYYhxlV z1c#yEIRG15$^>I#VJEETbgTh~br+#>2Ptl5@Tt91Yc}!8+Jwn49~`y>?g!}KtKb@d zLr>w`TUD7o+9d|c+|e%kmPxX~m{`Zs$$H$6iFVva3XzCZ;|x8z#zbrDkz$miIQ+f~ z4pSN$Z8Oc3_6R8k4$N=jbTrJe>X?pHXX@IIXUQ$&VjZ=nSO@+rq_9umxVZxH@s-(*oc_ z0qTdDG#r%IvuHuc(Xh=9AT;$WA4MPFqJR}5mUN0P&@WOJY@~ArWrgq(H-q(Ww7PyP zGoO@ljF^7qr>q|fh_2tx$hNh!VY6X@j%EfnZT%vp9P7P)J&V#XtUUTfN_|wPH_($( z`EY`d?jN=#{UW7SUx1|(0bb9d)WbroU->EB7yyuBY1J=M)`ulhzw*%xJp*f=-Z18Z zem#qNAO{PBe&wgE7;A!lkx~!yQa1q8PQRW{OBt47hUpinkU^7tG_sf?=%tuRKCL?ru?5MRp6=3E`w%Omqjx@E3*bavm_~#{w56| zm9uC0Bv7leDGj6wu79FbsbcDpvQMg+JSmgaO`g;)y=MEAprE!XCAG_knLZhuFrna> z5oYH8pHTV`VV2KNDR-LnN1FMhoMLf;&uWZ>Za`yGfz&Qf&910V#23L8kY00qGFVwF zQ-_pEH$E_rZG33X{Jx-Jpc0e=x)2n9ZEx}8DN4~IQ%=hA?|>EteczOmQodSX5>obo znL)~)=T8r)u+Ef|vR6L=r2*NX%-Vtv>Tfss&nd)3O8uRnTxGrnrQSCt-EZdqATVjz z&_M`D51I4`DE``x^24NT_%wJfE0;jMKz{>eL-#;gJ{OeNKT)bYFv~s4K!SqD_+SMB zAGEk28I!W%q9#vDPl}s7Da(6XC;wkVS)Wvz=$x&)N^%T4}0lYRio za%({8^9DQO(i@2!Q}DH^um_ZG?FVJWKbZMPK&k%=C>yv6$_lT6^7^09($IfwM_jUj z0<7&R%8ETqIVqEc@Ikq!Ni|bm6qFv71m#6q1T?_pNm;IfNh_N2iWx}I_{yf>S(HOm z!_=!~>XCAV2?J%t;bwk)Q0@(lL3xqVuofn5YsyJkE~6b1?CQ>@po>Yng7PAzV!X*y z_P=K3DAHn`2;0=BvFqk@!e@nW3J z!DqVk-5!r0?Tp0d1i2TV6J_Pk35iE8eMmo;{H$=N&H`02qh za7V$#eBl;T<;*YQ<%}=9SPjLh+p@8r0}EAk4s%i!AVbmRX0!kzK*&7EHI zA-Gp%%U$temRyF<*)kWOb7Y6z@nWuAy*pm6+U+I1zI2Ouviq0uvfGzlayvLFwXfjS zSMcg9w^$&v!EFW?@U>egneuhKO#a$S?gzI}`tFIB<@R{VNqgM*Mc!U;d%y+lb&Gdo z`d;|97rud8B5QsF-@buw-?+sxc?{f9a54MbVuhT!55Db#Z{XgQQQyM1Z{gdwZt=dn z0`4-nHv8RTwOqI#zU_x^;MT~N-^I%o-+9Tk-?_zFnG5bdxL)78#X7nAd-(S~{5#+l z8)Wwb@b3Wp1NVv4et>^Jz`q~d;xm~IZZo)mAKhY;O!*Q1{RscSWlP_K@b4h}JLnc$ zta%9j9fE&{+#*LF19uc$%wf0KC1)One}~~8xG!bY z5%_lm{vC0PujLhRm%+6;>c+3-79NFvN8um1eX`{-_;(Ec9dnEQG8f!^aJ`PZ#rJac zark!}{+)1(A7u9v@b3it19wnrC*j{o_;=DR4#{kAo52N~a*HD}VulfI|n z-)Z=F+AU7Vz2NqM3;NkDPRaD2;or~j58ThP<{9{R2L7FKi?i|=xTD}=&bq~UIrA+1 zI}887U6fJh;NLm;cg~I9US0ur8C;w5Zv0wv;d%IX9{z#5CR<*Be;4521-G~%bHUvQ z*XyEN+>)y=!oQ2~?~+^Gk=-xBzf15B+;39*1^)d4|9)|c-(@zq&ENtqyTv`3avAK+2A&V3wY!fPMPuu{ylS0YM7~1Zy1-v{AVf+^3*dK?vHZ)de9~RS*KNLJ)LN z-3vj`tq=s;Dd?m$PY66cAsFfjK^K)x!Db2qGzj8ViiVG54TAj?bXUHGAt+ZEf=PuT z=%Myfu!n-6A`tXa=|vzIR|JAn6!cLwi$YMNCMLXe=2QE-%k7%vF=shM67%3#UOa67z6{=6$&m>(55&9DQaPH2;M9X!9xlLtCrpnwD5*ttv3WiRW1eh zDd<%Kg5hd)2?$n|fWWIH1S3`Vk`Qz&3Bh&>Qk7N;0?$$q3@ru0Xq8RDW(opILoimQ zl!hR=Gz9x8NLRjPAShP`f=Oi{n4tDju!n-6vJgyC>181pR~CX(6lAEHJ`mLKfnc@| z1X=1B1xG1}DF?w+HM1N9Gs;15gMw+BqI^Ldxw!x5y{SY^aZjkFzc}HjToSkQ)LDOQtjJaED+o`=e%wGTOj#$rg!Rt?t8Us}K@1d*N`5F}R6F0d zhF+|1Ad1Zi#68x$=KAY7-&RFV^Ll1ZyioP3iExM8`8U<2dOOy?XY$+RRZ|qQJG!^T zzc4WB+XVCL+4DY=#goc?^~!B{LXM-Z_0KMzcvYKvqSmIMFyXX2__U>Po`n~rXF!d- zO7l1He`C6Wy>PuL{N9Iu-te;eeTrz9@#wK}Q8o@)%;h~)UKY=O81|vh~Cj9 zHrsep#+%8fP1yuf#@nmsOxZ+J#(T0C3|WS4k}2ek-b<$9WK+hcAiP!0%X)~x8^1of z1S4wd@wv}3Q7eC}Bv2nYDUwhqt@<+}qf0oB3R04e~!KzU#?e=1N6 ziIM=HX?p|30VldV5{LpC0MS4!5C|}o3j=)MQW_`=Fp_-%J`K7K+yHI@w}3kUqxvpz zAIJqB0Dl61@oCUQB>0%=IB)_u37i5>180DF_I1=<5$fNnq!peG>V+z6TtYyq|c+koxB=fDo&3xLlM`PPF4z-(X+Fc+AB zdKUoGfmeWW0DsQY8|VXs0}+4|hyGsSfWAOH-~wWS20$oq5C}j$eDFRPWrhG5 zzW68$?0_%_m;|L)fkr?a&=_a}a1rIA`4eyvdOLw#z;2)uWNx4%a0UD|;5u*z;InZ) zaK8)u4*UTufnE#HFo7k9dkUX?-iBg#2DmZv0yYC%fbGCmU>lGFdn&=;2x5XMmoa2F?KIfpfqG;1_^pn12;urxWdjvBq}>?F4iLxbEj5FA8Xl z^oM9)|4~mXFf9RYgG~W$jg5gD$Y*60k-iBU2igd*1CPM}4!Dr!p@WByhu|Loxd0C& zJeY7f_yhcXpaIf6wET*+4YULI<2y*xBJRDIuC}{Khl28W!F^i;Dg)dq?jf%pXeFR7 z5De4-xMy>JFQmkL91E%<83=H9_5g07Sbm#-15X=n18km6{squZ()@lj08iVgZ<$In z{sibJ{bdVRhG>!DQ{u!?{WN6*97U@)*vV|XxGA?rofXqlYZSea&$>9Wte1N< z4@5i|aWD7Gzz0W*4>xIj34lXT2DCI#3MdJ%5>`q|u$x(-7%xlKNuZ-pO?th)@#W=U>u?%Bf%%kD@_*2=koEtq)jUQn+)b7Wt7jz9}K!>oU{2GvMlE!*#L!Teg1`!fk;p2NC$xH8{>gSP?vGSd^)%T zG`}Ga7=N@Tzwl|EUCYWS?+wti&Ok4qC%~@-F9B7dL$A19bOX4}aJS$TjR&|p%pT1{M zEG#&LZpW*~i_tHA9oQ03?1Q3*A3bhzC>#nQdUxB#s5VQ`{%$pJiKtz8KlI8&?|wn` z_7YJJclEtCBKM;D9!l-3m+P%ce>6O7sb8E2eF{NEw&|XRSr3PZ^&53kYuav%V7IaupH_B-FNL=Tzsj+E_Oju29ir^@KPugz<_#z z4Jmx*TCHZKJ?!EZ6iP$VRxN=-#4{QXN8^YU>!p7IfoH3Hp#^5cEX0rzMK@S?bqr|{ z)O5Z7OI=Pi{GuroA`OL5RT$E6>@RU$xxm@) zd8wC{i%>CL&0dZ$N>V2v^~*$8v+K@2+W%3FaIZH}7s7y1xlBLFI>o3nC^nupp& zrdqQCq5X|2u^SWV{t8jv-+HUy^032gm%N+n)GeyV(8Np$UMX6e(@xA&IqO8}g1WK# zEG?~etrVRwvwhx0orRVAU9?a^CA}-M{H#|3cIkWl@q^bA{?ILfxmf;{cn^A0l^=+o z^=iOcbzA&(zenj`q31Nl_bt`#JyhFYZNCNeH1!TkWvM&2AY7oXF)vP4d>>ugUk!a9 zRaq|qe5Fv$#cfu6{J!o;NHDgW-f9{3veYf;iB(Elg~Cfz%qj@Cs8_MV_>HNgFV&g- zXKn17a&qxa-CjKqjV0*W4%G_|$8l2qhWhLW0#(n|qMZM+Kx3vg`{40v{|$|c+Xbdz za2Qs@i-GF3)grX?BU2-6e!uZK?<}2U7k2{H;nkuN`taUrm{wZV{s1;vZxGB1Ih0nq zw(RC1LO5q}l!;Y+pb!yX#aIklOt-bF^L{s(r(nI5@W_<18?=LUJo0j8sI@3sf2mot z^|96I%{$sF&hn4zm%R9Hp5`Cb)!Wb%B~@iqDZ`~LW_@q3-f60RQl5hK?#5f)PAw?b>NB6b zoSik)khL(=dJE*4oHCDIKALA$#gK(c_bEN$O5=5yOjuC3qAO`Y>T_71hWhH`i^sSp)`=HA zw_~Jhu;7rlM0r2!4PIRrUdSx&zj&4X$waB8dacL6Sg!)x^X+$6%eU_xY!`883?cdC ztzrX?xjya^6nQZ(XK{V?;d%^=_5QNkdp`;)9a!*3n1pzwGso+zGth|OyV%O2u6yfW zZ(g9snCsA}9~?rft#=xpyIt*6E$8qP$Z-aTVS%&xsGtqv#lrRQ-NX+?=Q-8H4QR}I zN#fZVC(<^w{l*gouv2o$-Q!g2pJ4^-wp?+$w{5?Nys>5vIQVSd=%mu(Imm$07g| z&hHa0kT_oRT(f9l)z90=_wS;7B-+95Gew=fhRr1T6VcY+diSO8o_X4-Y3tWOi+dDS zzm<{d$4{^wW+}&~SS>$|R1H3b8#^M^uutK}1+)5Lxl#Aq4C?5Ig5fw$qL<^@KiQixzwy8iUqEH%Cfif( zfI`Ic6|C15ci(Z-@%HH(HT0q(!5Ajvq~(_rZ5%WA&YoDz$9`xWmv{Y?X-ijeJc_-n zdTbPJ{H(Wz)_p(ri%ZiIvB>i%#{LRayP)8|)McD(hSsc*_`&Om?d&4VtmtARRc8}i zOjdn1p+d8Nn{E=`MZJY+Y^?c98mo^sA!05zGVB=~^ZJaD2Ty*Db`YFw2i2TIHU7^y z`Ix7#!%bAZ&Cqzxs3A5MHC2;0qt`!cs@~j;L-RAE2zKKZuzI{1!-ViGpAFmfXj){y z+(KO?YYyVw7AkTJ*ve|~7OWH2D@3o~PdwG9lqV0pJhG#<-L2HpEofJ|)fN^o%A+d^ zZ56evE^KYgnk2j_cUT%uk)1Oqtn*%lAA9s~WBl{_KijDF7qQN0YWP-kVP%zbUX=Af z7)GiUTSb_^^}59}UH6}_Q)PE=eVFx=4SMa@ts>OVdSPSd6XR>t_KzH37yay4P-ta_#RQAhJrc@%KB4|r$D_L3_9}D-qNRZ9@DrN%QyDuzs;bI|us)63jfJhQ zx^)7ghU(gJ5VsOvfOJ&?oC^N}3W=&6M1IywTTA~mtI6l@?ZeNsu!7(ZzoyPTAbdO` zY;!xP#b3Z2>xHv#ys#%}bjeP;OjVe(s)IUn1f#vNgSrk)drk+{_p~UZ{BlGi6rYKWNW9cy;X2^X1!d7v>oW^;qw7Egcupc=XQixhn*{D{J%Ka>C@dS&0c}R z-zzf1S+)EMJF6L{Mx|!mX2a^cuS9wKk#5TS8#HT7P5Ywms>0V`4PX7N7Y~=2Gp_QZ zWBX5=Z6ZcXsKH;uDCgvI1OdRa!hC5a)Jk6Qav&0jRE2ul? zP{9{_5klq!46~WN<7d4v*><4)?uX6KpVw`z$FE7|%BHWGzCvFveF{WbLt?B>)?k_| z%o+5zpY`hHJxzCfziDo4+q{l59JOz3uY&jKBcX?LmP*(MYv=b;6Cw4tUc(&xX62e! z;{tKo)E5s-kxjkS`h7U{VC}d7TK_pi2u3mMgG03jkVGnp-~~i_MDKw+K3gP*a6h6Tk-dT))r{ZeZ4krkBmLj zP;2FQ;)LFJW`G$1mA9WV?;lo%zlUXn%`9%L3U+I$GS?3?Q=egBe{aHCH_dfHwLXX` z_xI2@D&dOB0a4#UBf@$Y_xd8ohmM=J@nBx){CA6)-`fes?Y&Wt);u_TZkBbvMr@hJ zTPwLWYSzZ}q}zDZc&bZ{Rn6Kg%{9-A&L=J!BU~WNn%Ymrvf-!Njr&^mjmfIfVT`ot zySW*Qf@=0*42$*R@M`x*&1hM$dqH!4Vezc4a-d*M3$rvF^5#}<*7A?V^^kaWxu=aW zLO_)~iV-vCSYAP#d+_UD{fOdcz0uvjS=N}#N9`3&bMY-NTCF<@bDt_^?6dh++lFqc$onEb5wwhw)4TjhBPpYMdZ{Bncs z&}`8>fITxF%u4G&bDb`yww%y+6n*$tX)dFpuR3@Zw-lbyD^F&d*?mtfwuZlXz5A>x zd&kI=N|Ld1n%tQTds`cLmyjuH*@+%|Sg_`BDLmFRi{ht3NRzDMzE~Jmx zl~ncM0=}Nw)A(y%M*n|_Az%BqX=)&{~b`c zVNBLK@!D!#L%*5zoZ!bn$LJtc_L2y<S$Kp2;aBcTkwfGm&+J0cHx=yWUxay+@T^8-pES8jKM$U7G zT@+HUUO}0PYR45G%%A&|)cRi&$`ot)QorOQ4bVg3!Mp*0jlkZq#3?)rk7cy^lZ`W=QOvwmWmbak(ohYS{u>hyIy_b`j=1$_OUeG`-?OT);BRhh=k|9P8s?Mev@nUQDRm&hrH z!79{t!q^ctZ#K@$G3vIT%2XR~U>=#b6N9b)G~&B5E#g+*9mGQ{576is>;Idu?hJd2 zOPQ+PP4ubZdtu9W+`An@@!xt-#H#F@qPD49)zW=_zkZpi0&l@EbWPV=qLx{(idFEx zMg%7^jw`n3JRp1FwrEpz>r`VO(}p+v>S~9#w%WyH+?kHT_k(e_5MsC@Z>u+Mi$*2V z5>keY#s7cQyvL8#Zr0vVy@a}QTU5l&W9^QpSh=L#xL0|i%Y>EjYbyEj9a6j*oaNJ{ z*yGaSr)#Q~cZ93_XoMlfFGogvE5;RjlziK0BrQ!Xzav&{>hh~78n|g+X?xkk{}0qu B)R+JO diff --git a/package.json b/package.json index 06124fe..232461f 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "clsx": "^2.1.1", "lucide-react": "^0.474.0", "next": "15.1.6", + "next-themes": "^0.4.4", "react": "^19.0.0", "react-dom": "^19.0.0", "tailwind-merge": "^2.6.0", diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f7fa87e..735557d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ +import "@/app/globals.css"; import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import { ThemeProvider } from "@/components/theme-provider"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -17,17 +18,24 @@ export const metadata: Metadata = { description: "Generated by create next app", }; -export default function RootLayout({ - children, -}: Readonly<{ +interface RootLayoutProps { children: React.ReactNode; -}>) { +} + +export default function RootLayout({ children }: RootLayoutProps) { return ( - + - {children} + + {children} + ); diff --git a/src/components/theme-provider.tsx b/src/components/theme-provider.tsx new file mode 100644 index 0000000..189a2b1 --- /dev/null +++ b/src/components/theme-provider.tsx @@ -0,0 +1,11 @@ +"use client"; + +import * as React from "react"; +import { ThemeProvider as NextThemesProvider } from "next-themes"; + +export function ThemeProvider({ + children, + ...props +}: React.ComponentProps) { + return {children}; +} diff --git a/src/components/theme-switcher.tsx b/src/components/theme-switcher.tsx new file mode 100644 index 0000000..1c4cf63 --- /dev/null +++ b/src/components/theme-switcher.tsx @@ -0,0 +1,74 @@ +"use client"; + +import Image from "next/image"; +import { useTheme } from "next-themes"; +import { Check, Minus } from "lucide-react"; +import { useEffect, useState } from "react"; +import { Skeleton } from "@/components/ui/skeleton"; +import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; + +const items = [ + { value: "light", label: "Light", image: "/ui-light.png" }, + { value: "dark", label: "Dark", image: "/ui-dark.png" }, + { value: "system", label: "System", image: "/ui-system.png" }, +]; + +export default function ThemeSwitcher() { + const { theme, setTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + }, []); + + if (!mounted) { + return ( +
+ {items.map((item) => ( +
+ + +
+ ))} +
+ ); + } + + return ( + + {items.map((item) => ( + + ))} + + ); +}