{"version":3,"sources":["what-input.js"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","m","modules","document","window","ask","element","ignoreKeys","specificKeys","registerOnChange","unRegisterOnChange","docElem","documentElement","currentElement","currentInput","currentIntent","currentTimestamp","Date","now","shouldPersist","formInputs","functionList","ignoreMap","specificMap","inputMap","keydown","keyup","mousedown","mousemove","MSPointerDown","MSPointerMove","pointerdown","pointermove","touchstart","touchend","isScrolling","mousePos","x","y","pointerMap","2","3","4","supportsPassive","opts","Object","defineProperty","get","addEventListener","e","addListeners","options","passive","setPersist","PointerEvent","setInput","setIntent","MSPointerEvent","detectWheel","setElement","clearElement","getAttribute","body","sessionStorage","getItem","doUpdate","event","eventKey","which","value","type","pointerType","ignoreMatch","length","indexOf","specificMatch","shouldUpdate","validateTouch","persistInput","activeElem","activeElement","nodeName","toLowerCase","checkClosest","setAttribute","fireFunctions","detectScrolling","target","classList","toString","replace","removeAttribute","setItem","timestamp","touchIsValid","createElement","undefined","onmousewheel","i","len","fn","call","screenX","screenY","elem","tag","ElementPrototype","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","closest","parentElement","parentNode","nodeType","Array","opt","arr","eventType","push","position","match","objPos","splice","clearStorage","clear","c","p","moduleId","id","loaded"],"mappings":"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","file":"what-input.min.js","sourcesContent":["/**\n * what-input - A global utility for tracking the current input method (mouse, keyboard or touch).\n * @version v5.2.10\n * @link https://github.com/ten1seven/what-input\n * @license MIT\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"whatInput\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"whatInput\"] = factory();\n\telse\n\t\troot[\"whatInput\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t  /*\n\t   * bail out if there is no document or window\n\t   * (i.e. in a node/non-DOM environment)\n\t   *\n\t   * Return a stubbed API instead\n\t   */\n\t  if (typeof document === 'undefined' || typeof window === 'undefined') {\n\t    return {\n\t      // always return \"initial\" because no interaction will ever be detected\n\t      ask: function ask() {\n\t        return 'initial';\n\t      },\n\n\t      // always return null\n\t      element: function element() {\n\t        return null;\n\t      },\n\n\t      // no-op\n\t      ignoreKeys: function ignoreKeys() {},\n\n\t      // no-op\n\t      specificKeys: function specificKeys() {},\n\n\t      // no-op\n\t      registerOnChange: function registerOnChange() {},\n\n\t      // no-op\n\t      unRegisterOnChange: function unRegisterOnChange() {}\n\t    };\n\t  }\n\n\t  /*\n\t   * variables\n\t   */\n\n\t  // cache document.documentElement\n\t  var docElem = document.documentElement;\n\n\t  // currently focused dom element\n\t  var currentElement = null;\n\n\t  // last used input type\n\t  var currentInput = 'initial';\n\n\t  // last used input intent\n\t  var currentIntent = currentInput;\n\n\t  // UNIX timestamp of current event\n\t  var currentTimestamp = Date.now();\n\n\t  // check for a `data-whatpersist` attribute on either the `html` or `body` elements, defaults to `true`\n\t  var shouldPersist = 'false';\n\n\t  // form input types\n\t  var formInputs = ['button', 'input', 'select', 'textarea'];\n\n\t  // empty array for holding callback functions\n\t  var functionList = [];\n\n\t  // list of modifier keys commonly used with the mouse and\n\t  // can be safely ignored to prevent false keyboard detection\n\t  var ignoreMap = [16, // shift\n\t  17, // control\n\t  18, // alt\n\t  91, // Windows key / left Apple cmd\n\t  93 // Windows menu / right Apple cmd\n\t  ];\n\n\t  var specificMap = [];\n\n\t  // mapping of events to input types\n\t  var inputMap = {\n\t    keydown: 'keyboard',\n\t    keyup: 'keyboard',\n\t    mousedown: 'mouse',\n\t    mousemove: 'mouse',\n\t    MSPointerDown: 'pointer',\n\t    MSPointerMove: 'pointer',\n\t    pointerdown: 'pointer',\n\t    pointermove: 'pointer',\n\t    touchstart: 'touch',\n\t    touchend: 'touch'\n\n\t    // boolean: true if the page is being scrolled\n\t  };var isScrolling = false;\n\n\t  // store current mouse position\n\t  var mousePos = {\n\t    x: null,\n\t    y: null\n\n\t    // map of IE 10 pointer events\n\t  };var pointerMap = {\n\t    2: 'touch',\n\t    3: 'touch', // treat pen like touch\n\t    4: 'mouse'\n\n\t    // check support for passive event listeners\n\t  };var supportsPassive = false;\n\n\t  try {\n\t    var opts = Object.defineProperty({}, 'passive', {\n\t      get: function get() {\n\t        supportsPassive = true;\n\t      }\n\t    });\n\n\t    window.addEventListener('test', null, opts);\n\t  } catch (e) {}\n\t  // fail silently\n\n\n\t  /*\n\t   * set up\n\t   */\n\n\t  var setUp = function setUp() {\n\t    // add correct mouse wheel event mapping to `inputMap`\n\t    inputMap[detectWheel()] = 'mouse';\n\n\t    addListeners();\n\t  };\n\n\t  /*\n\t   * events\n\t   */\n\n\t  var addListeners = function addListeners() {\n\t    // `pointermove`, `MSPointerMove`, `mousemove` and mouse wheel event binding\n\t    // can only demonstrate potential, but not actual, interaction\n\t    // and are treated separately\n\t    var options = supportsPassive ? { passive: true } : false;\n\n\t    document.addEventListener('DOMContentLoaded', setPersist);\n\n\t    // pointer events (mouse, pen, touch)\n\t    if (window.PointerEvent) {\n\t      window.addEventListener('pointerdown', setInput);\n\t      window.addEventListener('pointermove', setIntent);\n\t    } else if (window.MSPointerEvent) {\n\t      window.addEventListener('MSPointerDown', setInput);\n\t      window.addEventListener('MSPointerMove', setIntent);\n\t    } else {\n\t      // mouse events\n\t      window.addEventListener('mousedown', setInput);\n\t      window.addEventListener('mousemove', setIntent);\n\n\t      // touch events\n\t      if ('ontouchstart' in window) {\n\t        window.addEventListener('touchstart', setInput, options);\n\t        window.addEventListener('touchend', setInput);\n\t      }\n\t    }\n\n\t    // mouse wheel\n\t    window.addEventListener(detectWheel(), setIntent, options);\n\n\t    // keyboard events\n\t    window.addEventListener('keydown', setInput);\n\t    window.addEventListener('keyup', setInput);\n\n\t    // focus events\n\t    window.addEventListener('focusin', setElement);\n\t    window.addEventListener('focusout', clearElement);\n\t  };\n\n\t  // checks if input persistence should happen and\n\t  // get saved state from session storage if true (defaults to `false`)\n\t  var setPersist = function setPersist() {\n\t    shouldPersist = !(docElem.getAttribute('data-whatpersist') || document.body.getAttribute('data-whatpersist') === 'false');\n\n\t    if (shouldPersist) {\n\t      // check for session variables and use if available\n\t      try {\n\t        if (window.sessionStorage.getItem('what-input')) {\n\t          currentInput = window.sessionStorage.getItem('what-input');\n\t        }\n\n\t        if (window.sessionStorage.getItem('what-intent')) {\n\t          currentIntent = window.sessionStorage.getItem('what-intent');\n\t        }\n\t      } catch (e) {\n\t        // fail silently\n\t      }\n\t    }\n\n\t    // always run these so at least `initial` state is set\n\t    doUpdate('input');\n\t    doUpdate('intent');\n\t  };\n\n\t  // checks conditions before updating new input\n\t  var setInput = function setInput(event) {\n\t    var eventKey = event.which;\n\t    var value = inputMap[event.type];\n\n\t    if (value === 'pointer') {\n\t      value = pointerType(event);\n\t    }\n\n\t    var ignoreMatch = !specificMap.length && ignoreMap.indexOf(eventKey) === -1;\n\n\t    var specificMatch = specificMap.length && specificMap.indexOf(eventKey) !== -1;\n\n\t    var shouldUpdate = value === 'keyboard' && eventKey && (ignoreMatch || specificMatch) || value === 'mouse' || value === 'touch';\n\n\t    // prevent touch detection from being overridden by event execution order\n\t    if (validateTouch(value)) {\n\t      shouldUpdate = false;\n\t    }\n\n\t    if (shouldUpdate && currentInput !== value) {\n\t      currentInput = value;\n\n\t      persistInput('input', currentInput);\n\t      doUpdate('input');\n\t    }\n\n\t    if (shouldUpdate && currentIntent !== value) {\n\t      // preserve intent for keyboard interaction with form fields\n\t      var activeElem = document.activeElement;\n\t      var notFormInput = activeElem && activeElem.nodeName && (formInputs.indexOf(activeElem.nodeName.toLowerCase()) === -1 || activeElem.nodeName.toLowerCase() === 'button' && !checkClosest(activeElem, 'form'));\n\n\t      if (notFormInput) {\n\t        currentIntent = value;\n\n\t        persistInput('intent', currentIntent);\n\t        doUpdate('intent');\n\t      }\n\t    }\n\t  };\n\n\t  // updates the doc and `inputTypes` array with new input\n\t  var doUpdate = function doUpdate(which) {\n\t    docElem.setAttribute('data-what' + which, which === 'input' ? currentInput : currentIntent);\n\n\t    fireFunctions(which);\n\t  };\n\n\t  // updates input intent for `mousemove` and `pointermove`\n\t  var setIntent = function setIntent(event) {\n\t    var value = inputMap[event.type];\n\n\t    if (value === 'pointer') {\n\t      value = pointerType(event);\n\t    }\n\n\t    // test to see if `mousemove` happened relative to the screen to detect scrolling versus mousemove\n\t    detectScrolling(event);\n\n\t    // only execute if scrolling isn't happening\n\t    if ((!isScrolling && !validateTouch(value) || isScrolling && event.type === 'wheel' || event.type === 'mousewheel' || event.type === 'DOMMouseScroll') && currentIntent !== value) {\n\t      currentIntent = value;\n\n\t      persistInput('intent', currentIntent);\n\t      doUpdate('intent');\n\t    }\n\t  };\n\n\t  var setElement = function setElement(event) {\n\t    if (!event.target.nodeName) {\n\t      // If nodeName is undefined, clear the element\n\t      // This can happen if click inside an <svg> element.\n\t      clearElement();\n\t      return;\n\t    }\n\n\t    currentElement = event.target.nodeName.toLowerCase();\n\t    docElem.setAttribute('data-whatelement', currentElement);\n\n\t    if (event.target.classList && event.target.classList.length) {\n\t      docElem.setAttribute('data-whatclasses', event.target.classList.toString().replace(' ', ','));\n\t    }\n\t  };\n\n\t  var clearElement = function clearElement() {\n\t    currentElement = null;\n\n\t    docElem.removeAttribute('data-whatelement');\n\t    docElem.removeAttribute('data-whatclasses');\n\t  };\n\n\t  var persistInput = function persistInput(which, value) {\n\t    if (shouldPersist) {\n\t      try {\n\t        window.sessionStorage.setItem('what-' + which, value);\n\t      } catch (e) {\n\t        // fail silently\n\t      }\n\t    }\n\t  };\n\n\t  /*\n\t   * utilities\n\t   */\n\n\t  var pointerType = function pointerType(event) {\n\t    if (typeof event.pointerType === 'number') {\n\t      return pointerMap[event.pointerType];\n\t    } else {\n\t      // treat pen like touch\n\t      return event.pointerType === 'pen' ? 'touch' : event.pointerType;\n\t    }\n\t  };\n\n\t  // prevent touch detection from being overridden by event execution order\n\t  var validateTouch = function validateTouch(value) {\n\t    var timestamp = Date.now();\n\n\t    var touchIsValid = value === 'mouse' && currentInput === 'touch' && timestamp - currentTimestamp < 200;\n\n\t    currentTimestamp = timestamp;\n\n\t    return touchIsValid;\n\t  };\n\n\t  // detect version of mouse wheel event to use\n\t  // via https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event\n\t  var detectWheel = function detectWheel() {\n\t    var wheelType = null;\n\n\t    // Modern browsers support \"wheel\"\n\t    if ('onwheel' in document.createElement('div')) {\n\t      wheelType = 'wheel';\n\t    } else {\n\t      // Webkit and IE support at least \"mousewheel\"\n\t      // or assume that remaining browsers are older Firefox\n\t      wheelType = document.onmousewheel !== undefined ? 'mousewheel' : 'DOMMouseScroll';\n\t    }\n\n\t    return wheelType;\n\t  };\n\n\t  // runs callback functions\n\t  var fireFunctions = function fireFunctions(type) {\n\t    for (var i = 0, len = functionList.length; i < len; i++) {\n\t      if (functionList[i].type === type) {\n\t        functionList[i].fn.call(undefined, type === 'input' ? currentInput : currentIntent);\n\t      }\n\t    }\n\t  };\n\n\t  // finds matching element in an object\n\t  var objPos = function objPos(match) {\n\t    for (var i = 0, len = functionList.length; i < len; i++) {\n\t      if (functionList[i].fn === match) {\n\t        return i;\n\t      }\n\t    }\n\t  };\n\n\t  var detectScrolling = function detectScrolling(event) {\n\t    if (mousePos.x !== event.screenX || mousePos.y !== event.screenY) {\n\t      isScrolling = false;\n\n\t      mousePos.x = event.screenX;\n\t      mousePos.y = event.screenY;\n\t    } else {\n\t      isScrolling = true;\n\t    }\n\t  };\n\n\t  // manual version of `closest()`\n\t  var checkClosest = function checkClosest(elem, tag) {\n\t    var ElementPrototype = window.Element.prototype;\n\n\t    if (!ElementPrototype.matches) {\n\t      ElementPrototype.matches = ElementPrototype.msMatchesSelector || ElementPrototype.webkitMatchesSelector;\n\t    }\n\n\t    if (!ElementPrototype.closest) {\n\t      do {\n\t        if (elem.matches(tag)) {\n\t          return elem;\n\t        }\n\n\t        elem = elem.parentElement || elem.parentNode;\n\t      } while (elem !== null && elem.nodeType === 1);\n\n\t      return null;\n\t    } else {\n\t      return elem.closest(tag);\n\t    }\n\t  };\n\n\t  /*\n\t   * init\n\t   */\n\n\t  // don't start script unless browser cuts the mustard\n\t  // (also passes if polyfills are used)\n\t  if ('addEventListener' in window && Array.prototype.indexOf) {\n\t    setUp();\n\t  }\n\n\t  /*\n\t   * api\n\t   */\n\n\t  return {\n\t    // returns string: the current input type\n\t    // opt: 'intent'|'input'\n\t    // 'input' (default): returns the same value as the `data-whatinput` attribute\n\t    // 'intent': includes `data-whatintent` value if it's different than `data-whatinput`\n\t    ask: function ask(opt) {\n\t      return opt === 'intent' ? currentIntent : currentInput;\n\t    },\n\n\t    // returns string: the currently focused element or null\n\t    element: function element() {\n\t      return currentElement;\n\t    },\n\n\t    // overwrites ignored keys with provided array\n\t    ignoreKeys: function ignoreKeys(arr) {\n\t      ignoreMap = arr;\n\t    },\n\n\t    // overwrites specific char keys to update on\n\t    specificKeys: function specificKeys(arr) {\n\t      specificMap = arr;\n\t    },\n\n\t    // attach functions to input and intent \"events\"\n\t    // funct: function to fire on change\n\t    // eventType: 'input'|'intent'\n\t    registerOnChange: function registerOnChange(fn, eventType) {\n\t      functionList.push({\n\t        fn: fn,\n\t        type: eventType || 'input'\n\t      });\n\t    },\n\n\t    unRegisterOnChange: function unRegisterOnChange(fn) {\n\t      var position = objPos(fn);\n\n\t      if (position || position === 0) {\n\t        functionList.splice(position, 1);\n\t      }\n\t    },\n\n\t    clearStorage: function clearStorage() {\n\t      window.sessionStorage.clear();\n\t    }\n\t  };\n\t}();\n\n/***/ })\n/******/ ])\n});\n;"]}