From ca9208fb70c2f1b60a523ae030562c3227ca058b Mon Sep 17 00:00:00 2001 From: Marianne Date: Mon, 24 Mar 2025 21:57:00 -0400 Subject: [PATCH 1/2] basic sponsor page changes - sizing of wheel needs to be fixed --- src/App.tsx | 1 + src/images/sponsors/cse-cst.webp | Bin 0 -> 8604 bytes src/images/sponsors/nokia.webp | Bin 0 -> 7546 bytes src/images/sponsors/placeholder.webp | Bin 0 -> 30470 bytes .../Sponsors/sponsors-carousel-buttons.css | 21 +++ .../Sponsors/sponsors-carousel.buttons.tsx | 24 +++ src/pages/Sponsors/sponsors-carousel.css | 102 +++++++++++ src/pages/Sponsors/sponsors-carousel.tsx | 168 ++++++++++++++++++ src/pages/Sponsors/sponsors.css | 43 +++++ src/pages/Sponsors/sponsors.tsx | 67 +++++++ src/resources/sponsorsImagesInfo.ts | 31 ++++ 11 files changed, 457 insertions(+) create mode 100644 src/images/sponsors/cse-cst.webp create mode 100644 src/images/sponsors/nokia.webp create mode 100644 src/images/sponsors/placeholder.webp create mode 100644 src/pages/Sponsors/sponsors-carousel-buttons.css create mode 100644 src/pages/Sponsors/sponsors-carousel.buttons.tsx create mode 100644 src/pages/Sponsors/sponsors-carousel.css create mode 100644 src/pages/Sponsors/sponsors-carousel.tsx create mode 100644 src/pages/Sponsors/sponsors.css create mode 100644 src/pages/Sponsors/sponsors.tsx create mode 100644 src/resources/sponsorsImagesInfo.ts diff --git a/src/App.tsx b/src/App.tsx index 222b465..9259007 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -8,6 +8,7 @@ import Minutes from './pages/Minutes/Minutes'; import Volunteer from './pages/Volunteer/Volunteer'; import Blog from './pages/Blog/Blog'; import Events from './pages/Events/Events'; +import Sponsors from './pages/Sponsors/sponsors' export function getWindowDimensions() { const { innerWidth: width, innerHeight: height } = window; diff --git a/src/images/sponsors/cse-cst.webp b/src/images/sponsors/cse-cst.webp new file mode 100644 index 0000000000000000000000000000000000000000..667ae11403d42809e7d6b4589f18185d8ab5fd80 GIT binary patch literal 8604 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 P(YN$%9_#dh`;Y$zD*l-9 literal 0 HcmV?d00001 diff --git a/src/images/sponsors/nokia.webp b/src/images/sponsors/nokia.webp new file mode 100644 index 0000000000000000000000000000000000000000..eb61e847567d567ad1a993af2c38d0c37d805a20 GIT binary patch literal 7546 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 QLBVoU0C(2d000000QThnN&o-= literal 0 HcmV?d00001 diff --git a/src/images/sponsors/placeholder.webp b/src/images/sponsors/placeholder.webp new file mode 100644 index 0000000000000000000000000000000000000000..dd97240c50a060e18418c09d86a30ea97d277989 GIT binary patch literal 30470 zcmV)WK(4=1Nk&Hgb^riZMM6+kP&il$0000G000300RaC206|PpNOTwg00A5YZQDpL zf7sjo2OuIQAXj23=M^S?Y+!zEIb$-k@><*ENK)_@Sqf@Pi2^!+r3A*FJ!L6b;^b*u zN+q0q61jdtv0kdXJsUMnI7=qVAJUtp?|a|pdA@Ks>|hZ=3$~r8wnZc?(qM#$ZqIA} z>9)2VNs>aR)H9<_xG)>7NPxDK1#}>RlFAHP(WSOXp?t}}=Lf2?mLxwv-n}LwL1{njd1%BUzXXPm$&i!LnGOXG?qUwZ4Ww4$MV<( zr5(Y)G~Nznv>xlP8{K_)+E1s``Bh$C<)bJ2awXp%A0JPrxHGoZ#fPW;ZFhUoUh=jJ z=Cl*Cb?Ah4y!`eW?^y@QYq+$NwRJeW5nJXv%=Ixv3bwkVP_k{W==BH`kZ1GOk^OGF zZfmCNoeFf;Z(aCqR@3mTLAsu*GTtX5Z7JGqH?39hVRHiXf_2#Gu4uQ}ZkiM#k{nKm zU>>k-!Gk96Hj-py3RZ9Ob~B})7J}pi1rcwrx9z&7;Z4flHLRb824Jr>l~+u^-;nYf zK{6K4)V}d?mnpb1`*CS*+YZL9s@Y!-1455GmNZzpTj#sFaBL^cBc?HTE2~P--~bd) zK0xJ=#dO znt(det*(IC*|FMTy52ZnbV(q^IBWEPRXtNfAeCx7TSEk(;*ap*uMg*uE)ke|HYwo} z|BN2&SJekh>S7D~RrQhms``XRU2?&qF1nytk7GLCUS~5>DB3o@Q$HYEk6E658(vVW z&P-1=?8>Rzjz((=`ZU6x%ktasU2PGeS3V8>O)-$mFYB*Ae=M4_ z0wGU}jt+%9uwPXZA`uR5gFky(F%5oJK;&u7Myv<;O+k^k&Ir%TrL}H0Xc`@k(5*Zz z)5uK@Qw$9vD^T)s&i+v|m|QMI zpJVj12GivX0hbS0u*+`>mrT#_zh}U$%Si!~cBG!-vVtb0TZ`378ucG5%tGzUxCPx6Sb z885wb*qDZgerKf`_UR}QtK~)=*v5zci8n!eQa@d54xbo&=%27l>YOe4N(-IKCd)dd z-D-ba^L(?9Z|e@d2<+b6PQF`vzx0nI11L9NbX*@Og zc~=ZU3H@Jt#}-i$7tm;J%HhDD*Up%epE!DVI(Yc8^+&_tq{Fe?dyO>zsQt-Tz;sw? z%~YvQP_arn+*B_EC|2{1{bm2OzxYE?8@UGA3$l*s4$v*#)ezb0ywi~Gsqe^gO)rLt zo6%51x@T<8GkS%SF`iBsYW_+en(K`AMJ|IhUMR{575nS!Oxqea6la(sTkG%J=7!=$ zA(v`--8tfN8PvC{AW5QKBIL-pz7tcAqKHd2{k3DnHG}$8Dtzg0ks^v|f-pqdOiLxm zQ-blkP7&32V(J0)s8lKj%{lp^5YVG~l6exu`_>igAkjQg*kQ9T>`*44P!!db%oE}o zXAA+4Isv<|lXRZJkQ>buRCYApI3k{Ppwm(MYrJt3bZ9;3u5rgv6uu(eH4ZsKSH>(k zBh0Z`%Q_L}XzKO@#UTX1rn{v(p+vDRaoZdU1z?e`OHLi4VQnMZEJOvg@zrzNduqTg zWg3F8(&TB_I?^yK9Y5tX6JR%vBWRa654B$(ZT9IpI8Q%FzgfqL=-9`)kPn>+JPfZ^tk1l_(xKJE6#OR~buf|6McqB6~C^m^}h}g`d`Oj-hqY@ zeO_`5<)5QW*P4UN2VzFyVN?O;C?gIkB4~TsTpyNoMYf2*nR)Oy=_n}V8(dUGB}gPp z;m!NhLp2Ifid`w9vfoz?w&$F_yz@XBP}w9aT~hvT zqVPrKA9vOq<9*&L?yotg1K|s0<3G-b_g_8O=_fMA{x1{gA5MhD5^E-mvHjCeHO7wM zalm^7zj;UTe%%RxsP|O9hBN&nbL-9k?6=uIxM*+PF z9}*AlJCzmqBEx1K?PVUJw-FESJ6aUSGQ)4MB+yvMsdaVaw$lQ-Yc|QqlV*&D<;KrR z`~U*gFiwB5iH-Mt{X66ef$ZocpS}5hf%D9hA*ft=;DSk^YR$P#@-# zm?SVo-E2w`sx+K*C+ph`DkK?7*{l+2Vt>VVb;eO|aqZcO95*+YU9H!8*IjOGanY5y znU<%YPNdjuf6>XTmlG*g?=QG&znlPASf=NT487F}%AxniPqWmfV{_qE)4_Uw{AV^Z z2W~E}nzl(~@t>X_U(6Ea#-{tr3e}JDP0ojSO2z8B&hqCAsvh2%tzdAT+en+sNxIl3 zlSz+-UxZ?=sc-g|(YHo7=7bwPEw`>9nm&&dR81!HFM3%%&q;B@b5b7P`}i~MW>TFf zO%izOV@u1lo=%&yVfA`*d)vF?i`&VhO8gWXcU<)kJkE2$k}N+LR?myY;`a7)uk4@Z zlSwKk%iM8w)vvwu^R?1Cy4jxtX|w3r@%c6_x+@NZiOcold!H&O)2u_(48HKWXc59 z#>(0Vnr1WHWz)7z;t94v`1tv_l7x_1r0EB*uOB}j`!Sldv_%q6?S81GZ5xg@TLr=A zquiTvIKeSd@R%VftW#f_&FcWaZ*E#gjx_+xZ!j~J|B=e5l9 zok%F#gCp8?C7SjuG`LoZt4%WZzRupa20UQP^+4umooKTk9JIN+OT`1vR-_9UM5zbJ zkm(E*k3fy-HZV#WfK9?2xseh_w-BUQ46?$uh3$HP!2aRRkw;OWYKd>1rPFR`_!w9L=1L-D%taDSf*fI&@b3s3_pY6E6eMKw+@ z7{job8wkPB3CwfXBejkr1u?Bk>zQwT$+R5+^L;{@e7y?_2!x>;4f_fkzg}qVDnncl zpiu0zGEI&~m?vjPfMW#VF3@Q03f8;(`-kV()3*Qc@Q{iFuptbn1qDRJf~ml2(#D3z z956PL;~7ax%m8dCgRN(Ho=gxI58ly$4Ui=p8#3qTCQ$<>3=Gtoc?1$#6cD<1%#>v&RfjUT};<^Sd!6r8w0RP*02MLrW^_YDbRsH%8}j6 z{Pm@$ zOPsftj{iTQ-@j$wC`mkMxe=2pqj20v80l)I&8rzI2m<>KgOwG&galN?D6GMuo@$8( z5P>Ghrv5Ai37B@L?_b_hz7dMHY&Dj}F-HbkD!~|pmVy?eWuH8|J5#(DKFMZp5VB;#kHCBR!GCoHh6HV{~YZm=t zG=sL^2u)1Kz#|h6Y+3@Gf%cb3avHY-fp60ByQE7(n20{Ve3}XL0nh{SMYA#C>2EaAOI@515sC;f|&&QuOzM zpsg-Js8#;bK*-Xe`kPxVgzyb4uKgg`8VVpz5t%v{1a?;h@TjH3t)(J}wC1L1hd{%j z45T@T5-r-f7!_Y&E9h24Qub%2DIT+fkBxAo;Kyu+?hzyilON#JJ=}t|4)DK)4j({e zD!v89$I<0IQfm!RfNQ zq!LZ>SvsdX?<+iMkS&xz)QN?YFjWO`6;u$x{e0-&Hl+s4U6fR2@+SxnxB(FeKSL5g z0%nTOLQ~N5`#Uw!c)lsN$rtKGdqi&XKn>H&vH7JyYs7&1z#l%Viq0hC?ktiD8z=&( zBE!PrAgw9gbw(~;*|tE3?AbWPhx>yS05zOoczso9aI=9S7;rUhSa%Q=e*mfP zp;;AO$s5U$XvxQ0a$lwsEZ8_65hh81+>M0d(7!kg>kko}iw3#;03vT7H3NLurlqvh zXa%{FW}b`GmPw`ps_U8~ja3eX6M!X&0f?Cu!Wqy{kYN__c>V<8hKt*;05n031n~(Z zmZ5Zz^n#!(ibk%9uMHc$d z#HgEA7_ZSDHPF_hERYCSo>(~+uttMwtp{V+&-V}ycIq2Q%>~o=4C0R=Ivlr6TS%w0 z#N&C}w){22+tHT|Nk`@!u8X1dI0s}n2H>a8a_Cm_(83=kLyrl9t3++nReqH`ViaFx zT;=adG9tr;kz7xByBO@!jX4ETq8cE9`Yx(Ih~yO1)3AwLC7;zX$*C&y)CZ0Jtf|2~X|3(LnSH57`0 zk(^!d>+~@+6^E1ZrYYw%)<*Xgw;SC)Oekr?NUm4(Tv>|^m{!7Y41t5SQXfE)z)R2` zbX01@X!1pY441zv1sxYu!H)Y@(GEo7;_-CGRFIJvEUWCl2Vk#7$VPhVIgDbBm;e~n5IBpOyEKc^n3&*`%UFfAjMF*UKc5K2D8mz zuOdrf-Y=dY@-R}_iwH>x&r|PsWOaz$>w;Y|Rnas~9G07~-5QGPob5CnOsdh90O1+t zx#vbIZOFsGr(om-JsL>lVWjeOgQFv9Z9l)b1;j!2jlQzoY7RXt^_my1HHiE!h%h{>fl`@W??if$}bjX-N8-+ z=KG22RlGNvLugF!@|dSnmkKe0@&FwZ?40Gzv1Nv)L~sD%3$EG_0jCiE`Z;N`Jv zWOERE`2LAeluWQ)2Khx+5T+T7r@|4Tz%6nEa-SHkCqFSt!huOeqKCo6>#aZ#G!mr4 z(`y&S7G#~o71s_dBMHMGcfpWY0Ej_>I4s6sI6*-?B!xN8J#x)%Hb4M$f-a_KOjpsx zWko9uA?3jiac4*3(1Ngv<8YB6lbjuz0($*89x}0N5Ox9OqX`SB-2Et&5CaS+#Ktxd zF%)See3d?)5D1FL@a1DUir|tmu%ffz*vMMPSPb=o9K>c73l;_BIgFWJD2gmbW8gwj zY{%G2?UFF-DjeBY$OO=HCjhZTj^d8NDLuoXXF0y47_4x;2BR;!vo67R5MvCd0*l*( zbO3>Pc|lK$)x=o|VO{iuSKV-)fQXFV_0+bK{BYFxs*qm{uCtrz@=7I~0^0f+KLL#d zg#$+Na?e9}AtuoehXF(Je#&&1GI=1vODzdIT`dEv&(>Vc73k|@lKgx~{Y;okQeuVa zU^sn@g=07rBXJ%n)r3nJ0i@-UVN@2O;W!KjsYQH=r;_#J9WP{5KX=2iL)Mpot@wKE zQhua#x6IbBM6{8y*O(rIlw!q?Gn&gI>Y-ASFjkai{dm&}Z%}up5pLLZ2^H&2Msd1F z(l2-ax%+iz;q5lc{NB2SeZ~8tQe1H7UF@Avm zU;WqjbNtW$|E6E z{_Xzr{_pKCz`y7J*?;JNi~aWbssBm;d;B-L@A1Frf93yx|8epU{b&4F{;yqsV(;6Z z{l4J8&40cB;q}e`<^JRM|LGU{r~5DdzwG`7|DS(||F!w=|2OCZ|2L=y{f|%%w;#pN z)}Nlsu9n3-_t$@AGfRzrOz)`9l=8`#)eW)-U$on%^aV*Z;fZFX_I( zf6TwK|F-`-`@Q~0>TmrI{NL%n&;H(fnEIFg=lVZ@zvSQ5zu*6d|2hB9{a^q8|Nncx z_r1=3=l|{ZI{jV$i}}z++v)#Y`yE2$Hn`bGur}XM`sdi{7a_IA$~}R$`hV9x$56Qq zt~OEZ4Y$+&x%N7R$Zc`5k6>-SpY_kN)GkA7jg)%>ZQ_I|*bc2u+}Z!IHs4SB=h*5O zA+^T7<#7l6(66A={n7G0C`F!<=)5jB=#hrM&>e)+f_L5O6`sdi{7ZqBW9sq`Qc+d2jya@~Yy}hITOHi~B z&=s|m--c%|#>*#X{C%k#;(gwN8Xbkk+@MFaP5hbPZ`xemh_2hV zn^f9IJrE0~18wyGu6>T6r)$ka3X}Nc_a0TOJ^(3wFt}5+cOm<))UxZf$QM$Q$0#yV zFK0j-zjbp~!8<cXM!>0uma`N$^1VfFF8F1Z%%o+>< zy$0)peP-l_*BdDI2HA-+I!?bevDYV*PK?zEf8Y+s+28L+lYRfh*YvO&)5F*&L}NKT zM8HObWIhs@cl0Q927D{*72d5ZVm9Y8G`Em@Qa8|?Nw=L=(1 zB%zlX=VYKjqu3j7r~K@A6d9!bf6D}0g#wfLVEUGQTW-nTfjaC|>^A_c{Y+Pp?iw6~ z?j;r^2Iw$4SMK|*9>=D{o`{MQf>ueqI5e~HQ>B2RyWqR;2Bl~-!S``xHm~SYWPE#{ z38uv{-E-`91brWl4@}8~Se`k5?yggEEKtO|S(i)78fZlrGpm_r(Bl&OYYDp_4(BW8 zcp5iv%R+D@;Y^`hP-)a(tentj3T?RZx@!ZIkf7Wu^LHl6;TX2t=q()Wd`s_P3Dy+# z_j#uMrTLtN4MOa_cf*i6Q8@ev!f88Y(3UX`FCXP`%-3oBB7YRIiZD(e$Cnnd8Ubuloltq_>1s+a@Gjq5Jaj zu>ClPUrai71#f4Y30cbPSshI!V1s754`>gVOqGG3;(R>sag>RmrOt9U6=@#5>wn?1faCac1$wE zXCsC>PKCXH%n)cl*7c}D)J1Qi7l@ym4*Ej5qJ_$TBG)ZOYV_ zDSjrJtwcqMgicCHtN+Vtkt0*YP=1Wanwa?MVbYEZhIvGk+DxH0_KAWTJj+e&T9&IaUAZO27EtOyP!|&6vP3Eo~LfK<#1inRSN{@?&u&RWz^=1if`Avfs&w4pe>6ec4}4y` z3g5HP{E#pk=_eJ$ex5eJFPgT3;r<0ht@1$))hlZYV zroD3AXG{6O-4AMEBCLOO0F_VU(7W-0Exi^c>k%p(yl68|hmeLYHa7V|OxMo-MViwa zq>tw|*OW8bM)CAt2?2`L6+vv?P?IRJ>2AjH$C5yx{tj;Nc#}>Uol2GB+G6w&KFd7# zh20s5#$|D5aNEVFNBrYKZHnu~dKi(7{60R)XrOeP@xvbTm8$s0w(jBy)NqVe4-$}u0cP6B4Zn_6M zc56*N@Ko<*JGy`K#W7`2mjo~86*5!Eng-09PcSWuwzpSYhld3r$gy! z(R&mnW-tMO=b8bcq~JL8EU6GT4W+t6)V&EU0D|;Fe191%pGL#kmgu|=K~M23EK|@( zhLSzDWrlGtI|~+rdyLANSiyXpO?%m{-anvzXP@e-KX~O1eg!;ag@DpxyMM#k^g?@3 z;oPu3udEkA_x0UB_E>t9gqBSs1(;+erFS#fjG&Q3b*0*3Yv;3`PpM2=$Y>pr!vjuu z02T8Msg23;4@OR+$Xe5S#@05-%s8F~|EY>4qCJ*fFgWGttETC46X;r^%n$Zk|i+f;{g&Om5|Q_UJ4Z$l0K z4)RcmaMsS))h{7Dr%L{?58qk7IFJb2^#JSE}$+?TJ>(E%ZpnN6ScLv!?kuKhcY`#lQQ_7$1b8`T6dVUehoYX4Lg z3qs%k)LlICQ~Pzd;@ovQbNII-m2a@R`lt;#rmkl>gf@>rwnkFK>WEs;^UI-l{@y6Q zpcMP`e*KXQHGW-f-(?B*sF1jgH+17)eH?-h_{0*dV~fgoY{VWOVnhyBN5=xX@Sy`8 z1lG12w$F0XEKT|SLJ=X~q8kXEY>l*C7ikTC-XGk9$PtK%j(J(jvHXYs|1s+1t#V#} zaN#V!MBd(snE>t$hQt4rLsJNrAz6L6=;MWe|24c&N}CmEf5fGDwEnZEAaqOXS!p0N zl+^}!ys~l%9|*xoG(@6uC$j%_YcFG)6JNVVk~oFugFMe6l_wp|hR05w=5$tiz~lt1 z)UB}!LiJ||kf*k%k=`{D94dd)?6BZ4O^=}ahU@H9aQPz7tOWHh+BJu)GkA7jg)%> zZS?=HeU71W8(eIa0092~)%pMc00000000000000000013MbKhO0D8Q0CyF{3F@gNh ze@*kQ5sUb=avh0gb$zN7=w-hKywj?8ZJ6~;O`+*Bzb^Muw}S+Nx&QzYF3_lw2gsEn zu&q79P)nqos|x7Ocse0b*+vsy1qfc4f$v#NP}0zr+ODA=4yETNvVS<-JgAm9Ao%># zF&$BrvD39Y(RmU$(gb_}0008P=z|eIHX(LCu4Zki$xrY_*6LREq<)-5l1vg!DuEn2 zD-j7VH}H9skqz#mQ#2qQGC#vp$9pmS20*RstaN)XKeiV!;5Vm@suMfhx0WWMM@Ow8 z4vGk!e1dgNk$X?y(_`)l#kmc6odgRnH%l9O<`5G*e3e|k-j|-g^?9$Wh2x@oEm3wn zm5HIHfcj>@>z}EEwl5QBlz6%-QMksc5X7LO_%^vOx?d0lOGE3D?_F}p!2OFGn+Zmz z7&j{(yDVmq-<{d!^$LzXa;v(Jc5VlSt88)ZYl2y9_+`-87Or$5*$n5t`Sgpa6~(V7 zVraXot%$%z4mo=cMUJWzr(dR}^yxR*nXd%CoXbq#6NkzW|Hi;Rurg1GoJW;Gk&j0p zp%uyX_Q<>x%Wq^)c$fBg-}%XcB>pNPEk9%+4n><;?Fb9~XkKIhL0?;v-@m4luf;fc z#!IXx-Q+Odic{vBqoyVwp2SeaogjwO52t;j58v^$+{Vd%y>rpb}Amep2W;cZrCVUG=z0SXe75(6(Qi{OM=5LR>D6kiOcrMh*-X}^dCub7fu5>f8s ziFLKsn@`ChH{q?kB^YD-sNhW;pN?Gw{Ersc^LW5p0Jj-IukAGz|NTGG{B38Q@wG2I#XBADYAS;;BQxQj2>10EsLONI- zCwKOr74A#Y+0SmWz(5TxL^(Bx)m8B0z#|x4F=kk?)cwdqCI1-r+z5w8?I_qm?(}nn zI2P~Jx~TR=!Ika_I)O)#c^iIc8yLUnH^DlcQ;WE|FW#&DlE*5*>xmP3WH@i)zdDL zv&?(az|TylTS-iiP$dxUK?LyvQDKV&DId;dRo4bJ{?Z7WCX2IQ6Mp^ec}7uEd{?R1 zd#|NGN5AzpvRm}mC^vcf5>J1=ZQxl`G)=<#X1kiv2?;+F&IlR_n(4acQpcZW)VmKo zc|{OcCJ$x_%bdO`FsW@F5DmYvwl2@uptTrwzSb&8$;;H$vBpY8@vysnn#p6JOaN5e zTO#hhpGIh!O!e4AH)tKhxf9$rV{71rNK3-FMXJj z;_QaVVw|TvrMv>YYqK8kh%-%Z8Qrb0NlAYxJX4l=CBZ`WKsOK3QtIpy#YA3*tiL16 z0m3OvhUdC;Y29?~3MFW|)fyXOYcFk2$7RPMe|a;{1rh;FQVZMfwTl}!2y|Fyed9Mo z0*9jx6z`-0_hcrg!-zK_BV#nQzIRK)d z4*xp7S5Mm=reh95GE#RVbx>FE2F%j62F@R_19MgO7EZ`wS*{SvB}W4EsUas&$xNfB zI+mpQP5xEq^Ql&$P1kx#CC9IZfaYXBP38B$1tEY0@ zWMcqa=dg@iRrwp!>Bwd#kRTR_EqKLY0m8~2IAm*H%y*c-1He^G5*hFOWEc`3WQTKNp**-heNI4 zzmm4INfKa5ixT2ta0W_G_3))AD6xN!hxKx}pI7T!{8pIhcMALO5i6**_AVrV7Rn)r^KA#B6X??{^!V}%)>&9pSqyDFjgh6f3 zaafLDsnCNW^IUo~?l`@TL(&?|HVn_Jauc$a)_X1w-tPUcJOIfEvzS_ zoLiyfo${o0asu!)XH5(`RY{U7{4Is|{C6;Oa*)V*odKG zTI4k6W|RU_v$r`mtH_oN7Vnqb2l|VRwyo9$T_=vFpzly9frqq7-YDUwaNTK;{w!kZ z3US?UQk_;gAS31Jo#N9WrsBc=9k_VJ-_X*?$1>&b4i>wML^C)vZf&Jjx9@oUFKBkfVW3kJDh#Ch9iq6#GpJgC6qIGvYl{ z=8(-!BFJ|8$FRaj($`T5=^uXvlIlS}w?K7(%Fn@U^6E(CayigEy?ugEs^{ zT%mWK9rg?uE8AM9B(E)eNKBY33yYp~EHgL-A`K~Znx}LoCq`b*y95q@Y1u_Kv2f-c z?!ZJr_ztMwb|&DKgEzLwm7IA0U>BHyPIZ_Ba?P6$fZp{LvbpzN@L1U{3bawqjfrUi)(H#5ZUtQVOOjqY$?qQUCC zF0Opn%-}Z&Dq@zO&HxW6pQ7MZE{(#39%Wb^pakIoHfNrxhTzZuS4qsmYYek9VaB)3 zfr1KjfGex4YBlEK zM4y)!k9e3Gy*PyVxS9{yJ{r*ES8XPfKmD0Zf1>%OvGKsY^M2L~djUx2gaOaE~apga$?K;JIpAdS|zhaHzlkiGxbsd;?}3@L&G4_7isJugYB8Qi)6d@3_V@ zFqsgF{^7?$kyX)TDXkM+XqpCNSdb!nDg=ik!UQ8iI$|>h+b+h3)lD=<_4J`$r}(9* z|RE?z1~ zc|%}YeEdKT;rbGmJ4!A!h9^eV4TE}=A!i{ORF4C8LO3*yYQHiE*fc2R}T_=LwtWJEbe#X4(mIE@{;}YWLe2t1Wa6lHerFW+t44i)@mxtP#?ox}+rElo z@ft99`HnZ8(PQU_|8wsTKwiP0CqQN+m_G?gZvy(=R9a=%XnQ-{D5s#A z-dsSMoKv*qQOmCIp0xy{jT^TXQ0QH=VI7hd; zZpm>g(+_xxhY=|c^}D-%RL#pWe-~ioH*6p!0tLX())hUJ>1K8{kav8y&I^#8|NhPHu=A){1ST$yW%svDZ_ffa)%&fgI0mTn^Zpgh`bX;*I*tfEm=1x zmDsMr4tdKWt9baMd*f3xE?zS$ywbYj@KkuAz*^4LJy&oi4*tT!?q@<0WJEvHOH^Z| zQIRS=voVp+JU!DK?GAi5XB@Gj&5kB-fUt9}WX|!N%1WVRTE;}~D8sLhiGXhVFm31^ z(v0FaT0&Rl(fd;YpQ-9D2Bogm%+t1{(7TJyVy}uGKqTnsmx>a{3jj#`&nUTpw8u_B zeHR*jR{T?G9~SU8=p?G_iPzQPH4SBaw?KFhd-8e!ZU1CsYABz-t#h{8S-v%jCQo`! z*E)V!X0SFazv-&mD+8PxlG!PRZz_J0Jioo(hyLQLEdk-|ZY^5y3k2(=xnknp`Lwi# zEzQNf0caG+41Uqvk0xpXi~wnxYU1A;XSfciaG>PUr|*Zwg%rd8KDS)1lVRRiCqv!+ z0q^{)vJS6Z*wdp*do|uzU}}1@0czB-22Hx#o=5iOh?@iOGA`GwEUuOU-O3LUr(S&) z2mBxEE*Zf3_CU#?r);gp;+7!~I<)$}-lnKBFbdD)HL`rg!-aWJgThQA_1gX~`NA~o zZYr%tJE=;=9c<0Ev#|%ey{d3P_$1_HuDDu(by*_PBt_&T4FvIgp}_zpkyLbC8p2(n zS5XXopp_H4OK5=*wp}K_6Q3@9Jl{db8p5uVd(`Bm0Zh4JG{?{jUYGjZBe6`1AT##r zZ!I1%>z-*S^4gNP-bia6am6tOW--+AGq}O1YxG?)`OKzq!{%5DBsu3`M{yuajHwKb=>K_|! zgM<)YU@_BVa+bpx!u9?upQN6!?-q1sV(_UB=8xzG=^b+EQgEHeRF63vOq!enFZ+>X z%<56tYll1)j6g?u-IyN^9VObi0^v-?tioscw)*Lb@!8KD*_~&7^tSr zOU);Eo%mqf;(-|fUP|^CTQ!J^@us+}`(=A!wEAz@x2i?3WD#GpspX0Y9<4Rl6Ijd4PGA&aO0zH|50g)s;3%xm_M%wSxSo50Img`d7dX&*af$>jYL zS(!kFMz8>5g+~O&q`E~n$tEU zYadX0@#Rxf+dGa~zizZED&h!;yb&?baJG0mlMgCHUUfV_4>mg?(OJ{L40U(FVt3GG z;Cf&GsQWeV0*$V7j{wk{b%o;$iJCOYVH2H`jjIjmu9cB6YBb??GCnsPdpQ-*i`atx zUTmm;kyu?Jcm%T%Nmo1oul_-uYfsXCSt#+u?sy)I*)YpP-nzA0cRjDurFFiR?nWqj z(QzZ0V$&<{j0WZv>Um}h);zJ(`iki^uDq(nY|$P-d3PM7kqK_xg0u5<*%4Eb@lHMe zl9X3!ZrsJv*Y`^U6T6w(W3=i=@n++CTCCKf{YRd~qsluiEd2NQxlLFzwvM*kD;lu8 z1dwH}9SKRDZ=2?<{^h=ifFT7h$xOtbF!W8@2P!=gh)n&T&?rMX)VX#nhn4C^=xhm? zBSW(Mx}|peoK}x#Psz_F)$#1G)>inaSvFQ}-rqfG&0BTT4{5Sndcacnp%Xo?Lpu`$ z^VVh-t%)>kBUpYQV;!4^zTc~F-07>f5Yeh4x639i5G#_fdF4T?BcTF)$3#n@y7zG( zk?NpEv8LU|)j*Jd3Hqy}X%#z6UgNkdwDy05_X$don-$#mUS0^f>F%LE#QN$$66z-0 z5_*pUtAFlsQmN=RGqNkT;hS_>wD-3W%l(~T1ABo`H(JA~%NZF%aG}ZO>K9@cZ(0KH z7KTN(EomOKa&Dl~@pw7yEMg$+@_Ub8v!qu_(?%@XAwpJ?q5^H&7Y(hEV}IKf5GT=` z9FrKo7rqXD8mS#QRXlDHs&^yi#m2=tmWA)Qv*9-vc~?`@`$4qthz90#6(eQ?xKQ1G z;`k>8VnL#gj2bKm?F*zS`x09UXj`1^t_UKjlgi0J!Y&d;MSSo??s?B~T!iwKaD%-A zM|JTaLVw{PE~Xeh|BwC(G4ZLn1MvVih1+4;q318}Y!*o^x!rnEazC6^;S+#Tj1k?e z&b**}gpp4GhS_uu+ZB1l$}xD?LoJ(LhGD|2j~2q)#Az1MwWh%VTkRVqNpN8g4??-I zXz>|(-C6z^hO2eO-EwuRRRSt3w(Es6#6Uyr_IcqqFtJpTroc7BsQ#ZNK`XP;@1&yQ zJq?^b-%9L6tCPa#d%0ps?#9F<`)beWh-YR=h0)MJ!U6Sq1GwH%^<~=06~mhVgAKqX z`J%lA#l+D*$7@Gc8tqO?6%y&=%lCG01cIj4XBKAJSyj_J zO7|mVi}Pst+_+rFwJ=}1lFa|tAnol`6A~{y<1z4>Gv=9p9kAq$H!Bu_B<7PoEQuCqpQ!+r0j!#P(si@gr7jwGqdVxVVSib|e zJ}JCOz(OCRxO19gCZT3WCUyKT=D?2H5>a8bzV8t=-A{qeJ>=+6mvBc#PB*<|sAtJc6iM^|DC93El$_lr)PFYW+eJ2%Il_5dI;WodkE4C6xS4DPF zW$RRcu9;ezJP4s`UzfeDxV!ds&~C7#&O8ZGDG6Bh88E0qJEZ7Co}Jz@J-me4HiWNI z@%9X@a>L;`8qNPa9t`Hz*e#x)z4M_)k)Z|S^RG)0_vw%ECXBL}3@M}+64S~>6GEHB zYVVgw7sXZ_%PwOWfKTnR5Xs;7n?STI{xW`JD+9Ecog+Kw>4}hFA|4Myep`d@a_?9t zhZn0;``X7NDnz%va%&@q4bCeVj$+GqJi|Qw=~ZO=^>inZRc|hO6Zu3Izq=DH)#)yM zIv%TdTHV7!lhhtsa=<1x{cOQZ(8>rrM)^9H%)DB6-?F64GoDP`0ti zFTkJgk-K|lv_kIX@N#p-XJv;izh*yR9`JWmz3!G7FMwA&akt=n{}n-4BG3c*hgNqR z_q&_fA$C7q$yr`>qW&*??Oes#Kp@;$$2Uc05+kpobk^x}E77rgtv826{Y8$1k&)M4QFn*WZBbbF#R)+&UeDtJ(S62QkPX5 zSX9EZ){-L&zpDk+w8c$bz#L)v-o+r5L7j5>$yD5lM&dsIp{Efy()0GPh?+lD`$i@C zLBTZ~RG^!-9_K{AG?Gt{;Wp%8QFf6P@30G|6vD@x5+a2>i3a&uj=2jz?5rvl#K=WW z{2v8XGj-lf`^zxd-$12kXbvZ_9gV2d;DCSny#2k~+RL%gF9Ks^@dr5twd z%{kNLb40qf9p{TCy$%2iabB0!<4vGVDe!A(Ci$XoH@Nx`3zhi^d2HTBdD-n@~wfbFm6G(TTRJ6f#)oR_yd@>>SLMTSbLI)*%yAkN|>K|#<`zi<4 zE{b)s*zN>WD1?DqqfFSEQW=uVA8Qp54mG!;BG3*Ot4xeua+rCp5+%<2XF`1C`g*>! zb-xs3HiiwD+0f{i6LD(GjAOLmnSnfp+F1*)ggRM;I28f{!a=7h0kt+t$zjGLV7WDj zuIQ!mK~71p|5jRi-8ia~Z98qY>HiXCLq0Pm4$=w&?W2Hxgok^h5e?N`t~+b`dTG@m zuHRB$ruL)*pcXg|-D6jp+x0Wt55?t)b9!pW!qw6z$vyDl!IY)0c*wzv&o}`~QcM6g zp9e;_7MYPP8?$TH)m$jXmCGxD|A`yEnSg;r_k6zMJ{-f0hpys)e)5-f+j9%ai}PM6Ga;5TvUT|M@c=lxH=oG z)Jm;*T6~q~#ftlsz4`yVa2RF(M439VD0&*D)gVTOi(`(Nt?`*VDZVlse{L~?R-j>e&M}h~-i)j*^*;MOoehNv zvqTAs`i>WRZrlz#!2cLxSED%mra*-jS$ny6;&n&(2lk_w;js{V*JD5~nFY3K8lD8( zpvc5>YKTnaa+@8qbE^3*C6;_g%GPq2OXW2@ceBaMhuX^84bF>tKrTitlx~+t&@L{&zLBTGJ%~{mYY0C$J~|z;Kp+iYs{) zm=eMPc`br*f@O-^Cj0bmJ6mFP!v_nUbNgR7>5>=+xiCQ|hR13Qo=L2IEoJ+w;p{Di zRpZ=A1OzO+5(1-a#N;Cub0`4iJOtY@HKQ+J9Vd4Kmv>Kj~8Mm7E+c@%?^X^`+DDJX=EEh9Ss~txQ5HUnY%%?KHKbuI+RkE#B zj#mEPKY5>;*J~Ic#>$YG7@sg5XqSh+k;)4SvYN+z0Owr-{qGW}Y7GnUj?4b1aH*e#CyWOtA^-Z1 zz!=Lx+GqWz_jw+a6-Y$AfqJUPw6WF?h+0@xB)SiXomH?pypsVlcXp-E!9KXsU+t|a zCQ;xPZ>QKP2aBLGtyW+fp2FRKuG!=W03QN}wGsmF#K9@mf^36~7n)`?PL@@LLOct@ zsY%n~Noaj!s~QpIfd&@K)ho~{r+*Q4lMh&VfrJdKFT9a^ZwC%64;NxN{IM*9`(`<2 z)8ND*D}z5uw~v++?umgF4JHU|TUPn!e^)LZ9r)WT@cFnQ!$;R6EY3m7Uqk|b?p0;r z+0HPd>b=DA*aOK*sCKS>13365srv4fMbywEN*Msfoa2QuJ)4T26)(EZgVGj>_60af z<5nmfusvJ7&dSWqnbXsD(%9(q0z5snC^5^Fs4W%V{Qf%8~LIqqLr@H8)4@^ll=3t$X!cGI}i{(sQMz>0k4+s&)!=Dj){lo>$h%5 zd7WsFbc1@aZKt>|O^@q{crPSV#RvnY>ZLHuY!YBA|d?#LS|t`DExn7N%58<3AFM9mJz9 zxVY%0{afAWYlBu3&=_9E-{K+?;Fsm%6Z*aznHf7y_(yB^4a6yU|C`ag2qsb=KIG8Q z8lfg@Yp#F|i*dS7)FE4&*XubyB-TW$_9N@P+JkZD$+7S`PmdoczHHzM-}YJC(S6Rv zW*g#s`0L?^sa^n-h$S5NE0yh|%Y%~20u4PS-$0Xa6l6p79gg; zDyP5&5DOVsxuON*Fyk>sw)+7OO3k{G3`f3lS$0@?h#!T9p7HzFCh}uVA31WJrfOq<(y=CxNgn|o$ENR3(R zl#O!mdr2M+l0VDi%oG4AzCy-Q4Kf6sAt=%v!aSMVWT+KpOUd&uHLb(uwuS`cUIlKo zvC)E?dRP0-tj-JB-eD{R1qs5(b+E8pAm^#qkNRS`u)WGKqXY1CVwo%iH_eQ>>{*jq z^<5!T@NB^`p@J>@xQ(s;!xJhbIX@k_+&9+nD7Up$Ek9sfVDfW3+hZ1M!x^JlFx-&~ z_69mz7AePi;|2Co zm01~}pCo>)vz|VbV#|=01z4KTnb2Kd861hN+e!KW3)z2M2p>y`S|=_E7D~7ZLT#sj_(X94)mP zV_;PHHz0Xs%b+OVuwP+vhG;8Pow{LfH$>?aoTBW5y`*B{+NBj7y0BRt^3t8#N;_$` zY$j+(Bp#zzk5W0e*)r?3>VbF6Gn@ILg0|5ARFtrUp&evYJ4JV3&nj$k2C#yPv5@jE zQ+_f%F^1BEt*u0{6vp@dQ|Lbb)$afvsQR3%lIKWPSgih{&@zE_o;5$BrxV%E(m)G6 z^7R%mR$4lGvv-$gI>BXEVzZm%cRxp(r{V-zISCp znTCjD(=LjL;~1KxVJ34Dv2nWoUUwB$r=2?am`-Gg+%9S19j`ZmZHDK-lWDo^3P{3& zG^bKy>k-HSe9h)Dg`i9nHqRUJr)OWl(9(;&la$@lDP_Ai2moi3A`hS53ZL?HkRGsE zj?TcT>krX-FSVLC2}VnDzX~S!Td)BYNn2n(FQ*G^!SAs!uySA(VgbpyVm}GgjAq{5 ze5n}0%u6DC!MrX=7s=-}l{KV~>}U=9$hz(BRFQk(UqyDNXm=16pvsjOZ$<$J;m9RX zi0g=$zX3e5Sca6!UmTcjt6^nJQ@pS0aZVGkrt6^eHe z?D%U@#^oGoElc$T$otNE8KTT=hX+Qm#oQsy?<>nqK)K_!3J}mM*LK_t+heaRX$VeF zg?Er^Kv@9LLe082Pd!qB5H2L`_S&d6REjI&5+>DS+8!FE@mu)9jpWQoXj#I2bY$`2 zRzQXMqwr=r>c)ufuB7K^Xx#&6V!=W-Ac`BDL5)PmAQx60HdmTi)?k1WK$~uN?+gvs zqJ#W@bwh}~t@kZmjC>p5XzG@L$a@%0Wj7i_XT38#%3iG> zjdvJH%>D_%v@8Np?rv>UZiq=;Oc~W5=DZ z^Ezu^xeHvXsk!mZR0|@9T);0?_#`(vi`(jWONT9^I|DaPf-`S zB6VEcmUPM=w(wRArmOnaf)g*5in>9Y9x+7j$S6X+4`W|Qwy7{_jR68%jXzEfMC0&# zQ=D^d-A7E#0AAp?r+EnAiQ(HXpnL8CYY90ztTl;9>|g$ThVP$R->#eft&nEP)}Bn5XDhGhJ{>#q;Vw zm=uR>`CtR@tPj#S2f~OhB-tdKnpozuYbmmcL_MY6q1`3rn%NmLZ!Zjt)Nl+B1-L)) z(lJsG>_9283U^6a8T zSX{u#f2Y-k^5*xO7oqE*%}UE%AdH+P=Br>$4#>r)XrSO5 zB*kgaK&`|@63<*NPDg?!asHikrGcq+*SXvvmbeM1#dJ|of^EC!?nEl|jYkAW^`)Sp zmr7uk$xEOQ_{X{x)T{qZ`B%5=%oN@zslhMnDsbov7G`BXv_3R*uA;V-^55ca%l_

@<=TG}OA;WJy?+`a14if_;F40R&yPKs0A(c2`m`#|2 zRP?@hLcxH`u-4(#q0TI~imOqxE@|B^-hQ<=`XqysfrA{xtXZ=Ubowa7mYG9~V}ceb zUwEvUBU`g>=MswLU&kyM&lrU4ll53!(856}ahMOw#ju*ZBZ- zYW^G3x?=#^x=yN`k=MF@(E)P=K07KaW$O?`l_Tg(2PVne;;G8V9#kZQmpd{lbX#y% z?vd*bdY7Gy)SWj2_LONxyI#Y~=Tho*czGd+S)Nu<_-|}rvf_FeFgPc1<4JgMM9AbV z%V27Qn{{3!ZHA@Mz$Q;jBMNe|6V9xQ4~U(Kr|ie7^8khS-@pT5ts$~!Wflk5t4T(u zfc7_LiefW7UU%-*^vMT$%0HRtH&hvfzEln_NopAsH=-UhJ|G$N@e#tb( ztr@9!nzKt(B>aKL^B@mi3~$!~P#YhRKC;aR*`&UW=|9>MVa_qA$A2(VZ1!KH*PQv3 zt_I9ShdC~gC#J!$J+@qv8nVmh)mY5iiYB>!94IhTUR?@D7^{|(Z$D%->)=)bZycKk zo$QL6Th$rO(qS|<9^kvTrPg?uLGR?G;z$7CY~QJMS|?6aK5yPDj#r(Ps0q_bkOv&J}Gc|0;{_1h3~Gd*QNz|YF^jJxIW z<6ovxZfSTraQd9yj78U+v%(u?dlcKBeJKsSY>mS_GMUJKRf-k0^koY@z;P#>6W`<% z&Tg-V28-fKz4Z)X0UIUN#IIg%ndS@gRz=_8{q&5weoDHSYn0s8TE+@KLW>!vDn{17 z&N2{NPa*lGTIaP1FD`@KXWakJ)S7E1vNX_v2bdc{>5RxPm^9L^>koDo&@mPoh=u!d#|x?e8{ZD~X5so?-$AW_a| zxHY>7+BtJ@pP4&9dHEWRMHT;X;CC!_wHz}WUTlr6*<2(_BQ0~47KV5hv?xH-+uB9Q zfa(^t%CyOc+*^PjY<0l=0ds5cH0 z1+{p?c%qD)MqQ^>H@s@3%y0;*&l7IbmL+Kv@Xz4zHH%W}%I7U<|73Vx%)%6twEj3( znb=yYFV2+)$%l$~5WG)n4Qmr=nb%*W#cdBEs&nMVsISx;$*e+ zp_|T}+XA2N8R%EsPq-BzYG?3NQ-ki9x5;V0SD+vOfZIlRDTg=)lXYlu5u zL?z4cg;Aj|43~irWl!3#jam#o?S97>93X@zVx#;4K-zcOa0c@hH`l2LVbyz5;4TS( zFl<5VV8Ad<*B!#|e1m6Gy5`!{H_?qaIE{{BgXK8^|jBmm0P$< zUeXvi0Z6n#_V-BiVnvuoFil0XZ2jKdDO9D?SV1#oaVkH)C`3U7DUHs!+T|EA2bAVt z7|Fl+y$gh)Tn~!uLP2<;%A!0KBPmp;@Tr)h^yT2nKU4i}cgUP^?y(gvqnGRKu0*d* z7Fp4)D9>g!9yJ~j|6Cw~(Jpq;XJ!l)xg7nkYB_?c%|V!uSsP~Y{u%Eo!3x9u6E&(S zG42&Px}7!pgDs78^AYP_&nJZm6Cpo<>TkGmQ%>;K9<2LjoNq>YR3f}TwV_yKf*8$z zY0(7H7MmQ}Y(djuQw8GJexV6q=??1@9Znf$Y~j+;R$`i}{U`+;amRa6HQVQQo7XVw zrejhn^P-7B4onZkjLSqRiTUrm!;oTWq9xJe#s5oo0m;2GR07x(-1NC=u^sXUxKW&LME@iAeX3?^7*rx@RY(peYK$<2}aq zI_>|^lZot|(<`=?Ec+}>xWsB+{#3+^v&GdD^oZJ5Vr(}&+B=OLm=OPrhdcDlh3ODff_IGnKj|W@yRt=kx5N zWqp39m@pHCp_^usjmR)daSY*f090Uzk9O|JDK}z<6~kSLe+Xyg?cqK`A#^WXI43{#W@a zi#Rv5kAoo5w;`@Ol#ZjolUbJJYK2VIsBWvEAR5at$#=mf#s7qW1gu}*ymV@>p?jlh zqt~RW+l(h;ET)ru#s2G+59InI>-+hk1rvuB%9;HZsk|LrE&yny7GG)S7zN*RK>m4j z4IUF7v#e(Ts#tE!(%$71A_7VF+zn~IEAzHT$ao}9qfU0PTW?;XA@gnNfWf7-m6#sS zdlIy_mUlu8ISz(E9Rt&ju_LB>6oegM8x;FWMfM&R~M|Dm$V^1)phy~ z9>@dPw?&2S8T_oSH@_9+DUZ#MVZu#z`08XL1WxWM#YSkynhR^yUR1CghR}Gg$+*ZIx3QTZ8@Ip>50yHs5 zxWg#(kgZ&uAOIzoL5;c}I@ApH#AJAJYLfmDo;AZ_?*wIl;f5wp9vmC2>X!y3+Ay#& z%u%dwje94W#aWYQN)1|&qr5kB{X)!(Vyh2ri0e`Pi<vf+`bTI_R=4$ z@gXqb+#W!E^iN8}B^+q@Dmy`tWaz->2w$8ooc|cSKP{hNJ8%!hIfT zGdus;mIZn*eGON0P)6#mN{=y(B|bR0BOb@_xCJ&DPFq!0C{v;Y2OzBUR;SP?88lb3 zBVwhX1r6k*8jC@Hwdv18o{fc*n@c7+H-4Xq11PvNa*(r5OQTU4W*QNSC#XDl9p? z%A&NvnXxt)W0n|+=%EE$S8bwZ=eWeE?mM7&3?cQlbUdu$*OOHhyLbuydH|qY`mdts(PsLNv8^{J z7)C@TzYxNAfD&&Xgo zNyufP`Dr+bpyLXIBU>G*_u%5V3;j;|k^k?TA&RXq>eN0j>0qPN_$UI3f&I$BmI(Zg z4K71_90UuV9}eq@qsDbU1C{pZe6oeFJl+L$DS#+8W3>hX^`Pt@rFXtD5Jlr-;idRq zO~>z8SE^*M_qA<)G97q-Fc??@BFAsZW9=nWe>aPkFNPt3*O8}kG`@{EQ9X)hdn8Fr zTz=YmGk$(fI6Sc9?9k5h>q+@`OC-pCL%S*6-7}LH!gh&JOM=8Er^Bp(gYRbF*_5vX zjTlnU5IUaPy*2OWKePQNH(7|s(wpqQW9g8^pB@@Nz&l{-4Xb~CxPNP}AmqF84lz#6 z&$tpVd~1IorzEQnwD?!DOmq2@V{+m$X4L7F&aPly6odSzOnSQs}SHxF&QK8VqiW7Y^Ni1VEWc-;9>*2kD{%RT zONtdqjs@OM@wbXT3j&*cbNJco$fyVuN#djvHheEJH54!OE|h@p64a3D=nL5n-eVB9 zlHG@p!zm%pT6@g&p7%yPPMr*9^jvT$ao75+a&=7(T{`7- zpRtyEBS;Al^qq0%!??C4mYJ*SG6s(EUn+JP9V3z|j0mVtUT89XUgynFrt+Ma9B=ED zI1uQTxn5$W>OTXFQs!jfO(a1JlK$`x z7_9G_l~I+|TVqFAC~y-JGIS1b$AHm3mBBYOe^+Y!VKN&AS1>=0NR~SEy)9&9df`Bw z{YzLgR^2y4=6ZHc&k@pc@6+CiToeaBbg%_#xF;*0RmZh=guU3MWQhDUbzh|Z5$W~# z@nwp5e2x7|o}h3gXCzD#EuZ~u=xrO_Ih>$B(&XXL1xKUMv9)kJwOtx2>)q9JQS`re zF%#PgyD)kMDh1dh)1x)+`<=GVw&@*JB&Kv@SJF*k}r9cnma9n5@wz( zRA9%$X=*?K6{mBw7{!Bqx57m^a*e6BS>!>@F=3pl>D3xd^SpU)h?9yWIu?xYabI

BVY7@dq_BW((`nJIggbnLB-tPM_-mjH~A#3VDEYCDyhtI7LA z7>R_Xo}Suj^(F4yO<&9pYn`-VPIlCC+GzqzkdM*x0dj+Cxv$1ILiw7*KlEyp8*<}9 z7?IJ+I!DbXPfg2G4=E2=J)%Jv-E2Q`fT)FOq}>hx&Q<5Yx8E69`q$JI#pMuN*hfp* zg31H3J6C6><=RFvH8+3rSs5H3Tbp^&qX1USiFe9!DyMOF(u!Hk5)MlzSCe-29>Yt^ z1VaahHGIa2;1wfF}%dJz519+(R2VG~S?R$d3G$JX>%4YUVAel${s2%`KrLX``x zIW8@uiO3#tjJcPK^>2EHfu3CqJlg8Dp0g0C{X|9ST1uGJ-#5L)_wzKYT8&Mu~39Q}ag6%rSyDj)_lY0H9e$wbxMkKv7=T%R@mW zH~-=Qr?U7GY1?5uoDo~>QwzNYg&+;MhP5)xA7IxT+At9%pm`UTbV`+se`=M>O5`w- z8$C=AS6B!3*+7R+$6F2x+vGVn&9REpO}fY`pOSk>w(*JoAO`ZE7Cj2yrQS+zijZRaw=ZV49gjmM`f*%m{&)f-=F(<1u1H6 z&=qoYSoJ@B%D<0;x0H_2v|Up`9os;=HOnFLrqXJ8@q4>03oGlxK`+!Z!aJ+(uLuIv zY>2gY5QbkPI{UFD|A~|g&YZqfQfqcsFd`DbA-;*kJJS?&Rk$P+;#)&jgVjLo2+1c? zp~LMV`$y*VRFZ^CQ6ipq^1zDRF0+;AF^7aS{l_2{S;mmvOTlV zZ5fjaBZi4Bc80thzXn1Zfp(U}TXUa&`F2TM-2bkQ00-g26XMh)K;QNhfLX_u`SLQg zRz@vIK6dk3_DuCbi_`&lM{xODd|^&f$4TdJ#Ptt0_9^mX@t*q#T$kO-ZPffcj{%;F z*^Y6-1aC_YF7$7ixFwRtM*kGu3%y!wYHo3VYYNr9`w_uES^q;`p6WNgjj%Fww7RVc%_ZGf&qN24A7(6v{A_Z2u2lX|9T;Y;nj66wmmO)92vD^8io2LAv?V9bE z;*Vj4L|vR;yWLSwQM7KAC5mR{-L0nSuKa`)`a}NQl}VY;rZ)M)_wc8 z{`ip;mB)v0qW8BU`+?|LH?%A;b+pk))RTSd0aCQ4dS~6s_4{Et)#Uc!LI@hIq;$mX z!G??}Pu}KV;BKr3CqS*KwMT2Nrs^==Aq@|@FKqGI_Ev&cpnu$NBNMVwda&rAk2cU) zHbO8XPoK5L*yhX$pVIoW$LTyVqO9Aio_sW8Q@O(0ad>4l1N;xQ!r_)@IwyJ@EEyV3 zX<#t?`F^VMXtXoKFM$Rz{ArrbuQcAz<469NvF)9Z13(^D#%)jup|n5sAX=jBaD^9;y&mG@5Te78 zYDz*L(@j&VsuyYBu3!-Sqo zuKf0(g`}_w^sdG$HSh3TJJG84kC19JJh6Kn?s~5&zJZ(z(y@myYVW)(ozv%YwaC{v zb|TiHx>AF#wZbxTEXF<`jl)vIDp&u(B)Zz?^u2p$y;C}~`G1NUqcD7?bWn!?#jB2hj2A8-vK=kQEr41*cFsHZiy2_ zV?|5co#-@`-SlUDI6)uZF*JvfbEP$x9DU1ND!GLXAkIqv;{W)URtcewm`BJLo7wEc z)XKA0bpY~=@_plQHI#_gTf^g!O46r?uk?qIFTNTtL0VB7jjH|775LX-84*mep7m>i zlRNBZ67@zLxM32NETwJkxo1UB_M|V+7o9v^v-E%}?aAAjYbvrAO0#8r8KLqq$kC#= zc)}^eyMpl{Sq?w-Tg7X^_j?)J2eDA*r_D(pn)dhzYlDKcLP8^fV=_hhr_&)0OFJ&^ z(avO3dZzAmAQmf4@{qx@bz=|+;`x-Y?0E*(#CJo6pq9JTPZPql;F2X<3ER#VYiNBN zaW~Rl`Ze)Q7MA8UzUw$c2#>_x<#m$0iGGmrVB@f%{2jApGuE@3Sn%AyRG$PifGPVA z!Oap7#7A%|2t)FOx!&IqlxO%#wLVZhQNpwCwJuf*95izLAOj6_mnKs{A) zDCM_sjf266(bp|BkYVX~@aCqG%vHlTV1nm6^_)K%3A(RuuU=&FGi>}n=IwKzFe)o&K`_C~f^k@Z!P_cOu) zc7trTo|ss~z09|X-(&LCD%CgHRjV;W?`9zh>utba_hv_i(=)^WECGM}1h?j#x5V&S zt-DjIUbZ@Hc4^#@&MqGdBQ{I+;Ur0!sV!g6;55g9uVQRb8;o@WWgAx&8>IQXrVY8- z%58!jLNGtetVVD$h?5qiPyP-DrQ}oq!}a7`|*2rK?P46}q5$@0&|R z4eH9SxPi4DT2kh5D?CdjKJ{+TpMJL@RE#f{{OV|a9M>N zzVmyt{}UEpKsSr6DZCo!lpG>2Jn7RklI_(#gxd1m-f+~S7ly(n_`p&X;{}H0W5sQz z>losb2x{0JKl0=U|J(G}6BX@0Ml`R2U3WZXmrbqHpoApYI>%;VQo-Atirz z@AKqFWbp4~_ut2zyfOj(YmtL%PTgX-g*?>i!mg9qE>FF01LB?&`z4$c)*8{|X$6wW z=mLT&qKlNj{+rDYeF@ey`KS$4YK{NB99PE~r!2{9s@1LsU51t@{?gO+%7=>`9$lKn!=)&3 zj^p;AK*VqRdim71O4HECrgeg6FO~O(7aaPlVMrsaIf*{Zy3P3m~M6bkBs?2IOWd-U<%);ksTCd#HTT~l*E zlrrT{MU|sheX~i=-I6=%+M~jJn-gvgI3nl|8wrmytNb`vBbSsTVD(M8sWp*!e_(Y5V*A}Q!gZ%P~^B+lFwXk{S}PEQ`K`JVfDIs zNr-HX{z+@?#^99${!G1*yhIuHZbqtKALz{Wt)j(+ZI4*UOoCSa|#hv^>1+3 zk`$OI0$fT%n5vH0pYOgn+(oKEK}I^j(Z(y3@OV?{_*y7ZVph2FIKD`=1pE=sqa-fz z;-S)q%8xMb`)P#5u- zRS@0}L}?r#O?Q6QY?2RKJ1Ak|DFl)lekNWguo`KVv<{)unFr$Yl+l~7;jjCKAxVBx zv;|A{;p~bKaHhx0h%P!bbXVSJXrxmgwB^BOBt3BaQPQ2zRLgCU#GD!=KYiibP^0 z{Ov5pVy5dkA6KH@9ZX*7fU(RFM@aXQ&5?jO9q4p1r+lchDUDxY zNrPQBXBzRM)~FA`>9A}@N5#SpfU%txJ9`;J--C}UTSjCVUquoa)=ZoupYf8>Is&!wIL{r z6-sALwt^9A{w+BTiPf$wmy_(Mf?EcU^da!iWn8v{8yUb&cRQM=KYD4>)w_;w^p*-^k))p}T)x*TfNwd<%wJ%$FWX|m zh-Ay(=xHYb5AdXp+I0UY57n#*H{WnRr`d$Q51u;K9jTu$$6EQfy$&nL+(MZEg)81i zQU5r)NTmrQebF9h2g$TwaVm%^N&H7=3*c#=FvyLP)I&>H+>X(H5~MsgWmlX4Gy!G~ zg3ztFqC|+n9?n;!LFQ2Z8ef>ZKd(=vz3VxtmEt&Ph}_Kd*~`OjvN@=P45HU!WT=rHH`c1o zo{0ZPgKxZfr)_$JD^)lkGyy61)iL7OMO!6%vV{XpRxktl7x5Y@XeT&jAd9)lHV( zvF#4vg3YWnLolR#t&@j(Kp+VGl>ONfF`6~ZYgsL|ZznlOcYRUSpUgyw9QTe4$-^T4hybkv9&>%6}|C{T0 zz+G#8@x<1WM36Cf=xzbAd=}Xv^iKgrgs3xF)C@vw7j~_Cy=p*hLwz-S9~f-3K?t`s zKT#7>n7N!8a0BB>65kNS$j8Yz{N$ALZ}<2@2yPV2s(_#M1OBk>eXTfx!Na0j-7&x# zoiRwC+3d3|F7%p)z`7s|)+oLg_1s`VRb60_gJK%E>YEi0YfIB&DpO~Kc@)nd$G$N@ zi8(j(%EJlX18?E0>WtTK-KsRRh>4V12C7pd>Q-@OLt4nSigIQ zQFtk}4g>O5sLtzt895Z4FZbiYX`~U@dB6Agv;4iR*;QyC5#>ggg=&)&>{iPW{lj|& z&3qMV(K{k2B$^bO1bGBP_-HmaL+%3E%4sy@(*&HUePX70vDO1nf^9ohrG>OnJyS)Gi zCfs!G>O?NA<<$VjL&451+t7_>u?bg}-zTe}qh#g7H9VUjsjr;~{Ry*~+!>$X0j{91 zK$4CJsN2;jtD_o1GEPfnMxF*3H2eO4v+HtLG7u^#O_`o|1slztBnX8Z5jJ}6yj}81 zlKz2JM1Mf-7qy7Enp{nv#uxGqY-j-R3Dx1o;LI*%`uj89bO}Nitu?KQpNX%CH9F;J zn~6e{U?x1y$|WZAjQ#x%3F;ig`@vw5H;s?T|FL-ntg3XI&v-c+k7-A({_l=n@Ztbg zzj}7p;FC&a?xI<{_(Ugo007yS;5b^D=`9y3!^4DG%f>7ahqILH-Wef;Og5MpM$Ysh zZ9cX_hq`fGWMxC>_Mnj!Gnh=?Ve51$M@qL? zu+4D5J|dm>B7+TzT=iphAC$?9!eipE4cQ|ZV!}YrH;)nu3^*cU1JvNLxGy#(d^Qr@ zrD}(MG2zvRUoZ^0vLEJxWEBrX^&Z}GIrffc$+Dtyi^=KxGK+%7(baaT+_^PoFmsWx zb2z6aG5}stB9tg|A+pkn%=@**0^%VU^A@3JkPXEkRe91ckd|Drc~-Dqz40*(Tt|-C zo_6{K0^8M?`lSI?aMCuSVQ6E{4DbqE0001DU;qeU#cUIthWIEyaetH}0mnj^N)iEU NltO$9{0aU5006kd2BrW2 literal 0 HcmV?d00001 diff --git a/src/pages/Sponsors/sponsors-carousel-buttons.css b/src/pages/Sponsors/sponsors-carousel-buttons.css new file mode 100644 index 0000000..119852b --- /dev/null +++ b/src/pages/Sponsors/sponsors-carousel-buttons.css @@ -0,0 +1,21 @@ +.sponsors-buttoncontainer{ + font-family: 'Intervogue Soft'; + display: flex; + flex-direction: row-reverse; + justify-content: center; + padding: 3% 0; +} + +.sponsors-buttons{ + background-color: transparent; + outline: none; + border: none; + display: flex; + flex-direction: column; + color: rgba(0, 0, 0, 0); +} + +button svg{ + width: 3em; + height: 3em; +} \ No newline at end of file diff --git a/src/pages/Sponsors/sponsors-carousel.buttons.tsx b/src/pages/Sponsors/sponsors-carousel.buttons.tsx new file mode 100644 index 0000000..dab9fe0 --- /dev/null +++ b/src/pages/Sponsors/sponsors-carousel.buttons.tsx @@ -0,0 +1,24 @@ +import React, { useRef, useState, useEffect} from "react"; +import './sponsors-carousel-buttons.css'; + +interface CarouselButtonProps{ + changesponsor: (direction: string) => void; +} + +const CarouselButtons: React.FC = ({changesponsor}) => { + return( +

+ + +
+ ); +}; + + +export default CarouselButtons; \ No newline at end of file diff --git a/src/pages/Sponsors/sponsors-carousel.css b/src/pages/Sponsors/sponsors-carousel.css new file mode 100644 index 0000000..cdbc84a --- /dev/null +++ b/src/pages/Sponsors/sponsors-carousel.css @@ -0,0 +1,102 @@ +:root { + --easing: cubic-bezier(0.18, 0.89, 0.32, 1.27); + --duration: 0.5s; +} +.wheel { + width: 65vmin; + height: 65vmin; + transition: transform var(--duration) var(--easing); + position: relative; + top: 0%; + left: 0%; + margin: 0; + background-color: transparent; +} +.slide { + width: 40vw; + height: 0vw; + max-width: 500px; + max-height: 500px; + border-radius: 50%; + cursor: pointer; + transition: transform var(--duration) var(--easing); + border: 0.3vmin solid white; + position: absolute; + box-sizing: border-box; +} +.slide img { + border-radius: 50%; + width: 100%; + height: 100%; + object-fit: cover; + pointer-events: none; + position: absolute; + top: 0; + left: 0; +} +.slide img { + user-select: none; +} + +.slide.active-mobile { + border-width: 1.3vmin; + /* height: 20vw; + width: 20vw; */ + /*I want to make the highlighted one bigger - Low priority task*/ +} +.slide.active-landscape{ + border-width: 1vmin; + height: 20vw; + width: 20vw; +} +.wheel-border{ + border: 3px #326491 dashed; + margin: 0; + animation: spin 30s linear infinite; + background-color: transparent; +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@media only screen and (orientation: portrait){ + .container{ + width: 100vw; + height: 60vw; + overflow: hidden; + } + .wheel{ + width: 100vw; + height: 100vw; + border-radius: 50%; + } + .wheel-border{ + height: inherit; + width: inherit; + border-radius: 50%; + background-color: transparent; + } +} +@media only screen and (orientation: landscape){ + .container{ + width: 100%; + height: 100%; + x: -20%; + overflow: hidden; + } + .wheel{ + width: 100vh; + height: 100vh; + border-radius: 50%; + } + .wheel-border{ + height: inherit; + width: inherit; + border-radius: 50%; + background-color: transparent; + } +} \ No newline at end of file diff --git a/src/pages/Sponsors/sponsors-carousel.tsx b/src/pages/Sponsors/sponsors-carousel.tsx new file mode 100644 index 0000000..e65c45d --- /dev/null +++ b/src/pages/Sponsors/sponsors-carousel.tsx @@ -0,0 +1,168 @@ +import React, { useRef, useState, useEffect} from "react"; +import './sponsors-carousel.css'; + +interface CircularCarouselProps { + flexDirection: string; + getCurrentSponsor: (value: any) => void; + images: any[]; + carouselIndex: number; +} + +const SponsorsCircularCarousel: React.FC = ({flexDirection, getCurrentSponsor, images, carouselIndex}) => { + + const wheelRef = useRef(null); + const initialSlidesState = images.map((slide, index) => ({ + coords: { + x: 0, + y: 0 + }, + theta: 0, + index: index + 1, + image: slide.frontImage, + name: slide.name, + description: slide.description, + type: slide.type + })); + + const numSlides = images.length; + const angle = 360 / numSlides; + + const [slides, setSlides] = useState(initialSlidesState); + const [activeSlide, setActiveSlide] = useState(slides[0]); + const [wheelWidth, setWheelWidth] = useState(0); + const [center, setCenter] = useState({ x: 0, y: 0 }); + const [rotate, setRotate] = useState(0); + + const getInitialPositions = () => { + const center = { + x: parseFloat(getComputedStyle(wheelRef.current.parentNode).width) / 2 - parseFloat(getComputedStyle(wheelRef.current).width) /2, + y: parseFloat(getComputedStyle(wheelRef.current.parentNode).height) / 2 - parseFloat(getComputedStyle(wheelRef.current).height) /2 + }; + setCenter(center); + setWheelWidth(parseFloat(getComputedStyle(wheelRef.current.parentNode).width)); + }; + + useEffect(() => { + if (!wheelRef.current) { + return; + } + getInitialPositions(); + window.addEventListener("resize", getInitialPositions); + return () => window.removeEventListener("resize", getInitialPositions); + }, []); + + useEffect(() => { + if (!wheelWidth) { + return; + } + + setActiveSlide(slides[carouselIndex]); + setRotate(angle * carouselIndex); + + let positionedSlides = slides.map((slide, index) => { + + // Calculate angle increment based on total slides, + //we're doing this in radians for simplification + const angleIncrement = (2 * Math.PI) / slides.length; + var newTheta = angleIncrement * index; + + //This is done so the middle one is highlighted and not the top one + if(flexDirection === 'row'){ + newTheta = angleIncrement * (index - 1); + } + // Calculate angle for current slide + + const wheelRadius = wheelWidth / 2; + var y = -wheelRadius * Math.cos(newTheta); // Calculate x-coordinatewheel + var x = -wheelRadius * Math.sin(newTheta); // Calculate y-coordinate + + return { + ...slide, + coords: { x: y, y: x } + }; + }); + + setSlides(positionedSlides); + }, [carouselIndex, wheelWidth, flexDirection]); + + const handleSlideClick = (e: any) => { + const nextIndex = parseFloat(e.currentTarget.dataset.index); + const currentIndex = activeSlide.index; + + setActiveSlide(slides[nextIndex - 1]); + getCurrentSponsor(slides[nextIndex - 1]) + + let numOfRotations = nextIndex - currentIndex; + + if (numOfRotations < -numSlides / 2) { + numOfRotations = numOfRotations + numSlides; + } + + if (numOfRotations > numSlides / 2) { + numOfRotations = numOfRotations - numSlides; + } + + setRotate((prevRotate) => prevRotate + angle * numOfRotations); + }; + + if(flexDirection === 'column'){ + return ( +
+
+
+ {slides && + slides.map((slide, index) => { + return ( +
{handleSlideClick(e);}} + key={index} + ref={wheelRef} + className={`slide ${slide.index === activeSlide.index ? 'active-mobile' : ''}`} + data-index={index + 1} + style={{ + top: center.x + slide.coords.x, + left: center.y + slide.coords.y, + transform: `rotate(${-rotate}deg)` + }} + > + cssa member +
+ ); + })} +
+ +
+ ); + } + + return ( +
+
+
+ {slides && + slides.map((slide, index) => { + return ( +
+ cssa member +
+ ); + })} +
+ +
+ ); +}; + +export default SponsorsCircularCarousel; \ No newline at end of file diff --git a/src/pages/Sponsors/sponsors.css b/src/pages/Sponsors/sponsors.css new file mode 100644 index 0000000..0d95e12 --- /dev/null +++ b/src/pages/Sponsors/sponsors.css @@ -0,0 +1,43 @@ +.sponsors-body{ + height: 92vh; + width: 100vw; + display: flex; + box-sizing: border-box; + overflow: hidden; + position: absolute; + top: 8vh; + text-align: center; +} + +.sponsors-leftside{ + height: 100%; + width: 70%; + display: flex; + justify-content: flex-start; +} + +.sponsors-rightside{ + height: 100%; + width: 30%; + display: flex; + flex-direction: column; + justify-content: center; +} + +.sponsors-type{ + justify-content: center; +} + +.sponsors-name{ + justify-content: center; + padding: 0 20%; +} + +.sponsors-desc{ + justify-content: center; +} + +.container{ + y: -40%; + x: -20%; +} \ No newline at end of file diff --git a/src/pages/Sponsors/sponsors.tsx b/src/pages/Sponsors/sponsors.tsx new file mode 100644 index 0000000..e2a1c4f --- /dev/null +++ b/src/pages/Sponsors/sponsors.tsx @@ -0,0 +1,67 @@ +//import stuff errmmmmm idk +//am i in the kitchen +import SponsorsCircularCarousel from './sponsors-carousel'; +import CarouselButtonProps from './sponsors-carousel.buttons'; +import { sponsorsInfo } from '../../resources/sponsorsImagesInfo'; +import Navbar from "../../components/Navbar"; +import { getWindowDimensions } from "../Home/Home"; +import BinaryBackground from "../Home/BinaryBackground"; +import React, { useRef, useState } from "react"; +import './sponsors.css' + +const Sponsors: React.FC = () =>{ + const sponsortypes = ["type", "type", "type"]; + const sponsornames = ["Nokia", "Communications Security Establishment (CSE) Canada", "Sponsor Us!"]; + const sponsordescs = ["yap", "yap", "plssss"]; + + const [currentSponsor, setCurrentSponsor] = useState(sponsorsInfo[0]); + const [currentindex, setIndex] = useState(0); + + const changesponsor = (direction: string) => { + + // Handle carousel navigation logic (forward/backward) + let index = currentindex; + + if (direction === "fwd"){ + index++; + } + else if (direction === "back"){ + index--; + } + + if (index === sponsorsInfo.length){ + index = 0; + } + else if (index < 0){ + index = sponsorsInfo.length - 1; + } + + setCurrentSponsor(sponsorsInfo[index]);; + + setIndex(index); + } + + return( +
+ + +
+ +
+
+
+

{currentSponsor.type}

+
+
+

{currentSponsor.name}

+
+
+

{currentSponsor.description}

+
+ +
+
+ ) +} + +export default Sponsors; \ No newline at end of file diff --git a/src/resources/sponsorsImagesInfo.ts b/src/resources/sponsorsImagesInfo.ts new file mode 100644 index 0000000..c15ba2e --- /dev/null +++ b/src/resources/sponsorsImagesInfo.ts @@ -0,0 +1,31 @@ +import cse from '../images/sponsors/cse-cst.webp'; +import nokia from '../images/nokia.webp'; +import placeholder from '../images/placeholder.webp'; + +export interface TeamMember { + name: string; + type: string; + description: string; + frontImage: string; +} + +export const teamInfo: TeamMember[] = [ + { + name: "Nokia", + type: "sponsor type", + description: "blalablablablabalb", + frontImage: nokia + }, + { + name: "Communications Security Establishment (CSE) Canada", + type: "sponsor type 2", + description: "bababbababab 2", + frontImage: cse + }, + { + name: "Sponsor us!", + type: "", + description: "PLEASEPLEASEPLEASEPLEASEPLASE", + frontImage: placeholder + }, +] \ No newline at end of file From 3c0929b5e44350ab1e6128e23f8100633e3ccf1d Mon Sep 17 00:00:00 2001 From: Marianne Date: Tue, 25 Mar 2025 11:21:54 -0400 Subject: [PATCH 2/2] the carousel looks less ugly now --- package-lock.json | 53 +++++++++++++----------- package.json | 2 +- src/App.tsx | 2 + src/pages/Sponsors/sponsors-carousel.css | 15 ++++--- src/pages/Sponsors/sponsors-carousel.tsx | 2 +- src/pages/Sponsors/sponsors.css | 13 +++--- src/resources/sponsorsImagesInfo.ts | 8 ++-- 7 files changed, 53 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index f94a3bf..6325efa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "react-dom": "^18.3.1", "react-i18next": "^15.0.2", "react-icons": "^5.3.0", - "react-router-dom": "^6.23.1", + "react-router-dom": "^6.30.0", "react-scripts": "5.0.1", "stream": "^0.0.3", "typescript": "^4.9.5", @@ -5313,9 +5313,10 @@ "peer": true }, "node_modules/@remix-run/router": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", - "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -20020,11 +20021,12 @@ } }, "node_modules/react-router": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", - "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.16.1" + "@remix-run/router": "1.23.0" }, "engines": { "node": ">=14.0.0" @@ -20034,12 +20036,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", - "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.16.1", - "react-router": "6.23.1" + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" }, "engines": { "node": ">=14.0.0" @@ -28241,9 +28244,9 @@ "peer": true }, "@remix-run/router": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", - "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==" + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==" }, "@rnx-kit/chromium-edge-launcher": { "version": "1.0.0", @@ -38732,20 +38735,20 @@ "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" }, "react-router": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", - "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", "requires": { - "@remix-run/router": "1.16.1" + "@remix-run/router": "1.23.0" } }, "react-router-dom": { - "version": "6.23.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", - "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", "requires": { - "@remix-run/router": "1.16.1", - "react-router": "6.23.1" + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" } }, "react-scripts": { diff --git a/package.json b/package.json index 439d38b..f7c95f0 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "react-dom": "^18.3.1", "react-i18next": "^15.0.2", "react-icons": "^5.3.0", - "react-router-dom": "^6.23.1", + "react-router-dom": "^6.30.0", "react-scripts": "5.0.1", "stream": "^0.0.3", "typescript": "^4.9.5", diff --git a/src/App.tsx b/src/App.tsx index 9259007..4ba6197 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -25,6 +25,7 @@ const App: React.FC = () => { { name: 'Volunteer', url: '/volunteer' }, { name: 'Minutes', url: '/minutes' }, { name: 'About', url: '/about' }, + { name: 'Sponsors', url: '/sponsors' }, ]; const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions()); @@ -35,6 +36,7 @@ const App: React.FC = () => { + diff --git a/src/pages/Sponsors/sponsors-carousel.css b/src/pages/Sponsors/sponsors-carousel.css index cdbc84a..dd4a02c 100644 --- a/src/pages/Sponsors/sponsors-carousel.css +++ b/src/pages/Sponsors/sponsors-carousel.css @@ -15,8 +15,8 @@ .slide { width: 40vw; height: 0vw; - max-width: 500px; - max-height: 500px; + max-width: 600px; + max-height: 600px; border-radius: 50%; cursor: pointer; transition: transform var(--duration) var(--easing); @@ -65,9 +65,11 @@ } @media only screen and (orientation: portrait){ .container{ - width: 100vw; - height: 60vw; + width: 100%; + height: 100%; overflow: hidden; + position: absolute; + transform: translateX(10%); } .wheel{ width: 100vw; @@ -85,13 +87,16 @@ .container{ width: 100%; height: 100%; - x: -20%; overflow: hidden; + rotate: 90deg; + align-self: stretch; } .wheel{ width: 100vh; height: 100vh; border-radius: 50%; + rotate: -90deg; + } .wheel-border{ height: inherit; diff --git a/src/pages/Sponsors/sponsors-carousel.tsx b/src/pages/Sponsors/sponsors-carousel.tsx index e65c45d..b030175 100644 --- a/src/pages/Sponsors/sponsors-carousel.tsx +++ b/src/pages/Sponsors/sponsors-carousel.tsx @@ -137,7 +137,7 @@ const SponsorsCircularCarousel: React.FC = ({flexDirectio return (
-
+
{slides && slides.map((slide, index) => { diff --git a/src/pages/Sponsors/sponsors.css b/src/pages/Sponsors/sponsors.css index 0d95e12..4bee22c 100644 --- a/src/pages/Sponsors/sponsors.css +++ b/src/pages/Sponsors/sponsors.css @@ -4,21 +4,21 @@ display: flex; box-sizing: border-box; overflow: hidden; - position: absolute; top: 8vh; text-align: center; } .sponsors-leftside{ height: 100%; - width: 70%; + width: 50%; display: flex; justify-content: flex-start; + position: relative; } .sponsors-rightside{ height: 100%; - width: 30%; + width: 50%; display: flex; flex-direction: column; justify-content: center; @@ -37,7 +37,8 @@ justify-content: center; } +/* .container{ - y: -40%; - x: -20%; -} \ No newline at end of file + +} +*/ \ No newline at end of file diff --git a/src/resources/sponsorsImagesInfo.ts b/src/resources/sponsorsImagesInfo.ts index c15ba2e..6614fcd 100644 --- a/src/resources/sponsorsImagesInfo.ts +++ b/src/resources/sponsorsImagesInfo.ts @@ -1,15 +1,15 @@ import cse from '../images/sponsors/cse-cst.webp'; -import nokia from '../images/nokia.webp'; -import placeholder from '../images/placeholder.webp'; +import nokia from '../images/sponsors/nokia.webp'; +import placeholder from '../images/sponsors/placeholder.webp'; -export interface TeamMember { +export interface Sponsor { name: string; type: string; description: string; frontImage: string; } -export const teamInfo: TeamMember[] = [ +export const sponsorsInfo: Sponsor[] = [ { name: "Nokia", type: "sponsor type",