Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:Common.js: Difference between revisions

MediaWiki interface page
Created page with "Any JavaScript here will be loaded for all users on every page load.: document.addEventListener("DOMContentLoaded", function () { const carousels = document.querySelectorAll('.card-carousel'); carousels.forEach(carousel => { let isDown = false; let startX; let scrollLeft; carousel.addEventListener('mousedown', (e) => { isDown = true; carousel.classList.add('dragging'); startX = e.pageX - carousel.offsetLeft; scrollLeft..."
 
No edit summary
 
(9 intermediate revisions by the same user not shown)
Line 2: Line 2:




document.addEventListener("DOMContentLoaded", function () {
mw.loader.using('jquery', function () {
   const carousels = document.querySelectorAll('.card-carousel');
   $(function () {
    const carousels = document.querySelectorAll('.card-carousel');


  carousels.forEach(carousel => {
    carousels.forEach((carousel) => {
    let isDown = false;
      let isDragging = false;
    let startX;
      let startX;
    let scrollLeft;
      let scrollStart;
      let movedEnough = false;


    carousel.addEventListener('mousedown', (e) => {
    carousel.addEventListener("pointerdown", function (e) {
      isDown = true;
      // Skip custom drag if user is clicking on the scrollbar
      carousel.classList.add('dragging');
      const isScrollbarClick = (
      startX = e.pageX - carousel.offsetLeft;
        e.offsetY > carousel.clientHeight ||
      scrollLeft = carousel.scrollLeft;
        e.offsetY < 0
    });
      );
      if (isScrollbarClick) return;
   
      isDragging = true;
      movedEnough = false;
      carousel.classList.add("dragging");
      startX = e.pageX;
      scrollStart = carousel.scrollLeft;
      carousel.setPointerCapture(e.pointerId);
      e.preventDefault();
    });


    carousel.addEventListener('mouseleave', () => {
      carousel.addEventListener("pointermove", function (e) {
      isDown = false;
        if (!isDragging) return;
      carousel.classList.remove('dragging');
        const x = e.pageX;
    });
        const walk = (x - startX) * 0.75;
        if (Math.abs(walk) > 5) movedEnough = true;
        carousel.scrollLeft = scrollStart - walk;
        e.preventDefault();
      });


    carousel.addEventListener('mouseup', () => {
      const endDrag = () => {
      isDown = false;
        isDragging = false;
      carousel.classList.remove('dragging');
        carousel.classList.remove("dragging");
    });
      };


    carousel.addEventListener('mousemove', (e) => {
      carousel.addEventListener("pointerup", endDrag);
      if (!isDown) return;
      carousel.addEventListener("pointerleave", endDrag);
      e.preventDefault();
 
      const x = e.pageX - carousel.offsetLeft;
      // Block clicks if drag occurred
       const walk = (x - startX) * 1.5;
      carousel.addEventListener("click", function (e) {
      carousel.scrollLeft = scrollLeft - walk;
        if (movedEnough) {
          e.preventDefault();
          e.stopImmediatePropagation();
        }
       }, true); // useCapture = true
     });
     });
   });
   });
});
});

Latest revision as of 16:05, 30 May 2025

/* Any JavaScript here will be loaded for all users on every page load. */


mw.loader.using('jquery', function () {
  $(function () {
    const carousels = document.querySelectorAll('.card-carousel');

    carousels.forEach((carousel) => {
      let isDragging = false;
      let startX;
      let scrollStart;
      let movedEnough = false;

     carousel.addEventListener("pointerdown", function (e) {
       // Skip custom drag if user is clicking on the scrollbar
       const isScrollbarClick = (
         e.offsetY > carousel.clientHeight ||
         e.offsetY < 0
       );
       if (isScrollbarClick) return;
     
       isDragging = true;
       movedEnough = false;
       carousel.classList.add("dragging");
       startX = e.pageX;
       scrollStart = carousel.scrollLeft;
       carousel.setPointerCapture(e.pointerId);
       e.preventDefault();
     });

      carousel.addEventListener("pointermove", function (e) {
        if (!isDragging) return;
        const x = e.pageX;
        const walk = (x - startX) * 0.75;
        if (Math.abs(walk) > 5) movedEnough = true;
        carousel.scrollLeft = scrollStart - walk;
        e.preventDefault();
      });

      const endDrag = () => {
        isDragging = false;
        carousel.classList.remove("dragging");
      };

      carousel.addEventListener("pointerup", endDrag);
      carousel.addEventListener("pointerleave", endDrag);

      // Block clicks if drag occurred
      carousel.addEventListener("click", function (e) {
        if (movedEnough) {
          e.preventDefault();
          e.stopImmediatePropagation();
        }
      }, true); // useCapture = true
    });
  });
});