<html lang="en">
<head>
<!-- --------------------- Created By InCoder --------------------- -->
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QR Code Generator - InCoderWeb</title>
<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" />
</head>
<body>
<div class="QRMainContainer">
<div class="title">QR Code Generator</div>
<div class="typesOfQR">
<button class="QRTypeBtn textBtn active" data-type="text"><i class="fa-solid fa-file-lines"></i> Free
Text</button>
<button class="QRTypeBtn urlBtn" data-type="url"><i class="fa-solid fa-link"></i> URL</button>
<button class="QRTypeBtn emailBtn" data-type="email"><i class="fa-solid fa-at"></i> E-Mail</button>
<button class="QRTypeBtn phoneBtn" data-type="phone"><i class="fa-solid fa-phone"></i> Phone</button>
<button class="QRTypeBtn smsBtn" data-type="sms"><i class="fa-solid fa-comment-dots"></i> SMS</button>
</div>
<div class="inputFields">
<div class="freeTextInput inputBox active">
<textarea placeholder="Enter text to share" class="textareaTag"></textarea>
</div>
<div class="urlInput inputBox">
<input placeholder="Enter URL" type="url" class="inputTag" />
<p>Enter Link to open when scanned, e.g. https://example.com/</p>
</div>
<div class="emailInput inputBox">
<p>It opens a new email compose draft when scanned. <b>Note: Fill All Fields in order to generate correct QR Code.</b></p>
<input placeholder="Enter E-mail ID" type="email" class="inputTag" />
<input placeholder="Enter E-mail Subject" type="text" class="inputTag" />
<textarea placeholder="Enter Message" class="textareaTag"></textarea>
<p style="float: right;" id="characterCount">20/1000</p>
</div>
<div class="phoneInput inputBox">
<b>Note: In phone number field, first enter country Code and then enter your number.</b>
<input style="margin-top: .5rem;" placeholder="Enter Phone Number" type="text" class="inputTag" />
</div>
<div class="smsInput inputBox">
<b>Note: In phone number field, first enter country Code and then enter your number.</b>
<input style="margin-top: .5rem;" placeholder="Enter Phone Number" type="text" class="inputTag" />
<textarea placeholder="Enter Message" class="textareaTag"></textarea>
</div>
</div>
<div class="QROutputWrapper">
<p style="text-align: right!important; width: 100%;" id="demoText">Demo QR Code</p>
<img alt="Demo QR Code" src="https://drive.google.com/uc?id=10UBG4dByvUY-D_UrkLih_HfaV_1lozYe&export=download" id="demoQR" />
<div id="qrCode"></div>
<p id="demoInfo">Fill the fields to generate QR code.</p>
</div>
<button id="downloadBtn"><i class="fa-solid fa-download"></i> Download QR Code</button>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js"></script>
<script src="script.js"></script>
</body>
</html>
@import url("https://fonts.googleapis.com/css2?family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap");
/* --------------------- Created By InCoder --------------------- */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Ubuntu", sans-serif;
}
body {
display: flex;
height: 100vh;
align-items: center;
justify-content: center;
background-color: #c9580f;
}
input[type="number"]::inner-spin-button,
input[type="number"]::outer-spin-button {
appearance: none;
appearance: none;
appearance: none;
margin: 0;
}
.QRMainContainer {
width: 35rem;
padding: 1rem;
margin: 0.6rem;
transform: scale(.8);
background: #fff;
border-radius: 0.5rem;
}
.QRMainContainer .title {
font-weight: 700;
color: #000000e6;
margin-bottom: 0.8rem;
font-size: clamp(1.5rem, 3.5vw, 2.5rem);
}
.QRTypeBtn {
border: none;
padding: 0.5rem;
cursor: pointer;
color: #c9580f;
font-size: 1.1rem;
margin-right: 0.5rem;
margin-bottom: 0.5rem;
border-radius: 0.6rem;
border: 0.2rem solid #c9580f;
transition: all 0.3s ease-in-out;
}
.QRTypeBtn:hover,
.QRTypeBtn.active {
color: #fff;
background: #c9580f;
}
.inputFields {
margin-top: 1rem;
}
.inputTag {
width: 100%;
height: 3.2rem;
font-size: 1.3rem;
margin-bottom: 1rem;
padding: 0rem 0.5rem;
border-radius: 0.5rem;
border: 3px solid #00000042;
}
.inputTag:focus {
outline: none;
border: 3px solid #c9580f;
}
.textareaTag {
width: 100%;
height: 8rem;
padding: 0.5rem;
resize: vertical;
font-size: 1.2rem;
border-radius: 0.5rem;
border: 3px solid #00000042;
}
.textareaTag:focus {
outline: none;
border: 3px solid #c9580f;
}
/* -------------------------- Free Text Section End -------------------------- */
.freeTextInput textarea {
display: none;
}
.freeTextInput textarea::placeholder {
font-size: 1.2rem;
}
.freeTextInput.active textarea {
display: block;
}
/* -------------------------- Free Text Section End -------------------------- */
/* -------------------------- URL Section Start -------------------------- */
.urlInput {
display: none;
}
.urlInput input {
margin-bottom: 0.2rem !important;
}
.urlInput p {
font-size: 0.9rem;
padding-left: 0.2rem;
}
.urlInput.active {
display: block;
}
/* -------------------------- URL Section End -------------------------- */
/* -------------------------- E-Mail Section Start -------------------------- */
.emailInput {
display: none;
}
.emailInput.active {
display: block;
}
.emailInput p {
margin-bottom: 0.3rem;
}
/* -------------------------- E-Mail Section End -------------------------- */
/* -------------------------- Phone Section Start -------------------------- */
.phoneInput {
display: none;
}
.phoneInput.active {
display: block;
}
/* -------------------------- Phone Section End -------------------------- */
/* -------------------------- SMS Section Start -------------------------- */
.smsInput {
display: none;
}
.smsInput.active {
display: block;
}
/* -------------------------- SMS Section End -------------------------- */
.QROutputWrapper {
display: flex;
padding: 1rem;
margin-top: 1.5rem;
align-items: center;
flex-direction: column;
justify-content: center;
border: 1px dashed #000000bd;
}
.QROutputWrapper img {
width: 10rem;
height: 10rem;
margin-bottom: 0.5rem;
}
#downloadBtn {
z-index: 1;
border: 0px;
width: 100%;
color: #fff;
display: none;
cursor: pointer;
overflow: hidden;
margin-top: 1rem;
font-size: 1.2rem;
position: relative;
border-radius: 6px;
padding: 0.8rem 2rem;
background: #c9580f;
text-decoration: none;
background-position: 5rem;
text-transform: capitalize;
}
#downloadBtn::before {
content: "";
top: 0%;
left: -100%;
z-index: -1;
width: 100%;
height: 100%;
color: #fff;
position: absolute;
transition: left 0.4s;
background-color: #202020;
}
#downloadBtn:hover::before {
left: 0%;
}
// --------------------- Created By InCoder ---------------------
const QRTypeBtn = document.querySelectorAll(".QRTypeBtn")
oldQR = document.getElementById("qrCode")
demoQR = document.getElementById("demoQR")
inputBox = document.querySelectorAll('.inputBox')
inputTag = document.querySelectorAll('.inputTag')
textareaTag = document.querySelectorAll('.textareaTag')
textBtn = document.querySelector('.textBtn')
urlBtn = document.querySelector('.urlBtn')
emailBtn = document.querySelector('.emailBtn')
phoneBtn = document.querySelector('.phoneBtn')
smsBtn = document.querySelector('.smsBtn')
const toggleTab = (type) => {
switch (type) {
case "text":
textBtn.classList.add('active')
document.querySelector('.freeTextInput').classList.add('active')
break;
case "url":
urlBtn.classList.add('active')
document.querySelector('.urlInput').classList.add('active')
break;
case "email":
emailBtn.classList.add('active')
document.querySelector('.emailInput').classList.add('active')
break;
case "phone":
phoneBtn.classList.add('active')
document.querySelector('.phoneInput').classList.add('active')
break;
case "sms":
smsBtn.classList.add('active')
document.querySelector('.smsInput').classList.add('active')
break;
}
}
const downloadQRCode = (imageBase64) => {
var a = document.createElement("a")
a.href = imageBase64
a.download = `QR Image ${Date.now()}.png`
a.click()
}
QRTypeBtn.forEach((btn) => {
btn.addEventListener('click', (e) => {
QRTypeBtn.forEach((btn) => {
if (btn.classList.contains('active')) {
btn.classList.remove('active')
}
})
inputBox.forEach((box) => {
if (box.classList.contains('active')) {
box.classList.remove('active')
}
})
document.getElementById("demoText").style.display = 'block'
document.getElementById("demoInfo").style.display = 'block'
document.getElementById("downloadBtn").style.display = 'none'
oldQR.innerHTML = ''
demoQR.style.display = 'block'
let type
if (e.target.nodeName == "I") {
type = e.target.parentElement.getAttribute('data-type')
} else {
type = e.target.getAttribute('data-type')
}
toggleTab(type)
})
})
const generateQR = (text) => {
demoQR.style.display = 'none'
document.getElementById("demoText").style.display = 'none'
document.getElementById("demoInfo").style.display = 'none'
document.getElementById("downloadBtn").style.display = 'block'
oldQR.innerHTML = ''
let qrcode = new QRCode(document.getElementById("qrCode"), {
text: text,
width: 160,
height: 160,
colorDark: "#000",
colorLight: "#fff",
correctLevel: QRCode.CorrectLevel.H
});
}
let emailData = {}
let smsData = {}
inputTag.forEach((tag) => {
tag.addEventListener('keyup', (e) => {
if (e.target.value == '') {
document.getElementById("demoText").style.display = 'block'
document.getElementById("demoInfo").style.display = 'block'
document.getElementById("downloadBtn").style.display = 'none'
oldQR.innerHTML = ''
demoQR.style.display = 'block'
} else {
if (document.querySelector('.emailInput').classList.contains('active')) {
Object.assign(emailData, {
email: document.querySelectorAll('.emailInput input')[0].value,
emailSubject: document.querySelectorAll('.emailInput input')[1].value
})
} else if (document.querySelector('.phoneInput').classList.contains('active')) {
generateQR(`tel:${document.querySelector('.phoneInput input').value}`)
} else if (document.querySelector('.smsInput').classList.contains('active')) {
Object.assign(smsData, {
phone: document.querySelector('.smsInput input').value
})
} else {
generateQR(e.target.value)
}
}
})
})
textareaTag.forEach((tag) => {
tag.addEventListener('keyup', (e) => {
if (e.target.value == '') {
document.getElementById("demoText").style.display = 'block'
document.getElementById("demoInfo").style.display = 'block'
document.getElementById("downloadBtn").style.display = 'none'
oldQR.innerHTML = ''
demoQR.style.display = 'block'
} else {
if (document.querySelector('.emailInput').classList.contains('active')) {
Object.assign(emailData, { emailMessage: document.querySelector('.emailInput textarea').value })
let emailQRData = `mailto:${emailData.email}?body=${emailData.emailMessage}&subject=${emailData.emailSubject}`
if (emailData.emailSubject != undefined || emailData.email != undefined) {
generateQR(emailQRData)
} else {
alert("First fill Email ID and Subject then fill this field. Otherwise QR Code will not be generated.")
}
} else if (document.querySelector('.smsInput').classList.contains('active')) {
Object.assign(smsData, {
message: document.querySelector('.smsInput textarea').value
})
let smsQRData = `SMSTO:${smsData.phone}:${smsData.message}`
generateQR(smsQRData)
} else {
generateQR(e.target.value)
}
}
})
})
downloadBtn.addEventListener('click', () => {
let imageSRC = document.getElementById("qrCode").querySelector('img').getAttribute('src')
downloadQRCode(imageSRC)
})
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.