Wikipedia Search App demo
by Ayo Isaiah
HTML
<script src="https://fonts.googleapis.com/css2?family=Poppins&display=swap"></script>
<main>
<header class="header">
<img class="logo" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Wikipedia-logo-v2.svg/657px-Wikipedia-logo-v2.svg.png" alt="Wikipedia Logo" />
<form class="search-form js-search-form">
<input placeholder="Type a keyword and press Enter to search" type="search" class="search-input js-search-input" autofocus />
</form>
</header>
<div class="loading-indicator">
<div class="sk-chase js-spinner hidden">
<div class="sk-chase-dot"></div>
<div class="sk-chase-dot"></div>
<div class="sk-chase-dot"></div>
<div class="sk-chase-dot"></div>
<div class="sk-chase-dot"></div>
<div class="sk-chase-dot"></div>
</div>
</div>
<section class="search-results js-search-results"></section>
</main>
CSS
html {
box-sizing: border-box;
}
*,
*::before,
*::after {
box-sizing: inherit;
margin: 0;
padding: 0;
}
:root {
--bg-color: #fff;
--border-color: hsl(0, 0%, 83%);
}
body {
background-color: var(--bg-color);
font-family: 'Poppins', sans-serif;
}
.header {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
border-bottom: 1px solid var(--border-color);
padding: 30px 20px;
margin-bottom: 40px;
}
.logo {
margin-bottom: 30px;
width: 150px;
}
.search-input {
width: 600px;
border-radius: 3px;
padding: 10px;
border: 1px solid var(--border-color);
font-size: 18px;
}
.search-input:focus,
.search-input:active {
border-color: #36c;
outline: none;
}
.search-results {
width: 100%;
max-width: 600px;
margin: 0 auto;
}
.result-item {
margin-bottom: 20px;
}
.result-title {
font-size: 22px;
}
.result-snippet {
font-size: 15px;
color: #444;
}
.result-link {
color: #006621;
text-decoration: none;
display: block;
overflow-wrap: break-word;
}
.loading-indicator {
display: flex;
align-items: center;
justify-content: center;
}
.sk-chase {
width: 40px;
height: 40px;
position: relative;
animation: sk-chase 2.5s infinite linear both;
}
.sk-chase.hidden {
display: none;
}
.sk-chase-dot {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
animation: sk-chase-dot 2.0s infinite ease-in-out both;
}
.sk-chase-dot:before {
content: '';
display: block;
width: 25%;
height: 25%;
background-color: #333;
border-radius: 100%;
animation: sk-chase-dot-before 2.0s infinite ease-in-out both;
}
.sk-chase-dot:nth-child(1) {
animation-delay: -1.1s;
}
.sk-chase-dot:nth-child(2) {
animation-delay: -1.0s;
}
.sk-chase-dot:nth-child(3) {
animation-delay: -0.9s;
}
.sk-chase-dot:nth-child(4) {
animation-delay: -0.8s;
}
.sk-chase-dot:nth-child(5) {
animation-delay: -0.7s;
}
.sk-chase-dot:nth-child(6) {
animation-delay:...
JavaScript
async function handleSubmit(event) {
event.preventDefault();
const inputValue = document.querySelector('.js-search-input').value;
const searchQuery = inputValue.trim();
try {
const results = await searchWikipedia(searchQuery);
console.log(results);
} catch (err) {
console.log(err);
alert('Failed to search wikipedia');
}
}
async function searchWikipedia(searchQuery) {
const endpoint = `https://en.wikipedia.org/w/api.php?action=query&list=search&prop=info&inprop=url&utf8=&format=json&origin=*&srlimit=20&srsearch=${searchQuery}`;
const response = await fetch(endpoint);
if (!response.ok) {
throw Error(response.statusText);
}
const json = await response.json();
return json;
}
const form = document.querySelector('.js-search-form');
form.addEventListener('submit', handleSubmit);