From dfe3f0f2c2028f99b3d1bd75aceb2b1b09c26027 Mon Sep 17 00:00:00 2001 From: Moshkin Denis Date: Fri, 19 Jan 2024 16:58:02 +0300 Subject: [PATCH] update portfolio --- .../input-validation-next/docs-1.png | Bin 0 -> 32169 bytes dist/pages/index.html | 4 +- .../input-validation-next/docs-1.webp | Bin 0 -> 39682 bytes .../input-validation-next/docs-1.png | Bin 0 -> 72763 bytes src/pug/page-layout/header.pug | 25 +- src/pug/pages/index.pug | 1005 +++++++++-------- 6 files changed, 521 insertions(+), 513 deletions(-) create mode 100644 dist/min-img/portfolio/input-validation-next/docs-1.png create mode 100644 dist/webp-img/portfolio/input-validation-next/docs-1.webp create mode 100644 src/img/portfolio/input-validation-next/docs-1.png diff --git a/dist/min-img/portfolio/input-validation-next/docs-1.png b/dist/min-img/portfolio/input-validation-next/docs-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d70a0f71f4c156a6aaad510be8f32ef8b6bd436 GIT binary patch literal 32169 zcmb5WcR*9k);EeGf+C18K`-gjt{0HNIAdCooOzTY|Ty_Y}s-dVF|X3d&eWzYOJVNbPGXfCo`BqJlEQGN1Q zhm4E@AR{ARr6MO$On<;~NVlA)8hT16Cntx8i-*UDhx@&=vvaa?kCv8}@OVOVbMw~L z_Ta(sGVzGmA5-e`@Gr&4%=CuPQ_tzk80KrKSq4|UQ*^+xd>K! z00l13Rn#a1tc>%}gRx2>Z99sJR#4A3-Xbn_kyi4NU3TG!+h*lop;kcE*HC+tqTx-t z4?jubq&5HA8E(GABXDy5{KxFZ5-8#_U*z;dOU;J&X9ny1$;fV!sXkWJdp)_H{zeCo zWD1V>WbOS$Uq9X$JUB6ub;|og0d@E4>uYL!W+mk=255&B!3m`ppIh8Cl&^4-bZ!b<@_YObK$Xxp+T*_4;BpA5Pr4DPss&1XrUDw{r9CK*gPs3qeyXZ2 z1xGL#Gj~^4MVi|fvC4}`as;L+bf6LJCAh@N&E~<}dQ~-*RmijqxAf*F_TOGg=&OeW$X;N>gx$oCz z4ILBr9y{+C8&*68>{m%1EybWq;#OPzkp*~;Pc7*`F)C|Hpw}6}dBp)?=wahvJ%E|@x8NP2@VcEiUb3miuETD> zUw@^*EDG!eE7A{CksItyD3ue=BSs+K>NGK zzi8BAEo`18CroE}IW!J2&-+V`!)BYEkcHfy@SWF+5-u{Y56}W-elMZgV#yKHCES+8 z-ut?R`{Y|^`Oyh=6nabAcn!6r(+LBN z*_#nrc~ni*o!}@wAZNJ&3+DGV)SBx!bHD7aF-l$Wh=gswkBjH2&Kozsjo`REH_Zo) zN(b1M_EXpyjz*y($nei5nOc6*cp+vOhpfiz;`3bI_F|~+Fb|LO{ zmIG^^n)$t-faZ-(Fn_*55=kA+38zYF!29gk?Iy2W3rIIBH5iN4ZV%CrXJ$z3FJ@zgW7cJaUWpTUSixBOE4YkS_>#ya302vlb$>7k!FDLlTTO-J$j z7iq|lA6{aN0>#}7>vF$&#(Qs3bvB9YIP2_)(mf5Hi6~|h)7Wa zOgP>srmM0}P_IaI(F*R?4lwli=e?@5iOIcJRRniyt|f(%C~`v{L@P)c+H+H5Bo49L zdgF<4evQ@F^`}s*i8Jy@LrLIm-i@geTjcwK95lN!l;iw$m@tW}B##Jb0d=~)^3yD> zw=XUJ^_II2JQOfkyj4?=+N8EH2pML#^{)}d+#%#ZGv%Tukqg~jrp$FAFUsFmbbqEz zyg(Kpdlc`{9Xxh%%|Un;)(N`$-1j-~SaqqOu)xkuaM0F#3d0;{Mdl_$)_8L%^tb)6C}oVJFsy{n?TD;u z$J(0Fq7*5_auP-V7nE|E>1oK;$=6%l@&RDgP&cJVXb&wJS>rvbobW>4c-4GXj*Ark zt4k*%yK$A}IvLqs>(8#)UyUxllw^nA*C^?xNO7>54NCc6uT7wf3>n#fyFx>OGh}4{ z>(xaDO%nCb^>x`Y)7TX>Ey>$wJn8H@hYG*^@hva|BWo)3Kp_-U-6)kQ3pr--gUU-^ z`Db9&Y-F2tP{DiYOcV?5`qyL**&mh-gE>2FxSDlZ6%~%ywtBu~Sac#O{EQ zEe4|Nai;7fDQH7+OX~v)(ENvA8LRZWCoxPVwCR(UXkNl+CJ(E+(ueVNebk!!ve+Fs zv=sA^MsrAmVk60L9^VjFQa>>zwum2Sq|=KC0nWTO^Yte(Vc0YM{Lr`#Td5uBvpIro z_#{TRyj+&PeR&=hxruVX8T5KRHqK+;6LnCPQiz$hc%o^;D1E=T#xHJG0wZ6)b`~k& z83>$_6ha0VX8;^)FwQcwyiZQqY7M;AsS}aax9Q>i;Xr22eRqqDQPe|;_!3{G3ll!9 zEdACDQvzjDd$I&SOvu~n#a{VqlinK|iNM{=os3Sfa`;F2GR!l>4bIGZ;1|p*D*ybz zyogsKi>5XvxKiaaUNfE8PEuW+0W#Cy+5g-6&!gvJNba%9hd`u3;z)-olG{nf!NUiB z8?IzXWg624;YB{^;Hv+GQezX*+D=vgdC4Z~N zuD#Fu`O$bHdNor5S&^dpvw@4o(R@xxr{;%iWG^dJ@P0|@yV?hp6GUiY+$eulp`2h_ zU4mAvS)uIUOdw*x^mXYrS6=gI{O8?}r|y}ejC3#TAT&tw%@j;YpI|}3aY1Ci?~a@^ zi`PEh66U)v?qBm-Vhx`q!J#!Zw7r#zL|UwBXS-Usa_egzWm;@@ak~q=iFglL!MnoWS>+)9*F23s+`V}7)(R+Tz^bvhjhPEjeB$Vz{K zHEGX#8f`Y#0`B>YZT#H1FT)Kslwz#|D*XEu($>9*6yVVtmdvBp-pH1)O56U5jSAiE zJ*lIGjGy4@A^DNb=AvT)OQ8}pF^ah@$@N*g=*qj*$fyVWZYZE@t5>}X)G>XDbbpAf zbm|7JJ>C^9n^!9v+B2;LR^XpH3-XN7g;GH8dRsufHQAR@H^iUPP5$DiDe^Ph8D_0! z3p8BDhkx)#@Ra7A3piXnx!UF(tf%2ad+V@X#)2CuQAq?ZaNHT6POe3i*dQC#JI=Yv zaIh{vQDlwkZ+I4JA)l5u+B=fL*`5t__kme;Q%p9C7#tGaCt_os4W##kL%N)h627z2 zPri;e@KEcH)LGBNCc|EmnV;kFjJm2FnGqa|0@AXa*|AAMzPOyVy_@| zv!^_WCSx`508M4p1Nq{GaTo7rnB(rL38A|s?q{msLhR345KW2`;M{7jE%#CgY~$0bN#p?VZt&tL`?*y;fv4u~C0Z1=$6<^>j}A&=1JrDkqh{&&*4;Y_&A zk+hx-mn#bQ*wGX!OE|6D3!74tUEpo?G#Wh=tkWs4lgV26qze`=*0MNz<%5IHf)zh6#uIhX_Ph!)rhPxZd9kd&gxFma1?Vnl z^Ho&#O}~Ru9Wy?nxzjXLevm_Ng5V{B&i~Ad{ws7@0c&_skxmUNfg)3$Ks2Jm z*;r5f@m>qcY~wLl&4whu5sGf~+Dox@|Dk#WiJT8NCF1)RH?@$SXmjfU|5~%Vq<5#L zvMp<(z)WWT(i4N>V~p)8GdLvCGM>&HvLvu|i?RuHN1Y)1TNq`C96vzcpJ!Z%?50%6 zIT#rkI+7H>|Mlb|L&^l2Nd1!i8}Yvu|4+t$)&BD&X^iYpIZtX3?O*E(zeMK3Hw~MG zk==xn7AYy`ASD6QFj8s|2)L3Gj8o#jp8jX?|6u&@#ZCS-X35VzEws6NmA{e_mnOy9 zdV&-T&3`E^IO2HeG|`cKjFgGh*6W8Yl%%+vN^#>GkQcPXWw0^fwX_pO7}n_1jgOFj zwSmuItGPuI(B%mGkgiEa;l%=8mO3=F{q*fVQP>@05Z&s(NGK zt&~h@B;{`7f#qrMGe5vS;HC6#{ThC3%ZX|po+-#B0%HV7st;`a*@+IRB<{fmK-&nQ zgM*!)w9H0}YM!Lh-medera{KJSi#55K_B4GK^?=49`0Q(8$M@*m{Fd{Gnb3K~1=_9yyl zQ58x^0y+s{>-%A551ql7!y!_BIZQnFe$3{`cklcNcX&}DU$MKevSIC1z6~W8v?mis zE7I=F1KfBAxDqY0Hd^th33ZF*dmL+-5nHXl^!?_opL%V0r6&hmb4MaA-2yQ)%jk^x zU^>Ua`-ZMY3*PDJuI-85jP?>bYHazYD#<;b<|>4lra=t7X^+KxPS`826qym{xR)f0 z#y7sF8y1w2#xty~*dRmSG+}zcBcyjuuM9Mh(;aTQD(%~EnYS)lF1$8xl~xifYd8f? z*2wn7w1ZvV^_R=^XU-m1SH>t`^S+v2AekS3tNN$|>t=DXSAK8{n8xRpdqW%0wupMJ8v(93WHzrur0 zM?at6*X-L0j#ccB63fl{e*faKe7k4yyx^irV(b=H(|NT72p+3lt~E<4h;!0vA2qtc z+x;-H8#;#1wlOy}W8z>YF5++EP~Os9-=(;BMEhrDMWGuOJzsaHDBj52NC%Xz49*#> z+PR}MYR8g?s{rbmwcC%Dac2W&mMoQK(B}F$Uf3%ou^%AHgXov~z)Nx82kF&MMPFvP z8#9t<=O53zPNuQ|Q=l_mR$FxF1P8gykTLMfnVofnX#QM9F}%jl+|)23C5vee2L|1T08u0pu%wiL6Gso&7k6q#fK-8 zAZTSTf%Rwd=k+|fKuL;pUPLCNbb5bvS7LwT5*>9E+OBo4@5b70?^~d)t?unnt^Eov zfcCQVsYig%;V*~MZT!#x716H@+RO!|(ou5fR$2?cp$h32Q1qeu3>?;{UcqY>Ke^=g zTtnDTWCP3o!6t-bQS759#vFTzYw4BG0Inb^<9)96_+7At3`q{fmI0}wXDSRVJbz&_ z#m=$v5iSzNWRA-t#!}fuylb{PHUGFEJjWwbY|n`N8q+Tp-`B*-dDsABOFzuh_^{mV z!XKC80>AUaapUTwV!?-jQl9M4<*9KR!wj8r5Lp7v6G)B%Q*!e|SAoSS9@;Im!R&4oL+r z#FGh`v8f-P{Fj2(4jv|Ni9^dwl;zmMgQ}lAo;^9Ku1L_liMHuG{!8$;pZw(xBk?RX z?{b^FKR8xlg>fJb+nY&xgC#>BS7G`TqI}n2mo_*!rvFfKFnt?h`x}bdB7aSthTBF2 zaN?es=^x1x;KeG{>!<@q-*l!VtIGn`@_Byamc}2Nzvc*?Du(w`UrwyY*WoUO0;((8 zghCF}IA*z{MG5+buUzD0uPu;{hNJQ$uE@#!o~2kgYwWl(i}uqbSXsvSB1#~^X9{e! zP@oh%trR_D;eT|al@#KmTu>1K@f8vB5YC9K9jV7TW-GU`tzhWgWW&LO{s#etnFdV1p0^tbIzl;~sJYeSyEYB4Cxui#r!%kP^pLWBE zHs8VjSR1^C>>gCYEq)-q;_P0pk<&F#A*V?Yo-|iugeu(YJbaXT97S9j7}6%J9lHiD zS&@-(EW%!D_Sh`J)D}Et-DIrS3+6#Yk*P9NP~YnUGBb1y9G&$OCJQ9MWbR^oCE|vh z&0RH=M>+vj^o;>m6fD2EGmbjw&JHE_G=9f9o`;~bRU$;zL`0d{v=TIQwZAVss!Xp- z*W-Y^XG7{*$$Ov{XD^}sZ#i4YxBOAP%sv3e!~1K~D%M8<_``O)TCrqvK@YS*HM{fI z5MV3Pf~<+#T?SCCjDX$UgXw0Nd%bFOKgSpudb&v?pAQJqr{$!fr#H?cNpp$*1XOia znUf+t>Fq4lRVMJ1>Ga2+9P-bG&nf9oGTC~%i{$c87P8aor&~&-)ZqUQOMn9sP|hHH zHqLg%Ui!!49zjoKzTVh5Ku6na%|!|;KJ_N6n5F`pX72wHx- z@YUYLUu*4c4Eergiy;l_-AU)Y>@^bdj=1DbcZv$D>oZawZZP)IZ_l#$JXAG%TU_;3 zq&BZ{s~nzJ0{7CC5@`6fL_{3PI9O!!z?P>g;8l^^7w5hWwbdqB-8%9$u?N0Kv{mwgGRs~Qb z9BFaqF^iMg)dbd-Uzb7Ow}2qZPf?9KQz5aW1gLRNoIW)n$3;+BiPLBFxl>$NNWW3M z=~Lz5Pfe^0`mS*8?8jO3$QgWViU!nCSZQkgw=S}=nN(-3#%z5DmK^l8sO~3_d^!DQ zbm}JuOz`~)|*h?grSF(yvL2~mu2Z z&W^$l!=38WukH&=Kc+xt9{P8(OGJ`CC3z~-ey~1nPb=Tbm3pc`Yf9h-R=!v)86m74 zJp!)p`dB{^XaP@R66?x)x0xH&DacGaKw;Jf+myW;CPk@ga2~v~{o)at(b7uv;V+f^ zPP;bb^FqM$w+pfHhd_e7GdpQzHF=`7y6_oCQxyVBe5hSKd%kRn*_ZkVzDBeA{ZF90 z(o6xkbI3WiMv_N!{bMjwh!N;(R`jvoIpWUVCO`S>B{I_L-m`)>YPckndjvJIp6+|P zJc5pKjrq_70tykpT{4UJ{VOmsB&RdwG=7`(@ZZehbcgkiasAEmXUFybX*vHp3pNgL z;#@;iT*Y@5jIVC1O;9R^2IY@P1X1gXuZ8O#9u<-XJq_C=9XaGp5j9fkQyV>{E$Fh8 zyGK;9Gop$Em#pj8!I0!0c4dDVuzT(W6F<3Xz~qV@^Qaw*mzy1&;w^9{5NNi*Ol2;{ zgW6B>13ch663Ey?qfW@061x|=1h`hWhM$y=O^fnn_U!|g4*vA$(g$)jzUq#N4+n_h z)zNLBCVKPAs!O5S)RaZhy}-J<=ju#`zDe@9!D?6e67UoEnzpThgg~z1)&sU|s*5(6 zKzmKqNVt8jD%0?6Q~bhyiZJ$x}Vca`W}YuhgNlwpg4s!r^`i$sY}VyOTJ)}ctU&GCBJa++w!z`C^q)s>qwlHvFmp7CW~_$tcy+V-vNt5u3lR@kNnr4 zoy$n}gIt5%a*v#vfYNQ;QySQRm{IyFa$<$WGrKmHI`{)V;UxROH>cIun&0u@ZlYD{ z9gSBug>KA#j?1g~F=PK^mz8&4O^{R-V!$UXFl=cTLTavaA-GT@2Rn?}uYA zV<>YjKMo45x%5q>zq=>aOn{EG)WV^OQtvagpaCHc9nZLq6m9$7XFORkjf=Pl4Y-HY z-AS@CR$tAMEs1#bf_bof4v$Q)RKIfk6U<(buH;}$3o-N?ODzN;JCQ(l)jPVe0A*L1 zvC!A1=AoBgAG9s7$dZ)GUu`C-8=;|6>8d(ld&iTKDYmNJAxlHl_n=_@t?;W2XI@7= zW|h|BXPx75y3;UGh{sgd#v=ZeVXqbjl`eOThS?@Tmv|z3O_$9sUxg*O)!+2MlvvnMvpieF$sotn&(km`sA+Y8IhK`2v!mc|=WW1E)7!?jfyY~c zH16VBKMSENZ-O;Bh$$Mb@OviF_Zpd;R+MYj-%crCxU2Ta6^9-2Et`IEEF_z=5A{Z6 z>_w3FJcp#P!e)TYaTh^nEMdbZVRpYJaq)_y*d^kQaBSNY7+eXm_S zQ-6gVZFTvSi>6JIA%bzlR?W5eC}17qNHu$CLPSp2WG!SrPzDXip8Y*b~GAYa&Kr7=4geT ztFZt$i#=}_iM8L!m#vUTEN!kK)vrK1Hs~R4RUWE3aqZ^Bj zcB>dk0X?8QUD3%H!ElOV!(zGQWLWXlw{qI(DiB&#;W4JCvyh(YBmA+-+(}uE;H-uS zRR`hgGsY;WPb=*HNOuJp`~c!kaHI&xm4c{zf>)ZwU|JX^ZhQ8QXScx$+N?(_(^Y<5 zjM6c(xv<>=D*>!+j`Z>`uy2~Kw#gjo?`Pc3@!!S=H24q5-7L9YFsabC05NnH{G1}8 z*d#}Jc^>MN=U{g3*tEbg``qrDm4heBMT1E$c|6@TLf9Fl+MS_cgd{f0W_0`PyhofU z%jfM!z=Lm5K?s`6yg^CYG0LVbCOBkjQ@B|nu<|TRW6{ab==Rw*ZasPyhJkiTnGrC0 z$uu`CHKxmF+&>mn8IQdA({@6u#4+8(|4oW)|GuUMSKbFxYj3?mfc%QJkq+MKtA=AQ zar2)2j%=Ziu;N$UTUS#)urrBTht#qW_LMHqcRQ70uYKN^W~hqtjkX%_=TZJJ^f@8X zOKK?{>q3S&fg`BzZa!3bLF|3NV^NYZ&GQZn0AQ{{xdCO*xqMgs*Dylr9ceJnicM32 zV*xejuBg`&N4Z0172Gda^1QV6(<{yRMkstKA2{+adv5a!6llN-sqdjdtq%)^8No~2 zMjG!jYgsP8A3I=qi;f1VASaFA)5VJqBqkfKBPXZ8WXyg-?bpNTNQf|z#hua z(EpRo32wV$%!B^OEblHRe>aTnXE^4_wYrg$%SSQ%jDh4vfV;_cnYd1K=H^I)ra4Fx2cVf=|Ev zyS>;e+6)y8JF_p4f;gXDalm$L4JOaX=W$f8{#9NKn;z1ieerJ%olR{;_i)dD+*XoZa*+qSYLg~{k1%omZ)H@-1lE5?fhp>2N6 z=ll5)i4sh9NDSsl2;t4&tD#@q+8mRw>!s8^i?V$^LO&DJAC8#l+x0QbTf?b`gBcr+ z2zTygZql}Zb&!cfNv_61{u(AJmmmK&Ctn6O&uV+B>LI^N6CIoZGmqvXfs*@Olm z{U_t^8OQOyChHyUzn-@dLt#jx#T6XR>7yMWT3axLEUkOXK z3j+B)iG2O*G3)Hmik=cfIVqFf3-cW2j#3MQ{)pA!Zr{c)w=*JguQ(*+*)NVpbqaG3 z2Tb2gtJ7jqE>2BSq!@8hm%iNN7Zpe-MGvi7>w%<3O+9TjE&kI1J+~LN3ad~oT z)^S*!1rut(WEBR@iEaES>Se%{11cp3D{PNOhE44GzeMr2Qa+X-^c*GCIF@fdm&#^1 zZ#M8G<->=QR|*R@xxwTcCzs`tEi^pK8RXpO-$1m>&;CvU->5qKcDCU0we_FT5`$sb zT+pFL=Qz&MY8_FINw@Umj8oO|EB9M&AH>l@on^d8XUr~sqV1c%XN*rieXp$p@_Fq{ej?3WhpnidtWG8)v0HB2qAgJ-xNZh{G;wpIw-sqWOu&s z1#ub;Gk2Wqvy|=dc1Yv~RD!`ECupoO1{X!X@V*6hf0iC0R}m-2wBbVwl%9N!J4g1D zbAsJkxa=LGtLV#Ba~&|_dTOq4-)z&MvieB^;Omr`{M z*`H$~Ss`b-QPW%A3E$25$e9LnbsK{V<1RNxB!_?w`MV_*X?h)TafDEi>MXE=9Qkp+ z==F3UcS^9PT_HaNS@OLUu^*)PL*;EO7(&RVtGhp(W%dehj>*`VjhO0uGo>QZi{QWz zBWzOG7Qck*YIB*EetloytdvtXS)Fkyf~!cT+xLdEol7e$CEd2qYx}Qt`Xk%{tFhsC zHbr&}OxZX)WL~__>8>ujl@@|hJRh-ND+e7H_!Ir(^nNLrsxM+{{TfI2GvGMm4d(gg z(OtvyDS|=sU2xCU&QAlPNe;U+#%r8o>#`|w8^4c}8?{5Q7ach-`ej{q1AwQ{JzW^hvvTirPxDns%r1v8& zpmwBh zXKp~Xy)nU#`jAFkK`R^jO5NGl;-vxXG52CeAWWlb@jigJwlPy(R^if1;!5rrW{Aq= z`86lO13s?UH=R2ly%{eEiaIepOSrq6amjBODjM}!ZfAHSiCZ$!r&xg;xN>g4JVS$j zfrj$&k-)jOM=flWDXB_q)x0wDwP1CC%-fp*06z0aHX5qBd9DRU$^yKsP#SJWuR%sq z__;FQ;B*=dRW6^#A`<*%bdHCrO{Dt^IGD|M0?e z2MP@Rr$K|*=m<}W#Bzv^Q2YfaQn%2}ZNsSw`Zqlp#!6ZB(6e4$G2qb@Ge zt6mvgindZU2g2zkQ)Pa55hHKBi=3dC-3@MZWUKFCD)z;$xAu;OEG2)ego-wACne|c zr1{ERX}DPZ!fT=Gt(&TplcWyz$vw2so$$$v3}GcN9tR=RbB0wc(p@i+qBjV562BT22s$CU^>lT1Z()l3rW>;_0w*Eh zj1O|cfl#>fqA=f|dQ6a7)6=nfI3=K_bQSOIw|+7%Gq$Mg%|;eflN|EyD)*Z^8iU{M zb8|#6$;T%gUU&B2s>b3LFd~3Q4jsxAViYr@NcAKuZ}l1n2V_#>4dxdcKsvK4u4Src zW}PyL;NosyyMU(n^?F=u3H+}A+3l?EdrKMJduFsRxgpz5-#a~ghvz7ExQ&wtLP_J9 zb*|~hvDP%SXN<-5b@*|AtuPwDBG;QXB7fw}7(I$|id_}mP+W;@8T!H?>5F{m^<(Q! zXo9hYo(VhHcHaf1E5V+-|xt}@B zcf6nw(+fG_g;>D2Yn;ZOkNWF(OqhMkrKUhGcL)38ID#!@u8vpnPsaL|98@Jv8m9X~ zzxcT>Yp*`Jxb-74fuNk#oilSY6UlphL(>VM%-UzS^L-t!%@)YB%A}*En2&p3bTO~O zP^!(Z?|gW|BLY`cC(aqL(_Bw+mhfA)<%@+GH`|fq2TEQP=L6=@8 zKirE7WyzKF{!agb8(p(tLrwSQYdu{W$5gaP`Qc85+>S(0#RPE>~~$HVuUC9AEfzN6l20)S#~{wdC}( z%2DkQTg1tIVC(TzN{jkE?%d_es$Vv6DiALx*DrQ{2u>7LL8pL=oS6Qztn2sB^A6r> zXtWzNK`>F?zj*WKz{P?qpLnvv2ffebRW+|XYX8Mvz`ab}Y|O-juD;@ZG2yX;@G$?c zvn_3vVbM1$+@=w*34d0)pvE6pl!(zM@ z%eO{|o|2;(Lo5{r)cj#bEo*k-%+R?6&0yuXE0VgoT#v#KHDs6kB<3&l9-bYjZ&Gi| zN+*+<2{M`ArZ*F%0y8-9KbcLA^CtxOfSuZeGCPMHhrfJ{)kos26Gp4ll)_BzLipm> z)x!AQo*PtOig=rQ!3xvVAbFFmT)*)8K?j?u!m8}gGAA19i@=nRTg?FVGdU4=Sx&2hJUlpzvM7h)f|CZw!u^cn=6G5I)7JI|+xTTaW(5PC}$Wh{dj z9Bz(HZzsK%IH9x748ABGSPGQMqhKjbS~*0=w_m8y-H3J`XwV7~cAsaLwHo-n)x+Y( zd85M2>+&xH=hk_z#vs$zRt*A?Ppu9M2PCVF2|{UNhDg@8l{@UTNj@^mzta$e$Jt7B zp%Q{6b1>0!kSjxCN%dw_nc&>Z^^}HhO))4N+GaK`St00v<{K$tDp2p!O@$CnTgX1m zu$5KvLe=f|M+Ro(bDlZp$7$ux$wTyWJ~PaFLQ=Y~mY%J#fh!YVJ*RjdH4!;UcE+f{ z@b0YXsFVPuH?s(k3^w-R;i;aQvDxr4Zl`Le*lcNAlzpN0@dIEi0rcpbJxBtZW?76r z3Jv__=Mej7p#sA-JX;f5W)cP3-19OTfRw601h4WF^ir$o`X<N(tsI$TLXMH57I}Yu4P;a8(^cS>Ux(-5r+8a$_*nMqErxst z>1vmImDzokPk@<_zaE?_q90c0-X2pR zONWhL1%gelz!-R+N6;Y&J2@p9Q4_SGO(P2+~|!0(|41+F0GEHdZ7_FGQVr4?oo4T93O5y^Om?6LuZER_nKrJsA81+-9EK- z$+xeVd1qpXR&O}Gv;TW~xpN-02X<=lq9%K6aei0l_FqP&l`Tj-b*8%nSQZsoF*Zgt zOF8K)BqDWz;bE(6YtlJzEm4yyVoNuC1t|xcvpl;F@9d zbJa=}#o9IBP3o=cSfa|5=z$ZY5^06xs4(MyncBiBO9Z@{+k8;To6Y=nLU0$| z@X}0sue40Dd!gDr_(qf1WP++&QN|-}Q(Q?7!^Hs%!@EJK;U%Qj7i0Or>>t%Iw^1m3H_unG< z`WogKTccd0)axP@BBL&EG+g3H+`y@`Gmht4~TlhmAngWy12%lSYVjzsQT{LU`$en1d*9A<3wiJB`{xBt_{+G9ZP4il6P7I! zz*nhy`Z6X*&mNXIi?IZJ1UcBGknMO4m_BzvM{H$Df$-5Dqu!hC#lpiR(TbylUj(!K z?mW~UOGg&f?VRDpL)M$kZEF1i8JlY=eZ^(z!4t;}6UR{}_$%E^@@`2a2NRGA^6^>d zk{)3;GSt)+B$hsi?aP;l)4;;V$9GC55rhAb5f$IR3z6tOFhJ!mgW#5O?;?CFm*GRRK8_ZU593ArC^#t zy54u6eia-kzh^4`5ziMGlU);d?oFWNRVu~k^Byy1%O?TAu#~=c;AaFV$wI*8yvsJ1 z%AeG`XiUOB2Jj%e6VYpe`w2Fs6A0Fqa`B}XH65mWtR&7JjjolcGJjY(nke4z{OvgU z)hRWDnymUry~eCzMF&#S_`7iQk%$D+B2WrdWq5ZPog%kg|K*JoBlbW%%U@rP1a&-F zg<3eT?jC2al%vWFQlyXaF(n%cU6m`BoTHCdjcjllYK{2QCf=4Gh zti`P-@8^+f5jseY?5;8F>9M*5F_qlkccHtbXL&PlOm(IDRIC+j>;>+fW2&WEg)C-{()+AVqOaSH8e}GB{PyH9H^xr_Ke~ABHtk4U-V{4F? z_x}M_r++37B6lJ7;~L}@NuQKV;|q4pAJX!5lYPxk1Cp!A-6+xKa!7jD7rtbnS}x;Ur`$lzaAR#NFiGg#aAsQ!`4E#I7<|LJNNR zEJH`YTYtB!^rOK^Y}ADG)##u8t~MWRyLq+Ooq{GwlBCq62GAVsD@4*YiB_|H_L(F9 zKgB(T&iW<3C!ZrfRm{J}rAdKlNWxFW*rgZ+R*y;)@|2uUsFVQ7~!}5o%`sid4 z5Sq_b7v;&R)e|}FBi4|ZrJLGRYuuG+p>yE(EXnaLPP~Toi+oc3dH0*JFzXIKbCs>_ zUullikDQ!EB}Vu&l$A!dDphQ)e954t89->*zLaB8#B}dmtB~J~W1kyrJ-;Ga;ZyfJ z88Ui-v9E;rU~d$THp1i4h|BG$WPpyVzc~WHuuXto1XXp^qxOm+|BNEO*^e{sv0?PzA47 zvTs6epl+AWND~$ z`AhZD&eo`j1?3BmXN|iSsyDz%L2fF6m_~=*u#2-h6+s4G=1yxI$}_leoafkg8Tj3u z*HduY>T(ZEg+yilTBMfJkjRpkmlMd>u-)8J#K#hC znw{s_Y#9o=ZT^ujcJVLQ`7`q5bl%*zA+4^qk&fDWcTWfb;y+Q39xgS%Fq8i|T{3lP zWid;lQm|TbVZvzpIA)ikhA^1VhSK8Jg2~DrykevU#%V~9S#2AbUo;~uT&s`F7RinF z7diMVvtcBJ!=K>R0^ZNrg0t?bLIaw6NgrS^z1pFK2IQP2#h|0P3(_kPyWFOi0m2)3 zbN=-TqVgXMj@D$-1r>_sYm%e7UyAq#@UKT3R}Vz+smMETBxj<^q!!y!Zr;df69`96 z{kDG7dgndSzVd+*zT7ld(x~aFA|HVGoZ>7D(L7V$-NSB{0_k)95IyHF9zBK%&#@@T z&C7dHQJY_UEnniyeu(Or#j#ER#o|2PfT0NBd={H9SprIQ8Qj)xnJEoUo?E;-u9plf zB>%YS?Dm>plpF;nWyw_>1W|$Y_2Beqj5_h+vY)#C<=rQ!>qbXL85ONXIrBpNbTaMr7_WSNUcv~gaB~m#( z>oZ}RR(faQNjV=SHBZl4nsX}K)-R=ii5uQJmcT-79kfJ3IeULz`{K6Ej+475m^QGI zDoT&+fi9KhvOC%Er)MBjJo_DH64;J~hCc!662@-}-$C$l-wEPM~&cTB6 z1WYaKQG}lP!|1M&TGl7l-m&EMMjtSuhL%?38HrMjQ*4#m{oE+g9QVOjdYJ=1AjyVn zvl?o5Gdav_W#ijxbu-+Snnm*#ONMr)KN7U1+))i`lczeU+5{a5B;z4k%=Sb5WLVT4 zg%#yxJKFf`&0_QO4&-fm1FDDoj+;|HdctR?^x}nEeGpGeTQ;S`q;f+NvKqRr;}dWw zGp1{GT8oz^()pvFBh?=yb9lP>J=MhF(IzuiR(Uzb2xq9#I;#B3s!mUpm;5R$z#z`2 z3i~YvaIz}D`ausLVy!3dZeRXRz+(Mg+daXdcthUFys};a&51T2`|LM!4SIg^_p7q* z)!@uEx7C+wyq@=IG!q>J-|{F-_HZ^c1Mb5QO|RiG8DmZXN+t#vQbKZ4d6${_M?psn zz^NZ|gN1|Yhk)?UT;^X5NTJZEntH?Tchjc#h`#)aH|7&8!adQ`vyJO%5wJbHq&CTlbdd0j1Djt6naCCtoz*9#xs3~O znmIKm2y@_`@P&<9voMNy*nIR&mAzdO;3p%dm1$SJ5PbnoKj7idWUO$b+cY+1Sl70E zx`memv=QP5SkHItb+K+~x}u=OR>ZTL-;YYIi5^?~c$nN89HI^Abd0kX+k$P=*AVUu zuGw~R;^pS#yRC^LEp>S@Tj_pGgcUM9y>)xhA*p*HdI?vX zp(}}g46?7Zv0zKgZ$1?8AegQc`yotDtRzcwZKA;02s^0^|6RCF1>cg2W_ogs zooFHUxFEFud;Lq7@vp)<;$@gh&9SRZtmCwZ#;mtful|a*pQ*q+Hlmzh-^D2e`yPxz zIM$w2NcP}Y-&G$mL6`*ZhJDC_&|%0kL88~;Q>~C8hS48o)fnT=IXvVsF)pVYb_T|J zjw2j!gpAdD9%Ps3ZI|+F`BZxdP^HYmL_BGMjf#P6e>vM2o*0lAwBv~2goZZZ>0Ze! zsJ0qNj$mKJJ15!)&Qk#khPAT6VA|5%_Mf8fKbw;S7lNZdZ0l2@6J0({;ONH%_!8-3 zogNUWayno}2Q#W{PZyOZ86dGL!%hm=jDZGDtj6%_yARPh8+m=5*Ga0f7hCp*^e3EL z?+34Yi;vuQI2^K6=dYIFDqzE=idioy?7#}}t;Pu^+`3hs0-?bh<~0jSLh1Xg=?+3p zS~dYLx#ICEM5IrR$OP$}?F*dq)^|3@$s?V9co(3~CH#Mt_TF(#EzQHY9UGvc^l}ju z5drBPR0KqtQbeRnhY+NN5{d|lB1J)pw1_kTDN+(bC?dT}4dD zureU{vfptcUTO;6eV%k?^}hXS?~5m}Pad9~nlrr-GMvrKo5QR{laG=(Y;kiyry@AC zkGl!r1cFl9gVNvCq;c{zW*R>X4=^^=4sS&mO3ai(CPVYV6z0~RdZv-_ug^0h)YtSz zE7KE0>b^|UU;7lhVx^Iw>NOq`G$g7kX`QQ`9CCOPSZh-sMs0l*JcbSe3$&XrZsnLN zWApgrGg&8!5sC9pJqHATJ(8+Z%RUy;WUR!1=HnG*F9m!T+$ohrQ@KG^!@AiP*hDEH zDZ?R_TxV+ZCf6Am+-_4tzZAdY6}-#}C&|s&;Z^EN zjuqIl5Y7R+S_c1=$^ z2CTg+T=J~lCQ4-8^O{5QS1qIMDnnA+$Go!cl73|K_oWYO3@nytBn6iS-8yAN!w&n( ztiwI77rj|#{Xjh8v1RpLBXd$F8D-FYZRlN)fBf>Z*CiZT0;K+$NmZrBG1CdZPHyoT z!~}Tvcpzv_-BTa0Y3$a%vvN4|o}cx`9|%PI7N>aR7ziUP^j;i zR;05;wFu-g`U{_h(Exjqryr9Qe^72Y)1N42a7MM-yz{hbbR=-bf;dUzxBeBhKo6B6 zwrhIKv+?@x#>lkJGJ_LPKcV})J6@i?FZjBid(A|?uUIJPtlr{nChcIBNqe=gP)?8% zs@ur!yMqVl?ws3y+~@v>3Pc3d7V;0HmChaeFO~lzC;<$B@Z7HeGwzL((D2OeC(Y=f zurHiq7552_pO~XZ03opF9e2q4*uX;x?<{4%AWlAqux_=KRbl_Re)Nd_4+Ip)!2SLN zECljx|EpSq@I?rZ{<=Eb2r@%#s6m8Dxm!F?xVn!Z+OjV7jPCQk@aU1gbN{|6ZGm)0 zattZZa&gumAO&xHqr}8hgIE&Mx&YN^00>z9RLC2EOMyi9SA$EKp4T(A3=l{NZ@vWasKk_pB1GIhT|nR!dpr#!g4aFOKv3#)Gf_eSBwt6N)!WL z>d; z+CO;qs}**6M)<6Luh6IaS$r*R)C+kzv07;l!;|J(C0Z^Qd_C6pMR&TQU|C6DSHXZ; zzm&TDl&W)o(gCMd0|IRR2Q1!^^AVPm3#uxxm6uptN>v_p3Eemp9k!%c;m) z*cn~<@8-|#yYxBJ8p`BH#rr$Xd{8*oBYw$^*N${9+wFOBhvZq%S8IobAB`t3+hvz~ z%f>cN$Y~oC3Q7$|%=d|yk0J=Kz22!L3^sw{LGXk`e2@5W>(HO7SH1RzAMM$VGI=IT zGs~fZ-H6=iSm-0<7oC%VFRaM&spje@gTYqGKi@ZX7d!}eO}_K|WKNswiF*|p!1Z@? z`8*Fk#@u-CT;}Vh_4+aEC#8|1HkXl?->w56Z&S#Kh}?13tGoS#d5Wq@;Klxt%3bCM zD}j@D4c~N6tFVjKU}MW}P2;3l3M}770OJ+EF0h};)Gnxd#{*lZy1fA1WuB}j`)~r@ zu9rT9AJ>g->Qo)FbTp8xEb6J3NDvi1P>H=q=mnY85JJA^yf1oIvo`%LsGJO{VMlm| zb9`L}QoLZ3tIZ0)B_RQT+-F%31*EtsU_PXX)q`DMA0kmv;El@?LJzFd88Nt0%p6yBKE~4!`Zi6i36r>u*i^`1^x!m8fS{MGlbdHRLm6@zHN)54N5_@Q&(`A7K z&dJL$fIb zkz#`d3RJ696yZ$=o|`;`MOO7}rAEt<%EJP5TLJaFdQeP%wZpm4Pg%*(<*BiCU$UCO zuJwXeS$6~Lp|eWwU0yyp7Kgs8y#0;bt&2?B-6K)PhrgYC;$ZU2JLQwxyBq5c07pNspnk_pab~8A8ZcGRZ()7heHjialHCSxkN}W?%AVlW zooFw`0JnTNl0w);_@}g)0Ukgt6Jtj-Unfn$plKM^YCT}{W5`WKPixl57w}Fzplu3HOU}q5}Sk{GF;lM(8_)L zipH;%i%J&TV}6aPE%D!;i<#9up3Qu%nQx@X5%&$r$cMxJ2@{!{HTo% z;2f{zBaMC%ZqpY%WHNw4*DF->hR95|bXxKT-Kv8Oz z+9MQD`Q*C-f6Cgs&PhD)&bUJd#;+N3)v(GwmN@`9Ua8>sdx4Q1m{`_qaB%mdk(>z*oQ|4pPG|c? zL5B3Yq?5bU*R}-C8kBn%y_Q$bZM@)-)C@;ZZM+TPS#HLK^h3v z;H1*}rLEflh(k-6a@pa~L3o;jJJ-X}L1;&uAD)rM36G%W3q;^)AVbaXwZMP$z5|pJ zs~q2v*8MNNYE& zSwVjXV89M%TT39tVZSe`!NhoA2(6wDm7OEY9Ay)S5wCg?P656{HOhZfhym zg4?hE1KhvC|L=nQMTv8!GFEW!%N5(E(pqawe*k7MuvG$=V)KvsJ{z-0a|`KJBccg9h%* zsszA!fuWmgI3i&aQ24gtsQYqfI3N-w8&XH%oPDiunAz63#ugu zR)v%&!zJM)stEc4{d2iQtMsX ztP#4A)ot)C>)e&Bl#-nDadY!IU|xqsJZzX!F%4;AJ}5+_ba?D!+VxRzM4#(^9~I3d zz5*$0NQ9o2OF)34eMzM_on&p@0$uKRFG#KM6ecIC*kgJ2#DIKYIGG4W@-FGcEfx~i ztMl`59so7E0UM>}0^2R+ERY^}%g{+bU3x%8IXKRdTtj@UQ!3By%)7H8F>M!x+Pu*4 zGzX2Boc-{r2uwS-D@CBdr5OtjsEKmY&LnPCH0FRyy{lTAggZK6rQh(B+9GhohN63S zUvYOb8m+cQzSR>N7i8U>ob{bhvCfGUJPavO^GxH~@J?#h0iiqp5tZR5qD@|8&1QPxgeLekKI!itnwrCYTlL(=az z|3Hd|1q>w99*~2=m#`~DI!AHpw{wMbMO!-+L@79(t?R|qe%QoMNWb5aBFxaJ?ivLi zJZ87kc{@oL8;1>1vO%+6r3LY8)=omZizR)|Nxac0u^xW^YmgaA_!C0PZ8?2Yy+-c< zB?66g=2Biy&G?l_*EfsGLeohhwF}lx^o>)*k>5qK_Emwb1+)l>jrhp%x=!0#4eyLV zA7jN`r;i6?7CYb#p36Cn)6Dg)vB#k+%dXYb^bIu&H%7bO;0D`gZ#RhEU|S$GkS@;6 z?h8*_tq4B+OrGtj>Te1rgOta!6knt=j3P5 z83!)CoKu}Po1EQ4A|Yj^X66pV#2x7Ds5pCMcM1}J5mLfC09o<|5sf)AxZCmPOz<~# z{f`;pA2Y!IjPTDH;NSIs&H(%Mzra!hN%? zO*$lJIMGKu9uANLj4V%`c}LGl>!Xd;%((iZ(FweTn8xu8j=OtNaEo<=YaV&Ykpo z?02CD=;?vb&Z1GJPn9)mze+th)a+d1b_K<5Hy?mWjSM)WC0Tin96K z3x6iW+K9lDdpJ<5OjZsp-!UI9n&VtLI#$FIq8g0%O@bvU#m}!le-lTH;lN*t2b9|rmcvlfQ`6cOkVXy_W(#!Lj z=R6{Bzhy4H{P8!SbX|9+r8Y05YJn!&nn z&iL0doaLVCjj53qHB}>vqBlvAcmxCId)NS)^fk_kB1=CY$FyrL7(D~4WN zAODGvpENu9w0}6#H4{6o;%4JLh{@zJ`Qj+D<8@+JPfj4XRxqVM`i~yS1?1ISd*Sp^ zw2>rHVyala4YM-&0(9g$&tYr=Bg(2Lx$Sk^oLem|i*lZ<&#rslU*(aD`W=_Y4I_OD z^ch)#6=QHqZeLcv(g^XH^hRG@@NvO*iT0Lp8A3+pJ7_Y z!*y05gJ)~1+41B?Ns~>mj&OawE`67!tUjllKufawxk6(3v|L3K0>gI%t$3oxfyrjU z6a@w?O^l2LMk|&Jd8U-LP&7R2@OLNSCYIFh;Fb_xE2Lh(n&ZOfsqGJLXN~|h6i+@* zjC8iC;jf%HCr8`1h>z|iD>YupAfgILQK3uPJ?C_-QI?iZF;y-RQxNcMxT-?R8Pl*M z12`rApr5aJc2`wV+IfBPiwZ3_%=V=vnI+leNz*q;GK*6U*~|*JMF$AA0~|oDH_o%5 zlkzQ=b|GKO|0P&cEMU8j)D0Iq)HFX-ET*huVr)jgJjZ9~W(@%$Vv zswAv=f`0wlokyr*VjMLo%$=S7sN%8PJz0BFdqRcsh9N8r#05RxGMUlwU;&q<-Vf{% zJ}{J4inQcj`<1#5!aOFh?z@~NwI$3ppZ*A%`ny3;y<>ij&>^X-_g)p%5qHO3@H=q~ z{+em1ya7RUX9|W`>&vF&KLpf5254A7T$|^q%>nYgC9i@nVX^iW_s*y*Hb>h#5IED~ zx!%7?pfDSh;_hIpnJ()cvn)4Nw8S~sh)phdy_PcLBen@mkE~=wMT{?-S5+q?dXwcA zz7vgYkg_-f>q<()C;pJMXX(FKEY7R(`k|?=jR>MjB7FOnl=_fgr}_$I`#uMOt?LmF zIIeI#fJx)axmQbL=f3&C@E)vKKK@hRH-cLHSuOeo1}7&a8R1Cw5HZ;18tp55#9g~(dzU&wfc;&Ys6ZvSnJg5r=ar30d>bz zalz99?wPBEVacwKu8GaUi%LhEr%1xxCSS!57EZOZN_HA>WgMGnJpOK!$>h21|= z6bCsc`!~#K&UDyaGVz@HnYGX`c2j2NORM5EqcgMUDzNxQedq3_NlAI_ft;?mil>i%-}?As>)U%W)rICJW% z$Lc$NZs<@Ur8)-ORZO>a-dl2dE%|xB%N`kqf)IkdMgh_QIj=%Kbuibiuw9bZ|M}Sbi)UMx~Pr4h+qC{E|4)Gq?D|Vw!Db)|ATivRv$2t2_ zTi1M}!zQlm@CKOg@74S7MH!7YaQO zoI-mF;<$#}3D@OJ6Eh|Z20FZ%w7#Ed@|aI?L0yg9N^uga!zBH&??wuMlx+e?62mK~ zEXAH0DrqdsDfkX4vxzmbO0Qd4d<6J<&wXaC^s9u%=2D6vUAg{6Nzp@`2dwUi79oF< zE7R#$yKE+N^#(6><}{!m)23qJCejqU49!+Kj6buB;fMsVpG8Z1O5`!ze(-iD*uBB9|-q< ziu>O>{;l#~q3qSdR0mS4%})CsgFKGMIDXa~4g~i|xPrUCxY;=%UF@Tn2D9INdg6#( z6+0m87;?xH(n24YY8^K_*SY&gAw3(Q3lxJ~tbyRat7uD-a$Rac`pAeKqfdRvpT5R7 zQmdUeBw$?Ip8Gp0bJ@#ue#zccbswcS0rwZkqY?tIC0CFB>&{MV`PHvnoDsEgA)^6v zL$n5icC0T(QqL-7Ke_HP1U}SZH*_@8lC_=L+jB}>=jVRI*b9C|66G(Q^j3@>^7iub z=tXT)L969uaO@1mO%{{rBDa~O;k5iddRkj6gtY5_$<$RAtF#-JW0Dauf z*ImU?1bh-98j;0`iNq!YSYjC2umLQ^|Eug>4_0dLZT$p?IzSut&frB^byYli8?tc5 zzXk#)J^fzTmvQ_?+=8;JLoGT?MCqQ(Vq`trrHrA}f^ZsRE^}5mO&N#A%30#>Nc(Ds zb>q9~?HPBeT`%`1*hdSlET}e96dW#;i18fG2`H}Yd-kZFccp$AZdq2jlKYT42lJbh zo+<8W-NzO?Lmk0}Ib5_70J!emp*3M(Fm1ifk;GN=Yg1OrzKpdM7+Hw^) zG|ZXQ+X&chs7h`~?{iUcHLP*T}!NbYBQTWKSJTM8w&|1I$#LRc@Gi{ zknKMe;MErKGyzkDM?GF9{_Il}n^oMk??m)dPM?SVUKb9KtF+y&?aSSopN@5?)KV>xt~~4B}-E80_CxpVhAtSiJ%RHW#9rY@7l!hy7kUjiMJnEloIms#~kdD zn}-ZN{hI3H?q+MTa@lC(yN^=Sr~+Jv8Xnp7v={d(L`Hbt79PxT~)lRqR%kgqdv%CgN< z-^oR|e@m2*iUP1ZDWb!&5r_NcI@8Bo9@MlASA3!<3bnFTl6_V})=JBEboDRp!8a;* zhxRH5lM@VWGdxBqyPJLXO^jkLj${h^`Ao^J$vzv?)NB~f*qOcw5%OGgpG@pP{8(pR?%|1D#A#2@k4^t99BctJ&o*zJeA0s zHSI0B`^1pNX7AZRa`BJ~vnlwidnB_vx96cDOo7!+Mhk74Ifav0!YzaY2H5GLVx63@ zOxZ0d?OX@4gfuY}kQGfrGEUt5*ajy>0Ja5L-;G7v=Jh&E-S$Ow$EIQr+2K~D_K85w z@!L#wAaY)AmWd!Ckf*!Tda6y>{aS^oA=M5Ncl*FuT$vxM(DcoPS+&rl2F+Iu!pvsq z7$=VX zL!1&Bw|$Iazvs30e0>(yN^}sv}RfT%ey=o z`iQd1J#6SMsY()7wu9N)q*cE%dYrxZTX$&vH_=WVnZji=jr}gw^XEw*F@J(sy@SUWR$tDmOhF^p6{iaoJ+#s+u;s znbQ{zkBm_^5y&@9VUMZjuot)=Gx&yDFu1^6fUPvVaG_P-Ng|`n@572hGia!)$yN`& z_2{irEko-i@y#W*-`2}vKCu^gW-VB3zOH^rF78(O<||Xt3}V5h%hxI+-Th zr_|Xh)%P_Z;0FuWxLoVw!Hfvwb>n^o8LQLzd9%Zi_;5|o>^<&G*=ZYO1?LxOcdC^< zIpezm&&)YrN0Wq3Y(Ed*?kQ9F0d@|8m@DIP^oqwNu}h0SIViU_%G{#jJY{zMYq=^a zQ?XPHTBhNX6zaJP5{j)E+I?W!`{lCE0?css!5vBR#^xv1gJt<@5gen^~r z2wL;q@L{!UhvA;{2`^E@WUy+6$- z12rJDGw7_S6MYR8hv*={(2zj@mSbplU`SyE;^w!C15#zn{h)ovt`~7PWxwCT808eC zCzc2*a-S8@X*b^Jfc-TZ`o73P`&y#HMTpumjv+x39X!sN2BSDp%`1B2!@hc@nembr znxT=nrVz7`T%LmX(*b(M$nLq|%uJ486oaZQTEHPK@HfSFV?BGv<<3LdvYk!rP8^fc z;E%M)a^c$a(EJbmDG*MJ&%M z4W0IJCRKTO@8dypY&4*P>z*lUUgk<#*Db}jk>r}+uyTV+vJMz`aXu2xF|^pfKKocZ z!k7!fhdRu?-p<(g}bZ%5@-B%{eo}9y^O*Tc5{>0vknMuUp-97h`$BV}2|r5tyl?KSbX`Fc?vm!5)%Kbc7R~VZ zx>I=TSJMwX-{^VvU-~>5(U6m*QO;gpY%`3TAGk-0W1+m93*U%}SB%Oq;yiW`h6xL} zEBxKfGE(1YbbP=y$=)XfjPrkGiDS+6yaXUqs2_A5)gu;&$5)c(=?C)r?F)-qQCG|S z4;{P$p%r7Iu*00i6L|to9nl3J9fVFc1#f4H!6f<7Sp@5!+#9B9rjr?V_ixV+2p(QX zKfeu+jJuelyC*H_w0tCAf};lnTxJ?AkO(-hY@jshWRV-$>p{(am}m`UazKy}X=9Y` zOY0Jo9gyt24wKxB{;2-0cfiZB?dIZ5?)40EsD`aRoxgUaEWB9fL+G}YyZX6C_9}Xw za&9Z79@c*mm;egui&!<~*NIJbJE2#Ka-*L1VVp+&%LrFZ2Ta}<*)BVv+MYaq5~NLw zU@w=CUmN0#n}iFSAO4fZy;A_6d56kPhG3EnuE66vI^E5IjfJ5(^SK>op}aJm7EiP> zmqDWQoYac>syq*I$hI){^nRG`ZtxtPGNHX&#t@B^Z=&FhU~yCOd0^nGW40t=zO-N) zdU@P`E!2Lq!go#Vu>`&{R#`J`LJ4MTOkY5lU;hf+3%AC7i!i+gj;&n-*88U3{25ys zknTORG-xDp+pns!VF(E`pqo~UaW3$3&Wi;jCNKl@D`0;29~_&1@-Zt)#BV+77Bx6$ z5_~3mi)!_lR7eC99=$WC9~yU_Jd4L5OSRl zhNs0@w<*Y`_FYOt$FbESlJDhHiDJ$kRaQ7ctAdnu4d?v^R|?L<7Xu&P5m|oWfPVDg z8y*(t(zc5jwzTB3Y7u0ZbNsvlK};?xW^1*bxu{in^QE*- z@5FB0^}O7;o_IQOOv^>Mzj_E;mcK;1MAbdU12qdczY&KEZ=E>1WN;RWq~0wsm#wCZ zcfZHKlV986IEbpIlAf##;wK@i8Du^e=0s~PiI(JKvG@10*Q1ngPi?IryDAEY)EOz-Y)H=sHbOTDIt zSTb*1Dab7^(B|N8FXm>33@qkUo&@?6)p15P$mOk*QlrGVP>_o{zayA2{3{?NrhZNA z_WH*#U9%ZuWL}s7U3l~_g8_Y6)yi)haEU~r%!|X(ThxVlYGI%j;KN@?dCjF?AiOZqQw9ku&(OfoFhIt-_mMcuK>ePE&bx()Qah|=% zO~Jy2&fUVAqd{_AE9e4LTU93DxpQ<^`vV}5=j9)KK-<#h@7S~7C7;%(jJ3PEcu!6eSf^|SZk>V zbFQq2>8QeuCPYsI^v^PMO)`0iYQrHHR6M79k!zs{zKZAtCtnN)hs zby+68H{lAG-W$xe)eV|ti==e2Tj6O+3=&4 zHT;CWP~jG19GT#GFnb!oNE3Nv*ZP{7R%{<{+iFplb@!SwQ&Wz({+zp{IrYvYljd_l zdTf<1`{U3Ec0hB6xpkTb)Rl5FYG4w%($B3!dzn!bNoUY4t67vU~?!S%Q$z z6rz=haS>#yGtMK8&D~?VtbsCZdB0j8`mmS#Q}2L+I6vyDt$J@F zyCFL936Z@!pyg(ut7RjFY{8?ps%2fYiLll9Y9@a2yU7KiYx9z)xat{YZRB|w3X@OG z@ix7Me~Qt_u8!K??roEvFL;@xVVy+HAdJN%osXCFK)dl&dAQFUeQXd>uyhxozLl*k zQwAIMKKYo1E-0>wDrkYt_koll=gr!dr@7^S@t>JJr}Tx>_c$rxoY07eE{ad)i={v1 zH)B3(JUcuu4hU>XUTY-L4Ztn7ZQjE)8Z50p@<`tQInSqo*#SU_Nw-n@p za}Ks+zuNbNpRkOICJvY`1f7U+$;a(}X-@xY5)L|IAILW%WX*pdkm0kiIK>@K5^GYy zp~3d_YWjhybE4;~=KtI{*i;c+crQ)EJMYcqKdG7jXhXMvhuQMJ9S*RO?b&Fb=%uIO zC^C7h@~X3AjEr!ucqU7_@ij`0Rda{(Nfw4;VSaojJq3I{wSBF zp3ZmUe(uT6liTtIK|Z?i&L~z>v+v1x6KRs5WVBiJmGfhOf0bmOQtty(9tFlbRVEMR z(O#9$kk)4j9Sk07?9*00>Jr;(=vF)O3vj;cnrz^EaAJF6p7AVNX@8-=4qSaYN3gyt zG4O@w;_;XVSnGO6^lV=Nqw`Dd$7WBl?Di(^0%6ud+0-=f s73uCjw&k}1oP;9LU(ii0Портфолио

Привет, меня зовут Денис и я

  • F
  • R
  • O
  • N
  • T
  • E
  • N
  • D
  • Р
  • А
  • З
  • Р
  • А
  • Б
  • О
  • Т
  • Ч
  • И
  • К

создаю современные сайты.

Мошкин Денис
Frontend (js, Vue, Canvas, WebGL) / Backend (node, php, Laravel) разработчик
  • Рассматриваю свое развитие в сторону руководства, помощи начинающим сотрудникам.
  • Заинтересован в интересных проектах, которые будут развивать меня как крутого разработчика.
  • Интересны технологии: frontend(vue), графика(canvas, webgl), node (express, next).
  • Уделяю большое внимание и значение качеству кода проекта.
  • Я всей душой полюбил веб разрботку, и не жалею времени на постоянное развитие в этой области.
  • Больше хочется работать с новыми проектами, либо создавать с нуля.
  • Тут более дюжины правил для дизайнера
    Ссылка на док файл в яндекс диске.
  • Опыт в веб-разработке:

    3 года + опыт работы на фрилансе.

  • Возраст:

    24 года

  • Почта:

    moshkin.denis.007@yandex.ru

  • Телефон:

    89635508754

  • Телеграмм:

    @denis_moshkin

  • Образование:

    "ВятГУ" по направлению "Фундаментальная информатика и информационные технологии" 3 курса (неоконченное высшее, отчислился по собственному желанию, так как не хотел тратить впустую время)

  • Оценки в университете:

    Дискретная математика - отлично
    Объектно-ориентированное программирование - хорошо
    Классические алгоритмы и структуры данных - хорошо
    Дифференциальные и разностные уравнения - отлично
    Иностранный язык - отлично
    Математический анализ - отлично
    Теория вероятности и математическая статистика - отлично
    Компьютерные сети - хорошо
    Теория информации и кодирования - хорошо
    Математическая логика - отлично
    Мат. логика - отлично
    Архитектура вычислительных систем - хорошо
    Ссылка на документ

  • Медиа:

Навыки

Frontend

  • Vue2, Vue3

    Изучил прогрессивный JavaScript-фреймворк. Научился работать с классами, событиями, директивами, слотами, миксинами, компонентами, двух-связной привязке к полям ввода. А также composition api, proxy, typescript в vue3.

  • Nuxt.js

    Изучил vue фреймворк для облегчения работы с ssr. Научился работать с page, layout, plugins, assets, routing, seo and meta, configuration.

  • Vuex, Pinia

    Изучил библиотеку vuex для хранения состояния vue приложения. Изучил getters, dispatch, actions, mutations, modules, а также map helpers (mapGetters, mapActions, mapState, mapMutations) и работу с простраством имен для modules.

  • Vue-router

    Изучил библиотеку vue-router для роутинга и создания SPA. Изучил router-link, router options, programmatic navigation, navigation guards, named routers.

  • Vuetify

    Изучил ui фреймворк для vue приложений. Изучил helper classes, sass variables, components (app, grid, btn, tables, menu, v-text-field, validation, icon, img ...)

  • Element-plus

    Изучил ui фреймворк для vue приложений. Изучил components, config, css-vars, подключение только нужных компонентов.

  • Bootstrap-vue

    Изучил vue framework. Научился работать с многочисленными компонентами, иконками.

  • Vue экосистема

    vite, nuxt, vue cli, vue-i18n, vuelidate, vueuse,

  • Node.js

    Изучил язык программирования - Node.js. Научился использовать: path, file system (fs), es6 modules, commonjs modules.

  • Javascript

    Изучил язык программирования - Javascript. Научился использовать: промисы, fetch, замыкание, символы, модули, strict mode, функции, классы, встроенные объекты, работать с DOM моделью сайта и работой с браузерными объектами (location, Event, localstorage)

  • TypeScript

    Изучил TypeScript - типизированный js. Изучил типы (type), классы (class), generics (T), множества (enums), tsconfig (libs, options), интерфейсы (interface), а также пользоваться типами библиотек и изменять их.

  • AJAX, Websockets

    Изучил AJAX - асинхронный JavaScript и XML. Научился работать с сервером: отправлять, получать запросы и обрабатывать их на странице. А также пользоваться библиотекой AXIOS. Изучил websockets для постонного соеденинения с сервером.

  • Webpack

    Изучил сборщик проектов webpack Ссылка на репозиторий с конфигом.
    Пытаюсь понять как работает webpack под капотом в браузере (особенно импорты и экпорты). В дальшейшем есть планы посмотреть процесс компиляции на node.js webpack'а.

  • Cypress

    Изучил способы end2end тестирования кода. Генерация событий(click), поиск элементов (get), проверка api запросов (intercept, wait), обработка загрузки файлов (cypress-file-upload), переход по урлам, fixtures.

  • Тестирование.

    Изучил способы тестирования unit кода. 1. Jest фрейморк для написания тестов, применил: jsdom - для тестирования DOM, describe, test, except. 2. Хорошо знаю режим разработчика в браузере. 3. Научился тестировать сайты через подключение к телефону(google chrome + android), если баг происходит только на мобильном устройстве.

  • Linters

    Научился настраивать проверку кода pug - puglint, ts - eslint, editorconfig - общие настройки, husky - для проверки при коммите, а также структурирование коммитов с помощью Conventional Commits.

  • JSDoc/TSDoc

    Изучил JSDoc/TSDoc - продвинутые js комментарии. Научился комментировать функции. Люблю хорошо документированные проекты, поэтому уделяю большое внимание докуменатции к проектам. Научился создавать документацию по комментариям при помощи tsdoc.

  • Canvas

    Изучил html элемент для создания графики с помощью JS. Научился рисовать изображения на холсте, импортировать холс в виде картинки, а также с контекстом элемента canvas.

  • Chrome extensions

    Изучил chrome api для создания расширений. А также таких модулей как: chrome.runtime, chrome.tabs, chrome.storage.local, popup, manifest.json.

  • Vue-ssr

    В ознакомительных целях.

Backend

  • Laravel

    Изучил фреймфорк для PHP. Научился инициализировать стартовый проект. Работать с controllers, models, views, routes, artisan, database migration, query builder.

  • PHP

    Изучил язык программирования PHP. Научился настраивать php.ini.

  • MySQL

    Изучил реляционную систему управления базами данных MySQL. Научился разворачивать mysql сервер. Научился пользоваться MySQL Workbench и создавать модели.

  • Apache

    Изучил кроссплатформенный веб-сервер (apache house for windows). Научился настраивать виртуальные хосты, использовать многочисленные директивы. Просматривать логи, добавлять дополнительные модули (php, mysql).

  • Composer

    Изучил мендеждер зависимостей для PHP. Научился устанавливать composer и работать с пакетами.

  • XDebug

    Изучил средство отладки PHP скриптов. Научился подключать xdebug к PHP и запускать пошаговую отдалку в PHPStorm и VS Code.

  • SQL

    Изучил язык структурированых запросов SQL. Знаю на уровне запросов: insert, select, join, update, delete, а также нормальные формы Бойса-Кодда.

  • Linux

    Изучил операционную систему Linux . Научился пользоваться терминалом, настраивать LAMP сервер.

  • PHPStorm

    Изучил мощный редактор кода для PHP.

  • Wordpress

    Изучил CMS систему управления контентом. Научился работать со стандартными классами и методами, владеть бызовыми знаниями в php, работать с админкой и связывать админку с версткой.

Верстка

  • Bootstrap

    Изучил css framework для верстки. Научился работать с компонентами (accordion, breadcrumb, modal, offcanvas, ...), системой сеток, а также подключать только нужные scss и js файлы.

  • Верстка

    Изучил верстку страниц сайта по PSD, Figma макету. Научился верстать адаптивно и кроссбраузерно с применением медиа запросов. Использование семантической верстки для улучшения качества кода.

  • Gulp

    Изучил таскранер Gulp. Научился использовать плагины для минификации кода и изображений, сборки файлов, постпроцессоры, сервер проекта, а также линтеры для JS, CSS, PUG. Ссылка на репозиторий с конфигом.

  • Опт-ция сайта

    Изучил методы оптимизации сайта. Научился использовать програссивные форматы изображений (webp), ленивую загрузку фото, минимальную вложенность DOM, минификация кода, а также научился работать с панелью разработчика для отслеживания процесса работы сайта. Умею довести баллы сайта по goggle page speed до зеленой зоны.

  • JQuery

    Изучил библиотеку для js - JQuery. Научился использовать селекторы, события, методы работы с DOM, эффекты и анимацию.

  • HTML5

    Изучил язык гипертекстовой разметки текста - HTML. Научился делать качественную разметку веб-страницы, используя всевозможные тэги и атрибуты. Поддержка accessibility - для доступности проекта всеми людьми.

  • CSS3

    Изучил таблицу каскадных стилей CSS. Научился использовать grid и flex в зависимости от поставленной задачи, а также всевозможные стили.

  • scss/sass/less

    Изучил CSS препроцессоры. Научился использовать переменные, миксины, вложенность, циклы, импорты для ускорения верстки сайта.

  • Pug

    Изучил шаблонизатор для html. Научился использовать циклами, переменными, блоками, импортами, инклюдами, миксинами.

  • БЭМ

    Изучил методологию верстки - BAM-naming. Научился стандартному наименованию классов и разделению ответственности между блоками, а также конецпции блок, элемент, модификатор.

  • MJML

    Изучил фреймворк для верстки писем. Научился использовать тэгами и стилями.

  • Yandex map api

    Изучил api яндекс карта для создания взаимодействия пользователя с картой.

Остальное

  • Программирование

    Изучил паттерны проектирование. Применил skeleton, chain of responsibility. Изучил принципы программирования DRY(don't reapet yourself), KISS(keep it simple, stupid).

  • Git / Github

    Изучил систему контроля версий. Научился пользоваться git bush для локальной работы с проектом и github для хранния проекта на удаленном сервере, а также коммитить, пушить, мержить, работать с ветками, стэшить и изучил pull request и fetch. Использую gitlab и github

  • Англ. язык

    Свободное чтение документаций к плагинам, фреймворкам, а также любая информация в интернете. Документацию стараюсь читать только в оригинале. В планах свободное понимание английской речи в видео.

  • Agile (scrum)

    Изучил методологию гибкой разработки. Работа по спринтам, ежедневные обсуждение.

  • Figma

    Изучил инстурмент для создания дизайна сайта. Изучил работу с текстом (стили текста), с цветами (стили цветов), а также компоненты, группы и фреймы.

  • Доп. инструменты

    Phpstorm, Webstorm, Open Server, VS CODE, FTP, SSH, Yandex map api, С#

  • Книги

    "Совершенный код" - Стив Макконнелл, "Идеальный программист" - Роберт Мартин, "Как устроен JavaScript" - Крокфорд Дуглас

Портфолио

\ No newline at end of file +Портфолио

Привет, меня зовут Денис и я

  • F
  • R
  • O
  • N
  • T
  • E
  • N
  • D
  • Р
  • А
  • З
  • Р
  • А
  • Б
  • О
  • Т
  • Ч
  • И
  • К

создаю современные сайты.

Мошкин Денис
Frontend (js, Vue, Canvas, WebGL) / Backend (node, php, Laravel) разработчик
  • Рассматриваю свое развитие в сторону руководства, помощи начинающим сотрудникам.
  • Заинтересован в интересных проектах, которые будут развивать меня как крутого разработчика.
  • Интересны технологии: frontend(vue), графика(canvas, webgl), node (express, next).
  • Уделяю большое внимание и значение качеству кода проекта.
  • Я всей душой полюбил веб разрботку, и не жалею времени на постоянное развитие в этой области.
  • Больше хочется работать с новыми проектами, либо создавать с нуля.
  • Тут более дюжины правил для дизайнера
    Ссылка на док файл в яндекс диске.
  • Опыт в веб-разработке:

    3 года + опыт работы на фрилансе.

  • Возраст:

    24 года

  • Почта:

    moshkin.denis.007@yandex.ru

  • Телефон:

    89635508754

  • Телеграмм:

    @denis_moshkin

  • Образование:

    "ВятГУ" по направлению "Фундаментальная информатика и информационные технологии" 3 курса (неоконченное высшее, отчислился по собственному желанию, так как не хотел тратить впустую время)

  • Оценки в университете:

    Дискретная математика - отлично
    Объектно-ориентированное программирование - хорошо
    Классические алгоритмы и структуры данных - хорошо
    Дифференциальные и разностные уравнения - отлично
    Иностранный язык - отлично
    Математический анализ - отлично
    Теория вероятности и математическая статистика - отлично
    Компьютерные сети - хорошо
    Теория информации и кодирования - хорошо
    Математическая логика - отлично
    Мат. логика - отлично
    Архитектура вычислительных систем - хорошо
    Ссылка на документ

  • Медиа:

Портфолио

Навыки

Frontend

  • Vue2, Vue3

    Изучил прогрессивный JavaScript-фреймворк. Научился работать с классами, событиями, директивами, слотами, миксинами, компонентами, двух-связной привязке к полям ввода. А также composition api, proxy, typescript в vue3.

  • Nuxt.js

    Изучил vue фреймворк для облегчения работы с ssr. Научился работать с page, layout, plugins, assets, routing, seo and meta, configuration.

  • Vuex, Pinia

    Изучил библиотеку vuex для хранения состояния vue приложения. Изучил getters, dispatch, actions, mutations, modules, а также map helpers (mapGetters, mapActions, mapState, mapMutations) и работу с простраством имен для modules.

  • Vue-router

    Изучил библиотеку vue-router для роутинга и создания SPA. Изучил router-link, router options, programmatic navigation, navigation guards, named routers.

  • Vuetify

    Изучил ui фреймворк для vue приложений. Изучил helper classes, sass variables, components (app, grid, btn, tables, menu, v-text-field, validation, icon, img ...)

  • Element-plus

    Изучил ui фреймворк для vue приложений. Изучил components, config, css-vars, подключение только нужных компонентов.

  • Bootstrap-vue

    Изучил vue framework. Научился работать с многочисленными компонентами, иконками.

  • Vue экосистема

    vite, nuxt, vue cli, vue-i18n, vuelidate, vueuse,

  • Node.js

    Изучил язык программирования - Node.js. Научился использовать: path, file system (fs), es6 modules, commonjs modules.

  • Javascript

    Изучил язык программирования - Javascript. Научился использовать: промисы, fetch, замыкание, символы, модули, strict mode, функции, классы, встроенные объекты, работать с DOM моделью сайта и работой с браузерными объектами (location, Event, localstorage)

  • TypeScript

    Изучил TypeScript - типизированный js. Изучил типы (type), классы (class), generics (T), множества (enums), tsconfig (libs, options), интерфейсы (interface), а также пользоваться типами библиотек и изменять их.

  • AJAX, Websockets

    Изучил AJAX - асинхронный JavaScript и XML. Научился работать с сервером: отправлять, получать запросы и обрабатывать их на странице. А также пользоваться библиотекой AXIOS. Изучил websockets для постонного соеденинения с сервером.

  • Webpack

    Изучил сборщик проектов webpack Ссылка на репозиторий с конфигом.
    Пытаюсь понять как работает webpack под капотом в браузере (особенно импорты и экпорты). В дальшейшем есть планы посмотреть процесс компиляции на node.js webpack'а.

  • Cypress

    Изучил способы end2end тестирования кода. Генерация событий(click), поиск элементов (get), проверка api запросов (intercept, wait), обработка загрузки файлов (cypress-file-upload), переход по урлам, fixtures.

  • Тестирование.

    Изучил способы тестирования unit кода. 1. Jest фрейморк для написания тестов, применил: jsdom - для тестирования DOM, describe, test, except. 2. Хорошо знаю режим разработчика в браузере. 3. Научился тестировать сайты через подключение к телефону(google chrome + android), если баг происходит только на мобильном устройстве.

  • Linters

    Научился настраивать проверку кода pug - puglint, ts - eslint, editorconfig - общие настройки, husky - для проверки при коммите, а также структурирование коммитов с помощью Conventional Commits.

  • JSDoc/TSDoc

    Изучил JSDoc/TSDoc - продвинутые js комментарии. Научился комментировать функции. Люблю хорошо документированные проекты, поэтому уделяю большое внимание докуменатции к проектам. Научился создавать документацию по комментариям при помощи tsdoc.

  • Canvas

    Изучил html элемент для создания графики с помощью JS. Научился рисовать изображения на холсте, импортировать холс в виде картинки, а также с контекстом элемента canvas.

  • Chrome extensions

    Изучил chrome api для создания расширений. А также таких модулей как: chrome.runtime, chrome.tabs, chrome.storage.local, popup, manifest.json.

  • Vue-ssr

    В ознакомительных целях.

Backend

  • Laravel

    Изучил фреймфорк для PHP. Научился инициализировать стартовый проект. Работать с controllers, models, views, routes, artisan, database migration, query builder.

  • PHP

    Изучил язык программирования PHP. Научился настраивать php.ini.

  • MySQL

    Изучил реляционную систему управления базами данных MySQL. Научился разворачивать mysql сервер. Научился пользоваться MySQL Workbench и создавать модели.

  • Apache

    Изучил кроссплатформенный веб-сервер (apache house for windows). Научился настраивать виртуальные хосты, использовать многочисленные директивы. Просматривать логи, добавлять дополнительные модули (php, mysql).

  • Composer

    Изучил мендеждер зависимостей для PHP. Научился устанавливать composer и работать с пакетами.

  • XDebug

    Изучил средство отладки PHP скриптов. Научился подключать xdebug к PHP и запускать пошаговую отдалку в PHPStorm и VS Code.

  • SQL

    Изучил язык структурированых запросов SQL. Знаю на уровне запросов: insert, select, join, update, delete, а также нормальные формы Бойса-Кодда.

  • Linux

    Изучил операционную систему Linux . Научился пользоваться терминалом, настраивать LAMP сервер.

  • PHPStorm

    Изучил мощный редактор кода для PHP.

  • Wordpress

    Изучил CMS систему управления контентом. Научился работать со стандартными классами и методами, владеть бызовыми знаниями в php, работать с админкой и связывать админку с версткой.

Верстка

  • Bootstrap

    Изучил css framework для верстки. Научился работать с компонентами (accordion, breadcrumb, modal, offcanvas, ...), системой сеток, а также подключать только нужные scss и js файлы.

  • Верстка

    Изучил верстку страниц сайта по PSD, Figma макету. Научился верстать адаптивно и кроссбраузерно с применением медиа запросов. Использование семантической верстки для улучшения качества кода.

  • Gulp

    Изучил таскранер Gulp. Научился использовать плагины для минификации кода и изображений, сборки файлов, постпроцессоры, сервер проекта, а также линтеры для JS, CSS, PUG. Ссылка на репозиторий с конфигом.

  • Опт-ция сайта

    Изучил методы оптимизации сайта. Научился использовать програссивные форматы изображений (webp), ленивую загрузку фото, минимальную вложенность DOM, минификация кода, а также научился работать с панелью разработчика для отслеживания процесса работы сайта. Умею довести баллы сайта по goggle page speed до зеленой зоны.

  • JQuery

    Изучил библиотеку для js - JQuery. Научился использовать селекторы, события, методы работы с DOM, эффекты и анимацию.

  • HTML5

    Изучил язык гипертекстовой разметки текста - HTML. Научился делать качественную разметку веб-страницы, используя всевозможные тэги и атрибуты. Поддержка accessibility - для доступности проекта всеми людьми.

  • CSS3

    Изучил таблицу каскадных стилей CSS. Научился использовать grid и flex в зависимости от поставленной задачи, а также всевозможные стили.

  • scss/sass/less

    Изучил CSS препроцессоры. Научился использовать переменные, миксины, вложенность, циклы, импорты для ускорения верстки сайта.

  • Pug

    Изучил шаблонизатор для html. Научился использовать циклами, переменными, блоками, импортами, инклюдами, миксинами.

  • БЭМ

    Изучил методологию верстки - BAM-naming. Научился стандартному наименованию классов и разделению ответственности между блоками, а также конецпции блок, элемент, модификатор.

  • MJML

    Изучил фреймворк для верстки писем. Научился использовать тэгами и стилями.

  • Yandex map api

    Изучил api яндекс карта для создания взаимодействия пользователя с картой.

Остальное

  • Программирование

    Изучил паттерны проектирование. Применил skeleton, chain of responsibility. Изучил принципы программирования DRY(don't reapet yourself), KISS(keep it simple, stupid).

  • Git / Github

    Изучил систему контроля версий. Научился пользоваться git bush для локальной работы с проектом и github для хранния проекта на удаленном сервере, а также коммитить, пушить, мержить, работать с ветками, стэшить и изучил pull request и fetch. Использую gitlab и github

  • Англ. язык

    Свободное чтение документаций к плагинам, фреймворкам, а также любая информация в интернете. Документацию стараюсь читать только в оригинале. В планах свободное понимание английской речи в видео.

  • Agile (scrum)

    Изучил методологию гибкой разработки. Работа по спринтам, ежедневные обсуждение.

  • Figma

    Изучил инстурмент для создания дизайна сайта. Изучил работу с текстом (стили текста), с цветами (стили цветов), а также компоненты, группы и фреймы.

  • Доп. инструменты

    Phpstorm, Webstorm, Open Server, VS CODE, FTP, SSH, Yandex map api, С#

  • Книги

    "Совершенный код" - Стив Макконнелл, "Идеальный программист" - Роберт Мартин, "Как устроен JavaScript" - Крокфорд Дуглас

\ No newline at end of file diff --git a/dist/webp-img/portfolio/input-validation-next/docs-1.webp b/dist/webp-img/portfolio/input-validation-next/docs-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..540044012fd471c337dcc99f5a8b7b15fc5d11eb GIT binary patch literal 39682 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 B7J>i( literal 0 HcmV?d00001 diff --git a/src/img/portfolio/input-validation-next/docs-1.png b/src/img/portfolio/input-validation-next/docs-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b94e081764e11fe8a2cd9c6117df6a6a649d4273 GIT binary patch literal 72763 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 MYPzaL_ny7_UqSEp6#xJL literal 0 HcmV?d00001 diff --git a/src/pug/page-layout/header.pug b/src/pug/page-layout/header.pug index 9d270d3..d4b6922 100644 --- a/src/pug/page-layout/header.pug +++ b/src/pug/page-layout/header.pug @@ -1,12 +1,13 @@ -header.header - .container - nav.header__nav - ul.header__items - li.header__item - a.header__item-link(href="#about") Обо мне - li.header__item - a.header__item-link(href="#skill") Навыки - li.header__item - a.header__item-link(href="#portfolio") Портфолио - //li.header__item - a.header__item-link(href="#experience") Опыт работы +header.header + .container + nav.header__nav + ul.header__items + li.header__item + a.header__item-link(href="#about") Обо мне + li.header__item + a.header__item-link(href="#portfolio") Портфолио + li.header__item + a.header__item-link(href="#skill") Навыки + + //li.header__item + a.header__item-link(href="#experience") Опыт работы diff --git a/src/pug/pages/index.pug b/src/pug/pages/index.pug index 8e91701..33f178f 100644 --- a/src/pug/pages/index.pug +++ b/src/pug/pages/index.pug @@ -98,6 +98,463 @@ block page-content li.item__link-item a.item__link-item(href="https://github.com/VisualYuki" target="_blank") img.item__link-item-img(src="../svg/github.svg" alt="") + section#portfolio.portfolio.section-bottom-margin + .container + h2.section-title Портфолио + ul.portfolio__site-items + li.portfolio__site-item.item#npm-plugin + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" target="_blank") NPM плагин для валидации полей формы. + .item__desc + ul + li Документация на vitepress + li Ссылка на npm пакет + li Почти 100% кода покрыто тестами. (coverage около 95%) ссылка на файл с тестами + li Присутствует локализация сообщений. (нужно пока самому добавлять) + li Практически полная проверка типов передоваемых от пользователя (params, config). + li ссылка на репозиторий
+ + ссылка папку с исходниками + li Технологии: ts, jsdom, vitest, vite, vitepress, + li + | За основу взят jquery-validation + ссылка на документацию + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link() Демо форма. + a(href="../min-img/portfolio/input-validation-next/1.png" data-fancybox="input-validation-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/input-validation-next/1.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/input-validation-next/1.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Документация: главная страница. + a(href="../min-img/portfolio/input-validation-next/docs-index.png" data-fancybox="input-validation-docs-index") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/input-validation-next/docs-index.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/input-validation-next/docs-index.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Документация: страница гайда. + a(href="../min-img/portfolio/input-validation-next/docs-1.png" data-fancybox="input-validation-docs-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/input-validation-next/docs-1.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/input-validation-next/docs-1.png", alt="" class="lazyload") + li.portfolio__site-item.item + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" target="_blank") Браузереное расширение - блокировщик рекламы во вконтакте. + .item__desc + ul + li Технологии: ts, sass, chrome api. + li + ссылка на гит + p Установка: 1. Скачать репозиторий. 2. Зайти в browser://extensions/ 3. Выбрать режим разработчика (верхний правый угол). 4. Кнопка - загрузить расширение и выбрать скаченную папку с github'а. + li Иконка меняется на серую, если во вкладке не открыто вконтакте. + li Popup открывается, только на домене вконтакте. + li Выбор в popup блоков, которые нужно заблокировать.(Реклама, рекомендации, вложенные посты) + li Выбор опций сохраняется в chrome.storage.local. + li Вконтакте скрипты не видят блокировку рекламы, поэтому последствий не должно быть. + li Далее можно увидеть заблокированные блоки, а также вид самого расширения. (Картинки кликабельны) + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link() Расширение активно. + a(href="../min-img/portfolio/chrome-extension/icon-ena.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/icon-ena.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/icon-ena.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Расширение заблокировано. + a(href="../min-img/portfolio/chrome-extension/icon-dis.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/icon-dis.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/icon-dis.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Popup интерфейс с опциями. + a(href="../min-img/portfolio/chrome-extension/popup.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/popup.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/popup.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Блокировка рекламы под списоком. + a(href="../min-img/portfolio/chrome-extension/ad-all.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture(style="height: 300px") + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/ad-all.webp" type="image/webp" class="lazyload" ) + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/ad-all.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Страница музыки. + a(href="../min-img/portfolio/chrome-extension/ad-music.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/ad-music.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/ad-music.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Блокировка рекламы в новостях. + a(href="../min-img/portfolio/chrome-extension/ad-news.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/ad-news.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/ad-news.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Блокировка рекомендаций групп. + a(href="../min-img/portfolio/chrome-extension/re-g-news.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/re-g-news.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/re-g-news.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Блокировка рекомендаций друзей. + a(href="../min-img/portfolio/chrome-extension/re-news.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/re-news.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/re-news.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Блокировка вложенных постов. + a(href="../min-img/portfolio/chrome-extension/nested-posts.png" data-fancybox="chrome-ext-1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/nested-posts.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/nested-posts.png", alt="" class="lazyload") + li.portfolio__site-item.item + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Сайт по продаже пиццы на Laravel + Vue.js. + .item__desc + ul + li Технологии: laravel, apache, mysql, php, vue, vue-router. + li Реализована домашняя страница с пиццами, которые можно добавить в корзину + li Реализована страница корзины с добавленными туда пиццами и оформлением заказа. + li Реализована страница заказов для каждого пользователя. Идентификация храниться на backaend (db) и на frontend (localstorage) + li Админка с продуктами, которые можно редактировать и добавлять. + li Админка сделана на основе AdminLTE 3 + li Изображение кликабельны (откроется модалка) + li + ссылка на гит + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link() Главная страница + a(href="../min-img/portfolio/pizza-site/home.png" data-fancybox="images1") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/home.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/home.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Корзина + a(href="../min-img/portfolio/pizza-site/cart.png" data-fancybox="images2") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/cart.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/cart.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Заказы + a(href="../min-img/portfolio/pizza-site/order.png" data-fancybox="images3") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/order.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/order.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Админка с продуктами + a(href="../min-img/portfolio/pizza-site/admin-products.png" data-fancybox="images4") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/admin-products.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/admin-products.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link() Админка с редактированием продукта. + a(href="../min-img/portfolio/pizza-site/admin-product-edit.png" data-fancybox="images5") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/admin-product-edit.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/admin-product-edit.png", alt="" class="lazyload") + //-li.portfolio__site-item.item + //- .item__title-wrap + //- a.item__title(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Клон маски ввода (maska) + //- .item__desc + //- ul + //- li Технологии: vue3, ts, vite, jest, vitest, + //- li За основу взят плагин maska и адаптировал под себя. Отличительная идея в том, чтобы добавлять _ для всех невведенных символов. + //- ссылка на плагин + //- li Реализованы 3 класса: directive.ts - класс для работы с vue директивой, mask-input.ts - класс для работы с HTMLInputElement и mask.ts - класс для работы с маской по входному значению. + //- li Добавлены unit тесты для класса mask (jest) + //- ссылка на файл + //- li Добавлены интеграционные тесты для класса mask-input (vitest, testing-library, jsdom) + //- ссылка на файл + //- li Репозиторий с проектом. + //- ссылка на гит + li.portfolio__site-item.item + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" target="_blank") Кастомный datepicker на vue3 + .item__desc + ul + li Технологии: vite, vue3, typescript, bootstrap, element-plus, fs-date, + li + ссылка на гит + + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" ) Главная страница + a(href="../min-img/portfolio/vue3-datepicker/index.webp" data-fancybox="images15") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue3-datepicker/index.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue3-datepicker/index.png", alt="" class="lazyload") + li.portfolio__site-item.item + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/canvas-paint/dist/" target="_blank") Canvas paint + .item__desc + ul + li Технологии: canvas, typescript, vite, mvc, svg. + li простые svg иконки сделал на чистом svg + li + ссылка на гит + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/canvas-paint/dist/" ) Главная страница + a(href="../min-img/portfolio/paint/home.png" data-fancybox="images10") + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/paint/home.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/paint/home.png", alt="" class="lazyload") + li.portfolio__site-item.item#vue-social-network + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Социальная сеть на vue.js. + .item__desc + ul + li Технологии: vuetify, vue-router, vue-cli, typescript, vuex, sass, vue-i18n. + li Поддержка авторизации польователя через localstorage. А также поддержка роутинга при условии авторизации пользователя. При повторном открытии вкладки приложение, авторизованный пользователь сразу получит страницу профиля, иначе страница авторизации. + li Валидация всех форм через vueitfy. + li Поддержка локализации (не везде) + li Код проекта можно посмотреть тут: + ссылка на гит + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Регистрация + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/registration.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/registration.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Авторизация + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/auth.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/auth.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Профиль + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/profile.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/profile.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Профиль (мобильная версия) + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/mobile-profile.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/mobile-profile.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Сообщения + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/messenger.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/messenger.png", alt="" class="lazyload") + li.portfolio__site-item.item#minesweeper + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/vue-minesweeper/dist/index.html" target="_blank") Сапер на Vue.js + .item__desc + ul + li Игра сапер при использовании данных технологий: vue.js, vue cli, vuex, typescript. + li Код проекта можно посмотреть тут: + ссылка на гит + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-minesweeper/dist/index.html" target="_blank") Главная страница + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/minesweeper/index.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/minesweeper/index.png", alt="" class="lazyload") + li.portfolio__site-item.item#custom-jquery + .item__title-wrap + a.item__title(href="https://visualyuki.github.io/custom-jquery/dist/index" target="_blank") Собственный jQuery + .item__desc + ul + li Реализация частоиспользуемых методов в библиотеке jQuery нативным js (typescript) + li Реализованные методы:
+ code + | addClass, removeClass, toggleClass, hasClass, each, on, attr, data, removeData, removeAttr, hide, show, css, val, append, closest, sliblings + li Есть сгенерированная документация при помощи tsdoc
+ | Посмотреть можно тут: + ссылка на сайт + li Код проекта можно посмотреть тут: + ссылка на гит + li Протестировать можно в консоли. Например ввести в консоли: $(".text").removeClass("text") + li + | Код методов можно посмотреть тут: + ссылка на гит + li + | Реализовано тестирование методов при помощи ts-jest и jsdom
+ | Код тестов можно посмотреть тут: + ссылка на гит + li Реализован паттерн chain of responsibility, поэтому можно писать: + code $(".text").removeClass(".text").find(".child") + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link(href="https://visualyuki.github.io/custom-jquery/dist/index" target="_blank") Главная страница + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/custom-jquery/index.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/custom-jquery/index.png", alt="" class="lazyload") + li.portfolio__site-item.item#instrument + .item__title-wrap + a.item__title(href="https://newlk.vdkanal.ru/" target="_blank") Инструмент + img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/logo.png" alt="" style="width: 130px;") + .item__desc + ul + li Задача была переписать весь frontend старого сайта, с новым дизайном. + li Главной задачей заказчика стояла быстрая загрузка сайта, поэтому все страницы находятся в зеленой зоне goggle pagespeed. Использовалась всевозжная оптимизация начиная со шрифтов и заказчивая скриптами. + li А также хорошая масштабируемость и легкая поддержка проекта, поэтому активно использовался бэм и максимальное количество шаблонов, чтобы не нужно было править несколько видов шаблонов. + li Большое количество ajax запросов. + li Yandex map api на странице корзины. По выбору точки доставки (из выпадающего списка) - строиться маршрут, вычисляется цена доставки. + li Было потрачено на весь frontend около 350 часов (работы было очень много) + ul.item__subitems + li.item__subitem + a.item__subitem-title.default-link(href="https://instrument.ms/" target="_blank") Главная страница + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/index.webp" type="image/webp" class="lazyload") + img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/index.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://instrument.ms/checkout" target="_blank") Корзина + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/cart.webp" type="image/webp" class="lazyload") + img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/cart.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://instrument.ms/ruchnoi-instrument/krepezhnyi-instrument/zaklepochniki-steplery-dyrokoly" target="_blank") Категории + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/category.webp" type="image/webp" class="lazyload") + img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/category.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://instrument.ms/compare/list" target="_blank") Сравнение + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/compare.webp" type="image/webp" class="lazyload") + img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/compare.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://instrument.ms/transportnye-sredstva/kvadrotsikly/tm-irbis/kvadrocikl-irbis-atv-125" target="_blank") Карточка товара + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/product.webp" type="image/webp" class="lazyload") + img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/product.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://instrument.ms/services/moskva/abac" target="_blank") Пункты выдачи + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/storage.webp" type="image/webp" class="lazyload") + img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/storage.png", alt="" class="lazyload") + li.item__subitem + a.item__subitem-title.default-link(href="https://instrument.ms/reviews" target="_blank") Отзывы о магазине + picture.item__subitem-picture + source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/shop-reviews.webp" type="image/webp" class="lazyload") + img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/shop-reviews.png", alt="" class="lazyload") + //-li.portfolio__site-item.item + //- .item__title-wrap + //- a.item__title(href="https://visualyuki.github.io/snake/dist/index" target="_blank") Игра "Змейка" + //- //-img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../svg/studio-comforta-logo.svg" alt="" style="width: 80px") + //- .item__desc + //- ul + //- li Использовалось: webpack, MVC паттерн, классы. + //- li Написан на дивах, а не на canvas)) + + //- li + //- a.default-link(href="https://github.com/VisualYuki/snake/tree/master" style="display: inline" target="_blank") Ссылка на исходники + //- ul.item__subitems + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://visualyuki.github.io/snake/dist/index" target="_blank") Главная страница + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/snake/snake.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/snake/snake.png", alt="" class="lazyload") + //-li.portfolio__site-item.item + //- .item__title-wrap + //- a.item__title(href="https://newlk.vdkanal.ru/" target="_blank") Личный кабинет водоканала + //- img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/logo.png" alt="" style="width: 130px;") + + //- ul.item__subitems + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/login" target="_blank") Регистрация + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/reg.webp" type="image/webp" class="lazyload") + //- img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/reg.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/" target="_blank") Главная страница + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/index.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/index.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/indications" target="_blank") Показания + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/indications.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/indications.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/statistics" target="_blank") Статистика + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/statistics.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/statistics.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/profile" target="_blank") Профиль + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/profile.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/profile.png", alt="" class="lazyload") + //-li.portfolio__site-item.item + //- .item__title-wrap + //- a.item__title(href="https://ym.palax.dev" target="_blank") Япономания + //- img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/logo.png" alt="" style="height: 40px;") + //- ul.item__subitems + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://yaponomaniya.com/" target="_blank") Главная страница + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/index.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/index.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://yaponomaniya.com/assorty" target="_blank") Каталог + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/catalog.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/catalog.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://yaponomaniya.com/assorty/sakura-new-" target="_blank") Страница товара + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/product.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/product.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://yaponomaniya.com/reviews/" target="_blank") Отзывы + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/reviews.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/reviews.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="https://yaponomaniya.com/cart/" target="_blank") Корзина + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/cart.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/cart.png", alt="" class="lazyload") + //-li.portfolio__site-item.item#shizhma + //- .item__title-wrap + //- a.item__title(href="http://shizhma-new.shizhma.com/" target="_blank") Шижма (WordPress) + //- img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/logo.png" alt="" style="background: black; padding: 3px; width: 40px") + //- .item__desc + //- ul + //- li Сайт полностью сделан мной (верстка, натяжка, заполнение контентом) + //- li Весь контент добавляеться через админку WP + //- li Есть обратная форма связи ( на почту) + //- li Страницы событие (летнне, зимнее, осеннее) сделаны в виде шаблона + //- li Live страница поддерживает трансляцию с youtube при указании id канала. + //- li По итогу заказчик сайт забросил, а на боевом лежит версия, которую мне сказали переделать ... + //- ul.item__subitems + //- li.item__subitem + //- a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/" target="_blank") Главная страница + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/index.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/index.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/results/" target="_blank") Результаты + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/results.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/results.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/contacts/" target="_blank") Контакты + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/contacts.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/contacts.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/players/" target="_blank") Участникам + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/living.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/living.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/live/" target="_blank") Live соревнования + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/live.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/live.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/лыжный-марафон/" target="_blank") Зимнее событие + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/snow-event.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/snow-event.png", alt="" class="lazyload") + //- li.item__subitem + //- a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/кросс-кантри-веломарафон/" target="_blank") Летнее событие + //- picture.item__subitem-picture + //- source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/summer-event.webp" type="image/webp" class="lazyload") + //- img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/summer-event.png", alt="" class="lazyload") section#skill.skills.section-margin .container h2.section-title Навыки @@ -312,516 +769,66 @@ block page-content li.skills__item.item .item__title-wrap img.item__icon(src="../svg/sass.svg" alt="") - span.item__title scss/sass/less - p.item__text Изучил CSS препроцессоры. Научился использовать переменные, миксины, вложенность, циклы, импорты для ускорения верстки сайта. - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/pug.svg" alt="") - span.item__title Pug - p.item__text Изучил шаблонизатор для html. Научился использовать циклами, переменными, блоками, импортами, инклюдами, миксинами. - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/yandex.svg" alt="") - span.item__title БЭМ - p.item__text Изучил методологию верстки - BAM-naming. Научился стандартному наименованию классов и разделению ответственности между блоками, а также конецпции блок, элемент, модификатор. - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/email.svg" alt="") - span.item__title MJML - p.item__text Изучил фреймворк для верстки писем. Научился использовать тэгами и стилями. - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/location.svg" alt="") - span.item__title Yandex map api - p.item__text Изучил api яндекс карта для создания взаимодействия пользователя с картой. - h3.l-subtitle Остальное - ul.skills__items - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/programming.svg" alt="") - span.item__title Программирование - p.item__text Изучил паттерны проектирование. Применил skeleton, chain of responsibility. Изучил принципы программирования DRY(don't reapet yourself), KISS(keep it simple, stupid). - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/git.svg" alt="") - span.item__title Git / Github - p.item__text Изучил систему контроля версий. Научился пользоваться git bush для локальной работы с проектом и github для хранния проекта на удаленном сервере, а также коммитить, пушить, мержить, работать с ветками, стэшить и изучил pull request и fetch. Использую gitlab и github - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/english-language.svg" alt="") - span.item__title Англ. язык - p.item__text Свободное чтение документаций к плагинам, фреймворкам, а также любая информация в интернете. Документацию стараюсь читать только в оригинале. В планах свободное понимание английской речи в видео. - li.skills__item.item - .item__title-wrap - img.item__icon(src="../min-img/skills/scrum.png" alt="") - span.item__title Agile (scrum) - p.item__text Изучил методологию гибкой разработки. Работа по спринтам, ежедневные обсуждение. - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/figma.svg" alt="") - span.item__title Figma - p.item__text Изучил инстурмент для создания дизайна сайта. Изучил работу с текстом (стили текста), с цветами (стили цветов), а также компоненты, группы и фреймы. - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/skills.svg" alt="") - span.item__title Доп. инструменты - p.item__text Phpstorm, Webstorm, Open Server, VS CODE, FTP, SSH, Yandex map api, С# - li.skills__item.item - .item__title-wrap - img.item__icon(src="../svg/book.svg" alt="") - span.item__title Книги - p.item__text "Совершенный код" - Стив Макконнелл, "Идеальный программист" - Роберт Мартин, "Как устроен JavaScript" - Крокфорд Дуглас - section#portfolio.portfolio.section-bottom-margin - .container - h2.section-title Портфолио - ul.portfolio__site-items - li.portfolio__site-item.item#npm-plugin - .item__title-wrap - a.item__title(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" target="_blank") NPM плагин для валидации полей формы. - .item__desc - ul - li Документация на vitepress - li Ссылка на npm пакет - li Почти 100% кода покрыто тестами. (coverage около 95%) ссылка на файл с тестами - li Присутствует локализация сообщений. (нужно пока самому добавлять) - li Практически полная проверка типов передоваемых от пользователя (params, config). - li ссылка на репозиторий
- - ссылка папку с исходниками - li Технологии: ts, jsdom, vitest, vite, vitepress, - li - | За основу взят jquery-validation - ссылка на документацию - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link() Демо форма. - a(href="../min-img/portfolio/input-validation-next/1.png" data-fancybox="input-validation-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/input-validation-next/1.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/input-validation-next/1.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Документация: главная страница. - a(href="../min-img/portfolio/input-validation-next/docs-index.png" data-fancybox="input-validation-docs-index") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/input-validation-next/docs-index.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/input-validation-next/docs-index.png", alt="" class="lazyload") - li.portfolio__site-item.item - .item__title-wrap - a.item__title(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" target="_blank") Браузереное расширение - блокировщик рекламы во вконтакте. - .item__desc - ul - li Технологии: ts, sass, chrome api. - li - ссылка на гит - p Установка: 1. Скачать репозиторий. 2. Зайти в browser://extensions/ 3. Выбрать режим разработчика (верхний правый угол). 4. Кнопка - загрузить расширение и выбрать скаченную папку с github'а. - li Иконка меняется на серую, если во вкладке не открыто вконтакте. - li Popup открывается, только на домене вконтакте. - li Выбор в popup блоков, которые нужно заблокировать.(Реклама, рекомендации, вложенные посты) - li Выбор опций сохраняется в chrome.storage.local. - li Вконтакте скрипты не видят блокировку рекламы, поэтому последствий не должно быть. - li Далее можно увидеть заблокированные блоки, а также вид самого расширения. (Картинки кликабельны) - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link() Расширение активно. - a(href="../min-img/portfolio/chrome-extension/icon-ena.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/icon-ena.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/icon-ena.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Расширение заблокировано. - a(href="../min-img/portfolio/chrome-extension/icon-dis.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/icon-dis.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/icon-dis.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Popup интерфейс с опциями. - a(href="../min-img/portfolio/chrome-extension/popup.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/popup.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/popup.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Блокировка рекламы под списоком. - a(href="../min-img/portfolio/chrome-extension/ad-all.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture(style="height: 300px") - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/ad-all.webp" type="image/webp" class="lazyload" ) - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/ad-all.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Страница музыки. - a(href="../min-img/portfolio/chrome-extension/ad-music.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/ad-music.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/ad-music.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Блокировка рекламы в новостях. - a(href="../min-img/portfolio/chrome-extension/ad-news.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/ad-news.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/ad-news.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Блокировка рекомендаций групп. - a(href="../min-img/portfolio/chrome-extension/re-g-news.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/re-g-news.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/re-g-news.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Блокировка рекомендаций друзей. - a(href="../min-img/portfolio/chrome-extension/re-news.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/re-news.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/re-news.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Блокировка вложенных постов. - a(href="../min-img/portfolio/chrome-extension/nested-posts.png" data-fancybox="chrome-ext-1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/chrome-extension/nested-posts.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/chrome-extension/nested-posts.png", alt="" class="lazyload") - li.portfolio__site-item.item - .item__title-wrap - a.item__title(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Сайт по продаже пиццы на Laravel + Vue.js. - .item__desc - ul - li Технологии: laravel, apache, mysql, php, vue, vue-router. - li Реализована домашняя страница с пиццами, которые можно добавить в корзину - li Реализована страница корзины с добавленными туда пиццами и оформлением заказа. - li Реализована страница заказов для каждого пользователя. Идентификация храниться на backaend (db) и на frontend (localstorage) - li Админка с продуктами, которые можно редактировать и добавлять. - li Админка сделана на основе AdminLTE 3 - li Изображение кликабельны (откроется модалка) - li - ссылка на гит - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link() Главная страница - a(href="../min-img/portfolio/pizza-site/home.png" data-fancybox="images1") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/home.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/home.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Корзина - a(href="../min-img/portfolio/pizza-site/cart.png" data-fancybox="images2") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/cart.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/cart.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Заказы - a(href="../min-img/portfolio/pizza-site/order.png" data-fancybox="images3") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/order.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/order.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Админка с продуктами - a(href="../min-img/portfolio/pizza-site/admin-products.png" data-fancybox="images4") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/admin-products.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/admin-products.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link() Админка с редактированием продукта. - a(href="../min-img/portfolio/pizza-site/admin-product-edit.png" data-fancybox="images5") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/pizza-site/admin-product-edit.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/pizza-site/admin-product-edit.png", alt="" class="lazyload") - li.portfolio__site-item.item + span.item__title scss/sass/less + p.item__text Изучил CSS препроцессоры. Научился использовать переменные, миксины, вложенность, циклы, импорты для ускорения верстки сайта. + li.skills__item.item .item__title-wrap - a.item__title(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Клон маски ввода (maska) - .item__desc - ul - li Технологии: vue3, ts, vite, jest, vitest, - li За основу взят плагин maska и адаптировал под себя. Отличительная идея в том, чтобы добавлять _ для всех невведенных символов. - ссылка на плагин - li Реализованы 3 класса: directive.ts - класс для работы с vue директивой, mask-input.ts - класс для работы с HTMLInputElement и mask.ts - класс для работы с маской по входному значению. - li Добавлены unit тесты для класса mask (jest) - ссылка на файл - li Добавлены интеграционные тесты для класса mask-input (vitest, testing-library, jsdom) - ссылка на файл - li Репозиторий с проектом. - ссылка на гит - li.portfolio__site-item.item + img.item__icon(src="../svg/pug.svg" alt="") + span.item__title Pug + p.item__text Изучил шаблонизатор для html. Научился использовать циклами, переменными, блоками, импортами, инклюдами, миксинами. + li.skills__item.item .item__title-wrap - a.item__title(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" target="_blank") Кастомный datepicker на vue3 - .item__desc - ul - li Технологии: vite, vue3, typescript, bootstrap, element-plus, fs-date, - li - ссылка на гит - - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/custom-vue3-datepicker/dist/" ) Главная страница - a(href="../min-img/portfolio/vue3-datepicker/index.webp" data-fancybox="images15") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue3-datepicker/index.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue3-datepicker/index.png", alt="" class="lazyload") - li.portfolio__site-item.item + img.item__icon(src="../svg/yandex.svg" alt="") + span.item__title БЭМ + p.item__text Изучил методологию верстки - BAM-naming. Научился стандартному наименованию классов и разделению ответственности между блоками, а также конецпции блок, элемент, модификатор. + li.skills__item.item .item__title-wrap - a.item__title(href="https://visualyuki.github.io/canvas-paint/dist/" target="_blank") Canvas paint - .item__desc - ul - li Технологии: canvas, typescript, vite, mvc, svg. - li простые svg иконки сделал на чистом svg - li - ссылка на гит - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/canvas-paint/dist/" ) Главная страница - a(href="../min-img/portfolio/paint/home.png" data-fancybox="images10") - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/paint/home.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/paint/home.png", alt="" class="lazyload") - li.portfolio__site-item.item#vue-social-network + img.item__icon(src="../svg/email.svg" alt="") + span.item__title MJML + p.item__text Изучил фреймворк для верстки писем. Научился использовать тэгами и стилями. + li.skills__item.item .item__title-wrap - a.item__title(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Социальная сеть на vue.js. - .item__desc - ul - li Технологии: vuetify, vue-router, vue-cli, typescript, vuex, sass, vue-i18n. - li Поддержка авторизации польователя через localstorage. А также поддержка роутинга при условии авторизации пользователя. При повторном открытии вкладки приложение, авторизованный пользователь сразу получит страницу профиля, иначе страница авторизации. - li Валидация всех форм через vueitfy. - li Поддержка локализации (не везде) - li Код проекта можно посмотреть тут: - ссылка на гит - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Регистрация - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/registration.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/registration.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Авторизация - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/auth.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/auth.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Профиль - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/profile.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/profile.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Профиль (мобильная версия) - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/mobile-profile.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/mobile-profile.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-social-network/dist/index.html" target="_blank") Сообщения - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vue-social-network/messenger.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vue-social-network/messenger.png", alt="" class="lazyload") - li.portfolio__site-item.item#minesweeper + img.item__icon(src="../svg/location.svg" alt="") + span.item__title Yandex map api + p.item__text Изучил api яндекс карта для создания взаимодействия пользователя с картой. + h3.l-subtitle Остальное + ul.skills__items + li.skills__item.item .item__title-wrap - a.item__title(href="https://visualyuki.github.io/vue-minesweeper/dist/index.html" target="_blank") Сапер на Vue.js - .item__desc - ul - li Игра сапер при использовании данных технологий: vue.js, vue cli, vuex, typescript. - li Код проекта можно посмотреть тут: - ссылка на гит - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/vue-minesweeper/dist/index.html" target="_blank") Главная страница - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/minesweeper/index.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/minesweeper/index.png", alt="" class="lazyload") - li.portfolio__site-item.item#custom-jquery + img.item__icon(src="../svg/programming.svg" alt="") + span.item__title Программирование + p.item__text Изучил паттерны проектирование. Применил skeleton, chain of responsibility. Изучил принципы программирования DRY(don't reapet yourself), KISS(keep it simple, stupid). + li.skills__item.item .item__title-wrap - a.item__title(href="https://visualyuki.github.io/custom-jquery/dist/index" target="_blank") Собственный jQuery - .item__desc - ul - li Реализация частоиспользуемых методов в библиотеке jQuery нативным js (typescript) - li Реализованные методы:
- code - | addClass, removeClass, toggleClass, hasClass, each, on, attr, data, removeData, removeAttr, hide, show, css, val, append, closest, sliblings - li Есть сгенерированная документация при помощи tsdoc
- | Посмотреть можно тут: - ссылка на сайт - li Код проекта можно посмотреть тут: - ссылка на гит - li Протестировать можно в консоли. Например ввести в консоли: $(".text").removeClass("text") - li - | Код методов можно посмотреть тут: - ссылка на гит - li - | Реализовано тестирование методов при помощи ts-jest и jsdom
- | Код тестов можно посмотреть тут: - ссылка на гит - li Реализован паттерн chain of responsibility, поэтому можно писать: - code $(".text").removeClass(".text").find(".child") - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/custom-jquery/dist/index" target="_blank") Главная страница - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/custom-jquery/index.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/custom-jquery/index.png", alt="" class="lazyload") - li.portfolio__site-item.item#instrument + img.item__icon(src="../svg/git.svg" alt="") + span.item__title Git / Github + p.item__text Изучил систему контроля версий. Научился пользоваться git bush для локальной работы с проектом и github для хранния проекта на удаленном сервере, а также коммитить, пушить, мержить, работать с ветками, стэшить и изучил pull request и fetch. Использую gitlab и github + li.skills__item.item .item__title-wrap - a.item__title(href="https://newlk.vdkanal.ru/" target="_blank") Инструмент - img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/logo.png" alt="" style="width: 130px;") - .item__desc - ul - li Задача была переписать весь frontend старого сайта, с новым дизайном. - li Главной задачей заказчика стояла быстрая загрузка сайта, поэтому все страницы находятся в зеленой зоне goggle pagespeed. Использовалась всевозжная оптимизация начиная со шрифтов и заказчивая скриптами. - li А также хорошая масштабируемость и легкая поддержка проекта, поэтому активно использовался бэм и максимальное количество шаблонов, чтобы не нужно было править несколько видов шаблонов. - li Большое количество ajax запросов. - li Yandex map api на странице корзины. По выбору точки доставки (из выпадающего списка) - строиться маршрут, вычисляется цена доставки. - li Было потрачено на весь frontend около 350 часов (работы было очень много) - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://instrument.ms/" target="_blank") Главная страница - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/index.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/index.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://instrument.ms/checkout" target="_blank") Корзина - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/cart.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/cart.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://instrument.ms/ruchnoi-instrument/krepezhnyi-instrument/zaklepochniki-steplery-dyrokoly" target="_blank") Категории - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/category.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/category.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://instrument.ms/compare/list" target="_blank") Сравнение - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/compare.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/compare.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://instrument.ms/transportnye-sredstva/kvadrotsikly/tm-irbis/kvadrocikl-irbis-atv-125" target="_blank") Карточка товара - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/product.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/product.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://instrument.ms/services/moskva/abac" target="_blank") Пункты выдачи - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/storage.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/storage.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://instrument.ms/reviews" target="_blank") Отзывы о магазине - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/instrument/shop-reviews.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/instrument/shop-reviews.png", alt="" class="lazyload") - li.portfolio__site-item.item + img.item__icon(src="../svg/english-language.svg" alt="") + span.item__title Англ. язык + p.item__text Свободное чтение документаций к плагинам, фреймворкам, а также любая информация в интернете. Документацию стараюсь читать только в оригинале. В планах свободное понимание английской речи в видео. + li.skills__item.item .item__title-wrap - a.item__title(href="https://visualyuki.github.io/snake/dist/index" target="_blank") Игра "Змейка" - //-img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../svg/studio-comforta-logo.svg" alt="" style="width: 80px") - .item__desc - ul - li Использовалось: webpack, MVC паттерн, классы. - li Написан на дивах, а не на canvas)) - - li - a.default-link(href="https://github.com/VisualYuki/snake/tree/master" style="display: inline" target="_blank") Ссылка на исходники - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://visualyuki.github.io/snake/dist/index" target="_blank") Главная страница - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/snake/snake.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/snake/snake.png", alt="" class="lazyload") - li.portfolio__site-item.item + img.item__icon(src="../min-img/skills/scrum.png" alt="") + span.item__title Agile (scrum) + p.item__text Изучил методологию гибкой разработки. Работа по спринтам, ежедневные обсуждение. + li.skills__item.item .item__title-wrap - a.item__title(href="https://newlk.vdkanal.ru/" target="_blank") Личный кабинет водоканала - img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/logo.png" alt="" style="width: 130px;") - - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/login" target="_blank") Регистрация - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/reg.webp" type="image/webp" class="lazyload") - img( srcset="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/reg.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/" target="_blank") Главная страница - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/index.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/index.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/indications" target="_blank") Показания - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/indications.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/indications.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/statistics" target="_blank") Статистика - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/statistics.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/statistics.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://newlk.vdkanal.ru/profile" target="_blank") Профиль - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/vdkanal/profile.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/vdkanal/profile.png", alt="" class="lazyload") - li.portfolio__site-item.item + img.item__icon(src="../svg/figma.svg" alt="") + span.item__title Figma + p.item__text Изучил инстурмент для создания дизайна сайта. Изучил работу с текстом (стили текста), с цветами (стили цветов), а также компоненты, группы и фреймы. + li.skills__item.item .item__title-wrap - a.item__title(href="https://ym.palax.dev" target="_blank") Япономания - img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/logo.png" alt="" style="height: 40px;") - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="https://yaponomaniya.com/" target="_blank") Главная страница - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/index.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/index.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://yaponomaniya.com/assorty" target="_blank") Каталог - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/catalog.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/catalog.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://yaponomaniya.com/assorty/sakura-new-" target="_blank") Страница товара - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/product.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/product.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://yaponomaniya.com/reviews/" target="_blank") Отзывы - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/reviews.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/reviews.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="https://yaponomaniya.com/cart/" target="_blank") Корзина - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/ym/cart.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/ym/cart.png", alt="" class="lazyload") - li.portfolio__site-item.item#shizhma + img.item__icon(src="../svg/skills.svg" alt="") + span.item__title Доп. инструменты + p.item__text Phpstorm, Webstorm, Open Server, VS CODE, FTP, SSH, Yandex map api, С# + li.skills__item.item .item__title-wrap - a.item__title(href="http://shizhma-new.shizhma.com/" target="_blank") Шижма (WordPress) - img.item__logo.lazyload(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/logo.png" alt="" style="background: black; padding: 3px; width: 40px") - .item__desc - ul - li Сайт полностью сделан мной (верстка, натяжка, заполнение контентом) - li Весь контент добавляеться через админку WP - li Есть обратная форма связи ( на почту) - li Страницы событие (летнне, зимнее, осеннее) сделаны в виде шаблона - li Live страница поддерживает трансляцию с youtube при указании id канала. - li По итогу заказчик сайт забросил, а на боевом лежит версия, которую мне сказали переделать ... - ul.item__subitems - li.item__subitem - a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/" target="_blank") Главная страница - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/index.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/index.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/results/" target="_blank") Результаты - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/results.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/results.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/contacts/" target="_blank") Контакты - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/contacts.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/contacts.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/players/" target="_blank") Участникам - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/living.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/living.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/live/" target="_blank") Live соревнования - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/live.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/live.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/лыжный-марафон/" target="_blank") Зимнее событие - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/snow-event.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/snow-event.png", alt="" class="lazyload") - li.item__subitem - a.item__subitem-title.default-link(href="http://shizhma-new.shizhma.com/кросс-кантри-веломарафон/" target="_blank") Летнее событие - picture.item__subitem-picture - source(srcset="../gifs/preloader.gif" data-srcset="../webp-img/portfolio/shizhma/summer-event.webp" type="image/webp" class="lazyload") - img(src="../gifs/preloader.gif" data-src="../min-img/portfolio/shizhma/summer-event.png", alt="" class="lazyload") + img.item__icon(src="../svg/book.svg" alt="") + span.item__title Книги + p.item__text "Совершенный код" - Стив Макконнелл, "Идеальный программист" - Роберт Мартин, "Как устроен JavaScript" - Крокфорд Дуглас + //-section#experience.experience.section-margin .container h2.section-title Опыт работы