UNPKG

@fancyapps/ui

Version:

Robust JavaScript UI Component Library

1 lines 4.37 kB
!/*! License details at fancyapps.com/license */function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).window=e.window||{})}(this,function(e){"use strict";function t(e){let t=[];for(let n of"undefined"!=typeof TouchEvent&&e instanceof TouchEvent?e.touches:e instanceof MouseEvent&&"mouseup"!==e.type?[e]:[])t.push({x:n.clientX,y:n.clientY,ts:Date.now()});return t}function n(e){let t=[];for(let n of"undefined"!=typeof TouchEvent&&e instanceof TouchEvent?e.changedTouches:e instanceof MouseEvent?[e]:[])t.push({x:n.clientX,y:n.clientY,ts:Date.now()});return t}function o(e){let t=e[0],n=e[1]||t;return{x:(t.x+n.x)/2,y:(t.y+n.y)/2,ts:n.ts}}function i(e){let t=e[0],n=e[1]||e[0];return t&&n?-1*Math.sqrt((n.x-t.x)*(n.x-t.x)+(n.y-t.y)*(n.y-t.y)):0}let s=e=>{e.cancelable&&e.preventDefault()},a={passive:!1},u={panThreshold:5,swipeThreshold:3,ignore:["textarea","input","select","[contenteditable]","[data-selectable]","[data-draggable]"]},r=!1,l=!0,c=(e,c)=>{let d,f,h,v={...u,...c},p=[],m=[],g=[],w=!1,E=!1,y=!1,b=0,M=0,T=0,x=0,L=0,P=0,D=0,k=0,C=0,j=[],A=0,X=0,Y=new Map;function q(e){let t=i(m),n=i(g),o=Math.abs(D)>Math.abs(k)?D:k,s={srcEvent:h,isPanRecognized:w,isSwipeRecognized:E,firstTouch:p,previousTouch:g,currentTouch:m,deltaX:T,deltaY:x,offsetX:L,offsetY:P,velocityX:D,velocityY:k,velocity:o,angle:C,axis:f,scale:t&&n?t/n:0,center:d};for(let t of Y.get(e)||[])t(s)}function G(e){let t=Date.now();j=j.filter(e=>!e.ts||e.ts>t-100),e&&j.push(e)}function I(){if(D=0,k=0,j.length>3){let e=j[0],t=j[j.length-1];if(e&&t){let n=t.x-e.x,o=t.y-e.y,i=e.ts&&t.ts?t.ts-e.ts:0;i>0&&(D=Math.abs(n)>3?n/(i/30):0,k=Math.abs(o)>3?o/(i/30):0)}}}function R(e){if(e instanceof MouseEvent){if(r)return}else r=!0;let n=e.composedPath()[0],i=v.ignore.join(",");if(n.matches(i)||n.closest(i)||"undefined"!=typeof MouseEvent&&e instanceof MouseEvent&&(!e.buttons||0!==e.button))return;e instanceof MouseEvent&&s(e);let a=Date.now(),u=a-(b||a);y=u>0&&u<=250,b=a,clearTimeout(A),h=e,e instanceof MouseEvent&&(window.addEventListener("mousemove",S),window.addEventListener("mouseup",z)),window.addEventListener("blur",B),p=[...m=t(e)],g=[],M=m.length,d=o(m),1===M&&(w=!1,E=!1),M&&G(o(m)),q("start")}function S(e){if(!p.length||e.defaultPrevented)return;h=e,g=[...m],M=(m=t(e)).length;let n=d=o(m),s=o(g);if(T=n.x-s.x,x=n.y-s.y,G(n),I(),q("move"),m.length>1&&Math.abs(i(m)-i(g))>=.1&&q("pinch"),!w&&p.length){let e=o(p);L=n.x-e.x,P=n.y-e.y,(w=Math.abs(L)>v.panThreshold||Math.abs(P)>v.panThreshold)&&(l=!1,clearTimeout(X),X=0,f=(C=Math.abs(180*Math.atan2(P,L)/Math.PI))>45&&C<135?"y":"x",p=[...m],g=[...m],window.getSelection()?.removeAllRanges(),q("panstart"))}w&&(T||x)&&q("pan")}function z(e){if(h=e,!p.length)return;let i=t(e),s=n(e);if(M=i.length,d=o(s),s.length&&G(o(s)),I(),g=[...m],m=[...i],p=[...i],i.length>0)q("end"),w=!1,E=!1,j=[];else{let e=v.swipeThreshold;(Math.abs(D)>e||Math.abs(k)>e)&&(E=!0),w&&q("panend"),E&&q("swipe"),w||E||(q("tap"),y?q("doubleTap"):A=setTimeout(function(){q("singleTap")},250)),q("end"),F()}}function B(){clearTimeout(A),F(),w&&q("panend"),q("end")}function F(){w=!1,E=!1,y=!1,M=0,j=[],m=[],g=[],p=[],T=0,x=0,L=0,P=0,D=0,k=0,C=0,f=void 0,window.removeEventListener("mousemove",S),window.removeEventListener("mouseup",z),window.removeEventListener("blur",B),l||X||(X=setTimeout(()=>{l=!0,X=0},100))}function H(e){let t=e.target;r=!1,t&&!e.defaultPrevented&&(l||(s(e),e.stopPropagation()))}let J={init:function(){if(e)return e.addEventListener("click",H,a),e.addEventListener("mousedown",R,a),e.addEventListener("touchstart",R,a),e.addEventListener("touchmove",S,a),e.addEventListener("touchend",z),e.addEventListener("touchcancel",z),J},on:function(e,t){return Y.set(e,[...Y.get(e)||[],t]),J},off:function(e,t){return Y.has(e)&&Y.set(e,Y.get(e).filter(e=>e!==t)),J},isPointerDown:()=>M>0,destroy:function(){clearTimeout(A),clearTimeout(X),X=0,e&&(e.removeEventListener("click",H,a),e.removeEventListener("mousedown",R,a),e.removeEventListener("touchstart",R,a),e.removeEventListener("touchmove",S,a),e.removeEventListener("touchend",z),e.removeEventListener("touchcancel",z)),e=null,F()}};return J};c.isClickAllowed=()=>l,e.Gestures=c,e.getChangedPosition=n,e.getCurrentPosition=t,e.getDistance=i,e.getMidpoint=o});