From 6431666e7d2685e733bdd31dad1ec1fd439e0bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=B1=BC=E5=BC=80=E5=8F=91?= Date: Tue, 19 May 2026 10:15:35 +0800 Subject: [PATCH] feat: add DMG background with app design system and Gatekeeper guide --- tauri-app/src-tauri/dmg-background.png | Bin 0 -> 26898 bytes tauri-app/src-tauri/generate-dmg-bg.py | 156 +++++++++++++++++++++++++ tauri-app/src-tauri/tauri.conf.json | 17 ++- 3 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 tauri-app/src-tauri/dmg-background.png create mode 100644 tauri-app/src-tauri/generate-dmg-bg.py diff --git a/tauri-app/src-tauri/dmg-background.png b/tauri-app/src-tauri/dmg-background.png new file mode 100644 index 0000000000000000000000000000000000000000..41f8a3126bb5501d69206039ab656e87a81b126f GIT binary patch literal 26898 zcmeFY_cvT$_&+LDLXaXvPeiYY8a;_1dhdqly_dmYk|2U0dMAk9qL6} zbnbb7?)?M4Yu&ZJ_xr56)D*}_Xi12Oh{zN_e$XN!x|u*k zbmQl}o4}RqN!tY?BD*=o5ASq*Gq5OdK)m-7@h-cB{RG=48kV4`#F=O9`tTv86$x_$ zBxC&zzU83BGXuRj(t781Lex&HXsy@idwb<$^vgWBS{7!zzd^F6{;lpeiU2hK)yFJJ zzkL?YQ%MY5FqM}Qc%B>awNEziNpvB8&lUKHe&>4&xcZ=zj)>^9kKX4kH;9Pd++8FiBI&MZ)2fwu$#%4Vh#0#j&V2v;N`?D7| zYjRy^i9lIb=)p33Eky?8mMo8@=6kyeWuGDJ3WhSL3w9)-kM~c-gRe@f zj$`iK%j2Y#b0KPM9Yx*6x!q*UF4(X=XN#uTe(~sDpj8FqV`?aM)0E4#<9?7$y-GiX~UWU3U>|eLS8W+_)Ho1S2W3~_BA0)13h&r6VWxr_b+M{osI-xwmf3Z~6 zi;OC8u0>hZG)1y1a4GAp*pm24N}!}cX_@t;zAdYMH0&kHsDF>+;Wl|#y?K|qxhp9* zp6pzgzFLR+3L9HNTGjSN4ZTvhlZbW$iRwf6CT_2iY;gE zH??@gum}wFBI$}9>uX(_G_o9z+X!H6S1Akorv!IWuxPY?@+ARI(%?@fh zKgXjX9L-=02mdu!NYlmF+#d(j%@_JQI`e+l!C^5>;vP#4tyCSEWX`|>y;Pl~PLJGr z5QS$OMw$Bezek)#(|Wu%8~tPlxkTn9TH4Mt!1g$|juK>f*;=)DYQ}sRW;od81$D{wxl0nYnk`^U_a)4{TfzRp4cH1T}wJuM4tu{a3$LnmZZ7k49+5pcl<1QriH34P1K!O6?dU+EQOxBuH+ zSlAmvL66&|q)y!#>!zp%U+*`F@>{L@`uY3Jmbc}&uk8M2(ht~d*^8`9Za;5VSBRk% z3EJs%$$HU&y0u6KzN21jVTf+)wJ2ywdbPGX0Sf>j%X|u?k+NI}6R*uL-)HU3r8pwy zwK8CJZ)UXDEW9aUcLIX)+K!gZwK=n{(vcufW`)aoedxtza(Y^NzjMKqNyjxN%xq`2 zH5--l=TAs(QDvLq9=4ikUVXO9a&v|$4xtd8Y1DX<>PRoc!j&_K-443&87eZLk!}!a zz48b$4~u%A^GblZtgFX0>FTGM#s|&GY|{%!SlIY5V_&Pu?l6Q2*4%vW4z{Lk`{-_> z(k4BcQZ9;4&|^-N$=mmAs43uv@ zj`kSZ9kwf1YzbSuA_!zM3$s*+c`iC!@OzKLRBP#Tkb9uGOnz5VHw8TE#{>KtHx(u2 z^&cBcFhOOck5>5VikvPu_@?&AMS$}=&B?`=>}WrH9;8s^`ss z3#m^vOa`XC+1=U%gSJ}sgkB-SE0JcMnJ?(4koOkuDIZ@h_aZOPxXAVK#r;T> zX|DG9n{V;4oU;$~Cazgk`<(_5ARo0C9@gh|mqyuvhuM4$FTs{5_neA2T>^;Jk0gRl82gvBWJGCfX7QgL_dC(I~IwRUq z-S3MQkF|I_0-L3kjIW-cuiMt=8uAOM>vw~G$bR(YuOLPHiznefL#xE=gafzDRhPeS{hOWNBGG`k4nRScB5K-as5muE#CdTlSIV z>{#adF^0e1GfIlc>+|k6*d5g|fiJ&58n-e-N6rTDS3hfS z#PtwZ1?#}QzsMv3nN%g$OVG<|G~{~1S%TnmI{L5JQ{0J0!vAERsm&bEMy@p5?s!X1 z6AE2M;q@z8agI_gZo}8;z+lN$`TG>4FCJ}gteRTX%n`Ey(RujXxbuB5%=2f+m3#65 zsi-T;y2?O3OD#I$0mXfC7AgEkYe?AOy*i_Vi%2N+7~4)v{2F$Hh!ofkkGP$+6<07T z*o;RahfR%(*Mo1?mQ%_@S43gyKSwGj8rr1Y%CwZAKKAKaOAh%^{Qk?z*0WAQ^{ZTC zDmhJc$%E>*&ri+{jwPIu2SG5&zVz#h!EGoc7FkhNatYFv+JOcOe31z#=V*Ut}5 zNfEFgRce`vnx(J}T^E5=T3R|VR?N3z4Y`YJ(0{DYjiri zC6@NpnbkJoaZ^;P54J(ww$|aOr>4IcB&`DibuI5zh=>mU$q5FAL`al!jLDXSEKSZ? zvJcnR76GeqIM<73Vl(gxm(Q;mLRXT-K5(@l{qA`0prH)1MZ(<$8krbZES#$#KPX|ZO1nn_DbtE@B# z3*bPGabq1~dJex^xMsicCgkg5zT>IShvFj()w13;*El0vWGh8?kgeAf{Qg^B<>?LB zlHy`z`h-8;%L6YIZ)H+=*WIJMAL`=a2adQ(uiv?7k7?uKuFMee9`9vpQPoU%zj(D7 zhG!vT{FxM6tkGDiGXTbHy}3fn)fUHVO$d4(?85?T)hknO+`j~NfZry+tB%h9IWY;X2x@q20>sKLn*hnGW#0Jk!iiloQWzq^h5^0YbeL= zGOjWC?6fIN+1yIqMLINa=U4mkLwm_Zk8eAPoU>;KP86z-;6g-WdJm5Frt9imFjcPb zGx)k7e-B}^$sSexs4GtI>W}pDMQFZR;K~v+orL|`ap|wwN;XbsrH6KVEz2Q}!$+Ul{BL@D>zI68o zn`nVr)+@hp-*s~Ewg2|zisxowH10xIpM?l43Dl#fb`geIA-6@E-mMu|jT3xb*-A1E z?O{LXa+bA&5Xv*6Lg?d;++jqyUb^0l|7!_wUtdL`5T@Eazdf5m5E4Gs><=#h+RAKk z&tWGK3dUI|(EFezteInaCEPY<&zW9(w*1aeh7vXv!dS>IPHJ4&M^eWwN!HC}iAOR6 zudf3SS8HiV!zffQ)-h&V)s%dXN#r^S*`%(nm5wt%vn4ZI@Ex&yOaiGx3NhKZ#=U_~ zyMUe%#7KrJs?o1kP@PZS|6#sn*CDMxcLq@1(rk8Eu-C33ijz{NVCEq%&AS zEg?x)vT7xV*anFxwH4w-T^$FHh`69%1HEMpr~OmiDN4D^gSzAbbo;{cNZaMH3=H-* z^)r9ULB}D@v8rJWp^!rQYCp^Vzy>M0iiZZi;CQv*pgv|-%dJ-q>v>HYky1P_aj?I? ztHF7Fioe#P)YUYEuOHmJmBP*L%CD{-LwK=VHc+xvm<<(vHF}*$osC_C+-QXS2itnV zR(neu{g*nL0I)1j{DgSYl9KrGWav3NI&p=~9xd(Sq&J)LN*^k4FQPZk$;UWDffCYz z)8;_7pM->S+d?nTjrB^gGOlfU8U`&kmr0@+U+<+8Ldh~;xyc!)@mX0(iDA7390)|k zf4RpPh~?Ny5IflfCJ27Uj24^;cha_~?Xn6U21HFzU*3+V5v_Ir6>&xM5(6XJ6@l4keQ;;3{-(DW1=M^=RHr{MuYpL2Ds|9i_)ypG& za3Oc8pd9Is?qv5aFEsxt84rTt1!i`Qpe$hfxZ8R_k9Il9t3=wWBt&TYP;rNp`5TTbU?No}C}r{JzI zR#WGOzVCmu6~Ly;Z`jq@N3t;PZC*B@YP?>BQS0jir1`qTu1x!dzqcx?qTKQJS3*RT zvRE=x;8JMGR+{dhbnkQ5&wMX{)%&OSRl?bP`nfyWBY!9`D%i`PWWsfaTD@ud&#Ib| z(%_6Mvf1HCzRpO{Z~TqGf)dN)%i5q*34G8Yd|WrZ0q5_A9ulKK_C}Ae0r^4tVr3iH z`gTG_6ckejBa-#LW0Epv*#z;ePK#D_htCJ<$ZqcBK#}vmy;n!m=aP*0a8?S9u^I!OeCww(vpEIzZ3jK`&1dhTj!uRgdq(EtMZogY5cRJ~CZ)-Ex_MoxVk~U7WmE5nv>zs$ewhS+v5fB1{lJW?U zOjFA^$4hMwiSezkowrzgm|`_f*61qLnrxBlX1v!sgVxzWRkgM%hYMdWiODy>m|6(S z%3qq;OQ|ay{AXSc8)Z>b00!Q%qZ4-_qhS`nJFmqGNTktW3oRYHL>T zT5+sw*VZyZi`E}kyGn0)sEHFj2SSdxdJY@VwlLi?S_ghea)&AKOclNQ_0Q-+FQcIw z=CJ?PlQVCQwkP4i#4O~D8U{N16G@ps*8r-yDkPl~t6@q}(;JiybkYyIyvAGF^a;}h z909K!_suFvt9Z868P4DAf_Zb}Mo@Op$*{0bqwnkEa&W35#=u8{0mDx?wPo~lkHyY` z?dBo?P}N4d-oUR!D70mQT8*_JTW&^npUo*;rwV({tBQMmmbg3OS8x7V;+w|qpr(T8 z7nDoGd_{XF*jzKbw3M6Xa4L|tT&+^nWZ5uE6&@9(igR%Ro;>O5E!M8V9P8z&`ihxd z6yqdf2IDl!n_68l!98Nw+$`R@-~gyB33$DmglmHV&$Fj@M;U;kXBi&ym2a?7^me?E zep26UqQ-6w(K}$CNPyBZts}TvHXve=L~e9Ba5|ioUV5f$;b}mD<0+m$L@>VTm2Mk> zymj;jk;`kK{w(eY1=fkl0{k7x)Y|`P%-;X8l;i(Du>Uiu;Qt-#QcG8bzY{>!aUWp1 zKW9hH9^Yi9zdHGk7H4?Txky0{(BPxOAKqM;-*-K}PvkXeoxj=-k?zhr5pqFedW3(n z``D^~HvW$-cjNu;d~$0kbtnlD2vD}rdkjkJz?H7|{d7dXUj7rg`1=B2)`Pyy-c@^B zC-xuH{;BBM{~F=Gt56j%CGU|}mg_KseyNWrZ^=Cyjh)bk2(j{(7B#liSA4mc*fi=V z9LZprMI)5CNJx}n7y4Ry{fxH24MyeBxg7Cx$O6$n*AMQ#gpJHcN%WC{91-=I#4yQh zvUIR9j~)Rx_N3qYC~60kH#WIQUsAF?s{l1=s5`i!Ux9Y2HwZ#N+Dmoxrf^8l6Nebu zsDkWzTt3HuO^qg{_sYp!TJyJ3Y(}gf=e7k-RYLnS=4O0thckd}?b7tPkd6-9oDmKa zbknZ$)(r^K2qlJ?`m2M=k^R$~gNgsR_{x8A&R-1L2Zp|Xkv)>fvE}5^^YeFz)OpO^ zyJwqT&Wv24O8Fbqh??Bow4ElOWx~5#XRl>2Z1Me8dX2Cu;{Lv&AZ%h`KXxn4|8aBS zNWnUY&*E5<3&oTnn2F?T_ZSlF-z1AtEgUYWf{}fXN$mekDK|AOJW39rwLFfJqTemG zW#g*2t?g}Li;d^4e^ZjpbU@kw2xaaJ=8V`U5PsW3oI%SSA#K*Hx|DKbLhzpUzjkHi zj=$^%PO;$YRTo^B1+OMfy?A#clSwK$X?2OK#>kl|U?1gJDGAcYJY(z$xGIaQRwBGF|Mlm? z^M~I*Fni3%v5}FIH7~M1*ewORRuS#ey0GX>!)iN`c<1g_V=#_Mn7Intj(%KqqM{^k z=$H8RxrSqH>9o^}^O|nVXuYj+q|IU9KT_(0 zlG1JeqwiM70FfNu6Z4D1;i%b}EwX!1TTW9)=Y!oxw~jjsn@ThDNgjMP#Z9Y|bBEHc zxxLY}0zQ*J$=6NvF}|O;|aAf><-)HvC+CFXd(r59X=@Ep(KQ zU8KSIFUyQva!bEXFuO>{(&F;#e)rf9we|IZ?GEvU%iL^hLm5lk%hnAOwj-I)v%Nd{ ztBDnS)n7Zc%IoWLbLSnZv?RI21%8|gmX_-~dST7J7`$sS%~W{?xiU z{RkUJSyW9ss%ixE{cbmdJbu* zJ$G1M?r3M{MA#!79_=w3rx^=P345bW8LgCMEj>N|1N&2x!YAkc5;6^KImK-`{k@2Z zUPMjn-(2|fcqOHQlo_%Ic2E!uWvXXtEtJaKDa&F}bmVBA9A_c&7M>~`>D!E zA?70q`Mxa^kY--|{bH1<#+In`FSnIAT5#$XZTa6%hsOsw99%Ej)XfV1%tA1KpIn|F zQALKVCJN_UC)(7UYPtL^7AzJ>-Pu!EYi@4-ARqEEKkoaVhdFLS2Q5fS%5 zS6ytWI*$>s-ZkubZw%x7>M)RN?%X-^PDP@iz@ljhCQC{dRu!*K0$)R~u1-NH7?YJ) z%yYi5D``tfCDhoc;5_mU+@;SQrXa4Dp}9p^7`g7ubZFRJhBpCR_29#hs+Vn-LFGEk zdq+p}HP;499YJ~WEHRCi~j2-2&M7@6fg9uSPrK~#&q)r21veC3~kq= z_tW78IdqANrO%EwQ6haxVTEq{Dbbt^cpwV+m0_>Ew-0EINl=+ z4fm^W%=B6b!1_{T^D{?q0p54qjDh?}IMCpf)FH7c31noY3TIQNfBLM0l3C{D1V){0 z#!N{vD>d@l>h_&82C<;&)6G_h{OPGbKn<&By&7neotsKgVT;l`?n>h|H-8t@hAxbs z@Z2X+AgB9>`aAxWsTbe2G|PO;8U4ImsiI<8UBcILh#YMe+XAN4Wgm5*;adI7(k`GzAa&_&K#Ro;dmV;Yz=vL3@Ec!;__ zZ+6XoRxpV!3%c5r(+X$d6R|-RWLnCzJx$gFW>Y;~Ao}p7EsOc@e^KvsSne$obE-}MEV+%qb#7in#?jp<8k_K(t=8690&Eq1UU z`#H!ErN<8TesnMBs^)g%(L?lZ*w3_}zYcYvzF`TEod>Y0oZ{22k)$YkY2UtuD@r*~ zi`U$g9MuzscbYn;(i7ojg?aDvcQzCgfJ!34-Y#*2E%u}T@ef*QuZ89)iNF@gte}8* z%8}oA=^g8uf!yfIKf)O=pKooYuRnADc0dy{(aQutu0XQj;VggS!Q3QQ4(w*1d6y~! zJPiC^+cVODXKl~-_qndU-_+l(LZESyf51S=G*jA^v)S1#8KsvDZt9zmofA#E&;I4J znUSe|!yNzGN<;l7V*UXd&6ug)SX^w)IT5|EnWIJ6q=CE0c@c*sY*}1&@Hzn4g?QfxX zfnF;*@-zDM4l7eYb**j8_p3{P;yYI+)=NCn75ZwXe>ZD3NkY@npMFGQ`=tRU{}YJY zlS4w)Y?!|-!%U^QAX`ywq@VZGaFc%R2cG%mBKI7Qh`GXFZ`M7`Klpx6PVOb3!cv-Z z`z_~uZhS`ETqJ8qopL}mt$$26<$w4}s<1^;>d;?S$I31&4(tr-T5~?XIy~%RjP_p^ zY0cW4M9B~w!t$|%QmK_3t&c2A)6@06R3nNq*_rXi3rN)2MQFw&Sz_!QRD~@OE#us& zudFZg##VgOfDuTOXW2d!Oai0bay}y`v1DYbvX7ti?Fwprp4c)1psH5L?rDIQfuy%cl)@e@ZF>J3p@>{S3xrcCd)B0_7ma|UX>v=NeY&^cf`#fO zu6A+X<;FB+L`SlfN6zZ-nXhP7o020fAaaEngH{zm|8f&*d9*(GR4j_74!u`6tsabG z03HBO6kYw^MH|`O>^_(!CRhm6x&70N2K4!b!}?3gdl~09o<*_k=aW`=WyaH!eZzAShO4+5#bZXX1pM6Bh&8ngDAEq=c7OW z-L7BP*Y)P5>5<1ZH}#Xr=k+@gj`l3h)y3jr%|94ppV2(h(#Q1qj9D0#PfzPz;w}{e z16!BQ2+YfW@R^c6Yln)D%>Q{Uk~DD&3f4et%RtM6#xYr9wnOaj4OWZ2 zoIKmRtcRE8*y%88=~p&ZkF}q9&wtretk6Mts%teCX!t7oVU zKNIzTW{+kwX72oYK&tdHk_Q&syKLxO|L)cjM+7@1Nj+Bl*-T+8k?KS(+(ub-1kTT6 z?=p7yo#f!)2uF?ZTt~kINH<`e{?pjY`S12|#?P66v}GJlK0#%& zzjlrf(;?{JZ4ZsiKsr;*nV?s#g@q*r^+D*eVrkQ?(rFh^oein##A41n3-@zkM1%TJ zK{i!-zCWcO`7TPX-^Bp*nTd$N?O7Og| zO3;%rMTrCnKs4jlAmjG|*)M{hWSpD-k4x*M>;8R`*}zRZAGJ1=3p?s-r))6rBf!71 zBjNjXNA~N1ipSk12&Q!z(p{UZI^#S~^Ozp6;ZTTzPYZY<@(<_|lH9+jlGn^tdmOEi zR~qOIPevG*$*70Q4`oPea!|U=R~I(cE@j<+nM!W)GTur{5r~{-y_{3~{A89{*x3&>#s$U)0fHz9O+86#uJt7ly}HZpYLT6m?K#(gW+a3%;}mYiiaZmvB3>*V*l zy*r`#?{hxk${^n5&H}|D<-GWoF`#&ynPtC>iNh^X%8}6tJhyjikM;$@mEa!_zgS{98f-thr@($0AD4wqfom z$uapdITx4Xw9_mj{fdnFj++k$AthFE&%HG!TS?68@G#i35G-b^Obl=knCm~B_23xW zEQ7wFL1}c>h;-HNM)(Saj4|P4sR>nl`(~q`Z$SlD0+CBA0Attx{)eu_Y6&@KDw0w!;5EvSL0$ zNkiMY!>%?PuyI|LXLUA&ffhDTL~k76h!*G#Z~;D2oX~E;bH^Pe2Xg| zizpE?b9Wo8{i4N{`2u^h1NET&izr12-1XYbS-WPfAoC7Uhw9>H&c-m%9_QV^uzBl? zQDdpUbYytIYy`p>CS zW6vswIjysEA3)F6G4Uzv*?T;ql>aLOD(H!7*^j(3z{E1b*5@Y6a~> zPg|Mn$3nip&DvWN*OLxY#x15bDHG8tc>EI0$`)WkXwczYcs&Cx+^+6g33^w7J}(`{ za>yXGAE}ThPN!V^Uv%CcvGX_%pJ0mpf$z{SFnYZ-MR#F-g9zF55KaGc%H+`h>^Qo^ z=J6Ri_2~gqg3gHPW@xrqH)EK> z-qjTJQH|&H{MgkVbK7U9c6K{AJ>^GD&eeu-+n(|#-FqBp#Qm6ngjU7HM#{b!J-!i) ztfr2=W2VmYVJE)d99u_0q^NE_I9ukJjlF=qH(s4DORv4e`J|E90qZY+AnG-eYi_{Zp?RrXF&TnxW6pJO>FtI}D(Arx>!D#n-cy^L{Sa7Qn)0DBDl z-q({TW@*p2MV-&NLa_GLQxsd~aPD%4LVM(Tw*SZ{a8PZpl#r?`j~L^^lGtmv z1@wStIaSxruBHqXBmI-n?41Lh5qoAv?H#^RJ%$oBXvw+|VN>hN$rxiiXT-R1RJxM- z4v!2%|EU_IxKX@)wXu?yFs*003WsL+YB;*pLU(a6tbKpKsgn9bwEFIktK!4PpX_dr zl=`$k=8MZ|+Q5#Mcd{!kMa(uO!ca^^L=`s{;WX>C`=&oK<>qS);cQrHF+@hgE(fFP zSh`ZorR%~IN;%zn;l>DnaK)BO9^*P#DdnDSJ4DaeFjT^GIZ9gUvU-;K2h#|*b=u^zP{-xm6i}l*Is&X8#F;(xm@+rCw*^<_MD4m)$XUgo>_*HHqwZ-&X zujOx1#kgSLgtSt?y!zTZrL7S{b9Qb~%~5jNk9jBo`u+D>^U_O!FDqB0=2lF_Z)^W) z-fkEtfbUAqJB?>njF^h=Sc}G%b#d1lMj1t3nbC0L@6%??6h|U)5i1Q(7&RkSEiaaN zeH`NzmDQGI3`={@dJp_A%GNCE#~F!;nr|(_S-HZ~P5LPF44H#^UEM%?kHX*n^VuDC z;L}StRyKC*qG$aSk!y9+y%zFo&gIm2ejIuXZ484vyuXm}4aua?w&tE6B?-%4L6z0* zm~Tfp#KR@=vj{Htb8^5)A$XNTRfEeMni846iU}f(3-GsXNN6OOi@3j@s2}IGWkQk+XocFRcJJDwe`m|?FA6SzhN>7Kc#V2#OdA^~Z z_SbaE$H9_?pZd&SH8h@LKxovW2Czjmn(zv9>C;q9E*i~Ct)509~rw<3DH3GHy9aCWThufn*@)Sh=S)K)SHxk+3FxeGfB5IWgp zi}z7DO{EFL{Nmh-d@%y{ZKC&{15&f>6wUIj$EMrI&*d~pU-q`Aon`hQ2_J@9e-n(i ziZX1ig{i*{Uf%WZ-sMo@c_?;lIOxPzCR#-7Cm1}L89ERsyBgH%SR;RW1bdhLgs6jo z99Z!K<{tkyQ%3P@SWzRrID~klIplOxIPXeLQ^(K|Wt=L*=6{?F zab7!@O<{BH{3Og!-j6g4@-h84YdY}rnBQqPjtfZS?~Q)Z{n*M+2CI{)X+^A(RF$F~ zhU~b0=!T~5Br%av)Ehm}gQ@yj|89hj`8h*%9cm$?O+AvLRgtA1d&t@II0h^l+LG%C ziEW;9ruHIfHcX(0Vz{Fpc!iUmDr+y`=)v6((d3q_tH3aM7oS`J1C!M03d)9YckcsH zC@P>QO&d6Z{Qi37g=_JC=?i|z&Q7H>5EvHMuIVSjqHUTpZV`1H?W)+QNCgIusaY#c_g%K9nCys_sd`kr;71E8 zT@3Du%<&k)kyM`dh6>+_0#^! ziNCqfhW3u26y%KBgj}X{kbWhO zbW&23pb)aHDHo0qQCr|N&O!{uVxZ%%hX0WU|6d%!flJY(CIeu_2W_egO7?rvFbF*& zQ$@+Bc{mhwpB?zK%dxJqs}=gp_PP|#1vk{%)i&!9Do*Q%lU#*T0ZIyVC73p}<09r4 zx+2+rLQqI67#Jwk(yFQO8RBm@zLXeo7>vH<5EYFCP}ywr0nzzG)d_JB9Rz&67!Rmp zAVwBe;cbAz#zXNSqXv8GCi9xP3ZIAjBQ`a$QrZ*zR;EtZ=VP1m85kX6z&{A^9@+KS zZAnizO+~-`CY5#GRBBJ)YbMw?Z1GLShMCD`0ZU$6>Igzzt=+7GdZsErU->6|(D|i! z@FF$onigf9_xg=iOG~33x!|!6BBp(90ZqSFsBLvkg0@s>n_4~bu>&RZ$U!-M2$-nh zj^5MdEUG%a=Nn5U%H?BvdNXkd;kqMnka5h0o5u`F6}OC4)J&LjdJQ^ds4R9|I5>@M ze(0gkLZ!$$w1l*&SsirM=lAoiPe&#io=S{Dm)E2KZV(WkOilhd)Lqp&d#G5lHEn>j2w0)L0*HvfM7QhhzGoG*z3T>tt|@?-r7zP5_eoa@D5I z78M;%?rP_Ru3FzUGYjw-xw5=GBgFOpz9VP7&cC9gKa-fG4*)10YQu9S5xr99?yYP9 zZXp1`2p*9sw9hackDGS!~L+q26kMB>6 z*fL2ZTGY&|*Z>Tjcs-aRe;g&7|2-1Bxx{Q~wz?3j4fR{x8$9j4(``K@AUQu>m+o_R z=Br65Y(DfVeAyLN-8^h#%_r^TbB?~%Ypa(1abgnSr?P#m7{!LCGl`W3OXd&#^TsmL z++R!b7?h8Rx3x`>fE$RQ*|-2aQ3FwDI-OdEnw0w)z2UdgI#qSe$<&nx`*cD!R^tHi z%@MIR!QHH0X;%%EU&|jTF^bb2uC6|a(?*br!{H8$G5Q-P`FR{%Ic9is#UXcja=Mkp z93I|M@#LiZsXBqxlIi-G_KU2RvtZAH^RrhoH*h$YCp}j!;=aCiy8wqz5}{N{pfW-n z0+R6JfiD28PcF>#S1oJiNF(P*4(9ue(a??GrKO~&1_RuVUi`fg zAl;r@!p72EgDQR*T0s=hZUA6*MOSSpVfl8^v%|z0*{WjMU{HxPzmE9<(Na7q;bB zV|0LPH?1hCP?msJ)wU=xQvrhDP^ws{Wb=B5dtzrMd;!-2PE|SE%4U-B7D0Uya+z;V zMxmz*Fty&UPI$&v3uem-lLN7d&H1GA`I9Bjn4g0%rfHW9(=4dD3W#^JwaK(&K!3^UJT?YBn+9nu-ed^DNoCZ)A*; zzc66xX&L|s<&OXP`PO3rQi&ODN?sj**E6I}rgI^?HU z&)9#^WW6b30`$(9%%}HG@)TI&N;-$VgJ)iG$xShEP3RnHZNQ?EBWlQd`+a?On#Q!km==a4f1=N6W-0N2iha z?un_hC2^u|9j}A4+s}5bzZv6|x<-12rka;HVzbgZ@oxkUQ(PobtZZ(DnD@t+?0U*x~KO@Bz4H6Nf{$Oq;Pz` zmr`1U-a#E0iUCpHT480N?Ok44I+)+`b$`HtB2hqy<&^|G zrnfh8(wJVxn@>QJr2}((Qk-DPuHExPB_d{9)rjma+rKfPqp|h>=t8f5qhElDtGqhh z`_{82MI5b7xe6$KuY6{UYk+>y&p_)vZuNcapG)GcrThzL7&*Dh24cEE#%*OXKjUjR zsZDji>cnJf!jE3YEZBO--k;H5L^4cY-oA3*+1*MzJ4y$)?jCmC{PH$m=U?v;A7}Xn zBK?%80V}?-jIF~jgey0lez_533}$R`-D(7gRM2^}7NvES5!Oed>9Mnu3ny=7f@11m zti5*6(RUKq3*eL*K4iB|c7sfQ{Tue|8&Eimw}z^S@2U}=8|_I^ReaZaB3Ow{3fw?my_ z>Y7h{zmrJ1v&eazoM%QG*#GeRha3&Jg}&mqP>gN1L5lZl@aX3^`*v!k?>uYHO7VJ; zA3BTU<=e0O$2a=^02VD#;nMUpBf^f1wDW*L6Oz@4k;^kyF60jIy(}r_KF>KiNk;wx zg%4gjCxA3$Gm=v6JoDG^7$fT-5D*~wvh#gf+J8a;>@@!t(&?V-a8X71%T}AMExOYH z#wL)qvAR~seK`eHo-t(EG~I*Y|EfB3>~~RDj5@AFc)p;3YJSW+lCqdHA`K9{3&T9- z6RKA9XNNy2p@rbLgQpyp_c*@1{h5*G2c*6Nwj&r*K)IvilifR#(jyl2R_iOGbw%wL zE=LLBd9zG%o-~N&_(D#`>~q zbiDWLh9<*HfO^)VOcZ)^bs3WkBm@hDMx^p!177@}5QS(d5Ta+NPFe~2j^5eOgImRv zQTJT0FX4U7za5>80jC6krR)98LRCg(&4ldA8DJE4X?ePIFzH-!{M{pMuBXn? z(?1tw@2X@ARLH?iXwjnHEx?Q#j1y^jV^;T=j3vVkL4Y!s9B;hA20l6>loXdt00E?HRa??+P5OAA|%Z=AHXe%$s>mkynz1B9ugY-sBRDuV1u zFBx@2$a3!k@7Vr}fL3fRY6juBj_wkI>v%s@P-g)S#r~i}p__7o1vzPeo_|o!nTLzd z(aEX6x8=sAW!?PrfnoBFP}J@>8Q=)L?c|g&3E(Xg77;%1ZTb4XK&`SZC;a!Pk3X-w zD26|Q*__cku1t}KwakIvmn7-UB4XdUcurm$oi_5lr z)Cpd5eSx6$alViFk846Xrv<0(a?*^*oC4VDH(ywwT8crGB=TbGIue%SLr5f!N`GlJ#UmX+wMtN^NguiEc>^cWo< zwV)3MZXexJL7yP=%~(rYpgCGP zC(x#)xV?~w!CvDVO%8C6p6cm>8X%alS!t=e6dNB{DAyUXLK0^$Ut?4g#%9Y z8SOt0#ywTOWM!CRW>fYozXe?{t6R#yk}AJfGuL9XOunTb2W$R$;YQfh=bl5*Iy=78 z+`M(H+U((yY^##)wlLZcNYILYV}shluG6jk#i?AO=iYSu73b(osaJvHIhMBKVGZ(y z=esqlzaL*YklkMHd2qC^v1x=5!GEgAFLB(GzI4c+b22v)w?S<)$E!V)0KlbiLy@Qx z`T!8Q-sk+PZk~ou>E^h-#1zYyLaY|c0Cz8~F!Sr>fciouF(J;yFmGel$L_k`Ae|48 z?dmY4*HD5G4368(X))2z($SLkJo`{5Z!3~MF>D)ln^*{l2u$tZ%uFQy1Tt;sjl(fq z)1p=?j@8ru*dyA2^l|&9bWAT8C#;w@vg(n%soet_u;yCirE>HXoM@F1khFsLFjVjf zjH^Fcpt!jh2!5S9MAxvR$$h`045Wh^^I95#AID&=vV&xDf(|%HvdSg3CqKKK*|TwY!;(Z&0JivnWWF; zLy)8KdeqJn$kF#%09hl63wBR0n$HRn9YwBJLwm(rOf(gnVj9>vVc_D5HhXLV1JJ*J zSi})FWNX@hwMMx>_nH(GWjy1k00*dNqPrM*-Tuz-W#@lNg7bJJ-je%&__yfKV;ND;c zEG^*tjHH$v^%D(Er{nB3>zZaD{$LS1<-l6LiOymik*v~Sq1-Y;^sOcC>5CHTekv$WGTnIn4+o3nhzwa^nuM0#sv{Tgy_j{xhe3m z>{n4j@A90JitR#Nb;RhWg0Ho=eAvirfmg zJdn{Kum7*+zB?St|L@zkLG-0>6d@y;TY z<3+o=)n4crR6aBMbX2=2&yRbGgK5goOc-TRk`~+8!Bv2gP<{*$9NF^Ah`5A)|s@Y;`3yhh;AA> zM~oPEyQ1o8QKHn2A2Lr&p4@3pW^LVbV6;PHXpX7N4z^0(9kUrHy-j za$nGM5@gs#I*N?hAT8X38WA2!n3b!S>2irw3ym$B&Kao$DTWbu0v9LyGD$4nwKHho zN-45F+g(zdk6DTYHTM3@66Bliap&{MykwQ!KYR1h4~Jf$cLV7D>Ecz?4UZLLOz>O z^u5@M7^(c7ywQJovOttniK(W!J-Q>3CADO0EjLpQvLeA&;>+OY)*y#yQ{fwy9*^Qx?y1J^1 z&eC$&s9vufKbxplMvZUkDa}5Zm&T{kQ_*(bT4HGLbx5X39jL78&(qM=6?2@v@$PN2 z-B=n(R!LI5{CmP^@8G5AaQd!=;ET>0h?vsE7Eh|{74S|Rf;A;Wy=H8f_pHQisfa>+F$5=~0{=G4#s|G+rmA zIAiwH9AA75{k|~~;*#{$D>1~pIcq-z-Lo2VLf!=wBKR>GaVAjdbJtfDId-H-U}vbX zxr=yjx)?il7`&FiK17dIGp6>F+_=VDf1ZL1epoMA?M#iSlj^vXGsp9Tke};)m)ThM zBq?iEisl~A)`fBCxG-H8VnQf|goEW`!K_)MCCqW3Sg!w|Wx7>jGLfJB7voZ`cEa0; z08NRI^5hP?sjY(z#dMQW9Vzj&LCXcqu}NvCc{%R2_f@=p@(gPi*B-^)lnYN4Jp4}U zTwGsz+8He1P&&265Iu2BOB0VPeV=2k$C9(0s%*qM-@(!;MLjfY4O|Fco`^Z|u`Z^o zu2J4~Ot!`V4tKy@0DmBm7{`}ZTV1zD^sZPYFGHiIGvV+`gX3hUp&R5-dy1Y}J92Bx zxMIlW{_@n+9UjosKK8q}Yek**U679fg`k+5d8yWfJwCSrI4@34 zJ*KwY@<&#@>CLK<+zLWU3^H}C`t`TdFhMPpg@Ap8RYP3VHPKggAc07s)aPa^S=^fs zeDd0vwgD{z)kxpRG)SAhZu$n6-n*S99>}<=4r|rl){C$IAq_-l;EQ(9GyJciU4jLU z5^s!iC20uo35=xs`31|-v%W6M;`g;R%GzF8grozAR%3bbv5!_4z{}rz>aOv2>n)LL zf4*g5`;hdUMjWO6h>dnd%Gu0aS(sIe2;|80LF;3D*^~vMVtEU}N9IPEm z$yh^h7A=ix`S z(*gPcja-~`1>Hf{#GkIF`SB?mJ8Huyq-WdzK3$cQ0#TlqSckMgPQF z4UFrd2Gmgl-1fu&xJ5;)Ss+1XJ)SB0r<{M*Z*j5DIh+5-?c6V~NVaz!~?Q|b)5v8x;|47s^ zUsvN~BzvmSCf{9ikMO=SYJl!`CMsOB?smaR<7uf?0Chgl_nJ-`b zk&_3Ttc(`rnOch0_><*gXUxRvY?K6lEbPX67-$yEp6&Q?K|Vvu)edzzDMzb-5$h51FtB5M zqV_GbkYz4sxTk;wu%DYR-_(oC*=~g-_8QKyA!~!3o0pd50PRg*4iYQ1n_OPJQXDp~ z_1KtqQR<+eYblEHzBcDbcov&wwaT$Po09hj#0J@`nWT*MkL#0)ahjtg5!ffE z28*3oeD{G|00OCBxM^-_qQWsFFe-pVSBLxJjVNGUVB*PaP1XjPE1hL8D_NTI6XN$~ z3J6ZN7F2ewwusr|^5I25=jujzh3r!K?IlBXgdC@L?1XL!_NROc*&tfQ7L&8zaIq7nlp3Wn9j&WzP<5f>l7mh#sIV>gIE{Tm)bZ>C0s6!Ahmafe`Kif* z2*Bo3m&Oafyuk|eNvfbU=|H72_OkK-T#>iZQK;Ru<3@|}5Dkg_+ z5pfxBmf)HOomcgHw2m7CBS{>mL3}6HKL|T67HI0aM8ULnli!DjxVU@8g*Kga@fO?( zfHY1NJM>?7&bmZdbOXXLX8NpKh3sM=3~B_wsD!@w77UshG+8eeoTAt65&;_SbGBbQNJ}_jB?uNNpahmM z9=!D;bWC$V<^eQ4z3db{QJ~7wSw{c#-J4L7o`(2n^y&uK`{KE4E=#^%tCa4zNRG~n zTQTnq2=%B)7EO(jn6jEwG^~lw*5JCl-YHstKtYc@ioU5p84-upij0t*#xmp-5(INt ziWkF2I<;k>Z}q(*&eqlr@~{1iBTLca1ghp?3yM)Fn_8ILvSV9<)mq^-lbXk4Op|Of zNgz&*2gsm|9w&AV8AtyJE19xV?R&_Y{}J!j?(Qy4Gmk+EOIehEuemR}tvFR@&uBF` zr!Uj+7pj;K7aP&*#$0W5v1!%gIpT_+-S?FTmb?wJ_Y?u$=}}Iqn1Ye@9^%lhVbR+z zA82E`>IgQ62>SAqT<6kMKMk>{{kE(8!EgS(pdb&tQJd`gFI~3)QU97UYQ`Bo^&7vL zX=uXsfK})~D0a5416(a`i;AlOCH~^?K>FKmvb&=k;@?Wp{XeR8b^G*JWGvL9!Jk9Q;D&)m!mh=jAZ1N08&w-}y7)utica{;#UL2 z)4mzey*L4lG+=W*cr@V&+HDekE_J*agW&NA3F*$3CsW935b@d;PR-@DP}Is8*%tE- z5m}{WjDip|v(i^(EJdv|TY4wgoxC#!zq+4M-4`?eH55aR29wt1n?`4Ll9w-6d%cX- z9Zq}xdUMO459jgkeo~T9xu2-h!-pGhCUcP-NE4XGz`wBP$Is32uJD1dE?&M4_~XN-vj=E=A5s3xvviQ)FYR&n5;(HO+nZN? zE@hm#q4Fm!K8K%QsC#&MJPvL4U}DvHsBJHqZ?iSU7`V?eck_rQ?UTOzsESZKw_r_| z{`D)O+SAC|C}y7XRzNm9C4+o-);P;*!e!_{;Jq#8!U;?}Ny5I<(=L!Xgg*ayd0f5f zDH-q^eTX@^0)mTH#8vEr2#RsB*n;A-frisVevK$2D*WcM_e96%lU{SL)y;mbZ1oU! z7r>5~^Lbk&z12%H!1rikPfVmSC#&k4Nhw@CrEp1Vs66q#xs5X~K#I)e5d-twPQ~1G zd_0x+MIw9bp-0RK6jppI*cY~zQT~!TXm+rttX){ubF;QB3j3_ap4_9NrlQs3cn8ZD zb?_6bzOhh2$zDhk5xrK)LpB3;7b*Xsqf?Jm!DuLPEwu%{Z0GN@gVyzQV&k%{FE+jK z!(#^l-+B;y{*sfKna3awCJmt7t2f6TI1@TP%9C-p46LHgcH+dus;qls!OT-rSHs^g z@@A*gDrU%M&tC<4004yss$IIpm$jw20gv)0eLSwW!@os{aaLnwiQ{4&Q0>Fdf$GUr z#kK0-N$9aI46g|8iRUeqP^v>&9eiX480&@WOp_nuXS_q=u-L3zpaa-NPj5`56{LH@ zIfG9sPAi=-GD`=jIckG9SnGQcEhPzgG{|V?c5=bm7F}lh(p4XL0`HgL06SkbWcRH$ zY5VTj7Cj@FMjkTk z?N98RGOAt+cVH1>6r*{>PsjhZV=?pVOAikweC)-{>G$Ka91t&Xj6{Y424mmX!))fN zZXp-o6_HbtW&S&79?}ygLH1LuPi=-A6)`D|Zycbb7@qh+T^5q4PSeN!NFX(a=r-|m z`e;i3&o$7;bpN1s=MxZk$J=P|i1;DJ!+3pDeAl-K&>4$(`Wb^)da0_al85d??h{Cg z)UR`D+e}bfUnip{EOm~4wHHHEP#kfHQDQwg>b~1AR{86D!Z2)kP>z)D33;!kw9y9P zYcNfZyGCO(>?<@5{S`Knt;s!=I%@QId)9aJn2~C|q<{OogIJ6o*&Bx2r=gFiuNQ_X zx>m}xR3{^&)!LdI5Y`0~U;70+YkOS0ecJrbRh4UD(nPha#KG3df?{5tOqqniMU`8* z^caw_nXfJ}e&?z@k@Q^2RB6LOPkVirVn}wq6iM}ITu(dZ`gxy(%CVHghIjLq`D^!A zn`R-H_&T^`iT7tB>LE}>-dyzF`Wk37=)K~!+PTZcnc&hn=WkQN@0D|>kM=XH1Q_!f zL{efdprR2QWN>lg;#<93Olb}P8R+}aPAN@wt5urz8&@G?-}d`1M0!BF+)EZs>01xT zFMp@*5%}E^Ru2IpX2Q-5Q0L|MQSf_#wJVQDuzVuPO;m`E|4V7^%kwP#rX~aLzkDrC z-b?2@H?PLALw^~%`?1_lwrk>r z;$p!gD9b2USoC{1fqT{B#n`Zy&<_Ix@~J6_?R69G1RVXfDBM>MA2ig`iEvFhjCrk$v+DKX(DH1$6D`*zkQeLBIW4Ew3w$!Q~RrR3i8Jse0PtZ zb)A%0hiy-x$3S3{=&}X=&ROsC>+XEDP?c=0b8`wDx4$VHsLV`eS%~FFmHmtw3JG2e z1Xvce_kvu(9K#jCWf;PxbSpFBu%CnvZbYCV)x-NQulg?~>eO@P5*JAw&PeWO}{oFn0s{D#KZ7g>>2f^V{A zl37%A$DUy06X_K89rH7kd%y$(7ELy`p~dVzsBuy(w;2gS7=QP0_x>H9z~PhrgnHa- z=Q}{V$HKE~*A^s1d~@2TV$V2g~`47d-(g(VFgH(Z8|%kacqv6Slj`%;t)zl1LW?eF;VTcW~~R zS|Z%`gPn^cMLZZ>7x>LfNQM3up%Gqkdg=%;Q$c7gP@0#`muFjKF-4%q8nkpJ=S9nr zP5VwRl`h?x7oetyqHr!Wllw|IRMV{}K15NWh6?x-Qc(w8%hfsQ zgh%hNQBz}t)48*z6M!ZVs6dhjI1XFQILAi#K+48uP`5d~*#9Q81J_>-ZsrYJ0oOUaj3#9E6>sMt*{OTB4lKJn-`tJUZ2>+ z_X5&rDe-wAlYkn_o^AV#`4K_M63x**3Kd&ZeN>OO7P1)1%PQClF zuvRQ)Puo}P7FK}}3$i0Xv6rllsq513x*H)rzfBW;k(V+Hmd)cl1&EYU66TDsohVy; zVy7>m@3R>7kb=xI@xuIgvWrOCAfwakLR|3$57%#nppXy(ppgNYH1Pecy;?d5>TQ7c z)%5ib*T(YAB+YwO#rTJK!MtM#0XnnTpFWch;yv>(SSpjv-6kWA7A^WOn)aq4G?3EdRJt1tK~=x;45vKzOUCp#%Hg#t+I>c*?mw=#|sP1BvjV1|d=k zv&V_oyx#;>C&fCdR)N#)d5l%bfAt*P40hz`>rW*;8VS;N1bi~oPTu>(b;i__ROs|c)4p(l7a zYp(vuNt>4XGy$xH1X$nyk6t2j$hxqWmQ!Tc@S+$Sf)3Tkcs)Itb_P*b{`2|~lpvG$ z)fS4s+qZQgjsIVtiPpsnaKNgeO&j+K1;Z)N5?DKpKTTIt_M25r2gWsK408L-_#`Is z+>yF|APCctv{wk5iOCcioFBh)q}(E1k^ z|I%3as`P7=)(!L&6*xs9+xIXmfWYRzJ)^s?-r-`sHEc)V{pVT`SKwN(&M0Sv|L2My z!4+f8#qBUWeT|Yl%D?`$p7hOC2TK3L-hgI(tQw*DF?1H;>~vdOOtVqX^c5_3-0ugh zZ+Duc{+Y*m)gfVv;=BR3=nKzr=M<73|KBC_85t8|^}(AqRCE0sr?U8zT~6&1ZTL2)`%-(7k1V0_#P!(ZDECbAt=`>tc`oVhbOl(Ef#58I< z86mW7rA|bW{0rt8tHe=j-Hwm=#$sIEKqYjs0gL#21y z=rNg(k1!F=!PeRIUI>}n>PaB6QjEzHZ-3Th-H(*Rzw=SFoBXTFKu&?@R8d zyoZ{aQ83U@$r!0T2n|~+@%v^8`ev(DcG8b4I|FaOU>P2yb?z7)R0aJMss2&}`*jv` zVbzO?j&tHBT&$zU0b~5P&uQA;KmVD>6vDz>9P;<6z(;MEYOE^{wuqAXsSm{6M3H$j zchh8;?uJ6OFE3;7{z{mJC3YQ4?|l>>Rvd)e82o$~5=>A%wfXg;;i{p7k|Fv4Z)d0E zOWg@WOj)R^tD{wBP*9m>#H)~Ww&lCvYY>X-{%h_QLEIFU9?cx4Q8;ETLEyIW(_|{1 zgkI>SBy7vk^#Iw|J|x;@O_Z@$ zxsKP-Q7zDzmD28KE|V9u7XIQ-mA|l0%o?wz3>q)rKfLC7VvO}EhMxJ>WKfVmjf-tUg8k1of7u9 SGOfa4!IG6ylq?cAdjDVZHU~%m literal 0 HcmV?d00001 diff --git a/tauri-app/src-tauri/generate-dmg-bg.py b/tauri-app/src-tauri/generate-dmg-bg.py new file mode 100644 index 0000000..56ec0f0 --- /dev/null +++ b/tauri-app/src-tauri/generate-dmg-bg.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +""" +生成 DMG 背景图 — 美家卡智影设计规范 +==================================== + +画布: 660 x 400 px +风格: 与应用 UI 一致(绿色品牌色、卡片阴影、圆角) +""" + +import subprocess +from pathlib import Path +from PIL import Image, ImageDraw, ImageFont + +# ──────────────────────────── 配置 ──────────────────────────── +W, H = 660, 400 + +# 颜色(引用应用 CSS 变量) +BG = (249, 250, 251) # --bg-main: #f9fafb +CARD_BG = (255, 255, 255) # --bg-card: #fff +PRIMARY = (54, 178, 106) # --primary: #36b26a +TEXT_PRIMARY = (17, 24, 39) # --text-primary: #111827 +TEXT_SECONDARY = (107, 114, 128) # --text-secondary: #6b7280 +TEXT_TERTIARY = (156, 163, 175) # --text-tertiary: #9ca3af +BORDER = (229, 231, 235) # --border-color: #e5e7eb +SUCCESS = (16, 185, 129) # --success: #10b981 + +# 阴影(模拟 CSS box-shadow) +def draw_card_shadow(draw, bbox, color=(0, 0, 0), alpha=0.05, blur=8): + """绘制卡片阴影""" + x1, y1, x2, y2 = bbox + for i in range(blur, 0, -1): + a = int(alpha * 255 * (i / blur)) + offset = blur - i + 2 + draw.rounded_rectangle( + [x1 - offset, y1 - offset + 2, x2 + offset, y2 + offset + 4], + radius=12, + fill=(0, 0, 0, a), + ) + +# ──────────────────────────── 字体 ──────────────────────────── +def get_font(size, bold=False): + """获取中文字体""" + result = subprocess.run( + ["fc-match", "-f", "%{file}", "PingFang SC"], + capture_output=True, text=True + ) + path = result.stdout.strip() + if path and Path(path).exists(): + idx = 2 if bold else 0 # 常规/粗体索引 + return ImageFont.truetype(path, size, index=idx) + return ImageFont.load_default() + +font_title = get_font(22, bold=True) +font_subtitle = get_font(13, bold=True) +font_body = get_font(12) +font_caption = get_font(10) + +# ──────────────────────────── 画布 ──────────────────────────── +bg = Image.new("RGBA", (W, H), (*BG, 255)) +draw = ImageDraw.Draw(bg) + +# ──────────────────────────── 顶部品牌区 ──────────────────────────── +# 加载 Logo(绿色 M) +logo = Image.open("icons/icon.png").convert("RGBA") +logo_size = 36 +logo.thumbnail((logo_size, logo_size), Image.LANCZOS) + +# 放置 Logo(顶部居中偏左,与文字搭配) +logo_x = (W - logo_size) // 2 - 70 +logo_y = 28 +bg.paste(logo, (logo_x, logo_y), logo) + +# 品牌名称 +draw.text((logo_x + logo_size + 10, logo_y + 6), "美家卡智影", + fill=TEXT_PRIMARY, font=font_title) + +# ──────────────────────────── 中部拖拽引导 ──────────────────────────── +# 拖拽箭头(从左侧指向右侧) +arrow_y = 195 +arrow_start = 220 +arrow_end = 440 +arrow_mid = (arrow_start + arrow_end) // 2 + +# 虚线箭头身 +dash_len = 6 +gap_len = 4 +current = arrow_start +while current < arrow_end - 10: + seg = min(dash_len, arrow_end - 10 - current) + draw.line([(current, arrow_y), (current + seg, arrow_y)], + fill=PRIMARY, width=2) + current += dash_len + gap_len + +# 箭头头部 +draw.polygon([(arrow_end, arrow_y), (arrow_end - 8, arrow_y - 4), + (arrow_end - 8, arrow_y + 4)], fill=PRIMARY) + +# 引导文字 +draw.text((W // 2, arrow_y + 18), "将左侧图标拖拽到右侧 Applications 文件夹", + fill=TEXT_SECONDARY, font=font_body, anchor="mm") + +# ──────────────────────────── 底部提示卡片 ──────────────────────────── +card_w = 420 +card_h = 110 +card_x = (W - card_w) // 2 +card_y = 245 +radius = 12 + +# 卡片阴影(多层模拟) +shadow = Image.new("RGBA", (W, H), (0, 0, 0, 0)) +shadow_draw = ImageDraw.Draw(shadow) +for i in range(6, 0, -1): + a = int(0.04 * 255 * (i / 6)) + offset = 8 - i + shadow_draw.rounded_rectangle( + [card_x - offset, card_y - offset + 2, + card_x + card_w + offset, card_y + card_h + offset + 4], + radius=radius, fill=(0, 0, 0, a) + ) +bg = Image.alpha_composite(bg, shadow) +draw = ImageDraw.Draw(bg) + +# 卡片本体 +draw.rounded_rectangle( + [card_x, card_y, card_x + card_w, card_y + card_h], + radius=radius, fill=CARD_BG, outline=BORDER, width=1 +) + +# 左侧绿色竖条(强调色) +bar_w = 4 +draw.rounded_rectangle( + [card_x, card_y + 16, card_x + bar_w, card_y + card_h - 16], + radius=bar_w // 2, fill=PRIMARY +) + +# 提示标题(绿色) +draw.text((card_x + 20, card_y + 14), "首次安装提示", + fill=PRIMARY, font=font_subtitle) + +# 提示正文 +tip_lines = [ + "由于未注册 Apple 开发者,首次打开时可能会被系统拦截", + "请右键点击应用图标,选择「打开」,或在系统设置中允许", +] +for i, line in enumerate(tip_lines): + draw.text((card_x + 20, card_y + 38 + i * 18), line, + fill=TEXT_SECONDARY, font=font_body) + +# ──────────────────────────── 底部版本号 ──────────────────────────── +draw.text((W // 2, H - 16), "v1.5.18", + fill=TEXT_TERTIARY, font=font_caption, anchor="mm") + +# ──────────────────────────── 保存 ──────────────────────────── +output = bg.convert("RGB") +output.save("dmg-background.png", "PNG") +print("✅ Generated: tauri-app/src-tauri/dmg-background.png (660x400)") diff --git a/tauri-app/src-tauri/tauri.conf.json b/tauri-app/src-tauri/tauri.conf.json index 8e92b7c..2f8f23c 100644 --- a/tauri-app/src-tauri/tauri.conf.json +++ b/tauri-app/src-tauri/tauri.conf.json @@ -70,7 +70,22 @@ ], "macOS": { "minimumSystemVersion": "13.0", - "infoPlist": "Info.plist" + "infoPlist": "Info.plist", + "dmg": { + "background": "dmg-background.png", + "windowSize": { + "width": 660, + "height": 400 + }, + "appPosition": { + "x": 180, + "y": 170 + }, + "applicationFolderPosition": { + "x": 480, + "y": 170 + } + } }, "windows": { "nsis": {