From f8274855977530963c3eac40b4c2d576ed06ee8a Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Tue, 29 Oct 2024 01:04:45 +0800 Subject: [PATCH 1/6] add light app icons --- .../defaults-light/blissfulBerry-ipad-pro@2x.png | Bin 0 -> 1907 bytes .../defaults-light/blissfulBerry-ipad@2x.png | Bin 0 -> 1840 bytes .../defaults-light/blissfulBerry@2x.png | Bin 0 -> 1487 bytes .../defaults-light/blissfulBerry@3x.png | Bin 0 -> 2077 bytes .../defaults-light/bohemianBlue-ipad-pro@2x.png | Bin 0 -> 1968 bytes .../defaults-light/bohemianBlue-ipad@2x.png | Bin 0 -> 1900 bytes .../defaults-light/bohemianBlue@2x.png | Bin 0 -> 1520 bytes .../defaults-light/bohemianBlue@3x.png | Bin 0 -> 2028 bytes .../defaults-light/burntSienna-ipad-pro@2x.png | Bin 0 -> 1938 bytes .../defaults-light/burntSienna-ipad@2x.png | Bin 0 -> 1840 bytes launcher_icons/defaults-light/burntSienna@2x.png | Bin 0 -> 1498 bytes launcher_icons/defaults-light/burntSienna@3x.png | Bin 0 -> 1994 bytes .../defaults-light/cherryPlum-ipad-pro@2x.png | Bin 0 -> 1968 bytes .../defaults-light/cherryPlum-ipad@2x.png | Bin 0 -> 1885 bytes launcher_icons/defaults-light/cherryPlum@2x.png | Bin 0 -> 1507 bytes launcher_icons/defaults-light/cherryPlum@3x.png | Bin 0 -> 2003 bytes .../crispChristmasCranberries-ipad-pro@2x.png | Bin 0 -> 1957 bytes .../crispChristmasCranberries-ipad@2x.png | Bin 0 -> 1806 bytes .../crispChristmasCranberries@2x.png | Bin 0 -> 1518 bytes .../crispChristmasCranberries@3x.png | Bin 0 -> 2134 bytes .../defaults-light/egyptianBlue-ipad-pro@2x.png | Bin 0 -> 1911 bytes .../defaults-light/egyptianBlue-ipad@2x.png | Bin 0 -> 1852 bytes .../defaults-light/egyptianBlue@2x.png | Bin 0 -> 1492 bytes .../defaults-light/egyptianBlue@3x.png | Bin 0 -> 2108 bytes .../defaults-light/flagGreen-ipad-pro@2x.png | Bin 0 -> 1887 bytes .../defaults-light/flagGreen-ipad@2x.png | Bin 0 -> 1744 bytes launcher_icons/defaults-light/flagGreen@2x.png | Bin 0 -> 1436 bytes launcher_icons/defaults-light/flagGreen@3x.png | Bin 0 -> 1949 bytes .../hydraTurquoise-ipad-pro@2x.png | Bin 0 -> 1887 bytes .../defaults-light/hydraTurquoise-ipad@2x.png | Bin 0 -> 1796 bytes .../defaults-light/hydraTurquoise@2x.png | Bin 0 -> 1402 bytes .../defaults-light/hydraTurquoise@3x.png | Bin 0 -> 2023 bytes .../defaults-light/peacockBlue-ipad-pro@2x.png | Bin 0 -> 1976 bytes .../defaults-light/peacockBlue-ipad@2x.png | Bin 0 -> 1792 bytes launcher_icons/defaults-light/peacockBlue@2x.png | Bin 0 -> 1481 bytes launcher_icons/defaults-light/peacockBlue@3x.png | Bin 0 -> 1988 bytes .../defaults-light/shadeOfViolet-ipad-pro@2x.png | Bin 0 -> 1896 bytes .../defaults-light/shadeOfViolet-ipad@2x.png | Bin 0 -> 1796 bytes .../defaults-light/shadeOfViolet@2x.png | Bin 0 -> 1491 bytes .../defaults-light/shadeOfViolet@3x.png | Bin 0 -> 2007 bytes .../defaults-light/soilOfAvagddu-ipad-pro@2x.png | Bin 0 -> 1958 bytes .../defaults-light/soilOfAvagddu-ipad@2x.png | Bin 0 -> 1879 bytes .../defaults-light/soilOfAvagddu@2x.png | Bin 0 -> 1525 bytes .../defaults-light/soilOfAvagddu@3x.png | Bin 0 -> 2146 bytes .../spaceBattleBlue-ipad-pro@2x.png | Bin 0 -> 1919 bytes .../defaults-light/spaceBattleBlue-ipad@2x.png | Bin 0 -> 1805 bytes .../defaults-light/spaceBattleBlue@2x.png | Bin 0 -> 1517 bytes .../defaults-light/spaceBattleBlue@3x.png | Bin 0 -> 2144 bytes .../spreadsheetGreen-ipad-pro@2x.png | Bin 0 -> 1928 bytes .../defaults-light/spreadsheetGreen-ipad@2x.png | Bin 0 -> 1774 bytes .../defaults-light/spreadsheetGreen@2x.png | Bin 0 -> 1453 bytes .../defaults-light/spreadsheetGreen@3x.png | Bin 0 -> 2100 bytes .../defaults-light/tokiwaGreen-ipad-pro@2x.png | Bin 0 -> 1922 bytes .../defaults-light/tokiwaGreen-ipad@2x.png | Bin 0 -> 1837 bytes launcher_icons/defaults-light/tokiwaGreen@2x.png | Bin 0 -> 1478 bytes launcher_icons/defaults-light/tokiwaGreen@3x.png | Bin 0 -> 1958 bytes .../defaults-light/toyCamouflage-ipad-pro@2x.png | Bin 0 -> 1873 bytes .../defaults-light/toyCamouflage-ipad@2x.png | Bin 0 -> 1832 bytes .../defaults-light/toyCamouflage@2x.png | Bin 0 -> 1467 bytes .../defaults-light/toyCamouflage@3x.png | Bin 0 -> 1957 bytes .../defaults-light/tropicana-ipad-pro@2x.png | Bin 0 -> 1924 bytes .../defaults-light/tropicana-ipad@2x.png | Bin 0 -> 1835 bytes launcher_icons/defaults-light/tropicana@2x.png | Bin 0 -> 1470 bytes launcher_icons/defaults-light/tropicana@3x.png | Bin 0 -> 2093 bytes 64 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 launcher_icons/defaults-light/blissfulBerry-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/blissfulBerry-ipad@2x.png create mode 100644 launcher_icons/defaults-light/blissfulBerry@2x.png create mode 100644 launcher_icons/defaults-light/blissfulBerry@3x.png create mode 100644 launcher_icons/defaults-light/bohemianBlue-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/bohemianBlue-ipad@2x.png create mode 100644 launcher_icons/defaults-light/bohemianBlue@2x.png create mode 100644 launcher_icons/defaults-light/bohemianBlue@3x.png create mode 100644 launcher_icons/defaults-light/burntSienna-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/burntSienna-ipad@2x.png create mode 100644 launcher_icons/defaults-light/burntSienna@2x.png create mode 100644 launcher_icons/defaults-light/burntSienna@3x.png create mode 100644 launcher_icons/defaults-light/cherryPlum-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/cherryPlum-ipad@2x.png create mode 100644 launcher_icons/defaults-light/cherryPlum@2x.png create mode 100644 launcher_icons/defaults-light/cherryPlum@3x.png create mode 100644 launcher_icons/defaults-light/crispChristmasCranberries-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/crispChristmasCranberries-ipad@2x.png create mode 100644 launcher_icons/defaults-light/crispChristmasCranberries@2x.png create mode 100644 launcher_icons/defaults-light/crispChristmasCranberries@3x.png create mode 100644 launcher_icons/defaults-light/egyptianBlue-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/egyptianBlue-ipad@2x.png create mode 100644 launcher_icons/defaults-light/egyptianBlue@2x.png create mode 100644 launcher_icons/defaults-light/egyptianBlue@3x.png create mode 100644 launcher_icons/defaults-light/flagGreen-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/flagGreen-ipad@2x.png create mode 100644 launcher_icons/defaults-light/flagGreen@2x.png create mode 100644 launcher_icons/defaults-light/flagGreen@3x.png create mode 100644 launcher_icons/defaults-light/hydraTurquoise-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/hydraTurquoise-ipad@2x.png create mode 100644 launcher_icons/defaults-light/hydraTurquoise@2x.png create mode 100644 launcher_icons/defaults-light/hydraTurquoise@3x.png create mode 100644 launcher_icons/defaults-light/peacockBlue-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/peacockBlue-ipad@2x.png create mode 100644 launcher_icons/defaults-light/peacockBlue@2x.png create mode 100644 launcher_icons/defaults-light/peacockBlue@3x.png create mode 100644 launcher_icons/defaults-light/shadeOfViolet-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/shadeOfViolet-ipad@2x.png create mode 100644 launcher_icons/defaults-light/shadeOfViolet@2x.png create mode 100644 launcher_icons/defaults-light/shadeOfViolet@3x.png create mode 100644 launcher_icons/defaults-light/soilOfAvagddu-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/soilOfAvagddu-ipad@2x.png create mode 100644 launcher_icons/defaults-light/soilOfAvagddu@2x.png create mode 100644 launcher_icons/defaults-light/soilOfAvagddu@3x.png create mode 100644 launcher_icons/defaults-light/spaceBattleBlue-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/spaceBattleBlue-ipad@2x.png create mode 100644 launcher_icons/defaults-light/spaceBattleBlue@2x.png create mode 100644 launcher_icons/defaults-light/spaceBattleBlue@3x.png create mode 100644 launcher_icons/defaults-light/spreadsheetGreen-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/spreadsheetGreen-ipad@2x.png create mode 100644 launcher_icons/defaults-light/spreadsheetGreen@2x.png create mode 100644 launcher_icons/defaults-light/spreadsheetGreen@3x.png create mode 100644 launcher_icons/defaults-light/tokiwaGreen-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/tokiwaGreen-ipad@2x.png create mode 100644 launcher_icons/defaults-light/tokiwaGreen@2x.png create mode 100644 launcher_icons/defaults-light/tokiwaGreen@3x.png create mode 100644 launcher_icons/defaults-light/toyCamouflage-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/toyCamouflage-ipad@2x.png create mode 100644 launcher_icons/defaults-light/toyCamouflage@2x.png create mode 100644 launcher_icons/defaults-light/toyCamouflage@3x.png create mode 100644 launcher_icons/defaults-light/tropicana-ipad-pro@2x.png create mode 100644 launcher_icons/defaults-light/tropicana-ipad@2x.png create mode 100644 launcher_icons/defaults-light/tropicana@2x.png create mode 100644 launcher_icons/defaults-light/tropicana@3x.png diff --git a/launcher_icons/defaults-light/blissfulBerry-ipad-pro@2x.png b/launcher_icons/defaults-light/blissfulBerry-ipad-pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d93367255304d3f759ab2b80749ae0fd828e7af8 GIT binary patch literal 1907 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 Bi`D=D literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/blissfulBerry@2x.png b/launcher_icons/defaults-light/blissfulBerry@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..25c2b3e9bf78cac01b9548a299450e8fadc1f0ca GIT binary patch literal 1487 zcmbu9X*|>k7{~vL!5B%ZaaEYeJt|9)W0)~Bu9z6NXb`K+|bXJd^P1xteg01(AukT{-)@kAB^ z@#gRgw^g1AlQ2#}03agqxA=gp97$ft7lcEb0F^zmOT2^sCc+8<0IyR-xSj$4AmD{X zBJ9X~oLnoS42Ls~f+b0()I{Xf zsdOD}%UGoeS~5y7lV;b4!jcYBGJp25?!HXu$y~`=Ik2$qyhQV%EEp~rj&wb!+S#A_ zy~O49W;raEy-i%e>kVw!)bJ^f0cp1Ya~(iYCXyy<%m(Fq9sUpTPM6B;%1Z$U%`{iP zg2hfTi?yzW=&4$JfBZY&6+KS$WnUxIFdJ0innvK$YB+HXa0ol})N7j2j&PFF+1_fYcLCxoRcM^-TU)9T=oVvG7JTlWB3qO2C zB(=KnybGE02{lRma`YvbovGnJ-q`WMI6$N0w7h5E_1(Q&D00?-c-NYE4*e*+p6Hw1 zl>*W9`Bgf#!YghdE!iu2&aT*(Eh&G8|4}MESaeLepC*=kY7f@rNypurFfs{j552q; zo1WO8+NPmZ8SENtKshvO)Nt;pny+#B+(eV%$Prc%tnc9k7>2W%LbZ>YjB7rs=G3X& zk6)IE8TG)NgANyq!rcGy?a1HUl_P=HkK{Y&ZTP74c7KPqg^*Nn*8Mkc@=>@F8l-gF ztT}DkBuLa5ctF7CjiF%iXATy zsAF3uESWd@OFR2A6!4pg)e{9{`8ecV8BSnq`jvClR-jO5QZ-Z+l;!M~!5R&LoIGAG zb}S~V+J}MinVtIDIv~eyPI7^}-(T*G9*Ik#51CJ9*kjx)KSa^R_+cdI0sTPmFkoS!R;Ru zTYjVZgEFSeR3s@eklq}b_i!RvWgV(kuRpINCBzx56a|?={#C)qS4ZNP?;?a8Jy3?o zs<#RVf*r;zYMLF*?vqw)Dca66K#nmHT#odfe*P~v>J{|DDO-!EjXh(!L_e)8`vHn? z!4ocoOL1glB#|dv1qz*-4XylO_{|_ARc709P?K!;R&2U!K;WHgw`J0b5bZ;57V4cu zT}X_i@mftnx_i~@2vP3dWdrli#* zArs9g)>Fd`+{-02(=0I*0X26MCD+XD`ToCiW`4bMzVCkL-gAH5@1A?JJUyIMm48$Q z0062NFF0P_)0#b2fB)TH`~bop*pnY{7ku#mfQrU{sQ@T^ti4xMz+ZO$2~ggvH@lbY zN1t^+3jlC(Rknha003a+MaQ#Ohzc@^JLXWB9{&r_(3lp<<`@TEGFC7$RfxRYct~xo z^s!wUS{~iBFX6MkrBsv;>_2~ywm(VTP|5HIpM!I0-xLoXY1C_Xe7uXv^mvGxS?DD& zH?~`tp_P9R;>;#w4n3L<>se-k!Jw#*1}Znxr*|1Xx&UiORonj$V)hGG&{5kGh^?u(^^{J7omp zbbis3kp3BZn{+?jVFpBT&IoK&Z;aDjZLRbBrO)XxBP8g{yGy7`xoH$QiZ5GQ;BN_X ztd=LM-TDU1=fQ|w$Tnt_*1(os9&gP8r^DcQrh^@=Ijt%7aD0*~dCN^cu_T<9FgPeD zEcf%ZCNm_2z$AxbVC26tz0JKcu-7&DksjpJ#>x##@HunDMyxXG9Kb(u^_LbOeu)#3$Gq2oC zzrrOXsUAU94sSl)KN-{rLBf}(!nbK8N7;pUwEx1Wli_N$qAFd z81SaF zICeY|elGRKQhzOjb3G?H0@FT_?BtCEkva7Uv9=-D&9dqn2%}oW%Mz8F%4U8a$QJKh zt%Sywv`l;8G~%;`1+qKhg}G$nyaw0Rhca*fG9w|VU zbz;MbDFmYNlvM5!_d+f3UsU#{W3RtvoxarJ>nWF%`Ao^vRV%52>&jC?vk%KT`vXOf zmGQq3o-YiJ>K$V9HmQ`%dQIr!eDJ8}%54~5^Iju4+Cg%6VYSVU)Nc%&A5b&k^C|4M z4{JSUDE)!nPiyGq)S|xeF<2zEAM$;T4PHHv+BZH5iPVjVY4EDSFPS|_$mnKUL=3Cf zYN+ICByHAFMa7Qs$7hlPwCa0ouRLn1`qAG>KcsJU;#`ZSWw8wrqsS>6PxB7p58r#S zyBJksd23NECBNAg$)vMouxr75KkDWRT4P~NH|7?djpn1%m52FLm^hsdod$>&au^hd z9j-%D*9X6x)IyFpjC^amuYGmI`t06>w0e7hSJ%e0x;f+6uEe3jI`zGE8XUWiB0ucU z6}{3=H&K)Fa)PE*Caj8JS6=&uQnD(2E!KV&8Q=!%`#1=%cWY!vrOjjILA1C{D+nUq zUWA>j*Lly)?q*|gea++G3S!50v-nuupdxoMEJR^=+B8;OT1@< zqYDR1U;5tM4l8HXRu#&g`Uo)c8)tS0cV0kkD_`!q^iF_cq$zB$uy2*Y&Nrw-ns-&I$em<0;*B zfhH9h@G6yAy*5lIx_0D_J_ML&`t#(clabW*4`1CR45g*bvbXL5rSmm$p}+E6TP2g3 z3|b4q?tPz^4g}r-Idk3hP8{xVd~ND=o2VOusrUykTwl2hAYpF^JZu=sZta>W5Q@~Q zk?4`i+TZnfC^|($`2l9J_`T~=s{15jxxXXT{Sd`IurRb+=ZJ^pTJkUaJHHdKJ;2we zIn%CYf%GOXR{J2Rla^c0$gOSg!5wv3LRLhLA4OnX)lD|oGK@%=p=5~FFlz7WI2FH} zmgZTFv373fI|(#@E0g&bcvybAE5xhUpwbWI27v5l$yY z!J{~psfj#>d(nt;Z*jzsHVu90L3oGHid(gXiO|(3v~u!qzoq>ZEB@50ztXUbXnhlK V;|#+t7PQmY;Mf*hKjG6s*^9n+QAnX(aYUybte{1%)qtyKUq6F ziMp<$N|l{E*LPUgd$@akQ0mdD^@+fEz@WLGdV8Zx(j}2Jc6FXuilbly3zAujsANU|UjgO#o zoMPNTr4+UQeIjqvcsSJ6#T>pyyt9=$(~i7J#n>z2iK#ftXu_LI=%Yt?XoOV!EVE?b zN6rpK0{HB*(dv4j;e3tzc7xyqer_#KV?0%j1kqCAB5;QsZMVsTjf2gjnhtJY24=;I z7sA#YUS58Z0@@BXOQTQ}XgaeLB$?-%_K}c*tk& zW)LVEGo$|V;^2b^0e_2GFdPfS8Ae{52evx8xD1Q!_9cgaT4)|K@_5DH{G9r9L?Z9a zVy05;#|>_`OH35j^O!xciERXUK3Zh*(a>2dLjR5_Aksz!qzmr zB1-P(q2BJ8z^;#R4~w!ZOmOpqU~QQEtXD*|Ux6r)b(~QS3@P?hK`lw*=lEU-RKCf3 z^l3a?CRq!tg8AR8+y3fh(2j1%fZRK^Y8{4E*snKs40k5;jH+~UaOx3ADJaUiiGAT7 ztY-CDxVmActI`G9?=r4WAE=YBcxLE%nAzOvq~d^=wNlMb@yLp<74-X(S!!g5)}I;L zV<`3FN|T#s8H`T3)^U4^Z^(EQkWt)F1e#7`NeB+}aK)jF$1a4Aw+6P{&{K`E7w(CQG#{La*g&57Aup9yc7D18Ru6l6|26EgbjS zzAyhSx_h05+UKns@sWy#gfV$&y5Wy*&9U)7k>kO39h$9SQ$q`JG04Yl99qOxEb-(^ z)gv>F>FQm6kJ5Z^lhe3ZF-4jeho<{%(Nj(1cj^_8%!VnO;c44fHj56neh1WOBzSY% z92@}(Y~0hjMUJd!_xi}8PC;RlhuLYxB*BN?U^V0;1)fVvA)lU4_P$0MKG2hll}>1T zQpGMD)V+)7@7v5^WZWh`%Jq=xz;KkgUKfJe(6`JGBk@&Y%$WKm(>+Pn!^$!I3Rn!Ia#nlcRGo%t&(%)LfI@;5kKNUuxk+k%!>zv_j+wlPdPdpC^1Smdz}B39k+|8Eq?c_T|~4VvA2#Uge9lEuyu6OvUwp8mZwWa3T4kqkRsKvgluM z@&gHd2Cre)(@AZv#m1?hC6E6e^AHAY8wsoM7|o-8Sy+18w{_jo=QXW+yt&BGfAy@} zxds>&)V6r) i?0q?xW%U<=XNmSa+>gHKzb1UJ07pAF+XkC}azcO_xe0#+QC+87^$xAU|^d`25F%??xC_ht(NKEOs7jP#I3Vm&ahB z{&gS}s*a4V``Fl&2)_-rzDai|i0Y=s#^`92t_hQJsNL;jE{nA@YW_FL4S~LuOtYe{ z@)1Q)%-J3VSapu7z11X37ErqaO3&MHbC)fU4k>5vGzlMFH{H9}7jj;Eq9W)C1u};^ zz~QKMA`2MfP4a9{g2LYTL>4Spua*P-3FcxkD%elbR6GXed@$9&6e?7*OHBqM{ z73#6MmBNIt4VS_LgRZ}G*t+2Fe|ih#(TkzsKc*6h)g4w7K5rD!u%kf6l&)3Oz8Zk@ z#{6q3=`im_4~AGUOeIBY`|o6>IgtaK0xzk@J=@MdrrE@k;a>!-jaAOT1Xb`&7d5$`{j}=MC95bn}Ap6@(n%%@Pi$yF)*`#v!U zdij(k0%&kq(%SqjKKN{@SQl!8I5X0D!JPXVxLLMXl@Dt$Zb`bfQ)mJr0kVz z{X;iC%bHtTkdumFe_LY%?}AfR!R_>2l5Ude#qMr=a9HjVW4Q@hTCvK*WIq)Ei^Lrl zS*SEUk^@)VArFQyv1)>2x6D3md9LIW^P2MtJB_HEmM6MnwO;bB80P=d(WA3BAjqY2 zvluM7iDugj*KfWNd+%%dJqP-nb>%|F^f^CI98Ho1K4^{J44ufdau43x+$>5SI#ldP}6E+;$M=~AU7;cz6R*#WKa5EN9$@MW+_I2Ws0r%$U#;~B07 z?+90AG}`-3+3gp9sxgWKSHrbI6>WeR7b#7!{SC2}H`)^yFG9#sBlH#Nk%hOQ#97qL zXkJLeA@}g`2&r`{ZI75~5>@unvF|NfPw?ev;4bH94klbyW@5>T!1WHco!OCCqQmb$ zHrwV`h5+B_9p^U>&5rM2=k@Y<0SB>I-96755s0&YT$Cj%W+uo}xn9=}=6K}Xt+oAg zdZI{mX1_~NNYLly?eF92Fo^Ry%rel7@j40ihhfSvV5kzqh3RyCWtIO21g zR5peovh*I8+1g4Ust+Y-l6b8oqanIsIZmu}-7tBSkJ?>Zw4?s{>ci=k)OH=MOzW_( z7udGOffG*W#e*Gw5XhvEHpwMW8h^+xAI|;&r0;IZ7De6KNKA{gB*=X#ehXhVKfM-g z@_s9=&v6_S|I!0Co7&Zts9xgOf*+&mGZ1p_p8tQT`abTZN^i3`EsKk@t@Z3y(}$vo zx`NvaB`y&kQbzP1%oLcw>5Jd{e~}(*0S?>A<6G%orIr1sM7|Q!h?QN+s$3232l&3-g6WCSZXzQZLFtT6sc3I0*zo#A!=gu{kV)$!9?$Q){ z9z^N!6O)OoxKnc+=TA?n?LY%lWFn>XUQKLuqdg7QM+vO_-8$3in~`8nDC^09-P-`; z=a|>Ywp24sNxXC`v%?w1&euwf7=CO$b!;-4%1vOY9ZF z;*`5k8q*F@^MWcv=&x%NlQxp&QiSwZ!6yqk^Tc#)jV%KG%JE7K`1Es1;LX7!NZ(gN jH>jy;GM)Y}!{%;IgGl7#w6LjsjsSO8Z%nmw=+%D!YJ#A# literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/bohemianBlue@2x.png b/launcher_icons/defaults-light/bohemianBlue@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe846fd0b395fc2c9ef9be16a0c2b23cfdb9a1c GIT binary patch literal 1520 zcmbVMYd8}M7@ni$utt$P8)2JEib{n#bDK*?56{lvcEdfyKTA%awUF2+I265qb z3(jyUlNN5+^7CZF3YYk4ykcYhEhpP#j+ye?Tu!lJjf>5g1xGR$C+1WsiWn71;{oh$ z0<=u-QB{%uU7i9OpenX%xn86rpmnMFAwJw$hZXBL%G2lIywmLE%COVi-kprk6N5D- zjq$|KU#r%C-DL*th6K9X+cujDN_)KORT=0Qzv->64^d*YyEI1du*cetfKe7z=Fv{Z zy%elH`ubE1PD8)meOF(>m8^8kGS<^rY1WZ*igNUhtk!`-bx&FmSWHXs6nDV!I*C`3 z_An@4l}~-`u%mF-H7R#G8zL}k3K*n<+#kE~r_OvD-?3;;?i8nAIvVMZ`9g7DSmR|A zJo_GEIE!q|vA1DU0=yM#jvXY$mZrCqVK}-JyQ|`_+*NC+E8{yZdU=uLS0gv>BjRmO znRCGT#kVK{Y*(H!l$|IRFGb!mnCYGh3qRI)$iahqpls-z3nlRbIE8I!4 zmHVAffAa|vuYLX05$A|nxoR7b3swC~DMyF1*=I0^EQ1fQir4b93QdNmy&E$yPeJc# z(#1{r22=CcMiS@X_R`4Un+wX()~g@1uAGT#@{K7y1c&5LCi}NfD4t^&+m^`<44cb7 z=hD#k;$l5ttolus>PJ5V4w+vQC2g%zf*+x=u!2Gz5lSE;uSVz(sE=3<8#;jsr}d#N z!ZPgZ@3TndXtH};jgxq}tDV3!5ev_C-M*lA6~?@*pQ@-}{Clbr8OaIl`?2YGt%{)@ zw3z$WaFq7q2u#zxJG3`$W28x$b5lX3Q2RDvQMTd%i6dV;$*k)|I7~lXD6b50*DBE} z5F7TiL2KVuS5lm6s3q&I!hx`VA7haYqH7H3o2kZp8NVp&t~mmcp{9DCA}-NJ1|trVOo^M|u8HsX zv>={nti(fnQ1JAYVC7EfUFZXJKE}{UP~rwr>Ns6>iyVwv?c$f3c}WwRWAD)ENqfl; z8{=OC?yEW-DvU{D{>L_aNI1P3J5kfg*hY8wJP_T`Zy0f#B$lP82W2K;IHDbV7Io~G zf;qbZJBZ481fMV?)9|b+Fb{3mo(_fCbF9oE9hsSz&V6qGCZkahk2jWArmDSq9E{r8 z$Ih^|KaZPhsGA?bMFh(e)&@SpHe&*0Vg7mLe%)eygxxIP*_s{w}@LTfWEM2Kt{P{z|2Mw^bx@h^_+$ZKQz0b@K literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/bohemianBlue@3x.png b/launcher_icons/defaults-light/bohemianBlue@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..079477e8d2bb762c89634ac3fa4127ae6fa6c139 GIT binary patch literal 2028 zcmchY`&$wQAH{Kbg&bC^oEnrjW|~-*6$TDxA~r9XEi{!-SB9n*rm3i}w^tX-YfMWK zt7WMpFOZrJNgCerg3eU%LbWt>0u2?Fn{&Uv&-4Da=lPuPdCvI*zUK#jUyL!(3?_A27R@5&%Mk0Ql<@c? zCa)h7Uh+;DZhH@~Hrb1fw7F!lU3ZUurjCKoEVNO5ogdH0E?U7|dZ|LO&s>apJ+oS% zLega_>e2m1_k~GxR7U!+tb_QzyA-CMf2$90K-bvr-vMr3b=Y}%(zd&X5t1JHI2Fuv z`%{|E1J2Yl{BbnR;%(kD0Y0^3`_=v8gN5tU_bL(>)S>oNNU(FWxV~%eK~55qox3y< ztR_dWChEiyGipP!e7!tWGY36$+Dc@K4o1?fhEh;(1 zUVgZPbVbYZLv=>Z-NWp`KCRY}lf#$r6fWnwpM^Qoi>oV1a!!A$yKj&O$`Aj29f>UfKOPj^FB5aD>*UZjg z_?ctl0rpnnugQZfL|9j|0KW1`affP!>vCCb7}O4kU=G8lhNLCmMnX66V@JLC?dmr* zg^3&j^gGm^jI^tYp5>*p*P<1vg@}esRo14^^~Zj9eMxcp>S~2C=k8(#ydhJzkx+ly z#8DhdwUTSMWsd`sji&K^x87$Kjd{|-RMFvH1Ibk6+$u1m>1CXcw)N5z*ygmp{_#e57?sT5_Ko?sypXrJ+v?zg z!8aH|J{lF3{zVU$=<0PK>VNZ&A+uR8*hGy!2$=y7ebiB&snKW}%tlZ1&v#}?Msr;S z;~kyQ*&9qyT3YY?A!?!bbcJ#vcM`H6&h;x{-0{#h$(u@aDm|+H%SWq5CJo|SqDvf# zIkyPeitATCBAk+PdZ+9o`FUV1aW8!Od7w%1pE;oRbC`M0HdPJ_BD)$QW!MoU<6qB}9L9F_|!h#vS=K|hiQ4mV!dw1F)$UjmqOOk8VZi1>oMs{d5RuX1dtt0$Rho)&`Ei ztzq3Y2i-=YxPHqYiP5?wAf1VB>p>nyg}x|DJKi^P4awGfRat~q9d*F(Iy>yUmj0Wg zLLn%irD3~~r{wnuzHQZOP*Y-xwpZPzIaC&XK|3^?vM|PQcAN1R^4YuH_1Gol^m$AY zShdiW2I;4y6#YR5y~geZ?qboySnS%dZBNTcW*yBTg7Sf2;u!1$(G{Oc zmQPM*<(CCGBz{j>G;)QOXPt*-bd8J5FhY0QH!3psGNye)6w!iJZoQUQiQge&N(HtH zpdBpE=vduG&VUQ{VtzFkN|e-o#`GC|%z5`Bu5t3cRo$k_JLYJWwdMi(56Qizhln71 z*-CcjNY!$v2%@t<==LtHkzO5+?Xw@h@%3#opBJ9$>GDPUgz2aiG~t1dxw*26lTa&!6lXTVXOdZuuR&J9ZJ@!>Y9i?*{(dc)}>a(CptpYrsCX+z!q2 S?%Wz@0QR)6$20d!S$_kB|F#7H literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/burntSienna-ipad-pro@2x.png b/launcher_icons/defaults-light/burntSienna-ipad-pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0fd21a6aeed7635f2b20ecf49e09bc03c918c8 GIT binary patch literal 1938 zcmb_d=RX^W8;_z@l2fZ_tGRyK8mCr7+p}9@v}o*2?5(y4p|)6Q53M2*#Wh^ew8AB5 zt2laQ?Nf=-s2R>mM2pMs54hi}d+~j~pXYhreg_6_WeO6$APfKiK;~w~HasTs@KWeB zZ)VC#d-3ROgqd?R03agqKkxy{Dr9&^zGxfMyMV@_ORKy^AmEPW9RPrg75VNZ2mqW> zFgLzqhvZ|?4Fc^0WO}z9!!)5{;z1ynyv{VSEBEaqAV0YO6!#|m{LIJP5UJVR)llu9 zXshsSnv#Fy@3b1kBEimrfbkA26QYdN7(tpj@xMqkmNAb%QaQTI3Gcu{WP9U}QyfOo zE`FK5H+RtIJ1vPig&2G~s8`O9kV*XjJ(U?GAUq}{`Ky?s#Z`Ez2|>NU(Cfl~_n1lK z!*Cr_+PCMzSgu{)z@eZ%$L7=_eL0Y3Ke(w9o86Og;=DW6lG5zM-5p{^yZ$_TZJu4o z>@6{vB7YCrKPjqI*aKly;hEfnNeVN%;j5?RyKSm(s%zN@ zCj>!bGU**Bi0QEu-O#y|AG>{RfiII*u7B^Gr-GUuo!`(#LN6V#zm=3sQdG(lXV28% z-a111(>bNE>Q;WV!dsD!UaQkn?O>y7<>-bA{9I5)Kt}Cp2pfI~rf8 z@}r~HgL5#86*uT-FH=SA)V4Gl@O7xod?`$uq31gpQH{g(9;d(iJPE^JfH9HDsz~O} zb$t`JYn{zEU+Un6#xXn!}8RY*vpC#i9dkU#)oGkFUu+N4g13r1x#;!y6u(4td^l z7(gj9^^SBz#7OKc)RH#5;YQ_2gjNxK*&%&GIbFX!>LSr$h_vWdkcrqAg=15YUvG{$ z7_^S9A==`$EEzOp%Ho(G;c#*3==Ib9f+MH%ynQQwA=39*DjV&$_2Nn%BDS_sz3nP$ zZ`z$8TqQIo;ifWOyVX^gMg41)$)JUMt|d}%ZHZk9*@xAa=I2#M8q*lo)~{gP-idpg z;jwWgju#IWR7YZt#gY(jg#JaTk-$L+i0WSIiE7c!-JTH?3nK{ca7J+@UjiBU52ONF zT2m9wXy)xputfMeEHdYAtw~{(xmZ|UPejh$d&s0Mi)G&p*;}+EU?Blo=CEqSMKpN5yx4E$GDhhHvu!I zsTI~ItwlxpF|GaU+Yrj4%!M!hLgUg8dq>U@H5sZmyx+mSyC4>M;RZx`Y|NH{jCMb# z>+?*je0ectEa;CFLCn-HHdxA%FkvFi&a72QPy;g_Y%(nhiqiz;p3Jdhz(j|Et^l=3 zsI6`JE$9!{;MMwiCn=UUFWQomhz8yHMv{{RCrZB=ID0tD7Zw&vI^0dv|FPB{g!=fQ~O`p*EhZ`+U4Lr8)7RihR(ETbyQl44h1`q4v!MCI3PJ%mgsTbRV#=p zOAhWupK$N6Ozkg&xg-8!9mX!TuFqVom!CS?A2};Oa5u?}A{-Z1aYxwshkH;gi;of! zujbLJws58#hWLNk)l9^%jVBL2yIQMmpo1IG7uVCOQ;7mTrYPmg?w3i`N9Iqk{UC;u zGFuW)_ai>@Vug13%4BXm`nhhn*P~umoKjE1!+8sOSNGni0m?_6tMTOPFbg)?x8Dh} zq}kSxvHH#L{RpVxpPi4Vi3`fo{5w4vOR+02a-Fxi-XEf*BxFh5ffa3rT4nP0QDEBR zF*kYj_bu{yy8>m>@u@d`UO9fkHY-6kd%B?Usd1Z|Am{ZBvX0OPo%q!7{@e1F$2n+V zJbqTN9%t@c_ymJ~6v}XWduA{gS(-J!nVTdK&u}|kPdCHK0?&y{J*w7Xm@0%clDER|dT2J#_!YjQ?Su9EqNIpTcnH S?aI6g1(?IEj2rJF(*6O)N21jL literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/burntSienna-ipad@2x.png b/launcher_icons/defaults-light/burntSienna-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a07bda1fdb139cb54d74535cccfe0336700fe48 GIT binary patch literal 1840 zcmb_dSvVVr8jZTB-B_wr8x2hts+OpTiXxI)sxu6lri&$Nlo}~b?5QHCC8Itic1_i2 zG$}@@#6^?@AwwsYF+><)+c~E{-i1S0a0qCP9tMcU^5v~_q z0f1(*`c8-v0HECOiE#ZsLE*#fB_ES;lK}~#VCh@abmYA^g}@eh37{?CtDniZ)T_1I2&C?b?=-E|T0TbH=ZFf$uePQ7@AG&_Qb(F>l_Qo!bA}97 zHb}H;3~?{2!s>c$+jgEoH}MIvXRFc#_lT0eHVCAx`{IU5fD9(2zrdh(tNPp$iJuyM z#{gnDosm^RkKdgk1u-C^Y=s-rfsd&U5Zs(*H6{L0SrXwD{>Qn~qbZ_*;5Hr1Dst@f z$Oz1vhX_pDIkBURzQ?u9x(T*rA)cmcJTgZdkj}M(mW&*eCs?oqi&KbMB@BE^C4Rx1csP*LQ%vEinb#Oa! zB8a`d=epulTom%2x9a_dP9UdVaTio+K{?w59ZVp#ZyPA2p>k0SxSnF|Dy|cD}_(!gKxrH z7JD6z595(R$<2qPQCBc+?<8FH=(c=sF^dN5ZY64Xevl(aL$5-Ei2Gal&l{KHk~UD zuJ5BhVn-DYa=j+=VwUiCGQ9M!$MHN~LhTNZT7>y0NaX4*E?exI8Ho{Xv78r3U~pWr zjnD_1V=-9DeS#2$j2^^`uN@zY|Ai0aFzKa>|;aw(ne>Z_DLbAxwD<>6e&S}uS{!AZ8 ze99d^{_|S@YZKz&**8q(=B2+C?& zz>Ub-C%#nV#a<64fVzNu`SxOI~>-;6(tpw^f+&WpE} z!wnQS%%W&VFl}zSy#*=I@b!!}>Ec%%)|lk`?T8N=S{xiSqZxaCv_i)^Wm zsie-&se;(t(T_LC>ahaHvM>Gvya8Pr!eFgT0PP%@Y literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/burntSienna@2x.png b/launcher_icons/defaults-light/burntSienna@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..36ffdb63067dc3acc7b13aad8dfaf56210ce39d7 GIT binary patch literal 1498 zcmb7^Yd8}M7{|9m$Czsz*SQRnCX!2p4i?+2xwEk|DlNB)SVpMTv$Qm*9^PlT}Q=<7M>OCSF4|9O9(-sgFr|3BHy1tle+Dggihq@2(W9(#Ue zPcfih_vUbs-}0V`Uqbtm0RXW44*>yL*~)tmNcKP>0Nj_5g}p^I$llo=0C>U#3(xEW z0QQADIoNx}06*rq27BQZI+%k##yXb!P=oMfBdpw@{S@y0)BJ|!7rW8FH@-e z`@vFOI%y<~Xr|`=0tuZ#LNikm0*GG{McX6fni=@&q;Atpi%bjh%j{J#W@5is zk8rYKwUOLk8{NsL*G7!i&XlKa&VJ-4=OEr_U?>2X_4PD$yKd?GBr&&25&cmhYZ>qp zI5+voWPLo;bya~BVx*b#elF??jJPCdKvALsN%+evAI9ZZ`j&T1vaPqG=b`b4R6YI07sh&!_?9+0S)Ybcaox@tu z<>308sz+NrSTdEnNSB_eyxg{57T4Ka6a9U)ztu=kfO;xrF$BWYQG8-G}Z_Q)k$ zqJk$EqwvUoEq;i`@q9VXkY@^x1-3{_Y2tGp;K7UM^E7zHCO{e7R1?|6l!Ay7#~MCX z3y<|Kq zs@m8XP{olEMw)dS&s=MWg%Bj! zH`K70Ep#;7;2c#hq^fTyT53V=?blBP?lL!@I@6j6-F^Ol0TE->p$W~h|Bd14QkwP! zB?Zh`TuY5@l7ECFt>Oq&MPBl0(Zc|8xooTrW#`bjaN5p_>aN|Hk#twsz|>B=EmeB! zZj9GSZrG+b_*po#F86{%1qrLHdokzP+m_#*`;ZkR-n4}{-QM_*b>tA{8X-uVKQCoV za2%WSJFGUw&sQ;4o(8n{8d02%2m9Xhln;gJ+-=mTJihQy%J)RYY(he-hs;$SDrj4| zI!%td{1xhpG1|YTJUO1UctdG3*V1bSXCp`z4XGjNEFRFmlcT}G4q4q*Q|CxBV~fL) zE?EL_zIR3j9YM3Mn_g^`?MmsGKNZK1JHgh$PmV!M*Slqt<)Rx3!uo$4@)Mo(e+@P% YB1kttn0^LQ_No}*;M1& literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/burntSienna@3x.png b/launcher_icons/defaults-light/burntSienna@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..11f01fdde8922d2f5aa3ee524ca5824d8be105d5 GIT binary patch literal 1994 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/cherryPlum@2x.png b/launcher_icons/defaults-light/cherryPlum@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff22b2e6e5ea6e127bf0e8506c2c2b2d6ff8fc46 GIT binary patch literal 1507 zcmb7EdpOez82-77=nx_!j?HA2*90J(XpLQy0PhqM7|20)*Mjkv$HlQjU;rOOI@ zBmh7n(g9(Oj}+nLKM&sTullk84^alAu2>_OW{R52M=pxEl!;|71{gQ$drlV3?vutq z73<6bnUCpmEFz=Qz#5%ZilgM3$wmUKv}DD2kBZXra1=LsT##%?G2B}I^mT0q1%-Z6 zH;7$ni{24DZ3_O9eM+~qmYb6Co)j3kDyRL^KFG;9nub-cd?85+TQ8_a56Yio@qd$o? zjJmS=j)xhQc5Wp~A|7Sk;J%bNt#cxU;A@%(4X|gi85gI|c_lvUNcy2kxw@P|b*o$V+$|tH|0=~79A*W(^Sc4*dWr^GBxsIf6#a#b!s%I0$J_oNupVGY@sy3KX zF>ZRk`}5$>K7yyQyosI(k7!k}f&Ofx0{BRaT_awpIwvFVcjiL>7Bqh9V<%9L%s7SH zJyd)Wu2Hw_)8!z$L2F<(;8b_FqU-|}_@(JbE0NV_M${}lBDeNJtoubh!*d5zFwO%E40$NGs^ zBzC~radR`BuH}p>U;0_t2F2#`(b8<$FXnPOUf($%*X*Si2iQdfHEWhfDz4ZP`+oge zGRqA_l=8^%fJ~(_uAzuRIT#Jrp+`L=P&A9#jN16 zKXyH;BzhC#+py7b3NdTO?~0Y1dIgnbFcCiK$s2-QHG63)xR{c9BwNrfPlmkJk4-VF zGMzQ`HpK5WU=6kJz3|p(t4Y&_b^HEfzY;s$u$7UuAuVw1(9-a@g~y9@_O^mJh)@E`eH4dFh8n{{_LB2wqiFZ8nV5!LMVMXCBj zIR1be{j60ryMOVU%mlK%Rf~OEIGjnEqIoE>janzDOOyjk`7T+6N7uR&zmB pE_c)^QiHLoAa3>nXC3$rENW;9%#BsIl=*_zTSfzGeUb literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/cherryPlum@3x.png b/launcher_icons/defaults-light/cherryPlum@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..56e67571e371c429b83dec2667f01e2c87133a0e GIT binary patch literal 2003 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/crispChristmasCranberries-ipad@2x.png b/launcher_icons/defaults-light/crispChristmasCranberries-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..22a96e76c0d4344300083c1f874e8204e30c4121 GIT binary patch literal 1806 zcmcIlX*3&%7LG}4-#XHYRs_?9QNmPPqZ*ThvD7lPR8-m|TJ)4kY#||Si9;jOK0F?y z+T+o*L^E{6OG*$abEsOThDZ=3v8!dMok{=C`}NNI@!fmw_UAkIewY4}pNF3Iacuwq zpy%c37NGLQU!bY3vfwsz3zgF%dWI$d06Iorpa%H)DOi%2YKx<;K4wX#zpY@IJWzgHD^wI@UE5b#D@I7l8B9nR?VBH; z)_W!O>vL%jvKr_!$O2M*KR2^et;*{X$n&-}ZswtNQTaar4E=TZ2Chfwqwmr(5!SFXVJxEGJlp>9x7%Au?*^Wk`?cvTUE219fh@|NreLxTZ(=dz`e zZ(Ev&k00c0He{iW!$p1 zBu^?V9lq4^j!=h=g4>%4T$&tXr>}xalBR&EYXy4;T9<_Ho7WQ@KBiB&?%z#po(xv* zlK(o&8K=={31WUDu#d#|UG(L5bpe3C&El=@Ugl4BEObmIrPhgV+) ze#CE0BwEns_s5a7J;69;8KnF`l3bN+IlcjD|1C92?g|SaI#IaK=L`n~{1MVpx6|0)C;r#nna{A@E&7$*uD54Yc~oL&#e zk0A0ke?Z%Y*&$u*p++f*cy;!ynBUbMNRZw2_E2{rqyb+k?eQWJ@-pT%nPv)@Hg^l;_xMS)7 zdBnOR1l!@k`z~$;4(5OuaHSy@dSA1t`=;;vG@KLVvKd6@+PKRRW6KB?F{Xl=lD8{@ zQU_(K1GKn(MfoWDb5C!%ZugVEdS^UkPXQYzUs2_RR(S4~BI_rGQ-zoFoz8BZl#LZZv@$KRdfRAkU99QaY~c@qacbBE7L7U3}UU&mUm)aVJmL?)hDK=N!58g7KnE z8f;_NBdmSBg-BFLdc{5q?@|n*i>!=g9$4l`raGB|Se8W*zx$eDatYOu0Pm91qY8w) z6dCb5^KrN-3y8vm<`R$?c85k4s8Dsd5h=ffo2Yt(iMUXB3<8#?>iJ01&*@FXb)s2k zaVB1GqMU1|?)~Tp*-a>%SJUE#?>BJIT8iTHV$wOfA24y(Ropg%E;iwFr*F5tok^Qd0bP^CmBtf4JxghnI-SB8 z*1Lr;MuF4oX4jd#`&KR|{Xh1Rufa!pI{mF`(q=i9|2Hu|0Nh^wkPo>Fv{Ah;fS0?U J8wZKY_zSJ~RwMub literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/crispChristmasCranberries@2x.png b/launcher_icons/defaults-light/crispChristmasCranberries@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ff1e6d8f83e89d46f6baa5c825c2bc4338bec02d GIT binary patch literal 1518 zcmbtUc|6n!9Q|3Q+(bExoyN7sP{@%E#|YC5gK>?7Ot~lHK1;^fbu+FEm1yi3phu_(ewT{2!lcBXth zVx*<(Q4p#vFo@tIokK!t1`JkyI3$~6>un*OLb^-aKENIQS^c#lXQ)(!8Mazs_;wE? z9(?3Bu-?4ThgPZ_L`$Xf9S;GO}U^ zTzZtHZ(}m2`geyC{YJ^0+r^mCq*>S2y(l?#?vE6ESPVYiTq^`BD)^@>BMm#?*N1Ie zFj`G$DtBI+VP?3RuWvg+TWKx3=@wyi70zo1-ljf6Ly(~U+CcbENcs^(?UCj4b!pDX zzS=M_e(X%RN}4jHLzE?aKmw&NGRiF>9Ok&yW{MHY`pwo-(LO^5(mL<8DY&+4urI;b zES#XM{IZ9~qIKk9IIoR$zX+OCC_~defx4YpifPAGVRfsF&T#94d>Nt@jGc*gRWK_J7dXpGug+y6 zqm!A>qihtL$W4vp(i!_ODord!KkS-EyLa!afBgNFiwLOD0v_NU@QG0NgBPQtsR2Uq zgq$Qr1)8Ndo>G+$t;s1m{H&K_zNR877S{rtCB%bGb-6|_8cUc+(jxhuS8?ilI1E-P&n z@kB*lHH$luc` z$>Bcc-hfjP>;iyTp-+0L8x7Ygzq+8G>m&bzVAR zk>J=ocF8#7Q#})bhJK%avQcCpM^zSV2VIrS$~`;i-FbhXh{~I)a}JHO%VtUo2D9j5 zhb)f&tAdGD!fEdaW=3j)CTrl>z7s-`{mHmF=e?L)CnF7&l9eRx8Kc-A%R1WnjnTBS zXqJ+D%l^8_3jN~Y@?2UW_w$pw!MW)hEfLdJV0U|{yvQNRB7yjcZe!HuC0>eVT4r~e z`IFd`XT0n?6qJ-;hca#RDqpp+?&eSW$%zsYCxT_yM~C8Smae$lF%e%C==h?sARW~r zUN0sdevxADUN8pF`7;rhTI!>|5#cY1$>&lGpOwc>k=E6>oT86Ph^v@UVC=LVP@09$ zud32m4!6(KCvTc?r85wsjw%H)G?0(Yr+W+edsaxmz>uG%a4Q2=Y~U|J)WR5ta@vJfUU}I?uuQm5d`U}Er!cPDI literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/crispChristmasCranberries@3x.png b/launcher_icons/defaults-light/crispChristmasCranberries@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae612e4372449f435d93b8b842a85045a4a3b3b GIT binary patch literal 2134 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/egyptianBlue-ipad@2x.png b/launcher_icons/defaults-light/egyptianBlue-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9274e3075b9bab63b6ec33464dc54685e96c20aa GIT binary patch literal 1852 zcmcIlX*3&%7EYIVb{!$Lr?zx3XpwicXsNVGq?Sg~*h^kc2eEW8 znpz(+2rV77mL`mF5U;h@68loBP4F`R=ly!;{kZp@``v%{`|fvBucF*l6m=8<0Dy|8 zhs!lt&67p0yqqk50eC@VMIqV)LjVAjK!3#%0J}g-1|A_?b9VyN^y`Ub&GB%@D~eB_M>_p>l9hCtMa!X6hMXxc zTX{3X8m~Q|AZb#B8Dv#PJ$~MGP$}yk}&mzhT_^F0YyhL6$*_&_O8$eX~;#5ya6*< z@pYUNr-zREp9c=>F`vYfhrHni%4|YBe^l}mydQr!-)h2-!^ub77l$`JSg5O<2uR;a zYzanuYDr7h{gN55nSJPgD6~q108_gk*clAXK?r327ma1#Fk@$|(rCh#o%Gf4;c^qD z=3sKP!Yb(3zTI@qNo$q1MK^a!VJOtN(t$h^W^OmW6!kFY1+UJCSI4})MkAqfKPs}* zS6=D9;r+|%M!*E6OaUz?{YYBdUqYc(Ux~{N!&A#k`DGun#=kbt{dzQlAu_*FaqnO$ zFg!J{$Jh4oGWZnCt2i%J*_wH0oo1@QeCMFkZx3Qx+U|yLfS=fK2~7n+s8J`1>nef; zh}b~LSQ_)v+k4=eaZ<6;#d?TN^8PPAD$;~@_ptlHRoeaBn&SzVL2)?r@-nLa3R59) zj|u#?mS9oBS}qR36m_p>bxk~1cHLl3n*tLHs_-`Uk7upt>Otaz=i06bee|0ta}(K9fONXk-W>tAY`!!-3NyMWh_KFg&Z#_jHn`4qfwmx&{0?!bkS7wBukCr=L<~A&KoELbZGp@?o`ogx5K|}5EsBy z3>&DMLp3Cet?xfg%0Iu&fQ&V7JsO{!eSCCXIE}Yc18I_EdKY$&;ed_aywG?7{`4LB zqJcX|>VNm0yujHk)`(Vc^kkxRvL(2h$~`ul30gwryo3V_Z(G5t@YUGzgD9J~6_t{R zbEP}dA(nHEbRzX5R=|W_x6a8$6Ki7NBj2nt^6d9}9|m3ihevJ2zU0ny*N4J$2;_BPkk z(Qi=r@z8$o(||YRuj9TD4Ae-I?df!)i7SUKV?PpqDsR*4TZ&GR3{6Qg34(3Iy3ACj z*IAlsl49a&&yW`9TrRmAay{m!f5eTw^*wQ$L+=(SY+3)ADY3j}QS!&{oqvWxVf3xl z1y(|#pPoo~IG*K zTM`ME&)%Gm_)Jx&V35h;^9PTsbNUs3^SWX2e>41jrCtiZcG#z}P4?^no~|gD8mF5{ F{{gqhdy4=7 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/egyptianBlue@2x.png b/launcher_icons/defaults-light/egyptianBlue@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..87eded075e2df1bf536a0898081a3c2ed54ada20 GIT binary patch literal 1492 zcmb7EdpOez82%B<%q1+Ba>?z%Gr8u@+1XrXGHgj18!~6&M3F2@sMeZWtXwJ|u+KJV%q4FC{@e;@+f&r=qfBGEV$5~vwcT@(s2G6I7Dfco2z?I3Xg z5I>7{LU>a|1o@ayC|S8rqXchqc=(zDIxAFm0#`>bw)w(FQqQ8P>yK!Zib6W8c?Q$y zU`0kpd}TUD8)Q-HGXy0xlCiYnT!$>waTd{`6DSt5yV@#pXM#k2I}y){--RoK#*z%T z9>gx>e+-_A-#A{|`%REDfV5?vGA>~Uxb``6WC}?8y&CrEPl()I0o*PDx^{_7wV(gH zJ>y{7+nA<=+e~oo-;fQ_oUE;my!pCSRxQJStRqz89ASTFeLN~UXqw7~tz2-Az36VF z8ogG%w@htZb#h0uSZ%r|%u^6cm)2C8Lwu*dS7}u;@3whl7ka`|o7L-YfH@i8HfleF zis|KKFGLEiHW-2?l!o${kr0g(aqjdT4F_UQv=Z4*>nS$7Xw|!Qy*70xO50Y`(%EiF zH>YM>;i`AqO!r~fP6?46#u@966-w)f=>)A4FN~9a@jlMV8`+uT<+is&BVc$eOr_}b za)_tm^DB&C3OQx1g_OK`s162zsB6lm{)r z@nU7kn7k4mYpkMOOu4F0q8}3J^gF7?ksK^{<1tNu@I}Q2Y=y2T@%vJ~Sl@{I zV$X=C%@&5pF7h#RLBWiY&?R%lT{}wJl$mb1`b0d3_CENH%xtmtaFUs}J3ysIVP3S7 z((s(W5Eg;eTs@hljtmc@s&I=`ip>v`UWh9MM4{0T+2W|^m`bgEXsZ1sO-b4<=-1I} zioQW^X7lM|2F)lxNLWFocp?u+)UjU2di6Y`n74T;oPse1h!@NPH;jmFBnfrcJBcE; z3I$qAT<_-5O2IX#JWBUaCit*TJT4}as9m;7YxQY|2>`v(?#P2Sv46BKDdxHa8gtbH zZzM$evzIJYjuOBWcSlI|$uDlKgd_LMd{RF}6jjrwEbmb#JeuDGR)cFn)I#~X=V2S| zuf}6US?BDPQgXrJqj-{JSKkx2>j(5ZLUvxSO)|1x>4m+cPYJUb{Gyu>v*seanalY}mj*$nsd;a(FaEuL>62tUN7-gD z3{eg?PM7gneV;Im(NWcVz{5&$-G;*Ek92u=D}qsF4XT{p5Qop1(t4nF`a(0;#S3OL zy_ZD71U$uGk++mU;Y0-{fhO{N1M%HBJ_)}a2a*tQYotMrs{gvW#B!PBI{)FpgTDN6 zse#=iaXnV@D`{YktBL#Iwvt~kZFug3#*2a#f>%OIudUbVrV^r@+E06*AHzE@=&19U z;VJPJqUjG<1o;Mqw#b^>@*p&d9P_8u&hoLQLrqN69-Ze4--zKN63w&U0@FD~dfGr(P~I{1`+|SD&slT-hjpP_l_BS7W~w z)4=qH&YM1OQQ#>USHVqj))T|^K?vpuLemcWus~UsL-#LBONZS=!MQZ^hxblH9uab1 zA`5?0%bA^QJy4d`I~%aM+f_J_89BvQGv6fL>Q1#2RPoKFZd(7arvLX(C62v{gCT>p SGOUD87(hFFIMpBnul)^rG@}9l literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/egyptianBlue@3x.png b/launcher_icons/defaults-light/egyptianBlue@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c5aa223788d4046f2874e841927a03733f4138 GIT binary patch literal 2108 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/flagGreen@2x.png b/launcher_icons/defaults-light/flagGreen@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aec04beb07a02c5d48bed6ad3d716d8bce8eaf41 GIT binary patch literal 1436 zcmeAS@N?(olHy`uVBq!ia0vp^l|Wp*E8lh++>{chQX_hLDjlplB~l?z6Hb!Z*cC}xZ{WOz8YQct-q}9)K9qe==_Ta|MPk$ zzrL9glNbKQ_{4XyMYZ{M9p84&dwRZT=iL9d*3^h?f9vMsS@-*0=bl;nGr=_w9X3hHg^y*@t3+}QA|`qQEB zmOHE8Cq=WEbNMwaKc9c9x&6A(daYXl`adIooR7J^`b&fG`KFAklTJ_d47IiB-1+nT zMGHscRjU5J{oSkv3P*BXwX;+gi)ZikQEz;|T6F8A)$`Mi2+i8RKI-Hw{d!Lwofmsw zt(a;f&zGUIu(IXsjneLp#mQ0&pNI*vRJ&>~OS)d0c;?4}e+x7EUD+C{6`x(Yv9GMa zuXaU*(ApUjVmPW#uAIEMlbbohCZg6x?4IAtj@0j(aa#iPcUEjrS?=F!R&#!JylPf^ ziB4EX+^P^=Nn4fP2P&JU+114S&zh2TQaSusv|U#2(l0?3+?GW@nljwiJ~_Cde9L2@ z8DUm_R$JWp^)%!H*SoEK(%6`MiF48tQoBadaKBd?Nn6N;Y{&o*Js>Tl1kOhm?*kT#rfUl z=gFOsb1d3qGEU5ovTS4RQ@HUwZqLl96(_~Zm)OkKdn@{AW2N}|I3t$DBB|?KJ8R{R zuAXiq`0c^Y9%J*#N1RQrb+UJ>em->dx>IPHb@0pv;p|UO=dM_EDT=Scc1`OorY|3M zf7hESwsx0~o42mWF;c21&a{|57Lru?adf4lgh1k|;B`JOg>TldXIU=(oGLuY{8WD5<>bdH);v9% zMCukeOD_4}U3F4<`f=%VGtLBAIL!~6cRRE{>*P}2t~*i-<1E~cUCsJjoPWhS(sgah zmpNfm7aTcMcPY%b-@>jVbB|J&7EbCWYQlF?(-}7_#7QFEdsNdNZ6B3X!#ijl6_PqI>w9J)%=+G-*k1Q_x?R=4NTYJ%S7A0<=>cnePLM9=FT@^#fvvDdHreK z+P%9M$%344v_F<-iKNMX?nS}CL~dZ9ayB5t`PKx}FJAZTRn8jN*eIpwW~nO2%rsLK ze=B(}rvFvr^`d>n$?G3ET5nN*9k}12@ZXymPd>A*3{exB{4kKe^-c!&`=%EnYGDf% zK4xebuKV_X_Z11gO#v;()Zgd!&HS3uaU@~QO~#q&5att literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/flagGreen@3x.png b/launcher_icons/defaults-light/flagGreen@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..251814639ceb854c173b5268787e1ccb107ecd81 GIT binary patch literal 1949 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/hydraTurquoise@2x.png b/launcher_icons/defaults-light/hydraTurquoise@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a43f5d65db65785aa9e3dea2cd7231b7a1c98bda GIT binary patch literal 1402 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 L>1aW?SocApVJmYN$G6w+w z07IOQSCEz~|Azi9ZH4vQ9MID4t3Kyb006Mb-_QZvu7+uwIw?Wk9st&e#cQq5jdKrh z2LM`2z?x`10AN=+&ddE=hR(|LS$~T(m|!ic==EK%gj;WWlXvV*2>px;!P*X26< z#z=qVk9M;&>nvUeZ=e-e5P5`LUr_hcwa!2^G0_tTva6sT#2x=Vvw2(eSs6T#rf?B; zue#jL9pjgAqGDs?ZoV1Gu4?x#$CRS_?GL6 zFuYFPK=Q6vAJ$hY`%dSp)DaXGuYK(@RK9MMVR;I3RWv)J>l_t-UgH`uIcBfs zQOXw7t}>RHBd^fqb7w1uKC_lfnE5W=TIiqdQ?_~kd~PB6` zMY(=Q@pAFhv@z38{A&1Zr(0>sCWBMj>Q z>}B`QJxvdhkL|(!P~FnYJ~3$C>R|Jkf2m^0A+NUh7`CG?fB=iQ`Faa-;OyM1k?Lgw zYSIRt#1BL6XhQ>F4<#tK%x5b@k{YfPgf>l_S)GV1=+W-;Ei;Z?;GmPYSt}%ns92>JR3p?AK3igNX6;NuxSi;TRM#*mR%iwi8AG>I0_S2JU zYKZifq`Ejt=Ia>l_#ki_k@k16)9B2lIsdJKbsTKF*&nj5s(%FVibIxZVl>jWLpNp<-0%~RY1~uAP&T$lpBMF9mouf+ z^^5(4PBg-=ZEg-`Fnqgp{^{^36R{jAz}a6UjB&v3NF ze|alzE^RY^Ae9h5V^R=jgxeCW+KTfHeke=@ThKS(5Gr%Tj8UI~;6Zo7IJW`bC?UKp z4GmFpxl-5EE{yq|&anK;_z2XYu%$kwsBT<$3Vy9S&!(+b6s)VL&Def$&3F8sND*XO zVI)`6m+1YTnj?mmaWMlc)tbuwp$f&Jz5f^c)+WK0b)rx@Lq&gw(FPU(hdtxP@*w2= E1+7v|4*&oF literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/peacockBlue@2x.png b/launcher_icons/defaults-light/peacockBlue@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c650acf240264462a6a303adad04ac484d6b1ab2 GIT binary patch literal 1481 zcmb7EYdq5n82+!TTQim+ldw%;MoKyxr?HHYMyw*sJ(pZcx&6+W6D^lCwOq<2*W7P& zk`qI2N5h(h<5VcgEkiR#A!mKC|5ve_KoX=wtsX$ao6UaU!-YJo#uy9D)_^&t6<*9SU48=47ElXssJ98d8Ts#`^E_ zM7XH2ccS%X-o42ZUI_!9HfOPmIla}h?4Y?_9*O;pseXb3&hy?)uG@a_H7Hd8kivog z-u^A4Qza{A6FqcMqqlj8SXcM$+|x&!P=*inI7)}ns{e4JyZzmP2wmu--{0~~8N+JR zn_F)kykpk+HngrHDdUj+I=b=?s-l z7Ykd#m-R)x`0%L91d=lE_RhgA)Nlc2y^z;xe=@Ww4`la_tp_!3@FXe)m1f{Jxub5) zB&c5`j8Kt|Ygi&X%QL*H#92-)7h&AebewT30`_2Y9KUv+pX9=s>2ismHJzf+6sk(o z*q=q(tj_lGF-$&p--fI3|(hiD|s6&QwG%*lj6p7#IFXV25^j_8gNo5d^DAj zdpEGF;UqQySr}1dv;&pKu!`>lExY$A>E}_F{EpmS*nQ=d!pw>na`;8!b^nfpj32;uuZGDS(4xa@t@5_H^UWhZc|WOM4@j`q4D~?! z@%8L%ZjF>>2{~fZTkskB&IU0fh0Tb zU49k(-a(Sjw2dl`B%2B$Zn|vE31!g~y`qLr`iT%Bd!$mWVKF|5#6=p;KX)mG<;BNr z(1ZBVz1{`+XKc}X4F<>-fl6J>>q9Vlvcja#6K=mN>P(E*8!4!9TrEr&v~mZ{lJXjs z?!Pb?4)JZzyrcM#FKdY{!%L;UcbpcBgLIdgS#`~dC%-B(7q^atu zC+cM#r$`;AZhbcEF$Y#Uj()Uv3O;(OphH-Z`ztaH+qimTMyDKk%w#_r z=FA;?3mX9n(1L+flK`ZIZV%3>D9-yX{tT&8t7l?Qc@MM4iLEMsu;=QdL-Y=y+a(JP zl3s>Kj#flr5@`99rAcsDw#X{@bT%ppDQ~0mi>K-Jr)Nvkl0zr!Ke#52#fenMMp8Z{ z4tvjz*7B{fH}}{Sh&Z%C4B5^@IDQS4%I-vV6z-RK#)pYxXOvNt{2niDyr)-4Le;@K zI=6L+Zx_AH4P%R_vVE00mI#zrj{OT<$G_d>|0&d(`~yGCere?>FNyL3HYe=~)fVot F{{T|@tpxx8 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/peacockBlue@3x.png b/launcher_icons/defaults-light/peacockBlue@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f3da800cf89b603042b4b652f905817ddd06b177 GIT binary patch literal 1988 zcmcgtXHb)g7L5yRC<5y$pi&nQT#?X}fLX|c1tCgUM5Iga5E5GGB0*)4x*#Y@NeD$s z0tkfAB}$PFvSJDvV1Z9Dp+$I+_TsQcW#EAt(BzsS#b~uB#E%L zuor0ScZ&Wfs3zk->I*~+W9Ex&iJ91_ljeoSh(b4wXwK?XEx1?p!9N)`=?~DrHJ_7U$Ub8w}ZgW?!s%Ybkt0y zfwAExdOKD1+o4Xo1WojO?8%nqa&xBY#*p;TK@jf1tIR};-giH_?z~}}e``am`EWF~I9j^Fi zQN{^315%Dtllihl^5?0;AngcG?h-KPQ8d|8zb-prqK&v1GNP;=gYqCK0JQcS~80&lhJfE}iUC;7At*jhty9^P)UEb5WEAUKXL)0BRX5!tVr^d7>b=?=%g z-wsDDS9ep)`0esG=B7OEWV}9Aim`LOH=2VT!csK1NUMf`)?8o(am!I{Ya;RtZy>bK zVre2DH@vh20m2oF-EL*?KkuocX*nXJWLlB=$hD1eY`f0(AaV-p$!EoWOmEealD^73 zh1Y}rA>R0KteaBXgq6HI$g;^Vz0+VYGX@Fjk*q=&W#StrHCA)3x>s{e9=*S35)Q%j zZUZiMm*ThYyxik~(M7pFbp~W2iDq=IFCFpX*CB=N-8W#8sYwjsbtTJn%S`7X__k}p ziKd58N0s{`hlCg5G$rjoYRM=bpH8kcW4ZBFYB2k{qlh)Z#Z=c~L-ZX`tU)EL&10eVVVF$2 zq}YX$4dYKCY7iVn=g`sirb!I&AD(wz1oKZAIdO4kwYejcwctEzIW?~!=`O$PJ}%+ zarKK)QP z;o_Ol+G&Ny^_(wl=jD}V$7tVxucQStnypy1*X3HwzV&H1^i*CL+1A+5pnM8D)()lW zl))AA+`}Q_s7hu)I!d3Z&UY6^HC`IHT%JeQc(bAkT-VDr^Q9mnJKp!hxoUL>N3)tj zm4!)D(pN6|E=#o_e@2)Bbg9yHjbydx#wX1)8n(vy8Ep!As>;!n-@Byg0ZZ0Oe7u1P z^LI_2KV1B~sdu9fYNzDg_z9t|9PRJ!)?EX}o_!To;1?Nj!+AeR<#p{d`RBgAg8f&O zN1$p$tyU|;@HuTP7Nsj`;Y;;;oWqcrN(W20)GecV{&_JfUy7{M;6PLg-h9*#0c98~ zvbb!t)=D*Z0&OJn&Ky#9hMjZuAypaS-FS;`P8>*aoD1;V^{dFVu0~c#8wk=kfXFkS c`ZutpoUqBEJ`1;fBzU?Ygr%(o+1v~FKN*+E!2kdN literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/shadeOfViolet-ipad-pro@2x.png b/launcher_icons/defaults-light/shadeOfViolet-ipad-pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..335ffd759df9e42d7cf0a55ad4770ef47bc6edad GIT binary patch literal 1896 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 M-tPV=3KEz74`PXGV_ literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/shadeOfViolet@2x.png b/launcher_icons/defaults-light/shadeOfViolet@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..74b56a5cd5fe5ce20b5bee7bf4625d0276275d68 GIT binary patch literal 1491 zcmb7EdpHvc6rXC|ud+-US22&g`NB=gV;-A%rg@F>=;MxT!lH_^kb-k%3!U|0> z&n?X&p)reA%5x~zW6^4N{d@c8-amfleCPL_^L^)h=bT@*r@OP9w5l`!0FZ;bz`R91 zS%f4>agm*F2wE38DXfcsJOCi0^b=x$iYgTmDHiYTY!4ufK~_bP( z1OR}MaG0G>lGsMITO|54h+bg#;xZWyt~RQWG?bduW^3h?g1~NV8bJ+pMi<_hu@l%| z$q8YdMn}5!5Wu*iP*1x^7v*QvCp!}}_U1+qFxTa1lV`86vV0QB311?9Ws4QB0}wa> z)cVqYrw58cbMtup?VVqnTgJeP??d$jX(wxDJA_Txgb@z*O~m*Meu7{wJ?UfoT4MLZ zv^zX@_TPja{Hk-8MXDyE6}XHoUgXf?qX;!lc|_qtJr?wMpSG3*C*oeZQVJH{-VhR2 z9+cgihR66_d;Z&gnZ|ydvK;;bEk3?WGDcb8;cINbpx?vmtx4UwVZn5*q1;z7zUwr; zdBRj9fV@zm|M2wZH(ChG^s-ELtfTo|sPWZrwZKy2@3(Oe#4ylX;HW+&a!wD&?qKi zdeXIpxT95Xp)$$HzK~42UiPnDpCu_vYuLs`_2~|6b_Fwr2bh|{6lr=&n4S!$qZMe_ zPAv`}ZY_&0Xji^1+j_X3M0k3TD8c3oRW@braI4pNuS%?&e#qyEWhHKLp$;aP{D6{~ zWv`wT#>$|7M2vQJR^+IXsAD;P>MV7NWlvPQ83`aE?#0$0~*DnOUHtb z8V1CcBUO%((SD;k@0vJAFwl24eoB=GG`mM4*XmKcSWBVe`N*iGXQB#FF)Nx=c7WnO z_~cAV&PyB>>DLi(*jzCmgHhZCUD=9bXA`}b6fmhZ6M@W5C2cL%NNoOUTS2(*+d*B| z`HiO<7tu`Dv{hbtgSmDGD1X8sl?b!(aV7aKOv{p~ZF9RzF>|e0rnSFgYxt)sR7ssr zrpIV5>ivA8x0G{O$IG0I0EYi(2=X{`6mp%~T(qw+cqi?f{z3IGPwqI6>dZ8k;7zim zrE`^Ug*+G#n_pR+LKa2Pio@<`ebqNAVk9PuOKvdl%85HbetE)6P0}~GI6FzdIs@?u zeUi(#iW0$e@V-f^rYT+e5FPy52F|vwOM4WY6bnUpGF@-dw)wTf;}*LJxfsUGdb59W zq%4cZXW)G9q0YzCn^uV zy>V?&Q6gckJx5~y2jGMe6QPa|N&I~*Gt8n?XH1DqkieA>r(s^kaHCO;CArwendVjR zKmRJEZ!Y0{P9{~?{Bh!Sa=Zh<>(H#%NxKY2Rt@djTT%m@vDuiVTB~Z>28K~gOl2~^ zt846ik()@n`uMvdo11?suh%T8vsVAZ(ScFC8BE>>;R`>eA{+PrwCLAt;cjn~K|~ON RC{QR0LgU zryWsiVk9V?Qn92(ElHZ8)S6ggs4XV_|IT^;=A7@l_q+G!J@Yy65+0`<_{Q83B_hlNmy8#-QCOnhM^B+-X~n+L|l-p3Wi1tqWwH3l4{o zi8_tIG-)TyOaJGgkSCVuS;oxZR?tLWwnjH4Tt-SWto+Jv?pAF+w6}0;pK;lusi3G z-*;enNi>OD#s7Q}HP@n)p>(p8UA6zR7(C(AAN-cP^$VIVQ{O&@naka}x(5o?p5?7% zA$;`4e@}Gt#PBGM$qVi0&+{ltb^*!@M4-jn`@0zEHrqGAE!txEE(hm(i^(fLgB5Z2 zA6ADff2bTF@HTqA2S=gg@=WkzTiY-Ml3~xM8EVbENYrI<`lo_*e&tq*e@y$t|BxMc zsfi`k{hTB1CMiis5-g?XN%rqfx@#Il(N-Z1(d!SS-{|}6)lrte=DOhjZN26}e zEm@3A{&VAW1t$$ooHCh%)zZ~!n(t-ulRL*PDp>s5E@xf}8T!%oIwTX{k&+wyeJnCT zJt=^(LQ@f-UQ{J2`LI>z$!WaQ!n}vlYX1z;Bz*RN0xbEEN6H^})xs z1PS~vcrD7-oLWDbwIjqlAdjRJIP(5CI`JZl7kiIqpFtGIk>_b3-?<5`!!Y^I;UVtV z_U+w;rItUiCzc%X(0Wsq);OcBh3(24&U${_JwHmX%XOO5yFLK+I5lgrk`OuH4|;Up zqtJLQf7WKsPP-cq*U#-~n1M&wne$l|mAQ>BV*CJuA8{y`4!jR?0%m!c#TIZsy_1@jo$M8;zGqPf1wn zYv{qj2psOOQw42u4f~P$mCt^MO)kR6kPMXNblwv_C_(x)*M)CHjF+3Ea8^d)g&;=D z5Apk#Hrd)q_I+k)-3KQjOrdKDOJ>yjmLS%*Qw)$FlSkJ%Yhttq24NQh6^jC8xz-Y= zrF8!;e_n-Ja&4;2C0URX%QqNv&v!Rv4){rZg#i;`;v~x}XoRMewlo(2lZ0>DNYL29 zj^N^=wwE5f<|X*^H=ZN$U+1O1Q^XnEzOKb2M~?!Y&K!@}85H&W`<2a56@0WxgGo<> zJx&@NyJJ9W?a`+&w~j8p?*y)n#9s;YWFRD$`pRw&n?l!{tA;XjRek`%|uPYE0aH8TfbNJ_ANVLc0l$2 zfU!CAB8;{fi&PoB7&U6dUqIsLQ&t)%Uks-JYITJ_9_7V^QEDTD_of!{#+?Hy)j>60 zn;nyJH=mjs#xO`RDX0gW-ms#lhhYe9vQ6}p@nBk?O-_Z}HLls#tg6a2Ew6IOAnSE> z5ph12*w*+mq_i3{#6NRzz7V{9_2OwC6KB(?8G4?X@717Y*RqnjdaQJ+0l${pq*rhp znuN#Lw1Nr37Gp!y8ag(LYr=LMW&G!Jk5c-nM>CXT# literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/soilOfAvagddu-ipad-pro@2x.png b/launcher_icons/defaults-light/soilOfAvagddu-ipad-pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9796061f4721c09a0a377b4e16d2d4ee7e4c0e2d GIT binary patch literal 1958 zcmcJQX*3%M7lxy#qCsm-2pvi~NKGS+T5AtVVziAd_N}QUY3$7qri@7yqh?|qV);-s zs@0%s8+B-_=m@EVs5OdILs9!@{(k3tKj)n1z3+YR?|aXsx}s4)DXH+nQY1uN<^f;NtBw3#yx^49 zPMp;g%efIHXMC;vlK6z z4SpW{X(RcXbzl8e%3Vc(6+zrmCDj`IZ^Ge<9D$Q|_bAD}x{ps?E5?c;(5zGol{RJj zUnKGx-`C`XCjDvWr3;h2rq^>(@8-Sd8hK?#F3DYwcDHFRofi{b@;X9|%h~?a18pW~ zv$v%SXw+CL9Ypw*bV(oab!^3?0%%re*{@5O5miS2BC)-eUV*Q-eGxE9dm=cnDNhU` z|7wRwm6=vQ#b%U98u*#X+OeNkLRTmE@CxPjXKMTKC^V+Xogpc)hlZlC!;^lYU=TP) zxu$7&Sb11o5~H3iHjIP9(pTm|nLv!!`l;O|@ zWbt-aNp7cC>(Y{jwgw{U@r@KnAZdH|KOb}7S_%w3^-;sWcLaU-^AZ7fa`&6jbQtrQ zFu{He?wW&osDG;Y+#xYJl86i%-uHvlB*8w~6d6fe}#zaW27)8p!@~(|XfOt#KP_GM#iMO7t2epy@{;`2uwRJS_f=Kl$ z;96W!V6Isp=9Xjje2bHA@^sqcRxzDnO-kAx-daVB?(OsUEsMR`X}n7QVn;VS5a#rR znKGfZoyvSHaF`vOD^wrzpXPG;aj_jMmZMtyKyzZXT!VRKbF`n|mp8HWOc39B8Pae- zwlE{=CoCdeP4TzBa(RK`;ZU16R&!-de3a--Gkopk4{Z$Fgn9VLrfQ4QY*hf$A2uEn z;ualFhO^2m$?+Z?$W9TNiyEd(sIkCEp^v|gA9`r zpym3%1gRE%zuHzM6fSGMg`Ihq>aKKvM08DdU`U7c>pf|L)(Ut-=4$?j((o!bXOW=vf71`}uAYNc~NX;u5oKlN7yU)s7;wVUx~jfdKp zL5^q=s{ARnLuI>Z4)^9P1xud6Osjl|qhEHv`2%(ceXDpSKoxBIkhjyrKSX)%OfFQW z?DY&U_OIkuSloXK%(_B0O4tuCX{V_$%fC;_o#~O&`=_BQQ_?+}fG#2llXSiM3+#Iw zn4R|uK0ciG2ljl~#%fW})9>m(O45LGnTo|1oP)|OT92YhD3mrfXHO$U(TvSTLL*$42ZxVSZ`CXz;NI+I@+B<(ehyxxF}V3vlBH8m1RkXnc_`7S2S%sFdJ z$vi)Uz|zL987}c>k*?gCUf#I!JxCUe6$2-=oqYs+2a}x|*kt5H8pv<(F>~?u2c5eD zNU*ma#~rh_;vtB_!rJe8?3cFWzdl~{wPq$%nxgt$*4PK?P14Vob3B4LJzCQFsdW)` zx1m=)$-Ij0yB!eco?WD*Q~${?dS@WRhv-JbOE2zS!NtL^-& zC9npLmkC8*Er^o9i%I=oel#B|WTa8npOg%m7Zu=e5%n3!2+knD)9U?TZP%s`rPVM2 zKLpx5{oB~Ag)8}kfOI4brg~$Mv_1c6Jgr-jcmP5`L=J;XpB1eNj%Fuzj-m(3RxHB{ zF@!P<%&l6@h{m-fEc{T$(>ypVHWbO4i~DPRM3DNM1lehH^yT}CJD{b3kt|&N_7_A` z+b!Hluc1T^YEU#-^<4-(ajoC8xr1hQ2Xu=k>Ic=Fma5KeRhGqH6!m$|Fr25FI%Unl zM`9+OeK{l<^@+CA2uNlDx3R^1+E4a4v5@vl1tmYY>lGW;!5`?`M`0drseRKgRB^9A zKJ*jd{zy8r^cnvPzg!79QxIF8wXh4n9=j~0ibEV>XdN{pUj@D8$k&tI>3M~pA92Hm zN_(NCuCpoW)WuxcJhU-0ec-yXR!aj;ew;7~e!-i<6a-dC#h9F&TF%_XLhmfk`I=Ro ex$rM?AgY1`D!x;sK0SV`07pBtEyLRX=l=qOK#vsw literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/soilOfAvagddu-ipad@2x.png b/launcher_icons/defaults-light/soilOfAvagddu-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bc7c9c8f372bd8d86c32b01c13bb9cf8592b6e GIT binary patch literal 1879 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spaceBattleBlue-ipad-pro@2x.png b/launcher_icons/defaults-light/spaceBattleBlue-ipad-pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..22a927201e404dbbd215e4e90981de6267f2f6ea GIT binary patch literal 1919 zcmcIlSvVVr8jWG7hSEW(bqq=cMNt(ZTpFF0kSbNFrLEf6kcir%rL{yxEwv9~t8Jo< zC5>gYO4XDgL}OPwX{eyInB3R<&3(8J_xsNI&;Osta~}R=dpo%3N!gPC06_GLjTMro z)jU?65ai871!+&72#46XpaB4&#J|Z0$S;)PnS5v@+!D|*Aiv5x1iUS5EdYQG8it^#(E zc*Bb5PpvD2l_ph`D&Hvv@aB%?p8b;vN4-Ghb0CsXkvB{GD*N|U3~hU2`7rjWZF!Jb zxqIcy3mntnk;BF~_XnZyRwaO;?OYd-PyBMpZ~s^9B4K`>N55}|A90pD#@hV7eLgm+ z{A}(ZWD>ee)Qu%&wN<{}2##ymho(}f5zFYV=8ani==F4N=g8hT^A@%;PN%c?$h_3~ z{Cn6R?o{c^=Z~K%8ong&Rd8;r&ui6)#>9DIDR{V)&-1SuDEW@2&qHC5Ks9cI>Tq#K z``p*(4?Pjf{mLNQ#*HtY@DIVAZE~i@m>PAFVkjm0Q3N>WHgtnYeP;Y&2P`o+`Iz~7 zBOKZ(yw(>}vbb#y3lkYwxX8}<%lo~*;z?~t{|&Lr`=x43XJ zBy!QnJ~eD%c`rZTA4TWJJIF1HwGWnY>F3+T<3jzClk@MHs~x3L0VPDvBY2 zPb*SIxb^skq_1?c6S-pklP--i>xJ<4H|Z|L&Wp6lv?)lYng1X7h!VM>`gtcwfp#~>_(Q*i>-o+z~s^GU40j- zD8Yec}6<&p`p$mVsKb*F+18+#ZhV(bG1chCg6+M)P zaF7l^TVY&D(lj+9G-hpHsBZKwAykN{RVc`kVq{&cF*MS+b9TRECww(sxz-fs_9X2lf{SH&g&P^*%TWlEooRXlgk9*5S9{O&7G2~>GU-i|>a8dQ)$u;9iGL zqXbQyKOtr+lBx00A+-|2CnSeaf-I*`5Ey&X;XR=r=5Hq1)sv{Aq{Cmo6Htjo%UTIm z;aMW(mV~8O=Yv`|e}zFOV{Hx=uEp7oVORkV7J36qnjJqcY>u7P5>uNQd`gR^cKmhk zI`MH$8l!`#{9-@#j`iXFoav93suXZ%h#Eg9N$q5h<%b1qTLIxFmdDA=Oc>+`t8UQB zub6v_^4D|s;7}vW!h=?6v476+zh(Qs`p10i$P-$ms!ZM|1puyC+gUYOdL;Y}z~_wB literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spaceBattleBlue-ipad@2x.png b/launcher_icons/defaults-light/spaceBattleBlue-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b9ecdad972836ecb6db552bea8aeddf50bb58e GIT binary patch literal 1805 zcmb_ddpHvcA0A>1TZ(O8wJ9g|g~LuF3Oi)NVMHR=ZE~DWZp-B$*IWz7_moRoNOCEc zZLMX(Of>1ViDgD4jYiH~n)~>io&V4I>zqH{-~0UD-(SDyd7t;a;ek7=2|54*005fK zP7a=OzVjzkRpb-?;_wkUsYN?oi~#`D_x}k6z}I}FZQ9;mahL!UcrzIW;S+kvL$P?PL4=EL8t_}aU# zd64T)&O~-*wm$3r!De_i&gy5P6&^wi?<}^#f7(~**!_^%$C$vE&?$I4M-9wjR{^1_R%uHF6fAxT@O zt}M!~ENT(@9P>8fq>HO7apwOou;1yj2?D;I=xjUC!ZXPZqu3A`{P=3HHaMqe(0^y$ z<|+)1tThQ{dTYM98G=%I(OX_aphh1~5E-Ja`|fUjO?q79*KBF!U0{E$iv(X|yWs_* z$329&q=jN~PaT=Bjd94u&XW{aIZ^en2WNIByOm%WQ{F_YB*yH^pA&70O(xWlOx30n zVi9@pcTUO7mt)ZRH^7{;rjT3?cbxgvpUO+dkEA`_brXWXGC@^-IaniYvvEe;ZIqm% zBMPpXV>j*2^kty7OUuFGj1FiA|HyGH2}aSk8H1FPG6#vwP>``GN!ETnG;%$Y;0{gQ zqIp%fQyOXM1>%U38S$X=o4#^PT25TQg6OpIxN;5^heJGKMLb)kSbmKZjrbl8W=SoJ zqcHuKqU&u>?`w+Dfm4XYA z7gt?92&_F*KcV;adu&@>+0CY^8Js=a*DLx}g^JUjpSANO< zz~Xu22^46Zel@1I#qn7N_yni9Aqow(hz}mcFXPQEuw@!$83dTp=WPA&hMWf(oIt#g zK$3jgxB4Ie3#)2mQ!&QP-4RTK`>kE{=cMTSZ<}W=m}(kcwO!;O)r+1*U>{)OXh@fr zi6R{hfaebLCkt3t1Ajzrz^nh$>G@{Mdu(I-#~NKlQ@W4nxGo&o2^B8_jrPKW@}{#l z*-NvbTt@yc;|0eif8Asov4X}gi!(Se|*8|itPQ5%b*dpc{YAqZNDaA^}) ziBL-4P5AhpPRr-amlff@dC*rF4Cd}Ub~axAI}UY_h>-H>J#7{5 zhfPc>GYS6E8FkF!PvHjf#E&7yyl2$jmm77B^dAVVtg4__+=t{7O!(xx*Ta~^yRo-b z3Zp=b=8+_A5gGyi`J3RDs#1?rtlFX6O)374n&7cJ>!XId7BFL& z^R2}8xGQh41%!mSCL46m$sf&ktT01 NfHM~7&|;6j{s+)VRgVAw literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spaceBattleBlue@2x.png b/launcher_icons/defaults-light/spaceBattleBlue@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..767a4682bf97d5506a351055d4c2d94aed87d6f3 GIT binary patch literal 1517 zcmbVMYdF&j9R6!0myx^UGC4M*CS9nbb#u4LCFYXLj+ruBBDcmU#VX;L)#ehF+bZ`< z#A9+h$!K&jia648nUFbdk)8FNZ+$w?`SAYU=Y2oD&+|UNH^tT29xSUR3jhEZKjE(GF!(VRNJ2^A0YwW0yY`=RriShzDEuHmAqjb1X!7cS*0_qE|qrvj~v|pR`UQ z8xEf~U2mT8UA$kaWXA4QkrUXKG1*agCl5vEz@jx59XP?Rp5Ku-e+8REC6z5U6spzJ zU#He%S-0EPiMADd#$D||8SYe>r?8Xa@~3ic)e#~rOjV@jNPyrD#*FUj!MUZoMkIAF z>nc}d-|{y&_u&LReeqM}smD`C#6+%*7!K__&&`M@{SBcTu>|zhh21`LOR1!#!p$9;M7Qh+FD7^bPX@ z?hv}3pBj0;C376AW&Hg-A+cymSg2c1zhSjN=z>*y&JdzB*9xSkI=tJr5n+n*!6j-? zl>Gxxh#hS>((LWmGRNUZjPjB!Z^vbnRp`Fre3jW;umSd`{u7&gj1qz8J>2ES(fFLq ztF=snk2P}rLpL38BojiWItywo;63)I&vhQ>pUhGgpdYid$Gbl(Hfw~j)CJ$ZL~ui@ z2=Z%WjVkN`$)d>}El-rls#RFw^7|363R@dBk(n+G$(GU9LKYlBRcQ?jS(%JB?x_I4 zvm4>5*%qSP0_ALCfXTq|2RHiTalTJ{IIY(mA2LfNU&4!$2X_-;BK3Po=2w-6Jz1O2 zWWY-6aXSU6rJOrA1Mo(m@m3til)p;B}))GjLgOxrfTzpP@Qxx(R4cz_K+7DQ6t}gkxg~| z+%pkJd#29!I$m3VOQSBm@?-jdi7>tXR(MF#>2K3b857bSN{N;h^4<3Zp?4*()YI#n zE*}FWH;{PSlk|V8M*Ny>7%AJ>rd^VV>WSWq?9QYx=sOJ+`u=v;Mj>UwO)5eE?=@bD ze$Ni&~eV8^2X=cwxQ&H;`*V}hWKVtY{hZ;T0*-Z^O zj~JUAhlDT=chWc(PK2#y@QWdR@u7#K519<0?N~t-#!U|0cygUG4^)-Ca5Sc{6koGT z=FNE&OaM1}me;|zHk`DB!#ax~#LbQuhJ)7#YKG?uXoL*MMWUbfMEeQ`zxRrfr-hJ9 zq2SLQ|K(Tdj+>N#Vsnza_m3$5d$s=ExUbvjd-rtTdj~2IuQPzMb+)Or3b^(UL6gNX literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spaceBattleBlue@3x.png b/launcher_icons/defaults-light/spaceBattleBlue@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..457fe3f7a24e341058dc616b7222215b628da32e GIT binary patch literal 2144 zcmcguX*3&%7EY-us$Q!NV`oMKQo%!%I*3Gq+DRgo2(i4(`~Bv;bKZ}4&Uf!U-~D;-{l0T^uermN6*UwA z0D!WKv!kc9lBLmj_>eRYs-TWYi$c8f4GaLFr21zZ0K9mqE^Qvbc)}b2B!hqO$Zpi@v@*6IW_SbO-c;gn_(z_A3qgp2q>A$VZ{8G&v z?+uU0=--q*gCY;qaZ7s{G=WXko_L1W?OoND3pk9En7`aU4G4Llf&Tx%?uhSDcK2Ok z{@u29yv5`Oet&A8Lc_Q%td&v3m>9|8*D(=1vc8`Ol0(YEi=V6CJ^pa+u9Au#q5qeF zs*RHHHbSzDuh`H`$buH{Yj`}SpI+>mFRF}B#!>lCdTdkIqd9Xa-jeCaD1U8hYnFr0 zE!0oBOBICO4gCPiAA!0=aKiA=_H><|{p4ESEx}~XJCB34Y^QX|c6+>uqIDh-1N7Yq z?WhzJ|4maGamJrWJ2pp8Sz38Ys6j1Hb{kjY6{pTd z3(8N;lwIb=>+6BYr5>RSFZtq&Gel8BI#6dh?M`@KZ-aN3Bd_;^TaCRo95U!F#$mIw zOtG~4e~Wvys42dfuu*MjyMlTv&k4FNotmjDC++yn?|qUF1r7rGMAlM8YKq1EEU-VZ z9}gXUds(E}M#|!gxu_!UmzvJzJnH^W9xI>1hOo#}HVuZ$l|p+;S5hK&&J@j3{vM|H zsHFmB%&ngs7e>(=J|f)DHVK%Nq~uBIgd9N75pEqAfdF%%Lrc*gUsqLZroU@Yi3Oeo zJqj{Q6V1#{c+s!&3^S{U^HL5f6e%ceZQU=^xI=-k}C>f2jFeAc44^j?K~L=CR?8q}$1 zfR>E%mw&!lGd+@#;5ZU#Tb=YtYpbG_YcK#tEZ84~U;58z>Ap~R21e0mlyNjld?MqT ziet?_wY@R`FPfT9&xG`dL&=|qXYKSuwy7r9vAUwNjEeB;;ue(8o4- zgi{AEiyTXXou(lHj=M360`>5sR&hs~E49zcnD{*A3@DM4qvD-iNn7iN?GAlDDN}O# z7pvv8EUjU$oIz_m(gfa6)xjyF_|J}|zk0VvNip3#rqc_rp3n>|-X)?{O!3P26{+V8SF9`Cn?6pt=T7NB)H!FCq#a_w~omkIjti&6hI z;y~0Du&e<3{%37dyi|dPq??t1<$k8BwmlE5z&773Yj$s^5&R;mQYX(YB1fFP_Lk+c zScjVjmHM`2n|@~=@OqA~;B_Vd3-g~;>8<$Hj^Sp`E*d!1`A#HFc@=KOiT)mUg!d=| zM4bHt3`&gh!BT3!8)?Zz!#zIYRQ<+$FkG5-7Yya2vr2c+o!zegUE#kQE<69FX7hR~ zmHmw`EHKz|ovj%SImeRidRm!w=Ld2}YO*-Iqg!TX4dGN3>g|O<~OsR?>8scHm3v74|vLJ295S7>R?O5pf1{b@<;rU3vXFo&~l>K%n z&FxKlhgBk&4;-`j`ce`Y8fEmF0^o5NQBkvQ?D~sp()D-IUU8lP`BMZ`tkDAVyt9VM z*vQ1WQWS~gWt@aie1};5JkBUaUhxsK$N%8kHQC~`VH6YP3wi;3c%#V)TZlQGI6+E> z!cAiFR?n+DN_W@Vd9kaj@OaAQp5X_sAJfbvOF&yq)LQq3;ql{vW=)qe4*@U!wfg_c e75=9_WB*%TU_Fv4drA5b09-D+JCYoN@BIrI5fc{x literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spreadsheetGreen-ipad-pro@2x.png b/launcher_icons/defaults-light/spreadsheetGreen-ipad-pro@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb6a6b66a21ee6a2dc39b73b460cea5f60a87f4 GIT binary patch literal 1928 zcmb_dX*e5*7L6r@Se|9X@>1_-2-@4bKXw3)0V^o5qj%yke5`0WDF%I5%006A=4Pt;tboJw*7~a($38?M=`^s@68FtC(5&-a= z0^Sb>0szubN83y8@nWB+5Ro3C>OEf}bGMb0^LE3;b@SrHWL01#?PAD@DucJT$-@ef zqv@HhbEn1puVE!5Qh%wwI`pQPbk{r>oSK7?)r!({%pf@p2>npaQM*giJRY%d4wmV-Lxb-tz~Vr_FW4~_ps3I!br_wWZzbWh$zTj6cN>g zV~sPmle@cNK7ZUgv$u3NfW0j4@f+v$ltUZh$@WZsf>q-(@oBhBGP>^zQ-X5FnbBdG zo#f_`w~2{Z*5?&)+Wm=~d_|O=*v0#Kkr}}>N>zSO@TdEAIY!rQhBns_YEDd-we=Fy zy}Ba2Qsu9xNrlQb;Z-Zd4EV>o&F@ILMb5o44yY+{pqyyMWy^^cw?F?)1-QC-cJ-&hp||25 zbi$D)_(U_sTAS#<78N~--A@np5xA-BcALoLf25ayDv!H+i} z%b7IERT+C{Js$!LNQvij$P(-=Af?pzSyIr4>A{yr@yqdq!0`q?BdzO=j|akdgV0no z2^`cf*fc;zvuYbS?PXYTcmngH2nuhVTNT0eh2?=$(4G;5Ao|UAu5=m*^ZKSwg7Cqf z_2#3lAR%NWFvOU3vdNfS4{G0n9+<}S&7HfFNQ|-0sjZ(M$*`Ye!dq7 zqwOe#qRSUH%d_g*g`Z*OUQlDhqFwX&rJn}ZuE5b+8c$GyX$oC~M)G-uW!gV$p+2@y z3aA^W%^Ntk+63IqyhpvmpfgZ3xr}Hs?lx!dJ)84ji{qjY69ZXpzhmX%4KgXFv+Wrz zFVeKXh;!*W+p`9Ph5mmpGrxzmG`Nf)RCoCsxJTYB57bRV}lI$H4fjfu3U> za&QwaFQ@!J)Hs!Bh0<}`5+0+xs;^MWLR8!9!J05o|zcx>AylYZ=0>4v+bn?x{L7J~LP2+0Qd4rt|nSQ#H z(Kc?QS*kDm7t&dsp~ds)6Kc0~(lT{urO>c|{?K9@1(UDC58Qe8d$Oajaw8+Plg9OhCpYN(9@X6(xA!5FE1eL$L~p1H2W&Hj48RNMzJR>ax0CUdds?_ zdItvdApgLxRE^G=WCS$Qs@!4VhnwmyxeJ(rB$`tmdjos^;Kj+Up2Emd=Zd7$A-GHd z5y$jdusk|f)M`|pe)@W?1oz6RtlnDw*~iq&Q=uCcBW2;rYf}qK*UCbi5ZSEQdwI>% zwk2bxw6c}%^7k+L4Le(g3Usmkx7H@5S{_&=y&~6(SYbE!F;hQtQxHP4J+&q|cZh9P zOVeN&Z*3#0HH2%Q3vOMKpi3p5sdSqk_Nu>z(gs$OW1s44{X8FS*Q$0-U^uS)R8gJL zR3GwWViY4h$FLNY2>j=(`Ri0gX#M%Xoz(!rI|RPh6GzPnD2(_x)TxBmkR6@+etP!= za-|iMY_;g%twb1@GgIC{9^2X1%>Qp``qlncER})0^5kWZ&H3s{ky)g8H4+9?XUr%YBtO0hv zE#g_%?I*?hr#8Z@O}5(ozg?in>|dxSDUq|E&~m@M*HU@tSwbM+L%|nRU_oX1v|LjPE`Th25G2K5}BzKrRn0^!XP*I`2AA zh9&eozrEjN*%g8GgJVIp_YzMb3=DHrnR7mMRu8B7$LccA2=7==L~Ul!WqNk-!~#eA zwi0yP(-ntmQ|aS>eOn{|_LWvzb6!s~v9Y;Qz2PF0Olnk&*_$|BZ>C#s+2Hz;Aj8%3 zumxVOAC{LLX75fiDF3YZo!+Gh{*8_sI0YKc71ONa4 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spreadsheetGreen-ipad@2x.png b/launcher_icons/defaults-light/spreadsheetGreen-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..35872c186718cd256e13545d36470b703d35a8be GIT binary patch literal 1774 zcmcJQeK->c9LI;UAxTz`m#mUfD_ZMvS($=4J{s(M=>ue zPHl9Ig}f{**OM;c&dxTIiFsRWG?SRwxxerJyXT(g^Zk9F-{=3|^Sgt?`dOOWn*#s< z%K(2=@OrcU4#;$U+IH^RyV=H}fGHyY$BIJa?@hzohbL${=~dOOaEOk{~wEp-oQYV zKk*>SC7PM5ynh%ooEWdSIfgYs;sc0+iz^ zZW)%~Q6kG%R6!}3E9VkJr&K-IYQ}+QsrqL4kc+ zNnR_i=p(W;RxiQpu@lHzO1@8eL-ks{dPMMgjI9$=wb|r^(mPHIy>#M;;gg|c9*$6@ z-aIskfaxdhy)XoRhyJ>P2X6P^l|trICp}>!H}uSDM06g1XZ2*mF120yKDH`gV=caZS-|fP46NHVY-w&H8bxPLQHw7Sxk)vBWtD==aQsFU#RjY*jLKwMw)7J zoWK%-CG)_z6xo?j?#In@$8BS}u}q=1woTF;8yrfOQJb&pd%@mJVU`s;;sK#7$GUW^ z|2$Z2G9*}Izr*gmWXg5fdAq5@@FD*`2u~^!b36%Il{06TTW*Pt%5x7&F7>5UWIm)g zN}rwxBb+?44_Vc>{!>1 z#7BkO?O`){-;Np!s8f*$`b4!7(}D`aR|=_!>I8C$+U)m>2-Vy>uAdE|O!!S`WQEI& z^S$I5nd@Nh&^~i()@>spq9(0ao){iuyvnrsJJ^mEu7E{<5+{gpj)g0{c5|} zz%NnzVOJKD&6m=Z(-S?)gCpO>Y9Hu?o_7z2;jK+qw~wY}a3p4;4U@v~p02|^zJ7du znL@(72qI?|!(Ovg2-vo30&Kf)WeH^=>}kyq_1CrbH87!B80+8!*H39@7y920oW8h# z{Mf|Ar8|z$4mq$RGGe+Jzc{(;2QlHBtZbxlI%L%REsa*H9oyX6pQeywMA9!w@o&bi zGli`-M%~L<$_Cm?+MyHn&=(F%q*&6W_Ge6_WWUX(sWBuhx38fXBpsGCLUnpt&uQIC zV>!Q2s$Jf!LKYNv>H)1{p$6?`KhBr{58WtuMzt4%XZKw}Q5{(Y=d+QOO~KCYnNRyD zL&dIDm+?RjDW2^c1a)U4hip`{U9G*1qq($P*7slGJQGn0L?@r=Sq!%RVPI!s9t=(V zceY&(YQM%wklj_w>`JEP_Ag?Hu%U|Dws0DKxr6D`13ZWr#955Xj2uRf@n_rui3{wc zO4|GKVLylZ`UdE32t!G&+#|VRnmv6nC~6gYg58N_e#USSe!NV?52K!NMb zsmuLON}#az1GJ_n3b=k0QK!y*-WF8(9Ufzg3f?#+qP-J@@!yYF7$}b6MciZ9Ja=in z)mffNcNhF&xmkYlvyX^6_}rZ&nT7MA?MvLZa3_)Raqf8sbuHtvIkp!0;lfeRjYh^I zafw23my_8)zT;Y`)Qm5s6GdwqbIJX+e0zNc52t(Ob`OvFRnphzQB>DKy6oQ7_~|!K z%og=FQk(<#PsfKXZWcMf#hg9boX#_A3A-?m@{p%>6b&UK)Kv|=_0Qw^@21KCI87A4 UdrezuS$|J}05lfG^C8~)3suBPQ2+n{ literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spreadsheetGreen@2x.png b/launcher_icons/defaults-light/spreadsheetGreen@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5233007068412e50ba731f02b4773e05e91405 GIT binary patch literal 1453 zcmeAS@N?(olHy`uVBq!ia0vp^l|WpoQX3e9v)nHZrt+eeT`&x4-QSdi>N;KKp(QZ`JaBYcW!tc zQymyG-zC6o7PGkS}>b+^I z`?dD-&D#)jIP89Dvq$xD9i@}JNuDp?Cy0jEUVmX8w>`&qQ@kX*q{Gj@E;1Wd7OlaH8wj7e#Y{~vo7^XMwgxaPZ#+@B}?p5)ljsN0_P?^&pO z=PYg6X3=TwTE5Z9?A3LQcHf|9!*?nQ3+ikJx{JCPT550_* z@b%6+)$_A#JRpQExAy2blns2ZAIOeIt2S~_)eZ#A-u+LZ_+c)r%q298vn=z-Y?~| zIm17xb#~ra6W6r2pZ+IbV>#gK9{l{(s`XbwB22~ z@&5RnmD}q++&4vn#UPyPZJGHy>&1%p87EjKz@Vov0 zwRau!8}-B26E~|?X6ApC6zNd8xwFdsj)Kf0?cj-OtN%rP+$;88cIinU#)ofbZC!Xy zfJtR0gQuFqB+dyb5axkUHrHJ-0#-T(%JR1^&6=1{2h0o+I*b!crTKTsuy2>2{$_r{ zzf#_vCl<`e?$edIUsg5!XQ@I|XXeS5N%317J{Rnp(fe@bYxSb(=XQqGCm&yvGUe2s zLk0W1KIfeAT322aoX`L8^u*9%WyR4Gu%oa3z z!n=FY^sDMW8y;V{xyV3UQn>v&@5!S-U)`J2`?5>?(cIrzF}XH+9+T$irzO`lBylwJ z+wL`ds;Vs^cbZkf?AGBZfwhN@YKUB`Za89c+g>)yMU~q#V^-z+=Q||*+dM*!y;?iL ka4{C|BZUM(<^$=IXZ6<|YPrn;EL|BqUHx3vIVCg!0ME#ZZ~y=R literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/spreadsheetGreen@3x.png b/launcher_icons/defaults-light/spreadsheetGreen@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..defc717d7fdc33693175093bcca0f424a7330d48 GIT binary patch literal 2100 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/tokiwaGreen-ipad@2x.png b/launcher_icons/defaults-light/tokiwaGreen-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..332750dd95d0ebe8a442b5d31f9de5438f6c9ed2 GIT binary patch literal 1837 zcmb_dX*3&%7LKLF)*?!yB(1!m9a>9_+YG&;6g8ci`pL#7o=N)t+|jOy5uYN*7> zsA_ABwQ)*nZ>pBsrZuHR5Jss%LTt6fWX_pCbI$yG@5guV`R+aU$9L{M-_1DhiP2Ei zR|Nn78s}VHd}Ns=0~4qui<6%Sh_pc?SU;fyrbF~?M- zj>$=djQZ2+9mpQ}3?z;>#k(r+TmcGu_yzLAZI2=@85DLeuY@3*(@&{tZQIUWfJTNvjfH zyi-|snrE&G+X#e28^`_6jpZA9_ns6C1}%*;wnom*3LI8ycF0Sl`wo)a<3IO|f+?Gh z?=L_dT-OPWl(#Uh2Xp}b%Lg-fo>-s%4alaF8%rW(yc>(=COr_)r6%iO`Y~<$YeKGdr z%})*OF8GGITQ_t=!s=@a6QE$)>tE>77_2a`Skz1>ZkRWvq+mJnwee=dz_Kg4_Q}pO zRJ@z{KFNouWF(PvM7ZwK7w_zK-w%SczI*yQ)y@w!Ma4heWC-s{qyb$5Vav|trS)H; z1C#VyLbxKxFhox}t2-#57{g3O3#0;+!B|W&mNO(*2Gk7jE4_ zsXKL){_vJ6{zw8f5k1i9-1Hr#ak9=A$jVM#tfd7Ar<-EUz{Fj=gHbkTzVMf6*}6Ok ztOS$ewi=FEEbcY%T=1{93RxQw6j|EUPww7j!%=X@2+o_qEJE{$bU!j7($({pW z`pzc2bKoPzU|2Pc{P`p0w2n+JqZ~!Uc1h~3oTzYPBT4?c_hS_iEXxZVzpyOI>{CMx zWR`cyk(vV zRGv&Qygj2&0J@_egl7|sSSDG@sjr&+41So*N{twKXtygkZUF+zH*NIjof3G{ro@~= z_2>+L#Pyi?R&?Rn4!ki3s}S+j(zY^&`{?!+?xpmC)YYQ$;V7H*DRkH6O4gB{d6Vuh zZS5z|V=cuf&N6MF-jI*i8t*QDIiJ&YPEQ-;EM8?U)*-pur18bZm%>DhC)?Uu&8Eud z#tU-PXnwVwmryzIapVBE?@pvWcfC3hm zktP~1LCBnwn*Xx&zg?&dc>s&MxrCZKRu zA!R`bTH2ew`Jdmcof^s9PGe_+AfVhx3IIYIa$?moltnP-W4OLN<{Gh+<@FWv8v4YQ zqSfHwxZj$4q|AOR*qa@rM$6%HWV{h z8R{jwG1A`O%-OcTLeK19xaUhA>)$Cy^-uLtXA3f{>t5Af7lz&7M*ml2%vbcKx}O~e z7G&Mu3%!XWo&lAX+I;`sEud2Jq$&UZY3l#@57GnAO+Soy03cPe?*=%B_H?Os3QqkK D(^_u{ literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/tokiwaGreen@2x.png b/launcher_icons/defaults-light/tokiwaGreen@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..99547b9c9579e5355a49a00b310cb237aa3ee069 GIT binary patch literal 1478 zcmbtUc{~#e93RnglR09ql4XR^UOBQQBj!kw9GS^nIdVUS!rW_b#zf|*5XqP$iZ+Vm zJ`#~~lcCMK*P3;+Pc%+V&cJdNZ5f9N2O zM@n7TJP`^)JB0!OBGP|@50INL&l~cE+M1yNjDGL}F9>)WT`~dyYA7OHH$ebE(AnI? z$PUl9RAA^2G6S{$Q3MLFKAC=D8Z+Zc@QnCkhZa(W9hQ<7DmxS=R7$y;fqqVUENm;R zU{IuNG22irttNJYuS7|w!03#WnjR#*IR-_& z#&kJL_ZSZ9S4(ViMT^v*CNHil8igULR&fyN<6Q!1INyJr;KpqusXK zx;q%lnD*xV2QN^rwHsS1&I4(9_UrzMm1ivaCh^A)WK&^Pgc+iFlZmVXe-9sW8XbtuVWok~=G0*4;dj$B^dmuvkDZDNH|7R*J~s2x=EIO2e{?(G5k z!;`)#>nnrqrB6;>vNVdVV~k3FYlVmUK*6N#omy>0 z(S^CTm*K^!a{oFv^SWvrKro~n_XyXNok6J0CO}5Ws-OqAR`QoLZ(ad0AjXTsnLtCLVxsYxZnxKjtrVt8%Ty4}Dw@=Fyv~`f0}@rbKov^&;D^uv<|_YK%r%?G zJ%UO%2%fRa8szu#HD_TEV>Wwsrx&cA2!>wH&tPk6$2PX_iaXYOK7*WN|KxU5xhqSK z;Jg+UPzqjLPU?_UCfF z%~~Y+do5tP`h>tp%~WeQ`_->1q4~hAT|6?_phi8iOux(9lmc8i<#kdSLlj^lzTlf& zB9u#k*v`zOe%hM4Ff&4*!K37cIUY>T*4≶>B`rqbbr8ZV$nuc|!ifAtdLfKj%lah_TRkypC_^NZFd J4AhPIzW_#LuA~3} literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/tokiwaGreen@3x.png b/launcher_icons/defaults-light/tokiwaGreen@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6587a2a08d9b6cfab508c7bcaf692a146ff9bed6 GIT binary patch literal 1958 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 literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/toyCamouflage-ipad@2x.png b/launcher_icons/defaults-light/toyCamouflage-ipad@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2af8cf081533520592c0e2ca3d698aee9d549bc6 GIT binary patch literal 1832 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 AlK=n! literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/toyCamouflage@3x.png b/launcher_icons/defaults-light/toyCamouflage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c39ba0506417a03724450803ee67c3b5e6599091 GIT binary patch literal 1957 zcmchYX*3&%7RRG>VrejnswNGghGvwu)Xs~lN)er+6A`g5V`8bLTACP3Y)?_tQzI$H zQrg5W1hG`@T56pTr6gjDv9#0@&wPL9yl->P?|=X2-f#Du|G78$F6uT&Tu~eV0DzEI z7WYoP?r({HcT!D;zPol}V!>8Up#Xry*}o+O$jeta8488oyKN4jy$3I!G$OtTTLb`5 zoi1_cei{G(8X_$a4v&P^*(P{LZ*b2ha6w5Z^V$eQ!$Mf%uAWj%?_G~}1U929^Od%K zvhW`YYBIP|Nd-tgx~s&E=b@xwgYH*SRiE>k7L!qC%ztCg-gNaFXl>p7YPz(0Ow7EH zAzHjMJ-xk^ztpy}yF{n_(BAc{n6~+F)jz{lWT!PnuxqCnz2h9YzcH%wWpRU5NhNr? zVC-8aXgKGCrXAYG?}F;3p?G8IFfxo8w(Y?%yn(eaewO2DxDVSKU-c=f?7?+^IA`fg zO);GasCfju$OyT@Zj8|66urIljssynt-R>Vm0k6^c?ukaq4_Wks{9r(#ik(<1A7ZI^vT?`hU zw1`U1LBRO}X}oABwFyMF@gziSp_D*Mg5sQVdu`h;r=2d16{m23ZvQ zb5NRWqJm*din_(HqruytOTiG_+NxO<&%0NBEpFmzW(8$lOLh->c6YSaNrJXh9T3&r zCYnds>@xK$n{M@!$9sd>=+`_;GkIVI*qOzZRLpGPg|zW?oq#0h?*fAX4uSeP)D+{RAJl% zu}`u6&vFnX`3Z*v!YsUJT&;-hHG+E$muZo0ROnh|Sn0Z;C18@=C(KqWyANd>pN6S6Llr_!$1@GmLHG9PS2hB%C$ok7(|VKzKyf3W+ho!W88 z8o3_ucGFti!{1i<15galo zr^f4$L?z@w=;~`D&F@|}a%RgLbyd|@ieHz+i(+0LKF8i{3Eif!RxR?9oi}Fe?O36< zSZF%;iY4V?eXf!xn?YA%raFhg9*5%_OBx4q4aU&9gyH(PG3&s4l0J6T7}U%VmYm#g z%EMNk8cdI>Bbpl=Tc!o>uU(#<2c|59&OUb?61*_ioGoV&!|cDDc04nR$L&$u=Sc66 z|NqX(M7m09PLAOQ7SaQUoU-0r`W;iz^y>g$C!-JJucNl;Z)75`8^*!s;oaN`l@~v; zqOz;tu^MR5$5B|MKlrgkc<)I6lg^N^t>ko++9G@qS@^IyD11t-)^_V0%r9VmoVE!X zywT^JRG?eHBnW+_i>R^D=XUap7ey(4CS5zg%nCWj|E1Z7z!$HBogMjs7 zlRUaiSdMwVERn@!A2c_`80N^s{DxF!rb<0=twu{VF@`vKZVkKqt*`&ph9WR9<_Sp* zlkT9=&9NN9XZeeUdzPd|x*Z5gi7!!rP8s2RJZaZwgcdQz-kxR_!Y9uGwp z_EhM+^8K18#daA(szwOEPCO5<>in#VR`&ZR_y#=|+gx*vp?^O4ssQ9Ilm*S)E%v{b C!X%BMmPlw2#BxMawFO6~N~*Sy(O4Ry zwY116y+NsvAyiY{(1=!B4WdzXGymtzzd7f5zxR9JpWmOa6cpsED5oU{000!v`+0?k zyiFvEjFe~=>S{)dOg6aBisg(a7 zEeQZfpFHp79+oAxwL(XOGjt}l^~Xp5yaPNY8+U_NLSs4BhRG;sk;UVzX=mb$Q|Iy4 zv}L!eT6PPvj$e+SIOTlWqMt}rmp(3qI#znxZ1C+j9s4XQ=u`4%Iu|oCA~1J2qrBey z=yPMP9*!%3KGh9z-3`(~p~uBF(xjN0PA3Ov}<<;Q^_4b>mL^8R{GoOWBx zFw35(@rhZ@`P06RnzuR=qkRD-{VJetV^hW0NXmML zA)j2x^R4&&@guTNq#Q90xcX|x?tpaYB(P8Lk!!P;d4~C+;&v2z5~$5z3b~>s4+-@$ z5N}Wv##nN}1E>S=Brt!N^CNjuM(;=e?G{69(hfpP>YTf?ay5=#LgrwJtLD2k5sD{p5wMr}pnAz!bz)n33mXkN z_G(#pg??NY&A+d}_g3rZ-xOrrZv`C~Ki{Sohj>Lw2uE|9?iT3hu@;+H_Wq0) z%A?3HX$#!OG3gF>`T-%i4_3f-@?4-(t}FG1rv6dlPxDm@D8wOclSpzDXzCw+-39Cs z?AqfcgV~pLg^KAhN31Z)6{*gV(5NV-Sx&LS!uIdYs-y4sH&Q2ozSxf!KEXBa70vJ> z$!=v$%65S-NdsSrmki4+Vo8Vl9#)DP!G%NYc6#7W0t54t73f`g;iw_ahx9j$TiXWi zz;1?>X_9b}KYNl#PX-fPYAq>?R~DW9$lo6(LKi!e7YgGLHQ$DjZ?DB`J#+7+SAj`d zx$TlN;WjQxti5nMJT5o71I1^nCJSO!Hgtk-4&0r`Xz6n++@Fd z4j*pf$?QPv=C6QUR~u)|(x@_Yg&9WO>sDL{)lf5Ui=25KUKG#ko53~Hc{{aFC2E>` z)bsFN;S8A9+aM$F<%eQ@U5W*3ARQ8W%)W28Vwt!>};YEpe7*Gu9M!p8+y z<a@~zBT4-K;1q=av*-x7fL6w1zi1qqzvifcDhH&1SGP7_7)e~?jirv^pgvi-O zCo?^yb4W6sp+*Ji&vH`sdGLsddl>!_fzzHaq}8e9pQgX8W(T6v^fl01E2JuOT{}c) zOoOG8q+@mg5d9$vhcjHaiY3uuPKd;N@>s1|Wy$ahskq(cQVWgqS=Bf2$dxHaIP9?Q zvQgdi>Ui~d2il67ri;=H0bEF#BBHuu)wJO=F% zZ`P<3x&ru5Sawnz&w@Ow(h_Mt{8*X6{O)32N5XG!jLLv#IVIVn05Y;dC*_Q#&m${fyp$817KYMw9xxD z_rD&pQ)YFUF5*<_c#fSifED-qZ(Bq22Mlh{($38pPs|IWn$RRSDAo^;H1b0)Q`wOh nX~PupltHjVrD%vmi%j)_3}dPys?3O25|K2sRE$QEs+F`N ztJ-E~kVZze>b-PCrJ^0L*2c3XB@wD2M%85h@BZ3vf1G>2bMMc4&bcM0F=$g`8)Ev7owwen>3|0v`W|889oDry3-C0~PUwjqA zGU7ta{X?B{u0_cI=Y@>v?y#~KnB|)GP%}ZH?F_9y=nOEd!AYq&;N>fcZ^;7!C z6ua@|u3PRSl%|VMCk&n$%Id0%xyeqBaRM2s`o6S%ECrI<-O{|dd9!{bfmH9fAdt=; zz2q+1e#-mTs5*n#L3wKww4Xd34qAO|j>fbtpr=WHV^c^a3xa23(oW+>yNkDJOf$ z;ks(crX_o%H#avp2SF+UVn=(zl+C0`9iz-eM{+2dnZ0VhhF2Nif@N8K=#>v#bun%w80(m z+HL$F(k)i!{Hw3%Kl*;6(6L4&LU?nYJqM+Gkmp`u@*l)!DUnRR zv6+9rsP21X10ljMti=P(K^qtSMLv!JwyF_Sdf{%!x+&P$!xry2r95%Gkw}(!1n%DY z=ag+FD{_YYW6Xm_myS-Dr8S=N++*1P%cAPqpTxp~hmOLgbc+NLPcn~N@sS`IsZ3uJ zzadv6P{s*i;l#3)TFLhNih&?|XIBd3o~YdhRZtl(BTOPGRVTZ^YEv%NS(iv2aGHV2 zcKL@>E*<6jozK$1O=U~pC10huIzcw7)KPbhRE~Xc-*3;Wrn3%>NG8G9-}S1LWcydk zU&r$IQE?PYgW;Bi1KHFcpsS+-o+$Pzhz*=u&GfX!HXz6v6;MFgB2w456FQo|*9`_t z!7Q-1V6`Q#gohEb6n+2lqAMG~atlIhU1qh!>dNjK6rep6AdoyG9McKJD2N`@^41 z5z{L}2}v1Tl5;7og68VPn0*U-#fSNU2fjcKWX9apT@ zQ3iq4dThbVvUPoSTw(f3u5^CyX$l6s*lJS2J zoneLDo^$(QyzKojj}K zr9p6mo=>7P$O$sF0yqxl7kO#PG@5Zj#D@NL?6jYc|K+nTNj2|hX}BTl>t)xLaB{9w z(f!|nT&=+)x(?pnVkIB5M*H3)Xza0j6+;DqcNhaZV$VAc%$4%G(#&Utdjq(r3jFpay;GTw-d5ljRDK) zc|?CP6s}y{J;%cn7OyN;Kg<55Pnb2Aoa;l$8*3lj>^Wy&$r|f>dk5FePWXIE+Ase{ mw2+d@%4D4W$5mUSO|Ail!Ca{H_QrA(XXPCY35j*m0{ zdf|3OKi^EJTGy5q>%5vJ?Sy&U-L|+}vm_Qe2-62l3#Sris(KYp=sLXO%q%c9O9$6* zjm^@M_f%OCl$@U;El#PR4&2JOH}MAkwuKpU$YL28!upji|4!<;jYg)7fDx5q81uOZ z&yq0VUJysH3$4te1HF%UyqVoBA(!5TOfuH8r0HUCt-fGKARJbu8qwi?a>Hb|1BV8v zKVS7aQ@Oq74fuZgXqZ-}$^s)P7+NJ~qs zQ^ix_Es;52dYef$|5~XhCDK|8XQU13c(>L0FilDnYlV%oQ7Nz4EaW&&W~eN~D3KOg zvtLJicAo%&utyF%^G(=FY8{3{+RQac&Kttf_y&7ybUm!X)&lhj9ih*9EB}D<75yw5 z$6Gu~eR*gc>0H$-SnSqN&Z$*p`dp2l@u-t<9g|<&+S$w4RlKKTiTG4{R+7WuJh5zG z?dVpTsf`V#U8DBWi@u4Q(5M1Na8P+wF~6p-#XumZBElrc4G@*^mVT=l+^7!V=9)Uu z-Tn*Dw{#wgN!3au?<+m>HB&ZkSBlJ0>54U1-P;TISj6xq2L&W)CT#3Pk2AfC zc;vbpJ*^)d{C=)F!I=w$L4VT;xhb;uSiC1RfINb#LH;D)f2=}&=k5WxZ68n9x+y9RnQMy=p zMTT}PnFKc)1Zxj^I@9#xArr3~o4Z6~FZ-TOlU*3`w@@-Y#K;WiJ)fz>P|4D*;N=88eW$(n+`iW713zqd-=BeMq{|UA xJoB}Nq+$Vyo{7A~hUQXJyXF4ZAPMJdUD58Hz5^kTG$))}kgKByqS2m^{5PPCnCSoj literal 0 HcmV?d00001 diff --git a/launcher_icons/defaults-light/tropicana@3x.png b/launcher_icons/defaults-light/tropicana@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..97a00591df41957abfb02abaa42af2a4cb19ac95 GIT binary patch literal 2093 zcmcgtdpr}07oU4|6^RgCk9kG8HzU;~*^+lj=H{_zNTFf#2+OnRHH%V-unC{o4fEbG z?+Zt4`Kfrp(BtTx@1V(z*nD`ZR^z?Eei-S+MtKMQ9G-; zT@tzdrgE}t(AgHBlhd>x#8tm}ig!Nh+wlto4flB*4YBvfcHF49lmV%jfKOHjAuRJq z1J!@8cln#7EaKzOC3F409u*rde+(ObJ`_vyQo02!i`sj12kS68)ZH4puPK8)!&KPn z@NHOq<2=yIT#sG+j9qKF>#$fvwvqQP9ASP;+|1LzIWgXl#>yz{CdtcO0&%xLj-?6z z5Udou|B~QQ6uh7~-0hQP7iK&G7N$Ir43Idd2{3KI&S>pp}uDXYg3 zg*mI)yFb}g9+qSEB87U$CqaO>*cF?S!0=kPVwL)bHi~Mnc<36@cK8>sH`%#~CCTUi zf*>#PgJ7L_6MCIx10s)zpF6_MdHtBERjsk-3}egp)R{3lz7Ne%NSdBq z`y{+L;ZyzJ%Xq^eyijG~iSxgpVHhnI}nM~53{)V2NEqE};Es@m_ zImAQdfenvY9)Y;VaqSwr*2>s;U407G|8zcQ&ooFtuedtNYjTPnwjrXLPs^b<2h;jLS9MRnagyR6m$2UeU?64Hr@D~UA)I`LVR`}}UvNfHDMBV=l zYLBO%r6qHW$Lz9UF1vs<)3jlpRadRURK|GI)Uu4h4^w1gnFS{4**6H))X-LIM}zA# zztc}nV~=_ySrvBEqK8#W(+g@xES@Ce2Bs&#NJ|g$-|qeSU+lhCOqwC(HaV2TS8DoA z3e5|s#IUo$WhscB-g8SJsH=u2tkl{!?a!}SmmffY3xN+w%c!M}wf9%bGq99h{$eil zP*5-gnrxaFaqR}GXh+{7!y^Y15>c=dcLxqG3s?RgOR-OpwLDS1zN?%u()fs#w1EuZ zA6>xpSj21>;E1I_v8IYKG$2Ju4F>I-RHk_`ySKd3B*pnRPDEMpia`RS=D2Xf>qa7C zP{CY*?y_laBakEd#lq*3*7;F5qy9jQE(|=2(Y0`?R|riD?_(hdTaT1xk9?_eYP@fC zEZT}y9qBVjdC^M@lV(p$PUco7lr^6Rk=upwJpl;>rC1nyCjYPu-MqOAePbd96S*|_ zokzn{jpdptLCNiIq$0Ara5$*AaZDcdCvT8c7``@LsCJhv+lnYfV5DYFpZ9+T|z4D?C3i41`bofF%+NLV-v> za+4ZJ(xJ)S#w=R~rO&IOy|9N5aHML@)L`t&xr3K8o`xJ+j{C&I%;*USyY-2x4MJ$m zHjS{5s=IaCzJJ6XA_&C<_Ptb)swWElt!vS~KP6k6l2Lxw4E7n2wy>4|KUj32kF_SB zY~c){s2@S1zS#;!mupM})LT*I0=sW2b&@;~V|eP?3Zm7*?b~%JYDh^N`e}ol-?5{F zXo{P;8FUc!8ZSBBe9ePSp5gEMM~+2?@OyP0Fi!C4JJ*JDMV*CFSH&u`mXlkA0RfoCiLE{-6+GG{w^q82fuFgCAYz z4`Lcmm5dMF8#`Cqueo1a4d#7^Oo>8VX~bG0=yt;~yUoJ=j_|td!*mcRmpSHxncI(F zR1K<>e~yTXCd5_Ly8WwnaWSFVR7fsgu`E8RuvSOQPAc&~@Ss-%Eldws&uf`G(!gGC z^F4;bF;UI+IZS5TDW7o+HUDB+Jr%A>5PzTg6!+}w@6GTtAarv@pu=rT>EMYJ!w Date: Tue, 29 Oct 2024 23:16:37 +0800 Subject: [PATCH 2/6] fix account card summary --- assets/l10n/en_IN.json | 1 + assets/l10n/en_US.json | 1 + assets/l10n/it_IT.json | 1 + assets/l10n/mn_MN.json | 1 + lib/widgets/account_card.dart | 30 +++++++++++++++++++++++------- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/assets/l10n/en_IN.json b/assets/l10n/en_IN.json index a8c262a..4636fbd 100644 --- a/assets/l10n/en_IN.json +++ b/assets/l10n/en_IN.json @@ -82,6 +82,7 @@ "account.delete": "Delete account", "account.delete.warning": "Deleting this account will also delete {transactionCount} transactions associated. This action is irreversible!", "account.noAccounts": "You don't have any accounts!", + "account.thisMonth": "This month", "transaction": "Transaction", "transaction.new": "New transaction", diff --git a/assets/l10n/en_US.json b/assets/l10n/en_US.json index a8c262a..4636fbd 100644 --- a/assets/l10n/en_US.json +++ b/assets/l10n/en_US.json @@ -82,6 +82,7 @@ "account.delete": "Delete account", "account.delete.warning": "Deleting this account will also delete {transactionCount} transactions associated. This action is irreversible!", "account.noAccounts": "You don't have any accounts!", + "account.thisMonth": "This month", "transaction": "Transaction", "transaction.new": "New transaction", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index e84b6af..35addae 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -82,6 +82,7 @@ "account.delete": "Elimina conto", "account.delete.warning": "Eliminando questo conto verranno eliminati anche {transactionCount} transazioni associate. Questa azione è irreversibile!", "account.noAccounts": "Non hai nessun conto!", + "account.thisMonth": "Questo mese", "transaction": "Transazione", "transaction.new": "Nuova transazione", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index be7312e..571e323 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -82,6 +82,7 @@ "account.delete": "Дансыг устгах", "account.delete.warning": "Энэ дансыг устгавал холбоотой {transactionCount} гүйлгээг хамт устгах болно. Энэ үйлдлийг буцаах боломжгүй юм!", "account.noAccounts": "Танд үүсгэсэн данс алга байна!", + "account.thisMonth": "Энэ сар", "transaction": "Гүйлгээ", "transaction.new": "Гүйлгээ нэмэх", diff --git a/lib/widgets/account_card.dart b/lib/widgets/account_card.dart index bf24fba..4c1638d 100644 --- a/lib/widgets/account_card.dart +++ b/lib/widgets/account_card.dart @@ -1,5 +1,7 @@ import "package:flow/entity/account.dart"; +import "package:flow/entity/transaction.dart"; import "package:flow/l10n/extensions.dart"; +import "package:flow/l10n/named_enum.dart"; import "package:flow/objectbox/actions.dart"; import "package:flow/theme/theme.dart"; import "package:flow/utils/optional.dart"; @@ -8,6 +10,7 @@ import "package:flow/widgets/general/surface.dart"; import "package:flutter/cupertino.dart"; import "package:flutter/material.dart"; import "package:go_router/go_router.dart"; +import "package:moment_dart/moment_dart.dart"; class AccountCard extends StatelessWidget { final Account account; @@ -31,12 +34,24 @@ class AccountCard extends StatelessWidget { @override Widget build(BuildContext context) { + final DateTime now = DateTime.now(); + final double incomeSum = excludeTransfersInTotal - ? account.transactions.nonTransfers.incomeSum - : account.transactions.incomeSum; + ? account.transactions + .where((x) => x.transactionDate.isAtSameMonthAs(now)) + .nonTransfers + .incomeSum + : account.transactions + .where((x) => x.transactionDate.isAtSameMonthAs(now)) + .incomeSum; final double expenseSum = excludeTransfersInTotal - ? account.transactions.nonTransfers.expenseSum - : account.transactions.expenseSum; + ? account.transactions + .where((x) => x.transactionDate.isAtSameMonthAs(now)) + .nonTransfers + .expenseSum + : account.transactions + .where((x) => x.transactionDate.isAtSameMonthAs(now)) + .expenseSum; final child = Surface( shape: RoundedRectangleBorder(borderRadius: borderRadius), @@ -75,18 +90,19 @@ class AccountCard extends StatelessWidget { ], ), const SizedBox(height: 24.0), - Text("This month", style: context.textTheme.bodyLarge), + Text("account.thisMonth".t(context), + style: context.textTheme.bodyLarge), Row( children: [ Expanded( child: Text( - "Income", + TransactionType.income.localizedNameContext(context), style: context.textTheme.labelSmall?.semi(context), ), ), Expanded( child: Text( - "Expense", + TransactionType.expense.localizedNameContext(context), style: context.textTheme.labelSmall?.semi(context), ), ), From 43a77fe7ba3bc26f101474d79ca2ee6b504340ff Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Tue, 29 Oct 2024 23:18:41 +0800 Subject: [PATCH 3/6] chore: update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23745ef..6de9d7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Beta next + +* Fixed account card "this month" summary + ## Beta 0.7.2 * Added themes, closes [#105](https://github.com/flow-mn/flow/issues/105) From 10d8532808b9803bf675841686dd45e0be65bc90 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Wed, 30 Oct 2024 00:43:08 +0800 Subject: [PATCH 4/6] chore: french revolution for money, amounts, draft 1 --- lib/data/chart_data.dart | 2 + lib/entity/account.dart | 18 +++--- lib/l10n/extensions.dart | 27 ++++----- lib/objectbox/actions.dart | 58 +++++++++++++++++-- lib/routes/account/account_edit_page.dart | 9 +-- lib/routes/account_page.dart | 7 +-- lib/routes/category_page.dart | 12 ++-- lib/routes/home/home_tab.dart | 22 ++++--- lib/routes/home/stats_tab.dart | 1 + lib/routes/new_transaction/amount_text.dart | 9 ++- lib/routes/transaction_page.dart | 20 +++---- lib/widgets/account_card.dart | 11 ++-- lib/widgets/category/transactions_info.dart | 3 +- lib/widgets/category_card.dart | 6 +- lib/widgets/flow_card.dart | 3 +- lib/widgets/home/home/analytics_card.dart | 14 +++-- lib/widgets/home/home/flow_cards.dart | 33 +++++++++++ lib/widgets/home/home/flow_today_card.dart | 6 +- lib/widgets/home/home/info_card.dart | 38 ++++++++++++ lib/widgets/home/home/total_balance_card.dart | 2 +- lib/widgets/home/stats/group_pie_chart.dart | 15 ++--- .../home/transactions_date_header.dart | 12 +++- .../setup/accounts/account_preset_card.dart | 2 +- lib/widgets/transaction_list_tile.dart | 3 +- 24 files changed, 239 insertions(+), 94 deletions(-) create mode 100644 lib/widgets/home/home/flow_cards.dart create mode 100644 lib/widgets/home/home/info_card.dart diff --git a/lib/data/chart_data.dart b/lib/data/chart_data.dart index 4a22773..d77aeb7 100644 --- a/lib/data/chart_data.dart +++ b/lib/data/chart_data.dart @@ -4,6 +4,7 @@ import "package:flow/services/exchange_rates.dart"; class ChartData implements Comparable> { final String key; final Money money; + final String currency; final T? associatedData; double get displayTotal => money.amount.abs(); @@ -11,6 +12,7 @@ class ChartData implements Comparable> { ChartData({ required this.key, required this.money, + required this.currency, required this.associatedData, }); diff --git a/lib/entity/account.dart b/lib/entity/account.dart index 5592582..e32d16c 100644 --- a/lib/entity/account.dart +++ b/lib/entity/account.dart @@ -1,4 +1,5 @@ import "package:flow/data/flow_icon.dart"; +import "package:flow/data/money.dart"; import "package:flow/entity/_base.dart"; import "package:flow/entity/transaction.dart"; import "package:json_annotation/json_annotation.dart"; @@ -55,14 +56,15 @@ class Account implements EntityBase { /// TODO should this be cached? @Transient() @JsonKey(includeFromJson: false, includeToJson: false) - double get balance { - return transactions - .where((element) => element.transactionDate.isPast) - .fold( - 0, - (previousValue, element) => previousValue + element.amount, - ); - } + Money get balance => Money( + transactions + .where((element) => element.transactionDate.isPast) + .fold( + 0, + (previousValue, element) => previousValue + element.amount, + ), + currency, + ); Account({ this.id = 0, diff --git a/lib/l10n/extensions.dart b/lib/l10n/extensions.dart index 028a624..e39d9fb 100644 --- a/lib/l10n/extensions.dart +++ b/lib/l10n/extensions.dart @@ -1,7 +1,6 @@ +import "package:flow/data/money.dart"; import "package:flow/l10n/flow_localizations.dart"; -import "package:flow/prefs.dart"; import "package:flutter/widgets.dart"; - import "package:intl/intl.dart"; extension L10nHelper on BuildContext { @@ -46,46 +45,40 @@ extension L10nStringHelper on String { FlowLocalizations.getTransalation(this, replace: replace); } -extension MoneyFormatters on num { +extension MoneyFormatters on Money { String formatMoney({ - String? currency, bool includeCurrency = true, bool useCurrencySymbol = true, bool compact = false, bool takeAbsoluteValue = false, int? decimalDigits, }) { - final num amount = takeAbsoluteValue ? abs() : this; - - if (!includeCurrency) { - currency = ""; - useCurrencySymbol = false; - } else { - currency ??= LocalPreferences().getPrimaryCurrency(); - } + final num amountToFormat = takeAbsoluteValue ? amount.abs() : amount; + final String currencyToFormat = !includeCurrency ? "" : currency; + useCurrencySymbol = useCurrencySymbol && includeCurrency; final String? symbol = useCurrencySymbol ? NumberFormat.simpleCurrency( locale: Intl.defaultLocale, - name: currency, + name: currencyToFormat, ).currencySymbol : null; if (compact) { return NumberFormat.compactCurrency( locale: Intl.defaultLocale, - name: currency, + name: currencyToFormat, symbol: symbol, decimalDigits: decimalDigits, - ).format(amount); + ).format(amountToFormat); } return NumberFormat.currency( locale: Intl.defaultLocale, - name: currency, + name: currencyToFormat, symbol: symbol, decimalDigits: decimalDigits, - ).format(amount); + ).format(amountToFormat); } /// Returns money-formatted string in the primary currency diff --git a/lib/objectbox/actions.dart b/lib/objectbox/actions.dart index b9750ad..f25e3f8 100644 --- a/lib/objectbox/actions.dart +++ b/lib/objectbox/actions.dart @@ -2,8 +2,10 @@ import "dart:developer"; import "dart:io"; import "dart:math" as math; +import "package:flow/data/exchange_rates.dart"; import "package:flow/data/flow_analytics.dart"; import "package:flow/data/memo.dart"; +import "package:flow/data/money.dart"; import "package:flow/data/money_flow.dart"; import "package:flow/data/prefs/frecency_group.dart"; import "package:flow/data/transactions_filter.dart"; @@ -17,6 +19,7 @@ import "package:flow/l10n/extensions.dart"; import "package:flow/objectbox.dart"; import "package:flow/objectbox/objectbox.g.dart"; import "package:flow/prefs.dart"; +import "package:flow/services/exchange_rates.dart"; import "package:flow/utils/utils.dart"; import "package:fuzzywuzzy/fuzzywuzzy.dart"; import "package:moment_dart/moment_dart.dart"; @@ -25,16 +28,59 @@ import "package:uuid/uuid.dart"; typedef RelevanceScoredTitle = ({String title, double relevancy}); extension MainActions on ObjectBox { - double getTotalBalance() { + /// Returns the grand total of all accounts in primary currency in the primary currency + Money getPrimaryCurrencyGrandTotal() { + final String primaryCurrency = LocalPreferences().getPrimaryCurrency(); + + final Query accountsQuery = box() + .query(Account_.excludeFromTotalBalance + .notEquals(true) + .and(Account_.currency.equals(primaryCurrency))) + .build(); + + final List accounts = accountsQuery.find(); + + accountsQuery.close(); + + return accounts.map((e) => e.balance).fold(Money(0, primaryCurrency), + (previousValue, element) => previousValue + element); + } + + /// Returns the grand total of all accounts (including non-primary currency accounts) in the primary currency + Future getGrandTotal() async { + final String primaryCurrency = LocalPreferences().getPrimaryCurrency(); + final Query accountsQuery = box() - .query(Account_.excludeFromTotalBalance.equals(false)) + .query(Account_.excludeFromTotalBalance.notEquals(true)) .build(); final List accounts = accountsQuery.find(); - return accounts - .map((e) => e.balance) - .fold(0, (previousValue, element) => previousValue + element); + accountsQuery.close(); + + Money total = accounts + .where((account) => account.currency == primaryCurrency) + .fold( + Money(0, primaryCurrency), + (previousValue, element) => previousValue + element.balance, + ); + + final List nonPrimaryCurrencyAccounts = accounts + .where((account) => account.currency != primaryCurrency) + .toList(); + + final ExchangeRates? rates = + await ExchangeRatesService().tryFetchRates(primaryCurrency); + + if (rates == null) return null; + + for (final Account account in nonPrimaryCurrencyAccounts) { + final Money converted = account.balance.convert(primaryCurrency, rates); + + total += converted; + } + + return total; } List getAccounts([bool sortByFrecency = true]) { @@ -467,7 +513,7 @@ extension AccountActions on Account { String? title, DateTime? transactionDate, }) { - final double delta = targetBalance - balance; + final double delta = targetBalance - balance.amount; return createAndSaveTransaction( amount: delta, diff --git a/lib/routes/account/account_edit_page.dart b/lib/routes/account/account_edit_page.dart index cd861d7..415d3f9 100644 --- a/lib/routes/account/account_edit_page.dart +++ b/lib/routes/account/account_edit_page.dart @@ -2,6 +2,7 @@ import "dart:async"; import "dart:developer"; import "package:flow/data/flow_icon.dart"; +import "package:flow/data/money.dart"; import "package:flow/entity/account.dart"; import "package:flow/entity/backup_entry.dart"; import "package:flow/entity/transaction.dart"; @@ -75,7 +76,7 @@ class _AccountEditPageState extends State { } else { _nameTextController = TextEditingController(text: _currentlyEditing?.name); - _balance = _currentlyEditing?.balance ?? 0.0; + _balance = _currentlyEditing?.balance.amount ?? 0.0; _currency = _currentlyEditing?.currency ?? LocalPreferences().getPrimaryCurrency(); _iconData = _currentlyEditing?.icon; @@ -210,7 +211,7 @@ class _AccountEditPageState extends State { Padding( padding: contentPadding, child: Text( - _balance.formatMoney(currency: _currency), + Money(_balance, _currency).formatMoney(), style: context.textTheme.displayMedium, ), ), @@ -301,7 +302,7 @@ class _AccountEditPageState extends State { _currentlyEditing.iconCode = iconCodeOrError; _currentlyEditing.excludeFromTotalBalance = _excludeFromTotalBalance; - if (_balance != _currentlyEditing.balance) { + if (_balance != _currentlyEditing.balance.amount) { _currentlyEditing.updateBalanceAndSave( _balance, title: "account.updateBalance.transactionTitle".t(context), @@ -374,7 +375,7 @@ class _AccountEditPageState extends State { _currentlyEditing.currency != _currency || _currentlyEditing.excludeFromTotalBalance != _excludeFromTotalBalance || - _balance != _currentlyEditing.balance; + _balance != _currentlyEditing.balance.amount; } return _nameTextController.text.trim().isNotEmpty || diff --git a/lib/routes/account_page.dart b/lib/routes/account_page.dart index df4f9e2..db53e49 100644 --- a/lib/routes/account_page.dart +++ b/lib/routes/account_page.dart @@ -1,3 +1,4 @@ +import "package:flow/data/money.dart"; import "package:flow/data/money_flow.dart"; import "package:flow/entity/account.dart"; import "package:flow/entity/transaction.dart"; @@ -87,10 +88,8 @@ class _AccountPageState extends State { final bool noTransactions = (transactions?.length ?? 0) == 0; final MoneyFlow flow = transactions?.flow ?? MoneyFlow(); - final double totalIncome = - flow.getIncomeByCurrency(account.currency).amount; - final double totalExpense = - flow.getExpenseByCurrency(account.currency).amount; + final Money totalIncome = flow.getIncomeByCurrency(account.currency); + final Money totalExpense = flow.getExpenseByCurrency(account.currency); const double firstHeaderTopPadding = 0.0; diff --git a/lib/routes/category_page.dart b/lib/routes/category_page.dart index 71a7852..31f0857 100644 --- a/lib/routes/category_page.dart +++ b/lib/routes/category_page.dart @@ -107,8 +107,8 @@ class _CategoryPageState extends State { TransactionsInfo( count: transactions?.length, flow: rates == null - ? flow.getFlowByCurrency(primaryCurrency).amount - : flow.getTotalFlow(rates, primaryCurrency).amount, + ? flow.getFlowByCurrency(primaryCurrency) + : flow.getTotalFlow(rates, primaryCurrency), icon: category.icon, ), const SizedBox(height: 12.0), @@ -117,8 +117,8 @@ class _CategoryPageState extends State { Expanded( child: FlowCard( flow: rates == null - ? flow.getIncomeByCurrency(primaryCurrency).amount - : flow.getTotalIncome(rates, primaryCurrency).amount, + ? flow.getIncomeByCurrency(primaryCurrency) + : flow.getTotalIncome(rates, primaryCurrency), type: TransactionType.income, ), ), @@ -126,8 +126,8 @@ class _CategoryPageState extends State { Expanded( child: FlowCard( flow: rates == null - ? flow.getExpenseByCurrency(primaryCurrency).amount - : flow.getTotalExpense(rates, primaryCurrency).amount, + ? flow.getExpenseByCurrency(primaryCurrency) + : flow.getTotalExpense(rates, primaryCurrency), type: TransactionType.expense, ), ), diff --git a/lib/routes/home/home_tab.dart b/lib/routes/home/home_tab.dart index 503e2bf..64af992 100644 --- a/lib/routes/home/home_tab.dart +++ b/lib/routes/home/home_tab.dart @@ -96,14 +96,20 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { final DateTime now = DateTime.now().startOfNextMinute(); final List? transactions = snapshot.data; - final Widget header = DefaultTransactionsFilterHead( - defaultFilter: defaultFilter, - current: currentFilter, - onChanged: (value) { - setState(() { - currentFilter = value; - }); - }, + final Widget header = Column( + mainAxisSize: MainAxisSize.min, + children: [ + DefaultTransactionsFilterHead( + defaultFilter: defaultFilter, + current: currentFilter, + onChanged: (value) { + setState(() { + currentFilter = value; + }); + }, + ), + const SizedBox(height: 12.0), + ], ); return Column( diff --git a/lib/routes/home/stats_tab.dart b/lib/routes/home/stats_tab.dart index d6dee48..13edb2a 100644 --- a/lib/routes/home/stats_tab.dart +++ b/lib/routes/home/stats_tab.dart @@ -207,6 +207,7 @@ class _StatsTabState extends State ChartData( key: entry.key, money: cache[entry.key]!, + currency: primaryCurrency, associatedData: entry.value.associatedData, ), ), diff --git a/lib/routes/new_transaction/amount_text.dart b/lib/routes/new_transaction/amount_text.dart index 5bd746f..52a8e7e 100644 --- a/lib/routes/new_transaction/amount_text.dart +++ b/lib/routes/new_transaction/amount_text.dart @@ -1,7 +1,9 @@ import "dart:math" as math; import "package:auto_size_text/auto_size_text.dart"; +import "package:flow/data/money.dart"; import "package:flow/l10n/extensions.dart"; +import "package:flow/prefs.dart"; import "package:flow/routes/new_transaction/input_amount_sheet/input_value.dart"; import "package:flow/theme/theme.dart"; import "package:flow/utils/utils.dart"; @@ -109,11 +111,14 @@ class _AmountTextState extends State } String amountText() { - final String formatted = currentValue.currentAmount.formatMoney( + final String currency = + widget.currency ?? LocalPreferences().getPrimaryCurrency(); + + final String formatted = + Money(currentValue.currentAmount, currency).formatMoney( decimalDigits: math.max(currentValue.decimalLength, _inputtingDecimal ? 1 : 0), includeCurrency: !widget.hideCurrencySymbol, - currency: widget.currency, ); if (currentValue.decimalLength == 0) { diff --git a/lib/routes/transaction_page.dart b/lib/routes/transaction_page.dart index c6da0a6..0adf56d 100644 --- a/lib/routes/transaction_page.dart +++ b/lib/routes/transaction_page.dart @@ -2,6 +2,7 @@ import "dart:developer"; import "dart:io"; import "package:flow/constants.dart"; +import "package:flow/data/money.dart"; import "package:flow/entity/account.dart"; import "package:flow/entity/category.dart"; import "package:flow/entity/transaction.dart"; @@ -169,6 +170,8 @@ class _TransactionPageState extends State { @override Widget build(BuildContext context) { + final String primaryCurrency = LocalPreferences().getPrimaryCurrency(); + return CallbackShortcuts( bindings: { const SingleActivator(LogicalKeyboardKey.escape): () => pop(), @@ -222,9 +225,11 @@ class _TransactionPageState extends State { onTap: inputAmount, child: Center( child: Text( - _amount.formatMoney( - currency: _selectedAccount?.currency, - ), + Money( + _amount, + _selectedAccount?.currency ?? + primaryCurrency) + .formatMoney(), style: context.textTheme.displayMedium, ), ), @@ -247,9 +252,7 @@ class _TransactionPageState extends State { "transaction.edit.selectAccount".t(context)), subtitle: _selectedAccount == null ? null - : Text(_selectedAccount!.balance.formatMoney( - currency: _selectedAccount!.currency, - )), + : Text(_selectedAccount!.balance.formatMoney()), onTap: () => selectAccount(), trailing: _selectedAccount == null ? const Icon(Symbols.chevron_right) @@ -274,10 +277,7 @@ class _TransactionPageState extends State { subtitle: _selectedAccountTransferTo == null ? null : Text(_selectedAccountTransferTo!.balance - .formatMoney( - currency: - _selectedAccountTransferTo!.currency, - )), + .formatMoney()), onTap: () => selectAccountTransferTo(), trailing: _selectedAccountTransferTo == null ? const Icon(Symbols.chevron_right) diff --git a/lib/widgets/account_card.dart b/lib/widgets/account_card.dart index 4c1638d..3e65030 100644 --- a/lib/widgets/account_card.dart +++ b/lib/widgets/account_card.dart @@ -1,3 +1,4 @@ +import "package:flow/data/money.dart"; import "package:flow/entity/account.dart"; import "package:flow/entity/transaction.dart"; import "package:flow/l10n/extensions.dart"; @@ -82,7 +83,7 @@ class AccountCard extends StatelessWidget { style: context.textTheme.titleSmall, ), Text( - account.balance.formatMoney(currency: account.currency), + account.balance.formatMoney(), style: context.textTheme.displaySmall, ), ], @@ -112,17 +113,13 @@ class AccountCard extends StatelessWidget { children: [ Expanded( child: Text( - incomeSum.formatMoney( - currency: account.currency, - ), + Money(incomeSum, account.currency).formatMoney(), style: context.textTheme.bodyLarge, ), ), Expanded( child: Text( - expenseSum.formatMoney( - currency: account.currency, - ), + Money(expenseSum, account.currency).formatMoney(), style: context.textTheme.bodyLarge, ), ), diff --git a/lib/widgets/category/transactions_info.dart b/lib/widgets/category/transactions_info.dart index 384c25a..7e302c7 100644 --- a/lib/widgets/category/transactions_info.dart +++ b/lib/widgets/category/transactions_info.dart @@ -1,4 +1,5 @@ import "package:flow/data/flow_icon.dart"; +import "package:flow/data/money.dart"; import "package:flow/l10n/extensions.dart"; import "package:flow/theme/theme.dart"; import "package:flow/widgets/general/flow_icon.dart"; @@ -7,7 +8,7 @@ import "package:flutter/material.dart"; class TransactionsInfo extends StatelessWidget { final int? count; - final double flow; + final Money flow; final FlowIconData icon; diff --git a/lib/widgets/category_card.dart b/lib/widgets/category_card.dart index 8dfed5f..f13845f 100644 --- a/lib/widgets/category_card.dart +++ b/lib/widgets/category_card.dart @@ -1,6 +1,8 @@ +import "package:flow/data/money.dart"; import "package:flow/entity/category.dart"; import "package:flow/l10n/extensions.dart"; import "package:flow/objectbox/actions.dart"; +import "package:flow/prefs.dart"; import "package:flow/theme/theme.dart"; import "package:flow/utils/optional.dart"; import "package:flow/widgets/general/flow_icon.dart"; @@ -30,6 +32,8 @@ class CategoryCard extends StatelessWidget { @override Widget build(BuildContext context) { + final String primaryCurrency = LocalPreferences().getPrimaryCurrency(); + return Surface( shape: RoundedRectangleBorder(borderRadius: borderRadius), builder: (context) => InkWell( @@ -55,7 +59,7 @@ class CategoryCard extends StatelessWidget { ), if (showAmount) Text( - category.transactions.sum.money, + Money(category.transactions.sum, primaryCurrency).money, style: context.textTheme.bodyMedium?.semi(context), ), ], diff --git a/lib/widgets/flow_card.dart b/lib/widgets/flow_card.dart index 4a8b6bd..dd26616 100644 --- a/lib/widgets/flow_card.dart +++ b/lib/widgets/flow_card.dart @@ -1,4 +1,5 @@ import "package:auto_size_text/auto_size_text.dart"; +import "package:flow/data/money.dart"; import "package:flow/entity/transaction.dart"; import "package:flow/l10n/extensions.dart"; import "package:flow/theme/theme.dart"; @@ -7,7 +8,7 @@ import "package:flutter/material.dart"; class FlowCard extends StatelessWidget { final TransactionType type; - final double flow; + final Money flow; const FlowCard({super.key, required this.flow, required this.type}); diff --git a/lib/widgets/home/home/analytics_card.dart b/lib/widgets/home/home/analytics_card.dart index cd183d3..ee21475 100644 --- a/lib/widgets/home/home/analytics_card.dart +++ b/lib/widgets/home/home/analytics_card.dart @@ -4,11 +4,15 @@ import "package:flutter/material.dart"; class AnalyticsCard extends StatelessWidget { final Widget child; - static const borderRadius = BorderRadius.all( - Radius.circular(24.0), - ); + final BorderRadius borderRadius; - const AnalyticsCard({super.key, required this.child}); + const AnalyticsCard({ + super.key, + required this.child, + this.borderRadius = const BorderRadius.all( + Radius.circular(16.0), + ), + }); @override Widget build(BuildContext context) { @@ -18,7 +22,7 @@ class AnalyticsCard extends StatelessWidget { borderRadius: borderRadius, child: child, ), - shape: const RoundedRectangleBorder(borderRadius: borderRadius), + shape: RoundedRectangleBorder(borderRadius: borderRadius), ); } } diff --git a/lib/widgets/home/home/flow_cards.dart b/lib/widgets/home/home/flow_cards.dart new file mode 100644 index 0000000..a4ed223 --- /dev/null +++ b/lib/widgets/home/home/flow_cards.dart @@ -0,0 +1,33 @@ +// import "package:flow/objectbox.dart"; +// import "package:flow/objectbox/actions.dart"; +// import "package:flow/widgets/category_card.dart"; +// import "package:flow/widgets/home/home/info_card.dart"; +// import "package:flutter/cupertino.dart"; + +// class FlowCards extends StatefulWidget { +// const FlowCards({super.key}); + +// @override +// State createState() => _FlowCardsState(); +// } + +// class _FlowCardsState extends State { +// @override +// Widget build(BuildContext context) { +// final totalBalance = ObjectBox().getPrimaryCurrencyGrandTotal(); + +// return Row( +// children: [ +// Column( +// children: [ +// InfoCard(title: title, value: value), +// const SizedBox(height: 12.0), +// InfoCard(title: title, value: value), +// ], +// ), +// const SizedBox(width: 12.0), +// InfoCard(title: title, value: value), +// ], +// ); +// } +// } diff --git a/lib/widgets/home/home/flow_today_card.dart b/lib/widgets/home/home/flow_today_card.dart index acc26e4..722d082 100644 --- a/lib/widgets/home/home/flow_today_card.dart +++ b/lib/widgets/home/home/flow_today_card.dart @@ -1,6 +1,8 @@ +import "package:flow/data/money.dart"; import "package:flow/entity/transaction.dart"; import "package:flow/l10n/flow_localizations.dart"; import "package:flow/objectbox/actions.dart"; +import "package:flow/prefs.dart"; import "package:flow/theme/theme.dart"; import "package:flow/widgets/home/home/analytics_card.dart"; import "package:flutter/material.dart"; @@ -13,6 +15,8 @@ class FlowTodayCard extends StatelessWidget { @override Widget build(BuildContext context) { + final String primaryCurrency = LocalPreferences().getPrimaryCurrency(); + final double flow = transactions == null ? 0 : transactions! @@ -40,7 +44,7 @@ class FlowTodayCard extends StatelessWidget { ), Flexible( child: Text( - flow.moneyCompact, + Money(flow, primaryCurrency).moneyCompact, style: context.textTheme.displaySmall, ), ), diff --git a/lib/widgets/home/home/info_card.dart b/lib/widgets/home/home/info_card.dart new file mode 100644 index 0000000..47e295d --- /dev/null +++ b/lib/widgets/home/home/info_card.dart @@ -0,0 +1,38 @@ +import "package:flow/theme/theme.dart"; +import "package:flutter/cupertino.dart"; + +class InfoCard extends StatelessWidget { + final String title; + final String value; + + const InfoCard({super.key, required this.title, required this.value}); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 12.0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + style: context.textTheme.bodyMedium, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Flexible( + child: Text( + value, + style: context.textTheme.displaySmall, + ), + ), + ], + ), + ); + } +} diff --git a/lib/widgets/home/home/total_balance_card.dart b/lib/widgets/home/home/total_balance_card.dart index 2fb70a2..9fdf6de 100644 --- a/lib/widgets/home/home/total_balance_card.dart +++ b/lib/widgets/home/home/total_balance_card.dart @@ -28,7 +28,7 @@ class TotalBalanceCard extends StatelessWidget { ), Flexible( child: Text( - ObjectBox().getTotalBalance().moneyCompact, + ObjectBox().getPrimaryCurrencyGrandTotal().moneyCompact, style: context.textTheme.displaySmall, ), ), diff --git a/lib/widgets/home/stats/group_pie_chart.dart b/lib/widgets/home/stats/group_pie_chart.dart index 6644044..c52bdb6 100644 --- a/lib/widgets/home/stats/group_pie_chart.dart +++ b/lib/widgets/home/stats/group_pie_chart.dart @@ -5,6 +5,7 @@ import "package:fl_chart/fl_chart.dart"; import "package:flow/data/chart_data.dart"; import "package:flow/data/exchange_rates.dart"; import "package:flow/data/flow_icon.dart"; +import "package:flow/data/money.dart"; import "package:flow/entity/account.dart"; import "package:flow/entity/category.dart"; import "package:flow/l10n/extensions.dart"; @@ -47,10 +48,10 @@ class GroupPieChart extends StatefulWidget { class _GroupPieChartState extends State> { late Map> data; - double get totalValue { - return data.values.fold( - 0.0, - (previousValue, element) => previousValue + element.money.amount, + Money get totalAmount { + return data.values.fold( + Money(0, data.values.first.money.currency), + (previousValue, element) => previousValue + element.money, ); } @@ -76,7 +77,7 @@ class _GroupPieChartState extends State> { selectedKey == null ? null : data[selectedKey!]; final String selectedSectionTotal = - selectedSection?.money.amount.abs().formatMoney() ?? "-"; + selectedSection?.money.abs().formatMoney() ?? "-"; return Column( mainAxisSize: MainAxisSize.min, @@ -87,7 +88,7 @@ class _GroupPieChartState extends State> { style: context.textTheme.labelMedium, ), Text( - totalValue.formatMoney(), + totalAmount.formatMoney(), style: context.textTheme.headlineMedium, ), Padding( @@ -219,7 +220,7 @@ class _GroupPieChartState extends State> { data.associatedData, color: color, backgroundColor: backgroundColor, - percent: data.displayTotal / totalValue, + percent: data.displayTotal / totalAmount.amount, ) : null, badgePositionPercentageOffset: 0.8, diff --git a/lib/widgets/home/transactions_date_header.dart b/lib/widgets/home/transactions_date_header.dart index 5d63cd2..8fe981c 100644 --- a/lib/widgets/home/transactions_date_header.dart +++ b/lib/widgets/home/transactions_date_header.dart @@ -1,6 +1,8 @@ +import "package:flow/data/money.dart"; import "package:flow/entity/transaction.dart"; import "package:flow/l10n/extensions.dart"; import "package:flow/objectbox/actions.dart"; +import "package:flow/prefs.dart"; import "package:flow/theme/theme.dart"; import "package:flutter/widgets.dart"; import "package:moment_dart/moment_dart.dart"; @@ -35,7 +37,13 @@ class TransactionListDateHeader extends StatelessWidget { return title; } - final double flow = transactions.sum; + final String primaryCurrency = LocalPreferences().getPrimaryCurrency(); + + final double flow = transactions + .where((transaction) => transaction.currency == primaryCurrency) + .sum; + final bool containsNonPrimaryCurrency = transactions + .any((transaction) => transaction.currency != primaryCurrency); return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -43,7 +51,7 @@ class TransactionListDateHeader extends StatelessWidget { children: [ title, Text( - "${flow.moneyCompact} • ${'tabs.home.transactionsCount'.t(context, transactions.renderableCount)}", + "${Money(flow, primaryCurrency).moneyCompact}${containsNonPrimaryCurrency ? '+' : ''} • ${'tabs.home.transactionsCount'.t(context, transactions.renderableCount)}", style: context.textTheme.labelMedium, ), ], diff --git a/lib/widgets/setup/accounts/account_preset_card.dart b/lib/widgets/setup/accounts/account_preset_card.dart index 18da393..235bb36 100644 --- a/lib/widgets/setup/accounts/account_preset_card.dart +++ b/lib/widgets/setup/accounts/account_preset_card.dart @@ -57,7 +57,7 @@ class AccountPresetCard extends StatelessWidget { ), Text( account.balance - .formatMoney(currency: account.currency), + .formatMoney(), style: context.textTheme.displaySmall, ), ], diff --git a/lib/widgets/transaction_list_tile.dart b/lib/widgets/transaction_list_tile.dart index c27b691..fcd1b95 100644 --- a/lib/widgets/transaction_list_tile.dart +++ b/lib/widgets/transaction_list_tile.dart @@ -110,8 +110,7 @@ class TransactionListTile extends StatelessWidget { Widget _buildAmountText(BuildContext context) { return Text( - transaction.amount.formatMoney( - currency: transaction.currency, + transaction.money.formatMoney( takeAbsoluteValue: transaction.isTransfer && combineTransfers, ), style: context.textTheme.bodyLarge?.copyWith( From 70ae37b7565e13d58d6b6967821b9802a0221df0 Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Wed, 30 Oct 2024 02:01:48 +0800 Subject: [PATCH 5/6] home cards draft 1 --- assets/l10n/en_IN.json | 6 +- assets/l10n/en_US.json | 6 +- assets/l10n/it_IT.json | 6 +- assets/l10n/mn_MN.json | 6 +- lib/routes/category_page.dart | 11 ++- lib/routes/home/home_tab.dart | 46 ++++++---- lib/widgets/home/home/flow_cards.dart | 120 ++++++++++++++++++------- lib/widgets/home/home/info_card.dart | 61 ++++++++----- lib/widgets/rates_missing_warning.dart | 85 ++++++++++++++++++ 9 files changed, 266 insertions(+), 81 deletions(-) create mode 100644 lib/widgets/rates_missing_warning.dart diff --git a/assets/l10n/en_IN.json b/assets/l10n/en_IN.json index 4636fbd..409e865 100644 --- a/assets/l10n/en_IN.json +++ b/assets/l10n/en_IN.json @@ -191,7 +191,7 @@ "tabs.home.transactionsCount": "{count} transactions", "tabs.home.last7days": "Last 7 days", "tabs.home.totalBalance": "Total balance", - "tabs.home.flowToday": "Flow today", + "tabs.home.flow": "Flow", "tabs.stats": "Stats", "tabs.stats.timeRange.select": "Select range", @@ -350,5 +350,7 @@ "error.sync.exportFailed": "Unable to export, please contact developer.", "error.sync.fileDeleteFailed": "An error occured during backup deletion", "error.transaction.missingAccount": "Please select an account", - "error.url.cannotOpen": "Can't open the link" + "error.url.cannotOpen": "Can't open the link", + "error.exchangeRates.inaccurateDataDueToMissingRates": "Failed to fetch exchange rates, transaction data might not be fully accurate", + "error.exchangeRates.cannotFetch": "Failed to fetch, please check your internet connection." } diff --git a/assets/l10n/en_US.json b/assets/l10n/en_US.json index 4636fbd..409e865 100644 --- a/assets/l10n/en_US.json +++ b/assets/l10n/en_US.json @@ -191,7 +191,7 @@ "tabs.home.transactionsCount": "{count} transactions", "tabs.home.last7days": "Last 7 days", "tabs.home.totalBalance": "Total balance", - "tabs.home.flowToday": "Flow today", + "tabs.home.flow": "Flow", "tabs.stats": "Stats", "tabs.stats.timeRange.select": "Select range", @@ -350,5 +350,7 @@ "error.sync.exportFailed": "Unable to export, please contact developer.", "error.sync.fileDeleteFailed": "An error occured during backup deletion", "error.transaction.missingAccount": "Please select an account", - "error.url.cannotOpen": "Can't open the link" + "error.url.cannotOpen": "Can't open the link", + "error.exchangeRates.inaccurateDataDueToMissingRates": "Failed to fetch exchange rates, transaction data might not be fully accurate", + "error.exchangeRates.cannotFetch": "Failed to fetch, please check your internet connection." } diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index 35addae..619049c 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -191,7 +191,7 @@ "tabs.home.transactionsCount": "{count} transazioni", "tabs.home.last7days": "Ultimi 7 giorni", "tabs.home.totalBalance": "Saldo totale", - "tabs.home.flowToday": "Movimenti di oggi", + "tabs.home.flow": "Flusso", "tabs.stats": "Statistiche", "tabs.stats.timeRange.select": "Seleziona intervallo", @@ -350,5 +350,7 @@ "error.sync.exportFailed": "Impossibile esportare, si prega di contattare lo sviluppatore.", "error.sync.fileDeleteFailed": "Impossibile eliminare il file", "error.transaction.missingAccount": "Selezionare un account", - "error.url.cannotOpen": "Impossibile aprire il collegamento" + "error.url.cannotOpen": "Impossibile aprire il collegamento", + "error.exchangeRates.inaccurateDataDueToMissingRates": "Impossibile recuperare i tassi di cambio, i dati delle transazioni potrebbero non essere completamente accurati.", + "error.exchangeRates.cannotFetch": "Impossibile recuperare i dati, si prega di verificare la connessione internet." } diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index 571e323..02fed28 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -191,7 +191,7 @@ "tabs.home.transactionsCount": "{count} гүйлгээ", "tabs.home.last7days": "Сүүлийн 7 хоног", "tabs.home.totalBalance": "Нийт үлдэгдэл", - "tabs.home.flowToday": "Өнөөдөр", + "tabs.home.flow": "Урсгал", "tabs.stats": "Тоо", "tabs.stats.timeRange.select": "Хугацаа сонгох", @@ -350,5 +350,7 @@ "error.sync.exportFailed": "Нөөцлөх явцад алдаа гарлаа, хөгжүүлэгчид хандана уу.", "error.sync.fileDeleteFailed": "Нөөц устгах үед алдаа гарлаа", "error.transaction.missingAccount": "Гүйлгээ хийх данс сонгоно уу", - "error.url.cannotOpen": "Холбоосыг нээхэд алдаа гарлаа" + "error.url.cannotOpen": "Холбоосыг нээхэд алдаа гарлаа", + "error.exchangeRates.inaccurateDataDueToMissingRates": "Ханшийн мэдээлэл татахад асуудал гарсан тул гүйлгээний мэдээлэл зөрөх магадлалтай", + "error.exchangeRates.cannotFetch": "Мэдээлэл татахад алдаа гарлаа. Холболтоо шалгаад дахин оролдоно уу." } diff --git a/lib/routes/category_page.dart b/lib/routes/category_page.dart index 31f0857..38e276a 100644 --- a/lib/routes/category_page.dart +++ b/lib/routes/category_page.dart @@ -15,6 +15,7 @@ import "package:flow/widgets/general/spinner.dart"; import "package:flow/widgets/grouped_transaction_list.dart"; import "package:flow/widgets/home/transactions_date_header.dart"; import "package:flow/widgets/no_result.dart"; +import "package:flow/widgets/rates_missing_warning.dart"; import "package:flow/widgets/time_range_selector.dart"; import "package:flutter/material.dart"; import "package:go_router/go_router.dart"; @@ -96,6 +97,8 @@ class _CategoryPageState extends State { const double firstHeaderTopPadding = 0.0; + final bool missingRates = rates == null; + final Widget header = Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -116,7 +119,7 @@ class _CategoryPageState extends State { children: [ Expanded( child: FlowCard( - flow: rates == null + flow: missingRates ? flow.getIncomeByCurrency(primaryCurrency) : flow.getTotalIncome(rates, primaryCurrency), type: TransactionType.income, @@ -125,7 +128,7 @@ class _CategoryPageState extends State { const SizedBox(width: 12.0), Expanded( child: FlowCard( - flow: rates == null + flow: missingRates ? flow.getExpenseByCurrency(primaryCurrency) : flow.getTotalExpense(rates, primaryCurrency), type: TransactionType.expense, @@ -133,6 +136,10 @@ class _CategoryPageState extends State { ), ], ), + if (missingRates) ...[ + const SizedBox(height: 12.0), + RatesMissingWarning(), + ], ], ); diff --git a/lib/routes/home/home_tab.dart b/lib/routes/home/home_tab.dart index 64af992..58ad51f 100644 --- a/lib/routes/home/home_tab.dart +++ b/lib/routes/home/home_tab.dart @@ -1,16 +1,20 @@ +import "package:flow/data/exchange_rates.dart"; import "package:flow/data/transactions_filter.dart"; import "package:flow/data/upcoming_transactions.dart"; import "package:flow/entity/transaction.dart"; import "package:flow/objectbox.dart"; import "package:flow/objectbox/actions.dart"; import "package:flow/prefs.dart"; +import "package:flow/services/exchange_rates.dart"; import "package:flow/utils/optional.dart"; import "package:flow/widgets/default_transaction_filter_head.dart"; import "package:flow/widgets/general/wavy_divider.dart"; import "package:flow/widgets/grouped_transaction_list.dart"; import "package:flow/widgets/home/greetings_bar.dart"; +import "package:flow/widgets/home/home/flow_cards.dart"; import "package:flow/widgets/home/home/no_transactions.dart"; import "package:flow/widgets/home/transactions_date_header.dart"; +import "package:flow/widgets/rates_missing_warning.dart"; import "package:flow/widgets/utils/time_and_range.dart"; import "package:flutter/material.dart"; import "package:moment_dart/moment_dart.dart"; @@ -94,22 +98,18 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { ), builder: (context, snapshot) { final DateTime now = DateTime.now().startOfNextMinute(); + final ExchangeRates? rates = + ExchangeRatesService().getPrimaryCurrencyRates(); final List? transactions = snapshot.data; - final Widget header = Column( - mainAxisSize: MainAxisSize.min, - children: [ - DefaultTransactionsFilterHead( - defaultFilter: defaultFilter, - current: currentFilter, - onChanged: (value) { - setState(() { - currentFilter = value; - }); - }, - ), - const SizedBox(height: 12.0), - ], + final Widget header = DefaultTransactionsFilterHead( + defaultFilter: defaultFilter, + current: currentFilter, + onChanged: (value) { + setState(() { + currentFilter = value; + }); + }, ); return Column( @@ -129,7 +129,8 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { ), ), (_, true) => Expanded( - child: buildGroupedList(context, now, transactions ?? []), + child: + buildGroupedList(context, now, transactions ?? [], rates), ), (_, false) => const Expanded( child: Center( @@ -147,6 +148,7 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { BuildContext context, DateTime now, List transactions, + ExchangeRates? rates, ) { final Map> grouped = transactions .where((transaction) => !transaction.transactionDate.isAfter(now)) @@ -159,6 +161,20 @@ class _HomeTabState extends State with AutomaticKeepAliveClientMixin { currentFilter.accounts?.isNotEmpty != true; return GroupedTransactionList( + header: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 12.0), + FlowCards( + transactions: transactions, + rates: rates, + ), + if (rates == null) ...[ + const SizedBox(height: 12.0), + RatesMissingWarning(), + ], + ], + ), controller: widget.scrollController, transactions: grouped, futureTransactions: groupedFuture, diff --git a/lib/widgets/home/home/flow_cards.dart b/lib/widgets/home/home/flow_cards.dart index a4ed223..fca28bb 100644 --- a/lib/widgets/home/home/flow_cards.dart +++ b/lib/widgets/home/home/flow_cards.dart @@ -1,33 +1,87 @@ -// import "package:flow/objectbox.dart"; -// import "package:flow/objectbox/actions.dart"; -// import "package:flow/widgets/category_card.dart"; -// import "package:flow/widgets/home/home/info_card.dart"; -// import "package:flutter/cupertino.dart"; - -// class FlowCards extends StatefulWidget { -// const FlowCards({super.key}); - -// @override -// State createState() => _FlowCardsState(); -// } - -// class _FlowCardsState extends State { -// @override -// Widget build(BuildContext context) { -// final totalBalance = ObjectBox().getPrimaryCurrencyGrandTotal(); - -// return Row( -// children: [ -// Column( -// children: [ -// InfoCard(title: title, value: value), -// const SizedBox(height: 12.0), -// InfoCard(title: title, value: value), -// ], -// ), -// const SizedBox(width: 12.0), -// InfoCard(title: title, value: value), -// ], -// ); -// } -// } +import "package:flow/data/exchange_rates.dart"; +import "package:flow/data/money.dart"; +import "package:flow/data/money_flow.dart"; +import "package:flow/entity/transaction.dart"; +import "package:flow/l10n/extensions.dart"; +import "package:flow/l10n/named_enum.dart"; +import "package:flow/objectbox.dart"; +import "package:flow/objectbox/actions.dart"; +import "package:flow/prefs.dart"; +import "package:flow/widgets/home/home/info_card.dart"; +import "package:flutter/cupertino.dart"; + +class FlowCards extends StatefulWidget { + final List? transactions; + final ExchangeRates? rates; + + const FlowCards({super.key, required this.transactions, required this.rates}); + + @override + State createState() => _FlowCardsState(); +} + +class _FlowCardsState extends State { + @override + Widget build(BuildContext context) { + final Money totalBalance = ObjectBox().getPrimaryCurrencyGrandTotal(); + final MoneyFlow? flow = widget.transactions?.flow; + final String primaryCurrency = LocalPreferences().getPrimaryCurrency(); + + final String flowText = switch ((flow, widget.rates)) { + (null, _) => "-", + (MoneyFlow moneyFlow, null) => + moneyFlow.getFlowByCurrency(primaryCurrency).moneyCompact, + (MoneyFlow moneyFlow, ExchangeRates exchangeRates) => + moneyFlow.getTotalFlow(exchangeRates, primaryCurrency).moneyCompact, + }; + + final String expensesText = switch ((flow, widget.rates)) { + (null, _) => "-", + (MoneyFlow moneyFlow, null) => + moneyFlow.getExpenseByCurrency(primaryCurrency).moneyCompact, + (MoneyFlow moneyFlow, ExchangeRates exchangeRates) => + moneyFlow.getTotalExpense(exchangeRates, primaryCurrency).moneyCompact, + }; + + return IntrinsicHeight( + child: Row( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + InfoCard( + title: "tabs.home.flow".t(context), + value: flowText, + ), + const SizedBox(height: 12.0), + InfoCard( + title: TransactionType.expense.localizedNameContext(context), + value: expensesText, + ), + ], + ), + ), + const SizedBox(width: 12.0), + FutureBuilder( + future: widget.rates == null ? null : ObjectBox().getGrandTotal(), + builder: (context, snapshot) { + final String value = snapshot.hasData + ? snapshot.data!.moneyCompact + : totalBalance.moneyCompact; + + return Expanded( + child: InfoCard( + title: "tabs.home.totalBalance".t(context), + value: value, + large: true, + ), + ); + }, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/home/home/info_card.dart b/lib/widgets/home/home/info_card.dart index 47e295d..158d6e9 100644 --- a/lib/widgets/home/home/info_card.dart +++ b/lib/widgets/home/home/info_card.dart @@ -1,37 +1,52 @@ import "package:flow/theme/theme.dart"; +import "package:flow/widgets/general/surface.dart"; import "package:flutter/cupertino.dart"; class InfoCard extends StatelessWidget { final String title; final String value; - const InfoCard({super.key, required this.title, required this.value}); + final bool large; + + const InfoCard( + {super.key, + required this.title, + required this.value, + this.large = false}); @override Widget build(BuildContext context) { - return Container( - width: double.infinity, - padding: const EdgeInsets.symmetric( - horizontal: 16.0, - vertical: 12.0, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - title, - style: context.textTheme.bodyMedium, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - Flexible( - child: Text( - value, - style: context.textTheme.displaySmall, + return Surface( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16.0)), + builder: (BuildContext context) => Container( + width: double.infinity, + padding: large + ? const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 24.0, + ) + : const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 12.0, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + style: context.textTheme.bodyMedium, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Flexible( + child: Text( + value, + style: context.textTheme.displaySmall, + ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/widgets/rates_missing_warning.dart b/lib/widgets/rates_missing_warning.dart new file mode 100644 index 0000000..392401c --- /dev/null +++ b/lib/widgets/rates_missing_warning.dart @@ -0,0 +1,85 @@ +import "package:flow/l10n/extensions.dart"; +import "package:flow/prefs.dart"; +import "package:flow/services/exchange_rates.dart"; +import "package:flow/theme/theme.dart"; +import "package:flow/utils/extensions/toast.dart"; +import "package:flow/widgets/general/spinner.dart"; +import "package:flutter/material.dart"; +import "package:material_symbols_icons/symbols.dart"; + +class RatesMissingWarning extends StatefulWidget { + const RatesMissingWarning({super.key}); + + @override + State createState() => _RatesMissingWarningState(); +} + +class _RatesMissingWarningState extends State { + bool busy = false; + + @override + Widget build(BuildContext context) { + return InkWell( + borderRadius: BorderRadius.all(Radius.circular(8.0)), + onTap: fetch, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Symbols.error_circle_rounded_error_rounded, + fill: 0, + color: context.colorScheme.error, + size: 24.0, + ), + const SizedBox(width: 12.0), + Expanded( + child: DefaultTextStyle( + style: context.textTheme.bodyMedium! + .semi(context) + .copyWith(color: context.colorScheme.error), + child: Text("error.exchangeRates.inaccurateDataDueToMissingRates" + .t(context)), + ), + ), + const SizedBox(width: 12.0), + busy + ? SizedBox( + width: 24.0, + height: 24.0, + child: Spinner(), + ) + : Icon( + Symbols.refresh_rounded, + fill: 0, + size: 24.0, + color: context.colorScheme.error, + ), + ], + ), + ); + } + + void fetch() async { + if (busy) return; + + setState(() { + busy = true; + }); + + try { + await ExchangeRatesService() + .fetchRates(LocalPreferences().getPrimaryCurrency()); + } catch (e) { + if (mounted) { + context.showErrorToast( + error: "error.exchangeRates.cannotFetch".t(context), + ); + } + } finally { + busy = false; + if (mounted) { + setState(() {}); + } + } + } +} From c5cef8b049a456bf3868970201fc309e078054ed Mon Sep 17 00:00:00 2001 From: Batmend Ganbaatar Date: Sun, 3 Nov 2024 03:25:16 +0800 Subject: [PATCH 6/6] feat: new theme selector --- CHANGELOG.md | 1 + assets/l10n/en_IN.json | 3 + assets/l10n/en_US.json | 3 + assets/l10n/it_IT.json | 3 + assets/l10n/mn_MN.json | 3 + lib/prefs.dart | 19 ++ .../preferences/theme_preferences_page.dart | 128 ++++---- lib/theme/color_themes/registry.dart | 38 +++ lib/widgets/theme_petal_selector.dart | 276 ++++++++++++++++++ .../theme_petal_painter.dart | 91 ++++++ pubspec.yaml | 2 +- 11 files changed, 516 insertions(+), 51 deletions(-) create mode 100644 lib/widgets/theme_petal_selector.dart create mode 100644 lib/widgets/theme_petal_selector/theme_petal_painter.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 6de9d7d..3c47c0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Beta next * Fixed account card "this month" summary +* Added new theme selector ## Beta 0.7.2 diff --git a/assets/l10n/en_IN.json b/assets/l10n/en_IN.json index 409e865..e2ab31f 100644 --- a/assets/l10n/en_IN.json +++ b/assets/l10n/en_IN.json @@ -151,6 +151,9 @@ "preferences.theme.choose": "Select a theme", "preferences.theme.light": "Light", "preferences.theme.dark": "Dark", + "preferences.theme.other": "Other themes", + "preferences.theme.themeChangesAppIcon": "App icon follows theme", + "preferences.theme.enableDynamicTheme": "Dynamic theme", "preferences.numpad": "Numpad", "preferences.numpad.layout": "Numpad layout", "preferences.numpad.layout.classic": "Classic", diff --git a/assets/l10n/en_US.json b/assets/l10n/en_US.json index 409e865..e2ab31f 100644 --- a/assets/l10n/en_US.json +++ b/assets/l10n/en_US.json @@ -151,6 +151,9 @@ "preferences.theme.choose": "Select a theme", "preferences.theme.light": "Light", "preferences.theme.dark": "Dark", + "preferences.theme.other": "Other themes", + "preferences.theme.themeChangesAppIcon": "App icon follows theme", + "preferences.theme.enableDynamicTheme": "Dynamic theme", "preferences.numpad": "Numpad", "preferences.numpad.layout": "Numpad layout", "preferences.numpad.layout.classic": "Classic", diff --git a/assets/l10n/it_IT.json b/assets/l10n/it_IT.json index 619049c..f93b677 100644 --- a/assets/l10n/it_IT.json +++ b/assets/l10n/it_IT.json @@ -151,6 +151,9 @@ "preferences.theme.choose": "Seleziona un tema", "preferences.theme.light": "Chiaro", "preferences.theme.dark": "Scuro", + "preferences.theme.other": "Altri temi", + "preferences.theme.themeChangesAppIcon": "Icona dell'app segue il tema", + "preferences.theme.enableDynamicTheme": "Tema dinamico", "preferences.numpad": "Tastierino numerico", "preferences.numpad.layout": "Layout del tastierino numerico", "preferences.numpad.layout.classic": "Classico", diff --git a/assets/l10n/mn_MN.json b/assets/l10n/mn_MN.json index 02fed28..7db882a 100644 --- a/assets/l10n/mn_MN.json +++ b/assets/l10n/mn_MN.json @@ -151,6 +151,9 @@ "preferences.theme.choose": "Үзэмж сонгох", "preferences.theme.light": "Гэгээлэг", "preferences.theme.dark": "Харанхуй", + "preferences.theme.other": "Бусад үзэмжүүд", + "preferences.theme.themeChangesAppIcon": "Аппын дүрсийг үзэмж дагах", + "preferences.theme.enableDynamicTheme": "Динамик үзэмж", "preferences.numpad": "Тоон товчлуур", "preferences.numpad.layout": "Тооны байрлал", "preferences.numpad.layout.classic": "Хуучны", diff --git a/lib/prefs.dart b/lib/prefs.dart index c0205c2..4805dab 100644 --- a/lib/prefs.dart +++ b/lib/prefs.dart @@ -78,6 +78,8 @@ class LocalPreferences { late final ThemeModeSettingsEntry themeMode; late final PrimitiveSettingsEntry themeName; + late final BoolSettingsEntry themeChangesAppIcon; + late final BoolSettingsEntry enableDynamicTheme; LocalPreferences._internal(this._prefs) { primaryCurrency = PrimitiveSettingsEntry( @@ -183,6 +185,16 @@ class LocalPreferences { preferences: _prefs, initialValue: lightThemes.keys.first, ); + themeChangesAppIcon = BoolSettingsEntry( + key: "flow.themeChangesAppIcon", + preferences: _prefs, + initialValue: true, + ); + enableDynamicTheme = BoolSettingsEntry( + key: "flow.enableDynamicTheme", + preferences: _prefs, + initialValue: true, + ); updateTransitiveProperties(); } @@ -369,6 +381,13 @@ class LocalPreferences { return primaryCurrencyName; } + String getCurrentTheme() { + final String? preferencesTheme = LocalPreferences().themeName.get(); + return validateThemeName(preferencesTheme) + ? preferencesTheme! + : lightThemes.keys.first; + } + factory LocalPreferences() { if (_instance == null) { throw Exception( diff --git a/lib/routes/preferences/theme_preferences_page.dart b/lib/routes/preferences/theme_preferences_page.dart index d7ce187..49aad3f 100644 --- a/lib/routes/preferences/theme_preferences_page.dart +++ b/lib/routes/preferences/theme_preferences_page.dart @@ -1,8 +1,10 @@ import "package:flow/l10n/extensions.dart"; import "package:flow/prefs.dart"; -import "package:flow/routes/preferences/theme_preferences/theme_entry.dart"; import "package:flow/theme/color_themes/registry.dart"; +import "package:flow/widgets/general/list_header.dart"; +import "package:flow/widgets/theme_petal_selector.dart"; import "package:flutter/material.dart"; +// import "package:material_symbols_icons/symbols.dart"; class ThemePreferencesPage extends StatefulWidget { const ThemePreferencesPage({super.key}); @@ -11,75 +13,101 @@ class ThemePreferencesPage extends StatefulWidget { State createState() => _ThemePreferencesPageState(); } -class _ThemePreferencesPageState extends State - with SingleTickerProviderStateMixin { - late final TabController _tabController; - +class _ThemePreferencesPageState extends State { bool busy = false; + bool appIconBusy = false; + bool dynamicThemeBusy = false; @override void initState() { super.initState(); - _tabController = TabController( - length: 2, - vsync: this, - ); } @override Widget build(BuildContext context) { - final String? preferencesTheme = LocalPreferences().themeName.get(); - final String currentTheme = validateThemeName(preferencesTheme) - ? preferencesTheme! - : lightThemes.keys.first; + final String currentTheme = LocalPreferences().getCurrentTheme(); + // final bool themeChangesAppIcon = + // LocalPreferences().themeChangesAppIcon.get(); + // final bool enableDynamicTheme = LocalPreferences().enableDynamicTheme.get(); return Scaffold( appBar: AppBar( title: Text("preferences.theme.choose".t(context)), - bottom: TabBar( - tabs: [ - Tab( - text: "preferences.theme.light".t(context), - ), - Tab( - text: "preferences.theme.dark".t(context), - ), - ], - controller: _tabController, - ), ), body: SafeArea( - child: TabBarView( - controller: _tabController, - children: [ - ListView( - children: lightThemes.entries - .map( - (entry) => ThemeEntry( - entry: entry, - currentTheme: currentTheme, - handleChange: handleChange, - ), - ) - .toList(), - ), - ListView( - children: darkThemes.entries - .map( - (entry) => ThemeEntry( - entry: entry, - currentTheme: currentTheme, - handleChange: handleChange, - ), - ) - .toList(), - ), - ], + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: ThemePetalSelector( + updateOnHover: true, + ), + ), + // const SizedBox(height: 16.0), + // CheckboxListTile.adaptive( + // title: Text("preferences.theme.themeChangesAppIcon".t(context)), + // value: themeChangesAppIcon, + // onChanged: changeThemeChangesAppIcon, + // secondary: Icon(Symbols.photo_prints_rounded), + // ), + // CheckboxListTile.adaptive( + // title: Text("preferences.theme.enableDynamicTheme".t(context)), + // value: enableDynamicTheme, + // onChanged: changeEnableDynamicTheme, + // secondary: Icon(Symbols.palette), + // ), + const SizedBox(height: 16.0), + ListHeader( + "preferences.theme.other".t(context), + ), + RadioListTile.adaptive( + title: Text(palenight.name), + value: "palenight", + groupValue: currentTheme, + onChanged: (value) => handleChange(value), + ), + ], + ), ), ), ); } + void changeThemeChangesAppIcon(bool? newValue) { + if (newValue == null) return; + if (appIconBusy) return; + + try { + appIconBusy = true; + LocalPreferences().themeChangesAppIcon.set(newValue); + } catch (e) { + // Silent fail. TODO @sadespresso + } finally { + appIconBusy = false; + if (mounted) { + setState(() {}); + } + } + } + + void changeEnableDynamicTheme(bool? newValue) { + if (newValue == null) return; + if (dynamicThemeBusy) return; + + try { + dynamicThemeBusy = true; + LocalPreferences().enableDynamicTheme.set(newValue); + } catch (e) { + // Silent fail. TODO @sadespresso + } finally { + dynamicThemeBusy = false; + if (mounted) { + setState(() {}); + } + } + } + void handleChange(String? name) async { if (name == null) return; if (busy) return; diff --git a/lib/theme/color_themes/registry.dart b/lib/theme/color_themes/registry.dart index 5ac5201..8cc53ec 100644 --- a/lib/theme/color_themes/registry.dart +++ b/lib/theme/color_themes/registry.dart @@ -49,6 +49,38 @@ final Map darkThemes = { "palenight": palenight, }; +final Map lightDarkThemeMapping = { + "shadeOfViolet": "electricLavender", + "blissfulBerry": "pinkQuartz", + "cherryPlum": "cottonCandy", + "crispChristmasCranberries": "piglet", + "burntSienna": "simplyDelicious", + "soilOfAvagddu": "creamyApricot", + "flagGreen": "yellYellow", + "tropicana": "fallGreen", + "toyCamouflage": "frostedMintHills", + "spreadsheetGreen": "coastalTrim", + "tokiwaGreen": "seafairGreen", + "hydraTurquoise": "crushedIce", + "peacockBlue": "iceEffect", + "egyptianBlue": "arcLight", + "bohemianBlue": "driedLilac", + "spaceBattleBlue": "neonBoneyard", +}; + +String? reverseThemeMode(String themeName) { + if (lightThemes.containsKey(themeName)) { + return lightDarkThemeMapping[themeName]; + } else if (darkThemes.containsKey(themeName)) { + return lightDarkThemeMapping.entries + .where((entry) => entry.value == themeName) + .firstOrNull + ?.key; + } + + return null; +} + final Map allThemes = { ...lightThemes, ...darkThemes, @@ -60,6 +92,12 @@ bool validateThemeName(String? themeName) { return allThemes.containsKey(themeName); } +bool isThemeDark(String? themeName) { + if (themeName == null) return false; + + return darkThemes.containsKey(themeName); +} + ({FlowColorScheme scheme, ThemeMode mode})? getTheme(String? themeName) { if (themeName == null) return null; diff --git a/lib/widgets/theme_petal_selector.dart b/lib/widgets/theme_petal_selector.dart new file mode 100644 index 0000000..ec32018 --- /dev/null +++ b/lib/widgets/theme_petal_selector.dart @@ -0,0 +1,276 @@ +import "dart:developer" show log; +import "dart:math" as math; + +import "package:flow/prefs.dart"; +import "package:flow/theme/color_themes/registry.dart"; +import "package:flow/theme/theme.dart"; +import "package:flow/widgets/theme_petal_selector/theme_petal_painter.dart"; +import "package:flutter/material.dart"; +import "package:material_symbols_icons/symbols.dart"; + +class ThemePetalSelector extends StatefulWidget { + final bool playInitialAnimation; + + final double maxSize; + + final Duration animationDuration; + + final bool updateOnHover; + + const ThemePetalSelector({ + super.key, + this.playInitialAnimation = true, + this.updateOnHover = false, + this.maxSize = 400.0, + this.animationDuration = const Duration(milliseconds: 750), + }); + + @override + State createState() => _ThemePetalSelectorState(); +} + +class _ThemePetalSelectorState extends State + with SingleTickerProviderStateMixin { + late final AnimationController animationController; + late final Animation flowerAnimation; + late final Animation opacityAnimation; + + MouseCursor _cursor = MouseCursor.defer; + + int? hoveringIndex; + + bool busy = false; + + static const double petalRadiusProc = 0.05; + static const double centerSpaceRadiusProc = 0.3; + static const double angleOffset = math.pi / -2; + + @override + void initState() { + super.initState(); + + animationController = AnimationController( + vsync: this, + duration: widget.animationDuration, + ); + + flowerAnimation = CurvedAnimation( + parent: animationController, + curve: Interval( + 0, + 0.75, + curve: Curves.easeOutExpo, + ), + ); + opacityAnimation = CurvedAnimation( + parent: animationController, + curve: Interval( + 0.75, + 1.0, + curve: Curves.decelerate, + ), + ); + + animationController.forward(from: 0.0); + } + + @override + Widget build(BuildContext context) { + final String currentTheme = LocalPreferences().getCurrentTheme(); + final bool isDark = isThemeDark(currentTheme); + final int selectedIndex = isDark + ? lightDarkThemeMapping.values.toList().indexOf(currentTheme) + : lightDarkThemeMapping.keys.toList().indexOf(currentTheme); + + return ConstrainedBox( + constraints: BoxConstraints.tightForFinite( + width: widget.maxSize, + height: widget.maxSize, + ), + child: AspectRatio( + aspectRatio: 1.0, + child: LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + final double middleButtonSize = + constraints.maxWidth * petalRadiusProc * 3.0; + + return Stack( + children: [ + SizedBox( + width: constraints.maxWidth, + height: constraints.maxHeight, + child: MouseRegion( + cursor: _cursor, + onHover: (event) { + final int? itemIndexAtPointer = + getItemAtPointer(event.localPosition, constraints); + + _cursor = itemIndexAtPointer != null + ? SystemMouseCursors.click + : MouseCursor.defer; + + if (itemIndexAtPointer != null && widget.updateOnHover) { + setThemeByIndex(itemIndexAtPointer, isDark); + } + + setState(() { + hoveringIndex = itemIndexAtPointer; + }); + }, + onExit: (_) => setState(() => hoveringIndex = null), + child: GestureDetector( + onPanUpdate: widget.updateOnHover + ? ((details) { + final int? itemIndexAtPointer = getItemAtPointer( + details.localPosition, + constraints, + ); + + if (itemIndexAtPointer == null) return; + + setThemeByIndex(itemIndexAtPointer, isDark); + }) + : null, + onTapUp: (details) { + final int? itemIndexAtPointer = getItemAtPointer( + details.localPosition, + constraints, + ); + + if (itemIndexAtPointer == null) return; + + setThemeByIndex(itemIndexAtPointer, isDark); + }, + child: AnimatedBuilder( + builder: (context, child) => CustomPaint( + isComplex: true, + willChange: true, + painter: ThemePetalPainter( + animationValue: flowerAnimation.value, + colors: lightThemes.values + .map((theme) => theme.primary) + .toList(), + selectedIndex: selectedIndex, + hoveringIndex: hoveringIndex, + petalRadiusProc: petalRadiusProc, + centerSpaceRadiusProc: centerSpaceRadiusProc, + selectedColor: context.colorScheme.onSurface, + angleOffset: angleOffset, + ), + ), + animation: animationController, + ), + ), + ), + ), + AnimatedBuilder( + builder: (context, child) => SizedBox( + width: constraints.maxWidth, + height: constraints.maxHeight, + child: Opacity( + opacity: opacityAnimation.value, + child: Center( + child: InkWell( + onTap: () => switchThemeMode(currentTheme), + borderRadius: BorderRadius.circular(999.0), + child: Container( + width: middleButtonSize, + height: middleButtonSize, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: context.colorScheme.primary, + ), + alignment: Alignment.center, + child: Icon( + isDark + ? Symbols.dark_mode_rounded + : Symbols.light_mode_rounded, + size: middleButtonSize * 0.67, + color: context.colorScheme.onPrimary, + ), + ), + ), + ), + ), + ), + animation: animationController, + ), + ], + ); + }, + ), + ), + ); + } + + void setThemeByIndex(int index, bool dark) async { + if (busy) return; + + try { + setState(() { + busy = true; + }); + + final String themeName = dark + ? lightDarkThemeMapping.values.elementAt(index) + : lightDarkThemeMapping.keys.elementAt(index); + + await LocalPreferences().themeName.set(themeName); + } catch (e) { + log("[Theme Petal Selector] Something went wrong with the theme petal selector.", + error: e); + } finally { + busy = false; + if (mounted) { + setState(() {}); + } + } + } + + void switchThemeMode(String currentTheme) async { + if (busy) return; + + try { + setState(() { + busy = true; + }); + + final String? themeName = reverseThemeMode(currentTheme); + + if (themeName == null) { + return; + } + + await LocalPreferences().themeName.set(themeName); + } catch (e) { + log("[Theme Petal Selector] Something went wrong with the theme petal selector.", + error: e); + } finally { + busy = false; + if (mounted) { + setState(() {}); + } + } + } + + int? getItemAtPointer(Offset localPosition, BoxConstraints constraints) { + final Offset adjustedPosition = localPosition - + Offset(constraints.maxWidth / 2, constraints.maxHeight / 2); + final double r = adjustedPosition.distance; + + final double innerRadius = constraints.maxWidth * centerSpaceRadiusProc; + final double outerRadius = + innerRadius + (constraints.maxWidth * 2 * petalRadiusProc); + + if (r < innerRadius || r > outerRadius) { + return null; + } + + final double angle = (math.atan2(adjustedPosition.dy, adjustedPosition.dx) + + (math.pi * 3) + + angleOffset) % + (math.pi * 2); + + return (angle / (math.pi / 8.0)).round(); + } +} diff --git a/lib/widgets/theme_petal_selector/theme_petal_painter.dart b/lib/widgets/theme_petal_selector/theme_petal_painter.dart new file mode 100644 index 0000000..7799aca --- /dev/null +++ b/lib/widgets/theme_petal_selector/theme_petal_painter.dart @@ -0,0 +1,91 @@ +import "dart:math" as math; + +import "package:flutter/material.dart"; + +class ThemePetalPainter extends CustomPainter { + final double animationValue; + + final double petalRadiusProc; + + final double centerSpaceRadiusProc; + + final double angleOffset; + + final List colors; + + final Color selectedColor; + + final int? selectedIndex; + final int? hoveringIndex; + + const ThemePetalPainter({ + required this.animationValue, + required this.colors, + required this.angleOffset, + required this.petalRadiusProc, + required this.centerSpaceRadiusProc, + required this.selectedColor, + required this.selectedIndex, + required this.hoveringIndex, + }); + + @override + void paint(Canvas canvas, Size size) { + canvas.translate(size.width * 0.5, size.height * 0.5); + + final Paint paint = Paint()..style = PaintingStyle.fill; + + final Paint ringPaint = Paint() + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeJoin = StrokeJoin.round + ..strokeWidth = 2.0 + ..color = selectedColor; + + final double petalCenterDistance = + size.width * (petalRadiusProc + centerSpaceRadiusProc); + final double petalRadius = size.width * petalRadiusProc; + final double ringRadius = petalRadius + 4.0; + + final double angleDelta = math.pi * 2 / colors.length; + + for (int i = 0; i < colors.length; i++) { + final double localProgress = + math.min(1, math.max(0, animationValue * colors.length - i)); + + final double theta = angleOffset + angleDelta * (i - 1 + localProgress); + + final Offset center = Offset(math.cos(theta), math.sin(theta)) * + petalCenterDistance * + localProgress; + + paint.color = i == hoveringIndex + ? Color.alphaBlend(selectedColor.withAlpha(0x80), colors[i]) + : colors[i]; + canvas.drawCircle( + center, + petalRadius * localProgress, + paint, + ); + + if (localProgress == 1 && selectedIndex == i) { + canvas.drawCircle( + center, + ringRadius, + ringPaint, + ); + } + } + } + + @override + bool shouldRepaint(ThemePetalPainter oldDelegate) => + animationValue != oldDelegate.animationValue || + colors != oldDelegate.colors || + angleOffset != oldDelegate.angleOffset || + petalRadiusProc != oldDelegate.petalRadiusProc || + centerSpaceRadiusProc != oldDelegate.centerSpaceRadiusProc || + selectedColor != oldDelegate.selectedColor || + selectedIndex != oldDelegate.selectedIndex || + hoveringIndex != oldDelegate.hoveringIndex; +} diff --git a/pubspec.yaml b/pubspec.yaml index b9ee9b5..08215f9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A personal finance managing app publish_to: "none" # Remove this line if you wish to publish to pub.dev -version: "0.7.2+63" +version: "0.7.3+64" environment: sdk: ">=3.5.0 <4.0.0"