From bc6eca1e9b5f7e10f9e7c2eb4c1782fe59a871fe Mon Sep 17 00:00:00 2001 From: wangxiaogang Date: Sat, 6 Jun 2026 15:25:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=85=A8=E9=83=A8=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E4=B8=BA=20Lucide=20=E9=AB=98=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=20PNG=20(29=E4=B8=AA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/static/icons/alert-circle-light.png | Bin 836 -> 2296 bytes client/src/static/icons/arrow-left-dark.png | Bin 367 -> 455 bytes client/src/static/icons/arrow-left-gray.png | Bin 380 -> 459 bytes client/src/static/icons/arrow-right-gray.png | Bin 375 -> 450 bytes client/src/static/icons/arrow-right-pale.png | Bin 377 -> 449 bytes client/src/static/icons/bell-gray.png | Bin 713 -> 1809 bytes client/src/static/icons/bill-active.png | Bin 286 -> 1614 bytes client/src/static/icons/bill.png | Bin 288 -> 1662 bytes client/src/static/icons/calendar-gray.png | Bin 378 -> 878 bytes client/src/static/icons/chart-active.png | Bin 240 -> 459 bytes client/src/static/icons/chart.png | Bin 241 -> 465 bytes client/src/static/icons/check-white.png | Bin 372 -> 433 bytes .../src/static/icons/chevron-right-light.png | Bin 345 -> 410 bytes client/src/static/icons/edit-gray.png | Bin 719 -> 1498 bytes client/src/static/icons/edit-light.png | Bin 705 -> 1496 bytes client/src/static/icons/home-active.png | Bin 288 -> 1285 bytes client/src/static/icons/home.png | Bin 290 -> 1299 bytes client/src/static/icons/plus-white.png | Bin 223 -> 350 bytes client/src/static/icons/refresh-gray.png | Bin 231 -> 1940 bytes client/src/static/icons/refresh-orange.png | Bin 231 -> 1922 bytes client/src/static/icons/trash-orange.png | Bin 369 -> 982 bytes client/src/static/icons/trash-red.png | Bin 354 -> 961 bytes client/src/static/icons/trash-white.png | Bin 322 -> 864 bytes client/src/static/icons/trend-down-red.png | Bin 504 -> 640 bytes client/src/static/icons/trend-up-green.png | Bin 506 -> 644 bytes client/src/static/icons/user-active.png | Bin 293 -> 1341 bytes client/src/static/icons/user-gray.png | Bin 557 -> 1349 bytes client/src/static/icons/user-white.png | Bin 480 -> 1105 bytes client/src/static/icons/user.png | Bin 294 -> 1369 bytes scripts/generate-icons.js | 119 ++++++++++++++++++ 30 files changed, 119 insertions(+) create mode 100644 scripts/generate-icons.js diff --git a/client/src/static/icons/alert-circle-light.png b/client/src/static/icons/alert-circle-light.png index bced4e932f61abfa38a9ad8601438cb9dbb5723f..a7757afb035a43afcf87296cb482e696714d7bd9 100644 GIT binary patch literal 2296 zcmV;o8sLD*)%gQB_s zW0=aUt|PO$`;$s4_1IaF5t)&Z5s{Hf4Kc(JLkuxQU}!WN+f9s(9oE+R?+h$7ME_>s z1p~arz$ycL!9<(niQl`wy~RY&8=^<$|8$7X>S#Sz+Vb6>TA-!%pN!TE4A5X;EfdWY z@ff174bU=LUt_eMH!?D^t?#}DgBEarFouEmiek8fKt5t%QEPns5H*Nk=It4nFDj)f zrqB8a4MGd^_Nw2}Xf)=uiT-7PmEIXoznK;98=}jZc_-Cxn3$~Yr{sm}QLk*cm}Hk&&dqT38G?VFk0yAZyU#adLSs+~Cr zyjlPgzBfd#7@~(6xT;Nbx{OL`f4SDX31j4uclk~JW}@f}Lv%G0Elz0oz5uoKGLMe_ zQPlwkIGcelb98nM1NU@*zcri9o%7PuYPEI|!7)xZ0uCXFu;vHcJ5n4 z^cZV>LYbQ+*%7yalML{<0XFoYk~TANy$TItF&Lt|dSLw5GBTeV8{4;Pnx~r0J(=jH z9%t(V!R)3*2gk01jEkEgx_#NQWqZ>=v(mFf08jZ#rS!^9= z`MSv{I;ed2g5wU?01pLYs^x(6LHgpTie4_&G7{g8qw0COADF+D5Zp{{V38^VVmdn7 z%59k`s?X5qs-tHeX8yEzfXmqFE_e9&$~rE%S^P>)p;KV8P;*;?DGndqDCV2$bF_($ zcJd3U~2m?zD(Rz90y~+%S zWXH@7v*3bU9}+)@ZAVzjqLTt)bdr>{H6346DTH9H; zrq6(@tc@`6A4?-wR??d~3P8@frPH_A-iRggC7H&`BRF6INNS3OzK*pK1H7HqNR_VV zx(Ps{WfuD0v^K)P2dOha>jNw4O$`Mgc|n%-bG5Y*Thf*9jAjm401WJ55x{5mM!LuU zXKloHN;U^9fFypNX25K$zW@+UK&Bi4gsy@RPDrvG6%_a)+zKQpU)mxZx)~ZmTFPu- zt&hoVhT1k_PX3GmMaS+DowPO*7e>nK&lpfJu+YN0NAfq~;?EdR7|Y<56a2MzM~4h1 zdM&s5wgqG)=-@LT6Dq_!H$*?=4#>EKBz=2CLquF$u!xYPKn@^VX2HFs_o!yDo|(?F zNwlV=5PdQ%1^Ejk1KI%pFYNq;OJY_hicVAkY{VG&hJi@Z#eLD!0Zz5@OY6DL4N4ka zoZFr*(Z^Llt_bcr>5d38H4#|ZOQSbi8r|Td%nYYE;|x(V#N=Eix}lWx^r{bMSl!V? zo2ova%tUuu2I^)hr`B8Jw!*4i{kuouy{d@-Tn=c+`MI7yAjfNLi;IkaLVHys6_nJW zOXW`+_($o7^duWV4cH>wkqV8rlALm=J8wy316*j6vbeB)9aCiwW@ut1PFndAMdue2 z=af>CwvPdqsR02KT~XOV?f8RHbgqK{zT+r5UiCRTz_GT(g+u`76n!#$%DNx}@Ab2% zbh*~M+0M=-gOLkY$xbK3laJTAN|vQOXUn1g)1?*tmUF=lW~mU-=%<2BjYea;)O46% z_x;u~37HcYvL2w4Wes6I(PF1Q6TP%z#flwDzw?EOK6fN&w9e|N+0ArwDoiVTlhTX! zZJ7seEo1P@)2`#f%-yn;_L4M-zo+ta9RpnFC;+jJKB$w4YP6o0@m8m6{SXS=mq7>{ zrP5UBrHi?{$+Ft{L4;?ME%|>l5F5KKLP&2c;;tJ5{Lj0gk)^uq7KBg7#g0&|D|^-sLw549UMqE(d)i z$<@q#jg{?3!$}OrN zduJ?JpARLN67q&I_jR@myc3+dAzIzH*V+DVGAq$JvMcVzY%PrG;zT1_E~z5}n`}He zI=X*+*L$^>JbxGmm!jxk-~A8o7FMknB-e#}UZ8qeFNQ!YXszeqc literal 836 zcmV-K1H1f*P)|a5ZaAYFHMtz(u+U-1bgsM&`T}~J@jDz1b)V zxzvD|ay1ZI>osuqQC1$bTDQ1TOZoeiTx!6q18G+ap;FR-CjnbsWd{Bs1&jxQ`&=ak z^Bhw{Eo1mq)?_RV+O5_d4CH}w%ZTGFzytv|Y@+3%P|E*lYuX(c&$}t~Fnle3oQtcW zwU(N)1DxqAtm$d}o_-wsQNz}B#m>>s9vyw59|zIF!B?l3nsx^+Q)@J|3*#J*Z6$7! z`Cw|w(09>o@Qn#?dinx=95RcG0dOO3p837W$&2)Wt%-p4k(bDrYxLuwS3_&5DLcTq z<>x^u-@iSoINt$aZxp9nLr0O+lm@4h$yX4CI8Awcp63w%mx4Wh zoZB@_;FF@)&E}@hco4Y%8DMrW&oMQqvCbHNjWrp|4j2U4>|=QQElDQdP=N728M!rR zK(^m9TMI*FcOVfiVHn%TBP> z8vYu$s>R~n-BRfiS6VF;CKxlvIdY(tl~c)1^@v6|F)x#5C8xG21!IgR09By>SsXvO(cZ? O0000FXm8Rs#sJ`I&f@&QvB@cGi?rHj+UAj#9hyK)0nr%{e zZ}XnjCq9`l0*wR%ktu2EiDvD;ALh(O)O6?*2OI l^zN^dUcZI~*?|(PI7XfZZbd80EqT{{Dc}28&x%%jNQQ+nz(?RM${}2v9ARiiTxPajpqvA#tPvcyrVDCvYr7 z+rabsSjCYDpgC?ngPQ}yIF5}?DJw}=JkGLHr5G>-!q8Os{t2YZf1Ie3Eu zMl+D8VcR1f3hSvwSEbJ3f_L&jDL+~t1q90T1}NG>3{FmA;kt%UJst`x3Q!zF%z7I| zgs??3z6zEM2$7y;Nd=)G%82`+yq&00960_;~i900006Nkll5MOq%(^0GHD`8k}g{q*Km9iREbh$#zHWkn<+8{67+nLaoD_unM4 zv?y)P-O!}UNT8Vzz?5YfAF`R<|E0mP3fp_Z=d-!;%HC?Oofq`qY@Vj0c%6K5jc{Ex z-{nv8hyLq4aJ4<3dAOYGLfiY8rY#Sx%^zOQN()!M())1z;x)qliE+IjIP1N7r~3a0 z&RSD*Xns)gQ{jJ8B7Qox=)3&DL2NPKy*e#l`oDwy_d<@X;$Q8aNBh6Dbujqb@7}X_ zMd|ix9s#%T9)aq>*K=0yZ@<~?#h4V+bYur7dq98x!u7ARH=X|>@oVXmn#i;B%<4Ky z=YQ_4I`^MXmBoRRF~EsoiU0#vro%&ao4rn)Rjoo_xKv+=dR@?-vLIZ;aeYA3yyBFZ z^NKU(&nwPZIbP0l+XkK D*7xYOh6B%Yw`Xg9cHq&Cc3S_g?>HyY}VhFLQtG4C2`Ay#DLz>sIHkt(^X8LEXN) z+1F3bZ};cq7AyF-n4ykSTO%RG`ckf=vg(VtL&~Z;N6x;B(wx72+J~%fJFaYA`f$pE z=OiL`PHhKH?F~PL($Y12%Vb*f?+loR8rmwzQ z75LnrF)PP0X-`YI!sGiF!d`E-`hK?~=$&PuuG0^v7JZi=E%Spv98&!=rRk(PK|=fV z7OCmqPI6n^FUV_;E@@?*v*XYYdDC@z*SPfFU*lf4o*foehs*vj&3GA8J~wq<0!Yl$ L)z4*}Q$iB}>?6*r literal 375 zcmV--0f_#IP)sJbQ4mSmjYbbK`b*P$QGRN`PVWwLb?w~XH%%Y0 zjt(^-5eXIVKXH>ORG$IqYi^H62)I3*lg7`$I;TPUfbMslZ%UOb=JarT2?PY`WT?(^b-LB|r|enn zBa{J)%?;5D8J_y6-8h<9RV?72SiooI^7h1!;0j@536#O!WqsouPR=sJSu;Y20!tO160t=ZByIWYVt~{x4`0v*o@2VMX)@qv; zZjG=yH|^aqOO34uw@&$Db1d-S+I5rqU;Pwz=nbDBA^(t%<*)gdINR@MGyMCn&)FfC z_```OzT=_spBYl}F>Ufe$<;KsFbsoKQ z&wp@U6%)DaY0RzVd=qwV+w_{DRlDcErNg6FNlQ;Xy<0W)^=n3GP#rMo%a^VBpSSJ( Qk^qp9r>mdKI;Vst0KHkkCIA2c literal 377 zcmV-<0fzpGP)D102u*tX+ES8J7Gl44( zZplj~$?p5es`!Ri(|B;m#6`VV>+9Cb)7%$A%v-O?PCsN0z?L^5Hr9E83nLF27sns z+(xlR&bOb4|3ZLrjrZ4moty@MPpYDvA8XBpt_H~DG1`8>4*&oF|NojAu5thX00v1!K~w_( Xr{uUXwf7bz00000NkvXXu0mjfGlrnz diff --git a/client/src/static/icons/bell-gray.png b/client/src/static/icons/bell-gray.png index 1eaaf85a6e0e8a3d030b8100baabda64ae0501f1..0c2c4dc8f46769a45740e6df11e15645593f36c3 100644 GIT binary patch literal 1809 zcmV+s2k!WZP)JnywMAmV5Kgzn3uc5ejjVLVQOP{i%rt>PZUm4^8xT%sf$^nRmII zCuTlb5zW#>ef0`GCH2X(e6?>BlIV8gaImr<(bqd0ky6EbizSAxVDA-!$`G za*ZZhA@|gwj(%&|N=Vesh8hLGQ6bK(M?I8#dPZxaPL23etvx~Rg%%uezpFtIn`6X| zMogY6lRBb@72=j!#stYTvt*H>8=Z%_U0o+BqBpG@0pcQP6+7Ru)%C|w z^ibyck={`CAK6sG9pE!E+qBaAh<|Iu+nSZH67%hqcUp`GUe6IU(L9@$ubU|ReJjDL zCm_xSADPqLeTt25CvJk;IT#x85sNYDFBw0;Hxhf?IN(CgSPjgG&w@{g>1W|m-kgQC zQ!C=0Hsw`JSg+O-DzjCS>Ot%PN6?6mS@hNk;0v1QUBke;(WMr(aN4vZEoRJ1zz1X< zHdzWxYfUr3F%)8#A zQHU!Id4CFAN4AdmIdce=%IEv_(v@*=^={X%-r4&Wy8G68v z;5Z7gH?<6f!Z>gh#eBJ85L*R~qY+o9Rsi#*;3_fmwFWcpOK==bw8CIUj|W%L%u@_K z;6rd6jrfs4jZOwvF}ie#UI52Y)gw-6y?6%rnt3_r1&*T(jYu|`fvaeu&kPkX2^>ce zO*K@&C*UfklP={bx(pmAj-o3JYIHrgNL(nKVbGler5Q7h1;<&)e4MEqF0SZ_`gzdM za@K+;D1%E~MbQJ`8Vd1MgZ_U7JVE(Z7G^%ww5`L*R#Sg(UOxbE2)Ke`zSX2ReL8g# z+l*(3H-RfCqPKi^!VSiBkWluNf(ty?-F=!O+G)t_9PkWeacLq_+O zna>5!P=&%c$$P3QLVP~gOv;f?;~@u^XO0FG;^&64?apnNhgd#}=u^{RrK9Lx@DvqA z_nXS6h(6B6A`-`%F>{E$F7JY{Jm+9M)!+0ji}gtyXaWlH8q3%d-)DB9Pxiwo zqHioRAr4jr&|zX3eckZAL&=uCrB=d6T;7V&3Kw^Dj8H^hS;}BpLyZsH+7~@I zkNGTUQRXwBV;xYiQAb;gQFO6PI4oZHk3zf-TAUK%^(NO#B9Gk?!)Vwq6hDrI&fi-i zx(C{XnCL#Eo1!Y0S()z?OKSTGXfrh8lNNGWJ?s}**!gWk#|#xVMxwFDh*uu$ zKKb8J5!>ZiPM&P^@x;AC?3J%34ZcTW(WQl&k!R*p8V}Lc&($8>>4n%UC)%YVDuS<` zZeQbl#6w>yK-ZH(1vE5b$v~|ssGu4sF^{s@0$)Sx|Fvzt71<~>^No#I{Hc5fk@@Dl z%i|@A=<#~K3Avx}i5|_n99~mGyulPoGUaoKx8$AwRvHr)+k6&FK077X2A!V)#m>%= zvME+VBP2Wawn<8UFOf~cPDi#41OkCT0RHDcKuwJw89b0-00000NkvXXu0mjfhQ?A3 literal 713 zcmV;)0yh1LP)J%?P5GXphz!jVrLB5-A|1JkCrA z++^Di7$-_3>{|$>PDJq{1@P)8nOv{e-?NRu2Rlw=7iIm9DkPw_-h%N_VCBZ#+%MRH zC8PB>5dHzX?@vr5VY^C5V5<@p#XYk;8lxAcC;QKu)X!T-3M#NEN~n~AfSk9+_4cr zCJ15$0?3dTki6tZAmjV|@33nP1Z-;)DklM)jBD7BFJ-OAi@DqZ_)F-UbXkv+05*Q5T`*42=2$M&5#v zJpnzoF%482JQ7y?}0O`@nTY)3-s(k^Zs2xVqvx--DK?Y^;In zGO`C+9fOuH``RwXT4f$lYgdB>bUK@0iG*sy^dac z+lF=Z+S}Z3+;0==vaxK;PG?hM!^hkcIH^l8>Sc5$Ha7^3znIcs>xjxr=uU1~Q;$~n zL(7T5>v4_u8zR|%1*b^%yYI5qb;5F3Q%`qti{lz|9#r3lNoIP7JM*&$yFQ_s}I##8TOPVREWejc`-_{uu$I9YC%<4}B>hl=d;)4HAUE84b6YiD=^?10M_ zYf4+@!y91a+Y$&xNz2Lb255Dm1VT~DqSg8E2BeXgox0o0pcoyxF4v$Km(wun5m%Rw zLEmai`5oPW)!#)j0j++`CQ`mexAnl9cy7idGtlx+hI;;mk)vLwy++Q$$Q01HCX0T$ z0h}8n34Y@@QUKbrtt zWuP&nat6T2zViIdnLdV8$^aNSnC$_mz-53jq%sD$GvAb`@yE#k*XNg}+mZ3>f}rIM zeq+mc4#M$NlRDeMSWiRUJU^{bw48Ed#Ja~ye8kU-DqI1Jsf|B>@WxQ_^P&P*fPEY# zv5tKq6F`pmZh0g53OE%qz88$N0loIt zl;f8}#`l7eHehDzhS~t80g-wl<@lwL@x6de0K*Q#(bG4(ofGRpxL5;V`~CRLPicHN z3zASLfH(LcuDFf;hCPV}3Bt9eq5H;^9RT?YpF?XfaM(=`3xz(7Ir7VXxpiX57b}GXUS9R8H{=pk=mW< zs?ynWJ0|9?w8!SnT^Xs}PK%b$q2)|}8h+AgE~?M3QKLqU8jULAKY~)m615(@{Qv*} M07*qoM6N<$f`=dvGXMYp literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzk^Lr=Bj3Ar*7pUUTF+WFXLXG4A^A ziiqj&w1i?hZ%n-Jqw(Hx+tQy2Cvv2LY8gy_f8A96-}%gEBkg(b^i=O|bP*|h(Wkno z!?|2X&{bwv@?51S$Gz|57oU@KS|_t{_u0hNZg1WNDJ3;@FeHOfWs zzQl6|L1q^o0Yir)K*q8)7D`<|rWW!+`5=jeQ(d1AZ{NLpN{2+k9E4IAo*$>XloxfR z9Y#lmzwNXK7G==2&FEIlH)>wM;2O7>rmpmyU|Zj5a{X$PZ@V^y>sqH`h~Y3 OPk6fexvXP!x<05PTxO;wElfN%S9RBr5J)s0$%4 zjsAfq3m*%KiU`IRMt2RvbbaS`&1k3Z>4_n}(2dbdvI}SgHIkWVKusJu)iux=r@N}U zZq=!-t`9CWGu`)m-~FoYy>+YV9?z>$qehJyHO54@)w-L3*O}-j1Aj1Z+7f-mz=vI9 zwj`}52!hMHL{D3yzyc>M@V5m{S>TWbUi!4vx-n^82Z?U7L@!6b{W+@Z1Osgbo|0IJ z^%=8;fddx!TC{~4iH=&}wO+e@kEex3qp`sPFIb{;OtdnrSfV4NjA%3(8<=R9H1?=^ znCLGidhbvWTsN#P`Ja3z`tEQ}{aCvs_OQByvv7~mc7ciBYBrmfdWAPWQ4rH$7ZJ6< zn}=JiD+lXgqRp1*^Q84eb^Xf5Jh7IO{4M-ny1FFx=D~V|qi~HHH)&m;j55myW9=1L}#^ya#;(ol)C|OB)UOxhl@e+NV9o) zra`e^PO|SmBz3tM^hI0T_tXto{a(+Q$1U(nDv?Cr9t7?kj2F(BfLEC4e2T{Umx29G zroF)L)|h8jR#q-aqhH+sjSC|#;KFaB3|NIMBQWqH0}D*_Qz#BN&VXUxe=^OLiX3QC_`PpIss*<>sKeB40ZkL1eBq!U!8#Gd9v=#z>FnYmLi`ES&J`&er*Ds zc6*bo&#a9re=EWSZT;#57?>FvADGEKer*7jG}q%RZNS3p>@BiV$-q1lEk@7atmIkJ zjv)XXxTdPn!j@+5{@C2Gk}3@rMbzck$rO<@-#N4i@R;#s zc_YD6xXCNNGiVdw4Dn@oW8@h?bS%&KPM}SIGsKtfD8_*0JmWioHUZ8MztiblRU4pa zfCV0l`Tb&^@tr`M0FN1eet!PiaOcE&5H8k$AP6?fkssUm{jxo;1Hc(v5Ey*Ni{l%m zkTNwFV#D6?V(kL#FG7E2WF;{29WPRA{4>M0r*W;n3Mw%<<>-QdGii=|SNbz!(g$JNzvu8a8*{ye{>+%PX{aSSEB6+{z2S(qCz)#I zt>2qu0$jhSt!}`~h<{ptjip{`$@fHKtek3(QhZpTwuayv5cfCWC5bSJC(hDM)1vc7+R z-nlC$%78kBiJ}2@5+5Z4*!S-&QyQzD!`zjkO}z^$M6|uQ)o)_ft-wc;<9V!o!e3K!Y|Ukr|`!A-%WC&eKG@xrl`L$@P#G%fPMeIRA&{^ z=XM;KyHb9eF?XeC2(m+O=cPVJccX}0E5+Y{SN<8G{%3y*-I!x08SW*43t!iIZY zx-}lDKbBEQYUp58V(XAlNIK9X>h2;~Z+s5Q2TPoZDD11*z1zF9gYlRpR6EF=hWa%Y zN?j4@bAZNy`L7lmzAh=(dy zr;B4q#hkZuPv;36inRS@n$mrwY4(kedK`^am0VE*t5@YND&FI?#ZFVhS}*Ca&`N8) ze5S_s6}Jwob8*bucRloOu2B?Kx#7?ou8_p8d^QRlIAF zkNxervsL&`ZsU4Uy?@G%dmDnxV_Nx@6pQ~|vJT;7lKSd->6IG8-@rZ7E$iR1ggi`F z+}rarTXTV@1Z%=V1_Kd>Hl_ms3=&)n&WyR@2LiY@aFw(4F)U@M&^PI0s8Q?*7T71j z#$m@ih3UcG3$tvPVon=!9dKey&|u(UZ9p@CV!;KhOq=rV+)^pqzD;lXzQXLH`jm;H z*Mpi)L^&N;P$6_xf2B&Ha`ttjZ+rKrt+GFTe@}F&vg!G`eM0ZUZyU&dRlj|G{n9Rb z(GM2qKdRasNaV3TpePh_KlTUPEjgw2v3iS6UdifM`2X627pcpO4?jKP@~&9xQf1Y@ z6E1SQj5^wM1quX+i3bdmc6WAXHkFi# z`0=mNAU+&kaTq@9W@zKt*Jyx(rI2!kweD%-MZq9G9BV-POsKtgKNOJ08F+DqG(-6Izb!H(nbRo3`NDj_qKG&l?SRAlnaK&6$6~BeuMh1 z<$)>&<$|H{XwZ6s;}QMW5v3gG5{7fGec<$JEo$U{vXplwl$7r-caK}kUTWYotF^ed z2EpmH193yrx?|t1^@s6 diff --git a/client/src/static/icons/chart-active.png b/client/src/static/icons/chart-active.png index 99f8de7e77bf14496e1507d72f71f74372c786e4..6035d96e03dd9fef4dae961b22b8c5664c3d46d8 100644 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|R5N zr;B4q#hkZy0<#Vq2)G8WSIge~A?VH8lz(D!y)^4{ke@$0{SuHM~i7ryY(cK5z%_OBfeX);~=ZGZHC?CZZh##7XO|EkeW zh@Zdsyt!@V?=SnWz4+|w&!MouWFiBTmoO&*Mne@-5?|&VhGLJytTUXYv=7K!dciWo z`ISO~0Z@NXrHGM`gM-R~mrZ+`W?3uzW8cv-J1hM(??E=YJ=?g)%&@7)Yb*R uFK>K!C->D~y^oQ{efG%%gRmhrYaipAE!Jucye!{AVe0AX=d#Wzp$P!TKCGDl literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzk^L?Vc`+GLT&Hiugd4xfb*@Z{I&;iDH@KsQl(M9BAy%Jl8 zghEn72O}n9eg6(2ha(evXH8{L>dU#ZhDD$-WpSEnLx-}osWzjF%*_>%oC=RlxSjQ4 z5Og=o3S;W9*c7-KNz0vQuQvNz3eFc31UjZc`Y(gQIiWIc#)cUn$9cN?xvX;3zl^|tPa zq}SwY^Zs*GoU^v6F?ItHmu|R#P#Z3!w>lfLUF4EV+9y5vX;h92oJc<>MH&O zRmk37yyVFppF51j`|k@gJ*(TV&T?k%Y);0lT$47RXN}#fpqS9oki^=_(jySCMqy%u zAXAs9ijaYm!^S2TCN~a^un8UqI2ey|32{m&E{JecVpL`k(e_ZmqG`GRfs4(NZ*Tpc zTW_*4wtD|%{^xn(_us49z1|U9V-E_*(@TG{B+6KB?EU;g4#f9#^>bP0l+XkKi@LN7 literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzk^L9iA?ZAr*7pUO32km_dNq@%#Ng zZjVe)UbRD$KJwfNm#LNkDguH%_nzDA4`289y^0{S3y*-I!x07;qv5){4~szHk^h|% z3P}wej7n@B7>qr3kGvQJ-OaMXm^v&r1#T8{I5M$!)>H0}tG!lz9Di+>z&4rvv&(*Ki66Q4xcu+6Zd1J;u8-n;2|t)t z3e_J}&G_N8Qsn=!$sazj2J8M4{lHdpXXA(O>N1B5b)^^H5m+H-Z^_a#Uz+LId0xiH z&)XV47CRsKu~RYO&m94Sx;zdEdvlf^`Tu*C1^$)I`{5ID=*K}tlk$HvPG6LH%znP* z*}3y`InVysX}nO<-n=F4kKy#i=V$)-TfXm{JmZb?cV6v~|8!mz7CN9{%KRQ-uVEFo VH*k)!GB6GpJYD@<);T3K0RSiVz;plr literal 372 zcmV-)0gL{LP)tGM&Zd*U;0MZ7eYtRQZU@f-*$(xf;M1?FA@Y_>_tFXMAZ5OUxZCgL4NAYsrBrwfGQl3BmW2RH92?u zH&DQZL_inxfVy(iLH@@Mf^G*Cl>(_lDtttD00030|ALgP_y7O^21!IgR09C0;cPJu S3&er|0000Rts zC#+?Frh!0$^Jf#;=^e$=ZQH*_)UW?9`HSyarq#BN>8TR;_R9#a&z134%E{@psF&Wy z@jFs!ojqHD>K(_1gKt;76Eo=u_%0yla>LinMn~}ccDD$<>C69~TPLjPv{z(dTvvd; z>x$`0SG)yZE#>$c)KZ08*sO2)dGj>$J(1Dz&A)!Ewm9_5@qpO#3wz75TRO78AHLPZ z&^jyn!hMOl&jSCxKD7UJV6}(wAFHz;c=vmsJ!Sq!&s6*Vhuv4!)Es^vwD}XJ;H8|^ zO;O!vtxhq=f$dD!ByPc)x>*);!rM0i@3C0;AoHc zC9jWY_2Z`iI1T=>DA&JQ8mRxUv1CH$ank5hAz(x^SQEW>|OSE%x@(Kq`_hbB$222}~%a=w? z>PtpsjU|r^Wd1*A!x1C0I;%_hwry8A;7Loq>&UM)Czjb^H&{DvfxWrNs>+TFxXzI? zmFypIbV}sPtV(G>3%p{K+yG)y@0)hi>bmVN6`)0{c-dMl>j7rSUMeeh}&jA?T zU2>qn-q6fn)E+5sKKYab=9)IzEf3&Wpyq2T`o2_&sy#ns^IZu5h0F(jv*gpJ)4AGh z-h7UxJqK*JY|cfm{vd zt3>2%&l&J*;hnYQJ3jND7dbzRM6M?DYdZrhu)kMO?fF?Gay6Q-vg9+BUjsD9_6pke zv~x;Y9eJxDV0TtjzMah?P+n|or?~lj#?OH}TL-|^-1Ga5Z^`clx)Y8WfD6R@Qe#1} z0&oGDZ-I{o9u18VKpsfWpKriXeX=(2!Ndl@1=REPclugIuF4*s7hgRyP0ed{V>W-8`-n>B ztkn)62R6o>b{2YmEpyg}0>F}A#Mtxy-hbd&9dp)(0w4!&kG1CytAp0M0SCO)E4IFE zyxg3uP^z710d%wMG+*Uo$sM7Wn$ZHtJDqENv2`kF=yiUy036Wi+53V0pzPa50 z)eEx)p6zFChPus<5`fMW=_74Cx_GQ87rE5}Q8B&f8fc9h`085@6(Db32A1i==m!H6#15T7Qyb<%G1mJ*!6`I}s&)IX> z0oRv4=px6H0Pqxm_w>oyFwKt>0Qq61y&m{dFW8l>N;v8Oa`NHQ#sfcC@@0LVprfi; zgNpS&;DdsO&*{b6lG}6?wQ19%2B6ZJ<9$GwS-4}~pkqf_po$W}sa45cr}NPKH32wi z$sZm0(foaa$l6#|ACDHmsK_M%%_;$CSP4MGN&p&G0?@D$fQFR-v;aWQg_2EI+_|EU#UIc0^fRlAs;WlLH&G5*dK7{2HAiUrPd2wEPeRV_yIAl zX2}<`s-)jU^i@Ntaj^%pR^-yGN;%-Jl#19->X|bl_hfa*l4GHNOUyOd^wBA~DXUWs zxHqLEF3tHmTN1cC8-{jFOkAuVC9C+2wr-T|uNMYh+ci0PS=P`8kDt&R4o7|!!`Jp) z$)?AsceoCCTkHJFO3kFCq@<*zq@<*zq^vFa6C8CBkG|=Q1ONa407*qoM6N<$f};A- A!TfgM74$4b7x(Q9X%KSe*| z^p_VzvS(Re;Xj&0ekYB**IpK46Mp#xQgVu%$d85Ltu%5X@3j*-A=eE0CC?==2zf36 zZ0IsgAI|L!O;Ys0M#JYo(Js+*AueOYHDHtSoHmrmlfy;%-%RcBVK|@-Tp3-5Q7eGE zh3|5JpmJ2hY{O`&l@<~v@m2o%ujw`JII*a6mtT~V9UW5D_#JcjI`gH(Db~ny@ z8qFBICV+DgTkBjF*tA6}fM|bV^tMv!4ZcfUsT;UPF4A(ro~vjDKvn=wRy=QF%5`5( zdfs;ksa(v7lU5+{8K^okfh`IXd0(KqA1pY|gJfLHm3+4@JFM#p8Sol4kdE0en&V{l zA>)>b1LvSs#|_pJkerv$@d~#8KwkwrzX6UVI|xdh1e_WbA=b;YvyYH5XMpS%P4n7S zTz428Pv{CK&J_Cq00960htdeG00006Nkl52z4S6rV)#LGZ_mFT#bI-S3%f6Yu8CjTSZPlY%vhsHL{P7}`{^VAIICCfb_h z&fVWLcjpUBAh|ia`~A#4dvXiI%m!RcQNn=178^6fB}A&pG@?* z{9gVppBo%0D3iv=$4~ER{g45EFht9?jfwWN)=wH^Hf7sW&>E#gmm6Si7~|J$z}$yX zblKXdK|{$z(HH{7vG;Mg2N1QbOpY7*DCF)Acch`K%4&592-8uw> z*Yg1Y-fi4mD*qy!)qMHf3QS>q{R8CtgaA_H7)IoAD|0rcy9y9xW` z8nHKu&Q%_WD==RK;A~60Ke8VzQDQZJV&Z(|iMS&3tNR83^Ol3$t~?P}XnsFF(Tk;D z1Nu33K+v|QomEM7WUYdL*Hl*74pw;}&eFG&r{xbBzZb`MwhjPSopy$e5B!wtPS|Gv z?27qC`ht7~zz&(uM4#sF4fPQKJCgJJ<^zZ1$y)A{@eKew)bjhEi=weYC*%`=6xe2f z-&|<+4`)qEEKq!pVl@trllX#i;r=2uzDdJP~A<~Ii*4dyooAPwd> z2OtgRHwVB((O8vFvQnb!tBmh8fHaOT?$5h*q}s_EUj_!t0AU%#R{ET^ssR{dHW{Lx z&*rapA5qqvwaNjoOltNx?MQ2{YR+0c0D!N2Z27B_X;D?oS*ryA1GoFy^6P4#RReg- zV$QLR=4822?RX1dd3pIXYvlvH+mF~BPZ_;M)ID^5FJ1DMhJHcRV2A)^!w z@PvF5axW56Q;1OUw{0BBeNK*I_E8dd<%umXUF6#$Gn0NcW?Ns^qWTB>fh zyV=r(vRHU0wxx@EME9$fih&0$0QME%iDmI_d3(~wT3?`Arm3l^3mN!spf`Xnydws7 zSbHpi`5CPrXhS;ccDtLUWDV-b6XiO@ZRj6J(sGwC1n-^Ps!S50000fM4i>C8C|qP@#lL!()lW z4hVF^g0>*BK`b&EyXU&&C{0^;+Ek5vV$b#UId`tF$AX>UuNnl`YGF9sO?e^$)upAu zy6@K?%dqZfmW*patS+VWxON6*rYZH;TAoQTQEg_6uFG!_aGWZVC#ue_Y2e0 zzsRl}rw*Spz-#b)F#_jcU=yWMgL)f?#1Y~ha()GVO_9ruPR`D5_S#!<{1o%d2+;UY z5XpcLAK{qSkxTi&MBZzExUjGVzw82roFXUkwv_iwC*KNa)_=cX%&$VL2+I{KL&J~RX{1_rk`^-6q zP9|>cWEIdJeg2)Az#j^<76epgG(0kJVNIlqG*>$AeC%pu5K_`XvE66~&Y`-h!~vKd zLzW5%QRa-jfaN!E+_njhMI63zH-VssVyUz-=6R1$DHj0Sjb@u00>=~jgcGO1HUIzs n|Nl;T=9T~e00v1!K~w_(wON5ctLG?V00000NkvXXu0mjf%soRb diff --git a/client/src/static/icons/home-active.png b/client/src/static/icons/home-active.png index 8e39b2cada0678340cfd3a96f6c9869b04c3708e..2ceeb231467ea27ecfd72a97b9c5e93026815a98 100644 GIT binary patch literal 1285 zcmbu9{Xf$Q0LQg`9J02PWoh^|L6ZZIr2v2h;tL?4g1Z3#*0quR4@9PO-<=3zMjy1iKxaR9Qk7p zyT_{M(%y(BZ1D{KGkrp)#|9b*(;Y_^Izpp1)r7g&z;XaeeVUm)(L&}RUbIR! z=#!5kyw^gv>Z=vcUuZ(foRotZr-bT+Q?=bRqy# zu%q;9hSr#P_-225#gr4QjMbR+w#}3&dNp&xIiM-AqSTy1cmn2-a}mbLU$e-1Wyt#k zFZNgSj9-$n3o$FuD(Ua)0)qBHJFU5w&ADsaJS`Lv(LlzJ}S}c^|qh z$bihqv#E}4Y$$;ZDWTVh7V52Zx()#D3`Uv zlD;vpDGp&glhK{zITk}(o~Q$5pxdvfiujK7 z3&0VSNTQhecuK$S{O`erROio~CGfzIX2T7btk=>_)&#aDdTrJ$36$A8T#nqhnE9ys!{oP5q(M3u7-sZ*zdfVY`SLx+<*D~CEqUMI^lpPlzzMEw z#@0It-VTc4S6D;}9djKN)4#Eae0qGnVLHF0=!Z>;i<#r}o&+-L3x9giaJSt?J7K%x zdA=L5C)PCFbveUx!}Y|QinHx!`mWWScoP9)TnRn#^SA!#yv@;NJDxG~DIGh}r@pAe zwaiA)RcF)VPK~6Avi>fD-K);q$(ITT9y#m6qmaZP$lM{}aD+jLO~A0BgApdg0dlv) Z3UQ{^W0N^1cuxdzJzf1=);T3K0RWshasU7T diff --git a/client/src/static/icons/home.png b/client/src/static/icons/home.png index 1f9038e80b2a29d4ba5d076a79ad9e6b4e815569..bae5b6a5c4d6b3572235ca9e172129b459661359 100644 GIT binary patch literal 1299 zcmbu9|3A|S0LDKXMutn1QNoHa4As@l_uCTDm>U+hre&i>tTCsOZ##r&Qey5(?i@mO zMWwVU-L=?WOIa!3)xwkkb{c0>@`8b2;jrB=d(&vY$5Rb zEV;O1Lvd+V^q{@JaV;u_awhwTw%>)jdMy~6uZx_iG`iv)hO<>#K|OU2g(KfJ##$nu z9C;8{ZhjuUQ{9-!Z&|*QwsW}QGrw`FbtNLzapU@Lu?8HHOF z9p?&%oT`=#2UJwo*ZpmlgaF=zKg63|rdoKDJYQ}~&opNH9Ee+EG}}QQhyEp9CP2ix`9$HQ z*$CXS#1a{;C{IycK`gtY>vrIEm%6;w#EoC1@oYQT=?LpjaS#gebaqhvkETPIIt(9w zFkN0Ym4=BM1wrFQ=G33T@f}NtGQ?Te8U6^O5Req)&q<7qrMQ5VsajfV?c&g^i_#8ou>UnL1B+WmTfdSSPY0EoWLGECRaw)ki@yW8LTa^F zUSh%Ob^d(sX{BfY+qF4np#!dC_Id(ln`)bx+xBs4-vY%%u>Ro?bxu}YZr3&jbu}+p ze0fj7>}U3{Jv&>cl?`41the2DSynU~A^WEf2kJ~}1_YPLl8_mYfwbF{A>g*i>kG|Y zp(=#mZ^m?A38OL{+>6Jx{6Nk57l55&ssI20 literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzk^Lm!2+;Ar*7pUU1}UHV|kFd|xli ze?hzS=G>)AoCGzG_4x_kZ=Ro{e%}D7mVx2G8?(OPZ@j+MtaGN9gAj2cJHD=%cO>fM0r?zL?Jy1yMc~ha( z6_IjWIPi#)^}G%xv6~-VL^iJY`Qpota9}Y diff --git a/client/src/static/icons/plus-white.png b/client/src/static/icons/plus-white.png index 0cfa4d4bd33e0bf1d426fcb62ae46bebafed0188..7de0257cafbe05f9d6322b1b774ae18f0263a95b 100644 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|TRg zr;B4q#hkZy9J3A^Ft`NHKeqk)Ri<;S%UE`4_lEa|oUIPfh~%tSd+YQAWCjq3O?l#D zG|6Uvecb-}o6leU@w)Mse**iu9ELYj`>yjg>}A|=o&NyerZpyu?zgfr++(<5%^KnubBv#1OSD7T zk>na~hp;0>HEu^<|M1}`uHj~o{%ARmwUF0c`OqW5jt@UHI85$vAI^)5ni+7djM01U VvXFHGtAQ?N@O1TaS?83{1ONjZQ`rCj diff --git a/client/src/static/icons/refresh-gray.png b/client/src/static/icons/refresh-gray.png index 7e4dbb2b49e00b4b09fd612946e0eeb6fadcee14..5ed6e65f6e02d0f09a58725cc3062d8cbba12536 100644 GIT binary patch literal 1940 zcmV;F2W$9=P)V>It|&n7M^q5%zp1cDos{Lm==(TGGb9s$9a#3M#La_r`ZNt9%zX5Yq5 zbYIWB>6zEF+aEMM-dnc2>+7kmuCA(4Dj*;rARr(hARr(hz#}}<)peX^o~DUrYN8hn z@V+McS_A71(N+WO(nNpBXZf!2+XtHHB}4RBo%x0u^C?A-GiE+p1O0|*yEOSM->IsB znGcVdZ`MS8i7<)w7^0!PEg=VZRY%c13%a{cbU9`bbg~%!+way&kig6b#>`i0qL&*h zXsFNz>^4LzW1>f6=411Yzp?ViBEDbw3T8gc01s=T4TTGRY%+FeU~w&qCbv2d4GcCR zU{Lv}W(?8en&_9d34VV;iK+vZ%afROKDPg@e1ZXPG{E=m7Px8tR4iY>eAc)kU_SF1 zGO@M`mr|3kLlZqMPiy4~5UXYkD`Cj@Ci_#&e0e1a=$kq7Py@W+KnTAYqNSRMO%&Z; zXPzP|Vt!}mQOtaZH2Eyw#Zh!Yo#-|LM26@MCmXz+HGnx{tyPAAXFEHO(ZDA;CcR1n zv-4OdBd9T-CicG}TBeD1<`~n8T1Uqu?+J)|dQLS&-(+6tNX)r<%zRE!V_V34WIc-R z(?p-P^fUr%WPaWfAi~o`KV_WQW>Fa;oHEB+2d*~2J6TWLn&@ZEe4cj%$jZnhd|St1~W|0Rvp(4FMv=jB01C1};-RxkG>lHLxu!32i4pteq?yt|nU2 z$9#nH5cB1{LbNgy3GF5zaTBLhIpP3Qo`abWHo!brp4dVMYnX3MDg0eA(H*Kn&_pxj zMC>gAjmLE$jqnX{y{aH$;M!*1&bAVe#{U<=K5v?~_a>DiK zkd@^Q*Lwow4mXABS)@FM&S}-OjQ}~Wr|_?DZntm8Cj!I@R8GBzwoZXac@ABo3er)u z$=SdS(Q8dR0|v`>DSN&N?^(b+O*srDX=<`*K&y%%F4hc{!{;Vv!XI_9-n8Q)Z?Yyl zBv#X+`&UhPAr%P;lx@2DE8u3Xc8IveH|`>OAz%!|z;%|*_qQRX4hRA)2$CFO*?^Z8 z)ptOOD@Tb~3xX;Tk``pyfGc&?SUE^ESW^Ok3)KWiTx5=z_41{s=X5oJ5f_~!X1fpV zWjVCbTA#FD6nCIm=$xSGJwMdyfBE(xvd9Ej!?;!ZVT(=bbbq`6uSseicWq}qwd z1wyiNEKk4&CmoHORD8!Uz(q|hMBppeeFls|OmvrpfEAyFxR4j`ds%Jkl}(~ z6FoBe?*kk{T=0hI_of6ePj%U6z$o-a(fJnrzuWg1sY*iwPgn@}qTOR0*U*;CN)5#A z9^<%0Es7>LUH!vPz;tIFN|2ER8%fZSwd3q15!x;Di9 zZjGn|UUAl8W91hu{GqBi_cYN{wt3Wnt6X-tr$hnGsVV_mecgm5@1aqxxA`1^S2XHnP$#Xr@E*Cw7RkfdYLa(6^4$YI~%2rZF5~#*dX#+ zHB#_GRS*W4-l)uO-@Ep!Bj%1v_ilL zB!5f;-{vNP%5QRtm)fDK-N-}0-byRLTut<6yM=1fw`GO87s@1HpA8y#-SbtyzA&$5 zy9pS92CmS++hyK08(RZ5%4JF+{(N6^#0>MfNfj;!^_g?Db#jO6b)sR>Ibt<2Tjd=u z!19#t-@I)=RG~yJSE9&BnK@$5b#i@d30wZv+Qe)m$%_?jbDXFe$@ zmjld_S7K?R_ay4L;W*pesLU>}ncC8Lo$Z&B7Nm)uPu^3>JT-)f2LuEJ1Ox;G1Ox;q a&+rdWxsex<^gz%60000Whm2 literal 231 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 diff --git a/client/src/static/icons/trash-orange.png b/client/src/static/icons/trash-orange.png index 7fb75efbb9525cba5376590cdc7244f848923883..b7f2bb0955b68c3de380cbf6f65b90b00d263eaa 100644 GIT binary patch literal 982 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|Rr1 zr;B4q#hkZuz4Js21=?yE4>>0t^nSC0+i3wy9z)QvsfkmPCmfNx@TQ`J*L%s$k2^Sd zWR$#^b~n^LnKzM%Yv#Nq%OCAu{ns2Mbv@2cTdUl1?Dt*RvHxNMtM%TkFRNX1 z_e-C%+B|*D&x7?FD>GmIwVQmJ<6rbyogWX@1k1BTUVR-ccTM$vWcn{A6LpTo2fL!~ zXIjph|A#q!?yk}slJD)UcQQ9j0>U*<A z1Lh?c|K9kr;&7ToO4XG_V;&>hR~sbRX3CY`;A!^hx5{aAT;?uoc39!^V!qjl6J7?k zpEWo^JLTyw+nj$IYUeX0{WLW!X8QH?`JFkO9#igL*0o)-hEO0_avNndul?Hng;hSw zd(xXP*J8X6Ua()~d7vect!9<*Os*F@rZqmCtljZx?!Fi2*SNg7Q@UxE>dFQ`?rF+P ztc)*Dj2Hf+#po0?ZNf%_*(J+ANH^^{DKB7oU+l?JW$hDpmcEjzuGm+1*0Axx`?6%s zPb-za*BN^vt9Py<|zV^Q1WViN7dBB#dx$EPx+&Rol?A5&Avg^PZUD+Kjy)!r$PN;0 zP^?UzXZ$8Fev0AcdPm)^!DI6OcfuN&}MU6#42ZDt2{EC)p-;{K3 z71jy*>B^x~^p<<7EE;J-K9T=^2!ZmU?g2rQ0v~*KY9=|xfG_}pg{jm4oHIXzi&gBB z_jZ6^{TY6wFZh{W*FO*XE#|*s{6BXEHUIzs|NnDO%hmt@00v1!K~w_(+Z?bl=MbS_ P00000NkvXXu0mjf_CS{a diff --git a/client/src/static/icons/trash-red.png b/client/src/static/icons/trash-red.png index 4bc34284aead4347ad4baf48ce2b19aa231dbe98..0f373a3e48b8613e2af3f858f9201db2f1e47028 100644 GIT binary patch literal 961 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|Rrh zr;B4q#hkZuJ@Z5y1zbNf&2UUQs8Y6%+etzC{(5$X(UOjk{LAeO2(Ut4saqCawSdCswj)25~hha4<1V_^jL!67ZMlDs#u5CatQi zH*NWDRcBpx&zxV9kp7&}CC>TDmhuC;g^SoG@(WbP+%jifv5I%aKNJ2xN6VP5KF>Vk zP+D%KwBG(leR^}&TsP}aOA|hvS5J&FW-R@?;lie7OHYfoSAR{!7W`UQap9{|^<=l= zD9pGCe->%~JZb%w`NAKCD_>_t-rxK*<06lR=e?Iv z?UO(M>khVJ=wNYS>I$l2N$N0WSoJ#K?)y6qix>6=3a|be%J$!&Y4vp3gm!IDr`cyE z?p7_8c=O%=z#HF06^Hc#%o87bH1OFnZe&^bMo46~L08_P|0;@o3!@%Ly!v$T*kt>v z#(RG+a({W(AGe^q{tMII-;2dx+?C(!@c!Qm)~fIB`WJSiDiLEU{P*#ri-LI&Uu>U-J-@fb7zaRTI==@;YdqjO7h$nrB$6@~OjV}$`&l;Tg zGUITXL`v0}L}MN!+h-dj*=EWW-{5KX>9@>jb6j>@#_X`d{p_ z%^0Qjt4;GeQ1xd{v;iaU$Ld|neNUnJ79&8yHz_om&hW{*BwiD-Nbhu-lt#eaS0Bm_ zOlUYCt2CR*Dl;J=|2>~e-39T#GpBXDjZj~{d5Pu%iv`nZ>d?@k6Mo z;pHB_<)<$S7S+vaV|evTFC^a2pUckeZ}l$I`j=-d(;Htc&zu^vOzW1_c2lYSX8e(7 lE$2U5A<5z>ppyTG@%~jgKkuX|#=tzu;OXk;vd$@?2>^+H!hQe% literal 354 zcmV-o0iFJdP)3JLYz2d5yyX$VIU>px9r({0(3)QeR1XF6Z|ZzoN+ zLO=d_1t zp$AwKa{UcXUl0t`w*nd{+Li*j6D>znjwp8mxds3E7Tx5z@kwrr{RGtNp%e8cd$J=k zW*-+E(de8H?|jtnfGo9g9g!6vniJ6$T*0U7Ld+pmtJ3TAWCS<}&Nv4~paGn7*yFc& zwVLp9d2x0pq9*_V0RR8Pcs)%3000I_L_t&o0CGF4F+)de5C8xG07*qoM6N<$g1kPL A!2kdN diff --git a/client/src/static/icons/trash-white.png b/client/src/static/icons/trash-white.png index 887f54452416c3742b7ccdcc03f0d016d158002c..2627eee95a57938a1c7ed384f942d876d043e826 100644 GIT binary patch literal 864 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGooCO|{#S9GG!XV7ZFl&wk0|T>= zr;B4q#hkZuz4NX(h`44mxAY%rm_OrdoB)$*il~ahwL?AqGYni_NzR|^a7bxU$qAh; zd|E3UCAPfn`&}BlzbZZNy6x9HPdDAZp&|@_&}t zYWtMo9bz`_o_0KHOA-6H-37G`&mU_64ci7Z{JeRPmL$^7jdI)%VH#FYfx=EhxAD*>I15 zKzGBR|DW>TPLEFR&)>zcrtYupi?8o)JYM^ESwO?j8TJ;(`a^Eb2q{=ga!frbKmRW~7 zXr!3!P9;Sjxe^d7B^XPPdR$g;+jr-riFvumB1F34wZkI)9=>#XK9`~ zq<6h|=UqQ57ND7^UbPm}r+AUY`(nD!yxaTuw(atp|4e^+ zWVD`%JI}E|$V#Ar<+v&bXP^1Qcd8lsySJOJJpP1F#nJxw9oL$Z8pq;|ewS};X>Y%u zx6#h-UhImf>p#kL9j8z3Z{eGyuXWJ=r&P3)yLsBuqnF+uOFU8C^eO$HpVq;^rdO)< z1)O}RCkFj~ld|)UtExusGkM`xQ7hNZI}yzjBzZDlGX7BDxzhzgArt*dR1btUYzB*1~AUnNv4xv01q$kTaIsV@_uGal^t))e`*&ryTX>rGIhd zpRCOBL!*52|NBib`(Hm`pLFMGh6JOw(e9t$4!7R)ebFMr>C7q7_~hvc9>#akFN}p& zv72+RQaM;HlUT;dSfeUZ#=lgkkM~TU-T!=d-*uB)46MDXSy%rOO>@7#zomoW`1Jz8 z4Z)1<2G*Zqn$G-dyE*Z`?~et`m)qZaJik!7Dk9zPBs*&SGB9vl{=m0R!}hAM!@)@) NIZszVmvv4FO#q>!4le)z literal 504 zcmVK&npx{V&8G|B?mA1mQVr#n>#&3p$$Q{QS z4>~scWp`%3oo{D$EbVyg1#%0#`x0@p`NXZ(E4SOnxzG6r!ICitxOYiW^uo2;3HDo^ zmOSr{m_LZ<6#GG*h-8Yan_RCS;ZE+frqlT%-@gWPjBLs(l2I-Rj!cK(b;;VH+PJuB zS~*k^=c<~CF=cY@Ihl#t@PmH_5JcAUC^1w(e5T+3j57)KvhOcns4s=Bexi_OvkTlw z@!(6%rGT7hCZ2bNeF&6LjuAH+=d!9T!EtVSy?2yym6s?hI&%O#t_UCqsfcqG>?c48 zwSLo;XoAvJ^c)UdfAi8^SOx7SB>*RBxtyDSyf~!GV5?v37;3{0a}3P8Fp14>n}5Ilyv8#L{ABhvo!kk2MFCml`;9JH2#vRP`->TYdM> zd=bvA3ywX%k?AD;9B3>8Jm3jA|F*UN;l6jX&hN@L>)gJzzkK~w@9NdIdBzW~$8J6& z@aLb{Y*ST>=XGiS+>&31H_f(|KinS2c=p!Wx#2ns?%%mndDK~e)#9jmB3FPl?^1@$ zhng{ScXb^pPs=;h@wZ$8tM!^<14JUpHj8p3$>-^&N-|BL_6Fjlf@d!6ib zxAp(u-%CXb3JMCXCkP#W|9@Qv6WjFCoUnfj_Zsf5|L-I5nN`Mi$BN)XQ$Cy(H~5vK z^h`G~>&G%~i=QES&omvCYBsa>R5`ys#%uBWAMcy)olHmcl9FakRWSYRE2dD%8mX?~ zXjK!;+7o+i>jg!HtN&zw&r;*ENKN~>ZtoYvJx?PzHPiOZWLm~^E?q-0^~Wn#51w=C zI*O$~RrfV(SF>`&v z4b89jZ>N{u5RB(M+M1v7%s&o97d)H4M~EYSV@t%XGv+lnEK`2ZbgKBjxBhRk*f;&N zx;Acy?yuZc_VGE_mTd8NI{8V)V*mE!JyxkX%ES@>QNZO#SN@@v`Tbv|)e&(FWF3(F Y#%k<#ls}YLIt3)*>FVdQ&MBb@0LhpZHvj+t literal 506 zcmVL?yC;9HDv2k(7(*HXJ@_&{LJ8Ou=^OYkCMHIq4OhJxgsXb;0j#axx3o?9 zsU;8+50IJ8&g^{i&CH_2ihpZ@!Ug~T71jO5L)~viGu3N;t#$$_HkT%7o2`qs=}2m% zf*m}{5Sq%;1W6^UXKl;S@Zs-4Q<6Uk2&#LHE8DZT0Lm5X$=XHn4iZ?rk4a3Nwd4}8 zI6z$?Qv`8GU0f10jFdXYnL90^({z&QyrAM%-FM__kwRdq=zfeqgE9}rUAkrag%&81 z?4e`d>e)xMh;ip=A}}XAzcHQjw%NK&3F2|R7&M52;4A^r(#PEZ3X<@d7CM#(e@Zlg z?tJu6`^e~{*x0y;369S=&Tml4%sgIXRq5iP!M_-HPEd`-vPsFA@eM;&gov(TtMrq* zJgel7afi#o;>girpV}YTtwXB=1s@ej5g_Lk8XtP5lA@0RR8sv+Owl000I_L_t&o0Bp3_F&+9kGynhq07*qoM6N<$f&#PY)c^nh diff --git a/client/src/static/icons/user-active.png b/client/src/static/icons/user-active.png index 1a9fa2cb87f9a64277bc2e069a63cef0000a16b8..4bf0a8b72b4d0fcee7281c4f5401196f62f9767e 100644 GIT binary patch literal 1341 zcmV-D1;YA?P)LZrUn>ZwNU4QP25I@^b(g` zm^94Zu%9XV3W|Q6YE2kq2Stit)ZbBgw__SrWrwRAuI!;r(-CNSvtpjWd{Kp)6;^s6svuq2x}H3f4tXW#nV_{krW0 zMVBg=qO&3eusrv?)3>9H&7a=vILy)Q$$84(l5pT*DBpE2y4m5{^Bv58>dbeT?G>?8 zxRf1R&Ak4Rh&E;;i4NyJWZaWbJ12K2tSytUl#SO>0& z*l`}dmKJt-%X_iE+c5*~h}d!N|MR&m-tr#xw>oCPnus0lfR?d0Q*46Tql{>nuocYq z`OBLZVNr&awBizgYa6QN1ra+?bkgaD$UPjyj0?nd5L0wQ#EuP`a=8RF9jQIvA${V^ zSJB%db_y4<4VuCPQ*hHb&}z$b)PL1F+a`CwY7)*kgS|R*&H{O{js__^{BniS@683$ zIm#31xPmDf&C&_QU4Z=B-S~3N+$)QeD8dB^6-MTzjhG{AcB+j0B7Gy$jQ^CA4`u(E zqubV>pXZya?RK({-RsQy=>HSLW3P!6!BBo!gbP+0rNu&Nt}_Spfi+|K+?LY6v&SB? zihcfS_1}|!L(>6~GEj7SiVmnZDfxv+9YAb?rXQQ{01i!D#{|kk(Qb_H~PvSIf)&arp@Ep8d>xXV#H(y|>uTGYrEp z48t%C!#r`YGB0IH{huOaz0m*h?+GpRg=~bL$(v3lqc1d@{ttOh@|KO(h*4k2KFY37 z{|BB^T>3)(^nb|rjJRv=tVO6aqW_~kr%?5Un%Dm!-?JeceWCXBf5>+ygrP4KyxGwK z>kDm2|3}f8NA-UinV}{xlc&9Hi$q_@h8lX%|M5*U`a-_-e|!_PzED&8KfVc8U#Lm_ zAKwJ0FVu$qk8gs~7ivrY$2Y;~3$>;HK?wRn&i#J_?uDfFg)my&KEHD`gOj5vDdHj1&qCZ zoiAYQ_3L~AW3L~SeDKTyD)~SJ4!T~y$<8>rA_50puOIZnn`N}|;|08Lz7v6i5b9SH z(vB4Kvi)K4cSj0W1F_eSVHk#C7=~dO(J21{e4Vk^{;Y_>00000NkvXXu0mjfG-ifbA41l%Y6x2@ss0`2_sM`!<{34YR>F6k2z<3Yya!LhSz3QBxn7sOWxej$*s6GFI0$KJ@1!h zWzMH<{n|Y}_a*ENN*_zsKknOikJnWs&_!_ax^ibhAnVAI*LMS4fGoq8RpuZGSD#%V gC59?WAlIu`FxuyA^^Ysxxe>(mboFyt=akR{0Gt(Z#Q*>R diff --git a/client/src/static/icons/user-gray.png b/client/src/static/icons/user-gray.png index dcdbb42b83b8e9c3191f8e570d38bb95f6cfbbfe..14789465c7224a443bf04ae0937766b250cf570c 100644 GIT binary patch literal 1349 zcmV-L1-kl)P)VFhU~W)xW@>chM_ofJC^$jl*U` zaEE^Hd0CjQ>M>dMARfJ#EUp0${2!=i0hO2tlE`V-M8~||jv0mB>e-pK z?fTiTs$RYRE`XvailQirq9{s$F!OGM_*RKHFok%Cl^NWV)ibdR*y5S$~hz*PQx!kkw zdPRXLiVqCp?=v_2qv^h7ey{KP1f&UwCNvf0H5l+Ys>>U{~Mu4GL!7Ylv?6 zZ2bRp1me}v!or@u>mAI-EMjBUq54h7ILFr z=Tj?N{iR)8+&At0%k$@-vqaa_6m7A?ZL`TTh-Q|FvUXt*t+eQbhnD#Oe+Kl}1 z9MhmBa{0&%&hFF@)@(3Hz1P!gS- zcfO`5PP_88h_6BF$mo`!DaUf~wm8t{mFEic^WtoCH2$3|oN+>Zbm$t5MAzogAkCS; zx32trx-S`@sIKgOPVUHzR?XUw@ zH8}S%Pl6@7Aa>c?sNW1l9A>lO+6e~nn1l;@Fgf?KpK#k^7Z>+QOcHv6bwmvw%& zOU+rZ%m>6h?eyb3euZ;K+zUR>n6rVIcT3Qe#O;XB-Xh+t5BE1;z}sj(%Xe309x0h$ zRXeXJilQirq9}?ofoziGO_{RM|7k+jYyBVZZsI>B`WzS3hhrD-0TKYmB^?$~m(|tL!hFIxB|Hpbx(dr9zt^Z?vcSKD3LVfA~SpS_6 zhrUqkX2-^?FSH~5AEM<+{U6_DlsqIa$x}|-lF=8cr6xV-|M(^ueIeiaKfZ}tU#Khn zAKyf)FVv;}k8h&W7wSX*$2U>w3-zV{WBNEybUFXUSPci~>hT3^VuQh>;@q1P|?0;XQS;0u^~{emxG>h%l0 zfT`Cn_yVS0zu*g)di{bgVCwZVh<|KVIJpLqV?wXrcFs7t29aYzuV2OdO7q`L|6jld zat$JiP0bb{)a%(G?#%J;MD`?OWiC!as?nv zgXk2P1_nHEepWKgZJdjTC;);*Oz#3Ut@WCY#YS8pcWXqYvT4pE4?RQyt@VyOsr6k`7e z$uB@O%p@C@_0I7-$P@}M-u0tibVIvm1UJx=5%edG6$mQRJxfh*^@9h)o0(T#{od=Py87>&VHk#C z7=~dOMuq?*z+T`SFb%u_z5qYu@Sk7Gcm6lK{eM!IyLfP9bc)( zVkTEIX&VP#M_&6qu-3JPjPql-3#{qk`s;v4Q5ITjie!d6A5k&a`spa;ZMYs`=Nquu zwSt5QVxIiIM=5d>9tW+#q-z0SX+&&irk7?X&>X!B*nHDO01wy`@iZP&uzM=P?k-n5 z5-tu6HAfWeE{hl$opH4TJPcIAgre=M0oxB;?a0DOC-y1YJ{Yk5+|^FR|9KNmOS`PaFX=2hGRkJKQdA z!Wy40C>d-0;wM=*n;mNQ1F%`Lp+j+;|KW$D6Pjzx&A^|K!Y-e;BfDFk$>RRJ9G~Uf zl=LGzterOu!!QiPFbu=^cVe|?k^axiMfyM5Ea(fp5Zh;)(HH7d|3{lS$<`RFbyN1B z^nbLeOJ7J)|3@32FmTkB%8>Mbv?)_xD1rWuHs$CGCDi}Xri?}W3YwjAMLl}d|Cv~< z|1+dFbX06kR--Q@sfGjB|IwxzeIafAA8m@(7aErSk2b~X3k_5MN1NjGg;MDMXj7EF zP%8Z&ZHmzsN~Qm!O)>gHDK}ngQ^dyZl=?r~$WENR^@Sq#d2MlpLJ9gp5#xXL@Iur2 zLV*I}3WwbN%f5iM`TT literal 480 zcmV<60U!Q}P)|AU=R7Vj(_(pq*_H1z*7;ilntN_yi(?poI@0Vwp}5Bo=~& zmCgB0n1j3B+u3*|kTBoP?(EL|x3^>_Cr11m4}mmIciroNd1vYi6w_y%0UJG_C68?0S0HZ3Y3*%a!+ z0W82G$ha$OF$NNd6|vS!1-Qg~?_p}1^rv8N@&qX5_8#j6Wlj21us0P1DDL$hzPD*8 zNPi0Urh)*Qz1~C2G}NU(1$&b#u%y+>dXFvzUG{${^d?uJCh5G@kNE#U&X?|=SKoK8 zKtDLlhb!R;dwyo+8%6G+r6e*;2{ z<7M&34ZWyGFD4Bm-QU+VJHS*8#(3Hb>RG_mmY|u4tJ@9m0vb6U$>0_WHq{?ld2CSNphbnx1))!Zl~LEbVt8AZ2r=V1fI#V1FoxaoMnd_ zw@Y-?W%m-%iz;?(O4%{h9C)}AjWPE-XGXxgDt0vRjUxyPzHA%dW5-=^M#YZZIGGlN zJb%TPZB6u=V<7%P#g1$7bsD1l~tdx#|6pR034ibJKa&$ z?YOV}wK3;2)ywmrG<{LFq3~wPQBEn>neAwzx1Hn6f5HD_adGhp)kie&CLax{*$8%^ zoHye94(~DBMb_Fp|9ai;(?ow8;C0n!4ABQOG(fWjcu)16vMhIL;OiEG zFGmyC;e)aoNahuMwk3yi?{z2S`7zrs`wRSC9z%Mw;MxuoqC@t$VAH`Ty3zXqw=Sd6 zXb+!U<`ZiT^z|z|&+qM2b0>_3!@ZoIu93&tYRbCcbC0<<36-{Wz_r0Mh0&kKSe2!bF8f*@>uZY#?Utn2^qk@a=`pE+bgt-g>wp|@uH zcyIKDcB21d{5Q<9J*^R=zEJg0c2oL4rRNftzK}=#pVD)=$$Qo+ROX@oV?38&^@ZlG z|6}|&L^%3Ft?B=e=Mu^$e(2qf30YrgJNiEcSlFol;HsmxwDA`9msXjQAlDG?B)Q9C^4CR^35rD z(tk?8aJt+bq3n(c(Q-FG`R>j=bItwj-!r*R-)he2IxVwNNIjmGdHC|THIpnX3NQPg zOrE^GHYPFU&#@nkE2Yo>kS_o7HBVzvhf>#!lD*PhAeLI}`!*#I%k%o~g+K|7q)T8W gih_(l*IOLqb|^pfLfB*98<1x_UHx3vIVCg!08?9ei2wiq diff --git a/scripts/generate-icons.js b/scripts/generate-icons.js new file mode 100644 index 0000000..a914388 --- /dev/null +++ b/scripts/generate-icons.js @@ -0,0 +1,119 @@ +/** + * 从 Lucide SVG 图标生成高质量 PNG + * 用法: node scripts/generate-icons.js + */ +const sharp = require('sharp') +const fs = require('fs') +const path = require('path') + +const ICONS_DIR = path.join(__dirname, '../client/src/static/icons') +const LUCIDE_DIR = path.join(__dirname, '../node_modules/lucide-static/icons') + +// 颜色映射:hex -> RGB +const COLORS = { + '#2D1B1B': { r: 45, g: 27, b: 27 }, // 暖深棕 + '#8B7E7E': { r: 139, g: 126, b: 126 }, // 灰色 + '#BFB3B3': { r: 191, g: 179, b: 179 }, // 浅灰 + '#E0D6D0': { r: 224, g: 214, b: 208 }, // 极浅灰 + '#FF8C69': { r: 255, g: 140, b: 105 }, // 珊瑚橙 + '#FF6B6B': { r: 255, g: 107, b: 107 }, // 红色 + '#7BC67E': { r: 123, g: 198, b: 126 }, // 绿色 + '#FFFFFF': { r: 255, g: 255, b: 255 }, // 白色 +} + +// 图标配置:{ lucideName, variants: { colorHex: outputName } } +const ICONS = [ + // 导航 + { lucide: 'arrow-left', variants: { '#2D1B1B': 'arrow-left-dark', '#8B7E7E': 'arrow-left-gray' } }, + { lucide: 'arrow-right', variants: { '#8B7E7E': 'arrow-right-gray', '#E0D6D0': 'arrow-right-pale' } }, + { lucide: 'chevron-right', variants: { '#BFB3B3': 'chevron-right-light' } }, + + // 操作 + { lucide: 'plus', variants: { '#FFFFFF': 'plus-white' } }, + { lucide: 'check', variants: { '#FFFFFF': 'check-white' } }, + { lucide: 'edit', variants: { '#8B7E7E': 'edit-gray', '#BFB3B3': 'edit-light' } }, + { lucide: 'trash-2', variants: { '#FF8C69': 'trash-orange', '#FF6B6B': 'trash-red', '#FFFFFF': 'trash-white' } }, + { lucide: 'refresh-cw', variants: { '#8B7E7E': 'refresh-gray', '#FF8C69': 'refresh-orange' } }, + + // 功能 + { lucide: 'calendar', variants: { '#8B7E7E': 'calendar-gray' } }, + { lucide: 'bell', variants: { '#8B7E7E': 'bell-gray' } }, + { lucide: 'user', variants: { '#8B7E7E': 'user-gray', '#FFFFFF': 'user-white' } }, + { lucide: 'alert-circle', variants: { '#BFB3B3': 'alert-circle-light' } }, + + // 趋势 + { lucide: 'trending-down', variants: { '#FF6B6B': 'trend-down-red' } }, + { lucide: 'trending-up', variants: { '#7BC67E': 'trend-up-green' } }, +] + +// TabBar 图标(需要 normal + active 两套) +const TABBAR_ICONS = [ + { lucide: 'home', normal: 'home', active: 'home-active', normalColor: '#BFB3B3', activeColor: '#FF8C69' }, + { lucide: 'bar-chart-2', normal: 'chart', active: 'chart-active', normalColor: '#BFB3B3', activeColor: '#FF8C69' }, + { lucide: 'receipt', normal: 'bill', active: 'bill-active', normalColor: '#BFB3B3', activeColor: '#FF8C69' }, + { lucide: 'user', normal: 'user', active: 'user-active', normalColor: '#BFB3B3', activeColor: '#FF8C69' }, +] + +const SIZE = 96 // 输出 PNG 尺寸(px) + +async function generateIcon(svgName, outputPath, color) { + const svgPath = path.join(LUCIDE_DIR, `${svgName}.svg`) + if (!fs.existsSync(svgPath)) { + console.warn(`⚠ SVG not found: ${svgName}.svg`) + return false + } + + let svgContent = fs.readFileSync(svgPath, 'utf-8') + + // 替换 SVG 中的 stroke 颜色 + const { r, g, b } = COLORS[color] + svgContent = svgContent.replace(/stroke="[^"]*"/g, `stroke="rgb(${r},${g},${b})"`) + // 也处理可能的 fill + svgContent = svgContent.replace(/fill="none"/g, 'fill="none"') + + // 设置输出尺寸 + svgContent = svgContent.replace(/width="[^"]*"/, `width="${SIZE}"`) + svgContent = svgContent.replace(/height="[^"]*"/, `height="${SIZE}"`) + + await sharp(Buffer.from(svgContent)) + .resize(SIZE, SIZE) + .png() + .toFile(outputPath) + + return true +} + +async function main() { + console.log('🎨 开始生成图标...\n') + + let total = 0 + let success = 0 + + // 生成普通图标 + for (const icon of ICONS) { + for (const [color, outputName] of Object.entries(icon.variants)) { + const outputPath = path.join(ICONS_DIR, `${outputName}.png`) + total++ + if (await generateIcon(icon.lucide, outputPath, color)) { + console.log(` ✓ ${outputName}.png`) + success++ + } + } + } + + // 生成 TabBar 图标 + for (const icon of TABBAR_ICONS) { + for (const [outputName, color] of [[icon.normal, icon.normalColor], [icon.active, icon.activeColor]]) { + const outputPath = path.join(ICONS_DIR, `${outputName}.png`) + total++ + if (await generateIcon(icon.lucide, outputPath, color)) { + console.log(` ✓ ${outputName}.png (tabbar)`) + success++ + } + } + } + + console.log(`\n✅ 完成: ${success}/${total} 个图标已生成`) +} + +main().catch(console.error)