static-files/source/js/input-detection.js
function activate() {
  let touchEndHappened = false;

  classListPolyfill.activate();

  const onMouseDown = () => {
    if (touchEndHappened) {
      return;
    }

    document.documentElement.classList.add('mouse-user');
    document.documentElement.classList.add('no-touchevents');
    document.documentElement.classList.remove('touchevents');
  };

  const onTouchEnd = () => {
    touchEndHappened = true;
    setTimeout(() => {
      touchEndHappened = false;
    }, 100);
  };

  const onTouchStart = () => {
    document.documentElement.classList.add('mouse-user');
    document.documentElement.classList.add('touchevents');
    document.documentElement.classList.remove('no-touchevents');
  };

  document.addEventListener('touchstart', onTouchStart);
  document.addEventListener('touchend', onTouchEnd);
  document.addEventListener('mousedown', onMouseDown);

  const keyCodeWhiteList = [9, 33, 34, 35, 36, 37, 38, 39, 40];

  document.addEventListener('keydown', e => {
    if (keyCodeWhiteList.indexOf(e.which) !== -1) {
      document.documentElement.classList.remove('mouse-user');
    }
  });
}
function activate() {
  let touchEndHappened = false;

  classListPolyfill.activate();

  const onMouseDown = () => {
    if (touchEndHappened) {
      return;
    }

    document.documentElement.classList.add('mouse-user');
    document.documentElement.classList.add('no-touchevents');
    document.documentElement.classList.remove('touchevents');
  };

  const onTouchEnd = () => {
    touchEndHappened = true;
    setTimeout(() => {
      touchEndHappened = false;
    }, 100);
  };

  const onTouchStart = () => {
    document.documentElement.classList.add('mouse-user');
    document.documentElement.classList.add('touchevents');
    document.documentElement.classList.remove('no-touchevents');
  };

  document.addEventListener('touchstart', onTouchStart);
  document.addEventListener('touchend', onTouchEnd);
  document.addEventListener('mousedown', onMouseDown);

  const keyCodeWhiteList = [9, 33, 34, 35, 36, 37, 38, 39, 40];

  document.addEventListener('keydown', e => {
    if (keyCodeWhiteList.indexOf(e.which) !== -1) {
      document.documentElement.classList.remove('mouse-user');
    }
  });
}
/* NOTE: https://www.html5rocks.com/en/mobile/touchandmouse/
First, you have to be careful when designing more advanced touch interactions:
when the user uses a mouse it will respond via a click event, but when the user
touches the screen both touch and click events will occur.

For a single click the order of events is:

1. touchstart
2. touchmove
3. touchend
4. mouseover
5. mousemove
6. mousedown
7. mouseup
8. click