Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
0c8a415
Initial commit
laerte-quinui Sep 3, 2025
2276fca
chore: Added Ant Design library
laerte-quinui Sep 3, 2025
2565444
feat: Configure theme colors
laerte-quinui Sep 3, 2025
3d8fa77
feat: Create the Home page
laerte-quinui Sep 3, 2025
b37def9
feat: Create the Pokémon Card
laerte-quinui Sep 3, 2025
45ddd35
feat: Getting Pokémon data with Axios
laerte-quinui Sep 4, 2025
fb36c39
refactor: Move type declarations to a separate file
laerte-quinui Sep 4, 2025
be4a3b2
refactor: Applying the SRP in the Home page
laerte-quinui Sep 4, 2025
c934cfe
fix: Handle Pokemon without animated sprite
laerte-quinui Sep 4, 2025
159d366
fix: Changing verification to handle missing animated sprite
laerte-quinui Sep 4, 2025
7c655ef
refactor: Update layout styling for better responsiveness
laerte-quinui Sep 4, 2025
31ecc8b
feat: Integrate React-Query for data fetching
laerte-quinui Sep 4, 2025
a2a7868
refactor: Create custom hooks for fetch and cache Pokemon data
laerte-quinui Sep 4, 2025
3fb538e
feat: Add loading state to PokeCard
laerte-quinui Sep 4, 2025
f6fd442
feat: Implement pagination
laerte-quinui Sep 4, 2025
bbb8da7
feat: Handle error states in PokeGrid
laerte-quinui Sep 4, 2025
86bc7ef
feat: Add search by Pokémon name and ID
laerte-quinui Sep 4, 2025
6575458
feat: Improove loading and error handlers when searching
laerte-quinui Sep 5, 2025
25fcb2a
feat: Add image fallback in PokeCard
laerte-quinui Sep 5, 2025
5271529
fix: Capitalize Pokémon names in PokeCard title
laerte-quinui Sep 5, 2025
c605910
feat: Integrate react-router for navigation
laerte-quinui Sep 5, 2025
a61f8c1
feat: Create PokemonDetail page
laerte-quinui Sep 5, 2025
7e0542c
feat: Create the PokeInfo component
laerte-quinui Sep 5, 2025
877ba41
feat: Create the PokeStats component
laerte-quinui Sep 6, 2025
e98c486
feat: Add Recharts and create DonutChart component
laerte-quinui Sep 7, 2025
cb483bb
refactor: Move typeColors to a separate utility file
laerte-quinui Sep 7, 2025
d114d63
feat: Create PokeEffectiveness component to display type effectiveness
laerte-quinui Sep 7, 2025
3f9f981
feat: Create EvolutionChain component
laerte-quinui Sep 7, 2025
cd2f701
feat: Enhance responsiveness of PokemonDetail page
laerte-quinui Sep 7, 2025
bc90429
feat: Include stats, cries and other sprites in PokemonProps
laerte-quinui Sep 7, 2025
2de9047
feat: Integrate Pokemon data into PokeInfos component
laerte-quinui Sep 7, 2025
0ca724b
feat: Add play Pokémon cry functionality
laerte-quinui Sep 7, 2025
1f42688
feat: Add shiny sprite visibility
laerte-quinui Sep 7, 2025
34d05a0
feat: Implement species data fetching and typing
laerte-quinui Sep 7, 2025
6980363
feat: Fetch and display species description in PokemonDetail
laerte-quinui Sep 7, 2025
954462b
feat: Add dynamic data to PokemonDetail
laerte-quinui Sep 7, 2025
777607f
refactor: Create separate functions to format pokemon info and stats
laerte-quinui Sep 7, 2025
0bf6ff4
feat: Implement Pokémon type data fetching
laerte-quinui Sep 7, 2025
c2b8c62
feat: Add dynamic data to PokeEffectiveness component
laerte-quinui Sep 7, 2025
4f761a6
feat: Implement evolution chain fetching and typing
laerte-quinui Sep 7, 2025
cb9ca9f
feat: Add dynamic data to EvolutionChain component
laerte-quinui Sep 8, 2025
1f58c1e
refactor: Update flavor_text_entries type to include language informa…
laerte-quinui Sep 8, 2025
2e7cba1
feat: Implement react-router for navigation between home and pokemon …
laerte-quinui Sep 8, 2025
252c7d1
feat: Add navigation in evolution chain card
laerte-quinui Sep 8, 2025
77381f0
feat: Add navigation to the Go back button
laerte-quinui Sep 8, 2025
5fde6d5
feat: Add navigation to the Logo
laerte-quinui Sep 8, 2025
5587d33
feat: Enhance loading states for Pokémon details
laerte-quinui Sep 8, 2025
e48911e
feat: Add NotFound page for handling 404 errors
laerte-quinui Sep 8, 2025
c70e12f
refactir: add StateHandlers component to Pokémon detail page
laerte-quinui Sep 8, 2025
8e8170d
refactor: Move custom hooks to a separate folder
laerte-quinui Sep 8, 2025
54bbda3
refactor: Implement usePokemonDetails hook for cleaner logic
laerte-quinui Sep 8, 2025
977155f
refactor: Improve divider responsiveness
laerte-quinui Sep 8, 2025
275887d
fix: Format Pokémon name for better readability
laerte-quinui Sep 8, 2025
7e0b084
fix: Add unique keys to skeleton components
laerte-quinui Sep 8, 2025
08342c0
fix: Remove anchor tag in evolution chain card
laerte-quinui Sep 8, 2025
31da09c
fix: Change body min-width for better responsiveness
laerte-quinui Sep 8, 2025
f4a6190
fix: Change color of ExportOutlined icon in EvolutionChain component
laerte-quinui Sep 8, 2025
595f4cd
feat: Add README with project overview, features, and setup instructions
laerte-quinui Sep 8, 2025
390f4c0
final commit
laerte-quinui Sep 8, 2025
8ac7e02
Merge branch 'looqbox:master' into dev
laerte-quinui Sep 8, 2025
3d01547
Merge branch 'origin/dev' into dev
laerte-quinui Oct 13, 2025
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
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
9 changes: 9 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"semi": false,
"tabWidth": 2,
"printWidth": 80,
"singleQuote": true,
"trailingComma": "none",
"bracketSpacing": true,
"arrowParens": "avoid"
}
8 changes: 8 additions & 0 deletions .vite/deps/_metadata.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"hash": "1ab388db",
"configHash": "26caf4d4",
"lockfileHash": "ef9654f5",
"browserHash": "0a871461",
"optimized": {},
"chunks": {}
}
3 changes: 3 additions & 0 deletions .vite/deps/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"type": "module"
}
103 changes: 103 additions & 0 deletions README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
<div align="center">
<h1>
Looqbox Frontend chalenge solution
</h1>

This is my solution for the proposed frontend chalenge.

</div>

</br>

<p align="center">
<img src="/public/logo.png" alt="Looqdex Logo" width="400" />
</p>

---

## Table of contents

- [Overview](#overview)
- [Screenshot](#screenshot)
- [Features](#features)
- [Run the project](#run-the-project)
- [My process](#my-process)
- [Built with](#built-with)
- [The journey](#the-journey)
- [Author](#author)

## Overview

### Screenshot

![Home page screenshot](/public/homepage-screenshot.png)
![Details page screenshot](/public/detailpage-screenshot.png)

## Features

- List of Pokémon in the home page
- Searchbar to search any Pokémon by name or ID
- Pagination to display more Pokémon
- Pokémon details page with:
- Animated sprite
- Description
- Pokémon cry
- Shiny sprite display
- Height and Weight
- Charts for base stats visualization
- Type effectiveness
- Evolution chain
- Navigations between two routes (`/` - home page, `/pokemon/:id` - Pokémon details)
- Error and loading handling
- Responsive layout

> See more running the project!

## Run the project

> Disclaimer: This project uses Vite for local hosting and building. Make sure you have Node.js version 22.12 or higher installed so it can work properly.

- Clone the repository in your machine
- Acces the dev branch running: `$ git checkout dev`
- Install the dependencies with `$ npm install`
- Run the project using `$ npm run dev`
- Access the provided localhost url and voilà! Have fun!

## My process

### Built with

- React
- TypeScript
- Vite
- Ant Design
- Recharts - for charts
- Axios - for data fetching
- Tanstack / React-query - for data management and chaching
- React Router - for navigation
- EsLint and Prettier - Linting

### The journey

After reading the chalenge description, I opened Figma to start designing my ideas of pages, layouts and components, so I could get a better base when coding it out. You can check the Figma project [here](https://www.figma.com/design/A5wc90dBVFydtFRyzmhWDr/Looqdex-%7C-Looqbox-Frontend-Chalenge?node-id=106-41&t=pVm6iuhT96ga1ifB-1).

After finishing the design, I started the project by cloning the repository in my machine and setting up Vite with React and Typescript and additional configurations for EsLint and Prettier linting.

Then, I divided my process in simple steps. For each page, I would:

- Create the page component
- Create components related to the page
- Mock data
- Implement responsiviness
- Fetch data from the PokéApi
- Check for possible refactoring and code enhancement

Following this steps, I was capable to finish the project in the estimated time and in a organized way.

## Author

This project was built with a lot of love (and coffee) by me, Laerte Quinui!

- [GitHub](https://github.com/laerte-quinui)
- [LinkedIn](https://www.linkedin.com/in/laerte-quinui/)
- [E-mail](mailto:laertequinuio@gmail.com)
129 changes: 90 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,52 +1,103 @@
### Would you like to work with us? Apply [here](https://looqbox.gupy.io/)!
<div align="center">
<h1>
Looqbox Frontend chalenge solution
</h1>

# Looqbox FrontEnd Challenge
![Looqbox](https://github.com/looqbox/looqbox-frontend-challenge/blob/master/logo.png)
This is my solution for the proposed frontend chalenge.

## Challenge
In this challenge you will need to build a **S**ingle **P**age **A**pplication using ReactJS and a provided api
</div>

We will not use anything from your project other than evaluate your skills and you are free to use it in your portfolio
</br>

## Stack
We use:
- ReactJS
- Redux
- TypeScript
- AntDesign
<p align="center">
<img src="/public/logo.png" alt="Looqdex Logo" width="400" />
</p>

---

## Table of contents

- [Overview](#overview)
- [Screenshot](#screenshot)
- [Features](#features)
- [Run the project](#run-the-project)
- [My process](#my-process)
- [Built with](#built-with)
- [The journey](#the-journey)
- [Author](#author)

## Overview

### Screenshot

![Home page screenshot](/public/homepage-screenshot.png)
![Details page screenshot](/public/detailpage-screenshot.png)

## Features

- List of Pokémon in the home page
- Searchbar to search any Pokémon by name or ID
- Pagination to display more Pokémon
- Pokémon details page with:
- Animated sprite
- Description
- Pokémon cry
- Shiny sprite display
- Height and Weight
- Charts for base stats visualization
- Type effectiveness
- Evolution chain
- Navigations between two routes (`/` - home page, `/pokemon/:id` - Pokémon details)
- Error and loading handling
- Responsive layout

## Submitting
- Make a fork of this repository
- Create your branch
- ⚠️ Do a initial Commit when you start
- ⚠️ Do a final commit when you finish
- When you're done send us a pull request
> See more running the project!

# Guidelines
You need to create a Single Page Application (SPA) that displays a list of Pokémon and allows users to search for them, using the [Pokeapi](https://pokeapi.co/docs/v2). Your app must be dynamic, meaning you **must not** reload the page to show new content.
## Run the project

The PokeAPI was chosen for its simplicity in making requests. Since it is an open API, please **be mindful of how many requests** you make.
> Disclaimer: This project uses Vite for local hosting and building. Make sure you have Node.js version 22.12 or higher installed so it can work properly.

## Requirements:
- Clone the repository in your machine
- Acces the dev branch running: `$ git checkout dev`
- Install the dependencies with `$ npm install`
- Run the project using `$ npm run dev`
- Access the provided localhost url and voilà! Have fun!

- On the main page, include a search bar and a preloaded list of Pokémon.
- Clicking on any Pokémon should display a card, modal, or page with that Pokémon’s information.
- Typing in the search bar and pressing Enter should display the search result instead of the list.
- Your app must include at least two different routes (e.g., /home, /details — be creative!).
- Add a README file to document your project.
## My process

You may use any libraries or dependencies you like (e.g., Axios, Bootstrap, Material UI...).
### Built with

## Bonus points!
- Pagination
- Error handling
- Documentation
- Linting
- Charts
- Unit Testing
- React
- TypeScript
- Vite
- Ant Design
- Recharts - for charts
- Axios - for data fetching
- Tanstack / React-query - for data management and chaching
- React Router - for navigation
- EsLint and Prettier - Linting

### The journey

After reading the chalenge description, I opened Figma to start designing my ideas of pages, layouts and components, so I could get a better base when coding it out. You can check the Figma project [here](https://www.figma.com/design/A5wc90dBVFydtFRyzmhWDr/Looqdex-%7C-Looqbox-Frontend-Chalenge?node-id=106-41&t=pVm6iuhT96ga1ifB-1).

After finishing the design, I started the project by cloning the repository in my machine and setting up Vite with React and Typescript and additional configurations for EsLint and Prettier linting.

Then, I divided my process in simple steps. For each page, I would:

- Create the page component
- Create components related to the page
- Mock data
- Implement responsiviness
- Fetch data from the PokéApi
- Check for possible refactoring and code enhancement

Following this steps, I was capable to finish the project in the estimated time and in a organized way.

## Author

This project was built with a lot of love (and coffee) by me, Laerte Quinui!

## Useful links
- [React docs](https://react.dev/)
- [PokeApi docs](https://pokeapi.co/docs/v2)
- [Redux](https://redux.js.org/)
- [GitHub](https://github.com/laerte-quinui)
- [LinkedIn](https://www.linkedin.com/in/laerte-quinui/)
- [E-mail](mailto:laertequinuio@gmail.com)
23 changes: 23 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { globalIgnores } from 'eslint/config'

export default tseslint.config([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs['recommended-latest'],
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
},
])
13 changes: 13 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Looqdex | Looqbox Frontend Challenge</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
Loading