Bilibili-Evolved/min/slip.min.js
2019-12-28 14:54:49 +08:00

1 line
15 KiB
JavaScript

(()=>{return(t,e)=>{const i=function(){"use strict";var t={container:{ariaRole:"listbox",tabIndex:0,focus:false},items:{ariaRole:"option",tabIndex:-1,focus:false}};var e=/Chrome\/[3-5]/.test(navigator.userAgent);var i=e;var n=e;var s=document.createElement("div").style;var o="transition"in s?"transition":"webkitTransition";var a="transform"in s?"transform":"webkitTransform";var r=a==="webkitTransform"?"-webkit-transform":"transform";var h="userSelect"in s?"userSelect":"webkitUserSelect";s[a]="translateZ(0)";var l=s[a]?"translateZ(0) ":"";var c=s[a]?"translateZ(1px) ":"";s=null;var u=0;var d=false;var f=function(){};function g(t,e){if("string"===typeof t)t=document.querySelector(t);if(!t||!t.addEventListener)throw new Error("Please specify DOM node to attach to");if(!this||this===window)return new g(t,e);this.options=e=e||{};this.options.keepSwipingPercent=e.keepSwipingPercent||0;this.options.minimumSwipeVelocity=e.minimumSwipeVelocity||1;this.options.minimumSwipeTime=e.minimumSwipeTime||110;this.options.ignoredElements=e.ignoredElements||[];if(!Array.isArray(this.options.ignoredElements))throw new Error("ignoredElements must be an Array");this.cancel=this.setState.bind(this,this.states.idle);this.onTouchStart=this.onTouchStart.bind(this);this.onTouchMove=this.onTouchMove.bind(this);this.onTouchEnd=this.onTouchEnd.bind(this);this.onMouseDown=this.onMouseDown.bind(this);this.onMouseMove=this.onMouseMove.bind(this);this.onMouseUp=this.onMouseUp.bind(this);this.onMouseLeave=this.onMouseLeave.bind(this);this.onSelection=this.onSelection.bind(this);this.onContainerFocus=this.onContainerFocus.bind(this);this.setState(this.states.idle);this.attach(t)}function m(t){var e=t.style[a];if(e){return{value:e,original:e}}if(window.getComputedStyle){var i=window.getComputedStyle(t).getPropertyValue(r);if(i&&i!=="none")return{value:i,original:""}}return{value:"",original:""}}function v(t,e){var i=0;var n=0;for(var s=0;s<e.length;s++){if(e[s].nodeType===1){n++;if(e[s]===t.node){i=n-1}}}return i}g.prototype={container:null,options:{},state:null,target:null,usingTouch:false,mouseHandlersAttached:false,startPosition:null,latestPosition:null,previousPosition:null,canPreventScrolling:false,states:{idle:function t(){this.removeMouseHandlers();if(this.target){this.target.node.style.willChange="";this.target=null}this.usingTouch=false;return{allowTextSelection:true}},undecided:function t(){this.target.height=this.target.node.offsetHeight;this.target.node.style.willChange=r;if(!this.dispatch(this.target.originalTarget,"beforewait")){if(this.dispatch(this.target.originalTarget,"beforereorder")){this.setState(this.states.reorder)}}else{var e=setTimeout(function(){var t=this.getAbsoluteMovement();if(this.canPreventScrolling&&t.x<15&&t.y<25){if(this.dispatch(this.target.originalTarget,"beforereorder")){this.setState(this.states.reorder)}}}.bind(this),150)}return{leaveState:function(){clearTimeout(e)},onMove:function(){var t=this.getAbsoluteMovement();if(t.x>20&&t.y<Math.max(100,this.target.height)){if(this.dispatch(this.target.originalTarget,"beforeswipe",{directionX:t.directionX,directionY:t.directionY})){this.setState(this.states.swipe);return false}else{this.setState(this.states.idle)}}if(t.y>20){this.setState(this.states.idle)}if(t.x>t.y*1.2)return false},onLeave:function(){this.setState(this.states.idle)},onEnd:function(){var t=this.dispatch(this.target.originalTarget,"tap");this.setState(this.states.idle);return t}}},swipe:function t(){var e=false;var i=this.container;var n=v(this.target,this.container.childNodes);i.classList.add("slip-swiping-container");function s(){i.classList.remove("slip-swiping-container")}this.target.height=this.target.node.offsetHeight;return{leaveState:function(){if(e){this.animateSwipe(function(t){t.node.style[a]=t.baseTransform.original;if(this.dispatch(t.node,"afterswipe")){s();return true}else{this.animateToZero(undefined,t)}}.bind(this))}else{this.animateToZero(s)}},onMove:function(){var t=this.getTotalMovement();if(Math.abs(t.y)<this.target.height+20){if(this.dispatch(this.target.node,"animateswipe",{x:t.x,originalIndex:n})){this.target.node.style[a]="translate("+t.x+"px,0) "+l+this.target.baseTransform.value}return false}else{this.dispatch(this.target.node,"cancelswipe");this.setState(this.states.idle)}},onLeave:function(){this.state.onEnd.call(this)},onEnd:function(){var t=this.getAbsoluteMovement();var i=t.x/t.time;var s=Math.abs((this.startPosition.x-this.previousPosition.x)/this.container.clientWidth)*100;var o=i>this.options.minimumSwipeVelocity&&t.time>this.options.minimumSwipeTime||this.options.keepSwipingPercent&&s>this.options.keepSwipingPercent;if(o){if(this.dispatch(this.target.node,"swipe",{direction:t.directionX,originalIndex:n})){e=true}}else{this.dispatch(this.target.node,"cancelswipe")}this.setState(this.states.idle);return!o}}},reorder:function e(){if(this.target.node.focus&&t.items.focus){this.target.node.focus()}this.target.height=this.target.node.offsetHeight;var i;if(this.options.ignoredElements.length){var s=this.container;var o=s.tagName.toLowerCase();if(s.getAttribute("id")){o="#"+s.getAttribute("id")}else if(s.classList.length){o+="."+s.getAttribute("class").replace(" ",".")}o+=" > ";this.options.ignoredElements.forEach(function(t){o+=":not("+t+")"});try{i=s.parentNode.querySelectorAll(o)}catch(t){if(t instanceof DOMException&&t.name==="SyntaxError")throw new Error("ignoredElements you specified contain invalid query");else throw t}}else{i=this.container.childNodes}var r=v(this.target,i);var u;var d=this.target.node.offsetTop+this.target.height/2;var f=[];for(var g=0;g<i.length;g++){if(i[g].nodeType!=1||i[g]===this.target.node)continue;var p=i[g].offsetTop;f.push({node:i[g],baseTransform:m(i[g]),pos:p+(p<d?i[g].offsetHeight:0)-d})}this.target.node.classList.add("slip-reordering");this.target.node.style.zIndex="99999";this.target.node.style[h]="none";if(n){this.container.style.webkitTransformStyle="preserve-3d"}function T(){this.updateScrolling();if(u){clearTimeout(u);u=null}var t=this.getTotalMovement();this.target.node.style[a]="translate(0,"+t.y+"px) "+c+this.target.baseTransform.value;var e=this.target.height;f.forEach(function(i){var n=0;if(i.pos<0&&t.y<0&&i.pos>t.y){n=e}else if(i.pos>0&&t.y>0&&i.pos<t.y){n=-e}i.node.style[a]=n?"translate(0,"+n+"px) "+l+i.baseTransform.value:i.baseTransform.original});return false}T.call(this);return{leaveState:function(){if(u)clearTimeout(u);if(n){this.container.style.webkitTransformStyle=""}if(this.container.focus&&t.container.focus){this.container.focus()}this.target.node.classList.remove("slip-reordering");this.target.node.style[h]="";this.animateToZero(function(t){t.node.style.zIndex=""});f.forEach(function(t){t.node.style[a]=t.baseTransform.original})},onMove:T,onLeave:function(){if(u)clearTimeout(u);u=setTimeout(function(){u=null;this.cancel()}.bind(this),700)},onEnd:function(){var t=this.getTotalMovement();var e,i;if(t.y<0){for(e=0;e<f.length;e++){if(f[e].pos>t.y){break}}i=e}else{for(e=f.length-1;e>=0;e--){if(f[e].pos<t.y){break}}i=e+1}this.dispatch(this.target.node,"reorder",{spliceIndex:i,originalIndex:r,insertBefore:f[i]?f[i].node:null});this.setState(this.states.idle);return false}}}},attach:function(e){u++;if(this.container)this.detach();if(!d&&i){d=true;document.body.addEventListener("touchstart",f,false)}this.container=e;if(false!==t.container.tabIndex){this.container.tabIndex=t.container.tabIndex}if(t.container.ariaRole){this.container.setAttribute("aria-role",t.container.ariaRole)}this.setChildNodesAriaRoles();this.container.addEventListener("focus",this.onContainerFocus,false);this.otherNodes=[];document.addEventListener("selectionchange",this.onSelection,false);this.container.addEventListener("touchcancel",this.cancel,false);this.container.addEventListener("touchstart",this.onTouchStart,false);this.container.addEventListener("touchmove",this.onTouchMove,false);this.container.addEventListener("touchend",this.onTouchEnd,false);this.container.addEventListener("mousedown",this.onMouseDown,false)},detach:function(){this.cancel();this.container.removeEventListener("mousedown",this.onMouseDown,false);this.container.removeEventListener("touchend",this.onTouchEnd,false);this.container.removeEventListener("touchmove",this.onTouchMove,false);this.container.removeEventListener("touchstart",this.onTouchStart,false);this.container.removeEventListener("touchcancel",this.cancel,false);document.removeEventListener("selectionchange",this.onSelection,false);if(false!==t.container.tabIndex){this.container.removeAttribute("tabIndex")}if(t.container.ariaRole){this.container.removeAttribute("aria-role")}this.unSetChildNodesAriaRoles();u--;if(!u&&d){d=false;document.body.removeEventListener("touchstart",f,false)}},setState:function(t){if(this.state){if(this.state.ctor===t)return;if(this.state.leaveState)this.state.leaveState.call(this)}var e=this.state;var i=t.call(this);if(this.state===e){i.ctor=t;this.state=i}},findTargetNode:function(t){while(t&&t.parentNode!==this.container){t=t.parentNode}return t},onContainerFocus:function(t){t.stopPropagation();this.setChildNodesAriaRoles()},setChildNodesAriaRoles:function(){var e=this.container.childNodes;for(var i=0;i<e.length;i++){if(e[i].nodeType!=1)continue;if(t.items.ariaRole){e[i].setAttribute("aria-role",t.items.ariaRole)}if(false!==t.items.tabIndex){e[i].tabIndex=t.items.tabIndex}}},unSetChildNodesAriaRoles:function(){var e=this.container.childNodes;for(var i=0;i<e.length;i++){if(e[i].nodeType!=1)continue;if(t.items.ariaRole){e[i].removeAttribute("aria-role")}if(false!==t.items.tabIndex){e[i].removeAttribute("tabIndex")}}},onSelection:function(t){t.stopPropagation();var e=t.target===document||this.findTargetNode(t);var i=/(iPhone|iPad|iPod)/i.test(navigator.userAgent)&&!/(Android|Windows)/i.test(navigator.userAgent);if(!e)return;if(i){this.setState(this.states.idle)}else{if(!this.state.allowTextSelection){t.preventDefault()}}},addMouseHandlers:function(){if(!this.mouseHandlersAttached){this.mouseHandlersAttached=true;document.documentElement.addEventListener("mouseleave",this.onMouseLeave,false);window.addEventListener("mousemove",this.onMouseMove,true);window.addEventListener("mouseup",this.onMouseUp,true);window.addEventListener("blur",this.cancel,false)}},removeMouseHandlers:function(){if(this.mouseHandlersAttached){this.mouseHandlersAttached=false;document.documentElement.removeEventListener("mouseleave",this.onMouseLeave,false);window.removeEventListener("mousemove",this.onMouseMove,true);window.removeEventListener("mouseup",this.onMouseUp,true);window.removeEventListener("blur",this.cancel,false)}},onMouseLeave:function(t){t.stopPropagation();if(this.usingTouch)return;if(t.target===document.documentElement||t.relatedTarget===document.documentElement){if(this.state.onLeave){this.state.onLeave.call(this)}}},onMouseDown:function(t){t.stopPropagation();if(this.usingTouch||t.button!=0||!this.setTarget(t))return;this.addMouseHandlers();this.canPreventScrolling=true;this.startAtPosition({x:t.clientX,y:t.clientY,time:t.timeStamp})},onTouchStart:function(t){t.stopPropagation();this.usingTouch=true;this.canPreventScrolling=true;if(t.touches.length>1){this.setState(this.states.idle);return}if(!this.setTarget(t))return;this.startAtPosition({x:t.touches[0].clientX,y:t.touches[0].clientY,time:t.timeStamp})},setTarget:function(t){var e=this.findTargetNode(t.target);if(!e){this.setState(this.states.idle);return false}var i=this.options.scrollContainer;if(!i){var n=document.scrollingElement||document.documentElement;i=e.parentNode;while(i){if(i==n)break;if(i!=document.body&&i.scrollHeight>i.clientHeight&&window.getComputedStyle(i)["overflow-y"]!="visible")break;i=i.parentNode}i=i||n}this.target={originalTarget:t.target,node:e,scrollContainer:i,origScrollTop:i.scrollTop,origScrollHeight:i.scrollHeight,baseTransform:m(e)};return true},startAtPosition:function(t){this.startPosition=this.previousPosition=this.latestPosition=t;this.setState(this.states.undecided)},updatePosition:function(t,e){if(this.target==null){return}this.latestPosition=e;if(this.state.onMove){if(this.state.onMove.call(this)===false){t.preventDefault()}}if(this.latestPosition.time-this.previousPosition.time>100){this.previousPosition=this.latestPosition}},onMouseMove:function(t){t.stopPropagation();this.updatePosition(t,{x:t.clientX,y:t.clientY,time:t.timeStamp})},onTouchMove:function(t){t.stopPropagation();this.updatePosition(t,{x:t.touches[0].clientX,y:t.touches[0].clientY,time:t.timeStamp});this.canPreventScrolling=false},onMouseUp:function(t){t.stopPropagation();if(this.usingTouch||t.button!==0)return;if(this.state.onEnd&&false===this.state.onEnd.call(this)){t.preventDefault()}},onTouchEnd:function(t){t.stopPropagation();if(t.touches.length>1){this.cancel()}else if(this.state.onEnd&&false===this.state.onEnd.call(this)){t.preventDefault()}},getTotalMovement:function(){var t=this.target.scrollContainer.scrollTop-this.target.origScrollTop;return{x:this.latestPosition.x-this.startPosition.x,y:this.latestPosition.y-this.startPosition.y+t,time:this.latestPosition.time-this.startPosition.time}},getAbsoluteMovement:function(){var t=this.getTotalMovement();return{x:Math.abs(t.x),y:Math.abs(t.y),time:t.time,directionX:t.x<0?"left":"right",directionY:t.y<0?"up":"down"}},updateScrolling:function(){var t=40,e=0;var i=this.target.scrollContainer,n=i.getBoundingClientRect(),s=this.target.node.getBoundingClientRect(),o=Math.min(n.bottom,window.innerHeight)-s.bottom,a=s.top-Math.max(n.top,0),r=this.target.origScrollHeight-Math.min(i.clientHeight,window.innerHeight);if(o<t){e=Math.min(t,t-o)}else if(a<t){e=Math.max(-t,a-t)}i.scrollTop=Math.max(0,Math.min(r,i.scrollTop+e))},dispatch:function(t,e,i){var n=document.createEvent("CustomEvent");if(n&&n.initCustomEvent){n.initCustomEvent("slip:"+e,true,true,i)}else{n=document.createEvent("Event");n.initEvent("slip:"+e,true,true);n.detail=i}return t.dispatchEvent(n)},getSiblings:function(t){var e=[];var i=t.node.nextSibling;while(i){if(i.nodeType==1)e.push({node:i,baseTransform:m(i)});i=i.nextSibling}return e},animateToZero:function(t,e){e=e||this.target;e.node.style[a]="translate(0,0) "+l+e.baseTransform.value;setTimeout(function(){e.node.style[a]=e.baseTransform.original;if(t)t.call(this,e)}.bind(this),101)},animateSwipe:function(t){var e=this.target;var i=this.getSiblings(e);var n="translate(0,"+this.target.height+"px) "+l+" ";e.node.style[a]=" translate("+(this.getTotalMovement().x>0?"":"-")+"100%,0) "+l+e.baseTransform.value;setTimeout(function(){if(t.call(this,e)){i.forEach(function(t){t.node.style[a]=n+t.baseTransform.value});setTimeout(function(){i.forEach(function(t){t.node.style[a]="translate(0,0) "+l+t.baseTransform.value});setTimeout(function(){i.forEach(function(t){t.node.style[a]=t.baseTransform.original})},101)},1)}}.bind(this),101)}};if("function"===typeof define&&define.amd){define(function(){return g})}if("object"===typeof module&&module.exports){module.exports=g}return g}();return{export:{Slip:i}}}})();