From 673b597c58df0a1593df98a22e5f948fff1c6c0d Mon Sep 17 00:00:00 2001 From: Nick Randolph Date: Wed, 29 Nov 2023 16:47:28 +1100 Subject: [PATCH] feat: Adding counter tutorial --- doc/articles/Assets/counter-app.png | Bin 0 -> 14966 bytes doc/articles/Assets/counter-solution.png | Bin 0 -> 17176 bytes doc/articles/Assets/logo.svg | 137 +++++++ doc/articles/create-an-app-rider.md | 2 +- doc/articles/create-an-app-vscode.md | 2 +- doc/articles/get-started-counter.md | 328 ++++++++++++++++ doc/articles/get-started.md | 4 +- doc/articles/getting-started-tutorial-1.md | 103 ----- doc/articles/getting-started-tutorial-2.md | 418 --------------------- 9 files changed, 469 insertions(+), 525 deletions(-) create mode 100644 doc/articles/Assets/counter-app.png create mode 100644 doc/articles/Assets/counter-solution.png create mode 100644 doc/articles/Assets/logo.svg create mode 100644 doc/articles/get-started-counter.md delete mode 100644 doc/articles/getting-started-tutorial-1.md delete mode 100644 doc/articles/getting-started-tutorial-2.md diff --git a/doc/articles/Assets/counter-app.png b/doc/articles/Assets/counter-app.png new file mode 100644 index 0000000000000000000000000000000000000000..5173d391b3dcd84f7cdda7c515832a2775b04e20 GIT binary patch literal 14966 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

    IzEsmoTwXRqFj_5%d&tv7 z8Pt5B9rP&z$vJY>P~P2-)%q|~bhxOoOI6Di(oWKj`e-i?zhGWkFS_1RG_Mz3v}13l zpafqNzPvNLIB6Vj_&6bX9Zj5B0|UYp785WfeKAb+)7jl+rUUQ!pd}3TX4Y+oRyvKv zi`#SQ06~3S=v8DWVyA{Ttj|II(VCje_(Sj9{}APd@k#6;sSZr&iqL0-o)J@jdyG`vwN~0qY{A`6 z^4&o3N1jGS4)jg(Wl=%I=WcdBU#YLJ&&bG_;(a|km`H!~RRrESGVXE1!)CTnx=1GT zWy$q^Zo1S+45;LE@rfg~~(59}{xa;P9Z- zhl2XREMp)A1{7>VS?T*+fA!ZIec83zRIL88c#0Q*m4_0laumZes^7$?1tkIxtIJ9nP9 z4##6uI8Hx0$s?2%xU@Xtcr^Zi1aU9O5f8t{P?y>IOOwdim;0Dsq%n`XB2c>$C}aKY zT#fD`@n0!#g5}ouI`t=8cUvWeCF75ujbUhSwngDu_)K)L6qkakSqv%x>s*r#jpG96 z`Gc3DQiR^x2PhCNFkFPyhq+@isdC_HN=E_gf-kE*>%^UrA_*z zrZy#&CXC^wxw&aA*rA#`V*GCCDJ#TvWswwdI zf6Te2fv0>B&a|QbZ#A$Z$>WzH)Waa=3X-T_4w4j50udq+`my=kGikK6`=g$g`RmHx#h3PJwd<6r=_v ztJTCuS5Zh~rSM_>X(k)|65tGbpz9y}v==Xn_?3_$pbfZaM-yq(Nv8{?(?dg{@neYQ zy=hDUOPwzLzPff&O0S0B=t=H&NLC`?&Af*nC5M`ikL3)H>|FHR2M0me@#U)UhW1|f z>{QI4`XEd@v7RL2lW6_2scP|3035$(cmT7LqJ}_l-t5dghk}4`I^wU7-$FI-j=I9rSruL^m*ANvWqFCD5NoT15!!! zKH}TYX>9oOyf_m9A9`g$6}q^^_{ojwI#UMxW#;S~1??yaoFdE3U@ZrETr-`K*azz>s|@ClImH9kkzb~}`39iRk0VhjfMjeOYAf0{ z^!Y5$fvu_hCiA}9Ai@a5I1?(}2C}*5y-RsxUk5Hzn{?9eXGGedEkXm)=8(+HSl_L% zR$VaJG3S-V7z9pZ;i75J{9SW#gBS<(TUXgTy`9x5uM=_z=<^P*?i$!ZQb4f4&Xx=z zffu9`ffY^HjwAfUXZIsZ4&z;gvCpOv3@`!kpF`nZ{jllgmo$@#L8;;qvJeGiTV%Ml zeR){R>cR!Vy^6sGn88#ETE@}TaUe?rlLR6793x3*I4d5r{}YbuCA2^U)@z`w>|8Y- z_%+qX5((fVO|AE(T-XYzsRY`^A23Ps0~5rpjZmihGK+U}SG)XI(AYm>MGwuYwwvAhy%LjWJESFn$e5j;rM{JX{p) zG8!whr9?YzzL^;FBc51Y>t?gcI72Ip^4Uu-TOjRY$>0o9xSmj^>r1 zx$s*jI4*0P&7i}>uR|T3vb66wNxka5JbbQ}9SIkeuzdIU*1_UFcVuC5$@V(37h=YE zab8|kQ7Y>)2alxYFF?8aAiO+zLt|R$SudeaMPKX*L*RXPL;+S{C|3M<*rDu11g5ZDkz*|MMVuI98q7Lxu1Z`dx4G8|({ zL~eV|tNS$#ZN>MCBx)Il${OGD2kC);&O2#G4rZQ-C@@N#2n@BZDhhMzMV*!*@}Z{2A`9yd z5QHZ6dgzO&J?DcnwTmzLbTR6}r~7Gq88vsAh2XezW3gBT^W=@oDPyY#Oe*Z zbQg49r|GH9PbHU}##;i;&+VY0w2herg6i&SzHq1VIVAeoO-z1w5x+%2Tee#`w^b6* zil8M>zaq&`8bcBS%V~ktqiEe*OdqVcKIbLX$=M6ykzDmKnOL6TH1Q)N*yNr^k@hHr zbjXJy9;CjHvc@==T&qo9jqd|Q@%MFVIylzq<+@fO@?6PM&>XKAT;}uYWS8|Dw&`T( zRkSS?1Lq*o;7aeh^Plg#b(`MLkp$KGx`%MrM#U`O$>B4EZH-2TiCpkqC6GCSo749o zX=G{3e(xQ11^IC^<=LPgM-_OS``&w6<#`yvH~>?az9#M6aZyH*K`eS~a=bCwUMvWz z)lD1?sOd2?zg|PUxARh`>qo)JW#o#_yb4opp!3TwmKj5eLZ>vFtgwF_e*UFWeoi{b z{|aiJUnS_ClaR0&=^=MmYH^>r&jx>jO_5E}p7nMYkzD8M8-=z4(RBX#W+Ic98ncnOkuDeeB_w#p^@nJH@uw8BrnbQL3Y>Ry$tVtG3gu zeH$qQ-1-=jFMO@I3Sq2xdbYoA@?EV@n_`Wz|dJ3Q;;t5*bH&IO!yRJm>Wy*wG*IE8QfyQO3{FDtSLsNPNx@Sk>IXePvP? zpM)10$=K?jFdF(seJb@rSa6sI*|*`Qodos8I(l)ndBnPS;#cGvilL~4vcLRfraGt)fyv4oM#MV!^Gd7TMq0aZG%-(VX1v|9B`65f2sX65@5DN)6 zt|7iS87ppPKj~5pi)Ll1i&wS-v4>+#Ls=}o;!@D6RSydrek;2p(x-B%Z;vLZld*Pk z6C+GNM@(e*M*cn+%4Ii>ng=!1{1aXV^$VV6R#Ji`(-M+i~9MM5=i4w@nJX? zE3v7kruB+Pyd+xQ#CUeEI!L|+A7-Tk2Cup2h!j$`pXGQlv8XaWin zpEP^)t3C$XO6?tnAo)Z-p?o%J`L~g3M<;h%d~u&bdIXOa$N_yxpcI(tvLHA$oo6hG zudI9I2y(qTIWsB|nOj+^fQ5%Gf^3VM=45>#??_g;9g*etU|L z?_f*R5ocp%>TIZK?X>bpV5ik))u}1aC!6BfCtyO2{Uwgwvn1K#`b+Tw+%Gtd4YKW_Pw zu~;sY6L|zwPtM008DXzEAwMlZpoJYc=*v?Bfdl);SI79a*DZ+wX@ z;n;pZeK4)yd(U!`shE8dT5=NXrM)7#KDl1ey+7e?(qXD@2;d3~>{mwCQy1FwX#zd| zuRc#I+vO#n}-C5<^o1Im)cB_)W^(0d@S0Ld*6V(B#2 z#Yb#Ia!oGzyOrj8a zKS+Rzt{xkM2(sQ*q)K#0y zJnO@-_|=`lp1vTe3HGJ=1)9#KN0rc{T=wbw{UI_b?0={C=Y1jFpF$rcsnC+a8Fk=| zq?asVKtTLLqLXS=6jz>V{&uf0&rA_fyqc9kY);KTc|Y(3^_utOegvnK4F$pfL>lM- z0tYDKzuAEQZHT9#vnX;7(5@*X4@S~x(qx%-(`W(0Mm&&0VociR@ggftycF}{IIUCb zb%~Xb{;nhlw?-9(g=v=@{+=x|OJ}+@@u-|dG2_hZ@x=L4>D zE3>QQx!A5e_ZBb+InN2(1bifoo}x8|w~#_Ddg#~ACsU|6BDdz@aV=Vd%ZZhPRGN|w zQT0=cBTDkWe&xxnq;4^#M<%(~g3}dyp4cZJhQK2{9tsTR2%GlUm9l5zwi&zWWO~v~ zz?*mJ82}hj6Yn{M=P6_@^T$vgy2dx#GxpE&D#HYLRen7x36*oyk2}n)A8N6VpcnplH8uD6#Jp4{ns0)?>!emhlgDt%_XdMW^rL8%`IiD98r|rn>v? z5lh&#drOPLW($&F1{_~9X}%dp&y!W7!yuHX(SM@v#n&}QK%E841h4xw=pvj)p?#rM z+iPWf^SnLWe`OZ!d@N#27sXJ%^h*)7$4~eu6>two{gF%}Zjpn-x@D0q(9>JlQF~kl z#3s?GMlBprJBV`)!MiQ2#Ym#ltva!Vn`L&3TY@*J;fd}v#_5J7^h513bM}H{ zK($wAUGNkiUQHpSfzgZ{(;wwg2`!Wa&mS6u2^mtP-|R$?(K;DvwC$)l7}M}TX~X+V zCQPpLJe6`qnP|YG@5NcXE}&MMdL4Z2F2SXv++Y;4?LKLSar zNj}SdH9ypSRY=EEKW7FekoKv+T_) zruGKx&kQi^`;-h%REz#;$Vn+0E&lC!g)CfjW*T|&5f$__#tI6S`~AYA#%7DC-S9bV z0A}ATKT(cJl1ILWXp)vLm@dED>vx9D)m4gVWf(WyGl8$_S7^UT&nW39bd+P$wnDWK z+e^}5JFCFyIY<9gk~RN?>^>V(sMPu7bnc6vvch-U>m>@U8Dfn~qDxr&c~#_~zu7X+ zi&4|MRa77=8$L%zVi)_3bac<8vb4ND0;zU>h`afy_-mwwV4cZ?78_WO@~sLS@fRE1 zw%hkV&tRM!SNO{7Iq;3(oUVvQ=~RIsRF>@4l@C-z$-$g;Tc%5U9P6T~RDAQs1-SzA zd*>iM^5OpW2@Qpl2|XTvj^Z15+FV-9AS?OQg*?F-RBd*w;QD3ch9dse@Bd#5sFdy6 z&A%$(MB0CFJ{_R>8GnW)Vw@?Cgtk`RLF!QFr8ypUB5jFPpSwXikYkw{!-Nj8;OgmK zewnv!=YQ(Yn)9cOt)M{$ry9P~&zX)0XFi=@&C$wDBW}OnT+x`EQ1=JAze!7KW;iLb zp@Bo08DwWv;U%6Q<5RPHyi^9SB2FFfEy+9~GTiefh({U|1w)do0#3uqnf^J*2$t(? zUdfg9Ur@+(l*~f(+i;EbqvkPUVLm6=t7!aC8lSk)LPqOturca!zS&#^&XO;7Gri_5 z&OJGnj){bsw>~3MIx#}|JSK{8Vj)7kB}`>H$n?^DdT<==!AUn^r>m*Dm>xhgAIlZp(xZ<_$7=hv}D>#a?bw29XObJkd~FZP(!e49YgagS4wzWc}h*uG?y6>;<0PV-jL0GbHhmB*?}}_75N|7BIyd zd&OmJeKW&Pxu=TigTWi6!Dt!8STRz;zvsM4rPNWXLV9t-`)5b&Atm?Zc>$$t@*T&g zz;W=cqeBK}2xt)C$o~(FsQr0EzCQ;9lRo1R#EH}KsJUqm4VV*XQoN7xMO6oYNMzs zacJ&eB6K};CllYTR|Gw590H8qz?g>HWe|$l`tn3@RgrShT3pWe;~!2+WlQLbeA%O% zMaL`Q7RdVtk~6uzZj>;rsvVBRmb)JDYS-T0C&)l>6l{Rxmbz5UMXAX}R8FFlzesAf zq{P1<1;h>q2>114Cle|>*t- zBzJ6ce@`}#ee8kcLSAdWwBH`FY+7@tku`;wC}w+>11a^kHSLfoLPFOoCL|zDq50mE zyJA4zz*spCQ#dS}t42)#40wRaR=t(A@V4sVhX;w(b?m3kXT#Ln6wtGW7Tik@(p`66 zwdT&mNmH%y-`d~+E|#(%5g5)g=^(au zV>Zzr=i3QbpZ$J#mdSS^bozQjEkbWZH@53d(rHW07U#um;=b@0Gvst%n%f`=*5Z=r z5mDz<*5_o`YPdM^XDqUVhJo18EZhNe;X6m#JB;$t9fcMx!MQ7$dlRL>KeDpAyC91ANEQtaCdHo6QJ^veqO(&e z+GhxbqU$a;Wd{XRNR6$(m$#ph`XIT;s5*#H5v`Z5=;yr6+uEEgKN$N%u2-;KtA182 zH(%bIHyypWTr)!ldzp5=Ut{()f1K-h!Qw&o|4kE}-?_IY?6g;2SvT#E6h3mt@HAL; z87pbhK=L4|Ur=+VZ%o^4)p_yhHL*+pYY?h1gco~yLH;%IOv0X*28-!^@ ztsjR#9$PQK$&{QP`n8`>{l~WoZc?YI`jeip^m8iGHp&M({QXi4%@M>%U#0jMR_$Y9{sR9y*78q_dO)rHaIBe7b@?E0J9AM@N_h$``x3r0K zEA%J&p3IuTsr{p!i!*ShSK4z5UnA{p;^Nu}4_23a|AIK~84{oH3*?{Ab``dTH#l?Pj?pcR7|8RyGz2svBE4TTpUf0cbdAz;awUUb^KnD>K@8g_O9E*&weoZN+tKv?}kd;QKx(yymKzhP~5}RS2Qn91||mpv#oIBpzY7|iR$7%SE{)$tw;wuF0%A~ z4~f<)8tPcoF@^3B*rYM^zDMhUHqGSMYv{jRSUKSZf z&nsv0F|eF5!R{DohtvPqny-VU4Xl3rp(C5v2a+pOi>1Zhf&TXxymxVz*Y}_c`iDVrv#JAEg48;Qmp-E|XQerr zNHyIP5YKxL=%+@Z373xa*iEi@I1Pcp+8*)HOifAtjNhb9Y!{!j%TbM@L2rGrY};}< zC|r_?C%#dbDhJi%(d-cLft?`ZGM?VW--Ig&1xi~nj^_m8amO+_76as(L|Yq5nZ&+9 zt=MDX^N$3yA&#<-bdc|lp}c0>KeSSOSHtwce=s0>K}EPW#?}dRDP;rE@<6LWljbvY z#>=qwTMA3o1odBnp>{&2*lL87WGb_u z(Cyku+J<8TCXc^0H2fmZ(+3uetgQ1eXcR!2?d!lPmB(v2t;`ZT=x<6#L`Zmb^@nLe zO#+wifDm{E$iL@fXS>!06RMc8Or_X0Lj3>MivA*(dHBw5=h8IXpJ!^F6#mhBp4dPZ zkcsuljRl6p4mam&zAH~Wwy8yC%`E|mfn|FPYIR?23mMPSOzi&~2PWYUM>H_sYg^h# zIC-ruc$yoASoI{!|E;L&*`;3V!W>`3A(Xjx?kPiTQGxZHmhR7Kx@s6_BF7*;{2*77 zm4-kwm+}q{!x!`=y~C32n(7Hj>EQF*smDj3dWKasCfwm4h`$6U)==@Op5;eJj8Nt3 zjA~kxX(6j0>vnEZste*AMLtJ~q2d$Hc0;lMF}kg_m2@Oq}* zSWq?_FhZPdLWRQdk8)?|cqo>hwpiBYN8-g9noyif7knrMrdgGc{f1SdOHBnwj|<8t zmxCzrd4s190d{gv8bWa=5j-!61Iv>jm*z|(pf!%aX_#I=hNatGx zUq(F_=$u9yGj1n5b=>-8jueVBg*Tl_O6YPJcBKIvb7Je7j~5pAY+NFZ#QH2oD3li- zrJ)3xb!=E+!}m@Eo9jL!rktBD1d$J@aolQZJa{L;YbV5)?B!%P8@kwsiY6~u&za4k zYH4}ghX1noJGbM4q+IeLTv!5sg<-o#4dG&J93|c1_t-dleH7nhs@I??7 zn%!aF26VJmjd-nMP%$gL4&zogp%%l3J5%h4}7vdJvtdRjlry>b}z9^$6 z%&-)sIZl0yG~{sd(GQq{!9Vq6&3PM+C?`0=DAI-Wgr1=>S=v$t6Gky60>;|~&=Qml zk`?I|OKiAu4hy^;xX7GHs!SSS@F*HPA6?Br*S zjA{nGcoLnlC3ye~}{v@&wMUqo4h1adwdT=<^6Vsl=x7^K@<$J#(kjq&7L z2ZoYOsiLMfzMx7xC=f-iDa)@x{ti4s@dkW&6rHRj>Y=Kley3K5xJrvuCRc(u%kr;e z+L_UlG?E3QFe>@M65)S?pDQqzZsdKRI+K!V?U4*?wlk!P9c(wzzp243$P@pp48IfQYBhS2Y%>FN_{qH+f(QtUsFE_mR) zUOoMQ7R30X8Zf5rYBg;%lWgB#oEBL*i@GW^>NzSOXP^X`TL(KnX~WyEPb2YD1#a+I;TzP;s6~cU zXie*`kuOEscEK?rEax|sc}redwgFdw<*?ZVk9M8V+FD zo=ay70_o&=n)~g9Y!YPsNxS_ImF!pileN~d>I+!`qg#`SXtK=KhUE$jss^jW9|~lW zHjtUo)-4a@iDpS+{!)33@(~G!&u41gZIOc@(e78f!ecXQa}GMti@N4#88 zr{FNRqN+T*sv5VnV+J}2jNIjIaL751f<=O5p1Wea*$Qe7o2^F2^H>$%=FHs}eB_!< zE(INrc;vM92&w$pe})S=wKX~km7e_mZ)r#9;*B{{AkuyVQ#G3tk9=a1qbnzr!7Vm^~y}jSw{d98lxOFdDujXxel*smy$3fds!gZW8!-yPc9`W~P?$ z>gl6quh_`HjcSJWldj!@YDd{6EgOuuj6&10mB=u?e1}B6WD8t`*&+PwmL|R;V%?zW;iyKK15!zlOiftOLF!SP_Yb+ zIz#HGocr(jD)xUT`5uT6KPxAUAHOJlX_LBwQI|NtPSYmzY0Um}lSZavO`pCB9<%xTlm@e3@dR4U zR50;-hUHYo=H*lQjOGj4OAz#^l6&QHxhP%MoDOk)JJ9j zc$tJunr~+4TFXjrEi5!V3KtY5*1L^=0sq`WSo0~;XNhk8i(@6>`g&;vJrWG5HE+uo z)NK;i3Np`+=a0PJb-K&;*(zn4#-5MW&tV?tvruV6+u!bJ03=c(VX^E~ZHhn!S_zCF zWE2si6A2mps#FpcQiO~G{eLLbQEa?%bi0|0<+jGs$EwjoYdy;|LVe=kzwJ;fk|Pn5 zakHAceoqNT{?4H;hP$Rrz*5IKocscQ={e~6G~HvasH@fLDct29y}=vHcEDE&!)5<8 zJx3K!)ai1`%cs@F3yjOA&Gqi66)QGxLZ@~cn6LCQ{(^A@P-5n3(~DkP`s;eoLU`_!abj@Ew(6B_Wp9yv$n> zW%YmE|3+0{s=KowC>p5Fq}w6hu!5;9?+`CEl2Ck`nlpyb%p^D$KVnhvT+JW4){wL{ zK9>&2CATrrkc+aT{*xn&ZE|~p%+O~^*Hh5ImPoFePV|^5W%9OYQs*lE#gII>J}h-+ zW-VQ#&ooiuS&|I9hFnsrBxl}8&8RYMX7LJmN2hb?@1g|M-{;SqS?}j^6-tL`F^n=K z48+RRG&Ab{dfR*C)D-(`Lvx9dka~&qh?k3tnFH5A{d~f1&#>T7JK?q?l0&I#09Reu$WLQPMsJ;dVZx@sb}Rcu z1O~d#*x%X;@zkboC-drH`>v%Eu&CirV`*cbsGk3F+L~aTG70Cw`u# zr|~H4vzL@`DjAOf(QZ9;FuWwqzG&N%Y^m6Kya+b|MnM5nJ}HORYU)3NtAUurDH}4m zzwUaA>+gl|0-x_bitRweYJivREmW;4_(pS`gtY*$$46?$!r~2u^9g|ayOHa%lo{&8D&IWoF{IiM(_RUA{yE*w>7-V;s!hd zqqY;8h1BE@6MnU?%t?J^&7P#)MXpUum2&!O2n+HG9wP&A3x?33-r-8RKu=-W&!meH z0*)2?XHZchYJdCZUh7bDpfd0SDe5|daY;yT2fh`Dz`Q+d#d4rzuiwlWT23biH4T{6 zb8D3P6_(7Y1`<^^V!pwjST@S@TSHjs=V^VqpOXgd( zZaO$64U;^|fqFGDMPBlrMCSD%5xQLUIurUdKVXQaA%Az1d6YjG6=|ZCGmj0+LyxBt z-iI@vF#`a93Xr52_&L-oG%LvCROo+cMJUTspyEfq4aw zqFInc+XJm21p&IUBkYN@`2lE=0GB>La>##k*8k^n>3=n`b)quWb7(}i0j2A~P9gKW zzkj4XN?dc9y4aD~eHxkAn97*0pjq(UAPT-pNaxJ-hzrwfovk_v zu#9~$G4Q!w3(6Jxd=CGN%Vfl8oUeOzVZkyRU)shiPwdfa_IR?ImBsd_Sbk9w+76p} z@OWUjHM}?gVFxmvGT=_t!!ifV(j>wTpjiL> zAA1=dR~+B3*;L6U)nQgwRo^ax;JU6ZpQ&&gb*4*{F>gxl_?qapv(xJ3U7L~k@&&k+ zR^Im;tTi|L!2GYoLO)!esgBEbYqEZH$i{3C3DelMtI%XS`zG1#0y=e}3Rc!an=(IYwc<}R`xbw&VY4bS$(|5+tllv1!|4+@nxp=K= z706uQw$88AaAKQ}f%lHv)_#nmQRcim?ZXRJ@xQx{EH-HhF?7);9FTQkty2S5#1#(_ zjW4nje4(VHYo*HnFcu&3z;~xO$xWr;k`Y^HAJ(@e&+xgA*S?96*YvfYpiaq#=3hpfr62>x4m8@NL{o&fX zyo3AdVzY-rJVo2F-GhM9p{sa-l~h3rGSTqHamHR~4@Y1#o;)vh%_05H@2Wp$K``4} zUiB9dbo$)jsz^iq*IU%IOyT`}&ULnIAG-=|uA2?K1DqPyVB_tc^b_ov$gjZDs~48J zrVKYd9v;U*WxDZVLp9$GOisII-Gw6k+UwmMNxkIhpClDUl9baOv7CRWMeooQl1Xh; zmp!GK9T!Z)4k+?b`MA{I(3A}PcD6^t#sVC=SQ9GyU95_{B|t2~vUxk>S6NmG)@@tG}Y;N=8pQPqQE((uwyiRMC+eeoKKKR7A%EhRxK8cKlE4(3I@WB6Ln^%A*Xk}{ZmK~cs z=rD}S`E;bJ ztiGn2D>V3yvS?N4G~QZ{WuWa;)lrgllV2Y5L@X?NgxqagGczjj*!`07yEwHe_|*Ry zCT*3hQV?ijD$h;j6cgApb%)YfOv;n{HN3a3pJ(XKTokp>yKDo+8^S45KduwGE!Gh=tVOB}(k>-~v$ttKpAH+-3Ud`MA==e1t&RPhBi)3pq!@LOjhShz!-u+k-9FaqNW! n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/articles/create-an-app-rider.md b/doc/articles/create-an-app-rider.md index 0ec781676abe..2a33bf73abf3 100644 --- a/doc/articles/create-an-app-rider.md +++ b/doc/articles/create-an-app-rider.md @@ -1,5 +1,5 @@ --- -uid: Uno.GettingStarted.CreateAnApp.rider +uid: Uno.GettingStarted.CreateAnApp.Rider --- # Create an app with Rider diff --git a/doc/articles/create-an-app-vscode.md b/doc/articles/create-an-app-vscode.md index f2c2a0d89567..bf4e02316bdc 100644 --- a/doc/articles/create-an-app-vscode.md +++ b/doc/articles/create-an-app-vscode.md @@ -1,5 +1,5 @@ --- -uid: Uno.GettingStarted.CreateAnApp.vscode +uid: Uno.GettingStarted.CreateAnApp.VSCode --- # Creating an app with VS Code diff --git a/doc/articles/get-started-counter.md b/doc/articles/get-started-counter.md new file mode 100644 index 000000000000..6457a0923dc4 --- /dev/null +++ b/doc/articles/get-started-counter.md @@ -0,0 +1,328 @@ +--- +uid: Uno.GettingStarted.Counter +--- + +# Create a Counter App with Uno Platform + +[Download the complete sample](https://github.com/unoplatform/Uno.GettingStartedTutorial/tree/master/src/Counter) + +> [!NOTE] +> Estimated time to complete: 10 minutes + +## Introduction + +This tutorial will walk you through creating a simple counter application with Uno Platform. The application will have a `Button` that increments the counter, a `TextBox` where the user can enter the step size, and a `TextBlock` that displays the current value of the counter. + +![Counter App](Assets/counter-app.png) + +In this tutorial you will learn how to: + +- Create a new Project with Uno Platform using Visual Studio Template Wizard or the `dotnet new` command +- Add elements to the XAML file to define the layout of the application +- Add code to the C# file to implement the application logic using the Model-View-ViewModel (MVVM) pattern +- Use data binding to connect the UI to the application logic + +To complete this tutorial you don't need any prior knowledge of the Uno Platform, XAML, or C#. However, if you're a more experienced developer, you may want to skip this tutorial and jump straight to either the [SimpleCalculator](xref:Workshop.SimpleCalc.Overview) or the [TubePlayer](xref:Workshop.TubePlayer.Overview) sample. Both are more complex and will give you a better idea of what Uno Platform can do. + +## Create the Application + +To get started, we're going to use the Uno Platform solution template with the simplest set of options selected. The solution template can be accessed using either Visual Studio's New Project wizard or the command line. + +# [Visual Studio](#tab/vs) + +> [!NOTE] +> If you don't have the `Uno Platform Extension for Visual Studio` installed, follow [these instructions](xref:Uno.GetStarted.vs2022). + +- Launch `Visual Studio` and click on `Create new project` on the Start Window. Alternatively, if you're already in Visual Studio, click `New, Project` from the `File` menu. + +- Type `Uno Platform` in the search box + +- Click `Uno Platform App`, then `Next` + +- Name the project `Counter` and click `Create` + +At this point you'll enter the `Uno Platform Template Wizard`, giving you options to customize the generated application. For this tutorial, we're only going to configure the markup language and the presentation framework. + +- Select `Blank` and click `Customize` + +- Select the `Presentation` tab and choose `MVVM` + +- Select the `Markup` tab and choose `XAML` + +Before completing the wizard, take a look through each of the sections and see what other options are available. You can always come back and create a new project with different options later. For more information on all the template options, see [Using the Uno Platform Template](xref:Uno.GettingStarted.UsingWizard). + +- Click `Create` to complete the wizard + +The template will create a new solution with a number of projects. The main project is a class library called `Counter` which contains the application code. The other projects are platform-specific heads that contain the platform-specific code required to run the application on each platform. + + +# [Command Line](#tab/cli) + +> [!NOTE] +> If you don't have the Uno Platform dotnet new templates installed, follow [these instructions](xref:Uno.GetStarted.dotnet-new). + +From the command line, run the following command: + +``` +dotnet new unoapp -preset blank -presentation mvvm -markup xaml -o Counter +``` + +This will create a new folder called `Counter` containing the new application. + +If you want to discover all the options available in the `unoapp` template, run the following command: + +``` +dotnet new unoapp -h +``` + +Also, for more information on all the template options, see [Using the Uno Platform Template](xref:Uno.GettingStarted.UsingWizard) + + +--- + +At this point, the newly created application can be opened in Visual Studio or your preferred IDE. The following image shows the `Counter` class library that contains the layout (XAML) and business logic (C#) for the application. It also contains projects for each of the target platforms, and a Shared project that contains files, such as the application icon, that's used by all of the target platforms. + +![Counter Solution](Assets/counter-solution.png) + +Before proceeding you should select a target platform and run the application. Follow these links for more information on debugging an application for [Visual Studio](xref:Uno.GettingStarted.CreateAnApp.VS2022), [Visual Studio Code](xref:Uno.GettingStarted.CreateAnApp.VSCode) or [Rider](xref:Uno.GettingStarted.CreateAnApp.Rider). + +## MainWindow and MainPage + +The majority of an Uno Platform application is defined in a class library project, in this case, named `Counter`. This project contains the XAML files that define the layout of the application and the C# files that implement the application logic. There are also platform-specific projects, in the `Platforms` folder, that contain the platform-specific code required to run the application on each platform. + +The startup logic for the application is contained in the `app.cs` file in the `Counter` project. In the `OnLaunched` method, the `MainWindow` of the application is initialized with a `Frame`, used for navigation between pages, and the `MainPage` is set as the initial page. + +The layout for the `MainPage` is defined in the `MainPage.xaml` file. This file contains the XAML markup that defines the layout of the application. + +```xml + + + + + +``` + +This defines a page with a background set to the theme resource `ApplicationPageBackgroundThemeBrush`, meaning it will adapt to the theme (`Dark` or `Light`) of the application. + +The page contains a `StackPanel`, which will lay out controls in a vertical stack and is aligned in the center of the page, both horizontally and vertically. The `StackPanel` contains a single `TextBlock` control, which displays the text `Hello Uno Platform` and is aligned in the horizontal center of the `StackPanel`. + +## Add a Control + +We're going to replace the existing `TextBlock` with an `Image` but before we can do this, we need to add the image file to the application. Download [this SVG image]('Assets/icon.svg') and add it to the `Assets` folder inside the `Counter` project. At this point, you should rebuild the application in order for the image to be included in the application package. + +> [!NOTE] +> If you're working in Visual Studio, select the newly added icon.svg file in the `Solution Explorer`, open the `Properties` tool window, and make sure the `Build Action` property is set to `UnoImage`. For other IDEs, no further action is required as the `unoapp` template automatically sets the `Build Action` to `UnoImage` for all files in the `Assets` folder. + +Including SVG files with the `UnoImage` build action will use `Uno.Resizetizer` to convert the SVG file to a PNG file for each platform. The generated PNG files will be included in the application package and used at runtime. For more information on using `Uno.Resizetizer` in Uno Platform, see [Get Started with Uno.Resizetizer](xref:Uno.Resizetizer.GettingStarted). + +Now that we have the image file, we can replace the `TextBlock` with an `Image`. + +- Open the `MainPage.xaml` file in the `Counter` project +- Replace the `TextBlock` with the following `Image` element + + ```xml + + ``` +- The `Width` and `Height` have been set on the `Image` to ensure the image is displayed at the correct size. The `Source` property has been set to the path of the image file inside the `Counter` project. + +Run the application to see the updated `MainPage`. You should see the image displayed in the center of the page. Keep the application running whilst completing the rest of this tutorial. Hot Reload is used to automatically update the running application as you make changes to both XAML and C# code. For more information on Hot Reload, see [Hot Reload](xref:Uno.Features.HotReload). + +## Change Layout + +The layout of the application uses a `StackPanel` which allows multiple controls to be added as children and will layout them in a vertical stack. An alternative to the `StackPanel` that is often used to control layout within an Uno Platform application is the `Grid`. The `Grid` allows controls to be laid out in rows and columns, and is often used to create more complex layouts. + +A `StackPanel` is a good choice for this application as we want the controls to be laid out vertically, one above the other. Let's go ahead and add the remaining controls for the counter. + +- Update the `StackPanel` to remove the `HorizontalAlignment` property, as we'll be centering each of the nested elements individually. + + ```xml + + ``` + +- Update the `Image` element to center it horizontally and add a margin. + + ```xml + + ``` + +- Add a `TextBox` to allow the user to enter the step size. + + ```xml + + ``` + +- Add a `TextBlock` to display the current counter value. + + ```xml + + ``` + +- Add a `Button` to increment the counter. + + ```xml +