From 48a648fd514c03fbe239d563764cf28aefe8a79e Mon Sep 17 00:00:00 2001 From: SangHoon Lee <50488780+bbearcookie@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:09:17 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=E2=9C=A8=20feat:=20Tooltip=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8,=20useTimeout=20=ED=9B=85=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ๐Ÿ“ฆ chore: @radix-ui/react-tooltip ์„ค์น˜ * โœจ feat: useTimeout ํ›… ์ž‘์„ฑ * โœจ feat: Tooltip ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ * ๐Ÿ”จ refactor: IconButton์— forwardRef ์ถ”๊ฐ€ * ๐Ÿ’„ design: Tooltip ์Šคํ† ๋ฆฌ๋ถ ์ž‘์„ฑ * ๐Ÿ“ style: isOpen ์ดˆ๊ธฐ ๊ฐ’ delay > 0 ๋กœ ๋ณ€๊ฒฝ * ๐Ÿ’„ design: ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ --- package-lock.json | 123 +++++++++++++++++++++-- package.json | 1 + src/App.tsx | 2 +- src/assets/background.png | Bin 0 -> 37509 bytes src/assets/ocean.jpeg | Bin 24600 -> 0 bytes src/components/IconButton/index.tsx | 24 ++--- src/components/Tooltip/index.stories.tsx | 46 +++++++++ src/components/Tooltip/index.tsx | 65 ++++++++++++ src/components/Tooltip/styles.ts | 20 ++++ src/hooks/useTimeout.ts | 21 ++++ 10 files changed, 283 insertions(+), 19 deletions(-) create mode 100644 src/assets/background.png delete mode 100644 src/assets/ocean.jpeg create mode 100644 src/components/Tooltip/index.stories.tsx create mode 100644 src/components/Tooltip/index.tsx create mode 100644 src/components/Tooltip/styles.ts create mode 100644 src/hooks/useTimeout.ts diff --git a/package-lock.json b/package-lock.json index 7c215063..109aa667 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@hookform/resolvers": "^3.3.4", "@mui/material": "^5.15.5", "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-tooltip": "^1.0.7", "@tanstack/react-query": "^5.17.12", "axios": "^1.6.5", "clsx": "^2.1.0", @@ -4055,7 +4056,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", - "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" @@ -4579,6 +4579,122 @@ } } }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz", + "integrity": "sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", + "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-popper": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", + "integrity": "sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-portal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", + "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", @@ -4618,7 +4734,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-callback-ref": "1.0.1" @@ -4672,7 +4787,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", - "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/rect": "1.0.1" @@ -4691,7 +4805,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", - "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-layout-effect": "1.0.1" @@ -4710,7 +4823,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", - "dev": true, "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" @@ -4734,7 +4846,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", - "dev": true, "dependencies": { "@babel/runtime": "^7.13.10" } diff --git a/package.json b/package.json index 6b2fec6b..9c0332d4 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@hookform/resolvers": "^3.3.4", "@mui/material": "^5.15.5", "@radix-ui/react-tabs": "^1.0.4", + "@radix-ui/react-tooltip": "^1.0.7", "@tanstack/react-query": "^5.17.12", "axios": "^1.6.5", "clsx": "^2.1.0", diff --git a/src/App.tsx b/src/App.tsx index 033d0b14..73aa8043 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,6 @@ import { Link, Outlet } from 'react-router-dom'; import Background from '@/components/Background'; -import BackgroundImg from '@/assets/ocean.jpeg'; +import BackgroundImg from '@/assets/background.png'; import EmotionTestButton from '@/components/EmotionTestButton'; import { ROUTER_PATHS } from '@/router'; diff --git a/src/assets/background.png b/src/assets/background.png new file mode 100644 index 0000000000000000000000000000000000000000..4de688d82a766030e0543411fbab921347e639d6 GIT binary patch literal 37509 zcmZ^}WmuF^+cr9M!%#zaD%~L6jerP4Ge}BGcMjbtA&rEDbayKa(jC&>A^Hva?7g4& zc=z{%W4PB`_Z8>5;#_mA2z51iEOb(I004lcs34;W0KkO;00=6m$gmZ#EjlIa1IUO17v(6hAqN5YsyOjD#yt8VGoFwlB$vbKy@6(F9;FG_XJVwguwt=P>kWGzx!JL>caiEs$k;t5wm&C5NQ>YF-p}mSz+odJ2 zl-i-sDoK)g9RySW7D~V)QUKtg0*CGvgRLjlYv$aStGkcftuJl9d>J--YpyNYIltU6 zy^^xy-7zQpXVCdtM>c3!3Y7+mcrif;`z(xTqk{sa6cF?>nk8ZiW)HEdD+VYvMAuXY zf@zfj>m*L3$e_~nN$KFhOv>kS0$~nFLY_ShkKp3$cy=*}>)BYG#Pcd%@L#XxRyQUr zVT&~3!qd-T{b%`q1oO{D@V&}&lx+Xy?>`sU5e1$@Fvxh0A>-S$0Zh#lCe~j$;&*=? zNMD!JcvjxsumqE#{2zevPr|Up3kLng?Z46Zr~O|bkc>Spo(LGei2vKZ$xohV$p7v} z-#_sL%bJ(4HH*LI@q+)t{~wJ1TWf;AA4|jxm{!!<#OJNaWqCI7pDp~~u9#>)L;F7r z{RJ2=_%E(pR$Tut=6H1DV_%-($m{?AawA$KnFc07({}*(zoYo?4MSC0ntyg>h-O5I z77DyT{olR}ZTVwLJm*;MKLfk}Y)Ac94*vH`P0^yy!knsC`R=etfqy~&|I_;~M(MQY zT%t$*3yTQ+e`oeTt%4a5z{sZ6t zuAhHaF4RL|=s|%P{~NA#tJlv-_ur5Q+cly+Z{mL;{(s%d|D?&_AMo&VEty~jEB{SU zIMx4=1NR>t$hQ&3Zs?&vQ&gw>ocpeo{wD-um{0MVlj#M2(pW0N1MMc*Y9I?*55T57@41K*IPWlZ@RFVrG<*{Fs%OjdzhK+w?$6I(S9h5@I=MWn zsuq0Dyd5L*H^Bk=gVcX94BIZnFe7!0<@E6lokZQoN=lKzqoV@F7w{G~bI`1w5)7XE zCd~3-;9s{Du`}GY2p}0MJ7S}I4H6o9S2}HYMq>M5uO->M=o=Sm*kin@#zas-J*gBj!NSz_wB(6v;l{9Y&$W_K8A4PIO>P&qVY$zxe1$xY=zv6uexQqxKsFb z#EWlcYn?pVI)>vY)i3>;N-~i6yoynr*l43&ttXR?U#F4n@l9*c5s)uKG7KsC` ze$PAjkh9%Pw(kg_snlAn2M}suu#N3e7aCh})#c^m%qimx9QJfGSh?kG>l-p{@NrkB z79IYq`|w7{scyaQgchd)9jzkl%x)X+{OPU-Y2-v$@9xtbt}d!ttvLf$6s;3UeM@Y{ zij^d=(W-FYt~N?u5A?P(2Hcy0?$wlfjri5QG3V#K=qXcZ*tozxK5~vQkWFGsL|~LQ zc_7Q^usNJR${#%FQd%>RihHmjnU}?%t_je2wk|@9% zD#EhR^xsSgF1bi=dG16#h&iRteL7%Y8`hAe6!4>;8;7;T-^Ri6cWenkga2yW$fcA* zO;=kqCn6Ef{h1^=T{mDgfCekYp`nN!7pgI72NJ;*x&yXei31V}^Tq;wr9i$zd#H+=QpOP9U zjA~kIjvsNJC!s8zYbv#J5M=XiU*WECw7h>kw1`5jr;YsqLpH&woBhOjW65bXQj+&< z6^GQ~-K8{cdW?K}@LjV!+_al9lId$C(_-2hSL&J$Ca3j&4sM#HzMS>;J^2%g+;Lge zsqu~c<*0jJNVK=39vd<{z^0l$`bXX zAIt>Mc--|u=DQ=_bd||UVe}s|t>>SXP@M>SWJRf3T=OM}L2FinYiO(`jx$|$2)OfT zabYMoTYf^zSkU|r6XqDfoi@#^H3X3}Qq?qIq2ecAQ6KDCWlxQM(@8&U`(l0J*^K%5 zMk;)%p{g|EUM1a6_l_u7I!Ybp=cD!3841F)(*Usx`^<&5CC1K%eM`CD0)y7y9f{T3 zso@=aj}C%54XaJ7@H@mK`U!;pJhtA1cO61=Wm9F%xQG*2HC=QRs1_@n)aC)%1Cy=wiB)C;m8NuXfOw$FIra zhhF|;L&$$8g7pABvJf^xDy-0@{!U8kkpGar8~0~kOK+%p1?wFul-LKbxr7(i{mcX_ z<{7>I&S)sH4xTHFPoQ!lOzkPdc*qoH@c45}nJ{_ga)0^bHgFJvFZyi#FDb?g{;LA( zFIOxiT#|`p%#9hg)6G`ZJ|NRuf!I zdhS|?5;*?`eK+wlOGN(LrmRE$(mJe9C9Pjz%4z;BBD{OOwg zQ`;%{e}*{+U@8j<{}J_uu9&}SOt1fOnSadv|LKRG1U!GG5hbwy;V1EzU27BjFv9c! zg1vegVb;Paen`XE1EzFx+a`az|DE=x!xAo3{z`J zKGB{3>{WDofrkBO4v2$_*w-`n=YH~$Ag1pd2JAqATQB2C!2<8d(u6-R@+$04R8(Bv z3%dc-(3diXYhE5?5ok#7ILTp$gm@q;0s|k~#fcfzM12IW$lo28YFmmZ868^eAUfXh z`Ryc?=K(wnJpxCS#G$uls~?*JCv0dcUrabjyNBEOGxp_S+w|D{@|mK<_bGyL5IBo& z@<}~lv+J)j-_Ctb;a|Bg04pI1)J}PsEKZ)T_*hITolpj-yNT+LtB*52dU$ppo*6dO zL_Ve;4`Yw|0f-b;E$m?U3)a4SD|;u$&oeYrY4ex`XElc?&Ih-=l}sz>I0#Vt7)2uc zXkh##9PV(_Z{?(GWha`hxK}{gr*Z9*#Va*xDO5qayCV`v5r^; z@@ad;F1?pcF^2?(tupW@VMz8cXcNVH3>{bP3PW4$eY#^sTP5GTvTQ1=^n#?SQDGo= z@HKd!SXL_vn!5t?=ZwpiE<>Ebg0#8zV|E^u!+1n!V2O7+t)S(i$J``Y9oLGVJglsa zbo8H1x{cW=+P7l<(0TI?#_e9ZB`kee46&b;5XsATV97Q-GLhZRDiG)eheru{-{r~T zeeQ{+!X{%iMz5T_(*hUkUi3;cuL1l^?0>yVD%#M6BqK|%DF8xYLK&4-_+F7k+PRz*2nH^_1ZmhwzTxTI8LR5n zK=M!OaDx?nqH2D~&KUwXf5!Mzowl-b5E-mRNYBf}J)e&0!BWzwG-jj{EnlRcDGsWm z;fLiKo3eHoTL%&%&w(*{iBZ2HtEEwrj6&Qp7TM?8&iOp)rZHfx!VHz5adh_;kq+bx z^WjgfUPgT22Uy|L<4a(+L`cc};7g8&th31|Anz5wPE^JLkl?{u3Q2BG6CBEN5(LKG z6XEh>Gu!<*XnJ8MZh8cn-c|2=F?0kH(6e0L4wW6BhnV+4!p5^G&HLYu#!Q7o^KRY) z5*Er_fQmz(FFJVKHB<3A?t#vFjyJ~U=vW=tN$DPp3F^E&y)Y4zAoLq=H` zs*7i>260}T?U!&v9(gR*ask96KZX7X9J=V=9!7J-LvuMtP>}{fir10yjWRFyUC;_9 zbD;EahKf9Za;PSi4r$PY@_Tv`@vOe~lZ7TAjiLl34Gw5~(hruXYCc$yv!%}>aEkN8 zmfRJ6jjD)=-izs|^@a}>eu|t1{YtKoNMMB7=5r4wcOoZ2C<)*^Xm;Rzk<@JCES&e9 zW$=AZK~8Wk)x@zpUT6;|0=1Dk#){$@o+M&Z?+EDUCsk@IOkYev46sOp>SD zD77dY(qI>6^mO_;7*sFN>1cLCcQd|E5D|nX!@&hW03S6v%)77=^FVs&^xjQ&%koAN z8pI4?u0bN*zFgdpaHlX&QLkRCEtLBSI|5v+Ny$apH$=5j(?uR^-^Dh~DX_xMkt(Hq zdGH`)IzIf#C=GAq=POHi857?CY6*#gep*yEc&+BCx4fcVc%Q}_>zZ?!qmg(H$z8>y z9?a=M(#mf;J(;WCefiOwyN@Xjw8$Ic%P8D1=;98bu2Q#q;7pp+tNB)?xLHrhCiwI7 z1o~~$d#Wt>1X|p3PUnww|vT)=aM3>QQ|TdmQ>vl0=sR0Sfn`%-PTnfqgYGQd&Lh zWJQa2L=;`b!p=9K6NIBLbZccQ$r838pxSCKKGM*G3`p0RwqK;HoFIKyfMG3?ocRi; zR=8_Dy6(cW)t)HDhbWA&a^p)&O3-%~F_HPV9}AkKkP+g*+dzD$SWPJVx@6YeC8u#! zPnBW46juxm+t?eMuI9~Z!4C$>moeV;N?ep_3FruJkz_5XpO_o#BJC02YYz#RAWj)w zvEGBSn9!qZZ=cr~vU1J)EfyvH%#z1guwsjj8`A6bEIzb%l*=YVq*{9j zOgo1B82+*XS7us4;DEw~C38Z=QP6Sop4mbTCk$$zPpzVRa?>uz!St3o_G9cSuUUk) z4cs|Bs3s=NXI_)hX-Sh9*^*WD$^@yr>}Qp>t??RA1GP5ggkng`1RerOP-Q59v+P59 z|JZP^-)(Im&VxZ))nkm4`N-FJ+SLf@=GY+>&5dl9cc&eq?lyg>%6JOAy-!u4w?zck za*Cm=(ILyx*$EEJ8WQ3>g@PM31=d@@?DOP*%HOz<*{3~Wasa{0l-h+3)Rd!@k|K4^ zNGz!yWEFWptYxC1%TD8OC#HJu6r%h2MaN!PZW%)q<+W-$?-Yi#MyZPs$I9l)(KPCz1_s$W-%Uz<~vwJZf5p zLA_XH9QirgSD?zW;1(=(oCDMM**=yB98Ndy=Irp0iXqK1K|rWK6?eoJ$cp0UFmye{ zbk+I_0bfM|UBDb`OKLOoEVUVsk-G#1N7!vT%Fs{PEm6>o`#_WXxUM(T`QxmV&aa8% z8luQP&D9nHx+r)X*1o(00rdV1Di2mA1O_!7*`k};*R5hoK8`&Eky^?BdlWqY%x)LfN z3*!9K?bOFkAaeZZK%w=bo>p`O!fbDEux%05YaWZV6kdMBCU<7cV6N)PY%qWtdza{y z<;(6b5=+q)(Z@Yij%*<$;AtRBIstg-_7`WkKH8(L;vIjRCGG9&ACd1S?j&TA6`^Yp zEu>dXQbh*N35;L5c0uKw%S-Rh^)k9Fa)}!@yLkk$6j_r@@&8 zx~C$%x-&t<27-7rq!zHBs^G~}CUT79rp)n0<{WitQ2ks7Tf`+V+tGCP`upV{X%oIx zpZ43B7geyoH&D?c?$RbUIHJcyB^|Te>khU#l3}(0mmn)%((l8YI_t0nw?1mKW}Lom z%3?23cKOUqk95RGXx8(^fEkq}AOZt{vc>zMYeUKH{d9W9T5_Lr#Eo|?$!lZvMP}8Je6Pg?R|2zyqMQ4 zKteVem$oQTp>V`n4G^pYV}~;tf}@F=6V4If)+z>96r<`$9~k)>&n=q5G}V1u92*DvGy87@Ic86~_hzU6n zw;^*D&w#0ril@EF{h~wlNfqgAV>9nP(d#bSXv|>0HwY_LH8WT&M$W3jBE>(wCA8Qu z)`eqPL2vH18#wC2sB_!zo_q%gEYNtp4c#{m4UL@d*Kk>(7~pKv@{P&oR_$g3U7mtt8vrdNS?xisKVj z1C_1oV{phW$6jD2A&mb#HcVjBCXHf^wBFcJ?PbKaAz&qKYORVGy{)#0DUdWdc!{V! zS2Zh1oLho=vVs$}=_oZm5@M*rKr#}5Q!VhCk2P0n60wQUmwNtfldp(C) zP*?t%T_m3gQ*2OQ8QroS71As#YR|dTDTa^Me8fB&|Jdz-qw!}o;+umkB2OPmDaV%t zv3@Jkk`sGb_^Mh_UVH0>@^9-Vub3hMLg>>BAZ`1o8DKNQp6MsnId>VO&c$#tQ@{J} zPi)%cyPqW&kJ3F^G~3Jd!NDdgY0@jkGbU}fng`JCt9ADleSrK6JGSK)X>#xV3S6aD zc1>R=qO3T_)h{PCb2jwz>n8P^p?^U&09*N-90fi7dLVAWGpTshIqz*l)hD-}4ITDL ztax~{U<;4oA&z8MM8~9NQL%ABV`i}KXVZ$&x7&oDE~wxfX7g1@8IAq(7x9*p(INXj z5oZEX%KC&5K(0Q=&UhgMdx{cdZ^o?Wc4f7eC_7kVs4#pvc67XxY9b~X2ww|iM;(^G8V_nkwLTGWpPr)>sqb-2UI?kHooiT_%21(n?nFKp z!UfwhWA4LE1B@5&JT2<08>6qr_q+P=^=cC5nOJ z0-@fI`#0Q0n#31syNqfCNQwN5D_?cV*!fsYB;`UUnv1fv!;!RzDy*(B3^ZS}F5HDU zLo*SKVs#p8HhwB(ai)=AHs3Ij_%-RcGo#ZRChMQfwd=XbPmRIPR~OK>G;`vfP|>$9 zFCN-4#o5Gqm0e!S6aCoS%?n#hL7RPjrF;OTId#cyfl4@MaUmsgr|Lg2KsIRhk;s($ z$W|RkK%d}Hg$*R zPLtH7XW6ogSIEUTpD7VDjVGFVGG|GTnH|x_*}%#GEG}H8o|a%!*()ZgC5k?v7h8D< zb6b=7%9<{nYfk{RTI;1>l=Pe;dLXk5h`oG4hi9TY2^^1m)gzrSM-}D$VnUP36`RQ1 z(UC)>Gks;Uqcl@s#@da2i8zUO%0L5y2$5{p90QEhi0Agyjdg7rDhpTm-PE!7rnaJp zR8Q}SJ562_c?V7Yl6YdC%f`>lw7J1%OGa@tYycS|x^>d0rHeU4kmgL4b>F7{nJl6Z z!`6s%j1ULN&&DBU)?lFB?JC^{SE2f9H0$(Q!ns3o%4k~d3lvgqg%JWAvJq>r&Q3}W z#O@5|pbo!JakV$7!Iptrkgl-7!8Ta@vQ`pne=91uE=OLZ&aPVcJ*94$@hm#3CZW4T zEZrzSHhtb&tTC@rtw{Yfk|R>KoVF(Mt_&M`rGu!I%PUzjEX+UFyKY{dHZ>F)N%VXm z1Oj)lKPA>Xk8bMNG}dtY(er(|@HrJ6MNv8eWHxb!yo`Lb!$T^L5nMJ%m zf1n~bg?x;R%dq5JE0PWQ<`OWLo_6~oGsN}{O2*R4*ZF!BuJOba05#a~fl3Z0kWTWnxsi_pEu^Ip!Ko@=%B82STZira4y~eyE`ZeF6bw z8FlJU+lNGoc&&iCHwK${L8HSl4J2tppzDF2z*x*_L3cVnUB!NE9^ySETI(Jhlnd%R zpN~j(Z-%`-S5r!2nh2RZIZ$>Xz%}!mSBHfE0Ao(7m0z#_vPfh!>E7(d0uGJVR|S-Yzx`GTiXbTh7 zZZy3Lf$7wm;i{`8X2ztqYXdfP2K1ke@xXpurkNh_`v@Wd##mQEp20d53JElWb9wN! z9$w8EDtat>L+c=HuRoBqpLgPZ8o@hi^X7ff_})v$A0t{)Q$53({7KlsKR5ivin+pS zG2Dne>Bw)!K+6loD;WglY^pq^xS=g`tK{QCtn{?|+rx*XK0o^Ze0!T9wdZccvVd^3 zFY4<)e)Chl713;d5`GL@LrR53BdeD;i4;=eVkKh%l|)r!a(qEU{4`P>N-Z-I1`1(a z(2{3mEJ^F2h(zL}T^Vr&Q#hQc{;5}v;XImK%Cu9!-9j}?w4lb!X`^$}Kw95V@%U_u zXm5vD`az_0?eeV4ZR?Ypv1@AjDW|_5$jj`rJaGm$AS3X7?L&GY1?!29OI~M#T~wY? z<5c_DhQ|V>BS&7Cct+LCe1|Y!ZjGWqFgA-htrwWaA-eu+PjULi^&MjfKbXIg^hsKpbH4ck-RL+; z{Ppe}1^Ii75Y|;^VtMeYFsjzqwQ0b03t_l&)NH;LQqKpkRc+m^TyN{PwD&h4^8hdk zj}wLF%sx`{syE-GyzHRCm=V2H5gM=Y<3Z@q>1ve&S5L!z$6(-MxWIwjzVKLm4ws4? z0^)|*3qLlKhm}ux5x%8($l)J^saDg4Xv|(pvcmVA<$QIIWsxAD#&$5O-Cr`Rqh9go z=>HhhmxjWVERfT(8gIo1$Y>>|tt}X0Pc@6|?zxn2wCg6fI^K>bFS3+6gv8ADDsbHol38#$(iexFQI7PLcEIpowz8%^YR4fZr5dwRNxf^fykB*Hl&3>m{b2Zvtcqb*- zmwqol{#ZfsO)gU5r`WIN7QYET%>{!CBU9w{@3squGPkjjYRF-JjGVU&sEjme9RniB9PBCuiy8D1=c=8*} zgKl`cprqKCIGT4z3)0N9yfK$wZrHdJ4t&jKx}EOI^{`KyC)&3-v*S*+4maN19$iX> zqRd@@g|fdy+J4i0cJDLiI;qJV;;jaOZEt2{4)DG`Q)*~l0`MsEgeWkd*BIQ%Yx0;#lkVQ4c$3ZujRsR#83n@V#dy*6fH457;Dg zF`m5~xiE|`(`CM%PahW=jrU`^jVrUuns?6$#B5|E*xzCSQ-*ym!gF3cE!jP~q zEZ+0x=EdN9dHUpI>+dcP#tl)`b z>_S)nQ`v;5s2+_1gaFr{Q>MQ@_4F*|bTejGo)*u&mk6CIJ{ce+*CjD_mO>>FYWl;E zx5zfz;}zoPGjq3U#1^_IakRBG7U|QwFYkP==ss}--2Hm*L+k4YYInBpPtsxvGFtPk zYkjGCJ;s4fLx=SHfkTAYFNoT2Y?tyXXMtN_y(bn4%dRtF)+@GhF5A=g#qSTJnOQ}i z6-_ADE*J4hi$FLH zMB)9(vI}*AD;>1*UDa#lEK|k2l#E1}z}0b=Sq0bQC?OWH_?|K(;28a!aOKupS9_o^ zT#oyAREdWM+}oIWkwTD}X4h_Pyi}jA5M21mlqL>7uQ$N|&yUC$;am^wO58DZ|K!1s zu&>}gZ5(g=bVKV9ZmG*r$V-gDFBU-yX$9(- z7)wC;E=F?}6+Q|VxB=7OF~wA>ndHc*SbmJJTJp054C-oAGuO~Q?Ff)Zp&a45WT)hb z91p2@pj)iy$B939f^mUiam!U9GD!d&C$93K{v}f|62>J#x>g7%6Eh{*4~+U2qnx7_ zk8(u%wRpBs=QV;U zX$S)4lsPl@{|NHlgR(CgdtYb_3tBrG_o`l7g36nGJ$qy6`UlKryLOIaY|aThMqGY> z4;|r6$3-r0UvX1srhRBhn*I0?u@p@Bc|9-?kh@4Av{8g51-XMS_DjP+LQPdqW`N5o zduZVOBbW9WDR28M|0pn9X%hJzyKQx#eRk7o5-M=(mbRVnmIxWXyWhp#-;JMUuiLGG z;R(4qP4}R1F?IyCH{|mw{0CIb-|OZ}dDr})$;cRS6QT)Q#pIp_qyZiB4p|TiG*56H zAyTOurDb|8xJ+T~E8?sjqPvDON0t?*$m%+LvXqV%i7V+IQcl#V$r(EctBz_gFcZ}O z+I^<{Ystq;f!ZbeDTB>jj6=?V^^VQ3FBIv|b-FG#l{N~Su? z>$_f<%lVLdYFoO{UV17%fzedv;NG_FlX!QjO$~e)^YlHo@k&WumgB_B52V<=h#VE{ zKI~D$LDB+ZSY$<`yio_WkW`lju>DkDtE)625f0i% z1BjKytSD8Tzkd{@96QR!O?_@iYs?O3(ji51UFlj2LXJoy!fvE87@6U+h0k($tiLkS zJNlwt5)A51+Jg&Tc@iCG|9!Zj4@O85gcS7_ugb*jdkPv>$?A*%t3TrVc4!ZgyKmu(l*L4_(ZWr z?-*;B>gz;!uGL!L{I+u)GUV~899SbgY0K9hRJ62of&Y5mlD+2*3~H%|#}2wOXOf^F z+w=648lUW!db|wIMDd)@=@ieV7^n-vLR)rs)SzW<<1LVKB#_)&m8t1l;RJ<77xNw< zf(}l7%Y6fnI`0q8w1Jyh;fCwkfk2rTqXmeEjYPb$EoPmOcuP(^FB}Hw^z|zWvPy9oYKrXd^g?3A#1dmeu}lVm7+oa`0-BaCt6Mb3m3hMl22KkqlXY(vYgaVKT@71v z-&(>QEq^ekO~dLGUzKN66OZFJl})o9R2yk8_>g9cjsP{0cF6GN%anDgeYNDP+5#7~ zA)NZEH5DLprHo^%oKRlW)RNa6*G08+Bi51F!S#{Z1$rH+%BhKYn{O69@uf^&m*L^J z#1{Ea;xf1ic?1_P*fmW?@?we{v5J*|m2r>*;JUErm&-I5-@6(Rl%ScW8J z(ifn!G0l<{JW|?I9U)YoD$7b`H2A?-3bsM1ND#-PV0apjiub{TnV7jZm_CJTB{)Mo z@>lDU{VeD{6TUncDL*`{;?Yrw;E)AqSm<+tLO7i)O*c9#cU{Pk;vu-(mA6);kg4Pq zIX=<8JYw{LAWEjUirNO=uVpq9hMPRnE-P%{Z+MyEDO|cH1v#&&yp~HB;TP=2S6LK- z7OZur9kDhp`i8p?rG5b;7@9)MHXaLzokdV|rXGz|i#dPvZr12vms8t%ExgE9q-*kD zZFZ>>1f(71p!1|n&GMkIF|vn{$e<$kyiB{QByMD&JkxO{@+RWrjk@DGv)clCsv)C1xB(AQ~O z>daOUlaR;x^ztPT?X}AZh1smfv%1=AgMPmjTFOTfo_+V=Hc2sB$ye4z0afkE;=KR) zJxva79q-eW>eRcJz>inyx|EwO$Lb>8(U{EWLb!7OK__& zs};M7W?j_M&IHw`N%Bm-qIp$N96Ix)IDbCyF$wAcynVuF<#*LX*+Q%gJk@Owj`jAO_+YaHXOCh)`;?)tu`Rj5wI1J~o2G3l1okk+SOx&l-y(e4<3Kxh? zpw?cw+~Ih@tfE&aW|gy&)t+C=8-#N4s8gW;#5frqKVGC@U&#n|RwK%BXVZ^bw_Ie?b^} zYH-4#4EOS?nvLu=_5Mb6B3n@AHGnqz_Ujk@^(5itI(j5f7L`$Lb-2IxSN~y*e0cZi zg$W(M_k9)0XS>}k&4%?ScBqS$;+bU7Kyow=3b65vz%AG`_Wd@FmERuor{D` z!neIzroVg&yT8h-^4YjGs)VMkherK!jgrswn!9@Rvz*>>O}Yvk4)Va^Rx%RUq`7Jj z2%9i=^y(fW+zc*NnR792=wN%)x@5t2@d954XF31A55&HVRWIq zKu<>?v8p=jaB!{qb%A3KW^p2*R!d11K)c;_uvI4*_(n8ic>lm1Lc@Y-`-yHE5QRcH zyMy54vvh*4cq1W)ysXr*3Q;s|Rf;VpqzfF7)+cYMehZA-+2a^?Z2vK6SY^x9F z&Teuw$czZ_w(2n~v-tYKO}N8OcU%9X-K5GCImgv)qsuFkNuQA0-T4KKm2jeBpNEAy z&MHoVm78vf?ZBj?;2q=6R%;$XFQjy82Yuju^&5W5cr80bewvSXdg@{eySeU(m}iT5 zy?bPM(fA3ITveRZ{=|Qp7G%OsZ%CcHi$ix^EuSV;GtDOA%8=PII^W4|fBjU4(funv z=4@5aLEjzoP)e#Q(+M2aSNLMp*h~wZE3JHOG!rj^&4r!{-!LZjDIfNK3@Xt z_W2z{d+TcZ`=@)It6d+@@tuU*H;U+Uy#j2Cv`@}^QW>m3i^7zSci(1X0X4 zD*P>kF(Z(yBj0 ztO3fug2d*<-Cu8;H(}!|&`?|lzCS8EI>;oQm?fY4X~@EzguhnPrM_aRS1SgO-a8VI zEr&|IDX~@#;R%&<4Ty6%Usb^`ag}0P!eGc;Rhb%82O*@}Rn2x3&i0O%U7r;T&#K1r zR{>UX>*HTKuH_2Dull_q4rkmqHGu>imMj>^b8^eqrzrx{ev8J4{<=UQ+g6Rjuzr0y ziNn*Ct~B9=R62p-x#XEr7!?@OU8ijIN{Qstp>pESY_X%$R*nm*lkm34JL#N|4~mo} z^S{qpTs;$9F1&H<$WDrPWID1o<6k0!LROtjd)-fgQ2S|IrDh;I*qb^ zl2pGqP8TJG6fMvpMhN9l;}&_1Av{M0U#k_p6jZ6sTg15pUe2oifOQ`B_s)`<=^%vt zAnOR=*paNrL9!ms_<{Yo!8efbD3;@&yN#ZU&%Q;47KBa7>PS!0gU2dyr-rquMdOD; zT*&SWNZRD+syLUl(_;#8>v{4P=-5YWplh*L+I9BDmoEv%$CmsIlo={*v7$P026x4JGSoCN7&9aT$Kbzx0E<4Ocac&g3I zG3%4pz6^LX(tyK95_xY%Xr2(9DeGU1R;XdOox4qj4A<-o)3rCBF)ioha;~3BmO1_~ zU$?R&iM>*8lHr9;Ao$qI>t(BMo{lxSof@mx%uN(NA|V7;bc3Dxc3elR4KnX%yy{ zDR2+eAVZY%$9^kchB8y*D&^DV87}ihPreBLnqng%DUNdEwPL{;v~4Dz>)d)&!_scX z`rvE3O1V~&SqeMT{r2cRiB`0%+<$e!wB$9GdNjCJXWRPI$h<5mfhTzvTY#T(!lLt( z;YRoy{hG%Jx^$;(WC|{ay@R1Gm2ngIPX7j0)VI3JfRyu8!h}u_$%?p|c)GhSRsHDz z8|>k8lsFz@QS4Cc{pE@Q=V6WR?~yl08he-d-4qw*E2F-9vC){k<~}P1kEEf8??9oM zDP~Vg%APiXBhCqj=$f0j4yZk9?KUkPKD%5rbQV?+4^Q#mTs}WA+7@^Q2L;M;+CKK5 z78zaMmOkzk+}h=Bm3Tb)?0WCtq#=xlfByA5*lde*9*%=6=~Q7N@AkgPb;st1mp4n) zn%wt^9>)rEP7M1S9#*AqoL zZLH+55?MQ%7%pJ9QI*j8Cr(OcYR72X>AF|98Y$-+Cq>UH2In*Fk}-YX;|8pj503g^ zu2L@`JVhC)mu-j}5#7J7M>U$S-cJo@*yu9-)p{#Or308Jq&-_6i@EBjNGG-+PRPz& zQ~$6`DfNlEoXV4P72uUBDX{w5PT(Xk=|JX zu#0lOxpyVdzJ#p)+@%frxJOZT+=*=LT=wX+yiVR#Ustia^*DZ|GmjSN>o?ePf(>q7 zA@cvyb9VE2K!USe$atatT8my6k88kaIWF_T@-1;}j0ZIa2@ZIO8g+gnwhZgywmd`; z^SCDA<-RVeddkx`F$*QS(91wherb(8D*BeTCL(wJPG7|#R0SF03Eb*tE0iF=^imHq zK=x$r=A4V?{2vz=Fs{t#o_Bei{=f(#7GfM zi4!A7GrmjmqVT6%w0Ki23VK~tscPx9dqt7j%hvG6uYM;X7v>mMA=x_S$!X7C`;sM@ z(C9nmHesdqE>szz?>-*C#P+{aR|uj{WeqDeaInG)Wg0%pl<`9Gdl2{k;{C8gWnb8+ zgB^6kQK(W^glphWAdqeIve0)ahz+{c*SM`Pg8F!1znld%`8hZBN8SrydZxn{?)^nM zgQq-%!*PSbG|4bSNVg6}F}4p1X$QIK+o2QW$4KNL)te1S#NRWGePK>sM9KU>t@ila z`>0%z^=nCgfM(|2@1et&H=&+1Xo*(yJGD#aag*u}At_mf2nygJf8)QS7n0r!x*IKviO^{ZSgW*$8k26Q6LC{2RZ_4Ax1Fb) zvAMkm20?Zmf4IIm-*8=GjfuCv(@0gucP0q!BaYxSN&80RZYTbPdY3BRAX!FZBY|3V z>A%ue!5{K7tVv_)LkC3+L)+_j=*C5l;a3u+qgaB2`K5itx+&fAuDiEmgi8%1U7rCg z@Hpa%0!sFJHEEpIDhM;h|2%S$7+vB|b zq(Ers%$do^JCbjc5}52IvS+F+4XvfZp({ig!@f?++u|$cZ+Z6POfyH(cP*I)6%G>< zBCZT=u-14$Ij2JG7nhA8g@_^s4u&nIblEwols=Sqy}WaNiE2ETOu(rG)RIe`+-RIm^fa zrry3lEO^J-v%Vj69_URg?%MHzYhz5pU@8yEj;ikjCz$3CCga0hVpF%KtC20f0R)~~zfJJu73B+X*fOMtN^ zjfdwNBQcO$Z5>ZGI?uJhxyzNFYk;)pKIW0uLHGS#qlU&~MQ+}d;ryW#Q{@- zw3U+@7z4*D?%T0J_lwbR%9h4FXRJ zVp?3+xVFO0;Fd3m?`B?vx(RH>2u-#gab(pWizNaUFs&U`vB1$pw50cyd{;m%}ii!aeJofnz8MqfEe-1)NA&m4axjUu!x)i@d zT7s#BZ7lOKzq1hrye=j7aa)S)rtZoJC|SR|D)PW5Lgv8q`CXxmg^wFT>VHyq?OSW< zkANShq2Y1+fh2A2hvwb?0fIn%zrU~9x!i1+8$4|d)sFw~4T=KE9@tTryUcXn z%-B7>q$}@FU9dG7{Q?cZW*W6$qpICV&A5w?Y>2#hIlkz@#M)F7@vA8>wt~+;x@XH_ zDxL2)tR395!GMa6fE#Weq^>>SS9pARu(EY%l1klHIwWyCaHi zP=}Fs?e{<+OgmtGTlE_|^JAQ}3WptpEWmqq$0z{Wmq>o|2?<->f0@3Hi$MudZ3pb%15ct4 z^6!(y_~+3<@b6p}`DfQ`K5o)rF-E}qDHWyfShKqmcLJs@ag7~_G1Zq*3byZ!wj_$f0byK_hz697j?Rnyivg#kA z@E6oI{x!?}{X19(c!nVg<0MtWfIte|Nv*;FuxtNYkBR)d>&Z2EgBu9VqfljtUL-|V zrizb0wB2k8$s%yse*cO7{teu&Z(2IsSqF~YZ*_gL5ern;Zg9UQ{)@Zf+^mQL*YzEJ z>m?u-NJ;%kb%{T-D1Gyv?~h*;K&pfRpc?vH*4lp!KK;L;;_&Nt?Fk$7nq4T{j;_db zXeUC`z$+@AzjS->pf@3t=DXB;usUEBu+w|;o>Ow{j()8mxu-)nkM7isP-w8%!Q6r` zY?(M<-}e01s)g_ar>v{1U;a=9;WzHdL`a=5peHyMvreuY`1w)efSl%Eyls8wy_kS- zN5NHumK$iqHO*iL^mDhTyA3g!Zjg9^^z2C`8|gaZoGqHew7T}rNN}qv!KXGQP}i(; zuPRQbP1i!+#wX$0dTPK-!Utgwvq|miQYQ>B-Ov;Ks1tfwPy9c4T;yd{^N*{tzE-jA z9Wav^*$J>N5I2Abz%oEN{Un=Gbpw7x*t$u@HPjq7#V>?p5$xXo>iNmU`8ttPp+M~M z!YOh7>?sKzY79f&-VSPmB7s0WN@2imH*K4HEa+(Ki{LmKRH45U z1YtAbR=*IF+ZB6&-@0#S+}GW(eI5W>plxN7g6n zLW)SGFqrna6TCZ6ZvN#Rk&it{SNm^dY@t2KPhM2_QkQ`x=sEQ#n?gutz<`>cykKe$ zW)`e_lSoZ%M=FJ3Qo4XP6(3bG_{akr7f2&;UH!AGB0qe}R)n?#`O@<_+oPV4w1a!~ zr!Lww@>%AO*VFUNrcxLX&>yETAb#-M53DF;p~)Q5P=6jR$;HMVTF(`FI{lCe$Issq zLQ)MX{n0z<$th1EKMJftpH5MSf>a8_LQcj8n)jg(Nfu`wzwfq<$NcCSJHV$IOv1yc z!{2=%grpMmB>U-0B5xj`B6!+>8!1hj(o_n=@i9~*BUktj)O7phJ2vGsiy-ASTKNB~ zvyXoLM^4)Uz?U;9dStp;$V>3oFN*W*f)KGHi4E~~!dZ@kl1gE~Q0!6mSHFYNme;Jc zkoArc`1^n7fgSwuXHLbxR?Jy5{eONXJvSU7^C}8|`?5GsjKF=Q&qGZ&eQwPcukK6D z3uG>6>6N69#eTsRPuG}*f+K#;l{&g&$OI|qAN6f(x>3EAjx{ND!T>>d(}+w zhHXPVZ7qb*ZWxu9-`z6y^R(XX|NY}C4lk!84UWtwSA{}FB2d9F&k+hu^RDQpWo)fAQNN*UU+}By#rW!u z@nlRaH#2p@a7HiX*%4?rY5}0e7$G{1pkEYTA57A3ITrsKsz~3fafqLvLO~?i;cd$j z{KR>27Kd1MF!O4^ZnAd*6@x&n0tms->zMCL4w>l{4AKgH{je&EdX%hCxGETdGh(5* zP!{KJJthI#+I;Mx1fScqEx~2Xq)r&V|CA)o2k+Vn;@v4v-$dNxXK&h88m)B>2u5QU z^4WwkA9TkTeCsg@o>>&#j86iSHpzGy76QLst>_jUOaW%y09qpbE8_Yo!9B}i{sV_33To9Ke3_i zu`xbS&U-%3{OF?dvoM zc&HKo`N2~XsPJ@qC<64m`VT5n5C|bNi!Pvnx=7G?uJ5>^u7iQPQ~Zsp__{c!s`O2t z1%FOAM9Vo9iJW<9BfZbJb<_2+bqPLvU)-$`#|z7dxuiuH5P117&)Q;_VS!uaH`Ge_ z?fbJ^Gc8E9ZvA8>fZXjb#WNqm_2Zt zU~1XBPfFjYAb9r=%pCMw+AUASCYDO#EvP`K>uIFP_6KS?{o#fLAAMl0av1@s5C+Ur zey`puHFstt>tEctggZ0qS+cV#?2FY*tcd~{azhwjfb6do}u&W(L&N{M8E*ymM8Ye%fd2ro+Fh&+vB5jM~hUwdq(_Q?OJJPva>0QCbn$ zbbV&ixS5<+_mcfR6BUM)ycGk)6c!WESX2XlR4s(}-(~hqGnirhmoLQcP|Uo*WT^Mw z=|17@*+mKd+C|f}Z|EEEuDS#M=@oHq)3r49=*~I#ku&0a=kdP&8ScbDMZwvsW&a*g z%fVkR>Y?!n6~)7-B557AuH_rPD=1Cy4y>#o78}XdJ=YsY!m?tV%r{feM7TQV_S`jy7n1ZC`@l)D7RKHcfzjV8$j4Xr~KT z#2XfEKs2dIYOoA`O@qt7zcKw8N5g>A{g0n+-=qvT(EXY%`oq11m;`DciX&RO@!)F! zEqLE;ap+o_E+7j3?In@7EcgCzP>6Q7BFL_?{CYfAO58hAaEx|Ff&& zqMsAVJ`jb!siN@KK14yqpr)?HyqB?9!m!Ne#XDY7fpAAF5D)8iMzy+)orl%l&v9bH z0CxjMQDPh?gaGcMz0bj|VZ?2GHq=v*GuMW}npUn`26b4Gg()G7=9U_*ir_n659VHkM%h83W} zNqJ)4R5T_MK<<_G8bzUBOo~Lx9>IBiApZI#BU=8?TpMoz4@m}y!r#5Do5DVt;cZkT zxL-+s8tN#~m>zcVIklSniwja$aTr;hMlmPOyH1!R(70mofx8lDT(+z0t|wuDYY2Yl zw=P+$0AjE>!J27IdwNWT=_=hwJ(J>o_s+K*GY!>(e}7ZtE87fAXNAap)Q2bpn>F!g zT@;$B`r=;Q5$D{zcp7^c_4eAqCSDKcTP;5wRI(7cZnSMr$g7!r8(QZ zGfg01`k_0jd@2rC_Ds$*=>XdK{x8qi0X}I4X|%s`Tm0X=r!EFw&s2jo;%{H>FQ%|v z6Yus6yN|k&&q@8loH!*{#^`$yd2L^U52-+Wrl}{>VT?h2P^;*#^NcG0vrE=8C}k)| zU{`}IpVeUW7q-NCaZiE=wPf;nr-5T?prRH5*K`!3{K>I5$}HkV+6g{OOB*2AVyo+}M>OMWHiASAxeDOj`fg&(W?Y{;%H^=Z_z1 z>`&uA&cD49Y-y}u3BA$N=7S!DeGRm{uq*OOeSv?vWilUT@BzTL8!H=F5Ia^HZ z9QbG|R`I2d-9^9DQ zg-f;$saMeN=(Szb5}TrM1nQab)vYwKdw$0=afk!w)?RQ&&B77%G@U#MW~whu{y1!3 zyFLXKl}Ca07vFbEf^S+C=VEzyu~#d=+tMAxwg$=$JaOUf3Hsdixwch+td*p`kT<4s z&o}<_yW;;pYCRy=UC2biz4Q;Bkl;;Ay*2J-*1YfsoeZ4q_xsg0I_qS>$zZ^a9^P^sW z(UEd(PU) z$ZCKvJeWaYXhmHmW@6IEA6k(}v)cmJ!Pl*d56b{)f{VG~{?>g@YU>qo^{u0^g0cHH zH5THZDvOV9l)ZdEign(1SAq}Tv2HCgdfszVt%dXb-Dhwiy`(OrI$cNup>esYibGK* z0fnJ00Sf3;D1uKv6zAoATToY<&<&0t@@c(2o|qHoTh`3Pw4p2mpbx9R>q-5-3WB8iv=eNWGt= zjg6|*?j5MLuNIoF8}-$qsjklVJ!viy2B9!?M0cgZb&W^dsz?AA25Khm*Cf!7ol)#q zQ7>|?B!OB30p`D6o;#exHuM6h0l*skz3MUwydZtqKI&2m)N%+kNFB^uOQ`GLhzzOU zUl;#Z?ufHF1BnIW=2X#$LU6LrtTwg4>(_TF3d3@4UKjU5Z|6}(p|0_qN8ENA8?qa& zycvV6F zWEFwnWI^1^^ClphQ$aBO+tu%m%bVCjci>4?cM`eXx+xq>{Q`=CCwh+VpPrMK<_q#h z{Z!YC`TKeee)gsWpWI+-Yf|7Q`A4sl;OWKwT}ZEPGYcsRR*F(TKYz3^=q9iJ(w5}9 zr30(=P(M=^*X^zKcjCg}YY-C)qO0p-75+s%3i>JJx+4h)JJqr-PO%rOX6ha$Hx+C@ zpOP+~1(mm2-W4y0bu=uPawJ<1KKjh->pdJBq_4*vSEd1euUZEF0~N1oeS)cPL!uY_ z6PK68Q=$0gqrUg6JEkcg3goyb4FOJ`#uVf|10=B{3+cf@cJH?|p;ohhdFjYCFSxcV z_3hfxy_PVidP&_&CraWRF&koFVW_Kb8m zS+))K+I-8yeDsao&_%zp=SyzCZZcPp=bqP_AP5>e|2}#v_783}xIpT45q0y=OU-=R zMC{eF$l(UoU`tH}qM&apbFSo&ckPU@V`19RYZ2V7NL^zHFe#^M$5!!eFRWY-%Z<3ZPAZN#jXHBR0M%l zup$vKe=GhtwJ>T$6^q539H^C1P;0|Qft4du7Z?j}>qDuQ!c+=j&gs8`TLY)gfA_d4 zW(@wn>t-+zcdVfNFa_CO`y7%e__k~@SMo>2aIr*VPU9C3`a9X6$<~- zf-#{pw{YB>;x43kVQZz~%u^T~-*sH%+t);X;id#1x;Nag^l9Wf^xX8>?&1*LP}X$w zMQb5pbS>(*AJX_4ygP|*1|bl-!Ibp_sWQDU1gV^N4;mRnSpnHzgADx63dc*P3N#Vm zlKPA1#rdbtO7Pt$#Gi(4!b$M9WeI-jk_?J}msv<70f{vozLc1?&IM%~ zVK85=((RkndO3h^cCT*QgCocaVd`sWDbj(1DGN47z^pwzg2{8IO5*(FMRES|>%~JM zq0BI6%0?9W&OnOTtc$ZNqu80k4@bz&15pswpKa?o?)-&czRg>Sny zr??z_0qWcQ;Ds(NY5tz*TT!bqmzU~tK?*0zM+eF=`3Z58G*&VX3QpC@IU5Wc;iles zYF={x)9Xe4!r;l}L6AJh^H{_f*;RPG=k6YkC)HUT+i6lc@m8sIi{J z+(*6e4Xb7rZt!sxh@Zb9&PGk99yqW6hFVRJ4PlWzP(SxDSuvzD$et{>DMHhAqz<>Y zj2K?j5M78c9HZ|Oe!n91+k2yFQ?0=zSAB`dstPVHN_8&RHo%ut@u=S2&wlU^)4?8F zjOSDj3hHb&)B;fVAbws&-BJ%!K+!n5?N5imA~>xgA;15?%zu!FQ`&zCv6jF0galu+ zGWhF57lQ`}v=&B%Zc?RP^E+J&a`iE^wV^PGX;l%No$r4zhVJSi3b|1`sZrqd%9a!^ zFG*!FAFC-bsGm5GLF@Y&Zhe6XZ|w zJh3>uC@AO;^BN78(LHzgyQv)IIJtKZ@3ZwxR z*-u>%`Q|kl3bbv%R}nHI&?63=8`^zM-AH3`bUJ@%$&gUX);A02k6$Rs5^F z$@YZm1zr4uCzs6M{>V}V_sNwVGl4BLmIK7#sij0j!PDUJ3+hrkr+(O@M%CZefa~v_ zTa@q7$FHYl60O!hc-IulIr?yBPA1UK{2xAPhdT|+?R}}-J$Te|CCPw3Mwi=nwGFj?PRb2X2+A@0~&w$o%QUDgMG6G*8lz! z;>;!BA5d$n{@hkJUC{8&po4RC)sPT^LdUet5kEI4{>k#An^pZ=t6zRNhUa<~g#nAv z>9Tlw;*q;O(4(RYLj9HP$vqsnuQ9~qM7cv2lv)n=4#dB+Kl=E`FrcFO;*dL7&zI_} zJ941A_~k+Vy^6xtg?aH;3bNAA3=EAs1Rqy%_?RBA?xj;8(3SQ_&Wilt>A~w1T6sk` zMBCNuSfr+tXwmk6!dtj4Bex(r{;AI%?io|@i?$GH7#I7@iquQFN1tuoi25&YkHP&v zYr=prnHT5PbyOJq_1Vnpmc{RuNu@q@@A_Ukhx1^edUkd29!NmrEmak0 zw?1Ubq;3{G6{-ERb25i+z5V>#iZ8+Ex6KS{=d0U?ea0rvTh&VVD;LGNP?p3{_o=6@ z%2aPQnn4=()61s!kMtspND+T+SLDHgOswh=@r7qs#C6+jQZ}kmd2MG5F1%S02K8V2 z$4e5No->Q+;3;}43fK0;M{8?I0s6XvCzix3=Q=NpDqw-$>~MRf%KTr|+xxM>tp!*_ z^_zRiy7KT)s(Z1jF{gpD`!PxG57s46E5f;XpdvBm)dd@$r{=`@u?rGBy^!o?0E3^N z+cbl>GT}a3)H~yitAoX^^jVP?wyaQ$8+EJtPcFCL?5PL9*Z2-ChG7X~2|nBvx_AzK zLho0kc6~QpT}<_L`S8;hySzRK+I`G~-IshC9&EJ|OaNWY`o8}b^>Jg+e4x9hkvt&y zgHBmjqpLzO(78eqzzaJfU()0Ay1=}&JDU065eO{5Qy0N^95eBRkz8Lr=QTYt(ZN@P zxALZAy;%vJfSc(>y><`AoPBj_PU;$CXuFBKx+6P!-!ICjnPy=?ZNho$J8o;1^^5LM zG4lXE?bPjL;2JKdjheW-o*j=F z{ae!yU&VegXQpg;o?1>u6aeC1k1v|J zE@QJCik;80U$ghdSg!k2Sqzv9tq-xUyQ!gK2@%L-(*-oRn~~E0d9@raFPQ;Ez5Kla zCO}~~I}U-sLwk8a>KX{_Srh^rOYqfFb0=x3sn~iK=fzpEyYi9#9lniwnmvdv$`hXt zqW6F8&OtU@NN47(FeD8w#uwK$_&(y&vZCH+8W(B%EUGKg`|?BMk{pZ0Fg2CWx(oGR zzpTFDghWAo+1{%=QoEO-elUA#IlR23t`@JS*4@rpNperCPx`S%Q)xM}Srn#_a6y88 zL;gZ**5KtM>?|ulNI%FaZFkike03Ye`dT2ClbuSY6cfU zT|6@C>i4BC6$<(cAiHpEYf9H%&DN)28AY2UXl9EUCF1(eGv{&&uwo? zfZ+5Q+godDTgvFh$iK3ajkrQYVT4yhH%{{Sk_a{{qhbN8O^36s#>%eVgQE{Thh$n9 za=PeTn%A9ZDH#)gw{Cpdfx1>Q-Ki8c7HT=<;m=>|-GXv-@y5S_*&1wCq^5pvXHR|K z^#OM(#hiGd&$lOm)kUbLe*N55ExoP_)P&sLm)yguco!Co_;z`mvk6>yh_BRBSpU)u zf5bsRxT>&mLLuBJQ1R(_zI9C+!N{u4WL6mF3*tS#AZ{svG*q~aAP8G2%k>`yJR?_k z%p&VOw$NW@mImFN<7Fx6A-)EF*R4wdH)qf1M@0sf0{o^uiGo@>m6tcAaFCIXo$Bh! zVfTo3?HBd@mUGh~4tn2sukA=(gYTK^g@pQpQP1&sT3t$?x|e(boUUW_a=x>-s$!dG zj?IISxrGq+yY7NbuON5Gof(>bLw6?RuuojqWHONTj4cz zAJz4q8SCyeDG(e!E2Bj>I-+jG#8X)3bKPS~wJ}d<%+yVcvvy%#>L<&?neQ4v^l)MI z0mzgObx;s@c>bZ}&d%GytpV#goCS3?p_op8ULEOsx{Gn@x^sqDV{kb}MXnTkPwj-u zN-Z^iJtdXog97)Go)1S|49*$!u+pIZqyxwO;@i%=fxd=JiUL5tBe;{?5ubU?A=eFM zqOPmOLU$viGUh7m%m{<}s{?h31j~iN{$}`1s~S+#9WQc{Q`tXglt2KH;j^xRb;M=# zMjY7aF1wOH|LF43R~o8{GDHD+`%^PWUWLw4%O{W41rUfejXxCJ^t;ATC!#S0#Mm+& zTSImEhWh`HkJt%@Zosgj?;c1Z=nWF+&vd#iNYybHQDs6H=G0&P)RK5=#troM>Y`ZJ zfFV>qH*12>3gQGWZA-9LmKsX$^JCuGsu0w#Xkc@*Ha&vSN?qe5*LTFd& zN}n~2>C`n=f)S`waXrug@Aw#^BMS*$O^q#hy2f=p|0;L~dQXig8Mi&D7lzf6)E=AH z1#AFOFmq|c)W_P43qmv4+1}fi!p4CF=NH6VD<;!6T#!??-GuPNk9=*3v zX|6)-9aDjr%a2DObm!@*)rO>tLRMxf3a!Y%3bj`t8^O;3wDzC52T>y64UN{4N?zWRjzKTU>ZdM ztm>V1Hq6XIt7jAgzP2Nx?#sSr2uJ68T^DXx$>-*Wuj0qtZ(U5_x`QYbW-Z~O>W?O$&yx1=gsM<>y%+mcVi z{N-r`H$SpgbcfWpM|GSN>+>3&4EB^-nF|Sw0x8A#tTIO&jH>a=Xp9gXNGBYwW^Wo?FTbzG3Y|&uN1m3IB43Y z7Z;PsC<+6Boj!()bOR3s(k?XsYMPO?n&2oD)KB@n7G>#up;I&e+;~BM>BOU?tZu%w9;O*0Q%xqs z#BZ3>W%J@YE;g8Ts=mFPiUI@70|4vbQV(;VaB^X8zkbD95h!@uXvzo2?iX#!=X;!g zp+9TtErw>W@Su1M2hL?uPc(jxTFSXMtcpKKLp~LT9Qq+W$k2$+X$NV^a`f7Z`7jfU z0Z%mej8S~LtLgeTT-~wlorR1IxSO6`vF@j4c5A&~2lND*)r*$&HV<(EG`btmHRU|M zDDJEWqtgOL-S!esRSUgdonT|bi3-EE~s=SO27e|MbQHse8z%(FG+o zQc4X8uhX?^bGUkK$54Yh8)%Hjxw31{f6&J@FbC#(zivqa^dA#4QBKc^hmOWaU9*kq zWUtlaOclLJ&&+o(1xLSr-pRv*irg1B`}eUTSl66#S*`as?y)oj0qAj}?x5VYJ(D)v z_hX?JT<-Fs)M$E7j-o66iBb>Qm+HCQns7X1V#0uS0>v&qQ}wU;x=Uiuql7@-{bwJD zeEFg6&(lkh4yrusO-oR}Dcl-o*cFl}w>6Ngfo@!tzQsWorTlV{#cz}1WZ9+?AN76e zMhf;P+!cBv0jUM`cb@Cg`T_&VZ|<2?ExM5s1S`pg?XD>=i^+~K#aPi>v~$4wxG>1m ze`PzK!>w+q9sObtp=^upQWu0IN?47K28aF;7I!;bbq@w#SeIZHn(3tp6@=g{u2&Cd zeZ6LKJtn&Lja?YvLV9Z1_(?lj14z@_;v9vMf&~VPzv;!&6bW#{3uF8hEqhYG&w=E{ zyeV=U!#u6o0+;2rT@?pcyc6aA77&g5XSeUeV09rA0b7+$UM95B?&rc39g6!Xxw0cJ(z(yf^|#3D&egxWFOC<` zRXYyU62}C;Trbbg!>V{`n1epn8{?ctNZ|J9x`SX#3K*L(JiaWobMw7fD04X$bfiEWUf!1c!%BbRaH=d0MSJw9rQmD8zt_dSzLk=eKO=u^u{b=jB;Kh~?{0;Y zW%@tU$N*c+T*>9)GY($bmfXWWS}3SH*PZ9~YozEo#@g5OD1lv1ytE8e8mTap^5VU2 zssDu@tr^tRr8_BQ)CW+8vdbd3aiH-6=jyHm2VU<&tZrS3_6T`w!NlZxUg-C0=}FWW znJ}ytrS`@ZGwJHcD!lqU1D4R%5khdccL~_gXF%n3XgxR21Bsd%ahupD0rp zM#cGg@s5>jz`5rN^%SMtBx+1z5!VR3b8%kk>Q@^oBL!vrs<`e2J;D2RGsHaleAgyC ze%L-YuV0@H8Culf>rzPOnDraw18YNpRAa6J*&wirEIfG0}g-rkpB zpZ%`J!o342td*p8tcT|>??`bWClz&JP`ncaSx6Ta`rmY`r(|DJ(vf&zVL--7F(;l% zqN~ATAB9oNdO{X$3+==NM}K~9ad3%gEMSdWzxjd%NWsLwdKC!_H3`tg^}shn?461~ zy~FH>04~0M<}$cXsyp%39Xt1djGh~Nl2eO4=*5kp8@Sx=zL10{X*2JmPy66iC`!g%HEeGZn1auCLl--)RJ2ml^3P(Sem?S175p;bF zG^XkwRj1Vj_f%PGH&Rf1XqH5jYopcjT;2?*_Vqz_!k!+@e_(V2xoti-l_1uUQ(?rp zIo9-A5#Zad*}1aYDjH~uJS&SGCQ9W7xaw%Jj)6fM@I+HTf4xdeY*gS@R1prAda$(B z?Ez0JvjB$#ZuBRY#ak>4=PfxsCk|Y%-h{K0oZWhGTb1sVJLQY~2!XpPcmR>8ii1&t z(`-?^eN6(iN|zx~U%2<$t~fQH0x=3yyo0ytwK{6J55~EEeqDT4K@Sc@;c>MTPL`4p z*xLtE)6G+UVyUZvJj|<`s1&3mcQ&Iq>Q{8mA!IaXTu*^o62Vqog7wN2x}BV4UJp{3 zb$3;NVN+do9NC&U*m0^=>#rRVR@P0Sr)xlcFQEW5TD7bDxiME+Y;4J!()_2q6$Ny3 zNbDXyQB6H26odYRUl4ca@LXrYDGXG(Ekadk@+)?T82_WuR{IX z`8Tdg@CsZ@74BG*2G;BGa`*2+jIES6F|>iu`yJzXMYX$|gbfJy!A*ga)R zApFq;*_|hsOvYQ~+75H-lVZOvd37n(b4Rp$R&nk-AsnvL$9kU3(EvMbSQl^C&5~M* zm@SbBkcJ9TQx|AZ%8f5rznB*n8z;e3x2kEIA$v7-SL?b_8DVV@g<%3fBu>wn3M78Hi` z;H(wRVKSSLhpsUR(V*bW)JQ~JSQJMCdcIl?L6vEgL!qvRBd6#gGfDd7=AP-bl*oz+ zae&ZVOTmP2bc4n`di|T6H1#g(5eL~stGbS?HZ{msE5d(R5of1vlK>99qZ45$3@N1G z8Vdq9r%8RiqYvRmZMFpBxCZvr_w9Z4p#-!X24|;wv?bv7Ie-Zuv*_x!&7MgD-0%3A z2ux23SP4(Bn0{|lwHYa@WpQfGSQUm^ApUO6SQZY>Hx>xR1 zOu!oE;e_*>$Ah{+a&KJ|AL4Mpo>c>(JHt9=b?ff80T!y_bbf+$l ztH^wAeKIXmG^p%rFx@$-AaEKe=)DlFE66HS_i&(V3If^zEDN;%$#W}~4NydPVcy0f zHYys6I54{_XWYB#oHO3&n+7M{x2ze<0c}Vq4t=6K!90SLr7q!Rv@1a{c#s7dE+xGm z&7!XU_^zFgk7NRZ0N2qO4dz~2nB99zMZiIvLJzDlxC{%l7%~Rd<+YMIU;+jk2d2u} znBn6npes$FtB&5dxo6eHzqTjd?LEn{2Vd{tTvdFj=ymJZ&N=5wRV|8~H{cL@xFS@z zO}&opywPtBL%Mpt8PS#l@wA)!awp@)LPy`n7sV|(;$PoqhueP8O+&d`W|D4|{XyD9H-q&Y{%RZu z+AgTXEEH@}8=6o?MR3S!(`yH@GJ(+jFc?}Nv)W^3!s}OTgG}-$`9QoyHdo9(SU69V z%z=k4P!m76w=Zsz58Uw~bJr8VIkzCrLQ#SjH|I!BPJ%LvJo;^$ zTc0{Y*O92}h#QM8sBQ*1o}%fZWOvsNvYIql9o*M|_1=&HYb+e6%jvjN)K%fUc}?Wi zEs^yJX0c?2{aW{eLA|!_uogqw!Hv758w!0cOzn`6uF#b<#XumUfVGyv1uJ6rWtw%ppgYFiClU!fKRH8xE;JmtA*X$XfDD(h@VFp0J z8Z&^AHKLXSGMc;x6>%$GZ$3o$r=MDpRB};W0_b7$;a3v;7qXc=xS2FKi8_Ht+WTs-+4OTlWoj-1cZgaJ!40*FJX#Nr@U_QHW>Uxe8`KZ% zr6eYh(>TDXlD+pZOP)i-#!j6U!;GT4F-Lv%d88KVI_jeh2ZEGU4_%l|pMC7Q+(L%- zT5y}eDtdL>^orqP(!_3EO5IY8UE6xQ?+WOoQR@^VGMzc*!%P$k12K8aunzPnHr)}K zG`~@q^QL2VZZ3N7Ov7-bBslQ9H_B6saN;>$Xl?!MYBsFXX~+1GGG}=QNPMnHP}{{` zSC6`VTiX{q?V!smg5xr$PU&3HmT{OPCr$xbySjaLxK)`3P|dnllHlr&Z6hKxPUVQv zooP5h7ZxPQIgAIS0kc0$?Nj5`CD^+oQbn81Z7T$O>J0TOk~D`>;;J~5k7)#JUfj~M z5fNu@O}8@|eRX)xW(fo!pI$aIbOQ}eqmXK51)>&6#gX(5K~g~o)Q#lOSV#w{aU})V z^;fqf*uJTe&t&p|D^Mr>yp_9?sk;wKV1^7%6ADD9&3| z+wZA+>DArYOl{pes?U@o2Qt8T&!m{o*-CyPslW=ugf2%=+mm4DmdMt13HDVCyyPu` z#0Y$2xfttZ_qP3%aZ8m{AWo=rTSY>x3TN)PbxDy_0iWqv)$|p0FTK2FN2<<}KB%=+ z==PjXS}d1_ZNNv8BM6+aTMR}F9$t}P>#E+Z4<*y!X{sNnm2+KJn(GaB6hva~q&Umx ztWarru?bh?vHu#sJg2y$Z)hQO<;5a`0Wc|~ORj!Zqf zch#!U^#8XLP%INu2z=kjZmWgVU>JGiy7zv8TrB3}i3We93o8Sw$_G zOb8Y0KrIIDo>Iin|(WW+aU3GS>%PhF_1r7f#t4OFNv8p0b zS`{)m3XV7z7mP>*uWm}PQJrr0Qq@<-XXm85iKXMQ?REM{P8b4D-9-B$`}gf`SuKQA z#|$O`(rgblG`PNDt%;(F#IYw-D9)Pr1f8stq3nwD>@kst6$!5F*dgjNg?P5hYFo=- zQq|(NYAgU{}XFSr+|>FH*#K0;d~jDNxHu1t_L5R z1eyMHe=uQyH4xSf1jyhy*tEf8UGOqk6)`!Gg>~n165RWeI18sW0(V}Vr3-ptxrLep zt0i&XQdIZSzWCR7#hJF^INuRnRoV-K#vdl)O2S~DqC2B*B)_gAaG)NQ2X?cFEX?S@ z`Z@rCw5-6$m@F;nO1~h^{PD&n^oUVBj<^1@FK&lgLs$W-R8TD=1aJpI!6HQ)@Q){5 zfU?8gv~3!VY{<$7R{+xxSn2-nl8j`1>my}CethF?Z+jUo0T@$ z5CV0p2U|Cc5SX^J3NeOoE z*v!T1u4Dnnbpr}Q+JS#jcNsnc_y8(jUNP0#sGo39rA?t283@+CUKg*^bK+y3#r6~i zsMRxE30+BJTMy7d^|8h2vlN2LrY+LN^P1tL8wx|#2-}00qCk9{D_PeQL}Kx@^&b`( z%}biqqPThlcMl}Ex@|IiGPkIC9opo@L@#zMlb^S z^YvqsD{NB9rsTrob?J>9;AWO^=ZN!%_Tz9vA)t*uPvx-JlS@Og7v}Yrd}>+b?7XR- z4({%!JCN!~`{pcq>%$Q~mIiuiaRsL*)~c_6f`fUt0?`8tRl>zzPADc;SfbChVub^pUxRwxc7XNjwg@Hb)`lsXvFUQbZi|}%LZNXA zXa1y$hFTSKtG4|(;u&;DJ;FlXwD)$-Yk>OYZ8Iu0l>ut~o3PV)#6+x*$yzAuZ@#=_ z-c7Z=VA}id-V^WM7bnxR*(%)<7!m9miTKIGQtmU{+#QM7??_ z7J)xSW~Dw1D7HZb`ymkQ9AXzL8s#ae3Je;*perdpcNuMPmmyObmfo#wrYlmO%mi zJf_HxZFbZ8di2Q2oLxlK7a7!4Bx)6FRZMH38*a90{jhi^UXGu$76xJ&=nDn+6pHi; zb5oxsg*1p0Wz!%o*r?bl>b(i~V9Iqm-9hJ88A)({L4tF0=@A7yo3e9Pt%H|s;Td^^ zv8>L<6;oOe7vWcF zQfqp~w1U*y(rW0IS~P`w5Rr`IoYl*JMvn)GLF|lQAeM?oo7?@)ktp%0dGViI6nE09 z5FBi&b?|};!mBfrRWvNg34^I4aKa#R$@<^fM*2~3o>VMzdT2mGJu$kAsq9;K6R{jT zG--k{yUHyXp|Eibja`)1)Gc+w2Ea3PpW!c6>%lp$7Q~ib`dfPGRVdt1+mLg4@fSPz z_??6cpYco7Qt+N$nqc~_Za(}ywNmdtufgP-l6D*?OeRL`6@xX+TV!WC*5w+muaDg8 zf&E`#QtlJ#(-kbJ9_@y;+%1zzsso>Avb4Tf<^WvEyW9=1CNBKP&!t|vEc^ms|UXIDGBi`1=!;P}wLE3Zq% z6N?g@nn0l0j0M=fCEoh;>Z7|a=>Z#PSOT^l%WR-?6ZWPUS8mPLXQ99s;@Pyupu4IQ zT>l9C7@2qAPA6f#1deLO?wTnQy;D?cqO3x(d`>NjGhr=CHZ0n0z0~(K409h=#1OHF z<)V0RTs1-Pj>526mHL-9BtOiZrEaR=i6xVgI#&0Q*#U1}lVJVD^rV{_i@*(C>ctGY z)g1~$ricpbJT(bxRr5aS5t!~~-u4+gB~Pu1EVTZBcNijpfk7LU-kbK}n>6_AJ-(o? z^5~+n;ENmLt3dSa2Ecmv*rNDn%I5cs4J0r4cfY77=hkF~-L%121VxO}%(`2h!jNqc zXo5+I!%WnxhZZ5NiX*{}Zs~m3f%b$AY^S`g0@qgK5I$lNx`;a{oNF~8F++JVFTweF z367O|_w(z|s(t2x6nZsC)uSA&=tfv$38p28j0t41`46vX#Qu4i_hky@OJX9CgQy#vWL&$=$Cg@782 zlV#ggR>p+MFuMO0n_)EJlx|oAZfU{JNuKKLOA5nG5`-6~Eb#2@-hap$8!;Ua_d+Dqd zitM-W7!Mi?^B=w{!KMb3E1Q#Vcddfpmga1uI}_YW-w(m!p2+{PWnjHm{v$ku?i zyLe88V$If6rr>Gb#wal42AjuH*e?jl3P%mO}i^Bm%Gb$7iOtXIeu5+VAfolQxz9J=cmDdI@J# zR$5d=`|ZFN!tPmKm{tkD1q08xwq|Jyf!}n?ZU|JrjDRKn`a=NE@l?-Kw!Yt?3Vrp- zHh*EnJjp#U$)pYTz%-8WvGio}qWxys!t+OPT#V1c;^&FyKT5yN^{fANak$?8jgXzk6I`Q46V_l94{F3P|2G=jh?6at<*`LMFQQS3TRDX#po`G>^Ag_FIp7watE zTaqX$6(-zkguNYPrACagb6yGW6Ps|+B-wN`;SJkyEyYKpDs|w`dsBAQqD8N+X7a+& z(DvD-Wjm5A!Na8LR8rrq;{{!y`9r0|(;Sp#xOhk~U1K(BK!w+*I_EODg$+T0PPPqy zs5j2oXH}5pc}!yZV)AO}A$aQ*VE7T~f2K6Di z_|OC8p`GA@Vf?oCq9KL3CAeQ4UDKfY~mvA-_zrTXG{diG&vgl3e%Yzgso$GFD^&H zl?<(bi~YdGX{Y{`Lsq`?(7PJa@#Z@8EG@(AlZ#)+EWp&cb!72XOk57{TC>Qp?(87T zF(>Pa#kk41_Ht86jGlKrI>bCegb%mON!@GAvQ4G9q<$)iLQ7D2`VxN1{UT=2V+Q8cr8a4#&}WZ?5@H?fZ3aiQd_!v34O-rd_ll_A*?jhv$OK^7(= zFy{XOuWN(b<$w2pWu1O&ulJxdSmbw-WY5Ck&#P0Q7eWY%4FbFS4s)NQjTMZ4a3qOu zzMn>r=o+7$lN}&O7G6g_y__>FgBKt%`6BLr6T1NP@z3nuu}tB0Uuwt4~&#`t1+&p|d}j z+mKWDEsJf(G|3BRf}#Xy*x&k02$WxoHALbOeW*8b@DH6|oDJYqFP`X^m-q_d7@LXr zla&MZH+Z!e&WvEi=&Sbok_M0>+*= zVf0$>#O+KuDOkOT#*9vObMdW`O}|x4M2PpILaAFsuI;lF;e)eJ^22C)Om(TE^fHAVb!j}> zRo0HxgL*?v0B=l~iJF4l+>7=&ZN*M>$gT?S^}9R&dUlvBz<5gT>Rh4d>**0=+{>G=yxw`I7NEn3(bCCgVRmKlXa6GAv%pkB-}2Rr1#E z=C+<%#ZZ=v8MHs$rv(O6E0Z>*F;f-=X%yV=1FQ~~EtuYY`Fle`w?WY^T`H15)X{GT(RIPEX<)6cclGBbV5)+woUY!@p_$*x$d+sJ7 zwJ1A)Hye%s4m-GNU&+4ai@CDAe*#z8Shvou-3^YNR~>^0q= z!Y1rTvXL+b%|n+nD?(+UN-J`sbeYg1HOWJIL!;4!rXb|+7LUC0<~&DLqVql3Pr{1l zV?~r<_O&4o!xOE#CPIEEN5*4A8G`7Zu=83BAleEaEMuXekvIY)LHpMRG&u?+&j|6; zm6^Uzq_<-$Z@#g9VO7SMH4MN?;?{9RKc#&?ew#3MEZo9 zdGRxNPk8`k|F{Skm|Mz?Ec7r*D&9O-yeAnYFt#iA+T*=Hq5QOqZ7ZsDO9;83=t`6W zsrxUTICGee{LlfhQ_ipBbu>#h!cBaSQmsgi(+h1t2sf?EP6E z8L1%_H>?tU{(?JB0G<`_&zvJ~`1@K|IqTOqh#$>Now^aMiod?6m?D}6_!s0GQ!Jo~ zAA;nTyWK9fi1Q#Iih`Af{>YJV*v6dzZ7?%ikkbz->p*kzXUb#$-JBW#LG>AHOwCB~pZ&;+!W3A;HYS zD6+2tF!2uZ4~F<=ll;x|CzJEb**tBZ zwwjuqp|OF6_APaQ0Mwth)!y6NgOCmYJiYvVjWus@Ti&+fCS3v35`sTDK*}EO=dEgJ zcV`{7h@^pg5MP+aA>kI%ieIT7X5bg}h zpuvDx+{@9`3$&jb#44Vi_Z>le7sLV}k2i?V<;ywz7dg)V1>4&@{43Mm-uYkrmn~pQ zFyou9e%>DT5B@y-KY8)=2mt-{=ePo1sa$-ujKMo2=(jQV`?}|t3dEaU4*CWlz5rsZ zD`?$cn2^FHK+6ooAU`1o+)oYkCBO_~aYy@`x*+BNv4)q2{&{(y(;e=)YG{L)4#dH( z{@SJ>W(DyRCqH$Qzj@yI-Z%a`FT(13zG|v}(|hcFLG)K%(*f>g=k#;=yDm=Jf6Ir^ zgt(YmfOHA~fba&on(Kp@2E?L%?k4B@fI2{wLR{3&>3?{91B}o0=LPA;PF|WfKn&Uf z3B2d4ac=uLf1IZui2m3PdFSG)eV!Kd1Ej*=#q_+Ef&PJX!tMX)5849hbMjLC+b57f zCqK(`-9UcAYDcG=>L3PfhpakznVs8vE(h!Ff8#taFf9>yOQvP4MZjHyVIF;0rhdPJqbYlz&oK{CVRAUQK`yU<>d9dHnuOcjM1nCm;}{pZ-hz zE3F7{@6X%7KPlXSWiSU%Ko{@;p94Vb1g7~XH*;VSq`3b3{7>%opiDTZuLpRZzyH6c z|3m!`rz&Xgt-sR-{F5U$?LX;B)JblVXpv};2okXqsSqg=-2$)I!Bdh*j!6C=JO0B@ zyiD9rJWo7KJWD)o=la<9fAWzYFbi7rmk*sl|Na+W5M2Rf$`IWkQU;}il8Km!*Z~nD zX)qsEA{dyn3`kY`+ro3N{8J+T)uw+f0RB@NfAf)xlM|A&kY6Vk_@7hK2+_#=WA7hd z|5s1`rK`ig{{BaU|8xHTdE*K=f_m!yTN;0B0C@uW1VKaEAfF+PkQ#s+(gLZ4e1kNd z=B%}wY}h?SGgs{C8Yr1yni|80f65|fBFpq=5PO@Ma}?#a?9D-S;K#5IxPTD zE(=!wy8qAw}8Au0EKo*b>lmHb#4bTX*0o}k?pbr=ZCc)@g z0yY2)Z~&YT5D<_OP!li^un|BB_y~jvBnjjQR0z}wZV?z0+$Ok7;7s5}5I_({5J~Wi z;3Yvi!Fz%Nf^vd7f;NKB1pNf#1akyy1iJ*sgb+e1LPkPP!YhPggmQ$cgt~;Lgm(y? z34I7d2%`uS2-65Z5Ec_w6Sfh4B^)N4CEOs~hX4>t2s7joL4agnIACM!-v&rkpd&!r`Pblaq_$ibrOex$b9#N!G zlu~q2Oi}!%q@=t|DNkuc=}P&KGL7;hWe?>XraBr2kC6dV%!9l?&<@94|y&$hy#R zVSxd{z{8-%0B49~$Y$tbSYjk$g;!pWk_;>7ZlrIclW<&gCv>vdKq);QKO)?wCTHf}a`Hg~o}wi>pd z>_qHB>_+TC?3wIc?3))EFDhPyUyQq0adCo!kVA;Wm?M-Ui{l%|J|`EaCZ{*&Yt9bN zO)h4x>s)SJueh4I)}Rbf6{sup6|@Dq&dtQF%I(3O#@)${xx{fv>r%j__m_TLI=Re$ z+3fP;%Vn2;@=)-|@!aEi#naA%;f3<*@rLmh@lNoO^U3kK@TKyh`3|q}U$M9nd!^>e zDnBc~Hh&0z5&x6`wE#@ON8p3NkRXYmoS?hlTfsgdLLnI;7oiNHUSUGvYr?L=Z-x7> z5?__S>UH(Q)lm^D5mk{uks^^fQD)IwqK`#uM1P6#idl&zilN2u;xghM;@RSp5*H+N zBpyrDOYBMtNx~&FB!{G^r8J}vQngY$(!$bC(wWj@G7K_$GO;r4GN;#MulZgpy|yOH zD|=V=jqIo#qnx2!yj+hwvHT5rgnXm?k-{|ve}xK#ZAB49cf~@*RV98UC#7tq1?9`i z_R8;-XH~dW?y9^~nT1_~*~31-=CAWycf6i^eMMDJ)lIcn_16vY8@@NHZXBv9sD-Pw z-h|xLycu`%hx!F|Gxc=!X^qPo&KgA;7)=??P|a2?Vl7>*M6FS6PHnh$fi^}*RwrDi zQc(cAxGN-?g|~co%1HVE@5> z-$C2qjROX*22X`=I9_*r<+$dg?DW!U<(~4rm-kkkm7SBE*IZyODK49?YOd+7J8oKT zD7Qm*1NS`lGY<=oGEXwkyPkDk7rflPI`4Dc55C{;E$kiRJ?o?3lk9`>)%DHwBk;T9 zSL@FR4&=WD2n0k2%mu0hW&~n`%!57!(+7J6e|sSG;OT>v5RH(WP@+(HXnWYDut#BY z;i}>9BM2fKBH9r=h$zI;L(PZzk0>6wKl=Vy{PD}jdyy8A^--Kr52F^MHKU7SXkvV0 zMq?FYQBR1TxIX#uRO;#Lr}#L>xG&GdpQSv*#lz#jJePQ$_WUg2UcwLLHDu-sk{4bt zMiOC(`7h~ThP+%z(o3p-#r-Po)n2k)^5+!k6jUljYC!62+O4$O*SxP^yvC)wqz`A@ z$S8Zm@#g89!?%ua2Qsf`mZCUO&rrwjT;Gko*L+|7;mU`UERw9itmSO;Y;=xXPC+hv z?z7y}Jg>ajeB=Di0@;FsLXJXY5n)k4(OR)habL;JlG;*{()VS|WzRkW9|JzFm)|WP zsnD%x|0MURw34s#O%+2`Ts1-UgKA8TOU-QU?b`l2ox1jV#rmoS(T2RnON|*#OijpU zisq>1vzCyS{Z{YR%{J$@g?794$qvhop-!XDA6>d#J>44J9cWc_OOJ9-<7b7>bzkJZ z)O@}6wfdXPx2o?l->ZIH`%&F1+gsZw-&fzS)ZaV+8)zH6IoLg0f4G0dY-DWI zW^{JUacp(mV|-^KaN=b0;S}*y+)uinDbpO&A7%t+%4V<4HqG6f`!;VfKe+&3*jV&i z#4SZFQ!l5iKvxP@C085QG}ijot=E?}yf;oZW47qG-ux2yRk?kA`y0j*v$W&8bG94* zo9%brp7dV(zTy7#f#<==VH}nXn|~yCgg&-7UO5TEk>b)$1yAeoy7;Lx&$BacdtduM zV}bMeIpIBUhP|5y0MxeufT0f@KUn`Y|NF!7XZHR#0;foS&|mleg8!N${&{x|07}8} zyU`{%x)}w4kJ$il1(Z)~0|1890AMN)5K2k?d;Tr%uX*M90|_{Xc&C5r;OX%9tN-El z*PIh1{iFB)dU~p)7WOQtNVs3t6acOyFb!~lT_xIlZ!6EkO7+iVz%N+3fR~h~n zd+0%X2#JUwM5O2T5D*5P8%s|_d`W`jf~pazy${1>$wy?2Hxl2Mw~_Nm8Dp3neETVw zd8Oz0cFs-uW6^)lpvV8WEc(}=f9*M&0H`1YV1YsC0T^)F^C3?7WcCbzwZ{p(Bm7@@ z(w_DG@64?Ke`jU`|2s1q{5La|qw_+O|9|1qdp7j17RvwYBWL)ue>Z6aDX8o!P_~T< zs>6pqTjDR_G7cFq(rlO_{^woR&tHT`+8dg$GAmyh{W>HF%ihoWVqm2sa2Wcq**K&h zOvA?*+SF<%sO$o!c^RiXJu3z>KhWOLR_EIGW&xR%viGw;AcJZt|9_tW^lap`@4R-` ze>($|&O_zHxAR!}|H!rXZ1gYnTF(H*|Mel%cRD;KFebQXarg)y6#oYrLatF#|!YV8h5%Qn@pr=NZhcF)?FR@HSRgqQ>g+!<#rD``|d;lUmn zePVEz4IH^T(<-YqJ^5NvuFM8&bRs?-EZgO~F)f)sXc#AOFo|YY^bJXw5?7$IP_dsE zC3(g7^CMkDnT6}^2h8^3!+EKZFxNUbxh+Ku~V4nt88RcyjjGZzgA3wc4jOxLmDo)c? zu1=31Rk%KNVCE(*^z>U);hT4Q z(kwj3!We9zp90OG+~N66TFcc0qtH3H{}e$KW`?O}-44j&TuP#A_P_p4ZIIaDXKz#R zs-2_>2M;d?(71POv31+_ff@r%hzCwg@=H0ZTf(b_k6#3o;7ZOpoI7i_i@Eh&n#zyk z1af|GO$mHRn9)f!@7_snk29p?5R)Fbfe9|*GZwTl3Sv$+%ZO$}=jd{HzG39W0Ef!L z>t(U93RryO9V#ny+>~pIK@5E%$=g@Qr0r#126J|@Z+*;J#3F-hzK$L4ieBtm_A_h~ zM)5oPDhm+Nk*x+Z9gKDvj9)bBtDGyu$^G8G35^(7EUL5H&MMTF-1~Qxpn?=Fc>X_|K0pUspn0{ z7Or#K1lWwu2%e;l27yGv6aA`}hiS`ZJekHbe^}7dHk3%R5zU6{<3pt&@^Ll>}qXHIZ ze2DQuQ{-ec<7*D2e)A9}-c+1}1HQ9{D_oJTc4_fQiT7k|UoH9gf;LAx@@xaaHgyCENb}sRN<$T;U~Z^(P_RilOBL8kyi7ZNciw>XoOc~ruPG;>XM^}g9KGkx z*G?{u=lk*tgKx9GMR<#1?b{~gZQmZ_nfk*xvAXkOF%#1{g>DLO*k7&-P{nxYBd zC9gELwQg9>RfRVMeu>|GX$z$L(iY{6VW(!DM|hsW8PEFD4@x_gaq|h(yy3h;CyfnU zQ=%V|e$g9WjSJ?rNMAd&7 z<0fd~+6gDED>d)E{cmG zw`61GL>p7I9xqq`~#X|OLd9r44{~G+=sm@ySCHP(Lx<| zqiJxmGjONZ(_S!fj7nz~P8RwK)~OsL{A<^auAGtGEO`JXIu9cgA85o(T#Hb;um6C< zJG@|P_b!ZWE&Vj12@9X4zBep=s;gP)((XA?@EG;$<5v9L0M=5eHoH&ghf1`iKR1}m zDTh;?U!>|L-jDw^Mtf%*de~F;0re~`K<~Gj$?~Py7^zI9GPT_&6@|Ze0l~Q-_2q&~ zJ}<8KcpzvO>}m&Ao0;ey_}-qB3~g`eq1b`3M0^Kzw=QZcwCXs`Q0OV)AJ-pB_LcJv zX5B)X*ak9mQ~1>{eNyJIdx(89{@dm#qjjc&|LOjTZn$RWVTV?n*;Msc)*!?1AUNqn zlXi>4TS$*f$$mqt)@-tYm~xHKZg|lqs(M_23jMLQn{3wGm1o!-%e)O=uh3^`TPpWy z*XS8M@woXgGBDKixgTfC=LAJsoevY{*8Wr)3TCy^`y5j*^}>GJl=qKAuctOHN(z7C z+3F@Ovp2HQ;l09xeC5b6$irHopGc{tudhfjQE&!0>tER&^0YItSu07*E_0Vm$(Rdg zQBPT3QTvqe^Ve8o8T-Q@XpZF?syQZy!~<^@FV$|9S2FSK$}c|m6kmLK&|B@(^UJ+# zLO;7D_?LI1vRs#duozEIGb~K38jGCGNMh6(9Vv9G_Ez!8<3r5aW)2@+nD>02&4~$K zJ*B|EvG|oO8$Wg%G5nI?V2@{%D>Hf5qSIiUWUz}%JmU^#IX^utsN#Nojl`mt$9pSQ>bDIqp3w&i)}hVO zr@yhI(@WE0cbAubl)!&`1U(*)R7Hu9>|4u2$n z=C2WglZ^-3i64+`SK~>!0l$QYes-c*M7s*lj)o&HIPN@BsP#g&fRRVhCL){}1TTvJIPWzxLhMNt^y zi~;NHVg5qFaBdE1-S4W8pYn_b^Goaj{zv*it@s&0-mPhnr(AF+@bc%kS))}!Dg@R2 zCS4(Vz44wktGiQAmRuQ+M74xe?9pGeWY8H4%omd0e&3yHa#$}k8rweuqU=6-9(LX# zgfgsK#f@1j%DyaOeet$2XloKvrrUo8IBLDy`D*E&^gZBxmka-G#;ZH(e`$x ztL!b0m1MHpvRt~SM@BB4-N#m16Jy>QG;x(yVVXN&iXp$PQy>F zI|s$i7cG=hlo`X_V2oIU&StV<{kQY(+9h5TTZSFJJ#urFR1$lWcKx+sCscE+`fdlX zBp-PiK^?#6u)tHAAXdK6grP|4!v|$qJf~?9muey%cGSxs{^;R7x$wB+s^_6M8jF)wO##fBxiMf`q4$Ovi>kE%J8KlFWIU{t$ z-8Z205k1q2gRFX4HtPA;udhZ!cR1Z|h>aa~JqfJ(g9gIyG2h&8#ci0=>I$9Ag!;9p4k<`e9?EAxI^u%x(peotwpCz<{Yven{^ zYT3h#?C?hshRV@8)1sEChu2%?Y^B;%?j`O$lZ^lHdVQ^=m+o8ZBlA(a=+^tc4tUB2 z8cRpJ#T5|QHOVL=_3dXO{14mQ7He4BM|@j9UuyJS4ZWpu$uJA?MUl#(ihI-{0%y@{ zUK8>;>>998usD>}MeQl^82-2ltwd{5pCGKZrd1Wp8ir<)8*+g8kM??Ft9jznC#!Z$ z?|<`4c zOG2+{_?GZV1&w=L&G1+jeUHkku7=;1kNvjR?39sN4^~52Z)wE(+&!+se!FC@vN=WD zUO!e+VjoZb;J(p7T?zAHz{A*!*Gr-s#~MN@j&OSNCG=|pg$%3aei8U-hrIYmYm7Fd zc62K%XVIGsqc{QFn#%g9RQNpEFW4~Qy9h>;97RjcP_GcCrLEd$Lulri2Dq@cYoz1AwE0!T;8M44_zp1%L(mFky=xD zNvfMRafSL6ZCvtLfrDKS(qTm!?f;}wgks3rs*_Miv`@>Bkps_k_1*-}lZT9pZ-b!e z^_R9B-k4O#JH>oh`ZkZej9tJ)jLx^juozUP2`?VyYjIf+3fw1!?3M||9;jhV zBj`OPT{HE}Mt$wLnE3GP=%Gv7nFoM!u1Kqg4;*J=&l1X-HLQe!HhcpW@(F zUnN-d>9=z`tOE7iE6li>i`Owy{|TzHCobZyLUDM)8DKQXbf{mB$!N2^f(gMY8h#pg z;;?t1AX$w&?IsH11gqq)iG7CUElbqICr!V`YYYSReqLA64mQ@w#omk4oKA9lyam%M zF;ig#8ETlYk>e{_qFII4>*BvyN#AX0_g17y{yp6CP(?C0Cv!$4?qVQ7I`QKM%C`fW z91(*qX|;}-M5!iO5iSTeb(7+VXa{OqcRW_R3cLc~wHA}o1uB-P%=;MlLPTV490_y4BGx|+ogeQV3U{~CBOyeMZDz_A?|u6&h-nK4$wZ^Y&~vUdq8&~L%8^=-*dPtS(&HDRg?CC;7ZJbDcm z;rD(%+Olb^osH~LOVqB@3^{eCeikMD=;(P^eU3%(iyXLc?5Tj+a|`+bFWc_K3{K%3 z2b09!(`Y02ABu8Y>4w(%Ht>ND)2=t8e2gp@n=huTiKGWDi)t3xum#P;;)~h{JFwbUrj4(zM#2&{`A|j zdFaQcvUgw7U#`o+)Ft#z#g^ ziq=uthQ<5jGVeFpH50D#Mxpa-#urJULEH&rB^zRNmg}h`({0b9N&Pl2X};^#!3bK4 zj%@r8uE12+xaM~86>oq1^&=E|2ADkvz|dvp@2$e$_`CHSenrr0FJ-H$%t8jLVbz51 zf{rwE-O)}vT(20V?sV<-6v}c*_s{D+={CXl%v$tXd~wVUW%MHpQg%0~dwDEU&Val% zUqQs8<-JLW3|ZdVhxlEXvaVL6$xIfu`6lms9hxljD6qV!+XUen&bca<9UZa2Ki<|8sSm___eKB(sKL6 zxVe8xc+Wa3cFP=L+MFWm@6bG zVAR64&P*B;B`sZpB4R7}L?Q=2Y_QEfZ+!hN2daR{TgxV_Qc3B?8NgGBAEP|9dVBg2 zTdMh;!ux^D4|hCYRi9_$e9(6snX=+ygek&#C^J!0shm7KJ0xw`i6?$gKYwiM2(U7q0nkVMWuRV3~ zJKbiAiR+{}8Z{E~D%OyRX8WN=qr!Fe^z{vi=&Xxy$Qy!91=E^oshunDNynG#?iR~i zenh=4(>|?zA-NfBtOqGys#>7R^F7}P;1woUofw$lc zK1H&4pKf1rSHYY- ziPKxqTwS?K$H@9aM2SU~sGgsnKi+dFI^!r@Fj2r2egkhANH!2e5wc^rZD6EzCvdB$ zt=(zUuN-ezL}))YDrN;!b{x?2WvB~sN1T3KdUCK8*RkUq)6BJA1NCZdU^d

TK$dYNNUjed68&g=>YPvEFSmS09QGoaF+o+kTrn{ z3;*?v{JY(OBYvp6$msE*2LjyI7&-%DHn6-Zr=?|Qz(a8Ii!RXI8po(%Jp&${0bWl* zg8PEs?01Rlok9qTOj>f+{*^Nz4N(-AupCg+cMgQ(GkTH zOs+*0Qak)|?W3}%P!rj$?-)xsv(+e`kpB$e%!by;wt?!1{vqtWviOD=D}VF_j+w+o zLo}-I&yhlrzX@x?1d|2!7>-qan40h2sWuknVnBfOB0 z*MloZ3{LCBKsyRX57x2LU&}rAQ8+?7yrP|4=}U`Wk72WRr*7VZufi9OQJCWQ9k2aD z-lNwbor;1yYg(}T&}e3qNJ(=Y>vnZNjP}S=TXt&)Q(;c2WHq-((htM#hfVu0O`?y$ zt~1)*)k?ti=0GXo@f_ksu>>2lnVwxTyUEV>lRQxiKKOLf!5mhXvZQ@%BQ#d+fDd+J zUJp9>aV$>B=iaJHTYGS0dLOy5v zg%dQuo&j8Cvd_~nb>LP!hP{E2+xG#k z1)IK{NqQAIrYwN%K*``7gX}OnWznZ4GIlrsiVI1_bID_>BKC8Oz;G1;4oy}}s;d?25;q(O}E#F_V0YSBzGvAC5DdH)GVZaED2Es-{Pzw$)?3M)#V=NXe z6k#2%iTPxQSGGASAB@`ybwRKW;)If1CN%js`w%lZ;E?p|m=n^#!5zj}`*>nl^F9lX z5jm$ui#;4lfUSK;VE4iLLwgykuVA(AjGqES2x;*~`<;vL8BqMGCd~iz3r9q7q23&d z=AoMFK}$USs5-|L14PKvHj}OdZe*Jg*IO8lF>+3YWJ6CoqFNWM#ra4)g(l_|LB*&M z?&=U2(U(UPY9eubmsWHtVU`v+w^z+%7}vYJ1D+CF%ri^2QQmb>D=~~j>a!_>`_H*P z2b}@Lj9BZCYn34t3%OsVp(m#13=uzDh$qZnOm6TcNM+oFome$$8e`q(;3t#TWQ>Ra z)lzpn9h3qRTdw!Bn>xhbH|&EOCU+ui*QyRv-@JyX`uQVTnH#q}TW@dd_ptUh0^(slw8qGF? z*{TuJf$v~hKrugI#AsZDI}A&L!i6-u*u_N9tz5(I<+sdP2HU}S^|0W~Z0^m6Y22OW z8+KYWml6t4dSFHM$DP;RJC0|-WIF9>iGjgn-fY^*NILpYi@;Tu)-q=v?7gSWvcuSo zwU`^6Fc`>Hl6oN;EtUblnx9hWuNj7(>L@>W{E3u%2zf@E6Nw zQ+KR3Nbx_xhB0CE%Qhxe!{EpbvHivrfhnkrh4MDR#=+>ds4!s*=dMi<+Nn?}`O~;V zrzb7#PW-`~|Cr))2BfgJ{MEXZy-b?Zi+jmzs8XbVKk9)0;!lG&mJ}S-apcNw4P%rewwlYaxAVZ3g=tqY>`Eml^j1rEs zm{3he-3=@DGoZ6$NA}R53^CWBLQZ=WID)`XgRanqZVh78&w!0CCXS&nHaYKQF}Mw=`XbHW!o3a80HN3?@7?oVocGzkT4!3du;8vtX;TlJ+Na#7er_j$+$Y z&DTnWc_TdF_E{HbnHwSBkwNkOGoT{w*ZYrEX5)(*wfpKtK5HW@iT5wkx}dQZsZUB` zQ{wm=V!p1Ut=~A>G2jR_zZW1+=8aB;*2DBMha&T9|P z+A~1Y7BOakDH9D4)ZEPc#T;#YQoN|yIRj964Ljg&qUOv8=Tkc>q1Ot?aeUB$dTen? zgY|o`kKxCfwUpo9yS9VG5?Y{47-E|9n$)PDt=+Gk*X%;X0zQQ|TYep(<}4hrEtqLW zV7=f-8_zVR4tEB>K;eO6h``EHFMR?zd>6lfe_gi6lvEZ~(^S4`zq(+XSTp7Qd?$8p zF#M;U!5lx|7VOvN98M)b|-4?bb7iN&AhRjvZ64`b9G3rNIbEg!|e~^*sf$+R$oDI^Z?3;RX^57WVL zM3GeqbSs;s9$8$Sp~ng7x6Kueavk{KAI_&M-IOs|~d7C}j)D z!qcH2Xgt^i62E}W+tZ^9ULbUS)a~#`<*9hEVB+@|QKytlXqzc4yZM)3gvqm@JJp*l z!!0=uHnb!Kgvva((UojaECz43I)|x^xHCTIP-uoX>0`0O%>EFY$F-jU3U*j6C6$P! zO%ZTs&~B$p{G}aPccZHU_;F3h6e3!Z8s56FnEB%vdN_;5KNikqwYn&r8CEoOht?E7 z-hUBqI|s#pLo{}plK1c{yU?~#oO@JtJ=SYMM7ZozjNPKJkq8bV^y~IzbYqFtsrjn_ z3(_YUnz!olQLkx(XkgQ%M`ji~22oiX!LJY4iutQB>~vv0i0us%u7$Zhj*C%jd!mRO z%JHUtnkN02>}EO4Hy&~+=%L|AXqZ|bNnn>W>LzrQ>CJI$2PQb({0t~{Fu-4V$Budg zwyzc;ts&}{@a|S7IqFUHuZl*>UGY3?3#aN)v0M!nM`p6v*RY#|WRT(3d^;nImIFNQ z5RZdlO%anSbZbkt@rc0&u*nP1crJ5ri_f^s+~5qL6vEQi+*)YaCcbU(v{+%y12$`x z832|K{Qj{4j^bxadvRAGmh%;9iu&FR1QBieUT31SJAmJlnhBfeSo^#9o(;I_>%fvtL3^I8sMw~>JS|Dv3gepyZkfF*6i|(+otGcPpBPze<(EEARyddf zzqx#}Dm7+?*rFsujP$aHTT(1fwpBB{9hGJ1(JZ=aLi;!j_JU7S1to*9LPK;$Q_$Ev z!4YeoKs&nNK-m81M_Mc$tY^eOQw)=iC~k}g7kuo9u;D68&6*=Q2BcU|8mm4ZeK`;I zkSu;{#^FR@rzYxiXOJ9MTg!pbZHs0h%$?o~Q{V89!upTlB=yXgn%J~^iqdkMA$YFj z&h?M$fy?S2`?o~4&>D5GUPL68U8xtG^WMU5aSRtZ$a`La+pOaOjRn2B*G)rWzm-Np z+(Y~%^my7cUH6mr*37q-cCtjbRLIC|QTGN-^Ur`spD)9A@3+@qL||_l3%yQJ=gRb; z2d5qd^yvAB

dp6@8tS0e7uDg~ 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 H_b2`X*@*eG diff --git a/src/components/IconButton/index.tsx b/src/components/IconButton/index.tsx index 977db1d8..55d63974 100644 --- a/src/components/IconButton/index.tsx +++ b/src/components/IconButton/index.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { forwardRef } from 'react'; import style, { ButtonVariant } from './styles'; interface IconButtonProps extends React.ComponentProps<'button'> { @@ -8,16 +8,16 @@ interface IconButtonProps extends React.ComponentProps<'button'> { children: React.ReactNode; } -const IconButton = ({ - variant = 'header', - children, - ...props -}: IconButtonProps) => { - return ( - - ); -}; +const IconButton = forwardRef( + ({ variant = 'header', children, ...props }, ref) => { + return ( + + ); + }, +); + +IconButton.displayName = 'IconButton'; export default IconButton; diff --git a/src/components/Tooltip/index.stories.tsx b/src/components/Tooltip/index.stories.tsx new file mode 100644 index 00000000..73b4c040 --- /dev/null +++ b/src/components/Tooltip/index.stories.tsx @@ -0,0 +1,46 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { css } from '@emotion/react'; +import { SoundOff } from '@/assets/icons'; +import IconButton from '../IconButton'; +import Tooltip from './'; + +const meta = { + title: 'Components/Tooltip', + component: Tooltip, + tags: ['autodocs'], + argTypes: {}, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +const styles = { + background: css` + display: flex; + justify-content: flex-end; + padding: 1rem 1rem 3rem; + background-color: #9eddfc; + `, +}; + +export const Primary: Story = { + args: { + side: 'bottom', + align: 'end', + delay: 1000, + triggerContent: ( + + + + ), + children: '์†Œ๋ฆฌ๋ฅผ ์ผœ ๋ฐ”๋‹ค๋ฅผ ๋Š๊ปด๋ณด์„ธ์š”', + }, + decorators: (Story) => { + return ( +
+ +
+ ); + }, +}; diff --git a/src/components/Tooltip/index.tsx b/src/components/Tooltip/index.tsx new file mode 100644 index 00000000..1755dd05 --- /dev/null +++ b/src/components/Tooltip/index.tsx @@ -0,0 +1,65 @@ +import { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import * as T from '@radix-ui/react-tooltip'; +import useTimeout from '@/hooks/useTimeout'; +import textStyles from '@/styles/textStyles'; +import styles from './styles'; + +interface TooltipProps { + /** ํˆดํŒ์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */ + side?: 'left' | 'top' | 'right' | 'bottom'; + /** ํ™”์‚ดํ‘œ ๋ชจ์–‘์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */ + align?: 'start' | 'center' | 'end'; + /** ๋งˆ์šดํŠธ์‹œ ์ตœ์ดˆ๋กœ ํˆดํŒ์„ ๋ณด์—ฌ์ค„ ์‹œ๊ฐ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */ + delay?: number; + /** ํˆดํŒ์„ ๋ณด์—ฌ์ค„ ํŠธ๋ฆฌ๊ฑฐ ์ปจํ…์ธ ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */ + triggerContent: React.ReactNode; + /** ํˆดํŒ ๋‚ด์šฉ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. */ + children?: React.ReactNode; +} + +/** ๋งˆ์šฐ์Šค๋ฅผ hoverํ•  ๋•Œ ํˆดํŒ ์ปจํ…์ธ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. */ +const Tooltip = ({ + side = 'bottom', + align = 'center', + delay = 0, + triggerContent, + children, +}: TooltipProps) => { + const [isOpen, setIsOpen] = useState(delay > 0); + + useTimeout(() => setIsOpen(false), delay); + + return ( + + + {triggerContent} + + {isOpen && ( + + + + {children} + + + + + )} + + + + ); +}; + +export default Tooltip; diff --git a/src/components/Tooltip/styles.ts b/src/components/Tooltip/styles.ts new file mode 100644 index 00000000..fc7c44e3 --- /dev/null +++ b/src/components/Tooltip/styles.ts @@ -0,0 +1,20 @@ +import { css } from '@emotion/react'; + +const styles = { + content: css` + padding: 0.5rem 0.75rem; + border-radius: 0.25rem; + background-color: white; + box-shadow: + 0 0 4px 0 rgb(0 0 0 / 0.12), + 2px 6px 12px 0 rgb(0 0 0 / 0.12); + text-align: center; + `, + arrow: css` + width: 0.75rem; + height: 0.5rem; + fill: white; + `, +}; + +export default styles; diff --git a/src/hooks/useTimeout.ts b/src/hooks/useTimeout.ts new file mode 100644 index 00000000..411196cf --- /dev/null +++ b/src/hooks/useTimeout.ts @@ -0,0 +1,21 @@ +import { useEffect, useRef } from 'react'; + +/** + * delay๋งŒํผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ callback์„ ์‹คํ–‰ํ•˜๋Š” ํ›…์ž…๋‹ˆ๋‹ค. + */ +const useTimeout = (callback: VoidFunction, delay: number) => { + const callbackRef = useRef(callback); + + // ๋งˆ์ง€๋ง‰ callback์„ ์ €์žฅ + useEffect(() => { + callbackRef.current = callback; + }, [callback]); + + // delay ํ›„์— callback ์‹คํ–‰ + useEffect(() => { + const timer = setTimeout(callbackRef.current, delay); + return () => clearTimeout(timer); + }, [delay]); +}; + +export default useTimeout; From d33351e1dcde939e3ce5e694a3a1471459207bcd Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Thu, 1 Feb 2024 23:02:50 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=E2=9C=A8=20feat:=20LetterWrite=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=8E=B8=EC=A7=80=EC=A7=80=20UI?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/LetterPaper.tsx | 62 ++++++++++++++ .../components/LetterReceiver.tsx | 35 ++++++++ .../components/LetterWriteBottom.tsx | 37 +++++++++ .../components/LetterWriteContent.tsx | 26 ++++++ src/pages/LetterWritePage/index.tsx | 22 +++++ src/pages/LetterWritePage/styles.ts | 82 +++++++++++++++++++ 6 files changed, 264 insertions(+) create mode 100644 src/pages/LetterWritePage/components/LetterPaper.tsx create mode 100644 src/pages/LetterWritePage/components/LetterReceiver.tsx create mode 100644 src/pages/LetterWritePage/components/LetterWriteBottom.tsx create mode 100644 src/pages/LetterWritePage/components/LetterWriteContent.tsx create mode 100644 src/pages/LetterWritePage/index.tsx create mode 100644 src/pages/LetterWritePage/styles.ts diff --git a/src/pages/LetterWritePage/components/LetterPaper.tsx b/src/pages/LetterWritePage/components/LetterPaper.tsx new file mode 100644 index 00000000..2e60344f --- /dev/null +++ b/src/pages/LetterWritePage/components/LetterPaper.tsx @@ -0,0 +1,62 @@ +import { useState } from 'react'; +import LetterCard from '@/components/LetterCard'; +import { formatDate } from '@/utils/dateUtils'; +import textStyles from '@/styles/textStyles'; +import { CaretDown } from '@/assets/icons'; +import style from '../styles'; + +interface LetterPaperProps { + isBottomSheetOpen: boolean; + toggleBottomSheet: (state: boolean) => () => void; +} + +const ReceiverContainer = ({ + onClick, + isOpen, +}: { + onClick: () => void; + isOpen: boolean; +}) => ( +
+

To.

+
+

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

+ +
+
+); + +const LetterPaper = ({ + isBottomSheetOpen, + toggleBottomSheet, +}: LetterPaperProps) => { + const [letterContent, setLetterContent] = useState(''); + + return ( + + + +
+

{letterContent.length}

+

 / 300

+
+
+

{formatDate(new Date())}

+
+
+ ); +}; + +export default LetterPaper; diff --git a/src/pages/LetterWritePage/components/LetterReceiver.tsx b/src/pages/LetterWritePage/components/LetterReceiver.tsx new file mode 100644 index 00000000..10f2d5b1 --- /dev/null +++ b/src/pages/LetterWritePage/components/LetterReceiver.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import BottomSheet from '@/components/BottomSheet'; + +interface LetterReceiverProps { + isBottomSheetOpen: boolean; + toggleBottomSheet: (state: boolean) => () => void; +} + +const LetterReceiver = ({ + isBottomSheetOpen, + toggleBottomSheet, +}: LetterReceiverProps) => { + return ( + +
+

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”

+
+

๋‚˜์ด

+
+
+

์„ฑ๋ณ„

+
+
+

๊ณ ๋ฏผ

+
+
+
+ ); +}; + +export default LetterReceiver; diff --git a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx new file mode 100644 index 00000000..d0f8e6aa --- /dev/null +++ b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { css } from '@emotion/react'; +import Navbar from '@/components/Navbar'; +import Button, { buttonStyles } from '@/components/Button'; +import { ImageSquare } from '@/assets/icons'; + +const styles = { + navbar: css` + padding-inline: 0; + `, + iconContainer: css` + flex-grow: 0; + margin-left: 0.75rem; + padding: 0.5rem 0.75rem; + border-radius: 0.5rem; + `, +}; + +const LetterWriteBottom = () => { + return ( + + + + + + ); +}; + +export default LetterWriteBottom; diff --git a/src/pages/LetterWritePage/components/LetterWriteContent.tsx b/src/pages/LetterWritePage/components/LetterWriteContent.tsx new file mode 100644 index 00000000..330b58b4 --- /dev/null +++ b/src/pages/LetterWritePage/components/LetterWriteContent.tsx @@ -0,0 +1,26 @@ +import React, { useState } from 'react'; +import LetterPaper from './LetterPaper'; +import LetterReceiver from './LetterReceiver'; + +const LetterWriteContent = () => { + const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false); + + const toggleBottomSheet = (state: boolean) => () => { + setIsBottomSheetOpen(state); + }; + + return ( + <> + + + + ); +}; + +export default LetterWriteContent; diff --git a/src/pages/LetterWritePage/index.tsx b/src/pages/LetterWritePage/index.tsx new file mode 100644 index 00000000..5ac4fa1f --- /dev/null +++ b/src/pages/LetterWritePage/index.tsx @@ -0,0 +1,22 @@ +// import { useState } from 'react'; +import Header from '@/components/Header'; +import { CaretLeft } from '@/assets/icons'; +import style from './styles'; +import LetterWriteContent from './components/LetterWriteContent'; +import LetterWriteBottom from './components/LetterWriteBottom'; + +const LetterWritePage = () => { + return ( +
+
} + /> +
+ + +
+
+ ); +}; +export default LetterWritePage; diff --git a/src/pages/LetterWritePage/styles.ts b/src/pages/LetterWritePage/styles.ts new file mode 100644 index 00000000..1dba5a2a --- /dev/null +++ b/src/pages/LetterWritePage/styles.ts @@ -0,0 +1,82 @@ +import { css } from '@emotion/react'; +import COLORS from '@/constants/colors'; +import textStyles from '@/styles/textStyles'; + +const style = { + container: css` + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + `, + headerStyle: css` + height: 2.5rem; + margin-top: 1.25rem; + margin-bottom: 1rem; + `, + contentWrapper: css` + display: flex; + flex: 1; + flex-direction: column; + justify-content: space-between; + margin-inline: 0.5rem; + `, + ReceiverContainer: css` + display: flex; + align-items: center; + + p { + ${textStyles.t4}; + } + `, + ReceiverBox: css` + display: flex; + justify-content: space-between; + width: 100%; + margin-left: 0.5rem; + padding: 0.5rem 0.75rem; + border: 1px solid var(--white, #fff); + border-radius: 0.5rem; + background: rgb(255 255 255 / 0.38); + letter-spacing: -0.0035rem; + cursor: pointer; + + p { + color: ${COLORS.gray3}; + ${textStyles.b4m}; + } + `, + caretDown: (isOpen: boolean) => css` + color: ${COLORS.gray2}; + transition: transform 0.5s; + transform: ${isOpen ? 'rotate(180deg)' : 'none'}; + `, + textarea: css` + border: none; + background: none; + outline: none; + resize: none; + `, + textCount: css` + display: flex; + justify-content: flex-end; + + ${textStyles.c1m} + & > p:nth-of-type(1) { + color: ${COLORS.gray1}; + } + + & > p:nth-of-type(2) { + color: ${COLORS.gray4}; + } + `, + date: css` + display: flex; + justify-content: flex-end; + margin-top: 2.5rem; + ${textStyles.c1r} + color: ${COLORS.gray4}; + `, +}; + +export default style; From c4a787ba295c3a1ebfa7c14e2d31464ffb8de5e6 Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Thu, 1 Feb 2024 23:07:07 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=E2=9C=A8=20feat:=20LetterWrite=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/router.tsx b/src/router.tsx index 5d974778..09b582a0 100644 --- a/src/router.tsx +++ b/src/router.tsx @@ -1,12 +1,14 @@ import { createBrowserRouter } from 'react-router-dom'; import App from './App'; import ModalTestPage from './pages/ModalTestPage'; +import LetterWritePage from './pages/LetterWritePage'; const ROUTER_PATHS = { ROOT: '/', TEST_CONSTANT: '/test/const', TEST_VARIABLE: (variableId: string) => `/test/variable/${variableId}`, MODAL_TEST: '/modal-test', + LETTER_WRITE: '/write', } as const; const router = createBrowserRouter([ @@ -26,6 +28,10 @@ const router = createBrowserRouter([ path: ROUTER_PATHS.MODAL_TEST, element: , }, + { + path: ROUTER_PATHS.LETTER_WRITE, + element: , + }, ], }, ]); From 6b5ff71a3b82c829b73effe05aafd0c7e1129f29 Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Fri, 2 Feb 2024 01:29:20 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=E2=9C=A8=20feat:=20LetterWrite=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B0=94=ED=85=80=EC=8B=9C?= =?UTF-8?q?=ED=8A=B8=20UI=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/LetterReceiver.tsx | 70 ++++++++++++++-- src/pages/LetterWritePage/styles.ts | 82 +++++++++++++++++++ 2 files changed, 146 insertions(+), 6 deletions(-) diff --git a/src/pages/LetterWritePage/components/LetterReceiver.tsx b/src/pages/LetterWritePage/components/LetterReceiver.tsx index 10f2d5b1..13a4e71b 100644 --- a/src/pages/LetterWritePage/components/LetterReceiver.tsx +++ b/src/pages/LetterWritePage/components/LetterReceiver.tsx @@ -1,5 +1,11 @@ -import React from 'react'; +import React, { useState } from 'react'; +import Slider from '@mui/material/Slider'; import BottomSheet from '@/components/BottomSheet'; +import { ArrowClockWise } from '@/assets/icons'; +import COLORS from '@/constants/colors'; +import Chip from '@/components/Chip'; +import textStyles from '@/styles/textStyles'; +import style from '../styles'; interface LetterReceiverProps { isBottomSheetOpen: boolean; @@ -10,24 +16,76 @@ const LetterReceiver = ({ isBottomSheetOpen, toggleBottomSheet, }: LetterReceiverProps) => { + const [value, setValue] = useState([17, 39]); + + const handleChange = (e: Event, newValue: number | number[]) => { + setValue(newValue as number[]); + }; + + const chipLabels = [ + '์ผยท์ง์žฅ', + '์ทจ์—…ยท์ง„๋กœ', + '์ธ๊ฐ„๊ด€๊ณ„', + '์ด๋ณ„ยท์ƒ์‹ค', + '์—ฐ์• ', + 'ํ•™์—…', + '๊ฐ€์กฑ', + '๊ธฐํƒ€', + ]; + return ( -
-

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”

+
+
+

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

+ +
-

๋‚˜์ด

+

๋‚˜์ด

+ 'Minimum distance'} + value={value} + onChange={handleChange} + valueLabelDisplay="auto" + disableSwap + min={15} + max={50} + css={style.slider} + /> +
+

{value[0]}์„ธ ์ด์ƒ

+

{value[1]}์„ธ ์ดํ•˜

+
-

์„ฑ๋ณ„

+

์„ฑ๋ณ„

+
+ ๋ชจ๋‘์—๊ฒŒ ๋ณด๋‚ด๊ธฐ + ๋‚˜์™€ ๊ฐ™์€ ์„ฑ๋ณ„์—๊ฒŒ ๋ณด๋‚ด๊ธฐ +
-

๊ณ ๋ฏผ

+

๊ณ ๋ฏผ

+

+ ๊ณ ๋ฏผ์„ ์„ ํƒ์„ ํ•˜๋ฉด ๋‚˜์™€ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ๊ฐ€์ง„ ๋‚ฏ์„  ์นœ๊ตฌ์—๊ฒŒ ์ „๋‹ฌ๋˜์š” +

+
+ {chipLabels.map((label) => ( + + {label} + + ))} +
+
+ + +
); }; diff --git a/src/pages/LetterWritePage/styles.ts b/src/pages/LetterWritePage/styles.ts index 1dba5a2a..85730cc3 100644 --- a/src/pages/LetterWritePage/styles.ts +++ b/src/pages/LetterWritePage/styles.ts @@ -77,6 +77,88 @@ const style = { ${textStyles.c1r} color: ${COLORS.gray4}; `, + bottomSheetTitle: css` + display: flex; + justify-content: space-between; + align-items: center; + height: 2.75rem; + + h2 { + ${textStyles.t2} + } + + svg { + cursor: pointer; + } + `, + label: css` + padding-block: 0.5rem; + ${textStyles.t3}; + `, + slider: css` + color: #0c8ce9; + + .MuiSlider-rail { + color: ${COLORS.gray5}; + } + + .MuiSlider-thumb { + width: 1rem; + height: 1rem; + border: 1px solid ${COLORS.gray4}; + background: ${COLORS.gray6}; + } + `, + age: css` + display: flex; + justify-content: space-between; + margin-bottom: 1rem; + color: ${COLORS.gray3}; + font-weight: 500; + font-size: 12px; + line-height: 24px; + `, + genderChip: css` + display: flex; + gap: 0.5rem; + margin-top: 0.5rem; + margin-bottom: 1rem; + + button { + flex: 1; + color: ${COLORS.gray1}; + font-weight: 700; + font-style: normal; + font-size: 12px; + line-height: 16px; + } + `, + concernChip: css` + display: flex; + flex-wrap: wrap; + gap: 0.25rem; + margin-block: 1rem; + `, + buttonContainer: css` + display: flex; + + button { + flex: 1; + padding: 12px 20px; + border: 0; + ${textStyles.t3} + } + + & > button:nth-of-type(1) { + background-color: ${COLORS.gray5}; + color: ${COLORS.gray1}; + } + + & > button:nth-of-type(2) { + background-color: ${COLORS.primary}; + color: white; + } + `, }; export default style; From fb13f52efb997b1d06aa8561d3325b8e1c955747 Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Fri, 2 Feb 2024 13:14:46 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=F0=9F=94=A8=20refactor:=20LetterWrite=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 15 +-- .../LetterWritePage/components/AgeSlider.tsx | 30 ++++++ .../components/ConcernSelect.tsx | 21 +++++ .../components/GenderSelect.tsx | 14 +++ .../components/LetterPaper.tsx | 20 +--- .../components/LetterReceiver.tsx | 93 ------------------- .../components/LetterReceiverContainer.tsx | 20 ++++ .../components/LetterReceiverSelect.tsx | 57 ++++++++++++ .../components/LetterWriteBottom.tsx | 1 - .../components/LetterWriteContent.tsx | 7 +- .../LetterWritePage/components/index.tsx | 19 ++++ src/pages/LetterWritePage/index.tsx | 8 +- src/pages/LetterWritePage/styles.ts | 2 +- 13 files changed, 171 insertions(+), 136 deletions(-) create mode 100644 src/pages/LetterWritePage/components/AgeSlider.tsx create mode 100644 src/pages/LetterWritePage/components/ConcernSelect.tsx create mode 100644 src/pages/LetterWritePage/components/GenderSelect.tsx delete mode 100644 src/pages/LetterWritePage/components/LetterReceiver.tsx create mode 100644 src/pages/LetterWritePage/components/LetterReceiverContainer.tsx create mode 100644 src/pages/LetterWritePage/components/LetterReceiverSelect.tsx create mode 100644 src/pages/LetterWritePage/components/index.tsx diff --git a/src/App.tsx b/src/App.tsx index 033d0b14..3ec0e5a0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,24 +1,11 @@ -import { Link, Outlet } from 'react-router-dom'; +import { Outlet } from 'react-router-dom'; import Background from '@/components/Background'; import BackgroundImg from '@/assets/ocean.jpeg'; -import EmotionTestButton from '@/components/EmotionTestButton'; -import { ROUTER_PATHS } from '@/router'; const App = () => { return ( -

- Hello World! Hello World! Hello World! Hello World! Hello World! Hello - World! Hello World! Hello World! Hello World! Hello World! Hello World! - Hello World! Hello World! Hello World! Hello World! -

-

Vercel ๋ฐฐํฌ!

- ์ด๋ชจ์…˜ ํ…Œ์ŠคํŠธ - Test Constant Page - Test 5 Page - Modal Test Page -
); }; diff --git a/src/pages/LetterWritePage/components/AgeSlider.tsx b/src/pages/LetterWritePage/components/AgeSlider.tsx new file mode 100644 index 00000000..c0329e68 --- /dev/null +++ b/src/pages/LetterWritePage/components/AgeSlider.tsx @@ -0,0 +1,30 @@ +import Slider from '@mui/material/Slider'; +import style from '../styles'; + +const AgeSlider = ({ + value, + handleChange, +}: { + value: number[]; + handleChange: (e: Event, newValue: number | number[]) => void; +}) => ( +
+

๋‚˜์ด

+ 'Minimum distance'} + value={value} + onChange={handleChange} + valueLabelDisplay="auto" + disableSwap + min={15} + max={50} + css={style.slider} + /> +
+

{value[0]}์„ธ ์ด์ƒ

+

{value[1]}์„ธ ์ดํ•˜

+
+
+); + +export default AgeSlider; diff --git a/src/pages/LetterWritePage/components/ConcernSelect.tsx b/src/pages/LetterWritePage/components/ConcernSelect.tsx new file mode 100644 index 00000000..42a03a88 --- /dev/null +++ b/src/pages/LetterWritePage/components/ConcernSelect.tsx @@ -0,0 +1,21 @@ +import Chip from '@/components/Chip'; +import textStyles from '@/styles/textStyles'; +import style from '../styles'; + +const ConcernSelect = ({ chipLabels }: { chipLabels: string[] }) => ( +
+

๊ณ ๋ฏผ

+

+ ๊ณ ๋ฏผ์„ ์„ ํƒ์„ ํ•˜๋ฉด ๋‚˜์™€ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ๊ฐ€์ง„ ๋‚ฏ์„  ์นœ๊ตฌ์—๊ฒŒ ์ „๋‹ฌ๋ผ์š” +

+
+ {chipLabels.map((label) => ( + + {label} + + ))} +
+
+); + +export default ConcernSelect; diff --git a/src/pages/LetterWritePage/components/GenderSelect.tsx b/src/pages/LetterWritePage/components/GenderSelect.tsx new file mode 100644 index 00000000..870c2511 --- /dev/null +++ b/src/pages/LetterWritePage/components/GenderSelect.tsx @@ -0,0 +1,14 @@ +import Chip from '@/components/Chip'; +import style from '../styles'; + +const GenderSelect = () => ( +
+

์„ฑ๋ณ„

+
+ ๋ชจ๋‘์—๊ฒŒ ๋ณด๋‚ด๊ธฐ + ๋‚˜์™€ ๊ฐ™์€ ์„ฑ๋ณ„์—๊ฒŒ ๋ณด๋‚ด๊ธฐ +
+
+); + +export default GenderSelect; diff --git a/src/pages/LetterWritePage/components/LetterPaper.tsx b/src/pages/LetterWritePage/components/LetterPaper.tsx index 2e60344f..fa75108a 100644 --- a/src/pages/LetterWritePage/components/LetterPaper.tsx +++ b/src/pages/LetterWritePage/components/LetterPaper.tsx @@ -2,30 +2,14 @@ import { useState } from 'react'; import LetterCard from '@/components/LetterCard'; import { formatDate } from '@/utils/dateUtils'; import textStyles from '@/styles/textStyles'; -import { CaretDown } from '@/assets/icons'; import style from '../styles'; +import { LetterReceiverContainer } from '.'; interface LetterPaperProps { isBottomSheetOpen: boolean; toggleBottomSheet: (state: boolean) => () => void; } -const ReceiverContainer = ({ - onClick, - isOpen, -}: { - onClick: () => void; - isOpen: boolean; -}) => ( -
-

To.

-
-

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

- -
-
-); - const LetterPaper = ({ isBottomSheetOpen, toggleBottomSheet, @@ -34,7 +18,7 @@ const LetterPaper = ({ return ( - diff --git a/src/pages/LetterWritePage/components/LetterReceiver.tsx b/src/pages/LetterWritePage/components/LetterReceiver.tsx deleted file mode 100644 index 13a4e71b..00000000 --- a/src/pages/LetterWritePage/components/LetterReceiver.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React, { useState } from 'react'; -import Slider from '@mui/material/Slider'; -import BottomSheet from '@/components/BottomSheet'; -import { ArrowClockWise } from '@/assets/icons'; -import COLORS from '@/constants/colors'; -import Chip from '@/components/Chip'; -import textStyles from '@/styles/textStyles'; -import style from '../styles'; - -interface LetterReceiverProps { - isBottomSheetOpen: boolean; - toggleBottomSheet: (state: boolean) => () => void; -} - -const LetterReceiver = ({ - isBottomSheetOpen, - toggleBottomSheet, -}: LetterReceiverProps) => { - const [value, setValue] = useState([17, 39]); - - const handleChange = (e: Event, newValue: number | number[]) => { - setValue(newValue as number[]); - }; - - const chipLabels = [ - '์ผยท์ง์žฅ', - '์ทจ์—…ยท์ง„๋กœ', - '์ธ๊ฐ„๊ด€๊ณ„', - '์ด๋ณ„ยท์ƒ์‹ค', - '์—ฐ์• ', - 'ํ•™์—…', - '๊ฐ€์กฑ', - '๊ธฐํƒ€', - ]; - - return ( - -
-
-

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

- -
-
-

๋‚˜์ด

- 'Minimum distance'} - value={value} - onChange={handleChange} - valueLabelDisplay="auto" - disableSwap - min={15} - max={50} - css={style.slider} - /> -
-

{value[0]}์„ธ ์ด์ƒ

-

{value[1]}์„ธ ์ดํ•˜

-
-
-
-

์„ฑ๋ณ„

-
- ๋ชจ๋‘์—๊ฒŒ ๋ณด๋‚ด๊ธฐ - ๋‚˜์™€ ๊ฐ™์€ ์„ฑ๋ณ„์—๊ฒŒ ๋ณด๋‚ด๊ธฐ -
-
-
-

๊ณ ๋ฏผ

-

- ๊ณ ๋ฏผ์„ ์„ ํƒ์„ ํ•˜๋ฉด ๋‚˜์™€ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ๊ฐ€์ง„ ๋‚ฏ์„  ์นœ๊ตฌ์—๊ฒŒ ์ „๋‹ฌ๋˜์š” -

-
- {chipLabels.map((label) => ( - - {label} - - ))} -
-
-
-
- - -
-
- ); -}; - -export default LetterReceiver; diff --git a/src/pages/LetterWritePage/components/LetterReceiverContainer.tsx b/src/pages/LetterWritePage/components/LetterReceiverContainer.tsx new file mode 100644 index 00000000..1bc63088 --- /dev/null +++ b/src/pages/LetterWritePage/components/LetterReceiverContainer.tsx @@ -0,0 +1,20 @@ +import { CaretDown } from '@/assets/icons'; +import style from '../styles'; + +const ReceiverContainer = ({ + onClick, + isOpen, +}: { + onClick: () => void; + isOpen: boolean; +}) => ( +
+

To.

+
+

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

+ +
+
+); + +export default ReceiverContainer; diff --git a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx new file mode 100644 index 00000000..4d90ea6b --- /dev/null +++ b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx @@ -0,0 +1,57 @@ +import { useState } from 'react'; +import BottomSheet from '@/components/BottomSheet'; +import { ArrowClockWise } from '@/assets/icons'; +import COLORS from '@/constants/colors'; +import style from '../styles'; +import { AgeSlider, GenderSelect, ConcernSelect } from '.'; + +interface LetterReceiverSelectProps { + isBottomSheetOpen: boolean; + toggleBottomSheet: (state: boolean) => () => void; +} + +const LetterReceiverSelect = ({ + isBottomSheetOpen, + toggleBottomSheet, +}: LetterReceiverSelectProps) => { + const [value, setValue] = useState([17, 39]); + + const handleChange = (e: Event, newValue: number | number[]) => { + setValue(newValue as number[]); + }; + + const chipLabels = [ + '์ผยท์ง์žฅ', + '์ทจ์—…ยท์ง„๋กœ', + '์ธ๊ฐ„๊ด€๊ณ„', + '์ด๋ณ„ยท์ƒ์‹ค', + '์—ฐ์• ', + 'ํ•™์—…', + '๊ฐ€์กฑ', + '๊ธฐํƒ€', + ]; + + return ( + +
+
+

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

+ +
+ + + +
+
+ + +
+
+ ); +}; + +export default LetterReceiverSelect; diff --git a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx index d0f8e6aa..c0d7fa78 100644 --- a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx +++ b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { css } from '@emotion/react'; import Navbar from '@/components/Navbar'; import Button, { buttonStyles } from '@/components/Button'; diff --git a/src/pages/LetterWritePage/components/LetterWriteContent.tsx b/src/pages/LetterWritePage/components/LetterWriteContent.tsx index 330b58b4..9995e394 100644 --- a/src/pages/LetterWritePage/components/LetterWriteContent.tsx +++ b/src/pages/LetterWritePage/components/LetterWriteContent.tsx @@ -1,6 +1,5 @@ -import React, { useState } from 'react'; -import LetterPaper from './LetterPaper'; -import LetterReceiver from './LetterReceiver'; +import { useState } from 'react'; +import { LetterPaper, LetterReceiverSelect } from '.'; const LetterWriteContent = () => { const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false); @@ -15,7 +14,7 @@ const LetterWriteContent = () => { isBottomSheetOpen={isBottomSheetOpen} toggleBottomSheet={toggleBottomSheet} /> - diff --git a/src/pages/LetterWritePage/components/index.tsx b/src/pages/LetterWritePage/components/index.tsx new file mode 100644 index 00000000..20f084eb --- /dev/null +++ b/src/pages/LetterWritePage/components/index.tsx @@ -0,0 +1,19 @@ +import AgeSlider from './AgeSlider'; +import ConcernSelect from './ConcernSelect'; +import GenderSelect from './GenderSelect'; +import LetterPaper from './LetterPaper'; +import LetterReceiverSelect from './LetterReceiverSelect'; +import LetterReceiverContainer from './LetterReceiverContainer'; +import LetterWriteBottom from './LetterWriteBottom'; +import LetterWriteContent from './LetterWriteContent'; + +export { + AgeSlider, + ConcernSelect, + GenderSelect, + LetterPaper, + LetterReceiverSelect, + LetterReceiverContainer, + LetterWriteBottom, + LetterWriteContent, +}; diff --git a/src/pages/LetterWritePage/index.tsx b/src/pages/LetterWritePage/index.tsx index 5ac4fa1f..974bafd7 100644 --- a/src/pages/LetterWritePage/index.tsx +++ b/src/pages/LetterWritePage/index.tsx @@ -1,15 +1,13 @@ -// import { useState } from 'react'; -import Header from '@/components/Header'; import { CaretLeft } from '@/assets/icons'; +import Header from '@/components/Header'; import style from './styles'; -import LetterWriteContent from './components/LetterWriteContent'; -import LetterWriteBottom from './components/LetterWriteBottom'; +import { LetterWriteContent, LetterWriteBottom } from './components'; const LetterWritePage = () => { return (
} />
diff --git a/src/pages/LetterWritePage/styles.ts b/src/pages/LetterWritePage/styles.ts index 85730cc3..5bff8749 100644 --- a/src/pages/LetterWritePage/styles.ts +++ b/src/pages/LetterWritePage/styles.ts @@ -9,7 +9,7 @@ const style = { width: 100%; height: 100%; `, - headerStyle: css` + header: css` height: 2.5rem; margin-top: 1.25rem; margin-bottom: 1rem; From 74bb661ea49d973ef09708d0e63abd1105c78902 Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Fri, 2 Feb 2024 15:13:32 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=F0=9F=94=A8=20refactor:=20html=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LetterWritePage/components/AgeSlider.tsx | 8 +++--- .../components/ConcernSelect.tsx | 4 +-- .../components/GenderSelect.tsx | 4 +-- .../components/LetterPaper.tsx | 14 ++++------ .../components/LetterReceiverContainer.tsx | 4 +-- .../components/LetterReceiverSelect.tsx | 10 +++---- .../components/LetterWriteBottom.tsx | 18 +++---------- .../components/LetterWriteContent.tsx | 5 ++++ src/pages/LetterWritePage/index.tsx | 4 +-- src/pages/LetterWritePage/styles.ts | 27 +++++++++++++++---- 10 files changed, 50 insertions(+), 48 deletions(-) diff --git a/src/pages/LetterWritePage/components/AgeSlider.tsx b/src/pages/LetterWritePage/components/AgeSlider.tsx index c0329e68..125b517a 100644 --- a/src/pages/LetterWritePage/components/AgeSlider.tsx +++ b/src/pages/LetterWritePage/components/AgeSlider.tsx @@ -8,7 +8,7 @@ const AgeSlider = ({ value: number[]; handleChange: (e: Event, newValue: number | number[]) => void; }) => ( -
+

๋‚˜์ด

'Minimum distance'} @@ -21,10 +21,10 @@ const AgeSlider = ({ css={style.slider} />
-

{value[0]}์„ธ ์ด์ƒ

-

{value[1]}์„ธ ์ดํ•˜

+ {value[0]}์„ธ ์ด์ƒ + {value[1]}์„ธ ์ดํ•˜
-
+ ); export default AgeSlider; diff --git a/src/pages/LetterWritePage/components/ConcernSelect.tsx b/src/pages/LetterWritePage/components/ConcernSelect.tsx index 42a03a88..cdd38f34 100644 --- a/src/pages/LetterWritePage/components/ConcernSelect.tsx +++ b/src/pages/LetterWritePage/components/ConcernSelect.tsx @@ -3,7 +3,7 @@ import textStyles from '@/styles/textStyles'; import style from '../styles'; const ConcernSelect = ({ chipLabels }: { chipLabels: string[] }) => ( -
+

๊ณ ๋ฏผ

๊ณ ๋ฏผ์„ ์„ ํƒ์„ ํ•˜๋ฉด ๋‚˜์™€ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ๊ฐ€์ง„ ๋‚ฏ์„  ์นœ๊ตฌ์—๊ฒŒ ์ „๋‹ฌ๋ผ์š” @@ -15,7 +15,7 @@ const ConcernSelect = ({ chipLabels }: { chipLabels: string[] }) => ( ))}

-
+ ); export default ConcernSelect; diff --git a/src/pages/LetterWritePage/components/GenderSelect.tsx b/src/pages/LetterWritePage/components/GenderSelect.tsx index 870c2511..c3f9225a 100644 --- a/src/pages/LetterWritePage/components/GenderSelect.tsx +++ b/src/pages/LetterWritePage/components/GenderSelect.tsx @@ -2,13 +2,13 @@ import Chip from '@/components/Chip'; import style from '../styles'; const GenderSelect = () => ( -
+

์„ฑ๋ณ„

๋ชจ๋‘์—๊ฒŒ ๋ณด๋‚ด๊ธฐ ๋‚˜์™€ ๊ฐ™์€ ์„ฑ๋ณ„์—๊ฒŒ ๋ณด๋‚ด๊ธฐ
-
+ ); export default GenderSelect; diff --git a/src/pages/LetterWritePage/components/LetterPaper.tsx b/src/pages/LetterWritePage/components/LetterPaper.tsx index fa75108a..42cec4cf 100644 --- a/src/pages/LetterWritePage/components/LetterPaper.tsx +++ b/src/pages/LetterWritePage/components/LetterPaper.tsx @@ -3,17 +3,13 @@ import LetterCard from '@/components/LetterCard'; import { formatDate } from '@/utils/dateUtils'; import textStyles from '@/styles/textStyles'; import style from '../styles'; +import { BottomSheetProps } from './LetterWriteContent'; import { LetterReceiverContainer } from '.'; -interface LetterPaperProps { - isBottomSheetOpen: boolean; - toggleBottomSheet: (state: boolean) => () => void; -} - const LetterPaper = ({ isBottomSheetOpen, toggleBottomSheet, -}: LetterPaperProps) => { +}: BottomSheetProps) => { const [letterContent, setLetterContent] = useState(''); return ( @@ -33,11 +29,11 @@ const LetterPaper = ({ {letterContent}
-

{letterContent.length}

-

 / 300

+ {letterContent.length} +  / 300
-

{formatDate(new Date())}

+ {formatDate(new Date())}
); diff --git a/src/pages/LetterWritePage/components/LetterReceiverContainer.tsx b/src/pages/LetterWritePage/components/LetterReceiverContainer.tsx index 1bc63088..ed624387 100644 --- a/src/pages/LetterWritePage/components/LetterReceiverContainer.tsx +++ b/src/pages/LetterWritePage/components/LetterReceiverContainer.tsx @@ -9,9 +9,9 @@ const ReceiverContainer = ({ isOpen: boolean; }) => (
-

To.

+ To.
-

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

+ ๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?
diff --git a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx index 4d90ea6b..81ad044a 100644 --- a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx +++ b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx @@ -3,17 +3,13 @@ import BottomSheet from '@/components/BottomSheet'; import { ArrowClockWise } from '@/assets/icons'; import COLORS from '@/constants/colors'; import style from '../styles'; +import { BottomSheetProps } from './LetterWriteContent'; import { AgeSlider, GenderSelect, ConcernSelect } from '.'; -interface LetterReceiverSelectProps { - isBottomSheetOpen: boolean; - toggleBottomSheet: (state: boolean) => () => void; -} - const LetterReceiverSelect = ({ isBottomSheetOpen, toggleBottomSheet, -}: LetterReceiverSelectProps) => { +}: BottomSheetProps) => { const [value, setValue] = useState([17, 39]); const handleChange = (e: Event, newValue: number | number[]) => { @@ -37,7 +33,7 @@ const LetterReceiverSelect = ({ onClose={toggleBottomSheet(false)} onOpen={toggleBottomSheet(true)} > -
+

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

diff --git a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx index c0d7fa78..d354b91c 100644 --- a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx +++ b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx @@ -1,23 +1,11 @@ -import { css } from '@emotion/react'; import Navbar from '@/components/Navbar'; import Button, { buttonStyles } from '@/components/Button'; import { ImageSquare } from '@/assets/icons'; - -const styles = { - navbar: css` - padding-inline: 0; - `, - iconContainer: css` - flex-grow: 0; - margin-left: 0.75rem; - padding: 0.5rem 0.75rem; - border-radius: 0.5rem; - `, -}; +import style from '../styles'; const LetterWriteBottom = () => { return ( - + @@ -25,7 +13,7 @@ const LetterWriteBottom = () => { ๋‹ต์žฅ ๋ณด๋‚ด๊ธฐ diff --git a/src/pages/LetterWritePage/components/LetterWriteContent.tsx b/src/pages/LetterWritePage/components/LetterWriteContent.tsx index 9995e394..bd523cd2 100644 --- a/src/pages/LetterWritePage/components/LetterWriteContent.tsx +++ b/src/pages/LetterWritePage/components/LetterWriteContent.tsx @@ -1,6 +1,11 @@ import { useState } from 'react'; import { LetterPaper, LetterReceiverSelect } from '.'; +export interface BottomSheetProps { + isBottomSheetOpen: boolean; + toggleBottomSheet: (state: boolean) => () => void; +} + const LetterWriteContent = () => { const [isBottomSheetOpen, setIsBottomSheetOpen] = useState(false); diff --git a/src/pages/LetterWritePage/index.tsx b/src/pages/LetterWritePage/index.tsx index 974bafd7..6876c4e1 100644 --- a/src/pages/LetterWritePage/index.tsx +++ b/src/pages/LetterWritePage/index.tsx @@ -10,10 +10,10 @@ const LetterWritePage = () => { css={style.header} leftContent={} /> -
+
-
+
); }; diff --git a/src/pages/LetterWritePage/styles.ts b/src/pages/LetterWritePage/styles.ts index 5bff8749..bdc50989 100644 --- a/src/pages/LetterWritePage/styles.ts +++ b/src/pages/LetterWritePage/styles.ts @@ -13,6 +13,10 @@ const style = { height: 2.5rem; margin-top: 1.25rem; margin-bottom: 1rem; + + & > div:nth-of-type(1) { + cursor: pointer; + } `, contentWrapper: css` display: flex; @@ -25,7 +29,7 @@ const style = { display: flex; align-items: center; - p { + span { ${textStyles.t4}; } `, @@ -41,7 +45,7 @@ const style = { letter-spacing: -0.0035rem; cursor: pointer; - p { + span { color: ${COLORS.gray3}; ${textStyles.b4m}; } @@ -62,11 +66,11 @@ const style = { justify-content: flex-end; ${textStyles.c1m} - & > p:nth-of-type(1) { + & > span:nth-of-type(1) { color: ${COLORS.gray1}; } - & > p:nth-of-type(2) { + & > span:nth-of-type(2) { color: ${COLORS.gray4}; } `, @@ -77,6 +81,9 @@ const style = { ${textStyles.c1r} color: ${COLORS.gray4}; `, + bottomSheetContainer: css` + padding-inline: 1rem; + `, bottomSheetTitle: css` display: flex; justify-content: space-between; @@ -84,7 +91,7 @@ const style = { height: 2.75rem; h2 { - ${textStyles.t2} + ${textStyles.t2}; } svg { @@ -143,6 +150,7 @@ const style = { display: flex; button { + cursor: pointer; flex: 1; padding: 12px 20px; border: 0; @@ -159,6 +167,15 @@ const style = { color: white; } `, + navbar: css` + padding-inline: 0; + `, + iconContainer: css` + flex-grow: 0; + margin-left: 0.75rem; + padding: 0.5rem 0.75rem; + border-radius: 0.5rem; + `, }; export default style; From 0dd19df9749d0ffe634a272c4fae2e21e62e0a22 Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Fri, 2 Feb 2024 15:48:03 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=F0=9F=92=84=20design:=20AgeSlider=20?= =?UTF-8?q?=ED=88=B4=ED=8C=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LetterWritePage/components/AgeSlider.tsx | 4 +- .../components/LetterReceiverSelect.tsx | 2 +- src/pages/LetterWritePage/styles.ts | 37 ++++++++++++++++--- 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/pages/LetterWritePage/components/AgeSlider.tsx b/src/pages/LetterWritePage/components/AgeSlider.tsx index 125b517a..a9ce7018 100644 --- a/src/pages/LetterWritePage/components/AgeSlider.tsx +++ b/src/pages/LetterWritePage/components/AgeSlider.tsx @@ -11,13 +11,13 @@ const AgeSlider = ({

๋‚˜์ด

'Minimum distance'} + getAriaLabel={() => 'Age range'} value={value} onChange={handleChange} valueLabelDisplay="auto" disableSwap min={15} - max={50} + max={40} css={style.slider} />
diff --git a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx index 81ad044a..72808bdf 100644 --- a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx +++ b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx @@ -10,7 +10,7 @@ const LetterReceiverSelect = ({ isBottomSheetOpen, toggleBottomSheet, }: BottomSheetProps) => { - const [value, setValue] = useState([17, 39]); + const [value, setValue] = useState([17, 25]); const handleChange = (e: Event, newValue: number | number[]) => { setValue(newValue as number[]); diff --git a/src/pages/LetterWritePage/styles.ts b/src/pages/LetterWritePage/styles.ts index bdc50989..f41898d3 100644 --- a/src/pages/LetterWritePage/styles.ts +++ b/src/pages/LetterWritePage/styles.ts @@ -103,7 +103,7 @@ const style = { ${textStyles.t3}; `, slider: css` - color: #0c8ce9; + color: ${COLORS.primary}; .MuiSlider-rail { color: ${COLORS.gray5}; @@ -115,6 +115,31 @@ const style = { border: 1px solid ${COLORS.gray4}; background: ${COLORS.gray6}; } + + .MuiSlider-valueLabel { + width: 1.5rem; + height: 1.5rem; + padding: 0; + border-radius: 50% 50% 50% 0; + background: unset; + background-color: ${COLORS.primary}; + font-size: 0.8rem; + line-height: 1.5; + transform: translate(50%, -100%) rotate(-45deg) scale(0); + transform-origin: bottom left; + + &::before { + display: none; + } + + &.MuiSlider-valueLabelOpen { + transform: translate(50%, -100%) rotate(-45deg) scale(1); + } + + & > * { + transform: rotate(45deg); + } + } `, age: css` display: flex; @@ -122,8 +147,8 @@ const style = { margin-bottom: 1rem; color: ${COLORS.gray3}; font-weight: 500; - font-size: 12px; - line-height: 24px; + font-size: 0.75rem; + line-height: 1.5rem; `, genderChip: css` display: flex; @@ -136,8 +161,8 @@ const style = { color: ${COLORS.gray1}; font-weight: 700; font-style: normal; - font-size: 12px; - line-height: 16px; + font-size: 0.75rem; + line-height: 1rem; } `, concernChip: css` @@ -152,7 +177,7 @@ const style = { button { cursor: pointer; flex: 1; - padding: 12px 20px; + padding: 0.75rem 1.25rem; border: 0; ${textStyles.t3} } From 65423f30ae150da099def26a228f3fe752c2675c Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Fri, 2 Feb 2024 16:32:26 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=F0=9F=9A=91=20fix:=20=EB=B9=8C=EB=93=9C?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/LetterWritePage/components/LetterPaper.tsx | 3 +-- src/pages/LetterWritePage/components/LetterReceiverSelect.tsx | 1 + src/pages/LetterWritePage/styles.ts | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pages/LetterWritePage/components/LetterPaper.tsx b/src/pages/LetterWritePage/components/LetterPaper.tsx index 42cec4cf..bca3238a 100644 --- a/src/pages/LetterWritePage/components/LetterPaper.tsx +++ b/src/pages/LetterWritePage/components/LetterPaper.tsx @@ -1,7 +1,6 @@ import { useState } from 'react'; import LetterCard from '@/components/LetterCard'; import { formatDate } from '@/utils/dateUtils'; -import textStyles from '@/styles/textStyles'; import style from '../styles'; import { BottomSheetProps } from './LetterWriteContent'; import { LetterReceiverContainer } from '.'; @@ -22,7 +21,7 @@ const LetterPaper = ({ rows={15} autoFocus placeholder="ํ•˜๊ณ ์‹ถ์€ ์ด์•ผ๊ธฐ๋ฅผ ์ ์–ด๋ณด์„ธ์š”." - css={[style.textarea, textStyles.l1m]} + css={style.textarea} value={letterContent} onChange={(e) => setLetterContent(e.target.value)} > diff --git a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx index 72808bdf..e6497a54 100644 --- a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx +++ b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx @@ -13,6 +13,7 @@ const LetterReceiverSelect = ({ const [value, setValue] = useState([17, 25]); const handleChange = (e: Event, newValue: number | number[]) => { + console.log(e.target); setValue(newValue as number[]); }; diff --git a/src/pages/LetterWritePage/styles.ts b/src/pages/LetterWritePage/styles.ts index f41898d3..18c92c0d 100644 --- a/src/pages/LetterWritePage/styles.ts +++ b/src/pages/LetterWritePage/styles.ts @@ -60,6 +60,7 @@ const style = { background: none; outline: none; resize: none; + ${textStyles.l1m} `, textCount: css` display: flex; From 5af6b65ac1a878e02401602cdaab8683a5d03a1a Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Fri, 2 Feb 2024 16:36:13 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=F0=9F=9A=91=20fix:=20=EB=B9=8C=EB=93=9C?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95-=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=9D=B8=EC=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/LetterWritePage/components/LetterWriteBottom.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx index d354b91c..ab7cf48c 100644 --- a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx +++ b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx @@ -13,7 +13,10 @@ const LetterWriteBottom = () => { ๋‹ต์žฅ ๋ณด๋‚ด๊ธฐ From 34b8bb8e814e282bc189dc20f6a2a61bfba6c01f Mon Sep 17 00:00:00 2001 From: easyhyun00 Date: Fri, 2 Feb 2024 18:12:56 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=F0=9F=94=A8=20refactor:=20Button=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EB=B0=8F=20=ED=95=A8=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/LetterWritePage/components/AgeSlider.tsx | 6 +++--- .../components/LetterReceiverSelect.tsx | 2 +- .../LetterWritePage/components/LetterWriteBottom.tsx | 11 +++-------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/pages/LetterWritePage/components/AgeSlider.tsx b/src/pages/LetterWritePage/components/AgeSlider.tsx index a9ce7018..299bbb96 100644 --- a/src/pages/LetterWritePage/components/AgeSlider.tsx +++ b/src/pages/LetterWritePage/components/AgeSlider.tsx @@ -3,17 +3,17 @@ import style from '../styles'; const AgeSlider = ({ value, - handleChange, + onChange, }: { value: number[]; - handleChange: (e: Event, newValue: number | number[]) => void; + onChange: (e: Event, newValue: number | number[]) => void; }) => (

๋‚˜์ด

'Age range'} value={value} - onChange={handleChange} + onChange={onChange} valueLabelDisplay="auto" disableSwap min={15} diff --git a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx index e6497a54..dbca514e 100644 --- a/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx +++ b/src/pages/LetterWritePage/components/LetterReceiverSelect.tsx @@ -39,7 +39,7 @@ const LetterReceiverSelect = ({

๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ผ๊นŒ์š”?

- +
diff --git a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx index ab7cf48c..2d1e4f16 100644 --- a/src/pages/LetterWritePage/components/LetterWriteBottom.tsx +++ b/src/pages/LetterWritePage/components/LetterWriteBottom.tsx @@ -1,5 +1,5 @@ import Navbar from '@/components/Navbar'; -import Button, { buttonStyles } from '@/components/Button'; +import Button from '@/components/Button'; import { ImageSquare } from '@/assets/icons'; import style from '../styles'; @@ -12,14 +12,9 @@ const LetterWriteBottom = () => { - + ); };