File Manager

Current Directory: /home/astoriaah/www/templates/yootheme/vendor/assets/uikit/src/js/util
Viewing File: /home/astoriaah/www/templates/yootheme/vendor/assets/uikit/src/js/util/touch.js
/* Based on: Copyright (c) 2010-2016 Thomas Fuchs http://zeptojs.com/ */ import {ready} from './dom'; import {within} from './filter'; import {on, trigger} from './event'; import {pointerDown, pointerMove, pointerUp} from './env'; let touch = {}, clickTimeout, swipeTimeout, tapTimeout, clicked; function swipeDirection({x1, x2, y1, y2}) { return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down'); } function cancelAll() { clickTimeout && clearTimeout(clickTimeout); swipeTimeout && clearTimeout(swipeTimeout); tapTimeout && clearTimeout(tapTimeout); clickTimeout = swipeTimeout = tapTimeout = null; touch = {}; } ready(() => { on(document, 'click', () => clicked = true, true); on(document, pointerDown, e => { const {target} = e; const {x, y} = getPos(e); const now = Date.now(); const type = getType(e.type); if (touch.type && touch.type !== type) { return; } touch.el = 'tagName' in target ? target : target.parentNode; clickTimeout && clearTimeout(clickTimeout); touch.x1 = x; touch.y1 = y; if (touch.last && now - touch.last <= 250) { touch = {}; } touch.type = type; touch.last = now; clicked = e.button > 0; }); on(document, pointerMove, e => { if (e.defaultPrevented) { return; } const {x, y} = getPos(e); touch.x2 = x; touch.y2 = y; }); on(document, pointerUp, ({type, target}) => { if (touch.type !== getType(type)) { return; } // swipe if (touch.x2 && Math.abs(touch.x1 - touch.x2) > 30 || touch.y2 && Math.abs(touch.y1 - touch.y2) > 30) { swipeTimeout = setTimeout(() => { if (touch.el) { trigger(touch.el, 'swipe'); trigger(touch.el, `swipe${swipeDirection(touch)}`); } touch = {}; }); // normal tap } else if ('last' in touch) { tapTimeout = setTimeout(() => trigger(touch.el, 'tap')); // trigger single click after 350ms of inactivity if (touch.el && type !== 'mouseup' && within(target, touch.el)) { clickTimeout = setTimeout(() => { clickTimeout = null; if (touch.el && !clicked) { trigger(touch.el, 'click'); } touch = {}; }, 350); } } else { touch = {}; } }); on(document, 'touchcancel', cancelAll); on(window, 'scroll', cancelAll); }); let touching = false; on(document, 'touchstart', () => touching = true, true); on(document, 'click', () => {touching = false;}); on(document, 'touchcancel', () => touching = false, true); export function isTouch(e) { return touching || e.pointerType === 'touch'; } export function getPos(e) { const {touches, changedTouches} = e; const {pageX: x, pageY: y} = touches && touches[0] || changedTouches && changedTouches[0] || e; return {x, y}; } function getType(type) { return type.slice(0, 5); }