<!-- --------------------- Created By InCoder --------------------- -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta property="og:title" class="FBTitle">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Random Quote Generator - InCoder</title>
<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">
</head>
<body>
<div class="wrapper">
<div class="container loading">
<div class="preloader">
<i class="fa-solid fa-spinner"></i>
</div>
<h2 class="title">Quote of the day</h2>
<div class="quoteDiv">
<p class="quote"></p>
<div class="authorDiv">
<hr>
<p class="authorName"></p>
</div>
</div>
<div class="footer">
<div class="options">
<div class="speakQuote">
<i class="fa-solid fa-volume-high"></i>
</div>
<div class="copyQuote">
<i class="fa-solid fa-copy"></i>
<div class="copiedMsg">
<p>Copied!</p>
</div>
</div>
<div class="shareQuote">
<i class="fa-solid fa-share-nodes"></i>
<div class="shareQuoteDropdown">
<i class="facebook fa-brands fa-facebook"></i>
<i class="twitter fa-brands fa-twitter"></i>
<i class="whatsapp fa-brands fa-whatsapp"></i>
<i class="linkedin fa-brands fa-linkedin"></i>
</div>
</div>
</div>
<button class="newQuote">New Quote</button>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>
/* --------------------- Created By InCoder --------------------- */
@import url("https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap");
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Poppins", sans-serif;
}
.wrapper {
top: 0;
left: 0;
width: 100vw;
display: flex;
height: 100vh;
position: fixed;
align-items: center;
justify-content: center;
background-color: #181c34;
}
.container {
margin: 1rem;
display: flex;
position: relative;
border-radius: 1rem;
align-items: center;
flex-direction: column;
justify-content: center;
background: rgb(255 255 255);
width: clamp(25rem, 4vw, 30rem);
}
.container .preloader {
display: none;
}
.container.loading .preloader {
z-index: 1;
width: 100%;
height: 100%;
display: grid;
color: #181c34;
font-size: 2.5rem;
position: absolute;
border-radius: 1rem;
place-items: center;
backdrop-filter: blur(4px);
background: rgb(0 0 0 / 50%);
}
.container.loading .preloader i {
z-index: 1;
animation: load 1.5s infinite linear;
}
@keyframes load {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.container .title {
color: #181c34;
margin-top: 0.6rem;
margin-bottom: 0.6rem;
}
.container .quoteDiv {
max-width: 90%;
margin-bottom: 0.6rem;
}
.container.loading .quoteDiv {
min-height: 6rem;
min-width: 18rem;
}
.container .quoteDiv p {
text-align: center;
}
.container :is(.footer, .options) {
display: flex;
}
.container .footer {
width: 100%;
padding: 0.8rem 1rem;
justify-content: space-between;
border-top: 1px solid rgb(0 0 0 / 20%);
}
.container .footer .options :is(.speakQuote, .copyQuote, .shareQuote) {
width: 2.5rem;
display: grid;
height: 2.5rem;
color: #181c34;
cursor: pointer;
font-size: 1.1rem;
position: relative;
place-items: center;
margin-right: 0.6rem;
border-radius: 50rem;
border: 2px solid #181c34;
transition: background 0.3s ease, color 0.3s ease;
}
.container .footer .options :is(.speakQuote, .copyQuote, .shareQuote):hover {
color: #fff;
background: #181c34;
}
.container .footer .newQuote {
border: 0;
color: #fff;
padding: 0 1rem;
cursor: pointer;
font-size: 1rem;
border-radius: 0.6rem;
transition: background 0.3s ease;
background: rgb(24 28 52 / 95%);
}
.container .footer .newQuote:hover {
background: #181c34;
}
.container .footer .newQuote:focus {
outline-offset: 2px;
background: #181c34;
outline: 2px solid #181c34;
}
.container .authorDiv {
float: right;
display: flex;
align-items: center;
}
.container .authorDiv hr {
height: 2px;
width: 1rem;
display: block;
margin-right: 0.3rem;
background: rgb(0 0 0 / 20%);
}
.container .quoteDiv.loading .authorDiv hr {
display: none;
}
.container .footer .shareQuoteDropdown {
top: -5rem;
opacity: 0;
display: flex;
padding: 0.4rem 0;
position: absolute;
background: #fff;
border-radius: 5rem;
pointer-events: none;
transform: translateY(20px);
box-shadow: 0 0 20px rgb(0 0 0 / 50%);
transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;
}
.container .footer .shareQuote.show {
color: #fff;
background: #181c34;
}
.container .footer .shareQuote.show .shareQuoteDropdown {
opacity: 1;
pointer-events: all;
transform: translateY(0);
}
.container .footer .shareQuoteDropdown i {
display: grid;
width: 2.5rem;
color: #fff;
height: 2.5rem;
margin: 0 0.4rem;
position: relative;
place-items: center;
border-radius: 50rem;
background: #181c34;
border: 2px solid #181c34;
}
.container .footer .shareQuoteDropdown .facebook::after {
content: "";
left: 250%;
width: 1rem;
height: 1rem;
bottom: -1rem;
background: #fff;
position: absolute;
transform: rotate(45deg);
}
.container .footer .copyQuote .copiedMsg {
opacity: 0;
z-index: 1;
top: -3.8rem;
display: flex;
color: #181c34;
position: absolute;
background: #fff;
padding: 0.6rem 1rem;
pointer-events: none;
border-radius: 0.6rem;
transform: translateY(10px);
box-shadow: 0 0 20px rgb(0 0 0 / 50%);
transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;
}
.container .footer .copyQuote.show {
color: #fff;
background: #181c34;
}
.container .footer .copyQuote.show .copiedMsg {
opacity: 1;
pointer-events: all;
transform: translateY(0);
}
// --------------------- Created By InCoder ---------------------
let shareQuote = document.querySelector('.shareQuote')
copyQuote = document.querySelector('.copyQuote')
authorName = document.querySelector('.authorName')
quote = document.querySelector('.quote')
container = document.querySelector('.container')
newQuote = document.querySelector('.newQuote')
speakQuote = document.querySelector('.speakQuote')
facebook = document.querySelector('.facebook')
whatsapp = document.querySelector('.whatsapp')
linkedin = document.querySelector('.linkedin')
twitter = document.querySelector('.twitter')
FBTitle = document.querySelector('.FBTitle')
synth = window.speechSynthesis;
quoteData = []
shareQuote.addEventListener('click', () => {
shareQuote.classList.toggle('show')
})
const generateQuote = () => {
container.classList.add('loading')
setTimeout(() => {
fetch("http://api.quotable.io/random").then(response => response.json()).then(result => {
container.classList.remove('loading')
quote.innerHTML = `<i class="fa-solid fa-quote-left"></i> ${result.content} <i class="fa-solid fa-quote-right"></i>`;
authorName.innerText = result.author;
quoteData = [result.content, result.author]
FBTitle.setAttribute('content', `${quoteData[0]} - By ${quoteData[1]}`)
});
}, 1000)
}
generateQuote()
speakQuote.addEventListener('click', () => {
let speakData = `${quoteData[0]} By ${quoteData[1]}`
var quoteSpeech = new SpeechSynthesisUtterance(speakData);
synth.speak(quoteSpeech)
})
copyQuote.addEventListener('click', () => {
let copyData = `${quoteData[0]} - By ${quoteData[1]}`
copyQuote.classList.toggle('show')
navigator.clipboard.writeText(copyData)
setTimeout(() => {
copyQuote.classList.toggle('show')
}, 1500)
})
const sharequote = (platform) => {
let URL
let postData = `${quoteData[0]} - By ${quoteData[1]}`
switch(platform){
case 'twitter':
URL = `https://twitter.com/intent/tweet?url=${postData}`
window.open(URL, "_blank")
case 'facebook':
URL = `https://www.facebook.com/sharer.php?u=${window.location.href}`
window.open(URL, "_blank")
}
}
facebook.addEventListener('click', () => sharequote('facebook'))
twitter.addEventListener('click', () => sharequote('twitter'))
newQuote.addEventListener('click', () => generateQuote())
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.