1 line
57 KiB
Plaintext
1 line
57 KiB
Plaintext
{"version":3,"file":"page-NWzulROZ.js","sources":["../src/hooks/useHeavyAnimationCheck.ts","../src/helpers/dom/whichChild.ts","../src/components/transition.ts","../src/helpers/animation.ts","../src/helpers/dom/isInDOM.ts","../src/helpers/fastSmoothScroll.ts","../src/helpers/dom/findUpAsChild.ts","../src/helpers/dom/dispatchEvent.ts","../src/helpers/dom/clickEvent.ts","../src/components/horizontalMenu.ts","../src/pages/pagesManager.ts","../src/pages/page.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise<void> = deferredPromise<void>();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise<any>, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise<void>();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem?.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return i;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport liteMode from '../helpers/liteMode';\nimport I18n from '../lib/langPack';\n\nconst USE_3D = true;\n\nfunction makeTranslate(x: number, y: number) {\n if(I18n.isRTL) {\n x = -x;\n }\n\n return USE_3D ? `translate3d(${x}px, ${y}px, 0)` : `translate(${x}px, ${y}px)`;\n}\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = makeTranslate(-width * .25, 0);\n elements[1].style.transform = makeTranslate(width, 0);\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = makeTranslate(-width, 0);\n elements[1].style.transform = makeTranslate(width, 0);\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slidePremium = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n const classes = ['slide-right', 'slide-left'];\n if(toRight) {\n elements.reverse();\n classes.reverse();\n }\n\n elements[0].style.transform = makeTranslate(-width, 0);\n elements[1].style.transform = makeTranslate(width, 0);\n tabContent.classList.add('active', classes[0]);\n prevTabContent.classList.add(classes[1]);\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.classList.remove(classes[0]);\n\n return () => {\n prevTabContent.style.transform = '';\n prevTabContent.classList.remove(classes[1]);\n };\n },\n animateFirst: false\n});\n\n// const slideTopics = makeTransitionFunction({\n// callback: (tabContent, prevTabContent) => {\n// const rect = tabContent.getBoundingClientRect();\n// const offsetX = rect.width - 80;\n\n// tabContent.style.transform = `transformX(${offsetX}px)`;\n\n// tabContent.classList.add('active');\n// void tabContent.offsetWidth; // reflow\n\n// tabContent.style.transform = '';\n\n// return () => {};\n// },\n// animateFirst: true\n// });\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n premiumTabs: slidePremium,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'premiumTabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionStart?: (id: number) => void,\n onTransitionStartAfter?: (id: number) => void,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n onTransitionStart,\n onTransitionStartAfter,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map<HTMLElement, Function> = new Map();\n let animationDeferred: CancellablePromise<void>;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n onTransitionStart?.(id);\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!liteMode.isAvailable('animations') || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType<TransitionFunction['callback']>;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n onTransitionStartAfter?.(id);\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime + 100);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise<void>();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise<void>\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map<AnimationInstanceKey, AnimationInstance> = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise<void>()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return !!element?.isConnected;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport isInDOM from './dom/isInDOM';\nimport liteMode from './liteMode';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport function fastSmoothScrollToStart(container: HTMLElement, axis: 'x') {\n return fastSmoothScroll({\n container: container,\n element: container,\n getElementPosition: () => -container.scrollLeft,\n position: 'start',\n axis: 'x'\n });\n}\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!liteMode.isAvailable('animations') || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise<void> {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n let jumpToScrollPosition: number;\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n jumpToScrollPosition = scrollPosition += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n jumpToScrollPosition = scrollPosition += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = scrollPosition + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n if(jumpToScrollPosition !== undefined) {\n container[scrollPositionKey] = jumpToScrollPosition;\n jumpToScrollPosition = undefined;\n }\n\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nexport {shortTransition as shortScrollTransition};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAsChild<T extends {parentElement: HTMLElement}>(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\n}\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nlet lastMouseDownElement: HTMLElement;\ndocument.addEventListener('mousedown', (e) => {\n lastMouseDownElement = e.target as HTMLElement;\n // if((lastMouseDownElement as any)?.cancelMouseDown) {\n if(lastMouseDownElement?.closest('[cancel-mouse-down]')) {\n e.preventDefault();\n }\n});\n\nexport function hasMouseMovedSinceDown(e: Event) {\n if(e.isTrusted && e.type === 'click' && e.target !== lastMouseDownElement) {\n return true;\n }\n}\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, cancelMouseDown?: boolean, touchMouseDown: boolean, ignoreMove: boolean}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n\n if(options.cancelMouseDown) {\n (elem as HTMLElement).setAttribute('cancel-mouse-down', '');\n // (elem as any).cancelMouseDown = true;\n }\n\n if(CLICK_EVENT_NAME === 'click' && !options.ignoreMove) {\n const cb = callback;\n callback = (e) => {\n if(hasMouseMovedSinceDown(e)) {\n return;\n }\n\n cb(e);\n };\n }\n\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\n// export function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n// // if(CLICK_EVENT_NAME === 'touchend') {\n// // elem.removeEventListener('touchstart', callback, options);\n// // } else {\n// elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n// // }\n// }\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport liteMode from '../helpers/liteMode';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise<void | boolean>,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const animate = args[1] !== undefined ? args[1] : true;\n\n let id: number, el: HTMLElement;\n if(args[0] instanceof HTMLElement) {\n id = whichChild(args[0]);\n el = args[0];\n } else {\n id = +args[0];\n el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n }\n\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!liteMode.isAvailable('animations')) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\n// import lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType<typeof horizontalMenu>;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n // if(this.pageId !== -1 && id > 1) {\n // lottieLoader.loadLottieWorkers();\n // }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise<any> | void,\n private onMount?: (...args: any[]) => Promise<any> | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n"],"names":["eventListener","EventListenerBase","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","deferredPromise","promisesInQueue","log","dispatchHeavyAnimationEvent","promise","timeout","DEBUG","promises","pause","perf","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","useHeavyAnimationCheck","handleAnimationStart","handleAnimationEnd","listenerSetter","add","remove","whichChild","elem","countNonElements","i","makeTranslate","x","y","I18n","slideNavigation","tabContent","prevTabContent","toRight","width","elements","slideTabs","slidePremium","classes","transitions","TransitionSlider","options","content","type","transitionTime","onTransitionEnd","onTransitionStart","onTransitionStartAfter","isHeavy","once","withAnimationListener","animateFirst","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","e","cancelEvent","selectTab","id","animate","overrideFrom","prevId","to","liteMode","onTransitionEndCallback","transitionTimeout","_from","callback","instances","createAnimationInstance","key","cancelAnimationByKey","instance","getAnimationInstance","animateSingle","tick","fastRaf","isInDOM","element","MIN_JS_DURATION","MAX_JS_DURATION","LONG_TRANSITION_MAX_DISTANCE","SHORT_TRANSITION_MAX_DISTANCE","FocusDirection","FocusDirection2","fastSmoothScrollToStart","container","axis","fastSmoothScroll","scrollWithJs","fastRafPromise","getNormalSize","getElementPosition","transitionFunction","margin","position","forceDirection","maxDistance","forceDuration","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","elementRect","containerRect","possibleElementPosition","elementPosition","elementSize","containerSize","scrollPosition","scrollSize","path","jumpToScrollPosition","remainingPath","target","absPath","duration","startAt","transition","shortTransition","longTransition","getProgress","t","value","currentPath","distanceToEnd","findUpAsChild","el","parent","simulateEvent","name","event","lastMouseDownElement","hasMouseMovedSinceDown","CLICK_EVENT_NAME","IS_TOUCH_SUPPORTED","attachClickEvent","cb","simulateClickEvent","horizontalMenu","tabs","onClick","scrollableX","proxy","that","args","selectTarget","result1","canChange","mutateCallback","prev","tagName","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","PagesManager","page","pagesManager","MOUNT_CLASS_TO","Page","className","isAuthPage","onFirstMount","onMount","onShown","res","err"],"mappings":"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"} |