Capture bilinear filtered version of an image from Chrome for use in code

I need to bilinearly filter an image for use thereafter in JS code. Chrome etc. already do this filtering as part of their browser tab content rendering work, when you scale up tab content.

Options

(1) I can do the filtering myself on the CPU, I have code that does so, but it’s a bit wasteful.

(2) I can write or download a GPU shader to do this for me. This means explicit call out to WebGL or what have you, to do the work.

(3) I can ask Chrome for an already-filtered version of the image, as Chrome would render this if we scale up the image in-tab.

Question

It’s (3) that I’ve often wondered about. Is it possible? Is there any way to access those data buffers that represent already-rendered images in Chrome, from Javascript?

(I’m guessing “no” from a security perspective, but I’m hoping for a “yes” that doesn’t include manual screen grabs.)

SonarCloud can’t find .lcov file in Github Action

I am using the sonarqube-scan-action action in a Github Action, following the documentation, to analysize a typescript project, which has Jest.
My action has this block:


- name: Tests
  run: npm run test:coverage
- uses: sonarsource/sonarqube-scan-action@master
  env:
    SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

In the sonar-project.properties file from my project, there is the configuration proposed by the documentation, too, to define the file path:

sonar.javascript.lcov.reportPaths=coverage/lcov.info

When the action runs, it cannot find the .lcov file:


INFO: Analysing [/github/workspace/coverage/lcov.info]
WARN: Could not resolve 1 file paths in [/github/workspace/coverage/lcov.info]

Looking at the logs from the action, the step that generates the coverage outputs this:


info - 2024-09-22 17:36:23,071 -- > /home/runner/work/front-mfe-***/front-mfe-***/coverage/lcov.info

It seems that each action runs in different folders.
I cannot find a way to fix it, I have already searched but didn’t find a solution on the official docs.
Am I missing something?

Tried to change the configuration in the action and in the .properties file but didn’t work out.

how to make node mailer to work on cpanel

Helo , im have this problem with node mailer, its about when user sign up an email would be send to thanks them
but i cant make it work its been 3 days trying to solve this problem.

let transporter = nodemailer.createTransport({
    host: "mail.********.com",
    port: 465,
    secure: true, 
    auth: {
        user: "********",
        pass: "********"
    }
});
```[enter image description here](https://i.sstatic.net/51vX4ykH.png)

app.post(‘/signup’, (req, res) => {
const { name, email, password, gender, userType } = req.body;

const checkUserQuery = 'SELECT * FROM users WHERE email = ?';
connection.query(checkUserQuery, [email], (error, results) => {
    if (error) {
        console.error('Error checking user:', error);
        return res.status(500).json({ success: false, message: 'Internal Server Error' });
    }
    
    if (results.length > 0) {
        return res.status(400).json({ success: false, message: 'User already exists' });
    }
    const query = 'INSERT INTO users (name, email, password, gender, user_type, role) VALUES (?, ?, ?, ?, ?, ?)';
    connection.query(query, [name, email, password, gender, userType, 'regular_user'], (error, results) => {
        if (error) {
            console.error('Error inserting user:', error);
            return res.status(500).json({ success: false, message: 'Internal Server Error' });
        }


    const mailOptions = {
        from: '********', // Use the correct sender email
        to: email,
        subject: 'Welcome to 4thRoom!',
        text: `Hello ${name},nnThank you for registering with 4thRoom. We're excited to have you on board!nnBest regards,nThe 4thRoom Team`
    };

   transporter.sendMail(mailOptions, (error, info) => {
if (error) {...




Ive tried using chatgpt and a lot of youtube videos but i still not able to make it work pls help.[[enter image description here](https://i.sstatic.net/f5QICOm6.png)](https://i.sstatic.net/xHMXr9iI.png)

JavaScript Weight Input Validation Popup Triggering Multiple Times

I’m working on a weight tracking application using JavaScript, and I’m encountering an issue where the “Please enter your weight” alert appears when I try to save the weight. It seems like the saveWeight function is being triggered twice, causing the validation to fail the second time.

document.addEventListener(‘DOMContentLoaded’, function() {
const formattedDate = new Date().toISOString().split(‘T’)[0];
document.getElementById(‘currentDate’).textContent = Today's Date: ${formattedDate};

const weightInput = document.getElementById('weightInput');
const heightInput = document.getElementById('heightInput');
const genderSelect = document.getElementById('genderSelect');
const saveButton = document.getElementById('saveButton');
const clearButton = document.getElementById('clearButton');
const poundsOutput = document.getElementById('poundsOutput');
const bmiWeightOutput = document.getElementById('bmiWeight');
const bmiOutput = document.getElementById('bmiOutput');
const bmiStatus = document.getElementById('bmiStatus');
const ctx = document.getElementById('weightChart').getContext('2d');
let weightChart = null;

function loadSavedRecords() {
    const savedWeights = JSON.parse(localStorage.getItem('weightRecords')) || [];
    renderChart(savedWeights);
}

function saveWeight() {
    const weight = parseFloat(weightInput.value);
    
    // Check if the weight is valid before doing anything else
    if (weight) {
        let savedWeights = JSON.parse(localStorage.getItem('weightRecords')) || [];
        const currentDate = new Date().toISOString().split('T')[0]; // Get the current date again
        
        savedWeights.push({ date: currentDate, weight });
        localStorage.setItem('weightRecords', JSON.stringify(savedWeights));
        loadSavedRecords();
        calculateBMI(weight);
        weightInput.value = ''; // Clear the input field after saving
    } else {
        alert('Please enter your weight');
    }
}

function renderChart(savedWeights) {
    const labels = savedWeights.map(record => record.date);
    const data = savedWeights.map(record => record.weight);

    if (weightChart) {
        weightChart.destroy();
    }

    if (data.length > 0) {
        weightChart = new Chart(ctx, {
            type: 'bar',
            data: {
                labels: labels,
                datasets: [{
                    label: 'Weight (kg)',
                    data: data,
                    backgroundColor: 'rgba(75, 192, 192, 0.6)',
                    borderColor: 'rgba(75, 192, 192, 1)',
                    borderWidth: 2,
                }]
            },
            options: {
                scales: {
                    x: {
                        title: {
                            display: true,
                            text: 'Date'
                        }
                    },
                    y: {
                        beginAtZero: true,
                        title: {
                            display: true,
                            text: 'Weight (kg)'
                        }
                    }
                }
            }
        });
    } else {
        ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
    }
}

function calculateBMI(weight) {
    const heightInMeters = heightInput.value / 100;
    const bmi = (weight / (heightInMeters * heightInMeters)).toFixed(2);
    bmiWeightOutput.textContent = weight;
    bmiOutput.textContent = bmi;

    let status;
    if (bmi < 18.5) status = "Underweight";
    else if (bmi < 24) status = "Normal weight";
    else if (bmi < 29) status = "Overweight";
    else status = "Obesity";

    bmiStatus.textContent = status;
}

function clearData() {
    localStorage.removeItem('weightRecords');
    loadSavedRecords();
    bmiWeightOutput.textContent = '0';
    bmiOutput.textContent = '0';
    bmiStatus.textContent = 'Unknown';
}

const confirmModal = document.getElementById('confirmModal');
const modalClose = document.getElementById('modalClose');
const cancelClear = document.getElementById('cancelClear');
const confirmClear = document.getElementById('confirmClear');

clearButton.addEventListener('click', function() {
    confirmModal.style.display = 'block';
});

modalClose.onclick = function() {
    confirmModal.style.display = 'none';
}

cancelClear.onclick = function() {
    confirmModal.style.display = 'none';
}

confirmClear.onclick = function() {
    clearData();
    confirmModal.style.display = 'none';
}

weightInput.addEventListener('input', function() {
    const weight = parseFloat(weightInput.value);
    if (weight) {
        poundsOutput.textContent = (weight * 2.20462).toFixed(2);
    } else {
        poundsOutput.textContent = '0';
    }
});

saveButton.addEventListener('click', saveWeight);

loadSavedRecords();

});

——————————————-CODE END———————————————-

I have ensured that there are no duplicate event listeners attached to the save button.
The input field for weight is cleared after saving, but I believe the issue might be with how the weight is being parsed or the event listener itself.

Here’s the key part of my code related to saving the weight:

function saveWeight() {
const weight = parseFloat(weightInput.value);

// Check if the weight is valid before doing anything else
if (weight) {
    let savedWeights = JSON.parse(localStorage.getItem('weightRecords')) || [];
    const currentDate = new Date().toISOString().split('T')[0]; // Get the current date again
    
    savedWeights.push({ date: currentDate, weight });
    localStorage.setItem('weightRecords', JSON.stringify(savedWeights));
    loadSavedRecords();
    calculateBMI(weight);
    weightInput.value = ''; // Clear the input field after saving
} else {
    alert('Please enter your weight');
}

}

saveButton.addEventListener(‘click’, saveWeight);

Can’t work around the Object Might be Null in Typescript

Below is the code which is revealing that the object might be null however it is inside of a loop which wouldn’t get executed if there are no members in the loop…. not sure why Typescript is saying there is a null error here…

this.requestService
            .getAccounts(data.user.uid, token.access_token)
            .subscribe((res) => {
              var toloop = res.body;
              var needsupdate = "green";
              //GET THE INDIVIUAL INFORMATION ON AN ACCOUNT
              for (let i = 0; i < (toloop as Array<Object>).length; i++) {
                var toloopviewcolor = "green";
                if ("id" in toloop[i]) { <<---this is possibly Null
                  this.requestService.getRequest(toloop["id"]).subscribe( <<this is possibly Null
                    (account) => {
                      // Create "missing environments" array if addressses exist for display logic
                      if (account["addresses"]) {

How to Create an Interactive Seating Chart

I’m working on a project that involves creating an interactive seating chart, similar to what SeatGeek uses, and I’m looking for some advice or best practices on how to approach.

I’ve looked at the Mapbox GL tutorials and found some insights from SeatGeek’s venue map blog, but I’m curious if anyone has direct experience with a similar implementation. Any guidance would be really helpful

Enable disable multiple inputs on dropdown change selection

I am trying to enable or disable multiple text boxes on selection box change. Meaning when I select any option in a selection box, all fields should be enabled.

Tried the JavaScript and Html below but It only works with the option value of 8 when selected in the dropdown list. However I would like it to work with any option selected. It should enable the first 14 textbox fields with any option selected in the dropdown list and the second dropdown list should enable / disable the last 14 texboxes.

<script type="text/javascript">
    function EnableDisableTextBox(ALE2) {
        var selectedValue = ALE1.options[ALE1.selectedIndex].value;
        var ALE2 = document.getElementById("ALE2");
        ALE2.disabled = selectedValue == 8 ? false : true;
        if (!ALE2.disabled) {
            ALE2.focus();
        }
    }
</script>

<table class="table table-bordered no-margin">
    <tbody>
        <tr>
            <td>
                <b>
                    S
                </b>
            </td>
            <td>
                <div class="col-md-10 col-sm-4 col-xs-4">
                    <select id="ALE1" name="ALE1" class="form-control" onchange="EnableDisableTextBox(this)"
                            required="True">
                        <option value="">
                            ----
                        </option>
                        <cfloop query="qryGetALESelect">
                            <option value="#ale1#">
                                #ALE1#
                            </option>
                        </cfloop>
                    </select>
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE2" name="ALE2"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-md-10 col-sm-4 col-xs-4">
                    <select id="ALE3" name="ALE3" class="form-control" required="True">
                        <option value="">
                            ----
                        </option>
                        <cfloop query="qryGetALESelect">
                            <option value="ALE1">
                                #ALE1#
                            </option>
                        </cfloop>
                    </select>
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE4" name="ALE4"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    T
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE5" name="ALE5"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE6" name="ALE6"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    A
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE8" name="ALE8"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE9" name="ALE9"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input 
                    type="text" class="form-control" id="ALE10" name="ALE10" value="" pattern="^[ 
                    A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder="" data-error="" disabled="disabled"
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE11" name="ALE11"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    R
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE12" name="ALE12"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE13" name="ALE13"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    B
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE14" name="ALE14"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE15" name="ALE15"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE16" name="ALE16"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE17" name="ALE17"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    O
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE18" name="ALE18"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE19" name="ALE19"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    A
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE20" name="ALE20"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE21" name="ALE21"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE22" name="ALE22"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE23" name="ALE23"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    R
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE24" name="ALE24"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE25" name="ALE25"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
        </tr>
        <tr>
            <td>
                <b>
                    D
                </b>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE26" name="ALE26"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE27" name="ALE27"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE28" name="ALE28"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE29" name="ALE29"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
        </tr>
        <tr>
            <td>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE30" name="ALE30"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
            <td>
                <div class="col-sm-8">
                    <input type="text" class="form-control" id="ALE31" name="ALE31"
                           value="" pattern="^[ A-Za-z0-9[]()*-+/%]*$" maxlength="2" placeholder=""
                           data-error="" disabled="disabled">
                </div>
            </td>
            <td>
            </td>
        </tr>
    </tbody>
</table>

Next.js amp and non-amp pages route

“Hello, I have a question. I made a website and I want to add AMP functionality to this website. While normal pages (page.tsx) are loaded on PCs, I want a separate page for AMP (for example, pageamp.tsx) to be loaded on phones. Is this possible?”

Next.js 2 different web pages, AMP compatible and non AMP compatible, under the same folder

Scraping data from public google sheet directly without API

I have a Chrome extension that fetches and displays data from a publicly published Google Sheet (published to the web, not via the Google Sheets API). The extension does not have its database, so it scrapes the data directly from the sheet and updates it periodically (currently set at 1 hour).

I’m concerned about potential issues as my user base grows. Specifically, I’d like to know:

  • Does Google implement rate limits or restrictions for large-scale access to a publicly published Google Sheet?
  • If I have many users, each scraping the sheet periodically (e.g., every hour), could this trigger rate limits or access issues?

Thanks in advance

Currently I am expecting to know what issues I may face when my userbase grow

Smooth scroll does not work with transition animation

I am using NextJS for a personal website. I am trying to have both smooth scroll and a transform animation which increases the size of the selected item. Here you have a simple demo of what I am trying to achieve:

const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

function ScrollContainer() {
  const [selectedIndex, setSelectedIndex] = React.useState(0)
  const itemRefs = React.useRef([])

  React.useEffect(() => {
    itemRefs.current = itemRefs.current.slice(0, items.length)
  }, [])

  const handleItemClick = (index) => {
    if (index !== selectedIndex) {
      setSelectedIndex(index)
      itemRefs.current[index].scrollIntoView({
        behavior: 'smooth',
        block: 'nearest',
        inline: 'center'
      })
    }
  }

  return (
    <div className="w-full h-screen flex items-center justify-center bg-gray-100">
      <div className="w-full max-w-3xl overflow-hidden">
        <div className="flex space-x-4 px-4 py-8 overflow-x-auto snap-x snap-mandatory scrollbar-hide">
          {items.map((item, index) => (
            <div
              key={item}
              ref={el => itemRefs.current[index] = el}
              className={`flex-shrink-0 w-32 h-32 flex items-center justify-center text-2xl font-bold text-white rounded-lg snap-center transition-all duration-300 ease-in-out cursor-pointer
                ${index === selectedIndex ? 'bg-blue-500 scale-110' : 'bg-gray-400 scale-100 hover:bg-gray-500'}`}
              onClick={() => handleItemClick(index)}
            >
              {item}
            </div>
          ))}
        </div>
      </div>
    </div>
  )
}

ReactDOM.createRoot(
  document.getElementById("root")
).render(
  <ScrollContainer />
);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.development.js"></script>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.development.js"></script>

Volume Sliders on Mobile and Desktop

I’m currently working on an audio application where I have multiple volume sliders for different audio tracks. The sliders function well on desktop, but I’m experiencing issues on mobile devices.
Here are the specifics:

Desktop Behavior: The volume sliders work correctly, allowing users to adjust the volume.
Mobile Behavior: The sliders do not respond to touch input, and the slider handles remain stuck at the top position. Interestingly, I can prevent scrolling on mobile, but the sliders themselves remain unresponsive.
Code Context: I have attached my HTML and JavaScript code for reference. I’m particularly concerned about ensuring that the sliders are interactive on both desktop and mobile.

Code : https://www.dropbox.com/scl/fi/qgqijyxezf8drfglt2o4u/Code-for-music-site.paper?rlkey=n9kw1dx9f0q5pw5ezhlte98bb&st=pyncrgqq&dl=0
Interface test : https://seblioteca.com/mixioteca-3

I’ve tried different approaches but haven’t found a solution yet. Any help or suggestions would be greatly appreciated!
Thank you!

What I tried:

I implemented volume sliders using <input type="range"> in my HTML.
I added event listeners to the sliders for input changes to update the audio volume.
I also tried preventing scrolling on mobile devices by using e.preventDefault() on touch events.
I tested the sliders on both desktop and mobile devices.

What I expected:

I expected that the sliders would allow users to adjust the volume interactively on both desktop and mobile. Specifically, I hoped that on mobile, the sliders would be responsive to touch input, allowing users to slide the volume up or down smoothly. However, on mobile, the sliders are unresponsive, even though I can prevent scrolling.