EmbyCrackedClient/web/modules/scroller/smoothscroller.js
2025-06-25 11:46:04 +08:00

1 line
No EOL
36 KiB
JavaScript

import layoutManager from"./../layoutmanager.js";import dom from"./../dom.js";import focusManager from"./../focusmanager.js";import appHeaderContent from"./../appheader/appheadercontent.js";import skinViewManager from"./../skinviewmanager.js";require(["scrollStyles"]);let StartLocation="start",CenterLocation="center",EndLocation="end",AdaptiveLocation="adaptive",preventScrollSupported=(()=>{let supported=!1;try{var focusOptions={};Object.defineProperty(focusOptions,"preventScroll",{get:function(){return supported=!0},enumerable:!0,configurable:!0}),document.createElement("div").focus(focusOptions)}catch(err){console.log("error testing preventScroll support: "+err)}return supported})(),allowAnimatedScroll=(()=>{var deviceMemory,platform,cores=navigator.hardwareConcurrency||4;return!(cores<4||(2400<=(screen.width||screen.availWidth||0)||1400<=(screen.height||screen.availHeight||0))&&cores<6||(deviceMemory=navigator.deviceMemory||2)<2||!document.documentElement.animate||!CSS.supports("display","flow-root")||(platform=(navigator.platform||"").toLowerCase(),"android"===globalThis.appMode&&(cores<4||deviceMemory<2||platform.includes("armv7"))))})();function onSourceClick(event){var dragging=this.dragging;!dragging.locked&&0<Math.abs(dragging.delta)&&(dragging.locked=1,event.preventDefault(),event.stopPropagation(),(event.currentTarget||event.target).removeEventListener(event.type,this.onSourceClickFn))}function within(number,start,end){var min=start<end?start:end,start=end<start?start:end;return number<min?min:start<number?start:number}function onFrameClick(e){1===e.which&&(e=focusManager.focusableParent(e.target,!1))&&e!==document.activeElement&&focusManager.focus(e,{preventScroll:this.options.autoPreventScrollOnFocus})}function parsePxToInt(value){return!value||!(value=value.endsWith("px")?value.substring(0,value.length-2):value)||(value=parseInt(value),isNaN(value))?0:value}let PaddingInlineStartProp=CSS.supports("padding-inline-start","0")?"padding-inline-start":CSS.supports("-webkit-padding-start","0")?"-webkit-padding-start":"padding-left",PaddingInlineEndProp=CSS.supports("padding-inline-end","0")?"padding-inline-end":CSS.supports("-webkit-padding-end","0")?"-webkit-padding-end":"padding-right";function calcLengthToPx(lengthStr){var value=parseFloat(lengthStr),lengthStr=lengthStr.match(/[a-zA-Z%]+/);if(!lengthStr||0===lengthStr.length)return value;switch(lengthStr[0].toLowerCase()){case"px":return value;case"rem":return value*parseFloat(getComputedStyle(document.documentElement).fontSize);case"vw":return value/100*dom.getWindowSize().innerWidth;case"vh":return value/100*dom.getWindowSize().innerHeight}throw new Error("Unsupported unit for conversion: "+lengthStr)}function parseFocusScrollOffset(instance,offset){switch(offset){case"-padding-inline-start":return 0-instance.getPadding().inlineStart;case"-padding-top":return 0-instance.getPadding().top;default:return calcLengthToPx(offset)}}function getFocusScrollOffset(instance,horizontal,offset){if(!offset)return null;switch(typeof offset){case"number":return offset;case"string":return parseFocusScrollOffset(instance,offset);default:return null}}function onFocus(e){e=e.target;let preventScroll,instantScroll,itemBoundingClientRect,direction;var lastFocusInfo=focusManager.getLastFocusInfo(),lastFocusInfo=(lastFocusInfo.element===e&&(lastFocusInfo=lastFocusInfo.options)&&(preventScroll=lastFocusInfo.preventScroll,instantScroll=lastFocusInfo.instantScroll,direction=lastFocusInfo.direction,preventScrollSupported&&(itemBoundingClientRect=lastFocusInfo.itemBoundingClientRect),lastFocusInfo.itemBoundingClientRect=null),this.options);if(!(preventScroll=null==preventScroll&&lastFocusInfo.autoPreventScrollOnFocus?!layoutManager.tv:preventScroll)){let horizontal=lastFocusInfo.options,dualScroll=lastFocusInfo.dualScroll,skipWhenAnyVisibleX;if(dualScroll)switch(direction){case 0:case 1:horizontal=!0,dualScroll=!1;break;case 2:case 3:skipWhenAnyVisibleX=!0}e&&this.to(this.options.focusScroll,e,{useDelayedPromise:!1,offsetLeft:lastFocusInfo.focusScrollOffsetLeft,offsetTop:lastFocusInfo.focusScrollOffsetTop,behavior:lastFocusInfo.enableNativeScroll&&!lastFocusInfo.allowNativeSmoothScroll||instantScroll?"instant":null,itemBoundingClientRect:itemBoundingClientRect,horizontal:horizontal,dualScroll:dualScroll,skipWhenAnyVisibleX:skipWhenAnyVisibleX,focusDirection:direction})}}function resetScroll(){this.scrollTop=0,this.scrollLeft=0}function resetScrollTop(){this.scrollTop=0}function resetScrollLeft(){this.scrollLeft=0}function normalizeWheelDelta(event,instance){var options=instance.options;return instance.currentDelta=(options.horizontal?event.deltaY||event.deltaX:event.deltaY)||-event.wheelDelta,options.enableNativeScroll||(instance.currentDelta/=1===event.deltaMode?3:100),instance.currentDelta}let wheelEvent=document.implementation.hasFeature("Event.wheel","3.0")?"wheel":"mousewheel",interactiveElements=["INPUT","SELECT","TEXTAREA"],abs=Math.abs,round=Math.round;function isInteractive(element){for(;element;){if(interactiveElements.includes(element.tagName))return!0;element=element.parentNode}return!1}let isSmoothScrollSupported="scrollBehavior"in document.documentElement.style,SupportsScrollMethodOptions=isSmoothScrollSupported;function Scroller(frame,options){var options=Object.assign({},{slidee:null,horizontal:!1,mouseWheel:!0,scrollBy:100,dragSource:null,dragThreshold:3,speed:skinViewManager.getSkinOptions().scrollAnimationSpeed||320,autoStartEdge:!0,autoPreventScrollOnFocus:!0},options),slideeElement=(skinViewManager.getSkinOptions().scrollerAlwaysAllowNativeSmoothScroll&&(options.allowNativeSmoothScroll=!0),skinViewManager.getSkinOptions().scrollerForceSmoothScroll&&(options.forceSmoothScroll=!0),options.forceNativeScroll?options.enableNativeScroll=!0:options.forceSmoothScroll?options.enableNativeScroll=!allowAnimatedScroll||isSmoothScrollSupported&&options.allowNativeSmoothScroll:layoutManager.tv&&allowAnimatedScroll||(options.enableNativeScroll=!0),options.inlineMultiplier="rtl"===document.dir?-1:1,(this.options=options).slidee),slideeElement=(this.listenerCount=0,this._pos={startX:0,endX:0,startY:0,endY:0,scrollLeft:0,scrollTop:0},this.dragSourceElement=options.dragSource||frame,this.currentDelta=0,this.initialized=0,this.slideeElement=slideeElement,this.slideeElementStyle=slideeElement.style,this.options=options,this.dragging={},this.contentRects=[],this.resizeListeners=[],frame);this.nativeScrollElement=slideeElement,this.frame=frame,this.requiresReflow=!0,this.frameSize={width:0,height:0},this.slideeSize={width:0,height:0},this.onSourceClickFn=onSourceClick.bind(this),this.onScrollForCachingFn=onScrollForCaching.bind(this)}function getOrAddContentRect(contentRects,target){for(let i=0,length=contentRects.length;i<length;i++){let rect=contentRects[i];if(rect.target===target)return rect}let rect={target:target};return contentRects.push(rect),rect}function onResize(entries){var contentRects=this.contentRects;let hasResize=!1;this._cachedScrollTop=null,this._cachedScrollLeft=null,this._cachedScrollHeight=null,this._cachedScrollWidth=null,this._cachedPadding=null,this._frameRect=null;for(let i=0,length=entries.length;i<length;i++){var entry=entries[i];if(entry){var newRect=entry.contentRect;if(0!==newRect.width&&0!==newRect.height){entry=contentRects?getOrAddContentRect(contentRects,entry.target):null;if(entry&&(newRect.width!==entry.width||newRect.height!==entry.height)){entry.width=newRect.width,entry.height=newRect.height,hasResize=!0;break}}}}hasResize&&(this.options.enableNativeScroll?this.requiresReflow=!0:load(this,!1));var listeners=this.resizeListeners;if(listeners)for(let i=0,length=listeners.length;i<length;i++)listeners[i](entries)}function load(instance,isInit){if(instance.requiresReflow=!0,!isInit){instance.ensureSizeInfo();isInit=instance.options;if(!isInit.enableNativeScroll){var pos=instance._pos;if(!isInit.dualScroll)if(isInit.horizontal){isInit=within(instance.getScrollPosition(),pos.startX,pos.endX);instance.scrollToPosition({position:isInit})}else{let newPos=within(instance.getScrollPosition(),pos.startY,pos.endY);instance.scrollToPosition({position:newPos})}}instance.requiresReflow=!0}}function onDragEnd(instance){let dragging=instance.dragging;dragging.released=!0;var dragHandler=instance.dragHandler;dragHandler&&(dom.removeEventListener(document,"pointermove",dragHandler,{passive:!0}),dom.removeEventListener(document,"pointerup",dragHandler,{passive:!0})),setTimeout(function(){dragging.source.removeEventListener("click",instance.onSourceClickFn)}),dragging.init=0}function calculateMomentum(current,start,time,lowerMargin,wrapperSize,deceleration){start=current-start,time=Math.abs(start)/time,current+=time/(2*(deceleration=void 0===deceleration?6e-4:deceleration))*(start<0?-1:1),start=time/deceleration;return{destination:Math.round(current),duration:start}}function dragHandler(event){var dragging=this.dragging,options=this.options,released="pointerup"===event.type,touches=getTouches(event),touches=touches&&touches.length?touches[0]:event,pathX=touches.clientX-dragging.initX,touches=touches.clientY-dragging.initY,horizontal=options.horizontal,absDelta=(dragging.delta=horizontal?pathX:touches,Math.abs(dragging.delta));if(released||!(absDelta<1)){if(!dragging.init){if(absDelta<options.dragThreshold)return released?onDragEnd(this):void 0;if(!(horizontal?abs(pathX)>abs(touches):abs(pathX)<abs(touches)))return onDragEnd(this);dragging.init=1}event.preventDefault();let newPosition=dragging.initPos-dragging.delta;options=event.timeStamp,pathX=options-dragging.startTime;released?(onDragEnd(this),pathX<200&&absDelta<=0||(touches=calculateMomentum(newPosition,dragging.momentumPos,pathX,this.getScrollSize(),getFrameSize(this,horizontal)),newPosition=Math.max(0,touches.destination))):300<pathX&&(dragging.startTime=options,dragging.momentumPos=newPosition),this.scrollToPosition({behavior:released?"smooth":"instant",position:newPosition})}}function getFrameSize(instance,horizontal,subtractPadding){var frameSize=instance.frameSize,frameSize=horizontal?frameSize.width:frameSize.height;return subtractPadding?subtractPaddingFromFrameSize(instance,horizontal,frameSize):frameSize}function subtractPaddingFromFrameSize(instance,horizontal,frameSize){instance=instance.getPadding();return horizontal?frameSize-instance.inlineStart-instance.inlineEnd:frameSize-instance.top-instance.bottom}function getTouches(e){return e.changedTouches||e.targetTouches||e.touches}function onDragStart(event){var dragging,options,touches;0!==event.button||(dragging=this.dragging).init||isInteractive(event.target)||(options=this.options,event.preventDefault(),dragging.init=0,dragging.startTime=event.timeStamp,dragging.source=event.target,touches=(touches=getTouches(event))&&touches.length?touches[0]:event,dragging.initX=touches.clientX,dragging.initY=touches.clientY,dragging.momentumPos=dragging.initPos=this.getScrollPosition(),dragging.delta=0,dragging.locked=0,dragging.source.addEventListener("click",this.onSourceClickFn),options.enableNativeScroll)||(event=this.dragHandler,dom.addEventListener(document,"pointermove",event,{}),dom.addEventListener(document,"pointerup",event,{}))}let SupportsTranslateProperty=CSS.supports("translate","40px 100px"),TranslateProperty=SupportsTranslateProperty?"translate":"transform";function addFrameResizeObserver(instance){instance.frameResizeObserver||(instance.frameResizeObserver=new ResizeObserver(onResize.bind(instance),{}),instance.options.enableNativeScroll?(instance.frameResizeObserver.observe(instance.nativeScrollElement),instance.frameResizeObserver.observe(instance.slideeElement)):(instance.frameResizeObserver.observe(instance.slideeElement),instance.frameResizeObserver.observe(instance.frame)))}function onMouseWheelMove(event){this.ensureSizeInfo();var options=this.options,scrollBy=options.scrollBy;if(scrollBy){let delta=normalizeWheelDelta(event,this);options.enableNativeScroll?(isSmoothScrollSupported&&(delta*=12),this.scrollBy(delta)):this.scrollBy(scrollBy*delta)}}function scrollNative(instance,pos){var elem=instance.nativeScrollElement,isInstant="instant"===pos.behavior;return elem.scroll&&!isInstant?SupportsScrollMethodOptions?(null==pos.behavior&&(pos.behavior="auto"),elem.scroll(pos)):elem.scroll(Math.round(pos.left||0),Math.round(pos.top||0)):!elem.scrollTo||!SupportsScrollMethodOptions&&isInstant?(null!=pos.left&&(elem.scrollLeft=Math.round(pos.left)),null!=pos.top&&(elem.scrollTop=Math.round(pos.top))):SupportsScrollMethodOptions?(null==pos.behavior&&(pos.behavior="auto"),elem.scrollTo(pos)):elem.scrollTo(Math.round(pos.left||0),Math.round(pos.top||0)),instance._cachedScrollLeft=null,instance._cachedScrollTop=null,!1===pos.useDelayedPromise?Promise.resolve():!isSmoothScrollSupported||isInstant?setTimeoutPromise(0):setTimeoutPromise(100)}function buildTranslateValue(left,top){return left||top?SupportsTranslateProperty?left+"px "+top+"px":"translate("+left+"px, "+top+"px)":"none"}function dispatchScrollEventIfNeeded(instance){instance.options.dispatchScrollEvent&&instance.frame.dispatchEvent(new CustomEvent(instance.getScrollEventName(),{bubbles:!0,cancelable:!1}))}function setTimeoutPromise(delay){return new Promise(function(resolve,reject){setTimeout(resolve,delay)})}function renderAnimateWithTransform(instance,scrollOptions,immediate,useDelayedPromise){let speed=instance.options.speed,left=(immediate&&(speed=0),scrollOptions.left),top=scrollOptions.top;null==left&&(left=instance.getScrollLeft()),null==top&&(top=instance.getScrollTop());var immediate=buildTranslateValue(-round(left),-round(top)),lastTransitionValue=instance._lastTransitionValue,scrollTiming=skinViewManager.getSkinOptions().scrollTiming||"ease-out",scrollTiming=TranslateProperty+" "+speed+"ms "+scrollTiming;return scrollTiming!==lastTransitionValue&&(instance.slideeElementStyle.transitionDuration=scrollTiming,instance._lastTransitionValue=scrollTiming),instance.slideeElementStyle[TranslateProperty]=immediate,null!=scrollOptions.left&&(instance._pos.scrollLeft=scrollOptions.left),null!=scrollOptions.top&&(instance._pos.scrollTop=scrollOptions.top),dispatchScrollEventIfNeeded(instance),!1===useDelayedPromise?Promise.resolve():setTimeoutPromise(speed)}function onScrollForCaching(e){this._cachedScrollTop=null,this._cachedScrollLeft=null}Scroller.prototype.init=function(){var options,frame,slideeElement,nativeScrollElement;if(!this.initialized)return options=this.options,frame=this.frame,slideeElement=this.slideeElement,options.enableNativeScroll?(nativeScrollElement=this.nativeScrollElement,options.horizontal?(nativeScrollElement.classList.add("scrollX"),options.miniScrollbar&&nativeScrollElement.classList.add("scrollX-mini"),!1===options.hideScrollbar&&!layoutManager.tv||nativeScrollElement.classList.add("hiddenScrollX"),options.allowNativeSmoothScroll&&nativeScrollElement.classList.add("smoothScrollX")):(frame.closest(".dialog")&&nativeScrollElement.classList.add("dialog-scrollY"),nativeScrollElement.classList.add("scrollY"),options.miniScrollbar&&nativeScrollElement.classList.add("scrollY-mini"),(options.hideScrollbar||layoutManager.tv)&&nativeScrollElement.classList.add("hiddenScrollY"),options.allowNativeSmoothScroll&&nativeScrollElement.classList.add("smoothScrollY"),options.forceScrollbar&&nativeScrollElement.classList.add("overflowYScroll"))):(frame.style.overflow="hidden",this.slideeElementStyle.transition=TranslateProperty+" "+options.speed+"ms ease-out",this._lastTransitionValue=options.speed+"ms"),options.horizontal?(layoutManager.tv?frame.classList.add("scrollFrameX","scrollFrameX-tv","flex-direction-row"):frame.classList.add("scrollFrameX","flex-direction-row"),slideeElement.classList.add("scrollSliderX")):(slideeElement.classList.add("scrollSliderY"),frame.classList.add("scrollFrameY","flex-direction-column")),nativeScrollElement=onDragStart.bind(this),this.dragStartHandler=nativeScrollElement,slideeElement=onMouseWheelMove.bind(this),this.mouseWheelHandler=slideeElement,options.enableNativeScroll&&layoutManager.tv&&options.focusScroll&&dom.addEventListener(this.dragSourceElement,"mousedown",nativeScrollElement,{}),addFrameResizeObserver(this),options.enableNativeScroll?options.horizontal&&options.mouseWheel&&dom.addEventListener(frame,wheelEvent,slideeElement,{passive:!0}):(this.dragSourceElement.style["touch-action"]="none",window.PointerEvent?dom.addEventListener(this.dragSourceElement,"pointerdown",nativeScrollElement,{}):(dom.addEventListener(this.dragSourceElement,"touchstart",nativeScrollElement,{}),dom.addEventListener(this.dragSourceElement,"mousedown",nativeScrollElement,{})),options.dualScroll?dom.addEventListener(frame,"scroll",resetScroll,{passive:!0}):options.horizontal?dom.addEventListener(frame,"scroll",resetScrollLeft,{passive:!0}):dom.addEventListener(frame,"scroll",resetScrollTop,{passive:!0}),options.mouseWheel&&dom.addEventListener(frame,wheelEvent,slideeElement,{passive:!0})),options.focusScroll&&(this.boundOnFrameClick=onFrameClick.bind(this),dom.addEventListener(frame,"click",this.boundOnFrameClick,{passive:!0,capture:!0}),nativeScrollElement=this.focusHandler=onFocus.bind(this),dom.addEventListener(frame,"focus",nativeScrollElement,{capture:!0,passive:!0})),this.dragHandler=dragHandler.bind(this),this.initialized=1,load(this,!0),this},Scroller.prototype.slideTo=function(scrollOptions,fullItemPosX,fullItemPosY){this.ensureSizeInfo();var pos=this._pos,options=this.options,horizontal=(null==(scrollOptions=scrollOptions||{}).horizontal?options:scrollOptions).horizontal,dualScroll=(null==scrollOptions.dualScroll?options:scrollOptions).dualScroll;if(options.enableNativeScroll||((horizontal||dualScroll)&&null!=scrollOptions.left&&(scrollOptions.left=within(scrollOptions.left,pos.startX,pos.endX)),horizontal&&!dualScroll)||null!=scrollOptions.top&&(scrollOptions.top=within(scrollOptions.top,pos.startY,pos.endY)),scrollOptions.skipWhenVisibleX||scrollOptions.skipWhenVisibleY)if(fullItemPosX||fullItemPosY){let skipX=!0,skipY=!0;if(!horizontal&&!dualScroll||fullItemPosX&&(fullItemPosX.isVisible||scrollOptions.skipWhenAnyVisibleX&&fullItemPosX.anyVisible)||(skipX=!1),horizontal&&!dualScroll||fullItemPosY&&(fullItemPosY.isVisible||scrollOptions.skipWhenAnyVisibleY&&fullItemPosY.anyVisible)||(skipY=!1),skipX&&skipY)return Promise.resolve();skipX&&null!=scrollOptions.left&&delete scrollOptions.left,skipY&&null!=scrollOptions.top&&delete scrollOptions.top}else if(scrollOptions.itemSize){fullItemPosX=scrollOptions.itemSize/2,fullItemPosY=scrollOptions.slideeOffset||(scrollOptions.slideeOffset=options.enableNativeScroll?this.getScrollContainerBoundingClientRect():this.slideeElement.getBoundingClientRect());let left=scrollOptions.left,top=scrollOptions.top;null==left&&(left=this.getScrollLeft()),null==top&&(top=this.getScrollTop());fullItemPosY={itemBoundingClientRect:{width:horizontal?scrollOptions.itemSize:null,height:horizontal?null:scrollOptions.itemSize,left:horizontal?fullItemPosY.left+left-fullItemPosX:null,top:horizontal?null:fullItemPosY.top+top-fullItemPosX,right:horizontal?fullItemPosY.left+left+fullItemPosX:null},location:scrollOptions.location},fullItemPosX=(options.enableNativeScroll&&(fullItemPosX=horizontal?this.getScrollLeft():this.getScrollTop(),horizontal?(fullItemPosY.itemBoundingClientRect.left-=fullItemPosX,fullItemPosY.itemBoundingClientRect.right-=fullItemPosX):fullItemPosY.itemBoundingClientRect.top-=fullItemPosX),this.getElementPosition(null,horizontal,fullItemPosY));if(fullItemPosX.isVisible||(horizontal?scrollOptions.skipWhenAnyVisibleX:scrollOptions.skipWhenAnyVisibleY)&&fullItemPosX.anyVisible)return Promise.resolve()}fullItemPosY=scrollOptions.useDelayedPromise;if(horizontal||dualScroll){fullItemPosX=scrollOptions.left,horizontal=options.scrollSnapSizeX;if(null!=fullItemPosX&&null!=horizontal){dualScroll=scrollOptions.focusDirection;if(1===dualScroll){dualScroll=fullItemPosX%horizontal;dualScroll<10?scrollOptions.left-=dualScroll:scrollOptions.left+=horizontal-fullItemPosX%horizontal}else{let snapBackRemainder=horizontal-fullItemPosX%horizontal;if(snapBackRemainder<10)scrollOptions.left+=snapBackRemainder;else{let remainder=fullItemPosX%horizontal;scrollOptions.left-=remainder}}}}return options.enableNativeScroll?scrollNative(this,scrollOptions):null!=scrollOptions.left&&scrollOptions.left!==pos.scrollLeft||null!=scrollOptions.top&&scrollOptions.top!==pos.scrollTop?renderAnimateWithTransform(this,scrollOptions,"instant"===scrollOptions.behavior,fullItemPosY):Promise.resolve()},Scroller.prototype.scrollToPosition=function(pos){var options=this.options;if(null!=pos.position&&(options.horizontal?pos.left=pos.position:pos.top=pos.position,pos.position=null,delete pos.position),!options.enableNativeScroll)return this.slideTo(pos);var hasLeft=null!=pos.left,hasTop=null!=pos.top;if(!hasLeft||!hasTop)if(options.horizontal){if(hasLeft)return pos.behavior||(pos.behavior=isSmoothScrollSupported&&!layoutManager.tv?"smooth":"auto"),this.slideTo(pos)}else if(hasTop)return pos.behavior||(pos.behavior=isSmoothScrollSupported&&!layoutManager.tv?"smooth":"auto"),this.slideTo(pos);return pos.behavior="instant",scrollNative(this,pos)},Scroller.prototype.getElementPosition=function(item,horizontal,scrollOptions){var options=this.options,enableNativeScroll=options.enableNativeScroll,slideeOffset=scrollOptions.slideeOffset||(scrollOptions.slideeOffset=enableNativeScroll?this.getScrollContainerBoundingClientRect():this.slideeElement.getBoundingClientRect()),itemOffset=scrollOptions.itemBoundingClientRect||(scrollOptions.itemBoundingClientRect=item.getBoundingClientRect()),multiplier=horizontal?this.getScrollLeftMultiplier():this.getScrollTopMultiplier();let startOffset=horizontal?-1===multiplier?itemOffset.right-slideeOffset.right:itemOffset.left-slideeOffset.left:itemOffset.top-slideeOffset.top,size=horizontal?itemOffset.width:itemOffset.height;size||0===size||(size=item[horizontal?"offsetWidth":"offsetHeight"]);slideeOffset=options.centerOffset||0,itemOffset=horizontal?this.getScrollLeft():this.getScrollTop();enableNativeScroll&&(startOffset+=itemOffset);let startOffsetForPositioning=startOffset;item=horizontal?scrollOptions.offsetLeft:scrollOptions.offsetTop;let focusScrollOffset;item&&(focusScrollOffset=getFocusScrollOffset(this,horizontal,item)||0,startOffsetForPositioning+=focusScrollOffset),this.ensureSizeInfo();options=(horizontal?scrollOptions.frameWidthForComparison:scrollOptions.frameHeightForComparison)||getFrameSize(this,horizontal,!1);let absScrollPos=Math.abs(itemOffset),currentEnd=absScrollPos+options;scrollOptions.location===AdaptiveLocation&&(enableNativeScroll=(horizontal?scrollOptions.adaptiveBorderXStart:scrollOptions.adaptiveBorderYStart)||0,item=(horizontal?scrollOptions.adaptiveBorderXEnd:scrollOptions.adaptiveBorderYEnd)||0,absScrollPos+=enableNativeScroll,currentEnd-=item);itemOffset=Math.abs(startOffset),scrollOptions=Math.abs(startOffsetForPositioning)>=absScrollPos&&itemOffset+size<=currentEnd,enableNativeScroll=scrollOptions||Math.abs(startOffsetForPositioning)+size>=absScrollPos&&itemOffset<=currentEnd,item=subtractPaddingFromFrameSize(this,horizontal,options),itemOffset=startOffsetForPositioning+slideeOffset-(item/2-size/2)*multiplier-(focusScrollOffset||0),horizontal=startOffsetForPositioning-(item-size)*multiplier-(focusScrollOffset||0);return{start:startOffsetForPositioning,center:itemOffset,end:horizontal,isVisible:scrollOptions,anyVisible:enableNativeScroll}},Scroller.prototype.ensureSizeInfo=function(){var options,horizontal,dualScroll,frame,newFrameSize;this.requiresReflow&&(this.requiresReflow=!1,frame=this.frame,horizontal=(options=this.options).horizontal,newFrameSize={},dualScroll=options.dualScroll,(horizontal||dualScroll)&&(newFrameSize.width=frame.offsetWidth),horizontal&&!dualScroll||(newFrameSize.height=frame.offsetHeight),this.frameSize=newFrameSize,options.enableNativeScroll||(frame=this.slideeElement,newFrameSize=getComputedStyle(frame),this.slideeSize={width:Math.max(frame.offsetWidth,frame.scrollWidth)+parsePxToInt(newFrameSize.getPropertyValue(PaddingInlineStartProp))+parsePxToInt(newFrameSize.getPropertyValue(PaddingInlineEndProp)),height:Math.max(frame.offsetHeight,frame.scrollHeight)+parsePxToInt(newFrameSize.getPropertyValue("padding-top"))+parsePxToInt(newFrameSize.getPropertyValue("padding-bottom"))},(horizontal||dualScroll)&&(this._pos.endX=Math.max(this.getScrollWidth()-getFrameSize(this,!0,!0),0)*this.getScrollLeftMultiplier()),horizontal&&!dualScroll)||(this._pos.endY=Math.max(this.getScrollHeight()-getFrameSize(this,!1,!0),0)*this.getScrollTopMultiplier()))},Scroller.prototype.getScrollEventName=function(){return this.options.enableNativeScroll?"scroll":"scrollanimate"},Scroller.prototype.getScrollContainerBoundingClientRect=function(){if(!this.frameResizeObserver)return addFrameResizeObserver(this),this.nativeScrollElement.getBoundingClientRect();let rect=this._frameRect;return null==rect&&(rect=this.nativeScrollElement.getBoundingClientRect(),this._frameRect=rect),rect},Scroller.prototype.getScrollSlider=function(){return this.slideeElement},Scroller.prototype.addScrollEventListener=function(fn,options){this.listenerCount++,this.options.dispatchScrollEvent=0<this.listenerCount,this.options.cacheScrollPositions=this.options.dispatchScrollEvent&&preventScrollSupported,this.options.cacheScrollPositions&&this.addScrollCacheListener();var elem=this.options.enableNativeScroll?this.nativeScrollElement:this.frame;dom.addEventListener(elem,this.getScrollEventName(),fn,options)},Scroller.prototype.removeScrollEventListener=function(fn,options){this.listenerCount=Math.max(this.listenerCount-1,0),this.options.dispatchScrollEvent=0<this.listenerCount,this.options.cacheScrollPositions=this.options.dispatchScrollEvent&&preventScrollSupported,this.options.cacheScrollPositions||this.removeScrollCacheListener();var elem=this.options.enableNativeScroll?this.nativeScrollElement:this.frame;dom.removeEventListener(elem,this.getScrollEventName(),fn,options)},Scroller.prototype.addScrollCacheListener=function(){!this.options.enableNativeScroll||this._scrollCacheListenerBound||(this._scrollCacheListenerBound=!0,dom.addEventListener(this.nativeScrollElement,"scroll",this.onScrollForCachingFn,{passive:!0}))},Scroller.prototype.removeScrollCacheListener=function(){var elem=this.nativeScrollElement;elem&&(this._scrollCacheListenerBound=!1,dom.removeEventListener(elem,"scroll",this.onScrollForCachingFn,{passive:!0}))},Scroller.prototype.addResizeObserver=function(fn){addFrameResizeObserver(this),this.resizeListeners&&this.resizeListeners.push(fn)},Scroller.prototype.removeResizeObserver=function(fn){this.resizeListeners&&-1<(fn=this.resizeListeners.indexOf(fn))&&this.resizeListeners.splice(fn,1)},Scroller.prototype.isNativeScroll=function(item){return this.options.enableNativeScroll},Scroller.prototype.getScrollPosition=function(){return this.options.horizontal?this.getScrollLeft():this.getScrollTop()},Scroller.prototype.getLastScrollPosition=function(){return this.options.horizontal?this.getLastScrollLeft():this.getLastScrollTop()},Scroller.prototype.getScrollLeft=function(){var options=this.options;if(!options.enableNativeScroll)return this._pos.scrollLeft;if(options.cacheScrollPositions){let scrollLeft=this._cachedScrollLeft;return null==scrollLeft&&(scrollLeft=this.nativeScrollElement.scrollLeft,this._cachedScrollLeft=scrollLeft),scrollLeft}return this.nativeScrollElement.scrollLeft},Scroller.prototype.getScrollMultiplier=function(){return this.options.horizontal?this.getScrollLeftMultiplier():this.getScrollTopMultiplier()},Scroller.prototype.getScrollLeftMultiplier=function(){return this.options.inlineMultiplier},Scroller.prototype.getScrollTopMultiplier=function(){return 1},Scroller.prototype.getLastScrollLeft=function(){return this._cachedScrollLeft},Scroller.prototype.getScrollTop=function(){var options=this.options;if(!options.enableNativeScroll)return this._pos.scrollTop;if(options.cacheScrollPositions){let scrollTop=this._cachedScrollTop;return null==scrollTop&&(scrollTop=this.nativeScrollElement.scrollTop,this._cachedScrollTop=scrollTop),scrollTop}return this.nativeScrollElement.scrollTop},Scroller.prototype.getLastScrollTop=function(){return this._cachedScrollTop},Scroller.prototype.getScrollSize=function(){return this.options.horizontal?this.getScrollWidth():this.getScrollHeight()},Scroller.prototype.getPadding=function(){addFrameResizeObserver(this);var inlineStart,inlineEnd,top,style,padding=this._cachedPadding;return padding||(inlineStart=parsePxToInt((style=getComputedStyle(this.frame)).getPropertyValue(PaddingInlineStartProp)),inlineEnd=parsePxToInt(style.getPropertyValue(PaddingInlineEndProp)),top=parsePxToInt(style.getPropertyValue("top")),style=parsePxToInt(style.getPropertyValue("bottom")),this._cachedPadding=padding={inlineStart:inlineStart,inlineEnd:inlineEnd,top:top,bottom:style}),padding},Scroller.prototype.getScrollWidth=function(){if(!this.options.enableNativeScroll)return this.slideeSize.width;addFrameResizeObserver(this);let value=this._cachedScrollWidth;return value||(value=this.nativeScrollElement.scrollWidth,this._cachedScrollWidth=value),value},Scroller.prototype.getScrollHeight=function(){if(!this.options.enableNativeScroll)return this.slideeSize.height;addFrameResizeObserver(this);let value=this._cachedScrollHeight;return value||(value=this.nativeScrollElement.scrollHeight,this._cachedScrollHeight=value),value},Scroller.prototype.scrollBy=function(delta,scrollOptions){var options;delta&&((options=this.options).enableNativeScroll?options.horizontal?this.nativeScrollElement.scrollLeft+=delta:this.nativeScrollElement.scrollTop+=delta:((scrollOptions=scrollOptions||{}).position=this.getScrollPosition()+delta,this.scrollToPosition(scrollOptions)))},Scroller.prototype.to=function(toLocation,item,scrollOptions){let options=this.options,horizontal=(null==(scrollOptions=scrollOptions||{}).horizontal?options:scrollOptions).horizontal;var dualScroll=(null==scrollOptions.dualScroll?options:scrollOptions).dualScroll,adaptiveScroll=toLocation===AdaptiveLocation;scrollOptions.slideeOffset=options.enableNativeScroll?this.getScrollContainerBoundingClientRect():this.slideeElement.getBoundingClientRect();let itemPosX,itemPosY;if(horizontal||dualScroll){let location=toLocation;var frameSizeForComparison=getFrameSize(this,horizontal=!0);scrollOptions.frameWidthForComparison=frameSizeForComparison;let adaptiveBorderStart=options.adaptiveBorderXStart,adaptiveBorderEnd=(null==adaptiveBorderStart&&(adaptiveBorderStart=Math.max(horizontal?.03*frameSizeForComparison:.08*frameSizeForComparison,30)),options.adaptiveBorderXEnd);null==adaptiveBorderEnd&&(adaptiveBorderEnd=Math.max(horizontal?.03*frameSizeForComparison:.08*frameSizeForComparison,30)),scrollOptions.location=location,scrollOptions.adaptiveBorderXStart=adaptiveBorderStart,scrollOptions.adaptiveBorderXEnd=adaptiveBorderEnd;var itemPos=this.getElementPosition(item,horizontal,scrollOptions);if(adaptiveScroll){var multiplier=horizontal?this.getScrollLeftMultiplier():this.getScrollTopMultiplier(),scrollPosition=(horizontal?this.getScrollLeft():this.getScrollTop())*multiplier;let options=this.options,startEdge=(adaptiveBorderStart*=multiplier,adaptiveBorderEnd*=multiplier,itemPos[StartLocation]-=adaptiveBorderStart,itemPos[EndLocation]+=adaptiveBorderEnd,0);options.autoStartEdge&&(startEdge=horizontal?.05*frameSizeForComparison:+appHeaderContent.getHeight()),itemPos[StartLocation]*multiplier<startEdge&&0!==itemPos[StartLocation]&&(itemPos[StartLocation]=0),location=itemPos[StartLocation]*multiplier<=scrollPosition?StartLocation:itemPos[EndLocation]*multiplier>=scrollPosition?EndLocation:CenterLocation,scrollOptions.skipWhenVisibleX=!0}itemPosX=itemPos,scrollOptions.left=itemPos[location]}if(!horizontal||dualScroll){let location=toLocation,frameSizeForComparison=getFrameSize(this,horizontal=!1),adaptiveBorderStart=(scrollOptions.frameHeightForComparison=frameSizeForComparison,options.adaptiveBorderYStart),adaptiveBorderEnd=(null==adaptiveBorderStart&&(adaptiveBorderStart=Math.max(horizontal?.03*frameSizeForComparison:.08*frameSizeForComparison,30)),options.adaptiveBorderYEnd),itemPos=(null==adaptiveBorderEnd&&(adaptiveBorderEnd=Math.max(horizontal?.03*frameSizeForComparison:.08*frameSizeForComparison,30)),scrollOptions.location=location,scrollOptions.adaptiveBorderYStart=adaptiveBorderStart,scrollOptions.adaptiveBorderYEnd=adaptiveBorderEnd,this.getElementPosition(item,horizontal,scrollOptions));if(adaptiveScroll){let multiplier=horizontal?this.getScrollLeftMultiplier():this.getScrollTopMultiplier(),scrollPosition=(horizontal?this.getScrollLeft():this.getScrollTop())*multiplier,options=this.options,startEdge=(adaptiveBorderStart*=multiplier,adaptiveBorderEnd*=multiplier,itemPos[StartLocation]-=adaptiveBorderStart,itemPos[EndLocation]+=adaptiveBorderEnd,0);options.autoStartEdge&&(startEdge=horizontal?.05*frameSizeForComparison:+appHeaderContent.getHeight()),itemPos[StartLocation]*multiplier<startEdge&&0!==itemPos[StartLocation]&&(itemPos[StartLocation]=0),location=itemPos[StartLocation]*multiplier<=scrollPosition?StartLocation:itemPos[EndLocation]*multiplier>=scrollPosition?EndLocation:CenterLocation,scrollOptions.skipWhenVisibleY=!0}itemPosY=itemPos,scrollOptions.top=itemPos[location]}this.slideTo(scrollOptions,itemPosX,itemPosY)},Scroller.prototype.toStart=function(item,scrollOptions){this.to("start",item,scrollOptions)},Scroller.prototype.toEnd=function(item,scrollOptions){this.to("end",item,scrollOptions)},Scroller.prototype.scrollToElement=function(item,scrollOptions){var options=this.options;return null==(scrollOptions=scrollOptions||{}).offsetLeft&&(scrollOptions.offsetLeft=options.focusScrollOffsetLeft),null==scrollOptions.offsetTop&&(scrollOptions.offsetTop=options.focusScrollOffsetTop),options.enableNativeScroll&&!options.allowNativeSmoothScroll&&(scrollOptions.behavior="instant"),this.to(options.focusScroll||StartLocation,item,scrollOptions)},Scroller.prototype.toCenter=function(item,scrollOptions){this.to(CenterLocation,item,scrollOptions)},Scroller.prototype.scrollBackwards=function(){this.scrollBy(0-this.options.scrollBy)},Scroller.prototype.scrollForwards=function(){this.scrollBy(this.options.scrollBy)},Scroller.prototype.notifyResized=function(){onResize.call(this,[])},Scroller.prototype.destroy=function(){this.frameResizeObserver&&(this.frameResizeObserver.disconnect(),this.frameResizeObserver=null);var frame=this.frame,mouseWheelHandler=(frame&&(dom.removeEventListener(frame,"scroll",resetScrollTop,{passive:!0}),dom.removeEventListener(frame,"scroll",resetScrollLeft,{passive:!0}),dom.removeEventListener(frame,"scroll",resetScroll,{passive:!0}),mouseWheelHandler=this.mouseWheelHandler)&&dom.removeEventListener(frame,wheelEvent,mouseWheelHandler,{passive:!0}),this.mouseWheelHandler=null,this.dragStartHandler),dragSourceElement=this.dragSourceElement,dragSourceElement=(mouseWheelHandler&&dragSourceElement&&(dom.removeEventListener(dragSourceElement,"touchstart",mouseWheelHandler,{passive:!0}),dom.removeEventListener(dragSourceElement,"mousedown",mouseWheelHandler,{passive:!0}),dom.removeEventListener(dragSourceElement,"pointerdown",mouseWheelHandler,{passive:!0})),this.dragStartHandler=null,this.dragSourceElement=null,this.focusHandler),mouseWheelHandler=(dragSourceElement&&frame&&dom.removeEventListener(frame,"focus",dragSourceElement,{capture:!0,passive:!0}),this.focusHandler=null,this.boundOnFrameClick);return mouseWheelHandler&&frame&&dom.removeEventListener(frame,"click",mouseWheelHandler,{passive:!0,capture:!0}),this.boundOnFrameClick=null,this.removeScrollCacheListener(),this.initialized=null,this.nativeScrollElement=null,this.frame=null,this.options=null,this.slideeSize=null,this._pos=null,this.requiresReflow=null,this.frameSize=null,this.dragging=null,this.contentRects=null,this.dragHandler=null,this.onSourceClickFn=null,this.onScrollForCachingFn=null,this.resizeListeners=null,this._cachedScrollTop=null,this._cachedScrollLeft=null,this._cachedScrollHeight=null,this._cachedScrollWidth=null,this._cachedPadding=null,this._frameRect=null,this.slideeElement=null,this.slideeElementStyle=null,this},Scroller.create=function(frame,options){frame=new Scroller(frame,options);return Promise.resolve(frame)};export default Scroller;