From 01c1b4fef2d150e9473972bbbbb93566b50a9a56 Mon Sep 17 00:00:00 2001 From: Brandy Carney Date: Tue, 28 May 2024 11:37:16 -0400 Subject: [PATCH] feat(avatar): add styles for xlarge size in ionic theme (#29549) Issue number: internal --------- ## What is the current behavior? Avatar does not have styles for the `"xlarge"` size in the ionic theme. ## What is the new behavior? - Adds the styles for the xlarge size (width, height, padding, font size and line height) - Adds e2e test for xlarge size to the existing avatar test for sizes ## Does this introduce a breaking change? - [ ] Yes - [x] No ## Other information [Preview](https://ionic-framework-git-rou-10737-ionic1.vercel.app/src/components/avatar/test/size?ionic:theme=ionic) --------- Co-authored-by: Giuliana Silva <108938618+OS-giulianasilva@users.noreply.github.com> --- core/api.txt | 2 +- core/src/components.d.ts | 8 ++-- core/src/components/avatar/avatar.ionic.scss | 12 +++++ core/src/components/avatar/avatar.tsx | 5 +- .../components/avatar/test/size/avatar.e2e.ts | 45 ++++++++++++++++++ ...ionic-md-ltr-light-Mobile-Chrome-linux.png | Bin 0 -> 784 bytes ...onic-md-ltr-light-Mobile-Firefox-linux.png | Bin 0 -> 671 bytes ...ionic-md-ltr-light-Mobile-Safari-linux.png | Bin 0 -> 771 bytes ...ionic-md-ltr-light-Mobile-Chrome-linux.png | Bin 0 -> 849 bytes ...onic-md-ltr-light-Mobile-Firefox-linux.png | Bin 0 -> 780 bytes ...ionic-md-ltr-light-Mobile-Safari-linux.png | Bin 0 -> 866 bytes ...ionic-md-ltr-light-Mobile-Chrome-linux.png | Bin 0 -> 957 bytes ...onic-md-ltr-light-Mobile-Firefox-linux.png | Bin 0 -> 1024 bytes ...ionic-md-ltr-light-Mobile-Safari-linux.png | Bin 0 -> 871 bytes .../components/avatar/test/size/index.html | 7 +++ 15 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-icon-ionic-md-ltr-light-Mobile-Chrome-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-icon-ionic-md-ltr-light-Mobile-Firefox-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-icon-ionic-md-ltr-light-Mobile-Safari-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-image-ionic-md-ltr-light-Mobile-Chrome-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-image-ionic-md-ltr-light-Mobile-Firefox-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-image-ionic-md-ltr-light-Mobile-Safari-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Chrome-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Firefox-linux.png create mode 100644 core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Safari-linux.png diff --git a/core/api.txt b/core/api.txt index 4eeea12614..e918066138 100644 --- a/core/api.txt +++ b/core/api.txt @@ -184,7 +184,7 @@ ion-app,prop,theme,"ios" | "md" | "ionic",undefined,false,false ion-avatar,shadow ion-avatar,prop,mode,"ios" | "md",undefined,false,false -ion-avatar,prop,size,"large" | "medium" | "small" | "xsmall" | undefined,undefined,false,false +ion-avatar,prop,size,"large" | "medium" | "small" | "xlarge" | "xsmall" | undefined,undefined,false,false ion-avatar,prop,theme,"ios" | "md" | "ionic",undefined,false,false ion-avatar,css-prop,--border-radius,ionic ion-avatar,css-prop,--border-radius,ios diff --git a/core/src/components.d.ts b/core/src/components.d.ts index be9bca602a..03ef26d101 100644 --- a/core/src/components.d.ts +++ b/core/src/components.d.ts @@ -336,9 +336,9 @@ export namespace Components { */ "mode"?: "ios" | "md"; /** - * Set to `"xsmall"` for the smallest size, `"small"` for a compact size, `"medium"` for the default height and width, or to `"large"` for a larger size. Defaults to `"medium"` for the `ionic` theme, undefined for all other themes. + * Set to `"xsmall"` for the smallest size, `"small"` for a compact size, `"medium"` for the default height and width, `"large"` for a larger size, or `"xlarge"` for the largest dimensions. Defaults to `"medium"` for the `ionic` theme, undefined for all other themes. */ - "size"?: `xsmall` | 'small' | 'medium' | 'large'; + "size"?: `xsmall` | 'small' | 'medium' | 'large' | 'xlarge'; /** * The theme determines the visual appearance of the component. */ @@ -5568,9 +5568,9 @@ declare namespace LocalJSX { */ "mode"?: "ios" | "md"; /** - * Set to `"xsmall"` for the smallest size, `"small"` for a compact size, `"medium"` for the default height and width, or to `"large"` for a larger size. Defaults to `"medium"` for the `ionic` theme, undefined for all other themes. + * Set to `"xsmall"` for the smallest size, `"small"` for a compact size, `"medium"` for the default height and width, `"large"` for a larger size, or `"xlarge"` for the largest dimensions. Defaults to `"medium"` for the `ionic` theme, undefined for all other themes. */ - "size"?: `xsmall` | 'small' | 'medium' | 'large'; + "size"?: `xsmall` | 'small' | 'medium' | 'large' | 'xlarge'; /** * The theme determines the visual appearance of the component. */ diff --git a/core/src/components/avatar/avatar.ionic.scss b/core/src/components/avatar/avatar.ionic.scss index fbb2af9a6b..f6434916ff 100644 --- a/core/src/components/avatar/avatar.ionic.scss +++ b/core/src/components/avatar/avatar.ionic.scss @@ -71,3 +71,15 @@ font-size: globals.$ionic-font-size-450; } + +:host(.avatar-xlarge) { + --padding-end: #{globals.$ionic-space-300}; + --padding-start: #{globals.$ionic-space-300}; + + width: globals.$ionic-scale-1400; + height: globals.$ionic-scale-1400; + + font-size: globals.$ionic-font-size-550; + + line-height: globals.$ionic-line-height-700; +} diff --git a/core/src/components/avatar/avatar.tsx b/core/src/components/avatar/avatar.tsx index 7628a19d94..b90c659896 100644 --- a/core/src/components/avatar/avatar.tsx +++ b/core/src/components/avatar/avatar.tsx @@ -21,11 +21,12 @@ export class Avatar implements ComponentInterface { /** * Set to `"xsmall"` for the smallest size, `"small"` for a compact size, `"medium"` - * for the default height and width, or to `"large"` for a larger size. + * for the default height and width, `"large"` for a larger size, or `"xlarge"` for + * the largest dimensions. * * Defaults to `"medium"` for the `ionic` theme, undefined for all other themes. */ - @Prop() size?: `xsmall` | 'small' | 'medium' | 'large'; + @Prop() size?: `xsmall` | 'small' | 'medium' | 'large' | 'xlarge'; get hasImage() { return !!this.el.querySelector('ion-img') || !!this.el.querySelector('img'); diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts b/core/src/components/avatar/test/size/avatar.e2e.ts index 75f65222d7..5838519dc5 100644 --- a/core/src/components/avatar/test/size/avatar.e2e.ts +++ b/core/src/components/avatar/test/size/avatar.e2e.ts @@ -185,5 +185,50 @@ configs({ directions: ['ltr'], modes: ['ionic-md'] }).forEach(({ config, screens await expect(avatar).toHaveScreenshot(screenshot(`avatar-size-large-image`)); }); }); + + test.describe('xlarge', () => { + test('should not have visual regressions when containing text', async ({ page }) => { + await page.setContent( + ` + AB + `, + config + ); + + const avatar = page.locator('ion-avatar'); + + await expect(avatar).toHaveScreenshot(screenshot(`avatar-size-xlarge-text`)); + }); + + test('should not have visual regressions when containing an icon', async ({ page }) => { + await page.setContent( + ` + + + + `, + config + ); + + const avatar = page.locator('ion-avatar'); + + await expect(avatar).toHaveScreenshot(screenshot(`avatar-size-xlarge-icon`)); + }); + + test('should not have visual regressions when containing an image', async ({ page }) => { + await page.setContent( + ` + + + + `, + config + ); + + const avatar = page.locator('ion-avatar'); + + await expect(avatar).toHaveScreenshot(screenshot(`avatar-size-xlarge-image`)); + }); + }); }); }); diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-icon-ionic-md-ltr-light-Mobile-Chrome-linux.png b/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-icon-ionic-md-ltr-light-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..486cc47f6b1cb14c31a05f7aa691e43555e326dd GIT binary patch literal 784 zcmV+r1MmEaP)Px%%1J~)RA_|Y-K^%vly>&&DfS_(rREQxEwNoL5jR+R06@^#?QUx2a$=9$E z@ue_IzJU-M3#*7lz(y2PC}E4ds9OY6C}ggY<3znf-HA+?r<~o{|Lb4X!rZH-?)9YQu*P<6DR>S#gL(SoX@1yx52s*V;^ot77DYeo?v1XovA zR4Nq!Y}+Or4r3UG^xDz|@9*zPr_(r&gKgUYR4NsQhK7j8dC$>+6#lLH;eew6uidIPC83a(;eJ zKA&f2XNOX$#Ny(j?DF#0!S3#EQmGWj$HyEV9%7m%6B8385(zBJl3l(zI~mKeh(@DC zqtRxRdqqwYU|@i*t}f}dr3u#Sb@KTCb>t5tkHA3mQCUW9A4 z8h*c@NF>7KpZ{7a z^fdeX`v~Ff_gGH_FD@>4e0*efcJ|YK=jP^cU6;$tOD`jNE11jW7#ka-y}kX@eLFfj z7#$rYm&$=f-2cXx*nf{l%hFZFj__ruNkSMhWNW3d>$y}e)VZ`(GpSj@{v-i}}( z5FnXMdU?rj)ADcCw4mx}LDkWMs-p!}M+>Ts7E~QAs5&h#Xtero1-}9Mi`G7w@J0#% O0000z^ literal 0 HcmV?d00001 diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-icon-ionic-md-ltr-light-Mobile-Firefox-linux.png b/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-icon-ionic-md-ltr-light-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..feadc4bf3975568fb6fb1bbc0964266d10b785bf GIT binary patch literal 671 zcmV;Q0$}}#P)4~ow0Jhuhr$j83N+f`ftX2#@vOVN32F0MwD4`zp64`u#7}P0fu~^W4zgHo>UN42iVV&WBjAevexG)` z9r=7dm5A{V31>sCP^HzW&SrBb0tBtofF%Cy3t7YqgiS}vE=Y&LJY@2|z$0gc(S z(P-TKOyQZWR;yZPQ|*A5THJ0oWwY74EMU69NvrE$DD8mtdR>75@}BE>JgVDjwc0(m zf4fIJAP$)6bV^2|w`PgL#N%;or>Sa zUkq|rm^;20V;N#)XJNLqwq=qR_}FT-g5<-9_WS)@ zE;lnXlS-v*HXA~y*=(Mlp9_MJOeQhL|6c*KM-@eReSPJ5eqf0ZvfJ&4hlfv3PqkVN zqyk3t<>kd}Hm|L%4G*18Cr#6hMgyb*MwF&$P17_@8y>2vs_QyU(;yWvqHecaRn>=w zhvA{3D5|P%Y;1s3z=*D_tav=0VzJomb_bJgw=0U`=H}+|@-j#T*zGAAji%G-)6>)K z?QMjRBuN4}*-lPQL{Ti4%NS#?*BcIp8HRz%hkPH$RG-``86(#_4y*VmWDVp&*N7z{g|4n-9_~Gv@ksyZx6PG7{sW`}_OX*Vo_Q-(#+~+wH+%&~Tk`QJ2f*a=8qj{;y2U zS11vMhKNE#M4=&~&=65*h$u8f6q>0K#nbXT(NA1<;RN{j=y3o5002ovPDHLkV1k0M BbQ=Hw literal 0 HcmV?d00001 diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-image-ionic-md-ltr-light-Mobile-Chrome-linux.png b/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-image-ionic-md-ltr-light-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..54ee2dfae9eedd49aa5a8a324324981ad8da6c13 GIT binary patch literal 849 zcmV-X1FrmuP)Px&3rR#lRA_HeSB3p)`=L}7Qsy&PN-Ox?j{2CDVJ=Qxgf12Ptb z0&o*Wr5#ZY_B89DIUL2C-002RRu z*^n#h$I%uvO#LL>jIAZ;v>;#7Pht=`f!JDtZrqxk)Ea8~(LqbF-q0I-6v~=YkCtG| zqc`|SV`yHlB^aDSMGy+;U9TmmJNQ$0J^E#p_B0W5vDDcSh^;NS=b~VIQ$L2bU?S?y zt-2bNDTK8Jy&ibEub)USulB(s@RSy*CU!SuZl^YfG1yv{i6vGKzCM7ppnjaqRoOd2 zOwi|r_a_itn>@x&1l}G=Wuy?Ds{KBAcMMlKxX6sYlnVvmI1bNdz3J5EFs2T}d}tf? z?n3&!58qvh`EC%dF1F%Pb+D+7-%f)5>8xFQS@^w)g%_O4O=H)gQiJxwqy>alAnbBA zg0x`42D1eBHdN|h*Ob^W!Yk?s1zp;EqHIMiQF)uq1g}`M6;=SqV2xuieFVN2Ql?&kAr8_9|DzYaGnOk znj~d84z|@++o<#Clc$xckW53iAdsB^sXKKfqHvOUx)vQOcy6dQk>39wPQ4|6m2M0x?k%Othu~fG!3ktt?w?uIsWkeQR``wEPT1N6r6XK bg7eNFPde{GckiX800000NkvXXu0mjfg87a) literal 0 HcmV?d00001 diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-image-ionic-md-ltr-light-Mobile-Firefox-linux.png b/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-image-ionic-md-ltr-light-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..5c71e4c15ca13b8f5a29f96b29de90f569cecf0c GIT binary patch literal 780 zcmV+n1M~ceP)s(d;?B@ySY7k9cbJW*af%u zle}dP*lGh*E{##i=1Q8D;cZL-U+?}~XKCH6-T^fUj@kH*JexSKwRq$0n{ApRDiu-z?;1|7j^%0 zPvqX1)=I#rkt_TZCH&?#aCVV)0!6o*xdv>k>-ttrQGUAc+eG0vda79HqZ$DVf7mAE zwp?_7q`c^Q!^j=E_^umWeAPi_*g1;}uf_Ru*e6p!t&*0?4Is?{2WzshNvGlI!7b!K zu2Q|e|1iK!yjlV3awXE<`J#>jnJ5_a!9pf}b%!jQ*10KY<8Ja^O2Fh}HrnD?3NGhz z^A9qnBo?F)lckv{cp`O({t0j-5tC3+U|ygBC}9^RvR3ARIY}E@mF zI?cRjO|}pM^O@EX15%lGSN1o_W`|9^w9bUJqr!EmJgwA{PibdBCYV0%%cd>Qt28E{ z9^ZCPM8yJ9v7PT%59S?If;R5PD;f#-=>XUh)yCOYMa@U`a1R3kd8}eNEU5H6j%dCDNmH{_uv~*x1?j{4&0|9|%fczFRu6cOpt z7M5O?Zg)36;PisMoiu>V^m}4xPR=(;HaUs){)^%!~>^?ZLzV!rbEfWn%mf#^JJ=Aa#+C+Cbh|?*(+0W z=E*b1h$=WZ<)k*fWjo;WG4%qkwy<@FR#P-qeE3eiDF`{Oa~<$@N7GgFt3NoES>8}@ zvj0mjp_ZuY@vE+x@ALxK(+L!dD#hWMPNp7T&xSUK84-(CJlYe#@u~QM&Y+4#&#%Ne zjC3LtRa8xg)*2|`?8`(ukEpc(=>5bwS8> zfww#Qw>MIZru{QgkD(y8ufmQV9coJxsooSQhCdX`_!XJs!>5)1whJGfzs<4hTcS zh%g37+9VSslVsCoR;s3GH{!B|*QR+*yMx~yUkO`0Ns-O4yo8e_pA#2&Vo{~IY~y-d zG-*xTIETaV1N?wm(LQjbVkzZ(CTnfBa@`)@N|up zC)1;*JUeF&}?YGw~dvfr2BKhR>Vl*uz`AeXHT8;|H_sQEl+)=j}J2A<^UN zoqsnoQoZ72_zAWz8pj-+-?z{NzEy|^ipIWZtw|U?fY3O?i2A^u(--w;KWy%c_I3a7 szGxVaX!@{(Bd7j9XCZ2ug{W!%00BV!jm1cSsQ>@~07*qoM6N<$f|kOfmjD0& literal 0 HcmV?d00001 diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Chrome-linux.png b/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d677f0589c12e6a0598813a0d46c8ec13b9226f7 GIT binary patch literal 957 zcmV;u148_XP)Px&cS%G+RA_F_o+Y(Ta$W!oU^=niE9OqD6rbv=Q2d{RJ)B^iQ-8 zTC|LI{emD`X46m>8DbEG7G$U;f`#LB-^F{C8`bSz$IE3d^T2@T%$YNvhjZpTi$Nh0 ziG1T9#tg8$y!^Lw{1Fxw7BKzo5Pup&Q12LmddCpdJBFa%F$DFFA*go@LA_%L>K${V zC*0cFqEILh3WadFTpy0f=kx6D?!N1{SS&ak4*L81@pwE9$WW=)wIDtLT+T>CA{GNDiiK@dJ2?{GL+TwJWRpP!#e zrBdwd?2t?*+1}nJ91d&B)UanzRaInJ#%8k-3@l)iA+CB0;fOBoGKNGBN^yBuRD6)!p3<-?y@=s+w{&Ot2~=iXtA52dC3X zJRYZ1D*g6c>2w;tKgUf?O`38wM6g&al1LQe&dyHUZa1k^ird>;dU|@^U1zaa@Or(qwxTFxvsrSv9Gjb)baZsk z)zzgbn`XhAn;SBj486U*w70jvIVXxDsZ6@<>dvR&-dY012{W7V{L5> zNs3=>!@~mrZEbB@B5GT~>box(41PMs=ksB+*|@s8;_>nE%Q;_PU)kH+Sb ztJTWDz<`#B^{-$yo8|iY8k^0A&*%I624*vUzn^F{iY&`aPEOX&6^lhyS66FoMNzoF zzo$?rAP55CaG2KC)_NoUfB$+ftQHr)-~VOt5Jiz_G>RliOiWDF`V~bX9*@`BCX)%f z-HzYyXMB7dx7%HByc$9z68UC);ngvQpx!YA^^PH^cML(jV+iUULs0J+f_ldg)H{Zt f-Vy%wzZLuk`}sN7Yy6@u00000NkvXXu0mjf_xirQ literal 0 HcmV?d00001 diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Firefox-linux.png b/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Firefox-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..e8455ee0cf8ef520f27e2654c4766ecea6b73cd2 GIT binary patch literal 1024 zcmV+b1poVqP)qlF=jv)}Yi;<)OGf~QhKBwn#MahUaDabV zTCU(G3B8?kx1vM^^WO!UbNs2UXz!lWEK$78c1tlr^ zVqmk`(9_d{o0}UnHZ~$IF78Jc?d|P&e0==$-pk7iK|w)?jEqE1P7eF^WXZ1J!NCE> z$H!Srsi~#I<`M0CBR>Qq+aRk>&xCz1*P;nJ3C|5 zx2&v;wHtSrEC3G=4>2}2hQ!1~)Ya8}iiKJRwT`s3G*nktivs-GCdkNYwPJL16i-i2 zXlrXjczC#57-a!CJw1)x-Cc(PkV0R3qN5^1&K4IJv9Ym%?CflmmX`hwKpM5^p3(iH z0wcDrudi`+b%m;`Dx{~U+fAeZ3T;O$Gn_^1v4T50JD8c7fzfD0O-+sHxk3ulNM<&h zod!5RKab7LO=MO{Bh=T|BOxI{Gzcmjr1IU}oxMkrp(6!p zrk$LeWaC~#Lj&UDA^n literal 0 HcmV?d00001 diff --git a/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Safari-linux.png b/core/src/components/avatar/test/size/avatar.e2e.ts-snapshots/avatar-size-xlarge-text-ionic-md-ltr-light-Mobile-Safari-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..878db1b1be37ac78dd2ac8f95e8e21b536ea60ea GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1SHj;tnma=Y)RhkE)4%caKYZ?lNlJ8WjtLR zLoyoQ&a(IT>>$y8|A?7ZX6Tv#bEOZH30*9A38ulT>6`dj4TJk8qo_x{a`E8=V^>U3eMW0qsM zap%sT%wByDwaI_{txdRvm-1pmz004T%i6kY-@bRd-kmz-r6H0fv3KXrn>TK(SkKXP z;qF~ozV_wImseL+?ejO8etPFRZiZRQ_KF{^*n98c!^D~x9Wn0Krd6xd)zw$8UVSj( z!)zB*U*?8$=gw{3ym{x&o!`EF`(9jQcmLC;qPNK_LvG!>cP_=Ky1Kf%yW6EuH*WFz z_3M{qvNaz(dD63GLZZaklG2irGw04R9XNWFH8ZJuQCp%yOG@OlR7r-C*!)cwpMPd# za9RYEJzJLF06Ir6Yh@YST`t|G1 z&dz)H?qyh@!DX^>#nGgXU%r^k_4{noug{xTYOl59)|Y2ydQMWg6!1uNZP@DL$B*ac=3dMY33mycqH?lO=JX~hHSVSl&-Ev% zure{W1X#`8w|B4VS=G3UpFbC0FLif!cMV)4D(ZSN#c0;D-kzQ-{$j2hAKtz8@ZrOA z=lry$Mny+|uHd-T>H4wK+;{WCIZO=u7IHOx@cez`$dQ8w9qs0yPuo1v<4JwzG%wZ5 zCa>q4o95i!mV4Wv=i|qZ=l81!a6I{3dAzV=(McEH!y401cP-M<(J|q9TC{WRTHV;| z`$hKd-_Opl|GvM7@3xsAD&?i6tL;U&TL0ATPmT2V_m|%qt~K@V-@m(eTRRFIdT0=6 zaN=Vf930Hd%AB AB AB + AB

Icons

@@ -63,6 +64,9 @@ + + +

Images

@@ -79,6 +83,9 @@ + + +