From 845ff0d2b490e08421f5aa2938ab5ca6369a5eb9 Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Sun, 8 Jun 2025 11:35:22 +0330 Subject: [PATCH] feat : home page chicken-Steward --- .../kotlin/ir/mnpc/rasadyar/MainActivity.kt | 2 +- assets/icons/chicken.svg | 8 + assets/icons/convert_cube.svg | 10 + assets/icons/cube.svg | 3 + assets/icons/cube_rotate.svg | 7 + assets/icons/cube_scan.svg | 8 + assets/icons/cube_search.svg | 6 + assets/icons/home.svg | 3 + assets/icons/truck.svg | 7 + assets/icons/truck_fast.svg | 10 + assets/icons/user.svg | 4 +- assets/icons/user_raduis.svg | 4 + assets/images/chicken.png | Bin 0 -> 2585 bytes assets/vec/convert_cube.svg.vec | Bin 0 -> 1977 bytes assets/vec/cube.svg.vec | Bin 0 -> 864 bytes assets/vec/cube_rotate.svg.vec | Bin 0 -> 1248 bytes assets/vec/cube_search.svg.vec | Bin 0 -> 1041 bytes assets/vec/inside.svg.vec | Bin 0 -> 1997 bytes assets/vec/outside.svg.vec | Bin 0 -> 1123 bytes assets/vec/truck.svg.vec | Bin 0 -> 1068 bytes assets/vec/truck_fast.svg.vec | Bin 0 -> 1685 bytes assets/vec/user.svg.vec | Bin 295 -> 295 bytes assets/vec/whare_house.svg.vec | Bin 0 -> 32996 bytes .../lib/presentation/pages/root/view.dart | 703 ++++++++++++++---- .../lib/presentation/common/app_color.dart | 2 + .../lib/presentation/common/assets.gen.dart | 100 ++- .../lib/presentation/common/fonts.gen.dart | 4 +- .../wave_bottom_navigation.dart | 30 +- 28 files changed, 758 insertions(+), 153 deletions(-) create mode 100644 assets/icons/chicken.svg create mode 100644 assets/icons/convert_cube.svg create mode 100644 assets/icons/cube.svg create mode 100644 assets/icons/cube_rotate.svg create mode 100644 assets/icons/cube_scan.svg create mode 100644 assets/icons/cube_search.svg create mode 100644 assets/icons/home.svg create mode 100644 assets/icons/truck.svg create mode 100644 assets/icons/truck_fast.svg create mode 100644 assets/icons/user_raduis.svg create mode 100644 assets/images/chicken.png create mode 100644 assets/vec/convert_cube.svg.vec create mode 100644 assets/vec/cube.svg.vec create mode 100644 assets/vec/cube_rotate.svg.vec create mode 100644 assets/vec/cube_search.svg.vec create mode 100644 assets/vec/inside.svg.vec create mode 100644 assets/vec/outside.svg.vec create mode 100644 assets/vec/truck.svg.vec create mode 100644 assets/vec/truck_fast.svg.vec create mode 100644 assets/vec/whare_house.svg.vec diff --git a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt index 8c73ca4..5bae765 100644 --- a/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt +++ b/android/app/src/main/kotlin/ir/mnpc/rasadyar/MainActivity.kt @@ -39,7 +39,7 @@ class MainActivity : FlutterActivity() { val apkUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { val uri = FileProvider.getUriForFile( applicationContext, - "${BuildConfig.APPLICATION_ID}.fileprovider", + "${applicationContext.packageName}.fileprovider", file ) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) diff --git a/assets/icons/chicken.svg b/assets/icons/chicken.svg new file mode 100644 index 0000000..1352445 --- /dev/null +++ b/assets/icons/chicken.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/convert_cube.svg b/assets/icons/convert_cube.svg new file mode 100644 index 0000000..5ada319 --- /dev/null +++ b/assets/icons/convert_cube.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/cube.svg b/assets/icons/cube.svg new file mode 100644 index 0000000..c44cba3 --- /dev/null +++ b/assets/icons/cube.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/cube_rotate.svg b/assets/icons/cube_rotate.svg new file mode 100644 index 0000000..e5280c5 --- /dev/null +++ b/assets/icons/cube_rotate.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/cube_scan.svg b/assets/icons/cube_scan.svg new file mode 100644 index 0000000..5d088f4 --- /dev/null +++ b/assets/icons/cube_scan.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/icons/cube_search.svg b/assets/icons/cube_search.svg new file mode 100644 index 0000000..e9308ea --- /dev/null +++ b/assets/icons/cube_search.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/home.svg b/assets/icons/home.svg new file mode 100644 index 0000000..a2a952c --- /dev/null +++ b/assets/icons/home.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/truck.svg b/assets/icons/truck.svg new file mode 100644 index 0000000..9a40d42 --- /dev/null +++ b/assets/icons/truck.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/truck_fast.svg b/assets/icons/truck_fast.svg new file mode 100644 index 0000000..7c05346 --- /dev/null +++ b/assets/icons/truck_fast.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/user.svg b/assets/icons/user.svg index af27d7c..b60b7b7 100644 --- a/assets/icons/user.svg +++ b/assets/icons/user.svg @@ -1,4 +1,4 @@ - - + + diff --git a/assets/icons/user_raduis.svg b/assets/icons/user_raduis.svg new file mode 100644 index 0000000..d52d9b2 --- /dev/null +++ b/assets/icons/user_raduis.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/chicken.png b/assets/images/chicken.png new file mode 100644 index 0000000000000000000000000000000000000000..20f7ab3144cb2847fb5e90794a01c16d1603109c GIT binary patch literal 2585 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 literal 0 HcmV?d00001 diff --git a/assets/vec/cube.svg.vec b/assets/vec/cube.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..a5b5704531b0bdf8fa7bfa39ccc22ecc7a33867e GIT binary patch literal 864 zcmXw&OK1~e5XZl45F{dA;z24~J&0Y?O6h8~khI@W$f{8!+aMxQ!9!0T5`q`SLa1L| zAMFM_)k8rNJg$$^QbCH^i)6jYq8ABP5Yu>(#>XYj%r*&|UuNg^&HQ(-jW{A^2(boq z?eF0yE<~?4AcPphOT@J38yA|!f9WR{$NPOtLl;`xW_*pZ#GtCe&I5a;YX6nQMoBTz zB_G)}NnD-Pu&avSz?C4eGd%2OEqpiuG?HkPT;5xGso?t#rm=HAI$yfeS%n#&MV;JZ8D7D81_W2@r zmko^jE*+IZ4uhjC=nfr&+g=VlYXU0a3^Ua&GW&B7-8aXfV5h+}f5|K10M7G6{weLl zKHucQAjzz#JBc63hVcQbhG`3KspA^B_Lht+@v!x(mk4E KRL3V9-=qHF%ko!e<8as7!>Y=vMCiOqlxsF5n zY~pVnFh8TQ*)VL2;u7RKx@m41CZ-osPB{h#N`%4K?~!=C4B6z5k*TJIsIDF(8d7Vq z=3wkN)x#QwBmX^@!sl|Uxr&-2*4f}1?oet~eIwpZU)Mv`T_|k!(4LuSOTUEgQaz}P zdxg{8^MuKaA>$p1SHbx|-|>OxPc_wH-kc~pje7EWH5zjDbVjsrtg}vdEWbj=w@xgR z{H~f8n&*!md7^o}mtX%?^ZHDFACuqD<6IBtbA2sS%cR~*&2@NEa#`Qct`-(`_*|Z% zR?LFJK{N-P3)619X0FXd|+Z_Uwud z{`QeDaq~l=eRsJqH>VntnQMCb+e%_a4=j0u>btGOCxZxkf6~$2K{_jr4xgIkXmw=D zy{PrI)FJTPWU>!D_i9Bicy6X(lJ*de7dD6oXYP=G^5F3|?}!IX_JGMAFxi9k{+5V7z<1cu@YdNi^^6cu)AEf1_|`@_qW=ESkSbJec16De(YyB@V+se;?IhfjwZd j2Tb;W$sU}@^n*Pp>ZtPbX)P4|E(dN0^#8@3vjqPDR}s*b literal 0 HcmV?d00001 diff --git a/assets/vec/cube_search.svg.vec b/assets/vec/cube_search.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..da0dc56ce81e52cdacf51c77c3fb9acafe051021 GIT binary patch literal 1041 zcmXw&YeVxK zJF>JaN@cTllTr&5EtA=t`&qo~P-^w+3fQ;i>G58&**Vr9%H#kFYCJEb;Mlk>tnI zZJPK0OSNdO_b+u^bA2YikIC7FRY(}no%k6~=az^0EeBrEfT&4x|r|7yiVLyR<-i?%0G;!gc~tQEUQoI1bv z0@+GC&YTzCDQgs-`?N&3w$DL%HvPGv06yz7{k9^X{8~S6w;^$2KlyFQ&0#m0m5mQk z4wc8HW!bqK0uFd4y9(NR6d)nCzuI*Kw;MzsI!{oQ&q_rKa(KlneX!K(e zqR}T`xoE^>jhL(vlQsG==@X5Ps*QBsQSxu5^NvC%{GvslwF>XLVpyK>lSbV*s{9z8 zx-MLA3JZ^WgIMI+i=p}TsC6I1x?cgxKZEea9n^0tPMQ7GZ&>)y=oEU~J(S1(*?H~C zqUN&zvvTm$vWCnL@nNL1_vuXg(Nx(>S`LsMgDW_MgOP}^Gugi0L%$C;eZtUu99cccX+p<&5q211=;kIh8U-!w?^1g^{^>CW84m;T3?+VueQ ztSQ=`Bs)d>9tvH-0b#OoNa6vi#res~6zv}r#^Xuk<|%dZu-UBBGz;@A=({K9f4Rnc AaR2}S literal 0 HcmV?d00001 diff --git a/assets/vec/inside.svg.vec b/assets/vec/inside.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..b43a512ed84e299c85ab53eba0f807ac3512ec85 GIT binary patch literal 1997 zcmXw)3rtgI6vw~PxWz{V)TC~xfOFAq=!|Y40t(-siF3}y7cxY7su&bOMIFPmMP5=V z@@kB$48UyRg%f48y{fK#|!zSgnMW^F`J*Y-jR5+u1(U}4Glg$ACK1CDL8sA z7)nzznh*J)#XT1CL_aKUiN-d|=eU*>i7y+%&>X%BCH`4hs)|5_y#O@~sPY1&DKp^6(~Zg4XpuM-WAKzwQN$?^6mnVJ-?-=1 zhu{2FT<|ZS1^hnovcEgmTryK`qn0vG!DQQlnmxhRH{t&&(~$bvK3S>d}O zbfZCwBld9;T@*8U8QD470?GC>?3es@SK>8DkQOEqHFo)~y*_JJAKp;5gLp;rfaZbUo+ z$qt+sk08}Pcu?;|+l_GXHp26D8C-HJVf&*LzV$!gbhQBw$JOHfo?IkZ55bm`jpN~^ zur;K^>d_5VYb~$0^w7$>u3e&Sm_^c$2k%1T7b_9M?_LF>UT&BOT8^~h5MLpNk2A}$Bv-04K9okO7dB@rXXhTz-liRg?E z!Ppmx2t5^o=%cj1%?Y?ryc6b@jTl~`g6G~%ST|CGFhvqV7N$d2o`h!oE=<0?2`y|J!QDYO@Zt+sz29)S)Jz3d3^p;dZGKCuS8uZ8XEW zx&X(0%h0%|5KO<5v?4?`tb>{rR^@xi)kN=!wevaT0V*!oe$1Dz?0AkTi)H-K zoh~>9$oO4)zvM(l^FipAoDaG1TM%jqa-ul=jG#`X+Za>6@-|ftLF5=YMdafz|l{;wNa08~^TX3+E=EKnbTd0lNg0byw zDB6<%6U~Rl-Gbc`m01Il?vwOV@-rpBgoqQg(*E5xy@bdoF18mUzk`(b-M4u&g_1wM z63$n8D*5V=0RG_cJT4Ci;4;crP{a$psi6bHPoK~w)yuY_i|$YLBWBKh2BC-c^g#Gk z^!C6;aVDbJM=~+F`a8^z>4AH0>f3z_iab*B53@;nOR`n+GZ6>(Z>9ZPP(}8bxox<1 z;SL^lwxfdPr;VtgxoRcWFF(wMo>Xq)!Y`d@qc{ywP4jmX@gzUMh2KW4o~KisnmAa0 zJ)b{68|QQNJo#oeCM+uECZc#=g5voJy{TZT|^@5@%lc(n4hVYQ~wHkxdeqM6$>02eZGig^lP1H~bx z_zr)14+Vx70=%0l;@kXF+`2S|-MwW57{`e#kFjlUVzB(tFwL2F!eF^!Mo-?Rc*C^w zcZ7+~l<-0D2%FP0X1|`rTy@-3vJZtHh(oWNrjvb!$7fn*K);~*zf3)NE*$EVg*%`` zdFPSY-&+;d@-<8>P2%B&S2&!yh3>qbQm}~?iJ(?aa^IjTl7C-;Z6A75uQYIBT8;MlcVI0hwgKUg~>2A?_Ib~=Vt!R-hb%( zm$SnNde8+MIrC~8NJFH;!xTtM3Fpa!%&;CM@=uNYGl}OS54w7=Cv#LEet(hbC z<~p*+9p|EY*Qx$Trdx*nkgGP$QSyiL3;W2Bf1ID3zqofQQSWStdM6+CPG8hJeBQ8b eCEV+?8f$$8{E_fuz+VVolLZKI;4gyTCHM_Lg@HT( literal 0 HcmV?d00001 diff --git a/assets/vec/truck.svg.vec b/assets/vec/truck.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..6cd1b6fef9f95a64ea5891e0ec9247634944b267 GIT binary patch literal 1068 zcmZuxJ!n%=6h1Gn2s%{=h)GFTUw!TZxI?Cq=^VRC_ymlB5_iZB|}p(D2Y|E z$rNlwhZx@^8ABZ$OxAXB3Ajidy676e@7!A_Z#aDSyXQMUIrqJH_fk`WC6SS(EzGb& zk=ZOAh@26uAmM)D1v0FX%}*~IVsa26ssy`Yi^HNFtQTy#yrw8(4EbcdpolS`Rc z@7O;Vf0)DFSN2z71pdNKt9>)AGJnq$hg*uSr=E$TC!SX@y8-f6z(*dJv9F+?Yp^@m zbJlr}2AY!2*PRP;-G@(nEU~G4u>RV%_HTgqzKF@O$P}%C0Mw)M3~}^OZ~z=`c@83 zdTjgJ%*$MDt?m3gqrPoh*B>eJE?n&rIQ1oscYfBU9<^o8zhC-#1&J_&wzy(EFL~9t zd*vKUnD%00{^97Ld&;`~@GO2vh(7 literal 0 HcmV?d00001 diff --git a/assets/vec/truck_fast.svg.vec b/assets/vec/truck_fast.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..f8a24c1da81bd9562a960e7368dcc9ac3c6e9cd9 GIT binary patch literal 1685 zcmZ{lPiPcZ9LL}6#7M-Vfdw@i%zDy=2&r>uENt?g2pcUFlM-nm35#GVJ;(%wwpl29 za3zP9Y>lPv261T;Z6KZQB}GCHNfbO}H^(e3UKYKSc<`b*Zol8(o5`tt;kTdno8Mo4 z@6F`e*%{@elv+2G?iQA-RI8P6lsciXVh;Y~hZ}6IxHo9zsv9Pqj|LEDxl6imTwQelj zH*bd5q5o)_(<{0;&HNQT^7O9I_EgcH_jRcIW^yt>ULX2;$bRg7^z$iX0{bjvD5Qo@ z*3@g=LZuXPeF>X_&K%^7Fv$F5W;aKnSD;t+S+CtQp0^eG!8U^)x`aygA@@D(`xpb^ zEG+rFT)GaO`SU{0`ytdHgmIit1v6O^a{lbYo(JQqki1Daj%rs}IJlVG#T}Q}M^-vR zzoa?8^DFjA2zyAH7pb3(wHKk&zi7svywoJ;N4uRP{ns_)t(|r0Uq$WMf7H&4?fg#E zV==7Fyv$XU+Sblz^e>v(&u$8NCbo7KI{mW}Z|$s2f7W)@AvB^KxwcNsJxL9#iu*Do zKK8sh$1LVOCuFU9?Q`r|`%1{9(DROken+7*?kMiyFT%p^Z>F)(k2Cn)Ec$6YtD2$a z1tIGtoHliw<)xh%x`OQg#N4Ye<>G&6KnIy{Y#e<5UlQ|T_)vdHHqmSCBEnaw!ep4>egXT@o((fiv^jC$$P?U{V=(H6cr{veqeJ0iqg8@Tmw1Ah5|?{2RO zXFgdLJM+<>jOrwu_NWgYzT?V;P^w;g1HZk{e=m&ZeDVX&mlWom9~fL~7p`p|#vG3f z-ktBnee;Ekr_O#OGGCN8p$`6U-BZ=ml80nolJ#CK^$I7}&I$k8?ic&x`Ly_x%uljz iM8@+u*(a}Dt98STX6cS|w09`-^r~m)} diff --git a/assets/vec/whare_house.svg.vec b/assets/vec/whare_house.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..1f5898788618a627e61dc9cdcc9ba488bd4a243a GIT binary patch literal 32996 zcmeIbcT^Qgw?5oQK+H-y3N2vHIg5hSBW6d;I_9jPm@_IOIfF!X%vmw#gyf_ms3=*o zh#-o9fPr82X^Zil)>-$ve|&4*wO(e8`}E%X*{Q3ltEk7Qlr#V_%-%kRgF?J;g{*~VKqu>!Y`9v`87)F!Y``@RH`BT zS~01*MoClnb?xkl8YM0IiAK!H2&`73xVFfx*uzL4Z+B)7zK5{ z9S&Y5;}nV%A%L1t%+EThcf*nRB^0fCIpb}0DExamaWd0_S_-2%HjWJjliuO??*QP)UF4UrB=5mY_pY?x&GqCVHgT4qtrN8Uo8dgYm~; z1Juzrp%`TehRK+&;n_Pd>EeQ1gFEQF=^Ei>DqJI>Ac`!-e>LeQ!!e)9ALfDMb`N7X zCO>>D5Tyn8iQW5oX!`w*@yU0)NY?ax@@c36?B^PQ$$42_No->p%p)yg(g?#a8v;!` zINO-#R3#WDW4g@#wda>{eWj33Jqd>CFbwm@V&rA@C74TdXCq~y7Ou~l4ejwf4yq4> z&%Le)&>Dv63GHdE8%Qur#&kO!XoJoa+xAc!yrZ^wSwpVZ-?gsuKm1erN-=`%n~&Q= zh-=7PEg0k*A)#1VVS7B?X7ZpOCis@z6c6T`U{pm@s5zNHt3@+JpEkiqqh>hMe*{i` zXol*uCWs4HL&Tcl7}i7`e;fk(4^u}<48c4Xbv)@$VDnua{jV6Kzo`Z?rx?TQrUu%p z8AC-^6P?BxV^|MOsO>SvTN6z@yh`~CHL*I!7_D|{;z0v~)W0-g*oDCKp(YA90ppKp z;zV5&6rI$B&zKP?|Eh`EgGXXYM=kVM9fb+ow2*yq6!;V^jOZ{L_4MT!>pU8pSIS|T zJQ`Lv<(TX@2Fm8m(Ncd5RHwAS#-vf`e6|IWN=Bm9n-(z39f7ZrEzo!H2((?&0w3y( zz*CbJnEuiPF?ucFbISz9rOh#Bvk7i`H^*2F6Ex}F9DSUIV@j4Bx0VjatH*Mj9yT2N z@5u2^J{&ct<#^}{yqYbCXDWeXJ2?tE5p4Xfh2lm81+C<$%rnLbV>!CsGFIpr*%>2s zs~j6?o$Ng1*we%q50A((bht5^ENG6=M#ktgx&_qE4#WF8+6d_}42wQ$<8Xl?YL4q5 z_{vaRSL5;e-VpR!!K2jG0G}rCFo_$Cv`ign92|^I;X0VRVKCMl(?Ol7gVEPg2dyIq z!74@@@skE)dU*>dQ(WHp7T7U&2tI6Yfs)=s5!IswzC{eh(RdMdEv$DK zf{+%peieh!T1$?BR|lcz11rUz zR}R9oP3qXtelX@7P{#n1!5A2&4$g5fGCOL(?(JY)aMD1*dIQuXX`r8<0TvW%pzVDF zICGlF$TdKFbxky0GX#1IXnSls6o2_@Vk6Bf;Jzl-eHe=J1DaUc+z^9zXd-NsA#|zU zWm*@V;hLC9>$IkuCOXr)_2)IQ>V_ej&(gr6yM}nYK^?az8)3jLHSCWw!ugnH=&E6i z4)SJbFqUB5nWlI*4EQvuDW0z#jv1?(g7sfs)`+Vsj1|Hlp`;`H;+m~CM)ux%@KvLI zt8YC#Xh!hlfGXOpGDgHuRk%hCLr{8MGzc+5Fr{|7Mu?((Zo47ks9qAKX%x3k-v~L> zPW^Bry!%)WF0sQn@ssRnN6>Ol2mPZq!1o@=VM~(?p*IGcb|%_kH)K zW3-+on%|g)v6Svrn}$i0-+1*@%%pnxlrE#VT^iG1LG8$IPs64@a_kG5jt!JD`@F1) z#J6R|7(BYlBS3i~K6h^c->;@{a8<{s+%dSU+7#uFhU4X)hS;ECfH#y*SLug)lt1`$ zcX&`e!p*WA`{g6!Ur1dnw<$?N`UoaepDP{I~SyPE`!-7s&WF$wZOJ~e}t%dLI zol#<^tPBizz9C6blb}iZadndOYu$b(ff}u!pXoFxELnL%+gAqNA5F67PDT9Z> zJgPOAeV$X}x(E&Ie|SKuqf{zrbF8iY_gM4aW6gh$HUF27HR_VNtbZL_^iHoJ+A>?b znkfT+cO@oAt3m!?B{VY{(z&dL1XC;fp?eypctf#AN0?#?wZ+Rc|JUj5J+`dHzMDL;5;I zRu_}4lh&cd@e(q;`C3%>|3Ds%Sc5$O59H5vt1+n8M>0O$0(<18EZ@d;=uT_!uZ`R<7YZWmIT7&IoRm8C08gxmhBu#8q!);L|Sr%`BrSeL$^121a z&#oj}+$<2jzmlAtXQ9x$-^~KO8&;7|v`+Sest9+J)@xQ3xmUOf{>jxOGH(^0oc&5X zC$7Rw{qJPh%at(xT0?X_&GFze2ctjDuwGAwd5c$|WTOo0`Yp$m*)oJ~T890_9K1}H zp>G0*G@WJWeu=~GFH7;!fx{7trPv-=Lnc%$MQ7#jWKZAa7`5&jsa9Tr*-gI@i{urk zzvU~jv@k=E=NFMVlO?K1KtW+5V5l@Z4#3*mmRlr*tkh?(y` zkQcFwuztt~vi90y*gY&EuY;E0aZL%)G+&Bc5g*9RBTLai`6DTPycGQ=ek3>EEv0k$ zkHo6yG7L2WxJC7P(7IecTt;5bFvslmW#o*P zIo_C-k-|CVIQOKKWGys@mh2-LP;HL44kbi;^GYNH7L&7gS0Q>t5pn!zfw|`Ih}oOf zSp1-nOlq+fol6S|>%Y8AOEMpF*RsH{Vd+HUjs^Nyr;#DIEg+wiN{(w-K-D{iG+46= zl`oQsfu|2J^bXO&5c+DD%C}s9}S#yc+>VunUUzeeI;0~B?`bsoT z?0|Ehk0ionGg3Phl8qbIqLY3O`FM93#!>nrZ~;mw|JI>d*iZHDotlO16xaCS0{Bxq zvtBL3Y7-Ttd#uG=N|}9L)x?TK{8k3T48-8r<-GP z0o@*Kj&V-)amL4tu5s1JO%F2!_|$_@Uvqf$uZOUg=5TzeikVp}(dmUMn0=np`CrX{ zSzG<@vF5+Wn*Sba{x2VEc*$IL`t<#{P!UR!rtU}QM{(pyFIVWFDQ>9#Ml#5js=Rcwi;)D|z({a??21=~v==MW*T)y1LYfQ~EnH94lR?LoJhJUz%A zrTMqW+*j_f)4xqri`>y>@olo`i#t*--zJmc0chSOmS5fBbN?P$INu$cP4APF6>eB~ zW1rM9+0JQLru>hqRqKsQ9=+|o!|`mtH~3!(Ase#Y;JGD)#GiA=(_JBC^mq?scMB!m z!aZ=vI+SR4^@LCRFjBJ16FuI9k)wA#QEy#1IbP(6oca-DsHPV_AC4er)_Z|djUtT( zdO;;Qn%wsG#5lVcVy^FrfwEX~ZJ!4|2FH*VCLS2}C7M)p@__&SXmVEF15RtB$!H}H zJZlk6j%T}L$*d^S_KG_+eIrTpRqi-k9zkZ!a>wb%5oGcxcXU4$LCX5Lqhe14$tZTi zslsqF($@|3cZ8GDA#TX(8BWT(yCG&{II+}mgYornqNyb6=@z=;Lc0hunAWMzYqPoKsF9yYu*G8_mul1P39dJR#_9tW>=Yj>(ZBNluvG`3do8;DpZ+kI1r# zPB^I>OLkLSm~#vnI^7vbonpx5U}xBQMw6WlTwri6io}k0!PZ7mWP_y(^bI0O{9i5@ zXc0l;tz58VLIjz!#05=SN02zGcZTMl+s6gZE`}53RxWV12q%eZE;!aHoD5v)jO|Op zNy;%N7|abP`#C2}zYs>E9UW0`Rv7VbN1QVrHdo)N4A|o{&@Iv_k>3qilB~$N{E!`baC;1-fdCd`HwC|IcdQPa$xKG}- zb;5Do2V{@|t&7Ukq=2}Cap{ELlRKxggcFciKmJ) z8ube%#oEpoJ|mc@%y&k=Pr;$VnxgM+ zaB_0=ZZtNFAjvVi@r3p>W}oNUNPOS+b499E8c}}hibBJ5vh0m3!q#Vy6TYs9@AaBw z4tGWN``08e)CH{zUy}uEU7*qJHPO&>f%57MvY&TBAkxV^3m5FSO(U%zy1*?mm8>*z z#p94v!tC>0+yB-4m$lXZ9&7%4toiS;=Ku1srk&(om$UV*;*6;>LJcpWtDUNXTDR1N zz%T3G3bB;Gnr@$`+fV5>)8}RFx%$GzA>n=!`bTfrQT)B1GZ9Y`S3{utT5eL{>hx$; zi)Z$9hg`xQeO(CjZUHSVeGDO z^r;L%v(!sqc6hE6y;Ft$i5V+yr(rUt>(u5n9LRoL$~*$kzP|8%attb|dtqB~7DtW- z(EK_}Y%qV!KeuN$w%T4s+pFu5@!%Xv==#s6C1;R5%?4h%7paXdoU#}Py%&q)l)7(2 z{PU|AH`5=lX&!yrZ$r%ITU4*Bq?UqgcG^{RoVWq@U9KRdWIf*8*o3_Bt?<&`Mlsza z7$#%7kuT1n_06Fe|L_80wTnwC40}$hJ79Y<{z=}nu zP&8#Sz1QFrA~gKLMN-)f>!Nc8Hnj45lp}Vns)#ac3^y2v1{jAv8 z|M*9#pCC5fa1u?s_`%ij6t+C~!%eeOI6rAJnkPHpkE@%osKy4(J8Y-d#P`6s%n~n; z?1m<{OF^T8c0-M>DH{7(qi#ccc)qqlT4#HFd2fT^tsGG0Xp54$4tRRn76z%#I8Ns@ zSB7~Yna+Dpjq--iF&C)K5NXaFA9xLQMLQQCET2v1ogD+Pd9yp39QX_Ajl7_A{0LSo z^@h#9qv-O%8}HAERQ~EHR_ghH<-v2k|3`VVdmA0)dH=`Ko%AE29xu${*u_3>~~mRHsH4yW?%JzFHxoUdkM7510yzOcJO_& zOQ$c+oV!mJ8;=K*^Rgk5*qH2hSY9^tw-{#saPbFHpWXu~(5}t?q_sAbV3>X8kLgZU z`bfrh1FeCP1ha5TN0jDlfnRke$lh;8`-Yw2k}wM;i#uXx)NG0wCc!Wn)7?C)5t@^+ zFuv9R^#+ck7~@~o`pU5e*g0i+tsb+(Vqo%SRgDq4XDRZUG(py(3D{oQ5LOm{;7D;p zEb(3jCg){D5*w5K4$I5%TMV<`vS|l2xV#Ah?Y4LWt@UsThS_KSm~Odt2aL0tLu+92 zcMZg&g_4{eBluE#+_&9{r;nUb+HBkZ=-9xmu*UMO)|ioFU3-i;w9pQDldZt)@v;$; zx!fRIdJa3w8P0arDCzp21Tb?ZNbU*~nkcpFF9ZKl{0&#V%{Sert`+^X$-X zmX(4w3*Uo>UF`ADm!2Qf9G_FUK)>7XL}h|Awlvv>waL!7kwA}aKkV?bQIfhAEpo)x zlY7vhha+UvW@Il%xR=ml;4()%P_w0V9W9;Fp~cy64;FWYZyKe9OinKbUwn%CP~_q{s=E*%G@QocPZZ+?qG7Bn=J9i z{EUJZro5!r4}P+Bi2CJaQzUKb=lqHm*(>sI_Ahndxv3JrN54D6TxPAPkzk_}t)XB; zX6^)!ch=PJG)_b4F#njn(vH+lU_boki0V97s4sBFB)V=X%tJr;(X}-XJHtqU zNZo9Ygc!@6ydXwGJllGkyEmxejaK@AceqeTZ*-Xj)Yx~&&&HL>I33b3> zYV%vT1G??<#`bCl%s%2x_urqAb~??`1{*&3N_0O^euv(EU~-e^aBxw)W3+jF7j^c;;Y@0=oWf(0dO~(lvRZEjM}MMsu4h zsfTIOUd+mN!P%C7L5cQRr?n@sfNuBb_7`qi*;CBCUyiR)ulM3bH$VIn-@4sj*y(Wq zOrCnj8y(zy={?ZixTNciiC6ux)WR29*Zq-}<_{+4W%DJmG1>31yllZQ+bxTM<#gxk zVGOJ10fF|@-;0ScN09Tu6EnSz;!cZy-EG@vL%x7_2>MQX?{Zfo&Ti{JhxQhxA*t}*xYwi)JU*#>xT``TYflw z%8B}2Cc)V9b|{Yb#%p?=$FJ``JiO+QQo6lljXTDycBh!-zid-q+t^_le+d7?&sgq` zX1k7q$(wz%!)?oh825$F4H_MQeYq1VXVdM^PFVBkFqoW|t&qgVWWU4mGP7T{DHa3E zsbtt*Bvkl8pplLD!@iL>Hop#lJDpoN)0_o5ps`aSW|!S5LAmzP;c+SJea`8N{tzxOY7;JMWjzso(GAwTb_sF7f!nAT9R5n1gB z179!dcZ~#7?tPRDbvufAg{R1^$Rl{Jf0~R^UyGG7N6Ey)^uABoS_y{9nC_Ye6BOsz zhvyC_)w=U3X5BB_;k8l_FWT;z9<#$@VDht8Gs%WTKOArLCs}=P32u3fBkL|N!kKa7 zh|Lv$FgY(N%`2cthgGSVJ{8i%e;@hhjEMFiggDSJNJCsDXZbBeIu zY&!&6*>@*WUcN(peJf-(eg~`XR!|xI7JXY=qefPUr3ZFna`9Vq8gHeb$Ebvh4bX{*uX&s?n9Vu6Jxau8y+5=|nqF?Z7{yxo_JO})*by)6$llgu#X zKt3+-GJ|2^8(hpW$FSLj=y%aV5znwQ8x>TDkLPxXDklkK}q5@Y_=WE`1Fe z>?wps3|*_YDnzLB4wUUIM68N6T3QysdB`4AtL9^K!fyE5=fE^*7v62n!i=L^@NRn+ z>{_jdY-bi;&Rd11?l~CJ&K%4>FWbo}W@5B%!n~>W@g1cJipf*^M&THGQV(*SaJ1Z} zhqSKYSUy7!i;cr!JxmXuCq-gn5|44Zk@T6gme~9y0&DiQ!~{x1=jZ}u5ol)B3+`EA z=w8qV8w$cOJVIYVSB2?gKi!ty5ozB``Y52=OHb;f>Dw^)AJE4@q*H72Ys|D z41>o`eLSQzWP?8DybHr8GksK1>NsB?4~oKYcbYz|i^JeFULUL8hd~eem{Af2(?R<1 z`Va=|9{PCnF%0r{`cU~4hV$C`a4QQ#dQ*L9RfHi?Ssz88!(d*mhtR4p)RgF<>DMsK z⪚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
Zi)HM!u?1f{iz9hztb`Rj!Ck0m> zA7Ef$MlEL6_NUNj77r%pxmFT?Oee|q0p3#^0_`(9`EP$*YYFE2=EpEri^Srsk1^|O z6k4iQVMksTZmCpZaW$V z#M}~V?FU;U(QQ*Uyy^D)j?eI?y|C8OgMRgf&6^Z6JH@2V z{&5Jhw4dUi_;BrK(D6W>M7;q4d<936|+F;6gcTr6IzJp+^TvYwLI znCy30Ue@cE^Gy~5%PBfN3B8>{AyDtiCq< zD2|K+lk;3(i9hD2VD?LN9r?IcSMa-m`lauyk<2%L&aZQEupo4(JF#QoK zH{DXyNU#x3Ybe;z_lQP{ny}U~K!W+?a~7_jV$nPM4kA{)!2PkY@TJ?kzTLr`?ZSES zz+bkh=Eu$=w{bfDiJw|>2f7aVVDg)-&!eV{o(JolhjHL5MCo2dy9cSrZFLpdDw$w% z`u-Y8Y)tk$EPa2?FWVH0f#o#wS}^+2ek@SGqC^<-p@>O(4n4~-`i|Wf3OYPHt~U3~ z8L=p)xiLHRoi~!$?$(J!G+x1pP5- z5?$wkK`5d3i8DFR4VCy~ezx`wLJxzKT3x~KX6l!h8A{sJ&-r!Bic{p@cx{9#YGE9Q$)FBz)17fjk!&?kge}RvwRZ!g*i)-$0 z5vMP-DdS(Zsd0Uisr@wk6YsS9E!?~1gUR1rO~KmzsffEokM)yY;p@dL_%2F?_SGy* zJ^va^PTy-IiH*sAho$ee`DL48F|eH6Og`XLn|KJc-rhv45Bvy&UC%M4(I>Q~IScfL z16{ZNk-OI0D$J+3F+03$xFog`?{W;9lZb)=<#_Lvh+9L-k$L15p6)A0opfOzn@HN! z#i(L*QKp!EXWeOW$83X;VMvchEjgk-ycy z)Pd(lN&H@TkPQp^%#mPAu;EN=DA>p?e+|>~!dlB{3Fgk1U~q0pbX`3G26eNs=SmhD z&~1|?2}sZo=7VE?*{0I!g<$6CLi`i2Gd%%bt;)dUI~+r?fws^2cA>a2A`fo1F$kFc z7UvvdFynABn4G@HMiLv7{SM2^#{IHQu^3oRdOArsOV6zZ+R#1+b@n8~aD5hXvQp5F z<}A?LmUR61k^9M@EG(kAF+22KHo(r6b2D5A)ZgLnT2t zAO1tqri>0I!YBK!MA!6CB9=@o1e5dJ1c^W9$1orf$DY5b)fN1{qkif8Yb0&z=lqUr zPgCT-=U?i;a}yWW*cqO2ZW-=xg?BC~HX>;&YPJ(`?ZvGQ zbOn`W)KT2(MBjHsw>pcY3w`@2-ReqjR;Q$!n0t4+{7koch+92H(u=NbQf6=Z*b60n z!~pwp!bgYo`icJfi_8HcbD-#UkjNY?G7Ut{AtH0A$TSo+jYQ@!k!dVy5|Ig!Ib75< z5rZGW2_HJv8%e(fNXaO1YqTgEBNk+=XhnFD6jd27%Ki{FCx|vpMfgOKIZ0HREW)RV z@TnqvnkbttYR(XGGsUexMcFJ7H(SKb5pi=x**sBmzUX#=2wx~N7l|s1MfegCzEp%S z6J^Uq%@rctOoW?@%$1_bDiLlW!iBdc(4^Oh6YT+b7jer~+;S7Q+(qIcGCjpc>m@SxicD{j=_79Wid%kS)cztf zKDOK?D}?q6bA4~nuwA~`I=kBH=`NREl*xJXWj-b~az#gZVr2Ou^NpxdAoj7hV($>HfYV+4PLvgin#Cggy$CN6nIA-zk0QKOgbNot zDZEUSm5Z7cBK)%muN0Y8qDr+0|02SL>sl24O_Y5XHETpTCsT}yGWwBLs#1r3=bI8G znc^_0OrIU2Tf!v_O6rO#s-j9g5m#SiHV~N&>1SrCW+Rc=SY$R4nN3AzGm)t#!qr8l zhRD { @override Widget build(BuildContext context) { return Scaffold( - appBar: RAppBar(title: 'مدیریت انبار', centerTitle: true, hasBack: false), - body: SingleChildScrollView( - child: Column( - children: [ - inventoryWidget(), - ObxValue( - (data) => broadcastInformationWidget(data.value), - controller.killHouseDistributionInfo, + backgroundColor: AppColor.bgLight, + appBar: RAppBar( + title: 'رصدطیور', + titleTextStyle:AppFonts.yekan16Bold.copyWith(color: Colors.white), + centerTitle: true, + hasBack: false, + leading: Row(children: [Text('مباشر', style: AppFonts.yekan16Bold.copyWith(color: Colors.white))]), + ), + body: Column( + spacing: 8, + children: [ + Card( + margin: EdgeInsetsGeometry.all(6), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + side: BorderSide(width: 0.50, color: const Color(0xFFA9A9A9)), ), - SizedBox(height: 20), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ - cardWidget( - title: 'ورود به انبار', - iconPath: Assets.icons.whareHouse.path, - onTap: () { - Get.toNamed(ChickenRoutes.enteringTheWarehouse); - }, + Row( + spacing: 8, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + image: DecorationImage(image: AssetImage(Assets.images.chicken.path), fit: BoxFit.cover), + shape: RoundedRectangleBorder( + side: BorderSide(width: 0.25, color: const Color(0xFFB0B0B0)), + borderRadius: BorderRadius.circular(4), + ), + ), + ), + Text( + 'مرغ گرم', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.darkGreyDarkActive), + ), + Spacer(), + AnimatedRotation( + turns: 180, + duration: Duration(milliseconds: 3000), + child: Icon(CupertinoIcons.chevron_up, size: 18), + ), + ], ), - cardWidget( - title: 'فروش داخل استان', - iconPath: Assets.icons.inside.path, - onTap: () { - Get.toNamed(ChickenRoutes.salesWithinProvince); - }, + SizedBox(height: 8), + _todayShipmentWidget(), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 10, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'مانده انبار', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: const Color(0xFF426060), + bgDescriptionColor: const Color(0xFFC7DFE0), + bgLabelColor: const Color(0xFFA5D1D2), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'توزیع شده', + description: '2،225،256', + iconPath: Assets.vec.cubeRotateSvg.path, + iconColor: Color(0xFF5C4D64), + bgLabelColor: Color(0xFFC8B8D1), + bgDescriptionColor: Color(0xFFDAD4DD), + ), + ), + ], + ), ), - cardWidget( - title: 'فروش خارج استان', - iconPath: Assets.icons.outside.path, - onTap: () { - Get.toNamed(ChickenRoutes.salesWithOutProvince); - }, + + Row( + children: [Text('اطلاعات بارها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: Row( + spacing: 8, + children: [ + Expanded( + child: _informationLabelCard( + title: 'داخل استان', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: const Color(0xFF6C5D60), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFDDC0C7), + ), + ), + Expanded( + child: _informationLabelCard( + title: 'خارج استان', + description: '2،225،256', + iconPath: Assets.vec.cubeSearchSvg.path, + iconColor: Color(0xFF2D5FFF), + bgLabelColor: const Color(0xFFAFCBFF), + bgDescriptionColor: const Color(0xFFCEDFFF), + ), + ), + ], + ), + ), + + Row( + children: [Text('اطلاعات توزیع', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + + Padding( + padding: const EdgeInsets.fromLTRB(0, 8, 0, 13), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 8, + children: [ + Expanded( + child: _informationIconCard( + title: 'توزیع داخل استان', + description: '2،225،256', + iconPath: Assets.vec.truckSvg.path, + iconColor: const Color.fromRGBO(85, 97, 93, 1), + bgDescriptionColor: const Color(0xFFE6FAF5), + bgLabelColor: const Color(0xFFB0EFDF), + ), + ), + Expanded( + child: _informationIconCard( + title: 'توزیع خارج استان', + description: '2،225،256', + iconPath: Assets.vec.truckFastSvg.path, + iconColor: Color(0xFF647379), + bgDescriptionColor: const Color(0xFFEAEFFF), + bgLabelColor: const Color(0xFFD4DEFF), + ), + ), + Expanded( + child: _informationIconCard( + title: 'قطعه بندی', + description: '2،225،256', + iconPath: Assets.vec.convertCubeSvg.path, + iconColor: const Color(0xFF6F6164), + bgDescriptionColor: const Color(0xFFEDDCE0), + bgLabelColor: const Color(0xFFE0BCC5), + ), + ), + ], + ), ), ], ), ), - ], - ), + ), + + Padding( + padding: EdgeInsetsGeometry.all(6), + child: Row( + children: [Text('پر کاربرد ها', textAlign: TextAlign.right, style: AppFonts.yekan16)], + ), + ), + + SizedBox( + height: 70, + child: ListView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(horizontal: 8), + physics: BouncingScrollPhysics(), + children: [ + widelyUsed( + title: 'خرید خارج استان', + iconPath: Assets.vec.cubeSearchSvg.path, + onTap: () { + // Get.toNamed(ChickenRoutes.enteringTheWarehouse); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'عمده فروشی', + iconPath: Assets.vec.truckFastSvg.path, + onTap: () { + //Get.toNamed(ChickenRoutes.salesWithinProvince); + }, + ), + SizedBox(width: 15), + widelyUsed( + title: 'ثبت قطعه بندی', + iconPath: Assets.vec.convertCubeSvg.path, + onTap: () { + // Get.toNamed(ChickenRoutes.salesWithOutProvince); + }, + ), + SizedBox(width: 15), + addWidelyUsed(onTap: () {}), + ], + ), + ), + ], ), + bottomNavigationBar: WaveBottomNavigation( + initPage: 2, + items: [ + WaveBottomNavigationItem( + title: 'بارها', + icon: Assets.vec.truckFastSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'خارج استان', + icon: Assets.vec.cubeSearchSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'خانه', + icon: Assets.vec.homeSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'قطعه بندی', + icon: Assets.vec.convertCubeSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + WaveBottomNavigationItem( + title: 'پروفایل', + icon: Assets.vec.userSvg.svg( + width: 32, + height: 32, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + ), + ), + ], + onPageChanged: (index) { + // controller.changePage(index); + }, + ), + ); + } + + Container _todayShipmentWidget() { + return Container( + height: 70, + width: Get.width / 2, + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [const Color(0xFFEAEFFF), Colors.white], + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Assets.icons.cubeScan.svg(width: 30, height: 30), + Text( + 'بارهای امروز', + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.blueNormal), + ), + ], + ), + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + '2،225،256', + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.textColor), + ), + Text( + 'کیلوگرم', + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.textColor), + ), + ], + ), + ), + ], + ), + ); + } + + Container _informationLabelCard({ + required String title, + required String description, + String unit = 'کیلوگرم', + required String iconPath, + required Color iconColor, + required Color bgDescriptionColor, + required Color bgLabelColor, + }) { + return Container( + height: 82, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Row( + children: [ + // Left side with icon and title + Expanded( + child: Container( + height: 82, + decoration: BoxDecoration( + color: bgLabelColor, + borderRadius: BorderRadius.only(topRight: Radius.circular(8), bottomRight: Radius.circular(8)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + // Right side with description and unit + Expanded( + child: Container( + decoration: BoxDecoration( + color: bgDescriptionColor, + borderRadius: BorderRadius.only(topLeft: Radius.circular(8), bottomLeft: Radius.circular(8)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + ], + ), + ); + } + + Container _informationIconCard({ + required String title, + required String description, + String unit = 'کیلوگرم', + required String iconPath, + required Color iconColor, + required Color bgDescriptionColor, + required Color bgLabelColor, + }) { + return Container( + height: 110, + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + clipBehavior: Clip.hardEdge, + child: Stack( + alignment: Alignment.topCenter, + children: [ + Positioned( + bottom: 0, + right: 0, + left: 0, + child: Container( + height: 91, + decoration: BoxDecoration( + color: bgDescriptionColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(width: 0.25, color: const Color(0xFFB4B4B4)), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4, + children: [ + Text( + title, + textAlign: TextAlign.right, + style: AppFonts.yekan14.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + description, + textAlign: TextAlign.right, + style: AppFonts.yekan16.copyWith(color: AppColor.mediumGreyDarkActive), + ), + Text( + unit, + textAlign: TextAlign.center, + style: AppFonts.yekan12.copyWith(color: AppColor.mediumGreyDarkActive), + ), + ], + ), + ), + ), + Positioned( + top: 0, + child: Container( + width: 32, + height: 32, + decoration: ShapeDecoration( + color: bgLabelColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + side: BorderSide(width: 0.25, color: const Color(0xFFD5D5D5)), + ), + ), + child: Center( + child: SvgGenImage.vec( + iconPath, + ).svg(width: 24, height: 24, colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn)), + ), + ), + ), + ], + ), + ); + } + + Widget widelyUsed({required String title, required String iconPath, required VoidCallback onTap}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFBECDFF), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Container( + width: 40, + height: 40, + decoration: ShapeDecoration( + color: AppColor.blueNormal, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: SvgGenImage.vec(iconPath).svg( + width: 24, + height: 24, + colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + ), + Text(title, style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal)), + ], + ); + } + + Widget addWidelyUsed({required VoidCallback onTap}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + spacing: 4, + children: [ + Container( + width: 48, + height: 48, + padding: EdgeInsets.all(4), + decoration: ShapeDecoration( + color: const Color(0xFFD9F7F0), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), + ), + child: Assets.vec.messageAddSvg.svg( + width: 40, + height: 40, + colorFilter: ColorFilter.mode(AppColor.greenNormal, BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + Text('افزودن', style: AppFonts.yekan10.copyWith(color: AppColor.greenDarkHover)), + ], + ); + } + + Column oldPage() { + return Column( + children: [ + inventoryWidget(), + ObxValue((data) => broadcastInformationWidget(data.value), controller.killHouseDistributionInfo), + SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + cardWidget( + title: 'ورود به انبار', + iconPath: Assets.icons.whareHouse.path, + onTap: () { + Get.toNamed(ChickenRoutes.enteringTheWarehouse); + }, + ), + cardWidget( + title: 'فروش داخل استان', + iconPath: Assets.icons.inside.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesWithinProvince); + }, + ), + cardWidget( + title: 'فروش خارج استان', + iconPath: Assets.icons.outside.path, + onTap: () { + Get.toNamed(ChickenRoutes.salesWithOutProvince); + }, + ), + ], + ), + ), + ], ); } @@ -63,10 +574,7 @@ class RootPage extends GetView { const SizedBox(height: 20), Align( alignment: Alignment.centerRight, - child: Text( - 'موجودی انبار', - style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), - ), + child: Text('موجودی انبار', style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal)), ), SizedBox(height: 4), ObxValue( @@ -86,8 +594,7 @@ class RootPage extends GetView { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: controller.inventoryList.length, - separatorBuilder: (context, index) => - const SizedBox(height: 8), + separatorBuilder: (context, index) => const SizedBox(height: 8), itemBuilder: (context, index) { return ObxValue((expand) { return GestureDetector( @@ -97,8 +604,7 @@ class RootPage extends GetView { behavior: HitTestBehavior.opaque, child: AnimatedContainer( onEnd: () { - controller.inventoryExpandedList[index] = - !controller.inventoryExpandedList[index]!; + controller.inventoryExpandedList[index] = !controller.inventoryExpandedList[index]!; }, margin: const EdgeInsets.symmetric(vertical: 2), padding: EdgeInsets.all(6), @@ -106,16 +612,12 @@ class RootPage extends GetView { decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), - border: Border.all( - color: AppColor.blueNormal, - width: 1, - ), + border: Border.all(color: AppColor.blueNormal, width: 1), ), duration: const Duration(seconds: 1), height: expand.keys.contains(index) ? 250 : 80, child: inventoryItem( - isExpanded: - expand.keys.contains(index) && expand[index]!, + isExpanded: expand.keys.contains(index) && expand[index]!, index: index, model: controller.inventoryList[index], ), @@ -131,11 +633,7 @@ class RootPage extends GetView { ); } - Widget inventoryItem({ - required bool isExpanded, - required int index, - required InventoryModel model, - }) { + Widget inventoryItem({required bool isExpanded, required int index, required InventoryModel model}) { return Column( mainAxisAlignment: MainAxisAlignment.center, spacing: 8, @@ -147,26 +645,11 @@ class RootPage extends GetView { spacing: 8, children: [ buildRow('وزن خریدهای دولتی داخل استان (کیلوگرم)', '0326598653'), - buildRow( - 'وزن خریدهای آزاد داخل استان (کیلوگرم)', - model.receiveFreeCarcassesWeight.toString(), - ), - buildRow( - 'وزن خریدهای خارج استان (کیلوگرم)', - model.freeBuyingCarcassesWeight.toString(), - ), - buildRow( - 'کل ورودی به انبار (کیلوگرم)', - model.totalFreeBarsCarcassesWeight.toString(), - ), - buildRow( - 'کل فروش (کیلوگرم)', - model.realAllocatedWeight.toString(), - ), - buildRow( - 'مانده انبار (کیلوگرم)', - model.totalRemainWeight.toString(), - ), + buildRow('وزن خریدهای آزاد داخل استان (کیلوگرم)', model.receiveFreeCarcassesWeight.toString()), + buildRow('وزن خریدهای خارج استان (کیلوگرم)', model.freeBuyingCarcassesWeight.toString()), + buildRow('کل ورودی به انبار (کیلوگرم)', model.totalFreeBarsCarcassesWeight.toString()), + buildRow('کل فروش (کیلوگرم)', model.realAllocatedWeight.toString()), + buildRow('مانده انبار (کیلوگرم)', model.totalRemainWeight.toString()), ], ), ), @@ -185,9 +668,7 @@ class RootPage extends GetView { child: Text( title, textAlign: TextAlign.right, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), Flexible( @@ -195,9 +676,7 @@ class RootPage extends GetView { child: Text( value, textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ), ], @@ -223,19 +702,11 @@ class RootPage extends GetView { Text( 'اطلاعات ارسالی', textAlign: TextAlign.right, - style: AppFonts.yekan16Bold.copyWith( - color: AppColor.blueNormal, - ), + style: AppFonts.yekan16Bold.copyWith(color: AppColor.blueNormal), ), const SizedBox(height: 12), - buildRow( - 'فروش و توزیع داخل استان (کیلوگرم)', - model.stewardAllocationsWeight!.toInt().toString(), - ), - buildRow( - 'فروش و توزیع خارج استان (کیلوگرم)', - model.freeSalesWeight!.toInt().toString(), - ), + buildRow('فروش و توزیع داخل استان (کیلوگرم)', model.stewardAllocationsWeight!.toInt().toString()), + buildRow('فروش و توزیع خارج استان (کیلوگرم)', model.freeSalesWeight!.toInt().toString()), ], ) : const Center(child: CircularProgressIndicator()), @@ -282,9 +753,7 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'سوابق بازرسی من', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), vecWidgetWithOnTap( child: Assets.vec.trashSvg.svg(), @@ -301,9 +770,7 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { padding: EdgeInsets.symmetric(horizontal: 10, vertical: 4), decoration: ShapeDecoration( color: AppColor.blueLight, - shape: RoundedRectangleBorder( - side: BorderSide(width: 1, color: AppColor.blueLightHover), - ), + shape: RoundedRectangleBorder(side: BorderSide(width: 1, color: AppColor.blueLightHover)), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -311,16 +778,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'تاریخ بازرسی', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '1403/12/12', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -333,16 +796,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'شماره همراه', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '0326598653', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -354,17 +813,13 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'آخرین فعالیت', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '1409/12/12', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -376,16 +831,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'موجودی', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '5کیلوگرم', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -400,16 +851,12 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { Text( 'فروش رفته', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), Text( '0 کیلوگرم', textAlign: TextAlign.center, - style: AppFonts.yekan14.copyWith( - color: AppColor.darkGreyDarkHover, - ), + style: AppFonts.yekan14.copyWith(color: AppColor.darkGreyDarkHover), ), ], ), @@ -420,11 +867,7 @@ Widget markerDetailsWidget({required VoidCallback ontap}) { ); } -Widget cardWidget({ - required String title, - required String iconPath, - required VoidCallback onTap, -}) { +Widget cardWidget({required String title, required String iconPath, required VoidCallback onTap}) { return Container( width: Get.width / 4, height: 130, diff --git a/packages/core/lib/presentation/common/app_color.dart b/packages/core/lib/presentation/common/app_color.dart index 8116ba2..acb62bd 100644 --- a/packages/core/lib/presentation/common/app_color.dart +++ b/packages/core/lib/presentation/common/app_color.dart @@ -362,6 +362,8 @@ class AppColor { static const Color bgLight = Color(0xFFF5F5F5); // #083940 rgb(8, 57, 64) static const Color bgDark = Color(0xFF979797); // #083940 rgb(8, 57, 64) + static const Color textColor = Color(0xFF5B5B5B); // #083940 rgb(8, 57, 64) + //endregion //region --- category Colors --- diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index 9be3066..5fd8d8d 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -36,6 +36,21 @@ class $AssetsIconsGen { /// File path: assets/icons/call.svg SvgGenImage get call => const SvgGenImage('assets/icons/call.svg'); + /// File path: assets/icons/convert_cube.svg + SvgGenImage get convertCube => const SvgGenImage('assets/icons/convert_cube.svg'); + + /// File path: assets/icons/cube.svg + SvgGenImage get cube => const SvgGenImage('assets/icons/cube.svg'); + + /// File path: assets/icons/cube_rotate.svg + SvgGenImage get cubeRotate => const SvgGenImage('assets/icons/cube_rotate.svg'); + + /// File path: assets/icons/cube_scan.svg + SvgGenImage get cubeScan => const SvgGenImage('assets/icons/cube_scan.svg'); + + /// File path: assets/icons/cube_search.svg + SvgGenImage get cubeSearch => const SvgGenImage('assets/icons/cube_search.svg'); + /// File path: assets/icons/diagram.svg SvgGenImage get diagram => const SvgGenImage('assets/icons/diagram.svg'); @@ -54,6 +69,9 @@ class $AssetsIconsGen { /// File path: assets/icons/gps.svg SvgGenImage get gps => const SvgGenImage('assets/icons/gps.svg'); + /// File path: assets/icons/home.svg + SvgGenImage get home => const SvgGenImage('assets/icons/home.svg'); + /// File path: assets/icons/information.svg SvgGenImage get information => const SvgGenImage('assets/icons/information.svg'); @@ -126,9 +144,18 @@ class $AssetsIconsGen { /// File path: assets/icons/trash.svg SvgGenImage get trash => const SvgGenImage('assets/icons/trash.svg'); + /// File path: assets/icons/truck.svg + SvgGenImage get truck => const SvgGenImage('assets/icons/truck.svg'); + + /// File path: assets/icons/truck_fast.svg + SvgGenImage get truckFast => const SvgGenImage('assets/icons/truck_fast.svg'); + /// File path: assets/icons/user.svg SvgGenImage get user => const SvgGenImage('assets/icons/user.svg'); + /// File path: assets/icons/user_raduis.svg + SvgGenImage get userRaduis => const SvgGenImage('assets/icons/user_raduis.svg'); + /// File path: assets/icons/user_square.svg SvgGenImage get userSquare => const SvgGenImage('assets/icons/user_square.svg'); @@ -147,12 +174,18 @@ class $AssetsIconsGen { calendar, calendarSearch, call, + convertCube, + cube, + cubeRotate, + cubeScan, + cubeSearch, diagram, download, edit, excelDownload, filter, gps, + home, information, inside, inspection, @@ -177,7 +210,10 @@ class $AssetsIconsGen { tagLabel, tagUser, trash, + truck, + truckFast, user, + userRaduis, userSquare, virtual, whareHouse, @@ -187,6 +223,9 @@ class $AssetsIconsGen { class $AssetsImagesGen { const $AssetsImagesGen(); + /// File path: assets/images/chicken.png + AssetGenImage get chicken => const AssetGenImage('assets/images/chicken.png'); + /// File path: assets/images/inner_splash.webp AssetGenImage get innerSplash => const AssetGenImage('assets/images/inner_splash.webp'); @@ -197,7 +236,17 @@ class $AssetsImagesGen { AssetGenImage get placeHolder => const AssetGenImage('assets/images/place_holder.png'); /// List of all assets - List get values => [innerSplash, outterSplash, placeHolder]; + List get values => [chicken, innerSplash, outterSplash, placeHolder]; +} + +class $AssetsLogosGen { + const $AssetsLogosGen(); + + /// File path: assets/logos/final_logo.png + AssetGenImage get finalLogo => const AssetGenImage('assets/logos/final_logo.png'); + + /// List of all assets + List get values => [finalLogo]; } class $AssetsVecGen { @@ -224,6 +273,21 @@ class $AssetsVecGen { /// File path: assets/vec/call.svg.vec SvgGenImage get callSvg => const SvgGenImage.vec('assets/vec/call.svg.vec'); + /// File path: assets/vec/convert_cube.svg.vec + SvgGenImage get convertCubeSvg => const SvgGenImage.vec('assets/vec/convert_cube.svg.vec'); + + /// File path: assets/vec/cube.svg.vec + SvgGenImage get cubeSvg => const SvgGenImage.vec('assets/vec/cube.svg.vec'); + + /// File path: assets/vec/cube_rotate.svg.vec + SvgGenImage get cubeRotateSvg => const SvgGenImage.vec('assets/vec/cube_rotate.svg.vec'); + + /// File path: assets/vec/cube_scan.svg.vec + SvgGenImage get cubeScanSvg => const SvgGenImage.vec('assets/vec/cube_scan.svg.vec'); + + /// File path: assets/vec/cube_search.svg.vec + SvgGenImage get cubeSearchSvg => const SvgGenImage.vec('assets/vec/cube_search.svg.vec'); + /// File path: assets/vec/diagram.svg.vec SvgGenImage get diagramSvg => const SvgGenImage.vec('assets/vec/diagram.svg.vec'); @@ -242,9 +306,15 @@ class $AssetsVecGen { /// File path: assets/vec/gps.svg.vec SvgGenImage get gpsSvg => const SvgGenImage.vec('assets/vec/gps.svg.vec'); + /// File path: assets/vec/home.svg.vec + SvgGenImage get homeSvg => const SvgGenImage.vec('assets/vec/home.svg.vec'); + /// File path: assets/vec/information.svg.vec SvgGenImage get informationSvg => const SvgGenImage.vec('assets/vec/information.svg.vec'); + /// File path: assets/vec/inside.svg.vec + SvgGenImage get insideSvg => const SvgGenImage.vec('assets/vec/inside.svg.vec'); + /// File path: assets/vec/inspection.svg.vec SvgGenImage get inspectionSvg => const SvgGenImage.vec('assets/vec/inspection.svg.vec'); @@ -266,6 +336,9 @@ class $AssetsVecGen { /// File path: assets/vec/message_add.svg.vec SvgGenImage get messageAddSvg => const SvgGenImage.vec('assets/vec/message_add.svg.vec'); + /// File path: assets/vec/outside.svg.vec + SvgGenImage get outsideSvg => const SvgGenImage.vec('assets/vec/outside.svg.vec'); + /// File path: assets/vec/pdf_download.svg.vec SvgGenImage get pdfDownloadSvg => const SvgGenImage.vec('assets/vec/pdf_download.svg.vec'); @@ -308,15 +381,27 @@ class $AssetsVecGen { /// File path: assets/vec/trash.svg.vec SvgGenImage get trashSvg => const SvgGenImage.vec('assets/vec/trash.svg.vec'); + /// File path: assets/vec/truck.svg.vec + SvgGenImage get truckSvg => const SvgGenImage.vec('assets/vec/truck.svg.vec'); + + /// File path: assets/vec/truck_fast.svg.vec + SvgGenImage get truckFastSvg => const SvgGenImage.vec('assets/vec/truck_fast.svg.vec'); + /// File path: assets/vec/user.svg.vec SvgGenImage get userSvg => const SvgGenImage.vec('assets/vec/user.svg.vec'); + /// File path: assets/vec/user_raduis.svg.vec + SvgGenImage get userRaduisSvg => const SvgGenImage.vec('assets/vec/user_raduis.svg.vec'); + /// File path: assets/vec/user_square.svg.vec SvgGenImage get userSquareSvg => const SvgGenImage.vec('assets/vec/user_square.svg.vec'); /// File path: assets/vec/virtual.svg.vec SvgGenImage get virtualSvg => const SvgGenImage.vec('assets/vec/virtual.svg.vec'); + /// File path: assets/vec/whare_house.svg.vec + SvgGenImage get whareHouseSvg => const SvgGenImage.vec('assets/vec/whare_house.svg.vec'); + /// List of all assets List get values => [ addSvg, @@ -326,13 +411,20 @@ class $AssetsVecGen { calendarSvg, calendarSearchSvg, callSvg, + convertCubeSvg, + cubeSvg, + cubeRotateSvg, + cubeScanSvg, + cubeSearchSvg, diagramSvg, downloadSvg, editSvg, excelDownloadSvg, filterSvg, gpsSvg, + homeSvg, informationSvg, + insideSvg, inspectionSvg, keySvg, liveStockSvg, @@ -340,6 +432,7 @@ class $AssetsVecGen { mapSvg, mapMarkerSvg, messageAddSvg, + outsideSvg, pdfDownloadSvg, pictureFrameSvg, placeHolderSvg, @@ -354,9 +447,13 @@ class $AssetsVecGen { tagLabelSvg, tagUserSvg, trashSvg, + truckSvg, + truckFastSvg, userSvg, + userRaduisSvg, userSquareSvg, virtualSvg, + whareHouseSvg, ]; } @@ -365,6 +462,7 @@ class Assets { static const $AssetsIconsGen icons = $AssetsIconsGen(); static const $AssetsImagesGen images = $AssetsImagesGen(); + static const $AssetsLogosGen logos = $AssetsLogosGen(); static const $AssetsVecGen vec = $AssetsVecGen(); } diff --git a/packages/core/lib/presentation/common/fonts.gen.dart b/packages/core/lib/presentation/common/fonts.gen.dart index 9e7368f..66ad118 100644 --- a/packages/core/lib/presentation/common/fonts.gen.dart +++ b/packages/core/lib/presentation/common/fonts.gen.dart @@ -10,6 +10,6 @@ class FontFamily { FontFamily._(); - /// Font family: iranyekanregularfanum - static const String iranyekanregularfanum = 'iranyekanregularfanum'; + /// Font family: yekan + static const String yekan = 'yekan'; } diff --git a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart index f2b50b3..3db9ad8 100644 --- a/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart +++ b/packages/core/lib/presentation/widget/bottom_navigation/wave_bottom_navigation.dart @@ -9,21 +9,24 @@ class WaveBottomNavigationItem { } class WaveBottomNavigation extends StatefulWidget { - const WaveBottomNavigation({ - super.key, - required this.items, - required this.onPageChanged, - }); + const WaveBottomNavigation({super.key, this.initPage = 0, required this.items, required this.onPageChanged}); final List items; final Function(int) onPageChanged; + final int initPage; @override State createState() => _WaveBottomNavigationState(); } class _WaveBottomNavigationState extends State { - final PageController _controller = PageController(viewportFraction: 0.3); + late PageController _controller; + + @override + void initState() { + super.initState(); + _controller = PageController(viewportFraction: 0.3, initialPage: widget.initPage); + } @override void dispose() { @@ -85,19 +88,15 @@ class _WaveBottomNavigationState extends State { final WaveBottomNavigationItem item = widget.items[index]; return GestureDetector( onTap: () { - _controller.animateToPage( - index, - duration: Duration(milliseconds: 500), - curve: Curves.easeInOut, - ); + _controller.animateToPage(index, duration: Duration(milliseconds: 500), curve: Curves.easeInOut); }, child: Center( child: AnimatedBuilder( animation: _controller, builder: (context, child) { double value = 0.0; - final scale = _calculateScale(_controller.page ?? 0, index); - value = index - (_controller.page ?? 0); + final scale = _calculateScale(_controller.page ?? _controller.initialPage.toDouble() ?? 0.0, index); + value = index - (_controller.page ?? _controller.initialPage.toDouble() ?? 0.0); value = (value).clamp(-1, 1); double offset = value * 30; if (value.abs() < 0.2 || value.abs() > 0.2) { @@ -110,10 +109,7 @@ class _WaveBottomNavigationState extends State { offset: Offset(0, offset), child: Column( children: [ - Tooltip( - message: item.title, - child: item.icon - ), + Tooltip(message: item.title, child: item.icon), /* Visibility( visible: (_controller.page ?? 0) == index,