diff --git a/Components/Forms/QR-Code-Generator-Form/index.html b/Components/Forms/QR-Code-Generator-Form/index.html new file mode 100644 index 00000000..8020e99f --- /dev/null +++ b/Components/Forms/QR-Code-Generator-Form/index.html @@ -0,0 +1,37 @@ + + + + + + + + QR Code Generator Form + + +
+
+

Generate QR Code

+ +
+ + + +
+
+
+ +
+ + + + + \ No newline at end of file diff --git a/Components/Forms/QR-Code-Generator-Form/main.css b/Components/Forms/QR-Code-Generator-Form/main.css new file mode 100644 index 00000000..22fcffea --- /dev/null +++ b/Components/Forms/QR-Code-Generator-Form/main.css @@ -0,0 +1,100 @@ +:root{ + background: linear-gradient(45deg, #010758, #490d61); + --primary-color: #403d84; + --border-radius: 8px; + --secondary-color: #fff; + --border-color: #7fb7c9; +} +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: sans-serif; +} + +body{ + width: 100%; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + background-color: var(--bcg-color); +} + +.box{ + background-color: var(--primary-color); + padding: 30px; + width: 400px; + border-radius: var(--border-radius); +} + +.qr-header h1{ + font-size: 26px; + text-align: center; + color: var(--secondary-color); + margin-bottom: 24px; + text-transform: uppercase; +} + +.qr-header input{ + width: 100%; + margin-block: 12px; +} + +.qr-header input, select{ + padding: 8px; + border-radius: var(--border-radius); + font-size: 18px; + outline: none; + border: 2px solid var(--border-color); +} + +.qr-header label{ + color: var(--secondary-color); + font-size: 20px; +} + +.qr-header div{ + display: flex; + justify-content: space-between; +} + +.qr-footer{ + display: flex; + justify-content: center; +} +.qr-footer a{ + background-color: var(--secondary-color); + text-decoration: none; + font-size: 20px; + padding: 14px 36px; + margin-inline: 2px; + color: var(--primary-color); + font-weight: 600; + border-radius: var(--border-radius); +} + +.qr-body{ + display: grid; + place-items: center; + padding:20px; +} + +.qr-body img{ + max-width: 100%; + max-height: 100%; + margin-block: 10px; + padding: 20px; + border: 0.5px solid var(--border-color); + border-radius: var(--border-radius); +} + +@media screen and (max-width:520px){ + .box{ + width: 80%; + } + .qr-footer a{ + padding: 12px; + font-size: 16px; + } +} diff --git a/Components/Forms/QR-Code-Generator-Form/script.js b/Components/Forms/QR-Code-Generator-Form/script.js new file mode 100644 index 00000000..8e5c9dc5 --- /dev/null +++ b/Components/Forms/QR-Code-Generator-Form/script.js @@ -0,0 +1,42 @@ +const qrText = document.getElementById('qr-text'); +const sizes = document.getElementById('sizes'); +const generateBtn = document.getElementById('generateBtn'); +const downloadBtn = document.getElementById('downloadBtn'); +const qrContainer = document.querySelector('.qr-body'); + +let size = sizes.value; +generateBtn.addEventListener('click',(e)=>{ + e.preventDefault(); + isEmptyInput(); +}); + +sizes.addEventListener('change',(e)=>{ + size = e.target.value; + isEmptyInput(); +}); + +downloadBtn.addEventListener('click', ()=>{ + let img = document.querySelector('.qr-body img'); + + if(img !== null){ + let imgAtrr = img.getAttribute('src'); + downloadBtn.setAttribute("href", imgAtrr); + } + else{ + downloadBtn.setAttribute("href", `${document.querySelector('canvas').toDataURL()}`); + } +}); + +function isEmptyInput(){ + qrText.value.length > 0 ? generateQRCode() : alert("Enter the text or URL to generate your QR code");; +} +function generateQRCode(){ + qrContainer.innerHTML = ""; + new QRCode(qrContainer, { + text:qrText.value, + height:size, + width:size, + colorLight:"#fff", + colorDark:"#000", + }); +} diff --git a/Components/Forms/Text-To-Voice-Form/index.html b/Components/Forms/Text-To-Voice-Form/index.html new file mode 100644 index 00000000..2345629e --- /dev/null +++ b/Components/Forms/Text-To-Voice-Form/index.html @@ -0,0 +1,30 @@ + + + + + Text To Voice Form + + + + +
+
Text To Voice
+
+
+ + +
+
+ +
+ +
+
+ +
+
+ + + + + diff --git a/Components/Forms/Text-To-Voice-Form/main.js b/Components/Forms/Text-To-Voice-Form/main.js new file mode 100644 index 00000000..cd226f22 --- /dev/null +++ b/Components/Forms/Text-To-Voice-Form/main.js @@ -0,0 +1,57 @@ +const textarea = document.querySelector("textarea"), +voiceList = document.querySelector("select"), +speechBtn = document.querySelector("button"); + +let synth = speechSynthesis, +isSpeaking = true; + +voices(); + +function voices(){ + for(let voice of synth.getVoices()){ + let selected = voice.name === "Google US English" ? "selected" : ""; + let option = ``; + voiceList.insertAdjacentHTML("beforeend", option); + } +} + +synth.addEventListener("voiceschanged", voices); + +function textToSpeech(text){ + let utterance = new SpeechSynthesisUtterance(text); + for(let voice of synth.getVoices()){ + if(voice.name === voiceList.value){ + utterance.voice = voice; + } + } + synth.speak(utterance); +} + +speechBtn.addEventListener("click", e =>{ + e.preventDefault(); + if(textarea.value !== ""){ + if(!synth.speaking){ + textToSpeech(textarea.value); + } + if(textarea.value.length > 80){ + setInterval(()=>{ + if(!synth.speaking && !isSpeaking){ + isSpeaking = true; + speechBtn.innerText = "Convert To Speech"; + }else{ + } + }, 500); + if(isSpeaking){ + synth.resume(); + isSpeaking = false; + speechBtn.innerText = "Pause Speech"; + }else{ + synth.pause(); + isSpeaking = true; + speechBtn.innerText = "Resume Speech"; + } + }else{ + speechBtn.innerText = "Convert To Speech"; + } + } +}); \ No newline at end of file diff --git a/Components/Forms/Text-To-Voice-Form/style.css b/Components/Forms/Text-To-Voice-Form/style.css new file mode 100644 index 00000000..79885024 --- /dev/null +++ b/Components/Forms/Text-To-Voice-Form/style.css @@ -0,0 +1,107 @@ +/* Import Google Font - Poppins */ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: 'Poppins', sans-serif; +} +body{ + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + background: linear-gradient(45deg, #010758, #490d61); +} +::selection{ + color: #fff; + background: #5256AD; +} + +.wrapper{ + width: 370px; + padding: 25px 30px; + border-radius: 7px; + background: #fff; + box-shadow: 7px 7px 30px rgba(209, 203, 203, 0.745) +} +.wrapper header{ + font-size: 28px; + font-weight: 500; + text-align: center; +} +.wrapper form{ + margin: 35px 0 20px; +} +form .row{ + display: flex; + margin-bottom: 20px; + flex-direction: column; +} +form .row label{ + font-size: 18px; + margin-bottom: 5px; +} +form .row:nth-child(2) label{ + font-size: 17px; +} +form :where(textarea, select, button){ + outline: none; + width: 100%; + height: 100%; + border: none; + border-radius: 5px; +} +form .row textarea{ + resize: none; + height: 110px; + font-size: 15px; + padding: 8px 10px; + border: 1px solid #999; +} +form .row textarea::-webkit-scrollbar{ + width: 0px; +} +form .row .outer{ + height: 47px; + display: flex; + padding: 0 10px; + align-items: center; + border-radius: 5px; + justify-content: center; + border: 1px solid #999; +} +form .row select{ + font-size: 14px; + background: none; +} +form .row select::-webkit-scrollbar{ + width: 8px; +} +form .row select::-webkit-scrollbar-track{ + background: #fff; +} +form .row select::-webkit-scrollbar-thumb{ + background: #888; + border-radius: 8px; + border-right: 2px solid #ffffff; +} +form button{ + height: 52px; + color: #fff; + font-size: 17px; + cursor: pointer; + margin-top: 10px; + background: #675AFE; + transition: 0.3s ease; +} +form button:hover{ + background: #4534fe; +} + +@media(max-width: 400px){ + .wrapper{ + max-width: 345px; + width: 100%; + } +} \ No newline at end of file diff --git a/assets/html_files/forms.html b/assets/html_files/forms.html index 21fe30d6..a24d9947 100644 --- a/assets/html_files/forms.html +++ b/assets/html_files/forms.html @@ -326,6 +326,32 @@

Newsletter Subscription-2 Form

+
+

Text To Voice Form

+
+ + + +
+
+ + + +
+
+
+

QR Code Generator Form

+
+ + + +
+
+ + + +
+