From 039dc3c8bb88293ac237226b053581170abb2595 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kry=C5=A1p=C3=ADn?= Date: Wed, 8 Jan 2025 13:05:51 +0100 Subject: [PATCH 1/3] Feat(web): Introduce `alignment` to `Dropdown` component #DS-1411 --- .../src/scss/components/Dropdown/README.md | 33 ++++++++++++++ .../scss/components/Dropdown/_Dropdown.scss | 26 +++++++++++ .../src/scss/components/Dropdown/_theme.scss | 2 + .../src/scss/components/Dropdown/index.html | 43 ++++++++++++++++++ .../dropdown-chromium-linux.png | Bin 51055 -> 63721 bytes 5 files changed, 104 insertions(+) diff --git a/packages/web/src/scss/components/Dropdown/README.md b/packages/web/src/scss/components/Dropdown/README.md index e3b83b8c52..b77ca79ce4 100644 --- a/packages/web/src/scss/components/Dropdown/README.md +++ b/packages/web/src/scss/components/Dropdown/README.md @@ -254,6 +254,38 @@ See the [Item][item] component for more information. DropdownPopover implements the [Placement Dictionary][dictionary-placement] for placement. The dictionary values are used as a value of data attribute `data-spirit-placement`, e.g. `data-spirit-placement="top"`, `data-spirit-placement="right-end"`, etc. +## Alignment + +Dropdown supports the extended [Alignment Dictionary][dictionary-alignment] for alignment on both axes. To use it, add the +specific class to the `.Dropdown` element, e.g. `.Dropdown--alignmentXRight` or `.Dropdown--alignmentYStretch`. Adding +any of these classes will make the element display as `flex`. + +We also support responsive infixes for alignment classes. To use them, add the infix to the class name, e.g. `.Dropdown--tablet--alignmentXRight`. + +ℹ️ This controls only the alignment inside the wrapping `.Dropdown` element. And even with alignment, the popover will still be positioned +at edge of the `.Dropdown` element and on the place defined by the placement attribute. + +```html + +``` + ## JavaScript There are two options here. Use the trigger element as an anchor or wrap the menu together with the trigger into a `.Dropdown` class. @@ -311,5 +343,6 @@ myDropdownEl.addEventListener('hidden.dropdown', () => { dropdown.hide(); ``` +[dictionary-alignment]: https://github.com/lmc-eu/spirit-design-system/tree/main/docs/DICTIONARIES.md#alignment [dictionary-placement]: https://github.com/lmc-eu/spirit-design-system/tree/main/docs/DICTIONARIES.md#placement [item]: https://github.com/lmc-eu/spirit-design-system/tree/main/packages/web/src/scss/components/Item/README.md diff --git a/packages/web/src/scss/components/Dropdown/_Dropdown.scss b/packages/web/src/scss/components/Dropdown/_Dropdown.scss index 36eda66d0d..b3c4707998 100644 --- a/packages/web/src/scss/components/Dropdown/_Dropdown.scss +++ b/packages/web/src/scss/components/Dropdown/_Dropdown.scss @@ -1,5 +1,31 @@ +@use '../../tools/breakpoint'; +@use '../../tools/dictionaries'; @use '../../tools/placement'; +@use 'theme'; .Dropdown { @include placement.parent(); } + +@each $breakpoint-name, $breakpoint-value in theme.$breakpoints { + $infix: breakpoint.get-modifier('infix', $breakpoint-name, $breakpoint-value); + + @include breakpoint.up($breakpoint-value) { + .Dropdown[class*='Dropdown--#{$infix}alignment'] { + display: flex; + } + + @include dictionaries.generate-alignments( + $class-name: 'Dropdown', + $dictionary-values: theme.$alignment-x-dictionary, + $axis: 'x', + $infix: $infix + ); + @include dictionaries.generate-alignments( + $class-name: 'Dropdown', + $dictionary-values: theme.$alignment-y-dictionary, + $axis: 'y', + $infix: $infix + ); + } +} diff --git a/packages/web/src/scss/components/Dropdown/_theme.scss b/packages/web/src/scss/components/Dropdown/_theme.scss index 92d148abb7..b42e4de937 100644 --- a/packages/web/src/scss/components/Dropdown/_theme.scss +++ b/packages/web/src/scss/components/Dropdown/_theme.scss @@ -7,4 +7,6 @@ $padding: tokens.$space-700; $border-radius: tokens.$radius-300; $background: tokens.$background-primary; $shadow: tokens.$shadow-200; +$alignment-x-dictionary: dictionaries.$alignments-x-extended; +$alignment-y-dictionary: dictionaries.$alignments-y-extended; $placement-dictionary: dictionaries.$placement; diff --git a/packages/web/src/scss/components/Dropdown/index.html b/packages/web/src/scss/components/Dropdown/index.html index f20652a629..85efbc252b 100644 --- a/packages/web/src/scss/components/Dropdown/index.html +++ b/packages/web/src/scss/components/Dropdown/index.html @@ -168,6 +168,49 @@

Placements

+
+ +
+ +

Alignment

+ +
+ +
+ +
+ This is a big unrelated box to demonstrate the Dropdown Trigger alignment +
+
+ +
+ +
+ +
+
diff --git a/tests/e2e/demo-components-compare.spec.ts-snapshots/dropdown-chromium-linux.png b/tests/e2e/demo-components-compare.spec.ts-snapshots/dropdown-chromium-linux.png index 48a843b408b9c4bba50eb7a50b56b995a9c3e08f..5bef58cab7da16e067125728db6469404da9ce02 100644 GIT binary patch literal 63721 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⪼BXB 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 Ic=+zHK zy*#c|ILI{oP0jo=;p9kVA?uiPs?4#u{2i!$BC*|gF*Z0ke(8rf-asPUuiU29rF;!0I>4fN@?kULXOPJ6n6!o3WK+qE#kVmCQC zGn13+u+}h-So!`#(#=1Pk+ldcq>Jv4QTA&-lCv9jnvsbWaogRTBm7ft`FRAw9p76a zQoNhM>1N#a;5pPB|Yc%H6`;4zIs9qe?<3TChdvuRbhE)C@4_izlnW_^`!jtE{XHttNs zjiAtRadCNhn_1NqjrBWicZb>8*;mkqNO}3rHzf3qvvJcFAS+2T9ncPqyov z$6@x>^*0vs;d_ghOBT3@E{i!%`0)u)j`sBQFzk<#;D#KuG&D47gTG1zR7^*h%8KGQ z>5iju!!CtG_856N;qG?tU%!6QytMkk)B7^lP2B4=OnNlNqI5|ay{o9Mu09I6FTKY@h&5Knn>h!bK>>>UrlLQ7y0LOHdNTiwbILj0D) zWzwAG+@0}sJsIi_y&4X9Y$4hW=9i3&?5Q?cqPxLh=m z8;f6*k|lVVsou_270gWk=#RI87oA##akgD6T`BVDjp&s@+fEsAuT%9x8!LwgE3C@j zn}jscNIWcP=W{f3tn2y|xHC+e0rF*$)fju>V8@;H0n^Opb93;p%+lo&OSc8}q$ukr z)7^v#uN6I5qi9qqFzc_T6cu_s{`0JyP_`Bt8P1H_{K_z7-N+8hCAu>i9B^;k$Nz_% z$j;>YRHMUQc~82k4a_0=MXpJYv$7X>%~WbP97fz63}V30w#I!qhYvpba#n1^Z!J*_ z6)P2c0tZfW13ydGuM>m!AjY1`aXRjZ-`yI)FFOb#qlBES zncu=Z+f9WibExKgOHG{zhi(vZf_Ec$GNT6;i{-bOei|zx?6F#Tgfd;TT;T5Lbfjg) zY8Bbt05Gq$?TG;I(@1P?tlI?b$m|IE@Cc<)mO*pGX)zt0v9AFl5yjqZzi71f}Sh@4?UrUL!G~RcNEBprD|scmd|uda*B?(L>#`d<#C?a0&@F zz%{Zy$E`QvHSb`U=A1W8VKPxJHvy=Y^IyS1?=V%!Za_55rPQUEth`% zFgN^y*2+ECAAcMRC%Go&zYo?J?c_T6y4GzgO^fc1?$0rAhT(yM`P5f1J3?4H1PX3w zeR(u3E=~u#*iRQrLeFE;m0e4ZsekjQ@5B^U2ZvkM7}!RwyMdM7rKAwvY$M|+`tquB zt5*wENksC2PS74+U}p#BFDb^EWupTewir)m3vsmL>8J0S<-6cFm+l%gVJ)5OZ-nX5 z6YgmGe8;kE?IG#d+1PD~M5H*WVYHo+6vAQuk5Zf_!K@8Z;EBpwZgx!WcbUBfcM2PB zvamD=C1+$1{0oA`W>r;HM@NSX1e9w5Pz}tw!TTJJQKGg-*-?!R4G_=1%W||2jy3a* zxb94ajW{o4P_rtPLF~dfXbVKQ2!V;JPXDMC!DcVXB`YZ@A!h_f`jG_#0|QNO_g2s- zm=T637Movlbn$sbMMV>@Yq#>a!c1H4jk+HZx!1j1-iwWO9X{CWfFL2bH?u=#7~?bz zHXl`da#MzHXcKj~awxo*Rm}vkZcYxh`z=^@z7A&I{Sm6XErqa^V(`(p--3OR}L6K(;S=Bsg_N^A^UM%Wd-&k-T zgK@*BTkwh-@SbI_Cu*J=_jVC3A#C3(PfyRghAmC5x|g9OIZdo#y*d+Dk&&2#v zRki>1t(2DL&vzz5lr`&xMBo-?xfmhq$+|nQYND*FPGBe-TU!}!Yu``g?aff{t@nUM zfq}RF9Q%Cd6$ixJXbQpI*{=>$xW)q)^OY(x&i%m|5gd4^lCm=TV0S?}jH7wKT)Wzf z{BV`>@V4{jtbc$xR6(20Fd8|5xo=MqD?yN~9J*FS4<>!4!gvSxq== zEvKmvTY;h1<9UgR(^`jHT6af?L=Ltm_O=%IT(?&}$!NSzL#g1BOU=sZ#-}cbH%P5>#*58SjYTz!dV$32us05 zIqZfTirt@N4zHcF-Nj-oAt=nO6ixVp-|1C2xy+{|**E3d&UN@-)O4Op2$mI?gE&~e z@V%7Re4vXRT{Y~I=^yaevM(!cqF#Yzs}QwUNN}UR>{o){>l9T~wtsOVU$-JD!3JVj z8b^qhsr z*|^M#U6biNE7Gw+n^yLlH)k&t+b<2sMDjwlgO9Rl;h+2{9?GGy3klY;KPLg6UQmEd zP5V9{s-?41-ur-r?o;t{FGQ<>j*g(<;Jc4SrVaKC;`ERU%YSGdsh=U2QIgWC`T zZ7)0Suhlv;S`M|m2oW3;z{bvA zj>lq37nJ*4R_ws94J?w%>=t@p3a3Sxc6$n2_-CTPUXnWJ2m{#2?A59HaB-qG zU?g{hkiVJdE;77naoxh@G;&}L-m7*d$)Pt|1UJ_0J65IW?7AQq-GOSS!fnr9NcH7Q zSIFa{n{DElk;K^vC@eWqJB@c+?!DRzJa+7uVXPZ=B0y9G+`(d>8r$Kb0cDI9eqI@} zyI@R8N=p5p*jyNTf69|avj{K!PGX!;P!Mt`I5M&oNejzN&y8^bs)&CC`@&?rgCUr=n~_Lrbmb&jGxUkN|6T%5tjiD2I$ zN2(2fkH6v$fART)VER{15?_E}-TZI=ACvknM2IZZi`o#zbEV&r~9^ znuBggPq)U#K1pb3XkcMw^#$*J|6Yt#=J%DKpAQu{JfQZn%~L4VEu+sPobSM9kI^H` zac#WVW`^m^yLV@q{pp2w-!jn4CUyFrXLrVL^>)r}PSyuYeYnuRmw3#5xLGm_aRrte zjU6z3C!sr#XZ)(>L;swz;n{aTA(AA?Mn^olKHVJI3qIQjH)zTsj+`!qeSn5W^pgZg zHegR3JEM>r*CuL{UZnKr8sZX-iLM+czTn<>Be)*6JV8N0kSXl+_qW$3e0_a`>-D(8 z7kN5~@1KHQX?EkMvE=7pOB_4DNL;;R(v|Fg#HBV5ary|+sr!pu`ULa*&Jc8QFyzJ3 zt^c@1=k@E?y_EIWrv~y(U7G*#afhR3rly$ke|o}k@=NE$jKF$#8Oh1X=}55te~(SS z;kNucjZYT`cQkyQd;al=$HfqFp)&jaK`!A14-b!qkRnDN-unXBur8ljUltSsp`oG2 z$j;m9@52^QO-=1285t`Ji}OE*VQpgryNtf5s3=GnJ-xjSBKN|dLbSTc%sd0(y|KA@ z>G#`P8@5D+gCX1xr9O9Va%w6=E#Cxu7S>c>Umw=O`_7!L^H`N9R9|3N!Avsq4JW!| zc)*05Pw+`1+&@G_L^y3sgC&H7geWR0ou{UzrlEmYmH7LD%3^nS7vlZnU?wn-tsXEe znzNONRYO`ni}df`WtoBn-SW%ITp^=F{3&-)L(FEtiYz9lq!>3x@Ywyn`1$$Yl2CGR z{=QgP-W$TF-2Oxptf-Ctr~3PU`+)ZE7yQ2^i8=LaBHEfe<~H9`vjU_-3)iJfVx&;j zz?G1YAnr{ebNx)e<`u-E)MDi65DD09U@y5_bPf)_gc#kA7EMl1Hv=C(a{N@^%mT4H zKG5x~?lt!~oJx*f{r=8|e2Rjqsw#w>=f5w~IH)z?f-0_}LWGYG_xY87N@{8YR+s2X zBYXiP(W&yE>tpG%QXf@}q`jE9fU@KplhqZ?MnClujD z&lxSNtgH-a<-}PgNTs$SMR|F)kVjG!OklsXXYvM-#gJ_&)^zmtrenQc4uB}%zUd7X zz1FxWirn8GA0LNQ^OOm9Fptna)E)8od_sG6jcaf1cfv{Y`a9teU15Rm3nzSEE(7J| zdsz$KddD$!L_Qy3rkLF0Y8w}80e8|6y`CGGsZnZg`JD`bmHPV@o4dI%S3`oQ5%GV2 z#lL19;`<6Pb9aeO32PdNwk$S7+Sw1pArbDwwG}7soULq|(C1xGkPa&-EOgL!WeG`5 zNm&asLyYVFHDo~SlvGsuIy!Q+fBfpjD{oXuA!_zbPTs~km#!;r`h+IBv{9sm)lHX*Vh!umkHa^^z`(c zoSfw3Ootc`FiQoqFVZrzwb7#x76!U#(!qL~;(x%C_v#_Cs=li5j&&`F=g_NKW}p z#H{RJmE8Tpot<(^VSMMnbYj6DQST3&NT#Q;&5d(mVV#`J%%T`+%t(G=VL`s7h3QC? z$w*1IU3Vgu+Ea2TDF)T2in=R+kv`(S%;-)udxIW7hQT#EXT&eg?qk=HJHPrhWi7Lc z?KIR|BB-}e`{Re&1CAU6*=h3Kcn~SwgeZ9b7 zv&(E*wsf|dlCuF|Yi-;KZG>~d41?Q@R3ZE27gjGcWk<|16ZlM}%{BAqdc%-*`-Uy| zxG|y-?Yb7A5w!k1`FTx)}mD90Sw>MR((++y(^coC_- zi^qyG#D@NUL|r46*xe#jHc2^M<++yDNMB!HTia=|o40;n?Cf*`wnkS2>#)Q+a>CfJ zh1JtPoOb5gu}9&A_chGBZN3-_J6MD`=9*hdOk2Aq>8@SbwHjZ&n;C8`MQ8c zjFb`Vc(Bi*Wk@bMV#%|T0~|2Q6?w|}Excr}rVD%EqoXE{~^i3CJQ!P*aPA?jF2rZKB~ET-3GV$KHbT!>couaZb+Pt;^$qyvAT)s zp5{2@R4mD55&kG!ozL7npBOIpuu*0JMKG4vSnV+(Mj8jZKugMCIlM1J@Cs`7&5m0& zKcB~eXBJGbpg^9sw#S5F5;A%}R>=i035o1Wn;k}q6jx=ce~ zc7x6Fmd9z?d!kSGBHKQlB2TL_?>i`PotT zW(Mi6x7E|3x3}fvEYZ)LB#bOh0i1M=+0$>KIu=>DA<1N2MP2B%E?zb66qj{9YL7B* z|Kn=Y;o|o4JBgzG(y@fPq4w&pxsnCe^y}sji5*|WG)!FZ)` zSZt@I_{8*bI2rZ?WVELQFDedK1ujc-_&c6+K%>oPFm)g+hsoo#65EM16Y*blZH1@{ zA{>*GUdPbn>U_Wr4jNWnRQ9g+-=FOlS+As)u1cIfEtc%U`624uup6t#X)sDg4-q$U zQi2UF(4goK*ITPQaUO~JI&NGa4ji|uM7^dgy%I9b7y9VThR$ia2`I>%s*OGSgthA9 z7^6p9l9mw$YR(mO`Nr2PvVRpmmOyEyDP@?LnF-B)d0XQ6NL*Zey0W~Cd)C17$XCngC%6}7Zm((Pv8Sy@6q)tR`kh$mVvdtBk!w23Oyf)7vwJw;HukF zMbQH#TVH$87&QzZ4aH(X=Xw@pA0MLu@df9yria6AZCPowPBfecM0)}8K}hqh$UToL zi*WNt`gJR%?DCYUr__19Lbos+C++HH&0jT8lDqAB@xxtRIR zT|SN6=v>`Kc~%8kb>pfgm>D6ni9NyS(P%m3 zi5n6(Pmy`sK!zRK`#}#8xM}eC2^bo~w=fQkf#Km{&oRc3C*56L+u)V$SqY zu!T~b#bG~tD6aj(Qi{%9++z!WbmjR<$cN_zW~Q(voIoADZ( z5RA0(9?_*t=ur0}AMx}(@t~*wugTM?_M$$2z927;O(p9K>jVv(N?S+A3l$ZW=g+fo z$|OU^T~xm!<^`^zTR4Mk+0B=mez&u@!Oc{- z4KdQ3A{ThMJyK9-MUcC)$i>OZA?z?_3?>W$MwlDl%gyGjIL1M~yLn0WuDD**+4E)R zm}JO%2QN|_s%*>K8QLsoEehxH=kKn*OLdQdtbIp%n^$y`*w4=oc&?`|E_->#olm5t z1usJ75148{;4r}Ggc`(!vy3m3|I<|)o-7}2+<6~s$(z*g>f$z#D?dcxo zY7#jr@|!0kBMKE~Nl-94;pZx6I+if9!^l3}-E-hY4qOIF_9|El^@8Q>l|x;Vxi>?v zrEl~pLj}%m=pM&+f!nC<=ex7wq`-O(#!LFz?|Nt03gCg)6FJ=9VDumW;T*DZ3L>_Z zM3Os^>ZMAK8o73zvh#d4{AqS}f&qP@iRjrHI>OWlXUFNx=$GP4Er+_gck!b+4y}nj zUSP%ZVf3(bXm5z-w=pQ_McBTD`uhOCm#JCqJk<~aY`le~CE!=UpO~AQ1MmejYm}hF zG62E=PKjc(1N<)Yb72-dhw|*CP1a0l$<_r0Usa3b>NKt!(@+QSr?O$l-e?%W&TWU3 z`+r@pfA4+L%8Q@%en@fPDtna=L-tO?#Rb#hC505h{c}}BV`5^WmTMpbfFWG6vMoU4 zHvYccTz!YfXmI8D$@1m|Jd?f)W43zfT=(6~n+JoEEg#w^z!2#HMvR$B?Ti)HUU=

Y7fLBG0hL+FEhojduo*}_U#Iksq#bEIbHGoa(XV*h%8e= zjocb{?R~{QA2Fv?S@;K&a-5r`+WBf zb70ug)F$uJlKBEgtC7{LY|SM$`NFab8nLMjQ=mEij^zAdEBf&DqctkGsyFy`5`7o` z@*iLg1rkH^c4QT{)z6c(Mv?G&N5bc)2=lsGoi9VK{+=@Vk=ezd$l1s+^^dXtuMJ6o zrG>QllYC1VoJMzFS$t96$gLTL7^nKNe$7h=TS|Bv&QC9M*Fr|plQp`wTQCc>Jr-&s zdBt|7>IF3U=*E>`zN}=e$4(EXlH;pu&dZ5Z#BWv}^lP3&*fRgAI~pYUFA@L*MEyRW z^#2E-uIKU>0-$ha&Q<`*x)K>18yf&F4Gs^!fKS|#Pds(uwsvghUmJEmgxBz^`k)&d zGp*nrP~QV`3Je%rj2{1tngZDU%AY^+U-qqMd}%mi1RX2@!MOK&e760o=yo9ZcDYe| zJh0Qk(Xzm1I{oyaQdPT!(1T6E_~ccUHroFTuG54m0+>!}Vq%R}4v|mr-_HY427nyW z(v1MLmvA9LX#jdApqT;ac0t(z;qv$62|NhBiy1^05HBq(EC@10J!PU{SNjwkYy*OX zsp;wEG#=v0gDRM`#=nB*V#*(X`~mPdke%%61#EnLh3V;RpcA{z1V|QWPhg_}_~y&+u3%7SDVxFMk)5H~{&8eZfW{K0Y3BCSZ+!^WX|lxM^v{hK2DNcYx$0 z)r|8zBB!b11l5_!wluTBqHN%M!k;d0cCW9mgK?facW!aRj;QjWuHr;CRb?9)ASW5B zxryHi7Y8%5;p*rQpd#S{6D2t1q5}*B9Fw5wdwJ~A{|IvJ-&pkjEm-vb5H|Op4Ngq6 zfChos3&Ubpdl;(rEWJZ`bbbZF_UZz)my+jOO3JUy-anTQ<^cH2RLPF7sHlMW7Z=Cq z0lX;T0szEzwoT${ww4STqWs0xXjwxSasXhBRH%{G(vGOL7A;}Dr$wVR&s;}27N z_9wb1f$)vw(r<7lI)V-U2P4c7b4qTIZlJ(RyvF0}Aq(IQuw7yFD4Eh}F4Z}(87nUo zM~7WZ&4>H(#-Z z(A7?L@fnmju;AU@-9R2xd7OwgG$944?0>Kc4A}$aci9m??-K~_DYEMK330j-_r}UT zg23wT;aTK%bC$Jn-{2YELXQyXYD)CQ82obpcNjg+a*~R(RIhu&^b17thCk)y<_50f z11;Zo*2W8>NLS#h2`ohL9#ReA^9FJJiv3CjwHRrv&?^iM8CFh(+-Q^a!cYHrw&zUB zc-^{+Srm}F6^?ncfu~mfmv~ZraaW&QKSM~~_pBJ?$Pjlx#{F}-97>kk+oR^92iPP* zhEQ4WFl52fYXd7~V#m?SHyT=x3BML$lK!Hu3uj@Z&+b@b0;2WIYo)_8Pon$ha3+A7 zQi*NXWzJb-=H+pFtPZ=ZEbaYGkyD=oFr;P+gKS#ah`T1JIWTwz)USfVWSAtm*wa;@ zLM^Qb0-XP}*hqyN4*xfY4t{aEDs{kIlwM(raGP53W-AHu^Mkj?Jx^bvrG2FDH1^pzu1M%ynD?th&xI8Vl-*i^a%?GQ zdKy`Rc=hK12i~PDooZnF)z#F_!)7={pRh3o3N9-vD;~HX!qPnY);VXENrcETQ#9W` z_|O(}QhA7;LZmD=aE0UK;g$mf2nIU_~lB&2$GK0i`t03>F%WJ2?x&}cEIAsX3;07 zNW71*ikAp?u~V83lW)Y5t(4R4Zj!~8bGa^l()e7Em}sy(SPVtm{}1-3(~^3H5XJtK zAIO+i%UPUgq*>nYuJ$LLabrKVxF}vLSO_8!0N(YuiaV8If0*<%{Kd0pS+P$cY=$6? zyVGU3iL$x8!l2H)d&bYGAWIrDA>N-Q9AOWVTf0Nnz(=1BGeMhyxB4f60`2vG3l#q6 zNU_RA-Dg^359_W4q-&u?Fl0NV!uru*0Ky8x!^pQluL3Y(6J86=1qV%rBDtM9ts;A7 zz%x#-fp!yU#dh|U1Gst6sv2@CXyQaSn(l&nZ!XlhR6|ac8A|Tf{N5u)$;q=L2TLOZ z7>qb634`mZ>=DTQsEx>x^t3cG#?2)RE=ZbV?z_VwegzflwAv!LlCGLNJ^Ge%`FnV2 zuXn~q0BZl0Kr{v8r?4=GUIs#I(Rg03D6z2P>ZqLS_}TDU5SR}W`dTRc!$na@f?k=R z>x5FEWMQaP^l%@{{B#xYG~VR2JsO?%rIhM3&<4Rr7;9(J;i|W2(>yVhjLv1{$m91s ztfs>aTVjL-H?~s_W6Ssa1L6k`MGyMBWGGKuXFS1pl*;GP*_6b^TfM6k4;V9`h$ae`!#m*eR&$T znyqL9L&Is;mZ$5ElhJo=3>rZZTB2f}Wsc!BCv1sj`Zme=2D4mn%MdPne0-RM%!2p6 zc7cczfk3@HZs%>D+tAvIUaO%6*O$D0^{OuD3zTT#g=QA}bFYq1P1%iB5;-_HG+N5T z28@eKNLaYKy4uanEdvXh)SGN<=co(~XMo72;&)otGcYiKeWk0LTfU{_HxPApo3h@z z#qY5EQd3j&*|TRxM#;XuTd1QZf?}YIa&|6J!)|TmU&{ZUp8oXl{`;S%*>T&hv6Mi@B7q&5F0cU?V#+H z-NOPdz=D5Yr{OS^kf0S@zX_UG5QaS|6;zY?$^)4IP+4PBLfZ?F?NrA7IaAmr48%%n zm>w!sXoK*fx|U}tISJ+wx&s=CT8ochT)1a3SOmQ+s!Xc`{vRVF(-JyC zbOAbE4RzS*8}h{31kekEshu$2n@=rVZxg3X@xOWE_oc-1?b|mt)f~Nro($N2o5&a$ z&BE$1%S7nizL4(k3d+JvXuE)v0OY=c7RYQDK?>qvXNL#NC+L^U%7m!yTsQ?~jPsZ$ z4cj%hY5{`jBb2EH%a7Nu*MP>5PaUZ^fp29BhQ0G+P#vf0?@|Z;{P{Edu3-gO22a8I zVs5LNSB=2sdsfkvI{gsWDFZX@g0Xg z*ve%2!5iYXhxNO}V*(4S1`h^l1KZ1@+q}F5yOl`jr+}WIj07z^#_@>>QP6yYf--e8 zjp;h3==Fr?;f|cQEukL}5fKngyh>Ocznjqf)V^aQzyu#Zp3a}n@6{}|8v8@>EQsk~GLOHFgOLOV2DY@c_x?GA-+g*LE?ZlcyG{#;N&FAtUCRz^mQxKl$2 z!3NrjCg{qIUeAf~DsUXVVN zV>$;uU8cL6Uq(_2S|JvEYTPKa`50-L50@1a5%smU%CTQ(X3m7>Iq0|(5fORw=FLjk zhO8TuLHd28HJqHk_2uN`^4oIs zrOgvS-n1p&pYb~kwxuu9xNE$83GHvYBZmjdH!w|2PvN8HEvby+UMeE_kufnMpc)t| zbx^1OQC|-tqEvsTdBM&LE6 zRG;k?)S=6-_tY$RSNgKQKF-nA)0@nGRVy(GeN3e@F)o)-m8?19Nd)8nqS`;l^XUB# z?Y4)`=)(h-B}pl0u*r?e?6dxZb*qH#*Zi?6a$einXZat4f^zJa)bh=EBWXA_)6MUi z_1(_@Qtt9tLep(ak%vkd)M<^JXfwM$2nA9MZh7E4?d|OY3NOG7Kr(1yl`@|o#bTrO zoq3OIxTpx=4xhS>R#8zGteL1N8jL=Lj@A*?66Z!4ibxXpvQdK3klm&qs#Fr-6bZFFSYH9-3 z4TRU3s<{s_iIyW3TP*oda?HC!pCojVK{fE+*SE9eV_@KOXuW_$58Y1SSy3Wx&aia> z4x;||1u~RJ6RnCif2NtsRl`L01O!STQH0_sy}i91R)&YHX<-1cOUlqJSCcq%_AG<* zEMxuwm?wxG9RcIHX1cnyMM#EkDMgZFh=wcNN~a3pt=-ms(c}j}aB+p+!>*+Y6I(U% zXPla4+dDI{g{La7u0vyw-^II3?Ci~Eyucx<**!Q*ON)Vu**V1d5RXfHJqK{LhsV*7 zzPEq;K}<{xJ*k97XJ``y!wz9pR$HdNaG?l<^Ugd9-b^d!2xfE7L&NfoQkTuQOKD?T zQ_!Uc9fYavMqNFS44ik?r#Ludg8N)HX9GWeghnkRDDBMkVO?}zy@Eo*l1Ffp&^!b1 zl~RUUN&pBuL7GSllF}{Rs_JUdy~SKmgl=zd8?llf7l)!{7)%6mZ*O4>SWIj9-P(1d zfkO&dJbb@lERdZYIb`(o^w5pB0*eWr{A{Gar1P&N=Y6|tTWlyz!r0gt06VDl^z`)n zI=T2Xp<@k7y^ZyCcuO%cv3bY9pnkKKx;iU+dx}%1%EonASy`bP1$2r~jaF4by-6$o zt=~*muIH#H^vL|F1(4%pV>?AbQSdY_RHLrGer;>Z@52XMJ3I5I>UKs0vQVfa+@m$R ziGV1B-x9~&)xQw_4YZKNgrP}(ARK-%vzd^?1@a`Nhz8HEg(dOMIJJsUM=t3~-mJJtDi+g08cHTnx)Ny*rgX&~1<>^m{lat~64)x7} zbok2}6of_VYq&$?xaai=7kZg&?ZW8zq{U%RyCZc-0*!P<1Xq$YI?$X>gY5Swe-aUG ze?5%ax7ILlZ_Kc_ppoHd+{BN*d+?QEadcLU@R`wuMLPGx(#1)>*vSI!VZGLe?XFx; za1@s@x{KHJvCdHrQDB%O&E0IL^ru3Fw zr2UVTSkG+4%8(^tlq#$zd%p=u0rL%)UG@lj8zm)X`qg}Gx-#ks3|F!y+S059)9y+5 z|N9w>+{9&TP1=G zQWI`|#_Do(l=9F`i2F;@5AEI)h1!O)$HTPI77UqBZEYEUf8?%f^))9xvQ9rn|wobp49NDK94e`Per<9;-<`_SKf^WgK6kFL0=J`uo{d#>>Zp z{HIF!Ogg7cpY!bg+boHP9ELsL^9Z_ZgqZs&g*JarN8Q2d!~ z1bO}H_}MGsNe$szdMip71!M+n&rn?yl%iM(ve!W3*0wFE0{!_O7gp$Q2Khc-uQq(~ ziTUdIJjd5V4nzM(&hH1gUPMLdjqvi@WqAcfX(Zro8)HOp+ebAje2qU7EQ1oF0t_#tNGWd(7^FYw!MP-lp{T*U46A(6E9xe z6eg*gS!wX>^eey5(L&F!dc#ln_a=(_tpR1_v7Lkm>=A4T(=zo(k)}5|#dA1(BE4-_ zIAbcpj%2mVm*B!upY)e1x)O6(uJpe65YxjTIoa~s8aHyCQ$C0D33|=CdMM|r(#f1( z{gUwEP@OZUS$4wD3@Vija;)V}ExsEG(Yalh_v=i%sw~4f8s&@p;#V_+^Eu!Bc$|p7 z`hd!M-F^FL9bWFqGY{7T6z`I{LuVLS%g06TIlc$Z6rZTGU#K!(?cjRKgkQjwUe_!R z(CK~Bc)Px_$W`o8eRsXeNBM!HBn1C(PwZJFDl$HHv{Cfn+VQt}q@j!4PN+Bq#qNAO ziSLc9{JgpAmd#XD{F~h?BF;PYl^5zChb2%-JH6YaXF`SFIKtFWGZp4Q>Hq0Q=XG2V zEXTu^j|+P$B-+YfFYi977`cL8JVO;u#jLT{P%Hf_$#v#Q1j~9k6oJ2} z&7k#4QZbnPMCkd(H=KHhGuBq6M~^mc?~IQPt$vl%WR`8Qc1-#d=Hs(?_%fB{Mk>aV zHcFVWI7~t!2zj1rZ8KX$%<0`ChAH7!hr@>t$fsggB_#$w1cfo~gm z3uAgBTQbNkA>?W{(2M=!h?riR-U;L0GPm@wCpM~%-z;tD2#5F}F2%vCXD-d7Tyc_G z#u3UyE;|~?cY$GO+j8+H1ODB&3ZJhpeelQ&-i!UT=-aW>GP3mIGwan3%c#qT&pTT7 zmnVvYt+5`q6_Uqm>VDnj(vJ73qm1qOO3yQ9gE4|&(YyJvjw7tsTjSc@@#|a3uEkG; z%6<)rpR`Fx?@M%BSXKWK3}3KWt|gWkc-F4sMDZF7v7;f+e@LCXx1A7hzfeWE9o?Qj z(D_9@6FF}bBhrCG&bgp%SD3?T^oAOPTva3{zupLnW)ePL=l52B1B1rs*9zRK3w?kJ z9*C8J@&V4sgNGC-R=!g~;f)Cse(3V}xy2JZ+jhp? z4-+{;-^ocoC`ebksTcxYTG)6@?&ArvpQ4XMoHSkp3=~L<@2PM~CT{TIEF)0%gju}b z$@RH;dfMXEz$p80qPpMrgXW=+?P)!<@5=YTeOoOgHQ8#Pz44Hsw4mP#%VrW zMC=(y`H$dN9$Y*fk@gB zDfLgEIfjI5rkS${(^*-uNael~*)jLxM;wby0y$)8&6E!e9>xEd-VE54XI z3TpkM2+%^D4qwauBBvCy>$;SH zn87R#azwmT`sGlqEA~*PqUO(fp)!R33d|ngiIf#Kku$oNN5{?bPzy#v@{()6f-)J9 zB@1+KFYXZvyVcs!&j_}wXr?LlgW8zX@%vgy%d*F5yt~|w!y!p^nF5pJ!FO?6k=0k7 zmVu{7R5Ex~6K4fwO-~+{W95BN%6unyOA4&CZxqF!k+=68d!e>GMnb=G$4tmlh!DD0 zNhU@S>8>U7KMS_%o%;0;hIPDhP8+^0_09E8`=_e0UO`dqx#|m5MGJfMXL-kA(YAYz zPfMQ%!xoJj9)mFQNxO<*4WIkvg65BP6=I%}K-xcijMPj?DXVIioC`~f^v#UDbEWR< zP(Jc``vKn;IoT1es-4l-ya}M%)jU1ANH`FY6E&PIO6EKsOU($XV<97_ut8Wep=U?*Z(qqj%hDP zz7SvqC=@DlQ zw3Y<4lLE#%;1N=Gc(4a5ysI667ySM5i_WGg(C{)vLSo*HnI=r9ACU*!I780rJ1Wp&?A3@!8X-pJ76wW%lC5 zi!m`VV`F2W0*75#p8ue1SN2glM8h$t&7D@=j;!gpRc zS`I)%YvYns&qtJ$6%=fzn=a<|4_3Ij$jP;qq;&%j259Kyr^IJkWX{X}PZbDoM-15AY=JkuNA*qXS|Oh>v*-Vi_f+ z9%#n1Umn~!*jrIXdyc&?1pvFIwsr+XXK=RO{GFAWLW>E?hi_5sFca>_i=3H%zzG^5 z*xn5gq$vYo1~UpkeCnt5E_t~WqGUJ)NJ{$3+vDWUfQJG}MRVp%d`}sidjc>0tPzf) z%KIQdIA{>=7POm(rA~yCe$?}0fS@z&VcU{&0(kNO4jK{#83CM$p)|sD{W>8O@`Sp< zS!*U|C5$

RVe2&2&Kyr9|sf2bi^q(C9}-aa~a=U$}QSi=*M5S1aMC1j46nQ;2drT@M}M){Z*oEpFZ0<0Q#l2aG5VAkNIfZ+ObATR^b!Itd; zq@&yL0+$?A3oW8cO8eHM;7Cj1^}1_dbdv1K(+&~)T&nXu85lT2rrR$c{IwYSKK&3D z7~VD|<2oi&<67xRmTY&%a$~tc^Ci2q0-v(Y4r$;X6-BGTJqOC1a(&E(N_g(v$p&U8 zKl-9M4mc>8&$l12*Vfcn4CFl)zOo9o*KL2zwp^`njpXYcG~vjU`)(TL|63x^f64%y zE)%(tb1wSS_n zboOQMBSB_3CGhPO|2rQa(vv51qWV&JWsu=)Lm(9jWdKo22C)_J2Ji@NZEe3B{V*#d z_~W*zck-BPTwrj;B3G}*L!ZHXfw_64fIUIx!d|O@$v1WQRhzniDe)7%;I|`5K$GVi z>52N*<(43W%+ngNvKN*u6<`RorcwLVEhWa>{wNs#r%!pWCmu2|#KQSPsgcs1ot=iQ zG38K3H69V*=U3%X(A4}+-mDlqU5mkB*1y*4v9Pdoh?t zhFDN#rhIX!Cg(G%*MYDFacDl&?ClRLIKZ{XG1)o$gH^#Gmx+^XD!RB9s({d=eR*N^ zK|n}#>nVi37J$;F24S|BZ|aJpZA+=iT8!vMo$tCt{UA3tH?zoP=&U}^YM|Ybhcc_X(C%rpe!>Ze!BC~<4>|mDxNY~^Lan0 ziyIrI@qG%Ma-~Bh1+fVw4wn8s<~u)(CV$sN&p4qP2Ia@VI@CV9TMLH#B2ME!Pne%- zwwC_Y+-wfzJDjAcfZ{uZLj*Ombv>U@KubO;DQVjoAKrJ*&EIMRR|yUUR9sue3Y9giUXkudwFZu6$GFCC&q2#A|A562E;*KJgw6$C%dt zKkU7ARF!SCFS;KJyndh}LjiYaqB7WLijE2vm!>xVUlPXNZxLlN%>e z)K~=G+WbHu6cJe00cVS@$JW+c5FUVKp3nsR_w{s3M#U;@zE=$BTt%9MFS- z_v`BF>f9YP2^e1ina66bR(g|48z^Hc1x9x$?zV$ONZ3oNfCrU6Jc5K*H9p2kHBB2E z8(@7Y%Mcb8hQt5`3nSOV8aj>-T91>Ps3-vLeKspDxVN>aTE{z5pjldLS*a1#G2%l- zfpD2hHo3q|2O27Kbu?ey#F%{<=5fAZZ>mmiztOJsJn*`@6>wEAW*)DX?AA*)}+_$o_p|xvm5K_Ow=s9mveO|Ns%x1kHXn&6L?NwGzm(Ak&%&Zm#w*?p;WESpj>d#0YVIb z@CV?qJ78o0pnt}AU4y|kG=2&E9o(_=DAx>5o({IQeMJsrCm}c0$>#04xN!eedbFn# zte*@q(_kZ+|Fja08ppe>F7(S+oxn-5tLSsT5s(5lU;6Q~1B4AzI@$E)%a^5=v%eP? zGe(M2e{=}o^0ERM4^Fci@Q{00qHv6Y79Plr1KQy1?5u9C9dLMH_4+pO;O0#&0L%?c z;{TxSj37?ioa;7NV1$zbP~5F-`VG_yfqZ9hiG()^q&`1pML3oNA5 zw=-4c^@L!yuH04SXW6zBeYgHAY{fN zLD0(*%`C}$qy7%&8hA7^P7CBH2}2|EzFCiTF)%PeL-6Gg3r4FGXpdEn79gG)4&qc@ zJnB}|%up+q5wAo}S_p@3&?c+YO4a#Z_{7O>kR26uDtj-&8K8YY=Cit~enoLv*@N#X zxPcN~ziw2_$HQ}w+sYSl@A=!wEuhW8>I@+-!fNaehoDjyNMfN<46tD%gaWn-g>7(H z-UB<>qg6i_;N2tv$Lgm$t|o-aaFk^5%VK~%e;+PL3NN8!vc0lW1ouU}&YkWu(LwMk zyUmlvX;Er5pXj8stCr@2i-KLq350;5Nnb1c{CW`5jZ%eUacDzSR8*Z0X;N*naXTDr zSimz8Tw7mF^WVPx3LN_o!(f8H$C}NyN7i7$`iBcJcVY?pKeHOZe%`$JU&#QW zpYPwlD@LM&jKY;iKCp>I$u-BZT_t72y5E z?E;E!NndcW)YgtqOEYxxL(BcreQj@V4_gK#EjGhA+1BdeWd5tU85Ibf)O$0$&7?d5gG^9`SF&v)N}s3jm^Y+*sIuB~vg)=JH!8*B&5Vq;_d{rx{g zeO_2taCLR9uYb~H^Qyn1lp$kq&F#6}ue7m~LE@r-bH2(KqyQ^mo4+_zoSUA$00XQ0 zNE-}EkHJQ)YYowSI#-;qPFBw8B#CBcV)Dbu1iGYa4XBexYhjhPc6Knf#F{(ObyK=^ z$4*e~gNB(`XOtw=4LNZ$sN>p;EG8ROO^R!lgii9T3y(B0l*->t!Cirw9c#bq6aHfw zEVJ!5+C_ltab5icuZb<5VMNivynurmP;o(wE?(W&*g!g9?Xk_2Vd37);DiWHK$N5!$vm&jWH(9CF z(NcPr92Vzw0-Jtd`P8f{(t8tt{-Les7SA=_yUTt`63@=fEd|C#O~cH@#N15BMp|m4 zoHV50WUNN&TCM7fk{ynE8rl<(rhX{!-~r0icDp*YNZ>hxLy5v!V)a8Z zr3;zKUBRkj!Ond1NezBhUpXpvV zx>&6JiY%R&s`qvFWju%UpV8zeRGE`NBTyvX+hUoSTNDCXQTDO1!;4x|;&W#Ly1u|S z^Mr?D^xGA6(C#AXT+GN)HL1W|=tUEzv*)~09ovp;{SQW>vxQT2tZuy)A!VUTVw$5D z_ll1=!Qq^*@%=44W`y(Onii!_UU6vfvav;qMYPg|Cc~R!vCmAuE>Z3;7^A3FiHfvf z-Y%!EJEdN{zT2AkzSEdalXJ~bCOYmC(j=}WeaqKo+}(}W?{B{BN#jp|$E6r=;b0$L z{KFlIRj?+(7}*)QaK~6^?=aWGoL%ACIp>1C_`iRz(tih4S-9a}DUQ3Jch-HyX7*@l zo}cp{$cgvViu*C&4U)D_t?c=Cs@W{GZsOURg?@@OTqT#0Moa$83x>rpk>)`+xmnND zF_XNl*qQN;OGAF=8eYt5a~g(?*BYJ5-Y&<{vs;VRT9@(eMPok;$ zy2Wp^%)hTe!n%KcB};UdQBqpMD(}BCKchu*sWQ4H_qhPlJ=ulOw08Xo7?O%42^sv$ z*E*(D8k+pmFa4gnHN5YYv^rq2iX{=ydKTlEch_1~U8SsrA8Bc$f9Nz(PT;gs3K?1ORs z7x$icX*Ea&Z4-*g%c~E%WGkIg6_1cy>$#2>AfS1;6c-kQViYxrAP}XdXU$Q3lvDcay@dAj=JMyy}%j6tYo;)c< z-)JniE1FQt$;>Elnt!!d_?A3yO=i|E3@e--uiauQ+vACrp`F#o8b+J?{%X4I_R0`? z7db{6j=h0oNlxNR7Ge=oN=TQq#UE)cPcblrp4O~CYMmUlzHmNtb-m_i>6nODnPg<- zr3ySQ2DScjs9w>dFJ{pGq#|TLCTNC}UIxFTibZa`ICXhlSUZxm7Nklmx$NNmk`O zWR-J;dMJLV{T&jzRI%YmHRHam#*derBdT^gvY3rZhIk%ZyYy7W6_W@Fig_`*q^Dn& z?O)dIPQ6`Orj>cssxybc)Wy!$Gw*!ybxM{N(N_+50T+YH?yK$%(e-Ww&!|>w`IoB# zjRHEnJx~6-f>D2hJ-NhWH%{02#8eq_bYkWBAFjkdG!gk`3n?S>3J;G$^yKJt@7mhl z=o3{xe>+J*s;`}sevgc6hGm&sdg4CJs8ZjPW3LuHFzPQlD2$w)puaJ)*6hBvXKAPZ zbt1k=LZJF*U80jQ(}SCWm=dA>*3E-;_9@Bq`t2QY#l9!}J)gD(%Br!&gBESp{+n@O z=*ci5yIt{K?rNjZIQ}Q^MLSxaJmD@r7Hz1wJ-l=<%=o^Tg5t2YVU?VE@z*k6H1{1n zsVCE_+FIUfJd~$tK6)Ii==07=U*RkC3H55Qkihj^u&{ILV`HY2l<{i}ORN5=I>Z}) zPqFc%@jxL?B>@j|1N1)i1_`J1bc8=C8lI0eOh|Z-{a?r#yeQ4V?&F;$uL}GgDv|Y# zfQoIelDeIatekZLQ9gQ#wRZf^*$?fp{12Y?XRFa1&ljp&rw6SV>a?M&3lkjoDtpM$ z$6?-fkN2dmvc;GED?cN%T-t<)s(dMwrLsO?Io^<5T584lpaknPg)E_$M|@I!op?fO z2argti$^a|Pzc$rHOvRv%Xw?CFLbo=^@!{1sMIYngwM~MjOX*1fKa7ltCc+4*mfus z+4C{zQMekXn8AVXuq!G$W{TG}7uPQCtq~Yw_ntGsaD3{P$x>KdXvWSNkK)v+tjr=) zGH;FFOSg8FU+i}qYLgpV(%6iDlsb17lcR<%1i3}5DBJ#dGYB^dV+>R7^djUy<8Fke zp`lJL?qy_urjUJ-I&4}gGxKKY7%((2&T{;rdhDMi60Jn8kSV!ki{0^;X8cjCs!k=RQ>HO!P0rlnOB2}{(Jm#2}H*B8 zeDwaJu*BTVOb2q?*jt$&QR&)=gv*Chj%%xt!B=+siK%z(5)#+`@QzIwE1YXxZ~9sH z?g5A1Lk6Xf%$`$x5Nsa06opif;gL`VkQrUdHGfbKaY!&F!bB0Ez*e%v~C< zA+b)?N8VHSGT8y8Vqjt-4EO_*jY{=XAYGy~22y|cxH77hQ&s_D3@Tdy_Agz$co7@h z%KRH+KAg(4v!5Yc58xl%p#a+C=$tust`L4(KoS`h)!i-`%>ya<{seJCO-)Tzu1`@>WJE+n1O$^4 za`XI@;VW|5V8ay_miAol!c38Jlk_DW&M|S=U6uw9RzWauZ4j-V_?fbD3fCt{7e_>J zYgM^UaT7ppA4VZBXh;=go<4mF#R?I` zwY9CRtibqGzQF*%B?FYe+k=veZ9Qq+2_fL8hQNDER)7Kwj(jIIEo-;9o)5qh6xMp- zqsqPugZU@d$frMp*(CET%IJ?UG$$q|rn}JD+4=5f3awm*lJ3BqRA?xyFc&^{H!@!$1R^L6Hm1^9S$VVugad zd^3Zc*n;f!tL|DTX3*K03$(4~uST23y1I$-!~?beC_3w4wbFBHN-lLPFzx>&D{T|k z++~i8wjvTWAq*u!@Qi~Bql9?tRv%tha)yg&^!^&6KK)voZsPYAD%LF)@39BLEwN4}cejtRxZ3 za$R3`xlYb3I5t)iZ`uBXLX!cFPAlI}(&$nHaqJifTd!Ta_OTxRJJk}U>NE}-+~oHl z$p>Wq4&bf-UVrJzoQDHzKvpQ38cYT-AONxutg>l0ii|5{pWAg>JbLtIa&Kzh)|dg= zyj+L-9M0I*``_v&zk<{+gB9-<1t?_^b$fWW0niKpoy#)0+snm> z6^sC2K}mDhg@k%15WWgtwf}|%2<8m{I(Kmmz#y-e4y*)$LIS6xI}GATwJae zzJkK4qNdN5d&kMUhvlaorL5L@oMo&e-@AjS*kkpZbAVZhOGznGYC`iEFoZ0W0U8dv z%Txy7yZ~FU->3izgE2u#*tGoDa&lcz;SvZAA#|YtB!ShXX0EPJPN0INLaXKzoNK%ogXbg zkfHNa;kR04%kyI)3_ zK`IW4(V)OUEKIkwJ$V&IdV24VAH~GPa$G(=D|aY4kn1xl05}2^u1H-yC$3;_%%vg` zXzZ#?Se&=uq6lLYNEra&DzHodZ2;;3CK&+_#RazVk#v0I`=jg?n?zLGyGy0Z zpjA#VB8OoOKLd3WCZ{IYWhIpnU%Lhp?x}8)lf&9|1T#8!T})6K)rJ) zyNz7V)&13NV9A3B8Pv@gz|l*YmjrSYQfKpUc-cA3-+y#*4*4R=Bt8R`o}8K4(%PDp znhFF@z-Kec{s<1MuH+H@VUCkbyl%xf;h9&Fov%9iLy5nVQr3SYrDy(1O0WEv_`*TC zdKI-D=Oj0O6K7fBgKar|Wpf=n<%E8tRcq-1oqId(ABcZa_!tigsr7Q?94}t@wt8!X z@kBEbE~S^-U#9Nn=l!#!q$6Af2D3-+dYrI&l;Uo6c!k7DhfKZj z;$uo0tqMkOlkgUM6`o*1u8FHEs1_czvK7ze1m;Bfho(`!DfNn2X&H&hd#-#t2eMxK z)K;D=)||-2N9mW(jJC2z+B&R`6~*2<+I!f#?HiigB{vmbAQk0sI4a$1TY3%orrAfr zQ!ACntLsV2(SB={{XY+XOkVtj#)%+`*wUgk{UhV_S+_(T_2$G>s%Z`l*ap#Zzu%uw zT&i$#Ok2ebdV`F}9WFn~is6dYYTx5X+CvSA7v3CB-^PXr$)h){Zz1<-JKuVC^a?*= zW%-U--W%?iEcT3z!gwa09YbBu!V}y9CBkEKY2#PG;E!K!%A0ek+8}|@8d@E2x3Mif z!3AFVyJwkNTf72kgQ+!Zczq@wO%Htg-&B75y-Jm?uFb{bThKCQPhkKeDWT)J;TMR*1mwpr!Mt32*hHQUz z!Q+Ak-&jqJ!;^-btvMg!9+Yb5$3cRJfY_w9AF{A(Y`O*O@(DuMK(YuWk zJI?);!~HKw7gg>&xTj>nqBHGIcu7I6Q+>}5zdT0UC`fawhcABQel!n7qQxwWAfK~% z%XQOP!ii-EyYOZGsGHKO zGWHq+YLva`yL9A1vUQAf0!cx$OrrZH7LGAHq}pBdq9u|&jF+P{bm@cpw$|1)E_ekx z#2`Pe@<(y?nD-K1Y6<(1%e=!k`?@s!6D8X=mb|8b>hK-Iq-)IU;wX{Nzg5P1tG(x~f1O*UX;GcU)1cgpJ({ ztSE}bQt>T63W|1PkRDjO578v~vh&r}6Dc2YH#8fp+MEo{isr@Fu0MbHTuWoT;%Pv6yy<=BJ$q$-{Jh{YE&r0gL6Ap%v|o)1WdkqMqS@T1t1(yb8V()_ zQawnwzSK?A&_@$Oz-$&7f2i?0P*Cucw@e^Y!gPY+$Aj(H7K2Khc1pgB)>}&F)HUxG z$p~tr_11bt2~8)i1q6v)ztK@eBt`yOXOB&l?&lA6m+vQ%QI!@L{*+(6L*F){Qi8}L z622~UoNAeN4hdk1N2}+&mSs_8Arcb2%cSP0{1WeVw@#XYaw?NapMhYpesO5qlh4IU zDmCif0lP`m6>%OOHS}4$G^cAD^PS=yT-s-0uJmVjrMx7wR8JdKiR6r5B5LloA~C=a z_eqgA@~8WA1|u|wsauVMcP&kvrRO;1HUZuRpCY0I3KdPqN{PT+hDd$}ijIo;ny_!Z zPqeZpVhkQ*51WS0*!E}3De%#dhG{l_w&%ZaF@y;nrl?#0))P9M13N7CUXrg>#c1*a zVlJWITtznC5;8B-#GYQXQJgRP1aCQxY5=Js9Uh_=Y%D>gv!>%tGX0B1y1NT`Fm1O zpbwKSY~H@ar`f4)kvlOk5@>l?vwbBqL|J@t;?}NZ$eH(ITK>U=;_~lh>$uEPMjPM; zm?Lzny^Z(Xr5>B?5=F%4Oc{k~WDIq4A&;2nI+%sp7MDoQo+wJqAH7Fxn}t=TXpbGb zt~W7UDb@qy?pTBVyMv6Bbwt0jcixe4J`mf(2@weu4r~7NJ(U!+xSTdmUf1pS>o-h50&{V2mdpjp`GB&vPJ(PeQ--PV?{6qMkoalEOgKPJ>erogC)ICVj(?VvUs~+rtXqNo>;+#VT zRi7*Szr}R&Raz7eK5aczq}@8%3z${};k!^s*1(wJKe?9E%dRHsp%iX1njkE zs2dQGXg+z9kl4X8{Qc*z(2D}L?dn&!?fzwphRi)rKI`Pu8f!nRb5dNd$JXtd_UuYe zVkfie*BCqDhLkrP*Y?)C(e~*gw!+Tc94u3tPZlmOEj~s%y$Y}OtQH=z#Wved+S=%> zp~VKtF@@bkbsI@fQcFFDeesG@$}vYxb%w1%yTiZ7oX0HAhMEdXekA3cRQcyy z>yP1mm^fk_*Av{#Yvo)jZz6F}T7g_7n-kx9|BXWI@c|~Jap>G^P9O*6wT>%jRVG3A zdHcCd%&aa~-Q;iK;u+_#p4Ui~2L}3Amz^LEidb1^wQ8n7G%+7SKJX5$<==NxAefNu zQQXt+v$}`HuM^Gz;?V1Hf#(n6Kv3I+q4Z6^`I{fQm61oY|1SL_MS|(1OB>slm}h*{ zh_@)xx{V4HR1BW7^%xjxnV9#_Cijg#ALkm{L`RjYBdRDAtGm=0EulvmHA`fipWVGA zuhTL7;s^-HB)K zx)yRZRN4E#W-$M?BKQ9i$BX~24>=?QIU-dc>+0*L{0-V4{9b;;hXd4jFm2=>(F0;7 z1_nk;;pc#WZ+fjabQ~bP%@vjTg<}}eXn>CIod*>)wG&81eQ=&bG7kuF6p)t*0|HB?j@K9w z%`_CCF9I_3T+5spFl94mP-@G`sxOdySWh}$0Az{TDTCSn&8|`7hCR58Ut8)o?L!i{%|8f01Hg-n7bQAFO*VotG+}xlEA@LNYpWE+*94CupY`IX} z2$eWB=pG182-#kMQ5s+k&5c{2!Qg#ai$!Q%0tq6JPm1=BfJYz@bVC+_aGsEqM7M70 zaL~{Z7k^uo(-4hL*SVSqxqUWoD9+g-yFh;UpC06s%z&Qpy=`J}Kg{_4s zYQXSCTrr{ONN{r2)!iSLn7a0^`~)QJ8mLj*MaWYg@p5t5gAfm7C7BMxBcG+ypbRcj zrV&z&NM1+_o`I${G9n2bF;y#kO>mJxs@Ku-sYK-prgw0Orh5> zz^DM8n_WL7O9kMmL>lACQ=2din|0R_(ag*@n3jMwq=!3)B%>j-3!>JfX!}%!0NvbO zpwP;rhajB?2vx|t^t-ojD}iww$R!oBG{}gFQ!3E$(t6t3P#!X)XFLumnh30Au=1o= zE%@~aGt)*Rv)?G1$1Z2DCIu-m4{6p&9y<#VR$#Nupk5;hC)czOJ%r!qfU#R*8?tvb z62vr<4ICeVWUj*P0m)zi5`%THIfZVN)*P{DVt~oN016ez%tHR&v~n6K+lagDaSO~g z&?Lysmt;0*s}x)4fFKtjsfDlsduUOB$w{wv$kHviEdl#KWE%fYuwlp+H>^a%w&On7Y&(!P z?CI*dJ%~8C0!|tGOB+#x^6ySu+2;ktW$F-n`j9#zZh~>%Jvare8A`AG;vUg2-E}bV zgp^_8uYyCkh_E+N`wS7t!w`JVs~%jfVYV25QvxJwad}Szq`r+IbRkhLfF$cME_0G`f}E@)@TBuckRF8;F(NjDv4yl!V+4$%NMQ8KG{E=YY+F5}r9-VZc}sMQ zg9Q{peC+H!&Q3Jb{b(0}cC$<(nsxPX3S&~zGUv1_OY#r#>*l&mt$wVVIIM3v4e%Cnru5D2D(Z}NasZ`Z&?Cp zF}Aaq@%Oc*B!RIf2&*DNx7)DIw6@}|C^;5&TR5Y?0jR)hV} z#h+#j`8{<8AYL2+-AuvjX~}(#P5bh017jI()X7sbjJMCu49{-@Miadj|~x zk6z35$&PZ5A;`&d3|j&S9|cR#)M(a;nH_75yUCjZ7Y(E(yCNfj_YkNX_x0=b3HkRW z@#~1g=!GiKn5zQJUg>-Y8k}$7+iLZm_S`%_9Z&{>!@=hhre|0G4^YkWgAhZ!_V;t} z2W>POgK2X+H#TG&ij1W&E)0QuQYTI{P7=!O0>bT~1}ZjCq3GMCz+{*2%qlq(X8-2o zz~MN5|H)RNFc=y)H8SKw{NQppuQ@zy1=un`iAh6Ir6$8%c*TI{h1|($-2Az)V8o`$ z8I4N6@pUM8A5cEJL69{fo*m`;X@wl1l`J-S${3r;d zZtyu4<$MEj1R%v}%Puev1wLSXhDS%18RdS-9L>>G@i4}@f)XW!BZk^(BN)XvjhW2C z4vdk|z`zdJ7-9GWFbtoyHH*TnXz;UrdMF=#Ev>c~hSuS%l#2|Z-A6w^#cRCQh|xEc zxd_SO>4s8^$bt>xB-mkKo8RBvO;HS#2h2}CG;jdu3P6$Aus?+DahSc0<{9Q!EJuhE z5G^>28Jop{1V&8u7uDxC0d(wYY=O#&G(mS57!VI@puQm0nYh?QKOGeMI}^yzs4#f`Xy~+7ZlqeAb9WYPD@Qq zjP)V33p9ZwG^{m*rxB?J3dK0BTKMoJK{`tFm-t8X*Q+V~uUFHn zf4rJ5{P+CA=j)Q_Yyd_P zh;U`)oF0-p9;MVA29^lgmR?6Lei?wcMN+A<{24Q~w#zO~vC|Ic%)0*~afdPU=g?L@ zg@#Dfo3-*7b+paze6%sVE`7w|P^5`ck<~h~-l^`pk88bl0&=ZffUWFUWotcb-bf`bW3vu^t`eee=;0Nnr&I_yoOcAJu*~++uZb+4h{jnQ_H2jmmE|>Q?E#YWDH= zZ|*pg8*yLc^`*Oa%P#(T@MSXx)X3&v1nMN}uOH3Aj zkhZd)=wY(!{BqZmZ6qKo*>S3Wtu`TSHz|IijNVD9(TkL`tzo$AYfAp^s8S?-%CUM! zX4--+T0p)yguU`C`E@JVvwgpP4{fch&zSZihh)>02!59eRc_m5Q<04jPs~dHP>vA$ zm|()D+Q~qhwcjq2LNCq-kI7Qgi%H(NCJ^iG@c1!BHTveyBr!h>8M{XpUkgp-3?H1< zZnM4ffbxAY^M>;*=d)D0gwbC$!?nD(0MnUxE}d!P^O@n+Sm0|lL8{wNF^B02eL`9) z1FCLvs-o2%M@jDa1$JHN_*NKsq%15MW*tR6FCxM)*gN%<$;$oub(-(bnO}UcT%e}K z6}8R7ilI4N#upf^X$%>rcqy2a#;YyVdzF}38glyeM4Ul)dcwWj-wBCYzV-e@0~k!s zkAb*SHin5!CzxehP2r zFHbWe*q~a)-geDm&jow}1X^llvpCGiS-a0^wU9G>wSAS@t|D?@9-pfL`}D-{*|l-S zd>fX3K@z`qHhI6tAJlLjK?coo5d6q@q_=3l6wSclUH|9Ya7vYYog#ABtoHvHEp0E~#*6BA0gez5i11n`m3<5XU4JYrUjCEJHB zy5bFX#p4*e&CirqlV=X&6;rAHz=lkeL zC4ay$W669-t&f)QUB2St<{eHg+S@R27TdSPu5#;xz4_Ypg2+nEXVPyP&SJy(8of9H z+9w4S;=x88j0dbTOVLiVlRX^s{Yesm^wEqp)A7f*iP^+Wh;AnNcIT>UrYh% zlVmpZ9OB!3fuj%DceR!OPi~#f7(v0k;X6Xp2Fq9QD4{8S>c@ag2*sAl}MmU5*abAf151@bTP#)Q7hWSXu12%6atxEXgae&?I=WbO07 zEr;D^G5`|s0{%f9f6R~=tdxgQm1N}2-!=VZ+(K-omZaBG)qTi7R9^7c~3=9 zyGLgB{xd$Mj#1l)Z9|(Oub}B{YApMg%F+p!NFb+DMKE*Gf!$Oqd&q1s;rIZ1bK&*B z!y=Co0pNO?=<%e53DEJ3E7aLzO@S2u2^g7KE>+4%LGc&atdNS}IeFJP34!N2Kt%o5;4Cvd<-`E8+!gsWaWM*y~GJn4Xxq&e6BP zGFqhE8i`StxncTcfQoo9KIbu}Z%`guTrJS!$-|#6Wd4K<;2UZe#i(k2V(iXp>6&+gI*3SwcrxX;m-|DVB_ z8#zt~rx^{4OJvd&XhnM7Y0Twx&($a#n{49rYh9&&BUq<-Ff+;#xbM+`s6y_GYm6JcXHGT+mF%I*3_ZBgE_o<_U4QJm%tUy z+9XgS%QNSp^sD&biQe_Fv*+S+d!M;U8q8ol&`jEIaTVWLC~P~__4EzH)d=7v_wsnE z*;oHCeB02}fQeBr<$nH0IOt}<^R8e6BJW8?k+U9E;W70HLwI*tZ?cN8 zdepNGQ*(%CE;5MraxnW(9S%eccr|tRr3ME6;2lON6^?F$(>L5zPN2l{X$Dl&V zkkPPHH>A5&d_=UEO+xrs(z?t=`GJ12jzh~vhmkUW7ym@z@$I_prnddbH-z!B2D%X?|{^;TD_(V7B^3TcF++>j$wDXo|VzUdH``6_7 z9q;fvQ#-jgQZ^+t`B>1A(bd8nG04 z-&(7~otWlbYd!8A^*`-KeNRcOm188Fi>r>r;2zcEr;{%-0{XMWBz(%YULCq~SYk$I zbw(SuK3w0KDtspX(ErRC_C@zzZ%qdld-ITm-#&ClEUYCyKdG0Y<;_AYKxPaKv@duc z#9n`c=ya(f{L7a#Jsf5O<>%wgp@eKZ0W7n<4I1G|Uv4SNKXAy(cWdYD9DN_?McTf) z)_o59#z-5nSw+i-yaTMf$YsY%R+kKu3v}f=+Oo=t%ZuJMs1f1mP#wa;_bQb3hMQ$w zk#cw{%e<>k`7(zGbWhqZr6jLOIX7cw8$BEvhhasCo z+2+{v50L{Ewi!I{$2`7etB=JZS?lW$HBryPx(zrrijLfPx9v}$Vp|{DOyDR2$L($^ z*XZX8RBYzk)I(gJp1~7ZR8<7eRaX(IrQd`yS}7@(FEmkR_j40|T-LChu9h4*sXs6> z@dfl`QcMz@vSS5$O{j-IThw+OM{=D1P_{Iticv#H10E@_v-mX+GwSTmpzs>9_NKnr z@#1s8bNKTRpQi!!jrXn4-Epb=gEeEkQm)YNRhRvZInqBe_#WP-YM&?XVqW>?Y^7t_ zmRc~H;l>i7YtL1s3S!PXCL6(q7d@F*>0mn60{NQn)MSuzZ zZ~io2W7RNu86^VZ@YuAE>z!x!_RkV;2$zqHE_T3?=ik81s#+$}c9Pn8=6yvtakMt8 zC-lS>X+Atxg6Z|U)-Ioetm0>?zjgd@l+_naC?5E|_!TZ7;Ob)g?*3i&WPxdqiKPGz z?57?kR~Fz`@PeI=w^4u2wR|_6aQ+;2M;@b25a|EzC))p?9Nhn3c}Deby+LGP^V9U=#+($@+CM@HEscFV8x{_U|P}*s+}09 zNr)#ZCbkDC1}WJO0AoP4CKL~uM1aeDZ4}&J-Xj8H`BcXb-c->z>sqMKW`{_-JpKI0 z0k)tsFv_7h?3+7`vOSufyUUO@L|E|%p5c{09Am)(4Rla5wlM%Nv)@6vfU*d#D_;QF z-lgSbbX$Z;KIEcx#sO#r$rfT9ZYD6*hfRBh7mc$`Ae6s z1c0d>U;^w}0juM6K(mJrVh@_hxH5MYA794sXI=4xjRjlr?~~_OBja&uM~WqajiD79 z7Yl2{jGD0>U;+@LfJ<+lDSBiu|J4)l?8(3;uUn1}rCTC}v}9HH_x~+On)u&B(nhua z&q2}?vH$lW=_PyP{~3}Vt65D2WRQi0Md0ycz*Y>0TbFliI{bAbKYw85y1u!P!oLFp zV&RyqrnYu(cb9D=Wi2ax#1tVYn{kkbTkjy4^_5EqX1#gb?&akLXrHdmKGj2FDykTO~2Cd#p3aE_jt`a3XfoF1n*hh{I+LIlt5IT^0t8|Yc4T4O2!MFA9p^NGE$p1-|OS!%C_gT(G@&#y(0G5ql! zKp(_Jn3Ux0X$DS~eAbr_u6ZSlkgG~a_~iIom4m=#6IcVci5OTvw;z2c_WL;RcMNQ>&pQky<+W}f--#o>3*#!n+#Q@ zk&NsE{2uU9esFeoZUq=uDx9_9DCz_mXHDrzU=M1@1OF<}E&)c;&-7&jtd;?hs?dC_Zp)+17zG19L?rh z0F!it^1eQ$Tky6f(v>%e?jHpqAAXe7uWIdRtM2X z3jIeLol+rmV+PHQA2hPa0f)_5+(FhY)KGP&qAMYTN<6*0;W7*vfNUe&>7)}96QRIo zBi{@HrP?tDJT9its}xXD>I1{zzGrUWCz?ruf>N2q=Wf_OEEY#fl^#t5NiA$g!icaK z%(j>{8pzWJ!bnf|C=aAouQmqF$3CZY%dvcr)zIL3QSDK}&z{?V0M7ZiWL$Y)mcW$o z#-#Y2yLW*+6~<-!2)hbAq>TUt$r+yEK+F`1+>%bOz(O!z!3jFS?X#mG&>cg{2<|(B zW(#NJ*1n1z)HC_V^Uwtz5cU~>cHx6g<@N-{|U2uE9{^xo1kZo`04PkGQt0SM%p#2a zZtguFHO-wX(IGqWYT}XHHko_vKye8^1B9})F+C_@y5+|Qw(Y5F>ad<}&9uigAIaNl zm2E|XQ?V7_BDkJ@IWQ8`hU$(AY2Dwu`b#4DS$vMNBX}dH4*NjPd>L?YwMBG^RT{o4 zbfo>kj=9dc%_9WcsZz~6;;aJD2YZ+;b>bZevd*17`}rx2PK)-77rzm{##smOqW@om z^*lh!4@zyy^^)gk4i7lr*VvpZBs0hJ)YkSaQl832=K*FnV^0HwS8#3 zb>O;QVmrBYu6t)0c|=SM8b<5kcIB~pG1d`mJ@deeSVOG*+?0`M-c=7cS(Ph4E&~Girb>;?%Sikag`G zi{$VZ(eZr3t5@X=zcB6p1T*!{P2n<*@Y3cKgszF!6>c<&OE{<$AN8dF|%BtuO} zGqdb9tv(>@Ky~c$kyAhb81KMf`wDNM$NU*^;05wKNL2-s-co}+Hxd|JzAk;pn^?|u z&3+&?d1mt97(xipvnOagpE?;$IYo<5D%nYaWw^jJoE-k zghkk(!0vYLqLj}_!)Jg0*e;|_hF8tkmTP-}b^R2Ryvd+RADZ%86($AI*^^flXp2 zY0#zQdGVMB<}YAVXe?;fm5qr^m*g;>ONKHHnMPoHE2K^(sw`>_nMO;^8_ zFLYI~O18~!He$EJjw~)J3iTh!gO9^H^w83KMGHg11P)R+y2I-S z{2KD$AOe&&a9aSM?5KWp1Bsf2ZutGkP$Cdh0|z=dyBv92cO(;3*5t16 z2GeX3C|0fDo}60IHERjczLiy`OT4i zT;)h|FKHRbOUQNd!x?(Syz+BuRn(uiuqnU(L4oy?mddZVGOZA)ZtLo|W&y=*d%nqw zZ`0;2z09s9!4A+!KT{Qw*`a3CK0SH$`lq#hjg$N#qCj5Z)VNdyDiuP$)pEJoyo)m# zo%acdT@96t*@U{!ZG4}OQ5j-N5r20gZg$08l|+qzcv#g7r|vBFYVWx}sZ((YolO1x zuH$0o74^S*<(-R6XGUF)$ET&xyyTNEx$gUCW7*D5nYv4Pldb=wSB@E-MIB`6@VgXO z6y>kdNLgQen7c-2gXXK~-f?fJLLP77wQHd%&$n^@X)tW#p{cd)BqVKdS{)PpO9fb0 zL-DP?ULEwp6(KEJCw3Ld??4Autc+%Trv8(ChV-&(te)@CHQgJ(QWa4=tunIzqq-}9 zhjM-6LrK!asVF3;7?o^g$r{%zq^|L*rpjwL5;xQPN@IWgTm6+E5i0zK`Z>nvVZJ4M&X`@=guD#Iquj$z)0`N9+qV>_9=+@K69++ znf9m-x2w-IB@W(hNxSF(x3$#9;Kj=x=-eO*>bG(g-65Vumt&a&s8>Wot5N&15|k-i z>TZbUs&z`dHAYI2v-y?8Ike7S#%UdeQErN3;~m}dBIAtt*_6x==&5<+BzmL$nfmsm zR~II|=uHm|(;DGB7V=yirZrLs8IF}8@XOoj^v=BVq(7`(8;UGcbWQdsk2Cgm^~6(q zw-}Jn(qs0e;!$1d-1&GmEhAt2+&D*Q1bjY@&*XqKAd-I{s@NU~J0zBcVUq>W)I2%I|$HH-i?w8b^c`GbiokU9) z?Is3_yvqmEZP4k{h?d7?A)Uc6;pZ1BY^+#dL~yi#e5bx z4q+{aNo7Bz)xB@EOLxJ-#r}H*WNBiJ-NTs0EhzeH(4@VI{mU5dL92!MDXC=@tCc~K z6z;6I%TSN}O<7fS=S!hkqq0-b60^x>p#DYlrHJvxIO91XM^VFS5 zDJ;W00{fNNzZkSNt=2lG7+Jjz^>S%gx;$shw18(fViF~dyVk)yrx$SD6`;%fzkiG) zHeIPd_2mm0^)O~vyY9Np19-yl%V`PCdl{~S&7yPzb7RuyRHIjrLF+mld3N+n)^YWZ z=2NQS1|PONkex-?7z%BO*z%8TJ1X0&S!QLEcPXJNEXg#J6rmp(<9@8aI7DiK_%qc$ zD7VLHaalLfZBB~v$Cy_COk-N1LXWwh{>Ljqs#)Yel;%dmi1vaW?YrUEJ8* z!KGm`3s@BvcK5VO6|&X{;Lhu&z~;zvcwl$G32ETLl}x9)AiS3yeyphi$%HhrM?qUp z?^o8*W$@}9zB8?}!e@EV^&5W>)eoKkj-1mMgE5-8;Z&d{QOKUer`^O6o5I>7u+iNj z2}sFKZfUt~Q5|Hl$rLN#GtIA>Xl7(sT4AY+Z8IK%G!Bs6rAA2kGMep2MP*=PlNJd^ zY1g9)rns`6^pD-g2PzrfYP}8{Wog0GY|q1L<5ZAR3F{eNifQ7kVHK5kRI+A!8rU5d(yUFf8-w{fU^py znTI7bO%5(;Up7tL9xi1%hY(iZR*v~+Q)OkDP<$c(I7Lb=oM z^Q?t3K1=3=JB28N$2~8XU3*j?dBFk%I`kQ)cf&H`s{Ox)?OjZI3q24Ru^T!UIfv)J z6CMCXPhXTAUb{&~O?WN3)?Z|Mtk=>j-~fYkng!hy(~SJI&>@4F$Q$y2sD(J@W#NKr zZYbl_WK&k;YhDC}*PFlysBN#^<&TD4{Z-rE{hU;0oMWt7d+>OG&v#e@MHhN`ug+pc z)bH(7X5G~j5HiF@>}g?&(?9}l;NHXh0pmfNA3Gm)qL*r~X7x%G2*~Gpez*Qz;&!N9 zc35%c26@LRf>|p;Y^Y1od7wVZ5`oNW_>njsrkxjML*!qdTLG^*tj$%YrGAJ;NOqTbm5> z%uEh$o7BS)(kkGgG|ZvHd&+sMW=;UU09AeKD&VctWi#A_iP1Y6?-GIXf$VYUIbfsjCLIs-qjz(0Ev6;|bm-_${7j!{Xi|4D1^ZatkUun%RBI@+ zpJ`w=Ff6u&jg4rG`g(Q{j6AC$2+dZ;6 zIMX=PeB1tuqPvx8E|+) zb9Zo(WcWNxw6t%$OA(nWAyaGbBZi@}s_-1vO>Q}#9qvDktD>$^<)#L!w?jr9;Zcpi z*lff$&2Iv0DXQR6c9+F<)X(UfP#~0Q`^NeB^SyHqgZ%^Zfx5>$HMK zdFhc5m*bYl%}KOCF+2GC+=znH*JBUNp6RoCtfu>yFTm9K4{st;6>OW*EH5 zXyW~Hhwr@M%M}88uldwh558kzU2GP}nSz!*frT5$O9Y`%gb$vUBeZIJLtYIn_yVeF zN!unTRmF&9E=HOd@FbgebeniI`iQ+utk6c-qLwVggCb9h zc_wH}gBH4%w^mA#p&Oo;^YQG&Yrf=h&u9o7_3r!VSGn^ictNPLyOXs`Z9IKFY_HUJ zGVf4WM`vF(#@h@x_TCnB__ej!GfgTpI{|8-&WZ$XxAKT3ePrHg=CDqK$mZtNG3;qU@uu_f+*z)@`_GB^imkL0}1@FKA_%MZ76xhM_h@Coj!AUcY~ ze@WfeISHs@P%YQjVk!dhLC1Z2{(^D`eDK*)#MVtV{9wMOeGU4%Q}gvcuV@H;0^az! zL=26qq|E@G{~&r0ZczK#iecLHMAlPl^fJ|R_Ef-x9AJlyd0S z;8GHyeNurVfE-jc6!t}`bGe#W>(!E<5cY*VEvWdw1LL0`x5qoNJnu!A1bKKzItGzs zdQx4CD%;g(X6SvUVC}?pl!F8Ht{JYZd#r!;Vws=D(@c7HV|@THs`^ouYkouUs`!jfW82%m%tqcDy*bLRU;n@2r|UKF;N3$^DySM@T8WKPfCxxh|5 zJr~pk|AI|?KG8S-3roQ-qu2!K1%ZrS{Hn!e%lS*D>G&NsYZ3%X*FL}ofP-Eg6n0@> rqanS&UX{Lo=mSqae43`g;h^4 From 3399145535f6f5e69f236baac1e41a0a6f5a0ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kry=C5=A1p=C3=ADn?= Date: Wed, 8 Jan 2025 13:06:21 +0100 Subject: [PATCH 2/3] Feat(web-react): Introduce `alignment` to `Dropdown` component #DS-1411 --- .../src/components/Dropdown/README.md | 58 +++++++++++++----- .../Dropdown/__tests__/Dropdown.test.tsx | 60 ++++++++++++++++--- .../__tests__/useDropdownStyleProps.test.ts | 28 +++++++++ .../Dropdown/demo/DropdownAlignment.tsx | 38 ++++++++++++ .../src/components/Dropdown/demo/index.tsx | 4 ++ .../Dropdown/stories/Dropdown.stories.tsx | 18 +++++- .../Dropdown/useDropdownStyleProps.ts | 11 +++- .../web-react/src/hooks/useAlignmentClass.ts | 2 +- packages/web-react/src/types/dropdown.ts | 26 +++++++- 9 files changed, 213 insertions(+), 32 deletions(-) create mode 100644 packages/web-react/src/components/Dropdown/demo/DropdownAlignment.tsx diff --git a/packages/web-react/src/components/Dropdown/README.md b/packages/web-react/src/components/Dropdown/README.md index 3a7b033c8e..b9f4e71bb3 100644 --- a/packages/web-react/src/components/Dropdown/README.md +++ b/packages/web-react/src/components/Dropdown/README.md @@ -52,20 +52,43 @@ import { UncontrolledDropdown, DropdownTrigger, DropdownPopover } from '@lmc-eu/ ### Dropdown -| Name | Type | Default | Required | Description | -| ----------------- | -------------------------------------------------- | -------------- | -------- | ---------------------------------------------- | -| `enableAutoClose` | `bool` | `true` | ✕ | Enables close on click outside of Dropdown | -| `fullWidthMode` | [`DropdownFullWidthMode`][dropdown-fullwidth-mode] | `off` | ✕ | Full-width mode | -| `id` | `string` | — | ✓ | Component id | -| `isOpen` | `bool` | `false` | ✓ | Open state | -| `onAutoClose` | `(event: Event) => void` | — | ✕ | Callback on close on click outside of Dropdown | -| `onToggle` | `() => void` | — | ✓ | Function for toggle open state of dropdown | -| `placement` | [Placement dictionary][dictionary-placement] | `bottom-start` | ✕ | Alignment of the component | +| Name | Type | Default | Required | Description | +| ----------------- | --------------------------------------------------------------------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| `alignmentX` | \[ [AlignmentXExtended dictionary][dictionary-alignment] \| `object`] | `null` | ✕ | Apply vertical alignment to trigger, use object to set responsive values, e.g. `{ mobile: 'left', tablet: 'center', desktop: 'right' }` | +| `alignmentY` | \[ [AlignmentYExtended dictionary][dictionary-alignment] \| `object`] | `null` | ✕ | Apply horizontal alignment to trigger, use object to set responsive values, e.g. `{ mobile: 'top', tablet: 'center', desktop: 'bottom' }` | +| `enableAutoClose` | `bool` | `true` | ✕ | Enables close on click outside of Dropdown | +| `fullWidthMode` | [`DropdownFullWidthMode`][dropdown-fullwidth-mode] | `off` | ✕ | Full-width mode | +| `id` | `string` | — | ✓ | Component id | +| `isOpen` | `bool` | `false` | ✓ | Open state | +| `onAutoClose` | `(event: Event) => void` | — | ✕ | Callback on close on click outside of Dropdown | +| `onToggle` | `() => void` | — | ✓ | Function for toggle open state of dropdown | +| `placement` | [Placement dictionary][dictionary-placement] | `bottom-start` | ✕ | Alignment of the component | On top of the API options, the components accept [additional attributes][readme-additional-attributes]. If you need more control over the styling of a component, you can use [style props][readme-style-props] and [escape hatches][readme-escape-hatches]. +#### Alignment + +Dropdown supports the extended [Alignment Dictionary][dictionary-alignment] for alignment on both axes. To use it, set the +specific prop to the `Dropdown` component, e.g. `` or ``. Adding +any of these props will make the element display as `flex`. + +We also support responsive alignment props. To use them, set the prop as an object, +e.g. ``. + +ℹ️ This controls only the alignment inside the wrapping `Dropdown` element. And even with alignment, the popover will still be positioned +at edge of the `Dropdown` element and on the place defined by the placement attribute. + +```jsx + + Button as anchor + + + + +``` + ### DropdownTrigger | Name | Type | Default | Required | Description | @@ -89,18 +112,21 @@ and [escape hatches][readme-escape-hatches]. ### UncontrolledDropdown -| Name | Type | Default | Required | Description | -| ----------------- | -------------------------------------------------- | -------------- | -------- | ---------------------------------------------- | -| `enableAutoClose` | `bool` | `true` | ✕ | Enables close on click outside of Dropdown | -| `fullWidthMode` | [`DropdownFullWidthMode`][dropdown-fullwidth-mode] | `off` | ✕ | Full-width mode | -| `id` | `string` | `` | ✕ | Component id | -| `onAutoClose` | `(event: Event) => void` | — | ✕ | Callback on close on click outside of Dropdown | -| `placement` | [Placement dictionary][dictionary-placement] | `bottom-start` | ✕ | Alignment of the component | +| Name | Type | Default | Required | Description | +| ----------------- | --------------------------------------------------------------------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| `alignmentX` | \[ [AlignmentXExtended dictionary][dictionary-alignment] \| `object`] | `null` | ✕ | Apply vertical alignment to trigger, use object to set responsive values, e.g. `{ mobile: 'left', tablet: 'center', desktop: 'right' }` | +| `alignmentY` | \[ [AlignmentYExtended dictionary][dictionary-alignment] \| `object`] | `null` | ✕ | Apply horizontal alignment to trigger, use object to set responsive values, e.g. `{ mobile: 'top', tablet: 'center', desktop: 'bottom' }` | +| `enableAutoClose` | `bool` | `true` | ✕ | Enables close on click outside of Dropdown | +| `fullWidthMode` | [`DropdownFullWidthMode`][dropdown-fullwidth-mode] | `off` | ✕ | Full-width mode | +| `id` | `string` | `` | ✕ | Component id | +| `onAutoClose` | `(event: Event) => void` | — | ✕ | Callback on close on click outside of Dropdown | +| `placement` | [Placement dictionary][dictionary-placement] | `bottom-start` | ✕ | Alignment of the component | On top of the API options, the components accept [additional attributes][readme-additional-attributes]. If you need more control over the styling of a component, you can use [style props][readme-style-props] and [escape hatches][readme-escape-hatches]. +[dictionary-alignment]: https://github.com/lmc-eu/spirit-design-system/tree/main/docs/DICTIONARIES.md#alignment [dictionary-placement]: https://github.com/lmc-eu/spirit-design-system/tree/main/docs/DICTIONARIES.md#placement [dropdown-fullwidth-mode]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/src/types/dropdown.ts#L19 [item]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-react/src/components/Item/README.md diff --git a/packages/web-react/src/components/Dropdown/__tests__/Dropdown.test.tsx b/packages/web-react/src/components/Dropdown/__tests__/Dropdown.test.tsx index 829d0d6264..5f8e57c191 100644 --- a/packages/web-react/src/components/Dropdown/__tests__/Dropdown.test.tsx +++ b/packages/web-react/src/components/Dropdown/__tests__/Dropdown.test.tsx @@ -2,6 +2,7 @@ import '@testing-library/jest-dom'; import { render, screen, fireEvent } from '@testing-library/react'; import React from 'react'; import { classNamePrefixProviderTest, restPropsTest, stylePropsTest } from '@local/tests'; +import { DropdownAlignmentXType, DropdownAlignmentYType } from '../../../types'; import Dropdown from '../Dropdown'; import DropdownPopover from '../DropdownPopover'; import DropdownTrigger from '../DropdownTrigger'; @@ -19,14 +20,15 @@ describe('Dropdown', () => { restPropsTest(Dropdown, '.Dropdown'); it('should render text children', () => { - const dom = render( + render( {}}> Trigger - Hello World + Hello World , ); + const trigger = screen.getByRole('button'); - const element = dom.container.querySelector('.DropdownPopover') as HTMLElement; + const element = screen.getByTestId('dropdown-popover') as HTMLElement; expect(trigger).toHaveTextContent('Trigger'); expect(element).toHaveTextContent('Hello World'); @@ -35,13 +37,14 @@ describe('Dropdown', () => { it('should be opened', () => { const onToggle = jest.fn(); - const dom = render( + render( trigger - Hello World + Hello World , ); - const element = dom.container.querySelector('.DropdownPopover') as HTMLElement; + + const element = screen.getByTestId('dropdown-popover') as HTMLElement; const trigger = screen.getByRole('button'); expect(element).toHaveClass('is-open'); @@ -51,16 +54,57 @@ describe('Dropdown', () => { it('should call toggle function', () => { const onToggle = jest.fn(); - const dom = render( + render( trigger Hello World , ); - const trigger = dom.container.querySelector('button') as HTMLElement; + const trigger = screen.getByRole('button') as HTMLElement; fireEvent.click(trigger); expect(onToggle).toHaveBeenCalled(); }); + + describe('Alignment tests', () => { + const alignmentTests: Array<[unknown, unknown, string]> = [ + ['center', undefined, 'Dropdown Dropdown--alignmentXCenter'], + ['center', 'center', 'Dropdown Dropdown--alignmentXCenter Dropdown--alignmentYCenter'], + [ + { tablet: 'center', desktop: 'right' }, + undefined, + 'Dropdown Dropdown--tablet--alignmentXCenter Dropdown--desktop--alignmentXRight', + ], + [ + { mobile: 'left', tablet: 'center', desktop: 'right' }, + undefined, + 'Dropdown Dropdown--alignmentXLeft Dropdown--tablet--alignmentXCenter Dropdown--desktop--alignmentXRight', + ], + [ + { mobile: 'left', tablet: 'center', desktop: 'right' }, + { mobile: 'top', tablet: 'center', desktop: 'bottom' }, + 'Dropdown Dropdown--alignmentXLeft Dropdown--tablet--alignmentXCenter Dropdown--desktop--alignmentXRight Dropdown--alignmentYTop Dropdown--tablet--alignmentYCenter Dropdown--desktop--alignmentYBottom', + ], + ]; + + it.each(alignmentTests)( + 'should render alignmentX=%o and alignmentY=%o', + (alignmentX, alignmentY, expectedClass) => { + render( + {}} + />, + ); + + // If your component *always* applies the 'Dropdown' class, include it in the expectation: + expect(screen.getByTestId('dropdown')).toHaveClass(expectedClass); + }, + ); + }); }); diff --git a/packages/web-react/src/components/Dropdown/__tests__/useDropdownStyleProps.test.ts b/packages/web-react/src/components/Dropdown/__tests__/useDropdownStyleProps.test.ts index e2a1fb2c15..6f07fdba04 100644 --- a/packages/web-react/src/components/Dropdown/__tests__/useDropdownStyleProps.test.ts +++ b/packages/web-react/src/components/Dropdown/__tests__/useDropdownStyleProps.test.ts @@ -1,4 +1,5 @@ import { renderHook } from '@testing-library/react'; +import { SpiritDropdownProps } from '../../../types'; import { useDropdownStyleProps } from '../useDropdownStyleProps'; describe('useDropdownStyleProps', () => { @@ -29,4 +30,31 @@ describe('useDropdownStyleProps', () => { expect(result.current.classProps.popover).toBe('DropdownPopover'); expect(result.current.props).toEqual({ transferProp: 'test' }); }); + + it.each([ + // alignmentX, alignmentY, expectedClasses + [undefined, undefined, 'Dropdown'], + ['left', undefined, 'Dropdown Dropdown--alignmentXLeft'], + ['left', 'top', 'Dropdown Dropdown--alignmentXLeft Dropdown--alignmentYTop'], + [ + { mobile: 'left', tablet: 'center', desktop: 'right' }, + undefined, + 'Dropdown Dropdown--alignmentXLeft Dropdown--tablet--alignmentXCenter Dropdown--desktop--alignmentXRight', + ], + [ + { mobile: 'left', tablet: 'center', desktop: 'right' }, + { mobile: 'top', tablet: 'center', desktop: 'bottom' }, + 'Dropdown Dropdown--alignmentXLeft Dropdown--tablet--alignmentXCenter Dropdown--desktop--alignmentXRight Dropdown--alignmentYTop Dropdown--tablet--alignmentYCenter Dropdown--desktop--alignmentYBottom', + ], + [ + 'left', + { mobile: 'top', tablet: 'center', desktop: 'bottom' }, + 'Dropdown Dropdown--alignmentXLeft Dropdown--alignmentYTop Dropdown--tablet--alignmentYCenter Dropdown--desktop--alignmentYBottom', + ], + ])('should return alignment CSS classes', (alignmentX, alignmentY, expectedClasses) => { + const props: SpiritDropdownProps = { alignmentX, alignmentY } as SpiritDropdownProps; + const { result } = renderHook(() => useDropdownStyleProps(props)); + + expect(result.current.classProps.root).toBe(expectedClasses); + }); }); diff --git a/packages/web-react/src/components/Dropdown/demo/DropdownAlignment.tsx b/packages/web-react/src/components/Dropdown/demo/DropdownAlignment.tsx new file mode 100644 index 0000000000..02d83c9d2f --- /dev/null +++ b/packages/web-react/src/components/Dropdown/demo/DropdownAlignment.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Box } from '../../Box'; +import { Button } from '../../Button'; +import { Grid } from '../../Grid'; +import { Item } from '../../Item'; +import Dropdown from '../Dropdown'; +import DropdownPopover from '../DropdownPopover'; +import DropdownTrigger from '../DropdownTrigger'; + +const DropdownAlignment = () => { + const [isOpen, setIsOpen] = React.useState(false); + const onToggle = () => setIsOpen(!isOpen); + + return ( + + + Button as anchor + + + + + + + + This is a big unrelated box to demonstrate the Dropdown Trigger alignment + + + ); +}; + +export default DropdownAlignment; diff --git a/packages/web-react/src/components/Dropdown/demo/index.tsx b/packages/web-react/src/components/Dropdown/demo/index.tsx index 8996f51d92..a690e79c33 100644 --- a/packages/web-react/src/components/Dropdown/demo/index.tsx +++ b/packages/web-react/src/components/Dropdown/demo/index.tsx @@ -7,6 +7,7 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import DocsSection from '../../../../docs/DocsSections'; import { IconsProvider } from '../../../context'; +import DropdownAlignment from './DropdownAlignment'; import DropdownDisabledAutoclose from './DropdownDisabledAutoclose'; import DropdownFullwidthAll from './DropdownFullwidthAll'; import DropdownFullwidthMobileOnly from './DropdownFullwidthMobileOnly'; @@ -20,6 +21,9 @@ ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + diff --git a/packages/web-react/src/components/Dropdown/stories/Dropdown.stories.tsx b/packages/web-react/src/components/Dropdown/stories/Dropdown.stories.tsx index 0e2e4d4ddd..5ba680939e 100644 --- a/packages/web-react/src/components/Dropdown/stories/Dropdown.stories.tsx +++ b/packages/web-react/src/components/Dropdown/stories/Dropdown.stories.tsx @@ -2,7 +2,7 @@ import { Markdown } from '@storybook/blocks'; import type { Meta, StoryObj } from '@storybook/react'; import React, { useState } from 'react'; import { Button, Icon, Text } from '../..'; -import { Placements } from '../../../constants'; +import { AlignmentXExtended, AlignmentYExtended, Placements } from '../../../constants'; import { DropdownFullWidthModes, SpiritDropdownProps } from '../../../types'; import ReadMe from '../README.md'; import { Dropdown, DropdownTrigger, DropdownPopover } from '..'; @@ -17,6 +17,20 @@ const meta: Meta = { layout: 'centered', }, argTypes: { + alignmentX: { + control: 'select', + options: [undefined, ...Object.values(AlignmentXExtended)], + table: { + defaultValue: { summary: undefined }, + }, + }, + alignmentY: { + control: 'select', + options: [undefined, ...Object.values(AlignmentYExtended)], + table: { + defaultValue: { summary: undefined }, + }, + }, children: { control: 'object', }, @@ -45,6 +59,8 @@ const meta: Meta = { }, }, args: { + alignmentX: undefined, + alignmentY: undefined, children: ( <> diff --git a/packages/web-react/src/components/Dropdown/useDropdownStyleProps.ts b/packages/web-react/src/components/Dropdown/useDropdownStyleProps.ts index 83b7cc69f4..621d06c000 100644 --- a/packages/web-react/src/components/Dropdown/useDropdownStyleProps.ts +++ b/packages/web-react/src/components/Dropdown/useDropdownStyleProps.ts @@ -1,5 +1,5 @@ import classNames from 'classnames'; -import { useClassNamePrefix } from '../../hooks'; +import { AlignmentPropertyType, useAlignmentClass, useClassNamePrefix } from '../../hooks'; import { DropdownStyleProps } from '../../types'; export interface UseDropdownStylePropsReturn { @@ -12,19 +12,24 @@ export interface UseDropdownStylePropsReturn { } export const useDropdownStyleProps = (props: DropdownStyleProps = { isOpen: false }): UseDropdownStylePropsReturn => { - const { isOpen, ...modifiedProps } = props; + const { alignmentX, alignmentY, isOpen, ...modifiedProps } = props; const dropdownRootClass = useClassNamePrefix('Dropdown'); const dropdownPopoverClass = `${dropdownRootClass}Popover`; const expandedClass = isOpen ? 'is-expanded' : ''; const openClass = isOpen ? 'is-open' : ''; + const rootClass = classNames(dropdownRootClass, { + [useAlignmentClass(dropdownRootClass, alignmentX as AlignmentPropertyType, 'alignmentX')]: alignmentX, + [useAlignmentClass(dropdownRootClass, alignmentY as AlignmentPropertyType, 'alignmentY')]: alignmentY, + }); + const popoverClass = classNames(dropdownPopoverClass, openClass); const triggerClass = classNames(expandedClass); return { classProps: { - root: dropdownRootClass, + root: rootClass, trigger: triggerClass, popover: popoverClass, }, diff --git a/packages/web-react/src/hooks/useAlignmentClass.ts b/packages/web-react/src/hooks/useAlignmentClass.ts index a3d3510d88..0c02ee99bf 100644 --- a/packages/web-react/src/hooks/useAlignmentClass.ts +++ b/packages/web-react/src/hooks/useAlignmentClass.ts @@ -1,7 +1,7 @@ import { FlexAlignmentXType, FlexAlignmentYType } from '../types'; import { generateStylePropsClassNames } from '../utils'; -type AlignmentPropertyType = FlexAlignmentXType | FlexAlignmentYType; +export type AlignmentPropertyType = FlexAlignmentXType | FlexAlignmentYType; const DEFAULT_MOBILE_ALIGNMENT = 'stretch'; diff --git a/packages/web-react/src/types/dropdown.ts b/packages/web-react/src/types/dropdown.ts index 68a803ed03..91156a053e 100644 --- a/packages/web-react/src/types/dropdown.ts +++ b/packages/web-react/src/types/dropdown.ts @@ -1,5 +1,13 @@ import { ComponentPropsWithRef, ElementType, LegacyRef, ReactNode } from 'react'; -import { Booleanish, ChildrenProps, ClickEvent, PlacementDictionaryType, StyleProps } from './shared'; +import { + AlignmentXExtendedDictionaryType, + AlignmentYExtendedDictionaryType, + Booleanish, + ChildrenProps, + ClickEvent, + PlacementDictionaryType, + StyleProps, +} from './shared'; export const DropdownFullWidthModes = { OFF: 'off', @@ -18,11 +26,23 @@ export type DropdownTriggerRenderProps = { ref: LegacyRef; }; -export interface DropdownProps extends ChildrenProps, StyleProps { +export type DropdownAlignmentXType = + | AlignmentXExtendedDictionaryType + | { [key: string]: AlignmentXExtendedDictionaryType }; +export type DropdownAlignmentYType = + | AlignmentYExtendedDictionaryType + | { [key: string]: AlignmentYExtendedDictionaryType }; + +export interface DropdownAlignmentProps { + alignmentX?: DropdownAlignmentXType; + alignmentY?: DropdownAlignmentYType; +} + +export interface DropdownProps extends DropdownAlignmentProps, ChildrenProps, StyleProps { id: string; } -export interface DropdownStyleProps extends StyleProps { +export interface DropdownStyleProps extends DropdownAlignmentProps, StyleProps { isOpen?: boolean; } From 420413561b1be3bd5e618161a2d871acf617682b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Kry=C5=A1p=C3=ADn?= Date: Wed, 8 Jan 2025 13:06:32 +0100 Subject: [PATCH 3/3] Feat(web-twig): Introduce `alignment` to `Dropdown` component #DS-1411 --- .../components/Dropdown/Dropdown.stories.twig | 4 +++ .../components/Dropdown/Dropdown.twig | 29 +++++++++++++++++- .../Resources/components/Dropdown/README.md | 30 +++++++++++++++++-- .../__tests__/__fixtures__/dropdown.twig | 7 +++++ .../__snapshots__/dropdown.twig.snap.html | 4 +++ .../Dropdown/stories/DropdownAlignment.twig | 21 +++++++++++++ 6 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 packages/web-twig/src/Resources/components/Dropdown/stories/DropdownAlignment.twig diff --git a/packages/web-twig/src/Resources/components/Dropdown/Dropdown.stories.twig b/packages/web-twig/src/Resources/components/Dropdown/Dropdown.stories.twig index 3247fe15bb..30909645f6 100644 --- a/packages/web-twig/src/Resources/components/Dropdown/Dropdown.stories.twig +++ b/packages/web-twig/src/Resources/components/Dropdown/Dropdown.stories.twig @@ -9,6 +9,10 @@ {% include '@components/Dropdown/stories/DropdownPlacements.twig' %} + + {% include '@components/Dropdown/stories/DropdownAlignment.twig' %} + + {% include '@components/Dropdown/stories/DropdownVariousItems.twig' %} diff --git a/packages/web-twig/src/Resources/components/Dropdown/Dropdown.twig b/packages/web-twig/src/Resources/components/Dropdown/Dropdown.twig index 62c82b265a..f5b674d909 100644 --- a/packages/web-twig/src/Resources/components/Dropdown/Dropdown.twig +++ b/packages/web-twig/src/Resources/components/Dropdown/Dropdown.twig @@ -1,5 +1,7 @@ {# API #} {%- set props = props | default([]) -%} +{%- set _alignmentX = props.alignmentX | default(null) -%} +{%- set _alignmentY = props.alignmentY | default(null) -%} {%- set _elementType = props.elementType | default('div') -%} {# Class names #} @@ -7,7 +9,32 @@ {# Miscellaneous #} {%- set _styleProps = useStyleProps(props) -%} -{%- set _classNames = [ _rootClassName, _styleProps.className ] -%} + +{%- set _alignmentXClasses = [] -%} +{%- if _alignmentX is iterable -%} + {%- for breakpoint, breakpointValue in _alignmentX -%} + {%- set infix = (breakpoint == 'mobile') ? '' : '--' ~ breakpoint -%} + {%- set breakpointValueCapitalized = breakpointValue[:1] | upper ~ breakpointValue[1:] -%} + {%- set _alignmentXClasses = _alignmentXClasses | merge([ _spiritClassPrefix ~ 'Dropdown' ~ infix ~ '--alignmentX' ~ breakpointValueCapitalized ]) -%} + {%- endfor -%} +{%- elseif _alignmentX is not null -%} + {%- set _alignmentXCapitalized = _alignmentX[:1] | upper ~ _alignmentX[1:] -%} + {%- set _alignmentXClasses = [ _spiritClassPrefix ~ 'Dropdown--alignmentX' ~ _alignmentXCapitalized ] -%} +{%- endif -%} + +{%- set _alignmentYClasses = [] -%} +{%- if _alignmentY is iterable -%} + {%- for breakpoint, breakpointValue in _alignmentY -%} + {%- set infix = (breakpoint == 'mobile') ? '' : '--' ~ breakpoint -%} + {%- set breakpointValueCapitalized = breakpointValue[:1] | upper ~ breakpointValue[1:] -%} + {%- set _alignmentYClasses = _alignmentYClasses | merge([ _spiritClassPrefix ~ 'Dropdown' ~ infix ~ '--alignmentY' ~ breakpointValueCapitalized ]) -%} + {%- endfor -%} +{%- elseif _alignmentY is not null -%} + {%- set _alignmentYCapitalized = _alignmentY[:1] | upper ~ _alignmentY[1:] -%} + {%- set _alignmentYClasses = [ _spiritClassPrefix ~ 'Dropdown--alignmentY' ~ _alignmentYCapitalized ] -%} +{%- endif -%} + +{%- set _classNames = [ _rootClassName, _styleProps.className ] | merge(_alignmentXClasses, _alignmentYClasses) -%} <{{ _elementType }} {{ mainProps(props) }} diff --git a/packages/web-twig/src/Resources/components/Dropdown/README.md b/packages/web-twig/src/Resources/components/Dropdown/README.md index 9285ae2e70..fee8cc5e6f 100644 --- a/packages/web-twig/src/Resources/components/Dropdown/README.md +++ b/packages/web-twig/src/Resources/components/Dropdown/README.md @@ -72,14 +72,37 @@ or the width of the window is changed. There can be several triggers, the same r ### Dropdown -| Name | Type | Default | Required | Description | -| ------------- | -------- | ------- | -------- | ------------------ | -| `elementType` | `string` | `div` | ✕ | HTML tag to render | +| Name | Type | Default | Required | Description | +| ------------- | --------------------------------------------------------------------- | ------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| `alignmentX` | \[ [AlignmentXExtended dictionary][dictionary-alignment] \| `object`] | `null` | ✕ | Apply vertical alignment to trigger, use object to set responsive values, e.g. `{ mobile: 'left', tablet: 'center', desktop: 'right' }` | +| `alignmentY` | \[ [AlignmentYExtended dictionary][dictionary-alignment] \| `object`] | `null` | ✕ | Apply horizontal alignment to trigger, use object to set responsive values, e.g. `{ mobile: 'top', tablet: 'center', desktop: 'bottom' }` | +| `elementType` | `string` | `div` | ✕ | HTML tag to render | On top of the API options, the components accept [additional attributes][readme-additional-attributes]. If you need more control over the styling of a component, you can use [style props][readme-style-props] and [escape hatches][readme-escape-hatches]. +#### Alignment + +Dropdown supports the extended [Alignment Dictionary][dictionary-alignment] for alignment on both axis. To use it, set the +specific prop to the `Dropdown` component, e.g. `` or ``. Adding +any of these props will make the element display as `flex`. + +We also support responsive alignment props. To use them, set the prop as an object, +e.g. ``. + +ℹ️ This controls only the alignment inside the wrapping `Dropdown` element. And even with alignment, the popover will still be positioned +at edge of the `Dropdown` element and on the place defined by the placement attribute. + +```twig + + + + + + +``` + ## JavaScript Plugin For full functionality, you need to provide Spirit JavaScript: @@ -94,6 +117,7 @@ Or, feel free to write the controlling script yourself. 👉 Check the [component's docs in the web package][web-js-api] to see the full documentation and API of the plugin. +[dictionary-alignment]: https://github.com/lmc-eu/spirit-design-system/tree/main/docs/DICTIONARIES.md#alignment [dictionary-placement]: https://github.com/lmc-eu/spirit-design-system/tree/main/docs/DICTIONARIES.md#placement [dropdown]: https://github.com/lmc-eu/spirit-design-system/tree/main/packages/web/src/scss/components/Dropdown [item]: https://github.com/lmc-eu/spirit-design-system/blob/main/packages/web-twig/src/Resources/components/Item/README.md diff --git a/packages/web-twig/src/Resources/components/Dropdown/__tests__/__fixtures__/dropdown.twig b/packages/web-twig/src/Resources/components/Dropdown/__tests__/__fixtures__/dropdown.twig index a7bf839042..a4d4f1f520 100644 --- a/packages/web-twig/src/Resources/components/Dropdown/__tests__/__fixtures__/dropdown.twig +++ b/packages/web-twig/src/Resources/components/Dropdown/__tests__/__fixtures__/dropdown.twig @@ -1 +1,8 @@ content + + + content + diff --git a/packages/web-twig/src/Resources/components/Dropdown/__tests__/__snapshots__/dropdown.twig.snap.html b/packages/web-twig/src/Resources/components/Dropdown/__tests__/__snapshots__/dropdown.twig.snap.html index a818b21758..7c613453f1 100644 --- a/packages/web-twig/src/Resources/components/Dropdown/__tests__/__snapshots__/dropdown.twig.snap.html +++ b/packages/web-twig/src/Resources/components/Dropdown/__tests__/__snapshots__/dropdown.twig.snap.html @@ -8,5 +8,9 @@

+ + diff --git a/packages/web-twig/src/Resources/components/Dropdown/stories/DropdownAlignment.twig b/packages/web-twig/src/Resources/components/Dropdown/stories/DropdownAlignment.twig new file mode 100644 index 0000000000..7d3f5f1e0e --- /dev/null +++ b/packages/web-twig/src/Resources/components/Dropdown/stories/DropdownAlignment.twig @@ -0,0 +1,21 @@ + + + + + + + + + +
+ This is a big unrelated box to demonstrate the Dropdown Trigger alignment +
+