Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docs update for Hacktoberfest #731

Merged
merged 53 commits into from
Sep 30, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
4391e0b
Initial docs update for Hacktoberfest
Sep 23, 2022
fc59fb3
Contributing.md update
Sep 27, 2022
c0fd547
Update "Before you begin" section
Sep 28, 2022
e628bf0
Update web/docs/tutorials/dev-excuses-app/creating-the-project.md
maksim36ua Sep 28, 2022
9a8abd5
Update web/docs/tutorials/dev-excuses-app/updating-main-page-js-file.md
maksim36ua Sep 28, 2022
aec4f67
Update CONTRIBUTING.md
maksim36ua Sep 28, 2022
f085d7c
Update web/docs/tutorials/dev-excuses-app/modifying-main-wasp-file.md
maksim36ua Sep 28, 2022
7a18d33
Update the section names
Sep 28, 2022
92b5789
Merge branch 'update-contribution-docs' of github.com:wasp-lang/wasp …
Sep 28, 2022
e81565d
Update CONTRIBUTING.md
maksim36ua Sep 28, 2022
790253a
Update web/docs/tutorials/dev-excuses-app/updating-main-page-js-file.md
maksim36ua Sep 28, 2022
4fe91ab
Update web/docs/contributing.md
maksim36ua Sep 28, 2022
b57c449
Update web/docs/contributing.md
maksim36ua Sep 28, 2022
6412f8d
Update web/docs/contributing.md
maksim36ua Sep 28, 2022
2b7d3b9
Add Discord component and some minor fixes
Sep 28, 2022
0ff4670
Add Discord component and some minor fixes
Sep 28, 2022
0069aa5
Add unclear notice
Sep 28, 2022
8dc3a22
Update web/docs/pick-a-tutorial.md
maksim36ua Sep 28, 2022
5a602b5
Update web/docs/tutorials/dev-excuses-app.md
maksim36ua Sep 28, 2022
65ccd5b
Update web/docs/tutorials/dev-excuses-app.md
maksim36ua Sep 28, 2022
b0e9096
Update web/docs/tutorials/dev-excuses-app.md
maksim36ua Sep 28, 2022
dc0ce91
Update CONTRIBUTING.md
maksim36ua Sep 28, 2022
a2d871e
Update web/docs/tutorials/dev-excuses-app/modifying-main-wasp-file.md
maksim36ua Sep 28, 2022
5f51bf0
Update web/docs/getting-started.md
maksim36ua Sep 28, 2022
4afd105
Update web/docs/tutorials/dev-excuses-app/modifying-main-wasp-file.md
maksim36ua Sep 28, 2022
4281672
Review updates
Sep 28, 2022
7a1c8dc
Update web/docs/tutorials/dev-excuses-app/modifying-main-wasp-file.md
maksim36ua Sep 28, 2022
e8fcc19
Update suggestion
Sep 28, 2022
fa718cd
Merge branch 'update-contribution-docs' of github.com:wasp-lang/wasp …
Sep 28, 2022
9c3004c
Update web/docs/tutorials/dev-excuses-app/perform-migration-and-run.md
maksim36ua Sep 28, 2022
6e86157
Update web/docs/tutorials/dev-excuses-app/perform-migration-and-run.md
maksim36ua Sep 28, 2022
ac99892
Update
Sep 28, 2022
9421bc7
Merge branch 'update-contribution-docs' of github.com:wasp-lang/wasp …
Sep 28, 2022
e966507
Update web/docs/tutorials/dev-excuses-app/updating-main-page-js-file.md
maksim36ua Sep 28, 2022
ffb7f38
Update CONTRIBUTING.md
maksim36ua Sep 28, 2022
c407b30
Remove lines
Sep 28, 2022
7ff5568
Merge branch 'update-contribution-docs' of github.com:wasp-lang/wasp …
Sep 28, 2022
ce1fce9
Update CONTRIBUTING.md
maksim36ua Sep 28, 2022
cde6722
Update CONTRIBUTING.md
maksim36ua Sep 28, 2022
7cfe6b8
Update CONTRIBUTING.md
maksim36ua Sep 28, 2022
4db561a
Update getExcuse function
Sep 28, 2022
9b979b2
Merge branch 'update-contribution-docs' of github.com:wasp-lang/wasp …
Sep 28, 2022
11ba4fb
Update page naming convention
Sep 29, 2022
7cc0315
Remove Main.css
Sep 29, 2022
997813e
Update migration text
Sep 29, 2022
26947fa
Update image
Sep 29, 2022
970b6d3
Update "Wasp's compiler is built with Haskell"
Sep 29, 2022
4505b5d
Add tutorials description
Sep 29, 2022
7487586
Merge branch 'release' into update-contribution-docs
Sep 29, 2022
e69d3fd
Update web/docs/pick-a-tutorial.md
maksim36ua Sep 30, 2022
9c2edd0
Update Discord link and tutorial ending
Sep 30, 2022
b5ac7fb
Merge branch 'update-contribution-docs' of github.com:wasp-lang/wasp …
Sep 30, 2022
2f4c1d0
Update links
Sep 30, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 58 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1 +1,58 @@
Check [waspc README](waspc) for detailed contributing guidelines.
# Contributing to Wasp
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

Wasp's compiler is built with Haskell. As an output, you'll get a web application written in React and NodeJS. So there are three ways for you to contribute:
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
- [Haskell-related](#haskell-related)
- [Web dev](#web-dev) (React, Node, HTML/CSS, database and so on)
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
- [Tutorials or Example apps](#tutorials-or-example-apps)
- [Documentation](#documentation)

## Before you begin

- Check the [**Getting Started**](https://wasp-lang.dev/docs) guide to get familiar with Wasp's fundamentals. And ideally, build an app from the [**Pick a Tutorial**](https://wasp-lang.dev/docs/pick-a-tutorial) page
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
- Figure out what you'd like to help with. It can be code, documentation, tutorials, etc. More on this is below.
- Join our Discord [![**Discord**](https://img.shields.io/discord/686873244791210014?label=chat%20on%20discord)](https://discord.gg/rzdnErX) for faster communication and feedback. Also, we'll be glad to help you find the issue you'll enjoy working on, depending on your skill set!
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

Let's jump right in!

---
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

## Haskell-related

Wasp compiler is implemented in Haskell, but you will also see a lot of Javascript and other web technologies because the Wasp compiler transpilers Wasp code into them.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

You don't have to be an expert in Haskell to contribute or understand the code since we don't use complicated Haskell features much -> most of the code is relatively straightforward, and we are happy to help with the part that is not.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

Check the [**Wasp compiler README**](https://github.com/wasp-lang/wasp/blob/main/waspc/README.md) for all the detailed instructions and guides.

[**Haskell-related issues can be found here.**](https://github.com/wasp-lang/wasp/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+label%3Ahaskell)

Feel free to contact us via Discord to ask for an appropriate issue for yourself. Or create new issues directly to work on them.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

---

## Web dev

Wasp is a language for developing full-stack web apps. This means there are plenty of tasks related to web development itself.

[**Web dev issues can be found here.**](https://github.com/wasp-lang/wasp/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+label%3Awebdev)

---

## Tutorials or Example apps

Another great way to help is to create an app with Wasp! We have an [Examples](https://wasp-lang.dev/docs/examples) section on our website. As well as the [Tutorials](https://wasp-lang.dev/docs/pick-a-tutorial) page. Both those sections can be improved and updated with your projects.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want people to merge their examples into our main repo?
Right now, examples we have are examples that we decided to put effort into maintaining and keeping up to date. If people added a number of their own examples, it would grow to an amount we can't support and maintain. Maybe we should rather encourage them to improve our example apps, and if they wish to show case their own example apps, they can add it to some kind of list that we could have somewhere -> I saw many projects having this, a list of projects using them, somewhere at the bottom of the README usually.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The idea was to encourage people to build something with Wasp in the first place. And nothing can be more encouraging than being featured in the docs section of the tool you're using. I'd like to leave the possibility for people to create example apps. And we can decide later in what format it will be.

If the app is great -- it can be made into a tutorial. If it's not great but good enough -- we can ask a developer to commit to maintaining it. And if the dev won't be doing that -- we can remove it from examples list or figure out, whether someone else from the community would like to update it

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am for it, I just wouldn't promise to make it part of our main repo (wasp-lang/wasp) because we already have too much work with maintaining the existing ones. So instead, best if they create them in their own repo -> but we can certainly feature them in our docs!

maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

All that's required is to create an app. And make a tutorial or a blog post to help other people reproduce your work. Some prominent examples are: [Waspello](https://wasp-lang.dev/blog/2021/12/02/waspello), [Waspleau](https://wasp-lang.dev/blog/2022/01/27/waspleau), [It Wasps on My Machine](https://wasp-lang.dev/blog/2022/09/05/dev-excuses-app-tutrial) and [To-Do app](https://wasp-lang.dev/docs/tutorials/todo-app).

Or you can re-build your existing pet project with Wasp. That would be cool!

---

## Documentation

It's the simplest one — a perfect fit for people without coding skills. If you've found an issue or a broken link or any other problems on our [website](https://wasp-lang.dev/) - please, feel free to improve :)
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

[**Documentation issues can be found here.**](https://github.com/wasp-lang/wasp/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22+label%3Adocumentation)


Happy hacking!
15 changes: 10 additions & 5 deletions web/docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@ sidebar_label: Contributing
slug: /contributing
---

Any way you want to contribute is a good way, and we are happy to meet you :)!
Any way you want to contribute is a good way, and we are happy to meet you! A single entry point for all contributors is the [CONTRIBUTING.md](https://github.com/wasp-lang/wasp/blob/main/CONTRIBUTING.md) file in our Github repo. All the requirements and instructions are there. So please check [CONTRIBUTING.md](https://github.com/wasp-lang/wasp/blob/main/CONTRIBUTING.md) for more details.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

Some typical ways to contribute:
1. Join us on discord [![Discord](https://img.shields.io/discord/686873244791210014?label=chat%20on%20discord)](https://discord.gg/rzdnErX) and let's talk! We can discuss language design, new/existing features, weather, or you can just tell us how you feel about Wasp :).
2. If there is something in docs that you think could be improved or clarified, go to [docs Github repo](https://github.com/wasp-lang/wasp) and make an issue/PR! Or, you can do it directly from here by clicking on "edit this page" at the bottom of each page.
3. Create an issue/PR on [core Wasp repo](https://github.com/wasp-lang/wasp) to contribute directly to the language and/or compiler! Check [wapsc README](https://github.com/wasp-lang/wasp/tree/main/waspc) for more details.
Some side notes to make your journey easier:

1. Join us on discord [![Discord](https://img.shields.io/discord/686873244791210014?label=chat%20on%20discord)](https://discord.gg/rzdnErX) and let's talk! We can discuss language design, new/existing features, and weather, or you can tell us how you feel about Wasp :).

2. Wasp's compiler is built with Haskell. So you'll need to be somewhat familiar with this language if you'd like to contribute to the compiler itself. If you don't have Haskell knowledge (or any dev experience at all) - no problem. There are a lot of JS-related tasks and documentation updates as well!
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

3. If there's something you'd like to bring to our attention, go to [docs Github repo](https://github.com/wasp-lang/wasp) and make an issue/PR!
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

Happy hacking!
2 changes: 1 addition & 1 deletion web/docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ That's it :tada:! You have successfully created and served a new web app at <htt

## 4. What next?

**Check out the 🤓 [Todo App tutorial](tutorials/todo-app.md) 🤓 , which will take you through all the core features of Wasp!**
**Check out the 🤓 [Pick a Tutorial page](pick-a-tutorial.md) 🤓. Choose an app, that you'd like to build. And it will take you through all the core features of Wasp!**
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

You can also:
- Join the community on [Discord](https://discord.gg/rzdnErX)! Any feedback or questions you have, we are there for you.
Expand Down
17 changes: 17 additions & 0 deletions web/docs/pick-a-tutorial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
title: Pick a Tutorial
---

import useBaseUrl from '@docusaurus/useBaseUrl';

Congrats, you're now familiar with the basic concepts of Wasp! 🥳

It's time to build something cool and check the capabilities of Wasp in action. Pick one of the app tutorials (there will be more of them with time) and leave us your impressions on Discord [![Discord](https://img.shields.io/discord/686873244791210014?label=chat%20on%20discord)](https://discord.gg/rzdnErX)
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

<img alt="Let's build!"
src={useBaseUrl('img/develop-an-app.jpg')}
style={{ border: "1px solid black" }}
height="400px"
/>

P.S: If you decide to build another app on your own - we'd love to see that! If it's simple enough, let's turn it into a tutorial! Please check our [contribution guide](contributing) for detailed instructions and reach us on Discord.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
24 changes: 24 additions & 0 deletions web/docs/tutorials/dev-excuses-app.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
title: Introduction
---

import useBaseUrl from '@docusaurus/useBaseUrl';

:::info
Make sure you've set up Wasp! Check out [Getting Started](/getting-started.md) first for installation instructions, and then continue with the tutorial. In case of any issues - please, ping us on Discord [![Discord](https://img.shields.io/discord/686873244791210014?label=chat%20on%20discord)](https://discord.gg/rzdnErX).
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
:::

We’ll build a web app to solve every developer's most common problem – finding an excuse to justify our messy work! And will do it with a single config file that covers the full-stack app architecture plus several dozen lines of code. In the quickest possible way, so we can’t excuse ourselves from building it!
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

We’ll use Michele Gerarduzzi’s [open-source project](https://github.com/michelegera/devexcuses-api). It provides a simple API and a solid number of predefined excuses. A perfect fit for our needs. Let’s define the requirements for the project:

- The app should be able to pull excuses data from a public API.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
- Save the ones you liked (and your boss doesn't) to the database for future reference.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
- Building an app shouldn’t take more than 15 minutes.
- Use modern web dev technologies (NodeJS + React)

As a result – we’ll get a simple and fun pet project. You can find the complete codebase [here](https://github.com/wasp-lang/wasp/tree/main/examples/tutorials/ItWaspsOnMyMachine).

<img alt="Final result"
src={useBaseUrl('img/dev-excuses-live-preview.gif')}
/>
40 changes: 40 additions & 0 deletions web/docs/tutorials/dev-excuses-app/adding-operations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
title: Adding operations
---

import useBaseUrl from '@docusaurus/useBaseUrl';

Now you'll need to create two files: `actions.js` and `queries.js` in the `ext` folder.

Let’s add `saveExcuse()` action to our `actions.js` file. This action will save the text of our excuse to the database.

```js title=".../ext/actions.js | Defining an action"
export const saveExcuse = async (excuse, context) => {
return context.entities.Excuse.create({
data: { text: excuse.text }
})
}
```

maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
Then we need to create two queries in the `queries.js` file. First, one `getExcuse` will call an external API and fetch a new excuse. The second one, named `getAllSavedExcuses`, will pull all the excuses we’ve saved to our database.

```js title=".../ext/queries.js | Defining queries"
import axios from 'axios';

export const getExcuse = async () => {
return axios
.get('https://api.devexcus.es/')
.then(res => {
return res.data;
})
.catch(error => {
console.error(error);
});
}
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

export const getAllSavedExcuses = async (_args, context) => {
return context.entities.Excuse.findMany()
}
```

That’s it! We finished our back-end. 🎉 Now, let’s use those queries/actions on our UI.
27 changes: 27 additions & 0 deletions web/docs/tutorials/dev-excuses-app/creating-the-project.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
title: Creating the project
---

import useBaseUrl from '@docusaurus/useBaseUrl';

By now you're already know, [how to create a project and do have Wasp installed](/getting-started.md). So let’s create a new web app project named `ItWaspsOnMyMachine`.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

```
wasp new ItWaspsOnMyMachine
```

Changing the working directory:
```
cd ItWaspsOnMyMachine
```

Starting the app:
```
wasp start
```

Now your default browser should open up with a simple predefined text message. That’s it! 🥳 For now – the codebase consists of only two files! `main.wasp` is the config file that defines the application’s functionality. And `MainPage.js` is the front-end. Everything else, like `Main.css` can be ignored.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

<img alt="Initial page"
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
src={useBaseUrl('img/init-page.png')}
/>
102 changes: 102 additions & 0 deletions web/docs/tutorials/dev-excuses-app/modifying-main-wasp-file.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
---
title: Modifying main.wasp file
---

import useBaseUrl from '@docusaurus/useBaseUrl';

First and foremost, we need to add some dependencies and introduce operations to our project. We’ll add Tailwind to make our UI more pretty and Axios for making API requests.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

Also, we’ll declare a database entity called `Excuse`, queries, and action. The `Excuse` entity consists of the entity’s ID and the text.

`Queries` are here when we need to fetch/read something, while `actions` are here when we need to change/update data. Both query and action declaration consists of two lines – a reference to the file that contains implementation and a data model to operate on. You can find more info [in the docs section below](language/features#queries-and-actions-aka-operations). So let’s proceed.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

Please, add this section to the `main.wasp` file's `app` section.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

```js title="main.wasp | Adding dependencies"
head: [
"<script src='https://cdn.tailwindcss.com'></script>"
],

dependencies: [
("axios", "^0.21.1")
]
```

Then add Excuse entity to the bottom of the file. Also you'll need to define queries and an action.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

```js title="main.wasp | Defining Excuse entity, queries and action"
entity Excuse {=psl
id Int @id @default(autoincrement())
text String
psl=}

query getExcuse {
fn: import { getExcuse } from "@ext/queries.js",
entities: [Excuse]
}

query getAllSavedExcuses {
fn: import { getAllSavedExcuses } from "@ext/queries.js",
entities: [Excuse]
}

action saveExcuse {
fn: import { saveExcuse } from "@ext/actions.js",
entities: [Excuse]
}
```
The resulting `main.wasp` file should look like this:

```js title="main.wasp | Final result"

// Main declaration, defines a new web app.
app ItWaspsOnMyMachine {

// Used as a browser tab title.
title: "It Wasps On My Machine",

head: [
// Adding Tailwind to make our UI prettier
"<script src='https://cdn.tailwindcss.com'></script>"
],

dependencies: [
// Adding Axios for making HTTP requests
("axios", "^0.21.1")
]
}

// Render page MainPage on url `/` (default url).
route RootRoute { path: "/", to: MainPage }

// ReactJS implementation of our page located in `ext/MainPage.js` as a default export
page MainPage {
component: import Main from "@ext/MainPage.js"
}

// Prisma database entity
entity Excuse {=psl
id Int @id @default(autoincrement())
text String
psl=}

// Query declaration to get a new excuse
query getExcuse {
fn: import { getExcuse } from "@ext/queries.js",
entities: [Excuse]
}

// Query declaration to get all excuses
query getAllSavedExcuses {
fn: import { getAllSavedExcuses } from "@ext/queries.js",
entities: [Excuse]
}

// Action to save current excuse
action saveExcuse {
fn: import { saveExcuse } from "@ext/actions.js",
entities: [Excuse]
}
```

Perfect! We've set up all the infrastruction. Now let's add some logic.
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
39 changes: 39 additions & 0 deletions web/docs/tutorials/dev-excuses-app/perform-migration-and-run.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
title: Perform migration and run the app
---

import useBaseUrl from '@docusaurus/useBaseUrl';

Before starting an app – we need to execute database migration because we changed the DB schema by adding new entities. If you’ve had something running in the terminal – stop it and run:
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

```
wasp db migrate-dev
```

You’ll be prompted to enter a name for the migration. Something like `init` will be ok. Now we can start the application!

```
wasp start
```
<img alt="Final empty result"
src={useBaseUrl('img/final-result.png')}
/>

Now you can click the “Get excuse” button to receive an excuse. And save the ones you like into the DB with the “Save excuse” button. Our final project should look like this:
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved

<img alt="Final result"
src={useBaseUrl('img/final-excuse-app.png')}
/>

Now we can think of some additional improvements. For example:

- Add a unique constraint to Entity’s ID so we won’t be able to save duplicated excuses.
- Add exceptions and edge cases handling.
- Make the markup prettier.
- Optimize and polish the code

So, we’ve been able to build a full-stack application with a database and external API call in a couple of minutes. And now we have a box full of excuses for all our development needs.

<img alt="Box of excuses for the win!"
maksim36ua marked this conversation as resolved.
Show resolved Hide resolved
src={useBaseUrl('img/accessible-website-excuse.jpg')}
/>
Loading