From 26a43806790ab15b346d4d62b2ea9b8adbb730c4 Mon Sep 17 00:00:00 2001 From: BadLice Date: Tue, 18 Oct 2022 11:02:57 +0200 Subject: [PATCH 1/4] using reducer now --- .gitignore | 17 +++ .vscode/launch.json | 15 ++ README-template.md | 112 ++++++++++++++ README.md | 99 ++++++++---- design/active-states.jpg | Bin 0 -> 27791 bytes design/desktop-design.jpg | Bin 0 -> 27436 bytes design/desktop-preview.jpg | Bin 0 -> 26414 bytes design/mobile-design.jpg | Bin 0 -> 12073 bytes package-lock.json | 254 +++++++++++++++++++++++++++++++ package.json | 2 + public/images/bg-stars.svg | 1 + public/images/favicon-32x32.png | Bin 0 -> 1063 bytes public/images/icon-facebook.svg | 1 + public/images/icon-instagram.svg | 1 + public/images/icon-pinterest.svg | 1 + public/images/pattern-hills.svg | 1 + public/index.html | 44 +++--- src/App.css | 38 ----- src/App.tsx | 139 ++++++++++++++--- src/flip.counter.tsx | 146 ++++++++++++++++++ src/hooks/useTime.tsx | 192 +++++++++++++++++++++++ src/index.css | 13 -- src/index.tsx | 12 +- src/timer.tsx | 59 +++++++ style-guide.md | 41 +++++ tsconfig.json | 43 +++--- 26 files changed, 1080 insertions(+), 151 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 README-template.md create mode 100644 design/active-states.jpg create mode 100644 design/desktop-design.jpg create mode 100644 design/desktop-preview.jpg create mode 100644 design/mobile-design.jpg create mode 100644 public/images/bg-stars.svg create mode 100644 public/images/favicon-32x32.png create mode 100644 public/images/icon-facebook.svg create mode 100644 public/images/icon-instagram.svg create mode 100644 public/images/icon-pinterest.svg create mode 100644 public/images/pattern-hills.svg delete mode 100644 src/App.css create mode 100644 src/flip.counter.tsx create mode 100644 src/hooks/useTime.tsx delete mode 100644 src/index.css create mode 100644 src/timer.tsx create mode 100644 style-guide.md diff --git a/.gitignore b/.gitignore index 4d29575..2d6322f 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,20 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +# Avoid accidental upload of the Sketch and Figma design files +##################################################### +## Please do not remove lines 5 and 6 - thanks! :) ## +##################################################### +*.sketch +*.fig + +# Avoid accidental XD upload if you convert the design file +############################################### +## Please do not remove line 12 - thanks! :) ## +############################################### +*.xd + +# Avoid your project being littered with annoying .DS_Store files! +.DS_Store +.prettierignore \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..f594353 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "msedge", + "request": "launch", + "name": "Launch Edge against localhost", + "url": "http://localhost:3000", + "webRoot": "${workspaceFolder}" + } + ] +} diff --git a/README-template.md b/README-template.md new file mode 100644 index 0000000..ceedd95 --- /dev/null +++ b/README-template.md @@ -0,0 +1,112 @@ +# Frontend Mentor - Launch countdown timer solution + +This is a solution to the [Launch countdown timer challenge on Frontend Mentor](https://www.frontendmentor.io/challenges/launch-countdown-timer-N0XkGfyz-). Frontend Mentor challenges help you improve your coding skills by building realistic projects. + +## Table of contents + +- [Overview](#overview) + - [The challenge](#the-challenge) + - [Screenshot](#screenshot) + - [Links](#links) +- [My process](#my-process) + - [Built with](#built-with) + - [What I learned](#what-i-learned) + - [Continued development](#continued-development) + - [Useful resources](#useful-resources) +- [Author](#author) +- [Acknowledgments](#acknowledgments) + +**Note: Delete this note and update the table of contents based on what sections you keep.** + +## Overview + +### The challenge + +Users should be able to: + +- See hover states for all interactive elements on the page +- See a live countdown timer that ticks down every second (start the count at 14 days) +- **Bonus**: When a number changes, make the card flip from the middle + +### Screenshot + +![](./screenshot.jpg) + +Add a screenshot of your solution. The easiest way to do this is to use Firefox to view your project, right-click the page and select "Take a Screenshot". You can choose either a full-height screenshot or a cropped one based on how long the page is. If it's very long, it might be best to crop it. + +Alternatively, you can use a tool like [FireShot](https://getfireshot.com/) to take the screenshot. FireShot has a free option, so you don't need to purchase it. + +Then crop/optimize/edit your image however you like, add it to your project, and update the file path in the image above. + +**Note: Delete this note and the paragraphs above when you add your screenshot. If you prefer not to add a screenshot, feel free to remove this entire section.** + +### Links + +- Solution URL: [Add solution URL here](https://your-solution-url.com) +- Live Site URL: [Add live site URL here](https://your-live-site-url.com) + +## My process + +### Built with + +- Semantic HTML5 markup +- CSS custom properties +- Flexbox +- CSS Grid +- Mobile-first workflow +- [React](https://reactjs.org/) - JS library +- [Next.js](https://nextjs.org/) - React framework +- [Styled Components](https://styled-components.com/) - For styles + +**Note: These are just examples. Delete this note and replace the list above with your own choices** + +### What I learned + +Use this section to recap over some of your major learnings while working through this project. Writing these out and providing code samples of areas you want to highlight is a great way to reinforce your own knowledge. + +To see how you can add code snippets, see below: + +```html +

Some HTML code I'm proud of

+``` +```css +.proud-of-this-css { + color: papayawhip; +} +``` +```js +const proudOfThisFunc = () => { + console.log('🎉') +} +``` + +If you want more help with writing markdown, we'd recommend checking out [The Markdown Guide](https://www.markdownguide.org/) to learn more. + +**Note: Delete this note and the content within this section and replace with your own learnings.** + +### Continued development + +Use this section to outline areas that you want to continue focusing on in future projects. These could be concepts you're still not completely comfortable with or techniques you found useful that you want to refine and perfect. + +**Note: Delete this note and the content within this section and replace with your own plans for continued development.** + +### Useful resources + +- [Example resource 1](https://www.example.com) - This helped me for XYZ reason. I really liked this pattern and will use it going forward. +- [Example resource 2](https://www.example.com) - This is an amazing article which helped me finally understand XYZ. I'd recommend it to anyone still learning this concept. + +**Note: Delete this note and replace the list above with resources that helped you during the challenge. These could come in handy for anyone viewing your solution or for yourself when you look back on this project in the future.** + +## Author + +- Website - [Add your name here](https://www.your-site.com) +- Frontend Mentor - [@yourusername](https://www.frontendmentor.io/profile/yourusername) +- Twitter - [@yourusername](https://www.twitter.com/yourusername) + +**Note: Delete this note and add/remove/edit lines above based on what links you'd like to share.** + +## Acknowledgments + +This is where you can give a hat tip to anyone who helped you out on this project. Perhaps you worked in a team or got some inspiration from someone else's solution. This is the perfect place to give them some credit. + +**Note: Delete this note and edit this section's content as necessary. If you completed this challenge by yourself, feel free to delete this section entirely.** diff --git a/README.md b/README.md index b87cb00..f30a067 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,93 @@ -# Getting Started with Create React App +# Frontend Mentor - Launch countdown timer -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +![Design preview for the Launch countdown timer coding challenge](./design/desktop-preview.jpg) -## Available Scripts +## Welcome! 👋 -In the project directory, you can run: +Thanks for checking out this front-end coding challenge. -### `npm start` +[Frontend Mentor](https://www.frontendmentor.io) challenges help you improve your coding skills by building realistic projects. -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. +**To do this challenge, you need a good understanding of HTML, CSS and JavaScript.** -The page will reload if you make edits.\ -You will also see any lint errors in the console. +## The challenge -### `npm test` +Your challenge is to build out this countdown timer and get it looking as close to the design as possible. -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +You can use any tools you like to help you complete the challenge. So if you've got something you'd like to practice, feel free to give it a go. -### `npm run build` +Your users should be able to: -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. +- See hover states for all interactive elements on the page +- See a live countdown timer that ticks down every second (start the count at 14 days) +- **Bonus**: When a number changes, make the card flip from the middle -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! +Want some support on the challenge? [Join our Slack community](https://www.frontendmentor.io/slack) and ask questions in the **#help** channel. -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. +## Where to find everything -### `npm run eject` +Your task is to build out the project to the designs inside the `/design` folder. You will find both a mobile and a desktop version of the design. -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** +The designs are in JPG static format. Using JPGs will mean that you'll need to use your best judgment for styles such as `font-size`, `padding` and `margin`. -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. +If you would like the design files (we provide Sketch & Figma versions) to inspect the design in more detail, you can [subscribe as a PRO member](https://www.frontendmentor.io/pro). -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. +You will find all the required assets in the `/images` folder. The assets are already optimized. -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. +There is also a `style-guide.md` file containing the information you'll need, such as color palette and fonts. -## Learn More +## Building your project -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). +Feel free to use any workflow that you feel comfortable with. Below is a suggested process, but do not feel like you need to follow these steps: -To learn React, check out the [React documentation](https://reactjs.org/). +1. Initialize your project as a public repository on [GitHub](https://github.com/). Creating a repo will make it easier to share your code with the community if you need help. If you're not sure how to do this, [have a read-through of this Try Git resource](https://try.github.io/). +2. Configure your repository to publish your code to a web address. This will also be useful if you need some help during a challenge as you can share the URL for your project with your repo URL. There are a number of ways to do this, and we provide some recommendations below. +3. Look through the designs to start planning out how you'll tackle the project. This step is crucial to help you think ahead for CSS classes to create reusable styles. +4. Before adding any styles, structure your content with HTML. Writing your HTML first can help focus your attention on creating well-structured content. +5. Write out the base styles for your project, including general content styles, such as `font-family` and `font-size`. +6. Start adding styles to the top of the page and work down. Only move on to the next section once you're happy you've completed the area you're working on. + +## Deploying your project + +As mentioned above, there are many ways to host your project for free. Our recommend hosts are: + +- [GitHub Pages](https://pages.github.com/) +- [Vercel](https://vercel.com/) +- [Netlify](https://www.netlify.com/) + +You can host your site using one of these solutions or any of our other trusted providers. [Read more about our recommended and trusted hosts](https://medium.com/frontend-mentor/frontend-mentor-trusted-hosting-providers-bf000dfebe). + +## Create a custom `README.md` + +We strongly recommend overwriting this `README.md` with a custom one. We've provided a template inside the [`README-template.md`](./README-template.md) file in this starter code. + +The template provides a guide for what to add. A custom `README` will help you explain your project and reflect on your learnings. Please feel free to edit our template as much as you like. + +Once you've added your information to the template, delete this file and rename the `README-template.md` file to `README.md`. That will make it show up as your repository's README file. + +## Submitting your solution + +Submit your solution on the platform for the rest of the community to see. Follow our ["Complete guide to submitting solutions"](https://medium.com/frontend-mentor/a-complete-guide-to-submitting-solutions-on-frontend-mentor-ac6384162248) for tips on how to do this. + +Remember, if you're looking for feedback on your solution, be sure to ask questions when submitting it. The more specific and detailed you are with your questions, the higher the chance you'll get valuable feedback from the community. + +## Sharing your solution + +There are multiple places you can share your solution: + +1. Share your solution page in the **#finished-projects** channel of the [Slack community](https://www.frontendmentor.io/slack). +2. Tweet [@frontendmentor](https://twitter.com/frontendmentor) and mention **@frontendmentor**, including the repo and live URLs in the tweet. We'd love to take a look at what you've built and help share it around. +3. Share your solution on other social channels like LinkedIn. +4. Blog about your experience building your project. Writing about your workflow, technical choices, and talking through your code is a brilliant way to reinforce what you've learned. Great platforms to write on are [dev.to](https://dev.to/), [Hashnode](https://hashnode.com/), and [CodeNewbie](https://community.codenewbie.org/). + +We provide templates to help you share your solution once you've submitted it on the platform. Please do edit them and include specific questions when you're looking for feedback. + +The more specific you are with your questions the more likely it is that another member of the community will give you feedback. + +## Got feedback for us? + +We love receiving feedback! We're always looking to improve our challenges and our platform. So if you have anything you'd like to mention, please email hi[at]frontendmentor[dot]io. + +This challenge is completely free. Please share it with anyone who will find it useful for practice. + +**Have fun building!** 🚀 diff --git a/design/active-states.jpg b/design/active-states.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18d53f4cd60e9c4adc3836c659bf862679bba9f5 GIT binary patch literal 27791 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 literal 0 HcmV?d00001 diff --git a/design/desktop-design.jpg b/design/desktop-design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfef59b6567d48840a5888b313c2a7c1e0c94bc4 GIT binary patch literal 27436 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 V2DK%hPP7SdrUvcRQu%2}>_mkwdY z`z<{YG{_N>1R6SK4tGAul< znN%WK$?VbY=J$kqvH}G;fqA<_UPitdyTb@cSEr#shf!tODJX0`T_XjhH-k4#;kbNn zg3%SfJ~y>HQGF}seTb8@e(+fzaX-@eq&~f3XvV~}p_4V(;|HbPG3-txSdD2=9@L4b zPx2858gB8UuYQ`K{8#4=Ug0#+H8Ek)l>+K$Xa5XY7!}C(lH=Xub}s#Qkal#auYTJ?<8LpAsEE6M90kx=`hi@8_tibqmngp-- z(8#8xLw$Pl{#%HX=R+iEqO%}G0ind?%lB@-gyG7Q=oNTvbO}Wl70qGGg@k!4oaLQ0`)mSDlIgMH@p)f%N_*R` zL|R5oCp4VzGPP~ni}nqKXj??3<8vr|M2x5gJA!>==WgCt=~+W0`=Oyh$8Q_$+V$kgdTN2?$NvwHf8_Ac~&BO1=dffkA8?{a>G0 z$9}t*(l7F^as@U~h#{p@>%V%_WBnc#5o0+xs^tiEXtcVH3l4D~)(!=vqqXp)7QL>I|n45_bdy z>r?BusR}AGp@aist{|-v{Wb%e37q^Ze=#r!S`+~IKB-r;sh_P3J`tS~XoD67L0q*S zz)@eLM|Ts#D6xL{(I({CQi-ajK+60RNJf(q>^Noup`Bq>efeBTbcU5p@i{v8_!8=` zM*rG|2=VBn$SqMySwypoIVwkd-O8#JDt&}rGOH?xUA5W)Y#_q;EMQVEqbQpe-wCurz|>lDLM=?VAQ5JRU*>IoIiJWR-j zct?R0f}#xo&OGBqgW(?^t#g)=lo+}~{~Cpq=p|N4&W5@e zN~bCsRZ>5u6uV5@ZUv7w`50LF9$KR7R2nw$@1l}6TX zSv4n~vs5gVH0s+qEqTiOw%zWuPc;G1Ic+M|Rjq+sqd!7wg`Yi(#)45;Q;km6Bs=dao#b zK+(>X4GDtsP?BTCf%dv7P2|7|X`N6HP8!H1@%&^>3`JPG+UHFvMM;xjKW4Yl9Kr`H9kx`t`d|t;+Ek(<(#W4|WManJca2hF2pkXwSe*L!QO^RmO09jiM zE23a$5NJPD-4H?e}WyFL9pXc>cF`GBSe@9mM z&|$k96i!#ZZ=;wc z?$jtvWKZh{CVs(CoP@2LM&dkKnCjT@Wy7nT zF{pcjx5_^O$j32NQ~(MD24G+wKY9fH2n_i$4EZ<)K%>E+lQ1ixVh{_zg2g0NR5q}C zpWV*HBBXEo#xG_Jj!Z;F)jp@H8cW?bPE^g%C_1*XW|Z}F2f0H+R_z~O%pM5>M+D{M z?!K`da5^QPW8pbih@fRpExKO9Eb@x>sa+zDWOj1ZhdsvpvbpP)2Z2%s# z=z!emmbG=Wq14LDX8hRhutzEMEpR9(9yufgrgy0D9C(pe2(0qtM=)ZjLfJ(ac5fTU zNQ!i8F6;YrJ^c);kMOjOurcAa8ZWtS_YG4O6l#5dEt9~T3WN$p`S!TyG9>M^_5$8N zfvsIv@4acxBL(iko0o%2-y+2&Lk^RjW5nVSous}>XpBpXT#27b>q{A<(K$#Oy((D@ zHUCVu2#vR}M(KoBpy_s#%&A|hDaM<9E0yfl49~mCx3Oog+*yAmApG=m7jXg@3(2>? zVwK&@ipO-DRK}mZPt>29!mf0y6gOw;Yu}vK2I(ECh}ehuI2r9ZEsD$P+A1SM_VHcl zLlnxe(Jl(1?R1hStJ;J*a34jcjxBO4WwE_;V-l6cokPVu_9>j6)>iQbsE`LeMtC}z zeQNU)hz@-pivNQ&R6=qcy^KQF_%JDPZjp^K#TC6zHC=aRL2R5-(F#|UuaW0bN$Ek# z?1z+fl7Z0oJ&HGARXNNN$3+bmW&Z|uC>-NRtNR112W|qDvPK7PNJCF;-jQy z%G_c_&^_cYSkCck>-`wmVq0QD9p6<1lUN2WRtZZ+dF7Vn)YWO&h8o3x6ER+^5O;(~-+wA^Kp&MgHGOoDkk-=t?7VPAq8ykFGMY;n_*IvIR1%VQN z2d#T5PALXMcvYb*c~30Ogi|*udZ|)w(v`R!Qe#tq@@Cl6NkqkM1k)8abQ-bZkZ7K7 zNfnc&%^ZzZ2(xSsB_DjBd%btDbbszKNabZ?Vp-Cz_Ti%)9+dpDQ~`LxS7Q;3xFwL+gZLOPBo)HU_P8 zH1o9Hgrvv0pTB<}>kQHzrbtun8WP1?pKv~rM7ieV)~na1^}_eUK{QB$W=S82%q=cl z$&J)SzewN1To@Xv6ot2%J6JsR9{dZ~=( z=>gA8l!Yaz9{P9i6)U;@Bg{uR=w&$0oWq+Fk^QoBe4Do+wpG{A6Vm#12ZYF`nd2G! z-gaI*72*PuFnByafsY(Fn~&0STo*ECj7dYNq|J1iDlO`pbC#YG#*VV~N&4#-F*!CQSlW$!;b86n$^9H@i5lfrrC z=&n8gqH9eCDKY0U{1j)Sb01ysl4HSGc=!1ogP9k}d&ry5(7FuF%H(~wi|Dil(;jk0 zCK$7Z(*PbyLhD66F!}dbSx-0k*)oe;JEG&1n_^8D{@gsjN#oJ6LCbO+Nxwo;2{_Z@ zHxAHH8(bzk3FtV!?spfadet<=-HpSSiAa5-2W&B5E@k-+%I5`Sm> zWN{pY;sk59f9e&$tQqE7OGp{rPnc7+KhewA`1+)wdz@2w5cXXieI)cq?sKsM{8Yz@ z9?Dh*)(f4ih)OS#Y~zm@Ns>N1N)*UfQPt+JoEj)RXin#6UGAdmX6av_Q>B=oOk4^R z*6J;8FFw8^81lHC+e|gF!+2gwLZz(cP?d|WJ-aRQk=Tcp>w}R>eK2ML+y2@K?tvP6 z1}S4;mf=reE_^q1yirBgbdko)`9kUIf|Mf((-$Kx)gCF`9Q9bXsvv3B=L8<;0#0J# zVKafj9}x9N>sUaY@86Bl4yCA1^1iR`nbuVRAYb=ugX~rku1ax#0>;?G*H4*|Q<~~V zN6mPXR|EC=z7Seljfp#yY^(FUx_%!fy0mpI^KmtJ9>nqSO&G3dq$OuuZw_16sk>7a z$kHIBnbIx~<1Wp#VX}c~$3UB?+ zBb>E3ySFv!36%%c5+c!Gdk#M{P()0#kaER0JffUAuEji_GcBdFapDoe`d}2&P6Eb) zo?g3dOuZ#Ol0ZvOAfq5#V1Bw2Ix?L?BwT|Uyw6zILk>n(*rfdG;pP!{5G7OQUtNtH zf=NnvSs&b07VzTB{JUwpD-GeL=gu#WEn3Dz3xt$HHj6FhOR;kpyC$Nw#bag2qy0t^ zC6B@_eC1q3^BoEO=^kroJqnj}ZFlo6;dv_aiNm+fz#A6u zL19Dc;!_u-!J2nNCD9d5T)T60$98Ulj*SB3@P`tZN9aMsux^HZPQELpFcE>_uuBrN z7Q638(vqBaT?#f6$Df<&codGos3*iy_QK;7P)6KEnR*P&Bh-k+F^P~mIYlgBx{tam zcT3JJUJP!flWu@arO_~Q60Mqr3UmEdzN#kTDuvcq2We?ZE(qgdEg&{3NNF;npZB75 z+#ZWta z?}>(@HmQVjaI8O~FtV8CN=Z!(#uhv-W6Cjg48c3YsFT;+M5VOcxwWHsE)q-f(Y{8e z`zBhN#0DS(?ALPIOY_>4A@#L1?lIkr&GLKlWNxs0w6$Z{98uZU3?f?OHk8d};mG8! zUzlp*K81}nsvpSA!+owfcVWe4mxO*pYeJ`~Ro3Sy(WFP8*65g)_i zCOX@{4}K}XIqaC;FI7H}HR+axJh#CVi&~OA*Cec>`$geBBilPtD>BETC_-V-GzuMW z`IZF%1NuN`to)c%DLUJC`#IIh#!4;*T&D>K9M57n{HI9X@+MW|E{8k#VH0AJd}rts z34Kw-`f8m?oJsZQ3U;h%HL;RT$x*o})niG5^Uh4dHeZ#VQx-<0^?KV&-ZaXj4sD)> zu1d~!_3G zm`2N9Xy_%mSY!pE_6OI)Jx0`B(y?4bhYKL;_P65V9m1mAy^}aZ%MG7tx~{I~@2 zpkL$MEY6RmRVUmY=x@SQ;H@!{aMePxH zdjwjkF8~HW9cxPQ2Je0OP)2jAqk(>cJtDq!Hw;B|P5rmKM9iap7``(z3i*G5FatWn zwKQIT_7>aQ1dKzd2uXR0CzY?+pH=_UjV%O#hs`egETJp2H}Prkw_9e>Tlg)cybtZC zs(+LJ1MD|;bPDVv76|*{++6SVe{?g|kM!*=WIp?E9LO&cgMdlh&dAnO{Ggu3_AO`6 zu=1SAV}?zBq#s12yO*n*j(kg)my0NzTPQgJ0M|2bJqCyk3>~TyPtHQsFWcs%erJPwxh-?&pL* zAdho9k3>cWK_Q}T!+o>7oOuzApB`bay1e%qw#MaXXCPRdZGUW);Zxjujl-hv#EjmBlqZ`u*(dx3o|f7RRy^F z1~8`ISG#@`EhU>_Rv|fgzPZjlh8mCu@TE%ezUeqO<(eGWBZ&_5^$;*t)%!`|_QiFq z^$+h_!KAIBGS634mh5S+hHzhIAh4oB@=(SYf6_-DjX^OuKjNz_30_4EXMx{`ee+$y zlh5NakM~pWnzGd^FI9!9)^C`h!C5eBIDjowUI@+s;xa}rUbkncG#Ab$^A*DZ8$5Be z@cMl}3j4RsZe)r7nBnS=X&O}`SIYXFO|8hSru1M_b||-I|hylyzuLC#@`*9y9$$#s4tXHoeOJf2{V?)A;7ie$V4>QOPZ4e? zA|BfbNbX?;H8y3CKUyPWf{AL1J43mdw2$5}n$+E!=ZUvsHx*NnFBt1{UOrU%qp_Vu z#98w3Q9^{(pGw5LDlgV47!*K7;^CX=deP=assz5{Q<%e*BCOzs<=$F}zH+iVD1>6E zKyZw}L2 zk2*)EV$EpU3822eC*5$GAQZ-|j;8y&Z_t9<%TSUTJ#(J9@eJ=_w4oD=6hPBJ2orHQPhsc&`eVCSUBdSC%dl zzm`XCiwbLVnjGjWVv(W-z>oCflGaBHWK=X%dnVakK*8)i6rz_ojh( z|6ZyMPZr(-C51cj!o*;s-1@r_@l#DTfH2V*>y>Ba<|_SYwO1F6o&u?f+M7wli1s(y zi7ugP9Vp=MgvduCX3xV<#M>ViS_Oh|;UX=hbhRsRX;`Swiei-X7C{aD66l%Yswv<5 zpIU-QjAB6hBp@sYZpd~*<#4>un!axrqxhS6H?$?#+2L2+{%k8(v=Qabvwv)>f*#Pk z8Ik|ps~*AExy{kyfwg36E|yNTfpc=E>9p96N*C49Ark@&rY)4g^|px))@{_tEK+n2 zom*_NTZ_u&K=5K&C8One!KRu4i`{LJqP9m;*P72*4n$4kDD zq4Ur?!YLeJ8$`Ry^avB%oH1wBV$vq_G(`QIh`Qq3t!81o5-*Xr%3`z~!LR&<-o6z9 z9VeY?x=WD8Amv)d)Z-fAoINA+d%G+aRE*~9dsQgXjc6VW>?no4mMqIBHQ@Oi9>^Cy zSC0<=LAW92;}z#IZDB)=gr`#lg~J7?fAhML(4;j7d&8N%r5YuweZh?nPM1mSImNsC zOyo8G29P*TioJ0=VtqvH;9kN&ng0lf7DI8vM2}@K7Vknv5 zr$+l5!R==^d{lP{!Sw?B@QP#eBsD9>?3hb-MT$?OnetRy>HfgR~B^@bt1X!A8r0R znyL$qhzus-k(NqdL>*J%6Uo;?J*y>n>QXs4k*+<+aNth$_zcbVA0ap*-lGhPB}|=6 z1vK5>FA62Gc{O;K_KulYFdy+;vJ@N!ifePWLt7fXYKT9>8|xj6yRuE!7s#pmU{O4% z3|;bG4RnlcLl)$>_yqo)wSGXX_pzJjPryZV;Np~-UVZ$;uFZwj7oTB{~lM=+FY zutwVsH#FWj3(T@ryP$VP4#nUIG<}ufqf83%0|^wE6bIT42M+r+Pdw~I6Zo*s%C=H1 z#yns_rt^|)5Ubpf)hNRhD&UCPYcj7YJ#mI=KGz0uLyBO1A(HYP{5KJyAp}n4$Z=Wq zr3_YGuCFq&PS`b*X$t0{SfpRN!1|M4Ml7V{tn*LFg{iNC=`@aY3+4w&9fYprr9Qw1 zzgH7#11y2Zwk8d!rB5ruVWbSw$23q4Q_sZwYME03{tqm*jZ)Rg3Ne*cK|0)FEQ;8^v~By zZ7W=d>_apC(p>+jtL zq%R^!%h}1+rKyLM6dsRdwxu4b$KOFO`PJkfQr=*F5PZYATpa1mwO>oH!=t~8aiy;k zVijgwx;EGHLH>-5vdX)~XmV@i>r?{kn+8dfRFvDJ^A(b7D>nhoTVG^9#-BS7l2c0RF> zSUknawA@jmR@_0gtB=>?Me7_ocHSYN#hhvRc~Csn z#qGbKzcLc>g}`fCpw+yYmLEnH05i1O2L`v>eM_vfls6`XzW5> zQ6-2fD9bzM}X6yw{f zNGpSx&b9q+V<;&uz$s;v^AS{DQ+i;GYZbTzE>}ZWi)jp*rNV+yUPI5@t}#hnaxtbG zDj!-sB;o(7<13(|YP+@v1{fNKF3Dj4=@=Lqq(vHOkY%Dab?(}0pL6cB_Sx&+*WT%U5G>1ku_-x`#2WdE)P+u9 z{O0a@pDqvK@8(knnHVn!vU-c&m?+1oi@nM|-86pTUfjt3w<^`ebdk@Uh91y-p#_!7 zxAd$jRX~#bl%}boIQoS`on*rri1qTiD>YVRX((3=1!>*W*G9A2*M^|B%)hKhQbM7k zl?f+UvC^~34Lj;mKLSn}YDIf2s+D8J6RzmOjjnrAq3;rWg5uYXH7bGpt-^X-k__0! zeg`iNEfx;R@4>?DIHV_2%*0LEg0_Sm9-JQm$<4Ql?NjI~i-@T?Y;ZhSfQ%ZDcxte! zrtmBPyUr!0L|(B-RHSXZj?cG;sDN+*3Gh0kSt&rCYf;xSQ#2qSN-Mq5F%P88aSRze6L6&4yGTdI#a@W=H^nu zu%z;9=iDU--~Z*MrUJ=As2fo9AHEnY7UVnP^Qcysc7g+45zVRGx6&y(o3V5dL-2C<%r`=<^P^-ZMnnp4G> z2g68|lQEmotrH9if|kQ&4@%G6QKvBPp(6mfCvW>R0FXx2Bb+4uJk2h&T5hEngvX!dTGs{y)u^Xy9LZi zmmATGzP2Y;kla3}UkUSRiRtJ2L<6(-ZI&mFu0Z9G*GDg9a(BAq2`TF!3%no9Sg%iH_GKiaXFvl_={GP6Ql zDA~(}hZCiRP&ZD<8$JDQym&N0Cj3){*^eeVg|K4v4NA6z#juKohOWD)4hCGbQ=%#E z=iOd1Fx8w+hUMS3zWwZmporTe17Z#SdMpqh4Oj^Ufi~XJm>3%gcRVK=unddDIbd0d z;IWs)ic$d()!O29rv1K4*A@6)rcdS3#!^6Ke@BE7at~4ty{0J9{uHiGd1qedL*ydt z1v(#u`H>y))2rU619sdnNJ|2UQ#Cp+5=O4|%0Jr~H$D%(3q8}Fto6`up7ec?$=R)T z%9)-Yxqxr)Uc{EX+|w1&!p2{cvl}{s7Owv*ST4FI(5XodC(Eo=GpHFK7UoQ%_{+z< zcuO|~(?mJ5+HVg5XTafd?2$RpBW`lVPSD2Rp>(&qP&%RVJKoneY4Hr_pL>&vckd`_ zLugjruNyvk7YYSR>EnmkXfswloP&JB(^z?4Id-~TF<7(}uUJ=7EG|FTR4m_fm&!+n za6pEHP>$ms<$<#nPZgn!@)$H(_eU9fVj$_|07u!x5z}??5m`pHtk|Sv5Y3v>_Bu3a zAZY+gOjt`v4h;w*4CC#xx)&4`g>rB`ghNv*v0o!!T$WL)b7LKBk@zV^TarFN7^#3) zDG$05u)YAo&DGM5?1loIwX6;Fufy#;s6^n2p(BLy{Hj;w9zVr~cy0_$CiKfLKj@1e zZoefCxP*-1g;J@-sE{g+Q6bg3T-?OOeZWU)>RQ%%(Db0}P8q2(@&K;&m~TG()Ks?> zd`Kki-XUG*DmO|H{Dmu7?~w4uG3OGO`vNc^4^=wZd4v59sc>NyZbfmheGXQ8BZ2}> zAbW)i&?@<$IK0Zc8){SQjFrbG$X8*BHqbgD)LT{15|9=94e-H!4h>;uqjO`AQUf1A zqm^tA3r^0zbjYT+!V|vXBfM$1i_iewfuagOA6<@Q-J&mli^J}u(jNU)VR4DTT74cJ z{TQ39lT2glElE=zlOJeG^W-Fmdy+}ZVf3jwHup{1L&YDIgY^CPy0W*ZihAyz(|~fT zn3-Q!6W6vCeLRjimfENxyZxAP(3+yUpXKZYtv3x2nA z4?&4Rl-(6sh9v7_!yfWNA$Q*bi9p#Zs#~_TEI2WPp~DOi&>{038j-EuUMVs(WRg?R zZKJ2rA?rh@=G{EKb{oHZ%%~@1g%p0RKI4BzIQHwwx4w`e{#6R~_ICp)rIDijb%PQ9 z9$QH=7f(W0?+!ovKG>RT|3U!GwijM(gDDN(`8!RvDTT!h;``-w#o~t$kDJoUR$lJb z#SJBY99QCAc?FTDP)u(fgVF53m|$MwGyns2{sHvW2b{Y^3vV>YuHxHo?# z`uf{vr(Zcs0rjYX36`lRh2ji7X5>->Oy9Y-9dB#jFmza^N_EJ5Q}mg^g~q{W5*m~I z$}`RBmYZ{bik7X!5LPVOgjW9KYBS_zw9py-3`%2|*n(m!F?*FW>@oiuYcfZOVQLbb zp2jiN<`lRMp=s1+tr%l+CFO=E$10#5zbuqf`cL(%X*NlyUB>IS5A8FRsx|`UZ^}R3 zF@j{l04$t8+46Wee`m`B{*=A|hUjbpBoB1`A6baJ|W38Jxd7Ugw(^_V)0@8TjIJpL3Uh>mhzJnAPKcuNf(F*&CY> zLMp|_OSo$S#h4gT$JX0WfGCSX6vC?9>pQXW7ak`KkRc()vv0)0p6*bSA0aAQbdUnB z&ka;W%2mm*Nux{_6jyVJV(@|GY6%e~>z4fKul_5LD5gE^>7hrN{|za) zZ<2-&ZUuF`Bpkg}<|I}ecJCE3e+tY|i{3a7rY&vGelNwg3+fu4yGMTNdInD-d)r(n zrxksO=vg(5a%lCJ!ItHU;c`dN>vtW8yy{HCs+JMCk2EEA*juK&)b?fRm=3)vlX{ee zH#CNINJ4Syq->c#F7_!Dy)T`1sjnXlGy}~9M3>yF!og6#G+4C_4gD+;1lZU4sWEuX zk5bz!_$h(H;#F}Zm)O;uFnDKN2TPv;cbo~XzD)X=bjnK*o9b5_7_R81dH#mu((Weq zmM7-+<(&sr^R5L!clJ1Y@NvTYe)P2s$GHzgMN$d((pe)`K5o^H;|sHd zyR*Wd(+J6f!xMICJ9`2Il6n*=nV6La8X_H*FV2K9L zq#$sSZLv~Of+gIennj43 z8k&#@0saP{Scu(a6RZm=YVyvR@~iHxUr(3;~dd;bkJuxG6H#H?%b zFm`%aiLrWlk^z9FYjW*lq5JxpY5x{Cq=UxrUBWHRdIFY%Z4IUuR`kTEaq~^0RpP6X zq*i)9nJ_<7PNN!~c-i`rlqm5GoV|o@sR!G>lV*L^tcf5wX(ZzFuD7Y6cdc}w#mHLf zQ&k(E7uU)TsA3@xo7tIu+Y#~>o{a-I3sD*Sm?FXMq=#D!2Q>zr-=b~Y3m}12BQm0T zeQYi0nAVnzc&T>uko+W5L`A}!Cj^K$HQ6VY{4Iz(R=sufmC46?T>~N5wDj$h=)(X+ z|8gP(^!}n>2z{Fz;xY#T-mj1NabcgVA;i|`?U#|*byC(>UMdl0)4#%xL3IpOL04*D z4#IMo1mkjeRQq}vO_oTg-s~(EGLN?i_gPi%CVP0Wy3rW0_4X}q_Ofz>PV%}=ywdy) zz=go8v$oO6vd?zCF*?|*k-Nx6xISTd+-k5zzjuQC;ZM9; zuAary+`Z&p5;ahhL#3ikjlLrAXUD_C{wCI?LDCWaj{!7`1@8Fe_i$I8Q#&lcGjMfG|oqr#l+-E{jk>PMUj2kCn!pXX_7*y2rAzX7fxlDqWDlxrwWo*DbE`hD~kDrrsS zw&28@J=m#%^6a)@T3dM$c*^Sfrfel)1S!CpyHO$Tuw+fSibyhH-u$J?$}#h;!+4RV z(ea+@AV=au^=`U;q9wc&h)oqLa)0z|qR=UPzxE2+N6dMwffK>ODC^9XROq76kNFt- zZGlIP(rOr*kgKRd9_aFop)Fl6x_-eWIQ5zHM>UksHGz1rJi6dgRJodkl|+&qf9-IY zqcy1uFKr>5keD!JOo6+$JL<%_ziWKZIit*|aFXb8MU+)%62u3MF*%Rr7Rv9;4>2g> zh;DDkD#7E|EhBT^#E#SSHmiBNFm6^o=uG|o5~EPhQ0B1znpr(e%+ze?7KgPf9B{hO zvG1jv-&IeJV7?h&kHLsztU|hsij2yJR|atDjx1#3jNYo-?5jk$8&w6eMdFbK|5=Sq z0$jld#d_Pjf7`*!g4U45vodq{1-2&>Jdha!Ao)pGU(+**;lXdnt(nioGRkzV4MDw< zp#!xYZ~F5Fh!j;t;H>>r9Kd4~*}TM*CL0Pprv3q%epA^lruHZv?jh0sXdd;V63O_h z9sC<0QLs+#75!qSGRT)lK6?-ArhkL(TiL-@i*^r6veY#YI%2rp&W2ZcIl~(<}cu_*O*W zZ?XDjl;;Vi>rTLoPM$1S(DMV^U>ny?<>FxL&5-}K>~;Ilc{KFkCL=H!dKj4g>r8UA zGjBLEw0kB;(c3nffWdm0XHPeHPfO{?nv!})s`)F%k;c$-Vq=N}u@+?#UndS7>}M^F z2_UP_hh|obFo&)LOT)N@yzez8V8>Bg%M zRy~NZ(h~QVC>yOv4`W=%@8iixiLGG`46`l4a%W5gdjAn*B6e2(@Y?%QtZ zo-z1m4U%DGB%OGd$y_{(wQ*WuNx^6R1GCoZcVdx+hbhXDi?jF3b|L86V^?ceTZu+m z=C*1J)gdb8@cYhJ(Z#<3_?r{n2NTrRlz{+`I$_8u;g@y>rT0>iYndF~cmS6A&=J%# zVPp$tu~_95TXIDvYfjK%qQ>_$y>b5}3Jzy)J7R8^Z!#*W{N|iB>MQoP zt(F@LuDDM7hBq803BwT4s!hvij}4eN`gO48&7vaK>&DI-E+-rb2~zQMPDt@t>Im0H z$jm4A`8VnlzK7b*Z%v**;o@SES{ZPwlVjEydKYnG{&LUdvhK)YYG=^H-$O)TD%Hv7 z9*`+iV|9Ir+3fkv=PZBfsrS37qA6o1pmmhd42<9LS>~1_YhEQCg#9|C8Wg7+u4oW2 z66JXalC5M0J-MH4mOC2bc0wYjm0fM`@MFsy&QVbAxJt_1nyEs0#}VJrAp|alZdmX$ z7rpr*zkw8|`}&fek(1+y81=Y0_Lo6hQ;ZE~Q_9T6s~5~uHzkXscqN!ZnpYV9DJpV# z<4<4Q1*u}rfb{ZZ(A`RN^8whrG^#FzlUBFfc%R`^AS4xZhQ)@cb6qs}7+MN)~c=?`-Y7=PwxH8B8ljvGPNVk!$LNPff6r4;Wmi zvjpp!J8ro~$M?9t;8cl}5+Flfpr`9i>)gcJ+ake>qyV>l3>|eRL;LM}Ctun1>{$y} zT>zHqm^+}F_cs7u&vN!X)&H7>m0Y$bnr@@3c77{|5fK;PUeu+dYEhy^-0(|-xI$lj zwz7O5hY4&I@BM|AOy(EcZvb7hlMXtBRz9Yhd8`Va7YD0s?ystEXqL7cwac`nmFMI4 zc*@X7x+S0H;$j1((i(y8wimH->q|!>B&41)|M0vK?=>urWWsi5q$iFZ{!ovB|756N zeDVCYP`{uhi9;_BGk8Tc?e8vuO`sg`2E)v8s0j2w_Py|??q@=hjHhW$B(fchz~$sB zJ`QdL{iI&^QO120gQYMCnIZ9j2S;*UG)PTd-wo{8}EcqosrR{V<~{Z3wQRh+jTrG{pf>wkDrt=XzCcw zHUYdxcZczc7sBjKz*s?_?ed+s;}HAk>8c^|+%7B}(ow17B0E=PwIbhrs!=xv1(~lJ z^i>l~W$WL!?Xrq2p`!-V>w)P@{I(}CrLE8Is@Q=Ks)CfLbnDj}4hja90sFGr0mdZm z8KorMGDy+U?bjw*bbX+qc8Gg#d+djIY0ZJz#Y$kHb3*hPYW$JjV6jyuJ^S710G5R{ z_Mu!E$h}FXNOH7$<7lI!%`r!2AL-xp_0xPKRvP6=|4Wz$s)J#@>(c4VhF92=862)l zYw*oUuSMV+6BF6QBz6r^u1Yf6A1hXSUD5`Ze(9*&7Y$upT3#guNH*% zSLLcc>vtbbz97`0TfYSkhZ#I{V++~RBJ7CWf0c9JjhSh)`Xrb7LqqD^bED3}WSdFL z!gcSVnzsYD@$%Eiypz0}>DQG9qof`QJ7Hfr>lSF15ZTlCt#}Vlb0$weB>6?&W^l|7 zb3DtW3@DWs2b5nsuf1rJkK`j3_f(koG$Qh3dLJ|}x{5NKwzijB-WgHm_*Nr-E7~+yHy-~R*J-KXX zd`;GQI&s5*LJU89*K^xq-0!{*ZOXRFia9|F-g^ecR?e%4TO5=Drk#)S2DVnJ@;{ZS zNfml1sjs&4cGzt6N_GF%>o;Jpo$(L{Jokh|$56%YzRRUb2Z-)y36)SU@nMx{Blchv zwN2hfV|jQE7+PL!r`u|=jLPuK@@<&jnK32etB6P_DzE0tWz6N6EQwN1mB`8PwjNR& zNYwMcmU|-TnJYYa4caMRX3Fb({>dtsENgh7G~P29>*~HAi0d%Vi#D%&!HK$|VR~-f z9OdeYsf&wR@4o-1RsZ)OLQwYKt$$4y5lTvJRQ{i7B%bIYF=0p5KR6ZQ#jg1WwL8{E zxc>lD8)`!R4_GJ{PioCSG;mWk#gb%l%*%$LiM0cHw2|h%E9$-F8j`1Rt*HZQI6KufB>A8wr0j%duz758$h5j7JIe2#8*N07I4#=NNRpF?+4~ylw2e5{np6d5DohR;g|dgENqHsD;IMFW zEmuroLu|)cu_Ib8U6H8~2EyFlh3wIIH7MY`J;`1Jdfr^^BjQpI$7>KXl`_Bst1|+9 z9l-munz>KQ4b%P7?7o`M-SsOW3UPK0tD7D-VXIGvT5uU zu$Tcz9h7{(sH*w0CR|U_GGE~}pyzmjyN^Q4ih!CdPeQ0cAJ8JwWgHCP&@-6)4|JhI z=gSa}UuE*jZN;4Hyz9bW^_ZxE&7nK%w=8qG{O_;-1FhRnGXMYp literal 0 HcmV?d00001 diff --git a/design/desktop-preview.jpg b/design/desktop-preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad472782b12544df077b5ac965563aad51602dc2 GIT binary patch literal 26414 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 z z-1r3C%pXK%vE;^KCPMy?AoVnmOkRz*A9@y~=T5kJM*o!5tw)bE0#VYoef00U=cihP6< zrA0lR|tESWtXhT9J$We~9$lf_z-iLi!2*b0mx?l*XGOD~kn|R+) zaEK!y4Zu%_0R~dbVZpI-?uZo(_3Uv6;*m$SN%2D#Kp}QOtPg(Xk;PKo(Mz79xH5oP zQ0+@+Ik+xH770>2CpShvzZZ7rD&Vk-(wxCfQYcD2NLs%Wf9(DdN^%Yo&~LM8@@wQn zNPcoOu0?$nduW_<+dpc?5#gpwgbXiKOl%Sy#2ppwD%t>a zVhj>YEK)KiK_W&GIc;6<1Z;9DW+72o9X%^gpZLVuy2)t)VRGm>b}U-~9vvNRRQ3sX>@=P`bZu=nBQKx zbwi)@1e@b*5ME3wJ#l+cMC-FsOELZ;v}^?%l(!&PhGEbdX;pd5p zPst3qysC@$fotE-GF;urgBp~=+vbKD96r47m}B-fAy(~< zfn%rH!#D9Pshh8y{W6Z`E}TivdCR=Z%va~`UjoFS^i5?~zjx7pwQjRjpZo-1L0FeU zE8T!S4rpjy4hrgAg}83eIl&CSvMRR z;8%7MS4rt;JP@{@IFK7=`?~4?sL)g&Q7vHm9CT6utz{7h2_z(AjJ8ce6wme(S(%RP z$g2)e3czEkW1{*#=sWEYoxhs-oZcKf69SEsFYTnzA#9acoFbT^Db;qZ*-0gwfRhEA zqcRUzO$(UiV&gD(unv~>SH6;HMDw*T)irdHd{SP9&L)dK_wX-Ti|=G4$Z}yo46Nfx z^vk_9Fr)Z5Pb8i2HI3E5L>Yz7%+1c~*CpZ`(zDpaAru&Hvu)DaQclfW8xG7rBJ7G_ zitsPqC2Wj^;QfS$>`Nx$7L~+SZjFbx7p2-35&}Lg#f0R+t>LdLUr(KC-n8GZ5zrFBX3Be+p zjA4UI@p7t3MRc!yfqocOT>&L0MYCg|4;hUE*5;D4NBMCc5AST3%IWQQc>f%l(x(ed zE`|Fx80c+<%}rAuWmDVC=D(%h|4;fKKl~>SD8}}4;|+d1x-atZF#j#dNjT_SZR{~yiE_GL>L(H8HmNLvac?TT(d~uk^kOZaJXeUS9V1R1^3=Z(B1}!l z^+MpkM}*0%4o}r_tT542q(nK%f9!v_xPM+L(mUXaj5=2?SfZjn?7ydO|GcpOss~BL z%+>Xh+(FuYkJT65XaB3}{>Pe~oSV@^UKnKMQ?iOpF1qo*8AZ~_z#F+8RX;|2gM&R1 zl*Dcnr@+k^h8wDqP|x!P#D5-qOyHi~!<1}nMM5o7nFu<6wk&KKavslEHllh+a6g2^(sfM2 zCV#Zqzw-;X^O{Y&;_^_kQ15G7NHv+e!493T#&U^D3oKqv9qmI?X8l0uj%Q(75~po4 zAxtXyzQ;>1yc4C&hf`O&h%8-S6TY||;r2OjTYv6Q@O!e=*pvDXrt%*e>V2(CMQ9#J zOI!j4DVsE3(U~zB&DV9MqdI#P2KTN zhpe0-x^a1^rT%C+(-9v)2mPW${0kI*o5`ET$g&rMUMuE>I-oe0bVy)5r%H8l%z0~{ z^FwZ3;14#@dL;2of>=MH=&bCyz0rasxEJN1L8WiQzUow!z9VZy52@UYy4LzP!%Z}% zNqQP4F;>2Odw4Mro?rp?v;KsOxl@&B(O_lt@~LoN;*R0BK6aXP2Z@CenK*y^-~B)& zHbpwVFpYBJwg$wu=xX)Nni|7>OBJ(0KLoKH)oJB^xpg*5K^zvbuWq;GgTkKXvN&MQ zK7cAa$63_z91QagHGaTWB*^z`7!}&RWBe$rVo%K|*~%j_qL(qfkmKQVKlZ}KG>4{j zWciAc>@ES%$haqJKgY%lH*@grV;Z+)Rr`40?Yp{juxcl&?;Uq{L!1updh<#Nd~s=5 zT=pD9&&8HAhHK=&3rI8{%WoE&xLFO3j1`i+DlDEYqK6oJ8ppkfatLSWE2Bz-XCyvk z668DOi|$_XEo|uOHZZIqFTSswn%;YQ4`Sv`N}*mf%1LfgrJ~jp7E4mt1YFl4(bp?> z6qVf1gb$3cvOO7FTy!br5fY)KmrMxmvsNB!s1&Uvf$DfeTu^HU>Z{?QB_$$BQ(Y2) zDR%aBDS^#20eNUK65(PEy1M4_eY&@X!YsFmZt$@a+ZsnXMPN;fGNSy#1E>`6}3xh6yPpsqjCbxuK*x2Z85 zz0%SQ68njjO0lCq;lmhP3Vf7Xp3X<4Zjr2O0Axv4khQMDPG@aZlyDl=LSeSiFCSnc*5*14GS@o~w+xsq9RX)sSa66gGb-3Bs$qX;x1)OA& z2JEZKp(U>kt^SM(bp@wuC8siLkqRjg5)EO#ADO(hluIW5o-5COH`xg1g$j@qf z!LG68Z4{0?t$e2O@G3+LNBc7hsn9fu4xy@A-5$TV>Vf3qqOo(?AsvoZ^%F&S*m2(O zVq#KSnkRNwfk1zCDQJVKpd|RMz%F#Pn5Y)A3NE2z84+J!I0>;gOcL_8`Z^UZ^vdmn zUQgQ!r`y36nu2_sT&PwdYX~kFj7}tn8AjwFhh=ygd*4GHIpSrtvb9ol_F@M&c#Xq- zKOHWWy~z2lJd)@6sK}VNCB5LqZRvKQ*)IOL`JA!J>P?#u()3N4z2*0Yo0f37>s+b9 zM=K(FZ1jXB*SO?}-7KG@EJ`RzMGrQOMm<+ZG}M3F_JI%VRp!X>6|kX8mCppdI3Zbd zO)!=);^lh5#&`-H##yI~v&lQ48WpoA%Mg_aoDxh=JIjrGPiRZ4Y``k6Xe43gI`4lg zY?ds2(ai*VG0}d~2vRrVq}{jUh=)t5Ri~k)wMslu=ptxkxqainC<78S=A?tk^DgsQ zoIIsakLq|rQ^*ndZDrf(rzZ0}D=#=wl`+C=!!*(DTnjo2+Uh1CPOoo0u&NVGuTZyi zKQi_>y>S6cXmQDBni~Didt=q}d~w=r$ek@wS-F)vl*6J|qe+t5Mb!XDK=ZnvQW9rt z>-RHMwT^P^{Y>B2(j@UzHo=BQFp30QfuiRbb?gQ__6nqw{K-0%)^Fe}C?2;lc}z_V zTT+`2me@6B`^IRqgQn|d7se?a7V~*Io95(URM^atw9ly6CW%90OrqShXL)a&iaAuu zak@FPzGWrtF;zl0nWqhtDBZdD+%7GADr79HkH=C)%C@GNsPLso|BkO4Bjd9gHg-vR zfnv;>+awa>&-$EsjP+S&&m-6zM~VHnr-xMWjQw?^=fZq+Ee}#c^!eCbOk^gN3h#g| z2Y#?|ke0rGu#va;Jw8-{4vWmNSR$75WmsrGj$&)lL6x@n%lwqRLo>Lw{k#fyi6tzMFjL0|7s z#Z5IpY+UTCp6!Iw6;{gNUo8Mt7HYiM5e) z>}|+&!tkiHyh)(d5m`f>4|>IMnKY*0ced~r)o4?hM&270yuBbJu|j$=wt{j=r=e_4 zMnuFJmFG3YKJpae$#h`B(CvLr38tkIFdeqw#J%Con>3jm``GQ-6GQ8L8~o5GbQjb7 zDPA`|LI}=ceGK#5&0DG3sfKs&_O5;7fL|0+oP9mkcTC4wE_`kO^-BzOv&|*o;$wUi zalx~6lV|Kpuoc+nohTqYtrm6o)orJeZ#9zo30hx;!<%xfO6~+I&Cq0wr>=(6@Rhoc zbxlRK!yAiN(Fjg9HJz$k0dxm`(vXAsv>(IC6?>$ znuwb98yZ5Kpo_XH@|vg)%oUn*@=p@dHT7qau4l#Xg$AlSv^2O>B1}Mca7A6U4|X!=|f{sG~6| z%+tK4gJ0?Fnj~E}Me)wIphhNl0bVN-LFeVe9Y9K1erV$HJSdN0~{a9VGx zq7+hetfsQ)7oNPkl8})O_jG6}937M5YvlNpBvO!&O&mg!ql7`=1j^UwR-=VZ>n=Ae z78mOY^1#_5#-;~nLqu4`w)Tcl+fY@)K@cds5OIrw7n0=Va#1dDo|(+jR8v8L$ww)-EgYpf`;mwS(};XT9}B$b|Y-^yPN&H5sQ)UR6hV5Mil5n zzVUy}g$`1$ zoKN2_emq+yMXsvuxPjf2sy*ZxuNFcN-9A6OS_sjIwTY#RVXi6nEKD9riuK=7o_E<< zBFG}rmqV4N*MNaD?sOY)^DRcr%3Q9!{ilP18%7@Og~Nu2g^{v zFL5cv{ZBLew%qxhj|Z##XCsSW=YwhTYWzU8X2G>)=`IGAN+9ykT9w!23$K5s^Ta9@ z^ij$sRWF%qGzM985gg35Rdf!`US;4eSgy}((yBBjh$gQc6+|B52gGQbr7Kxx{S>G* z`&IB&Nd=LkF^!AnwWEJt=dJ;Qs(1p-=+co=u+qIZ@lfdy!k)$Viv(3!@VebWXgF~n zy8XwmjXzk#Q$IQ%DZ5<)_bl>+@19Pb6Gh$#56@_5NvM?MR^RBe5r5cOJxSeueh~Ed z<=RKpE8hDSd7N^&6Mi5=1nQ?a0wo*}d(y3lP+N#l`zNX2S*}Vj3Sch8MH{XyB0;S1 z7!!X}{yW?6n(%)y6QM7Iy5j}1n7gNo=R`%zw{4R+MnHARD;Cz_+(XC``6rOp^8aq_ z?+TGJ#2MYIb30E~E`D0s_=5=y5@8JOtqV&k1(i@fCTE8kJfa8*FBQcMiwf0p>^-6h z3Uk>q<$dM4KTfwMOM%j*3f##z@3Ujl2y&K?19Ew2GaSn#RXT8>Ev710HMh{IIN z(X_PZ>t%;IKd$}&)!^4B(IjfuP2e~J4wSbijV&KKd`yqsMW}!9w=hPm=YNJV8I199 z0Te_wNfxEVh|LT_B+T(D1t{oBVhAKa^EAJqtCpc)U&SHy5~#IM{&w*tyJC>}<&UJG z?!5Hn4;P_zYp?TT(Ov5xuBteCOm+_I{xSTjYvVlIeF`w#`Er-RGn z?qH&@2AT(h(oR}ZdP0EOSlwGb4r4knc)osL)qHlEjrpukE*DBV`y~clef=4UN|R~O zXc`2wkrgBOC5QdwkAa}XTBf$!JNjcWX%34{pagi3WlVsG?lsT^`mGQuO}>@m1z|ZB zBNVRUZ(w$8#yB~28pMb#(0^^LjmECA?M)*S4wp`7$ow+d>Cd+L`5E`bAvDMOugqYu^( zPa;og=ISQG$5py{lFD}RU_c&*1E1^vS2_7x4}8^{%w)gW_zQMB=o)*NPK!GQw>xLFEvg1v7AGU@v;M$^I;ywivh@;2N;LXD>678)AG zw{9smEpTDm3FB|9Ze*(wgcV5`D_|;v2hw0%oCr+okuT4TGxN$oxob?ezWmrTLhxPnq{Lh&G@&y}pZmjE5JfM1_j zGKrwwOFc?+4;d^pv$*Sq&AjDO=q_-nIB^t$ntoaK;t&CgYjy&$zEFETukmH*1V09w zmE=*3vS7B=$k5oxBFTmJ0JdGo2kzuiV~b z2mzT+w@QORJ*J1fvKc+#kv>gS#5iV zQY~y%x!YuRHdCD2u#sm;9GB;QRNGtk#=r>2Le{84aCokIrHX-V5?MBspvYclfNuIiEzeg3}X@zE)F8#kyxHzGrQ4Kn^v<- zmS&yzYu++pJc`nnW8IQleZt&q*gGof{i?1RnxYl`n31MpI_TD$m9+KYE-w}WkLNnL zb_MD7dfWKzyB;aH>h6ri_pP11rG99P28KLTS%`~IZ+J%yPj)-4D%;h$cn8C-;khq` zzJJ2z70ItA0k7=OX?sr-@z@>v`Q5XMYDt^bCj@sed7jY08}BHV^S6h;-M&`yDqSK-B z!H8o{Y*MdZtBeL!(U7Fbex=?BN+$n~rX+V-NnbF;-mXSt3gkMI6egxVCBmyKpw-H)_5#%*!GR35lnN{?9NO|w_y*r(S47-FA9g2P7FY9oA-3wPs4aFSed_4JhZvnkPSBv;++T#bZ|&E>`ldUJCO$sp4CMzHYgnn2=E z{|2|EI@SY9_U$+ZFk6EVVV-ihGU*Z;T7~{rVZnAarh*!0Lq~#$7CBFp!5{{oegS7T ztGZ;VJ=uG?3FX>;3?pUNkxS{os7?k(woQ(`bzGT&)*PuablS15IfM%!tra36AEW^v$D9O22hn_>Rm5-{bmS zOp1s&dO!8oW~xzg7`SI#SME{D7bsG(&EF%f_(+h36Rwsk|ISJ-4`Cbm`{xeSEKjPn>+b7# z8mpWs3qBj|$4Jr7WY|reO%Pu%?1vQEBSyXA1YQb;i|n+E>5SlqmS0=sDLrpGwG($z zQhp=f5fl}&@KtG-U3^S;^Yy=(U$&U2m^=n+sc)g^l;{qe<=GY`kC-d;itJ67Yfccb z1}F-Rs)-RT%0tD&j1nKcYOsAL(b2Dw%}j=K2@F`NXPj$>Oi$H~pubcNuc>@f^^)id zU%imsimPiExldiLQn-iN992urwhIrHU26fwTB@geOK2rZ;A0s97R)EfBsR)3SzdcF zwMnKeEONZsH6_nG8(obkOrKfqJrVj+rq;hRp@e0ev1VTzZOYn5`6=00O+!t6wEdxk zLM){`35NWxlMdBJT#{dpb$~3+BlZk=$}Z@KkgRB{f92j{eCsci_O^}AO9Vu(!c|o{9W792B_z;ou&8+!zMHVWNOiwKt~k)A%Q=3I zeF;=AP%F0NxrcM6C*CUh4th5%5PFQ zM?=Yu*`bSNPm&1U)QBjHki9t4{pM}9t?;nwTRUdFW8HK@EUyZN3K+y;I4{UKs#XJA zM3qxv&v<7;5j$KPK2`OyvS>+xpQu>{2T}qm_&9K!8{(JQCGY3|i~=_@^Pq-YnDI=suPJIZDJ158TR>hCm1rIMy-g;5eIFrQ57 zjQ{8qFJsQJlOp@9S^N^1;7GmM9?{Rx|TfQ>7*2jS>!C))Z$beuFgIQ{s5#n-`7yVbd% z(oQPPm<++lyHvF}X@QQ6YQ)NuW}nT6`rw6}rHVJ z;pi>s+79ABpTPD|`B*-2q_d#27gQ{B)D^QQFCq2;0$yO}$hPF_P`&8er)n0k^Gcw| zY?yv-m$W(I7VYTAlueKl^lM z5IkQ>tW)pcMtKRyE!^2PImbD11#?&zhwU#R%MHYs;ht*Dj`V#x|-hEAWSD(Xr@U zYg*H${*-Dor=Ca%&NTgv`u48}g3}q|-9bp;{x86F$Joq;&eN0B_b;>7x_<{U)}D&I z&~RBjKULFwmFIgpg!u*o!#67uoXh^hOsizZvB%Ox%suG5NYdN>>&Hc#;=cmYzn3EQ zha$_7<>NI~92LZEXw&wxQ`GIw)K}V;PuJQnszERsK7$}J>p9$iu<**jeK5j8psxU%`}%io>xXYHT25zff?>5P>t z&me(lNMPw4NpiU-n$a4^dy>7!kf|gh3eMa0x-pRqD=+6~BQiozmsfqh+m?aQD zHQU=bPabaw#?!G2v4r(ONkBESTDb_!Z^+M7zw!UV{3OcXPajq?6#FL%{+~6O;D|2h z$SF7erYG!AMgO8o03L>1`v3E{IfsHP1u!maw~8w=4N+~K9?mqM^|u?e*~4u4ijdSBYi^e8E8#lFwNnms+7<`#)q1@ zSxGnv{JX|$x6*-JcDTG-6hI*TK#CQH!w$nuBwYA1hNW8fDo5y1@|KQjr2k}H6;Qe3 zG}iDe(aW>-M);_RhW2I?gj9p{VEs|ScD6g`G$Ajw{Xz$P#*S{E_(xI)v;Js9aS>f| z5b`@ZDK;FGCR^u zRTqgg0sXJ|cq9u#H@?+xs}(LS42~bHY*dKa8drn4d|Nr@xT5E>arQ7?-g}_UZ*Q#Q zA|=Srep*p~T*X8Vc~I=ii@;U19W~^C6d9l8#b)DNo3d6OZsZk_Xr<=ZhAvRfEIN^D zYa1rkzdOK+7V@fAlSE-7$SHw|kE08-+!Pi~ujl%bNY26xCuu7-WVsh-dq;6SQD__| zVOvc=OCkIY)a_IMRK3svmbsm4Q(+6Nk+s0wS$=v;;}SsEFw!r~d^C51O^`1os8T}= zN}kt-Pb)MC%oJ74WJFQm~3kU0Iy|0a;d8)LPys72j z<7C^q5~L=r0uMhF2!^@Whj=Fwn6(Q^M986=sv0jlKZ@2WrFmi~p~q%7@15*3Q!z8| z-%%i{@9oh{DqE*_K2YLOY|2QM%a}0$;B2rwblb&?k$}l^$tUW(C3f3bZ{kT?5`j=G z-7|mbT4?I_LyxnjFoldjH%X^*J(?Tej^{hxP42{W)2$5N8~i+4hdMkBFWtLhhe~C5 zJwuuf(yWH6l<(=gS;gOEk(jg^V6s}^GQ;c6dsAAJZavuNX=f}pbDH2fRyAqu%9I3a z3Mn!hnd~Xkqg@s}*IGNyeBC8{#Pl`O5SwRff&v!Z>1)CWg-Z@tv6X^cO|EG`AZhyg zOJD-71F&qa5%!*(0WjHA!^>(odz|4YvAC?5IpnLJ11kg)IB^&a)T{{UZ-wbgdFhaR zrE~La4vAChBMC_&k$N*+8v9ImnvO1gsNHWkp}ufg)5Jh6ePl+b7+Nl8*tgH4OtJ7p zRf@|vfOJ~3?HkK!i7!UeN3C;fsI2yk^-|w3t?_88D~S%T#;ZpAMzP&YIs1cWkOX6u zy|VnOBlg)Mf_7VYXMkVb9n_D$!8kT-UP+bU>0bN|-b?`jLw?m)TXFmSk9~8VtEK4q zV~}U86P(tDe$!#Go&SRd~uWW1&c>&057l(pX* z@JS0NPi&OwMo{KdxX+p14BM9qZ!)WkyxULVWk;jH<-xnv$d!Z=XgkpYX-Mtc2T>W= zfmQho>xD*&@y2n@{JUoheP~i-`JWSSxMn+#jEjP}r5E3=C3xA6wS_ZLrvoZhoa`x& z%Oa<7`y$!aVYPJ0=>bO~VIq6snTeDJ{>f1e@1ovMuKdG|fe$}71}>CkwxOsdu6HLO z<+GuMA{&Qa(KITP%;kU;78NYH!}B%7di49>_B%eTT3_vV1U_v^cYKjdv?k?UaZX%oqp|w> z(RK;?q3EzGYQp27_#eyuV*ODu>Qc12{d6a!J+eAf~ z@H@lz^5N3YjR&qjsVCdZ>|FXgIZ^nZXm+e^t)e6S*jTPz~lF zbDST&Jjt67%0R{)J&?sG>kPmJ3c?h1fnvTy&>Ye1<0f7CSX*%8&0Emq73rlA@66`~ zRSM|SWogM{tdm5DRdQKTpx_B~5UvZnl8uX|mrSq<1R!6?FU*m_#PFdYf?Qly-kxBe z^ojKN5*Ozvgk+SGnC~DXK{_%)ylrPkFh84S693Z?IpiBOzmqS&9M8Kivb*3*DCSVW zNtR6&Sz27oU^32iIO`J!`s#DBp7FP{cvANRem#pfR)6{r_N)#Lw)xMVFJ35%aiLp8 z_w+FCQQZzQBwRr?c z_2lgQk2?}6Bk&y;bq^3X$3;Ld2e;2|MXM4BuVydfWn)LH%x+-zFBZtiWzhQTk;GL; z*Pq*ffseVRj8i)-`A`#Sm}?E^>UGEk6wyJ(06Qtq`&G12960T6Sj|+>OG`l1rJH%F zO=p(-5uMsVYu>rkbF?#Nl3l|5+G_hEer&Gwki4L%B7Ul_k}gZm9zuE*b~Jv58cRrv zKRS*K`6ciMJrA=^4aZOU*ivkMCY}tD7l>IGa|5*Hsw=%3te-;ApTHtjX^ct11?L{O0CE{_%v2Y5+V6 z!0eA<+FUU#iHsy~oMSH2yiipCaN`-+^UoVizw88cy_gJ9v_L4thEP<3*-5!J=HzhT zva@+sJWW|(2Kjih|gL=gv28cQ}KneRES70bFij)u|380QHYK+eH$Jg2o#iJ zMxoQg-b|M&qwTH%&&@deA9vr^{(zg>Vf`JJmtRKAvpcBLChd`?|GZ8Oy^tBElZv_~V^_d}OrqL?(tuvQtGMjpLfFY}l}f=uDrnD}9vgkGqDBpOvD%ZG7i2 zDy8@G_ft~DC~@z(8zu|YxENJy`DiWT(GyR*C&0Qu$8pw^Vt30@Rvxq9>1`j0X}2g| z#>e+wL7j}nBQVcEY^)*JQnG~v-w3(TN?|#7Pvmv;Ww|WDZ8}idb)t10_GmB>MPfIN zSPqE;6UkG4Lqshi#ikcXN+8f+MVL&~#KD6##&>@>-HF`${q*bJ?-Br>zzG|bsjfvd ztCEGI!kN4swMLC*GD#Q*RQ7|xW`5V-S%{uD%cKJ8uZ;0S*sF8pR2xOQCV|j6H zp&ycV>m=2fV)3ySNPw)03Not>REY8lbUNVBu@ke;Pvz+$zVjhD6MWPZ;k^AF>*il} z$bSu}=RJ_55>gzv|3{rsoOlM;pvP+Epi|Mq9u!F!{Y*ijbrkS8=+(_c(|M?Fq7p6@ zIV%dj(ViLE`!)&jji!kyw;Zj&funZK*j7n@#hc7~#yWGwcBSGg)2jJl{ZRa7`Kpd@ z$I6u^cW4z#+ZsX`jm9u^SGCqFn3|Tz&`Pvq?u zlnbtXDZ+f(a^0$UkU~1lnP{L~4aGTP?llvp@KqiF=}uPPPj8r+wDp2D}<5{JSi zGG%RoN!t(_GSbY`4xYhHHiY&)1u*23qu3s8VkQ}>HTHIfjwwrCuHGMndF&R)?yWC5PbxWsi5Ys*AFLUbbp(#U8!HJ`()<*RoKd9k!kOT7MV%;-RD1?VnQY==E8BWc1 z=JEu6`CvkWKe$s9CDS%?qa_{&LhiPQTq z85@^NfQ8|%Hs{%+@e>t8BDG$~nH)^nfx=6pFrW6l( zy3q+w$PD%q_%>Rxt`32e^-&Tf76uPCjYP#JZ)}4+ZG!~9_D|j7Iro7dpc`u zNL-nWJpPIc)#9=o^I#W_B|9KT9Q|i-_rMx+&EB;6!gCRc(}g_QLoJ(>Ea@YJINU?5 zg(6T$URINKFSez}sd> zB5ESCc@OhT<|r?&|A+TKe)vy3{QuT3a?P;(QE^aLu6k$igewf)@AThyW#kYL=0mrR zIz%sXB^iE1_GZ_rn8uvQij7VVoVV4b3u&NnZR%xZ!cjS7g%V$*5qn@yMeaQ$_WZgh z=jYS_Rg1@RDaNm0Ho{Wd=;_j)>Edsnyu2e z@C0s~&-VWmh@cUFogYLp(I(=Kjj)Mg&bXRYXtFDtM{HRvUEb;vD8B>*`4_l{n|$AZ zabEYM6y7MGrmiFH)WIkjdaf)a82{vnt(8}#{xLqEk;*KWgjHLy+!Uh-HoEdJL>m@r zs^2*O?*kDudr4aY$@eBVk%qcNM@@DTh@x`~0wOLd0<10S3=*C8nvV#yme}rT zlmI9YrTKPB=Jn_hKJ1pO#6NezQlub2QOu2j;tV~6>yNZwSpJ_Txcm&DD{Gl%V2ioQ zyX(<4m;=2N@g#5Sq;4-)8{ZleS^1(~<#?Fbt&WV^IbBmE@o6IRglq!Nk$oHe1fPEKpG`c0h3Wr;Z2vEuSaaY^Z zoTZG~Y;$6d0Zw=CJqS$=C@c?4l}E)8)Bmm?wnMaJcL({w6k0qj+0qDl?$3nSc4Zka z^iL*_&CMj3!n8#t$2}yYccfW#Mas*u4nr%;KI?HYHRIhGuq4XCo|nv3FQwTib~`TC zKN&6MRze4HfpaIUirsf4PhjMngrtB@i>dnS5(TFY*h5a~70HbYtMEw!e?Jv;t^Ueo zgU9`N9qIHob`E%C0&?;l)qKrnf2G-=;QUh_)hw>Fyslw$9i08!iFSb@9dT>39HR}X`&h|rr)&XY zc3pFxYJO;=B|LE7H+7Vy6N#G4Bimeov;PDKLz66s-w1KqaO>|?7@@n_&*n2l)<{!0SsOHRWc&p-Y{^`sc4?y=6V?#C)6~{+e5q zlM44}d^jp4^M2eSTJWSKyPZetPpm{kg$tI%o;P-9eT<=E@PtZrNdKG>#PL8@gz?*H z3}F$g;97Fl+@BwELP30% zYtIyzEMu({#L zK=6M5-18s_)KBxL+}Tg}9$f+>YQmp~#2<|>c4l1y!*@CmiuWAqRYQDDNz2x= z4A6I5IP`iYt8iX>Xq5k7L_%HcJ`$2>pMt~!()2(e*dv(wv((cU&z!eqyZKyR=t%YD zm6UNs{U6^-ztC%ced?VpIPtYHrY@{b>r}E4r?&MeNhXyzIf{%)AZ%U7AYtM7*|E74=A%J z(q}0xhnfRZgeRd8gl5cRZD5Zhlwyx$bxmSaPLYC^L7=5rPEKP=*Uy6LIQ~uRH_f}{ zn%n!?y9uTHliwhNz*1OYHKhKOOX+D^BMDJ3DaOuNoJgh0l2_}YPiEDb8(Axy!-__y;3FA$ z^2qj#As{(xFDzt`p!A3)#|rwkR5jVr-JYj>VCkXv?(0Q0+)uA;IGLB*1$ZcdZ{MEn z1TEkK19EDN>*%wNM!i?hlFn@#@`GdF)iEgTE11|ty$~M{s0D}>?ny2t&~vLFMisda z_NljYwzo!=MbzM9L=oPa(woDRDJg6CgB#7Ymo@n$!Y*(WB?@>U6&Zy`wvltBSFe%3 z;WAXo?p~9;v@PackE_TDj(75$CO*dxXV7fCHL*~fQ)-MCD(F2lu>S0>^RivPArX3* zpY1O&K1JxVKUWk|;Qph_@?j>lkXD_v;d1gYG#y5;DPQLr3%?o5rt;jCuWeO_8WV^?cREj-DbRi$d-!(CXNdviQ@faj|^Fyb0R`UPV{zfy~#`v>6kqA1I$i-bn$uS2QNi5^LK4XTg<%+ z3d=ypws!IRbjku!}5Epv^uJ{)xi1VRwLR`f_ zp8Oa%FzD9;6(3GyYqRjCA@|ZCk!xCjpdu&o{Z#kF`JO8sQ+#mdFoSFSM;rR&^8?Rc zHMI>|Z8zY@ZKmfBWt?~gy!JUDD2zi%&cAV~tMSu+@@o+Sa}ebVF-}-IS&?o)N+|YS zb$lmvcKapkFAy7nY7U-ix(F%$ZaOa3WPVJP==DKg|_z`)T^wvK(@nF{<4i;n(lja%npbdiJ5a`k}8^X}JvQYMg z+(E!@a8;dFb5oty4486qQ1d3+$n7Eh0bdss%GY^NRM_a#*X@5BYe%D$jbNScJ2z~_ zfNbTCGGyv|&y3DunCCH+$9IEcK}D-!S7bX8-!n1Y zzj`HOiX&&Tki33Bal){(%?`K4h>sZ2ljQTVBK3h(c&s{;Q$CO7orM z7T@7kA$;E+N7JV^k~9P_G+7;7(3%0I$+_n~{Z(O0@Z=+AMRP^fQm}oEsxS56o>}6c zc@1+1$okg8)tu*G<_o&qQ_=GentrZ+Obyb)OA&O^-CS2%-nrF0oB#GpBbT^tm-yx9 z%6AEpoz@wQB{W(`BY;|s(E(k5pkNJMj9uvs5wfbOcjlWYD3goIZHd*;3;bs$NL{tB zz;dGh=%bZ>u+Awm0UWjL!k6LFoa+?>t9-#9t&Fo*5^8Pf*<$^%{Wf{(q4+}w9sP7< zN4C9P#o4VjvqHLOXAYE|ni@lbY*U;aac7Z^eATlK9DAQ$PaK(`4ss3yKmL7NPbr(F zMbYs_`9G@>HjmoIf@NW>oM=y^8EeOrWn0A{ZH7O9xaOtN7dw{D2JAg8;!|C$JMx{u z{odyJR*Tq@>qe3UWegl)UZ%7ZE4ulx+w5-o0+E{WqHZLRL&7}&f29PJ*7zRi*;x)_ z>@mlu&K57L7KWb==M0=sQU0cJVf{4q+ON}}4yY0??;)gs;n>pu77Je5dBn)rjx@&Q z{BvBJz!Q{%lTODRN)damb|Mkuwv&VpYut9w2DV;PkXDHPT{}rslmpx%-~1+|#hXLQ zC;7I{wYzm8GYhF;^kXRZ7$7Rj|K6reE3X|xrA<{7-W;Ou=)1-&B@48m zn%Np7hCi;vbjzL~Uo?QC!eT_rCz*^#XsQBG81q{YtgG7N`>FWOP%GZ*QO_SBG%AGV zh%6Nc#ioXfI_G>`YNrigSds;srul#@t6`3QKbV!av)t@+rCn^Omz88QdHw)&uf_^F z%-4$pNOmHY2HTbIWiq1GyoX(mQVx&k+-iM&t(9TYvuDnqdV%%N8I0Nsty}0_>_Cuh zQ4Y3aG_Fc(=hy@p4~10l;_1?~ZC>>G2{g7p?~vUv z8=luf*bsP~`>ZYVF*nlV9()w7Q)8l)u|%SR99T<&?eVYz9o(~|68az^%YCyCS*DGv z?#otgx2QQCLx!;HIA14D~>g@3U=V}euL z zp3A%@k^-|Lqy=qtDKB3`teOQnJt6y5j^X~3(h7PVZhqUB6+ z0x~2mMvGsp_m-^r`ds215+N}n5^^WvIsf``(5wWnt#R0U>yg+3L!AnVjp-W?&W|L# z)w2PPNL)NiO|`6^*_wTw3^s$kexTAEWTk3TOy$uWzRm>g67~bLcP%yLhk+%-`BcFCp9ce&-6OgTx1)`G zt`x8W^SuR9E(-BR%y_PO6|1s;sejhJ9nA#H_{!f5-Y1u;8Y7cb6z~D!hi$8hd(G(m ztj5D4%hhSK`kocb3Hbe%f#uvt2I`n3*d<|(NE2dD$y9K0m3A3MVp9UcU+(Amhx9K? CzkNRd literal 0 HcmV?d00001 diff --git a/design/mobile-design.jpg b/design/mobile-design.jpg new file mode 100644 index 0000000000000000000000000000000000000000..76b6f50ad3419d8110de4d6382a1d699ab330dcc GIT binary patch literal 12073 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 MVpH<_?)NnRKO$nFRR910 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index df89c5f..ecc3b85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,9 +15,11 @@ "@types/node": "^16.11.65", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", + "@types/styled-components": "^5.1.26", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "styled-components": "^5.3.6", "typescript": "^4.8.4", "web-vitals": "^2.1.4" } @@ -2140,6 +2142,29 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -3748,6 +3773,15 @@ "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3907,6 +3941,16 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, + "node_modules/@types/styled-components": { + "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.5", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", @@ -4940,6 +4984,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", + "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11", + "picomatch": "^2.3.0" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", @@ -5253,6 +5317,14 @@ "node": ">= 6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -5675,6 +5747,14 @@ "postcss": "^8.4" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, "node_modules/css-declaration-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", @@ -5856,6 +5936,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "node_modules/css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -8227,6 +8317,19 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -14528,6 +14631,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -14902,6 +15010,36 @@ "webpack": "^5.0.0" } }, + "node_modules/styled-components": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz", + "integrity": "sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==", + "hasInstallScript": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, "node_modules/stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", @@ -17917,6 +18055,29 @@ "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", "requires": {} }, + "@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "requires": { + "@emotion/memoize": "^0.8.0" + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -19071,6 +19232,15 @@ "@types/node": "*" } }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -19230,6 +19400,16 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" }, + "@types/styled-components": { + "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", + "requires": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, "@types/testing-library__jest-dom": { "version": "5.14.5", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", @@ -19976,6 +20156,23 @@ "@babel/helper-define-polyfill-provider": "^0.3.3" } }, + "babel-plugin-styled-components": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", + "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-module-imports": "^7.16.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.11", + "picomatch": "^2.3.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, "babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", @@ -20220,6 +20417,11 @@ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, + "camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -20540,6 +20742,11 @@ "postcss-selector-parser": "^6.0.9" } }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" + }, "css-declaration-sorter": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", @@ -20647,6 +20854,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "css-to-react-native": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", + "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "css-tree": { "version": "1.0.0-alpha.37", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", @@ -22369,6 +22586,21 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -26743,6 +26975,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -27028,6 +27265,23 @@ "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "requires": {} }, + "styled-components": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz", + "integrity": "sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + } + }, "stylehacks": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", diff --git a/package.json b/package.json index 239b232..50bf9e9 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,11 @@ "@types/node": "^16.11.65", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", + "@types/styled-components": "^5.1.26", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", + "styled-components": "^5.3.6", "typescript": "^4.8.4", "web-vitals": "^2.1.4" }, diff --git a/public/images/bg-stars.svg b/public/images/bg-stars.svg new file mode 100644 index 0000000..72940e9 --- /dev/null +++ b/public/images/bg-stars.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/favicon-32x32.png b/public/images/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2df7f089f46dd930239e418bf13e8e4c1cca0f GIT binary patch literal 1063 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+081EY0-Plzi}!G9Wnr(eF` z|M+F+!xzhMK3;zF(cgdn_B?v|`rD7+fB)V2@MY=EN9|{BEWPpQ{f}RtfBl|!^+Ea3 z%d2iZe)i@2x9`6{eg66V&!4ULpSPU4KJ)Uu^RM22`~BzO$wz&&PyPA(@7<4I`yRjQ zJAZr1#XB#){D-o5+r^Vjdc3)fsquh@R{^yA;Z|8C!Zw`1zDvzMNK{QUFr z^G~yvU&yK5nOnE3q5ts2d8Z#d`S9=G|MwriU%2{m%ii0owp@Sy>dXGuA$NemCsPvS z7YvLEt(>(tKmBDkpML+hROc(RL;oBPGFiO5x8~1ErS?rgb&N^g?k~Ih+L^ zk;M!Q+`=Ht$S`Y;1W=H@#M9T6{SlWiKeL>x)y)*39#2mf#}JFtt&`J}n+ycniko-@ z3;26vOWyCzeS7I$?C$UX{_kIKV}WAF+24(KRQ;Wbm=(hXgpO=b(eBb|byZ~P5M3dt zyDB-nDx`Zw9LoWN-GrY`kHxRfy}Q3KfBxRdclJCv_%N_mL-x0j+x*I+s%JIY&vgg3Y zTes?8j%DMbh5PocynFBNZJq}$w`Q+tKfe6=^y}tkkv_Zb+uQBmSHB|O-+X(*4%OrO zQF%8%OSj*z`t$7X`oHyz%ReTa40^8r7Z}c}C9V-ADTyViR>?)FK#IZ0z|cb1&_LJF zGQ`l-%D~vl*g)IB$jZQAv*1E06b-rgDVb@NxHTN|kz5AU01WSllAy$Lg@U5|w9K4T zg_6pGRE5lfl4J&kiaC!z@o*G|X=t4CKYhmYX%GXmGPhnbx3IFX_hb=fVFi~4lfx;@ u%9}$JPT#n4;>ejJGDp}?H+U@Y(qnifE?Dx($#g2v3I \ No newline at end of file diff --git a/public/images/icon-instagram.svg b/public/images/icon-instagram.svg new file mode 100644 index 0000000..8cc0ea0 --- /dev/null +++ b/public/images/icon-instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/icon-pinterest.svg b/public/images/icon-pinterest.svg new file mode 100644 index 0000000..459d5f1 --- /dev/null +++ b/public/images/icon-pinterest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/pattern-hills.svg b/public/images/pattern-hills.svg new file mode 100644 index 0000000..8b0ed66 --- /dev/null +++ b/public/images/pattern-hills.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/index.html b/public/index.html index aa069f2..64bd94b 100644 --- a/public/index.html +++ b/public/index.html @@ -1,21 +1,24 @@ - - - - - - - - - - - React App - - - -
- - + --> diff --git a/src/App.css b/src/App.css deleted file mode 100644 index 74b5e05..0000000 --- a/src/App.css +++ /dev/null @@ -1,38 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} diff --git a/src/App.tsx b/src/App.tsx index a53698a..32ac068 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,26 +1,123 @@ -import React from 'react'; -import logo from './logo.svg'; -import './App.css'; +import FlipCounter from 'flip.counter'; +import { useCallback, useEffect, useState } from 'react'; +import styled, { createGlobalStyle } from 'styled-components'; + +const GlobalStyles = createGlobalStyle` +* { + box-sizing: border-box; + font-family: 'Red Hat Text', sans-serif; +} + +html, body { + height: 100%; + width: 100%; + margin: 0px; + background-color: hsl(234, 17%, 12%); + background-image: url('images/bg-stars.svg'); +} +`; + +const Container = styled.div` + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 3%; + height: 100vh; + margin-top: -1.9%; +`; + +const Flipper = styled(FlipCounter)` + & > *, + & > * > * { + background-color: hsl(236, 21%, 26%); + color: hsl(345, 95%, 68%); + } +`; + +const getRandomStartTime = () => { + const randomDate = (start: Date, end: Date) => { + return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())); + }; + const today = new Date(); + const future = new Date(); + future.setDate(future.getDate() + 99); + const result = randomDate(today, future); + let delta = Math.abs(result.getTime() - today.getTime()) / 1000; + const days = Math.floor(delta / 86400); + delta -= days * 86400; + const hours = Math.floor(delta / 3600) % 24; + delta -= hours * 3600; + const minutes = Math.floor(delta / 60) % 60; + delta -= minutes * 60; + const seconds = delta % 60; + + return { + days, + hours, + minutes, + seconds, + }; +}; + +const clock = (v: number, limit: number) => (v < 0 ? limit : v > limit ? 0 : v); function App() { - return ( -
-
- logo -

- Edit src/App.tsx and save to reload. -

- - Learn React - -
-
- ); + let { days: d, hours: h, minutes: m, seconds: s } = getRandomStartTime(); + + const [days, setDays] = useState(Math.round(d)); + const [hours, setHours] = useState(Math.round(h)); + const [minutes, setMinutes] = useState(Math.round(m)); + const [seconds, setSeconds] = useState(Math.round(s)); + + let size = 70; + const [timerInterval, setTimerInterval] = useState(null); + + const updateTimer = useCallback(() => { + setSeconds((s) => { + let sc = clock(s - 1, 59); + if (sc === 59) { + setMinutes((m) => { + let mc = clock(m - 1, 59); + if (mc === 59) { + setHours((h) => { + let hc = clock(h - 1, 23); + if (mc === 23) { + setDays((d) => { + let dc = d - 1; + return dc; + }); + } + return hc; + }); + } + return mc; + }); + } + return sc; + }); + }, []); + + useEffect(() => { + if (!timerInterval) { + setTimerInterval(setInterval(() => updateTimer(), 1000)); + return () => { + clearInterval(Number(timerInterval!)); + }; + } + }, [timerInterval, updateTimer]); + + return ( + <> + + + + + + + + + ); } export default App; diff --git a/src/flip.counter.tsx b/src/flip.counter.tsx new file mode 100644 index 0000000..7341453 --- /dev/null +++ b/src/flip.counter.tsx @@ -0,0 +1,146 @@ +import { useEffect, useState } from 'react'; +import styled, { css, keyframes } from 'styled-components'; + +type WrapperProps = { + $animate?: boolean; + $animationDurationMs: number; +}; + +type FlipTimerProps = { + size: number; + className?: string; + value?: number; + clockValue?: number; +}; + +const flip = keyframes` + from { + transform: rotateX(0deg); + } + to { + transform: rotateX(-180deg); + } +`; + +export const Wrapper = styled.div<{ $size: number }>` + position: relative; + width: ${({ $size }) => $size * 2}px; + height: ${({ $size }) => $size}px; + perspective: 1000px; + user-select: none; +`; + +export const Inner = styled.div` + width: 100%; + height: 100%; + text-align: center; + transform-style: preserve-3d; + /* box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); */ + transform-origin: bottom; + bottom: 0px; + left: 0px; + animation: ${({ $animate, $animationDurationMs }) => + $animate + ? css` + ${flip} ${$animationDurationMs}ms ease-in + ` + : 'none'}; + user-select: none; + border-radius: 10px; +`; + +const TextContainer = styled.div<{ $size: number }>` + font-size: ${({ $size }) => $size * 2 - (($size * 2) / 100) * 45}px; + line-height: ${({ $size }) => $size * 2}px; + border-radius: 10px; +`; + +const Face = styled(TextContainer)` + position: absolute; + width: 100%; + height: 100%; + backface-visibility: hidden; + border-radius: 10px; +`; + +export const Front = styled(Face)` + overflow: hidden; +`; + +export const Back = styled(Face)` + transform: rotateX(180deg); + line-height: 0px; + overflow: hidden; +`; + +export const BottomPlaceholder = styled(TextContainer)` + width: ${({ $size }) => $size * 2}px; + height: ${({ $size }) => $size}px; + line-height: 0px; + overflow: hidden; + text-align: center; + box-shadow: 0 8px 0px 0 rgba(15, 15, 15, 0.3); + + ::before { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #000; + opacity: 0.15; + z-index: 5; + border-radius: 10px; + } +`; + +export const UpperPlaceholder = styled(TextContainer)` + width: ${({ $size }) => $size * 2}px; + height: ${({ $size }) => $size}px; + position: absolute; + bottom: 0px; + left: 0px; + overflow: hidden; + text-align: center; +`; + +const FlipCounter = ({ className, size, value }: FlipTimerProps) => { + const animationDurationMs = 500; + const [displayValue, setDisplayValue] = useState(0); + const [isAnimating, setIsAnimating] = useState(false); + + useEffect(() => { + triggerFlip(); + }, [value]); + + const updateDisplayValue = () => setDisplayValue(value!); + + const triggerFlip = () => { + setIsAnimating(true); + }; + + return ( + + + {displayValue + (value! - displayValue)} + + { + setTimeout(() => { + setIsAnimating(false); + updateDisplayValue(); + }, animationDurationMs - 25); + }} + > + {displayValue} + {displayValue + (value! - displayValue)} + + {displayValue} + + ); +}; + +export default FlipCounter; diff --git a/src/hooks/useTime.tsx b/src/hooks/useTime.tsx new file mode 100644 index 0000000..c2a20b3 --- /dev/null +++ b/src/hooks/useTime.tsx @@ -0,0 +1,192 @@ +import { useReducer } from 'react'; + +const getRandomStartTime = () => { + const randomDate = (start: Date, end: Date) => { + return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())); + }; + const today = new Date(); + const future = new Date(); + future.setDate(future.getDate() + 99); + const result = randomDate(today, future); + let delta = Math.abs(result.getTime() - today.getTime()) / 1000; + const days = Math.floor(delta / 86400); + delta -= days * 86400; + const hours = Math.floor(delta / 3600) % 24; + delta -= hours * 3600; + const minutes = Math.floor(delta / 60) % 60; + delta -= minutes * 60; + const seconds = delta % 60; + + return { + days, + hours, + minutes, + seconds, + }; +}; + +type TimeValues = { + days: number; + hours: number; + minutes: number; + seconds: number; +}; + +type TimeDispatchers = { + days: React.Dispatch; + hours: React.Dispatch; + minutes: React.Dispatch; + seconds: React.Dispatch; +}; + +export enum TimeActionKind { + INCREASE = 'INCREASE', + DECREASE = 'DECREASE', +} + +type DaysAction = { + type: TimeActionKind; + payload: {}; +}; + +type DaysState = { + count: number; +}; + +type HoursAction = { + type: TimeActionKind; + payload: { + dispatchDays: React.Dispatch; + }; +}; + +type HoursState = { + count: number; +}; + +type MinutesAction = { + type: TimeActionKind; + payload: { + dispatchHours: React.Dispatch; + dispatchDays: React.Dispatch; + }; +}; + +type MinutesState = { + count: number; +}; + +type SecondsAction = { + type: TimeActionKind; + payload: { + dispatchMinutes: React.Dispatch; + dispatchHours: React.Dispatch; + dispatchDays: React.Dispatch; + }; +}; + +type SecondsState = { + count: number; +}; + +const clock = (v: number, limit: number) => (v < 0 ? limit : v > limit ? 0 : v); + +const daysReducer = (state: DaysState, action: DaysAction): DaysState => { + switch (action.type) { + case TimeActionKind.DECREASE: + let value = clock(state.count - 1, 23); + return { count: value }; + + default: + throw new Error(); + } +}; + +const hoursReducer = (state: HoursState, action: HoursAction): HoursState => { + switch (action.type) { + case TimeActionKind.DECREASE: + let value = clock(state.count - 1, 23); + if (value === 23) { + action.payload.dispatchDays({ + payload: { + dispatchDays: action.payload.dispatchDays, + }, + type: TimeActionKind.DECREASE, + }); + } + return { count: value }; + + default: + throw new Error(); + } +}; + +const minutesReducer = (state: MinutesState, action: MinutesAction): MinutesState => { + switch (action.type) { + case TimeActionKind.DECREASE: + let value = clock(state.count - 1, 59); + if (value === 59) { + action.payload.dispatchHours({ + payload: { + dispatchDays: action.payload.dispatchDays, + }, + type: TimeActionKind.DECREASE, + }); + } + return { count: value }; + + default: + throw new Error(); + } +}; + +const secondsReducer = (state: SecondsState, action: SecondsAction): SecondsState => { + switch (action.type) { + case TimeActionKind.DECREASE: + let value = clock(state.count - 1, 59); + if (value === 59) { + action.payload.dispatchMinutes({ + payload: { + dispatchHours: action.payload.dispatchHours, + dispatchDays: action.payload.dispatchDays, + }, + type: TimeActionKind.DECREASE, + }); + } + return { count: value }; + + default: + throw new Error(); + } +}; + +const useTime = (): [TimeValues, TimeDispatchers] => { + let { days: d, hours: h, minutes: m, seconds: s } = getRandomStartTime(); + const [days, dispatchDays] = useReducer(daysReducer, { count: Math.round(d) }); + const [hours, dispatchHours] = useReducer(hoursReducer, { + count: Math.round(h), + }); + const [minutes, dispatchMinutes] = useReducer(minutesReducer, { + count: Math.round(m), + }); + const [seconds, dispatchSeconds] = useReducer(secondsReducer, { + count: Math.round(s), + }); + + return [ + { + days: days.count, + hours: hours.count, + minutes: minutes.count, + seconds: seconds.count, + }, + { + days: dispatchDays, + hours: dispatchHours, + minutes: dispatchMinutes, + seconds: dispatchSeconds, + }, + ]; +}; + +export default useTime; diff --git a/src/index.css b/src/index.css deleted file mode 100644 index ec2585e..0000000 --- a/src/index.css +++ /dev/null @@ -1,13 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} diff --git a/src/index.tsx b/src/index.tsx index 032464f..6c8fd2a 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -1,16 +1,12 @@ -import React from 'react'; import ReactDOM from 'react-dom/client'; -import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); root.render( - - - + // + + // ); // If you want to start measuring performance in your app, pass a function diff --git a/src/timer.tsx b/src/timer.tsx new file mode 100644 index 0000000..feb22f4 --- /dev/null +++ b/src/timer.tsx @@ -0,0 +1,59 @@ +import FlipCounter from 'flip.counter'; +import useTime, { TimeActionKind } from 'hooks/useTime'; +import { useCallback, useEffect, useState } from 'react'; +import styled from 'styled-components'; + +const Container = styled.div` + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 3%; + height: 100vh; + margin-top: -1.9%; +`; + +const Flipper = styled(FlipCounter)` + & > *, + & > * > * { + background-color: hsl(236, 21%, 26%); + color: hsl(345, 95%, 68%); + } +`; + +function Timer() { + let size = 70; + const [time, dispatch] = useTime(); + const [timerInterval, setTimerInterval] = useState(null); + + const updateTimer = useCallback(() => { + dispatch.seconds({ + type: TimeActionKind.DECREASE, + payload: { + dispatchMinutes: dispatch.minutes, + dispatchHours: dispatch.hours, + dispatchDays: dispatch.days, + }, + }); + }, [dispatch]); + + useEffect(() => { + if (!timerInterval) { + setTimerInterval(setInterval(() => updateTimer(), 1000)); + return () => { + clearInterval(Number(timerInterval!)); + }; + } + }, [timerInterval, updateTimer]); + + return ( + + + + + + + ); +} + +export default Timer; diff --git a/style-guide.md b/style-guide.md new file mode 100644 index 0000000..ac1e779 --- /dev/null +++ b/style-guide.md @@ -0,0 +1,41 @@ +# Front-end Style Guide + +## Layout + +The designs were created to the following widths: + +- Mobile: 375px +- Desktop: 1440px + +## Colors + +### Primary + +- Grayish blue: hsl(237, 18%, 59%) +- Soft red: hsl(345, 95%, 68%) + +### Neutral + +- White: hsl(0, 0%, 100%) +- Dark desaturated blue: hsl(236, 21%, 26%) +- Very dark blue: hsl(235, 16%, 14%) +- Very dark (mostly black) blue: hsl(234, 17%, 12%) + +## Typography + +### Body Copy + +- Font size: 14px + +### Font + +- Family: [Red Hat Text](https://fonts.google.com/specimen/Red+Hat+Text) +- Weights: 700 + +## Icons + +We provide the required social icons. But, if you prefer, you can use a font icon library. Some suggestions can be found below: + +- [Font Awesome](https://fontawesome.com) +- [IcoMoon](https://icomoon.io) +- [Ionicons](https://ionicons.com) \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index a273b0c..dad08a2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,26 +1,21 @@ { - "compilerOptions": { - "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], - "allowJs": true, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx" - }, - "include": [ - "src" - ] + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "baseUrl": "src", + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"] } From 4c3ca4b5899da4b0aaab9f4094d441cc8343ea35 Mon Sep 17 00:00:00 2001 From: BadLice Date: Tue, 18 Oct 2022 12:08:20 +0200 Subject: [PATCH 2/4] completed --- src/App.tsx | 128 ++++++++--------------------------- src/flip.counter.tsx | 76 ++++++++++++++++++++- src/social.tsx | 44 ++++++++++++ src/styled/container.row.tsx | 12 ++++ src/timer.tsx | 29 +++----- src/title.tsx | 21 ++++++ 6 files changed, 188 insertions(+), 122 deletions(-) create mode 100644 src/social.tsx create mode 100644 src/styled/container.row.tsx create mode 100644 src/title.tsx diff --git a/src/App.tsx b/src/App.tsx index 32ac068..d28a8e8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,121 +1,47 @@ -import FlipCounter from 'flip.counter'; -import { useCallback, useEffect, useState } from 'react'; +import Social from 'social'; import styled, { createGlobalStyle } from 'styled-components'; +import Timer from 'timer'; +import Title from 'title'; const GlobalStyles = createGlobalStyle` -* { - box-sizing: border-box; - font-family: 'Red Hat Text', sans-serif; -} + * { + box-sizing: border-box; + font-family: 'Red Hat Text', sans-serif; + } -html, body { - height: 100%; - width: 100%; - margin: 0px; - background-color: hsl(234, 17%, 12%); - background-image: url('images/bg-stars.svg'); -} + html, body { + height: 100%; + width: 100%; + margin: 0px; + background-color: hsl(234, 17%, 12%); + } + + body { + background: url('images/bg-stars.svg'),url('images/pattern-hills.svg') bottom no-repeat; + background-size: 100%; + + } `; -const Container = styled.div` +const ContainerColumn = styled.div` display: flex; - flex-direction: row; + flex-direction: column; justify-content: center; + justify-items: center; align-items: center; gap: 3%; height: 100vh; - margin-top: -1.9%; -`; - -const Flipper = styled(FlipCounter)` - & > *, - & > * > * { - background-color: hsl(236, 21%, 26%); - color: hsl(345, 95%, 68%); - } `; -const getRandomStartTime = () => { - const randomDate = (start: Date, end: Date) => { - return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())); - }; - const today = new Date(); - const future = new Date(); - future.setDate(future.getDate() + 99); - const result = randomDate(today, future); - let delta = Math.abs(result.getTime() - today.getTime()) / 1000; - const days = Math.floor(delta / 86400); - delta -= days * 86400; - const hours = Math.floor(delta / 3600) % 24; - delta -= hours * 3600; - const minutes = Math.floor(delta / 60) % 60; - delta -= minutes * 60; - const seconds = delta % 60; - - return { - days, - hours, - minutes, - seconds, - }; -}; - -const clock = (v: number, limit: number) => (v < 0 ? limit : v > limit ? 0 : v); - function App() { - let { days: d, hours: h, minutes: m, seconds: s } = getRandomStartTime(); - - const [days, setDays] = useState(Math.round(d)); - const [hours, setHours] = useState(Math.round(h)); - const [minutes, setMinutes] = useState(Math.round(m)); - const [seconds, setSeconds] = useState(Math.round(s)); - - let size = 70; - const [timerInterval, setTimerInterval] = useState(null); - - const updateTimer = useCallback(() => { - setSeconds((s) => { - let sc = clock(s - 1, 59); - if (sc === 59) { - setMinutes((m) => { - let mc = clock(m - 1, 59); - if (mc === 59) { - setHours((h) => { - let hc = clock(h - 1, 23); - if (mc === 23) { - setDays((d) => { - let dc = d - 1; - return dc; - }); - } - return hc; - }); - } - return mc; - }); - } - return sc; - }); - }, []); - - useEffect(() => { - if (!timerInterval) { - setTimerInterval(setInterval(() => updateTimer(), 1000)); - return () => { - clearInterval(Number(timerInterval!)); - }; - } - }, [timerInterval, updateTimer]); - return ( <> - - - - - - + + + <Timer /> + <Social /> + </ContainerColumn> </> ); } diff --git a/src/flip.counter.tsx b/src/flip.counter.tsx index 7341453..cfd7989 100644 --- a/src/flip.counter.tsx +++ b/src/flip.counter.tsx @@ -11,6 +11,7 @@ type FlipTimerProps = { className?: string; value?: number; clockValue?: number; + label?: string; }; const flip = keyframes` @@ -28,6 +29,16 @@ export const Wrapper = styled.div<{ $size: number }>` height: ${({ $size }) => $size}px; perspective: 1000px; user-select: none; + + @media only screen and (max-width: 576px) { + width: ${({ $size }) => $size * 0.6 * 2}px; + height: ${({ $size }) => $size * 0.6}px; + } + + @media only screen and (max-width: 334px) { + width: ${({ $size }) => $size * 0.4 * 2}px; + height: ${({ $size }) => $size * 0.4}px; + } `; export const Inner = styled.div<WrapperProps>` @@ -35,7 +46,6 @@ export const Inner = styled.div<WrapperProps>` height: 100%; text-align: center; transform-style: preserve-3d; - /* box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); */ transform-origin: bottom; bottom: 0px; left: 0px; @@ -47,12 +57,28 @@ export const Inner = styled.div<WrapperProps>` : 'none'}; user-select: none; border-radius: 10px; + + @media only screen and (max-width: 576px) { + border-radius: 5px; + } `; const TextContainer = styled.div<{ $size: number }>` font-size: ${({ $size }) => $size * 2 - (($size * 2) / 100) * 45}px; line-height: ${({ $size }) => $size * 2}px; border-radius: 10px; + + @media only screen and (max-width: 576px) { + font-size: ${({ $size }) => $size * 0.6 * 2 - (($size * 0.6 * 2) / 100) * 45}px; + line-height: ${({ $size }) => $size * 0.6 * 2}px; + border-radius: 5px; + } + + @media only screen and (max-width: 334px) { + font-size: ${({ $size }) => $size * 0.4 * 2 - (($size * 0.4 * 2) / 100) * 45}px; + line-height: ${({ $size }) => $size * 0.4 * 2}px; + border-radius: 5px; + } `; const Face = styled(TextContainer)` @@ -61,6 +87,10 @@ const Face = styled(TextContainer)` height: 100%; backface-visibility: hidden; border-radius: 10px; + + @media only screen and (max-width: 576px) { + border-radius: 5px; + } `; export const Front = styled(Face)` @@ -92,6 +122,20 @@ export const BottomPlaceholder = styled(TextContainer)` opacity: 0.15; z-index: 5; border-radius: 10px; + + @media only screen and (max-width: 576px) { + border-radius: 5px; + } + } + + @media only screen and (max-width: 576px) { + width: ${({ $size }) => $size * 0.6 * 2}px; + height: ${({ $size }) => $size * 0.6}px; + } + + @media only screen and (max-width: 334px) { + width: ${({ $size }) => $size * 0.4 * 2}px; + height: ${({ $size }) => $size * 0.4}px; } `; @@ -103,9 +147,36 @@ export const UpperPlaceholder = styled(TextContainer)` left: 0px; overflow: hidden; text-align: center; + + @media only screen and (max-width: 576px) { + width: ${({ $size }) => $size * 0.6 * 2}px; + height: ${({ $size }) => $size * 0.6}px; + } + + @media only screen and (max-width: 334px) { + width: ${({ $size }) => $size * 0.4 * 2}px; + height: ${({ $size }) => $size * 0.4}px; + } +`; + +export const Label = styled.p` + text-align: center; + background-color: transparent; + margin-top: 15%; + text-transform: uppercase; + letter-spacing: 7px; + text-indent: 7px; + color: hsl(237, 18%, 59%); + font-size: 11px; + + @media only screen and (max-width: 576px) { + font-size: 7px; + letter-spacing: 0px; + text-indent: 0px; + } `; -const FlipCounter = ({ className, size, value }: FlipTimerProps) => { +const FlipCounter = ({ className, size, value, label }: FlipTimerProps) => { const animationDurationMs = 500; const [displayValue, setDisplayValue] = useState<number>(0); const [isAnimating, setIsAnimating] = useState(false); @@ -139,6 +210,7 @@ const FlipCounter = ({ className, size, value }: FlipTimerProps) => { <Back $size={size}>{displayValue + (value! - displayValue)}</Back> </Inner> <BottomPlaceholder $size={size}>{displayValue}</BottomPlaceholder> + {label && <Label>{label}</Label>} </Wrapper> ); }; diff --git a/src/social.tsx b/src/social.tsx new file mode 100644 index 0000000..a902de4 --- /dev/null +++ b/src/social.tsx @@ -0,0 +1,44 @@ +import styled from 'styled-components'; +import ContainerRow from 'styled/container.row'; + +const Container = styled(ContainerRow)` + align-items: flex-end; + gap: 30px; + width: 100%; +`; + +const IconButton = styled.a` + width: 28px; + height: 28px; + border: none; + background-color: hsl(237, 18%, 59%); + + &:hover { + background-color: hsl(345, 95%, 68%); + cursor: pointer; + } +`; + +const Facebook = styled(IconButton)` + mask: url('./images/icon-facebook.svg') no-repeat; +`; + +const Instagram = styled(IconButton)` + mask: url('./images/icon-instagram.svg') no-repeat; +`; + +const Pinterest = styled(IconButton)` + mask: url('./images/icon-pinterest.svg') no-repeat; +`; + +function Social() { + return ( + <Container> + <Facebook href='https://www.facebook.com/' target='blank' /> + <Instagram href='https://www.instagram.com/' target='blank' /> + <Pinterest href='https://www.pinterest.com/' target='blank' /> + </Container> + ); +} + +export default Social; diff --git a/src/styled/container.row.tsx b/src/styled/container.row.tsx new file mode 100644 index 0000000..446cc69 --- /dev/null +++ b/src/styled/container.row.tsx @@ -0,0 +1,12 @@ +import styled from 'styled-components'; + +const ContainerRow = styled.div` + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 5%; + margin-top: -1.9%; + height: 33%; +`; +export default ContainerRow; diff --git a/src/timer.tsx b/src/timer.tsx index feb22f4..35dc351 100644 --- a/src/timer.tsx +++ b/src/timer.tsx @@ -2,27 +2,18 @@ import FlipCounter from 'flip.counter'; import useTime, { TimeActionKind } from 'hooks/useTime'; import { useCallback, useEffect, useState } from 'react'; import styled from 'styled-components'; - -const Container = styled.div` - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - gap: 3%; - height: 100vh; - margin-top: -1.9%; -`; +import ContainerRow from 'styled/container.row'; const Flipper = styled(FlipCounter)` - & > *, - & > * > * { + & > div, + & > div > div { background-color: hsl(236, 21%, 26%); color: hsl(345, 95%, 68%); } `; function Timer() { - let size = 70; + let size = 60; const [time, dispatch] = useTime(); const [timerInterval, setTimerInterval] = useState<NodeJS.Timer | null>(null); @@ -47,12 +38,12 @@ function Timer() { }, [timerInterval, updateTimer]); return ( - <Container> - <Flipper value={time.days} size={size} /> - <Flipper value={time.hours} size={size} /> - <Flipper value={time.minutes} size={size} /> - <Flipper value={time.seconds} size={size} /> - </Container> + <ContainerRow> + <Flipper value={time.days} size={size} label='days' /> + <Flipper value={time.hours} size={size} label='hours' /> + <Flipper value={time.minutes} size={size} label='minutes' /> + <Flipper value={time.seconds} size={size} label='seconds' /> + </ContainerRow> ); } diff --git a/src/title.tsx b/src/title.tsx new file mode 100644 index 0000000..83aa83c --- /dev/null +++ b/src/title.tsx @@ -0,0 +1,21 @@ +import styled from 'styled-components'; +import ContainerRow from 'styled/container.row'; + +const Text = styled.div` + color: white; + letter-spacing: 8px; + text-indent: 8px; + font-size: 18px; + align-self: flex-end; + text-align: center; +`; + +function Title() { + return ( + <ContainerRow> + <Text>WE'RE LAUNCHING SOON</Text> + </ContainerRow> + ); +} + +export default Title; From 51103a060cfde0d7a56df79b388c2b3758c584ad Mon Sep 17 00:00:00 2001 From: BadLice <alerandom99@gmail.com> Date: Tue, 18 Oct 2022 12:13:58 +0200 Subject: [PATCH 3/4] update readme --- README.md | 2 + package-lock.json | 328 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 92 +++++++------ 3 files changed, 379 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index f30a067..b7020bd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +#Live demo: https://BadLice.github.io/launch-countdown-timer + # Frontend Mentor - Launch countdown timer ![Design preview for the Launch countdown timer coding challenge](./design/desktop-preview.jpg) diff --git a/package-lock.json b/package-lock.json index ecc3b85..1c6149f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,9 @@ "styled-components": "^5.3.6", "typescript": "^4.8.4", "web-vitals": "^2.1.4" + }, + "devDependencies": { + "gh-pages": "^4.0.0" } }, "node_modules/@adobe/css-tools": { @@ -4636,6 +4639,15 @@ "node": ">=8" } }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -6509,6 +6521,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.282.tgz", "integrity": "sha512-Dki0WhHNh/br/Xi1vAkueU5mtIc9XLHcMKB6tNfQKk+kPG0TEUjRh5QEMAUbRp30/rYNMFD1zKKvbVzwq/4wmg==" }, + "node_modules/email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", + "dev": true + }, "node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", @@ -7668,6 +7686,32 @@ "node": ">=10" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -8115,6 +8159,103 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gh-pages": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", + "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", + "dev": true, + "dependencies": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gh-pages/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/gh-pages/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/gh-pages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/gh-pages/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gh-pages/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/gh-pages/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -12131,6 +12272,27 @@ "node": ">=0.10.0" } }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -14995,6 +15157,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", @@ -15449,6 +15623,18 @@ "node": ">=8" } }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -19910,6 +20096,12 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, "array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -21282,6 +21474,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.282.tgz", "integrity": "sha512-Dki0WhHNh/br/Xi1vAkueU5mtIc9XLHcMKB6tNfQKk+kPG0TEUjRh5QEMAUbRp30/rYNMFD1zKKvbVzwq/4wmg==" }, + "email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==", + "dev": true + }, "emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", @@ -22143,6 +22341,23 @@ } } }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true + }, + "filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + } + }, "filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -22442,6 +22657,86 @@ "get-intrinsic": "^1.1.1" } }, + "gh-pages": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-4.0.0.tgz", + "integrity": "sha512-p8S0T3aGJc68MtwOcZusul5qPSNZCalap3NWbhRUZYu1YOdp+EjZ+4kPmRM8h3NNRdqw00yuevRjlkuSzCn7iQ==", + "dev": true, + "requires": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify": "^4.3.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "^8.1.0", + "globby": "^6.1.0" + }, + "dependencies": { + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -25349,6 +25644,21 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -27259,6 +27569,15 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", @@ -27586,6 +27905,15 @@ "punycode": "^2.1.1" } }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", diff --git a/package.json b/package.json index 50bf9e9..c834833 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,51 @@ { - "name": "launch-countdown-timer", - "version": "0.1.0", - "private": true, - "dependencies": { - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "^27.5.2", - "@types/node": "^16.11.65", - "@types/react": "^18.0.21", - "@types/react-dom": "^18.0.6", - "@types/styled-components": "^5.1.26", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-scripts": "5.0.1", - "styled-components": "^5.3.6", - "typescript": "^4.8.4", - "web-vitals": "^2.1.4" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } + "homepage": "https://BadLice.github.io/launch-countdown-timer", + "name": "launch-countdown-timer", + "version": "0.1.0", + "private": true, + "dependencies": { + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.5.2", + "@types/node": "^16.11.65", + "@types/react": "^18.0.21", + "@types/react-dom": "^18.0.6", + "@types/styled-components": "^5.1.26", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-scripts": "5.0.1", + "styled-components": "^5.3.6", + "typescript": "^4.8.4", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "predeploy": "npm run build", + "deploy": "gh-pages -d build" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "gh-pages": "^4.0.0" + } } From ea03cbd0912eea8c3dcc8ab9427911fcd7a39f3c Mon Sep 17 00:00:00 2001 From: BadLice <alerandom99@gmail.com> Date: Tue, 18 Oct 2022 12:14:07 +0200 Subject: [PATCH 4/4] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b7020bd..45d59d6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -#Live demo: https://BadLice.github.io/launch-countdown-timer +# Live demo: https://BadLice.github.io/launch-countdown-timer # Frontend Mentor - Launch countdown timer