<div class="user-input-section">
  <section class="heading">
    <div class="title">QRcodes</div>
    <div class="sub-title">Generate QRCode for anything!</div>
  </section>
  <section class="user-input">
    <input type="text" placeholder="Type something..." name="input_text" id="input_text" autocomplete="off">
    <button class="button" type="submit">Generate<i class="fa-solid fa-rotate"></i></button>
  </section>
</div>
<div class="qr-code-container">
  <div class="qr-code" style></div>
</div>
$primary-color: #2b303a;
$secondary-color: #eee5e9;
$tertiary-color: #7c7c7c;
$qr-code: #7c7c7c33;
$button-color: #92dce5;

:root {
  font-size: 62.5%;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  text-size-adjust: none;
  -webkit-text-size-adjust: none;
}
button:hover {
  cursor: pointer;
}

body {
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: #eae6e5;
  background-color: $primary-color;
  height: 100vh;

  @media screen and (max-width: 50em) {
    flex-direction: column;
    height: 100%;
  }

  .heading {
    margin: 3rem 0 5rem 0;
  }
  .title,
  .sub-title {
    font-size: 4rem;
    text-align: center;
    font-family: "Poppins", sans-serif;
    color: #12130f;
    color: $secondary-color;
  }
  .sub-title {
    font-size: 1.5rem;
    color: $secondary-color;
    opacity: 0.5;
  }

  .user-input-section {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 40%;

    @media screen and (max-width: 50em) {
      width: 100%;
      margin: 2rem 0 0 0;
    }

    .user-input {
      display: flex;
      flex-direction: column;
      align-items: center;
      width: 100%;

      label {
        text-align: center;
        font-size: 1.5rem;
        font-family: "Poppins", sans-serif;
      }

      input {
        width: 80%;
        max-width: 35rem;
        font-family: "Poppins", sans-serif;
        outline: none;
        border: none;
        border-radius: 0.5rem;
        background-color: #9b8774ad;
        background-color: $tertiary-color;
        text-align: center;
        padding: 1.5rem 1rem;
        margin: 1rem 1rem 2rem 1rem;
        color: black;

        &::placeholder {
          color: $secondary-color;
          color: $primary-color;
        }
      }
    }
  }

  .button {
    outline: none;
    border: none;
    border-radius: 0.5rem;
    padding: 1.5rem 2.5rem;
    margin-bottom: 3rem;
    background-color: #5b92799d;
    background-color: $button-color;
    color: black;
    font-family: "Nunito", sans-serif;
    font-size: 1.6rem;

    i {
      margin-left: 1rem;
    }
  }

  .qr-code-container {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 40%;

    @media screen and (max-width: 50em) {
      width: 100%;
      margin: 8rem 0;
    }

    .qr-code {
      display: flex;
      border-radius: 1rem;
      background-color: $qr-code;
      width: fit-content;
      flex-direction: column;
      justify-content: space-between;
      padding: 2rem;

      button {
        display: flex;
        justify-content: center;
        background-color: #1f1f1f;
        color: #eae6e5;
        border: none;
        outline: none;
        width: 100%;
        margin-top: 2.5rem;
        border-radius: 1rem;

        a {
          font-family: "Poppins", sans-serif;
          font-size: 1.5rem;
          width: 100%;
          height: 100%;
          text-decoration: none;
          color: #eae6e5;
          padding: 1rem;

          i {
            margin-left: 0.5rem;
          }
        }
      }
    }
  }
}
View Compiled
let btn = document.querySelector(".button");
let qr_code_element = document.querySelector(".qr-code");

btn.addEventListener("click", () => {
  let user_input = document.querySelector("#input_text");
  if (user_input.value != "") {
    if (qr_code_element.childElementCount == 0) {
      generate(user_input);
    } else {
      qr_code_element.innerHTML = "";
      generate(user_input);
    }
  } else {
    console.log("not valid input");
    qr_code_element.style = "display: none";
  }
});

function generate(user_input) {
  qr_code_element.style = "";

  var qrcode = new QRCode(qr_code_element, {
    text: `${user_input.value}`,
    width: 180, //128
    height: 180,
    colorDark: "#000000",
    colorLight: "#ffffff",
    correctLevel: QRCode.CorrectLevel.H
  });

  let download = document.createElement("button");
  qr_code_element.appendChild(download);

  let download_link = document.createElement("a");
  download_link.setAttribute("download", "qr_code.png");
  download_link.innerHTML = `Download <i class="fa-solid fa-download"></i>`;

  download.appendChild(download_link);

  let qr_code_img = document.querySelector(".qr-code img");
  let qr_code_canvas = document.querySelector("canvas");

  if (qr_code_img.getAttribute("src") == null) {
    setTimeout(() => {
      download_link.setAttribute("href", `${qr_code_canvas.toDataURL()}`);
    }, 300);
  } else {
    setTimeout(() => {
      download_link.setAttribute("href", `${qr_code_img.getAttribute("src")}`);
    }, 300);
  }
}

generate({
  value: "https://murtuzaalisurti.github.io/qr"
});

External CSS

  1. https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css
  2. https://fonts.googleapis.com/css2?family=Josefin+Sans:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,700&amp;family=Poppins:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500&amp;display=swap

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js