JSFiddle - React, Tailwind, and code Playground

by velo_ninja

HTML

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive Background</title>

  <style data-rapport-style>
  </style>

  <style>
    .rapport {
      background-color: rgb(252, 246, 245);
      width: 100%;
      height: 500px;
      background-image: url("https://www.brainline.org/sites/all/modules/custom/bl_brain/images/brain-lateral.png");
      background-size: var(--size);
    }

    #patternSizeSlider {
      accent-color: rgb(36, 35, 35);
      display: block;
      margin: 0px auto;
      width: 350px;
      max-width: 90%;
      margin-bottom: 20px;
    }
  </style>
</head>

<body>

  <input id="patternSizeSlider" type="range" name="points" min="1" max="20" value="10">

  <div class="rapport">
  </div>

  <script>
    const sizeField = document.querySelector("#patternSizeSlider");
    const patternConfigTag = document.querySelector("[data-rapport-style]");
    const imageArea = document.querySelector(".rapport")

    let imageSrc;
    let imageSize;

    const updateImage = () => {
      patternConfigTag.innerHTML = `
      .rapport {
         --background: url(${imageSrc});
         --size: ${imageSize || 150}px;
      }
      `;
    };

    sizeField.addEventListener("input", () => {
      imageSize = sizeField.value * 50;
      updateImage();
    });

    const dropArea = imageArea;

    dropArea.addEventListener('dragover', (event) => {
      event.stopPropagation();
      event.preventDefault();
      // Style the drag-and-drop as a "copy file" operation.
      event.dataTransfer.dropEffect = 'copy';
    });

    dropArea.addEventListener('drop', (event) => {
      event.stopPropagation();
      event.preventDefault();
      const fileList = event.dataTransfer.files;
      const [imageFile] = fileList;
      if (imageFile) {
        imageSrc = URL.createObjectURL(imageFile);
      }
      updateImage();
    });
  </script>

</body>

</html>