tweb/public/3.68f6c12c212c5b69a7bb.chunk.js.map
Eduard Kuzmenko de0fbec792 Build
2021-04-23 14:43:59 +04:00

1 line
81 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/lib/lottieLoader.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/components/transition.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/helpers/animation.ts"],"names":["module","exports","Worker","pagesManager","pageId","this","pagesDiv","document","getElementById","scrollableDiv","querySelector","selectTab","horizontalMenu","page","onShown","isAuthPage","style","display","id","pageEl","lottieLoader","loadLottieWorkers","fastSmoothScroll","firstElementChild","className","onFirstMount","onMount","installed","body","args","res","Promise","err","console","error","setPage","convert","value","Math","round","min","max","RLottiePlayer","el","worker","options","super","reqId","width","height","paused","direction","speed","autoplay","loop","group","frames","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","undefined","skipDelta","pixelRatio","window","devicePixelRatio","needUpscale","isMobile","noCache","Infinity","canvas","createElement","classList","add","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","methodName","sendQuery","jsonString","setMainLoop","clearPendingRAF","clearTimeout","rafId","renderFirstFrame","pause","curFrame","frameCount","requestFrame","stop","play","onDestroy","frame","frameNo","data","set","putImageData","dispatchEvent","frInterval","delta","Date","now","frThen","setTimeout","renderFrame2","renderFrame","length","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","diff","addEventListener","appendChild","time","QueryableWorker","defaultListener","onError","onerror","onmessage","event","Object","queryMethodListener","queryMethodArguments","call","message","postMessage","terminate","queryMethod","transfer","forEach","arg","ArrayBuffer","push","buffer","LottieLoader","isWebAssemblySupported","loadPromise","reject","loaded","workersLimit","players","workers","curWorkerNum","log","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","getAnimations","animation","checkAnimation","element","player","resolve","remain","object","toneIndex","replacements","COLORREPLACEMENTS","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","params","url","fetch","then","arrayBuffer","gzipUncompress","str","loadAnimationWorker","assign","animationData","race","newAnimationData","JSON","parse","applyReplacements","stringify","parseInt","container","Error","initPlayer","addAnimation","idx","loadFromData","animationIntersector","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","idle","isIDLE","entry","target","isIntersecting","delete","clearCache","on","doc","type","checkAnimations","found","remove","HTMLVideoElement","src","load","findAndSplice","unobserve","settings","stickers","observe","blurred","destroy","groups","keys","removeAnimation","has","animations","requestAnimationFrame","refreshGroup","FocusDirection","position","margin","maxDistance","forceDirection","forceDuration","axis","animationsEnabled","Static","scrollWithJs","getBoundingClientRect","elementRect","containerRect","offsetTop","top","scrollTop","Up","Down","promise","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementPosition","elementSize","containerSize","scrollPosition","scrollSize","path","remainingPath","duration","abs","startAt","tick","t","currentPath","transition","slideNavigation","tabContent","prevTabContent","toRight","elements","reverse","filter","transform","offsetWidth","slideTabs","TransitionSlider","content","transitionTime","onTransitionEnd","isHeavy","animationFunction","dataset","Transition","onTransitionEndCallbacks","Map","animationDeferred","animationStarted","from","animate","self","HTMLElement","prevId","_from","to","children","onTransitionEndCallback","toggle","callback","timeout","performance","e","parentElement","get","tabs","onClick","scrollableX","proxy","Proxy","apply","that","selectTarget","canChange","scrollIntoViewNew","rootScope","contains","prev","tagName","toLowerCase","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","parent","findUpAsChild","tab","instances","cancelAnimationByKey","key","instance","getAnimationInstance","isCancelled","deferred","animateSingle","createAnimationInstance"],"mappings":"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","file":"3.68f6c12c212c5b69a7bb.chunk.js","sourcesContent":["module.exports = function() {\n return new Worker(__webpack_public_path__ + \"aeda10c6461aad01822d.worker.js\");\n};","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport { whichChild } from \"../helpers/dom\";\r\nimport lottieLoader from \"../lib/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType<typeof horizontalMenu>;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll(this.scrollableDiv, this.scrollableDiv.firstElementChild as HTMLElement, 'start');\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise<any> | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RLottieWorker from 'worker-loader!./rlottie/rlottie.worker';\r\nimport animationIntersector from \"../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { clamp } from '../helpers/number';\r\nimport { pause } from '../helpers/schedulers';\r\nimport { isAndroid, isApple, isAppleMobile, isSafari } from \"../helpers/userAgent\";\r\nimport { logger, LogLevels } from \"./logger\";\r\nimport apiManager from \"./mtproto/mtprotoworker\";\r\n\r\nlet convert = (value: number) => {\r\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\r\n};\r\n\r\ntype RLottiePlayerListeners = 'enterFrame' | 'ready' | 'firstFrame' | 'cached';\r\ntype RLottieOptions = {\r\n container: HTMLElement, \r\n autoplay?: boolean, \r\n animationData: string, \r\n loop?: boolean, \r\n width?: number,\r\n height?: number,\r\n group?: string,\r\n noCache?: true,\r\n needUpscale?: true,\r\n skipRatio?: number\r\n};\r\n\r\nexport class RLottiePlayer extends EventListenerBase<{\r\n enterFrame: (frameNo: number) => void,\r\n ready: () => void,\r\n firstFrame: () => void,\r\n cached: () => void\r\n}> {\r\n public static reqId = 0;\r\n\r\n public reqId = 0;\r\n public curFrame: number;\r\n public frameCount: number;\r\n public fps: number;\r\n public skipDelta: number;\r\n\r\n public worker: QueryableWorker;\r\n \r\n public width = 0;\r\n public height = 0;\r\n\r\n public el: HTMLElement;\r\n public canvas: HTMLCanvasElement;\r\n public context: CanvasRenderingContext2D;\r\n\r\n public paused = true;\r\n //public paused = false;\r\n public direction = 1;\r\n public speed = 1;\r\n public autoplay = true;\r\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\r\n public loop = true;\r\n public _loop: boolean; // ! will be used to store original value for settings.stickers.loop\r\n public group = '';\r\n\r\n private frInterval: number;\r\n private frThen: number;\r\n private rafId: number;\r\n\r\n //private caching = false;\r\n //private removed = false;\r\n\r\n private frames: {[frameNo: string]: Uint8ClampedArray} = {};\r\n public imageData: ImageData;\r\n public clamped: Uint8ClampedArray;\r\n public cachingDelta = 0;\r\n\r\n //private playedTimes = 0;\r\n\r\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\r\n private frameListener: () => void;\r\n\r\n constructor({el, worker, options}: {\r\n el: HTMLElement,\r\n worker: QueryableWorker,\r\n options: RLottieOptions\r\n }) {\r\n super(true);\r\n\r\n this.reqId = ++RLottiePlayer['reqId'];\r\n this.el = el;\r\n this.worker = worker;\r\n\r\n for(let i in options) {\r\n if(this.hasOwnProperty(i)) {\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n this._loop = this.loop;\r\n this._autoplay = this.autoplay;\r\n\r\n // * Skip ratio (30fps)\r\n let skipRatio: number;\r\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\r\n else if((isAndroid || isAppleMobile || (isApple && !isSafari)) && this.width < 100 && this.height < 100) {\r\n skipRatio = 0.5;\r\n }\r\n\r\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\r\n\r\n //options.needUpscale = true;\r\n\r\n // * Pixel ratio\r\n //const pixelRatio = window.devicePixelRatio;\r\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\r\n if(pixelRatio > 1) {\r\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\r\n if(options.needUpscale) {\r\n this.width = Math.round(this.width * pixelRatio);\r\n this.height = Math.round(this.height * pixelRatio);\r\n } else if(pixelRatio > 1) {\r\n if(this.width > 100 && this.height > 100) {\r\n if(isApple || !mediaSizes.isMobile) {\r\n /* this.width = Math.round(this.width * (pixelRatio - 1));\r\n this.height = Math.round(this.height * (pixelRatio - 1)); */\r\n this.width = Math.round(this.width * pixelRatio);\r\n this.height = Math.round(this.height * pixelRatio);\r\n } else if(pixelRatio > 2.5) {\r\n this.width = Math.round(this.width * (pixelRatio - 1.5));\r\n this.height = Math.round(this.height * (pixelRatio - 1.5));\r\n }\r\n } else {\r\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\r\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\r\n }\r\n }\r\n }\r\n\r\n //options.noCache = true;\r\n \r\n // * Cache frames params\r\n if(!options.noCache/* && false */) {\r\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\r\n if(isApple && this.width > 100 && this.height > 100) {\r\n this.cachingDelta = 2; //2 // 50%\r\n } else if(this.width < 100 && this.height < 100) {\r\n this.cachingDelta = Infinity; // 100%\r\n } else {\r\n this.cachingDelta = 4; // 75%\r\n }\r\n }\r\n \r\n // this.cachingDelta = Infinity;\r\n // if(isApple) {\r\n // this.cachingDelta = 0; //2 // 50%\r\n // }\r\n\r\n /* this.width *= 0.8;\r\n this.height *= 0.8; */\r\n \r\n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('rlottie');\r\n this.canvas.width = this.width;\r\n this.canvas.height = this.height;\r\n this.context = this.canvas.getContext('2d');\r\n\r\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\r\n this.imageData = new ImageData(this.width, this.height);\r\n }\r\n\r\n public clearCache() {\r\n this.frames = {};\r\n }\r\n\r\n public sendQuery(methodName: string, ...args: any[]) {\r\n //console.trace('RLottie sendQuery:', methodName);\r\n this.worker.sendQuery(methodName, this.reqId, ...args);\r\n }\r\n\r\n public loadFromData(jsonString: string) {\r\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\r\n }\r\n\r\n public play() {\r\n if(!this.paused) return;\r\n\r\n //return;\r\n\r\n //console.log('RLOTTIE PLAY' + this.reqId);\r\n\r\n this.paused = false;\r\n this.setMainLoop();\r\n }\r\n\r\n public pause(clearPendingRAF = true) {\r\n if(this.paused) return;\r\n\r\n this.paused = true;\r\n if(clearPendingRAF) {\r\n clearTimeout(this.rafId);\r\n }\r\n //window.cancelAnimationFrame(this.rafId);\r\n }\r\n\r\n public stop(renderFirstFrame = true) {\r\n this.pause();\r\n\r\n this.curFrame = this.direction === 1 ? 0 : this.frameCount;\r\n if(renderFirstFrame) {\r\n this.requestFrame(this.curFrame);\r\n //this.sendQuery('renderFrame', this.curFrame);\r\n }\r\n }\r\n\r\n public restart() {\r\n this.stop(false);\r\n this.play();\r\n }\r\n\r\n public setSpeed(speed: number) {\r\n this.speed = speed;\r\n\r\n if(!this.paused) {\r\n this.setMainLoop();\r\n }\r\n }\r\n\r\n public setDirection(direction: number) {\r\n this.direction = direction;\r\n \r\n if(!this.paused) {\r\n this.setMainLoop();\r\n }\r\n }\r\n\r\n public remove() {\r\n //alert('remove');\r\n lottieLoader.onDestroy(this.reqId);\r\n this.pause();\r\n this.sendQuery('destroy');\r\n //this.removed = true;\r\n }\r\n\r\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\r\n /* this.setListenerResult('enterFrame', frameNo);\r\n return; */\r\n\r\n try {\r\n this.imageData.data.set(frame);\r\n \r\n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\r\n //let perf = performance.now();\r\n this.context.putImageData(this.imageData, 0, 0);\r\n //console.log('renderFrame2 perf:', performance.now() - perf);\r\n } catch(err) {\r\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\r\n this.autoplay = false;\r\n this.pause();\r\n return;\r\n }\r\n \r\n //console.log('set result enterFrame', frameNo);\r\n this.dispatchEvent('enterFrame', frameNo);\r\n }\r\n\r\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\r\n //console.log('renderFrame', frameNo, this);\r\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames[frameNo]) {\r\n this.frames[frameNo] = new Uint8ClampedArray(frame);//frame;\r\n }\r\n\r\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\r\n this.setListenerResult('enterFrame', frameNo);\r\n if(frameNo === (this.frameCount - 1)) {\r\n this.setListenerResult('cached');\r\n }\r\n\r\n return;\r\n } */\r\n\r\n if(this.frInterval) {\r\n const now = Date.now(), delta = now - this.frThen;\r\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\r\n\r\n if(delta < 0) {\r\n if(this.rafId) clearTimeout(this.rafId);\r\n return this.rafId = window.setTimeout(() => {\r\n this.renderFrame2(frame, frameNo);\r\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\r\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\r\n }\r\n }\r\n\r\n this.renderFrame2(frame, frameNo);\r\n }\r\n\r\n public requestFrame(frameNo: number) {\r\n if(this.frames[frameNo]) {\r\n this.renderFrame(this.frames[frameNo], frameNo);\r\n } else if(isSafari) {\r\n this.sendQuery('renderFrame', frameNo);\r\n } else {\r\n if(!this.clamped.length) { // fix detached\r\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\r\n }\r\n \r\n this.sendQuery('renderFrame', frameNo, this.clamped);\r\n }\r\n }\r\n\r\n private mainLoopForwards() {\r\n const frame = (this.curFrame + this.skipDelta) >= this.frameCount ? this.curFrame = 0 : this.curFrame += this.skipDelta;\r\n //console.log('mainLoopForwards', this.curFrame, this.skipDelta, frame);\r\n\r\n this.requestFrame(frame);\r\n if((frame + this.skipDelta) >= this.frameCount) {\r\n //this.playedTimes++;\r\n\r\n if(!this.loop) {\r\n this.pause(false);\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n \r\n private mainLoopBackwards() {\r\n const frame = (this.curFrame - this.skipDelta) < 0 ? this.curFrame = this.frameCount - 1 : this.curFrame -= this.skipDelta;\r\n //console.log('mainLoopBackwards', this.curFrame, this.skipDelta, frame);\r\n\r\n this.requestFrame(frame);\r\n if((frame - this.skipDelta) < 0) {\r\n //this.playedTimes++;\r\n\r\n if(!this.loop) {\r\n this.pause(false);\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public setMainLoop() {\r\n //window.cancelAnimationFrame(this.rafId);\r\n clearTimeout(this.rafId);\r\n\r\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\r\n this.frThen = Date.now() - this.frInterval;\r\n\r\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\r\n\r\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\r\n this.currentMethod = method;\r\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\r\n\r\n //setTimeout(() => {\r\n //this.addListener('enterFrame', this.frameListener);\r\n //}, 0);\r\n\r\n if(this.frameListener && this.listenerResults.hasOwnProperty('enterFrame')) {\r\n this.frameListener();\r\n }\r\n \r\n //this.mainLoop(method);\r\n //this.r(method);\r\n //method();\r\n }\r\n\r\n public async onLoad(frameCount: number, fps: number) {\r\n this.curFrame = this.direction === 1 ? 0 : frameCount - 1;\r\n this.frameCount = frameCount;\r\n this.fps = fps;\r\n\r\n // * Handle 30fps stickers if 30fps set\r\n if(this.fps < 60 && this.skipDelta !== 1) {\r\n const diff = 60 / fps;\r\n this.skipDelta = this.skipDelta / diff | 0;\r\n }\r\n\r\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\r\n this.frThen = Date.now() - this.frInterval;\r\n //this.sendQuery('renderFrame', 0);\r\n \r\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \r\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \r\n\r\n /* console.time('cache' + this.reqId);\r\n for(let i = 0; i < frameCount; ++i) {\r\n //if(this.removed) return;\r\n \r\n if(i % 4) {\r\n await new Promise((resolve) => {\r\n delete this.listenerResults.enterFrame;\r\n this.addListener('enterFrame', resolve, true);\r\n this.requestFrame(i);\r\n }); \r\n }\r\n }\r\n \r\n console.timeEnd('cache' + this.reqId); */\r\n //console.log('cached');\r\n /* this.el.innerHTML = '';\r\n this.el.append(this.canvas);\r\n return; */\r\n\r\n this.requestFrame(0);\r\n this.dispatchEvent('ready');\r\n this.addEventListener('enterFrame', () => {\r\n this.dispatchEvent('firstFrame');\r\n\r\n this.el.appendChild(this.canvas);\r\n\r\n //console.log('enterFrame firstFrame');\r\n \r\n //let lastTime = this.frThen;\r\n this.frameListener = () => {\r\n if(this.paused) {\r\n return;\r\n }\r\n\r\n const time = Date.now();\r\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\r\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\r\n return;\r\n } */\r\n\r\n //lastTime = time;\r\n\r\n this.frThen = time + this.frInterval;\r\n const canContinue = this.currentMethod();\r\n if(!canContinue && !this.loop && this.autoplay) {\r\n this.autoplay = false;\r\n }\r\n };\r\n\r\n this.addEventListener('enterFrame', this.frameListener);\r\n }, true);\r\n }\r\n}\r\n\r\nclass QueryableWorker extends EventListenerBase<any> {\r\n constructor(private worker: Worker, private defaultListener: (data: any) => void = () => {}, onError?: (error: any) => void) {\r\n super();\r\n\r\n if(onError) {\r\n this.worker.onerror = onError;\r\n }\r\n\r\n this.worker.onmessage = (event) => {\r\n //return;\r\n //console.log('worker onmessage', event.data);\r\n if(event.data instanceof Object &&\r\n event.data.hasOwnProperty('queryMethodListener') &&\r\n event.data.hasOwnProperty('queryMethodArguments')) {\r\n /* if(event.data.queryMethodListener === 'frame') {\r\n return;\r\n } */\r\n\r\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\r\n } else {\r\n this.defaultListener.call(this, event.data);\r\n }\r\n };\r\n }\r\n\r\n public postMessage(message: any) {\r\n this.worker.postMessage(message);\r\n }\r\n\r\n public terminate() {\r\n this.worker.terminate();\r\n }\r\n\r\n public sendQuery(queryMethod: string, ...args: any[]) {\r\n if(isSafari) {\r\n this.worker.postMessage({\r\n 'queryMethod': queryMethod,\r\n 'queryMethodArguments': args\r\n });\r\n } else {\r\n //const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\r\n const transfer: ArrayBuffer[] = [];\r\n args.forEach(arg => {\r\n if(arg instanceof ArrayBuffer) {\r\n transfer.push(arg);\r\n }\r\n \r\n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\r\n transfer.push(arg.buffer);\r\n }\r\n });\r\n \r\n //console.log('transfer', transfer);\r\n this.worker.postMessage({\r\n 'queryMethod': queryMethod,\r\n 'queryMethodArguments': args\r\n }, transfer as PostMessageOptions);\r\n }\r\n }\r\n}\r\n\r\ntype LottieShape = {\r\n c: {\r\n k: number[]\r\n },\r\n ty: 'st' | 'fl',\r\n it?: LottieShape[]\r\n};\r\nclass LottieLoader {\r\n public isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n public loadPromise: Promise<void> = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n public loaded = false;\r\n\r\n // https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\r\n private static COLORREPLACEMENTS = [\r\n [\r\n [0xf77e41, 0xcb7b55],\r\n\t\t\t[0xffb139, 0xf6b689],\r\n\t\t\t[0xffd140, 0xffcda7],\r\n\t\t\t[0xffdf79, 0xffdfc5],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0xa45a38],\r\n\t\t\t[0xffb139, 0xdf986b],\r\n\t\t\t[0xffd140, 0xedb183],\r\n\t\t\t[0xffdf79, 0xf4c3a0],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0x703a17],\r\n\t\t\t[0xffb139, 0xab673d],\r\n\t\t\t[0xffd140, 0xc37f4e],\r\n\t\t\t[0xffdf79, 0xd89667],\r\n ],\r\n\r\n [\r\n [0xf77e41, 0x4a2409],\r\n\t\t\t[0xffb139, 0x7d3e0e],\r\n\t\t\t[0xffd140, 0x965529],\r\n\t\t\t[0xffdf79, 0xa96337],\r\n ],\r\n\r\n [\r\n\t\t\t[0xf77e41, 0x200f0a],\r\n\t\t\t[0xffb139, 0x412924],\r\n\t\t\t[0xffd140, 0x593d37],\r\n\t\t\t[0xffdf79, 0x63453f],\r\n ]\r\n ];\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogLevels.error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n private applyReplacements(object: {\r\n layers: Array<{shapes: LottieShape[]}>\r\n }, toneIndex: number) {\r\n const replacements = LottieLoader.COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\r\n\r\n const applyTo = (smth: LottieShape) => {\r\n const k = smth.c.k;\r\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\r\n\r\n const foundReplacement = replacements.find(p => p[0] === color);\r\n if(foundReplacement) {\r\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\r\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\r\n k[2] = (foundReplacement[1] & 255) / 255;\r\n }\r\n\r\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\r\n };\r\n\r\n const checkSmth = (smth: LottieShape) => {\r\n switch(smth.ty) {\r\n case 'st':\r\n case 'fl':\r\n applyTo(smth);\r\n break;\r\n }\r\n\r\n if(smth.hasOwnProperty('it')) {\r\n iterateIt(smth.it);\r\n }\r\n };\r\n\r\n const iterateIt = (it: LottieShape['it']) => {\r\n for(const smth of it) {\r\n checkSmth(smth);\r\n }\r\n };\r\n\r\n try {\r\n for(const layer of object.layers) {\r\n if(!layer.shapes) continue;\r\n \r\n for(const shape of layer.shapes) {\r\n if(!shape.it) {\r\n checkSmth(shape);\r\n continue;\r\n }\r\n\r\n iterateIt(shape.it);\r\n }\r\n }\r\n } catch(err) {\r\n this.log.warn('cant apply replacements', err, object, toneIndex);\r\n }\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit<RLottieOptions, 'animationData'>, url: string): Promise<RLottiePlayer> {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n \r\n return fetch(url)\r\n .then(res => res.arrayBuffer())\r\n .then(data => apiManager.gzipUncompress<string>(data, true))\r\n /* .then(str => {\r\n return new Promise<string>((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(str => {\r\n return this.loadAnimationWorker(Object.assign(params, {animationData: str/* JSON.parse(str) */, needUpscale: true}));\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer): Promise<void> {\r\n return Promise.race([\r\n /* new Promise<void>((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise<void>((resolve) => {\r\n player.addEventListener('firstFrame', resolve, true);\r\n }),\r\n pause(2500)\r\n ]);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = '', toneIndex = -1): Promise<RLottiePlayer> {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n const newAnimationData = JSON.parse(params.animationData);\r\n this.applyReplacements(newAnimationData, toneIndex);\r\n params.animationData = JSON.stringify(newAnimationData);\r\n }\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n animationIntersector.addAnimation(player, group);\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n rlPlayer.clamped = frame;\r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { isInDOM } from \"../helpers/dom\";\r\nimport { RLottiePlayer } from \"../lib/lottieLoader\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { isSafari } from \"../helpers/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n public observer: IntersectionObserver;\r\n private visible: Set<AnimationItem> = new Set();\r\n\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n rootScope.on('audio_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.on('audio_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && isSafari) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n for(const group in this.byGroups) {\r\n this.byGroups[group].findAndSplice(p => p === player);\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n if(rootScope.idle.isIDLE) return;\r\n \r\n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n if(group && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n this.byGroups[group] = [];\r\n return;\r\n }\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n animations.forEach(player => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport { isInDOM } from './dom';\r\n\r\nconst MAX_DISTANCE = 1500;\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport default function fastSmoothScroll(\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin = 0,\r\n maxDistance = MAX_DISTANCE,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis: 'x' | 'y' = 'y'\r\n) {\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(forceDirection === FocusDirection.Static) {\r\n forceDuration = 0;\r\n return scrollWithJs(container, element, position, margin, forceDuration, axis);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n if(axis === 'y' && element !== container && isInDOM(element) && container.getBoundingClientRect) {\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n \r\n const offsetTop = elementRect.top - containerRect.top;\r\n if(forceDirection === undefined) {\r\n if(offsetTop < -maxDistance) {\r\n container.scrollTop += (offsetTop + maxDistance);\r\n } else if(offsetTop > maxDistance) {\r\n container.scrollTop += (offsetTop - maxDistance);\r\n }\r\n } else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n }\r\n /* const { offsetTop } = element;\r\n\r\n if(forceDirection === undefined) {\r\n const offset = offsetTop - container.scrollTop;\r\n\r\n if(offset < -maxDistance) {\r\n container.scrollTop += (offset + maxDistance);\r\n } else if(offset > maxDistance) {\r\n container.scrollTop += (offset - maxDistance);\r\n }\r\n } else if(forceDirection === FocusDirection.Up) {\r\n container.scrollTop = offsetTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) {\r\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\r\n } */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(container, element, position, margin, forceDuration, axis)\r\n .then(resolve);\r\n });\r\n });\r\n\r\n return axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(\r\n container: HTMLElement, element: HTMLElement, position: ScrollLogicalPosition, margin = 0, forceDuration?: number, axis: 'x' | 'y' = 'y'\r\n) {\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = containerRect[sizeKey];\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] + (elementSize - elementRect[sizeKey]) - containerRect[rectEndKey];\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (containerSize / 2)\r\n : elementPosition - margin;\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction transition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { whichChild } from \"../helpers/dom\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (content: HTMLElement, type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (content: HTMLElement, animationFunction: TransitionFunction, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\r\n const onTransitionEndCallbacks: Map<HTMLElement, Function> = new Map();\r\n let animationDeferred: CancellablePromise<void>;\r\n let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(animationFunction ? 'transitionend' : 'animationend', (e) => {\r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n\r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n\r\n if(e.target !== from) {\r\n return;\r\n }\r\n\r\n if(!animationDeferred && isHeavy) return;\r\n\r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n\r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n });\r\n\r\n function selectTab(id: number | HTMLElement, animate = true) {\r\n const self = selectTab;\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = self.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const _from = from;\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!animate) {\r\n if(_from) _from.classList.remove('active', 'to', 'from'); \r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating', 'disable-hover');\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType<TransitionFunction>;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(_from/* && false */) {\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise<void>();\r\n animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { whichChild } from \"../helpers/dom\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew(target.parentElement.children[id] as HTMLElement, 'center', undefined, undefined, animate ? undefined : FocusDirection.Static, transitionTime, 'x');\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise<void>\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map<AnimationInstanceKey, AnimationInstance> = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise<void>()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n"],"sourceRoot":""}