From 67c412bc557a631dbee07856e1b1badeb05a3152 Mon Sep 17 00:00:00 2001 From: Rene Date: Wed, 30 Dec 2020 00:25:57 +0100 Subject: [PATCH] rework cache and lifecycle --- .../dist/overlayscrollbars.esm.js | 267 ++++----- .../dist/overlayscrollbars.esm.js.map | 2 +- .../dist/overlayscrollbars.esm.min.js | 2 +- .../dist/overlayscrollbars.js | 302 +++++------ .../dist/overlayscrollbars.js.map | 2 +- .../dist/overlayscrollbars.min.js | 2 +- .../src/lifecycles/lifecycleBase.ts | 75 ++- .../src/lifecycles/structureLifecycle.ts | 101 ++-- .../src/observers/sizeObserver.ts | 38 +- .../src/observers/trinsicObserver.ts | 28 +- .../overlayscrollbars/OverlayScrollbars.ts | 14 +- .../src/support/cache/cache.ts | 127 ++--- .../src/support/dom/traversal.ts | 1 + packages/overlayscrollbars/src/typings.ts | 2 + .../jsdom/lifecycles/lifecycleBase.test.ts | 491 ++++------------- .../tests/jsdom/support/cache/cache.test.ts | 511 +++++++----------- .../observers/sizeObserver/index.browser.ts | 4 +- .../trinsicObserver/index.browser.ts | 12 +- .../types/lifecycles/lifecycleBase.d.ts | 21 +- .../types/observers/sizeObserver.d.ts | 6 +- .../types/observers/trinsicObserver.d.ts | 3 +- .../types/support/cache/cache.d.ts | 32 +- packages/overlayscrollbars/types/typings.d.ts | 2 + 23 files changed, 781 insertions(+), 1264 deletions(-) diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js index 12d40c9..cd1b888 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js @@ -12,9 +12,6 @@ function isNumber(obj) { function isString(obj) { return typeof obj === 'string'; } -function isBoolean(obj) { - return typeof obj === 'boolean'; -} function isFunction(obj) { return typeof obj === 'function'; } @@ -434,49 +431,29 @@ const absoluteCoordinates = (elm) => { : zeroObj$1; }; -function createCache(cacheUpdateInfo, isReference) { - const cache = {}; - const allProps = keys(cacheUpdateInfo); - each(allProps, (prop) => { - cache[prop] = { - _changed: false, - _value: isReference ? cacheUpdateInfo[prop] : undefined, +const createCache = (update, options) => { + const { _equal, _initialValue } = options || {}; + let _value = _initialValue; + + let _previous; + + return (force, context) => { + const prev = _value; + const newVal = update(context, _value, _previous); + const changed = force || (_equal ? !_equal(prev, newVal) : prev !== newVal); + + if (changed) { + _value = newVal; + _previous = prev; + } + + return { + _value, + _previous, + _changed: changed, }; - }); - - const updateCacheProp = (prop, value, equal) => { - const curr = cache[prop]._value; - cache[prop]._value = value; - cache[prop]._previous = curr; - cache[prop]._changed = equal ? !equal(curr, value) : curr !== value; }; - - const flush = (props, force) => { - const result = assignDeep({}, cache, { - _anythingChanged: false, - }); - each(props, (prop) => { - const changed = force || cache[prop]._changed; - result._anythingChanged = result._anythingChanged || changed; - result[prop]._changed = changed; - cache[prop]._changed = false; - }); - return result; - }; - - return (propsToUpdate, force) => { - const finalPropsToUpdate = (isString(propsToUpdate) ? [propsToUpdate] : propsToUpdate) || allProps; - each(finalPropsToUpdate, (prop) => { - const cacheVal = cache[prop]; - const curr = cacheUpdateInfo[prop]; - const arr = isReference ? false : isArray(curr); - const value = arr ? curr[0] : curr; - const equal = arr ? curr[1] : null; - updateCacheProp(prop, isReference ? value : value(cacheVal._value, cacheVal._previous), equal); - }); - return flush(finalPropsToUpdate, force); - }; -} +}; const firstLetterToUpper = (str) => str.charAt(0).toUpperCase() + str.slice(1); @@ -822,21 +799,21 @@ const getEnvironment = () => { return environmentInstance; }; -const createLifecycleBase = (defaultOptionsWithTemplate, cacheUpdateInfo, initialOptions, updateFunction) => { +const getPropByPath = (obj, path) => obj && path.split('.').reduce((o, prop) => (o && hasOwnProperty(o, prop) ? o[prop] : undefined), obj); + +const createLifecycleBase = (defaultOptionsWithTemplate, initialOptions, updateFunction) => { const { _template: optionsTemplate, _options: defaultOptions } = transformOptions(defaultOptionsWithTemplate); const options = assignDeep({}, defaultOptions, validateOptions(initialOptions || {}, optionsTemplate, null, true)._validated); - const cacheChange = createCache(cacheUpdateInfo); - const cacheOptions = createCache(options, true); const update = (hints) => { - const hasForce = isBoolean(hints._force); - const force = hints._force === true; - const changedCache = cacheChange(force ? null : hints._changedCache || (hasForce ? null : []), force); - const changedOptions = cacheOptions(force ? null : hints._changedOptions, !!hints._changedOptions || force); + const { _force, _changedOptions } = hints; - if (changedOptions._anythingChanged || changedCache._anythingChanged) { - updateFunction(changedOptions, changedCache); - } + const checkOption = (path) => ({ + _value: getPropByPath(options, path), + _changed: _force || getPropByPath(_changedOptions, path) !== undefined, + }); + + updateFunction(!!_force, checkOption); }; update({ @@ -845,101 +822,89 @@ const createLifecycleBase = (defaultOptionsWithTemplate, cacheUpdateInfo, initia return { _options(newOptions) { if (newOptions) { - const { _validated: changedOptions } = validateOptions(newOptions, optionsTemplate, options, true); - assignDeep(options, changedOptions); + const { _validated: _changedOptions } = validateOptions(newOptions, optionsTemplate, options, true); + assignDeep(options, _changedOptions); update({ - _changedOptions: keys(changedOptions), + _changedOptions, }); } return options; }, - _update: (force) => { + _update: (_force) => { update({ - _force: !!force, - }); - }, - _updateCache: (cachePropsToUpdate) => { - update({ - _changedCache: cachePropsToUpdate, + _force, }); }, }; }; const overflowBehaviorAllowedValues = 'visible-hidden visible-scroll scroll hidden'; +const defaultOptionsWithTemplate = { + paddingAbsolute: [false, optionsTemplateTypes.boolean], + overflowBehavior: { + x: ['scroll', overflowBehaviorAllowedValues], + y: ['scroll', overflowBehaviorAllowedValues], + }, +}; const cssMarginEnd = cssProperty('margin-inline-end'); const cssBorderEnd = cssProperty('border-inline-end'); const createStructureLifecycle = (target, initialOptions) => { - const { host, viewport, content } = target; + const { host, padding: paddingElm, viewport, content } = target; const destructFns = []; const env = getEnvironment(); const scrollbarsOverlaid = env._nativeScrollbarIsOverlaid; const supportsScrollbarStyling = env._nativeScrollbarStyling; const supportFlexboxGlue = env._flexboxGlue; const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y; - const { _options, _update, _updateCache } = createLifecycleBase( - { - paddingAbsolute: [false, optionsTemplateTypes.boolean], - overflowBehavior: { - x: ['scroll', overflowBehaviorAllowedValues], - y: ['scroll', overflowBehaviorAllowedValues], - }, - }, - { - padding: [() => topRightBottomLeft(host, 'padding'), equalTRBL], - }, - initialOptions, - (options, cache) => { - const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = options.paddingAbsolute; - const { _value: padding, _changed: paddingChanged } = cache.padding; + const updatePaddingCache = createCache(() => topRightBottomLeft(host, 'padding'), { + _equal: equalTRBL, + }); + const { _options, _update } = createLifecycleBase(defaultOptionsWithTemplate, initialOptions, (force, checkOption) => { + const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = checkOption('paddingAbsolute'); + const { _value: padding, _changed: paddingChanged } = updatePaddingCache(force); - if (paddingAbsoluteChanged || paddingChanged) { - const paddingStyle = { - t: 0, - r: 0, - b: 0, - l: 0, - }; + if (paddingAbsoluteChanged || paddingChanged) { + const paddingStyle = { + t: 0, + r: 0, + b: 0, + l: 0, + }; - if (!paddingAbsolute) { - paddingStyle.t = -padding.t; - paddingStyle.r = -(padding.r + padding.l); - paddingStyle.b = -(padding.b + padding.t); - paddingStyle.l = -padding.l; - } - - if (!supportsScrollbarStyling) { - paddingStyle.r -= env._nativeScrollbarSize.y; - paddingStyle.b -= env._nativeScrollbarSize.x; - } - - style(viewport, { - top: paddingStyle.t, - left: paddingStyle.l, - 'margin-right': paddingStyle.r, - 'margin-bottom': paddingStyle.b, - }); + if (!paddingAbsolute) { + paddingStyle.t = -padding.t; + paddingStyle.r = -(padding.r + padding.l); + paddingStyle.b = -(padding.b + padding.t); + paddingStyle.l = -padding.l; } - console.log(options); - console.log(cache); + if (!supportsScrollbarStyling) { + paddingStyle.r -= env._nativeScrollbarSize.y; + paddingStyle.b -= env._nativeScrollbarSize.x; + } + + style(paddingElm, { + top: paddingStyle.t, + left: paddingStyle.l, + 'margin-right': paddingStyle.r, + 'margin-bottom': paddingStyle.b, + 'max-width': `calc(100% + ${paddingStyle.r * -1}px)`, + }); } - ); + }); const onSizeChanged = () => { - _updateCache('padding'); + _update(); }; - const onTrinsicChanged = (widthIntrinsic, heightIntrinsic) => { - if (heightIntrinsic) { + const onTrinsicChanged = (widthIntrinsic, heightIntrinsicCache) => { + const { _changed, _value } = heightIntrinsicCache; + + if (_changed) { style(content, { - height: 'auto', - }); - } else { - style(content, { - height: '100%', + height: _value ? 'auto' : '100%', }); } }; @@ -963,6 +928,7 @@ const ResizeObserverConstructor = jsAPI('ResizeObserver'); const classNameSizeObserver = 'os-size-observer'; const classNameSizeObserverAppear = `${classNameSizeObserver}-appear`; const classNameSizeObserverListener = `${classNameSizeObserver}-listener`; +const classNameSizeObserverListenerScroll = `${classNameSizeObserverListener}-scroll`; const classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`; const classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`; const cAF = cancelAnimationFrame; @@ -979,14 +945,14 @@ const createSizeObserver = (target, onSizeChangedCallback, options) => { const sizeObserver = baseElements[0]; const listenerElement = sizeObserver.firstChild; - const onSizeChangedCallbackProxy = (dir) => { + const onSizeChangedCallbackProxy = (directionCache) => { if (direction) { const rtl = getDirection(sizeObserver) === 'rtl'; scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount); scrollTop(sizeObserver, scrollAmount); } - onSizeChangedCallback(isString(dir) ? dir : undefined); + onSizeChangedCallback(isString((directionCache || {})._value) ? directionCache : undefined); }; const offListeners = []; @@ -1001,6 +967,7 @@ const createSizeObserver = (target, onSizeChangedCallback, options) => { `
` ); appendChildren(listenerElement, observerElementChildren); + addClass(listenerElement, classNameSizeObserverListenerScroll); const observerElementChildrenRoot = observerElementChildren[0]; const shrinkElement = observerElementChildrenRoot.lastChild; const expandElement = observerElementChildrenRoot.firstChild; @@ -1017,15 +984,13 @@ const createSizeObserver = (target, onSizeChangedCallback, options) => { scrollTop(shrinkElement, scrollAmount); }; - const onResized = function onResized() { + const onResized = () => { rAFId = 0; - if (!isDirty) { - return; + if (isDirty) { + cacheSize = currSize; + onSizeChangedCallbackProxy(); } - - cacheSize = currSize; - onSizeChangedCallbackProxy(); }; const onScroll = (scrollEvent) => { @@ -1060,14 +1025,14 @@ const createSizeObserver = (target, onSizeChangedCallback, options) => { } if (direction) { - let dirCache; + const updateDirectionCache = createCache(() => getDirection(sizeObserver)); offListeners.push( on(sizeObserver, scrollEventName, (event) => { - const dir = getDirection(sizeObserver); - const changed = dir !== dirCache; + const directionCache = updateDirectionCache(); + const { _value, _changed } = directionCache; - if (changed) { - if (dir === 'rtl') { + if (_changed) { + if (_value === 'rtl') { style(listenerElement, { left: 'auto', right: 0, @@ -1079,8 +1044,7 @@ const createSizeObserver = (target, onSizeChangedCallback, options) => { }); } - dirCache = dir; - onSizeChangedCallbackProxy(dir); + onSizeChangedCallbackProxy(directionCache); } preventDefault(event); @@ -1107,7 +1071,12 @@ const IntersectionObserverConstructor = jsAPI('IntersectionObserver'); const createTrinsicObserver = (target, onTrinsicChangedCallback) => { const trinsicObserver = createDOM(`
`)[0]; const offListeners = []; - let heightIntrinsic = false; + const updateHeightIntrinsicCache = createCache( + (ioEntryOrSize) => ioEntryOrSize.h === 0 || ioEntryOrSize.isIntersecting || ioEntryOrSize.intersectionRatio > 0, + { + _initialValue: false, + } + ); if (IntersectionObserverConstructor) { const intersectionObserverInstance = new IntersectionObserverConstructor( @@ -1116,11 +1085,10 @@ const createTrinsicObserver = (target, onTrinsicChangedCallback) => { const last = entries.pop(); if (last) { - const newHeightIntrinsic = last.isIntersecting || last.intersectionRatio > 0; + const heightIntrinsicCache = updateHeightIntrinsicCache(0, last); - if (newHeightIntrinsic !== heightIntrinsic) { - onTrinsicChangedCallback(false, newHeightIntrinsic); - heightIntrinsic = newHeightIntrinsic; + if (heightIntrinsicCache._changed) { + onTrinsicChangedCallback(false, heightIntrinsicCache); } } } @@ -1135,11 +1103,10 @@ const createTrinsicObserver = (target, onTrinsicChangedCallback) => { offListeners.push( createSizeObserver(trinsicObserver, () => { const newSize = offsetSize(trinsicObserver); - const newHeightIntrinsic = newSize.h === 0; + const heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize); - if (newHeightIntrinsic !== heightIntrinsic) { - onTrinsicChangedCallback(false, newHeightIntrinsic); - heightIntrinsic = newHeightIntrinsic; + if (heightIntrinsicCache._changed) { + onTrinsicChangedCallback(false, heightIntrinsicCache); } }) ); @@ -1153,6 +1120,7 @@ const createTrinsicObserver = (target, onTrinsicChangedCallback) => { }; const classNameHost = 'os-host'; +const classNamePadding = 'os-padding'; const classNameViewport = 'os-viewport'; const classNameContent = 'os-content'; @@ -1162,24 +1130,29 @@ const normalizeTarget = (target) => { const _host = isTextarea ? createDiv() : target; + const _padding = createDiv(classNamePadding); + const _viewport = createDiv(classNameViewport); const _content = createDiv(classNameContent); + appendChildren(_padding, _viewport); appendChildren(_viewport, _content); appendChildren(_content, contents(target)); - appendChildren(target, _viewport); + appendChildren(target, _padding); addClass(_host, classNameHost); return { target, host: _host, + padding: _padding, viewport: _viewport, content: _content, }; } - const { host, viewport, content } = target; + const { host, padding, viewport, content } = target; addClass(host, classNameHost); + addClass(padding, classNamePadding); addClass(viewport, classNameViewport); addClass(content, classNameContent); return target; @@ -1191,10 +1164,10 @@ const OverlayScrollbars = (target, options, extensions) => { const { host } = osTarget; lifecycles.push(createStructureLifecycle(osTarget)); - const onSizeChanged = (direction) => { - if (direction) { + const onSizeChanged = (directionCache) => { + if (directionCache) { each(lifecycles, (lifecycle) => { - lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(direction); + lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(directionCache); }); } else { each(lifecycles, (lifecycle) => { @@ -1203,9 +1176,9 @@ const OverlayScrollbars = (target, options, extensions) => { } }; - const onTrinsicChanged = (widthIntrinsic, heightIntrinsic) => { + const onTrinsicChanged = (widthIntrinsic, heightIntrinsicCache) => { each(lifecycles, (lifecycle) => { - lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsic); + lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsicCache); }); }; diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map index f28ea1f..d8ac079 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map +++ b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"overlayscrollbars.esm.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/dom/events.ts","../src/support/utils/equal.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../src/support/cache/cache.ts","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/support/options/transformation.ts","../src/environment/environment.ts","../src/lifecycles/lifecycleBase.ts","../src/lifecycles/structureLifecycle.ts","../src/observers/sizeObserver.ts","../src/observers/trinsicObserver.ts","../src/overlayscrollbars/overlayscrollbars.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype RunEachItem = ((...args: any) => any | any[]) | null | undefined;\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Calls all functions in the passed array/set of functions.\r\n * @param arr The array filled with function which shall be called.\r\n */\r\nexport const runEach = (arr: ArrayLike | Set): void => {\r\n if (arr instanceof Set) {\r\n arr.forEach((fn) => fn && fn());\r\n } else {\r\n each(arr, (fn) => fn && fn());\r\n }\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst matches = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const fn = Element.prototype.matches || Element.prototype.msMatchesSelector;\r\n return fn.call(elm, selector);\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => matches(elm, selector);\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (matches(child, selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { attr } from 'support/dom/attribute';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (classNames?: string): HTMLDivElement => {\r\n const div = document.createElement('div');\r\n if (classNames) {\r\n attr(div, 'class', classNames);\r\n }\r\n return div;\r\n};\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","export interface WH {\r\n w: T;\r\n h: T;\r\n}\r\n\r\nconst elementHasDimensions = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n\r\n/**\r\n * Determines whether the passed element has any dimensions.\r\n * @param elm The element.\r\n */\r\nexport const hasDimensions = (elm: HTMLElement | null): boolean => (elm ? elementHasDimensions(elm as HTMLElement) : false);\r\n","import { each, runEach } from 'support/utils/array';\r\n\r\nlet passiveEventsSupport: boolean;\r\nconst supportPassiveEvents = (): boolean => {\r\n if (passiveEventsSupport === undefined) {\r\n passiveEventsSupport = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n passiveEventsSupport = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n }\r\n return passiveEventsSupport;\r\n};\r\n\r\nexport interface OnOptions {\r\n _capture?: boolean;\r\n _passive?: boolean;\r\n _once?: boolean;\r\n}\r\n\r\n/**\r\n * Removes the passed event listener for the passed events with the passed options.\r\n * @param target The element from which the listener shall be removed.\r\n * @param eventNames The eventsnames for which the listener shall be removed.\r\n * @param listener The listener which shall be removed.\r\n * @param capture The options of the removed listener.\r\n */\r\nexport const off = (target: EventTarget, eventNames: string, listener: EventListener, capture?: boolean): void => {\r\n each(eventNames.split(' '), (eventName) => {\r\n target.removeEventListener(eventName, listener, capture);\r\n });\r\n};\r\n\r\n/**\r\n * Adds the passed event listener for the passed eventnames with the passed options.\r\n * @param target The element to which the listener shall be added.\r\n * @param eventNames The eventsnames for which the listener shall be called.\r\n * @param listener The listener which is called on the eventnames.\r\n * @param options The options of the added listener.\r\n */\r\nexport const on = (target: EventTarget, eventNames: string, listener: EventListener, options?: OnOptions): (() => void) => {\r\n const doSupportPassiveEvents = supportPassiveEvents();\r\n const passive = (doSupportPassiveEvents && options && options._passive) || false;\r\n const capture = (options && options._capture) || false;\r\n const once = (options && options._once) || false;\r\n const offListeners: (() => void)[] = [];\r\n const nativeOptions: AddEventListenerOptions | boolean = doSupportPassiveEvents\r\n ? {\r\n passive,\r\n capture,\r\n }\r\n : capture;\r\n\r\n each(eventNames.split(' '), (eventName) => {\r\n const finalListener = once\r\n ? (evt: Event) => {\r\n target.removeEventListener(eventName, finalListener, capture);\r\n listener && listener(evt);\r\n }\r\n : listener;\r\n\r\n offListeners.push(off.bind(null, target, eventName, finalListener, capture));\r\n target.addEventListener(eventName, finalListener, nativeOptions);\r\n });\r\n\r\n return runEach.bind(0, offListeners);\r\n};\r\n\r\n/**\r\n * Shorthand for the stopPropagation event Method.\r\n * @param evt The event of which the stopPropagation method shall be called.\r\n */\r\nexport const stopPropagation = (evt: Event) => evt.stopPropagation();\r\n\r\n/**\r\n * Shorthand for the preventDefault event Method.\r\n * @param evt The event of which the preventDefault method shall be called.\r\n */\r\nexport const preventDefault = (evt: Event) => evt.preventDefault();\r\n","import { each } from 'support/utils/array';\r\nimport { WH, XY, TRBL } from 'support/dom';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Compares two objects and returns true if all values of the passed prop names are identical, false otherwise or if one of the two object is falsy.\r\n * @param a Object a.\r\n * @param b Object b.\r\n * @param props The props which shall be compared.\r\n */\r\nexport const equal = (a: T | undefined, b: T | undefined, props: Array): boolean => {\r\n if (a && b) {\r\n let result = true;\r\n each(props, (prop) => {\r\n if (a[prop] !== b[prop]) {\r\n result = false;\r\n }\r\n });\r\n return result;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalWH = (a?: WH, b?: WH) => equal(a, b, ['w', 'h']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalXY = (a?: XY, b?: XY) => equal(a, b, ['x', 'y']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalTRBL = (a?: TRBL, b?: TRBL) => equal(a, b, ['t', 'r', 'b', 'l']);\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\nexport interface TRBL {\r\n t: number;\r\n r: number;\r\n b: number;\r\n l: number;\r\n}\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst parseToZeroOrNumber = (value: string, toFloat?: boolean): number => {\r\n /* istanbul ignore next */\r\n const num = toFloat ? parseFloat(value) : parseInt(value, 10);\r\n /* istanbul ignore next */\r\n return Number.isNaN(num) ? 0 : num;\r\n};\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n\r\n/**\r\n * Returns a top\r\n * @param elm\r\n * @param property\r\n */\r\nexport const topRightBottomLeft = (elm: HTMLElement | null, property?: string): TRBL => {\r\n const finalProp = property || '';\r\n const top = `${finalProp}-top`;\r\n const right = `${finalProp}-right`;\r\n const bottom = `${finalProp}-bottom`;\r\n const left = `${finalProp}-left`;\r\n const result = style(elm, [top, right, bottom, left]);\r\n return {\r\n t: parseToZeroOrNumber(result[top]),\r\n r: parseToZeroOrNumber(result[right]),\r\n b: parseToZeroOrNumber(result[bottom]),\r\n l: parseToZeroOrNumber(result[left]),\r\n };\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\n\r\nexport interface XY {\r\n x: T;\r\n y: T;\r\n}\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","import { isArray, isString } from 'support/utils/types';\r\nimport { assignDeep, keys } from 'support/utils/object';\r\nimport { each } from 'support/utils/array';\r\n\r\ntype UpdateCacheProp =

(prop: P, value: T[P], compare: EqualCachePropFunction | null) => void;\r\n\r\ntype UpdateCachePropFunction = (current?: T[P], previous?: T[P]) => T[P];\r\n\r\ntype EqualCachePropFunction = (a?: T[P], b?: T[P]) => boolean;\r\n\r\nexport interface CacheEntry {\r\n _value?: T;\r\n _previous?: T;\r\n _changed: boolean;\r\n}\r\n\r\nexport type Cache = {\r\n [P in keyof T]: CacheEntry;\r\n};\r\n\r\nexport type CacheUpdated = Cache & { _anythingChanged: boolean };\r\n\r\nexport type CachePropsToUpdate = Array | keyof T;\r\n\r\nexport type CacheUpdate = (propsToUpdate?: CachePropsToUpdate | null, force?: boolean) => CacheUpdated;\r\n\r\nexport type CacheUpdateInfo = {\r\n [P in keyof T]: UpdateCachePropFunction | [UpdateCachePropFunction, EqualCachePropFunction];\r\n};\r\n\r\n/**\r\n * Creates a internally managed generic cache which can be updated by the returned function.\r\n * @param cacheUpdateInfo A object which accepts a function or a tuple of functions as values for its properties.\r\n * {\r\n * name: updateFn,\r\n * // or\r\n * name: [updateFn, equalFn]\r\n * }\r\n * The first function is the update function (updateFn) which is executed when this cache prop shall be updated.\r\n * Two params are passed, the first one is the current cache value and the second one is the previous cache value.\r\n *\r\n * The second function is the equal function (equalFn) which is also executed when this cache prop shall be updated,\r\n * but returns a boolean which indicates whether the current value and the new updated value are equal.\r\n * If no equal function is passed a shallow comparison is carried out between the values.\r\n *\r\n * @returns A function which can be called with wither one ar an array of properties which shall be updated. Optionally it can be called with the force param.\r\n * This function returns a object which represents the cache and its state at the time of updating (changed to previous value, current value and previous value).\r\n */\r\nexport function createCache(cacheUpdateInfo: CacheUpdateInfo): CacheUpdate;\r\nexport function createCache(referenceObj: T, isReference: true): CacheUpdate;\r\nexport function createCache(cacheUpdateInfo: CacheUpdateInfo | T, isReference?: true): CacheUpdate {\r\n const cache: Cache = {} as any;\r\n const allProps: Array = keys(cacheUpdateInfo) as Array;\r\n\r\n each(allProps, (prop) => {\r\n cache[prop] = { _changed: false, _value: isReference ? cacheUpdateInfo[prop] : undefined } as any;\r\n });\r\n\r\n const updateCacheProp: UpdateCacheProp = (prop, value, equal): void => {\r\n const curr = cache[prop]._value;\r\n\r\n cache[prop]._value = value;\r\n cache[prop]._previous = curr;\r\n cache[prop]._changed = equal ? !equal(curr, value) : curr !== value;\r\n };\r\n\r\n const flush = (props: Array, force?: boolean): CacheUpdated => {\r\n const result: CacheUpdated = assignDeep({}, cache, { _anythingChanged: false });\r\n\r\n each(props, (prop: keyof T) => {\r\n const changed = force || cache[prop]._changed;\r\n result._anythingChanged = result._anythingChanged || changed;\r\n\r\n result[prop]._changed = changed;\r\n cache[prop]._changed = false;\r\n });\r\n\r\n return result;\r\n };\r\n\r\n return (propsToUpdate, force) => {\r\n const finalPropsToUpdate: Array =\r\n (isString(propsToUpdate) ? ([propsToUpdate] as Array) : (propsToUpdate as Array)) || allProps;\r\n each(finalPropsToUpdate, (prop) => {\r\n const cacheVal = cache[prop];\r\n const curr = cacheUpdateInfo[prop];\r\n\r\n const arr = isReference ? false : isArray(curr);\r\n const value = arr ? curr[0] : curr;\r\n const equal = arr ? curr[1] : null;\r\n updateCacheProp(prop, isReference ? value : value(cacheVal._value, cacheVal._previous), equal);\r\n });\r\n return flush(finalPropsToUpdate, force);\r\n };\r\n}\r\n","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidationResult, OptionsValidated } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: T,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidationResult => {\r\n const validatedOptions: OptionsValidated = {};\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult._validated as any;\r\n optionsCopy[prop] = validatedResult._foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n let typeString: string | undefined;\r\n each(optionsTemplateTypes, (value: string, key: string) => {\r\n if (value === currTemplateType) {\r\n typeString = key;\r\n }\r\n });\r\n const isEnumString = typeString === undefined;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : typeString!);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n _foreign: optionsCopy,\r\n _validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validateOptions = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: T | null,\r\n doWriteErrors?: boolean\r\n): OptionsValidationResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false);\r\n};\r\n\r\nexport { validateOptions, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import { OptionsTemplate, OptionsWithOptionsTemplate, OptionsTemplateTypes } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\nimport { isArray } from 'support/utils/types';\r\nimport { each, keys } from 'support/utils';\r\n\r\nexport interface OptionsWithOptionsTemplateTransformation> {\r\n _template: OptionsTemplate;\r\n _options: T;\r\n}\r\n\r\n/**\r\n * Transforms the given OptionsWithOptionsTemplate object to its corresponding generic (T) Object or its corresponding Template object.\r\n * @param optionsWithOptionsTemplate The OptionsWithOptionsTemplate object which shall be converted.\r\n * @param toTemplate True if the given OptionsWithOptionsTemplate shall be converted to its corresponding Template object.\r\n */\r\nexport function transformOptions>(\r\n optionsWithOptionsTemplate: OptionsWithOptionsTemplate\r\n): OptionsWithOptionsTemplateTransformation {\r\n const result: any = {\r\n _template: {},\r\n _options: {},\r\n };\r\n\r\n each(keys(optionsWithOptionsTemplate), (key: Extract) => {\r\n const val: PlainObject | OptionsTemplateTypes | Array = optionsWithOptionsTemplate[key];\r\n\r\n if (isArray(val)) {\r\n result._template[key] = val[1];\r\n result._options[key] = val[0];\r\n } else {\r\n // if (isObject(val))\r\n const tmpResult = transformOptions(val as OptionsWithOptionsTemplate);\r\n result._template[key] = tmpResult._template;\r\n result._options[key] = tmpResult._options;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n runEach,\r\n equalWH,\r\n} from 'support';\r\n\r\nexport type OnEnvironmentChanged = (env: Environment) => void;\r\nexport interface Environment {\r\n _autoUpdateLoop: boolean;\r\n _nativeScrollbarSize: XY;\r\n _nativeScrollbarIsOverlaid: XY;\r\n _nativeScrollbarStyling: boolean;\r\n _rtlScrollBehavior: { n: boolean; i: boolean };\r\n _flexboxGlue: boolean;\r\n _addListener(listener: OnEnvironmentChanged): void;\r\n _removeListener(listener: OnEnvironmentChanged): void;\r\n}\r\n\r\nlet environmentInstance: Environment;\r\nconst { abs, round } = Math;\r\nconst environmentElmId = 'os-environment';\r\nconst classNameFlexboxGlue = 'flexbox-glue';\r\nconst classNameFlexboxGlueMax = `${classNameFlexboxGlue}-max`;\r\n\r\nconst getNativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst getNativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-scrollbar-styled');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst getRtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst getFlexboxGlue = (parentElm: HTMLElement, childElm: HTMLElement): boolean => {\r\n addClass(parentElm, classNameFlexboxGlue);\r\n const minOffsetsizeParent = offsetSize(parentElm);\r\n const minOffsetsize = offsetSize(childElm);\r\n const supportsMin = equalWH(minOffsetsize, minOffsetsizeParent);\r\n\r\n addClass(parentElm, classNameFlexboxGlueMax);\r\n const maxOffsetsizeParent = offsetSize(parentElm);\r\n const maxOffsetsize = offsetSize(childElm);\r\n const supportsMax = equalWH(maxOffsetsize, maxOffsetsizeParent);\r\n\r\n return supportsMin && supportsMax;\r\n};\r\n\r\nconst getWindowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nconst createEnvironment = (): Environment => {\r\n const { body } = document;\r\n const envDOM = createDOM(`
`);\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const onChangedListener: Set = new Set();\r\n const nativeScrollBarSize = getNativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nativeScrollBarSize.x === 0,\r\n y: nativeScrollBarSize.y === 0,\r\n };\r\n\r\n const env: Environment = {\r\n _autoUpdateLoop: false,\r\n _nativeScrollbarSize: nativeScrollBarSize,\r\n _nativeScrollbarIsOverlaid: nativeScrollbarIsOverlaid,\r\n _nativeScrollbarStyling: getNativeScrollbarStyling(envElm),\r\n _rtlScrollBehavior: getRtlScrollBehavior(envElm, envChildElm),\r\n _flexboxGlue: getFlexboxGlue(envElm, envChildElm),\r\n _addListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.add(listener);\r\n },\r\n _removeListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.delete(listener);\r\n },\r\n };\r\n\r\n removeAttr(envElm, 'style');\r\n removeAttr(envElm, 'class');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = getWindowDPR();\r\n let scrollbarSize = nativeScrollBarSize;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = getWindowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n if (isZoom) {\r\n const newScrollbarSize = (environmentInstance._nativeScrollbarSize = getNativeScrollbarSize(body, envElm));\r\n removeElements(envElm);\r\n\r\n if (scrollbarSize.x !== newScrollbarSize.x || scrollbarSize.y !== newScrollbarSize.y) {\r\n runEach(onChangedListener);\r\n }\r\n\r\n scrollbarSize = newScrollbarSize;\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n\r\n return env;\r\n};\r\n\r\nexport const getEnvironment = (): Environment => {\r\n if (!environmentInstance) {\r\n environmentInstance = createEnvironment();\r\n }\r\n return environmentInstance;\r\n};\r\n","import {\r\n CacheUpdateInfo,\r\n CachePropsToUpdate,\r\n Cache,\r\n OptionsWithOptionsTemplate,\r\n transformOptions,\r\n validateOptions,\r\n assignDeep,\r\n createCache,\r\n isBoolean,\r\n keys,\r\n} from 'support';\r\nimport { PlainObject } from 'typings';\r\n\r\ninterface LifecycleUpdateHints {\r\n _force?: boolean;\r\n _changedOptions?: CachePropsToUpdate;\r\n _changedCache?: CachePropsToUpdate;\r\n}\r\n\r\ninterface AbstractLifecycle {\r\n _options(newOptions?: O): O;\r\n _update(force?: boolean): void;\r\n}\r\n\r\nexport interface Lifecycle extends AbstractLifecycle {\r\n _destruct(): void;\r\n _onSizeChanged?(): void;\r\n _onDirectionChanged?(direction: 'ltr' | 'rtl'): void;\r\n _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsic: boolean): void;\r\n}\r\n\r\nexport interface LifecycleBase extends AbstractLifecycle {\r\n _updateCache(cachePropsToUpdate?: CachePropsToUpdate): void;\r\n}\r\n\r\n/**\r\n * Creates a object which can be seen as the base of a lifecycle because it provides all the tools to manage a lifecycle and its options, cache and base functions.\r\n * @param defaultOptionsWithTemplate A object which describes the options and the default options of the lifecycle.\r\n * @param cacheUpdateInfo A object which describes how cache updates shall behave.\r\n * @param initialOptions The initialOptions for the lifecylce. (Can be undefined)\r\n * @param updateFunction The update function where cache and options updates are handled. Has two arguments which are the changedOptions and the changedCache objects.\r\n */\r\nexport const createLifecycleBase = (\r\n defaultOptionsWithTemplate: OptionsWithOptionsTemplate>,\r\n cacheUpdateInfo: CacheUpdateInfo,\r\n initialOptions: O | undefined,\r\n updateFunction: (options: Cache, cache: Cache) => any\r\n): LifecycleBase => {\r\n const { _template: optionsTemplate, _options: defaultOptions } = transformOptions>(defaultOptionsWithTemplate);\r\n const options: Required = assignDeep(\r\n {},\r\n defaultOptions,\r\n validateOptions(initialOptions || ({} as O), optionsTemplate, null, true)._validated\r\n );\r\n const cacheChange = createCache(cacheUpdateInfo);\r\n const cacheOptions = createCache(options, true);\r\n\r\n const update = (hints: LifecycleUpdateHints) => {\r\n const hasForce = isBoolean(hints._force);\r\n const force = hints._force === true;\r\n\r\n const changedCache = cacheChange(force ? null : hints._changedCache || (hasForce ? null : []), force);\r\n const changedOptions = cacheOptions(force ? null : hints._changedOptions, !!hints._changedOptions || force);\r\n\r\n if (changedOptions._anythingChanged || changedCache._anythingChanged) {\r\n updateFunction(changedOptions, changedCache);\r\n }\r\n };\r\n\r\n update({ _force: true });\r\n\r\n return {\r\n _options(newOptions?: O) {\r\n if (newOptions) {\r\n const { _validated: changedOptions } = validateOptions(newOptions, optionsTemplate, options, true);\r\n assignDeep(options, changedOptions);\r\n\r\n update({ _changedOptions: keys(changedOptions) as CachePropsToUpdate });\r\n }\r\n return options;\r\n },\r\n _update: (force?: boolean) => {\r\n update({ _force: !!force });\r\n },\r\n _updateCache: (cachePropsToUpdate?: CachePropsToUpdate) => {\r\n update({ _changedCache: cachePropsToUpdate });\r\n },\r\n };\r\n};\r\n","import { cssProperty, runEach, topRightBottomLeft, TRBL, equalTRBL, optionsTemplateTypes as oTypes, OptionsTemplateValue, style } from 'support';\r\nimport { OSTargetObject } from 'typings';\r\nimport { createLifecycleBase, Lifecycle } from 'lifecycles/lifecycleBase';\r\nimport { getEnvironment, Environment } from 'environment';\r\n\r\nexport type OverflowBehavior = 'hidden' | 'scroll' | 'visible-hidden' | 'visible-scroll';\r\nexport interface StructureLifecycleOptions {\r\n paddingAbsolute: boolean;\r\n overflowBehavior?: {\r\n x?: OverflowBehavior;\r\n y?: OverflowBehavior;\r\n };\r\n}\r\ninterface StructureLifecycleCache {\r\n padding: TRBL;\r\n}\r\n\r\nconst overflowBehaviorAllowedValues: OptionsTemplateValue = 'visible-hidden visible-scroll scroll hidden';\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\nconst classNameViewportScrollbarStyling = `${classNameViewport}-scrollbar-styled`;\r\n\r\nconst cssMarginEnd = cssProperty('margin-inline-end');\r\nconst cssBorderEnd = cssProperty('border-inline-end');\r\n\r\nexport const createStructureLifecycle = (\r\n target: OSTargetObject,\r\n initialOptions?: StructureLifecycleOptions\r\n): Lifecycle => {\r\n const { host, viewport, content } = target;\r\n const destructFns: (() => any)[] = [];\r\n const env: Environment = getEnvironment();\r\n const scrollbarsOverlaid = env._nativeScrollbarIsOverlaid;\r\n const supportsScrollbarStyling = env._nativeScrollbarStyling;\r\n const supportFlexboxGlue = env._flexboxGlue;\r\n // direction change is only needed to update scrollbar hiding, therefore its not needed if css can do it, scrollbars are invisible or overlaid on y axis\r\n const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y;\r\n\r\n const { _options, _update, _updateCache } = createLifecycleBase(\r\n {\r\n paddingAbsolute: [false, oTypes.boolean],\r\n overflowBehavior: {\r\n x: ['scroll', overflowBehaviorAllowedValues],\r\n y: ['scroll', overflowBehaviorAllowedValues],\r\n },\r\n },\r\n {\r\n padding: [() => topRightBottomLeft(host, 'padding'), equalTRBL],\r\n },\r\n initialOptions,\r\n (options, cache) => {\r\n const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = options.paddingAbsolute;\r\n const { _value: padding, _changed: paddingChanged } = cache.padding;\r\n\r\n if (paddingAbsoluteChanged || paddingChanged) {\r\n const paddingStyle: TRBL = {\r\n t: 0,\r\n r: 0,\r\n b: 0,\r\n l: 0,\r\n };\r\n\r\n if (!paddingAbsolute) {\r\n paddingStyle.t = -padding!.t;\r\n paddingStyle.r = -(padding!.r + padding!.l);\r\n paddingStyle.b = -(padding!.b + padding!.t);\r\n paddingStyle.l = -padding!.l;\r\n }\r\n\r\n if (!supportsScrollbarStyling) {\r\n paddingStyle.r -= env._nativeScrollbarSize.y;\r\n paddingStyle.b -= env._nativeScrollbarSize.x;\r\n }\r\n\r\n style(viewport, { top: paddingStyle.t, left: paddingStyle.l, 'margin-right': paddingStyle.r, 'margin-bottom': paddingStyle.b });\r\n }\r\n\r\n console.log(options); // eslint-disable-line\r\n console.log(cache); // eslint-disable-line\r\n }\r\n );\r\n\r\n const onSizeChanged = () => {\r\n _updateCache('padding');\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsic: boolean) => {\r\n if (heightIntrinsic) {\r\n style(content, { height: 'auto' });\r\n } else {\r\n style(content, { height: '100%' });\r\n }\r\n };\r\n\r\n return {\r\n _options,\r\n _update,\r\n _onSizeChanged: onSizeChanged,\r\n _onTrinsicChanged: onTrinsicChanged,\r\n _destruct() {\r\n runEach(destructFns);\r\n },\r\n };\r\n};\r\n","import {\r\n createDOM,\r\n style,\r\n appendChildren,\r\n offsetSize,\r\n scrollLeft,\r\n scrollTop,\r\n jsAPI,\r\n runEach,\r\n prependChildren,\r\n removeElements,\r\n on,\r\n preventDefault,\r\n stopPropagation,\r\n addClass,\r\n isString,\r\n equalWH,\r\n} from 'support';\r\nimport { getEnvironment } from 'environment';\r\n\r\nconst animationStartEventName = 'animationstart';\r\nconst scrollEventName = 'scroll';\r\nconst scrollAmount = 3333333;\r\nconst ResizeObserverConstructor = jsAPI('ResizeObserver');\r\nconst classNameSizeObserver = 'os-size-observer';\r\nconst classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;\r\nconst classNameSizeObserverListener = `${classNameSizeObserver}-listener`;\r\nconst classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`;\r\nconst classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`;\r\nconst cAF = cancelAnimationFrame;\r\nconst rAF = requestAnimationFrame;\r\nconst getDirection = (elm: HTMLElement) => style(elm, 'direction');\r\n\r\n// TODO:\r\n// 1. MAYBE add comparison function to offsetSize etc.\r\ntype Direction = 'ltr' | 'rtl';\r\nexport type SizeObserverOptions = { _direction?: boolean; _appear?: boolean };\r\nexport const createSizeObserver = (\r\n target: HTMLElement,\r\n onSizeChangedCallback: (direction?: Direction) => any,\r\n options?: SizeObserverOptions\r\n): (() => void) => {\r\n const { _direction: direction = false, _appear: appear = false } = options || {};\r\n const rtlScrollBehavior = getEnvironment()._rtlScrollBehavior;\r\n const baseElements = createDOM(`
`);\r\n const sizeObserver = baseElements[0] as HTMLElement;\r\n const listenerElement = sizeObserver.firstChild as HTMLElement;\r\n const onSizeChangedCallbackProxy = (dir?: Direction) => {\r\n if (direction) {\r\n const rtl = getDirection(sizeObserver) === 'rtl';\r\n scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount);\r\n scrollTop(sizeObserver, scrollAmount);\r\n }\r\n onSizeChangedCallback(isString(dir) ? dir : undefined);\r\n };\r\n const offListeners: (() => void)[] = [];\r\n let appearCallback: ((...args: any) => any) | null = appear ? onSizeChangedCallbackProxy : null;\r\n\r\n if (ResizeObserverConstructor) {\r\n const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);\r\n resizeObserverInstance.observe(listenerElement);\r\n offListeners.push(() => resizeObserverInstance.disconnect());\r\n } else {\r\n const observerElementChildren = createDOM(\r\n `
`\r\n );\r\n appendChildren(listenerElement, observerElementChildren);\r\n const observerElementChildrenRoot = observerElementChildren[0] as HTMLElement;\r\n const shrinkElement = observerElementChildrenRoot.lastChild as HTMLElement;\r\n const expandElement = observerElementChildrenRoot.firstChild as HTMLElement;\r\n const expandElementChild = expandElement?.firstChild as HTMLElement;\r\n\r\n let cacheSize = offsetSize(listenerElement);\r\n let currSize = cacheSize;\r\n let isDirty = false;\r\n let rAFId: number;\r\n\r\n const reset = () => {\r\n scrollLeft(expandElement, scrollAmount);\r\n scrollTop(expandElement, scrollAmount);\r\n scrollLeft(shrinkElement, scrollAmount);\r\n scrollTop(shrinkElement, scrollAmount);\r\n };\r\n const onResized = function () {\r\n rAFId = 0;\r\n if (!isDirty) {\r\n return;\r\n }\r\n\r\n cacheSize = currSize;\r\n onSizeChangedCallbackProxy();\r\n };\r\n const onScroll = (scrollEvent?: Event) => {\r\n currSize = offsetSize(listenerElement);\r\n isDirty = !scrollEvent || !equalWH(currSize, cacheSize);\r\n\r\n if (scrollEvent && isDirty && !rAFId) {\r\n cAF(rAFId);\r\n rAFId = rAF(onResized);\r\n } else if (!scrollEvent) {\r\n onResized();\r\n }\r\n\r\n reset();\r\n if (scrollEvent) {\r\n preventDefault(scrollEvent);\r\n stopPropagation(scrollEvent);\r\n }\r\n return false;\r\n };\r\n\r\n offListeners.push(on(expandElement, scrollEventName, onScroll));\r\n offListeners.push(on(shrinkElement, scrollEventName, onScroll));\r\n\r\n // lets assume that the divs will never be that large and a constant value is enough\r\n style(expandElementChild, {\r\n width: scrollAmount,\r\n height: scrollAmount,\r\n });\r\n reset();\r\n appearCallback = appear ? () => onScroll() : reset;\r\n }\r\n\r\n if (direction) {\r\n let dirCache: string | undefined;\r\n offListeners.push(\r\n on(sizeObserver, scrollEventName, (event: Event) => {\r\n const dir = getDirection(sizeObserver);\r\n const changed = dir !== dirCache;\r\n if (changed) {\r\n if (dir === 'rtl') {\r\n style(listenerElement, { left: 'auto', right: 0 });\r\n } else {\r\n style(listenerElement, { left: 0, right: 'auto' });\r\n }\r\n dirCache = dir;\r\n onSizeChangedCallbackProxy(dir as Direction);\r\n }\r\n\r\n preventDefault(event);\r\n stopPropagation(event);\r\n return false;\r\n })\r\n );\r\n }\r\n\r\n // appearCallback is always needed on scroll-observer strategy to reset it\r\n if (appearCallback) {\r\n addClass(sizeObserver, classNameSizeObserverAppear);\r\n offListeners.push(on(sizeObserver, animationStartEventName, appearCallback));\r\n }\r\n\r\n prependChildren(target, sizeObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(sizeObserver);\r\n };\r\n};\r\n","import { createDOM, offsetSize, jsAPI, runEach, prependChildren, removeElements } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\n\r\nconst classNameTrinsicObserver = 'os-trinsic-observer';\r\nconst IntersectionObserverConstructor = jsAPI('IntersectionObserver');\r\n\r\nexport const createTrinsicObserver = (\r\n target: HTMLElement,\r\n onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsic: boolean) => any\r\n): (() => void) => {\r\n const trinsicObserver = createDOM(`
`)[0] as HTMLElement;\r\n const offListeners: (() => void)[] = [];\r\n let heightIntrinsic = false;\r\n\r\n if (IntersectionObserverConstructor) {\r\n const intersectionObserverInstance: IntersectionObserver = new IntersectionObserverConstructor(\r\n (entries: IntersectionObserverEntry[]) => {\r\n if (entries && entries.length > 0) {\r\n const last = entries.pop();\r\n if (last) {\r\n const newHeightIntrinsic = last.isIntersecting || last.intersectionRatio > 0;\r\n\r\n if (newHeightIntrinsic !== heightIntrinsic) {\r\n onTrinsicChangedCallback(false, newHeightIntrinsic);\r\n heightIntrinsic = newHeightIntrinsic;\r\n }\r\n }\r\n }\r\n },\r\n { root: target }\r\n );\r\n intersectionObserverInstance.observe(trinsicObserver);\r\n offListeners.push(() => intersectionObserverInstance.disconnect());\r\n } else {\r\n offListeners.push(\r\n createSizeObserver(trinsicObserver, () => {\r\n const newSize = offsetSize(trinsicObserver);\r\n const newHeightIntrinsic = newSize.h === 0;\r\n\r\n if (newHeightIntrinsic !== heightIntrinsic) {\r\n onTrinsicChangedCallback(false, newHeightIntrinsic);\r\n heightIntrinsic = newHeightIntrinsic;\r\n }\r\n })\r\n );\r\n }\r\n\r\n prependChildren(target, trinsicObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(trinsicObserver);\r\n };\r\n};\r\n","import { OSTarget, OSTargetObject } from 'typings';\r\nimport { createStructureLifecycle } from 'lifecycles/structureLifecycle';\r\nimport { appendChildren, addClass, contents, is, isHTMLElement, createDiv, each } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\nimport { createTrinsicObserver } from 'observers/trinsicObserver';\r\nimport { Lifecycle } from 'lifecycles/lifecycleBase';\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\n\r\nconst normalizeTarget = (target: OSTarget): OSTargetObject => {\r\n if (isHTMLElement(target)) {\r\n const isTextarea = is(target, 'textarea');\r\n const host = (isTextarea ? createDiv() : target) as HTMLElement;\r\n const viewport = createDiv(classNameViewport);\r\n const content = createDiv(classNameContent);\r\n\r\n appendChildren(viewport, content);\r\n appendChildren(content, contents(target));\r\n appendChildren(target, viewport);\r\n addClass(host, classNameHost);\r\n\r\n return {\r\n target,\r\n host,\r\n viewport,\r\n content,\r\n };\r\n }\r\n\r\n const { host, viewport, content } = target;\r\n\r\n addClass(host, classNameHost);\r\n addClass(viewport, classNameViewport);\r\n addClass(content, classNameContent);\r\n\r\n return target;\r\n};\r\n\r\nconst OverlayScrollbars = (target: OSTarget, options?: any, extensions?: any): void => {\r\n const osTarget: OSTargetObject = normalizeTarget(target);\r\n const lifecycles: Lifecycle[] = [];\r\n const { host } = osTarget;\r\n\r\n lifecycles.push(createStructureLifecycle(osTarget));\r\n\r\n // eslint-disable-next-line\r\n const onSizeChanged = (direction?: 'ltr' | 'rtl') => {\r\n if (direction) {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(direction);\r\n });\r\n } else {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onSizeChanged && lifecycle._onSizeChanged();\r\n });\r\n }\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsic: boolean) => {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsic);\r\n });\r\n };\r\n\r\n createSizeObserver(host, onSizeChanged, { _appear: true, _direction: true });\r\n createTrinsicObserver(host, onTrinsicChanged);\r\n};\r\n\r\nexport { OverlayScrollbars };\r\n","import { createDOM } from 'support/dom';\r\nimport { getEnvironment } from 'environment';\r\nimport { OverlayScrollbars } from 'overlayscrollbars/overlayscrollbars';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n getEnvironment(),\r\n OverlayScrollbars(document.body),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["type","obj","undefined","Object","prototype","toString","call","replace","toLowerCase","isNumber","isString","isBoolean","isFunction","isUndefined","isNull","isArray","Array","isObject","isArrayLike","length","isPlainObject","key","proto","hasOwnProperty","hasOwnConstructor","hasIsPrototypeOf","constructor","isHTMLElement","instaceOfRightHandSide","window","HTMLElement","doInstanceOf","nodeType","nodeName","isEmptyObject","name","getSetProp","topLeft","fallback","elm","value","attr","attrName","getAttribute","setAttribute","removeAttr","removeAttribute","scrollLeft","scrollTop","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","keys","from","arr","push","runEach","Set","forEach","fn","matches","selector","Element","msMatchesSelector","is","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","prependChildren","removeElements","nodes","e","removeChild","createDiv","classNames","div","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","passiveEventsSupport","supportPassiveEvents","addEventListener","defineProperty","get","off","target","eventNames","listener","capture","split","eventName","removeEventListener","on","options","doSupportPassiveEvents","passive","_passive","_capture","once","_once","offListeners","nativeOptions","finalListener","evt","bind","stopPropagation","preventDefault","equal","a","b","props","prop","equalWH","equalTRBL","assignDeep","object1","object2","object3","object4","object5","object6","sources","copy","copyIsArray","src","clone","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","parseToZeroOrNumber","toFloat","num","parseFloat","parseInt","Number","isNaN","adaptCSSVal","val","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","topRightBottomLeft","property","finalProp","top","right","bottom","left","t","r","l","x","y","absoluteCoordinates","rect","pageYOffset","pageXOffset","createCache","cacheUpdateInfo","isReference","cache","allProps","_changed","_value","updateCacheProp","curr","_previous","flush","force","_anythingChanged","changed","propsToUpdate","finalPropsToUpdate","cacheVal","firstLetterToUpper","str","charAt","toUpperCase","slice","getDummyStyle","cssPrefixes","jsPrefixes","jsCache","cssCache","cssProperty","uppercasedName","elmStyle","prefix","prefixWithoutDashes","resultPossibilities","find","resultPossibility","jsAPI","resizeObserver","_extends","module","assign","arguments","apply","stringify","JSON","templateTypePrefixSuffix","optionsTemplateTypes","item","validateRecursive","template","optionsDiff","doWriteErrors","propPath","validatedOptions","optionsCopy","filter","optionsDiffValue","optionsValue","templateValue","templateIsComplex","propPrefix","validatedResult","_validated","_foreign","isValid","errorEnumStrings","errorPossibleTypes","optionsValueType","templateValueArr","currTemplateType","typeString","isEnumString","enumStringSplit","possibility","string","doStringifyComparison","console","warn","join","validateOptions","transformOptions","optionsWithOptionsTemplate","_template","_options","tmpResult","environmentInstance","abs","round","Math","environmentElmId","classNameFlexboxGlue","classNameFlexboxGlueMax","getNativeScrollbarSize","body","measureElm","cSize","oSize","getNativeScrollbarStyling","testElm","ex","getRtlScrollBehavior","childElm","strHidden","overflowX","overflowY","direction","parentOffset","childOffset","childOffsetAfterScroll","n","getFlexboxGlue","minOffsetsizeParent","minOffsetsize","supportsMin","maxOffsetsizeParent","maxOffsetsize","supportsMax","getWindowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","createEnvironment","envDOM","envElm","envChildElm","onChangedListener","nativeScrollBarSize","nativeScrollbarIsOverlaid","env","_autoUpdateLoop","_nativeScrollbarSize","_nativeScrollbarIsOverlaid","_nativeScrollbarStyling","_rtlScrollBehavior","_flexboxGlue","_addListener","_removeListener","delete","size","dpr","scrollbarSize","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","newScrollbarSize","getEnvironment","createLifecycleBase","defaultOptionsWithTemplate","initialOptions","updateFunction","optionsTemplate","defaultOptions","cacheChange","cacheOptions","update","hints","hasForce","_force","changedCache","_changedCache","changedOptions","_changedOptions","newOptions","_update","_updateCache","cachePropsToUpdate","overflowBehaviorAllowedValues","cssMarginEnd","cssBorderEnd","createStructureLifecycle","host","viewport","content","destructFns","scrollbarsOverlaid","supportsScrollbarStyling","supportFlexboxGlue","directionObserverObsolete","paddingAbsolute","oTypes","boolean","overflowBehavior","padding","paddingAbsoluteChanged","paddingChanged","paddingStyle","log","onSizeChanged","onTrinsicChanged","widthIntrinsic","heightIntrinsic","height","_onSizeChanged","_onTrinsicChanged","_destruct","animationStartEventName","scrollEventName","scrollAmount","ResizeObserverConstructor","classNameSizeObserver","classNameSizeObserverAppear","classNameSizeObserverListener","classNameSizeObserverListenerItem","classNameSizeObserverListenerItemFinal","cAF","cancelAnimationFrame","rAF","requestAnimationFrame","getDirection","createSizeObserver","onSizeChangedCallback","_direction","_appear","appear","rtlScrollBehavior","baseElements","sizeObserver","listenerElement","onSizeChangedCallbackProxy","dir","rtl","appearCallback","resizeObserverInstance","observe","disconnect","observerElementChildren","observerElementChildrenRoot","shrinkElement","lastChild","expandElement","expandElementChild","cacheSize","currSize","isDirty","rAFId","reset","onResized","onScroll","scrollEvent","width","dirCache","event","classNameTrinsicObserver","IntersectionObserverConstructor","createTrinsicObserver","onTrinsicChangedCallback","trinsicObserver","intersectionObserverInstance","entries","last","pop","newHeightIntrinsic","isIntersecting","intersectionRatio","root","newSize","classNameHost","classNameViewport","classNameContent","normalizeTarget","isTextarea","OverlayScrollbars","extensions","osTarget","lifecycles","lifecycle","_onDirectionChanged"],"mappings":"AAEO,MAAMA,IAAI,IAA0BC,IAAD;AACxC,MAAIA,GAAG,KAAKC,SAAZ,EAAuB,UAAUD,KAAV;AACvB,MAAIA,GAAG,KAAK,IAAZ,EAAkB,UAAUA,KAAV;AAClB,SAAOE,MAAM,CAACC,SAAP,CAAiBC;IAAjB,CACJC,IADI,CACCL,GADD;KAEJM,OAFI,CAEI,mBAFJ,EAEyB,IAFzB;KAGJC,WAHI,EAAP;AAID,CAPM;SASSC,SAASR;AACvB,SAAO,OAAOA,GAAP,KAAe,QAAtB;AACD;SAEeS,SAAST;AACvB,SAAO,OAAOA,GAAP,KAAe,QAAtB;AACD;SAEeU,UAAUV;AACxB,SAAO,OAAOA,GAAP,KAAe,SAAtB;AACD;SAEeW,WAAWX;AACzB,SAAO,OAAOA,GAAP,KAAe,UAAtB;AACD;SAEeY,YAAYZ;AAC1B,SAAOA,GAAG,KAAKC,SAAf;AACD;SAEeY,OAAOb;AACrB,SAAOA,GAAG,KAAK,IAAf;AACD;SAEec,QAAQd;AACtB,SAAOe,KAAK,CAACD,OAAN,CAAcd,GAAd,CAAP;AACD;SAEegB,SAAShB;AACvB,SAAO,OAAOA,GAAP,KAAe,QAAf,IAA2B,CAACc,OAAO,CAACd,GAAD,CAAnC,IAA4C,CAACa,MAAM,CAACb,GAAD,CAA1D;AACD;SAMeiB,YAAyCjB;AACvD,QAAMkB,MAAM,GAAG,CAAC,CAAClB,GAAF,IAASA,GAAG,CAACkB,MAA5B;AACA,SAAOJ,OAAO,CAACd,GAAD,CAAP,KAAiB,CAACW,UAAU,CAACX,GAAD,CAAX,IAAoBQ,QAAQ,CAACU,MAAD,CAA5B,IAAwCA,MAAM,GAAG,CAAC,CAAlD,IAAuDA,MAAM,GAAG,CAAT,IAAc,EAA7F;AACD;SAMeC,cAAuBnB;AACrC,MAAI,CAACA,GAAD,IAAQ,CAACgB,QAAQ,CAAChB,GAAD,CAAjB,IAA0BD,IAAI,CAACC,GAAD,CAAJ,KAAc,QAA5C,EAAsD,OAAO,KAAP;AAEtD,MAAIoB,GAAJ;AACA,QAAMC,KAAK,GAAG,WAAd;AACA,QAAM,CAAEC,CAAAA,cAAF,KAAqBpB,MAAM,CAACmB,KAAD,CAAjC;AACA,QAAME,iBAAiB,GAAGD,cAAc,CAACjB,IAAf,CAAoBL,GAApB,EAAyB,aAAzB,CAA1B;AACA,QAAMwB,gBAAgB,GAAGxB,GAAG,CAACyB,WAAJ,IAAmBzB,GAAG,CAACyB,WAAJ,CAAgBJ,KAAhB,CAAnB,IAA6CC,cAAc,CAACjB,IAAf,CAAoBL,GAAG,CAACyB,WAAJ,CAAgBJ,KAAhB,CAApB,EAA4C,eAA5C,CAAtE;;AAEA,MAAIrB,GAAG,CAACyB,WAAJ,IAAmB,CAACF,iBAApB,IAAyC,CAACC,gBAA9C,EAAgE;AAC9D,WAAO,KAAP;AACD;;AAGD,OAAKJ,GAAL,IAAYpB,GAAZ,EAAiB;;;AAKjB,SAAOY,WAAW,CAACQ,GAAD,CAAX,IAAoBE,cAAc,CAACjB,IAAf,CAAoBL,GAApB,EAAyBoB,GAAzB,CAA3B;AACD;SAMeM,cAAc1B;AAC5B,QAAM2B,sBAAsB,GAAGC,MAAM,CAACC,WAAtC;AACA,QAAMC,YAAY,GAAGd,QAAQ,CAACW,sBAAD,CAAR,IAAoChB,UAAU,CAACgB,sBAAD,CAAnE;AACA,SAAO,CAAC,EAAEG,YAAY,GAAG9B,GAAG,YAAY2B,sBAAlB,GAA2C3B,GAAG,IAAIgB,QAAQ,CAAChB,GAAD,CAAf,IAAwBA,GAAG,CAAC+B,QAAJ,KAAiB,CAAzC,IAA8CtB,QAAQ,CAACT,GAAG,CAACgC,QAAL,CAA/G,CAAR;AACD;SAMeC,cAAcjC;AAE5B,OAAK,MAAMkC,IAAX,IAAmBlC,GAAnB,EAAwB,OAAO,KAAP;;AACxB,SAAO,IAAP;AAED;;AC7FD,SAASmC,UAAT,CACEC,OADF,EAEEC,QAFF,EAGEC,GAHF,EAIEC,KAJF;AAME,MAAI3B,WAAW,CAAC2B,KAAD,CAAf,EAAwB;AACtB,WAAOD,GAAG,GAAGA,GAAG,CAACF,OAAD,CAAN,GAAkBC,QAA5B;AACD;;AACDC,EAAAA,GAAG,KAAKA,GAAG,CAACF,OAAD,CAAH,GAAeG,KAApB,CAAH;AACD;;SAWeC,KAAKF,KAAyBG,UAAkBF;AAC9D,MAAI3B,WAAW,CAAC2B,KAAD,CAAf,EAAwB;AACtB,WAAOD,GAAG,GAAGA,GAAG,CAACI,YAAJ,CAAiBD,QAAjB,CAAH,GAAgC,IAA1C;AACD;;AACDH,EAAAA,GAAG,IAAIA,GAAG,CAACK,YAAJ,CAAiBF,QAAjB,EAA2BF,KAA3B,CAAP;AACD;AAOM,MAAMK,UAAU,GAAG,CAACN,GAAD,EAAsBG,QAAtB;AACxBH,EAAAA,GAAG,QAAH,YAAAA,GAAG,CAAEO,eAAL,CAAqBJ,QAArB;AACD,CAFM;SAWSK,WAAWR,KAAyBC;AAClD,SAAOJ,UAAU,CAAC,YAAD,EAAe,CAAf,EAAkBG,GAAlB,EAAuBC,KAAvB,CAAjB;AACD;SASeQ,UAAUT,KAAyBC;AACjD,SAAOJ,UAAU,CAAC,WAAD,EAAc,CAAd,EAAiBG,GAAjB,EAAsBC,KAAtB,CAAjB;AACD;;AC3DD,MAAMS,aAAa,GAAG,mBAAtB;;AACA,MAAMC,eAAe,GAAG,CAACX,GAAD,EAAsBY,SAAtB,EAAyCC,MAAzC;AACtB,MAAIC,KAAJ;AACA,MAAIC,CAAC,GAAG,CAAR;AACA,MAAIC,MAAM,GAAG,KAAb;;AAEA,MAAIhB,GAAG,IAAI7B,QAAQ,CAACyC,SAAD,CAAnB,EAAgC;AAC9B,UAAMK,OAAO,GAAkBL,SAAS,CAACM,KAAV,CAAgBR,aAAhB,KAAkC,EAAjE;AACAM,IAAAA,MAAM,GAAGC,OAAO,CAACrC,MAAR,GAAiB,CAA1B;;AACA,YAAQkC,KAAK,GAAGG,OAAO,CAACF,CAAC,EAAF,CAAvB,GAA+B;AAC7BC,MAAAA,MAAM,GAAIH,MAAM,CAACb,GAAG,CAACmB,SAAL,EAAgBL,KAAhB,CAAN,IAA4CE,MAAtD;AACD;AACF;;AACD,SAAOA,MAAP;AACD,CAbD;AA4BO,MAAMI,QAAQ,GAAG,CAACpB,GAAD,EAAsBY,SAAtB;AACtBD,EAAAA,eAAe,CAACX,GAAD,EAAMY,SAAN,EAAiB,CAACO,SAAD,EAAYL,KAAZ,KAAsBK,SAAS,CAACE,GAAV,CAAcP,KAAd,CAAvC,CAAf;AACD,CAFM;;SCDSQ,KACdC,QACAC;AAEA,MAAI7C,WAAW,CAAC4C,MAAD,CAAf,EAAyB;AACvB,SAAK,IAAIR,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGQ,MAAM,CAAC3C,MAA3B,EAAmCmC,CAAC,EAApC,EAAwC;AACtC,UAAIS,QAAQ,CAACD,MAAM,CAACR,CAAD,CAAP,EAAYA,CAAZ,EAAeQ,MAAf,CAAR,KAAmC,KAAvC,EAA8C;AAC5C;AACD;AACF;AACF,GAND,MAMO,IAAIA,MAAJ,EAAY;AACjBD,IAAAA,IAAI,CAAC1D,MAAM,CAAC6D,IAAP,CAAYF,MAAZ,CAAD,GAAuBzC,IAAD,IAAS0C,QAAQ,CAACD,MAAM,CAACzC,GAAD,CAAP,EAAcA,GAAd,EAAmByC,MAAnB,CAAvC,CAAJ;AACD;;AACD,SAAOA,MAAP;AACD;AAcM,MAAMG,IAAI,IAAaC,IAAV;AAClB,MAAIlD,KAAK,CAACiD,IAAV,EAAgB;AACd,WAAOjD,KAAK,CAACiD,IAAN,CAAWC,GAAX,CAAP;AACD;;AACD,QAAMX,MAAM,GAAa,EAAzB;AACAM,EAAAA,IAAI,CAACK,GAAD,GAAO3B,IAAD;AACRgB,IAAAA,MAAM,CAACY,IAAP,CAAY5B,GAAZ;AACD,GAFG,CAAJ;AAGA,SAAOgB,MAAP;AACD,CATM;AAeA,MAAMa,OAAO,IAAIF,IAAD;AACrB,MAAIA,GAAG,YAAYG,GAAnB,EAAwB;AACtBH,IAAAA,GAAG,CAACI,OAAJ,EAAaC,GAAD,IAAQA,EAAE,IAAIA,EAAE,EAA5B;AACD,GAFD,MAEO;AACLV,IAAAA,IAAI,CAACK,GAAD,GAAOK,GAAD,IAAQA,EAAE,IAAIA,EAAE,EAAtB,CAAJ;AACD;AACF,CANM;;ACvEP,MAAMC,OAAO,GAAG,CAACjC,GAAD,EAAsBkC,QAAtB;AACd,MAAIlC,GAAJ,EAAS;AAGP,UAAMgC,EAAE,GAAGG,OAAO,CAACtE,SAAR,CAAkBoE,OAAlB,IAA6BE,OAAO,CAACtE,SAAR,CAAkBuE,iBAA1D;AACA,WAAOJ,EAAE,CAACjE,IAAH,CAAQiC,GAAR,EAAakC,QAAb,CAAP;AACD;;AACD,SAAO,KAAP;AACD,CARD;AAqCO,MAAMG,EAAE,GAAG,CAACrC,GAAD,EAAsBkC,QAAtB,KAAoDD,OAAO,CAACjC,GAAD,EAAMkC,QAAN,CAAtE;AA2BA,MAAMI,QAAQ,IAAItC,IAAD,KAAoDA,GAAG,GAAG0B,IAAI,CAAC1B,GAAG,CAACuC,UAAL,CAAP,GAA0B,GAAlG;AAMA,MAAMC,MAAM,IAAIxC,IAAD,KAAoCA,GAAG,GAAGA,GAAG,CAACyC,aAAP,GAAuB,KAA7E;;AC5DP,MAAMC,MAAM,GAAG,CAACC,SAAD,EAAyBC,eAAzB,EAAuDC,YAAvD;AACb,MAAIA,YAAJ,EAAkB;AAChB,QAAIC,MAAM,GAAgBF,eAA1B;AACA,QAAIG,QAAJ;;AAGA,QAAIJ,SAAJ,EAAe;AACb,UAAIhE,WAAW,CAACkE,YAAD,CAAf,EAA+B;AAC7BE,QAAAA,QAAQ,GAAGC,QAAQ,CAACC,sBAAT,EAAX;AAGA3B,QAAAA,IAAI,CAACuB,YAAD,GAAgBK,YAAD;AACjB,cAAIA,WAAW,KAAKJ,MAApB,EAA4B;AAC1BA,YAAAA,MAAM,GAAGI,WAAW,CAACC,eAArB;AACD;;AACDJ,UAAAA,QAAS,CAACK,WAAV,CAAsBF,WAAtB;AACD,SALG,CAAJ;AAMD,OAVD,MAUO;AACLH,QAAAA,QAAQ,GAAGF,YAAX;AACD;;AAGD,UAAID,eAAJ,EAAqB;AACnB,YAAI,CAACE,MAAL,EAAa;AACXA,UAAAA,MAAM,GAAGH,SAAS,CAACU,UAAnB;AACD,SAFD,MAEO,IAAIP,MAAM,KAAKF,eAAf,EAAgC;AACrCE,UAAAA,MAAM,GAAGA,MAAM,CAACQ,WAAhB;AACD;AACF;;AAEDX,MAAAA,SAAS,CAACY,YAAV,CAAuBR,QAAvB,EAAiCD,MAAjC;AACD;AACF;AACF,CAjCD;;AAwCO,MAAMU,cAAc,GAAG,CAACC,IAAD,EAAoBC,QAApB;AAC5BhB,EAAAA,MAAM,CAACe,IAAD,EAAO,IAAP,EAAaC,QAAb,CAAN;AACD,CAFM;AASA,MAAMC,eAAe,GAAG,CAACF,IAAD,EAAoBC,QAApB;AAC7BhB,EAAAA,MAAM,CAACe,IAAD,EAAOA,IAAI,IAAIA,IAAI,CAACJ,UAApB,EAAgCK,QAAhC,CAAN;AACD,CAFM;AA0BA,MAAME,cAAc,IAAIC,MAAD;AAC5B,MAAIlF,WAAW,CAACkF,KAAD,CAAf,EAAwB;AACtBvC,IAAAA,IAAI,CAACI,IAAI,CAACmC,KAAD,CAAL,GAAeC,EAAD,IAAOF,cAAc,CAACE,CAAD,CAAnC,CAAJ;AACD,GAFD,MAEO,IAAID,KAAJ,EAAW;AAChB,UAAMlB,SAAS,GAAGH,MAAM,CAACqB,KAAD,CAAxB;;AACA,QAAIlB,SAAJ,EAAe;AACbA,MAAAA,SAAS,CAACoB,WAAV,CAAsBF,KAAtB;AACD;AACF;AACF,CATM;;AC/EA,MAAMG,SAAS,IAAIC,WAAD;AACvB,QAAMC,GAAG,GAAGlB,QAAQ,CAACmB,aAAT,CAAuB,KAAvB,CAAZ;;AACA,MAAIF,UAAJ,EAAgB;AACd/D,IAAAA,IAAI,CAACgE,GAAD,EAAM,OAAN,EAAeD,UAAf,CAAJ;AACD;;AACD,SAAOC,GAAP;AACD,CANM;AAYA,MAAME,SAAS,IAAIC,KAAD;AACvB,QAAMC,UAAU,GAAGN,SAAS,EAA5B;AACAM,EAAAA,UAAU,CAACC,SAAX,GAAuBF,IAAI,CAACG,IAAL,EAAvB;AAEA,SAAOlD,IAAI,CAACgB,QAAQ,CAACgC,UAAD,CAAT,GAAwBtE,IAAD,IAAS4D,cAAc,CAAC5D,GAAD,CAA9C,CAAX;AACD,CALM;;ACdP,MAAMyE,OAAO,GAAO;AAClBC,EAAAA,CAAC,EAAE,CADe;AAElBC,EAAAA,CAAC,EAAE;AAFe,CAApB;AAQO,MAAMC,UAAU,GAAG,OAAW;AACnCF,EAAAA,CAAC,EAAEpF,MAAM,CAACuF,UADyB;AAEnCF,EAAAA,CAAC,EAAErF,MAAM,CAACwF;AAFyB,CAAX,CAAnB;AASA,MAAMC,UAAU,IAAI/E,IAAD;EACxBA;AAAG,MACC;AACE0E,QAAAA,CAAC,EAAE1E,GAAG,CAACgF,WADT;AAEEL,QAAAA,CAAC,EAAE3E,GAAG,CAACiF;MAFT;AADD,MAKCR,OANC;AAYA,MAAMS,UAAU,IAAIlF,IAAD;EACxBA;AAAG,MACC;AACE0E,QAAAA,CAAC,EAAE1E,GAAG,CAACmF,WADT;AAEER,QAAAA,CAAC,EAAE3E,GAAG,CAACoF;MAFT;AADD,MAKCX,OANC;AAYA,MAAMY,qBAAqB,IAAIrF,IAAD,IAA+BA,GAAG,CAACqF,qBAAJ,EAA7D;;AC7CP,IAAIC,oBAAJ;;AACA,MAAMC,oBAAoB,GAAG;AAC3B,MAAID,oBAAoB,KAAK3H,SAA7B,EAAwC;AACtC2H,IAAAA,oBAAoB,GAAG,KAAvB;;AACA,QAAI;AAGFhG,MAAAA,MAAM,CAACkG,gBAAP;QACE,MADF;QAEE,IAFF;QAGE5H,MAAM,CAAC6H,cAAP,CAAsB,EAAtB,EAA0B,SAA1B,EAAqC;AACnCC,UAAAA,GAAG,EAAE;AACHJ,YAAAA,oBAAoB,GAAG,IAAvB;AACD;AAHkC,SAArC;MAHF;AAUD,KAbD,CAaE,OAAOxB,CAAP,EAAU;AACb;;AACD,SAAOwB,oBAAP;AACD,CAnBD;;AAkCO,MAAMK,GAAG,GAAG,CAACC,MAAD,EAAsBC,UAAtB,EAA0CC,QAA1C,EAAmEC,OAAnE;AACjBzE,EAAAA,IAAI,CAACuE,UAAU,CAACG,KAAX,CAAiB,GAAjB,CAAD,GAAyBC,UAAD;AAC1BL,IAAAA,MAAM,CAACM,mBAAP,CAA2BD,SAA3B,EAAsCH,QAAtC,EAAgDC,OAAhD;AACD,GAFG,CAAJ;AAGD,CAJM;AAaA,MAAMI,EAAE,GAAG,CAACP,MAAD,EAAsBC,UAAtB,EAA0CC,QAA1C,EAAmEM,OAAnE;AAChB,QAAMC,sBAAsB,GAAGd,oBAAoB,EAAnD;AACA,QAAMe,OAAO,IAAID,sBAAsB,IAAID,OAA1B,IAAqCA,OAAO,CAACG,SAA9C,IAA2D,KAA3E;AACA,QAAMR,OAAO,IAAIK,OAAO,IAAIA,OAAO,CAACI,SAApB,IAAiC,KAAjD;AACA,QAAMC,IAAI,IAAIL,OAAO,IAAIA,OAAO,CAACM,MAApB,IAA8B,KAA3C;AACA,QAAMC,YAAY,GAAmB,EAArC;AACA,QAAMC,aAAa,GAAsCP;AAAsB,MAC3E;AACEC,QAAAA,OADF;AAEEP,QAAAA;AAFF;AAD2E,MAK3EA,OALJ;AAOAzE,EAAAA,IAAI,CAACuE,UAAU,CAACG,KAAX,CAAiB,GAAjB,CAAD,GAAyBC,UAAD;AAC1B,UAAMY,aAAa,GAAGJ;AAAI,SACrBK,IAAD;AACElB,UAAAA,MAAM,CAACM,mBAAP,CAA2BD,SAA3B,EAAsCY,aAAtC,EAAqDd,OAArD;AACAD,UAAAA,QAAQ,IAAIA,QAAQ,CAACgB,GAAD,CAApB;AACD;AAJqB,QAKtBhB,QALJ;AAOAa,IAAAA,YAAY,CAAC/E,IAAb,CAAkB+D,GAAG,CAACoB,IAAJ,CAAS,IAAT,EAAenB,MAAf,EAAuBK,SAAvB,EAAkCY,aAAlC,EAAiDd,OAAjD,CAAlB;AACAH,IAAAA,MAAM,CAACJ,gBAAP,CAAwBS,SAAxB,EAAmCY,aAAnC,EAAkDD,aAAlD;AACD,GAVG,CAAJ;AAYA,SAAO/E,OAAO,CAACkF,IAAR,CAAa,CAAb,EAAgBJ,YAAhB,CAAP;AACD,CA1BM;AAgCA,MAAMK,eAAe,IAAIF,IAAD,IAAgBA,GAAG,CAACE,eAAJ,EAAxC;AAMA,MAAMC,cAAc,IAAIH,IAAD,IAAgBA,GAAG,CAACG,cAAJ,EAAvC;;AC9EA,MAAMC,KAAK,GAAG,CAAwBC,CAAxB,EAA0CC,CAA1C,EAA4DC,KAA5D;AACnB,MAAIF,CAAC,IAAIC,CAAT,EAAY;AACV,QAAIpG,MAAM,GAAG,IAAb;AACAM,IAAAA,IAAI,CAAC+F,KAAD,GAASC,KAAD;AACV,UAAIH,CAAC,CAACG,IAAD,CAAD,KAAYF,CAAC,CAACE,IAAD,CAAjB,EAAyB;AACvBtG,QAAAA,MAAM,GAAG,KAAT;AACD;AACF,KAJG,CAAJ;AAKA,WAAOA,MAAP;AACD;;AACD,SAAO,KAAP;AACD,CAXM;AAmBA,MAAMuG,OAAO,GAAG,CAACJ,CAAD,EAASC,CAAT,KAAoBF,KAAK,CAAKC,CAAL,EAAQC,CAAR,EAAW,CAAC,GAAD,EAAM,GAAN,CAAX,CAAzC;AAgBA,MAAMI,SAAS,GAAG,CAACL,CAAD,EAAWC,CAAX,KAAwBF,KAAK,CAAOC,CAAP,EAAUC,CAAV,EAAa,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,CAAb,CAA/C;;ACrCA,MAAMpI,cAAc,GAAG,CAACtB,GAAD,EAAW4J,IAAX,KAAuD1J,MAAM,CAACC,SAAP,CAAiBmB,cAAjB,CAAgCjB,IAAhC,CAAqCL,GAArC,EAA0C4J,IAA1C,CAA9E;AAMA,MAAM7F,IAAI,IAAI/D,IAAD,KAA8BA,GAAG,GAAGE,MAAM,CAAC6D,IAAP,CAAY/D,GAAZ,CAAH,GAAsB,GAApE;SAQS+J,WACd7B,QACA8B,SACAC,SACAC,SACAC,SACAC,SACAC;AAEA,QAAMC,OAAO,GAAe,CAACN,OAAD,EAAUC,OAAV,EAAmBC,OAAnB,EAA4BC,OAA5B,EAAqCC,OAArC,EAA8CC,OAA9C,CAA5B;;AAGA,MAAI,CAAC,OAAOnC,MAAP,KAAkB,QAAlB,IAA8BrH,MAAM,CAACqH,MAAD,CAArC,KAAkD,CAACvH,UAAU,CAACuH,MAAD,CAAjE,EAA2E;AACzEA,IAAAA,MAAM,GAAG,EAAT;AACD;;AAEDtE,EAAAA,IAAI,CAAC0G,OAAD,GAAWzG,OAAD;AAEZD,IAAAA,IAAI,CAACG,IAAI,CAACF,MAAD,CAAL,GAAgBzC,IAAD;AACjB,YAAMmJ,IAAI,GAAQ1G,MAAM,CAACzC,GAAD,CAAxB;;AAIA,UAAI8G,MAAM,KAAKqC,IAAf,EAAqB;AACnB,eAAO,IAAP;AACD;;AAED,YAAMC,WAAW,GAAG1J,OAAO,CAACyJ,IAAD,CAA3B;;AAGA,UAAIA,IAAI,KAAKpJ,aAAa,CAACoJ,IAAD,CAAb,IAAuBC,WAA5B,CAAR,EAAkD;AAChD,cAAMC,GAAG,GAAGvC,MAAM,CAAC9G,GAAD,CAAlB;AACA,YAAIsJ,KAAK,GAAQD,GAAjB;;AAGA,YAAID,WAAW,IAAI,CAAC1J,OAAO,CAAC2J,GAAD,CAA3B,EAAkC;AAChCC,UAAAA,KAAK,GAAG,EAAR;AACD,SAFD,MAEO,IAAI,CAACF,WAAD,IAAgB,CAACrJ,aAAa,CAACsJ,GAAD,CAAlC,EAAyC;AAC9CC,UAAAA,KAAK,GAAG,EAAR;AACD;;AAGDxC,QAAAA,MAAM,CAAC9G,GAAD,CAAN,GAAc2I,UAAU,CAACW,KAAD,EAAQH,IAAR,CAAxB;AACD,OAbD,MAaO;AACLrC,QAAAA,MAAM,CAAC9G,GAAD,CAAN,GAAcmJ,IAAd;AACD;AACF,KA5BG,CAAJ;AA6BD,GA/BG,CAAJ;AAkCA,SAAOrC,MAAP;AACD;;AC7DD,MAAMyC,SAAS,GAAG;AAChBC,EAAAA,uBAAuB,EAAE,CADT;AAEhBC,EAAAA,WAAW,EAAE,CAFG;AAGhBC,EAAAA,WAAW,EAAE,CAHG;AAIhBC,EAAAA,QAAQ,EAAE,CAJM;AAKhBC,EAAAA,UAAU,EAAE,CALI;AAMhBC,EAAAA,UAAU,EAAE,CANI;AAOhBC,EAAAA,UAAU,EAAE,CAPI;AAQhBC,EAAAA,OAAO,EAAE,CARO;AAShBC,EAAAA,KAAK,EAAE,CATS;AAUhBC,EAAAA,OAAO,EAAE,CAVO;AAWhBC,EAAAA,MAAM,EAAE,CAXQ;AAYhBC,EAAAA,MAAM,EAAE,CAZQ;AAahBC,EAAAA,IAAI,EAAE;AAbU,CAAlB;;AAgBA,MAAMC,mBAAmB,GAAG,CAAClJ,KAAD,EAAgBmJ,OAAhB;AAE1B,QAAMC,GAAG,GAAGD,OAAO,GAAGE,UAAU,CAACrJ,KAAD,CAAb,GAAuBsJ,QAAQ,CAACtJ,KAAD,EAAQ,EAAR,CAAlD;AAEA,SAAOuJ,MAAM,CAACC,KAAP,CAAaJ,GAAb,IAAoB,CAApB,GAAwBA,GAA/B;AACD,CALD;;AAMA,MAAMK,WAAW,GAAG,CAACpC,IAAD,EAAeqC,GAAf,MAA0D,CAACtB,SAAS,CAACf,IAAI,CAACrJ,WAAL,EAAD,CAAV,IAAkCC,QAAQ,CAACyL,GAAD,CAA1C,MAAqDA,OAArD,GAA+DA,IAA7I;;AACA,MAAMC,SAAS,GAAG,CAAC5J,GAAD,EAAmB6J,aAAnB,EAAuDvC,IAAvD,MAEhBuC,aAAa,IAAI,IAAjB,GAAwBA,aAAa,CAACC,gBAAd,CAA+BxC,IAA/B,CAAxB,GAA+DtH,GAAG,CAAC+J,KAAJ,CAAUzC,IAAV,EAFjE;;AAGA,MAAM0C,SAAS,GAAG,CAAChK,GAAD,EAA0BsH,IAA1B,EAAwCqC,GAAxC;AAChB,MAAI;AACF,QAAI3J,GAAG,IAAIA,GAAG,CAAC+J,KAAJ,CAAUzC,IAAV,MAAoB3J,SAA/B,EAA0C;AACxCqC,MAAAA,GAAG,CAAC+J,KAAJ,CAAUzC,IAAV,IAAkBoC,WAAW,CAACpC,IAAD,EAAOqC,GAAP,CAA7B;AACD;AACF,GAJD,CAIE,OAAO7F,CAAP,EAAU;AACb,CAND;;SAgBgBiG,MAAM/J,KAAyBiK;AAC7C,QAAMC,cAAc,GAAG/L,QAAQ,CAAC8L,MAAD,CAA/B;AACA,QAAME,SAAS,GAAG3L,OAAO,CAACyL,MAAD,CAAP,IAAmBC,cAArC;;AAEA,MAAIC,SAAJ,EAAe;AACb,QAAIC,eAAe,GAAyBF,cAAc,GAAG,EAAH,GAAQ,EAAlE;;AACA,QAAIlK,GAAJ,EAAS;AACP,YAAM6J,aAAa,GAAwBvK,MAAM,CAAC+K,gBAAP,CAAwBrK,GAAxB,EAA6B,IAA7B,CAA3C;AACAoK,MAAAA,eAAe,GAAGF;AAAc,UAC5BN,SAAS,CAAC5J,GAAD,EAAM6J,aAAN,EAAqBI,MAArB;AADmB,UAE3BA,MAAwB,CAACK,MAAzB,CAAgC,CAACtJ,MAAD,EAASlC,GAAT;AAC/BkC,YAAAA,MAAM,CAAClC,GAAD,CAAN,GAAc8K,SAAS,CAAC5J,GAAD,EAAM6J,aAAN,EAAqB/K,GAArB,CAAvB;AACA,mBAAOkC,MAAP;AACD,WAHA,EAGEoJ,eAHF,CAFL;AAMD;;AACD,WAAOA,eAAP;AACD;;AACD9I,EAAAA,IAAI,CAACG,IAAI,CAACwI,MAAD,CAAL,GAAgBnL,IAAD,IAASkL,SAAS,CAAChK,GAAD,EAAMlB,GAAN,EAAWmL,MAAM,CAACnL,GAAD,CAAjB,CAAjC,CAAJ;AACD;AAuBM,MAAMyL,kBAAkB,GAAG,CAACvK,GAAD,EAA0BwK,QAA1B;AAChC,QAAMC,SAAS,GAAGD,QAAQ,IAAI,EAA9B;AACA,QAAME,GAAG,MAAMD,eAAf;AACA,QAAME,KAAK,MAAMF,iBAAjB;AACA,QAAMG,MAAM,MAAMH,kBAAlB;AACA,QAAMI,IAAI,MAAMJ,gBAAhB;AACA,QAAMzJ,MAAM,GAAG+I,KAAK,CAAC/J,GAAD,EAAM,CAAC0K,GAAD,EAAMC,KAAN,EAAaC,MAAb,EAAqBC,IAArB,CAAN,CAApB;AACA,SAAO;AACLC,IAAAA,CAAC,EAAE3B,mBAAmB,CAACnI,MAAM,CAAC0J,GAAD,CAAP,CADjB;AAELK,IAAAA,CAAC,EAAE5B,mBAAmB,CAACnI,MAAM,CAAC2J,KAAD,CAAP,CAFjB;AAGLvD,IAAAA,CAAC,EAAE+B,mBAAmB,CAACnI,MAAM,CAAC4J,MAAD,CAAP,CAHjB;AAILI,IAAAA,CAAC,EAAE7B,mBAAmB,CAACnI,MAAM,CAAC6J,IAAD,CAAP;AAJjB,GAAP;AAMD,CAbM;;ACxFP,MAAMpG,SAAO,GAAO;AAClBwG,EAAAA,CAAC,EAAE,CADe;AAElBC,EAAAA,CAAC,EAAE;AAFe,CAApB;AASO,MAAMC,mBAAmB,IAAInL,IAAD;AACjC,QAAMoL,IAAI,GAAGpL,GAAG,GAAGqF,qBAAqB,CAACrF,GAAD,CAAxB,GAAgC,CAAhD;AACA,SAAOoL;AAAI,MACP;AACEH,QAAAA,CAAC,EAAEG,IAAI,CAACP,IAAL,GAAYvL,MAAM,CAAC+L,WADxB;AAEEH,QAAAA,CAAC,EAAEE,IAAI,CAACV,GAAL,GAAWpL,MAAM,CAACgM;AAFvB;AADO,MAKP7G,SALJ;AAMD,CARM;;SCkCS8G,YAAeC,iBAAyCC;AACtE,QAAMC,KAAK,GAAa,EAAxB;AACA,QAAMC,QAAQ,GAAmBlK,IAAI,CAAC+J,eAAD,CAArC;AAEAlK,EAAAA,IAAI,CAACqK,QAAD,GAAYrE,KAAD;AACboE,IAAAA,KAAK,CAACpE,IAAD,CAAL,GAAc;AAAEsE,MAAAA,QAAQ,EAAE,KAAZ;AAAmBC,MAAAA,MAAM,EAAEJ,WAAW,GAAGD,eAAe,CAAClE,IAAD,CAAlB,GAA2B3J;AAAjE,KAAd;AACD,GAFG,CAAJ;;AAIA,QAAMmO,eAAe,GAAuB,CAACxE,IAAD,EAAOrH,KAAP,EAAciH,KAAd;AAC1C,UAAM6E,IAAI,GAAGL,KAAK,CAACpE,IAAD,CAAL,CAAYuE,MAAzB;AAEAH,IAAAA,KAAK,CAACpE,IAAD,CAAL,CAAYuE,MAAZ,GAAqB5L,KAArB;AACAyL,IAAAA,KAAK,CAACpE,IAAD,CAAL,CAAY0E,SAAZ,GAAwBD,IAAxB;AACAL,IAAAA,KAAK,CAACpE,IAAD,CAAL,CAAYsE,QAAZ,GAAuB1E,KAAK,GAAG,CAACA,KAAK,CAAC6E,IAAD,EAAO9L,KAAP,CAAT,GAAyB8L,IAAI,KAAK9L,KAA9D;AACD,GAND;;AAQA,QAAMgM,KAAK,GAAG,CAAC5E,KAAD,EAAwB6E,KAAxB;AACZ,UAAMlL,MAAM,GAAoByG,UAAU,CAAC,EAAD,EAAKiE,KAAL,EAAY;AAAES,MAAAA,gBAAgB,EAAE;AAApB,KAAZ,CAA1C;AAEA7K,IAAAA,IAAI,CAAC+F,KAAD,GAASC,KAAD;AACV,YAAM8E,OAAO,GAAGF,KAAK,IAAIR,KAAK,CAACpE,IAAD,CAAL,CAAYsE,QAArC;AACA5K,MAAAA,MAAM,CAACmL,gBAAP,GAA0BnL,MAAM,CAACmL,gBAAP,IAA2BC,OAArD;AAEApL,MAAAA,MAAM,CAACsG,IAAD,CAAN,CAAasE,QAAb,GAAwBQ,OAAxB;AACAV,MAAAA,KAAK,CAACpE,IAAD,CAAL,CAAYsE,QAAZ,GAAuB,KAAvB;AACD,KANG,CAAJ;AAQA,WAAO5K,MAAP;AACD,GAZD;;AAcA,SAAO,CAACqL,aAAD,EAAgBH,KAAhB;AACL,UAAMI,kBAAkB,GACtB,CAACnO,QAAQ,CAACkO,aAAD,CAAR,GAA2B,CAACA,aAAD,CAA3B,GAAiEA,aAAlE,KAAuGV,QADzG;AAEArK,IAAAA,IAAI,CAACgL,kBAAD,GAAsBhF,KAAD;AACvB,YAAMiF,QAAQ,GAAGb,KAAK,CAACpE,IAAD,CAAtB;AACA,YAAMyE,IAAI,GAAGP,eAAe,CAAClE,IAAD,CAA5B;AAEA,YAAM3F,GAAG,GAAG8J,WAAW,GAAG,KAAH,GAAWjN,OAAO,CAACuN,IAAD,CAAzC;AACA,YAAM9L,KAAK,GAAG0B,GAAG,GAAGoK,IAAI,CAAC,CAAD,CAAP,GAAaA,IAA9B;AACA,YAAM7E,KAAK,GAAGvF,GAAG,GAAGoK,IAAI,CAAC,CAAD,CAAP,GAAa,IAA9B;AACAD,MAAAA,eAAe,CAACxE,IAAD,EAAOmE,WAAW,GAAGxL,KAAH,GAAWA,KAAK,CAACsM,QAAQ,CAACV,MAAV,EAAkBU,QAAQ,CAACP,SAA3B,CAAlC,EAAyE9E,KAAzE,CAAf;AACD,KARG,CAAJ;AASA,WAAO+E,KAAK,CAACK,kBAAD,EAAqBJ,KAArB,CAAZ;AACD,GAbD;AAcD;;AC3FD,MAAMM,kBAAkB,IAAIC,IAAD,IAAyBA,GAAG,CAACC,MAAJ,CAAW,CAAX,EAAcC,WAAd,KAA8BF,GAAG,CAACG,KAAJ,CAAU,CAAV,CAAlF;;AACA,MAAMC,aAAa,GAAG,MAA2B7I,SAAS,GAAG+F,KAA7D;;AAIO,MAAM+C,WAAW,GAA0B,CAAC,UAAD,EAAa,OAAb,EAAsB,KAAtB,EAA6B,MAA7B,CAA3C;AACA,MAAMC,UAAU,GAA0B,CAAC,QAAD,EAAW,KAAX,EAAkB,GAAlB,EAAuB,IAAvB,EAA6B,QAA7B,EAAuC,KAAvC,EAA8C,GAA9C,EAAmD,IAAnD,CAA1C;AAEA,MAAMC,OAAO,GAA2B,EAAxC;AACA,MAAMC,QAAQ,GAA8B,EAA5C;AAMA,MAAMC,WAAW,IAAItN,KAAD;AACzB,MAAIoB,MAAM,GAAuBiM,QAAQ,CAACrN,IAAD,CAAzC;;AAEA,MAAIZ,cAAc,CAACiO,QAAD,EAAWrN,IAAX,CAAlB,EAAoC;AAClC,WAAOoB,MAAP;AACD;;AAED,QAAMmM,cAAc,GAAWX,kBAAkB,CAAC5M,IAAD,CAAjD;AACA,QAAMwN,QAAQ,GAAwBP,aAAa,EAAnD;AAEAvL,EAAAA,IAAI,CAACwL,WAAD,GAAeO,OAAD;AAChB,UAAMC,mBAAmB,GAAWD,MAAM,CAACrP,OAAP,CAAe,IAAf,EAAqB,EAArB,CAApC;AACA,UAAMuP,mBAAmB,GAAkB,CACzC3N,IADyC,EAEzCyN,MAAM,GAAGzN,IAFgC,EAGzC0N,mBAAmB,GAAGH,cAHmB,EAIzCX,kBAAkB,CAACc,mBAAD,CAAlB,GAA0CH,cAJD,CAA3C;AAMAnM,IAAAA,MAAM,GAAGuM,mBAAmB,CAACC,IAApB,EAA0BC,kBAAD,IAA+BL,QAAQ,CAACK,iBAAD,CAAR,KAAgC9P,SAAxF,CAAT;AACA,WAAO,CAACqD,MAAR;AACD,GAVG,CAAJ;AAYAiM,EAAAA,QAAQ,CAACrN,IAAD,CAAR,GAAiBoB,MAAjB;AACA,SAAOA,MAAP;AACD,CAxBM;AAiEA,MAAM0M,KAAK,IAAa9N,KAAV;AACnB,MAAIoB,MAAM,GAAQgM,OAAO,CAACpN,IAAD,CAAP,IAAiBN,MAAM,CAACM,IAAD,CAAzC;;AAEA,MAAIZ,cAAc,CAACgO,OAAD,EAAUpN,IAAV,CAAlB,EAAmC;AACjC,WAAOoB,MAAP;AACD;;AAEDM,EAAAA,IAAI,CAACyL,UAAD,GAAcM,OAAD;AACfrM,IAAAA,MAAM,GAAGA,MAAM,IAAI1B,MAAM,CAAC+N,MAAM,GAAGb,kBAAkB,CAAC5M,IAAD,CAA5B,CAAzB;AACA,WAAO,CAACoB,MAAR;AACD,GAHG,CAAJ;AAKAgM,EAAAA,OAAO,CAACpN,IAAD,CAAP,GAAgBoB,MAAhB;AACA,SAAOA,MAAP;AACD,CAdM;;ACjFA,MAAM2M,cAAc,GAAoBD,KAAK,CAAC,gBAAD,CAA7C;;;;;;;;;;;;;;;;;;;;;ACFP,WAASE,QAAT,GAAoB;AAClBC,IAAAA,cAAA,GAAiBD,QAAQ;MAAGhQ,MAAM,CAACkQ,MAAP;MAAiB,UAAUlI,MAAV,EAAkB;AAC7D,aAAK,IAAI7E,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGgN,SAAS,CAACnP,MAA9B,EAAsCmC,CAAC,EAAvC,EAA2C;AACzC,cAAIQ,MAAM,GAAGwM,SAAS,CAAChN,CAAD,CAAtB;;AAEA,eAAK,IAAIjC,GAAT,IAAgByC,MAAhB,EAAwB;AACtB,gBAAI3D,MAAM,CAACC,SAAP,CAAiBmB,cAAjB,CAAgCjB,IAAhC,CAAqCwD,MAArC,EAA6CzC,GAA7C,CAAJ,EAAuD;AACrD8G,cAAAA,MAAM,CAAC9G,GAAD,CAAN,GAAcyC,MAAM,CAACzC,GAAD,CAApB;AACD;AACF;AACF;;AAED,eAAO8G,MAAP;AACD,OAZD;;AAcA,WAAOgI,QAAQ,CAACI,KAAT,CAAe,IAAf,EAAqBD,SAArB,CAAP;AACD;;AAEDF,EAAAA,cAAA,GAAiBD,QAAjB;;;ACbA,MAAM,CAAEK,CAAAA,UAAF,IAAgBC,IAAtB;AAKA,MAAMC,wBAAwB,GAA8B,CAAC,QAAD,EAAW,SAAX,CAA5D;AAMA,MAAMC,oBAAoB,GAAmC,CAAC,SAAD,EAAY,QAAZ,EAAsB,QAAtB,EAAgC,OAAhC,EAAyC,QAAzC,EAAmD,UAAnD,EAA+D,MAA/D,EAAuE9D,MAAvE,CAC3D,CAACtJ,MAAD,EAASqN,IAAT;AACErN,EAAAA,MAAM,CAACqN,IAAD,CAAN,GAAeF,wBAAwB,CAAC,CAAD,CAAxB,GAA8BE,IAA9B,GAAqCF,wBAAwB,CAAC,CAAD,CAA5E;AACA,SAAOnN,MAAP;AACD,CAJ0D,EAK3D,EAL2D,CAA7D;;AA0BA,MAAMsN,iBAAiB,GAAG,CACxBlI,OADwB,EAExBmI,QAFwB,EAGxBC,WAHwB,EAIxBC,aAJwB,EAKxBC,QALwB;AAOxB,QAAMC,gBAAgB,GAAwB,EAA9C;;AACA,QAAMC,WAAW,kBAAWxI,OAAX,CAAjB;;AACA,QAAMiB,KAAK,GAAG5F,IAAI,CAAC8M,QAAD,CAAJ,CAAeM,MAAf,EAAuBvH,KAAD,IAAUtI,cAAc,CAACoH,OAAD,EAAUkB,IAAV,CAA9C,CAAd;AAEAhG,EAAAA,IAAI,CAAC+F,KAAD,GAASC,KAAD;AACV,UAAMwH,gBAAgB,GAAQxQ,WAAW,CAACkQ,WAAW,CAAClH,IAAD,CAAZ,CAAX,GAAiC,EAAjC,GAAsCkH,WAAW,CAAClH,IAAD,CAA/E;AACA,UAAMyH,YAAY,GAAQ3I,OAAO,CAACkB,IAAD,CAAjC;AACA,UAAM0H,aAAa,GAA8ET,QAAQ,CAACjH,IAAD,CAAzG;AACA,UAAM2H,iBAAiB,GAAGpQ,aAAa,CAACmQ,aAAD,CAAvC;AACA,UAAME,UAAU,GAAGR,QAAQ,MAAMA,WAAN,GAAoB,EAA/C;;AAGA,QAAIO,iBAAiB,IAAIpQ,aAAa,CAACkQ,YAAD,CAAtC,EAAsD;AACpD,YAAMI,eAAe,GAAGb,iBAAiB,CAACS,YAAD,EAAeC,aAAf,EAA6CF,gBAA7C,EAA+DL,aAA/D,EAA8ES,UAAU,GAAG5H,IAA3F,CAAzC;AACAqH,MAAAA,gBAAgB,CAACrH,IAAD,CAAhB,GAAyB6H,eAAe,CAACC,UAAzC;AACAR,MAAAA,WAAW,CAACtH,IAAD,CAAX,GAAoB6H,eAAe,CAACE,QAApC;AAEA/N,MAAAA,IAAI,CAAC,CAACsN,WAAD,EAAcD,gBAAd,CAAD,GAAmC1O,MAAD;AACpC,YAAIN,aAAa,CAACM,KAAK,CAACqH,IAAD,CAAN,CAAjB,EAAgC;AAC9B,iBAAOrH,KAAK,CAACqH,IAAD,CAAZ;AACD;AACF,OAJG,CAAJ;AAKD,KAVD,MAUO,IAAI,CAAC2H,iBAAL,EAAwB;AAC7B,UAAIK,OAAO,GAAG,KAAd;AACA,YAAMC,gBAAgB,GAAkB,EAAxC;AACA,YAAMC,kBAAkB,GAAkB,EAA1C;AACA,YAAMC,gBAAgB,GAAGhS,IAAI,CAACsR,YAAD,CAA7B;AACA,YAAMW,gBAAgB,GAAyC,CAAClR,OAAO,CAACwQ,aAAD,CAAR,GAC3D,CAACA,aAAD,CAD2D,GAE1DA,aAFL;AAIA1N,MAAAA,IAAI,CAACoO,gBAAD,GAAoBC,iBAAD;AAErB,YAAIC,UAAJ;AACAtO,QAAAA,IAAI,CAAC8M,oBAAD,EAAuB,CAACnO,KAAD,EAAgBnB,GAAhB;AACzB,cAAImB,KAAK,KAAK0P,gBAAd,EAAgC;AAC9BC,YAAAA,UAAU,GAAG9Q,GAAb;AACD;AACF,SAJG,CAAJ;AAKA,cAAM+Q,YAAY,GAAGD,UAAU,KAAKjS,SAApC;;AACA,YAAIkS,YAAY,IAAI1R,QAAQ,CAAC4Q,YAAD,CAA5B,EAA4C;AAE1C,gBAAMe,eAAe,GAAGH,gBAAgB,CAAC3J,KAAjB,CAAuB,GAAvB,CAAxB;AACAsJ,UAAAA,OAAO,GAAG,CAAC,CAACQ,eAAe,CAACtC,IAAhB,EAAsBuC,YAAD,IAAiBA,WAAW,KAAKhB,YAAtD,CAAZ;AAGAQ,UAAAA,gBAAgB,CAAC3N,IAAjB,CAAsB,GAAGkO,eAAzB;AACD,SAPD,MAOO;AACLR,UAAAA,OAAO,GAAGlB,oBAAoB,CAACqB,gBAAD,CAApB,KAA2CE,gBAArD;AACD;;AAGDH,QAAAA,kBAAkB,CAAC5N,IAAnB,CAAwBiO,YAAY,GAAGzB,oBAAoB,CAAC4B,MAAxB,GAAiCJ,UAArE;AAGA,eAAO,CAACN,OAAR;AACD,OAzBG,CAAJ;;AA2BA,UAAIA,OAAJ,EAAa;AACX,cAAMW,qBAAqB,GAAGzR,OAAO,CAACuQ,YAAD,CAAP,IAAyBlQ,aAAa,CAACkQ,YAAD,CAApE;;AACA,YAAIkB,qBAAqB,GAAGhC,SAAS,CAACc,YAAD,CAAT,KAA4Bd,SAAS,CAACa,gBAAD,CAAxC,GAA6DC,YAAY,KAAKD,gBAAvG,EAAyH;AACvHH,UAAAA,gBAAgB,CAACrH,IAAD,CAAhB,GAAyByH,YAAzB;AACD;AACF,OALD,MAKO,IAAIN,aAAJ,EAAmB;AACxByB,QAAAA,OAAO,CAACC,IAAR;;2BAEmBjB,aAAa5H,0DAA0DmI,gBAAgB,CAAC9C,WAAjB,2BAAuDoC,oBAA7I;qCACyBS,kBAAkB,CAACY,IAAnB,CAAwB,IAAxB,EAA8BzD,WAA9B;aACxB4C,gBAAgB,CAAC3Q,MAAjB,GAA0B,CAA1B,+BAA0D2Q,gBAAgB,CAACa,IAAjB,CAAsB,IAAtB,MAA1D,GAA6F;QAJlG;AAMD;;AAED,aAAOxB,WAAW,CAACtH,IAAD,CAAlB;AACD;AACF,GAtEG,CAAJ;AAwEA,SAAO;AACL+H,IAAAA,QAAQ,EAAET,WADL;AAELQ,IAAAA,UAAU,EAAET;AAFP,GAAP;AAID,CAvFD;;AA0GA,MAAM0B,eAAe,GAAG,CACtBjK,OADsB,EAEtBmI,QAFsB,EAGtBC,WAHsB,EAItBC,aAJsB;AAetB,SAAOH,iBAAiB,CAAIlI,OAAJ,EAAamI,QAAb,EAAuBC,WAAW,IAAK,EAAvC,EAAiDC,aAAa,IAAI,KAAlE,CAAxB;AACD,CAhBD;;SCrIgB6B,iBACdC;AAEA,QAAMvP,MAAM,GAAQ;AAClBwP,IAAAA,SAAS,EAAE,EADO;AAElBC,IAAAA,QAAQ,EAAE;AAFQ,GAApB;AAKAnP,EAAAA,IAAI,CAACG,IAAI,CAAC8O,0BAAD,CAAL,GAAoCzR,IAAD;AACrC,UAAM6K,GAAG,GAAqE4G,0BAA0B,CAACzR,GAAD,CAAxG;;AAEA,QAAIN,OAAO,CAACmL,GAAD,CAAX,EAAkB;AAChB3I,MAAAA,MAAM,CAACwP,SAAP,CAAiB1R,GAAjB,IAAwB6K,GAAG,CAAC,CAAD,CAA3B;AACA3I,MAAAA,MAAM,CAACyP,QAAP,CAAgB3R,GAAhB,IAAuB6K,GAAG,CAAC,CAAD,CAA1B;AACD,KAHD,MAGO;AAEL,YAAM+G,SAAS,GAAGJ,gBAAgB,CAAC3G,GAAD,CAAlC;AACA3I,MAAAA,MAAM,CAACwP,SAAP,CAAiB1R,GAAjB,IAAwB4R,SAAS,CAACF,SAAlC;AACAxP,MAAAA,MAAM,CAACyP,QAAP,CAAgB3R,GAAhB,IAAuB4R,SAAS,CAACD,QAAjC;AACD;AACF,GAZG,CAAJ;AAcA,SAAOzP,MAAP;AACD;;ACTD,IAAI2P,mBAAJ;AACA,MAAM,CAAEC,CAAAA,GAAF,CAAOC,CAAAA,MAAP,IAAiBC,IAAvB;AACA,MAAMC,gBAAgB,GAAG,gBAAzB;AACA,MAAMC,oBAAoB,GAAG,cAA7B;AACA,MAAMC,uBAAuB,MAAMD,0BAAnC;;AAEA,MAAME,sBAAsB,GAAG,CAACC,IAAD,EAAoBC,UAApB;AAC7B5N,EAAAA,cAAc,CAAC2N,IAAD,EAAOC,UAAP,CAAd;AACA,QAAMC,KAAK,GAAGnM,UAAU,CAACkM,UAAD,CAAxB;AACA,QAAME,KAAK,GAAGvM,UAAU,CAACqM,UAAD,CAAxB;AAEA,SAAO;AACLnG,IAAAA,CAAC,EAAEqG,KAAK,CAAC3M,CAAN,GAAU0M,KAAK,CAAC1M,CADd;AAELuG,IAAAA,CAAC,EAAEoG,KAAK,CAAC5M,CAAN,GAAU2M,KAAK,CAAC3M;AAFd,GAAP;AAID,CATD;;AAWA,MAAM6M,yBAAyB,IAAIC,QAAD;AAChC,MAAIxQ,MAAM,GAAG,KAAb;AACAI,EAAAA,QAAQ,CAACoQ,OAAD,EAAU,8BAAV,CAAR;;AACA,MAAI;AACFxQ,IAAAA,MAAM;MACJ+I,KAAK,CAACyH,OAAD,EAAU,iBAAV,CAAL,KAAsC,MAAtC,IAAgDlS,MAAM,CAAC+K,gBAAP,CAAwBmH,OAAxB,EAAiC,qBAAjC,EAAwD1H,gBAAxD,CAAyE,SAAzE,MAAwF,MAD1I;AAED,GAHD,CAGE,OAAO2H,EAAP,EAAW;;AAEb,SAAOzQ,MAAP;AACD,CATD;;AAWA,MAAM0Q,oBAAoB,GAAG,CAAC/O,SAAD,EAAyBgP,QAAzB;AAC3B,QAAMC,SAAS,GAAG,QAAlB;AACA7H,EAAAA,KAAK,CAACpH,SAAD,EAAY;AAAEkP,IAAAA,SAAS,EAAED,SAAb;AAAwBE,IAAAA,SAAS,EAAEF,SAAnC;AAA8CG,IAAAA,SAAS,EAAE;AAAzD,GAAZ,CAAL;AACAvR,EAAAA,UAAU,CAACmC,SAAD,EAAY,CAAZ,CAAV;AAEA,QAAMqP,YAAY,GAAG7G,mBAAmB,CAACxI,SAAD,CAAxC;AACA,QAAMsP,WAAW,GAAG9G,mBAAmB,CAACwG,QAAD,CAAvC;AACAnR,EAAAA,UAAU,CAACmC,SAAD,EAAY,CAAC,GAAb,CAAV;AACA,QAAMuP,sBAAsB,GAAG/G,mBAAmB,CAACwG,QAAD,CAAlD;AACA,SAAO;AAOL5Q,IAAAA,CAAC,EAAEiR,YAAY,CAAC/G,CAAb,KAAmBgH,WAAW,CAAChH,CAP7B;AAcLkH,IAAAA,CAAC,EAAEF,WAAW,CAAChH,CAAZ,KAAkBiH,sBAAsB,CAACjH;AAdvC,GAAP;AAgBD,CAzBD;;AA2BA,MAAMmH,cAAc,GAAG,CAACzP,SAAD,EAAyBgP,QAAzB;AACrBvQ,EAAAA,QAAQ,CAACuB,SAAD,EAAYqO,oBAAZ,CAAR;AACA,QAAMqB,mBAAmB,GAAGtN,UAAU,CAACpC,SAAD,CAAtC;AACA,QAAM2P,aAAa,GAAGvN,UAAU,CAAC4M,QAAD,CAAhC;AACA,QAAMY,WAAW,GAAGhL,OAAO,CAAC+K,aAAD,EAAgBD,mBAAhB,CAA3B;AAEAjR,EAAAA,QAAQ,CAACuB,SAAD,EAAYsO,uBAAZ,CAAR;AACA,QAAMuB,mBAAmB,GAAGzN,UAAU,CAACpC,SAAD,CAAtC;AACA,QAAM8P,aAAa,GAAG1N,UAAU,CAAC4M,QAAD,CAAhC;AACA,QAAMe,WAAW,GAAGnL,OAAO,CAACkL,aAAD,EAAgBD,mBAAhB,CAA3B;AAEA,SAAOD,WAAW,IAAIG,WAAtB;AACD,CAZD;;AAcA,MAAMC,YAAY,GAAG;AAGnB,QAAMC,IAAI,GAAGtT,MAAM,CAACuT,MAAP,CAAcC,UAAd,IAA4B,CAAzC;AAGA,QAAMC,IAAI,GAAGzT,MAAM,CAACuT,MAAP,CAAcG,WAAd,IAA6B,CAA1C;AACA,SAAO1T,MAAM,CAAC2T,gBAAP,IAA2BL,IAAI,GAAGG,IAAzC;AACD,CARD;;AAUA,MAAMG,iBAAiB,GAAG,CAACC,MAAD,EAAiBC,MAAjB;AACxB,QAAMC,SAAS,GAAGzC,GAAG,CAACuC,MAAD,CAArB;AACA,QAAMG,SAAS,GAAG1C,GAAG,CAACwC,MAAD,CAArB;AACA,SAAO,EAAEC,SAAS,KAAKC,SAAd,IAA2BD,SAAS,GAAG,CAAZ,KAAkBC,SAA7C,IAA0DD,SAAS,GAAG,CAAZ,KAAkBC,SAA9E,CAAP;AACD,CAJD;;AAMA,MAAMC,iBAAiB,GAAG;AACxB,QAAM,CAAEpC,CAAAA,IAAF,KAAWnO,QAAjB;AACA,QAAMwQ,MAAM,GAAGpP,SAAS,aAAa2M,qCAAb,CAAxB;AACA,QAAM0C,MAAM,GAAGD,MAAM,CAAC,CAAD,CAArB;AACA,QAAME,WAAW,GAAGD,MAAM,CAACpQ,UAA3B;AAEA,QAAMsQ,iBAAiB,GAA8B,IAAI7R,GAAJ,EAArD;AACA,QAAM8R,mBAAmB,GAAG1C,sBAAsB,CAACC,IAAD,EAAOsC,MAAP,CAAlD;AACA,QAAMI,yBAAyB,GAAG;AAChC5I,IAAAA,CAAC,EAAE2I,mBAAmB,CAAC3I,CAApB,KAA0B,CADG;AAEhCC,IAAAA,CAAC,EAAE0I,mBAAmB,CAAC1I,CAApB,KAA0B;AAFG,GAAlC;AAKA,QAAM4I,GAAG,GAAgB;AACvBC,IAAAA,eAAe,EAAE,KADM;AAEvBC,IAAAA,oBAAoB,EAAEJ,mBAFC;AAGvBK,IAAAA,0BAA0B,EAAEJ,yBAHL;AAIvBK,IAAAA,uBAAuB,EAAE3C,yBAAyB,CAACkC,MAAD,CAJ3B;AAKvBU,IAAAA,kBAAkB,EAAEzC,oBAAoB,CAAC+B,MAAD,EAASC,WAAT,CALjB;AAMvBU,IAAAA,YAAY,EAAEhC,cAAc,CAACqB,MAAD,EAASC,WAAT,CANL;;AAOvBW,IAAAA,YAAY,CAACvO,QAAD;AACV6N,MAAAA,iBAAiB,CAACtS,GAAlB,CAAsByE,QAAtB;AACD,KATsB;;AAUvBwO,IAAAA,eAAe,CAACxO,QAAD;AACb6N,MAAAA,iBAAiB,CAACY,MAAlB,CAAyBzO,QAAzB;AACD;AAZsB,GAAzB;AAeAxF,EAAAA,UAAU,CAACmT,MAAD,EAAS,OAAT,CAAV;AACAnT,EAAAA,UAAU,CAACmT,MAAD,EAAS,OAAT,CAAV;AACA7P,EAAAA,cAAc,CAAC6P,MAAD,CAAd;;AAEA,MAAI,CAACI,yBAAyB,CAAC5I,CAA3B,IAAgC,CAAC4I,yBAAyB,CAAC3I,CAA/D,EAAkE;AAChE,QAAIsJ,IAAI,GAAG5P,UAAU,EAArB;AACA,QAAI6P,GAAG,GAAG9B,YAAY,EAAtB;AACA,QAAI+B,aAAa,GAAGd,mBAApB;AAEAtU,IAAAA,MAAM,CAACkG,gBAAP,CAAwB,QAAxB,EAAkC;AAChC,UAAImO,iBAAiB,CAACa,IAAtB,EAA4B;AAC1B,cAAMG,OAAO,GAAG/P,UAAU,EAA1B;AACA,cAAMgQ,SAAS,GAAG;AAChBlQ,UAAAA,CAAC,EAAEiQ,OAAO,CAACjQ,CAAR,GAAY8P,IAAI,CAAC9P,CADJ;AAEhBC,UAAAA,CAAC,EAAEgQ,OAAO,CAAChQ,CAAR,GAAY6P,IAAI,CAAC7P;AAFJ,SAAlB;AAKA,YAAIiQ,SAAS,CAAClQ,CAAV,KAAgB,CAAhB,IAAqBkQ,SAAS,CAACjQ,CAAV,KAAgB,CAAzC,EAA4C;AAE5C,cAAMkQ,YAAY,GAAG;AACnBnQ,UAAAA,CAAC,EAAEkM,GAAG,CAACgE,SAAS,CAAClQ,CAAX,CADa;AAEnBC,UAAAA,CAAC,EAAEiM,GAAG,CAACgE,SAAS,CAACjQ,CAAX;AAFa,SAArB;AAIA,cAAMmQ,aAAa,GAAG;AACpBpQ,UAAAA,CAAC,EAAEkM,GAAG,CAACC,KAAK,CAAC8D,OAAO,CAACjQ,CAAR,IAAa8P,IAAI,CAAC9P,CAAL,GAAS,KAAtB,CAAD,CAAN,CADc;AAEpBC,UAAAA,CAAC,EAAEiM,GAAG,CAACC,KAAK,CAAC8D,OAAO,CAAChQ,CAAR,IAAa6P,IAAI,CAAC7P,CAAL,GAAS,KAAtB,CAAD,CAAN;AAFc,SAAtB;AAIA,cAAMoQ,MAAM,GAAGpC,YAAY,EAA3B;AACA,cAAMqC,aAAa,GAAGH,YAAY,CAACnQ,CAAb,GAAiB,CAAjB,IAAsBmQ,YAAY,CAAClQ,CAAb,GAAiB,CAA7D;AACA,cAAMsQ,UAAU,GAAG,CAAC/B,iBAAiB,CAAC4B,aAAa,CAACpQ,CAAf,EAAkBoQ,aAAa,CAACnQ,CAAhC,CAArC;AACA,cAAMuQ,UAAU,GAAGH,MAAM,KAAKN,GAAX,IAAkBA,GAAG,GAAG,CAA3C;AACA,cAAMU,MAAM,GAAGH,aAAa,IAAIC,UAAjB,IAA+BC,UAA9C;;AAEA,YAAIC,MAAJ,EAAY;AACV,gBAAMC,gBAAgB,IAAIzE,mBAAmB,CAACqD,oBAApB,GAA2C9C,sBAAsB,CAACC,IAAD,EAAOsC,MAAP,EAA3F;AACA7P,UAAAA,cAAc,CAAC6P,MAAD,CAAd;;AAEA,cAAIiB,aAAa,CAACzJ,CAAd,KAAoBmK,gBAAgB,CAACnK,CAArC,IAA0CyJ,aAAa,CAACxJ,CAAd,KAAoBkK,gBAAgB,CAAClK,CAAnF,EAAsF;AACpFrJ,YAAAA,OAAO,CAAC8R,iBAAD,CAAP;AACD;;AAEDe,UAAAA,aAAa,GAAGU,gBAAhB;AACD;;AAEDZ,QAAAA,IAAI,GAAGG,OAAP;AACAF,QAAAA,GAAG,GAAGM,MAAN;AACD;AACF,KAtCD;AAuCD;;AAED,SAAOjB,GAAP;AACD,CA/ED;;AAiFO,MAAMuB,cAAc,GAAG;AAC5B,MAAI,CAAC1E,mBAAL,EAA0B;AACxBA,IAAAA,mBAAmB,GAAG4C,iBAAiB,EAAvC;AACD;;AACD,SAAO5C,mBAAP;AACD,CALM;;ACxJA,MAAM2E,mBAAmB,GAAG,CACjCC,0BADiC,EAEjC/J,eAFiC,EAGjCgK,cAHiC,EAIjCC,cAJiC;AAMjC,QAAM,CAAEjF,CAAAA,SAAS,EAAEkF,eAAb,CAA8BjF,CAAAA,QAAQ,EAAEkF,cAAxC,KAA2DrF,gBAAgB,CAAciF,0BAAd,CAAjF;AACA,QAAMnP,OAAO,GAAgBqB,UAAU,CACrC,EADqC,EAErCkO,cAFqC,EAGrCtF,eAAe,CAAImF,cAAc,IAAK,EAAvB,EAAiCE,eAAjC,EAAkD,IAAlD,EAAwD,IAAxD,CAAf,CAA6EtG,UAHxC,CAAvC;AAKA,QAAMwG,WAAW,GAAGrK,WAAW,CAAIC,eAAJ,CAA/B;AACA,QAAMqK,YAAY,GAAGtK,WAAW,CAAInF,OAAJ,EAAa,IAAb,CAAhC;;AAEA,QAAM0P,MAAM,IAAIC,MAAD;AACb,UAAMC,QAAQ,GAAG5X,SAAS,CAAC2X,KAAK,CAACE,MAAP,CAA1B;AACA,UAAM/J,KAAK,GAAG6J,KAAK,CAACE,MAAN,KAAiB,IAA/B;AAEA,UAAMC,YAAY,GAAGN,WAAW,CAAC1J,KAAK,GAAG,IAAH,GAAU6J,KAAK,CAACI,aAAN,KAAwBH,QAAQ,GAAG,IAAH,GAAU,EAA1C,CAAhB,EAA+D9J,KAA/D,CAAhC;AACA,UAAMkK,cAAc,GAAGP,YAAY,CAAC3J,KAAK,GAAG,IAAH,GAAU6J,KAAK,CAACM,eAAtB,EAAuC,CAAC,CAACN,KAAK,CAACM,eAAR,IAA2BnK,KAAlE,CAAnC;;AAEA,QAAIkK,cAAc,CAACjK,gBAAf,IAAmC+J,YAAY,CAAC/J,gBAApD,EAAsE;AACpEsJ,MAAAA,cAAc,CAACW,cAAD,EAAiBF,YAAjB,CAAd;AACD;AACF,GAVD;;AAYAJ,EAAAA,MAAM,CAAC;AAAEG,IAAAA,MAAM,EAAE;AAAV,GAAD,CAAN;AAEA,SAAO;AACLxF,IAAAA,QAAQ,CAAC6F,UAAD;AACN,UAAIA,UAAJ,EAAgB;AACd,cAAM,CAAElH,CAAAA,UAAU,EAAEgH,cAAd,KAAiC/F,eAAe,CAACiG,UAAD,EAAaZ,eAAb,EAA8BtP,OAA9B,EAAuC,IAAvC,CAAtD;AACAqB,QAAAA,UAAU,CAACrB,OAAD,EAAUgQ,cAAV,CAAV;AAEAN,QAAAA,MAAM,CAAC;AAAEO,UAAAA,eAAe,EAAE5U,IAAI,CAAC2U,cAAD;AAAvB,SAAD,CAAN;AACD;;AACD,aAAOhQ,OAAP;AACD,KATI;;AAULmQ,IAAAA,OAAO,GAAGrK,MAAD;AACP4J,MAAAA,MAAM,CAAC;AAAEG,QAAAA,MAAM,EAAE,CAAC,CAAC/J;AAAZ,OAAD,CAAN;AACD,KAZI;AAaLsK,IAAAA,YAAY,GAAGC,mBAAD;AACZX,MAAAA,MAAM,CAAC;AAAEK,QAAAA,aAAa,EAAEM;AAAjB,OAAD,CAAN;AACD;AAfI,GAAP;AAiBD,CA9CM;;AC1BP,MAAMC,6BAA6B,GAA2C,6CAA9E;AAOA,MAAMC,YAAY,GAAGzJ,WAAW,CAAC,mBAAD,CAAhC;AACA,MAAM0J,YAAY,GAAG1J,WAAW,CAAC,mBAAD,CAAhC;AAEO,MAAM2J,wBAAwB,GAAG,CACtCjR,MADsC,EAEtC4P,cAFsC;AAItC,QAAM,CAAEsB,CAAAA,IAAF,CAAQC,CAAAA,QAAR,CAAkBC,CAAAA,OAAlB,KAA8BpR,MAApC;AACA,QAAMqR,WAAW,GAAkB,EAAnC;AACA,QAAMnD,GAAG,GAAgBuB,cAAc,EAAvC;AACA,QAAM6B,kBAAkB,GAAGpD,GAAG,CAACG,0BAA/B;AACA,QAAMkD,wBAAwB,GAAGrD,GAAG,CAACI,uBAArC;AACA,QAAMkD,kBAAkB,GAAGtD,GAAG,CAACM,YAA/B;AAEA,QAAMiD,yBAAyB,IAAIV,YAAY,IAAIC,aAAjB,IAAkCO,wBAAlC,IAA8DD,kBAAkB,CAAChM,CAAnH;AAEA,QAAM,CAAEuF,CAAAA,QAAF,CAAY8F,CAAAA,OAAZ,CAAqBC,CAAAA,YAArB,KAAsClB,mBAAmB;IAC7D;AACEgC,MAAAA,eAAe,EAAE,CAAC,KAAD,EAAQC,oBAAM,CAACC,OAAf,CADnB;AAEEC,MAAAA,gBAAgB,EAAE;AAChBxM,QAAAA,CAAC,EAAE,CAAC,QAAD,EAAWyL,6BAAX,CADa;AAEhBxL,QAAAA,CAAC,EAAE,CAAC,QAAD,EAAWwL,6BAAX;AAFa;AAFpB,KAD6D;IAQ7D;AACEgB,MAAAA,OAAO,EAAE,CAAC,MAAMnN,kBAAkB,CAACuM,IAAD,EAAO,SAAP,CAAzB,EAA4CtP,SAA5C;AADX,KAR6D;IAW7DgO,cAX6D;IAY7D,CAACpP,OAAD,EAAUsF,KAAV;AACE,YAAM,CAAEG,CAAAA,MAAM,EAAEyL,eAAV,CAA2B1L,CAAAA,QAAQ,EAAE+L,sBAArC,KAAgEvR,OAAO,CAACkR,eAA9E;AACA,YAAM,CAAEzL,CAAAA,MAAM,EAAE6L,OAAV,CAAmB9L,CAAAA,QAAQ,EAAEgM,cAA7B,KAAgDlM,KAAK,CAACgM,OAA5D;;AAEA,UAAIC,sBAAsB,IAAIC,cAA9B,EAA8C;AAC5C,cAAMC,YAAY,GAAS;AACzB/M,UAAAA,CAAC,EAAE,CADsB;AAEzBC,UAAAA,CAAC,EAAE,CAFsB;AAGzB3D,UAAAA,CAAC,EAAE,CAHsB;AAIzB4D,UAAAA,CAAC,EAAE;AAJsB,SAA3B;;AAOA,YAAI,CAACsM,eAAL,EAAsB;AACpBO,UAAAA,YAAY,CAAC/M,CAAb,GAAiB,CAAC4M,OAAQ,CAAC5M,CAA3B;AACA+M,UAAAA,YAAY,CAAC9M,CAAb,GAAiB,EAAE2M,OAAQ,CAAC3M,CAAT,GAAa2M,OAAQ,CAAC1M,CAAxB,CAAjB;AACA6M,UAAAA,YAAY,CAACzQ,CAAb,GAAiB,EAAEsQ,OAAQ,CAACtQ,CAAT,GAAasQ,OAAQ,CAAC5M,CAAxB,CAAjB;AACA+M,UAAAA,YAAY,CAAC7M,CAAb,GAAiB,CAAC0M,OAAQ,CAAC1M,CAA3B;AACD;;AAED,YAAI,CAACmM,wBAAL,EAA+B;AAC7BU,UAAAA,YAAY,CAAC9M,CAAb,IAAkB+I,GAAG,CAACE,oBAAJ,CAAyB9I,CAA3C;AACA2M,UAAAA,YAAY,CAACzQ,CAAb,IAAkB0M,GAAG,CAACE,oBAAJ,CAAyB/I,CAA3C;AACD;;AAEDlB,QAAAA,KAAK,CAACgN,QAAD,EAAW;AAAErM,UAAAA,GAAG,EAAEmN,YAAY,CAAC/M,CAApB;AAAuBD,UAAAA,IAAI,EAAEgN,YAAY,CAAC7M,CAA1C;AAA6C,0BAAgB6M,YAAY,CAAC9M,CAA1E;AAA6E,2BAAiB8M,YAAY,CAACzQ;AAA3G,SAAX,CAAL;AACD;;AAED8I,MAAAA,OAAO,CAAC4H,GAAR,CAAY1R,OAAZ;AACA8J,MAAAA,OAAO,CAAC4H,GAAR,CAAYpM,KAAZ;AACD;EAzC4D,CAA/D;;AA4CA,QAAMqM,aAAa,GAAG;AACpBvB,IAAAA,YAAY,CAAC,SAAD,CAAZ;AACD,GAFD;;AAGA,QAAMwB,gBAAgB,GAAG,CAACC,cAAD,EAA0BC,eAA1B;AACvB,QAAIA,eAAJ,EAAqB;AACnBnO,MAAAA,KAAK,CAACiN,OAAD,EAAU;AAAEmB,QAAAA,MAAM,EAAE;AAAV,OAAV,CAAL;AACD,KAFD,MAEO;AACLpO,MAAAA,KAAK,CAACiN,OAAD,EAAU;AAAEmB,QAAAA,MAAM,EAAE;AAAV,OAAV,CAAL;AACD;AACF,GAND;;AAQA,SAAO;AACL1H,IAAAA,QADK;AAEL8F,IAAAA,OAFK;AAGL6B,IAAAA,cAAc,EAAEL,aAHX;AAILM,IAAAA,iBAAiB,EAAEL,gBAJd;;AAKLM,IAAAA,SAAS;AACPzW,MAAAA,OAAO,CAACoV,WAAD,CAAP;AACD;AAPI,GAAP;AASD,CA7EM;;ACPP,MAAMsB,uBAAuB,GAAG,gBAAhC;AACA,MAAMC,eAAe,GAAG,QAAxB;AACA,MAAMC,YAAY,GAAG,OAArB;AACA,MAAMC,yBAAyB,GAAGhL,KAAK,CAAC,gBAAD,CAAvC;AACA,MAAMiL,qBAAqB,GAAG,kBAA9B;AACA,MAAMC,2BAA2B,MAAMD,8BAAvC;AACA,MAAME,6BAA6B,MAAMF,gCAAzC;AACA,MAAMG,iCAAiC,MAAMD,oCAA7C;AACA,MAAME,sCAAsC,MAAMD,yCAAlD;AACA,MAAME,GAAG,GAAGC,oBAAZ;AACA,MAAMC,GAAG,GAAGC,qBAAZ;;AACA,MAAMC,YAAY,IAAIpZ,IAAD,IAAsB+J,KAAK,CAAC/J,GAAD,EAAM,WAAN,CAAhD;;AAMO,MAAMqZ,kBAAkB,GAAG,CAChCzT,MADgC,EAEhC0T,qBAFgC,EAGhClT,OAHgC;AAKhC,QAAM,CAAEmT,CAAAA,UAAU,EAAExH,SAAS,GAAG,KAA1B,CAAiCyH,CAAAA,OAAO,EAAEC,MAAM,GAAG,KAAnD,KAA6DrT,OAAO,IAAI,EAA9E;;AACA,QAAMsT,iBAAiB,GAAGrE,cAAc,GAAGlB,kBAA3C;;AACA,QAAMwF,YAAY,GAAGvV,SAAS,gBAAgBuU,sCAAsCE,6CAAtD,CAA9B;AACA,QAAMe,YAAY,GAAGD,YAAY,CAAC,CAAD,CAAjC;AACA,QAAME,eAAe,GAAGD,YAAY,CAACvW,UAArC;;AACA,QAAMyW,0BAA0B,IAAIC,IAAD;AACjC,QAAIhI,SAAJ,EAAe;AACb,YAAMiI,GAAG,GAAGZ,YAAY,CAACQ,YAAD,CAAZ,KAA+B,KAA3C;AACApZ,MAAAA,UAAU,CAACoZ,YAAD,EAAeI,GAAG,IAAIN,iBAAiB,CAACvH,CAAlB,GAAsB,CAACsG,YAAvB,GAAsCiB,iBAAiB,CAAC3Y,CAAlB,GAAsB,CAAtB,GAA0B0X,aAApE,GAAoFA,YAAtG,CAAV;AACAhY,MAAAA,SAAS,CAACmZ,YAAD,EAAenB,YAAf,CAAT;AACD;;AACDa,IAAAA,qBAAqB,CAACnb,QAAQ,CAAC4b,GAAD,CAAR,GAAgBA,GAAhB,GAAsBpc,SAAvB,CAArB;AACD,GAPD;;AAQA,QAAMgJ,YAAY,GAAmB,EAArC;AACA,MAAIsT,cAAc,GAAmCR,MAAM,GAAGK,0BAAH,GAAgC,IAA3F;;AAEA,MAAIpB,yBAAJ,EAA+B;AAC7B,UAAMwB,sBAAsB,GAAG,IAAIxB,yBAAJ,CAA8BoB,0BAA9B,CAA/B;AACAI,IAAAA,sBAAsB,CAACC,OAAvB,CAA+BN,eAA/B;AACAlT,IAAAA,YAAY,CAAC/E,IAAb,CAAkB,MAAMsY,sBAAsB,CAACE,UAAvB,EAAxB;AACD,GAJD,MAIO;AACL,UAAMC,uBAAuB,GAAGjW,SAAS;qBACxB0U,4DAA4DA,kDAAkDC,mEAAmED,kDAAkDC;IAD3M,CAAzC;AAGAvV,IAAAA,cAAc,CAACqW,eAAD,EAAkBQ,uBAAlB,CAAd;AACA,UAAMC,2BAA2B,GAAGD,uBAAuB,CAAC,CAAD,CAA3D;AACA,UAAME,aAAa,GAAGD,2BAA2B,CAACE,SAAlD;AACA,UAAMC,aAAa,GAAGH,2BAA2B,CAACjX,UAAlD;AACA,UAAMqX,kBAAkB,GAAGD,aAAH,oBAAGA,aAAa,CAAEpX,UAA1C;AAEA,QAAIsX,SAAS,GAAG5V,UAAU,CAAC8U,eAAD,CAA1B;AACA,QAAIe,QAAQ,GAAGD,SAAf;AACA,QAAIE,OAAO,GAAG,KAAd;AACA,QAAIC,KAAJ;;AAEA,UAAMC,KAAK,GAAG;AACZva,MAAAA,UAAU,CAACia,aAAD,EAAgBhC,YAAhB,CAAV;AACAhY,MAAAA,SAAS,CAACga,aAAD,EAAgBhC,YAAhB,CAAT;AACAjY,MAAAA,UAAU,CAAC+Z,aAAD,EAAgB9B,YAAhB,CAAV;AACAhY,MAAAA,SAAS,CAAC8Z,aAAD,EAAgB9B,YAAhB,CAAT;AACD,KALD;;AAMA,UAAMuC,SAAS,GAAG,SAAZA,SAAY;AAChBF,MAAAA,KAAK,GAAG,CAAR;;AACA,UAAI,CAACD,OAAL,EAAc;AACZ;AACD;;AAEDF,MAAAA,SAAS,GAAGC,QAAZ;AACAd,MAAAA,0BAA0B;AAC3B,KARD;;AASA,UAAMmB,QAAQ,IAAIC,YAAD;AACfN,MAAAA,QAAQ,GAAG7V,UAAU,CAAC8U,eAAD,CAArB;AACAgB,MAAAA,OAAO,GAAG,CAACK,WAAD,IAAgB,CAAC3T,OAAO,CAACqT,QAAD,EAAWD,SAAX,CAAlC;;AAEA,UAAIO,WAAW,IAAIL,OAAf,IAA0B,CAACC,KAA/B,EAAsC;AACpC9B,QAAAA,GAAG,CAAC8B,KAAD,CAAH;AACAA,QAAAA,KAAK,GAAG5B,GAAG,CAAC8B,SAAD,CAAX;AACD,OAHD,MAGO,IAAI,CAACE,WAAL,EAAkB;AACvBF,QAAAA,SAAS;AACV;;AAEDD,MAAAA,KAAK;;AACL,UAAIG,WAAJ,EAAiB;AACfjU,QAAAA,cAAc,CAACiU,WAAD,CAAd;AACAlU,QAAAA,eAAe,CAACkU,WAAD,CAAf;AACD;;AACD,aAAO,KAAP;AACD,KAjBD;;AAmBAvU,IAAAA,YAAY,CAAC/E,IAAb,CAAkBuE,EAAE,CAACsU,aAAD,EAAgBjC,eAAhB,EAAiCyC,QAAjC,CAApB;AACAtU,IAAAA,YAAY,CAAC/E,IAAb,CAAkBuE,EAAE,CAACoU,aAAD,EAAgB/B,eAAhB,EAAiCyC,QAAjC,CAApB;AAGAlR,IAAAA,KAAK,CAAC2Q,kBAAD,EAAqB;AACxBS,MAAAA,KAAK,EAAE1C,YADiB;AAExBN,MAAAA,MAAM,EAAEM;AAFgB,KAArB,CAAL;AAIAsC,IAAAA,KAAK;AACLd,IAAAA,cAAc,GAAGR,MAAM,GAAG,MAAMwB,QAAQ,EAAjB,GAAsBF,KAA7C;AACD;;AAED,MAAIhJ,SAAJ,EAAe;AACb,QAAIqJ,QAAJ;AACAzU,IAAAA,YAAY,CAAC/E,IAAb;MACEuE,EAAE,CAACyT,YAAD,EAAepB,eAAf,GAAiC6C,MAAD;AAChC,cAAMtB,GAAG,GAAGX,YAAY,CAACQ,YAAD,CAAxB;AACA,cAAMxN,OAAO,GAAG2N,GAAG,KAAKqB,QAAxB;;AACA,YAAIhP,OAAJ,EAAa;AACX,cAAI2N,GAAG,KAAK,KAAZ,EAAmB;AACjBhQ,YAAAA,KAAK,CAAC8P,eAAD,EAAkB;AAAEhP,cAAAA,IAAI,EAAE,MAAR;AAAgBF,cAAAA,KAAK,EAAE;AAAvB,aAAlB,CAAL;AACD,WAFD,MAEO;AACLZ,YAAAA,KAAK,CAAC8P,eAAD,EAAkB;AAAEhP,cAAAA,IAAI,EAAE,CAAR;AAAWF,cAAAA,KAAK,EAAE;AAAlB,aAAlB,CAAL;AACD;;AACDyQ,UAAAA,QAAQ,GAAGrB,GAAX;AACAD,UAAAA,0BAA0B,CAACC,GAAD,CAA1B;AACD;;AAED9S,QAAAA,cAAc,CAACoU,KAAD,CAAd;AACArU,QAAAA,eAAe,CAACqU,KAAD,CAAf;AACA,eAAO,KAAP;AACD,OAhBC;IADJ;AAmBD;;AAGD,MAAIpB,cAAJ,EAAoB;AAClB7Y,IAAAA,QAAQ,CAACwY,YAAD,EAAehB,2BAAf,CAAR;AACAjS,IAAAA,YAAY,CAAC/E,IAAb,CAAkBuE,EAAE,CAACyT,YAAD,EAAerB,uBAAf,EAAwC0B,cAAxC,CAApB;AACD;;AAEDtW,EAAAA,eAAe,CAACiC,MAAD,EAASgU,YAAT,CAAf;AAEA,SAAO;AACL/X,IAAAA,OAAO,CAAC8E,YAAD,CAAP;AACA/C,IAAAA,cAAc,CAACgW,YAAD,CAAd;AACD,GAHD;AAID,CAzHM;;AClCP,MAAM0B,wBAAwB,GAAG,qBAAjC;AACA,MAAMC,+BAA+B,GAAG7N,KAAK,CAAC,sBAAD,CAA7C;AAEO,MAAM8N,qBAAqB,GAAG,CACnC5V,MADmC,EAEnC6V,wBAFmC;AAInC,QAAMC,eAAe,GAAGtX,SAAS,gBAAgBkX,kCAAhB,CAAT,CAA6D,CAA7D,CAAxB;AACA,QAAM3U,YAAY,GAAmB,EAArC;AACA,MAAIuR,eAAe,GAAG,KAAtB;;AAEA,MAAIqD,+BAAJ,EAAqC;AACnC,UAAMI,4BAA4B,GAAyB,IAAIJ,+BAAJ;OACxDK,QAAD;AACE,YAAIA,OAAO,IAAIA,OAAO,CAAChd,MAAR,GAAiB,CAAhC,EAAmC;AACjC,gBAAMid,IAAI,GAAGD,OAAO,CAACE,GAAR,EAAb;;AACA,cAAID,IAAJ,EAAU;AACR,kBAAME,kBAAkB,GAAGF,IAAI,CAACG,cAAL,IAAuBH,IAAI,CAACI,iBAAL,GAAyB,CAA3E;;AAEA,gBAAIF,kBAAkB,KAAK7D,eAA3B,EAA4C;AAC1CuD,cAAAA,wBAAwB,CAAC,KAAD,EAAQM,kBAAR,CAAxB;AACA7D,cAAAA,eAAe,GAAG6D,kBAAlB;AACD;AACF;AACF;AACF,OAbwD;MAczD;AAAEG,QAAAA,IAAI,EAAEtW;AAAR;IAdyD,CAA3D;AAgBA+V,IAAAA,4BAA4B,CAACxB,OAA7B,CAAqCuB,eAArC;AACA/U,IAAAA,YAAY,CAAC/E,IAAb,CAAkB,MAAM+Z,4BAA4B,CAACvB,UAA7B,EAAxB;AACD,GAnBD,MAmBO;AACLzT,IAAAA,YAAY,CAAC/E,IAAb;MACEyX,kBAAkB,CAACqC,eAAD,EAAkB;AAClC,cAAMS,OAAO,GAAGpX,UAAU,CAAC2W,eAAD,CAA1B;AACA,cAAMK,kBAAkB,GAAGI,OAAO,CAACxX,CAAR,KAAc,CAAzC;;AAEA,YAAIoX,kBAAkB,KAAK7D,eAA3B,EAA4C;AAC1CuD,UAAAA,wBAAwB,CAAC,KAAD,EAAQM,kBAAR,CAAxB;AACA7D,UAAAA,eAAe,GAAG6D,kBAAlB;AACD;AACF,OARiB;IADpB;AAWD;;AAEDpY,EAAAA,eAAe,CAACiC,MAAD,EAAS8V,eAAT,CAAf;AAEA,SAAO;AACL7Z,IAAAA,OAAO,CAAC8E,YAAD,CAAP;AACA/C,IAAAA,cAAc,CAAC8X,eAAD,CAAd;AACD,GAHD;AAID,CA/CM;;ACCP,MAAMU,aAAa,GAAG,SAAtB;AACA,MAAMC,iBAAiB,GAAG,aAA1B;AACA,MAAMC,gBAAgB,GAAG,YAAzB;;AAEA,MAAMC,eAAe,IAAI3W,OAAD;AACtB,MAAIxG,aAAa,CAACwG,MAAD,CAAjB,EAA2B;AACzB,UAAM4W,UAAU,GAAGna,EAAE,CAACuD,MAAD,EAAS,UAAT,CAArB;;AACA,UAAMkR,KAAI,GAAI0F,UAAU,GAAGxY,SAAS,EAAZ,GAAiB4B,MAAzC;;AACA,UAAMmR,SAAQ,GAAG/S,SAAS,CAACqY,iBAAD,CAA1B;;AACA,UAAMrF,QAAO,GAAGhT,SAAS,CAACsY,gBAAD,CAAzB;;AAEA9Y,IAAAA,cAAc,CAACuT,SAAD,EAAWC,QAAX,CAAd;AACAxT,IAAAA,cAAc,CAACwT,QAAD,EAAU1U,QAAQ,CAACsD,MAAD,CAAlB,CAAd;AACApC,IAAAA,cAAc,CAACoC,MAAD,EAASmR,SAAT,CAAd;AACA3V,IAAAA,QAAQ,CAAC0V,KAAD,EAAOsF,aAAP,CAAR;AAEA,WAAO;AACLxW,MAAAA,MADK;AAELkR,MAAAA,IAAI,EAAJA,KAFK;AAGLC,MAAAA,QAAQ,EAARA,SAHK;AAILC,MAAAA,OAAO,EAAPA;AAJK,KAAP;AAMD;;AAED,QAAM,CAAEF,CAAAA,IAAF,CAAQC,CAAAA,QAAR,CAAkBC,CAAAA,OAAlB,KAA8BpR,MAApC;AAEAxE,EAAAA,QAAQ,CAAC0V,IAAD,EAAOsF,aAAP,CAAR;AACAhb,EAAAA,QAAQ,CAAC2V,QAAD,EAAWsF,iBAAX,CAAR;AACAjb,EAAAA,QAAQ,CAAC4V,OAAD,EAAUsF,gBAAV,CAAR;AAEA,SAAO1W,MAAP;AACD,CA3BD;;AA6BA,MAAM6W,iBAAiB,GAAG,CAAC7W,MAAD,EAAmBQ,OAAnB,EAAkCsW,UAAlC;AACxB,QAAMC,QAAQ,GAAmBJ,eAAe,CAAC3W,MAAD,CAAhD;AACA,QAAMgX,UAAU,GAAqB,EAArC;AACA,QAAM,CAAE9F,CAAAA,IAAF,KAAW6F,QAAjB;AAEAC,EAAAA,UAAU,CAAChb,IAAX,CAAgBiV,wBAAwB,CAAC8F,QAAD,CAAxC;;AAGA,QAAM5E,aAAa,IAAIhG,UAAD;AACpB,QAAIA,SAAJ,EAAe;AACbzQ,MAAAA,IAAI,CAACsb,UAAD,GAAcC,UAAD;AACfA,QAAAA,SAAS,CAACC,mBAAV,IAAiCD,SAAS,CAACC,mBAAV,CAA8B/K,SAA9B,CAAjC;AACD,OAFG,CAAJ;AAGD,KAJD,MAIO;AACLzQ,MAAAA,IAAI,CAACsb,UAAD,GAAcC,UAAD;AACfA,QAAAA,SAAS,CAACzE,cAAV,IAA4ByE,SAAS,CAACzE,cAAV,EAA5B;AACD,OAFG,CAAJ;AAGD;AACF,GAVD;;AAWA,QAAMJ,gBAAgB,GAAG,CAACC,cAAD,EAA0BC,eAA1B;AACvB5W,IAAAA,IAAI,CAACsb,UAAD,GAAcC,UAAD;AACfA,MAAAA,SAAS,CAACxE,iBAAV,IAA+BwE,SAAS,CAACxE,iBAAV,CAA4BJ,cAA5B,EAA4CC,eAA5C,CAA/B;AACD,KAFG,CAAJ;AAGD,GAJD;;AAMAmB,EAAAA,kBAAkB,CAACvC,IAAD,EAAOiB,aAAP,EAAsB;AAAEyB,IAAAA,OAAO,EAAE,IAAX;AAAiBD,IAAAA,UAAU,EAAE;AAA7B,GAAtB,CAAlB;AACAiC,EAAAA,qBAAqB,CAAC1E,IAAD,EAAOkB,gBAAP,CAArB;AACD,CA3BD;;AC9BA;AACE,SAAO;IACL3C,cAAc,EADT;IAELoH,iBAAiB,CAACzZ,QAAQ,CAACmO,IAAV,CAFZ;IAGL/M,SAAS;MACP;;;;;;;;;;;;;;;;;;;;;;IADO;EAHJ,CAAP;AA4BD;;;"} \ No newline at end of file +{"version":3,"file":"overlayscrollbars.esm.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/dom/events.ts","../src/support/utils/equal.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../src/support/cache/cache.ts","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/support/options/transformation.ts","../src/environment/environment.ts","../src/lifecycles/lifecycleBase.ts","../src/lifecycles/structureLifecycle.ts","../src/observers/sizeObserver.ts","../src/observers/trinsicObserver.ts","../src/overlayscrollbars/overlayscrollbars.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype RunEachItem = ((...args: any) => any | any[]) | null | undefined;\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Calls all functions in the passed array/set of functions.\r\n * @param arr The array filled with function which shall be called.\r\n */\r\nexport const runEach = (arr: ArrayLike | Set): void => {\r\n if (arr instanceof Set) {\r\n arr.forEach((fn) => fn && fn());\r\n } else {\r\n each(arr, (fn) => fn && fn());\r\n }\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst matches = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const fn = Element.prototype.matches || Element.prototype.msMatchesSelector;\r\n return fn.call(elm, selector);\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => matches(elm, selector);\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (matches(child, selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { attr } from 'support/dom/attribute';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (classNames?: string): HTMLDivElement => {\r\n const div = document.createElement('div');\r\n if (classNames) {\r\n attr(div, 'class', classNames);\r\n }\r\n return div;\r\n};\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","export interface WH {\r\n w: T;\r\n h: T;\r\n}\r\n\r\nconst elementHasDimensions = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n\r\n/**\r\n * Determines whether the passed element has any dimensions.\r\n * @param elm The element.\r\n */\r\nexport const hasDimensions = (elm: HTMLElement | null): boolean => (elm ? elementHasDimensions(elm as HTMLElement) : false);\r\n","import { each, runEach } from 'support/utils/array';\r\n\r\nlet passiveEventsSupport: boolean;\r\nconst supportPassiveEvents = (): boolean => {\r\n if (passiveEventsSupport === undefined) {\r\n passiveEventsSupport = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n passiveEventsSupport = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n }\r\n return passiveEventsSupport;\r\n};\r\n\r\nexport interface OnOptions {\r\n _capture?: boolean;\r\n _passive?: boolean;\r\n _once?: boolean;\r\n}\r\n\r\n/**\r\n * Removes the passed event listener for the passed events with the passed options.\r\n * @param target The element from which the listener shall be removed.\r\n * @param eventNames The eventsnames for which the listener shall be removed.\r\n * @param listener The listener which shall be removed.\r\n * @param capture The options of the removed listener.\r\n */\r\nexport const off = (target: EventTarget, eventNames: string, listener: EventListener, capture?: boolean): void => {\r\n each(eventNames.split(' '), (eventName) => {\r\n target.removeEventListener(eventName, listener, capture);\r\n });\r\n};\r\n\r\n/**\r\n * Adds the passed event listener for the passed eventnames with the passed options.\r\n * @param target The element to which the listener shall be added.\r\n * @param eventNames The eventsnames for which the listener shall be called.\r\n * @param listener The listener which is called on the eventnames.\r\n * @param options The options of the added listener.\r\n */\r\nexport const on = (target: EventTarget, eventNames: string, listener: EventListener, options?: OnOptions): (() => void) => {\r\n const doSupportPassiveEvents = supportPassiveEvents();\r\n const passive = (doSupportPassiveEvents && options && options._passive) || false;\r\n const capture = (options && options._capture) || false;\r\n const once = (options && options._once) || false;\r\n const offListeners: (() => void)[] = [];\r\n const nativeOptions: AddEventListenerOptions | boolean = doSupportPassiveEvents\r\n ? {\r\n passive,\r\n capture,\r\n }\r\n : capture;\r\n\r\n each(eventNames.split(' '), (eventName) => {\r\n const finalListener = once\r\n ? (evt: Event) => {\r\n target.removeEventListener(eventName, finalListener, capture);\r\n listener && listener(evt);\r\n }\r\n : listener;\r\n\r\n offListeners.push(off.bind(null, target, eventName, finalListener, capture));\r\n target.addEventListener(eventName, finalListener, nativeOptions);\r\n });\r\n\r\n return runEach.bind(0, offListeners);\r\n};\r\n\r\n/**\r\n * Shorthand for the stopPropagation event Method.\r\n * @param evt The event of which the stopPropagation method shall be called.\r\n */\r\nexport const stopPropagation = (evt: Event) => evt.stopPropagation();\r\n\r\n/**\r\n * Shorthand for the preventDefault event Method.\r\n * @param evt The event of which the preventDefault method shall be called.\r\n */\r\nexport const preventDefault = (evt: Event) => evt.preventDefault();\r\n","import { each } from 'support/utils/array';\r\nimport { WH, XY, TRBL } from 'support/dom';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Compares two objects and returns true if all values of the passed prop names are identical, false otherwise or if one of the two object is falsy.\r\n * @param a Object a.\r\n * @param b Object b.\r\n * @param props The props which shall be compared.\r\n */\r\nexport const equal = (a: T | undefined, b: T | undefined, props: Array): boolean => {\r\n if (a && b) {\r\n let result = true;\r\n each(props, (prop) => {\r\n if (a[prop] !== b[prop]) {\r\n result = false;\r\n }\r\n });\r\n return result;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalWH = (a?: WH, b?: WH) => equal(a, b, ['w', 'h']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalXY = (a?: XY, b?: XY) => equal(a, b, ['x', 'y']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalTRBL = (a?: TRBL, b?: TRBL) => equal(a, b, ['t', 'r', 'b', 'l']);\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\nexport interface TRBL {\r\n t: number;\r\n r: number;\r\n b: number;\r\n l: number;\r\n}\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst parseToZeroOrNumber = (value: string, toFloat?: boolean): number => {\r\n /* istanbul ignore next */\r\n const num = toFloat ? parseFloat(value) : parseInt(value, 10);\r\n /* istanbul ignore next */\r\n return Number.isNaN(num) ? 0 : num;\r\n};\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n\r\n/**\r\n * Returns a top\r\n * @param elm\r\n * @param property\r\n */\r\nexport const topRightBottomLeft = (elm: HTMLElement | null, property?: string): TRBL => {\r\n const finalProp = property || '';\r\n const top = `${finalProp}-top`;\r\n const right = `${finalProp}-right`;\r\n const bottom = `${finalProp}-bottom`;\r\n const left = `${finalProp}-left`;\r\n const result = style(elm, [top, right, bottom, left]);\r\n return {\r\n t: parseToZeroOrNumber(result[top]),\r\n r: parseToZeroOrNumber(result[right]),\r\n b: parseToZeroOrNumber(result[bottom]),\r\n l: parseToZeroOrNumber(result[left]),\r\n };\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\n\r\nexport interface XY {\r\n x: T;\r\n y: T;\r\n}\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","export interface Cache {\r\n readonly _value?: T;\r\n readonly _previous?: T;\r\n readonly _changed: boolean;\r\n}\r\n\r\nexport interface CacheOptions {\r\n _equal?: EqualCachePropFunction;\r\n _initialValue?: T;\r\n}\r\n\r\nexport type CacheUpdate = (force?: boolean | 0, context?: C) => Cache;\r\n\r\nexport type UpdateCachePropFunction = (context?: C, current?: T, previous?: T) => T;\r\n\r\nexport type EqualCachePropFunction = (a?: T, b?: T) => boolean;\r\n\r\nexport const createCache = (update: UpdateCachePropFunction, options?: CacheOptions): CacheUpdate => {\r\n const { _equal, _initialValue } = options || {};\r\n let _value: T | undefined = _initialValue;\r\n let _previous: T | undefined;\r\n return (force, context) => {\r\n const prev = _value;\r\n const newVal = update(context, _value, _previous);\r\n const changed = force || (_equal ? !_equal(prev, newVal) : prev !== newVal);\r\n\r\n if (changed) {\r\n _value = newVal;\r\n _previous = prev;\r\n }\r\n\r\n return {\r\n _value,\r\n _previous,\r\n _changed: changed,\r\n };\r\n };\r\n};\r\n","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidationResult, OptionsValidated } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: T,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidationResult => {\r\n const validatedOptions: OptionsValidated = {};\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult._validated as any;\r\n optionsCopy[prop] = validatedResult._foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n let typeString: string | undefined;\r\n each(optionsTemplateTypes, (value: string, key: string) => {\r\n if (value === currTemplateType) {\r\n typeString = key;\r\n }\r\n });\r\n const isEnumString = typeString === undefined;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : typeString!);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n _foreign: optionsCopy,\r\n _validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validateOptions = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: T | null,\r\n doWriteErrors?: boolean\r\n): OptionsValidationResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false);\r\n};\r\n\r\nexport { validateOptions, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import { OptionsTemplate, OptionsWithOptionsTemplate, OptionsTemplateTypes } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\nimport { isArray } from 'support/utils/types';\r\nimport { each, keys } from 'support/utils';\r\n\r\nexport interface OptionsWithOptionsTemplateTransformation> {\r\n _template: OptionsTemplate;\r\n _options: T;\r\n}\r\n\r\n/**\r\n * Transforms the given OptionsWithOptionsTemplate object to its corresponding generic (T) Object or its corresponding Template object.\r\n * @param optionsWithOptionsTemplate The OptionsWithOptionsTemplate object which shall be converted.\r\n * @param toTemplate True if the given OptionsWithOptionsTemplate shall be converted to its corresponding Template object.\r\n */\r\nexport function transformOptions>(\r\n optionsWithOptionsTemplate: OptionsWithOptionsTemplate\r\n): OptionsWithOptionsTemplateTransformation {\r\n const result: any = {\r\n _template: {},\r\n _options: {},\r\n };\r\n\r\n each(keys(optionsWithOptionsTemplate), (key: Extract) => {\r\n const val: PlainObject | OptionsTemplateTypes | Array = optionsWithOptionsTemplate[key];\r\n\r\n if (isArray(val)) {\r\n result._template[key] = val[1];\r\n result._options[key] = val[0];\r\n } else {\r\n // if (isObject(val))\r\n const tmpResult = transformOptions(val as OptionsWithOptionsTemplate);\r\n result._template[key] = tmpResult._template;\r\n result._options[key] = tmpResult._options;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n runEach,\r\n equalWH,\r\n} from 'support';\r\n\r\nexport type OnEnvironmentChanged = (env: Environment) => void;\r\nexport interface Environment {\r\n _autoUpdateLoop: boolean;\r\n _nativeScrollbarSize: XY;\r\n _nativeScrollbarIsOverlaid: XY;\r\n _nativeScrollbarStyling: boolean;\r\n _rtlScrollBehavior: { n: boolean; i: boolean };\r\n _flexboxGlue: boolean;\r\n _addListener(listener: OnEnvironmentChanged): void;\r\n _removeListener(listener: OnEnvironmentChanged): void;\r\n}\r\n\r\nlet environmentInstance: Environment;\r\nconst { abs, round } = Math;\r\nconst environmentElmId = 'os-environment';\r\nconst classNameFlexboxGlue = 'flexbox-glue';\r\nconst classNameFlexboxGlueMax = `${classNameFlexboxGlue}-max`;\r\n\r\nconst getNativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst getNativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-scrollbar-styled');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst getRtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst getFlexboxGlue = (parentElm: HTMLElement, childElm: HTMLElement): boolean => {\r\n addClass(parentElm, classNameFlexboxGlue);\r\n const minOffsetsizeParent = offsetSize(parentElm);\r\n const minOffsetsize = offsetSize(childElm);\r\n const supportsMin = equalWH(minOffsetsize, minOffsetsizeParent);\r\n\r\n addClass(parentElm, classNameFlexboxGlueMax);\r\n const maxOffsetsizeParent = offsetSize(parentElm);\r\n const maxOffsetsize = offsetSize(childElm);\r\n const supportsMax = equalWH(maxOffsetsize, maxOffsetsizeParent);\r\n\r\n return supportsMin && supportsMax;\r\n};\r\n\r\nconst getWindowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nconst createEnvironment = (): Environment => {\r\n const { body } = document;\r\n const envDOM = createDOM(`
`);\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const onChangedListener: Set = new Set();\r\n const nativeScrollBarSize = getNativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nativeScrollBarSize.x === 0,\r\n y: nativeScrollBarSize.y === 0,\r\n };\r\n\r\n const env: Environment = {\r\n _autoUpdateLoop: false,\r\n _nativeScrollbarSize: nativeScrollBarSize,\r\n _nativeScrollbarIsOverlaid: nativeScrollbarIsOverlaid,\r\n _nativeScrollbarStyling: getNativeScrollbarStyling(envElm),\r\n _rtlScrollBehavior: getRtlScrollBehavior(envElm, envChildElm),\r\n _flexboxGlue: getFlexboxGlue(envElm, envChildElm),\r\n _addListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.add(listener);\r\n },\r\n _removeListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.delete(listener);\r\n },\r\n };\r\n\r\n removeAttr(envElm, 'style');\r\n removeAttr(envElm, 'class');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = getWindowDPR();\r\n let scrollbarSize = nativeScrollBarSize;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = getWindowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n if (isZoom) {\r\n const newScrollbarSize = (environmentInstance._nativeScrollbarSize = getNativeScrollbarSize(body, envElm));\r\n removeElements(envElm);\r\n\r\n if (scrollbarSize.x !== newScrollbarSize.x || scrollbarSize.y !== newScrollbarSize.y) {\r\n runEach(onChangedListener);\r\n }\r\n\r\n scrollbarSize = newScrollbarSize;\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n\r\n return env;\r\n};\r\n\r\nexport const getEnvironment = (): Environment => {\r\n if (!environmentInstance) {\r\n environmentInstance = createEnvironment();\r\n }\r\n return environmentInstance;\r\n};\r\n","import { Cache, OptionsValidated, OptionsWithOptionsTemplate, transformOptions, validateOptions, assignDeep, hasOwnProperty } from 'support';\r\nimport { CSSDirection, PlainObject } from 'typings';\r\n\r\ninterface LifecycleBaseUpdateHints {\r\n _force?: boolean;\r\n _changedOptions?: OptionsValidated;\r\n}\r\n\r\nexport interface LifecycleBase {\r\n _options(newOptions?: O): O;\r\n _update(force?: boolean): void;\r\n}\r\n\r\nexport interface Lifecycle extends LifecycleBase {\r\n _destruct(): void;\r\n _onSizeChanged?(): void;\r\n _onDirectionChanged?(directionCache: Cache): void;\r\n _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsicCache: Cache): void;\r\n}\r\n\r\nexport interface LifecycleOptionInfo {\r\n _value: T;\r\n _changed: boolean;\r\n}\r\n\r\nexport type LifecycleCheckOption = (path: string) => LifecycleOptionInfo;\r\n\r\nconst getPropByPath = (obj: any, path: string): T =>\r\n obj && path.split('.').reduce((o, prop) => (o && hasOwnProperty(o, prop) ? o[prop] : undefined), obj);\r\n\r\n/**\r\n * Creates a object which can be seen as the base of a lifecycle because it provides all the tools to manage a lifecycle and its options, cache and base functions.\r\n * @param defaultOptionsWithTemplate A object which describes the options and the default options of the lifecycle.\r\n * @param initialOptions The initialOptions for the lifecylce. (Can be undefined)\r\n * @param updateFunction The update function where cache and options updates are handled. Has two arguments which are the changedOptions and the changedCache objects.\r\n */\r\nexport const createLifecycleBase = (\r\n defaultOptionsWithTemplate: OptionsWithOptionsTemplate>,\r\n initialOptions: O | undefined,\r\n updateFunction: (force: boolean, checkOption: LifecycleCheckOption) => any\r\n): LifecycleBase => {\r\n const { _template: optionsTemplate, _options: defaultOptions } = transformOptions>(defaultOptionsWithTemplate);\r\n const options: Required = assignDeep(\r\n {},\r\n defaultOptions,\r\n validateOptions(initialOptions || ({} as O), optionsTemplate, null, true)._validated\r\n );\r\n\r\n const update = (hints: LifecycleBaseUpdateHints) => {\r\n const { _force, _changedOptions } = hints;\r\n const checkOption: LifecycleCheckOption = (path) => ({\r\n _value: getPropByPath(options, path),\r\n _changed: _force || getPropByPath(_changedOptions, path) !== undefined,\r\n });\r\n updateFunction(!!_force, checkOption);\r\n };\r\n\r\n update({ _force: true });\r\n\r\n return {\r\n _options(newOptions?: O) {\r\n if (newOptions) {\r\n const { _validated: _changedOptions } = validateOptions(newOptions, optionsTemplate, options, true);\r\n assignDeep(options, _changedOptions);\r\n\r\n update({ _changedOptions });\r\n }\r\n return options;\r\n },\r\n _update: (_force?: boolean) => {\r\n update({ _force });\r\n },\r\n };\r\n};\r\n","import {\r\n Cache,\r\n cssProperty,\r\n runEach,\r\n createCache,\r\n topRightBottomLeft,\r\n TRBL,\r\n equalTRBL,\r\n optionsTemplateTypes as oTypes,\r\n OptionsTemplateValue,\r\n style,\r\n OptionsWithOptionsTemplate,\r\n} from 'support';\r\nimport { OSTargetObject } from 'typings';\r\nimport { createLifecycleBase, Lifecycle } from 'lifecycles/lifecycleBase';\r\nimport { getEnvironment, Environment } from 'environment';\r\n\r\nexport type OverflowBehavior = 'hidden' | 'scroll' | 'visible-hidden' | 'visible-scroll';\r\nexport interface StructureLifecycleOptions {\r\n paddingAbsolute: boolean;\r\n overflowBehavior?: {\r\n x?: OverflowBehavior;\r\n y?: OverflowBehavior;\r\n };\r\n}\r\n\r\nconst overflowBehaviorAllowedValues: OptionsTemplateValue = 'visible-hidden visible-scroll scroll hidden';\r\nconst defaultOptionsWithTemplate: OptionsWithOptionsTemplate> = {\r\n paddingAbsolute: [false, oTypes.boolean],\r\n overflowBehavior: {\r\n x: ['scroll', overflowBehaviorAllowedValues],\r\n y: ['scroll', overflowBehaviorAllowedValues],\r\n },\r\n};\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\nconst classNameViewportScrollbarStyling = `${classNameViewport}-scrollbar-styled`;\r\n\r\nconst cssMarginEnd = cssProperty('margin-inline-end');\r\nconst cssBorderEnd = cssProperty('border-inline-end');\r\n\r\nexport const createStructureLifecycle = (\r\n target: OSTargetObject,\r\n initialOptions?: StructureLifecycleOptions\r\n): Lifecycle => {\r\n const { host, padding: paddingElm, viewport, content } = target;\r\n const destructFns: (() => any)[] = [];\r\n const env: Environment = getEnvironment();\r\n const scrollbarsOverlaid = env._nativeScrollbarIsOverlaid;\r\n const supportsScrollbarStyling = env._nativeScrollbarStyling;\r\n const supportFlexboxGlue = env._flexboxGlue;\r\n // direction change is only needed to update scrollbar hiding, therefore its not needed if css can do it, scrollbars are invisible or overlaid on y axis\r\n const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y;\r\n\r\n const updatePaddingCache = createCache(() => topRightBottomLeft(host, 'padding'), { _equal: equalTRBL });\r\n\r\n const { _options, _update } = createLifecycleBase(defaultOptionsWithTemplate, initialOptions, (force, checkOption) => {\r\n const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = checkOption('paddingAbsolute');\r\n const { _value: padding, _changed: paddingChanged } = updatePaddingCache(force);\r\n\r\n if (paddingAbsoluteChanged || paddingChanged) {\r\n const paddingStyle: TRBL = {\r\n t: 0,\r\n r: 0,\r\n b: 0,\r\n l: 0,\r\n };\r\n\r\n if (!paddingAbsolute) {\r\n paddingStyle.t = -padding!.t;\r\n paddingStyle.r = -(padding!.r + padding!.l);\r\n paddingStyle.b = -(padding!.b + padding!.t);\r\n paddingStyle.l = -padding!.l;\r\n }\r\n\r\n if (!supportsScrollbarStyling) {\r\n paddingStyle.r -= env._nativeScrollbarSize.y;\r\n paddingStyle.b -= env._nativeScrollbarSize.x;\r\n }\r\n\r\n style(paddingElm, {\r\n top: paddingStyle.t,\r\n left: paddingStyle.l,\r\n 'margin-right': paddingStyle.r,\r\n 'margin-bottom': paddingStyle.b,\r\n 'max-width': `calc(100% + ${paddingStyle.r * -1}px)`,\r\n });\r\n }\r\n });\r\n\r\n const onSizeChanged = () => {\r\n _update();\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => {\r\n const { _changed, _value } = heightIntrinsicCache;\r\n if (_changed) {\r\n style(content, { height: _value ? 'auto' : '100%' });\r\n }\r\n };\r\n\r\n return {\r\n _options,\r\n _update,\r\n _onSizeChanged: onSizeChanged,\r\n _onTrinsicChanged: onTrinsicChanged,\r\n _destruct() {\r\n runEach(destructFns);\r\n },\r\n };\r\n};\r\n","import {\r\n Cache,\r\n createCache,\r\n createDOM,\r\n style,\r\n appendChildren,\r\n offsetSize,\r\n scrollLeft,\r\n scrollTop,\r\n jsAPI,\r\n runEach,\r\n prependChildren,\r\n removeElements,\r\n on,\r\n preventDefault,\r\n stopPropagation,\r\n addClass,\r\n isString,\r\n equalWH,\r\n} from 'support';\r\nimport { CSSDirection } from 'typings';\r\nimport { getEnvironment } from 'environment';\r\n\r\nconst animationStartEventName = 'animationstart';\r\nconst scrollEventName = 'scroll';\r\nconst scrollAmount = 3333333;\r\nconst ResizeObserverConstructor = jsAPI('ResizeObserver');\r\nconst classNameSizeObserver = 'os-size-observer';\r\nconst classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;\r\nconst classNameSizeObserverListener = `${classNameSizeObserver}-listener`;\r\nconst classNameSizeObserverListenerScroll = `${classNameSizeObserverListener}-scroll`;\r\nconst classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`;\r\nconst classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`;\r\nconst cAF = cancelAnimationFrame;\r\nconst rAF = requestAnimationFrame;\r\nconst getDirection = (elm: HTMLElement): CSSDirection => style(elm, 'direction') as CSSDirection;\r\n\r\nexport type SizeObserverOptions = { _direction?: boolean; _appear?: boolean };\r\nexport const createSizeObserver = (\r\n target: HTMLElement,\r\n onSizeChangedCallback: (directionCache?: Cache) => any,\r\n options?: SizeObserverOptions\r\n): (() => void) => {\r\n const { _direction: direction = false, _appear: appear = false } = options || {};\r\n const rtlScrollBehavior = getEnvironment()._rtlScrollBehavior;\r\n const baseElements = createDOM(`
`);\r\n const sizeObserver = baseElements[0] as HTMLElement;\r\n const listenerElement = sizeObserver.firstChild as HTMLElement;\r\n const onSizeChangedCallbackProxy = (directionCache?: Cache) => {\r\n if (direction) {\r\n const rtl = getDirection(sizeObserver) === 'rtl';\r\n scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount);\r\n scrollTop(sizeObserver, scrollAmount);\r\n }\r\n onSizeChangedCallback(isString((directionCache || {})._value) ? directionCache : undefined);\r\n };\r\n const offListeners: (() => void)[] = [];\r\n let appearCallback: ((...args: any) => any) | null = appear ? onSizeChangedCallbackProxy : null;\r\n\r\n if (ResizeObserverConstructor) {\r\n const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);\r\n resizeObserverInstance.observe(listenerElement);\r\n offListeners.push(() => resizeObserverInstance.disconnect());\r\n } else {\r\n const observerElementChildren = createDOM(\r\n `
`\r\n );\r\n appendChildren(listenerElement, observerElementChildren);\r\n addClass(listenerElement, classNameSizeObserverListenerScroll);\r\n const observerElementChildrenRoot = observerElementChildren[0] as HTMLElement;\r\n const shrinkElement = observerElementChildrenRoot.lastChild as HTMLElement;\r\n const expandElement = observerElementChildrenRoot.firstChild as HTMLElement;\r\n const expandElementChild = expandElement?.firstChild as HTMLElement;\r\n\r\n let cacheSize = offsetSize(listenerElement);\r\n let currSize = cacheSize;\r\n let isDirty = false;\r\n let rAFId: number;\r\n\r\n const reset = () => {\r\n scrollLeft(expandElement, scrollAmount);\r\n scrollTop(expandElement, scrollAmount);\r\n scrollLeft(shrinkElement, scrollAmount);\r\n scrollTop(shrinkElement, scrollAmount);\r\n };\r\n const onResized = () => {\r\n rAFId = 0;\r\n if (isDirty) {\r\n cacheSize = currSize;\r\n onSizeChangedCallbackProxy();\r\n }\r\n };\r\n const onScroll = (scrollEvent?: Event) => {\r\n currSize = offsetSize(listenerElement);\r\n isDirty = !scrollEvent || !equalWH(currSize, cacheSize);\r\n\r\n if (scrollEvent && isDirty && !rAFId) {\r\n cAF(rAFId);\r\n rAFId = rAF(onResized);\r\n } else if (!scrollEvent) {\r\n onResized();\r\n }\r\n\r\n reset();\r\n\r\n if (scrollEvent) {\r\n preventDefault(scrollEvent);\r\n stopPropagation(scrollEvent);\r\n }\r\n return false;\r\n };\r\n\r\n offListeners.push(on(expandElement, scrollEventName, onScroll));\r\n offListeners.push(on(shrinkElement, scrollEventName, onScroll));\r\n\r\n // lets assume that the divs will never be that large and a constant value is enough\r\n style(expandElementChild, {\r\n width: scrollAmount,\r\n height: scrollAmount,\r\n });\r\n reset();\r\n appearCallback = appear ? () => onScroll() : reset;\r\n }\r\n\r\n if (direction) {\r\n const updateDirectionCache = createCache(() => getDirection(sizeObserver));\r\n offListeners.push(\r\n on(sizeObserver, scrollEventName, (event: Event) => {\r\n const directionCache = updateDirectionCache();\r\n const { _value, _changed } = directionCache;\r\n if (_changed) {\r\n if (_value === 'rtl') {\r\n style(listenerElement, { left: 'auto', right: 0 });\r\n } else {\r\n style(listenerElement, { left: 0, right: 'auto' });\r\n }\r\n onSizeChangedCallbackProxy(directionCache);\r\n }\r\n\r\n preventDefault(event);\r\n stopPropagation(event);\r\n return false;\r\n })\r\n );\r\n }\r\n\r\n // appearCallback is always needed on scroll-observer strategy to reset it\r\n if (appearCallback) {\r\n addClass(sizeObserver, classNameSizeObserverAppear);\r\n offListeners.push(on(sizeObserver, animationStartEventName, appearCallback));\r\n }\r\n\r\n prependChildren(target, sizeObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(sizeObserver);\r\n };\r\n};\r\n","import { WH, Cache, createDOM, offsetSize, jsAPI, runEach, prependChildren, removeElements, createCache } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\n\r\nconst classNameTrinsicObserver = 'os-trinsic-observer';\r\nconst IntersectionObserverConstructor = jsAPI('IntersectionObserver');\r\n\r\nexport const createTrinsicObserver = (\r\n target: HTMLElement,\r\n onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => any\r\n): (() => void) => {\r\n const trinsicObserver = createDOM(`
`)[0] as HTMLElement;\r\n const offListeners: (() => void)[] = [];\r\n const updateHeightIntrinsicCache = createCache>(\r\n (ioEntryOrSize) =>\r\n (ioEntryOrSize! as WH).h === 0 ||\r\n (ioEntryOrSize! as IntersectionObserverEntry).isIntersecting ||\r\n (ioEntryOrSize! as IntersectionObserverEntry).intersectionRatio > 0,\r\n {\r\n _initialValue: false,\r\n }\r\n );\r\n\r\n if (IntersectionObserverConstructor) {\r\n const intersectionObserverInstance: IntersectionObserver = new IntersectionObserverConstructor(\r\n (entries: IntersectionObserverEntry[]) => {\r\n if (entries && entries.length > 0) {\r\n const last = entries.pop();\r\n if (last) {\r\n const heightIntrinsicCache = updateHeightIntrinsicCache(0, last);\r\n\r\n if (heightIntrinsicCache._changed) {\r\n onTrinsicChangedCallback(false, heightIntrinsicCache);\r\n }\r\n }\r\n }\r\n },\r\n { root: target }\r\n );\r\n intersectionObserverInstance.observe(trinsicObserver);\r\n offListeners.push(() => intersectionObserverInstance.disconnect());\r\n } else {\r\n offListeners.push(\r\n createSizeObserver(trinsicObserver, () => {\r\n const newSize = offsetSize(trinsicObserver);\r\n const heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize);\r\n\r\n if (heightIntrinsicCache._changed) {\r\n onTrinsicChangedCallback(false, heightIntrinsicCache);\r\n }\r\n })\r\n );\r\n }\r\n\r\n prependChildren(target, trinsicObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(trinsicObserver);\r\n };\r\n};\r\n","import { OSTarget, OSTargetObject, CSSDirection } from 'typings';\r\nimport { createStructureLifecycle } from 'lifecycles/structureLifecycle';\r\nimport { Cache, appendChildren, addClass, contents, is, isHTMLElement, createDiv, each } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\nimport { createTrinsicObserver } from 'observers/trinsicObserver';\r\nimport { Lifecycle } from 'lifecycles/lifecycleBase';\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNamePadding = 'os-padding';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\n\r\nconst normalizeTarget = (target: OSTarget): OSTargetObject => {\r\n if (isHTMLElement(target)) {\r\n const isTextarea = is(target, 'textarea');\r\n const host = (isTextarea ? createDiv() : target) as HTMLElement;\r\n const padding = createDiv(classNamePadding);\r\n const viewport = createDiv(classNameViewport);\r\n const content = createDiv(classNameContent);\r\n\r\n appendChildren(padding, viewport);\r\n appendChildren(viewport, content);\r\n appendChildren(content, contents(target));\r\n appendChildren(target, padding);\r\n addClass(host, classNameHost);\r\n\r\n return {\r\n target,\r\n host,\r\n padding,\r\n viewport,\r\n content,\r\n };\r\n }\r\n\r\n const { host, padding, viewport, content } = target;\r\n\r\n addClass(host, classNameHost);\r\n addClass(padding, classNamePadding);\r\n addClass(viewport, classNameViewport);\r\n addClass(content, classNameContent);\r\n\r\n return target;\r\n};\r\n\r\nconst OverlayScrollbars = (target: OSTarget, options?: any, extensions?: any): void => {\r\n const osTarget: OSTargetObject = normalizeTarget(target);\r\n const lifecycles: Lifecycle[] = [];\r\n const { host } = osTarget;\r\n\r\n lifecycles.push(createStructureLifecycle(osTarget));\r\n\r\n // eslint-disable-next-line\r\n const onSizeChanged = (directionCache?: Cache) => {\r\n if (directionCache) {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(directionCache);\r\n });\r\n } else {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onSizeChanged && lifecycle._onSizeChanged();\r\n });\r\n }\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsicCache);\r\n });\r\n };\r\n\r\n createSizeObserver(host, onSizeChanged, { _appear: true, _direction: true });\r\n createTrinsicObserver(host, onTrinsicChanged);\r\n};\r\n\r\nexport { OverlayScrollbars };\r\n","import { createDOM } from 'support/dom';\r\nimport { getEnvironment } from 'environment';\r\nimport { OverlayScrollbars } from 'overlayscrollbars/overlayscrollbars';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n getEnvironment(),\r\n OverlayScrollbars(document.body),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["type","obj","undefined","Object","prototype","toString","call","replace","toLowerCase","isNumber","isString","isFunction","isUndefined","isNull","isArray","Array","isObject","isArrayLike","length","isPlainObject","key","proto","hasOwnProperty","hasOwnConstructor","hasIsPrototypeOf","constructor","isHTMLElement","instaceOfRightHandSide","window","HTMLElement","doInstanceOf","nodeType","nodeName","isEmptyObject","name","getSetProp","topLeft","fallback","elm","value","attr","attrName","getAttribute","setAttribute","removeAttr","removeAttribute","scrollLeft","scrollTop","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","keys","from","arr","push","runEach","Set","forEach","fn","matches","selector","Element","msMatchesSelector","is","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","prependChildren","removeElements","nodes","e","removeChild","createDiv","classNames","div","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","passiveEventsSupport","supportPassiveEvents","addEventListener","defineProperty","get","off","target","eventNames","listener","capture","split","eventName","removeEventListener","on","options","doSupportPassiveEvents","passive","_passive","_capture","once","_once","offListeners","nativeOptions","finalListener","evt","bind","stopPropagation","preventDefault","equal","a","b","props","prop","equalWH","equalTRBL","assignDeep","object1","object2","object3","object4","object5","object6","sources","copy","copyIsArray","src","clone","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","parseToZeroOrNumber","toFloat","num","parseFloat","parseInt","Number","isNaN","adaptCSSVal","val","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","topRightBottomLeft","property","finalProp","top","right","bottom","left","t","r","l","x","y","absoluteCoordinates","rect","pageYOffset","pageXOffset","createCache","update","_equal","_initialValue","_value","_previous","force","context","prev","newVal","changed","_changed","firstLetterToUpper","str","charAt","toUpperCase","slice","getDummyStyle","cssPrefixes","jsPrefixes","jsCache","cssCache","cssProperty","uppercasedName","elmStyle","prefix","prefixWithoutDashes","resultPossibilities","find","resultPossibility","jsAPI","resizeObserver","_extends","module","assign","arguments","apply","stringify","JSON","templateTypePrefixSuffix","optionsTemplateTypes","item","validateRecursive","template","optionsDiff","doWriteErrors","propPath","validatedOptions","optionsCopy","filter","optionsDiffValue","optionsValue","templateValue","templateIsComplex","propPrefix","validatedResult","_validated","_foreign","isValid","errorEnumStrings","errorPossibleTypes","optionsValueType","templateValueArr","currTemplateType","typeString","isEnumString","enumStringSplit","possibility","string","doStringifyComparison","console","warn","join","validateOptions","transformOptions","optionsWithOptionsTemplate","_template","_options","tmpResult","environmentInstance","abs","round","Math","environmentElmId","classNameFlexboxGlue","classNameFlexboxGlueMax","getNativeScrollbarSize","body","measureElm","cSize","oSize","getNativeScrollbarStyling","testElm","ex","getRtlScrollBehavior","childElm","strHidden","overflowX","overflowY","direction","parentOffset","childOffset","childOffsetAfterScroll","n","getFlexboxGlue","minOffsetsizeParent","minOffsetsize","supportsMin","maxOffsetsizeParent","maxOffsetsize","supportsMax","getWindowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","createEnvironment","envDOM","envElm","envChildElm","onChangedListener","nativeScrollBarSize","nativeScrollbarIsOverlaid","env","_autoUpdateLoop","_nativeScrollbarSize","_nativeScrollbarIsOverlaid","_nativeScrollbarStyling","_rtlScrollBehavior","_flexboxGlue","_addListener","_removeListener","delete","size","dpr","scrollbarSize","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","newScrollbarSize","getEnvironment","getPropByPath","path","o","createLifecycleBase","defaultOptionsWithTemplate","initialOptions","updateFunction","optionsTemplate","defaultOptions","hints","_force","_changedOptions","checkOption","newOptions","_update","overflowBehaviorAllowedValues","paddingAbsolute","oTypes","boolean","overflowBehavior","cssMarginEnd","cssBorderEnd","createStructureLifecycle","host","padding","paddingElm","viewport","content","destructFns","scrollbarsOverlaid","supportsScrollbarStyling","supportFlexboxGlue","directionObserverObsolete","updatePaddingCache","paddingAbsoluteChanged","paddingChanged","paddingStyle","onSizeChanged","onTrinsicChanged","widthIntrinsic","heightIntrinsicCache","height","_onSizeChanged","_onTrinsicChanged","_destruct","animationStartEventName","scrollEventName","scrollAmount","ResizeObserverConstructor","classNameSizeObserver","classNameSizeObserverAppear","classNameSizeObserverListener","classNameSizeObserverListenerScroll","classNameSizeObserverListenerItem","classNameSizeObserverListenerItemFinal","cAF","cancelAnimationFrame","rAF","requestAnimationFrame","getDirection","createSizeObserver","onSizeChangedCallback","_direction","_appear","appear","rtlScrollBehavior","baseElements","sizeObserver","listenerElement","onSizeChangedCallbackProxy","directionCache","rtl","appearCallback","resizeObserverInstance","observe","disconnect","observerElementChildren","observerElementChildrenRoot","shrinkElement","lastChild","expandElement","expandElementChild","cacheSize","currSize","isDirty","rAFId","reset","onResized","onScroll","scrollEvent","width","updateDirectionCache","event","classNameTrinsicObserver","IntersectionObserverConstructor","createTrinsicObserver","onTrinsicChangedCallback","trinsicObserver","updateHeightIntrinsicCache","ioEntryOrSize","isIntersecting","intersectionRatio","intersectionObserverInstance","entries","last","pop","root","newSize","classNameHost","classNamePadding","classNameViewport","classNameContent","normalizeTarget","isTextarea","OverlayScrollbars","extensions","osTarget","lifecycles","lifecycle","_onDirectionChanged"],"mappings":"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"} \ No newline at end of file diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js b/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js index 0095ece..14f23eb 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js @@ -1 +1 @@ -const t=t=>null==t?""+t:Object.prototype.toString.call(t).replace(/^\[object (.+)\]$/,"$1").toLowerCase();function n(t){return"number"==typeof t}function e(t){return"string"==typeof t}function o(t){return"function"==typeof t}function r(t){return void 0===t}function i(t){return null===t}function s(t){return Array.isArray(t)}function c(t){return"object"==typeof t&&!s(t)&&!i(t)}function l(t){const e=!!t&&t.length;return s(t)||!o(t)&&n(e)&&e>-1&&e%1==0}function a(n){if(!n||!c(n)||"object"!==t(n))return!1;let e;const{hasOwnProperty:o}=Object.prototype,i=o.call(n,"constructor"),s=n.constructor&&n.constructor.prototype&&o.call(n.constructor.prototype,"isPrototypeOf");if(n.constructor&&!i&&!s)return!1;for(e in n);return r(e)||o.call(n,e)}function u(t,n,e,o){if(r(o))return e?e[t]:n;e&&(e[t]=o)}const d=(t,n)=>{null==t||t.removeAttribute(n)};function f(t,n){return u("scrollLeft",0,t,n)}function v(t,n){return u("scrollTop",0,t,n)}const h=/[^\x20\t\r\n\f]+/g,b=(t,n)=>{((t,n,o)=>{let r,i=0,s=!1;if(t&&e(n)){const e=n.match(h)||[];for(s=e.length>0;r=e[i++];)s=o(t.classList,r)&&s}})(t,n,(t,n)=>t.add(n))};function p(t,n){if(l(t))for(let e=0;en(t[e],e,t));return t}const w=t=>{if(Array.from)return Array.from(t);const n=[];return p(t,t=>{n.push(t)}),n},_=t=>{t instanceof Set?t.forEach(t=>t&&t()):p(t,t=>t&&t())},g=(t,n)=>((t,n)=>{if(t){return(Element.prototype.matches||Element.prototype.msMatchesSelector).call(t,n)}return!1})(t,n),m=t=>t?w(t.childNodes):[],y=(t,n,e)=>{if(e){let o,r=n;t&&(l(e)?(o=document.createDocumentFragment(),p(e,t=>{t===r&&(r=t.previousSibling),o.appendChild(t)})):o=e,n&&(r?r!==n&&(r=r.nextSibling):r=t.firstChild),t.insertBefore(o,r))}},x=(t,n)=>{y(t,null,n)},z=(t,n)=>{y(t,t&&t.firstChild,n)},O=t=>{if(l(t))p(w(t),t=>O(t));else if(t){const e=(n=t)?n.parentElement:null;e&&e.removeChild(t)}var n},j=t=>{const n=document.createElement("div");return t&&function(t,n,e){if(r(e))return t?t.getAttribute(n):null;t&&t.setAttribute(n,e)}(n,"class",t),n},S=t=>{const n=j();return n.innerHTML=t.trim(),p(m(n),t=>O(t))},$={w:0,h:0},A=()=>({w:window.innerWidth,h:window.innerHeight}),k=t=>t?{w:t.offsetWidth,h:t.offsetHeight}:$;let C;const L=(t,n,e,o)=>{p(n.split(" "),n=>{t.removeEventListener(n,e,o)})},T=(t,n,e,o)=>{const r=(()=>{if(void 0===C){C=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){C=!0}}))}catch(t){}}return C})(),i=r&&o&&o.o||!1,s=o&&o.s||!1,c=o&&o.u||!1,l=[],a=r?{passive:i,capture:s}:s;return p(n.split(" "),n=>{const o=c?r=>{t.removeEventListener(n,o,s),e&&e(r)}:e;l.push(L.bind(null,t,n,o,s)),t.addEventListener(n,o,a)}),_.bind(0,l)},E=t=>t.stopPropagation(),P=t=>t.preventDefault(),q=(t,n,e)=>{if(t&&n){let o=!0;return p(e,e=>{t[e]!==n[e]&&(o=!1)}),o}return!1},F=(t,n)=>q(t,n,["w","h"]),I=(t,n)=>q(t,n,["t","r","b","l"]),M=(t,n)=>Object.prototype.hasOwnProperty.call(t,n),B=t=>t?Object.keys(t):[];function N(t,n,e,r,c,l,u){const d=[n,e,r,c,l,u];return"object"==typeof t&&!i(t)||o(t)||(t={}),p(d,n=>{p(B(n),e=>{const o=n[e];if(t===o)return!0;const r=s(o);if(o&&(a(o)||r)){const n=t[e];let i=n;r&&!s(n)?i=[]:r||a(n)||(i={}),t[e]=N(i,o)}else t[e]=o})}),t}const R={animationiterationcount:1,columncount:1,fillopacity:1,flexgrow:1,flexshrink:1,fontweight:1,lineheight:1,opacity:1,order:1,orphans:1,widows:1,zindex:1,zoom:1},Y=(t,n)=>{const e=n?parseFloat(t):parseInt(t,10);return Number.isNaN(e)?0:e},D=(t,n,e)=>null!=n?n.getPropertyValue(e):t.style[e],G=(t,e,o)=>{try{t&&void 0!==t.style[e]&&(t.style[e]=((t,e)=>!R[t.toLowerCase()]&&n(e)?e+"px":e)(e,o))}catch(r){}};function J(t,n){const o=e(n);if(s(n)||o){let e=o?"":{};if(t){const r=window.getComputedStyle(t,null);e=o?D(t,r,n):n.reduce((n,e)=>(n[e]=D(t,r,e),n),e)}return e}p(B(n),e=>G(t,e,n[e]))}const K={x:0,y:0},U=t=>{const n=t?(t=>t.getBoundingClientRect())(t):0;return n?{x:n.left+window.pageYOffset,y:n.top+window.pageXOffset}:K};function V(t,n){const o={},r=B(t);p(r,e=>{o[e]={v:!1,p:n?t[e]:void 0}});return(i,c)=>{const l=(e(i)?[i]:i)||r;return p(l,e=>{const r=o[e],i=t[e],c=!n&&s(i),l=c?i[0]:i,a=c?i[1]:null;((t,n,e)=>{const r=o[t].p;o[t].p=n,o[t]._=r,o[t].v=e?!e(r,n):r!==n})(e,n?l:l(r.p,r._),a)}),((t,n)=>{const e=N({},o,{g:!1});return p(t,t=>{const r=n||o[t].v;e.g=e.g||r,e[t].v=r,o[t].v=!1}),e})(l,c)}}const W=t=>t.charAt(0).toUpperCase()+t.slice(1),X=["-webkit-","-moz-","-o-","-ms-"],H=["WebKit","Moz","O","MS","webkit","moz","o","ms"],Q={},Z={},tt=t=>{let n=Z[t];if(M(Z,t))return n;const e=W(t),o=j().style;return p(X,r=>{const i=r.replace(/-/g,""),s=[t,r+t,i+e,W(i)+e];return n=s.find(t=>void 0!==o[t]),!n}),Z[t]=n,n},nt=t=>{let n=Q[t]||window[t];return M(Q,t)||(p(H,e=>(n=n||window[e+W(t)],!n)),Q[t]=n),n};nt("ResizeObserver");var et=function(t,n,e){return t(e={path:n,exports:{},require:function(t,n){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==n&&e.path)}},e.exports),e.exports}((function(t){function n(){return t.exports=n=Object.assign||function(t){for(var n=1;n(t[n]=rt[0]+n+rt[1],t),{}),st=(n,o,i,c,l)=>{const u={},d=et({},n);return p(B(o).filter(t=>M(n,t)),f=>{const v=r(i[f])?{}:i[f],h=n[f],b=o[f],w=a(b),_=l?l+".":"";if(w&&a(h)){const t=st(h,b,v,c,_+f);u[f]=t.m,d[f]=t.O,p([d,u],t=>{(function(t){for(const n in t)return!1;return!0})(t[f])&&delete t[f]})}else if(!w){let n=!1;const o=[],r=[],i=t(h);if(p(s(b)?b:[b],t=>{let s;p(it,(n,e)=>{n===t&&(s=e)});const c=void 0===s;if(c&&e(h)){const e=t.split(" ");n=!!e.find(t=>t===h),o.push(...e)}else n=it[i]===t;return r.push(c?it.string:s),!n}),n){(s(h)||a(h)?ot(h)!==ot(v):h!==v)&&(u[f]=h)}else c&&console.warn(`The option "${_}${f}" wasn't set, because it doesn't accept the type [ ${i.toUpperCase()} ] with the value of "${h}".\r\nAccepted types are: [ ${r.join(", ").toUpperCase()} ].\r\n${o.length>0?`\r\nValid strings are: [ ${o.join(", ")} ].`:""}`);delete d[f]}}),{O:d,m:u}},ct=(t,n,e,o)=>st(t,n,e||{},o||!1);let lt;const{abs:at,round:ut}=Math,dt=(t,n)=>{x(t,n);const e=(o=n)?{w:o.clientWidth,h:o.clientHeight}:$;var o;const r=k(n);return{x:r.h-e.h,y:r.w-e.w}},ft=t=>{let n=!1;b(t,"os-viewport-scrollbar-styled");try{n="none"===J(t,"scrollbar-width")||"none"===window.getComputedStyle(t,"::-webkit-scrollbar").getPropertyValue("display")}catch(e){}return n},vt=(t,n)=>{J(t,{overflowX:"hidden",overflowY:"hidden",direction:"rtl"}),f(t,0);const e=U(t),o=U(n);f(t,-999);const r=U(n);return{i:e.x===o.x,n:o.x!==r.x}},ht=(t,n)=>{b(t,"flexbox-glue");const e=k(t),o=k(n),r=F(o,e);b(t,"flexbox-glue-max");const i=k(t),s=k(n),c=F(s,i);return r&&c},bt=()=>{const t=window.screen.deviceXDPI||0,n=window.screen.logicalXDPI||1;return window.devicePixelRatio||t/n},pt=()=>{const{body:t}=document,n=S('
')[0],e=n.firstChild,o=new Set,r=dt(t,n),i={x:0===r.x,y:0===r.y},s={j:!1,S:r,$:i,A:ft(n),k:vt(n,e),C:ht(n,e),L(t){o.add(t)},T(t){o.delete(t)}};if(d(n,"style"),d(n,"class"),O(n),!i.x||!i.y){let e=A(),i=bt(),s=r;window.addEventListener("resize",()=>{if(o.size){const r=A(),c={w:r.w-e.w,h:r.h-e.h};if(0===c.w&&0===c.h)return;const l={w:at(c.w),h:at(c.h)},a={w:at(ut(r.w/(e.w/100))),h:at(ut(r.h/(e.h/100)))},u=bt(),d=l.w>2&&l.h>2,f=!((t,n)=>{const e=at(t),o=at(n);return!(e===o||e+1===o||e-1===o)})(a.w,a.h),v=u!==i&&i>0;if(d&&f&&v){const e=lt.S=dt(t,n);O(n),s.x===e.x&&s.y===e.y||_(o),s=e}e=r,i=u}})}return s},wt=()=>(lt||(lt=pt()),lt),_t=(t,n,e,o)=>{const{P:r,q:i}=function t(n){const e={P:{},q:{}};return p(B(n),o=>{const r=n[o];if(s(r))e.P[o]=r[1],e.q[o]=r[0];else{const n=t(r);e.P[o]=n.P,e.q[o]=n.q}}),e}(t),c=N({},i,ct(e||{},r,null,!0).m),l=V(n),a=V(c,!0),u=t=>{const n="boolean"==typeof t.F;const e=!0===t.F,r=l(e?null:t.I||(n?null:[]),e),i=a(e?null:t.M,!!t.M||e);(i.g||r.g)&&o(i,r)};return u({F:!0}),{q(t){if(t){const{m:n}=ct(t,r,c,!0);N(c,n),u({M:B(n)})}return c},B:t=>{u({F:!!t})},N:t=>{u({I:t})}}},gt=tt("margin-inline-end"),mt=tt("border-inline-end"),yt=(t,n)=>{const{host:e,viewport:o,content:r}=t,i=[],s=wt(),c=s.$,l=s.A,{q:a,B:u,N:d}=(s.C,gt&&mt||l||c.y,_t({paddingAbsolute:[!1,it.boolean],overflowBehavior:{x:["scroll","visible-hidden visible-scroll scroll hidden"],y:["scroll","visible-hidden visible-scroll scroll hidden"]}},{padding:[()=>((t,n)=>{const e=n||"",o=e+"-top",r=e+"-right",i=e+"-bottom",s=e+"-left",c=J(t,[o,r,i,s]);return{t:Y(c[o]),r:Y(c[r]),b:Y(c[i]),l:Y(c[s])}})(e,"padding"),I]},n,(t,n)=>{const{p:e,v:r}=t.paddingAbsolute,{p:i,v:c}=n.padding;if(r||c){const t={t:0,r:0,b:0,l:0};e||(t.t=-i.t,t.r=-(i.r+i.l),t.b=-(i.b+i.t),t.l=-i.l),l||(t.r-=s.S.y,t.b-=s.S.x),J(o,{top:t.t,left:t.l,"margin-right":t.r,"margin-bottom":t.b})}console.log(t),console.log(n)}));return{q:a,B:u,R:()=>{d("padding")},Y:(t,n)=>{J(r,n?{height:"auto"}:{height:"100%"})},D(){_(i)}}},xt=nt("ResizeObserver"),zt=cancelAnimationFrame,Ot=requestAnimationFrame,jt=t=>J(t,"direction"),St=(t,n,o)=>{const{G:r=!1,J:i=!1}=o||{},s=wt().k,c=S('
')[0],l=c.firstChild,a=t=>{if(r){const t="rtl"===jt(c);f(c,t?s.n?-3333333:s.i?0:3333333:3333333),v(c,3333333)}n(e(t)?t:void 0)},u=[];let d=i?a:null;if(xt){const t=new xt(a);t.observe(l),u.push(()=>t.disconnect())}else{const t=S('
');x(l,t);const n=t[0],e=n.lastChild,o=n.firstChild,r=null==o?void 0:o.firstChild;let s,c=k(l),h=c,b=!1;const p=()=>{f(o,3333333),v(o,3333333),f(e,3333333),v(e,3333333)},w=function(){s=0,b&&(c=h,a())},_=t=>(h=k(l),b=!t||!F(h,c),t&&b&&!s?(zt(s),s=Ot(w)):t||w(),p(),t&&(P(t),E(t)),!1);u.push(T(o,"scroll",_)),u.push(T(e,"scroll",_)),J(r,{width:3333333,height:3333333}),p(),d=i?()=>_():p}if(r){let t;u.push(T(c,"scroll",n=>{const e=jt(c);return e!==t&&(J(l,"rtl"===e?{left:"auto",right:0}:{left:0,right:"auto"}),t=e,a(e)),P(n),E(n),!1}))}return d&&(b(c,"os-size-observer-appear"),u.push(T(c,"animationstart",d))),z(t,c),()=>{_(u),O(c)}},$t=nt("IntersectionObserver"),At=t=>{if(function(t){const n=window.HTMLElement;return!!(c(n)||o(n)?t instanceof n:t&&c(t)&&1===t.nodeType&&e(t.nodeName))}(t)){const n=g(t,"textarea")?j():t,e=j("os-viewport"),o=j("os-content");return x(e,o),x(o,m(t)),x(t,e),b(n,"os-host"),{target:t,host:n,viewport:e,content:o}}const{host:n,viewport:r,content:i}=t;return b(n,"os-host"),b(r,"os-viewport"),b(i,"os-content"),t},kt=(t,n,e)=>{const o=At(t),r=[],{host:i}=o;r.push(yt(o));St(i,t=>{p(r,t?n=>{n.K&&n.K(t)}:t=>{t.R&&t.R()})},{J:!0,G:!0}),((t,n)=>{const e=S('
')[0],o=[];let r=!1;if($t){const i=new $t(t=>{if(t&&t.length>0){const e=t.pop();if(e){const t=e.isIntersecting||e.intersectionRatio>0;t!==r&&(n(!1,t),r=t)}}},{root:t});i.observe(e),o.push(()=>i.disconnect())}else o.push(St(e,()=>{const t=0===k(e).h;t!==r&&(n(!1,t),r=t)}));z(t,e)})(i,(t,n)=>{p(r,e=>{e.Y&&e.Y(t,n)})})};export default()=>[wt(),kt(document.body),S('
fdfhdfgh
')]; \ No newline at end of file +const t=t=>null==t?""+t:Object.prototype.toString.call(t).replace(/^\[object (.+)\]$/,"$1").toLowerCase();function e(t){return"number"==typeof t}function n(t){return"string"==typeof t}function o(t){return"function"==typeof t}function r(t){return void 0===t}function i(t){return null===t}function s(t){return Array.isArray(t)}function c(t){return"object"==typeof t&&!s(t)&&!i(t)}function l(t){const n=!!t&&t.length;return s(t)||!o(t)&&e(n)&&n>-1&&n%1==0}function a(e){if(!e||!c(e)||"object"!==t(e))return!1;let n;const{hasOwnProperty:o}=Object.prototype,i=o.call(e,"constructor"),s=e.constructor&&e.constructor.prototype&&o.call(e.constructor.prototype,"isPrototypeOf");if(e.constructor&&!i&&!s)return!1;for(n in e);return r(n)||o.call(e,n)}function d(t,e,n,o){if(r(o))return n?n[t]:e;n&&(n[t]=o)}const u=(t,e)=>{null==t||t.removeAttribute(e)};function v(t,e){return d("scrollLeft",0,t,e)}function f(t,e){return d("scrollTop",0,t,e)}const h=/[^\x20\t\r\n\f]+/g,p=(t,e)=>{((t,e,o)=>{let r,i=0,s=!1;if(t&&n(e)){const n=e.match(h)||[];for(s=n.length>0;r=n[i++];)s=o(t.classList,r)&&s}})(t,e,(t,e)=>t.add(e))};function b(t,e){if(l(t))for(let n=0;ne(t[n],n,t));return t}const w=t=>{if(Array.from)return Array.from(t);const e=[];return b(t,t=>{e.push(t)}),e},_=t=>{t instanceof Set?t.forEach(t=>t&&t()):b(t,t=>t&&t())},g=(t,e)=>((t,e)=>{if(t){return(Element.prototype.matches||Element.prototype.msMatchesSelector).call(t,e)}return!1})(t,e),m=t=>t?w(t.childNodes):[],y=(t,e,n)=>{if(n){let o,r=e;t&&(l(n)?(o=document.createDocumentFragment(),b(n,t=>{t===r&&(r=t.previousSibling),o.appendChild(t)})):o=n,e&&(r?r!==e&&(r=r.nextSibling):r=t.firstChild),t.insertBefore(o,r))}},x=(t,e)=>{y(t,null,e)},z=(t,e)=>{y(t,t&&t.firstChild,e)},O=t=>{if(l(t))b(w(t),t=>O(t));else if(t){const n=(e=t)?e.parentElement:null;n&&n.removeChild(t)}var e},j=t=>{const e=document.createElement("div");return t&&function(t,e,n){if(r(n))return t?t.getAttribute(e):null;t&&t.setAttribute(e,n)}(e,"class",t),e},S=t=>{const e=j();return e.innerHTML=t.trim(),b(m(e),t=>O(t))},$={w:0,h:0},A=()=>({w:window.innerWidth,h:window.innerHeight}),k=t=>t?{w:t.offsetWidth,h:t.offsetHeight}:$;let q;const L=(t,e,n,o)=>{b(e.split(" "),e=>{t.removeEventListener(e,n,o)})},T=(t,e,n,o)=>{const r=(()=>{if(void 0===q){q=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){q=!0}}))}catch(t){}}return q})(),i=r&&o&&o.o||!1,s=o&&o.s||!1,c=o&&o.u||!1,l=[],a=r?{passive:i,capture:s}:s;return b(e.split(" "),e=>{const o=c?r=>{t.removeEventListener(e,o,s),n&&n(r)}:n;l.push(L.bind(null,t,e,o,s)),t.addEventListener(e,o,a)}),_.bind(0,l)},E=t=>t.stopPropagation(),P=t=>t.preventDefault(),F=(t,e,n)=>{if(t&&e){let o=!0;return b(n,n=>{t[n]!==e[n]&&(o=!1)}),o}return!1},I=(t,e)=>F(t,e,["w","h"]),M=(t,e)=>F(t,e,["t","r","b","l"]),V=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),B=t=>t?Object.keys(t):[];function C(t,e,n,r,c,l,d){const u=[e,n,r,c,l,d];return"object"==typeof t&&!i(t)||o(t)||(t={}),b(u,e=>{b(B(e),n=>{const o=e[n];if(t===o)return!0;const r=s(o);if(o&&(a(o)||r)){const e=t[n];let i=e;r&&!s(e)?i=[]:r||a(e)||(i={}),t[n]=C(i,o)}else t[n]=o})}),t}const N={animationiterationcount:1,columncount:1,fillopacity:1,flexgrow:1,flexshrink:1,fontweight:1,lineheight:1,opacity:1,order:1,orphans:1,widows:1,zindex:1,zoom:1},R=(t,e)=>{const n=e?parseFloat(t):parseInt(t,10);return Number.isNaN(n)?0:n},Y=(t,e,n)=>null!=e?e.getPropertyValue(n):t.style[n],D=(t,n,o)=>{try{t&&void 0!==t.style[n]&&(t.style[n]=((t,n)=>!N[t.toLowerCase()]&&e(n)?n+"px":n)(n,o))}catch(r){}};function G(t,e){const o=n(e);if(s(e)||o){let n=o?"":{};if(t){const r=window.getComputedStyle(t,null);n=o?Y(t,r,e):e.reduce((e,n)=>(e[n]=Y(t,r,n),e),n)}return n}b(B(e),n=>D(t,n,e[n]))}const J={x:0,y:0},K=t=>{const e=t?(t=>t.getBoundingClientRect())(t):0;return e?{x:e.left+window.pageYOffset,y:e.top+window.pageXOffset}:J},U=(t,e)=>{const{v:n,p:o}=e||{};let r,i=o;return(e,o)=>{const s=i,c=t(o,i,r),l=e||(n?!n(s,c):s!==c);return l&&(i=c,r=s),{_:i,g:r,m:l}}},W=t=>t.charAt(0).toUpperCase()+t.slice(1),X=["-webkit-","-moz-","-o-","-ms-"],H=["WebKit","Moz","O","MS","webkit","moz","o","ms"],Q={},Z={},tt=t=>{let e=Z[t];if(V(Z,t))return e;const n=W(t),o=j().style;return b(X,r=>{const i=r.replace(/-/g,""),s=[t,r+t,i+n,W(i)+n];return e=s.find(t=>void 0!==o[t]),!e}),Z[t]=e,e},et=t=>{let e=Q[t]||window[t];return V(Q,t)||(b(H,n=>(e=e||window[n+W(t)],!e)),Q[t]=e),e};et("ResizeObserver");var nt=function(t,e,n){return t(n={path:e,exports:{},require:function(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==e&&n.path)}},n.exports),n.exports}((function(t){function e(){return t.exports=e=Object.assign||function(t){for(var e=1;e(t[e]=rt[0]+e+rt[1],t),{}),st=(e,o,i,c,l)=>{const d={},u=nt({},e);return b(B(o).filter(t=>V(e,t)),v=>{const f=r(i[v])?{}:i[v],h=e[v],p=o[v],w=a(p),_=l?l+".":"";if(w&&a(h)){const t=st(h,p,f,c,_+v);d[v]=t.O,u[v]=t.j,b([u,d],t=>{(function(t){for(const e in t)return!1;return!0})(t[v])&&delete t[v]})}else if(!w){let e=!1;const o=[],r=[],i=t(h);if(b(s(p)?p:[p],t=>{let s;b(it,(e,n)=>{e===t&&(s=n)});const c=void 0===s;if(c&&n(h)){const n=t.split(" ");e=!!n.find(t=>t===h),o.push(...n)}else e=it[i]===t;return r.push(c?it.string:s),!e}),e){(s(h)||a(h)?ot(h)!==ot(f):h!==f)&&(d[v]=h)}else c&&console.warn(`The option "${_}${v}" wasn't set, because it doesn't accept the type [ ${i.toUpperCase()} ] with the value of "${h}".\r\nAccepted types are: [ ${r.join(", ").toUpperCase()} ].\r\n${o.length>0?`\r\nValid strings are: [ ${o.join(", ")} ].`:""}`);delete u[v]}}),{j:u,O:d}},ct=(t,e,n,o)=>st(t,e,n||{},o||!1);let lt;const{abs:at,round:dt}=Math,ut=(t,e)=>{x(t,e);const n=(o=e)?{w:o.clientWidth,h:o.clientHeight}:$;var o;const r=k(e);return{x:r.h-n.h,y:r.w-n.w}},vt=t=>{let e=!1;p(t,"os-viewport-scrollbar-styled");try{e="none"===G(t,"scrollbar-width")||"none"===window.getComputedStyle(t,"::-webkit-scrollbar").getPropertyValue("display")}catch(n){}return e},ft=(t,e)=>{G(t,{overflowX:"hidden",overflowY:"hidden",direction:"rtl"}),v(t,0);const n=K(t),o=K(e);v(t,-999);const r=K(e);return{i:n.x===o.x,n:o.x!==r.x}},ht=(t,e)=>{p(t,"flexbox-glue");const n=k(t),o=k(e),r=I(o,n);p(t,"flexbox-glue-max");const i=k(t),s=k(e),c=I(s,i);return r&&c},pt=()=>{const t=window.screen.deviceXDPI||0,e=window.screen.logicalXDPI||1;return window.devicePixelRatio||t/e},bt=()=>{const{body:t}=document,e=S('
')[0],n=e.firstChild,o=new Set,r=ut(t,e),i={x:0===r.x,y:0===r.y},s={S:!1,$:r,A:i,k:vt(e),q:ft(e,n),L:ht(e,n),T(t){o.add(t)},P(t){o.delete(t)}};if(u(e,"style"),u(e,"class"),O(e),!i.x||!i.y){let n=A(),i=pt(),s=r;window.addEventListener("resize",()=>{if(o.size){const r=A(),c={w:r.w-n.w,h:r.h-n.h};if(0===c.w&&0===c.h)return;const l={w:at(c.w),h:at(c.h)},a={w:at(dt(r.w/(n.w/100))),h:at(dt(r.h/(n.h/100)))},d=pt(),u=l.w>2&&l.h>2,v=!((t,e)=>{const n=at(t),o=at(e);return!(n===o||n+1===o||n-1===o)})(a.w,a.h),f=d!==i&&i>0;if(u&&v&&f){const n=lt.$=ut(t,e);O(e),s.x===n.x&&s.y===n.y||_(o),s=n}n=r,i=d}})}return s},wt=()=>(lt||(lt=bt()),lt),_t=(t,e)=>t&&e.split(".").reduce((t,e)=>t&&V(t,e)?t[e]:void 0,t),gt=(t,e,n)=>{const{F:o,I:r}=function t(e){const n={F:{},I:{}};return b(B(e),o=>{const r=e[o];if(s(r))n.F[o]=r[1],n.I[o]=r[0];else{const e=t(r);n.F[o]=e.F,n.I[o]=e.I}}),n}(t),i=C({},r,ct(e||{},o,null,!0).O),c=t=>{const{M:e,V:o}=t;n(!!e,t=>({_:_t(i,t),m:e||void 0!==_t(o,t)}))};return c({M:!0}),{I(t){if(t){const{O:e}=ct(t,o,i,!0);C(i,e),c({V:e})}return i},B:t=>{c({M:t})}}},mt={paddingAbsolute:[!1,it.boolean],overflowBehavior:{x:["scroll","visible-hidden visible-scroll scroll hidden"],y:["scroll","visible-hidden visible-scroll scroll hidden"]}},yt=tt("margin-inline-end"),xt=tt("border-inline-end"),zt=(t,e)=>{const{host:n,padding:o,viewport:r,content:i}=t,s=[],c=wt(),l=c.A,a=c.k,d=(c.L,yt&&xt||a||l.y,U(()=>((t,e)=>{const n=e||"",o=n+"-top",r=n+"-right",i=n+"-bottom",s=n+"-left",c=G(t,[o,r,i,s]);return{t:R(c[o]),r:R(c[r]),b:R(c[i]),l:R(c[s])}})(n,"padding"),{v:M})),{I:u,B:v}=gt(mt,e,(t,e)=>{const{_:n,m:r}=e("paddingAbsolute"),{_:i,m:s}=d(t);if(r||s){const t={t:0,r:0,b:0,l:0};n||(t.t=-i.t,t.r=-(i.r+i.l),t.b=-(i.b+i.t),t.l=-i.l),a||(t.r-=c.$.y,t.b-=c.$.x),G(o,{top:t.t,left:t.l,"margin-right":t.r,"margin-bottom":t.b,"max-width":`calc(100% + ${-1*t.r}px)`})}});return{I:u,B:v,C:()=>{v()},N:(t,e)=>{const{m:n,_:o}=e;n&&G(i,{height:o?"auto":"100%"})},R(){_(s)}}},Ot=et("ResizeObserver"),jt=cancelAnimationFrame,St=requestAnimationFrame,$t=t=>G(t,"direction"),At=(t,e,o)=>{const{Y:r=!1,D:i=!1}=o||{},s=wt().q,c=S('
')[0],l=c.firstChild,a=t=>{if(r){const t="rtl"===$t(c);v(c,t?s.n?-3333333:s.i?0:3333333:3333333),f(c,3333333)}e(n((t||{})._)?t:void 0)},d=[];let u=i?a:null;if(Ot){const t=new Ot(a);t.observe(l),d.push(()=>t.disconnect())}else{const t=S('
');x(l,t),p(l,"os-size-observer-listener-scroll");const e=t[0],n=e.lastChild,o=e.firstChild,r=null==o?void 0:o.firstChild;let s,c=k(l),h=c,b=!1;const w=()=>{v(o,3333333),f(o,3333333),v(n,3333333),f(n,3333333)},_=()=>{s=0,b&&(c=h,a())},g=t=>(h=k(l),b=!t||!I(h,c),t&&b&&!s?(jt(s),s=St(_)):t||_(),w(),t&&(P(t),E(t)),!1);d.push(T(o,"scroll",g)),d.push(T(n,"scroll",g)),G(r,{width:3333333,height:3333333}),w(),u=i?()=>g():w}if(r){const t=U(()=>$t(c));d.push(T(c,"scroll",e=>{const n=t(),{_:o,m:r}=n;return r&&(G(l,"rtl"===o?{left:"auto",right:0}:{left:0,right:"auto"}),a(n)),P(e),E(e),!1}))}return u&&(p(c,"os-size-observer-appear"),d.push(T(c,"animationstart",u))),z(t,c),()=>{_(d),O(c)}},kt=et("IntersectionObserver"),qt=t=>{if(function(t){const e=window.HTMLElement;return!!(c(e)||o(e)?t instanceof e:t&&c(t)&&1===t.nodeType&&n(t.nodeName))}(t)){const e=g(t,"textarea")?j():t,n=j("os-padding"),o=j("os-viewport"),r=j("os-content");return x(n,o),x(o,r),x(r,m(t)),x(t,n),p(e,"os-host"),{target:t,host:e,padding:n,viewport:o,content:r}}const{host:e,padding:r,viewport:i,content:s}=t;return p(e,"os-host"),p(r,"os-padding"),p(i,"os-viewport"),p(s,"os-content"),t},Lt=(t,e,n)=>{const o=qt(t),r=[],{host:i}=o;r.push(zt(o));At(i,t=>{b(r,t?e=>{e.G&&e.G(t)}:t=>{t.C&&t.C()})},{D:!0,Y:!0}),((t,e)=>{const n=S('
')[0],o=[],r=U(t=>0===t.h||t.isIntersecting||t.intersectionRatio>0,{p:!1});if(kt){const i=new kt(t=>{if(t&&t.length>0){const n=t.pop();if(n){const t=r(0,n);t.m&&e(!1,t)}}},{root:t});i.observe(n),o.push(()=>i.disconnect())}else o.push(At(n,()=>{const t=k(n),o=r(0,t);o.m&&e(!1,o)}));z(t,n)})(i,(t,e)=>{b(r,n=>{n.N&&n.N(t,e)})})};export default()=>[wt(),Lt(document.body),S('
fdfhdfgh
')]; \ No newline at end of file diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.js b/packages/overlayscrollbars/dist/overlayscrollbars.js index fbe12cb..b672c93 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.js @@ -21,9 +21,6 @@ function isString(obj) { return typeof obj === 'string'; } - function isBoolean(obj) { - return typeof obj === 'boolean'; - } function isFunction(obj) { return typeof obj === 'function'; } @@ -487,49 +484,32 @@ : zeroObj$1; }; - function createCache(cacheUpdateInfo, isReference) { - var cache = {}; - var allProps = keys(cacheUpdateInfo); - each(allProps, function (prop) { - cache[prop] = { - _changed: false, - _value: isReference ? cacheUpdateInfo[prop] : undefined, + var createCache = function createCache(update, options) { + var _ref = options || {}, + _equal = _ref._equal, + _initialValue = _ref._initialValue; + + var _value = _initialValue; + + var _previous; + + return function (force, context) { + var prev = _value; + var newVal = update(context, _value, _previous); + var changed = force || (_equal ? !_equal(prev, newVal) : prev !== newVal); + + if (changed) { + _value = newVal; + _previous = prev; + } + + return { + _value: _value, + _previous: _previous, + _changed: changed, }; - }); - - var updateCacheProp = function updateCacheProp(prop, value, equal) { - var curr = cache[prop]._value; - cache[prop]._value = value; - cache[prop]._previous = curr; - cache[prop]._changed = equal ? !equal(curr, value) : curr !== value; }; - - var flush = function flush(props, force) { - var result = assignDeep({}, cache, { - _anythingChanged: false, - }); - each(props, function (prop) { - var changed = force || cache[prop]._changed; - result._anythingChanged = result._anythingChanged || changed; - result[prop]._changed = changed; - cache[prop]._changed = false; - }); - return result; - }; - - return function (propsToUpdate, force) { - var finalPropsToUpdate = (isString(propsToUpdate) ? [propsToUpdate] : propsToUpdate) || allProps; - each(finalPropsToUpdate, function (prop) { - var cacheVal = cache[prop]; - var curr = cacheUpdateInfo[prop]; - var arr = isReference ? false : isArray(curr); - var value = arr ? curr[0] : curr; - var equal = arr ? curr[1] : null; - updateCacheProp(prop, isReference ? value : value(cacheVal._value, cacheVal._previous), equal); - }); - return flush(finalPropsToUpdate, force); - }; - } + }; var firstLetterToUpper = function firstLetterToUpper(str) { return str.charAt(0).toUpperCase() + str.slice(1); @@ -893,24 +873,34 @@ return environmentInstance; }; - var createLifecycleBase = function createLifecycleBase(defaultOptionsWithTemplate, cacheUpdateInfo, initialOptions, updateFunction) { + var getPropByPath = function getPropByPath(obj, path) { + return ( + obj && + path.split('.').reduce(function (o, prop) { + return o && hasOwnProperty(o, prop) ? o[prop] : undefined; + }, obj) + ); + }; + + var createLifecycleBase = function createLifecycleBase(defaultOptionsWithTemplate, initialOptions, updateFunction) { var _transformOptions = transformOptions(defaultOptionsWithTemplate), optionsTemplate = _transformOptions._template, defaultOptions = _transformOptions._options; var options = assignDeep({}, defaultOptions, validateOptions(initialOptions || {}, optionsTemplate, null, true)._validated); - var cacheChange = createCache(cacheUpdateInfo); - var cacheOptions = createCache(options, true); var update = function update(hints) { - var hasForce = isBoolean(hints._force); - var force = hints._force === true; - var changedCache = cacheChange(force ? null : hints._changedCache || (hasForce ? null : []), force); - var changedOptions = cacheOptions(force ? null : hints._changedOptions, !!hints._changedOptions || force); + var _force = hints._force, + _changedOptions = hints._changedOptions; - if (changedOptions._anythingChanged || changedCache._anythingChanged) { - updateFunction(changedOptions, changedCache); - } + var checkOption = function checkOption(path) { + return { + _value: getPropByPath(options, path), + _changed: _force || getPropByPath(_changedOptions, path) !== undefined, + }; + }; + + updateFunction(!!_force, checkOption); }; update({ @@ -920,34 +910,37 @@ _options: function _options(newOptions) { if (newOptions) { var _validateOptions = validateOptions(newOptions, optionsTemplate, options, true), - changedOptions = _validateOptions._validated; + _changedOptions = _validateOptions._validated; - assignDeep(options, changedOptions); + assignDeep(options, _changedOptions); update({ - _changedOptions: keys(changedOptions), + _changedOptions: _changedOptions, }); } return options; }, - _update: function _update(force) { + _update: function _update(_force) { update({ - _force: !!force, - }); - }, - _updateCache: function _updateCache(cachePropsToUpdate) { - update({ - _changedCache: cachePropsToUpdate, + _force: _force, }); }, }; }; var overflowBehaviorAllowedValues = 'visible-hidden visible-scroll scroll hidden'; + var defaultOptionsWithTemplate = { + paddingAbsolute: [false, optionsTemplateTypes.boolean], + overflowBehavior: { + x: ['scroll', overflowBehaviorAllowedValues], + y: ['scroll', overflowBehaviorAllowedValues], + }, + }; var cssMarginEnd = cssProperty('margin-inline-end'); var cssBorderEnd = cssProperty('border-inline-end'); var createStructureLifecycle = function createStructureLifecycle(target, initialOptions) { var host = target.host, + paddingElm = target.padding, viewport = target.viewport, content = target.content; var destructFns = []; @@ -956,80 +949,67 @@ var supportsScrollbarStyling = env._nativeScrollbarStyling; var supportFlexboxGlue = env._flexboxGlue; var directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y; + var updatePaddingCache = createCache( + function () { + return topRightBottomLeft(host, 'padding'); + }, + { + _equal: equalTRBL, + } + ); - var _createLifecycleBase = createLifecycleBase( - { - paddingAbsolute: [false, optionsTemplateTypes.boolean], - overflowBehavior: { - x: ['scroll', overflowBehaviorAllowedValues], - y: ['scroll', overflowBehaviorAllowedValues], - }, - }, - { - padding: [ - function () { - return topRightBottomLeft(host, 'padding'); - }, - equalTRBL, - ], - }, - initialOptions, - function (options, cache) { - var _options$paddingAbsol = options.paddingAbsolute, - paddingAbsolute = _options$paddingAbsol._value, - paddingAbsoluteChanged = _options$paddingAbsol._changed; - var _cache$padding = cache.padding, - padding = _cache$padding._value, - paddingChanged = _cache$padding._changed; + var _createLifecycleBase = createLifecycleBase(defaultOptionsWithTemplate, initialOptions, function (force, checkOption) { + var _checkOption = checkOption('paddingAbsolute'), + paddingAbsolute = _checkOption._value, + paddingAbsoluteChanged = _checkOption._changed; - if (paddingAbsoluteChanged || paddingChanged) { - var paddingStyle = { - t: 0, - r: 0, - b: 0, - l: 0, - }; + var _updatePaddingCache = updatePaddingCache(force), + padding = _updatePaddingCache._value, + paddingChanged = _updatePaddingCache._changed; - if (!paddingAbsolute) { - paddingStyle.t = -padding.t; - paddingStyle.r = -(padding.r + padding.l); - paddingStyle.b = -(padding.b + padding.t); - paddingStyle.l = -padding.l; - } + if (paddingAbsoluteChanged || paddingChanged) { + var paddingStyle = { + t: 0, + r: 0, + b: 0, + l: 0, + }; - if (!supportsScrollbarStyling) { - paddingStyle.r -= env._nativeScrollbarSize.y; - paddingStyle.b -= env._nativeScrollbarSize.x; - } - - style(viewport, { - top: paddingStyle.t, - left: paddingStyle.l, - 'margin-right': paddingStyle.r, - 'margin-bottom': paddingStyle.b, - }); + if (!paddingAbsolute) { + paddingStyle.t = -padding.t; + paddingStyle.r = -(padding.r + padding.l); + paddingStyle.b = -(padding.b + padding.t); + paddingStyle.l = -padding.l; } - console.log(options); - console.log(cache); + if (!supportsScrollbarStyling) { + paddingStyle.r -= env._nativeScrollbarSize.y; + paddingStyle.b -= env._nativeScrollbarSize.x; + } + + style(paddingElm, { + top: paddingStyle.t, + left: paddingStyle.l, + 'margin-right': paddingStyle.r, + 'margin-bottom': paddingStyle.b, + 'max-width': 'calc(100% + ' + paddingStyle.r * -1 + 'px)', + }); } - ), + }), _options = _createLifecycleBase._options, - _update = _createLifecycleBase._update, - _updateCache = _createLifecycleBase._updateCache; + _update = _createLifecycleBase._update; var onSizeChanged = function onSizeChanged() { - _updateCache('padding'); + _update(); }; - var onTrinsicChanged = function onTrinsicChanged(widthIntrinsic, heightIntrinsic) { - if (heightIntrinsic) { + var onTrinsicChanged = function onTrinsicChanged(widthIntrinsic, heightIntrinsicCache) { + var _changed = heightIntrinsicCache._changed, + _value = heightIntrinsicCache._value; + + if (_changed) { style(content, { - height: 'auto', - }); - } else { - style(content, { - height: '100%', + height: _value ? 'auto' : '100%', }); } }; @@ -1052,6 +1032,7 @@ var classNameSizeObserver = 'os-size-observer'; var classNameSizeObserverAppear = classNameSizeObserver + '-appear'; var classNameSizeObserverListener = classNameSizeObserver + '-listener'; + var classNameSizeObserverListenerScroll = classNameSizeObserverListener + '-scroll'; var classNameSizeObserverListenerItem = classNameSizeObserverListener + '-item'; var classNameSizeObserverListenerItemFinal = classNameSizeObserverListenerItem + '-final'; var cAF = cancelAnimationFrame; @@ -1074,14 +1055,14 @@ var sizeObserver = baseElements[0]; var listenerElement = sizeObserver.firstChild; - var onSizeChangedCallbackProxy = function onSizeChangedCallbackProxy(dir) { + var onSizeChangedCallbackProxy = function onSizeChangedCallbackProxy(directionCache) { if (direction) { var rtl = getDirection(sizeObserver) === 'rtl'; scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount); scrollTop(sizeObserver, scrollAmount); } - onSizeChangedCallback(isString(dir) ? dir : undefined); + onSizeChangedCallback(isString((directionCache || {})._value) ? directionCache : undefined); }; var offListeners = []; @@ -1108,6 +1089,7 @@ '" style="width: 200%; height: 200%">' ); appendChildren(listenerElement, observerElementChildren); + addClass(listenerElement, classNameSizeObserverListenerScroll); var observerElementChildrenRoot = observerElementChildren[0]; var shrinkElement = observerElementChildrenRoot.lastChild; var expandElement = observerElementChildrenRoot.firstChild; @@ -1127,12 +1109,10 @@ var onResized = function onResized() { rAFId = 0; - if (!isDirty) { - return; + if (isDirty) { + cacheSize = currSize; + onSizeChangedCallbackProxy(); } - - cacheSize = currSize; - onSizeChangedCallbackProxy(); }; var onScroll = function onScroll(scrollEvent) { @@ -1171,14 +1151,17 @@ } if (direction) { - var dirCache; + var updateDirectionCache = createCache(function () { + return getDirection(sizeObserver); + }); offListeners.push( on(sizeObserver, scrollEventName, function (event) { - var dir = getDirection(sizeObserver); - var changed = dir !== dirCache; + var directionCache = updateDirectionCache(); + var _value = directionCache._value, + _changed = directionCache._changed; - if (changed) { - if (dir === 'rtl') { + if (_changed) { + if (_value === 'rtl') { style(listenerElement, { left: 'auto', right: 0, @@ -1190,8 +1173,7 @@ }); } - dirCache = dir; - onSizeChangedCallbackProxy(dir); + onSizeChangedCallbackProxy(directionCache); } preventDefault(event); @@ -1218,7 +1200,14 @@ var createTrinsicObserver = function createTrinsicObserver(target, onTrinsicChangedCallback) { var trinsicObserver = createDOM('
')[0]; var offListeners = []; - var heightIntrinsic = false; + var updateHeightIntrinsicCache = createCache( + function (ioEntryOrSize) { + return ioEntryOrSize.h === 0 || ioEntryOrSize.isIntersecting || ioEntryOrSize.intersectionRatio > 0; + }, + { + _initialValue: false, + } + ); if (IntersectionObserverConstructor) { var intersectionObserverInstance = new IntersectionObserverConstructor( @@ -1227,11 +1216,10 @@ var last = entries.pop(); if (last) { - var newHeightIntrinsic = last.isIntersecting || last.intersectionRatio > 0; + var heightIntrinsicCache = updateHeightIntrinsicCache(0, last); - if (newHeightIntrinsic !== heightIntrinsic) { - onTrinsicChangedCallback(false, newHeightIntrinsic); - heightIntrinsic = newHeightIntrinsic; + if (heightIntrinsicCache._changed) { + onTrinsicChangedCallback(false, heightIntrinsicCache); } } } @@ -1248,11 +1236,10 @@ offListeners.push( createSizeObserver(trinsicObserver, function () { var newSize = offsetSize(trinsicObserver); - var newHeightIntrinsic = newSize.h === 0; + var heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize); - if (newHeightIntrinsic !== heightIntrinsic) { - onTrinsicChangedCallback(false, newHeightIntrinsic); - heightIntrinsic = newHeightIntrinsic; + if (heightIntrinsicCache._changed) { + onTrinsicChangedCallback(false, heightIntrinsicCache); } }) ); @@ -1266,6 +1253,7 @@ }; var classNameHost = 'os-host'; + var classNamePadding = 'os-padding'; var classNameViewport = 'os-viewport'; var classNameContent = 'os-content'; @@ -1275,26 +1263,32 @@ var _host = isTextarea ? createDiv() : target; + var _padding = createDiv(classNamePadding); + var _viewport = createDiv(classNameViewport); var _content = createDiv(classNameContent); + appendChildren(_padding, _viewport); appendChildren(_viewport, _content); appendChildren(_content, contents(target)); - appendChildren(target, _viewport); + appendChildren(target, _padding); addClass(_host, classNameHost); return { target: target, host: _host, + padding: _padding, viewport: _viewport, content: _content, }; } var host = target.host, + padding = target.padding, viewport = target.viewport, content = target.content; addClass(host, classNameHost); + addClass(padding, classNamePadding); addClass(viewport, classNameViewport); addClass(content, classNameContent); return target; @@ -1306,10 +1300,10 @@ var host = osTarget.host; lifecycles.push(createStructureLifecycle(osTarget)); - var onSizeChanged = function onSizeChanged(direction) { - if (direction) { + var onSizeChanged = function onSizeChanged(directionCache) { + if (directionCache) { each(lifecycles, function (lifecycle) { - lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(direction); + lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(directionCache); }); } else { each(lifecycles, function (lifecycle) { @@ -1318,9 +1312,9 @@ } }; - var onTrinsicChanged = function onTrinsicChanged(widthIntrinsic, heightIntrinsic) { + var onTrinsicChanged = function onTrinsicChanged(widthIntrinsic, heightIntrinsicCache) { each(lifecycles, function (lifecycle) { - lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsic); + lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsicCache); }); }; diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.js.map b/packages/overlayscrollbars/dist/overlayscrollbars.js.map index b20967c..516ac48 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.js.map +++ b/packages/overlayscrollbars/dist/overlayscrollbars.js.map @@ -1 +1 @@ -{"version":3,"file":"overlayscrollbars.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/dom/events.ts","../src/support/utils/equal.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../src/support/cache/cache.ts","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/support/options/transformation.ts","../src/environment/environment.ts","../src/lifecycles/lifecycleBase.ts","../src/lifecycles/structureLifecycle.ts","../src/observers/sizeObserver.ts","../src/observers/trinsicObserver.ts","../src/overlayscrollbars/overlayscrollbars.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype RunEachItem = ((...args: any) => any | any[]) | null | undefined;\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Calls all functions in the passed array/set of functions.\r\n * @param arr The array filled with function which shall be called.\r\n */\r\nexport const runEach = (arr: ArrayLike | Set): void => {\r\n if (arr instanceof Set) {\r\n arr.forEach((fn) => fn && fn());\r\n } else {\r\n each(arr, (fn) => fn && fn());\r\n }\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst matches = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const fn = Element.prototype.matches || Element.prototype.msMatchesSelector;\r\n return fn.call(elm, selector);\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => matches(elm, selector);\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (matches(child, selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { attr } from 'support/dom/attribute';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (classNames?: string): HTMLDivElement => {\r\n const div = document.createElement('div');\r\n if (classNames) {\r\n attr(div, 'class', classNames);\r\n }\r\n return div;\r\n};\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","export interface WH {\r\n w: T;\r\n h: T;\r\n}\r\n\r\nconst elementHasDimensions = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n\r\n/**\r\n * Determines whether the passed element has any dimensions.\r\n * @param elm The element.\r\n */\r\nexport const hasDimensions = (elm: HTMLElement | null): boolean => (elm ? elementHasDimensions(elm as HTMLElement) : false);\r\n","import { each, runEach } from 'support/utils/array';\r\n\r\nlet passiveEventsSupport: boolean;\r\nconst supportPassiveEvents = (): boolean => {\r\n if (passiveEventsSupport === undefined) {\r\n passiveEventsSupport = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n passiveEventsSupport = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n }\r\n return passiveEventsSupport;\r\n};\r\n\r\nexport interface OnOptions {\r\n _capture?: boolean;\r\n _passive?: boolean;\r\n _once?: boolean;\r\n}\r\n\r\n/**\r\n * Removes the passed event listener for the passed events with the passed options.\r\n * @param target The element from which the listener shall be removed.\r\n * @param eventNames The eventsnames for which the listener shall be removed.\r\n * @param listener The listener which shall be removed.\r\n * @param capture The options of the removed listener.\r\n */\r\nexport const off = (target: EventTarget, eventNames: string, listener: EventListener, capture?: boolean): void => {\r\n each(eventNames.split(' '), (eventName) => {\r\n target.removeEventListener(eventName, listener, capture);\r\n });\r\n};\r\n\r\n/**\r\n * Adds the passed event listener for the passed eventnames with the passed options.\r\n * @param target The element to which the listener shall be added.\r\n * @param eventNames The eventsnames for which the listener shall be called.\r\n * @param listener The listener which is called on the eventnames.\r\n * @param options The options of the added listener.\r\n */\r\nexport const on = (target: EventTarget, eventNames: string, listener: EventListener, options?: OnOptions): (() => void) => {\r\n const doSupportPassiveEvents = supportPassiveEvents();\r\n const passive = (doSupportPassiveEvents && options && options._passive) || false;\r\n const capture = (options && options._capture) || false;\r\n const once = (options && options._once) || false;\r\n const offListeners: (() => void)[] = [];\r\n const nativeOptions: AddEventListenerOptions | boolean = doSupportPassiveEvents\r\n ? {\r\n passive,\r\n capture,\r\n }\r\n : capture;\r\n\r\n each(eventNames.split(' '), (eventName) => {\r\n const finalListener = once\r\n ? (evt: Event) => {\r\n target.removeEventListener(eventName, finalListener, capture);\r\n listener && listener(evt);\r\n }\r\n : listener;\r\n\r\n offListeners.push(off.bind(null, target, eventName, finalListener, capture));\r\n target.addEventListener(eventName, finalListener, nativeOptions);\r\n });\r\n\r\n return runEach.bind(0, offListeners);\r\n};\r\n\r\n/**\r\n * Shorthand for the stopPropagation event Method.\r\n * @param evt The event of which the stopPropagation method shall be called.\r\n */\r\nexport const stopPropagation = (evt: Event) => evt.stopPropagation();\r\n\r\n/**\r\n * Shorthand for the preventDefault event Method.\r\n * @param evt The event of which the preventDefault method shall be called.\r\n */\r\nexport const preventDefault = (evt: Event) => evt.preventDefault();\r\n","import { each } from 'support/utils/array';\r\nimport { WH, XY, TRBL } from 'support/dom';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Compares two objects and returns true if all values of the passed prop names are identical, false otherwise or if one of the two object is falsy.\r\n * @param a Object a.\r\n * @param b Object b.\r\n * @param props The props which shall be compared.\r\n */\r\nexport const equal = (a: T | undefined, b: T | undefined, props: Array): boolean => {\r\n if (a && b) {\r\n let result = true;\r\n each(props, (prop) => {\r\n if (a[prop] !== b[prop]) {\r\n result = false;\r\n }\r\n });\r\n return result;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalWH = (a?: WH, b?: WH) => equal(a, b, ['w', 'h']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalXY = (a?: XY, b?: XY) => equal(a, b, ['x', 'y']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalTRBL = (a?: TRBL, b?: TRBL) => equal(a, b, ['t', 'r', 'b', 'l']);\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\nexport interface TRBL {\r\n t: number;\r\n r: number;\r\n b: number;\r\n l: number;\r\n}\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst parseToZeroOrNumber = (value: string, toFloat?: boolean): number => {\r\n /* istanbul ignore next */\r\n const num = toFloat ? parseFloat(value) : parseInt(value, 10);\r\n /* istanbul ignore next */\r\n return Number.isNaN(num) ? 0 : num;\r\n};\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n\r\n/**\r\n * Returns a top\r\n * @param elm\r\n * @param property\r\n */\r\nexport const topRightBottomLeft = (elm: HTMLElement | null, property?: string): TRBL => {\r\n const finalProp = property || '';\r\n const top = `${finalProp}-top`;\r\n const right = `${finalProp}-right`;\r\n const bottom = `${finalProp}-bottom`;\r\n const left = `${finalProp}-left`;\r\n const result = style(elm, [top, right, bottom, left]);\r\n return {\r\n t: parseToZeroOrNumber(result[top]),\r\n r: parseToZeroOrNumber(result[right]),\r\n b: parseToZeroOrNumber(result[bottom]),\r\n l: parseToZeroOrNumber(result[left]),\r\n };\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\n\r\nexport interface XY {\r\n x: T;\r\n y: T;\r\n}\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","import { isArray, isString } from 'support/utils/types';\r\nimport { assignDeep, keys } from 'support/utils/object';\r\nimport { each } from 'support/utils/array';\r\n\r\ntype UpdateCacheProp =

(prop: P, value: T[P], compare: EqualCachePropFunction | null) => void;\r\n\r\ntype UpdateCachePropFunction = (current?: T[P], previous?: T[P]) => T[P];\r\n\r\ntype EqualCachePropFunction = (a?: T[P], b?: T[P]) => boolean;\r\n\r\nexport interface CacheEntry {\r\n _value?: T;\r\n _previous?: T;\r\n _changed: boolean;\r\n}\r\n\r\nexport type Cache = {\r\n [P in keyof T]: CacheEntry;\r\n};\r\n\r\nexport type CacheUpdated = Cache & { _anythingChanged: boolean };\r\n\r\nexport type CachePropsToUpdate = Array | keyof T;\r\n\r\nexport type CacheUpdate = (propsToUpdate?: CachePropsToUpdate | null, force?: boolean) => CacheUpdated;\r\n\r\nexport type CacheUpdateInfo = {\r\n [P in keyof T]: UpdateCachePropFunction | [UpdateCachePropFunction, EqualCachePropFunction];\r\n};\r\n\r\n/**\r\n * Creates a internally managed generic cache which can be updated by the returned function.\r\n * @param cacheUpdateInfo A object which accepts a function or a tuple of functions as values for its properties.\r\n * {\r\n * name: updateFn,\r\n * // or\r\n * name: [updateFn, equalFn]\r\n * }\r\n * The first function is the update function (updateFn) which is executed when this cache prop shall be updated.\r\n * Two params are passed, the first one is the current cache value and the second one is the previous cache value.\r\n *\r\n * The second function is the equal function (equalFn) which is also executed when this cache prop shall be updated,\r\n * but returns a boolean which indicates whether the current value and the new updated value are equal.\r\n * If no equal function is passed a shallow comparison is carried out between the values.\r\n *\r\n * @returns A function which can be called with wither one ar an array of properties which shall be updated. Optionally it can be called with the force param.\r\n * This function returns a object which represents the cache and its state at the time of updating (changed to previous value, current value and previous value).\r\n */\r\nexport function createCache(cacheUpdateInfo: CacheUpdateInfo): CacheUpdate;\r\nexport function createCache(referenceObj: T, isReference: true): CacheUpdate;\r\nexport function createCache(cacheUpdateInfo: CacheUpdateInfo | T, isReference?: true): CacheUpdate {\r\n const cache: Cache = {} as any;\r\n const allProps: Array = keys(cacheUpdateInfo) as Array;\r\n\r\n each(allProps, (prop) => {\r\n cache[prop] = { _changed: false, _value: isReference ? cacheUpdateInfo[prop] : undefined } as any;\r\n });\r\n\r\n const updateCacheProp: UpdateCacheProp = (prop, value, equal): void => {\r\n const curr = cache[prop]._value;\r\n\r\n cache[prop]._value = value;\r\n cache[prop]._previous = curr;\r\n cache[prop]._changed = equal ? !equal(curr, value) : curr !== value;\r\n };\r\n\r\n const flush = (props: Array, force?: boolean): CacheUpdated => {\r\n const result: CacheUpdated = assignDeep({}, cache, { _anythingChanged: false });\r\n\r\n each(props, (prop: keyof T) => {\r\n const changed = force || cache[prop]._changed;\r\n result._anythingChanged = result._anythingChanged || changed;\r\n\r\n result[prop]._changed = changed;\r\n cache[prop]._changed = false;\r\n });\r\n\r\n return result;\r\n };\r\n\r\n return (propsToUpdate, force) => {\r\n const finalPropsToUpdate: Array =\r\n (isString(propsToUpdate) ? ([propsToUpdate] as Array) : (propsToUpdate as Array)) || allProps;\r\n each(finalPropsToUpdate, (prop) => {\r\n const cacheVal = cache[prop];\r\n const curr = cacheUpdateInfo[prop];\r\n\r\n const arr = isReference ? false : isArray(curr);\r\n const value = arr ? curr[0] : curr;\r\n const equal = arr ? curr[1] : null;\r\n updateCacheProp(prop, isReference ? value : value(cacheVal._value, cacheVal._previous), equal);\r\n });\r\n return flush(finalPropsToUpdate, force);\r\n };\r\n}\r\n","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidationResult, OptionsValidated } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: T,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidationResult => {\r\n const validatedOptions: OptionsValidated = {};\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult._validated as any;\r\n optionsCopy[prop] = validatedResult._foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n let typeString: string | undefined;\r\n each(optionsTemplateTypes, (value: string, key: string) => {\r\n if (value === currTemplateType) {\r\n typeString = key;\r\n }\r\n });\r\n const isEnumString = typeString === undefined;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : typeString!);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n _foreign: optionsCopy,\r\n _validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validateOptions = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: T | null,\r\n doWriteErrors?: boolean\r\n): OptionsValidationResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false);\r\n};\r\n\r\nexport { validateOptions, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import { OptionsTemplate, OptionsWithOptionsTemplate, OptionsTemplateTypes } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\nimport { isArray } from 'support/utils/types';\r\nimport { each, keys } from 'support/utils';\r\n\r\nexport interface OptionsWithOptionsTemplateTransformation> {\r\n _template: OptionsTemplate;\r\n _options: T;\r\n}\r\n\r\n/**\r\n * Transforms the given OptionsWithOptionsTemplate object to its corresponding generic (T) Object or its corresponding Template object.\r\n * @param optionsWithOptionsTemplate The OptionsWithOptionsTemplate object which shall be converted.\r\n * @param toTemplate True if the given OptionsWithOptionsTemplate shall be converted to its corresponding Template object.\r\n */\r\nexport function transformOptions>(\r\n optionsWithOptionsTemplate: OptionsWithOptionsTemplate\r\n): OptionsWithOptionsTemplateTransformation {\r\n const result: any = {\r\n _template: {},\r\n _options: {},\r\n };\r\n\r\n each(keys(optionsWithOptionsTemplate), (key: Extract) => {\r\n const val: PlainObject | OptionsTemplateTypes | Array = optionsWithOptionsTemplate[key];\r\n\r\n if (isArray(val)) {\r\n result._template[key] = val[1];\r\n result._options[key] = val[0];\r\n } else {\r\n // if (isObject(val))\r\n const tmpResult = transformOptions(val as OptionsWithOptionsTemplate);\r\n result._template[key] = tmpResult._template;\r\n result._options[key] = tmpResult._options;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n runEach,\r\n equalWH,\r\n} from 'support';\r\n\r\nexport type OnEnvironmentChanged = (env: Environment) => void;\r\nexport interface Environment {\r\n _autoUpdateLoop: boolean;\r\n _nativeScrollbarSize: XY;\r\n _nativeScrollbarIsOverlaid: XY;\r\n _nativeScrollbarStyling: boolean;\r\n _rtlScrollBehavior: { n: boolean; i: boolean };\r\n _flexboxGlue: boolean;\r\n _addListener(listener: OnEnvironmentChanged): void;\r\n _removeListener(listener: OnEnvironmentChanged): void;\r\n}\r\n\r\nlet environmentInstance: Environment;\r\nconst { abs, round } = Math;\r\nconst environmentElmId = 'os-environment';\r\nconst classNameFlexboxGlue = 'flexbox-glue';\r\nconst classNameFlexboxGlueMax = `${classNameFlexboxGlue}-max`;\r\n\r\nconst getNativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst getNativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-scrollbar-styled');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst getRtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst getFlexboxGlue = (parentElm: HTMLElement, childElm: HTMLElement): boolean => {\r\n addClass(parentElm, classNameFlexboxGlue);\r\n const minOffsetsizeParent = offsetSize(parentElm);\r\n const minOffsetsize = offsetSize(childElm);\r\n const supportsMin = equalWH(minOffsetsize, minOffsetsizeParent);\r\n\r\n addClass(parentElm, classNameFlexboxGlueMax);\r\n const maxOffsetsizeParent = offsetSize(parentElm);\r\n const maxOffsetsize = offsetSize(childElm);\r\n const supportsMax = equalWH(maxOffsetsize, maxOffsetsizeParent);\r\n\r\n return supportsMin && supportsMax;\r\n};\r\n\r\nconst getWindowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nconst createEnvironment = (): Environment => {\r\n const { body } = document;\r\n const envDOM = createDOM(`
`);\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const onChangedListener: Set = new Set();\r\n const nativeScrollBarSize = getNativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nativeScrollBarSize.x === 0,\r\n y: nativeScrollBarSize.y === 0,\r\n };\r\n\r\n const env: Environment = {\r\n _autoUpdateLoop: false,\r\n _nativeScrollbarSize: nativeScrollBarSize,\r\n _nativeScrollbarIsOverlaid: nativeScrollbarIsOverlaid,\r\n _nativeScrollbarStyling: getNativeScrollbarStyling(envElm),\r\n _rtlScrollBehavior: getRtlScrollBehavior(envElm, envChildElm),\r\n _flexboxGlue: getFlexboxGlue(envElm, envChildElm),\r\n _addListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.add(listener);\r\n },\r\n _removeListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.delete(listener);\r\n },\r\n };\r\n\r\n removeAttr(envElm, 'style');\r\n removeAttr(envElm, 'class');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = getWindowDPR();\r\n let scrollbarSize = nativeScrollBarSize;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = getWindowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n if (isZoom) {\r\n const newScrollbarSize = (environmentInstance._nativeScrollbarSize = getNativeScrollbarSize(body, envElm));\r\n removeElements(envElm);\r\n\r\n if (scrollbarSize.x !== newScrollbarSize.x || scrollbarSize.y !== newScrollbarSize.y) {\r\n runEach(onChangedListener);\r\n }\r\n\r\n scrollbarSize = newScrollbarSize;\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n\r\n return env;\r\n};\r\n\r\nexport const getEnvironment = (): Environment => {\r\n if (!environmentInstance) {\r\n environmentInstance = createEnvironment();\r\n }\r\n return environmentInstance;\r\n};\r\n","import {\r\n CacheUpdateInfo,\r\n CachePropsToUpdate,\r\n Cache,\r\n OptionsWithOptionsTemplate,\r\n transformOptions,\r\n validateOptions,\r\n assignDeep,\r\n createCache,\r\n isBoolean,\r\n keys,\r\n} from 'support';\r\nimport { PlainObject } from 'typings';\r\n\r\ninterface LifecycleUpdateHints {\r\n _force?: boolean;\r\n _changedOptions?: CachePropsToUpdate;\r\n _changedCache?: CachePropsToUpdate;\r\n}\r\n\r\ninterface AbstractLifecycle {\r\n _options(newOptions?: O): O;\r\n _update(force?: boolean): void;\r\n}\r\n\r\nexport interface Lifecycle extends AbstractLifecycle {\r\n _destruct(): void;\r\n _onSizeChanged?(): void;\r\n _onDirectionChanged?(direction: 'ltr' | 'rtl'): void;\r\n _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsic: boolean): void;\r\n}\r\n\r\nexport interface LifecycleBase extends AbstractLifecycle {\r\n _updateCache(cachePropsToUpdate?: CachePropsToUpdate): void;\r\n}\r\n\r\n/**\r\n * Creates a object which can be seen as the base of a lifecycle because it provides all the tools to manage a lifecycle and its options, cache and base functions.\r\n * @param defaultOptionsWithTemplate A object which describes the options and the default options of the lifecycle.\r\n * @param cacheUpdateInfo A object which describes how cache updates shall behave.\r\n * @param initialOptions The initialOptions for the lifecylce. (Can be undefined)\r\n * @param updateFunction The update function where cache and options updates are handled. Has two arguments which are the changedOptions and the changedCache objects.\r\n */\r\nexport const createLifecycleBase = (\r\n defaultOptionsWithTemplate: OptionsWithOptionsTemplate>,\r\n cacheUpdateInfo: CacheUpdateInfo,\r\n initialOptions: O | undefined,\r\n updateFunction: (options: Cache, cache: Cache) => any\r\n): LifecycleBase => {\r\n const { _template: optionsTemplate, _options: defaultOptions } = transformOptions>(defaultOptionsWithTemplate);\r\n const options: Required = assignDeep(\r\n {},\r\n defaultOptions,\r\n validateOptions(initialOptions || ({} as O), optionsTemplate, null, true)._validated\r\n );\r\n const cacheChange = createCache(cacheUpdateInfo);\r\n const cacheOptions = createCache(options, true);\r\n\r\n const update = (hints: LifecycleUpdateHints) => {\r\n const hasForce = isBoolean(hints._force);\r\n const force = hints._force === true;\r\n\r\n const changedCache = cacheChange(force ? null : hints._changedCache || (hasForce ? null : []), force);\r\n const changedOptions = cacheOptions(force ? null : hints._changedOptions, !!hints._changedOptions || force);\r\n\r\n if (changedOptions._anythingChanged || changedCache._anythingChanged) {\r\n updateFunction(changedOptions, changedCache);\r\n }\r\n };\r\n\r\n update({ _force: true });\r\n\r\n return {\r\n _options(newOptions?: O) {\r\n if (newOptions) {\r\n const { _validated: changedOptions } = validateOptions(newOptions, optionsTemplate, options, true);\r\n assignDeep(options, changedOptions);\r\n\r\n update({ _changedOptions: keys(changedOptions) as CachePropsToUpdate });\r\n }\r\n return options;\r\n },\r\n _update: (force?: boolean) => {\r\n update({ _force: !!force });\r\n },\r\n _updateCache: (cachePropsToUpdate?: CachePropsToUpdate) => {\r\n update({ _changedCache: cachePropsToUpdate });\r\n },\r\n };\r\n};\r\n","import { cssProperty, runEach, topRightBottomLeft, TRBL, equalTRBL, optionsTemplateTypes as oTypes, OptionsTemplateValue, style } from 'support';\r\nimport { OSTargetObject } from 'typings';\r\nimport { createLifecycleBase, Lifecycle } from 'lifecycles/lifecycleBase';\r\nimport { getEnvironment, Environment } from 'environment';\r\n\r\nexport type OverflowBehavior = 'hidden' | 'scroll' | 'visible-hidden' | 'visible-scroll';\r\nexport interface StructureLifecycleOptions {\r\n paddingAbsolute: boolean;\r\n overflowBehavior?: {\r\n x?: OverflowBehavior;\r\n y?: OverflowBehavior;\r\n };\r\n}\r\ninterface StructureLifecycleCache {\r\n padding: TRBL;\r\n}\r\n\r\nconst overflowBehaviorAllowedValues: OptionsTemplateValue = 'visible-hidden visible-scroll scroll hidden';\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\nconst classNameViewportScrollbarStyling = `${classNameViewport}-scrollbar-styled`;\r\n\r\nconst cssMarginEnd = cssProperty('margin-inline-end');\r\nconst cssBorderEnd = cssProperty('border-inline-end');\r\n\r\nexport const createStructureLifecycle = (\r\n target: OSTargetObject,\r\n initialOptions?: StructureLifecycleOptions\r\n): Lifecycle => {\r\n const { host, viewport, content } = target;\r\n const destructFns: (() => any)[] = [];\r\n const env: Environment = getEnvironment();\r\n const scrollbarsOverlaid = env._nativeScrollbarIsOverlaid;\r\n const supportsScrollbarStyling = env._nativeScrollbarStyling;\r\n const supportFlexboxGlue = env._flexboxGlue;\r\n // direction change is only needed to update scrollbar hiding, therefore its not needed if css can do it, scrollbars are invisible or overlaid on y axis\r\n const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y;\r\n\r\n const { _options, _update, _updateCache } = createLifecycleBase(\r\n {\r\n paddingAbsolute: [false, oTypes.boolean],\r\n overflowBehavior: {\r\n x: ['scroll', overflowBehaviorAllowedValues],\r\n y: ['scroll', overflowBehaviorAllowedValues],\r\n },\r\n },\r\n {\r\n padding: [() => topRightBottomLeft(host, 'padding'), equalTRBL],\r\n },\r\n initialOptions,\r\n (options, cache) => {\r\n const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = options.paddingAbsolute;\r\n const { _value: padding, _changed: paddingChanged } = cache.padding;\r\n\r\n if (paddingAbsoluteChanged || paddingChanged) {\r\n const paddingStyle: TRBL = {\r\n t: 0,\r\n r: 0,\r\n b: 0,\r\n l: 0,\r\n };\r\n\r\n if (!paddingAbsolute) {\r\n paddingStyle.t = -padding!.t;\r\n paddingStyle.r = -(padding!.r + padding!.l);\r\n paddingStyle.b = -(padding!.b + padding!.t);\r\n paddingStyle.l = -padding!.l;\r\n }\r\n\r\n if (!supportsScrollbarStyling) {\r\n paddingStyle.r -= env._nativeScrollbarSize.y;\r\n paddingStyle.b -= env._nativeScrollbarSize.x;\r\n }\r\n\r\n style(viewport, { top: paddingStyle.t, left: paddingStyle.l, 'margin-right': paddingStyle.r, 'margin-bottom': paddingStyle.b });\r\n }\r\n\r\n console.log(options); // eslint-disable-line\r\n console.log(cache); // eslint-disable-line\r\n }\r\n );\r\n\r\n const onSizeChanged = () => {\r\n _updateCache('padding');\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsic: boolean) => {\r\n if (heightIntrinsic) {\r\n style(content, { height: 'auto' });\r\n } else {\r\n style(content, { height: '100%' });\r\n }\r\n };\r\n\r\n return {\r\n _options,\r\n _update,\r\n _onSizeChanged: onSizeChanged,\r\n _onTrinsicChanged: onTrinsicChanged,\r\n _destruct() {\r\n runEach(destructFns);\r\n },\r\n };\r\n};\r\n","import {\r\n createDOM,\r\n style,\r\n appendChildren,\r\n offsetSize,\r\n scrollLeft,\r\n scrollTop,\r\n jsAPI,\r\n runEach,\r\n prependChildren,\r\n removeElements,\r\n on,\r\n preventDefault,\r\n stopPropagation,\r\n addClass,\r\n isString,\r\n equalWH,\r\n} from 'support';\r\nimport { getEnvironment } from 'environment';\r\n\r\nconst animationStartEventName = 'animationstart';\r\nconst scrollEventName = 'scroll';\r\nconst scrollAmount = 3333333;\r\nconst ResizeObserverConstructor = jsAPI('ResizeObserver');\r\nconst classNameSizeObserver = 'os-size-observer';\r\nconst classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;\r\nconst classNameSizeObserverListener = `${classNameSizeObserver}-listener`;\r\nconst classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`;\r\nconst classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`;\r\nconst cAF = cancelAnimationFrame;\r\nconst rAF = requestAnimationFrame;\r\nconst getDirection = (elm: HTMLElement) => style(elm, 'direction');\r\n\r\n// TODO:\r\n// 1. MAYBE add comparison function to offsetSize etc.\r\ntype Direction = 'ltr' | 'rtl';\r\nexport type SizeObserverOptions = { _direction?: boolean; _appear?: boolean };\r\nexport const createSizeObserver = (\r\n target: HTMLElement,\r\n onSizeChangedCallback: (direction?: Direction) => any,\r\n options?: SizeObserverOptions\r\n): (() => void) => {\r\n const { _direction: direction = false, _appear: appear = false } = options || {};\r\n const rtlScrollBehavior = getEnvironment()._rtlScrollBehavior;\r\n const baseElements = createDOM(`
`);\r\n const sizeObserver = baseElements[0] as HTMLElement;\r\n const listenerElement = sizeObserver.firstChild as HTMLElement;\r\n const onSizeChangedCallbackProxy = (dir?: Direction) => {\r\n if (direction) {\r\n const rtl = getDirection(sizeObserver) === 'rtl';\r\n scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount);\r\n scrollTop(sizeObserver, scrollAmount);\r\n }\r\n onSizeChangedCallback(isString(dir) ? dir : undefined);\r\n };\r\n const offListeners: (() => void)[] = [];\r\n let appearCallback: ((...args: any) => any) | null = appear ? onSizeChangedCallbackProxy : null;\r\n\r\n if (ResizeObserverConstructor) {\r\n const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);\r\n resizeObserverInstance.observe(listenerElement);\r\n offListeners.push(() => resizeObserverInstance.disconnect());\r\n } else {\r\n const observerElementChildren = createDOM(\r\n `
`\r\n );\r\n appendChildren(listenerElement, observerElementChildren);\r\n const observerElementChildrenRoot = observerElementChildren[0] as HTMLElement;\r\n const shrinkElement = observerElementChildrenRoot.lastChild as HTMLElement;\r\n const expandElement = observerElementChildrenRoot.firstChild as HTMLElement;\r\n const expandElementChild = expandElement?.firstChild as HTMLElement;\r\n\r\n let cacheSize = offsetSize(listenerElement);\r\n let currSize = cacheSize;\r\n let isDirty = false;\r\n let rAFId: number;\r\n\r\n const reset = () => {\r\n scrollLeft(expandElement, scrollAmount);\r\n scrollTop(expandElement, scrollAmount);\r\n scrollLeft(shrinkElement, scrollAmount);\r\n scrollTop(shrinkElement, scrollAmount);\r\n };\r\n const onResized = function () {\r\n rAFId = 0;\r\n if (!isDirty) {\r\n return;\r\n }\r\n\r\n cacheSize = currSize;\r\n onSizeChangedCallbackProxy();\r\n };\r\n const onScroll = (scrollEvent?: Event) => {\r\n currSize = offsetSize(listenerElement);\r\n isDirty = !scrollEvent || !equalWH(currSize, cacheSize);\r\n\r\n if (scrollEvent && isDirty && !rAFId) {\r\n cAF(rAFId);\r\n rAFId = rAF(onResized);\r\n } else if (!scrollEvent) {\r\n onResized();\r\n }\r\n\r\n reset();\r\n if (scrollEvent) {\r\n preventDefault(scrollEvent);\r\n stopPropagation(scrollEvent);\r\n }\r\n return false;\r\n };\r\n\r\n offListeners.push(on(expandElement, scrollEventName, onScroll));\r\n offListeners.push(on(shrinkElement, scrollEventName, onScroll));\r\n\r\n // lets assume that the divs will never be that large and a constant value is enough\r\n style(expandElementChild, {\r\n width: scrollAmount,\r\n height: scrollAmount,\r\n });\r\n reset();\r\n appearCallback = appear ? () => onScroll() : reset;\r\n }\r\n\r\n if (direction) {\r\n let dirCache: string | undefined;\r\n offListeners.push(\r\n on(sizeObserver, scrollEventName, (event: Event) => {\r\n const dir = getDirection(sizeObserver);\r\n const changed = dir !== dirCache;\r\n if (changed) {\r\n if (dir === 'rtl') {\r\n style(listenerElement, { left: 'auto', right: 0 });\r\n } else {\r\n style(listenerElement, { left: 0, right: 'auto' });\r\n }\r\n dirCache = dir;\r\n onSizeChangedCallbackProxy(dir as Direction);\r\n }\r\n\r\n preventDefault(event);\r\n stopPropagation(event);\r\n return false;\r\n })\r\n );\r\n }\r\n\r\n // appearCallback is always needed on scroll-observer strategy to reset it\r\n if (appearCallback) {\r\n addClass(sizeObserver, classNameSizeObserverAppear);\r\n offListeners.push(on(sizeObserver, animationStartEventName, appearCallback));\r\n }\r\n\r\n prependChildren(target, sizeObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(sizeObserver);\r\n };\r\n};\r\n","import { createDOM, offsetSize, jsAPI, runEach, prependChildren, removeElements } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\n\r\nconst classNameTrinsicObserver = 'os-trinsic-observer';\r\nconst IntersectionObserverConstructor = jsAPI('IntersectionObserver');\r\n\r\nexport const createTrinsicObserver = (\r\n target: HTMLElement,\r\n onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsic: boolean) => any\r\n): (() => void) => {\r\n const trinsicObserver = createDOM(`
`)[0] as HTMLElement;\r\n const offListeners: (() => void)[] = [];\r\n let heightIntrinsic = false;\r\n\r\n if (IntersectionObserverConstructor) {\r\n const intersectionObserverInstance: IntersectionObserver = new IntersectionObserverConstructor(\r\n (entries: IntersectionObserverEntry[]) => {\r\n if (entries && entries.length > 0) {\r\n const last = entries.pop();\r\n if (last) {\r\n const newHeightIntrinsic = last.isIntersecting || last.intersectionRatio > 0;\r\n\r\n if (newHeightIntrinsic !== heightIntrinsic) {\r\n onTrinsicChangedCallback(false, newHeightIntrinsic);\r\n heightIntrinsic = newHeightIntrinsic;\r\n }\r\n }\r\n }\r\n },\r\n { root: target }\r\n );\r\n intersectionObserverInstance.observe(trinsicObserver);\r\n offListeners.push(() => intersectionObserverInstance.disconnect());\r\n } else {\r\n offListeners.push(\r\n createSizeObserver(trinsicObserver, () => {\r\n const newSize = offsetSize(trinsicObserver);\r\n const newHeightIntrinsic = newSize.h === 0;\r\n\r\n if (newHeightIntrinsic !== heightIntrinsic) {\r\n onTrinsicChangedCallback(false, newHeightIntrinsic);\r\n heightIntrinsic = newHeightIntrinsic;\r\n }\r\n })\r\n );\r\n }\r\n\r\n prependChildren(target, trinsicObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(trinsicObserver);\r\n };\r\n};\r\n","import { OSTarget, OSTargetObject } from 'typings';\r\nimport { createStructureLifecycle } from 'lifecycles/structureLifecycle';\r\nimport { appendChildren, addClass, contents, is, isHTMLElement, createDiv, each } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\nimport { createTrinsicObserver } from 'observers/trinsicObserver';\r\nimport { Lifecycle } from 'lifecycles/lifecycleBase';\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\n\r\nconst normalizeTarget = (target: OSTarget): OSTargetObject => {\r\n if (isHTMLElement(target)) {\r\n const isTextarea = is(target, 'textarea');\r\n const host = (isTextarea ? createDiv() : target) as HTMLElement;\r\n const viewport = createDiv(classNameViewport);\r\n const content = createDiv(classNameContent);\r\n\r\n appendChildren(viewport, content);\r\n appendChildren(content, contents(target));\r\n appendChildren(target, viewport);\r\n addClass(host, classNameHost);\r\n\r\n return {\r\n target,\r\n host,\r\n viewport,\r\n content,\r\n };\r\n }\r\n\r\n const { host, viewport, content } = target;\r\n\r\n addClass(host, classNameHost);\r\n addClass(viewport, classNameViewport);\r\n addClass(content, classNameContent);\r\n\r\n return target;\r\n};\r\n\r\nconst OverlayScrollbars = (target: OSTarget, options?: any, extensions?: any): void => {\r\n const osTarget: OSTargetObject = normalizeTarget(target);\r\n const lifecycles: Lifecycle[] = [];\r\n const { host } = osTarget;\r\n\r\n lifecycles.push(createStructureLifecycle(osTarget));\r\n\r\n // eslint-disable-next-line\r\n const onSizeChanged = (direction?: 'ltr' | 'rtl') => {\r\n if (direction) {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(direction);\r\n });\r\n } else {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onSizeChanged && lifecycle._onSizeChanged();\r\n });\r\n }\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsic: boolean) => {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsic);\r\n });\r\n };\r\n\r\n createSizeObserver(host, onSizeChanged, { _appear: true, _direction: true });\r\n createTrinsicObserver(host, onTrinsicChanged);\r\n};\r\n\r\nexport { OverlayScrollbars };\r\n","import { createDOM } from 'support/dom';\r\nimport { getEnvironment } from 'environment';\r\nimport { OverlayScrollbars } from 'overlayscrollbars/overlayscrollbars';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n getEnvironment(),\r\n OverlayScrollbars(document.body),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["type","obj","undefined","Object","prototype","toString","call","replace","toLowerCase","isNumber","isString","isBoolean","isFunction","isUndefined","isNull","isArray","Array","isObject","isArrayLike","length","isPlainObject","key","proto","hasOwnProperty","hasOwnConstructor","hasIsPrototypeOf","constructor","isHTMLElement","instaceOfRightHandSide","window","HTMLElement","doInstanceOf","nodeType","nodeName","isEmptyObject","name","getSetProp","topLeft","fallback","elm","value","attr","attrName","getAttribute","setAttribute","removeAttr","removeAttribute","scrollLeft","scrollTop","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","keys","from","arr","push","runEach","Set","forEach","fn","matches","selector","Element","msMatchesSelector","is","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","prependChildren","removeElements","nodes","e","removeChild","createDiv","classNames","div","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","passiveEventsSupport","supportPassiveEvents","addEventListener","defineProperty","get","off","target","eventNames","listener","capture","split","eventName","removeEventListener","on","options","doSupportPassiveEvents","passive","_passive","_capture","once","_once","offListeners","nativeOptions","finalListener","evt","bind","stopPropagation","preventDefault","equal","a","b","props","prop","equalWH","equalTRBL","assignDeep","object1","object2","object3","object4","object5","object6","sources","copy","copyIsArray","src","clone","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","parseToZeroOrNumber","toFloat","num","parseFloat","parseInt","Number","isNaN","adaptCSSVal","val","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","topRightBottomLeft","property","finalProp","top","right","bottom","left","t","r","l","x","y","absoluteCoordinates","rect","pageYOffset","pageXOffset","createCache","cacheUpdateInfo","isReference","cache","allProps","_changed","_value","updateCacheProp","curr","_previous","flush","force","_anythingChanged","changed","propsToUpdate","finalPropsToUpdate","cacheVal","firstLetterToUpper","str","charAt","toUpperCase","slice","getDummyStyle","cssPrefixes","jsPrefixes","jsCache","cssCache","cssProperty","uppercasedName","elmStyle","prefix","prefixWithoutDashes","resultPossibilities","find","resultPossibility","jsAPI","resizeObserver","_extends","module","assign","arguments","apply","stringify","JSON","templateTypePrefixSuffix","optionsTemplateTypes","item","validateRecursive","template","optionsDiff","doWriteErrors","propPath","validatedOptions","optionsCopy","filter","optionsDiffValue","optionsValue","templateValue","templateIsComplex","propPrefix","validatedResult","_validated","_foreign","isValid","errorEnumStrings","errorPossibleTypes","optionsValueType","templateValueArr","currTemplateType","typeString","isEnumString","enumStringSplit","possibility","string","doStringifyComparison","console","warn","join","validateOptions","transformOptions","optionsWithOptionsTemplate","_template","_options","tmpResult","environmentInstance","abs","Math","round","environmentElmId","classNameFlexboxGlue","classNameFlexboxGlueMax","getNativeScrollbarSize","body","measureElm","cSize","oSize","getNativeScrollbarStyling","testElm","ex","getRtlScrollBehavior","childElm","strHidden","overflowX","overflowY","direction","parentOffset","childOffset","childOffsetAfterScroll","n","getFlexboxGlue","minOffsetsizeParent","minOffsetsize","supportsMin","maxOffsetsizeParent","maxOffsetsize","supportsMax","getWindowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","createEnvironment","envDOM","envElm","envChildElm","onChangedListener","nativeScrollBarSize","nativeScrollbarIsOverlaid","env","_autoUpdateLoop","_nativeScrollbarSize","_nativeScrollbarIsOverlaid","_nativeScrollbarStyling","_rtlScrollBehavior","_flexboxGlue","_addListener","_removeListener","delete","size","dpr","scrollbarSize","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","newScrollbarSize","getEnvironment","createLifecycleBase","defaultOptionsWithTemplate","initialOptions","updateFunction","optionsTemplate","defaultOptions","cacheChange","cacheOptions","update","hints","hasForce","_force","changedCache","_changedCache","changedOptions","_changedOptions","newOptions","_update","_updateCache","cachePropsToUpdate","overflowBehaviorAllowedValues","cssMarginEnd","cssBorderEnd","createStructureLifecycle","host","viewport","content","destructFns","scrollbarsOverlaid","supportsScrollbarStyling","supportFlexboxGlue","directionObserverObsolete","paddingAbsolute","oTypes","boolean","overflowBehavior","padding","paddingAbsoluteChanged","paddingChanged","paddingStyle","log","onSizeChanged","onTrinsicChanged","widthIntrinsic","heightIntrinsic","height","_onSizeChanged","_onTrinsicChanged","_destruct","animationStartEventName","scrollEventName","scrollAmount","ResizeObserverConstructor","classNameSizeObserver","classNameSizeObserverAppear","classNameSizeObserverListener","classNameSizeObserverListenerItem","classNameSizeObserverListenerItemFinal","cAF","cancelAnimationFrame","rAF","requestAnimationFrame","getDirection","createSizeObserver","onSizeChangedCallback","_direction","_appear","appear","rtlScrollBehavior","baseElements","sizeObserver","listenerElement","onSizeChangedCallbackProxy","dir","rtl","appearCallback","resizeObserverInstance","observe","disconnect","observerElementChildren","observerElementChildrenRoot","shrinkElement","lastChild","expandElement","expandElementChild","cacheSize","currSize","isDirty","rAFId","reset","onResized","onScroll","scrollEvent","width","dirCache","event","classNameTrinsicObserver","IntersectionObserverConstructor","createTrinsicObserver","onTrinsicChangedCallback","trinsicObserver","intersectionObserverInstance","entries","last","pop","newHeightIntrinsic","isIntersecting","intersectionRatio","root","newSize","classNameHost","classNameViewport","classNameContent","normalizeTarget","isTextarea","OverlayScrollbars","extensions","osTarget","lifecycles","lifecycle","_onDirectionChanged"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"overlayscrollbars.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/dom/events.ts","../src/support/utils/equal.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../src/support/cache/cache.ts","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/support/options/transformation.ts","../src/environment/environment.ts","../src/lifecycles/lifecycleBase.ts","../src/lifecycles/structureLifecycle.ts","../src/observers/sizeObserver.ts","../src/observers/trinsicObserver.ts","../src/overlayscrollbars/overlayscrollbars.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype RunEachItem = ((...args: any) => any | any[]) | null | undefined;\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n\r\n/**\r\n * Calls all functions in the passed array/set of functions.\r\n * @param arr The array filled with function which shall be called.\r\n */\r\nexport const runEach = (arr: ArrayLike | Set): void => {\r\n if (arr instanceof Set) {\r\n arr.forEach((fn) => fn && fn());\r\n } else {\r\n each(arr, (fn) => fn && fn());\r\n }\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst matches = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const fn = Element.prototype.matches || Element.prototype.msMatchesSelector;\r\n return fn.call(elm, selector);\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => matches(elm, selector);\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (matches(child, selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { attr } from 'support/dom/attribute';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (classNames?: string): HTMLDivElement => {\r\n const div = document.createElement('div');\r\n if (classNames) {\r\n attr(div, 'class', classNames);\r\n }\r\n return div;\r\n};\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","export interface WH {\r\n w: T;\r\n h: T;\r\n}\r\n\r\nconst elementHasDimensions = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n\r\n/**\r\n * Determines whether the passed element has any dimensions.\r\n * @param elm The element.\r\n */\r\nexport const hasDimensions = (elm: HTMLElement | null): boolean => (elm ? elementHasDimensions(elm as HTMLElement) : false);\r\n","import { each, runEach } from 'support/utils/array';\r\n\r\nlet passiveEventsSupport: boolean;\r\nconst supportPassiveEvents = (): boolean => {\r\n if (passiveEventsSupport === undefined) {\r\n passiveEventsSupport = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n passiveEventsSupport = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n }\r\n return passiveEventsSupport;\r\n};\r\n\r\nexport interface OnOptions {\r\n _capture?: boolean;\r\n _passive?: boolean;\r\n _once?: boolean;\r\n}\r\n\r\n/**\r\n * Removes the passed event listener for the passed events with the passed options.\r\n * @param target The element from which the listener shall be removed.\r\n * @param eventNames The eventsnames for which the listener shall be removed.\r\n * @param listener The listener which shall be removed.\r\n * @param capture The options of the removed listener.\r\n */\r\nexport const off = (target: EventTarget, eventNames: string, listener: EventListener, capture?: boolean): void => {\r\n each(eventNames.split(' '), (eventName) => {\r\n target.removeEventListener(eventName, listener, capture);\r\n });\r\n};\r\n\r\n/**\r\n * Adds the passed event listener for the passed eventnames with the passed options.\r\n * @param target The element to which the listener shall be added.\r\n * @param eventNames The eventsnames for which the listener shall be called.\r\n * @param listener The listener which is called on the eventnames.\r\n * @param options The options of the added listener.\r\n */\r\nexport const on = (target: EventTarget, eventNames: string, listener: EventListener, options?: OnOptions): (() => void) => {\r\n const doSupportPassiveEvents = supportPassiveEvents();\r\n const passive = (doSupportPassiveEvents && options && options._passive) || false;\r\n const capture = (options && options._capture) || false;\r\n const once = (options && options._once) || false;\r\n const offListeners: (() => void)[] = [];\r\n const nativeOptions: AddEventListenerOptions | boolean = doSupportPassiveEvents\r\n ? {\r\n passive,\r\n capture,\r\n }\r\n : capture;\r\n\r\n each(eventNames.split(' '), (eventName) => {\r\n const finalListener = once\r\n ? (evt: Event) => {\r\n target.removeEventListener(eventName, finalListener, capture);\r\n listener && listener(evt);\r\n }\r\n : listener;\r\n\r\n offListeners.push(off.bind(null, target, eventName, finalListener, capture));\r\n target.addEventListener(eventName, finalListener, nativeOptions);\r\n });\r\n\r\n return runEach.bind(0, offListeners);\r\n};\r\n\r\n/**\r\n * Shorthand for the stopPropagation event Method.\r\n * @param evt The event of which the stopPropagation method shall be called.\r\n */\r\nexport const stopPropagation = (evt: Event) => evt.stopPropagation();\r\n\r\n/**\r\n * Shorthand for the preventDefault event Method.\r\n * @param evt The event of which the preventDefault method shall be called.\r\n */\r\nexport const preventDefault = (evt: Event) => evt.preventDefault();\r\n","import { each } from 'support/utils/array';\r\nimport { WH, XY, TRBL } from 'support/dom';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Compares two objects and returns true if all values of the passed prop names are identical, false otherwise or if one of the two object is falsy.\r\n * @param a Object a.\r\n * @param b Object b.\r\n * @param props The props which shall be compared.\r\n */\r\nexport const equal = (a: T | undefined, b: T | undefined, props: Array): boolean => {\r\n if (a && b) {\r\n let result = true;\r\n each(props, (prop) => {\r\n if (a[prop] !== b[prop]) {\r\n result = false;\r\n }\r\n });\r\n return result;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalWH = (a?: WH, b?: WH) => equal(a, b, ['w', 'h']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalXY = (a?: XY, b?: XY) => equal(a, b, ['x', 'y']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalTRBL = (a?: TRBL, b?: TRBL) => equal(a, b, ['t', 'r', 'b', 'l']);\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\nexport interface TRBL {\r\n t: number;\r\n r: number;\r\n b: number;\r\n l: number;\r\n}\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst parseToZeroOrNumber = (value: string, toFloat?: boolean): number => {\r\n /* istanbul ignore next */\r\n const num = toFloat ? parseFloat(value) : parseInt(value, 10);\r\n /* istanbul ignore next */\r\n return Number.isNaN(num) ? 0 : num;\r\n};\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n\r\n/**\r\n * Returns a top\r\n * @param elm\r\n * @param property\r\n */\r\nexport const topRightBottomLeft = (elm: HTMLElement | null, property?: string): TRBL => {\r\n const finalProp = property || '';\r\n const top = `${finalProp}-top`;\r\n const right = `${finalProp}-right`;\r\n const bottom = `${finalProp}-bottom`;\r\n const left = `${finalProp}-left`;\r\n const result = style(elm, [top, right, bottom, left]);\r\n return {\r\n t: parseToZeroOrNumber(result[top]),\r\n r: parseToZeroOrNumber(result[right]),\r\n b: parseToZeroOrNumber(result[bottom]),\r\n l: parseToZeroOrNumber(result[left]),\r\n };\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\n\r\nexport interface XY {\r\n x: T;\r\n y: T;\r\n}\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","export interface Cache {\r\n readonly _value?: T;\r\n readonly _previous?: T;\r\n readonly _changed: boolean;\r\n}\r\n\r\nexport interface CacheOptions {\r\n _equal?: EqualCachePropFunction;\r\n _initialValue?: T;\r\n}\r\n\r\nexport type CacheUpdate = (force?: boolean | 0, context?: C) => Cache;\r\n\r\nexport type UpdateCachePropFunction = (context?: C, current?: T, previous?: T) => T;\r\n\r\nexport type EqualCachePropFunction = (a?: T, b?: T) => boolean;\r\n\r\nexport const createCache = (update: UpdateCachePropFunction, options?: CacheOptions): CacheUpdate => {\r\n const { _equal, _initialValue } = options || {};\r\n let _value: T | undefined = _initialValue;\r\n let _previous: T | undefined;\r\n return (force, context) => {\r\n const prev = _value;\r\n const newVal = update(context, _value, _previous);\r\n const changed = force || (_equal ? !_equal(prev, newVal) : prev !== newVal);\r\n\r\n if (changed) {\r\n _value = newVal;\r\n _previous = prev;\r\n }\r\n\r\n return {\r\n _value,\r\n _previous,\r\n _changed: changed,\r\n };\r\n };\r\n};\r\n","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidationResult, OptionsValidated } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: T,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidationResult => {\r\n const validatedOptions: OptionsValidated = {};\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult._validated as any;\r\n optionsCopy[prop] = validatedResult._foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n let typeString: string | undefined;\r\n each(optionsTemplateTypes, (value: string, key: string) => {\r\n if (value === currTemplateType) {\r\n typeString = key;\r\n }\r\n });\r\n const isEnumString = typeString === undefined;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : typeString!);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n _foreign: optionsCopy,\r\n _validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validateOptions = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: T | null,\r\n doWriteErrors?: boolean\r\n): OptionsValidationResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false);\r\n};\r\n\r\nexport { validateOptions, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import { OptionsTemplate, OptionsWithOptionsTemplate, OptionsTemplateTypes } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\nimport { isArray } from 'support/utils/types';\r\nimport { each, keys } from 'support/utils';\r\n\r\nexport interface OptionsWithOptionsTemplateTransformation> {\r\n _template: OptionsTemplate;\r\n _options: T;\r\n}\r\n\r\n/**\r\n * Transforms the given OptionsWithOptionsTemplate object to its corresponding generic (T) Object or its corresponding Template object.\r\n * @param optionsWithOptionsTemplate The OptionsWithOptionsTemplate object which shall be converted.\r\n * @param toTemplate True if the given OptionsWithOptionsTemplate shall be converted to its corresponding Template object.\r\n */\r\nexport function transformOptions>(\r\n optionsWithOptionsTemplate: OptionsWithOptionsTemplate\r\n): OptionsWithOptionsTemplateTransformation {\r\n const result: any = {\r\n _template: {},\r\n _options: {},\r\n };\r\n\r\n each(keys(optionsWithOptionsTemplate), (key: Extract) => {\r\n const val: PlainObject | OptionsTemplateTypes | Array = optionsWithOptionsTemplate[key];\r\n\r\n if (isArray(val)) {\r\n result._template[key] = val[1];\r\n result._options[key] = val[0];\r\n } else {\r\n // if (isObject(val))\r\n const tmpResult = transformOptions(val as OptionsWithOptionsTemplate);\r\n result._template[key] = tmpResult._template;\r\n result._options[key] = tmpResult._options;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n runEach,\r\n equalWH,\r\n} from 'support';\r\n\r\nexport type OnEnvironmentChanged = (env: Environment) => void;\r\nexport interface Environment {\r\n _autoUpdateLoop: boolean;\r\n _nativeScrollbarSize: XY;\r\n _nativeScrollbarIsOverlaid: XY;\r\n _nativeScrollbarStyling: boolean;\r\n _rtlScrollBehavior: { n: boolean; i: boolean };\r\n _flexboxGlue: boolean;\r\n _addListener(listener: OnEnvironmentChanged): void;\r\n _removeListener(listener: OnEnvironmentChanged): void;\r\n}\r\n\r\nlet environmentInstance: Environment;\r\nconst { abs, round } = Math;\r\nconst environmentElmId = 'os-environment';\r\nconst classNameFlexboxGlue = 'flexbox-glue';\r\nconst classNameFlexboxGlueMax = `${classNameFlexboxGlue}-max`;\r\n\r\nconst getNativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst getNativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-scrollbar-styled');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst getRtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst getFlexboxGlue = (parentElm: HTMLElement, childElm: HTMLElement): boolean => {\r\n addClass(parentElm, classNameFlexboxGlue);\r\n const minOffsetsizeParent = offsetSize(parentElm);\r\n const minOffsetsize = offsetSize(childElm);\r\n const supportsMin = equalWH(minOffsetsize, minOffsetsizeParent);\r\n\r\n addClass(parentElm, classNameFlexboxGlueMax);\r\n const maxOffsetsizeParent = offsetSize(parentElm);\r\n const maxOffsetsize = offsetSize(childElm);\r\n const supportsMax = equalWH(maxOffsetsize, maxOffsetsizeParent);\r\n\r\n return supportsMin && supportsMax;\r\n};\r\n\r\nconst getWindowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nconst createEnvironment = (): Environment => {\r\n const { body } = document;\r\n const envDOM = createDOM(`
`);\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const onChangedListener: Set = new Set();\r\n const nativeScrollBarSize = getNativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nativeScrollBarSize.x === 0,\r\n y: nativeScrollBarSize.y === 0,\r\n };\r\n\r\n const env: Environment = {\r\n _autoUpdateLoop: false,\r\n _nativeScrollbarSize: nativeScrollBarSize,\r\n _nativeScrollbarIsOverlaid: nativeScrollbarIsOverlaid,\r\n _nativeScrollbarStyling: getNativeScrollbarStyling(envElm),\r\n _rtlScrollBehavior: getRtlScrollBehavior(envElm, envChildElm),\r\n _flexboxGlue: getFlexboxGlue(envElm, envChildElm),\r\n _addListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.add(listener);\r\n },\r\n _removeListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.delete(listener);\r\n },\r\n };\r\n\r\n removeAttr(envElm, 'style');\r\n removeAttr(envElm, 'class');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = getWindowDPR();\r\n let scrollbarSize = nativeScrollBarSize;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = getWindowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n if (isZoom) {\r\n const newScrollbarSize = (environmentInstance._nativeScrollbarSize = getNativeScrollbarSize(body, envElm));\r\n removeElements(envElm);\r\n\r\n if (scrollbarSize.x !== newScrollbarSize.x || scrollbarSize.y !== newScrollbarSize.y) {\r\n runEach(onChangedListener);\r\n }\r\n\r\n scrollbarSize = newScrollbarSize;\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n\r\n return env;\r\n};\r\n\r\nexport const getEnvironment = (): Environment => {\r\n if (!environmentInstance) {\r\n environmentInstance = createEnvironment();\r\n }\r\n return environmentInstance;\r\n};\r\n","import { Cache, OptionsValidated, OptionsWithOptionsTemplate, transformOptions, validateOptions, assignDeep, hasOwnProperty } from 'support';\r\nimport { CSSDirection, PlainObject } from 'typings';\r\n\r\ninterface LifecycleBaseUpdateHints {\r\n _force?: boolean;\r\n _changedOptions?: OptionsValidated;\r\n}\r\n\r\nexport interface LifecycleBase {\r\n _options(newOptions?: O): O;\r\n _update(force?: boolean): void;\r\n}\r\n\r\nexport interface Lifecycle extends LifecycleBase {\r\n _destruct(): void;\r\n _onSizeChanged?(): void;\r\n _onDirectionChanged?(directionCache: Cache): void;\r\n _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsicCache: Cache): void;\r\n}\r\n\r\nexport interface LifecycleOptionInfo {\r\n _value: T;\r\n _changed: boolean;\r\n}\r\n\r\nexport type LifecycleCheckOption = (path: string) => LifecycleOptionInfo;\r\n\r\nconst getPropByPath = (obj: any, path: string): T =>\r\n obj && path.split('.').reduce((o, prop) => (o && hasOwnProperty(o, prop) ? o[prop] : undefined), obj);\r\n\r\n/**\r\n * Creates a object which can be seen as the base of a lifecycle because it provides all the tools to manage a lifecycle and its options, cache and base functions.\r\n * @param defaultOptionsWithTemplate A object which describes the options and the default options of the lifecycle.\r\n * @param initialOptions The initialOptions for the lifecylce. (Can be undefined)\r\n * @param updateFunction The update function where cache and options updates are handled. Has two arguments which are the changedOptions and the changedCache objects.\r\n */\r\nexport const createLifecycleBase = (\r\n defaultOptionsWithTemplate: OptionsWithOptionsTemplate>,\r\n initialOptions: O | undefined,\r\n updateFunction: (force: boolean, checkOption: LifecycleCheckOption) => any\r\n): LifecycleBase => {\r\n const { _template: optionsTemplate, _options: defaultOptions } = transformOptions>(defaultOptionsWithTemplate);\r\n const options: Required = assignDeep(\r\n {},\r\n defaultOptions,\r\n validateOptions(initialOptions || ({} as O), optionsTemplate, null, true)._validated\r\n );\r\n\r\n const update = (hints: LifecycleBaseUpdateHints) => {\r\n const { _force, _changedOptions } = hints;\r\n const checkOption: LifecycleCheckOption = (path) => ({\r\n _value: getPropByPath(options, path),\r\n _changed: _force || getPropByPath(_changedOptions, path) !== undefined,\r\n });\r\n updateFunction(!!_force, checkOption);\r\n };\r\n\r\n update({ _force: true });\r\n\r\n return {\r\n _options(newOptions?: O) {\r\n if (newOptions) {\r\n const { _validated: _changedOptions } = validateOptions(newOptions, optionsTemplate, options, true);\r\n assignDeep(options, _changedOptions);\r\n\r\n update({ _changedOptions });\r\n }\r\n return options;\r\n },\r\n _update: (_force?: boolean) => {\r\n update({ _force });\r\n },\r\n };\r\n};\r\n","import {\r\n Cache,\r\n cssProperty,\r\n runEach,\r\n createCache,\r\n topRightBottomLeft,\r\n TRBL,\r\n equalTRBL,\r\n optionsTemplateTypes as oTypes,\r\n OptionsTemplateValue,\r\n style,\r\n OptionsWithOptionsTemplate,\r\n} from 'support';\r\nimport { OSTargetObject } from 'typings';\r\nimport { createLifecycleBase, Lifecycle } from 'lifecycles/lifecycleBase';\r\nimport { getEnvironment, Environment } from 'environment';\r\n\r\nexport type OverflowBehavior = 'hidden' | 'scroll' | 'visible-hidden' | 'visible-scroll';\r\nexport interface StructureLifecycleOptions {\r\n paddingAbsolute: boolean;\r\n overflowBehavior?: {\r\n x?: OverflowBehavior;\r\n y?: OverflowBehavior;\r\n };\r\n}\r\n\r\nconst overflowBehaviorAllowedValues: OptionsTemplateValue = 'visible-hidden visible-scroll scroll hidden';\r\nconst defaultOptionsWithTemplate: OptionsWithOptionsTemplate> = {\r\n paddingAbsolute: [false, oTypes.boolean],\r\n overflowBehavior: {\r\n x: ['scroll', overflowBehaviorAllowedValues],\r\n y: ['scroll', overflowBehaviorAllowedValues],\r\n },\r\n};\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\nconst classNameViewportScrollbarStyling = `${classNameViewport}-scrollbar-styled`;\r\n\r\nconst cssMarginEnd = cssProperty('margin-inline-end');\r\nconst cssBorderEnd = cssProperty('border-inline-end');\r\n\r\nexport const createStructureLifecycle = (\r\n target: OSTargetObject,\r\n initialOptions?: StructureLifecycleOptions\r\n): Lifecycle => {\r\n const { host, padding: paddingElm, viewport, content } = target;\r\n const destructFns: (() => any)[] = [];\r\n const env: Environment = getEnvironment();\r\n const scrollbarsOverlaid = env._nativeScrollbarIsOverlaid;\r\n const supportsScrollbarStyling = env._nativeScrollbarStyling;\r\n const supportFlexboxGlue = env._flexboxGlue;\r\n // direction change is only needed to update scrollbar hiding, therefore its not needed if css can do it, scrollbars are invisible or overlaid on y axis\r\n const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y;\r\n\r\n const updatePaddingCache = createCache(() => topRightBottomLeft(host, 'padding'), { _equal: equalTRBL });\r\n\r\n const { _options, _update } = createLifecycleBase(defaultOptionsWithTemplate, initialOptions, (force, checkOption) => {\r\n const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = checkOption('paddingAbsolute');\r\n const { _value: padding, _changed: paddingChanged } = updatePaddingCache(force);\r\n\r\n if (paddingAbsoluteChanged || paddingChanged) {\r\n const paddingStyle: TRBL = {\r\n t: 0,\r\n r: 0,\r\n b: 0,\r\n l: 0,\r\n };\r\n\r\n if (!paddingAbsolute) {\r\n paddingStyle.t = -padding!.t;\r\n paddingStyle.r = -(padding!.r + padding!.l);\r\n paddingStyle.b = -(padding!.b + padding!.t);\r\n paddingStyle.l = -padding!.l;\r\n }\r\n\r\n if (!supportsScrollbarStyling) {\r\n paddingStyle.r -= env._nativeScrollbarSize.y;\r\n paddingStyle.b -= env._nativeScrollbarSize.x;\r\n }\r\n\r\n style(paddingElm, {\r\n top: paddingStyle.t,\r\n left: paddingStyle.l,\r\n 'margin-right': paddingStyle.r,\r\n 'margin-bottom': paddingStyle.b,\r\n 'max-width': `calc(100% + ${paddingStyle.r * -1}px)`,\r\n });\r\n }\r\n });\r\n\r\n const onSizeChanged = () => {\r\n _update();\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => {\r\n const { _changed, _value } = heightIntrinsicCache;\r\n if (_changed) {\r\n style(content, { height: _value ? 'auto' : '100%' });\r\n }\r\n };\r\n\r\n return {\r\n _options,\r\n _update,\r\n _onSizeChanged: onSizeChanged,\r\n _onTrinsicChanged: onTrinsicChanged,\r\n _destruct() {\r\n runEach(destructFns);\r\n },\r\n };\r\n};\r\n","import {\r\n Cache,\r\n createCache,\r\n createDOM,\r\n style,\r\n appendChildren,\r\n offsetSize,\r\n scrollLeft,\r\n scrollTop,\r\n jsAPI,\r\n runEach,\r\n prependChildren,\r\n removeElements,\r\n on,\r\n preventDefault,\r\n stopPropagation,\r\n addClass,\r\n isString,\r\n equalWH,\r\n} from 'support';\r\nimport { CSSDirection } from 'typings';\r\nimport { getEnvironment } from 'environment';\r\n\r\nconst animationStartEventName = 'animationstart';\r\nconst scrollEventName = 'scroll';\r\nconst scrollAmount = 3333333;\r\nconst ResizeObserverConstructor = jsAPI('ResizeObserver');\r\nconst classNameSizeObserver = 'os-size-observer';\r\nconst classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;\r\nconst classNameSizeObserverListener = `${classNameSizeObserver}-listener`;\r\nconst classNameSizeObserverListenerScroll = `${classNameSizeObserverListener}-scroll`;\r\nconst classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`;\r\nconst classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`;\r\nconst cAF = cancelAnimationFrame;\r\nconst rAF = requestAnimationFrame;\r\nconst getDirection = (elm: HTMLElement): CSSDirection => style(elm, 'direction') as CSSDirection;\r\n\r\nexport type SizeObserverOptions = { _direction?: boolean; _appear?: boolean };\r\nexport const createSizeObserver = (\r\n target: HTMLElement,\r\n onSizeChangedCallback: (directionCache?: Cache) => any,\r\n options?: SizeObserverOptions\r\n): (() => void) => {\r\n const { _direction: direction = false, _appear: appear = false } = options || {};\r\n const rtlScrollBehavior = getEnvironment()._rtlScrollBehavior;\r\n const baseElements = createDOM(`
`);\r\n const sizeObserver = baseElements[0] as HTMLElement;\r\n const listenerElement = sizeObserver.firstChild as HTMLElement;\r\n const onSizeChangedCallbackProxy = (directionCache?: Cache) => {\r\n if (direction) {\r\n const rtl = getDirection(sizeObserver) === 'rtl';\r\n scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount);\r\n scrollTop(sizeObserver, scrollAmount);\r\n }\r\n onSizeChangedCallback(isString((directionCache || {})._value) ? directionCache : undefined);\r\n };\r\n const offListeners: (() => void)[] = [];\r\n let appearCallback: ((...args: any) => any) | null = appear ? onSizeChangedCallbackProxy : null;\r\n\r\n if (ResizeObserverConstructor) {\r\n const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);\r\n resizeObserverInstance.observe(listenerElement);\r\n offListeners.push(() => resizeObserverInstance.disconnect());\r\n } else {\r\n const observerElementChildren = createDOM(\r\n `
`\r\n );\r\n appendChildren(listenerElement, observerElementChildren);\r\n addClass(listenerElement, classNameSizeObserverListenerScroll);\r\n const observerElementChildrenRoot = observerElementChildren[0] as HTMLElement;\r\n const shrinkElement = observerElementChildrenRoot.lastChild as HTMLElement;\r\n const expandElement = observerElementChildrenRoot.firstChild as HTMLElement;\r\n const expandElementChild = expandElement?.firstChild as HTMLElement;\r\n\r\n let cacheSize = offsetSize(listenerElement);\r\n let currSize = cacheSize;\r\n let isDirty = false;\r\n let rAFId: number;\r\n\r\n const reset = () => {\r\n scrollLeft(expandElement, scrollAmount);\r\n scrollTop(expandElement, scrollAmount);\r\n scrollLeft(shrinkElement, scrollAmount);\r\n scrollTop(shrinkElement, scrollAmount);\r\n };\r\n const onResized = () => {\r\n rAFId = 0;\r\n if (isDirty) {\r\n cacheSize = currSize;\r\n onSizeChangedCallbackProxy();\r\n }\r\n };\r\n const onScroll = (scrollEvent?: Event) => {\r\n currSize = offsetSize(listenerElement);\r\n isDirty = !scrollEvent || !equalWH(currSize, cacheSize);\r\n\r\n if (scrollEvent && isDirty && !rAFId) {\r\n cAF(rAFId);\r\n rAFId = rAF(onResized);\r\n } else if (!scrollEvent) {\r\n onResized();\r\n }\r\n\r\n reset();\r\n\r\n if (scrollEvent) {\r\n preventDefault(scrollEvent);\r\n stopPropagation(scrollEvent);\r\n }\r\n return false;\r\n };\r\n\r\n offListeners.push(on(expandElement, scrollEventName, onScroll));\r\n offListeners.push(on(shrinkElement, scrollEventName, onScroll));\r\n\r\n // lets assume that the divs will never be that large and a constant value is enough\r\n style(expandElementChild, {\r\n width: scrollAmount,\r\n height: scrollAmount,\r\n });\r\n reset();\r\n appearCallback = appear ? () => onScroll() : reset;\r\n }\r\n\r\n if (direction) {\r\n const updateDirectionCache = createCache(() => getDirection(sizeObserver));\r\n offListeners.push(\r\n on(sizeObserver, scrollEventName, (event: Event) => {\r\n const directionCache = updateDirectionCache();\r\n const { _value, _changed } = directionCache;\r\n if (_changed) {\r\n if (_value === 'rtl') {\r\n style(listenerElement, { left: 'auto', right: 0 });\r\n } else {\r\n style(listenerElement, { left: 0, right: 'auto' });\r\n }\r\n onSizeChangedCallbackProxy(directionCache);\r\n }\r\n\r\n preventDefault(event);\r\n stopPropagation(event);\r\n return false;\r\n })\r\n );\r\n }\r\n\r\n // appearCallback is always needed on scroll-observer strategy to reset it\r\n if (appearCallback) {\r\n addClass(sizeObserver, classNameSizeObserverAppear);\r\n offListeners.push(on(sizeObserver, animationStartEventName, appearCallback));\r\n }\r\n\r\n prependChildren(target, sizeObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(sizeObserver);\r\n };\r\n};\r\n","import { WH, Cache, createDOM, offsetSize, jsAPI, runEach, prependChildren, removeElements, createCache } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\n\r\nconst classNameTrinsicObserver = 'os-trinsic-observer';\r\nconst IntersectionObserverConstructor = jsAPI('IntersectionObserver');\r\n\r\nexport const createTrinsicObserver = (\r\n target: HTMLElement,\r\n onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => any\r\n): (() => void) => {\r\n const trinsicObserver = createDOM(`
`)[0] as HTMLElement;\r\n const offListeners: (() => void)[] = [];\r\n const updateHeightIntrinsicCache = createCache>(\r\n (ioEntryOrSize) =>\r\n (ioEntryOrSize! as WH).h === 0 ||\r\n (ioEntryOrSize! as IntersectionObserverEntry).isIntersecting ||\r\n (ioEntryOrSize! as IntersectionObserverEntry).intersectionRatio > 0,\r\n {\r\n _initialValue: false,\r\n }\r\n );\r\n\r\n if (IntersectionObserverConstructor) {\r\n const intersectionObserverInstance: IntersectionObserver = new IntersectionObserverConstructor(\r\n (entries: IntersectionObserverEntry[]) => {\r\n if (entries && entries.length > 0) {\r\n const last = entries.pop();\r\n if (last) {\r\n const heightIntrinsicCache = updateHeightIntrinsicCache(0, last);\r\n\r\n if (heightIntrinsicCache._changed) {\r\n onTrinsicChangedCallback(false, heightIntrinsicCache);\r\n }\r\n }\r\n }\r\n },\r\n { root: target }\r\n );\r\n intersectionObserverInstance.observe(trinsicObserver);\r\n offListeners.push(() => intersectionObserverInstance.disconnect());\r\n } else {\r\n offListeners.push(\r\n createSizeObserver(trinsicObserver, () => {\r\n const newSize = offsetSize(trinsicObserver);\r\n const heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize);\r\n\r\n if (heightIntrinsicCache._changed) {\r\n onTrinsicChangedCallback(false, heightIntrinsicCache);\r\n }\r\n })\r\n );\r\n }\r\n\r\n prependChildren(target, trinsicObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(trinsicObserver);\r\n };\r\n};\r\n","import { OSTarget, OSTargetObject, CSSDirection } from 'typings';\r\nimport { createStructureLifecycle } from 'lifecycles/structureLifecycle';\r\nimport { Cache, appendChildren, addClass, contents, is, isHTMLElement, createDiv, each } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\nimport { createTrinsicObserver } from 'observers/trinsicObserver';\r\nimport { Lifecycle } from 'lifecycles/lifecycleBase';\r\n\r\nconst classNameHost = 'os-host';\r\nconst classNamePadding = 'os-padding';\r\nconst classNameViewport = 'os-viewport';\r\nconst classNameContent = 'os-content';\r\n\r\nconst normalizeTarget = (target: OSTarget): OSTargetObject => {\r\n if (isHTMLElement(target)) {\r\n const isTextarea = is(target, 'textarea');\r\n const host = (isTextarea ? createDiv() : target) as HTMLElement;\r\n const padding = createDiv(classNamePadding);\r\n const viewport = createDiv(classNameViewport);\r\n const content = createDiv(classNameContent);\r\n\r\n appendChildren(padding, viewport);\r\n appendChildren(viewport, content);\r\n appendChildren(content, contents(target));\r\n appendChildren(target, padding);\r\n addClass(host, classNameHost);\r\n\r\n return {\r\n target,\r\n host,\r\n padding,\r\n viewport,\r\n content,\r\n };\r\n }\r\n\r\n const { host, padding, viewport, content } = target;\r\n\r\n addClass(host, classNameHost);\r\n addClass(padding, classNamePadding);\r\n addClass(viewport, classNameViewport);\r\n addClass(content, classNameContent);\r\n\r\n return target;\r\n};\r\n\r\nconst OverlayScrollbars = (target: OSTarget, options?: any, extensions?: any): void => {\r\n const osTarget: OSTargetObject = normalizeTarget(target);\r\n const lifecycles: Lifecycle[] = [];\r\n const { host } = osTarget;\r\n\r\n lifecycles.push(createStructureLifecycle(osTarget));\r\n\r\n // eslint-disable-next-line\r\n const onSizeChanged = (directionCache?: Cache) => {\r\n if (directionCache) {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(directionCache);\r\n });\r\n } else {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onSizeChanged && lifecycle._onSizeChanged();\r\n });\r\n }\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsicCache);\r\n });\r\n };\r\n\r\n createSizeObserver(host, onSizeChanged, { _appear: true, _direction: true });\r\n createTrinsicObserver(host, onTrinsicChanged);\r\n};\r\n\r\nexport { OverlayScrollbars };\r\n","import { createDOM } from 'support/dom';\r\nimport { getEnvironment } from 'environment';\r\nimport { OverlayScrollbars } from 'overlayscrollbars/overlayscrollbars';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n getEnvironment(),\r\n OverlayScrollbars(document.body),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["type","obj","undefined","Object","prototype","toString","call","replace","toLowerCase","isNumber","isString","isFunction","isUndefined","isNull","isArray","Array","isObject","isArrayLike","length","isPlainObject","key","proto","hasOwnProperty","hasOwnConstructor","hasIsPrototypeOf","constructor","isHTMLElement","instaceOfRightHandSide","window","HTMLElement","doInstanceOf","nodeType","nodeName","isEmptyObject","name","getSetProp","topLeft","fallback","elm","value","attr","attrName","getAttribute","setAttribute","removeAttr","removeAttribute","scrollLeft","scrollTop","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","keys","from","arr","push","runEach","Set","forEach","fn","matches","selector","Element","msMatchesSelector","is","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","prependChildren","removeElements","nodes","e","removeChild","createDiv","classNames","div","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","passiveEventsSupport","supportPassiveEvents","addEventListener","defineProperty","get","off","target","eventNames","listener","capture","split","eventName","removeEventListener","on","options","doSupportPassiveEvents","passive","_passive","_capture","once","_once","offListeners","nativeOptions","finalListener","evt","bind","stopPropagation","preventDefault","equal","a","b","props","prop","equalWH","equalTRBL","assignDeep","object1","object2","object3","object4","object5","object6","sources","copy","copyIsArray","src","clone","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","parseToZeroOrNumber","toFloat","num","parseFloat","parseInt","Number","isNaN","adaptCSSVal","val","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","topRightBottomLeft","property","finalProp","top","right","bottom","left","t","r","l","x","y","absoluteCoordinates","rect","pageYOffset","pageXOffset","createCache","update","_equal","_initialValue","_value","_previous","force","context","prev","newVal","changed","_changed","firstLetterToUpper","str","charAt","toUpperCase","slice","getDummyStyle","cssPrefixes","jsPrefixes","jsCache","cssCache","cssProperty","uppercasedName","elmStyle","prefix","prefixWithoutDashes","resultPossibilities","find","resultPossibility","jsAPI","resizeObserver","_extends","module","assign","arguments","apply","stringify","JSON","templateTypePrefixSuffix","optionsTemplateTypes","item","validateRecursive","template","optionsDiff","doWriteErrors","propPath","validatedOptions","optionsCopy","filter","optionsDiffValue","optionsValue","templateValue","templateIsComplex","propPrefix","validatedResult","_validated","_foreign","isValid","errorEnumStrings","errorPossibleTypes","optionsValueType","templateValueArr","currTemplateType","typeString","isEnumString","enumStringSplit","possibility","string","doStringifyComparison","console","warn","join","validateOptions","transformOptions","optionsWithOptionsTemplate","_template","_options","tmpResult","environmentInstance","abs","Math","round","environmentElmId","classNameFlexboxGlue","classNameFlexboxGlueMax","getNativeScrollbarSize","body","measureElm","cSize","oSize","getNativeScrollbarStyling","testElm","ex","getRtlScrollBehavior","childElm","strHidden","overflowX","overflowY","direction","parentOffset","childOffset","childOffsetAfterScroll","n","getFlexboxGlue","minOffsetsizeParent","minOffsetsize","supportsMin","maxOffsetsizeParent","maxOffsetsize","supportsMax","getWindowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","createEnvironment","envDOM","envElm","envChildElm","onChangedListener","nativeScrollBarSize","nativeScrollbarIsOverlaid","env","_autoUpdateLoop","_nativeScrollbarSize","_nativeScrollbarIsOverlaid","_nativeScrollbarStyling","_rtlScrollBehavior","_flexboxGlue","_addListener","_removeListener","delete","size","dpr","scrollbarSize","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","newScrollbarSize","getEnvironment","getPropByPath","path","o","createLifecycleBase","defaultOptionsWithTemplate","initialOptions","updateFunction","optionsTemplate","defaultOptions","hints","_force","_changedOptions","checkOption","newOptions","_update","overflowBehaviorAllowedValues","paddingAbsolute","oTypes","boolean","overflowBehavior","cssMarginEnd","cssBorderEnd","createStructureLifecycle","host","paddingElm","padding","viewport","content","destructFns","scrollbarsOverlaid","supportsScrollbarStyling","supportFlexboxGlue","directionObserverObsolete","updatePaddingCache","paddingAbsoluteChanged","paddingChanged","paddingStyle","onSizeChanged","onTrinsicChanged","widthIntrinsic","heightIntrinsicCache","height","_onSizeChanged","_onTrinsicChanged","_destruct","animationStartEventName","scrollEventName","scrollAmount","ResizeObserverConstructor","classNameSizeObserver","classNameSizeObserverAppear","classNameSizeObserverListener","classNameSizeObserverListenerScroll","classNameSizeObserverListenerItem","classNameSizeObserverListenerItemFinal","cAF","cancelAnimationFrame","rAF","requestAnimationFrame","getDirection","createSizeObserver","onSizeChangedCallback","_direction","_appear","appear","rtlScrollBehavior","baseElements","sizeObserver","listenerElement","onSizeChangedCallbackProxy","directionCache","rtl","appearCallback","resizeObserverInstance","observe","disconnect","observerElementChildren","observerElementChildrenRoot","shrinkElement","lastChild","expandElement","expandElementChild","cacheSize","currSize","isDirty","rAFId","reset","onResized","onScroll","scrollEvent","width","updateDirectionCache","event","classNameTrinsicObserver","IntersectionObserverConstructor","createTrinsicObserver","onTrinsicChangedCallback","trinsicObserver","updateHeightIntrinsicCache","ioEntryOrSize","isIntersecting","intersectionRatio","intersectionObserverInstance","entries","last","pop","root","newSize","classNameHost","classNamePadding","classNameViewport","classNameContent","normalizeTarget","isTextarea","OverlayScrollbars","extensions","osTarget","lifecycles","lifecycle","_onDirectionChanged"],"mappings":"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"} \ No newline at end of file diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.min.js b/packages/overlayscrollbars/dist/overlayscrollbars.min.js index c789aa5..fbaa3cd 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.min.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.min.js @@ -1 +1 @@ -!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).OverlayScrollbars=r()}(this,(function(){"use strict";var n=function(n){return null==n?""+n:Object.prototype.toString.call(n).replace(/^\[object (.+)\]$/,"$1").toLowerCase()};function r(n){return"number"==typeof n}function t(n){return"string"==typeof n}function i(n){return"function"==typeof n}function e(n){return void 0===n}function o(n){return null===n}function u(n){return Array.isArray(n)}function c(n){return"object"==typeof n&&!u(n)&&!o(n)}function f(n){var t=!!n&&n.length;return u(n)||!i(n)&&r(t)&&t>-1&&t%1==0}function a(r){if(!r||!c(r)||"object"!==n(r))return!1;var t,i=Object.prototype.hasOwnProperty,o=i.call(r,"constructor"),u=r.constructor&&r.constructor.prototype&&i.call(r.constructor.prototype,"isPrototypeOf");if(r.constructor&&!o&&!u)return!1;for(t in r);return e(t)||i.call(r,t)}function s(n,r,t,i){if(e(i))return t?t[n]:r;t&&(t[n]=i)}var l=function(n,r){null==n||n.removeAttribute(r)};function v(n,r){return s("scrollLeft",0,n,r)}function d(n,r){return s("scrollTop",0,n,r)}var h=/[^\x20\t\r\n\f]+/g,b=function(n,r){!function(n,r,i){var e,o=0,u=!1;if(n&&t(r)){var c=r.match(h)||[];for(u=c.length>0;e=c[o++];)u=i(n.classList,e)&&u}}(n,r,(function(n,r){return n.add(r)}))};function w(n,r){if(f(n))for(var t=0;t0?"\r\nValid strings are: [ "+x.join(", ")+" ].":""));delete v[d]}})),{O:v,_:l}}(r,i,o||{},c||!1)};var an=Math.abs,sn=Math.round,ln=function(n,r){z(n,r);var t,i=(t=r)?{w:t.clientWidth,h:t.clientHeight}:T,e=C(r);return{x:e.h-i.h,y:e.w-i.w}},vn=function(n){var r=!1;b(n,"os-viewport-scrollbar-styled");try{r="none"===J(n,"scrollbar-width")||"none"===window.getComputedStyle(n,"::-webkit-scrollbar").getPropertyValue("display")}catch(t){}return r},dn=function(n,r){J(n,{overflowX:"hidden",overflowY:"hidden",direction:"rtl"}),v(n,0);var t=U(n),i=U(r);v(n,-999);var e=U(r);return{i:t.x===i.x,n:i.x!==e.x}},hn=function(n,r){b(n,"flexbox-glue");var t=C(n),i=C(r),e=I(i,t);b(n,"flexbox-glue-max");var o=C(n),u=C(r),c=I(u,o);return e&&c},bn=function(){var n=window.screen.deviceXDPI||0,r=window.screen.logicalXDPI||1;return window.devicePixelRatio||n/r},wn=function(){var n=document.body,r=A('
')[0],t=r.firstChild,i=new Set,e=ln(n,r),o={x:0===e.x,y:0===e.y},u={j:!1,S:e,A:o,T:vn(r),k:dn(r,t),C:hn(r,t),L:function(n){i.add(n)},M:function(n){i.delete(n)}};if(l(r,"style"),l(r,"class"),j(r),!o.x||!o.y){var c=k(),f=bn(),a=e;window.addEventListener("resize",(function(){if(i.size){var t=k(),e={w:t.w-c.w,h:t.h-c.h};if(0===e.w&&0===e.h)return;var o={w:an(e.w),h:an(e.h)},u={w:an(sn(t.w/(c.w/100))),h:an(sn(t.h/(c.h/100)))},s=bn(),l=o.w>2&&o.h>2,v=(h=u.h,b=an(u.w),w=an(h),!(b!==w&&b+1!==w&&b-1!==w));if(l&&v&&(s!==f&&f>0)){var d=tn.S=ln(n,r);j(r),a.x===d.x&&a.y===d.y||m(i),a=d}c=t,f=s}var h,b,w}))}return u},pn=function(){return tn||(tn=wn()),tn},gn=function(n,r,t,i){var e=function n(r){var t={q:{},F:{}};return w(N(r),(function(i){var e=r[i];if(u(e))t.q[i]=e[1],t.F[i]=e[0];else{var o=n(e);t.q[i]=o.q,t.F[i]=o.F}})),t}(n),o=e.q,c=R({},e.F,fn(t||{},o,null,!0)._),f=V(r),a=V(c,!0),s=function(n){var r="boolean"==typeof n.I,t=!0===n.I,e=f(t?null:n.P||(r?null:[]),t),o=a(t?null:n.B,!!n.B||t);(o.m||e.m)&&i(o,e)};return s({I:!0}),{F:function(n){if(n){var r=fn(n,o,c,!0)._;R(c,r),s({B:N(r)})}return c},N:function(n){s({I:!!n})},R:function(n){s({P:n})}}},mn=nn("margin-inline-end"),yn=nn("border-inline-end"),_n=function(n,r){var t=n.host,i=n.viewport,e=n.content,o=[],u=pn(),c=u.A,f=u.T,a=(u.C,mn&&yn||f||c.y,gn({paddingAbsolute:[!1,cn.boolean],overflowBehavior:{x:["scroll","visible-hidden visible-scroll scroll hidden"],y:["scroll","visible-hidden visible-scroll scroll hidden"]}},{padding:[function(){return u=J(t,[r=(n="padding"||"")+"-top",i=n+"-right",e=n+"-bottom",o=n+"-left"]),{t:$(u[r]),r:$(u[i]),b:$(u[e]),l:$(u[o])};var n,r,i,e,o,u},P]},r,(function(n,r){var t=n.paddingAbsolute,e=t.p,o=t.v,c=r.padding,a=c.p,s=c.v;if(o||s){var l={t:0,r:0,b:0,l:0};e||(l.t=-a.t,l.r=-(a.r+a.l),l.b=-(a.b+a.t),l.l=-a.l),f||(l.r-=u.S.y,l.b-=u.S.x),J(i,{top:l.t,left:l.l,"margin-right":l.r,"margin-bottom":l.b})}console.log(n),console.log(r)}))),s=a.F,l=a.N,v=a.R;return{F:s,N:l,Y:function(){v("padding")},$:function(n,r){J(e,r?{height:"auto"}:{height:"100%"})},D:function(){m(o)}}},xn=rn("ResizeObserver"),zn=cancelAnimationFrame,On=requestAnimationFrame,jn=function(n){return J(n,"direction")},Sn=function(n,r,i){var e,o=i||{},u=o.G,c=void 0!==u&&u,f=o.J,a=void 0!==f&&f,s=pn().k,l=A('
')[0],h=l.firstChild,w=function(n){if(c){var i="rtl"===jn(l);v(l,i?s.n?-3333333:s.i?0:3333333:3333333),d(l,3333333)}r(t(n)?n:void 0)},p=[],g=a?w:null;if(xn){var y=new xn(w);y.observe(h),p.push((function(){return y.disconnect()}))}else{var _=A('
');z(h,_);var x,S=_[0],T=S.lastChild,k=S.firstChild,L=null==k?void 0:k.firstChild,F=C(h),P=F,B=!1,N=function(){v(k,3333333),d(k,3333333),v(T,3333333),d(T,3333333)},R=function(){x=0,B&&(F=P,w())},Y=function(n){return P=C(h),B=!n||!I(P,F),n&&B&&!x?(zn(x),x=On(R)):n||R(),N(),n&&(q(n),M(n)),!1};p.push(E(k,"scroll",Y)),p.push(E(T,"scroll",Y)),J(L,{width:3333333,height:3333333}),N(),g=a?function(){return Y()}:N}c&&p.push(E(l,"scroll",(function(n){var r=jn(l);return r!==e&&(J(h,"rtl"===r?{left:"auto",right:0}:{left:0,right:"auto"}),e=r,w(r)),q(n),M(n),!1})));return g&&(b(l,"os-size-observer-appear"),p.push(E(l,"animationstart",g))),O(n,l),function(){m(p),j(l)}},An=rn("IntersectionObserver"),Tn=function(n){if(u=n,c(f=window.HTMLElement)||i(f)?u instanceof f:u&&c(u)&&1===u.nodeType&&t(u.nodeName)){var r=y(n,"textarea")?S():n,e=S("os-viewport"),o=S("os-content");return z(e,o),z(o,_(n)),z(n,e),b(r,"os-host"),{target:n,host:r,viewport:e,content:o}}var u,f,a=n.host,s=n.viewport,l=n.content;return b(a,"os-host"),b(s,"os-viewport"),b(l,"os-content"),n},kn=function(n,r,t){var i=Tn(n),e=[],o=i.host;e.push(_n(i));Sn(o,(function(n){w(e,n?function(r){r.K&&r.K(n)}:function(n){n.Y&&n.Y()})}),{J:!0,G:!0}),function(n,r){var t=A('
')[0],i=[],e=!1;if(An){var o=new An((function(n){if(n&&n.length>0){var t=n.pop();if(t){var i=t.isIntersecting||t.intersectionRatio>0;i!==e&&(r(!1,i),e=i)}}}),{root:n});o.observe(t),i.push((function(){return o.disconnect()}))}else i.push(Sn(t,(function(){var n=0===C(t).h;n!==e&&(r(!1,n),e=n)})));O(n,t)}(o,(function(n,r){w(e,(function(t){t.$&&t.$(n,r)}))}))};return function(){return[pn(),kn(document.body),A('
fdfhdfgh
')]}})); \ No newline at end of file +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).OverlayScrollbars=r()}(this,(function(){"use strict";var n=function(n){return null==n?""+n:Object.prototype.toString.call(n).replace(/^\[object (.+)\]$/,"$1").toLowerCase()};function r(n){return"number"==typeof n}function t(n){return"string"==typeof n}function i(n){return"function"==typeof n}function e(n){return void 0===n}function o(n){return null===n}function u(n){return Array.isArray(n)}function c(n){return"object"==typeof n&&!u(n)&&!o(n)}function f(n){var t=!!n&&n.length;return u(n)||!i(n)&&r(t)&&t>-1&&t%1==0}function a(r){if(!r||!c(r)||"object"!==n(r))return!1;var t,i=Object.prototype.hasOwnProperty,o=i.call(r,"constructor"),u=r.constructor&&r.constructor.prototype&&i.call(r.constructor.prototype,"isPrototypeOf");if(r.constructor&&!o&&!u)return!1;for(t in r);return e(t)||i.call(r,t)}function s(n,r,t,i){if(e(i))return t?t[n]:r;t&&(t[n]=i)}var l=function(n,r){null==n||n.removeAttribute(r)};function v(n,r){return s("scrollLeft",0,n,r)}function d(n,r){return s("scrollTop",0,n,r)}var b=/[^\x20\t\r\n\f]+/g,h=function(n,r){!function(n,r,i){var e,o=0,u=!1;if(n&&t(r)){var c=r.match(b)||[];for(u=c.length>0;e=c[o++];)u=i(n.classList,e)&&u}}(n,r,(function(n,r){return n.add(r)}))};function p(n,r){if(f(n))for(var t=0;t0?"\r\nValid strings are: [ "+x.join(", ")+" ].":""));delete v[d]}})),{j:v,O:l}}(r,i,o||{},c||!1)};var an=Math.abs,sn=Math.round,ln=function(n,r){z(n,r);var t,i=(t=r)?{w:t.clientWidth,h:t.clientHeight}:T,e=L(r);return{x:e.h-i.h,y:e.w-i.w}},vn=function(n){var r=!1;h(n,"os-viewport-scrollbar-styled");try{r="none"===G(n,"scrollbar-width")||"none"===window.getComputedStyle(n,"::-webkit-scrollbar").getPropertyValue("display")}catch(t){}return r},dn=function(n,r){G(n,{overflowX:"hidden",overflowY:"hidden",direction:"rtl"}),v(n,0);var t=K(n),i=K(r);v(n,-999);var e=K(r);return{i:t.x===i.x,n:i.x!==e.x}},bn=function(n,r){h(n,"flexbox-glue");var t=L(n),i=L(r),e=P(i,t);h(n,"flexbox-glue-max");var o=L(n),u=L(r),c=P(u,o);return e&&c},hn=function(){var n=window.screen.deviceXDPI||0,r=window.screen.logicalXDPI||1;return window.devicePixelRatio||n/r},pn=function(){var n=document.body,r=A('
')[0],t=r.firstChild,i=new Set,e=ln(n,r),o={x:0===e.x,y:0===e.y},u={S:!1,A:e,T:o,k:vn(r),L:dn(r,t),q:bn(r,t),M:function(n){i.add(n)},F:function(n){i.delete(n)}};if(l(r,"style"),l(r,"class"),j(r),!o.x||!o.y){var c=k(),f=hn(),a=e;window.addEventListener("resize",(function(){if(i.size){var t=k(),e={w:t.w-c.w,h:t.h-c.h};if(0===e.w&&0===e.h)return;var o={w:an(e.w),h:an(e.h)},u={w:an(sn(t.w/(c.w/100))),h:an(sn(t.h/(c.h/100)))},s=hn(),l=o.w>2&&o.h>2,v=(b=u.h,h=an(u.w),p=an(b),!(h!==p&&h+1!==p&&h-1!==p));if(l&&v&&(s!==f&&f>0)){var d=tn.A=ln(n,r);j(r),a.x===d.x&&a.y===d.y||g(i),a=d}c=t,f=s}var b,h,p}))}return u},wn=function(){return tn||(tn=pn()),tn},mn=function(n,r){return n&&r.split(".").reduce((function(n,r){return n&&C(n,r)?n[r]:void 0}),n)},gn=function(n,r,t){var i=function n(r){var t={I:{},P:{}};return p(N(r),(function(i){var e=r[i];if(u(e))t.I[i]=e[1],t.P[i]=e[0];else{var o=n(e);t.I[i]=o.I,t.P[i]=o.P}})),t}(n),e=i.I,o=R({},i.P,fn(r||{},e,null,!0).O),c=function(n){var r=n.B,i=n.C;t(!!r,(function(n){return{m:mn(o,n),_:r||void 0!==mn(i,n)}}))};return c({B:!0}),{P:function(n){if(n){var r=fn(n,e,o,!0).O;R(o,r),c({C:r})}return o},N:function(n){c({B:n})}}},_n={paddingAbsolute:[!1,cn.boolean],overflowBehavior:{x:["scroll","visible-hidden visible-scroll scroll hidden"],y:["scroll","visible-hidden visible-scroll scroll hidden"]}},yn=nn("margin-inline-end"),xn=nn("border-inline-end"),zn=function(n,r){var t=n.host,i=n.padding,e=(n.viewport,n.content),o=[],u=wn(),c=u.T,f=u.k,a=(u.q,yn&&xn||f||c.y,U((function(){return u=G(t,[r=(n="padding"||"")+"-top",i=n+"-right",e=n+"-bottom",o=n+"-left"]),{t:Y(u[r]),r:Y(u[i]),b:Y(u[e]),l:Y(u[o])};var n,r,i,e,o,u}),{v:B})),s=gn(_n,r,(function(n,r){var t=r("paddingAbsolute"),e=t.m,o=t._,c=a(n),s=c.m,l=c._;if(o||l){var v={t:0,r:0,b:0,l:0};e||(v.t=-s.t,v.r=-(s.r+s.l),v.b=-(s.b+s.t),v.l=-s.l),f||(v.r-=u.A.y,v.b-=u.A.x),G(i,{top:v.t,left:v.l,"margin-right":v.r,"margin-bottom":v.b,"max-width":"calc(100% + "+-1*v.r+"px)"})}})),l=s.P,v=s.N;return{P:l,N:v,R:function(){v()},V:function(n,r){var t=r._,i=r.m;t&&G(e,{height:i?"auto":"100%"})},Y:function(){g(o)}}},On=rn("ResizeObserver"),jn=cancelAnimationFrame,Sn=requestAnimationFrame,An=function(n){return G(n,"direction")},Tn=function(n,r,i){var e=i||{},o=e.$,u=void 0!==o&&o,c=e.D,f=void 0!==c&&c,a=wn().L,s=A('
')[0],l=s.firstChild,b=function(n){if(u){var i="rtl"===An(s);v(s,i?a.n?-3333333:a.i?0:3333333:3333333),d(s,3333333)}r(t((n||{}).m)?n:void 0)},p=[],w=f?b:null;if(On){var m=new On(b);m.observe(l),p.push((function(){return m.disconnect()}))}else{var _=A('
');z(l,_),h(l,"os-size-observer-listener-scroll");var y,x=_[0],S=x.lastChild,T=x.firstChild,k=null==T?void 0:T.firstChild,q=L(l),I=q,B=!1,C=function(){v(T,3333333),d(T,3333333),v(S,3333333),d(S,3333333)},N=function(){y=0,B&&(q=I,b())},R=function(n){return I=L(l),B=!n||!P(I,q),n&&B&&!y?(jn(y),y=Sn(N)):n||N(),C(),n&&(F(n),M(n)),!1};p.push(E(T,"scroll",R)),p.push(E(S,"scroll",R)),G(k,{width:3333333,height:3333333}),C(),w=f?function(){return R()}:C}if(u){var V=U((function(){return An(s)}));p.push(E(s,"scroll",(function(n){var r=V(),t=r.m;return r._&&(G(l,"rtl"===t?{left:"auto",right:0}:{left:0,right:"auto"}),b(r)),F(n),M(n),!1})))}return w&&(h(s,"os-size-observer-appear"),p.push(E(s,"animationstart",w))),O(n,s),function(){g(p),j(s)}},kn=rn("IntersectionObserver"),Ln=function(n){if(f=n,c(a=window.HTMLElement)||i(a)?f instanceof a:f&&c(f)&&1===f.nodeType&&t(f.nodeName)){var r=_(n,"textarea")?S():n,e=S("os-padding"),o=S("os-viewport"),u=S("os-content");return z(e,o),z(o,u),z(u,y(n)),z(n,e),h(r,"os-host"),{target:n,host:r,padding:e,viewport:o,content:u}}var f,a,s=n.host,l=n.padding,v=n.viewport,d=n.content;return h(s,"os-host"),h(l,"os-padding"),h(v,"os-viewport"),h(d,"os-content"),n},qn=function(n,r,t){var i=Ln(n),e=[],o=i.host;e.push(zn(i));Tn(o,(function(n){p(e,n?function(r){r.G&&r.G(n)}:function(n){n.R&&n.R()})}),{D:!0,$:!0}),function(n,r){var t=A('
')[0],i=[],e=U((function(n){return 0===n.h||n.isIntersecting||n.intersectionRatio>0}),{p:!1});if(kn){var o=new kn((function(n){if(n&&n.length>0){var t=n.pop();if(t){var i=e(0,t);i._&&r(!1,i)}}}),{root:n});o.observe(t),i.push((function(){return o.disconnect()}))}else i.push(Tn(t,(function(){var n=L(t),i=e(0,n);i._&&r(!1,i)})));O(n,t)}(o,(function(n,r){p(e,(function(t){t.V&&t.V(n,r)}))}))};return function(){return[wn(),qn(document.body),A('
fdfhdfgh
')]}})); \ No newline at end of file diff --git a/packages/overlayscrollbars/src/lifecycles/lifecycleBase.ts b/packages/overlayscrollbars/src/lifecycles/lifecycleBase.ts index 7c82232..948587f 100644 --- a/packages/overlayscrollbars/src/lifecycles/lifecycleBase.ts +++ b/packages/overlayscrollbars/src/lifecycles/lifecycleBase.ts @@ -1,71 +1,67 @@ import { - CacheUpdateInfo, - CachePropsToUpdate, Cache, + OptionsValidated, OptionsWithOptionsTemplate, transformOptions, validateOptions, assignDeep, - createCache, - isBoolean, - keys, + hasOwnProperty, + isEmptyObject, } from 'support'; -import { PlainObject } from 'typings'; +import { CSSDirection, PlainObject } from 'typings'; -interface LifecycleUpdateHints { +interface LifecycleBaseUpdateHints { _force?: boolean; - _changedOptions?: CachePropsToUpdate; - _changedCache?: CachePropsToUpdate; + _changedOptions?: OptionsValidated; } -interface AbstractLifecycle { +export interface LifecycleBase { _options(newOptions?: O): O; _update(force?: boolean): void; } -export interface Lifecycle extends AbstractLifecycle { +export interface Lifecycle extends LifecycleBase { _destruct(): void; _onSizeChanged?(): void; - _onDirectionChanged?(direction: 'ltr' | 'rtl'): void; - _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsic: boolean): void; + _onDirectionChanged?(directionCache: Cache): void; + _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsicCache: Cache): void; } -export interface LifecycleBase extends AbstractLifecycle { - _updateCache(cachePropsToUpdate?: CachePropsToUpdate): void; +export interface LifecycleOptionInfo { + _value: T; + _changed: boolean; } +export type LifecycleCheckOption = (path: string) => LifecycleOptionInfo; + +const getPropByPath = (obj: any, path: string): T => + obj && path.split('.').reduce((o, prop) => (o && hasOwnProperty(o, prop) ? o[prop] : undefined), obj); + /** * Creates a object which can be seen as the base of a lifecycle because it provides all the tools to manage a lifecycle and its options, cache and base functions. * @param defaultOptionsWithTemplate A object which describes the options and the default options of the lifecycle. - * @param cacheUpdateInfo A object which describes how cache updates shall behave. * @param initialOptions The initialOptions for the lifecylce. (Can be undefined) * @param updateFunction The update function where cache and options updates are handled. Has two arguments which are the changedOptions and the changedCache objects. */ -export const createLifecycleBase = ( +export const createLifecycleBase = ( defaultOptionsWithTemplate: OptionsWithOptionsTemplate>, - cacheUpdateInfo: CacheUpdateInfo, initialOptions: O | undefined, - updateFunction: (options: Cache, cache: Cache) => any -): LifecycleBase => { + updateFunction: (force: boolean, checkOption: LifecycleCheckOption) => any +): LifecycleBase => { const { _template: optionsTemplate, _options: defaultOptions } = transformOptions>(defaultOptionsWithTemplate); const options: Required = assignDeep( {}, defaultOptions, validateOptions(initialOptions || ({} as O), optionsTemplate, null, true)._validated ); - const cacheChange = createCache(cacheUpdateInfo); - const cacheOptions = createCache(options, true); - const update = (hints: LifecycleUpdateHints) => { - const hasForce = isBoolean(hints._force); // indication that it was called from outside - const force = hints._force === true; - - const changedCache = cacheChange(force ? null : hints._changedCache || (hasForce ? null : []), force); - const changedOptions = cacheOptions(force ? null : hints._changedOptions, !!hints._changedOptions || force); - - if (changedOptions._anythingChanged || changedCache._anythingChanged) { - updateFunction(changedOptions, changedCache); - } + const update = (hints: LifecycleBaseUpdateHints) => { + const { _force, _changedOptions } = hints; + const checkOption: LifecycleCheckOption = (path) => ({ + _value: getPropByPath(options, path), + _changed: _force || getPropByPath(_changedOptions, path) !== undefined, + }); + updateFunction(!!_force, checkOption); }; update({ _force: true }); @@ -73,18 +69,17 @@ export const createLifecycleBase = ( return { _options(newOptions?: O) { if (newOptions) { - const { _validated: changedOptions } = validateOptions(newOptions, optionsTemplate, options, true); - assignDeep(options, changedOptions); + const { _validated: _changedOptions } = validateOptions(newOptions, optionsTemplate, options, true); - update({ _changedOptions: keys(changedOptions) as CachePropsToUpdate }); + if (!isEmptyObject(_changedOptions)) { + assignDeep(options, _changedOptions); + update({ _changedOptions }); + } } return options; }, - _update: (force?: boolean) => { - update({ _force: !!force }); - }, - _updateCache: (cachePropsToUpdate?: CachePropsToUpdate) => { - update({ _changedCache: cachePropsToUpdate }); + _update: (_force?: boolean) => { + update({ _force }); }, }; }; diff --git a/packages/overlayscrollbars/src/lifecycles/structureLifecycle.ts b/packages/overlayscrollbars/src/lifecycles/structureLifecycle.ts index 775b218..16cecac 100644 --- a/packages/overlayscrollbars/src/lifecycles/structureLifecycle.ts +++ b/packages/overlayscrollbars/src/lifecycles/structureLifecycle.ts @@ -1,4 +1,16 @@ -import { cssProperty, runEach, topRightBottomLeft, TRBL, equalTRBL, optionsTemplateTypes as oTypes, OptionsTemplateValue, style } from 'support'; +import { + Cache, + cssProperty, + runEach, + createCache, + topRightBottomLeft, + TRBL, + equalTRBL, + optionsTemplateTypes as oTypes, + OptionsTemplateValue, + style, + OptionsWithOptionsTemplate, +} from 'support'; import { OSTargetObject } from 'typings'; import { createLifecycleBase, Lifecycle } from 'lifecycles/lifecycleBase'; import { getEnvironment, Environment } from 'environment'; @@ -11,11 +23,15 @@ export interface StructureLifecycleOptions { y?: OverflowBehavior; }; } -interface StructureLifecycleCache { - padding: TRBL; -} const overflowBehaviorAllowedValues: OptionsTemplateValue = 'visible-hidden visible-scroll scroll hidden'; +const defaultOptionsWithTemplate: OptionsWithOptionsTemplate> = { + paddingAbsolute: [false, oTypes.boolean], + overflowBehavior: { + x: ['scroll', overflowBehaviorAllowedValues], + y: ['scroll', overflowBehaviorAllowedValues], + }, +}; const classNameHost = 'os-host'; const classNameViewport = 'os-viewport'; @@ -38,58 +54,49 @@ export const createStructureLifecycle = ( // direction change is only needed to update scrollbar hiding, therefore its not needed if css can do it, scrollbars are invisible or overlaid on y axis const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y; - const { _options, _update, _updateCache } = createLifecycleBase( - { - paddingAbsolute: [false, oTypes.boolean], - overflowBehavior: { - x: ['scroll', overflowBehaviorAllowedValues], - y: ['scroll', overflowBehaviorAllowedValues], - }, - }, - { - padding: [() => topRightBottomLeft(host, 'padding'), equalTRBL], - }, - initialOptions, - (options, cache) => { - const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = options.paddingAbsolute; - const { _value: padding, _changed: paddingChanged } = cache.padding; + const updatePaddingCache = createCache(() => topRightBottomLeft(host, 'padding'), { _equal: equalTRBL }); - if (paddingAbsoluteChanged || paddingChanged) { - const paddingStyle: TRBL = { - t: 0, - r: 0, - b: 0, - l: 0, - }; + const { _options, _update } = createLifecycleBase(defaultOptionsWithTemplate, initialOptions, (force, checkOption) => { + const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = checkOption('paddingAbsolute'); + const { _value: padding, _changed: paddingChanged } = updatePaddingCache(force); - if (!paddingAbsolute) { - paddingStyle.t = -padding!.t; - paddingStyle.r = -(padding!.r + padding!.l); - paddingStyle.b = -(padding!.b + padding!.t); - paddingStyle.l = -padding!.l; - } + if (paddingAbsoluteChanged || paddingChanged) { + const paddingStyle: TRBL = { + t: 0, + r: 0, + b: 0, + l: 0, + }; - if (!supportsScrollbarStyling) { - paddingStyle.r -= env._nativeScrollbarSize.y; - paddingStyle.b -= env._nativeScrollbarSize.x; - } - - style(paddingElm, { top: paddingStyle.t, left: paddingStyle.l, 'margin-right': paddingStyle.r, 'margin-bottom': paddingStyle.b }); + if (!paddingAbsolute) { + paddingStyle.t = -padding!.t; + paddingStyle.r = -(padding!.r + padding!.l); + paddingStyle.b = -(padding!.b + padding!.t); + paddingStyle.l = -padding!.l; } - console.log(options); // eslint-disable-line - console.log(cache); // eslint-disable-line + if (!supportsScrollbarStyling) { + paddingStyle.r -= env._nativeScrollbarSize.y; + paddingStyle.b -= env._nativeScrollbarSize.x; + } + + style(paddingElm, { + top: paddingStyle.t, + left: paddingStyle.l, + 'margin-right': paddingStyle.r, + 'margin-bottom': paddingStyle.b, + 'max-width': `calc(100% + ${paddingStyle.r * -1}px)`, + }); } - ); + }); const onSizeChanged = () => { - _updateCache('padding'); + _update(); }; - const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsic: boolean) => { - if (heightIntrinsic) { - style(content, { height: 'auto' }); - } else { - style(content, { height: '100%' }); + const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => { + const { _changed, _value } = heightIntrinsicCache; + if (_changed) { + style(content, { height: _value ? 'auto' : '100%' }); } }; diff --git a/packages/overlayscrollbars/src/observers/sizeObserver.ts b/packages/overlayscrollbars/src/observers/sizeObserver.ts index 16b47bf..4ab4704 100644 --- a/packages/overlayscrollbars/src/observers/sizeObserver.ts +++ b/packages/overlayscrollbars/src/observers/sizeObserver.ts @@ -1,4 +1,6 @@ import { + Cache, + createCache, createDOM, style, appendChildren, @@ -16,6 +18,7 @@ import { isString, equalWH, } from 'support'; +import { CSSDirection } from 'typings'; import { getEnvironment } from 'environment'; const animationStartEventName = 'animationstart'; @@ -30,15 +33,12 @@ const classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item const classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`; const cAF = cancelAnimationFrame; const rAF = requestAnimationFrame; -const getDirection = (elm: HTMLElement) => style(elm, 'direction'); +const getDirection = (elm: HTMLElement): CSSDirection => style(elm, 'direction') as CSSDirection; -// TODO: -// 1. MAYBE add comparison function to offsetSize etc. -type Direction = 'ltr' | 'rtl'; export type SizeObserverOptions = { _direction?: boolean; _appear?: boolean }; export const createSizeObserver = ( target: HTMLElement, - onSizeChangedCallback: (direction?: Direction) => any, + onSizeChangedCallback: (directionCache?: Cache) => any, options?: SizeObserverOptions ): (() => void) => { const { _direction: direction = false, _appear: appear = false } = options || {}; @@ -46,13 +46,13 @@ export const createSizeObserver = ( const baseElements = createDOM(`
`); const sizeObserver = baseElements[0] as HTMLElement; const listenerElement = sizeObserver.firstChild as HTMLElement; - const onSizeChangedCallbackProxy = (dir?: Direction) => { + const onSizeChangedCallbackProxy = (directionCache?: Cache) => { if (direction) { const rtl = getDirection(sizeObserver) === 'rtl'; scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount); scrollTop(sizeObserver, scrollAmount); } - onSizeChangedCallback(isString(dir) ? dir : undefined); + onSizeChangedCallback(isString((directionCache || {})._value) ? directionCache : undefined); }; const offListeners: (() => void)[] = []; let appearCallback: ((...args: any) => any) | null = appear ? onSizeChangedCallbackProxy : null; @@ -83,14 +83,12 @@ export const createSizeObserver = ( scrollLeft(shrinkElement, scrollAmount); scrollTop(shrinkElement, scrollAmount); }; - const onResized = function () { + const onResized = () => { rAFId = 0; - if (!isDirty) { - return; + if (isDirty) { + cacheSize = currSize; + onSizeChangedCallbackProxy(); } - - cacheSize = currSize; - onSizeChangedCallbackProxy(); }; const onScroll = (scrollEvent?: Event) => { currSize = offsetSize(listenerElement); @@ -104,6 +102,7 @@ export const createSizeObserver = ( } reset(); + if (scrollEvent) { preventDefault(scrollEvent); stopPropagation(scrollEvent); @@ -124,19 +123,18 @@ export const createSizeObserver = ( } if (direction) { - let dirCache: string | undefined; + const updateDirectionCache = createCache(() => getDirection(sizeObserver)); offListeners.push( on(sizeObserver, scrollEventName, (event: Event) => { - const dir = getDirection(sizeObserver); - const changed = dir !== dirCache; - if (changed) { - if (dir === 'rtl') { + const directionCache = updateDirectionCache(); + const { _value, _changed } = directionCache; + if (_changed) { + if (_value === 'rtl') { style(listenerElement, { left: 'auto', right: 0 }); } else { style(listenerElement, { left: 0, right: 'auto' }); } - dirCache = dir; - onSizeChangedCallbackProxy(dir as Direction); + onSizeChangedCallbackProxy(directionCache); } preventDefault(event); diff --git a/packages/overlayscrollbars/src/observers/trinsicObserver.ts b/packages/overlayscrollbars/src/observers/trinsicObserver.ts index a037e0c..dad9482 100644 --- a/packages/overlayscrollbars/src/observers/trinsicObserver.ts +++ b/packages/overlayscrollbars/src/observers/trinsicObserver.ts @@ -1,4 +1,4 @@ -import { createDOM, offsetSize, jsAPI, runEach, prependChildren, removeElements } from 'support'; +import { WH, Cache, createDOM, offsetSize, jsAPI, runEach, prependChildren, removeElements, createCache } from 'support'; import { createSizeObserver } from 'observers/sizeObserver'; const classNameTrinsicObserver = 'os-trinsic-observer'; @@ -6,11 +6,19 @@ const IntersectionObserverConstructor = jsAPI('IntersectionObserver'); export const createTrinsicObserver = ( target: HTMLElement, - onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsic: boolean) => any + onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => any ): (() => void) => { const trinsicObserver = createDOM(`
`)[0] as HTMLElement; const offListeners: (() => void)[] = []; - let heightIntrinsic = false; + const updateHeightIntrinsicCache = createCache>( + (ioEntryOrSize) => + (ioEntryOrSize! as WH).h === 0 || + (ioEntryOrSize! as IntersectionObserverEntry).isIntersecting || + (ioEntryOrSize! as IntersectionObserverEntry).intersectionRatio > 0, + { + _initialValue: false, + } + ); if (IntersectionObserverConstructor) { const intersectionObserverInstance: IntersectionObserver = new IntersectionObserverConstructor( @@ -18,11 +26,10 @@ export const createTrinsicObserver = ( if (entries && entries.length > 0) { const last = entries.pop(); if (last) { - const newHeightIntrinsic = last.isIntersecting || last.intersectionRatio > 0; + const heightIntrinsicCache = updateHeightIntrinsicCache(0, last); - if (newHeightIntrinsic !== heightIntrinsic) { - onTrinsicChangedCallback(false, newHeightIntrinsic); - heightIntrinsic = newHeightIntrinsic; + if (heightIntrinsicCache._changed) { + onTrinsicChangedCallback(false, heightIntrinsicCache); } } } @@ -35,11 +42,10 @@ export const createTrinsicObserver = ( offListeners.push( createSizeObserver(trinsicObserver, () => { const newSize = offsetSize(trinsicObserver); - const newHeightIntrinsic = newSize.h === 0; + const heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize); - if (newHeightIntrinsic !== heightIntrinsic) { - onTrinsicChangedCallback(false, newHeightIntrinsic); - heightIntrinsic = newHeightIntrinsic; + if (heightIntrinsicCache._changed) { + onTrinsicChangedCallback(false, heightIntrinsicCache); } }) ); diff --git a/packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts b/packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts index fb15dd7..fed5871 100644 --- a/packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts +++ b/packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts @@ -1,6 +1,6 @@ -import { OSTarget, OSTargetObject } from 'typings'; +import { OSTarget, OSTargetObject, CSSDirection } from 'typings'; import { createStructureLifecycle } from 'lifecycles/structureLifecycle'; -import { appendChildren, addClass, contents, is, isHTMLElement, createDiv, each } from 'support'; +import { Cache, appendChildren, addClass, contents, is, isHTMLElement, createDiv, each } from 'support'; import { createSizeObserver } from 'observers/sizeObserver'; import { createTrinsicObserver } from 'observers/trinsicObserver'; import { Lifecycle } from 'lifecycles/lifecycleBase'; @@ -51,10 +51,10 @@ const OverlayScrollbars = (target: OSTarget, options?: any, extensions?: any): v lifecycles.push(createStructureLifecycle(osTarget)); // eslint-disable-next-line - const onSizeChanged = (direction?: 'ltr' | 'rtl') => { - if (direction) { + const onSizeChanged = (directionCache?: Cache) => { + if (directionCache) { each(lifecycles, (lifecycle) => { - lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(direction); + lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(directionCache); }); } else { each(lifecycles, (lifecycle) => { @@ -62,9 +62,9 @@ const OverlayScrollbars = (target: OSTarget, options?: any, extensions?: any): v }); } }; - const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsic: boolean) => { + const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => { each(lifecycles, (lifecycle) => { - lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsic); + lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsicCache); }); }; diff --git a/packages/overlayscrollbars/src/support/cache/cache.ts b/packages/overlayscrollbars/src/support/cache/cache.ts index e630896..ea52fc1 100644 --- a/packages/overlayscrollbars/src/support/cache/cache.ts +++ b/packages/overlayscrollbars/src/support/cache/cache.ts @@ -1,95 +1,38 @@ -import { isArray, isString } from 'support/utils/types'; -import { assignDeep, keys } from 'support/utils/object'; -import { each } from 'support/utils/array'; - -type UpdateCacheProp =

(prop: P, value: T[P], compare: EqualCachePropFunction | null) => void; - -type UpdateCachePropFunction = (current?: T[P], previous?: T[P]) => T[P]; - -type EqualCachePropFunction = (a?: T[P], b?: T[P]) => boolean; - -export interface CacheEntry { - _value?: T; - _previous?: T; - _changed: boolean; +export interface Cache { + readonly _value?: T; + readonly _previous?: T; + readonly _changed: boolean; } -export type Cache = { - [P in keyof T]: CacheEntry; -}; - -export type CacheUpdated = Cache & { _anythingChanged: boolean }; - -export type CachePropsToUpdate = Array | keyof T; - -export type CacheUpdate = (propsToUpdate?: CachePropsToUpdate | null, force?: boolean) => CacheUpdated; - -export type CacheUpdateInfo = { - [P in keyof T]: UpdateCachePropFunction | [UpdateCachePropFunction, EqualCachePropFunction]; -}; - -/** - * Creates a internally managed generic cache which can be updated by the returned function. - * @param cacheUpdateInfo A object which accepts a function or a tuple of functions as values for its properties. - * { - * name: updateFn, - * // or - * name: [updateFn, equalFn] - * } - * The first function is the update function (updateFn) which is executed when this cache prop shall be updated. - * Two params are passed, the first one is the current cache value and the second one is the previous cache value. - * - * The second function is the equal function (equalFn) which is also executed when this cache prop shall be updated, - * but returns a boolean which indicates whether the current value and the new updated value are equal. - * If no equal function is passed a shallow comparison is carried out between the values. - * - * @returns A function which can be called with wither one ar an array of properties which shall be updated. Optionally it can be called with the force param. - * This function returns a object which represents the cache and its state at the time of updating (changed to previous value, current value and previous value). - */ -export function createCache(cacheUpdateInfo: CacheUpdateInfo): CacheUpdate; -export function createCache(referenceObj: T, isReference: true): CacheUpdate; -export function createCache(cacheUpdateInfo: CacheUpdateInfo | T, isReference?: true): CacheUpdate { - const cache: Cache = {} as any; - const allProps: Array = keys(cacheUpdateInfo) as Array; - - each(allProps, (prop) => { - cache[prop] = { _changed: false, _value: isReference ? cacheUpdateInfo[prop] : undefined } as any; - }); - - const updateCacheProp: UpdateCacheProp = (prop, value, equal): void => { - const curr = cache[prop]._value; - - cache[prop]._value = value; - cache[prop]._previous = curr; - cache[prop]._changed = equal ? !equal(curr, value) : curr !== value; - }; - - const flush = (props: Array, force?: boolean): CacheUpdated => { - const result: CacheUpdated = assignDeep({}, cache, { _anythingChanged: false }); - - each(props, (prop: keyof T) => { - const changed = force || cache[prop]._changed; - result._anythingChanged = result._anythingChanged || changed; - - result[prop]._changed = changed; - cache[prop]._changed = false; - }); - - return result; - }; - - return (propsToUpdate, force) => { - const finalPropsToUpdate: Array = - (isString(propsToUpdate) ? ([propsToUpdate] as Array) : (propsToUpdate as Array)) || allProps; - each(finalPropsToUpdate, (prop) => { - const cacheVal = cache[prop]; - const curr = cacheUpdateInfo[prop]; - - const arr = isReference ? false : isArray(curr); - const value = arr ? curr[0] : curr; - const equal = arr ? curr[1] : null; - updateCacheProp(prop, isReference ? value : value(cacheVal._value, cacheVal._previous), equal); - }); - return flush(finalPropsToUpdate, force); - }; +export interface CacheOptions { + _equal?: EqualCachePropFunction; + _initialValue?: T; } + +export type CacheUpdate = (force?: boolean | 0, context?: C) => Cache; + +export type UpdateCachePropFunction = (context?: C, current?: T, previous?: T) => T; + +export type EqualCachePropFunction = (a?: T, b?: T) => boolean; + +export const createCache = (update: UpdateCachePropFunction, options?: CacheOptions): CacheUpdate => { + const { _equal, _initialValue } = options || {}; + let _value: T | undefined = _initialValue; + let _previous: T | undefined; + return (force, context) => { + const prev = _value; + const newVal = update(context, _value, _previous); + const changed = force || (_equal ? !_equal(prev, newVal) : prev !== newVal); + + if (changed) { + _value = newVal; + _previous = prev; + } + + return { + _value, + _previous, + _changed: changed, + }; + }; +}; diff --git a/packages/overlayscrollbars/src/support/dom/traversal.ts b/packages/overlayscrollbars/src/support/dom/traversal.ts index ff093cb..e53e0fd 100644 --- a/packages/overlayscrollbars/src/support/dom/traversal.ts +++ b/packages/overlayscrollbars/src/support/dom/traversal.ts @@ -2,6 +2,7 @@ import { each, from } from 'support/utils/array'; const matches = (elm: Element | null, selector: string): boolean => { if (elm) { + /* istanbul ignore next */ // eslint-disable-next-line // @ts-ignore const fn = Element.prototype.matches || Element.prototype.msMatchesSelector; diff --git a/packages/overlayscrollbars/src/typings.ts b/packages/overlayscrollbars/src/typings.ts index 4ea60b8..081d53e 100644 --- a/packages/overlayscrollbars/src/typings.ts +++ b/packages/overlayscrollbars/src/typings.ts @@ -12,6 +12,8 @@ export interface OSTargetObject { export type OSTarget = OSTargetElement | OSTargetObject; +export type CSSDirection = 'ltr' | 'rtl'; + /* export namespace OverlayScrollbars { export type ResizeBehavior = 'none' | 'both' | 'horizontal' | 'vertical'; diff --git a/packages/overlayscrollbars/tests/jsdom/lifecycles/lifecycleBase.test.ts b/packages/overlayscrollbars/tests/jsdom/lifecycles/lifecycleBase.test.ts index 2d0f801..8496053 100644 --- a/packages/overlayscrollbars/tests/jsdom/lifecycles/lifecycleBase.test.ts +++ b/packages/overlayscrollbars/tests/jsdom/lifecycles/lifecycleBase.test.ts @@ -1,4 +1,4 @@ -import { optionsTemplateTypes as oTypes, Cache } from 'support'; +import { optionsTemplateTypes as oTypes } from 'support'; import { createLifecycleBase } from 'lifecycles/lifecycleBase'; interface TestLifecycleOptions { @@ -9,17 +9,9 @@ interface TestLifecycleOptions { number?: number; }; } -interface TestLifecycleCache { - number?: number; - constant?: boolean; - object?: { - string?: string; - boolean?: boolean; - }; -} -const createLifecycle = (initalOptions?: TestLifecycleOptions, updateFn?: () => any) => - createLifecycleBase( +const createLifecycle = (initalOptions?: TestLifecycleOptions, updateFn?: (...args: any) => any) => + createLifecycleBase( { number: [0, oTypes.number], string: ['hi', oTypes.string], @@ -28,28 +20,10 @@ const createLifecycle = (initalOptions?: TestLifecycleOptions, updateFn?: () => number: [0, oTypes.number], }, }, - { - number: (current) => (current || 0) + 1, - constant: () => false, - object: (current) => ({ string: `${current?.string || ''}hi`, boolean: !current?.boolean }), - }, initalOptions, updateFn || (() => {}) ); -const createOptionsUnchangedObj = (exc?: Cache) => - expect.objectContaining({ - number: exc?.number || expect.objectContaining({ _changed: false }), - string: exc?.string || expect.objectContaining({ _changed: false }), - nested: exc?.nested || expect.objectContaining({ _changed: false }), - }); -const createCacheUnchangedObj = (exc?: Cache) => - expect.objectContaining({ - number: exc?.number || expect.objectContaining({ _changed: false }), - constant: exc?.constant || expect.objectContaining({ _changed: false }), - object: exc?.object || expect.objectContaining({ _changed: false }), - }); - describe('lifecycleBase', () => { describe('options', () => { test('correct default options', () => { @@ -112,395 +86,160 @@ describe('lifecycleBase', () => { }); }); - describe('cache', () => { - test('single value cache change', () => { - const updateFn = jest.fn(); - const { _updateCache } = createLifecycle({}, updateFn); - - _updateCache('number'); - expect(updateFn).toBeCalledTimes(2); - expect(updateFn).toHaveBeenLastCalledWith( - expect.objectContaining({}), - expect.objectContaining({ - number: { - _value: 2, - _changed: true, - _previous: 1, - }, - constant: expect.objectContaining({ - _changed: false, - }), - }) - ); - - _updateCache('constant'); - expect(updateFn).toBeCalledTimes(2); - }); - - test('multiple value cache change', () => { - const updateFn = jest.fn(); - const { _updateCache } = createLifecycle({}, updateFn); - - _updateCache(['number', 'object']); - expect(updateFn).toBeCalledTimes(2); - expect(updateFn).toHaveBeenLastCalledWith( - expect.objectContaining({}), - expect.objectContaining({ - number: { - _value: 2, - _previous: 1, - _changed: true, - }, - object: { - _value: { string: 'hihi', boolean: false }, - _previous: { string: 'hi', boolean: true }, - _changed: true, - }, - }) - ); - - _updateCache(['number', 'constant']); - expect(updateFn).toBeCalledTimes(3); - expect(updateFn).toHaveBeenLastCalledWith( - expect.objectContaining({}), - expect.objectContaining({ - number: { - _value: 3, - _previous: 2, - _changed: true, - }, - constant: expect.objectContaining({ - _changed: false, - }), - }) - ); - - _updateCache(['constant']); - expect(updateFn).toBeCalledTimes(3); - }); - }); - describe('update', () => { test('initial call', () => { const updateFn = jest.fn(); createLifecycle({}, updateFn); expect(updateFn).toBeCalledTimes(1); - expect(updateFn).toHaveBeenLastCalledWith( - expect.objectContaining({ - number: expect.objectContaining({ - _value: 0, - _changed: true, - }), - string: expect.objectContaining({ - _value: 'hi', - _changed: true, - }), - nested: expect.objectContaining({ - _value: { - boolean: false, - number: 0, - }, - _changed: true, - }), - }), - expect.objectContaining({ - number: expect.objectContaining({ - _value: 1, - _changed: true, - }), - constant: expect.objectContaining({ - _value: false, - _changed: true, - }), - object: expect.objectContaining({ - _value: { - string: 'hi', - boolean: true, - }, - _changed: true, - }), - }) - ); + expect(updateFn).toHaveBeenLastCalledWith(true, expect.objectContaining({})); }); test('updates correctly on options change', () => { + let checkOption = (...args: any): any => {}; // eslint-disable-line const updateFn = jest.fn(); - const { _options } = createLifecycle({}, updateFn); + const update = (force: any, check: any): void => { + updateFn(force, check); + checkOption = check; + }; + const { _options } = createLifecycle({}, update); _options({ number: 5 }); expect(updateFn).toBeCalledTimes(2); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj({ - number: { - _value: 5, - _previous: 0, - _changed: true, - }, - }), - createCacheUnchangedObj() - ); + expect(updateFn).toHaveBeenLastCalledWith(false, expect.objectContaining({})); + let { _value, _changed } = checkOption('number'); + expect(_value).toBe(5); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('string')); + expect(_value).toBe('hi'); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.boolean')); + expect(_value).toBe(false); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.number')); + expect(_value).toBe(0); + expect(_changed).toBe(false); _options({ number: 5, string: 'test', nested: { number: 3 } }); expect(updateFn).toBeCalledTimes(3); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj({ - string: { - _value: 'test', - _previous: 'hi', - _changed: true, - }, - nested: { - _value: expect.objectContaining({ number: 3 }), - _previous: expect.objectContaining({ number: 3 }), // because reference, number is 3 instead of expected 0 - _changed: true, - }, - }), - createCacheUnchangedObj() - ); + expect(updateFn).toHaveBeenLastCalledWith(false, expect.objectContaining({})); + ({ _value, _changed } = checkOption('number')); + expect(_value).toBe(5); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('string')); + expect(_value).toBe('test'); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('nested.boolean')); + expect(_value).toBe(false); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.number')); + expect(_value).toBe(3); + expect(_changed).toBe(true); _options({ string: 'test', nested: { number: 3 } }); expect(updateFn).toBeCalledTimes(3); }); - test('updates correctly on cache change', () => { - const updateFn = jest.fn(); - const { _updateCache } = createLifecycle({}, updateFn); - - _updateCache('number'); - expect(updateFn).toBeCalledTimes(2); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj(), - createCacheUnchangedObj({ - number: { - _value: 2, - _previous: 1, - _changed: true, - }, - }) - ); - - _updateCache(['number', 'object', 'constant']); - expect(updateFn).toBeCalledTimes(3); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj(), - createCacheUnchangedObj({ - number: { - _value: 3, - _previous: 2, - _changed: true, - }, - object: { - _value: { string: 'hihi', boolean: false }, - _previous: { string: 'hi', boolean: true }, - _changed: true, - }, - }) - ); - - _updateCache('constant'); - expect(updateFn).toBeCalledTimes(3); - }); - test('updates correctly on update call', () => { + let checkOption = (...args: any): any => {}; // eslint-disable-line const updateFn = jest.fn(); - const { _update, _options } = createLifecycle({}, updateFn); + const update = (force: any, check: any): void => { + updateFn(force, check); + checkOption = check; + }; + const { _update, _options } = createLifecycle({}, update); _update(); expect(updateFn).toBeCalledTimes(2); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj(), - createCacheUnchangedObj({ - number: { - _value: 2, - _previous: 1, - _changed: true, - }, - object: { - _value: { string: 'hihi', boolean: false }, - _previous: { string: 'hi', boolean: true }, - _changed: true, - }, - }) - ); + expect(updateFn).toHaveBeenLastCalledWith(false, expect.objectContaining({})); + let { _value, _changed } = checkOption('number'); + expect(_value).toBe(0); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('string')); + expect(_value).toBe('hi'); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.boolean')); + expect(_value).toBe(false); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.number')); + expect(_value).toBe(0); + expect(_changed).toBe(false); _update(true); expect(updateFn).toBeCalledTimes(3); - expect(updateFn).toHaveBeenLastCalledWith( - expect.objectContaining({ - number: expect.objectContaining({ - _value: 0, - _changed: true, - }), - string: expect.objectContaining({ - _value: 'hi', - _changed: true, - }), - nested: expect.objectContaining({ - _value: { - boolean: false, - number: 0, - }, - _changed: true, - }), - }), - expect.objectContaining({ - number: { - _value: 3, - _previous: 2, - _changed: true, - }, - constant: { - _value: false, - _previous: false, - _changed: true, - }, - object: { - _value: { - string: 'hihihi', - boolean: true, - }, - _previous: { - string: 'hihi', - boolean: false, - }, - _changed: true, - }, - }) - ); + expect(updateFn).toHaveBeenLastCalledWith(true, expect.objectContaining({})); + ({ _value, _changed } = checkOption('number')); + expect(_value).toBe(0); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('string')); + expect(_value).toBe('hi'); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('nested.boolean')); + expect(_value).toBe(false); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('nested.number')); + expect(_value).toBe(0); + expect(_changed).toBe(true); _options({ number: 3, nested: { boolean: true } }); _update(true); expect(updateFn).toBeCalledTimes(5); - expect(updateFn).toHaveBeenLastCalledWith( - expect.objectContaining({ - number: expect.objectContaining({ - _value: 3, - _changed: true, - }), - string: expect.objectContaining({ - _value: 'hi', - _changed: true, - }), - nested: expect.objectContaining({ - _value: { - boolean: true, - number: 0, - }, - _changed: true, - }), - }), - expect.objectContaining({ - number: { - _value: 4, - _previous: 3, - _changed: true, - }, - constant: { - _value: false, - _previous: false, - _changed: true, - }, - object: { - _value: { - string: 'hihihihi', - boolean: false, - }, - _previous: { - string: 'hihihi', - boolean: true, - }, - _changed: true, - }, - }) - ); + expect(updateFn).toHaveBeenLastCalledWith(true, expect.objectContaining({})); + ({ _value, _changed } = checkOption('number')); + expect(_value).toBe(3); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('string')); + expect(_value).toBe('hi'); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('nested.boolean')); + expect(_value).toBe(true); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('nested.number')); + expect(_value).toBe(0); + expect(_changed).toBe(true); _options({ number: 3, nested: { boolean: true } }); _update(); expect(updateFn).toBeCalledTimes(6); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj({ - number: expect.objectContaining({ - _value: 3, - _changed: false, - }), - string: expect.objectContaining({ - _value: 'hi', - _changed: false, - }), - nested: expect.objectContaining({ - _value: { - boolean: true, - number: 0, - }, - _changed: false, - }), - }), - createCacheUnchangedObj({ - number: { - _value: 5, - _previous: 4, - _changed: true, - }, - object: { - _value: { string: 'hihihihihi', boolean: true }, - _previous: { string: 'hihihihi', boolean: false }, - _changed: true, - }, - }) - ); + expect(updateFn).toHaveBeenLastCalledWith(false, expect.objectContaining({})); + ({ _value, _changed } = checkOption('number')); + expect(_value).toBe(3); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('string')); + expect(_value).toBe('hi'); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.boolean')); + expect(_value).toBe(true); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.number')); + expect(_value).toBe(0); + expect(_changed).toBe(false); _options({ number: 4, nested: { boolean: false }, string: 'hi' }); expect(updateFn).toBeCalledTimes(7); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj({ - number: expect.objectContaining({ - _value: 4, - _changed: true, - }), - string: expect.objectContaining({ - _value: 'hi', - _changed: false, - }), - nested: expect.objectContaining({ - _value: { - boolean: false, - number: 0, - }, - _changed: true, - }), - }), - createCacheUnchangedObj() - ); + expect(updateFn).toHaveBeenLastCalledWith(false, expect.objectContaining({})); + ({ _value, _changed } = checkOption('number')); + expect(_value).toBe(4); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('string')); + expect(_value).toBe('hi'); + expect(_changed).toBe(false); + ({ _value, _changed } = checkOption('nested.boolean')); + expect(_value).toBe(false); + expect(_changed).toBe(true); + ({ _value, _changed } = checkOption('nested.number')); + expect(_value).toBe(0); + expect(_changed).toBe(false); + _update(); expect(updateFn).toBeCalledTimes(8); - expect(updateFn).toHaveBeenLastCalledWith( - createOptionsUnchangedObj({ - number: expect.objectContaining({ - _value: 4, - _changed: false, - }), - string: expect.objectContaining({ - _value: 'hi', - _changed: false, - }), - nested: expect.objectContaining({ - _value: { - boolean: false, - number: 0, - }, - _changed: false, - }), - }), - createCacheUnchangedObj({ - number: expect.objectContaining({ - _changed: true, - }), - object: expect.objectContaining({ - _changed: true, - }), - }) - ); + expect(updateFn).toHaveBeenLastCalledWith(false, expect.objectContaining({})); + + _options(); + expect(updateFn).toBeCalledTimes(8); + + _options({ number: 4, nested: { boolean: false }, string: 'hi' }); + expect(updateFn).toBeCalledTimes(8); }); }); }); diff --git a/packages/overlayscrollbars/tests/jsdom/support/cache/cache.test.ts b/packages/overlayscrollbars/tests/jsdom/support/cache/cache.test.ts index fdfe3d4..35bd26e 100644 --- a/packages/overlayscrollbars/tests/jsdom/support/cache/cache.test.ts +++ b/packages/overlayscrollbars/tests/jsdom/support/cache/cache.test.ts @@ -1,10 +1,10 @@ import { createCache } from 'support/cache'; -const createUpdater = (updaterReturn: (i: number) => T) => { +const createUpdater = (updaterReturn: (i: number) => T) => { const fn = jest.fn(); let index = 0; - const update = (curr?: T, prev?: T): T => { - fn(curr, prev); + const update = (context?: C, curr?: T, prev?: T): T => { + fn(context, curr, prev); index += 1; return updaterReturn(index); }; @@ -13,360 +13,223 @@ const createUpdater = (updaterReturn: (i: number) => T) => { }; describe('cache', () => { - describe('cache with cacheUpdateInfo object', () => { - test('creates and updates simple cache', () => { - interface Test { - number: number; - boolean: boolean; - string: string; - object: {}; - } - const [updateNumberFn, updateNumber] = createUpdater((i) => i); - const [updateBooleanFn, updateBoolean] = createUpdater((i) => !!(i % 2)); - const [updateStringFn, updateString] = createUpdater((i) => `${i}`); - const [updateObjFn, updateObj] = createUpdater((i) => ({ [i]: i })); + test('creates and updates cache', () => { + const [fn, updater] = createUpdater((i) => `${i}`); + const update = createCache(updater); - const updateCache = createCache({ - number: updateNumber, - boolean: updateBoolean, - string: updateString, - object: updateObj, - }); + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, undefined, undefined); + expect(_value).toBe('1'); + expect(_previous).toBe(undefined); + expect(_changed).toBe(true); - expect(updateCache('number').number._value).toBe(1); - expect(updateNumberFn).toHaveBeenCalledTimes(1); - expect(updateNumberFn).toHaveBeenLastCalledWith(undefined, undefined); + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, '1', undefined); + expect(_value).toBe('2'); + expect(_previous).toBe('1'); + expect(_changed).toBe(true); + }); - expect(updateCache('number').number._value).toBe(2); - expect(updateNumberFn).toHaveBeenCalledTimes(2); - expect(updateNumberFn).toHaveBeenLastCalledWith(1, undefined); + test('creates and updates cache with context', () => { + interface ContextObj { + test: string; + even: number; + } + const updateFn = jest.fn(); + const updater = (context?: ContextObj, current?: boolean, previous?: boolean) => { + updateFn(context, current, previous); + return context!.test === 'test' || context!.even % 2 === 0; + }; + const update = createCache(updater); + const firstCtx = { test: 'test', even: 2 }; - expect(updateCache('number').number._value).toBe(3); - expect(updateNumberFn).toHaveBeenCalledTimes(3); - expect(updateNumberFn).toHaveBeenLastCalledWith(2, 1); + let { _value, _previous, _changed } = update(0, firstCtx); + expect(updateFn).toHaveBeenLastCalledWith(firstCtx, undefined, undefined); + expect(_value).toBe(true); + expect(_previous).toBe(undefined); + expect(_changed).toBe(true); - let { string, boolean, object, number } = updateCache('number'); - expect(string._value).toBe(undefined); - expect(string._changed).toBe(false); - expect(boolean._value).toBe(undefined); - expect(boolean._changed).toBe(false); - expect(object._value).toBe(undefined); - expect(object._changed).toBe(false); - expect(number._value).toBe(4); - expect(number._changed).toBe(true); + ({ _value, _previous, _changed } = update(0, firstCtx)); + expect(updateFn).toHaveBeenLastCalledWith(firstCtx, true, undefined); + expect(_value).toBe(true); + expect(_previous).toBe(undefined); + expect(_changed).toBe(false); - expect(updateBooleanFn).not.toHaveBeenCalled(); - expect(updateStringFn).not.toHaveBeenCalled(); - expect(updateObjFn).not.toHaveBeenCalled(); + const scndCtx = { test: 'nah', even: 1 }; - ({ string, boolean, object, number } = updateCache(['string', 'boolean', 'object'])); - expect(string._value).toBe('1'); - expect(string._changed).toBe(true); - expect(boolean._value).toBe(!!(1 % 2)); - expect(boolean._changed).toBe(true); - expect(object._value).toEqual({ 1: 1 }); - expect(object._changed).toEqual(true); - expect(number._value).toBe(4); - expect(number._changed).toBe(false); + ({ _value, _previous, _changed } = update(0, scndCtx)); + expect(updateFn).toHaveBeenLastCalledWith(scndCtx, true, undefined); + expect(_value).toBe(false); + expect(_previous).toBe(true); + expect(_changed).toBe(true); - expect(updateBooleanFn).toHaveBeenCalledTimes(1); - expect(updateBooleanFn).toHaveBeenLastCalledWith(undefined, undefined); + ({ _value, _previous, _changed } = update(0, scndCtx)); + expect(updateFn).toHaveBeenLastCalledWith(scndCtx, false, true); + expect(_value).toBe(false); + expect(_previous).toBe(true); + expect(_changed).toBe(false); - expect(updateStringFn).toHaveBeenCalledTimes(1); - expect(updateStringFn).toHaveBeenLastCalledWith(undefined, undefined); + ({ _value, _previous, _changed } = update(true, scndCtx)); + expect(updateFn).toHaveBeenLastCalledWith(scndCtx, false, true); + expect(_value).toBe(false); + expect(_previous).toBe(false); + expect(_changed).toBe(true); + }); - expect(updateObjFn).toHaveBeenCalledTimes(1); - expect(updateObjFn).toHaveBeenLastCalledWith(undefined, undefined); + describe('equal', () => { + test('with equal always true', () => { + const [fn, updater] = createUpdater((i) => i); + const update = createCache(updater, { _equal: () => true }); - updateCache(['string', 'boolean', 'object']); - expect(updateBooleanFn).toHaveBeenCalledTimes(2); - expect(updateBooleanFn).toHaveBeenLastCalledWith(!!(1 % 2), undefined); + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, undefined, undefined); + expect(_value).toBe(undefined); + expect(_previous).toBe(undefined); + expect(_changed).toBe(false); - expect(updateStringFn).toHaveBeenCalledTimes(2); - expect(updateStringFn).toHaveBeenLastCalledWith('1', undefined); - - expect(updateObjFn).toHaveBeenCalledTimes(2); - expect(updateObjFn).toHaveBeenLastCalledWith({ 1: 1 }, undefined); - - updateCache(['string', 'boolean', 'object']); - expect(updateBooleanFn).toHaveBeenCalledTimes(3); - expect(updateBooleanFn).toHaveBeenLastCalledWith(!!(2 % 2), !!(1 % 2)); - - expect(updateStringFn).toHaveBeenCalledTimes(3); - expect(updateStringFn).toHaveBeenLastCalledWith('2', '1'); - - expect(updateObjFn).toHaveBeenCalledTimes(3); - expect(updateObjFn).toHaveBeenLastCalledWith({ 2: 2 }, { 1: 1 }); - - updateCache(['string', 'boolean', 'object']); - ({ string, boolean, object, number } = updateCache()); - expect(string._value).toBe('5'); - expect(string._changed).toBe(true); - expect(boolean._value).toBe(!!(5 % 2)); - expect(boolean._changed).toBe(true); - expect(object._value).toEqual({ 5: 5 }); - expect(object._changed).toEqual(true); - expect(number._value).toBe(5); - expect(number._changed).toBe(true); - - expect(updateBooleanFn).toHaveBeenCalledTimes(5); - expect(updateStringFn).toHaveBeenCalledTimes(5); - expect(updateObjFn).toHaveBeenCalledTimes(5); - expect(updateNumberFn).toHaveBeenCalledTimes(5); + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, undefined, undefined); + expect(_value).toBe(undefined); + expect(_previous).toBe(undefined); + expect(_changed).toBe(false); }); - test('doesnt update if nothing changes with primitives', () => { - const [updateNumberFn, updateNumber] = createUpdater(() => 0); - const updateCache = createCache({ - number: updateNumber, - }); + test('with equal always false', () => { + const [fn, updater] = createUpdater(() => 1); + const update = createCache(updater, { _equal: () => false }); - let { _value, _changed } = updateCache('number').number; - expect(_value).toBe(0); - expect(_changed).toBe(true); - expect(updateNumberFn).toHaveBeenLastCalledWith(undefined, undefined); - - ({ _value, _changed } = updateCache('number').number); - expect(_value).toBe(0); - expect(_changed).toBe(false); - expect(updateNumberFn).toHaveBeenLastCalledWith(0, undefined); - - ({ _value, _changed } = updateCache('number').number); - expect(_value).toBe(0); - expect(_changed).toBe(false); - expect(updateNumberFn).toHaveBeenLastCalledWith(0, 0); - - const changed = updateCache('number'); - expect(Object.prototype.hasOwnProperty.call(changed, 'changed')).toBe(false); - expect(Object.prototype.hasOwnProperty.call(changed, 'number')).toBe(true); - }); - - test('doesnt update if nothing changes with non primitives', () => { - const constObj = { a: 0, b: 0 }; - const [updateConstObjFn, updateConstObj] = createUpdater<{ a: number; b: number }>(() => constObj); - const [updateSimilarObjFn, updateSimilarObj] = createUpdater<{ a: number; b: number }>(() => ({ ...constObj })); - const [updateComparisonObjFn, updateComparisonObj] = createUpdater<{ a: number; b: number }>(() => ({ ...constObj })); - const updateCache = createCache({ - constObj: updateConstObj, - similarObj: updateSimilarObj, - comparisonObj: [ - updateComparisonObj, - (a?: { a: number; b: number }, b?: { a: number; b: number }): boolean => !!(a && b && a.a === b.a && a.b === b.b), - ], - }); - - let { _value, _changed } = updateCache('constObj').constObj; - expect(_value).toEqual(constObj); - expect(_changed).toBe(true); - expect(updateConstObjFn).toHaveBeenLastCalledWith(undefined, undefined); - - ({ _value, _changed } = updateCache('constObj').constObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(false); - expect(updateConstObjFn).toHaveBeenLastCalledWith(constObj, undefined); - - ({ _value, _changed } = updateCache('constObj').constObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(false); - expect(updateConstObjFn).toHaveBeenLastCalledWith(constObj, constObj); - - ({ _value, _changed } = updateCache('similarObj').similarObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(true); - expect(updateSimilarObjFn).toHaveBeenLastCalledWith(undefined, undefined); - - ({ _value, _changed } = updateCache('similarObj').similarObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(true); - expect(updateSimilarObjFn).toHaveBeenLastCalledWith(constObj, undefined); - - ({ _value, _changed } = updateCache('similarObj').similarObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(true); - expect(updateSimilarObjFn).toHaveBeenLastCalledWith(constObj, constObj); - - ({ _value, _changed } = updateCache('comparisonObj').comparisonObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(true); - expect(updateComparisonObjFn).toHaveBeenLastCalledWith(undefined, undefined); - - ({ _value, _changed } = updateCache('comparisonObj').comparisonObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(false); - expect(updateComparisonObjFn).toHaveBeenLastCalledWith(constObj, undefined); - - ({ _value, _changed } = updateCache('comparisonObj').comparisonObj); - expect(_value).toEqual(constObj); - expect(_changed).toBe(false); - expect(updateComparisonObjFn).toHaveBeenLastCalledWith(constObj, constObj); - - const result = updateCache(); - expect(Object.prototype.hasOwnProperty.call(result, 'constObj')).toBe(true); - expect(Object.prototype.hasOwnProperty.call(result, 'similarObj')).toBe(true); - expect(Object.prototype.hasOwnProperty.call(result, 'comparisonObj')).toBe(true); - }); - - test('updates definitely with force', () => { - const [updateNumberFn, updateNumber] = createUpdater(() => 0); - const [, updateString] = createUpdater(() => 0); - const updateCache = createCache({ - number: updateNumber, - string: updateString, - }); - - let { _value, _changed } = updateCache('number', true).number; - expect(_value).toBe(0); - expect(_changed).toBe(true); - expect(updateNumberFn).toHaveBeenLastCalledWith(undefined, undefined); - - ({ _value, _changed } = updateCache('number', true).number); - expect(_value).toBe(0); - expect(_changed).toBe(true); - expect(updateNumberFn).toHaveBeenLastCalledWith(0, undefined); - - ({ _value, _changed } = updateCache('number', true).number); - expect(_value).toBe(0); - expect(_changed).toBe(true); - expect(updateNumberFn).toHaveBeenLastCalledWith(0, 0); - - let { number, string } = updateCache('number', true); - expect(number._changed).toBe(true); - expect(string._changed).toBe(false); - - ({ number, string } = updateCache(['number', 'string'], true)); - expect(number._changed).toBe(true); - expect(string._changed).toBe(true); - - ({ number, string } = updateCache('string', true)); - expect(number._changed).toBe(false); - expect(string._changed).toBe(true); - }); - - test('custom comparison on primitves', () => { - const [updateStringFn, updateString] = createUpdater(() => 'hi'); - const [updateNumberFn, updateNumber] = createUpdater((i) => i); - const updateCache = createCache({ - string: [updateString, () => false], - number: [updateNumber, () => true], - }); - - let { _value, _changed } = updateCache('string').string; - expect(_value).toBe('hi'); - expect(_changed).toBe(true); - expect(updateStringFn).toHaveBeenLastCalledWith(undefined, undefined); - - ({ _value, _changed } = updateCache('string').string); - expect(_value).toBe('hi'); - expect(_changed).toBe(true); - expect(updateStringFn).toHaveBeenLastCalledWith('hi', undefined); - - ({ _value, _changed } = updateCache('string').string); - expect(_value).toBe('hi'); - expect(_changed).toBe(true); - expect(updateStringFn).toHaveBeenLastCalledWith('hi', 'hi'); - - ({ _value, _changed } = updateCache('number').number); + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, undefined, undefined); expect(_value).toBe(1); - expect(_changed).toBe(false); - expect(updateNumberFn).toHaveBeenLastCalledWith(undefined, undefined); + expect(_previous).toBe(undefined); + expect(_changed).toBe(true); - ({ _value, _changed } = updateCache('number').number); - expect(_value).toBe(2); - expect(_changed).toBe(false); - expect(updateNumberFn).toHaveBeenLastCalledWith(1, undefined); - - ({ _value, _changed } = updateCache('number').number); - expect(_value).toBe(3); - expect(_changed).toBe(false); - expect(updateNumberFn).toHaveBeenLastCalledWith(2, 1); + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, 1, undefined); + expect(_value).toBe(1); + expect(_previous).toBe(1); + expect(_changed).toBe(true); }); - test('updates all entries with null or undefined as argument', () => { - const [updateNumberFn, updateNumber] = createUpdater((i) => i); - const [updateNumberFn2, updateNumber2] = createUpdater((i) => i); - const updateCache = createCache({ - number: updateNumber, - number2: updateNumber2, - }); + test('with object equal', () => { + const obj = { a: -1, b: -1 }; + const [fn, updater] = createUpdater((i) => ({ a: i, b: i + 1 })); + const update = createCache(updater, { _equal: (a, b) => a?.a === b?.a && a?.b === b?.b }); - updateCache(); - expect(updateNumberFn).toHaveBeenLastCalledWith(undefined, undefined); - expect(updateNumberFn2).toHaveBeenLastCalledWith(undefined, undefined); + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, undefined, undefined); + expect(_value).toEqual({ a: 1, b: 2 }); + expect(_previous).toBe(undefined); + expect(_changed).toBe(true); - updateCache(null); - expect(updateNumberFn).toHaveBeenLastCalledWith(1, undefined); - expect(updateNumberFn2).toHaveBeenLastCalledWith(1, undefined); + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, { a: 1, b: 2 }, undefined); + expect(_value).toEqual({ a: 2, b: 3 }); + expect(_previous).toEqual({ a: 1, b: 2 }); + expect(_changed).toBe(true); }); }); - describe('cache with reference object', () => { - test('creates and updates simple cache', () => { - interface Test { - number: number; - boolean: boolean; - string: string; - object: {}; - } - const refObj: Test = { - number: 0, - boolean: false, - string: 'hi', - object: {}, - }; + describe('inital value', () => { + test('creates and updates cache with inital value', () => { + const [fn, updater] = createUpdater((i) => i); + const update = createCache(updater, { _initialValue: 0 }); - const updateCache = createCache(refObj, true); - - let { _value, _changed, _previous } = updateCache('number').number; - expect(_value).toBe(0); - expect(_changed).toBe(false); - - refObj.number = 1; - ({ _value, _changed } = updateCache('number').number); + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, 0, undefined); expect(_value).toBe(1); + expect(_previous).toBe(0); expect(_changed).toBe(true); - refObj.number = 2; - ({ _value, _changed } = updateCache('string').number); - expect(_value).toBe(1); - expect(_changed).toBe(false); - - refObj.number = 3; - ({ _value, _changed, _previous } = updateCache('number').number); - expect(_value).toBe(3); + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, 1, 0); + expect(_value).toBe(2); expect(_previous).toBe(1); expect(_changed).toBe(true); + }); - let { number, boolean, string, object } = updateCache(); - expect(number._value).toBe(3); - expect(number._changed).toBe(false); - expect(boolean._value).toBe(false); - expect(boolean._changed).toBe(false); - expect(string._value).toBe('hi'); - expect(string._changed).toBe(false); - expect(object._value).toEqual({}); - expect(object._changed).toBe(false); + test('creates and updates cache with inital value and equal', () => { + const obj = { a: -1, b: -1 }; + const [fn, updater] = createUpdater((i) => ({ a: i, b: i + 1 })); + const update = createCache(updater, { _initialValue: obj, _equal: (a, b) => a?.a === b?.a && a?.b === b?.b }); - refObj.string = 'hi2'; - refObj.boolean = true; - ({ number, boolean, string, object } = updateCache()); - expect(number._value).toBe(3); - expect(number._changed).toBe(false); - expect(boolean._value).toBe(true); - expect(boolean._changed).toBe(true); - expect(string._value).toBe('hi2'); - expect(string._changed).toBe(true); - expect(object._value).toEqual({}); - expect(object._changed).toBe(false); + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, obj, undefined); + expect(_value).toEqual({ a: 1, b: 2 }); + expect(_previous).toBe(obj); + expect(_changed).toBe(true); - ({ number, boolean, string, object } = updateCache(null, true)); - expect(number._value).toBe(3); - expect(number._changed).toBe(true); - expect(boolean._value).toBe(true); - expect(boolean._changed).toBe(true); - expect(string._value).toBe('hi2'); - expect(string._changed).toBe(true); - expect(object._value).toEqual({}); - expect(object._changed).toBe(true); + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, { a: 1, b: 2 }, obj); + expect(_value).toEqual({ a: 2, b: 3 }); + expect(_previous).toEqual({ a: 1, b: 2 }); + expect(_changed).toBe(true); + }); + }); + + describe('constant', () => { + test('updates constant initially without intial value', () => { + const [fn, updater] = createUpdater(() => true); + const update = createCache(updater); + + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, undefined, undefined); + expect(_value).toBe(true); + expect(_previous).toBe(undefined); + expect(_changed).toBe(true); + + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, true, undefined); + expect(_value).toBe(true); + expect(_previous).toBe(undefined); + expect(_changed).toBe(false); + }); + + test('doesnt update constant with initial value', () => { + const obj = { constant: true }; + const [fn, updater] = createUpdater(() => obj); + const update = createCache(updater, { _initialValue: obj }); + + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, obj, undefined); + expect(_value).toBe(obj); + expect(_previous).toBe(undefined); + expect(_changed).toBe(false); + + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, obj, undefined); + expect(_value).toBe(obj); + expect(_previous).toBe(undefined); + expect(_changed).toBe(false); + }); + + test('updates constant with force', () => { + const [fn, updater] = createUpdater(() => 'constant'); + const update = createCache(updater); + + let { _value, _previous, _changed } = update(); + expect(fn).toHaveBeenLastCalledWith(undefined, undefined, undefined); + expect(_value).toBe('constant'); + expect(_previous).toBe(undefined); + expect(_changed).toBe(true); + + ({ _value, _previous, _changed } = update(true)); + expect(fn).toHaveBeenLastCalledWith(undefined, 'constant', undefined); + expect(_value).toBe('constant'); + expect(_previous).toBe('constant'); + expect(_changed).toBe(true); + + ({ _value, _previous, _changed } = update(false)); + expect(fn).toHaveBeenLastCalledWith(undefined, 'constant', 'constant'); + expect(_value).toBe('constant'); + expect(_previous).toBe('constant'); + expect(_changed).toBe(false); + + ({ _value, _previous, _changed } = update()); + expect(fn).toHaveBeenLastCalledWith(undefined, 'constant', 'constant'); + expect(_value).toBe('constant'); + expect(_previous).toBe('constant'); + expect(_changed).toBe(false); }); }); }); diff --git a/packages/overlayscrollbars/tests/puppeteer/observers/sizeObserver/index.browser.ts b/packages/overlayscrollbars/tests/puppeteer/observers/sizeObserver/index.browser.ts index b10b2cf..fcd16ab 100644 --- a/packages/overlayscrollbars/tests/puppeteer/observers/sizeObserver/index.browser.ts +++ b/packages/overlayscrollbars/tests/puppeteer/observers/sizeObserver/index.browser.ts @@ -167,8 +167,8 @@ startBtn?.addEventListener('click', start); createSizeObserver( targetElm as HTMLElement, - (direction?: 'ltr' | 'rtl') => { - if (direction) { + (directionCache?: any) => { + if (directionCache) { directionIterations += 1; } else { sizeIterations += 1; diff --git a/packages/overlayscrollbars/tests/puppeteer/observers/trinsicObserver/index.browser.ts b/packages/overlayscrollbars/tests/puppeteer/observers/trinsicObserver/index.browser.ts index 0912d8b..18688b0 100644 --- a/packages/overlayscrollbars/tests/puppeteer/observers/trinsicObserver/index.browser.ts +++ b/packages/overlayscrollbars/tests/puppeteer/observers/trinsicObserver/index.browser.ts @@ -16,8 +16,8 @@ const waitForOptions = { }, }; +let heightIntrinsic: boolean | undefined; let heightIterations = 0; -let heightIntrinsicCache: boolean; const envElm = document.querySelector('#env'); const targetElm = document.querySelector('#target'); const checkElm = document.querySelector('#check'); @@ -86,7 +86,7 @@ const changeWhileHidden = async () => { selectOption(displaySelect as HTMLSelectElement, 'displayBlock'); await waitFor(() => { - should.equal(heightIntrinsicCache, false); + should.equal(heightIntrinsic, false); }, waitForOptions); }; @@ -100,7 +100,7 @@ const changeWhileHidden = async () => { selectOption(displaySelect as HTMLSelectElement, 'displayBlock'); await waitFor(() => { - should.equal(heightIntrinsicCache, true); + should.equal(heightIntrinsic, true); }, waitForOptions); }; @@ -126,10 +126,10 @@ const start = async () => { startBtn?.addEventListener('click', start); -createTrinsicObserver(targetElm as HTMLElement, (widthIntrinsic: boolean, heightIntrinsic: boolean) => { - if (heightIntrinsic !== heightIntrinsicCache) { +createTrinsicObserver(targetElm as HTMLElement, (widthIntrinsic, heightIntrinsicCache) => { + if (heightIntrinsicCache._changed) { heightIterations += 1; - heightIntrinsicCache = heightIntrinsic; + heightIntrinsic = heightIntrinsicCache._value; } requestAnimationFrame(() => { if (changesSlot) { diff --git a/packages/overlayscrollbars/types/lifecycles/lifecycleBase.d.ts b/packages/overlayscrollbars/types/lifecycles/lifecycleBase.d.ts index 63b028d..573f1d8 100644 --- a/packages/overlayscrollbars/types/lifecycles/lifecycleBase.d.ts +++ b/packages/overlayscrollbars/types/lifecycles/lifecycleBase.d.ts @@ -1,17 +1,18 @@ -import { CacheUpdateInfo, CachePropsToUpdate, Cache, OptionsWithOptionsTemplate } from 'support'; -import { PlainObject } from 'typings'; -interface AbstractLifecycle { +import { Cache, OptionsWithOptionsTemplate } from 'support'; +import { CSSDirection, PlainObject } from 'typings'; +export interface LifecycleBase { _options(newOptions?: O): O; _update(force?: boolean): void; } -export interface Lifecycle extends AbstractLifecycle { +export interface Lifecycle extends LifecycleBase { _destruct(): void; _onSizeChanged?(): void; - _onDirectionChanged?(direction: 'ltr' | 'rtl'): void; - _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsic: boolean): void; + _onDirectionChanged?(directionCache: Cache): void; + _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsicCache: Cache): void; } -export interface LifecycleBase extends AbstractLifecycle { - _updateCache(cachePropsToUpdate?: CachePropsToUpdate): void; +export interface LifecycleOptionInfo { + _value: T; + _changed: boolean; } -export declare const createLifecycleBase: (defaultOptionsWithTemplate: OptionsWithOptionsTemplate>, cacheUpdateInfo: CacheUpdateInfo, initialOptions: O | undefined, updateFunction: (options: Cache, cache: Cache) => any) => LifecycleBase; -export {}; +export declare type LifecycleCheckOption = (path: string) => LifecycleOptionInfo; +export declare const createLifecycleBase: (defaultOptionsWithTemplate: OptionsWithOptionsTemplate>, initialOptions: O | undefined, updateFunction: (force: boolean, checkOption: LifecycleCheckOption) => any) => LifecycleBase; diff --git a/packages/overlayscrollbars/types/observers/sizeObserver.d.ts b/packages/overlayscrollbars/types/observers/sizeObserver.d.ts index 3e07f4b..3196f63 100644 --- a/packages/overlayscrollbars/types/observers/sizeObserver.d.ts +++ b/packages/overlayscrollbars/types/observers/sizeObserver.d.ts @@ -1,7 +1,7 @@ -declare type Direction = 'ltr' | 'rtl'; +import { Cache } from 'support'; +import { CSSDirection } from 'typings'; export declare type SizeObserverOptions = { _direction?: boolean; _appear?: boolean; }; -export declare const createSizeObserver: (target: HTMLElement, onSizeChangedCallback: (direction?: "ltr" | "rtl" | undefined) => any, options?: SizeObserverOptions | undefined) => (() => void); -export {}; +export declare const createSizeObserver: (target: HTMLElement, onSizeChangedCallback: (directionCache?: Cache | undefined) => any, options?: SizeObserverOptions | undefined) => (() => void); diff --git a/packages/overlayscrollbars/types/observers/trinsicObserver.d.ts b/packages/overlayscrollbars/types/observers/trinsicObserver.d.ts index 213239e..66bf3e2 100644 --- a/packages/overlayscrollbars/types/observers/trinsicObserver.d.ts +++ b/packages/overlayscrollbars/types/observers/trinsicObserver.d.ts @@ -1 +1,2 @@ -export declare const createTrinsicObserver: (target: HTMLElement, onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsic: boolean) => any) => (() => void); +import { Cache } from 'support'; +export declare const createTrinsicObserver: (target: HTMLElement, onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => any) => (() => void); diff --git a/packages/overlayscrollbars/types/support/cache/cache.d.ts b/packages/overlayscrollbars/types/support/cache/cache.d.ts index aac3cdd..239a8a6 100644 --- a/packages/overlayscrollbars/types/support/cache/cache.d.ts +++ b/packages/overlayscrollbars/types/support/cache/cache.d.ts @@ -1,21 +1,13 @@ -declare type UpdateCachePropFunction = (current?: T[P], previous?: T[P]) => T[P]; -declare type EqualCachePropFunction = (a?: T[P], b?: T[P]) => boolean; -export interface CacheEntry { - _value?: T; - _previous?: T; - _changed: boolean; +export interface Cache { + readonly _value?: T; + readonly _previous?: T; + readonly _changed: boolean; } -export declare type Cache = { - [P in keyof T]: CacheEntry; -}; -export declare type CacheUpdated = Cache & { - _anythingChanged: boolean; -}; -export declare type CachePropsToUpdate = Array | keyof T; -export declare type CacheUpdate = (propsToUpdate?: CachePropsToUpdate | null, force?: boolean) => CacheUpdated; -export declare type CacheUpdateInfo = { - [P in keyof T]: UpdateCachePropFunction | [UpdateCachePropFunction, EqualCachePropFunction]; -}; -export declare function createCache(cacheUpdateInfo: CacheUpdateInfo): CacheUpdate; -export declare function createCache(referenceObj: T, isReference: true): CacheUpdate; -export {}; +export interface CacheOptions { + _equal?: EqualCachePropFunction; + _initialValue?: T; +} +export declare type CacheUpdate = (force?: boolean | 0, context?: C) => Cache; +export declare type UpdateCachePropFunction = (context?: C, current?: T, previous?: T) => T; +export declare type EqualCachePropFunction = (a?: T, b?: T) => boolean; +export declare const createCache: (update: UpdateCachePropFunction, options?: CacheOptions | undefined) => CacheUpdate; diff --git a/packages/overlayscrollbars/types/typings.d.ts b/packages/overlayscrollbars/types/typings.d.ts index e05ad2a..1de13c0 100644 --- a/packages/overlayscrollbars/types/typings.d.ts +++ b/packages/overlayscrollbars/types/typings.d.ts @@ -5,7 +5,9 @@ export declare type OSTargetElement = HTMLElement | HTMLTextAreaElement; export interface OSTargetObject { target: OSTargetElement; host: HTMLElement; + padding: HTMLElement; viewport: HTMLElement; content: HTMLElement; } export declare type OSTarget = OSTargetElement | OSTargetObject; +export declare type CSSDirection = 'ltr' | 'rtl';