From 90cea589e286b81a26fd15ae60f4bd3cc25d13fb Mon Sep 17 00:00:00 2001 From: Amaury Date: Thu, 14 Sep 2023 14:42:43 -0300 Subject: [PATCH] add animation examples --- .idea/libraries/Dart_Packages.xml | 196 ++---------------- app/assets/images/bell.png | Bin 0 -> 8619 bytes app/assets/images/day.png | Bin 0 -> 22211 bytes app/assets/images/night.png | Bin 0 -> 26512 bytes app/lib/main/init.dart | 2 + .../presentation/resources/animations.dart | 9 + app/lib/presentation/resources/images.dart | 6 + app/lib/presentation/themes/app_themes.dart | 3 + .../presentation/themes/color_schemes.dart | 69 ++++++ .../themes/resources/app_theme_data.dart | 5 +- .../ui/custom/app_theme_switch.dart | 84 +++++++- .../ui/pages/home/widget/product_widget.dart | 25 ++- .../home/widget/products_list_widget.dart | 6 +- .../pages/home/widget/products_loading.dart | 63 +++++- .../ui/pages/login/login_page.dart | 87 +++++++- app/pubspec.yaml | 4 + modules/common/lib/ui/responsive.dart | 2 +- .../domain/lib/services/ProductService.dart | 1 + 18 files changed, 364 insertions(+), 198 deletions(-) create mode 100644 app/assets/images/bell.png create mode 100644 app/assets/images/day.png create mode 100644 app/assets/images/night.png create mode 100644 app/lib/presentation/resources/animations.dart create mode 100644 app/lib/presentation/themes/color_schemes.dart diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 7cae713..f79ce26 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -65,62 +65,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -135,13 +79,6 @@ - - - - - - @@ -149,16 +86,10 @@ - - - - - - + @@ -289,17 +220,17 @@ - + - - + - @@ -345,13 +276,6 @@ - - - - - - @@ -373,13 +297,6 @@ - - - - - - @@ -394,13 +311,6 @@ - - - - - - @@ -411,6 +321,7 @@ + @@ -422,13 +333,6 @@ - - - - - - @@ -460,6 +364,7 @@ + @@ -467,6 +372,7 @@ + @@ -478,13 +384,6 @@ - - - - - - @@ -618,13 +517,6 @@ - - - - - - @@ -653,13 +545,6 @@ - - - - - - @@ -709,20 +594,6 @@ - - - - - - - - - - - - @@ -733,6 +604,7 @@ + @@ -751,13 +623,6 @@ - - - - - - @@ -775,17 +640,11 @@ + - - - - - - @@ -856,10 +715,10 @@ - + - @@ -903,20 +762,11 @@ - - - - - - - - - - + @@ -935,30 +785,28 @@ - + - - - + - + + - @@ -978,12 +826,10 @@ - - @@ -991,16 +837,14 @@ - - + - - + @@ -1011,7 +855,7 @@ - + diff --git a/app/assets/images/bell.png b/app/assets/images/bell.png new file mode 100644 index 0000000000000000000000000000000000000000..a7182c928aa6f10c7efac54a2876fc02dadf85ab GIT binary patch literal 8619 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
  • jAm-#nGl=187i>mAmQANr} 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/night.png b/app/assets/images/night.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8f1d8ac50e9b01b73d3e88e936a7258a991c60 GIT binary patch literal 26512 zcmXtA2Rzo__y0VPmAxsO9(xNRGh}3skd;-GP1!seX2=ZLWpA?AgY1=Li$^lDWzXk- zegCgtFCxx8_ug~QIq!4NIk#{fEfrz{IsyoSh}Be;^dJZhzJ)_KaKV=Y@1JMj3%197 zHG>=AkN*wZFz|1DS5*@aKtFl?3A@kr$s7FemZ!3@r@qTmPcJKXJIKq+OTfYTg@=um ztDS(0`?F8m(sU5S0;wq}7MSlfax6V^?8DS2s!0}Gqnslwhn&Hge+@N5(qlW-r#B%ADDL_jZ#W9& z?_!?L7@vD0Nv6A}ssV+43sSW_521|AKtC92A1njw{%1D#8yt|5Wa@UUW%#eCi!$6c z6I(NZA5krFaHt&2i+J}y+4c^Ymxe67I|(KMLxn@pSgtIPp}o%6yNswdNSXl63Xyuf zeC0?+PZ3)q3}Z=UrHCqoNIJK1G1#^Q|9S&o!M$&e;lq&68l~=eReYT_t&}GBNywPz1j{6Nuv#L3C)rmt^R} zl19uDbBxBDASvWHgveHi{gn)5D0AF8p+u?}%gJkXVj~&Ax((spv`7!=f*wf#ICZ{< z*OQ`tLEG!=n>WcBNOju*Cnx2cN+A*AE9G9#J-=@clmue2cb`FRa91y*XFbVi@34Oz z*hoiqiYOdd+B=QULAX%nR9NqF-Un`$3u@#7kd(%a=uoZ~8c^@QJg*KvPLZgq6tt*J zRh|S=jwPPxBK96z+&GZq!_Zqh7c?-{#6qyM-AmGD*6U7MFd;)B?zhNW$c_^YBpkW->TO#|1 z4f3Q7DdB@>a5-qVscbkp0qxzZoDAuhDCJa2K}JwLh5Q?|YgkDEEh-3pqGj|&J!fR)6Ak%XiHeV`ul6vNO#nQ+(lV2-pux{#&fQ)YM>x4d#YHj+TRMS3R`GQ)aO zc>P;P86*iL_ji3WERrN-GYTJC<_8DNGPY)kmG#(FLdjVKLcf9*uFsa1k!YHd66&8m zpu`wLS6K2xVkl{%TwEPwyvIC<}p%R>36IUMQ*u+h2S6<`}I86kQ(h&+9 zNkbLhEe#3a?E1KN$+GdzlAvj9AKlc5APFe}a}RM}8-*zN?}`0hXrLftnEGFpK1@S#%e7*WsV4NRg9Ik;Ulp6yyEJmz|r6j zFM+W@F5830V$f=M^t*^9Cl#i!hx0GlUd!&J^=N3Y?^ZW4bzo^<6~B*-mG^?5P2fr^F{KBN(E2QZv@zK{~kQZ#wvP zH#RDlZ8Z7qAg)Xu+@6AggnHD3lR4x#&BuRu_3|HS4Ei`IC=VN$>K68{q%8r?G+8~_ zT?e;pRnb>)WDo4(rsD-;ZcQOBZFdWFIMOi&az5UNJHO8) z`9Z7rR7ywQRl?vtZxYo+w*K0w?F(8g2~LVAbG)q2*QO!G!oyDjlQ2WjnG&OgAxj+k zAeG`$lG_Xi)SgkU-$Q5CU1QnU=m}Un%Do-W<`qb~nV`^Ai#m)il!=YWG|z6SDYKuv zb(4;_zoxe~8roGt(49*mH-JmZQ^Hf~>S2QLQY{8oeV|MjebD61Ph7(?jmDF#v-+_O zq0({z+N_~gOK6r@`x1hb?Iu#J55O|*YJL2eHOAf|mNAwtsT|@iJG|Bge;{7S6CBVz z$iES6)7VqqfMFBn8U`fEg!~vgT@w@4M#vr~_3D7;mCO9-y}=f^y*P!)ani^99kD-< z2IL5QgxEC$*afb9^_sV8iAtua;DNt;^HZn|NZ9K^jH~0O13GKdfxe%P664vSH?agi_M8^XwkI%u%o)dyqq^OG463BBR6LV}> zH>B)+cqc483D&EU#}?#7Lw2s#UA%oRk3^InkQ@>q?ScF70OK}=VHM$jhy1L29p{(G z8Azs)3;ByJt7&1qqj*C;8k0+cOSE2cZ~F=jZr#2es?Jv3po4dpwh9ky3m{u6?1Bna z2&Oy7KWm;UFJ;<_Tpu;Fe7D_di)(Lb7w?({6QZ^7hUe5a090?>n!ckCD;u!nm{-uy*ljZafBVhA=|O zW&oPQN9&AMl95xd`9P~Lukn-d##Zpk1( zlsXiIU6F~_2@5NEdI#zC>gB6uHYu{YC&cn804CyNZ|y8-yK*ThJ^IQl@)E`wN%D;! zux|0l{KvGT2)an=3SMr<&iV!z9`4v{svzjA56ky%X6s>{3LnouU|2PM8Q_0!4kxjNH!2HY(ZDhliW4q zurP+-)X+1qI!6k|u=onxtS~SYIdp|Dex;<;^_2o8m%meKfY5*<5EN1AH?j!j-~2bK z046_q(2^8^#Fr-rQ|ZU1tQfIM(Xg@M70W+OMHl8^xxqOg9B|C5@OnIXc~3qiB>^(X zb>yJsBLNCK3yQVpBS23=&DRTeCl^FoYA?Lu)=tCuknbUA>gB@0_P2TVJV1VOb2YZO^tsP?$xe^>QR*+lJ%I)655qYaYMt%&rC$zcn}JtgYDuq^Q_ZKjEWAw8+!wDUp(92bG_K$Ov%d*rZ6R$`%*N ziHJeK@g{8LDdg<}0+{?Y`I0bv6raG=6#oJNE|yUw;3miv^SRCiy12(y#m9)k0Y}kB z$rv^+1e+RYDsOc#m!N9Y^<=PR?z1J3X$koLlI8}5i2)on4G4p%8N(8VV9ATGd7V$} zm6cEY;t=5^?;JVO#lN>y;}sgHdvYm>Hc24IK)}odRMXJ)PL{(9fi`DN35GKP`k?;M zoL+m!f>6GF?TFqSICKSESTq@+tH6U$sWE|jYY`C^=muboAWXWkb zgiF){l!#xGSMs=A>Q5age?b_khykvq3w?a9W2(*?NG;`y_Mc@LVMR{n<3j@y@vGHAR z(NQb1(K#(RdR_Uo*(d1RQatHtKv1_% zW(Dmn&lefsH+evSa zPW9!y;ks+Y4$+#qb*2O(GfkEBroCI3u;0M0S8*W<0Vu0X%)#R3oGiiGEsF_s!}Le& zMiv!SiA47EWL$33AprgWafhv9DcGVzE$w=)(t-m z18UbWG8|Msi*1IT*c^Hk-SHF;;wifG79LQJG3O)Rvm=N!`n`SR z75cdr@5k*gY$o_{9SP~{*LS%`t?E12 z0f>WeYj~C4=>@8ReA`O@=>l-##macP>d~5zK>fdNto!XK?S>|1lde08)H#aD`nGNn zEf9OHzuRpsDJcxwzF0ofyHs@nVe-UMUNza6p*Ap;C*skz;LTT{GP!`J>&E zca)GJE=iG1wh1?5eMxTCzM)BX#ARv(6|r3*BTDf0X!7k@b(O2nEQ`7^DmJ6cCjIjF z6_39ddEWH+$GZvR%FQi3d}sN&boYhMFu1d(ud%4NyWyjhjTZcy7FMqZ=mm8&eu{CT z_nO;6=^gRjU;1V77V-LD6$rx8xuwFaJ$_nVoEpu!K4&4Tf8fcWn1(^q&2kZxr9qa~bH3 zK85VLJS2Fu|F`X@I8FB6eEpClK5C|uB1f^eCmV96WmKw^V1w18`{~=Lh;T`081Y8$ zhr~~)Lcbf|VgkD&Nq^CI#NR6=j~{Ek^8(c2dSGL(6Ahi5)gR7I+N69Ld zAOHNQl2hrSgr`eXs|^jC`duz&>+DwNEV1-=SD;yuU-2)FUXos2W{_=r&qr1wR0jKV zo4js%T`h+hOtg7!cp7I(A||BH<9_!`QoP;2=U7wH)*Es@ zvk&t%=dR-Y_WHXSO)~eV_UU&oEiYT%>LyMqymS!7xnqtQDEeWnXEk62K@!yR8lGhD zDz<(BEc_dNdbW2<6Uyz1i2= zp#PNIaX0Adng7zWppI`}JdU1A*zINfy2_vOx(Pwfz%3Um;l&E}i8|e-#-a__T%l$_(U@UI#l!boMRieq-WX=5mY#NAC>lhe$yAK0WsaxDSv>2P zju(B=JTkcfGbVCh(5BkwyA=6{(;aIkh>Sp=JK(c=O{d@5#LzdUo4I%M!Sqeh?{}3M1cVHl-?Pe z%REllaHNZM>#|g=_iK4sN5e5Qd;ix(=!h=!6UBvSB^$$>H@zYJ6j0{KF|DDY@w8Iy zqxab8x^h2PFvRS8sN*xk&I{s;B43rCFi8FmvOI!>jXtR@(#(4~ikT4m0xvxJO#vBk zE8;Q1O^kM4Fg^3$(yaFR2hYJb6bsq7gXx@K<1QXPiWCSqx2~Yh z6Q1QTlWAzUY#!sd6P6m=JiL+eVXv|cXOC_5C_c*06utW4KFa(NRBz!)wqNN8cU?5R z+j5s|mzf<%^**DXSV(U6oDse`(5Uq`oJzZ&RY7@5CMFi?=AEt0GrFA+wA%-~;bTuS zkIFyk%RmntWHXP?fivMrz(!vv%SdJ(|IwnZEQ4_CljI~(Klpl%87HtH+oV~H6@sqX zmNtW(5{l{BUtrQC3f%>Q9l%Q?dgdQ8zMb^+e5P-ky9+X4{`GBc|iqTgi{P+?xnu8b)yCJxugsUv)$v zs~f;wjh}|`+dSV#2pfL2&|9_neF5ekuet<1cQ-!A$Yt&=atiuByh*NmI*wNrRAgkA z#WP^r{uB;5Q(g~CgwpDc&W`c0VA}^OwMHA7izP{|B{7&iLW{XmI-{f8tA(V0CbA~a z86}Azh!%KRN+mqucsmLtxI*H&r!q$> zYU!~jUs>-KZGcZ=u#KrFU$Oe<9~)Cdr<5SeV(v*+v<5XZ?Fh2>iHMOaN#6UMOS;Ox z-uL|KUmp3bNm()!740c2eLNzI-}Z@#A>BX`@z=LRKTnB&o@@R*BQC&^ek@R`zLZqg zy>KCI2VJ_|x{RkddbOT8QC5OKa|er=EC1vi2e zjUgqR@3xdXE(_5%8zI$FffB5X|JtxeX=&&89wdmV!H>$dmQbmpNssL4E^`fWn+{3@x|qZogjTs6`vt)wDW|UV`TJg zx|gCjTc%lhTX)?0h(Xa7!N8h`$-t{7^@Lyai=d$7tt&zdoJ z9tQ+$)#o{woxOLoQFEoB<=bxWkJw8a_IsWmF(OTdM2(8)1gKI}6j`X)hDX=cTbJCbj#EXs@Z0c=Mk=@e(e&q|rr;eLkP# zuGH`?&+;>)A#X1Ew{oN+ZFfog!zYy0vI6q*6Qu#nIHlyV;Mu zYn}P}94t1bl&(82NqvwOtDXww)qkov@EFUro%*f;xC6^7>oT|*i4tKoW;~Ee_ZiDy z$UhYQ5fbZTop!|-&$6{&DSA2mn)#titH?;t*d%{PPXzW?qg%U$DeEsg6P{R)9OFV` z2~U!dFm4Y9k<2!q_xQl>Egh|tQ^Bdk`@`W$zn|ETS?>fNz)$>Nnf9mb><`%ne1E5LlxnysW)#Y}ikKfxck~ujnW-1VIb#F1CuHFCCpZ>awVmh1e?hA9tk z$E@u%NxG`MNJ^O}tC?P;QYI!C3G31d zxeb^u8B+}h_HK0r;?&8ks9?Ul|5Cj{u_|&Ss|BRdn*zEBb&@#UH4TGoL%S^}UmhHi zJ~@weHWIrkruQ`S<)X*jzud(Et|P}G+;hc2W>WIVRK;%drkB$aDI^A!arfNi@qxPz z=UNsVod@J6ot;xX_h*ZCnr#x6wMfdQ9VpoUWb8Hfg`dE`WYh8u!M4RnO=;NCgj|a0 zo%oGCl9!qYI^I*gQ+AA+U%uuZ5gg7ZhsGgUgLN0ZA0emd%ol0v$EN~(%g0=At!}RU-Rj&`?F)U( z=diWT&0w%GA6RSMurEeBK|1UEidVPqPvZ|JKWLr`TvgdyDiaPk8Hr9@Mnw&Imydgm z)F&%HH{tEo`*oi^ld@AI*m=AdJx!eZlm6pgJneO=rmCdX%nveFsRk)ovD^z>c1_4% zc85B*Ij~i)F`Dt-D=A+sjQzii(|OjQe=VNFxr{`@BYHydg$- z)E6FjnOEUel~xi>c~7w-9iDk;fr^W61mQ;nY}bB$E4SX6wVU&IS?LiTQgLJK!q6>N|Cg_%hRZue>95tR2}8=9sRI z{Ggnr5Tf0+i4D{OQh6UU^MSXqJCBbi8H91#*5^BV ztm(DYyj?%B*VV98y)(k4`leqUvv=GL;+rL7I~oMUEHKd(@sCn2XzP$EbHvYIxXh4m z&)dxNMn~FLu6H)3^=NJ3OQ-4(go=LHza;VCXDe$fK}DgzFjah=8+$BdySEugvKxyi zUe<_#%%;ji56Z`;so#Ihy-ixl({AHDTF&9CwoH(vRn{%j=X-Qd=e^?D)G%ZYK-%*Ri>QH2JE3MgiI7If&y>YIdLh#Mm(-@YAkbv#f|J}vZ< z&WNE}lIn`n$jjQ;_J?1s6>%G!PaRrnl#_BBkKm|>5r~^If-C1O+9=G6)Q~5r72J+NLXBouh zJsx(ftE=fy+J3B{!HNI8-8=t%Jy%mW%R>}99!O77G0m?GmZ`CgHrCpICq^@yrYAxM zkKT^{oYJYvziK%JBUa4=&0n^zt}^CME}fR}nYx7f{IbJGwehQEN10wGeWMge|D<8? z{2r(6#U{Jp0|vcIK{bl?_2;_!@m{8Bv?fXHhWeAs0fDWY&r^>w{73lN?;b*26uYvr zmmj}<5m-Ex1?@ArKTab&UQIaK7br?lQT=O?N##u4Y4Bl(K+3*scy(W3`1n(j-i)#` za%W2LT@qR5)kA>XI8s4hmDp`0Y+I^QQ=emB1X?XDY#fRz%U$I*i{I$yg?%?TB<#xg zp~DyQH@c~o2Ww|}ET~Ub@OlfVwH9x$kkB_Hoi&YwWAns)vQ7vEw7_ zzO?xaCH?P=ebF}eZ%4M%qb=A?I=b%N-hwqDb@jyH%uLDX z5Qq|~HzmTe^yZkxu9}~spjPVrfPloUP^Jp|VH=M8xRWlKn5>P;kNr1qO{W(X**iGD z&M~$j#sZ}zDe?KE4a~*wBeUTFNnhopHv92zW{7J16x;;_G^_RmSzlph7u<@C(8Za} z-t*vh7qXh%LKoImB6;7wI4j*-e6*Ce{K;ReUnSUCPlw^lei(2p0edyOVG<+B}M5SN4 z@U4=+aZQN9>GDH0rE0!uLvu~m{tF&O`;t;FJ<&f1V9AaBsoIz(Z_%wev*?k=TmBNxxW#*?Ew7usme5G@Lri3-ez6k+3H8_TeKwg(~-32T$(k1wWA2 z%hEc!pFV}}8ehDYBaF2( ziDUmu09lT#oRnO9KmLXzjN?ThGeYft*$W2a=|#=PV%jTVYQb*W^w)i7hUfnL)Q$=~ zQ?L6%I)x3}=oU4Dka2?n{9#}59qB4xg=l+>jp6>t!>>VEWGh8u9^ z3?Qx2fT{xLMx|#KeN+sd#v$5wj>Abl7Yw`ajkRr;_n=J$(rfk>OslNrh+3ER5JgF= z7Xh{JtDx`0o-$ER_wWc?hgTQ_l*2;O5M&i26;&!@B*RBjCI7kHpfHs&_-Uv?;HxuI zQ`N+gZ+oQznh@gF=Z7N-Gw}gdNrm3R6M-~D{B^$?#9c2Ij>Mg|_)qBQ>qKB#GC1%f zhbt=OJu}b4p`NE6j*sw>IYrF8d|&<%o?u0%413H3au*0Nre@en!hBhdbNCbwZ5-R~ zxJ!lJfi`zijOMx4F8F_4-ekBX2y_6usHkJ9a^+{6q*}f7r_QS9k3K6rJ2NTVB)_R@-FS~%I`LLkM>DboGMdlX9TMi!fL?MV`czkke!>BNY}RMhu6Kw zMEA~vq$3xuw)!Yk9=x*sxQk^+O0Zf9m93Uw5g@$>vsDM+>Q}+>R$YBba>dB)w^Oz>n#H)K;29r-AgV zE#*f)-_360G~F;TH1Xa}d}k-_QgC0p{F2Ad=kiz`vU z8yoLGx5~Cv8e;AI#IGPw#i3rcs4d&`lB+L#R%WvjusLdQNRh9RTU=gV^UHvw&gJ5> zrtPHnh|17Ex=scRXHLtM+eHwqS{xY4oVo)R0*&J~VeB5pAwQ*KNlsX(MCZb*vTpdnGZ?NFnkq%^DwgR?+h=KWod3>S&i? zYE?E^{vI$d0Dt)DGB85RnzP@K8hc%M3-!I8pb>HfC>q9)9<+$bmIEy9I2+r@8~9Q#ZDaTe<=-OJY6d@D7L*VnuA ztmpql6beCLNs^OT$#-DiMN4;I8attuMz4e7`BqsCO?IVFEJz}6x@7<(&?}m)b)=BK z`G!=GYOBh@OS_&W$3!9;&m$X zW#Dny6(^AjI8fYs<#37k9Ik$!7v-5Xv`;1;Si~;dJ1AB$sl@@gzEgJMzY*HSAK3dh z$hw|mmOZD$TiRljl`4vDfOh2QY!mpdG@TjOl83rfKgTDsN^4AdWxp5G*9$b<7*5-{ zuXIX4P>=Z-k;BCas7u74h#Wp{Cy9xC2Rb_Xb>T$SC!U@}@$vdX?|+a|2^K$vv%qIT zu%q@3baWOJHCoqB9{&aKgD1B-COR&O`3FC3wgAdzwU_fqR7^aJjX_}g?EA|=N<)ii zOeBg4=$Z1E=&bW?Irl!KdF*TY_o8Yk3wy&*?T6mQ` z#~dCES_vYwl9s)mv}4OZismv^B0;D%)qWTZNPf}*ak!hJ%GRDsbC;Acb*--pGw2Az zl-+wiU_XPAkwf;W1m#`}q4%2NZU64JSboaIlQ(&k;o2L48&B8h`+RgR%3tT`8TTjv57}5mb08N9kH4`>BSG@U1J1H^aUL@ScV1v z)+Fj`@Hl^xD!zJBj_ekI*e3UVWp3c6PXdE3D*Cy7Im1-fBKFa;PUB_A4;2H?PBm(| zUq2%@ERCa|g?8k0ayQat?#I!w^=oR@9M(mQd;}`>&gj=y`;`~}Eb!9w=Rfp1ztZsC z+nP*5*M6L>beoe*aZg`p@1$4ynuS~-%^Z;|#tij~j-;Lb&A>1TkE&)aD7bgLs5o8nNG`tFh`!B>6lK~^Pcof?k1lf}KDjzmR;4>)QYyD2 zg<@YA8a_fTxea&7dBobCewUHWJPps`DqSWHO+$wVtIr*|-wTO5y2P>uwD)k}fkx7o zSO7yJp9Nk$g@g7QTTT5p%cS9H=qP+S=Rmhx;?c7nIQ$b3Sp&es>{jQ@-`+iXVl~z) zt1cW6HT7a=J+=_FH6r(SaXDX&9fb~P_+&GRwYwEXeE7l6kJNJIeyrW!=9)?7=8gTk znB|BZ27V5Ndt3tRqMW6vb<-kr%{mmJcHQPvG~CEq_PH>^{YP2Mf(B%3V!@7}b5Dy+ zh;V7EoqF^xSWGtl97fiF1mp$f9#;u%lD$>_Q=gc30(ECBH6;EhxoDj1Ekzv_awoD2 z;41y`EGo*$ZNP_xZXJCjREta6IrBayL-GlxUb^O7NDJ#Y6u*Q&R%F0sap%b#iA-AI zFw!{w6vOw>$tAG)Tsc<@u(WNPop|zz8tb^cFM#kFTUDzo*W0{qT&{?K5cY@4Ny~R< z&r+0;tip>Q;!~h2mxrI%gsQ57#3&&)PF*UTmoIAyii=^-8tk|t{;hZh-GYW&9L?no zsgDyC^-P*&X})&h-rt0=xZ|26>Hg2})He@lMC25#mbc8~X>fw*nCZ4S!oBfcop`%Y zX?k$oJ7R1D8aTytB0>#ZWo>j#34tR&`6)-MCPk2}1%3Ie9j0#A^M#i5*u<|v6CV}v z{F*wdsHmXi#^=(STcBg9?C~5Ya~y&ZAL4;}s|GcZ1%CqTTF85TMxkz-*2S9Z#&>%J zM63yg*~6G(@Y<2g!SblX#LET{$UZ?2VLv%;me0|t>kkh?-%C(n2qsANV3K7Ek6cB2!dzPlFVTK|* z)XKqpre5#Obg7~jK^xS76RL~}QY%WvxaR!!wvu@Nm0KaU#KduuPMqw!#y9=uy$>>d zRqy3dnLhjH(_ueksZ0uSUrj>wUgkRR0Qm7&gC$Bp+B}OQpBxBvldbjc{6;ipok)z1c-#>V|4MgO4!OdHRa6o~I zZm-BdMxkQ{W7SdE7=9^u&oBc*clOmL{fs|<#VvgT^G&vn&*g4QvADwIoTL5B<(U4qHA=J#~3X zq4Hnx)Z)H>*9kpqe5@7x`E^QOgFzCa(A<;dkL+#k7Yir}BKb!-MFfvi>B)(vY@TUW zVL62Jsr|4Xwfb;QWZI1P#7>iLT=s>QA;N3VS7z*ds`}BV2o*R@U))=9&>H_AjeHz( z>G2eyy!E@+3Zi$#?&})oYj&}#=|zHjPS4Y=KU|M?0KQWiC1y@;D407%tqJwEBk&Ka5Na3vpR2|+H{`~>sn7*a zua~l_XNUv*f&ah!xH$I0M@j63de<8=OqJ=L)HWHkf_Rw0uBUWHgoAh_)#7;VDS-P`V zD}IjPvz4Q!wkqJs>?-g_;1l>ks$uFe0Tf`PUO1t!0#RF&2Zp&dUcCs;I4YAk)UYNG zZ(H1hctKXF_i4?!0#VC`X%wnmMuvv?CM!nHc`}}$1f{Uuxz*xqC98LC>H07j3&Yy1!$@wsym;iQ&O#09Yi0+b*l`H3 zM8M){jV6dL9SG?4M1k5bJV*^=>a~FSGx-K~eFDG+XyXz1BAGS?46mQlJ^OkPN%Gl# zSdOJ#^EH=?Z05&tBSe}b9qx{`f%~)C1J*2wXRM6naDVg%(Bt+&)2+#pVn|f8H?Qv~ zQ@yx5{{9y?dC!~5UT1;aUyWwG9$E_Kd?;}cz`jJ8Gsq6Hdw^Q3A@Px*pQ!!#^z_@(*ZA}b?KclO1NF6R5WE;3q+`KpUX^knXi(N%wEz6Ae=s_sK0)vtqO5P0k3ru@-!2^9gd^$CWm zclQ2%=2Q+<5YOJ&^kyF&6!n7&>=6(x-+XvHJ)UwX+qYOvsbTZ&3=7hJOQ|7jF;Jud89jkS)U=65%1+=o1$#`Rt zl+sZ$Mz~sZeR~#@@^+BbA~kgQnl3g;bIdlAeR(UZ-_3s!O>BR}sT68`3vWEnZBPA5 z+TIyJ&8S8)_xRhse)j$pOSPqR{!59{2Ii`7>&GoE7&JE1Y_@f$P`=-2>kmFSVpIcR zm|TIu-7*l5u>Jj|TOsY&Oyr0DPg79iXZ(Nu%k>Wh+d%rv@Hyy|+pY;6X^ZWIp0ieIpn? z{$Kr=XrPnQY_(NBQ`VOPq&J(TQNGX&KU1cX=F3Fj6>>GkHXrHt{Uo%pS<<1h>;5#D z%fl#;m8YBgx8UCw9q{+T7o8ZpQ;oTQ6B4qoEXmx` zgNzb{$upG%T z!GjwPSVi-!HPigCvqHX<3kET~n5Q7>Wbb`5uTOxLhq+T|aA9FDx6+(iZ4;*=ng6p$ zZA|5p!NM{re*zV8&_UYoNGvVYA0S%b531$35P0=*)JsBwC6UMmn`D&hlOlyfL^1EH zwj=txh2CSMuu(rGh|rF(p>IZ75jKW0@lf3zBCO8aW{K(jokH&=D(=CixP@p^J0D&W zJfKJuS+NZq|5oafi2|=yTw6v*g}2G&?X2ilZd?=c2~ed*TEQ`Ygpf-<)M(IN;^s&g z58b_^N!ikJ`TgY;la2!bL&~Xi$dTeE;n15-XgjM9Ma=naZ=yC~O-D7$Qz|NBK5&>I zOK+B-0uS{sW3JFzy2}c>t7G@%*Is-W-%|?o(>_~@fB?RMoFBrP`*uhfDCr|8JInz0 zR;PnN&)9IfJ-!Df{S?+CEIODzQz)u2=Ff0FB@RlGi{`NDkf}oPy9|Q6`VD$|px*ey zCt}i=C&_A1BC@161{%Yc2Tk-8D3WaQ(X?0Z2fUjrGy*h><2Hc9TO%}&tB*EC%JsIWcqQTFZ>7lyReTbc*5;=pvlq#4&S|IqOA!CzviTqF zzx*gV3I{EGPhLY@S+}25vTjrx@VS0bO(L+_*(1iAjP!U9vAB#L%y`>P_JH>~v3m(` z&*#wz@^$w-94HpTG_rM`a zM-xxi;q{@&rd&NKU%&Ip&wiZU-QBTT)mm>?K5FDLO&{(JVm~27_WcW0Y?zWLLBEq# z2AU5Wm!-7y@ngWa9UwZGj&SQu*kYA1D3)5sU(sOa!qOrU1`&~JqZvQ`e)Sn4b(yXJ zHxEi=*)Rzf>f!yIoHPKGL!OWQ2;^jK7+fsB(aYM!1%q0-UqYeWn4!Mz$Dz^kG89E)$0S+e3>JW5w$iEQ8WS@lndj@4a|$Z$E+s z|NfX@HJV7hr(rCKseZ|-aV6(|Ib0%C%E37WI@Gr!itg)D*%!gfCtv)XD(x3~znzjf zk_3I|${iX^K#?+bNVb2?r+oaf#QA2=apvLg82W~{qC+G7El^`dhQ)>bLSZ?mB<>uu zf=VL#STRYGpMyTcs#R)#za{9oV1h6W4=TOfM@Y1bDEWx`r-uLU0&f4yKN61>=YGFQ z>k%RXFHA-!?;`n4>#SCXE#5~*w+o$|%QBCNGH0Bg&f`OVkfXKU$KC3W%>e2NO+l%z zO^dmQ9gmajd&&716@wdN*c|zJLP8P=Cd^izgFj^G+0?2$kC`%eF5iH6K=&Zgk9WBG zW7uGFQZ@`uR!>_*+eW{<#rSkZHd(A%>;3Uh&C6*lB4~di@5z-EEB^jK+xh$tQ|DDR zaasi}isJ{zuI0$N62MTMMPaw;BJPXdC2nbTK@@bM8h!10+>9*&DTm~FdB(grkgq!P z)OpRcGgb*!MQmtop?6{C23+SAXc{V$b|jFK^I!l4mit!EknBJ4h^~2L$~>iDma`_v z=TmF%l-qdCPNC+xv)SGYNg(AuG-0rH`8c3X6HkH&A6{FtS*Wi=YYBn5e~%BRW{ zaz3jP&H<(jDqG_xJ9^AQ-^o)@zX>Kzs5(!+VK;gm)xT=^^R*0PwKMsY7k&UGqc&Tx zY;_|$aJMCF(##tTK5(1gpKPFw5&B;*01b890(vq2S!_)RQS%FBiu}5KclECs8~Wf4 z)D!&M9-!8IodztQl;JI+1G-dc_X+eSRjM3SYlHu@0Q5%SKrY-yt_BR(vRma_4cs$e z*a)SXt5#5)q^J8Wb!Wg|6^ge1alQDSuY*@#GNU4Q@UsPn`-iM!?eK>*HFv$|DjQ}D z*o4mpX5~y9jyF7HmgNXIpxS+)XA&>ls4jS#+zMR>ipRnjQ@WRnDc5Fl7LPZ?n#I3a z1UrJ$Yp&7knI4E!{@Y>s*g*)!#nve_IyM_Rk;GwC!j?QSRu0l^X80&YNLH`WwSX!l z4{@>6Chd(emDqY0(Nmr(0UQ%hhTn&*IHZpHds8IT^dTukgI~XNpu(NF)28xlFzdgg z?^NUEop_q7XuHUz($S+28s$5Mn9{Zm8z_*WtKR8++d-gvbaPql=Lxtyb=84ZOX_h4 z|C0~cXPoTP6Qzrlj650Zx=jMJu)c&1;Q0S`Hen~q7~>G=7R3KtJg z*VOd3R6?AH)z#D5$!DeDx&>Mjh_eb46m%WZDn;LEGm3Fb5xK`Ez@!(7e`o$mnGfDt z8g{Gz`Teg7J>jKNTK1ZWb}GXFGSC>AA)Ge#!m?W2MORf23R~R_VI8RQ?J2Dc2sBwO zJ_x#rI?W}FR9~KtqMM&j>d+nXaKTbH&`3?=eswQLttT-Q1}gZ{v-#GSAKo7-5{MHG z)SA9FjzwPbj7_z5qk_d8HZ9}3fAov~6j>2h)Tapi$9819+5uOhT?T680Z&m zH~vAV7L2gV`?39ejkG|`2Bc{%+P4&X;sXaR-lq)$&><%M+*ZClSt^R|V3e3l&fhKn|7{Jv?670+Qbc!{ri@9-7}XJ{B%WQ1mMRTh(w*iNKW2tNR^%A;<4nSL>s|x2Q2U zZcJ^Vc!X%s58g~iLI#)jGKVhwIt3sBT-b)`D^5J$AXCRiDgt(BFRBFQw2o7y1B1`X zIJY&$s}5`tLft!JEb>pAXTJRt0`_khn5|nD>DgseR&a{?s&ppor-$7S!Ly7)q2M0- z;~Drbvl8>ei;(BjFU{Di4Hc}(@!}U#ALpL;d-Wvfya(^soThS~-A{g!E`IfSTzCFZ zJMlPI3Y=)m#VP1h$K8;#QgX};b{~T3f;*VD+`4cQ%lx(c4Ne8Y%it4ATo$UW!!MpENy+#k$O7ByP=vHPOTT;RDbsSTz4%uhA(F9?%I%Q^42#>t7;jH>EJD%Rcu{O_Wmn2Ujw z<7aY$Ip#-Jftl*ki8}g(H5DS;>qw6u#%G!(i$nE-*4fGqN)wp#pcnf^%82mT1kra0+=#L+--1>X9N=r6a+ z{3gE{#p)(y@oLb+|Mqsy49}E+lc&iBa{3wATk*%+qu~BZ$G0!r8!!7(%;w*k&CBJC zDrG-8^}qLd+dn;E>ew)gU)R2Csi7g{^6P#CfYWO^-knWX8SB=)RL<)XbOGx`%+ehu ziCN{JXRduq9z5MXCx_Me{)Bg(Og?t3(DqD*C=LH5nab(R{`%La?a$b-uMHUM&L~tu z4&_rMZ>$ao`0>@v&tA;@&cbzCj2v-am|OYprx(;Ds4`rEh&f!b#j61>Z@o@YYh`;GBP<@?d66T1|BA0szWgY-t25gnKvhgu&@w=)S6IBbmdi#29`9`DF=!nHG zP6++B;QNZXQqfBAOr_Ppt3A0TeN*3TdzB^YH}cXFpOcc6jN+D4;lvwAmDqzyxO$Z1 z5IxP!tiCCmwW@*!_fYbf#!7?Ihunk>Gs6d?w!tO7qrx0yIBD+E+X_8(y|m)Vb`bl& zl)Ir9KlKhjFCLA`W0c7{7M>lM%b$6+aohVq@M9z5pYzA&3y!A`d>9WaepNTm{ddI0 zXn)FH{+%cC^y3mj=HRKr;I7KG%oWc48_Aw^}F@$clMZdZn1H3Jvt5Ww2a!*6HYp>G>sGc3fw32 zAaza&;4XO-Eu%3u#<;lZawB!BY%-Ui{R2-UP~jgb5-W*LglB8XPV1i`aH-@}&fZ(= zg6Yh=LB8B#7?K<<713{mz>_QikF87xv1y@mnmoVCgtvUUEPB^)u(aP#p7aEdX1 z_ulRhfpSl--Qnz|yJ>h+10Bfm!|Wcv*I0?ug!8*fvmdaozGnHREgg}5A6KcK538#@ zTWwv)K;FboTdS2owLn_wlDPIceI%8>a>8&7MnU+8MG^H-F-@3Bx6~I2#GmInMyb0a zWGXp%*QzqmR>=e6<`a)(B!c>VhP~%uy&P+TmFzMVu|kRZlVZ8%o#t-+jkOQ0b}B3$ zD)kVmw3iY%syy_G?N8M|S!!_>{Q1K;rm#tAy6!o7VRZ6QUZOm5$osVIYOi8suuhVN z+`NUS2U2 zu4|wWd!DDFTG6!pbB3!F=Gtz(*MH`46i#aHk{kCarS@4rRcwK%@J*?*yc$lip#JED z?uBQ*zP>U+Ubl@X0UTNjsn95!GMpUdgIYZwYv~_-GBJD}BWd`^bwmLdY+HH;=NIhX zRW`6>KlL8 zZv|0j=f=jw*lzx+R}=xbCMT{c&iy*dKPa1e*k3@4u5ydyrU0BW3g10Z$o)I-JuC1o zF>Y7fL>$gpJnv2Ge()y7&d8HTT|LQ0KsM{%;pyCS`?D;orQM)cBkSBbMs5ZmVk#>= zW(#rY%erJIg5?IQjyG~(`2~N%uwhBy)uK0BU~E0sEK)E`MKzx?eB|vC+;1cb8Ieyt zw*y4Ul+YrgwA@aS{mX}cP zL*jTl7pK0Sie0?OU^$@gkBRv+)>stY-2AcH4knvsi{6X#40!PP{d~m!vq`!#AN1H%i;;-AI#~(4?1Y;%UR$|a8`p+uxS?-H~YF6yI z25egsnJki+3zfQtTi8v^3=A0Yd0)+*>J9l}w#e%1afXmtci-fF|7lt!=TYMn=b~W0 z^iJz-r6txH4$kWa*~9l>FqjEWFtNn$@WCi_!%GzCI$9=33j_HiHpeT3m7E8%Av;%6 z`t-e4_9oo_PN0?5f=*3hG}`0WvBBA18Og=lGdPeyHi9b>7Hl}b2&WO$gp-_?DwMu_ z{W_@ZMYO*UbN3rs-s^q*#NpTjD8;mbxyLrh7jzL7+$l9*(*k6HdA4^-FJ-OVk({A<$42+PU}%{h~DV&~QA z7u{A}=qZ=_6Wmisi1nhoj;i7$`=W4B(omsG{az~*&agCAjaOoeGBMj;=OUA;GbSVO z=O%R#Ia}>xp@gPhX1yiPC7GkTGxCBk2`hjlmrSb-YYv-(4wR(iPr9g|#`Y>)rBp8pGTFP1uK>Ip(V-B+Q)@BPJb^fO$Cf&0zqO5P ztF!OlJzyZ}OG}!47bxT$UsggC$&~AgpM}&su_^D8 z(+@Rq=q9T^D)UFEH7GV#^*L#U#eQF^N=l7UAg8yBA#9N3aKK1fp(Q!XuHnmLndmIR zWu9Sq{mQQS+ajlb56FJ|Iz_}oQ|5{(z7E`vFiVK%a3yr&_Xn3#1`?$@ zxQlgCBl$nGp|w}u61%!TnX9JF`SCI_PVVpFJ}phn)~E=f+dD(}ec5qOhC~ag_fY14 zBInD?p^R6SlE zpD(Xs~}Ri4x*<*#YCMtv*aU$a;@sYG6suhP`G zs=v~%Ey=JaT9*d{XdOjmQ4P3~N<)T(pEV0_pZ^tV?Ng~KhCL@^2tHB??K4)(Ythzk zBszcB6LG&jFI!VgGr(l}ln;s>h=V72+BC})-~VU8eBBAj6*`(xucclqaMDj>H&bZO z(oT3D&O4Uk1HM|}q1sMQp8Wjgl{A<_xjohwWC{1gcPj1Ye+p$OLRnS#d32W!w+S~I zAJB%0K^|L=)=l)J->J`U=W*C5t5T7t8{M^Y%-(ccob(m<)JrCfbdiH;p%)7okDIeU z%3E$AIM0^8wfr&nj9POSe9CEkhxry*T=cYH+Zkb-Ry*H9eD~-JRH)Pb^DZUVeR(S* zyhvds@LOK?WOf8QT#ls&5gnFD+dcRJ>J(jFUm2G)$$9B+%Jbnyv1eCg6wpa!e@G2I zlJ*(#4;;{8?k8PqKlF2$29%qUMv}E+iMM`MG|RKVQJ=y1wj;95XgCAQ{TyZ$?wJ#X3W zJ%6ipASlJ~XdevJrjLrSwh@RnT#RNraG zW7BlBpy{g&uE|nD?9{OHxIbhR;!SNg!zvBmym`b`xwe-7j#w`IshMZ0VWVS6Q{UPC za59&-;G!)0#VeRV9Kzsv+;aKXQGN0E6jkTH+Cw~{VjI*$2|tYpeB5KGNde2u1R`uz zxrZbRhQ4mHb^q*9w_oix&FeQ8B~OM9?$I)K-uD$)`D-w|P3Rj{(SuV5#y#w||xP>P}JV zBcK=W@SJ>l96CGNoqbbX_)fu{Oczt{?1Ofz=$BlKoVyJZy6^kHQwMS%@&xjx_=o;? z5ivu~*4g~q3AHiGL69&1EI22&B#-{uGTau+0ssT|Pe-wuTIy_m$5Gmhm_Lm$dFSqf zdrilU_7W1gan|$+!af+74UaTCmNqY-iG(DGX3{=;vNiN~)%)LJt;J0jMn)A&Gf!>G z+U+&+SFdIA?t@{v!4w)xpXSOUL#)wDxWH^X6GLe{+OcV2 z_0mp$1Zm|aLYR+l&OZ?UMvZgPrs*~SP(HsQCV6S8(|Z<{iQD$OFCfNSj~!B$=|D>( zKU3BA?lhL(1gT_&RM}HL5{2rx7TomH`RJj=KR>5wMI|nu{sXWuPn4D#OOdKJC#nAb z>65>$@Vrtj3uZ7L>twh8#lwjwg?Xa5)Wm`m0KLbMhJcfaLg_TqLMIho`(EA;df4Zc{ZLUpD*VJc9?GhlIHG0UQSd<^%W@Gg#xd|u{lEAAo!K+lShmFbrO z2-`P`gDb)0HL6Nq6gAo)4}qn08ZZjCCU9THT}C9G4Rd;aH{As%-f1bD`}CVanUPYA zQSA}**346K#RmiTg9Wxke?FCuMxk=fdW9~+sN@Nmi){OnA<7UsE_s z>TN}-4`dfQS-QgP_NfT~Q0;R(kaNr>3_>KmY^hRS5VA6*J^QX<>k2pFQ3yw{(Qc*1X*8{GiAg{Jv-$dW1Ly__}SYu8~hN z@ZUXNCQ9ZPr}afSs&;mUQjBd~#5q15?s?0+4@>JY);M$s@oD6xpM||?a$oc3Ij`^c zWEN6bVh!Wqx1^vg?ouFvgPHF;%fCXQgnA9>3yso@cLL+Gm3qS^E!OYiwT7;BeH6Hy z&}Vh}q?kvS!KO$QKqn2KU6cwj;sW0my1~hmOIS=e!sh?eK7N^Z!L)`HXh7Sm8upAb(X&T;++Nb1Z}hT>B!5ym=<+XB zP|r%2|6%1jlIIdDrcXF)eUp8H`&D0V{JtAMXr9C)i}tNurdzPw1tDyKbsM?{j`(DI zr-1E{$1! zD9y$)|D)VT_@Y8@6v})sp8_7t8$^lY4rHsL$x(aZm^K3vBv=F;j_gNv){fy3W*lC+ zbYy4iB5z3nRj`^t>VEss(9<)ntp4bcFU#u7zDvd!_VD(C77qPX9NO{<`+rh@ioZy` zOf;>j`LU6gxu$r%X}@VW3Gd%I*@+*Cm4-LxQXLrvNXXcK7t~WVK!me z%q#?=OD)+C;U*`-tS6y#VpjncS@hR&AG)EJ=T`t^3+HU`hZ!Fhkasgers~hbJWubE zV%@9_}}`?(#mq#87|$Y4B%6d%tLY@7k+437#sOosBTWY55$In&d5DG zyAB^F`Vwk;vw0QiAQIzOuA(8#-~w~R{puoAArYgrF1y&5-X2r3{z~m_m(zH4V`56} zhGXX&%%IGN*KC?j20L}c=X*V&G3Ef15J$8<&FPi>TrN{sewdMM0L!Mb`|rCLPlubG z&_k83`Thpmk4}813(xAz&Lk%=SA+pQP(8!2)2fZjq9MOPImfB&Pd_9O&$E9gzAPmB zH74XsOo>K5nUfdm(SYIw-*V9?1Jmz-(D(xy*$*Ph&o)vyLXrMia`B{sP_se}K2u^- z?98Wau~cT)5SX~}Y-GLmY z_C3-wnlbKN>R8x$z^21Lw$c1zamHO<=hooqz67}6M{Ua$+a?1U&FC|Gl7UW9W_qNp zOVe%tO0EBe1o(})e z)VaP(56;);aCf&LjBuTSe$;L1Nk~|Znw{>%)edm6&kYg9>kU~8&*slNd$(!#Jsy08 zRu9>{WVw0!TSc|@c^8^QbL6TG;)n;rI;6eZDvgOPF5%35v{o%`v-BMM3 zvsXqJICuei2T>gMeTGFjs)ntEsM+^r0OTW(4Zj zVIR7{EJ}dqP5Yd;7ml>&lE3mb`sb84XI$k`4QbpEg7Iv4HQ*nCMCp9}M(rPh;Rxk1 zrA78@!nO~IsltQ`Yfz{dQ&vP8sBWa78Z-u^s?4A~_z#&wv?&et_J@wUeY(dbWtsOG z0?c+&N}l{(q&rZae1k9KeS4#JR#7`fzL@+&7pQd;0Z!T9Ac-Zs^i}PtDt9p;PZ%(x zRZS8K#@-_hxwQMrM&n;|sqK}kABi^yYb8HI-i!SB)*YzEn>=o$uq6TC zOU{x8(q~xpmDI|1%(oKq4_e>|(Z~xT=Sy0Za%bHN#GyB2pc;Bb+(-@+f@(H!O0q7< z%lEr${ zs_PEl9=V;mCk6p-wvsF=?6s>Km!{>rDN@*OjExKxhU*-Gj0V1#XhH%wTlfEFCpi}=T-%9ZuMh-spief@|lJR z;Vto;ad7H%n(K?j0NthR=fbn#`7W*W*dTBE1Cqqh-Bv|rU`OD!=Bp;+OefhlsDLH* zsijj919JL{pKL&2Vhi;g6aJAy-lf;Mv2{5MX2XQ;reR`Ua;Dg})i5K7J+X6!;dMUP z7A1ml%M6G9!cn}ILJ7#_UnbaX@^ezzDFhe2+-E4Z7psOt4;KDFVM>6vCeiJ4hFF)d zRpb*eG##sc#1}ND9aZJ;m&Hw?=0Ha(2sumqF4hXE3$~M3vu>^zNdGKwV6VAZ;0$&3FfG!lbt|tB|JEgaDezP3x)_KQ3Bfr zk}R~uJVZ^ez7u~$1;C^>)a)=IySd2643jYfrYvA~Lcta4$v_YzUt0$xI?M*l!X6*C z5+!icu?!4gRo%%|TOvu$xa+3W5n^}neRm}m^o!8JSVn3!6ZAGr? zyOXtk>{QrL~67Y17ETGqm-kfFeDs#m=N3_{WL_`7%<))d_Pzq*uwG=uOqF~qjH z%vA^>*e8%WZa*v?t|1~}Hj{>t^nsUd7r2T(BtM02SQc&)PxJ^duqWPipg_ocHt;@d ziwB3^1cT{}560)!#Zx{2+s7+OJ~I(Ww-j*b2{Be)aZfw)L#yo6N^@{sAFU><3tlgAEr2)jvD ziQ}5=N{{8Ay9L^^3r5;!N}FV}Im=qS(}Qojq!BAIMRsuwhxX&_yKZVJ4DcIM4pAB5 zpsECJyyO=fN8<&gR2}tsIM!a$&gi8EDU#%YBnuC1CPgN71FYb)OEqKBfVECO$hzv9h@*)0?^5UdPX?~Z2vE8 z9vPJP(aGK#ujwH5nrx=3Jl6So6d{8WNVo&?Ej>QKA!OF~(d_Eg#Cjqp)-8|OecRbp zaF=dS%Ph*Aof+Wcj%uGX3-G=x&J&>U(?i0FSsxJlYy{gJv#cF3=aW(+Me49KJ41WO z;)oX4mR4s;{8`j!#vmSKXz(}b*e+Hf9zhrdRm#jpBcX1`|C zO7DPR?PBW^WC#!jG)h$+wOczQ1HKZ));;HwjN6%knAWXM7HJ)AsyEbog?8&J%tjGr aLWy6S`(w{LZPx(sM_2QnMunQg%l`qrXe>Se literal 0 HcmV?d00001 diff --git a/app/lib/main/init.dart b/app/lib/main/init.dart index 8336b20..7fe25ea 100644 --- a/app/lib/main/init.dart +++ b/app/lib/main/init.dart @@ -2,6 +2,7 @@ import 'package:common/init.dart'; import 'package:domain/init.dart'; import 'package:flutter/material.dart'; import 'package:app/main/app.dart'; +import 'package:flutter_animate/flutter_animate.dart'; import 'package:get_it/get_it.dart'; import 'package:url_strategy/url_strategy.dart'; @@ -15,6 +16,7 @@ void init() async { final getIt = GetIt.instance; Future initialize() async { + Animate.restartOnHotReload = true; await CommonInit.initialize(getIt); await DomainInit.initialize(getIt); } diff --git a/app/lib/presentation/resources/animations.dart b/app/lib/presentation/resources/animations.dart new file mode 100644 index 0000000..0d5cf9c --- /dev/null +++ b/app/lib/presentation/resources/animations.dart @@ -0,0 +1,9 @@ +import 'package:flutter/animation.dart'; +import 'package:flutter_animate/flutter_animate.dart'; + +class AppAnimations { + static final transitionIn = [ + FadeEffect(duration: 1000.ms, curve: Curves.easeOut), + const ScaleEffect(begin: Offset(0.8, 0), curve: Curves.easeIn), + ]; +} diff --git a/app/lib/presentation/resources/images.dart b/app/lib/presentation/resources/images.dart index 29bbe9b..06fb82b 100644 --- a/app/lib/presentation/resources/images.dart +++ b/app/lib/presentation/resources/images.dart @@ -5,6 +5,9 @@ part of 'resources.dart'; /// **/ enum Images { appLogo, + modeDay, + modeNight, + bell, } extension LoadImage on Images { @@ -15,6 +18,9 @@ extension LoadImage on Images { static final Map _imagesValues = { Images.appLogo: '$icResFolder/logo.png', + Images.modeDay: '$imagesResFolder/day.png', + Images.modeNight: '$imagesResFolder/night.png', + Images.bell: '$imagesResFolder/bell.png', }; String get value => _imagesValues[this]!; diff --git a/app/lib/presentation/themes/app_themes.dart b/app/lib/presentation/themes/app_themes.dart index 8b09409..fba5d90 100644 --- a/app/lib/presentation/themes/app_themes.dart +++ b/app/lib/presentation/themes/app_themes.dart @@ -1,3 +1,4 @@ +import 'package:app/presentation/themes/color_schemes.dart'; import 'package:flutter/material.dart'; import 'package:domain/models/theme_type.dart'; import 'package:app/presentation/themes/local_theme.dart'; @@ -25,6 +26,7 @@ class LightTheme extends LocalTheme { Brightness.light, LightThemeColors(), 8.0, + lightColorScheme, ), ); } @@ -36,6 +38,7 @@ class DarkTheme extends LocalTheme { Brightness.dark, DarkThemeColors(), 8.0, + darkColorScheme, ), ); } diff --git a/app/lib/presentation/themes/color_schemes.dart b/app/lib/presentation/themes/color_schemes.dart new file mode 100644 index 0000000..6695c63 --- /dev/null +++ b/app/lib/presentation/themes/color_schemes.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +const lightColorScheme = ColorScheme( + brightness: Brightness.light, + primary: Color(0xFF6750A4), + onPrimary: Color(0xFFFFFFFF), + primaryContainer: Color(0xFFEADDFF), + onPrimaryContainer: Color(0xFF21005D), + secondary: Color(0xFF625B71), + onSecondary: Color(0xFFFFFFFF), + secondaryContainer: Color(0xFFE8DEF8), + onSecondaryContainer: Color(0xFF1D192B), + tertiary: Color(0xFF7D5260), + onTertiary: Color(0xFFFFFFFF), + tertiaryContainer: Color(0xFFFFD8E4), + onTertiaryContainer: Color(0xFF31111D), + error: Color(0xFFB3261E), + onError: Color(0xFFFFFFFF), + errorContainer: Color(0xFFF9DEDC), + onErrorContainer: Color(0xFF410E0B), + outline: Color(0xFF79747E), + background: Color(0xFFFFFBFE), + onBackground: Color(0xFF1C1B1F), + surface: Color(0xFFFFFBFE), + onSurface: Color(0xFF1C1B1F), + surfaceVariant: Color(0xFFE7E0EC), + onSurfaceVariant: Color(0xFF49454F), + inverseSurface: Color(0xFF313033), + onInverseSurface: Color(0xFFF4EFF4), + inversePrimary: Color(0xFFD0BCFF), + shadow: Color(0xFF000000), + surfaceTint: Color(0xFF6750A4), + outlineVariant: Color(0xFFCAC4D0), + scrim: Color(0xFF000000), +); + +const darkColorScheme = ColorScheme( + brightness: Brightness.dark, + primary: Color(0xFFD0BCFF), + onPrimary: Color(0xFF381E72), + primaryContainer: Color(0xFF4F378B), + onPrimaryContainer: Color(0xFFEADDFF), + secondary: Color(0xFFCCC2DC), + onSecondary: Color(0xFF332D41), + secondaryContainer: Color(0xFF4A4458), + onSecondaryContainer: Color(0xFFE8DEF8), + tertiary: Color(0xFFEFB8C8), + onTertiary: Color(0xFF492532), + tertiaryContainer: Color(0xFF633B48), + onTertiaryContainer: Color(0xFFFFD8E4), + error: Color(0xFFF2B8B5), + onError: Color(0xFF601410), + errorContainer: Color(0xFF8C1D18), + onErrorContainer: Color(0xFFF9DEDC), + outline: Color(0xFF938F99), + background: Color(0xFF1C1B1F), + onBackground: Color(0xFFE6E1E5), + surface: Color(0xFF1C1B1F), + onSurface: Color(0xFFE6E1E5), + surfaceVariant: Color(0xFF49454F), + onSurfaceVariant: Color(0xFFCAC4D0), + inverseSurface: Color(0xFFE6E1E5), + onInverseSurface: Color(0xFF313033), + inversePrimary: Color(0xFF6750A4), + shadow: Color(0xFF000000), + surfaceTint: Color(0xFFD0BCFF), + outlineVariant: Color(0xFF49454F), + scrim: Color(0xFF000000), +); diff --git a/app/lib/presentation/themes/resources/app_theme_data.dart b/app/lib/presentation/themes/resources/app_theme_data.dart index d9f27f2..4cd0faf 100644 --- a/app/lib/presentation/themes/resources/app_theme_data.dart +++ b/app/lib/presentation/themes/resources/app_theme_data.dart @@ -6,10 +6,11 @@ class AppThemeData { final Brightness brightness; final ThemeColors palette; final double borderRadius; + final ColorScheme? customColorScheme; - AppThemeData(this.brightness, this.palette, this.borderRadius); + AppThemeData(this.brightness, this.palette, this.borderRadius, this.customColorScheme); - ColorScheme get colorScheme => ColorScheme( + ColorScheme get colorScheme => customColorScheme ?? ColorScheme( brightness: brightness, primary: palette.primary[40]!, onPrimary: palette.primary[100]!, diff --git a/app/lib/presentation/ui/custom/app_theme_switch.dart b/app/lib/presentation/ui/custom/app_theme_switch.dart index 63e046a..56f4e4c 100644 --- a/app/lib/presentation/ui/custom/app_theme_switch.dart +++ b/app/lib/presentation/ui/custom/app_theme_switch.dart @@ -1,23 +1,91 @@ +import 'package:app/presentation/resources/resources.dart'; import 'package:flutter/material.dart'; import 'package:domain/bloc/app/app_cubit.dart'; import 'package:domain/models/theme_type.dart'; +import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -class AppThemeSwitch extends StatelessWidget { +class AppThemeSwitch extends StatefulWidget { const AppThemeSwitch({Key? key}) : super(key: key); + @override + State createState() => _AppThemeSwitchState(); +} + +class _AppThemeSwitchState extends State { + _AppThemeSwitchState(); + + bool _isDark = false; + @override Widget build(BuildContext context) { ThemeType theme = context.select( (value) => value.state.themeType, ); - - return Switch( - value: theme == ThemeType.dark, - activeTrackColor: Colors.grey, - onChanged: (value) { - context.read().updateTheme(value ? ThemeType.dark : ThemeType.light); - }, + _isDark = theme == ThemeType.dark; + return Row( + mainAxisAlignment: MainAxisAlignment.end, + mainAxisSize: MainAxisSize.min, + children: [ + Switch( + value: theme == ThemeType.dark, + activeTrackColor: Colors.grey, + onChanged: (value) { + setState(() { + _isDark = value; + }); + context + .read() + .updateTheme(value ? ThemeType.dark : ThemeType.light); + }, + ), + const SizedBox(width: 12.0), + SizedBox( + width: 44, + height: 44, + child: _isDark ? Images.modeNight.get() : Images.modeDay.get(), + ).animate(target: _isDark ? 1 : 0).fade(end: 1).scaleXY(end: 1.1), + const SizedBox(width: 12.0), + Stack( + children: [ + SizedBox( + width: 44, + height: 44, + child: Images.bell.get(), + ) + .animate( + //onPlay: (controller) => controller.repeat(), + ) + .shake(duration: Duration(milliseconds: _isDark ? 1 : 500)), + if (!_isDark) + Positioned( + top: 0, + right: 0, + child: Container( + width: 20, + height: 20, + decoration: const BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.all(Radius.circular(10)), + ), + child: Center( + child: Text( + "5", + style: Theme.of(context).textTheme.labelSmall?.copyWith( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ).animate().scaleXY( + begin: 0, + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ).then().shake(), + ), + ], + ), + ], ); } } diff --git a/app/lib/presentation/ui/pages/home/widget/product_widget.dart b/app/lib/presentation/ui/pages/home/widget/product_widget.dart index ce20512..edbfef0 100644 --- a/app/lib/presentation/ui/pages/home/widget/product_widget.dart +++ b/app/lib/presentation/ui/pages/home/widget/product_widget.dart @@ -9,9 +9,9 @@ class ProductWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(8.0)), - color: Colors.green, + decoration: BoxDecoration( + borderRadius: const BorderRadius.all(Radius.circular(8.0)), + color: Theme.of(context).colorScheme.primaryContainer, ), padding: const EdgeInsets.all(8), child: Row( @@ -22,18 +22,31 @@ class ProductWidget extends StatelessWidget { children: [ Text( product.title, - style: const TextStyle(fontSize: 18), + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), ), const SizedBox(height: 16), Text( product.description, - style: const TextStyle(fontSize: 16), + style: const TextStyle( + fontSize: 16, + ), ), ], ), ), const SizedBox(width: 16), - Image.network(product.thumbnail, width: 120), + ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(8.0)), + child: Image.network( + product.thumbnail, + width: 120, + height: 80, + fit: BoxFit.cover, + ), + ), ], ), ); diff --git a/app/lib/presentation/ui/pages/home/widget/products_list_widget.dart b/app/lib/presentation/ui/pages/home/widget/products_list_widget.dart index 447e24f..72ee12f 100644 --- a/app/lib/presentation/ui/pages/home/widget/products_list_widget.dart +++ b/app/lib/presentation/ui/pages/home/widget/products_list_widget.dart @@ -1,11 +1,13 @@ import 'package:flutter/material.dart'; import 'package:domain/models/product.dart'; import 'package:app/presentation/ui/pages/home/widget/product_widget.dart'; +import 'package:flutter_animate/flutter_animate.dart'; class ProductsListWidget extends StatelessWidget { final List products; - const ProductsListWidget({Key? key, required this.products}) : super(key: key); + const ProductsListWidget({Key? key, required this.products}) + : super(key: key); @override Widget build(BuildContext context) { @@ -14,7 +16,7 @@ class ProductsListWidget extends StatelessWidget { itemCount: products.length, itemBuilder: (_, index) => ProductWidget( product: products[index], - ), + ).animate().slideY(duration: const Duration(milliseconds: 500)), separatorBuilder: (_, __) => const SizedBox(height: 8), ); } diff --git a/app/lib/presentation/ui/pages/home/widget/products_loading.dart b/app/lib/presentation/ui/pages/home/widget/products_loading.dart index 22b6511..6341a7f 100644 --- a/app/lib/presentation/ui/pages/home/widget/products_loading.dart +++ b/app/lib/presentation/ui/pages/home/widget/products_loading.dart @@ -1,12 +1,71 @@ import 'package:flutter/material.dart'; +import 'package:flutter_animate/flutter_animate.dart'; class ProductsLoading extends StatelessWidget { const ProductsLoading({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - return const Center( - child: CircularProgressIndicator(), + return ListView( + children: AnimateList( + onPlay: (controller) => controller.repeat(reverse: true), + effects: [ShimmerEffect(duration: 1.seconds)], + children: List.generate( + 10, + (n) => _ListPlaceholder(), + ), + ), + ); + } +} + +class _ListPlaceholder extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(8), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8.0)), + color: Colors.black12, + ), + child: Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 120, + height: 20, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8.0)), + color: Colors.black26, + ), + ), + const SizedBox(height: 16), + Container( + width: 220, + height: 20, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8.0)), + color: Colors.black26, + ), + ), + ], + ), + ), + const SizedBox(width: 16), + Container( + width: 120, + height: 60, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8.0)), + color: Colors.black26, + ), + ), + ], + ), ); } } diff --git a/app/lib/presentation/ui/pages/login/login_page.dart b/app/lib/presentation/ui/pages/login/login_page.dart index 9abe12a..45496ce 100644 --- a/app/lib/presentation/ui/pages/login/login_page.dart +++ b/app/lib/presentation/ui/pages/login/login_page.dart @@ -1,10 +1,13 @@ import 'package:app/main/init.dart'; +import 'package:app/presentation/resources/animations.dart'; +import 'package:app/presentation/resources/resources.dart'; import 'package:common/core/resource.dart'; import 'package:domain/bloc/auth/auth_cubit.dart'; import 'package:domain/services/AuthService.dart'; import 'package:flutter/material.dart'; import 'package:app/presentation/ui/custom/app_theme_switch.dart'; import 'package:app/presentation/ui/custom/loading_screen.dart'; +import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; class LoginPage extends StatelessWidget { @@ -23,6 +26,86 @@ class LoginPage extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ + Container( + decoration: const BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.all(Radius.circular(4)), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + "New", + style: Theme.of(context).textTheme.titleLarge, + ), + ), + ).animate(onPlay: (c) => c.repeat(reverse: true)).fade( + duration: 1.seconds, + begin: 0.5, + ), + const SizedBox(height: 16), + Text( + "Before", + style: Theme.of(context).textTheme.titleLarge, + ) + .animate() + .fade( + duration: const Duration(milliseconds: 1000), + begin: 0.5, + ) + .swap( + duration: 1000.ms, + builder: (_, __) => Text( + "After", + style: Theme.of(context).textTheme.titleLarge, + ), + ), + const SizedBox(height: 16), + Animate().toggle( + duration: 2.seconds, + builder: (_, value, __) => AnimatedContainer( + decoration: BoxDecoration( + color: value ? Colors.red : Colors.green, + borderRadius: const BorderRadius.all(Radius.circular(4)), + ), + padding: const EdgeInsets.all(8), + duration: 1.seconds, + child: Text( + value ? "Before" : "After", + style: Theme.of(context).textTheme.titleLarge, + ).animate().fadeIn(duration: 1.seconds), + ), + ), + const SizedBox(height: 16), + Text( + "Sample animation in 5 seconds: ", + style: Theme.of(context).textTheme.titleLarge, + ).animate().custom( + duration: 5.seconds, + builder: (context, value, child) => Container( + decoration: BoxDecoration( + color: Color.lerp(Colors.red, Colors.blue, value), + borderRadius: + const BorderRadius.all(Radius.circular(4)), + ), + padding: const EdgeInsets.all(8), + child: Row( + children: [ + child, + const SizedBox(width: 8), + Text( + "${(value * 5).toInt()}", + style: Theme.of(context).textTheme.titleLarge, + ), + ], + ), + ), + ), + const SizedBox(height: 16), + Text( + 'Pre loaded animation', + style: Theme.of(context).textTheme.titleLarge, + ).animate(effects: AppAnimations.transitionIn), + const SizedBox(height: 16), const AppThemeSwitch(), const SizedBox(height: 16), SizedBox( @@ -35,7 +118,9 @@ class LoginPage extends StatelessWidget { '12345678', ); }, - ), + ) + .animate() + .shimmer(duration: Duration(milliseconds: 1000)), ), ], ), diff --git a/app/pubspec.yaml b/app/pubspec.yaml index 30ea456..192a720 100644 --- a/app/pubspec.yaml +++ b/app/pubspec.yaml @@ -41,6 +41,7 @@ dependencies: equatable: ^2.0.5 firebase_core: ^2.12.0 url_strategy: ^0.2.0 + flutter_animate: ^4.2.0+1 flutter_localizations: sdk: flutter domain: @@ -63,6 +64,9 @@ flutter: generate: true uses-material-design: true + assets: + - assets/images/ + fonts: - family: Roboto Black fonts: diff --git a/modules/common/lib/ui/responsive.dart b/modules/common/lib/ui/responsive.dart index f11802f..00cffbc 100644 --- a/modules/common/lib/ui/responsive.dart +++ b/modules/common/lib/ui/responsive.dart @@ -8,7 +8,7 @@ class ResponsiveBuilder extends StatelessWidget { final ResponsiveWidgetBuilder? medium; final ResponsiveWidgetBuilder big; - final AppPlatform _platform = getIt.get(); + AppPlatform get _platform => getIt.get(); const ResponsiveBuilder({ Key? key, diff --git a/modules/domain/lib/services/ProductService.dart b/modules/domain/lib/services/ProductService.dart index 11c0c67..3d7bee0 100644 --- a/modules/domain/lib/services/ProductService.dart +++ b/modules/domain/lib/services/ProductService.dart @@ -13,6 +13,7 @@ class ProductService { void fetchProducts() async { _getProductsCubit.isLoading(); + await Future.delayed(const Duration(seconds: 5)); final result = await _getProductsCubit.toCancelable( _productRepository.getProducts(), );