Added a feature to display a dynamic list of pokemon that you can filter by type and generation
TODO: save current filters for page load, add popup page with info, make clickable cards, potential favourites system?
This commit is contained in:
parent
ed5c27f449
commit
636b43a261
377
css/styles.css
377
css/styles.css
|
@ -7,6 +7,24 @@
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--bgColor: #ffffff;
|
--bgColor: #ffffff;
|
||||||
|
--normal: #999999;
|
||||||
|
--fighting: #C03028;
|
||||||
|
--flying: #A890F0;
|
||||||
|
--poison: #A040A0;
|
||||||
|
--ground: #E0C068;
|
||||||
|
--rock: #B8A038;
|
||||||
|
--bug: #A8B820;
|
||||||
|
--ghost: #705898;
|
||||||
|
--steel: #B8B8D0;
|
||||||
|
--fire: #F08030;
|
||||||
|
--water: #6890F0;
|
||||||
|
--grass: #78C850;
|
||||||
|
--electric: #F8D030;
|
||||||
|
--psychic: #F85888;
|
||||||
|
--ice: #98D8D8;
|
||||||
|
--dragon: #7038F8;
|
||||||
|
--dark: #41314e;
|
||||||
|
--fairy: #EE99AC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -82,7 +100,7 @@ h1 {
|
||||||
}
|
}
|
||||||
|
|
||||||
.black {
|
.black {
|
||||||
background-color: #000;
|
background-color: #000; /* Reference[0] https://www.w3schools.com/howto/howto_css_cutout_text.asp */
|
||||||
color: #fff;
|
color: #fff;
|
||||||
mix-blend-mode: multiply;
|
mix-blend-mode: multiply;
|
||||||
}
|
}
|
||||||
|
@ -173,6 +191,357 @@ h3 {
|
||||||
border-bottom: none;
|
border-bottom: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* POKEDEX STYLES */
|
||||||
|
|
||||||
|
#pokedex {
|
||||||
|
max-width: 1300px;
|
||||||
|
margin: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#generation-selector, #type-selector {
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokedex h2 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#generation-selector {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
#generation-selector input {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#generation-selector label {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 10px;
|
||||||
|
min-height: 40px;
|
||||||
|
min-width: 40px;
|
||||||
|
text-align: center;
|
||||||
|
text-shadow: black 0px 0px 3px;
|
||||||
|
line-height: 40px;
|
||||||
|
border-radius: 30px;
|
||||||
|
background-color: #202020;
|
||||||
|
color: white;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#generation-selector label:hover {
|
||||||
|
background-color: #303030;
|
||||||
|
}
|
||||||
|
|
||||||
|
#generation-selector input:checked + label {
|
||||||
|
background-color: var(--bgColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
#type-selector {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
#type-selector input {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#type-selector label {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 10px;
|
||||||
|
margin: 10px;
|
||||||
|
height: 40px;
|
||||||
|
width: 40px;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 40px;
|
||||||
|
border-radius: 30px;
|
||||||
|
background-color: #202020;
|
||||||
|
color: white;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#type-selector label img {
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#type-selector label:hover {
|
||||||
|
background-color: #303030;
|
||||||
|
}
|
||||||
|
|
||||||
|
#type-selector input:checked + label {
|
||||||
|
background-color: var(--bgColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
#normal:checked + label {
|
||||||
|
background-color: var(--normal) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fighting:checked + label {
|
||||||
|
background-color: var(--fighting) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#flying:checked + label {
|
||||||
|
background-color: var(--flying) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#poison:checked + label {
|
||||||
|
background-color: var(--poison) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ground:checked + label {
|
||||||
|
background-color: var(--ground) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#rock:checked + label {
|
||||||
|
background-color: var(--rock) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#bug:checked + label {
|
||||||
|
background-color: var(--bug) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ghost:checked + label {
|
||||||
|
background-color: var(--ghost) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#steel:checked + label {
|
||||||
|
background-color: var(--steel) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fire:checked + label {
|
||||||
|
background-color: var(--fire) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#water:checked + label {
|
||||||
|
background-color: var(--water) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#grass:checked + label {
|
||||||
|
background-color: var(--grass) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#electric:checked + label {
|
||||||
|
background-color: var(--electric) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#psychic:checked + label {
|
||||||
|
background-color: var(--psychic) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ice:checked + label {
|
||||||
|
background-color: var(--ice) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dragon:checked + label {
|
||||||
|
background-color: var(--dragon) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#dark:checked + label {
|
||||||
|
background-color: var(--dark) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#fairy:checked + label {
|
||||||
|
background-color: var(--fairy) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .normal-primary-type {
|
||||||
|
background-color: var(--normal) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .normal-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--normal) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .fighting-primary-type {
|
||||||
|
background-color: var(--fighting) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .fighting-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--fighting) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .flying-primary-type {
|
||||||
|
background-color: var(--flying) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .flying-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--flying) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .poison-primary-type {
|
||||||
|
background-color: var(--poison) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .poison-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--poison) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .ground-primary-type {
|
||||||
|
background-color: var(--ground) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .ground-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--ground) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .rock-primary-type {
|
||||||
|
background-color: var(--rock) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .rock-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--rock) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .bug-primary-type {
|
||||||
|
background-color: var(--bug) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .bug-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--bug) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .ghost-primary-type {
|
||||||
|
background-color: var(--ghost) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .ghost-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--ghost) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .steel-primary-type {
|
||||||
|
background-color: var(--steel) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .steel-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--steel) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .fire-primary-type {
|
||||||
|
background-color: var(--fire) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .fire-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--fire) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .water-primary-type {
|
||||||
|
background-color: var(--water) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .water-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--water) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .grass-primary-type {
|
||||||
|
background-color: var(--grass) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .grass-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--grass) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .electric-primary-type {
|
||||||
|
background-color: var(--electric) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .electric-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--electric) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .psychic-primary-type {
|
||||||
|
background-color: var(--psychic) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .psychic-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--psychic) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .ice-primary-type {
|
||||||
|
background-color: var(--ice) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .ice-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--ice) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .dragon-primary-type {
|
||||||
|
background-color: var(--dragon) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .dragon-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--dragon) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .dark-primary-type {
|
||||||
|
background-color: var(--dark) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .dark-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--dark) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .fairy-primary-type {
|
||||||
|
background-color: var(--fairy) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container .fairy-secondary-type {
|
||||||
|
box-shadow: inset 0px -150px 100px -100px var(--fairy) , 0px 0px 0px 0px transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pokemon-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
overflow-x: auto;
|
||||||
|
overflow-y: hidden;
|
||||||
|
width: 100%;
|
||||||
|
height: 220px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pokemon-card {
|
||||||
|
height: 200px;
|
||||||
|
min-width: 300px;
|
||||||
|
background-color: #444;
|
||||||
|
margin: 10px;
|
||||||
|
border-radius: 40px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pokemon-card img {
|
||||||
|
position: relative;
|
||||||
|
top: -120px;
|
||||||
|
left: 100px;
|
||||||
|
height: 192px;
|
||||||
|
width: 192px;
|
||||||
|
margin: 10px;
|
||||||
|
image-rendering: pixelated;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pokemon-card .pokemon-name {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 1.15em;
|
||||||
|
position: relative;
|
||||||
|
margin: 0;
|
||||||
|
top: 15px;
|
||||||
|
left: 15px;
|
||||||
|
z-index: 1;
|
||||||
|
text-shadow: black 1px 1px 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pokemon-card .pokemon-id {
|
||||||
|
font-weight: 100;
|
||||||
|
font-size: 3.5em;
|
||||||
|
position: relative;
|
||||||
|
margin: 0;
|
||||||
|
top: 15px;
|
||||||
|
left: 15px;
|
||||||
|
z-index: 0;
|
||||||
|
text-shadow: #0008 1px 1px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
/* CAROUSEL STYLES */
|
/* CAROUSEL STYLES */
|
||||||
|
|
||||||
#carousel {
|
#carousel {
|
||||||
|
@ -344,4 +713,10 @@ h3 {
|
||||||
grid-row: 3 / 3;
|
grid-row: 3 / 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* POKEDEX STYLES */
|
||||||
|
|
||||||
|
#generation-selector {
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="below-landing">
|
<div id="below-landing">
|
||||||
|
<section id="pokedex">
|
||||||
|
<h2>Pokedex</h2>
|
||||||
|
<form id="generation-selector"></form>
|
||||||
|
<div id="pokemon-container"></div>
|
||||||
|
<div id="type-selector"></div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section id="features-intro" class="content-column features">
|
<section id="features-intro" class="content-column features">
|
||||||
<h2>Features</h2>
|
<h2>Features</h2>
|
||||||
<p>
|
<p>
|
||||||
|
|
230
js/scripts.js
230
js/scripts.js
|
@ -1,4 +1,5 @@
|
||||||
console.log("hello");
|
let controller = new AbortController(); // Reference[1] https://levelup.gitconnected.com/asynchronous-tasks-got-you-down-heres-how-to-cancel-them-480801e69ae5
|
||||||
|
let signal = controller.signal;
|
||||||
|
|
||||||
// COLOUR PICKER BACKGROUND
|
// COLOUR PICKER BACKGROUND
|
||||||
|
|
||||||
|
@ -175,6 +176,227 @@ function transitionLake() {
|
||||||
transitionBackground("assets/photos/hintersee-3601004.jpg", "white");
|
transitionBackground("assets/photos/hintersee-3601004.jpg", "white");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// POKEDEX
|
||||||
|
|
||||||
|
async function initPokedex() {
|
||||||
|
await populateGenerations();
|
||||||
|
await populateTypes();
|
||||||
|
populatePokedex(signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function populateGenerations() {
|
||||||
|
const container = document.getElementById("generation-selector");
|
||||||
|
const url = "https://pokeapi.co/api/v2/generation/";
|
||||||
|
const response = await fetch(url);
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
let generations = [];
|
||||||
|
let generationsURL = [];
|
||||||
|
|
||||||
|
const genArray = data.results;
|
||||||
|
for (let i = 0; i < genArray.length; i++) {
|
||||||
|
const gen = genArray[i];
|
||||||
|
const genName = gen.name;
|
||||||
|
const genId = genName.split("-")[1].toUpperCase();
|
||||||
|
generations.push(genId);
|
||||||
|
generationsURL.push(gen.url);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < generations.length; i++) {
|
||||||
|
const gen = generations[i];
|
||||||
|
const genButton = document.createElement("input");
|
||||||
|
genButton.type = "checkbox";
|
||||||
|
genButton.value = generationsURL[i];
|
||||||
|
genButton.id = `gen${gen}`;
|
||||||
|
genButton.checked = true;
|
||||||
|
container.appendChild(genButton);
|
||||||
|
const genLabel = document.createElement("label");
|
||||||
|
genLabel.htmlFor = `gen${gen}`;
|
||||||
|
genLabel.innerHTML = `${gen}`;
|
||||||
|
container.appendChild(genLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSelectedGenerations() {
|
||||||
|
const container = document.getElementById("generation-selector");
|
||||||
|
const checkboxes = container.getElementsByTagName("input");
|
||||||
|
let selected = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < checkboxes.length; i++) {
|
||||||
|
if (checkboxes[i].checked) {
|
||||||
|
selected.push(checkboxes[i].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function populateTypes() {
|
||||||
|
const container = document.getElementById("type-selector");
|
||||||
|
const url = "https://pokeapi.co/api/v2/type";
|
||||||
|
const response = await fetch(url);
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
let types = [];
|
||||||
|
|
||||||
|
const typeArray = data.results;
|
||||||
|
for (let i = 0; i < typeArray.length; i++) {
|
||||||
|
const type = typeArray[i];
|
||||||
|
const typeResponse = await fetch(type.url);
|
||||||
|
const typeData = await typeResponse.json();
|
||||||
|
if (typeData.id < 1000) {
|
||||||
|
types.push(type.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = 0; i < types.length; i++) {
|
||||||
|
const type = types[i];
|
||||||
|
const typeButton = document.createElement("input");
|
||||||
|
typeButton.type = "checkbox";
|
||||||
|
typeButton.value = type;
|
||||||
|
typeButton.id = type;
|
||||||
|
typeButton.checked = true;
|
||||||
|
container.appendChild(typeButton);
|
||||||
|
|
||||||
|
const typeImg = document.createElement("img");
|
||||||
|
typeImg.src = `https://raw.githubusercontent.com/duiker101/pokemon-type-svg-icons/5781623f147f1bf850f426cfe1874ba56a9b75ee/icons/${type}.svg`;
|
||||||
|
typeImg.alt = `${type}`;
|
||||||
|
|
||||||
|
const typeLabel = document.createElement("label");
|
||||||
|
typeLabel.htmlFor = type;
|
||||||
|
typeLabel.appendChild(typeImg);
|
||||||
|
container.appendChild(typeLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSelectedTypes() {
|
||||||
|
const container = document.getElementById("type-selector");
|
||||||
|
const checkboxes = container.getElementsByTagName("input");
|
||||||
|
let selected = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < checkboxes.length; i++) {
|
||||||
|
if (checkboxes[i].checked) {
|
||||||
|
selected.push(checkboxes[i].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function populatePokedex(signal) {
|
||||||
|
const container = document.getElementById("pokemon-container");
|
||||||
|
container.innerHTML = "";
|
||||||
|
const types = await getSelectedTypes();
|
||||||
|
const generations = await getSelectedGenerations();
|
||||||
|
for (let i = 0; i < generations.length; i++) {
|
||||||
|
if (signal.aborted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const url = generations[i];
|
||||||
|
const response = await fetch(url);
|
||||||
|
const data = await response.json();
|
||||||
|
const pokemon = data.pokemon_species;
|
||||||
|
for (let j = 0; j < pokemon.length; j++) {
|
||||||
|
if (signal.aborted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const poke = pokemon[j];
|
||||||
|
const speciesURL = poke.url;
|
||||||
|
const speciesResponse = await fetch(speciesURL);
|
||||||
|
const speciesData = await speciesResponse.json();
|
||||||
|
const varieties = speciesData.varieties;
|
||||||
|
for (let k = 0; k < varieties.length; k++) {
|
||||||
|
if (signal.aborted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const variety = varieties[k];
|
||||||
|
const varietyURL = variety.pokemon.url;
|
||||||
|
const varietyResponse = await fetch(varietyURL);
|
||||||
|
const varietyData = await varietyResponse.json();
|
||||||
|
const varietyTypes = varietyData.types;
|
||||||
|
if (types.includes(varietyTypes[0].type.name)) {
|
||||||
|
if (signal.aborted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
addPokemon(varietyData);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
if (types.includes(varietyTypes[1].type.name)) {
|
||||||
|
if (signal.aborted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
addPokemon(varietyData);
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
//no second type
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addPokemon(pokemonData) {
|
||||||
|
const container = document.getElementById("pokemon-container");
|
||||||
|
|
||||||
|
// if (container.childElementCount > 100) {
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
const pokemon = document.createElement("div");
|
||||||
|
pokemon.className = "pokemon-card";
|
||||||
|
pokemon.classList.add(pokemonData.types[0].type.name + "-primary-type");
|
||||||
|
if (pokemonData.types[1]) {
|
||||||
|
pokemon.classList.add(pokemonData.types[1].type.name + "-secondary-type");
|
||||||
|
}
|
||||||
|
pokemon.id = pokemonData.name;
|
||||||
|
|
||||||
|
const pokemonName = document.createElement("p");
|
||||||
|
pokemonName.className = "pokemon-name";
|
||||||
|
let formatedName = "";
|
||||||
|
pokemonData.name.split("-").forEach((word) => {
|
||||||
|
formatedName += word.charAt(0).toUpperCase() + word.slice(1) + " ";
|
||||||
|
});
|
||||||
|
if (formatedName.length > 20) {
|
||||||
|
formatedName = formatedName.slice(0, formatedName.length - 1);
|
||||||
|
formatedName = formatedName.slice(0, formatedName.lastIndexOf(" "));
|
||||||
|
}
|
||||||
|
pokemonName.innerHTML = formatedName;
|
||||||
|
pokemon.appendChild(pokemonName);
|
||||||
|
|
||||||
|
const pokemonId = document.createElement("p");
|
||||||
|
pokemonId.className = "pokemon-id";
|
||||||
|
pokemonId.innerHTML = `#${pokemonData.id}`;
|
||||||
|
pokemon.style.order = pokemonData.id;
|
||||||
|
pokemon.appendChild(pokemonId);
|
||||||
|
|
||||||
|
const pokemonImg = document.createElement("img");
|
||||||
|
pokemonImg.src = pokemonData.sprites.front_default;
|
||||||
|
pokemonImg.alt = pokemonData.name;
|
||||||
|
pokemon.appendChild(pokemonImg);
|
||||||
|
|
||||||
|
container.appendChild(pokemon);
|
||||||
|
}
|
||||||
|
|
||||||
|
const generationSelector = document.getElementById("generation-selector");
|
||||||
|
generationSelector.addEventListener("change", (event) => {
|
||||||
|
restartPokedexUpdate();
|
||||||
|
});
|
||||||
|
|
||||||
|
const typeSelector = document.getElementById("type-selector");
|
||||||
|
typeSelector.addEventListener("change", (event) => {
|
||||||
|
restartPokedexUpdate();
|
||||||
|
});
|
||||||
|
|
||||||
|
function restartPokedexUpdate() {
|
||||||
|
controller.abort();
|
||||||
|
setTimeout(() => {
|
||||||
|
controller = new AbortController();
|
||||||
|
signal = controller.signal;
|
||||||
|
populatePokedex(signal);
|
||||||
|
}, 250);
|
||||||
|
}
|
||||||
|
|
||||||
// ACCORDIAN IMAGES
|
// ACCORDIAN IMAGES
|
||||||
|
|
||||||
function carouselExpand(i) {
|
function carouselExpand(i) {
|
||||||
|
@ -206,7 +428,7 @@ function initCarousel() {
|
||||||
// INITIALIZATION
|
// INITIALIZATION
|
||||||
// Set background colour to last saved value
|
// Set background colour to last saved value
|
||||||
const bgColor = document.getElementById("bgColour");
|
const bgColor = document.getElementById("bgColour");
|
||||||
bgColor.value = localStorage.getItem("bgColour") || "#ffffff";
|
bgColor.value = localStorage.getItem("bgColour") || "#ff0070";
|
||||||
const initR = parseInt(bgColour.value.substring(1, 3), 16);
|
const initR = parseInt(bgColour.value.substring(1, 3), 16);
|
||||||
const initG = parseInt(bgColour.value.substring(3, 5), 16);
|
const initG = parseInt(bgColour.value.substring(3, 5), 16);
|
||||||
const initB = parseInt(bgColour.value.substring(5, 7), 16);
|
const initB = parseInt(bgColour.value.substring(5, 7), 16);
|
||||||
|
@ -214,4 +436,6 @@ changeBackground(initR, initG, initB);
|
||||||
document.documentElement.style.setProperty("--bgColor", bgColour.value);
|
document.documentElement.style.setProperty("--bgColor", bgColour.value);
|
||||||
// Initialize carousel
|
// Initialize carousel
|
||||||
initCarousel();
|
initCarousel();
|
||||||
carouselExpand(1);
|
carouselExpand(1);
|
||||||
|
// Initialize pokedex
|
||||||
|
initPokedex();
|
Loading…
Reference in New Issue