{"version":3,"file":"overlayscrollbars.cjs","sources":["../src/support/cache.ts","../src/support/compatibility/isBrowser.ts","../src/support/utils/alias.ts","../src/support/compatibility/apis.ts","../src/support/utils/types.ts","../src/support/utils/animation.ts","../src/support/utils/array.ts","../src/support/utils/strings.ts","../src/support/utils/equal.ts","../src/support/utils/noop.ts","../src/support/utils/function.ts","../src/support/utils/object.ts","../src/support/utils/math.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/style.ts","../src/support/dom/dimensions.ts","../src/support/dom/events.ts","../src/support/dom/scroll.ts","../src/support/dom/focus.ts","../src/support/eventListeners.ts","../src/options.ts","../src/classnames.ts","../src/nonce.ts","../src/environment.ts","../src/initialization.ts","../src/instances.ts","../src/observers/domObserver.ts","../src/plugins/plugins.ts","../src/plugins/optionsValidationPlugin/optionsValidationPlugin.ts","../src/plugins/sizeObserverPlugin/sizeObserverPlugin.ts","../src/setups/structureSetup/structureSetup.utils.ts","../src/plugins/scrollbarsHidingPlugin/scrollbarsHidingPlugin.ts","../src/plugins/clickScrollPlugin/clickScrollPlugin.ts","../src/observers/sizeObserver.ts","../src/observers/trinsicObserver.ts","../src/setups/observersSetup/observersSetup.ts","../src/setups/scrollbarsSetup/scrollbarsSetup.elements.ts","../src/setups/scrollbarsSetup/scrollbarsSetup.events.ts","../src/setups/scrollbarsSetup/scrollbarsSetup.ts","../src/setups/structureSetup/structureSetup.elements.ts","../src/setups/structureSetup/updateSegments/trinsicUpdateSegment.ts","../src/setups/structureSetup/updateSegments/paddingUpdateSegment.ts","../src/setups/structureSetup/updateSegments/overflowUpdateSegment.ts","../src/setups/structureSetup/structureSetup.ts","../src/setups/setups.ts","../src/overlayscrollbars.ts"],"sourcesContent":["export interface CacheOptions<Value> {\n // initial value of _value.\n _initialValue: Value;\n // Custom comparison function if shallow compare isn't enough. Returns true if nothing changed.\n _equal?: EqualCachePropFunction<Value>;\n // If true always updates _value and _previous, otherwise they update only when they changed.\n _alwaysUpdateValues?: boolean;\n}\n\nexport type CacheValues<T> = [value: T, changed: boolean, previous?: T];\n\nexport type EqualCachePropFunction<Value> = (currentVal: Value, newVal: Value) => boolean;\n\nexport type CacheUpdater<Value> = (current: Value, previous?: Value) => Value;\n\nexport type UpdateCacheContextual<Value> = (newValue: Value, force?: boolean) => CacheValues<Value>;\n\nexport type UpdateCache<Value> = (force?: boolean) => CacheValues<Value>;\n\nexport type GetCurrentCache<Value> = (force?: boolean) => CacheValues<Value>;\n\nexport type Cache<Value> = [UpdateCache<Value>, GetCurrentCache<Value>];\n\nexport type CacheContextual<Value> = [UpdateCacheContextual<Value>, GetCurrentCache<Value>];\n\ntype CreateCache = {\n <Value>(options: CacheOptions<Value>): CacheContextual<Value>;\n <Value>(options: CacheOptions<Value>, update: CacheUpdater<Value>): Cache<Value>;\n <Value>(options: CacheOptions<Value>, update?: CacheUpdater<Value>):\n | CacheContextual<Value>\n | Cache<Value>;\n};\n\nexport const createCache: CreateCache = <Value>(\n options: CacheOptions<Value>,\n update?: CacheUpdater<Value>\n): CacheContextual<Value> | Cache<Value> => {\n const { _initialValue, _equal, _alwaysUpdateValues } = options;\n let _value: Value = _initialValue;\n let _previous: Value | undefined;\n\n const cacheUpdateContextual: UpdateCacheContextual<Value> = (newValue, force?) => {\n const curr = _value;\n\n const newVal = newValue;\n const changed = force || (_equal ? !_equal(curr, newVal) : curr !== newVal);\n\n if (changed || _alwaysUpdateValues) {\n _value = newVal;\n _previous = curr;\n }\n\n return [_value, changed, _previous];\n };\n const cacheUpdateIsolated: UpdateCache<Value> = (force?) =>\n cacheUpdateContextual(update!(_value, _previous), force);\n\n const getCurrentCache: GetCurrentCache<Value> = (force?: boolean) => [\n _value,\n !!force, // changed\n _previous,\n ];\n\n return [update ? cacheUpdateIsolated : cacheUpdateContextual, getCurrentCache] as\n | CacheContextual<Value>\n | Cache<Value>;\n};\n","export const isBrowser =\r\n // deno has the global `window` defined\r\n typeof window !== 'undefined' &&\r\n // make sure HTML element is available\r\n typeof HTMLElement !== 'undefined' &&\r\n // make sure document is defined\r\n !!window.document;\r\n","import { isBrowser } from '../compatibility/isBrowser';\r\n\r\nexport const wnd = (isBrowser ? window : {}) as typeof window;\r\nexport const mathMax = Math.max;\r\nexport const mathMin = Math.min;\r\nexport const mathRound = Math.round;\r\nexport const mathFloor = Math.floor;\r\nexport const mathCeil = Math.ceil;\r\nexport const mathAbs = Math.abs;\r\nexport const mathSign = Math.sign;\r\nexport const cAF = wnd.cancelAnimationFrame;\r\nexport const rAF = wnd.requestAnimationFrame;\r\nexport const setT = wnd.setTimeout;\r\nexport const clearT = wnd.clearTimeout;\r\n","import { wnd } from '../utils/alias';\r\n\r\nconst getApi = <T>(name: string) =>\r\n (typeof wnd[name as keyof typeof wnd] !== 'undefined'\r\n ? wnd[name as keyof typeof wnd]\r\n : undefined) as T;\r\n\r\nexport const MutationObserverConstructor = getApi<typeof MutationObserver>('MutationObserver');\r\nexport const IntersectionObserverConstructor =\r\n getApi<typeof IntersectionObserver>('IntersectionObserver');\r\nexport const ResizeObserverConstructor = getApi<typeof ResizeObserver>('ResizeObserver');\r\nexport const scrollT = getApi<new (constructor: unknown) => AnimationTimeline>('ScrollTimeline');\r\n","import type { PlainObject } from '~/typings';\r\n\r\nexport const isUndefined = (obj: any): obj is undefined => obj === undefined;\r\n\r\nexport const isNull = (obj: any): obj is null => obj === null;\r\n\r\nexport const type = (obj: any): string =>\r\n isUndefined(obj) || isNull(obj)\r\n ? `${obj}`\r\n : Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n\r\nexport const isNumber = (obj: any): obj is number => typeof obj === 'number';\r\n\r\nexport const isString = (obj: any): obj is string => typeof obj === 'string';\r\n\r\nexport const isBoolean = (obj: any): obj is boolean => typeof obj === 'boolean';\r\n\r\nexport const isFunction = (obj: any): obj is (...args: any[]) => any => typeof obj === 'function';\r\n\r\nexport const isArray = <T = any>(obj: any): obj is Array<T> => Array.isArray(obj);\r\n\r\nexport const isObject = (obj: any): obj is object =>\r\n typeof obj === 'object' && !isArray(obj) && !isNull(obj);\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 const isArrayLike = <T extends PlainObject = any>(obj: any): obj is ArrayLike<T> => {\r\n const length = !!obj && obj.length;\r\n const lengthCorrectFormat = isNumber(length) && length > -1 && length % 1 == 0; // eslint-disable-line eqeqeq\r\n\r\n return isArray(obj) || (!isFunction(obj) && lengthCorrectFormat)\r\n ? length > 0 && isObject(obj)\r\n ? length - 1 in obj\r\n : true\r\n : false;\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 const isPlainObject = <T = any>(obj: any): obj is PlainObject<T> =>\r\n !!obj && obj.constructor === Object;\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 const isHTMLElement = (obj: any): obj is HTMLElement => obj instanceof HTMLElement;\r\n\r\n/**\r\n * Checks whether the given object is a Element.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport const isElement = (obj: any): obj is Element => obj instanceof Element;\r\n","import { mathMax, rAF, cAF } from './alias';\r\nimport { isFunction } from './types';\r\n\r\n/**\r\n * percent: current percent (0 - 1),\r\n * time: current time (duration * percent),\r\n * min: start value\r\n * max: end value\r\n * duration: duration in ms\r\n */\r\nexport type EasingFn = (\r\n percent: number,\r\n time: number,\r\n min: number,\r\n max: number,\r\n duration: number\r\n) => number;\r\n\r\nconst animationCurrentTime = () => performance.now();\r\n\r\nexport const animateNumber = (\r\n from: number,\r\n to: number,\r\n duration: number,\r\n onFrame: (progress: number, percent: number, completed: boolean) => any,\r\n easing?: EasingFn | false\r\n): ((complete?: boolean) => void) => {\r\n let animationFrameId = 0;\r\n const timeStart = animationCurrentTime();\r\n const finalDuration = mathMax(0, duration);\r\n const frame = (complete?: boolean) => {\r\n const timeNow = animationCurrentTime();\r\n const timeElapsed = timeNow - timeStart;\r\n const stopAnimation = timeElapsed >= finalDuration;\r\n const percent = complete\r\n ? 1\r\n : 1 - (mathMax(0, timeStart + finalDuration - timeNow) / finalDuration || 0);\r\n const progress =\r\n (to - from) *\r\n (isFunction(easing)\r\n ? easing(percent, percent * finalDuration, 0, 1, finalDuration)\r\n : percent) +\r\n from;\r\n const animationCompleted = stopAnimation || percent === 1;\r\n\r\n onFrame && onFrame(progress, percent, animationCompleted);\r\n\r\n animationFrameId = animationCompleted ? 0 : rAF!(() => frame());\r\n };\r\n frame();\r\n return (complete) => {\r\n cAF!(animationFrameId);\r\n complete && frame(complete);\r\n };\r\n};\r\n","import type { PlainObject } from '~/typings';\r\nimport { isArray, isArrayLike, isString } from './types';\r\n\r\ntype RunEachItem = ((...args: any) => any | any[]) | false | null | undefined;\r\n\r\nexport function each<T extends Array<unknown> | ReadonlyArray<unknown>>(\r\n array: T,\r\n callback: (\r\n value: T extends Array<infer V> | ReadonlyArray<infer V> ? V : never,\r\n index: number,\r\n source: T\r\n ) => boolean | unknown\r\n): T;\r\nexport function each<T extends ArrayLike<unknown>>(\r\n arrayLikeObject: T,\r\n callback: (\r\n value: T extends ArrayLike<infer V> ? V : never,\r\n index: number,\r\n source: T\r\n ) => boolean | unknown\r\n): T;\r\nexport function each<T extends PlainObject>(\r\n obj: T,\r\n callback: (value: any, key: string, source: T) => boolean | unknown\r\n): T;\r\nexport function each(\r\n source: Array<unknown> | ArrayLike<unknown> | ReadonlyArray<unknown> | PlainObject,\r\n callback: (value: any, indexOrKey: any, source: any) => boolean | unknown\r\n): Array<unknown> | ArrayLike<unknown> | ReadonlyArray<unknown> | Set<unknown> | PlainObject {\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 // cant use support func keys here due to circular dep\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 true when the passed item is in the passed array and false otherwise.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @returns Whether the item is in the array.\r\n */\r\nexport const inArray = <T = any>(arr: T[] | readonly T[], item: T): boolean =>\r\n arr.indexOf(item) >= 0;\r\n\r\n/**\r\n * Concats two arrays and returns an new array without modifying any of the passed arrays.\r\n * @param a Array A.\r\n * @param b Array B.\r\n * @returns A new array which has the entries of both arrays.\r\n */\r\nexport const concat = <T>(a: T[] | ReadonlyArray<T>, b: T[] | ReadonlyArray<T>): T[] => a.concat(b);\r\n\r\n/**\r\n * Pushesh all given items into the given array and returns it.\r\n * @param array The array the items shall be pushed into.\r\n * @param items The items which shall be pushed into the array.\r\n */\r\nexport const push = <T>(array: T[], items: T | ArrayLike<T>, arrayIsSingleItem?: boolean): T[] => {\r\n !arrayIsSingleItem && !isString(items) && isArrayLike(items)\r\n ? Array.prototype.push.apply(array, items as T[])\r\n : array.push(items as T);\r\n return array;\r\n};\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 = <T = any>(arr?: ArrayLike<T> | Set<T>) => Array.from(arr || []);\r\n\r\n/**\r\n * Creates an array if the passed value is not an array, or returns the value if it is.\r\n * If the passed value is an array like structure and not a string it will be converted into an array.\r\n * @param value The value.\r\n * @returns An array which represents the passed value(s).\r\n */\r\nexport const createOrKeepArray = <T>(value: T | T[] | ArrayLike<T>): T[] => {\r\n if (isArray(value)) {\r\n return value;\r\n }\r\n return !isString(value) && isArrayLike(value) ? from(value) : [value];\r\n};\r\n\r\n/**\r\n * Check whether the passed array is empty.\r\n * @param array The array which shall be checked.\r\n */\r\nexport const isEmptyArray = (array: any[] | null | undefined): boolean => !!array && !array.length;\r\n\r\n/**\r\n * Deduplicates all items of the array.\r\n * @param array The array to be deduplicated.\r\n * @returns The deduplicated array.\r\n */\r\nexport const deduplicateArray = <T extends any[]>(array: T): T => from(new Set(array)) as T;\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 * @param args The args with which each function is called.\r\n * @param keep True when the Set / array should not be cleared afterwards, false otherwise.\r\n */\r\nexport const runEachAndClear = (arr: RunEachItem[], args?: any[], keep?: boolean): void => {\r\n // eslint-disable-next-line prefer-spread\r\n const runFn = (fn: RunEachItem) => fn && fn.apply(undefined, args || []);\r\n each(arr, runFn);\r\n !keep && ((arr as any[]).length = 0);\r\n};\r\n","export const strPaddingTop = 'paddingTop';\r\nexport const strPaddingRight = 'paddingRight';\r\nexport const strPaddingLeft = 'paddingLeft';\r\nexport const strPaddingBottom = 'paddingBottom';\r\nexport const strMarginLeft = 'marginLeft';\r\nexport const strMarginRight = 'marginRight';\r\nexport const strMarginBottom = 'marginBottom';\r\nexport const strOverflowX = 'overflowX';\r\nexport const strOverflowY = 'overflowY';\r\nexport const strWidth = 'width';\r\nexport const strHeight = 'height';\r\nexport const strVisible = 'visible';\r\nexport const strHidden = 'hidden';\r\nexport const strScroll = 'scroll';\r\n\r\nexport const capitalizeFirstLetter = (str: string | number | false | null | undefined): string => {\r\n const finalStr = String(str || '');\r\n return finalStr ? finalStr[0].toUpperCase() + finalStr.slice(1) : '';\r\n};\r\n","import type { WH } from '../dom/dimensions';\r\nimport type { XY } from '../dom/offset';\r\nimport type { TRBL } from '../dom/style';\r\nimport type { PlainObject } from '~/typings';\r\nimport { each } from './array';\r\nimport { mathRound } from './alias';\r\nimport { strHeight, strWidth } from './strings';\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 = <T extends PlainObject>(\r\n a: T | undefined,\r\n b: T | undefined,\r\n props: Array<keyof T> | ReadonlyArray<keyof T>,\r\n propMutation?: ((value: any) => any) | null | false\r\n): boolean => {\r\n if (a && b) {\r\n let result = true;\r\n each(props, (prop) => {\r\n const compareA = propMutation ? propMutation(a[prop]) : a[prop];\r\n const compareB = propMutation ? propMutation(b[prop]) : b[prop];\r\n if (compareA !== compareB) {\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 = <T>(a?: Partial<WH<T>>, b?: Partial<WH<T>>) =>\r\n equal<Partial<WH<T>>>(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 = <T>(a?: Partial<XY<T>>, b?: Partial<XY<T>>) =>\r\n equal<Partial<XY<T>>>(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<TRBL>(a, b, ['t', 'r', 'b', 'l']);\r\n\r\n/**\r\n * Compares two DOM Rects for their equality of their width and height properties\r\n * Also returns false if one of the DOM Rects is undefined or null.\r\n * @param a DOM Rect a.\r\n * @param b DOM Rect b.\r\n * @param round Whether the values should be rounded.\r\n */\r\nexport const equalBCRWH = (a?: DOMRect, b?: DOMRect, round?: boolean) =>\r\n equal<DOMRect>(a, b, [strWidth, strHeight], round && ((value) => mathRound(value)));\r\n","export const noop = () => {}; // eslint-disable-line\r\n","import { isNumber, isFunction } from './types';\r\nimport { from } from './array';\r\nimport { rAF, cAF, setT, clearT } from './alias';\r\nimport { noop } from './noop';\r\n\r\ntype DebounceTiming = number | false | null | undefined;\r\n\r\nexport interface DebounceOptions<FunctionToDebounce extends (...args: any) => any> {\r\n /**\r\n * The timeout for debouncing. If null, no debounce is applied.\r\n */\r\n _timeout?: DebounceTiming | (() => DebounceTiming);\r\n /**\r\n * A maximum amount of ms. before the function will be called even with debounce.\r\n */\r\n _maxDelay?: DebounceTiming | (() => DebounceTiming);\r\n /**\r\n * Defines the calling on the leading edge of the timeout.\r\n */\r\n _leading?: boolean;\r\n /**\r\n * Function which merges parameters for each canceled debounce.\r\n * If parameters can't be merged the function will return null, otherwise it returns the merged parameters.\r\n */\r\n _mergeParams?: (\r\n prev: Parameters<FunctionToDebounce>,\r\n curr: Parameters<FunctionToDebounce>\r\n ) => Parameters<FunctionToDebounce> | false | null | undefined;\r\n}\r\n\r\nexport interface Debounced<FunctionToDebounce extends (...args: any) => any> {\r\n (...args: Parameters<FunctionToDebounce>): ReturnType<FunctionToDebounce>;\r\n _flush(): void;\r\n}\r\n\r\nexport const bind = <A extends any[], B extends any[], R>(\r\n fn: (...args: [...A, ...B]) => R,\r\n ...args: A\r\n): ((...args: B) => R) => fn.bind(0, ...args);\r\n\r\n/**\r\n * Creates a timeout and cleartimeout tuple. The timeout function always clears the previously created timeout before it runs.\r\n * @param timeout The timeout in ms. If no timeout (or 0) is passed requestAnimationFrame is used instead of setTimeout.\r\n * @returns A tuple with the timeout function as the first value and the clearTimeout function as the second value.\r\n */\r\nexport const selfClearTimeout = (timeout?: number | (() => number)) => {\r\n let id: number;\r\n const setTFn = timeout ? setT : rAF!;\r\n const clearTFn = timeout ? clearT : cAF!;\r\n return [\r\n (callback: () => any) => {\r\n clearTFn(id);\r\n // @ts-ignore\r\n id = setTFn(() => callback(), isFunction(timeout) ? timeout() : timeout);\r\n },\r\n () => clearTFn(id),\r\n ] as [timeout: (callback: () => any) => void, clear: () => void];\r\n};\r\n\r\n/**\r\n * Debounces the given function either with a timeout or a animation frame.\r\n * @param functionToDebounce The function which shall be debounced.\r\n * @param options Options for debouncing.\r\n */\r\nexport const debounce = <FunctionToDebounce extends (...args: any) => any>(\r\n functionToDebounce: FunctionToDebounce,\r\n options?: DebounceOptions<FunctionToDebounce>\r\n): Debounced<FunctionToDebounce> => {\r\n const { _timeout, _maxDelay, _leading, _mergeParams } = options || {};\r\n let maxTimeoutId: number | undefined;\r\n let prevArguments: Parameters<FunctionToDebounce> | null | undefined;\r\n let latestArguments: Parameters<FunctionToDebounce> | null | undefined;\r\n let leadingInvoked: boolean | undefined;\r\n let clear = noop;\r\n\r\n const invokeFunctionToDebounce = function (args: Parameters<FunctionToDebounce>) {\r\n clear();\r\n clearT(maxTimeoutId);\r\n leadingInvoked = maxTimeoutId = prevArguments = undefined;\r\n clear = noop;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n functionToDebounce.apply(this, args);\r\n };\r\n\r\n const mergeParms = (\r\n curr: Parameters<FunctionToDebounce>\r\n ): Parameters<FunctionToDebounce> | false | null | undefined =>\r\n _mergeParams && prevArguments ? _mergeParams(prevArguments, curr) : curr;\r\n\r\n const flush = () => {\r\n /* istanbul ignore next */\r\n if (clear !== noop) {\r\n invokeFunctionToDebounce(mergeParms(latestArguments!) || latestArguments!);\r\n }\r\n };\r\n\r\n const debouncedFn = function () {\r\n // eslint-disable-next-line prefer-rest-params\r\n const args: Parameters<FunctionToDebounce> = from(arguments) as Parameters<FunctionToDebounce>;\r\n const finalTimeout = isFunction(_timeout) ? _timeout() : _timeout;\r\n const hasTimeout = isNumber(finalTimeout) && finalTimeout >= 0;\r\n\r\n if (hasTimeout) {\r\n const finalMaxWait = isFunction(_maxDelay) ? _maxDelay() : _maxDelay;\r\n const hasMaxWait = isNumber(finalMaxWait) && finalMaxWait >= 0;\r\n const setTimeoutFn = finalTimeout > 0 ? setT : rAF!;\r\n const clearTimeoutFn = finalTimeout > 0 ? clearT : cAF!;\r\n const mergeParamsResult = mergeParms(args);\r\n const invokedArgs = mergeParamsResult || args;\r\n const boundInvoke = invokeFunctionToDebounce.bind(0, invokedArgs);\r\n let timeoutId: number | undefined;\r\n\r\n // if (!mergeParamsResult) {\r\n // invokeFunctionToDebounce(prevArguments || args);\r\n // }\r\n\r\n clear();\r\n if (_leading && !leadingInvoked) {\r\n boundInvoke();\r\n leadingInvoked = true;\r\n // @ts-ignore\r\n timeoutId = setTimeoutFn(() => (leadingInvoked = undefined), finalTimeout);\r\n } else {\r\n // @ts-ignore\r\n timeoutId = setTimeoutFn(boundInvoke, finalTimeout);\r\n\r\n if (hasMaxWait && !maxTimeoutId) {\r\n maxTimeoutId = setT(flush, finalMaxWait as number);\r\n }\r\n }\r\n\r\n clear = () => clearTimeoutFn(timeoutId as number);\r\n\r\n prevArguments = latestArguments = invokedArgs;\r\n } else {\r\n invokeFunctionToDebounce(args);\r\n }\r\n };\r\n debouncedFn._flush = flush;\r\n\r\n return debouncedFn as Debounced<FunctionToDebounce>;\r\n};\r\n","import type { PlainObject } from '~/typings';\r\nimport { isArray, isFunction, isPlainObject, isNull } from './types';\r\nimport { each } from './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 =>\r\n 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<string> => (obj ? Object.keys(obj) : []);\r\n\r\ntype AssignDeep = {\r\n <T, U>(target: T, object1: U): T & U;\r\n <T, U, V>(target: T, object1: U, object2: V): T & U & V;\r\n <T, U, V, W>(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\n <T, U, V, W, X>(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\n <T, U, V, W, X, Y>(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T &\r\n U &\r\n V &\r\n W &\r\n X &\r\n Y;\r\n <T, U, V, W, X, Y, Z>(\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};\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport const assignDeep: AssignDeep = <T, U, V, W, X, Y, Z>(\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<any> = [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(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)) {\r\n const src = target[key as keyof T];\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 as keyof T] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key as keyof T] = copyIsArray ? copy.slice() : 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\r\nexport const removeUndefinedProperties = <T extends PlainObject>(target: T, deep?: boolean): T =>\r\n each(assignDeep({}, target), (value, key, copy) => {\r\n if (value === undefined) {\r\n delete copy[key];\r\n } else if (deep && value && isPlainObject(value)) {\r\n copy[key as keyof typeof copy] = removeUndefinedProperties(value, deep) as any;\r\n }\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 const isEmptyObject = (obj: any): boolean => !keys(obj).length;\r\n","import { mathMax, mathMin } from './alias';\r\n\r\n/**\r\n * Caps the passed number between the `min` and `max` bounds.\r\n * @param min The min bound.\r\n * @param max The max bound.\r\n * @param number The number to be capped.\r\n * @returns The capped number between min and max.\r\n */\r\nexport const capNumber = (min: number, max: number, number: number) =>\r\n mathMax(min, mathMin(max, number));\r\n","import type { HTMLElementTarget } from './types';\r\nimport { bind, deduplicateArray, each, from, isArray } from '../utils';\r\n\r\nexport type AttributeElementTarget = HTMLElementTarget | Element;\r\n\r\nexport type DomTokens = string | string[] | false | null | undefined | void;\r\n\r\nexport const getDomTokensArray = (tokens: DomTokens) =>\r\n deduplicateArray((isArray(tokens) ? tokens : (tokens || '').split(' ')).filter((token) => token));\r\n\r\n/**\r\n * Gets a attribute with the given attribute of the given element.\r\n * @param elm The element of which the attribute shall be get.\r\n * @param attrName The attribute name which shall be get.\r\n * @returns The attribute value or `null` when the attribute is not set or `false` if the element is undefined.\r\n */\r\nexport const getAttr = (elm: AttributeElementTarget, attrName: string) =>\r\n elm && elm.getAttribute(attrName);\r\n\r\n/**\r\n * Returns whether the given attribute exists on the given element.\r\n * @param elm The element.\r\n * @param attrName The attribute.\r\n * @returns A Truthy value indicates a present attrubte.\r\n */\r\nexport const hasAttr = (elm: AttributeElementTarget, attrName: string) =>\r\n elm && elm.hasAttribute(attrName);\r\n\r\n/**\r\n * Sets the given attributes to the given element.\r\n * @param elm The element of which the attributes shall be removed.\r\n * @param attrName The attribute names separated by a space.\r\n */\r\nexport const setAttrs = (\r\n elm: AttributeElementTarget,\r\n attrNames: string | string[],\r\n value: string | number | false | null | undefined\r\n) => {\r\n each(getDomTokensArray(attrNames), (attrName) => {\r\n elm && elm.setAttribute(attrName, String(value || ''));\r\n });\r\n};\r\n\r\n/**\r\n * Removes the given attributes from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute names separated by a space.\r\n */\r\nexport const removeAttrs = (elm: AttributeElementTarget, attrNames: string | string[]): void => {\r\n each(getDomTokensArray(attrNames), (attrName) => elm && elm.removeAttribute(attrName));\r\n};\r\n\r\nexport const domTokenListAttr = (elm: AttributeElementTarget, attrName: string) => {\r\n const initialArr = getDomTokensArray(getAttr(elm, attrName));\r\n const setElmAttr = bind(setAttrs, elm, attrName);\r\n const domTokenListOperation = (operationTokens: DomTokens, operation: 'add' | 'delete') => {\r\n const initialArrSet = new Set(initialArr);\r\n each(getDomTokensArray(operationTokens), (token) => {\r\n initialArrSet[operation](token);\r\n });\r\n return from(initialArrSet).join(' ');\r\n };\r\n\r\n return {\r\n _remove: (removeTokens: DomTokens) => setElmAttr(domTokenListOperation(removeTokens, 'delete')),\r\n _add: (addTokens: DomTokens) => setElmAttr(domTokenListOperation(addTokens, 'add')),\r\n _has: (hasTokens: DomTokens) => {\r\n const tokenSet = getDomTokensArray(hasTokens);\r\n return tokenSet.reduce(\r\n (boolean, token) => boolean && initialArr.includes(token),\r\n tokenSet.length > 0\r\n );\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Treats the given attribute like the \"class\" attribute and removes the given value from it.\r\n * @param elm The element.\r\n * @param attrName The attributeName to which the value shall be removed.\r\n * @param value The value which shall be removed.\r\n */\r\nexport const removeAttrClass = (\r\n elm: AttributeElementTarget,\r\n attrName: string,\r\n value: DomTokens\r\n): (() => void) => {\r\n domTokenListAttr(elm, attrName)._remove(value);\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n return bind(addAttrClass, elm, attrName, value);\r\n};\r\n\r\n/**\r\n * Treats the given attribute like the \"class\" attribute and adds value to it.\r\n * @param elm The element.\r\n * @param attrName The attributeName to which the value shall be added.\r\n * @param value The value which shall be added.\r\n */\r\nexport const addAttrClass = (\r\n elm: AttributeElementTarget,\r\n attrName: string,\r\n value: DomTokens\r\n): (() => void) => {\r\n domTokenListAttr(elm, attrName)._add(value);\r\n return bind(removeAttrClass, elm, attrName, value);\r\n};\r\n\r\nexport const addRemoveAttrClass = (\r\n elm: AttributeElementTarget,\r\n attrName: string,\r\n value: DomTokens,\r\n add?: boolean\r\n) => (add ? addAttrClass : removeAttrClass)(elm, attrName, value);\r\n\r\n/**\r\n * Treats the given attribute like the \"class\" attribute and checks if the given value is in it.\r\n * @param elm The element.\r\n * @param attrName The attributeName from which the content shall be checked.\r\n * @param value The value.\r\n * @returns True if the given attribute has the value in it, false otherwise.\r\n */\r\nexport const hasAttrClass = (\r\n elm: AttributeElementTarget,\r\n attrName: string,\r\n value: DomTokens\r\n): boolean => domTokenListAttr(elm, attrName)._has(value);\r\n","import type { AttributeElementTarget, DomTokens } from './attribute';\r\nimport { each, from } from '../utils/array';\r\nimport { bind } from '../utils/function';\r\nimport { domTokenListAttr } from './attribute';\r\n\r\nconst createDomTokenListClass = (elm: AttributeElementTarget) => domTokenListAttr(elm, 'class');\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: AttributeElementTarget, className: DomTokens): boolean =>\r\n createDomTokenListClass(elm)._has(className);\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: AttributeElementTarget, className: DomTokens): void => {\r\n createDomTokenListClass(elm)._remove(className);\r\n};\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 * @returns A function which removes the added class name(s).\r\n */\r\nexport const addClass = (elm: AttributeElementTarget, className: DomTokens): (() => void) => {\r\n createDomTokenListClass(elm)._add(className);\r\n return bind(removeClass, elm, className);\r\n};\r\n\r\n/**\r\n * Takes two className strings, compares them and returns the difference as array.\r\n * @param classNameA ClassName A.\r\n * @param classNameB ClassName B.\r\n */\r\nexport const diffClass = (\r\n classNameA: string | false | null | undefined,\r\n classNameB: string | false | null | undefined\r\n) => {\r\n const set = new Set<string>(classNameA ? classNameA.split(' ') : []);\r\n\r\n each(classNameB ? classNameB.split(' ') : [], (className) => {\r\n set.has(className) ? set.delete(className) : set.add(className);\r\n });\r\n\r\n return from(set);\r\n};\r\n","import type { NodeElementTarget } from './types';\r\nimport { isElement } from '../utils/types';\r\nimport { push, from } from '../utils/array';\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?: NodeElementTarget): Element[] => {\r\n const rootElm = elm ? isElement(elm) && elm : document;\r\n return rootElm ? from(rootElm.querySelectorAll(selector)) : [];\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?: NodeElementTarget): NodeElementTarget => {\r\n const rootElm = elm ? isElement(elm) && elm : document;\r\n return rootElm && rootElm.querySelector(selector);\r\n};\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: NodeElementTarget, selector: string): boolean =>\r\n isElement(elm) && elm.matches(selector);\r\n\r\nexport const isBodyElement = (elm: NodeElementTarget) => is(elm, 'body'); // don't do targetElement === ownerDocument.body in case initialization happens in memory\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: NodeElementTarget, selector?: string): ReadonlyArray<Element> => {\r\n const childs: Array<Element> = [];\r\n\r\n return isElement(elm)\r\n ? push(\r\n childs,\r\n from(elm.children).filter((child) => (selector ? is(child, selector) : child))\r\n )\r\n : 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: NodeElementTarget): ReadonlyArray<ChildNode> =>\r\n 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: NodeElementTarget): NodeElementTarget => elm && elm.parentElement;\r\n\r\n/**\r\n * Returns the closest element to the passed element which matches the given selector.\r\n * @param elm The element.\r\n * @param selector The selector.\r\n * @returns The closest element to the passed element which matches the given selector.\r\n */\r\nexport const closest = (elm: NodeElementTarget, selector: string): NodeElementTarget =>\r\n isElement(elm) && elm.closest(selector);\r\n\r\n/**\r\n * Gets the focused element of the passed or default document.\r\n * @returns The focused element of the passed document.\r\n */\r\nexport const getFocusedElement = (doc?: Document) => (doc || document).activeElement;\r\n\r\n/**\r\n * Determines whether the given element lies between two selectors in the DOM.\r\n * @param elm The element.\r\n * @param highBoundarySelector The high boundary selector.\r\n * @param deepBoundarySelector The deep boundary selector.\r\n */\r\nexport const liesBetween = (\r\n elm: NodeElementTarget,\r\n highBoundarySelector: string,\r\n deepBoundarySelector: string\r\n): boolean => {\r\n const closestHighBoundaryElm = closest(elm, highBoundarySelector);\r\n const closestDeepBoundaryElm = elm && findFirst(deepBoundarySelector, closestHighBoundaryElm);\r\n const deepBoundaryIsValid =\r\n closest(closestDeepBoundaryElm, highBoundarySelector) === closestHighBoundaryElm;\r\n\r\n return closestHighBoundaryElm && closestDeepBoundaryElm\r\n ? closestHighBoundaryElm === elm ||\r\n closestDeepBoundaryElm === elm ||\r\n (deepBoundaryIsValid &&\r\n closest(closest(elm, deepBoundarySelector), highBoundarySelector) !==\r\n closestHighBoundaryElm)\r\n : false;\r\n};\r\n","import type { NodeElementTarget, NodeElementTargetCollection } from './types';\r\nimport { createOrKeepArray, each } from '../utils/array';\r\nimport { parent } from './traversal';\r\nimport { bind } from '../utils';\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: NodeElementTargetCollection): void => {\r\n each(createOrKeepArray(nodes), (node) => {\r\n const parentElm = parent(node);\r\n node && parentElm && parentElm.removeChild(node);\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 * @returns A function which removes the inserted nodes.\r\n */\r\nexport const appendChildren = (node: NodeElementTarget, children: NodeElementTargetCollection) =>\r\n bind(\r\n removeElements,\r\n node &&\r\n children &&\r\n each(createOrKeepArray(children), (child) => {\r\n child && node.appendChild(child);\r\n })\r\n );\r\n","import { each } from '../utils/array';\r\nimport { setAttrs } from './attribute';\r\nimport { contents } from './traversal';\r\nimport { removeElements } from './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 setAttrs(div, 'class', classNames);\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<Node> => {\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","import type { PlainObject, StyleObject, StyleObjectKey, StyleObjectValue } from '~/typings';\r\nimport type { XY } from './offset';\r\nimport type { HTMLElementTarget } from './types';\r\nimport { wnd } from '../utils/alias';\r\nimport { each, from } from '../utils/array';\r\nimport { isString, isNumber, isObject, isNull, isBoolean } from '../utils/types';\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\nconst getCSSVal = (computedStyle: CSSStyleDeclaration, prop: StyleObjectKey): string =>\r\n computedStyle.getPropertyValue(prop) || computedStyle[prop as any] || '';\r\n\r\nconst validFiniteNumber = (number: number) => {\r\n const notNaN = number || 0;\r\n return isFinite(notNaN) ? notNaN : 0;\r\n};\r\n\r\nconst parseToZeroOrNumber = (value?: string): number => validFiniteNumber(parseFloat(value || ''));\r\n\r\nexport const roundCssNumber = (value: number) => Math.round(value * 10000) / 10000;\r\n\r\nexport const ratioToCssPercent = (ratio: number) =>\r\n `${roundCssNumber(validFiniteNumber(ratio) * 100)}%`;\r\n\r\nexport const numberToCssPx = (number: number) => `${roundCssNumber(validFiniteNumber(number))}px`;\r\n\r\nexport function setStyles(\r\n elm: HTMLElementTarget,\r\n styles: StyleObject | false | null | undefined\r\n): void {\r\n elm &&\r\n styles &&\r\n each(styles, (rawValue: StyleObjectValue, name) => {\r\n try {\r\n const elmStyle = elm.style;\r\n const value =\r\n isNull(rawValue) || isBoolean(rawValue)\r\n ? ''\r\n : isNumber(rawValue)\r\n ? numberToCssPx(rawValue)\r\n : rawValue;\r\n\r\n if (name.indexOf('--') === 0) {\r\n elmStyle.setProperty(name, value);\r\n } else {\r\n elmStyle[name as any] = value;\r\n }\r\n } catch {}\r\n });\r\n}\r\n\r\nexport function getStyles(\r\n elm: HTMLElementTarget,\r\n styles: Array<StyleObjectKey> | ReadonlyArray<StyleObjectKey>,\r\n pseudoElm?: string | null | undefined\r\n): Partial<Record<StyleObjectKey, string>>;\r\nexport function getStyles(\r\n elm: HTMLElementTarget,\r\n styles: StyleObjectKey,\r\n pseudoElm?: string | null | undefined\r\n): string;\r\nexport function getStyles(\r\n elm: HTMLElementTarget,\r\n styles: Array<StyleObjectKey> | ReadonlyArray<StyleObjectKey> | StyleObjectKey,\r\n pseudoElm?: string | null | undefined\r\n): Partial<Record<StyleObjectKey, string>> | string {\r\n const getSingleStyle = isString(styles);\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n\r\n if (elm) {\r\n const computedStyle = wnd.getComputedStyle(elm, pseudoElm) || elm.style;\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(computedStyle, styles)\r\n : from(styles).reduce((result, key) => {\r\n result[key] = getCSSVal(computedStyle, key);\r\n return result;\r\n }, getStylesResult as PlainObject);\r\n }\r\n return getStylesResult;\r\n}\r\n\r\n/**\r\n * Returns the top right bottom left values of the passed css property.\r\n * @param elm The element of which the values shall be returned.\r\n * @param propertyPrefix The css property prefix. (e.g. \"border\")\r\n * @param propertySuffix The css property suffix. (e.g. \"width\")\r\n */\r\nexport const topRightBottomLeft = (\r\n elm?: HTMLElementTarget,\r\n propertyPrefix?: string,\r\n propertySuffix?: string\r\n): TRBL => {\r\n const finalPrefix = propertyPrefix ? `${propertyPrefix}-` : '';\r\n const finalSuffix = propertySuffix ? `-${propertySuffix}` : '';\r\n const top = `${finalPrefix}top${finalSuffix}` as StyleObjectKey;\r\n const right = `${finalPrefix}right${finalSuffix}` as StyleObjectKey;\r\n const bottom = `${finalPrefix}bottom${finalSuffix}` as StyleObjectKey;\r\n const left = `${finalPrefix}left${finalSuffix}` as StyleObjectKey;\r\n const result = getStyles(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\r\nexport const getTrasformTranslateValue = (\r\n value: string | number | XY<string | number>,\r\n isHorizontal?: boolean\r\n) =>\r\n `translate${\r\n isObject(value) ? `(${value.x},${value.y})` : `${isHorizontal ? 'X' : 'Y'}(${value})`\r\n }`;\r\n","import type { HTMLElementTarget } from './types';\r\nimport { getStyles } from './style';\r\nimport { mathRound, wnd } from '../utils/alias';\r\nimport { bind } from '../utils/function';\r\nimport { strHeight, strWidth } from '../utils/strings';\r\n\r\nexport interface WH<T = number> {\r\n w: T;\r\n h: T;\r\n}\r\n\r\nconst elementHasDimensions = (elm: HTMLElement): boolean =>\r\n !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\nconst getElmWidthHeightProperty = <E extends HTMLElement | Window>(\r\n property: E extends HTMLElement ? 'client' | 'offset' | 'scroll' : 'inner',\r\n elm: E | false | null | undefined\r\n): Readonly<WH> =>\r\n elm\r\n ? {\r\n w: (elm as any)[`${property}Width`],\r\n h: (elm as any)[`${property}Height`],\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const getWindowSize = (customWnd?: Window): Readonly<WH> =>\r\n getElmWidthHeightProperty('inner', customWnd || wnd);\r\n\r\n/**\r\n * Returns the scroll- 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 scroll- width and height shall be returned.\r\n */\r\nexport const getOffsetSize = bind(getElmWidthHeightProperty<HTMLElement>, 'offset') satisfies (\r\n elm: HTMLElementTarget\r\n) => Readonly<WH>;\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 getClientSize = bind(getElmWidthHeightProperty<HTMLElement>, 'client') satisfies (\r\n elm: HTMLElementTarget\r\n) => Readonly<WH>;\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 getScrollSize = bind(getElmWidthHeightProperty<HTMLElement>, 'scroll') satisfies (\r\n elm: HTMLElementTarget\r\n) => Readonly<WH>;\r\n\r\n/**\r\n * Returns the fractional- 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 fractional- width and height shall be returned.\r\n */\r\nexport const getFractionalSize = (elm: HTMLElementTarget): Readonly<WH> => {\r\n const cssWidth = parseFloat(getStyles(elm, strWidth)) || 0;\r\n const cssHeight = parseFloat(getStyles(elm, strHeight)) || 0;\r\n return {\r\n w: cssWidth - mathRound(cssWidth),\r\n h: cssHeight - mathRound(cssHeight),\r\n };\r\n};\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: HTMLElementTarget): boolean =>\r\n !!elm && elementHasDimensions(elm);\r\n\r\n/**\r\n * Determines whether the passed DOM Rect has any dimensions.\r\n */\r\nexport const domRectHasDimensions = (rect?: DOMRectReadOnly | false | null) =>\r\n !!(rect && (rect[strHeight] || rect[strWidth]));\r\n\r\n/**\r\n * Determines whether current DOM Rect has appeared according the the previous dom rect..\r\n * @param currContentRect The current DOM Rect.\r\n * @param prevContentRect The previous DOM Rect.\r\n * @returns Whether the dom rect appeared.\r\n */\r\nexport const domRectAppeared = (\r\n currContentRect: DOMRectReadOnly | false | null | undefined,\r\n prevContentRect: DOMRectReadOnly | false | null | undefined\r\n) => {\r\n const rectHasDimensions = domRectHasDimensions(currContentRect);\r\n const rectHadDimensions = domRectHasDimensions(prevContentRect);\r\n return !rectHadDimensions && rectHasDimensions;\r\n};\r\n","import type { DomTokens } from './attribute';\r\nimport { each, runEachAndClear } from '../utils/array';\r\nimport { bind } from '../utils/function';\r\nimport { keys } from '../utils';\r\nimport { getDomTokensArray } from './attribute';\r\n\r\nexport interface EventListenerOptions {\r\n _capture?: boolean;\r\n _passive?: boolean;\r\n _once?: boolean;\r\n}\r\n\r\nexport type EventListenerTarget = EventTarget | false | null | undefined;\r\n\r\nexport type EventListenerMap = {\r\n [eventNames: string]: ((event: any) => any) | false | null | undefined;\r\n};\r\n\r\n/**\r\n * Removes the passed event listener for the passed event names 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 removeEventListener = <T extends Event = Event>(\r\n target: EventListenerTarget,\r\n eventNames: DomTokens,\r\n listener: (event: T) => any,\r\n capture?: boolean\r\n): void => {\r\n each(getDomTokensArray(eventNames), (eventName) => {\r\n target && target.removeEventListener(eventName, listener as EventListener, capture);\r\n });\r\n};\r\n\r\n/**\r\n * Adds the passed event listener for the passed event names 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 addEventListener = <T extends Event = Event>(\r\n target: EventListenerTarget,\r\n eventNames: DomTokens,\r\n listener: ((event: T) => any) | false | null | undefined,\r\n options?: EventListenerOptions\r\n): (() => void) => {\r\n const passive = (options && options._passive) ?? true;\r\n const capture = (options && options._capture) || false;\r\n const once = (options && options._once) || false;\r\n const nativeOptions: AddEventListenerOptions = {\r\n passive,\r\n capture,\r\n };\r\n\r\n return bind(\r\n runEachAndClear,\r\n getDomTokensArray(eventNames).map((eventName) => {\r\n const finalListener = (\r\n once\r\n ? (evt: T) => {\r\n removeEventListener(target, eventName, finalListener, capture);\r\n listener && listener(evt);\r\n }\r\n : listener\r\n ) as EventListener;\r\n\r\n target && target.addEventListener(eventName, finalListener, nativeOptions);\r\n return bind(removeEventListener, target, eventName, finalListener, capture);\r\n })\r\n );\r\n};\r\n\r\n/**\r\n * Adds the passed event listeners for the passed event names with the passed options.\r\n * @param target The element to which the listener shall be added.\r\n * @param eventListenerMap A map which descirbes the event names and event listeners to be added.\r\n * @param options The options of the added listeners.\r\n */\r\nexport const addEventListeners = (\r\n target: EventListenerTarget,\r\n eventListenerMap: EventListenerMap,\r\n options?: EventListenerOptions\r\n): (() => void) =>\r\n bind(\r\n runEachAndClear,\r\n keys(eventListenerMap).map((eventNames) =>\r\n addEventListener(target, eventNames, eventListenerMap[eventNames], options)\r\n )\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): void => 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): void => evt.preventDefault();\r\n\r\n/**\r\n * Shorthand for the stopPropagation and preventDefault event Method.\r\n * @param evt The event of which the stopPropagation and preventDefault methods shall be called.\r\n */\r\nexport const stopAndPrevent = (evt: Event): void =>\r\n (stopPropagation(evt) as undefined) || (preventDefault(evt) as undefined);\r\n","import type { XY } from './offset';\r\nimport type { WH } from './dimensions';\r\nimport { capNumber, isNumber, mathAbs, mathSign } from '../utils';\r\n\r\nexport interface ScrollCoordinates {\r\n /** The start (origin) scroll coordinates for each axis. */\r\n _start: XY<number>;\r\n /** The end scroll coordinates for each axis. */\r\n _end: XY<number>;\r\n}\r\n\r\n/**\r\n * Scroll the passed element to the passed position.\r\n * @param elm The element to be scrolled.\r\n * @param position The scroll position.\r\n */\r\nexport const scrollElementTo = (\r\n elm: HTMLElement,\r\n position: Partial<XY<number | false | null | undefined>> | number | false | null | undefined\r\n): void => {\r\n const { x, y } = isNumber(position) ? { x: position, y: position } : position || {};\r\n isNumber(x) && (elm.scrollLeft = x);\r\n isNumber(y) && (elm.scrollTop = y);\r\n};\r\n\r\n/**\r\n * Scroll the passed element to the passed position.\r\n * @param elm The element to be scrolled.\r\n * @param position The scroll position.\r\n */\r\nexport const getElementScroll = (elm: HTMLElement): Readonly<XY> => ({\r\n x: elm.scrollLeft,\r\n y: elm.scrollTop,\r\n});\r\n\r\n/**\r\n * Scroll Coordinates which are 0.\r\n */\r\nexport const getZeroScrollCoordinates = (): ScrollCoordinates => ({\r\n _start: { x: 0, y: 0 },\r\n _end: { x: 0, y: 0 },\r\n});\r\n\r\n/**\r\n * Sanatizes raw scroll coordinates.\r\n * The passed `overflowAmount` is used as the \"max\" value for each axis if the sign of the raw max value is not `0`.\r\n * Makes sure that each axis has `0` either in the start or end coordinates.\r\n * @param rawScrollCoordinates The raw scroll coordinates.\r\n * @param overflowAmount The overflow amount.\r\n * @returns\r\n */\r\nexport const sanitizeScrollCoordinates = (\r\n rawScrollCoordinates: ScrollCoordinates,\r\n overflowAmount: WH<number>\r\n) => {\r\n const { _start, _end } = rawScrollCoordinates;\r\n const { w, h } = overflowAmount;\r\n const sanitizeAxis = (start: number, end: number, amount: number) => {\r\n let newStart = mathSign(start) * amount;\r\n let newEnd = mathSign(end) * amount;\r\n\r\n if (newStart === newEnd) {\r\n const startAbs = mathAbs(start);\r\n const endAbs = mathAbs(end);\r\n\r\n newEnd = startAbs > endAbs ? 0 : newEnd;\r\n newStart = startAbs < endAbs ? 0 : newStart;\r\n }\r\n\r\n // in doubt set start to 0\r\n newStart = newStart === newEnd ? 0 : newStart;\r\n\r\n return [newStart + 0, newEnd + 0] as const; // \"+ 0\" prevents \"-0\" to be in the result\r\n };\r\n\r\n const [startX, endX] = sanitizeAxis(_start.x, _end.x, w);\r\n const [startY, endY] = sanitizeAxis(_start.y, _end.y, h);\r\n\r\n return {\r\n _start: {\r\n x: startX,\r\n y: startY,\r\n },\r\n _end: {\r\n x: endX,\r\n y: endY,\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Returns whether the passed scroll coordinates represent the browsers default scroll direction.\r\n * For the default scroll direction the following must be true:\r\n * 1. Start value is `0`.\r\n * 2. End value <= Start value.\r\n * @param scrollCoordinates The scroll coordinates.\r\n */\r\nexport const isDefaultDirectionScrollCoordinates = ({\r\n _start,\r\n _end,\r\n}: ScrollCoordinates): XY<boolean> => {\r\n const getAxis = (start: number, end: number) => start === 0 && start <= end;\r\n\r\n return {\r\n x: getAxis(_start.x, _end.x),\r\n y: getAxis(_start.y, _end.y),\r\n };\r\n};\r\n\r\n/**\r\n * Gets the current scroll percent between 0..1 for each axis.\r\n * @param scrollCoordinates The scroll coordinates.\r\n * @param currentScroll The current scroll position of the element.\r\n */\r\nexport const getScrollCoordinatesPercent = (\r\n { _start, _end }: ScrollCoordinates,\r\n currentScroll: XY<number>\r\n) => {\r\n const getAxis = (start: number, end: number, current: number) =>\r\n capNumber(0, 1, (start - current) / (start - end) || 0);\r\n\r\n return {\r\n x: getAxis(_start.x, _end.x, currentScroll.x),\r\n y: getAxis(_start.y, _end.y, currentScroll.y),\r\n };\r\n};\r\n\r\n/**\r\n * Gets the scroll position of the given percent.\r\n * @param scrollCoordinates The scroll coordinates.\r\n * @param percent The percentage of the scroll.\r\n */\r\nexport const getScrollCoordinatesPosition = (\r\n { _start, _end }: ScrollCoordinates,\r\n percent: XY<number>\r\n) => {\r\n const getAxis = (start: number, end: number, p: number) => start + (end - start) * p;\r\n\r\n return {\r\n x: getAxis(_start.x, _end.x, percent.x),\r\n y: getAxis(_start.y, _end.y, percent.y),\r\n };\r\n};\r\n","import type { NodeElementTarget } from './types';\r\n\r\nexport const focusElement = (element: NodeElementTarget) => {\r\n if (element && (element as HTMLElement).focus) {\r\n (element as HTMLElement).focus({ preventScroll: true });\r\n }\r\n};\r\n","import { isBoolean, isFunction, isString } from './utils/types';\r\nimport { keys } from './utils/object';\r\nimport { each, push, from, isEmptyArray, runEachAndClear, createOrKeepArray } from './utils/array';\r\nimport { bind } from './utils/function';\r\n\r\nexport type EventListener<EventArgs extends Record<string, any[]>, N extends keyof EventArgs> = (\r\n ...args: EventArgs[N]\r\n) => void;\r\n\r\nexport type EventListeners<EventArgs extends Record<string, any[]>> = {\r\n [K in keyof EventArgs]?: EventListener<EventArgs, K> | EventListener<EventArgs, K>[] | null;\r\n};\r\n\r\nexport type RemoveEvent<EventArgs extends Record<string, any[]>> = {\r\n <N extends keyof EventArgs>(name?: N, listener?: EventListener<EventArgs, N>): void;\r\n <N extends keyof EventArgs>(name?: N, listener?: EventListener<EventArgs, N>[]): void;\r\n <N extends keyof EventArgs>(\r\n name?: N,\r\n listener?: EventListener<EventArgs, N> | EventListener<EventArgs, N>[]\r\n ): void;\r\n};\r\n\r\nexport type AddEvent<EventArgs extends Record<string, any[]>> = {\r\n (eventListeners: EventListeners<EventArgs>, pure?: boolean): () => void;\r\n <N extends keyof EventArgs>(name: N, listener: EventListener<EventArgs, N>): () => void;\r\n <N extends keyof EventArgs>(name: N, listener: EventListener<EventArgs, N>[]): () => void;\r\n <N extends keyof EventArgs>(\r\n nameOrEventListeners: N | EventListeners<EventArgs>,\r\n listener?: EventListener<EventArgs, N> | EventListener<EventArgs, N>[] | boolean\r\n ): () => void;\r\n};\r\n\r\nexport type TriggerEvent<EventArgs extends Record<string, any[]>> = {\r\n <N extends keyof EventArgs>(name: N, args: EventArgs[N]): void;\r\n};\r\n\r\nexport type EventListenerHub<EventArgs extends Record<string, any[]>> = [\r\n AddEvent<EventArgs>,\r\n RemoveEvent<EventArgs>,\r\n TriggerEvent<EventArgs>\r\n];\r\n\r\nconst manageListener = <EventArgs extends Record<string, any[]>, N extends keyof EventArgs>(\r\n callback: (listener?: EventListener<EventArgs, N>) => void,\r\n listener?: EventListener<EventArgs, N> | EventListener<EventArgs, N>[]\r\n) => {\r\n each(createOrKeepArray(listener), callback);\r\n};\r\n\r\nexport const createEventListenerHub = <EventArgs extends Record<string, any[]>>(\r\n initialEventListeners?: EventListeners<EventArgs>\r\n): EventListenerHub<EventArgs> => {\r\n const events = new Map<keyof EventArgs, Set<EventListener<EventArgs, keyof EventArgs>>>();\r\n\r\n const removeEvent: RemoveEvent<EventArgs> = (name, listener) => {\r\n if (name) {\r\n const eventSet = events.get(name);\r\n manageListener((currListener) => {\r\n if (eventSet) {\r\n eventSet[currListener ? 'delete' : 'clear'](currListener! as any);\r\n }\r\n }, listener);\r\n } else {\r\n events.forEach((eventSet) => {\r\n eventSet.clear();\r\n });\r\n events.clear();\r\n }\r\n };\r\n\r\n const addEvent: AddEvent<EventArgs> = (\r\n nameOrEventListeners: keyof EventArgs | EventListeners<EventArgs>,\r\n listenerOrPure?:\r\n | EventListener<EventArgs, keyof EventArgs>\r\n | EventListener<EventArgs, keyof EventArgs>[]\r\n | boolean\r\n ) => {\r\n if (isString(nameOrEventListeners)) {\r\n const eventSet = events.get(nameOrEventListeners) || new Set();\r\n events.set(nameOrEventListeners, eventSet);\r\n\r\n manageListener((currListener) => {\r\n isFunction(currListener) && eventSet.add(currListener);\r\n }, listenerOrPure as Exclude<typeof listenerOrPure, boolean>);\r\n\r\n return bind(\r\n removeEvent,\r\n nameOrEventListeners,\r\n listenerOrPure as Exclude<typeof listenerOrPure, boolean>\r\n );\r\n }\r\n if (isBoolean(listenerOrPure) && listenerOrPure) {\r\n removeEvent();\r\n }\r\n\r\n const eventListenerKeys = keys(nameOrEventListeners) as (keyof EventListeners<EventArgs>)[];\r\n const offFns: (() => void)[] = [];\r\n each(eventListenerKeys, (key) => {\r\n const eventListener = (nameOrEventListeners as EventListeners<EventArgs>)[key];\r\n eventListener && push(offFns, addEvent(key, eventListener));\r\n });\r\n\r\n return bind(runEachAndClear, offFns);\r\n };\r\n\r\n const triggerEvent: TriggerEvent<EventArgs> = (name, args) => {\r\n each(from(events.get(name)), (event) => {\r\n if (args && !isEmptyArray(args)) {\r\n (event as (...eventArgs: EventArgs[keyof EventArgs]) => void).apply(0, args);\r\n } else {\r\n (event as () => void)();\r\n }\r\n });\r\n };\r\n\r\n addEvent(initialEventListeners || {});\r\n\r\n return [addEvent, removeEvent, triggerEvent];\r\n};\r\n","import {\r\n assignDeep,\r\n each,\r\n isObject,\r\n keys,\r\n isArray,\r\n hasOwnProperty,\r\n isFunction,\r\n isEmptyObject,\r\n concat,\r\n} from '~/support';\r\nimport type { DeepPartial, DeepReadonly } from '~/typings';\r\n\r\nexport type OptionsField = string;\r\n\r\nexport type OptionsPrimitiveValue =\r\n | boolean\r\n | number\r\n | string\r\n | Array<any>\r\n | ReadonlyArray<any>\r\n | [any]\r\n | [any, ...any[]]\r\n | ((this: any, ...args: any[]) => any)\r\n | null;\r\n\r\nexport type OptionsObject = {\r\n [field: OptionsField]: OptionsPrimitiveValue | OptionsObject;\r\n};\r\n\r\ntype OptionsObjectFieldNameTuples<T> = T extends OptionsPrimitiveValue\r\n ? []\r\n : {\r\n [K in Extract<keyof T, OptionsField>]: [K, ...OptionsObjectFieldNameTuples<T[K]>];\r\n }[Extract<keyof T, OptionsField>];\r\n\r\ntype JoinOptionsObjectFieldTuples<\r\n T extends OptionsField[],\r\n IncompletePath extends boolean = false\r\n> = T extends [infer F]\r\n ? F\r\n : T extends [infer F, ...infer R]\r\n ? F extends OptionsField\r\n ?\r\n | (IncompletePath extends true ? F : never)\r\n | `${F}.${JoinOptionsObjectFieldTuples<Extract<R, OptionsField[]>>}`\r\n : never\r\n : OptionsField;\r\n\r\ntype SplitJoinedOptionsObjectFieldTuples<S extends string> = string extends S\r\n ? OptionsField[]\r\n : S extends ''\r\n ? []\r\n : S extends `${infer T}.${infer U}`\r\n ? [T, ...SplitJoinedOptionsObjectFieldTuples<U>]\r\n : [S];\r\n\r\ntype OptionsObjectFieldTuplesType<O, T extends OptionsField[]> = T extends [infer F]\r\n ? F extends keyof O\r\n ? O[F]\r\n : never\r\n : T extends [infer F, ...infer R]\r\n ? F extends keyof O\r\n ? O[F] extends OptionsPrimitiveValue\r\n ? O[F]\r\n : OptionsObjectFieldTuplesType<O[F], Extract<R, OptionsField[]>>\r\n : never\r\n : never;\r\n\r\ntype OptionsObjectFieldPath<O extends OptionsObject> = JoinOptionsObjectFieldTuples<\r\n OptionsObjectFieldNameTuples<O>,\r\n true\r\n>;\r\n\r\ntype OptionsObjectFieldPathType<\r\n O extends OptionsObject,\r\n P extends string\r\n> = OptionsObjectFieldTuplesType<O, SplitJoinedOptionsObjectFieldTuples<P>>;\r\n\r\nconst opsStringify = (value: any) =>\r\n JSON.stringify(value, (_, val) => {\r\n if (isFunction(val)) {\r\n throw 0;\r\n }\r\n return val;\r\n });\r\n\r\nconst getPropByPath = <T>(obj: any, path: string): T =>\r\n obj\r\n ? `${path}`\r\n .split('.')\r\n .reduce((o, prop) => (o && hasOwnProperty(o, prop) ? o[prop] : undefined), obj)\r\n : undefined;\r\n\r\n/**\r\n * The overflow behavior of an axis.\r\n */\r\nexport type OverflowBehavior =\r\n /** No scrolling is possible and the content is clipped. */\r\n | 'hidden'\r\n /** No scrolling is possible and the content isn't clipped. */\r\n | 'visible'\r\n /** Scrolling is possible if there is an overflow. */\r\n | 'scroll'\r\n /**\r\n * If the other axis has no overflow the behavior is similar to `visible`.\r\n * If the other axis has overflow the behavior is similar to `hidden`.\r\n */\r\n | 'visible-hidden'\r\n /**\r\n * If the other axis has no overflow the behavior is similar to `visible`.\r\n * If the other axis has overflow the behavior is similar to `scroll`.\r\n */\r\n | 'visible-scroll';\r\n\r\n/**\r\n * The scrollbars visibility behavior.\r\n */\r\nexport type ScrollbarsVisibilityBehavior =\r\n /** The scrollbars are always visible. */\r\n | 'visible'\r\n /** The scrollbars are always hidden. */\r\n | 'hidden'\r\n /** The scrollbars are only visibile if there is overflow. */\r\n | 'auto';\r\n\r\n/**\r\n * The scrollbars auto hide behavior\r\n */\r\nexport type ScrollbarsAutoHideBehavior =\r\n /** The scrollbars are never hidden automatically. */\r\n | 'never'\r\n /** The scrollbars are hidden unless the user scrolls. */\r\n | 'scroll'\r\n /** The scrollbars are hidden unless the pointer moves in the host element or the user scrolls. */\r\n | 'move'\r\n /** The scrollbars are hidden if the pointer leaves the host element or unless the user scrolls. */\r\n | 'leave';\r\n\r\n/**\r\n * The options of a OverlayScrollbars instance.\r\n */\r\nexport type Options = {\r\n /** Whether the padding shall be absolute. */\r\n paddingAbsolute: boolean;\r\n /** Whether to show the native scrollbars. Has only an effect it the native scrollbars are overlaid. */\r\n showNativeOverlaidScrollbars: boolean;\r\n /** Customizes the automatic update behavior. */\r\n update: {\r\n /**\r\n * The given Event(s) from the elements with the given selector(s) will trigger an update.\r\n * Useful for everything the MutationObserver and ResizeObserver can't detect\r\n * e.g.: and Images `load` event or the `transitionend` / `animationend` events.\r\n */\r\n elementEvents: Array<[elementSelector: string, eventNames: string]> | null;\r\n /**\r\n * The debounce which is used to detect content changes.\r\n * If a tuple is provided you can customize the `timeout` and the `maxWait` in milliseconds.\r\n * If a single number customizes only the `timeout`.\r\n *\r\n * If the `timeout` is `0`, a debounce still exists. (its executed via `requestAnimationFrame`).\r\n */\r\n debounce: [timeout: number, maxWait: number] | number | null;\r\n /**\r\n * HTML attributes which will trigger an update if they're changed.\r\n * Basic attributes like `id`, `class`, `style` etc. are always observed and doesn't have to be added explicitly.\r\n */\r\n attributes: string[] | null;\r\n /**\r\n * A function which makes it possible to ignore a content mutation or null if nothing shall be ignored.\r\n * @param mutation The MutationRecord from the MutationObserver.\r\n * @returns A Truthy value if the mutation shall be ignored, a falsy value otherwise.\r\n */\r\n ignoreMutation: ((mutation: MutationRecord) => any) | null;\r\n };\r\n /** Customizes the overflow behavior per axis. */\r\n overflow: {\r\n /** The overflow behavior of the horizontal (x) axis. */\r\n x: OverflowBehavior;\r\n /** The overflow behavior of the vertical (y) axis. */\r\n y: OverflowBehavior;\r\n };\r\n /** Customizes appearance of the scrollbars. */\r\n scrollbars: {\r\n /**\r\n * The scrollbars theme.\r\n * The theme value will be added as `class` to all `scrollbar` elements of the instance.\r\n */\r\n theme: string | null;\r\n /** The scrollbars visibility behavior. */\r\n visibility: ScrollbarsVisibilityBehavior;\r\n /** The scrollbars auto hide behavior. */\r\n autoHide: ScrollbarsAutoHideBehavior;\r\n /** The scrollbars auto hide delay in milliseconds. */\r\n autoHideDelay: number;\r\n /** Whether the scrollbars auto hide behavior is suspended until a scroll happened. */\r\n autoHideSuspend: boolean;\r\n /** Whether its possible to drag the handle of a scrollbar to scroll the viewport. */\r\n dragScroll: boolean;\r\n /** Whether its possible to click the track of a scrollbar to scroll the viewport. */\r\n clickScroll: boolean;\r\n /**\r\n * An array of pointer types which shall be supported.\r\n * Common pointer types are: `mouse`, `pen` and `touch`.\r\n * https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType\r\n */\r\n pointers: string[] | null;\r\n };\r\n};\r\n\r\nexport type ReadonlyOptions = DeepReadonly<Options>;\r\n\r\nexport type PartialOptions = DeepPartial<Options>;\r\n\r\nexport type OptionsCheckFn<O extends OptionsObject> = <P extends OptionsObjectFieldPath<O>>(\r\n path: P\r\n) => [value: OptionsObjectFieldPathType<O, P>, changed: boolean];\r\n\r\nexport const defaultOptions: ReadonlyOptions = {\r\n paddingAbsolute: false,\r\n showNativeOverlaidScrollbars: false,\r\n update: {\r\n elementEvents: [['img', 'load']],\r\n debounce: [0, 33],\r\n attributes: null,\r\n ignoreMutation: null,\r\n },\r\n overflow: {\r\n x: 'scroll',\r\n y: 'scroll',\r\n },\r\n scrollbars: {\r\n theme: 'os-theme-dark',\r\n visibility: 'auto',\r\n autoHide: 'never',\r\n autoHideDelay: 1300,\r\n autoHideSuspend: false,\r\n dragScroll: true,\r\n clickScroll: false,\r\n pointers: ['mouse', 'touch', 'pen'],\r\n },\r\n} satisfies OptionsObject & Options;\r\n\r\nexport const getOptionsDiff = <T>(currOptions: T, newOptions: DeepPartial<T>): DeepPartial<T> => {\r\n const diff: DeepPartial<T> = {};\r\n const optionsKeys = concat(keys(newOptions), keys(currOptions)) as Array<\r\n keyof T & keyof DeepPartial<T>\r\n >;\r\n\r\n each(optionsKeys, (optionKey) => {\r\n const currOptionValue = currOptions[optionKey];\r\n const newOptionValue = newOptions[optionKey];\r\n\r\n if (isObject(currOptionValue) && isObject(newOptionValue)) {\r\n assignDeep((diff[optionKey] = {} as any), getOptionsDiff(currOptionValue, newOptionValue));\r\n // delete empty nested objects\r\n if (isEmptyObject(diff[optionKey])) {\r\n delete diff[optionKey];\r\n }\r\n } else if (hasOwnProperty(newOptions, optionKey) && newOptionValue !== currOptionValue) {\r\n let isDiff = true;\r\n\r\n if (isArray(currOptionValue) || isArray(newOptionValue)) {\r\n try {\r\n if (opsStringify(currOptionValue) === opsStringify(newOptionValue)) {\r\n isDiff = false;\r\n }\r\n } catch {}\r\n }\r\n\r\n if (isDiff) {\r\n // @ts-ignore\r\n diff[optionKey] = newOptionValue;\r\n }\r\n }\r\n });\r\n\r\n return diff;\r\n};\r\n\r\nexport const createOptionCheck =\r\n <T extends OptionsObject>(\r\n options: T,\r\n changedOptions: DeepPartial<T>,\r\n force?: boolean\r\n ): OptionsCheckFn<T> =>\r\n (path) =>\r\n [getPropByPath(options, path), force || getPropByPath(changedOptions, path) !== undefined];\r\n","import { strOverflowX, strOverflowY } from './support';\r\n\r\nconst dataAttributePrefix = `data-overlayscrollbars`;\r\n\r\n// environment\r\nexport const classNameEnvironment = 'os-environment';\r\nexport const classNameEnvironmentScrollbarHidden = `${classNameEnvironment}-scrollbar-hidden`;\r\n\r\n// initialize\r\nexport const dataAttributeInitialize = `${dataAttributePrefix}-initialize`;\r\n\r\n// shared\r\nexport const dataValueNoClipping = 'noClipping';\r\n\r\n// body\r\nexport const dataAttributeHtmlBody = `${dataAttributePrefix}-body`;\r\n\r\n// host\r\nexport const dataAttributeHost = dataAttributePrefix;\r\nexport const dataValueHostIsHost = 'host';\r\n\r\n// viewport\r\nexport const dataAttributeViewport = `${dataAttributePrefix}-viewport`;\r\nexport const dataValueViewportOverflowXPrefix = strOverflowX;\r\nexport const dataValueViewportOverflowYPrefix = strOverflowY;\r\nexport const dataValueViewportArrange = 'arrange';\r\nexport const dataValueViewportMeasuring = 'measuring';\r\nexport const dataValueViewportScrolling = 'scrolling';\r\nexport const dataValueViewportScrollbarHidden = 'scrollbarHidden';\r\nexport const dataValueViewportNoContent = 'noContent';\r\n\r\n// padding\r\nexport const dataAttributePadding = `${dataAttributePrefix}-padding`;\r\n\r\n// content\r\nexport const dataAttributeContent = `${dataAttributePrefix}-content`;\r\n\r\n// size observer\r\nexport const classNameSizeObserver = 'os-size-observer';\r\nexport const classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;\r\nexport const classNameSizeObserverListener = `${classNameSizeObserver}-listener`;\r\nexport const classNameSizeObserverListenerScroll = `${classNameSizeObserverListener}-scroll`;\r\nexport const classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`;\r\nexport const classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`;\r\n\r\n// trinsic observer\r\nexport const classNameTrinsicObserver = 'os-trinsic-observer';\r\n\r\n// scrollbars\r\nexport const classNameScrollbarThemeNone = 'os-theme-none';\r\nexport const classNameScrollbar = 'os-scrollbar';\r\nexport const classNameScrollbarRtl = `${classNameScrollbar}-rtl`;\r\nexport const classNameScrollbarHorizontal = `${classNameScrollbar}-horizontal`;\r\nexport const classNameScrollbarVertical = `${classNameScrollbar}-vertical`;\r\nexport const classNameScrollbarTrack = `${classNameScrollbar}-track`;\r\nexport const classNameScrollbarHandle = `${classNameScrollbar}-handle`;\r\nexport const classNameScrollbarVisible = `${classNameScrollbar}-visible`;\r\nexport const classNameScrollbarCornerless = `${classNameScrollbar}-cornerless`;\r\nexport const classNameScrollbarTransitionless = `${classNameScrollbar}-transitionless`;\r\nexport const classNameScrollbarInteraction = `${classNameScrollbar}-interaction`;\r\nexport const classNameScrollbarUnusable = `${classNameScrollbar}-unusable`;\r\nexport const classNameScrollbarAutoHide = `${classNameScrollbar}-auto-hide`;\r\nexport const classNameScrollbarAutoHideHidden = `${classNameScrollbarAutoHide}-hidden`;\r\nexport const classNameScrollbarWheel = `${classNameScrollbar}-wheel`;\r\nexport const classNameScrollbarTrackInteractive = `${classNameScrollbarTrack}-interactive`;\r\nexport const classNameScrollbarHandleInteractive = `${classNameScrollbarHandle}-interactive`;\r\n","let nonce: string | undefined;\r\n\r\nexport const getNonce = () => nonce;\r\nexport const setNonce = (newNonce: string | undefined) => {\r\n nonce = newNonce;\r\n};\r\n","import {\r\n createDOM,\r\n addClass,\r\n appendChildren,\r\n getFractionalSize,\r\n getClientSize,\r\n getOffsetSize,\r\n removeAttrs,\r\n removeElements,\r\n assignDeep,\r\n createCache,\r\n equalXY,\r\n createEventListenerHub,\r\n scrollT,\r\n bind,\r\n wnd,\r\n getStyles,\r\n isBodyElement,\r\n isFunction,\r\n addEventListener,\r\n} from '~/support';\r\nimport { classNameEnvironment, classNameEnvironmentScrollbarHidden } from '~/classnames';\r\nimport { defaultOptions } from '~/options';\r\nimport type { XY, EventListener } from '~/support';\r\nimport type { Options, PartialOptions } from '~/options';\r\nimport type { Initialization, PartialInitialization } from '~/initialization';\r\nimport type { StyleObjectKey } from './typings';\r\nimport { getNonce } from './nonce';\r\n\r\ntype EnvironmentEventArgs = {\r\n r: [scrollbarSizeChanged?: boolean];\r\n};\r\n\r\nexport interface Env {\r\n readonly _nativeScrollbarsSize: XY;\r\n readonly _nativeScrollbarsOverlaid: XY<boolean>;\r\n readonly _nativeScrollbarsHiding: boolean;\r\n readonly _scrollTimeline: boolean;\r\n readonly _staticDefaultInitialization: Initialization;\r\n readonly _staticDefaultOptions: Options;\r\n _addResizeListener(listener: EventListener<EnvironmentEventArgs, 'r'>): () => void;\r\n _getDefaultInitialization(): Initialization;\r\n _setDefaultInitialization(newInitialization: PartialInitialization): Initialization;\r\n _getDefaultOptions(): Options;\r\n _setDefaultOptions(newDefaultOptions: PartialOptions): Options;\r\n}\r\n\r\nlet environmentInstance: Env;\r\n\r\nconst createEnvironment = (): Env => {\r\n const getNativeScrollbarSize = (\r\n measureElm: HTMLElement,\r\n measureElmChild: HTMLElement,\r\n clear?: boolean\r\n ): XY => {\r\n // fix weird safari issue where getComputedStyle returns all empty styles by appending twice\r\n appendChildren(document.body, measureElm);\r\n appendChildren(document.body, measureElm);\r\n\r\n const cSize = getClientSize(measureElm);\r\n const oSize = getOffsetSize(measureElm);\r\n const fSize = getFractionalSize(measureElmChild);\r\n\r\n clear && removeElements(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h + fSize.h,\r\n y: oSize.w - cSize.w + fSize.w,\r\n };\r\n };\r\n\r\n const getNativeScrollbarsHiding = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n const revertClass = addClass(testElm, classNameEnvironmentScrollbarHidden);\r\n try {\r\n result =\r\n getStyles(testElm, 'scrollbar-width' as StyleObjectKey) === 'none' ||\r\n getStyles(testElm, 'display', '::-webkit-scrollbar') === 'none';\r\n } catch {}\r\n revertClass();\r\n return result;\r\n };\r\n\r\n // changes to this styles need to be reflected in the \"hide native scrollbars\" section of the structure styles\r\n const envStyle = `.${classNameEnvironment}{scroll-behavior:auto!important;position:fixed;opacity:0;visibility:hidden;overflow:scroll;height:200px;width:200px;z-index:-1}.${classNameEnvironment} div{width:200%;height:200%;margin:10px 0}.${classNameEnvironmentScrollbarHidden}{scrollbar-width:none!important}.${classNameEnvironmentScrollbarHidden}::-webkit-scrollbar,.${classNameEnvironmentScrollbarHidden}::-webkit-scrollbar-corner{appearance:none!important;display:none!important;width:0!important;height:0!important}`;\r\n const envDOM = createDOM(\r\n `<div class=\"${classNameEnvironment}\"><div></div><style>${envStyle}</style></div>`\r\n );\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n const styleElm = envElm.lastChild as HTMLStyleElement;\r\n const nonce = getNonce();\r\n\r\n if (nonce) {\r\n styleElm.nonce = nonce;\r\n }\r\n\r\n const [addEvent, , triggerEvent] = createEventListenerHub<EnvironmentEventArgs>();\r\n const [updateNativeScrollbarSizeCache, getNativeScrollbarSizeCache] = createCache(\r\n {\r\n _initialValue: getNativeScrollbarSize(envElm, envChildElm),\r\n _equal: equalXY,\r\n },\r\n bind(getNativeScrollbarSize, envElm, envChildElm, true)\r\n );\r\n const [nativeScrollbarsSize] = getNativeScrollbarSizeCache();\r\n const nativeScrollbarsHiding = getNativeScrollbarsHiding(envElm);\r\n const nativeScrollbarsOverlaid = {\r\n x: nativeScrollbarsSize.x === 0,\r\n y: nativeScrollbarsSize.y === 0,\r\n };\r\n const staticDefaultInitialization: Initialization = {\r\n elements: {\r\n host: null,\r\n padding: !nativeScrollbarsHiding,\r\n viewport: (target) => nativeScrollbarsHiding && isBodyElement(target) && target,\r\n content: false,\r\n },\r\n scrollbars: {\r\n slot: true,\r\n },\r\n cancel: {\r\n nativeScrollbarsOverlaid: false,\r\n body: null,\r\n },\r\n };\r\n const staticDefaultOptions = assignDeep({}, defaultOptions);\r\n const getDefaultOptions = bind(\r\n assignDeep as typeof assignDeep<Options, Options>,\r\n {} as Options,\r\n staticDefaultOptions\r\n );\r\n const getDefaultInitialization = bind(\r\n assignDeep as typeof assignDeep<Initialization, Initialization>,\r\n {} as Initialization,\r\n staticDefaultInitialization\r\n );\r\n\r\n const env: Env = {\r\n _nativeScrollbarsSize: nativeScrollbarsSize,\r\n _nativeScrollbarsOverlaid: nativeScrollbarsOverlaid,\r\n _nativeScrollbarsHiding: nativeScrollbarsHiding,\r\n _scrollTimeline: !!scrollT,\r\n _addResizeListener: bind(addEvent, 'r'),\r\n _getDefaultInitialization: getDefaultInitialization,\r\n _setDefaultInitialization: (newInitializationStrategy) =>\r\n assignDeep(staticDefaultInitialization, newInitializationStrategy) &&\r\n getDefaultInitialization(),\r\n _getDefaultOptions: getDefaultOptions,\r\n _setDefaultOptions: (newDefaultOptions) =>\r\n assignDeep(staticDefaultOptions, newDefaultOptions) && getDefaultOptions(),\r\n _staticDefaultInitialization: assignDeep({}, staticDefaultInitialization),\r\n _staticDefaultOptions: assignDeep({}, staticDefaultOptions),\r\n };\r\n\r\n removeAttrs(envElm, 'style');\r\n removeElements(envElm);\r\n\r\n // needed in case content has css viewport units\r\n addEventListener(wnd, 'resize', () => {\r\n triggerEvent('r', []);\r\n });\r\n\r\n if (\r\n isFunction(wnd.matchMedia) &&\r\n !nativeScrollbarsHiding &&\r\n (!nativeScrollbarsOverlaid.x || !nativeScrollbarsOverlaid.y)\r\n ) {\r\n const addZoomListener = (onZoom: () => void) => {\r\n const media = wnd.matchMedia(`(resolution: ${wnd.devicePixelRatio}dppx)`);\r\n addEventListener(\r\n media,\r\n 'change',\r\n () => {\r\n onZoom();\r\n addZoomListener(onZoom);\r\n },\r\n {\r\n _once: true,\r\n }\r\n );\r\n };\r\n addZoomListener(() => {\r\n const [updatedNativeScrollbarSize, nativeScrollbarSizeChanged] =\r\n updateNativeScrollbarSizeCache();\r\n\r\n assignDeep(env._nativeScrollbarsSize, updatedNativeScrollbarSize); // keep the object and just re-assign!\r\n triggerEvent('r', [nativeScrollbarSizeChanged]);\r\n });\r\n }\r\n\r\n return env;\r\n};\r\n\r\nexport const getEnvironment = (): Env => {\r\n if (!environmentInstance) {\r\n environmentInstance = createEnvironment();\r\n }\r\n return environmentInstance;\r\n};\r\n","import { isFunction, isHTMLElement, isNull, isUndefined } from '~/support';\r\nimport { getEnvironment } from '~/environment';\r\nimport type { DeepPartial } from '~/typings';\r\n\r\ntype FallbackStaticInitializtationElement<Args extends any[]> = Extract<\r\n StaticInitializationElement<Args>,\r\n (...args: Args) => any\r\n> extends (...args: infer P) => any\r\n ? (...args: P) => HTMLElement\r\n : never;\r\ntype FallbackDynamicInitializtationElement<Args extends any[]> = Extract<\r\n DynamicInitializationElement<Args>,\r\n (...args: Args) => any\r\n> extends (...args: infer P) => any\r\n ? (...args: P) => HTMLElement\r\n : never;\r\n\r\nexport type StaticInitialization = HTMLElement | false | null;\r\nexport type DynamicInitialization = HTMLElement | boolean | null;\r\n\r\n/**\r\n * Static elements are elements which MUST be present in the final DOM.\r\n * If an `HTMLElement` is passed the passed element will be taken as the repsective element.\r\n * With `false`, `null` or `undefined` an appropriate element is generated automatically.\r\n */\r\nexport type StaticInitializationElement<Args extends any[]> =\r\n /** A function which returns the the StaticInitialization value. */\r\n | ((...args: Args) => StaticInitialization)\r\n /** The StaticInitialization value. */\r\n | StaticInitialization;\r\n\r\n/**\r\n * Dynamic elements are elements which CAN be present in the final DOM.\r\n * If an `HTMLElement`is passed the passed element will be taken as the repsective element.\r\n * With `true` an appropriate element is generated automatically.\r\n * With `false`, `null` or `undefined` the element won't be in the DOM.\r\n */\r\nexport type DynamicInitializationElement<Args extends any[]> =\r\n /** A function which returns the the DynamicInitialization value. */\r\n | ((...args: Args) => DynamicInitialization)\r\n /** The DynamicInitialization value. */\r\n | DynamicInitialization;\r\n\r\n/**\r\n * Describes how a OverlayScrollbar instance should initialize.\r\n */\r\nexport type Initialization = {\r\n /**\r\n * Customizes which elements are generated and used.\r\n * If a function is passed to any of the fields, it receives the `target` element as its argument.\r\n * Any passed function should be a \"pure\" function. (same input produces same output)\r\n */\r\n elements: {\r\n /**\r\n * Assign a custom element as the host element.\r\n * Only relevant if the target element is a Textarea.\r\n */\r\n host: StaticInitializationElement<[target: InitializationTargetElement]>;\r\n /** Assign a custom element as the viewport element. */\r\n viewport: StaticInitializationElement<[target: InitializationTargetElement]>;\r\n /** Assign a custom element as the padding element or force the element not to be generated. */\r\n padding: DynamicInitializationElement<[target: InitializationTargetElement]>;\r\n /** Assign a custom element as the content element or force the element not to be generated. */\r\n content: DynamicInitializationElement<[target: InitializationTargetElement]>;\r\n };\r\n /**\r\n * Customizes elements related to the scrollbars.\r\n * If a function is passed, it receives the `target`, `host` and `viewport` element as arguments.\r\n */\r\n scrollbars: {\r\n slot: DynamicInitializationElement<\r\n [target: InitializationTargetElement, host: HTMLElement, viewport: HTMLElement]\r\n >;\r\n };\r\n /**\r\n * Customizes the cancelation behavior.\r\n */\r\n cancel: {\r\n /** Whether the initialization shall be canceled if the native scrollbars are overlaid. */\r\n nativeScrollbarsOverlaid: boolean;\r\n /**\r\n * Whether the initialization shall be canceled if its applied to a body element.\r\n * With `true` an initialization is always canceled, with `false` its never canceled.\r\n * With `null` the initialization will only be canceled when the initialization would affect the browsers functionality. (window.scrollTo, mobile browser behavior etc.)\r\n */\r\n body: boolean | null;\r\n };\r\n};\r\n\r\nexport type PartialInitialization = DeepPartial<Initialization>;\r\n\r\n/** The initialization target element. */\r\nexport type InitializationTargetElement = HTMLElement; // | HTMLTextAreaElement;\r\n\r\n/**\r\n * The initialization target object.\r\n * OverlayScrollbars({ target: myElement }) is equivalent to OverlayScrollbars(myElement).\r\n */\r\nexport type InitializationTargetObject = PartialInitialization & {\r\n target: InitializationTargetElement;\r\n};\r\n\r\n/** The initialization target. */\r\nexport type InitializationTarget = InitializationTargetElement | InitializationTargetObject;\r\n\r\nexport const resolveInitialization = <T extends StaticInitialization | DynamicInitialization>(\r\n args: any,\r\n value: any\r\n): T => (isFunction(value) ? value.apply(0, args) : value);\r\n\r\nexport const staticInitializationElement = <Args extends any[]>(\r\n args: Args,\r\n fallbackStaticInitializationElement: FallbackStaticInitializtationElement<Args>,\r\n defaultStaticInitializationElement: StaticInitializationElement<Args>,\r\n staticInitializationElementValue?: StaticInitializationElement<Args>\r\n): HTMLElement => {\r\n const staticInitialization = isUndefined(staticInitializationElementValue)\r\n ? defaultStaticInitializationElement\r\n : staticInitializationElementValue;\r\n const resolvedInitialization = resolveInitialization<StaticInitialization>(\r\n args,\r\n staticInitialization\r\n );\r\n return resolvedInitialization || fallbackStaticInitializationElement.apply(0, args);\r\n};\r\n\r\nexport const dynamicInitializationElement = <Args extends any[]>(\r\n args: Args,\r\n fallbackDynamicInitializationElement: FallbackDynamicInitializtationElement<Args>,\r\n defaultDynamicInitializationElement: DynamicInitializationElement<Args>,\r\n dynamicInitializationElementValue?: DynamicInitializationElement<Args>\r\n): HTMLElement | false => {\r\n const dynamicInitialization = isUndefined(dynamicInitializationElementValue)\r\n ? defaultDynamicInitializationElement\r\n : dynamicInitializationElementValue;\r\n const resolvedInitialization = resolveInitialization<DynamicInitialization>(\r\n args,\r\n dynamicInitialization\r\n );\r\n return (\r\n !!resolvedInitialization &&\r\n (isHTMLElement(resolvedInitialization)\r\n ? resolvedInitialization\r\n : fallbackDynamicInitializationElement.apply(0, args))\r\n );\r\n};\r\n\r\nexport const cancelInitialization = (\r\n isBody: boolean,\r\n cancelInitializationValue?: DeepPartial<Initialization['cancel']> | false | null | undefined\r\n): boolean => {\r\n const { nativeScrollbarsOverlaid, body } = cancelInitializationValue || {};\r\n const { _nativeScrollbarsOverlaid, _nativeScrollbarsHiding, _getDefaultInitialization } =\r\n getEnvironment();\r\n const { nativeScrollbarsOverlaid: defaultNativeScrollbarsOverlaid, body: defaultbody } =\r\n _getDefaultInitialization().cancel;\r\n\r\n const resolvedNativeScrollbarsOverlaid =\r\n nativeScrollbarsOverlaid ?? defaultNativeScrollbarsOverlaid;\r\n const resolvedDocumentScrollingElement = isUndefined(body) ? defaultbody : body;\r\n\r\n const finalNativeScrollbarsOverlaid =\r\n (_nativeScrollbarsOverlaid.x || _nativeScrollbarsOverlaid.y) &&\r\n resolvedNativeScrollbarsOverlaid;\r\n const finalDocumentScrollingElement =\r\n isBody &&\r\n (isNull(resolvedDocumentScrollingElement)\r\n ? !_nativeScrollbarsHiding\r\n : resolvedDocumentScrollingElement);\r\n\r\n return !!finalNativeScrollbarsOverlaid || !!finalDocumentScrollingElement;\r\n};\r\n","import type { OverlayScrollbars } from '~/overlayscrollbars';\n\nconst targetInstanceMap: WeakMap<Element, OverlayScrollbars> = new WeakMap();\n\n/**\n * Adds the given OverlayScrollbars instance to the given element.\n * @param target The element which is the target of the OverlayScrollbars instance.\n * @param osInstance The OverlayScrollbars instance.\n */\nexport const addInstance = (target: Element, osInstance: OverlayScrollbars): void => {\n targetInstanceMap.set(target, osInstance);\n};\n\n/**\n * Removes a OverlayScrollbars instance from the given element.\n * @param target The element from which its OverlayScrollbars instance shall be removed.\n */\nexport const removeInstance = (target: Element): void => {\n targetInstanceMap.delete(target);\n};\n\n/**\n * Gets the OverlayScrollbars from the given element or undefined if it doesn't have one.\n * @param target The element of which its OverlayScrollbars instance shall be get.\n */\nexport const getInstance = (target: Element): OverlayScrollbars | undefined =>\n targetInstanceMap.get(target);\n","import {\r\n each,\r\n noop,\r\n debounce,\r\n MutationObserverConstructor,\r\n addEventListener,\r\n is,\r\n find,\r\n push,\r\n runEachAndClear,\r\n bind,\r\n isEmptyArray,\r\n deduplicateArray,\r\n inArray,\r\n concat,\r\n getAttr,\r\n isString,\r\n} from '~/support';\r\n\r\ntype DOMContentObserverCallback = (contentChangedThroughEvent: boolean) => any;\r\n\r\ntype DOMTargetObserverCallback = (targetChangedAttrs: string[], targetStyleChanged: boolean) => any;\r\n\r\ninterface DOMObserverOptionsBase {\r\n _attributes?: string[];\r\n /**\r\n * A function which can ignore a changed attribute if it returns true.\r\n * for DOMTargetObserver this applies to the changes to the observed target\r\n * for DOMContentObserver this applies to changes to nested targets -> nested targets are elements which match the \"_nestedTargetSelector\" selector\r\n */\r\n _ignoreTargetChange?: DOMObserverIgnoreTargetChange;\r\n}\r\n\r\ninterface DOMContentObserverOptions extends DOMObserverOptionsBase {\r\n _eventContentChange?: DOMObserverEventContentChange; // [selector, eventname(s) | function returning eventname(s)] -> eventnames divided by whitespaces\r\n _nestedTargetSelector?: string;\r\n _ignoreContentChange?: DOMObserverIgnoreContentChange; // function which will prevent marking certain dom changes as content change if it returns true\r\n}\r\n\r\ninterface DOMTargetObserverOptions extends DOMObserverOptionsBase {\r\n /**\r\n * Marks certain attributes as style changing, should be a subset of the _attributes prop.\r\n * Used to set the \"targetStyleChanged\" param in the DOMTargetObserverCallback.\r\n */\r\n _styleChangingAttributes?: string[] | readonly string[];\r\n}\r\n\r\ntype ContentChangeArrayItem = [selector?: string, eventNames?: string] | null | undefined;\r\n\r\nexport type DOMObserverEventContentChange =\r\n | Array<ContentChangeArrayItem>\r\n | false\r\n | null\r\n | undefined;\r\n\r\nexport type DOMObserverIgnoreContentChange = (\r\n mutation: MutationRecord,\r\n isNestedTarget: boolean,\r\n domObserverTarget: HTMLElement,\r\n domObserverOptions?: DOMContentObserverOptions\r\n) => boolean;\r\n\r\nexport type DOMObserverIgnoreTargetChange = (\r\n target: Node,\r\n attributeName: string,\r\n oldAttributeValue: string | null,\r\n newAttributeValue: string | null\r\n) => boolean;\r\n\r\nexport type DOMObserverCallback<ContentObserver extends boolean> = ContentObserver extends true\r\n ? DOMContentObserverCallback\r\n : DOMTargetObserverCallback;\r\n\r\nexport type DOMObserverOptions<ContentObserver extends boolean> = ContentObserver extends true\r\n ? DOMContentObserverOptions\r\n : DOMTargetObserverOptions;\r\n\r\nexport type DOMObserver<ContentObserver extends boolean> = [\r\n construct: () => () => void,\r\n update: () => void | false | Parameters<DOMObserverCallback<ContentObserver>>\r\n];\r\n\r\ntype EventContentChangeUpdateElement = (\r\n getElements?: (selector: string) => Node[],\r\n removed?: boolean\r\n) => void;\r\ntype EventContentChange = [destroy: () => void, updateElements: EventContentChangeUpdateElement];\r\n\r\n/**\r\n * Creates a set of helper functions to observe events of elements inside the target element.\r\n * @param target The target element of which the children elements shall be observed. (not only direct children but also nested ones)\r\n * @param eventContentChange The event content change array. (array of tuples: selector and eventname(s))\r\n * @param callback Callback which is called if one of the elements emits the corresponding event.\r\n * @returns A object which contains a set of helper functions to destroy and update the observation of elements.\r\n */\r\nconst createEventContentChange = (\r\n target: HTMLElement,\r\n callback: (...args: any) => any,\r\n eventContentChange?: DOMObserverEventContentChange\r\n): EventContentChange => {\r\n let destroyed = false;\r\n const map = eventContentChange ? new WeakMap<Node, (() => any)[]>() : false; // weak map to prevent memory leak for detached elements\r\n const destroy = () => {\r\n destroyed = true;\r\n };\r\n const updateElements: EventContentChangeUpdateElement = (getElements) => {\r\n if (map && eventContentChange) {\r\n const eventElmList = eventContentChange.map((item) => {\r\n const [selector, eventNames] = item || [];\r\n const elements = eventNames && selector ? (getElements || find)(selector, target) : [];\r\n return [elements, eventNames] as const;\r\n });\r\n\r\n each(eventElmList, (item) =>\r\n each(item[0], (elm) => {\r\n const eventNames = item[1];\r\n const entries = map.get(elm) || [];\r\n const isTargetChild = target.contains(elm);\r\n\r\n if (isTargetChild && eventNames) {\r\n const removeListener = addEventListener(elm, eventNames, (event: Event) => {\r\n if (destroyed) {\r\n removeListener();\r\n map.delete(elm);\r\n } else {\r\n callback(event);\r\n }\r\n });\r\n map.set(elm, push(entries, removeListener));\r\n } else {\r\n runEachAndClear(entries);\r\n map.delete(elm);\r\n }\r\n })\r\n );\r\n }\r\n };\r\n\r\n updateElements();\r\n\r\n return [destroy, updateElements];\r\n};\r\n\r\n/**\r\n * Creates a DOM observer which observes DOM changes to either the target element or its children.\r\n * @param target The element which shall be observed.\r\n * @param isContentObserver Whether this observer is just observing the target or just the targets children. (not only direct children but also nested ones)\r\n * @param callback The callback which gets called if a change was detected.\r\n * @param options The options for DOM change detection.\r\n * @returns A object which represents the instance of the DOM observer.\r\n */\r\nexport const createDOMObserver = <ContentObserver extends boolean>(\r\n target: HTMLElement,\r\n isContentObserver: ContentObserver,\r\n callback: DOMObserverCallback<ContentObserver>,\r\n options?: DOMObserverOptions<ContentObserver>\r\n): DOMObserver<ContentObserver> => {\r\n let isConnected = false;\r\n const {\r\n _attributes,\r\n _styleChangingAttributes,\r\n _eventContentChange,\r\n _nestedTargetSelector,\r\n _ignoreTargetChange,\r\n _ignoreContentChange,\r\n } = (options as DOMContentObserverOptions & DOMTargetObserverOptions) || {};\r\n const debouncedEventContentChange = debounce(\r\n () => isConnected && (callback as DOMContentObserverCallback)(true),\r\n { _timeout: 33, _maxDelay: 99 }\r\n );\r\n const [destroyEventContentChange, updateEventContentChangeElements] = createEventContentChange(\r\n target,\r\n debouncedEventContentChange,\r\n _eventContentChange\r\n );\r\n\r\n // MutationObserver\r\n const finalAttributes = _attributes || [];\r\n const finalStyleChangingAttributes = _styleChangingAttributes || [];\r\n const observedAttributes = concat(finalAttributes, finalStyleChangingAttributes);\r\n const observerCallback = (\r\n fromRecords: boolean,\r\n mutations: MutationRecord[]\r\n ): void | Parameters<DOMObserverCallback<ContentObserver>> => {\r\n if (!isEmptyArray(mutations)) {\r\n const ignoreTargetChange = _ignoreTargetChange || noop;\r\n const ignoreContentChange = _ignoreContentChange || noop;\r\n const totalChangedNodes: Node[] = [];\r\n const targetChangedAttrs: string[] = [];\r\n let targetStyleChanged: boolean | '' | null | undefined = false;\r\n let contentChanged: boolean | '' | null | undefined = false;\r\n let childListChanged: boolean | '' | null | undefined = false;\r\n\r\n each(mutations, (mutation) => {\r\n const {\r\n attributeName,\r\n target: mutationTarget,\r\n type,\r\n oldValue,\r\n addedNodes,\r\n removedNodes,\r\n } = mutation;\r\n const isAttributesType = type === 'attributes';\r\n const isChildListType = type === 'childList';\r\n const targetIsMutationTarget = target === mutationTarget;\r\n const isAttrChange = isAttributesType && attributeName;\r\n const newValue =\r\n isAttrChange && getAttr(mutationTarget as HTMLElement, attributeName || '');\r\n // narrow down attributeValue type to `string` or `null` but don't overwrite `<empty string>` with `null`\r\n const attributeValue = isString(newValue) ? newValue : null;\r\n const attributeChanged = isAttrChange && oldValue !== attributeValue;\r\n const styleChangingAttrChanged =\r\n inArray(finalStyleChangingAttributes, attributeName) && attributeChanged;\r\n\r\n // if is content observer and something changed in children\r\n if (isContentObserver && (isChildListType || !targetIsMutationTarget)) {\r\n const contentAttrChanged = isAttributesType && attributeChanged;\r\n const isNestedTarget =\r\n contentAttrChanged &&\r\n _nestedTargetSelector &&\r\n is(mutationTarget, _nestedTargetSelector);\r\n const baseAssertion = isNestedTarget\r\n ? !ignoreTargetChange(mutationTarget, attributeName, oldValue, attributeValue)\r\n : !isAttributesType || contentAttrChanged;\r\n const contentFinalChanged =\r\n baseAssertion && !ignoreContentChange(mutation, !!isNestedTarget, target, options);\r\n\r\n each(addedNodes, (node) => push(totalChangedNodes, node));\r\n each(removedNodes, (node) => push(totalChangedNodes, node));\r\n\r\n contentChanged = contentChanged || contentFinalChanged;\r\n childListChanged = childListChanged || isChildListType;\r\n }\r\n // if is target observer and target attr changed\r\n if (\r\n !isContentObserver &&\r\n targetIsMutationTarget &&\r\n attributeChanged &&\r\n !ignoreTargetChange(mutationTarget, attributeName!, oldValue, attributeValue)\r\n ) {\r\n push(targetChangedAttrs, attributeName);\r\n targetStyleChanged = targetStyleChanged || styleChangingAttrChanged;\r\n }\r\n });\r\n\r\n // adds / removes the new elements from the event content change\r\n updateEventContentChangeElements((selector: string) =>\r\n deduplicateArray(totalChangedNodes).reduce<Node[]>((arr, node) => {\r\n push(arr, find(selector, node));\r\n return is(node, selector) ? push(arr, node) : arr;\r\n }, [])\r\n );\r\n\r\n if (isContentObserver) {\r\n !fromRecords && contentChanged && (callback as DOMContentObserverCallback)(false);\r\n return [false] satisfies Parameters<DOMObserverCallback<true>> as Parameters<\r\n DOMObserverCallback<ContentObserver>\r\n >;\r\n }\r\n\r\n if (!isEmptyArray(targetChangedAttrs) || targetStyleChanged) {\r\n const args = [\r\n deduplicateArray(targetChangedAttrs),\r\n targetStyleChanged,\r\n ] satisfies Parameters<DOMTargetObserverCallback> & Parameters<DOMObserverCallback<false>>;\r\n !fromRecords && (callback as DOMTargetObserverCallback).apply(0, args);\r\n\r\n return args as Parameters<DOMObserverCallback<ContentObserver>>;\r\n }\r\n }\r\n };\r\n const mutationObserver: MutationObserver = new MutationObserverConstructor!(\r\n bind(observerCallback, false)\r\n );\r\n\r\n return [\r\n () => {\r\n mutationObserver.observe(target, {\r\n attributes: true,\r\n attributeOldValue: true,\r\n attributeFilter: observedAttributes,\r\n subtree: isContentObserver,\r\n childList: isContentObserver,\r\n characterData: isContentObserver,\r\n });\r\n isConnected = true;\r\n\r\n return () => {\r\n if (isConnected) {\r\n destroyEventContentChange();\r\n mutationObserver.disconnect();\r\n isConnected = false;\r\n }\r\n };\r\n },\r\n () => {\r\n if (isConnected) {\r\n debouncedEventContentChange._flush();\r\n return observerCallback(true, mutationObserver.takeRecords());\r\n }\r\n },\r\n ];\r\n};\r\n","import { each, keys } from '~/support';\r\nimport type { OverlayScrollbars, OverlayScrollbarsStatic } from '~/overlayscrollbars';\r\nimport type { EventListener, EventListenerArgs, EventListeners } from '..';\r\n\r\nexport type PluginModuleInstance = Record<string | number | symbol, any>;\r\n\r\nexport type InstancePluginEvent = {\r\n /**\r\n * Adds event listeners to the instance.\r\n * @param eventListeners An object which contains the added listeners.\r\n * @returns Returns a function which removes the added listeners.\r\n */\r\n (eventListeners: EventListeners): () => void;\r\n /**\r\n * Adds a single event listener to the instance.\r\n * @param name The name of the event.\r\n * @param listener The listener which is invoked on that event.\r\n * @returns Returns a function which removes the added listeners.\r\n */\r\n <N extends keyof EventListenerArgs>(name: N, listener: EventListener<N>): () => void;\r\n /**\r\n * Adds multiple event listeners to the instance.\r\n * @param name The name of the event.\r\n * @param listener The listeners which are invoked on that event.\r\n * @returns Returns a function which removes the added listeners.\r\n */\r\n <N extends keyof EventListenerArgs>(name: N, listener: EventListener<N>[]): () => void;\r\n};\r\n\r\n/**\r\n * Describes a OverlayScrollbars plugin module.\r\n * Plugin modules must be side-effect free and deterministic. (same input produces same output)\r\n */\r\nexport type PluginModule<\r\n S extends PluginModuleInstance | void = PluginModuleInstance | void,\r\n I extends PluginModuleInstance | void = PluginModuleInstance | void\r\n> = (S extends PluginModuleInstance\r\n ? {\r\n /**\r\n * Creates a plugin which is bound to the static object.\r\n * The function will be called once with the static object as soon as the plugin is registered.\r\n * The plugin can add new methods or fields to the passed static object.\r\n * @param osStatic The static object the plugin is bound to.\r\n * @returns The plugins instance object or a falsy value if the plugin doesn't need any instance object.\r\n */\r\n static: (osStatic: OverlayScrollbarsStatic) => S | void;\r\n }\r\n : object) &\r\n (I extends PluginModuleInstance\r\n ? {\r\n /**\r\n * Creates a A plugin which is bound to an instance.\r\n * The function will be called each time a new instance is created.\r\n * The plugin can add new methods or fields to the passed instance object.\r\n * @param osInstance The instance object the plugin is bound to.\r\n * @param event A function which adds events to the instance which can't be removed from outside the plugin. (instance events added with the `on` function can be removed with the optional `pure` parameter)\r\n * @param osStatic The static object the plugin is bound to.\r\n * @returns The plugins instance object or a falsy value if the plugin doesn't need any instance object.\r\n */\r\n instance: (\r\n osInstance: OverlayScrollbars,\r\n event: InstancePluginEvent,\r\n osStatic: OverlayScrollbarsStatic\r\n ) => I | void;\r\n }\r\n : object);\r\n\r\n/**\r\n * Describes a OverlayScrollbar plugin.\r\n */\r\nexport type Plugin<\r\n Name extends string = string,\r\n S extends PluginModuleInstance | void = PluginModuleInstance | void,\r\n I extends PluginModuleInstance | void = PluginModuleInstance | void\r\n> = {\r\n /** The field is the plugins name. Plugin names must be globally unique, please choose wisely. */\r\n [pluginName in Name]: PluginModule<S, I>;\r\n};\r\n\r\n/**\r\n * Describes a OverlayScrollbar plugin which has only a static module.\r\n */\r\nexport type StaticPlugin<\r\n Name extends string = string,\r\n T extends PluginModuleInstance = PluginModuleInstance\r\n> = Plugin<Name, T, void>;\r\n\r\n/**\r\n * Describes a OverlayScrollbar plugin which has only a instance module.\r\n */\r\nexport type InstancePlugin<\r\n Name extends string = string,\r\n T extends PluginModuleInstance = PluginModuleInstance\r\n> = Plugin<Name, void, T>;\r\n\r\n/**\r\n * Infers the type of the static modules instance of the passed plugin.\r\n */\r\nexport type InferStaticPluginModuleInstance<T extends StaticPlugin> = T extends StaticPlugin<\r\n infer Name\r\n>\r\n ? T[Name]['static'] extends (...args: any[]) => any\r\n ? ReturnType<T[Name]['static']>\r\n : void\r\n : void;\r\n\r\n/**\r\n * Infers the type of the instance modules instance of the passed plugin.\r\n */\r\nexport type InferInstancePluginModuleInstance<T extends InstancePlugin> = T extends InstancePlugin<\r\n infer Name\r\n>\r\n ? T[Name]['instance'] extends (...args: any[]) => any\r\n ? ReturnType<T[Name]['instance']>\r\n : void\r\n : void;\r\n\r\n/** All registered plugin modules. */\r\nexport const pluginModules: Record<string, PluginModule> = {};\r\n\r\n/** All static plugin module instances. */\r\nexport const staticPluginModuleInstances: Record<string, PluginModuleInstance | void> = {};\r\n\r\n/**\r\n * Adds plugins.\r\n * @param addedPlugin The plugin(s) to add.\r\n * @returns The added plugin modules of the registered plugins.\r\n */\r\nexport const addPlugins = (addedPlugin: Plugin[]) => {\r\n each(addedPlugin, (plugin) =>\r\n each(plugin, (_, key) => {\r\n pluginModules[key] = plugin[key];\r\n })\r\n );\r\n};\r\n\r\nexport const registerPluginModuleInstances = (\r\n plugin: Plugin,\r\n staticObj: OverlayScrollbarsStatic,\r\n instanceInfo?: [\r\n instanceObj: OverlayScrollbars,\r\n event: InstancePluginEvent,\r\n instancePluginMap?: Record<string, PluginModuleInstance>\r\n ]\r\n): Array<PluginModuleInstance | void> =>\r\n keys(plugin).map((name) => {\r\n const { static: osStatic, instance: osInstance } = (\r\n plugin as Plugin<string, PluginModuleInstance, PluginModuleInstance>\r\n )[name];\r\n const [instanceObj, event, instancePluginMap] = instanceInfo || [];\r\n const ctor = instanceInfo ? osInstance : osStatic;\r\n if (ctor) {\r\n const instance = instanceInfo\r\n ? (\r\n ctor as Extract<\r\n typeof ctor,\r\n (\r\n osInstance: OverlayScrollbars,\r\n event: InstancePluginEvent,\r\n osStatic: OverlayScrollbarsStatic\r\n ) => PluginModuleInstance | void\r\n >\r\n )(instanceObj!, event!, staticObj)\r\n : (\r\n ctor as Extract<\r\n typeof ctor,\r\n (osStatic: OverlayScrollbarsStatic) => PluginModuleInstance | void\r\n >\r\n )(staticObj);\r\n return ((instancePluginMap || staticPluginModuleInstances)[name] = instance);\r\n }\r\n });\r\n\r\nexport const getStaticPluginModuleInstance = <T extends StaticPlugin>(\r\n pluginModuleName: T extends StaticPlugin<infer N> ? N : never\r\n): InferStaticPluginModuleInstance<T> | undefined =>\r\n staticPluginModuleInstances[pluginModuleName] as InferStaticPluginModuleInstance<T> | undefined;\r\n","import type {\r\n Options,\r\n PartialOptions,\r\n OverflowBehavior,\r\n ScrollbarsVisibilityBehavior,\r\n ScrollbarsAutoHideBehavior,\r\n} from '~/options';\r\nimport type { OptionsTemplate, OptionsTemplateValue } from './validation';\r\nimport type { StaticPlugin } from '~/plugins';\r\nimport { validateOptions, optionsTemplateTypes as oTypes } from './validation';\r\n\r\nexport const optionsValidationPluginModuleName = '__osOptionsValidationPlugin';\r\n\r\nexport const OptionsValidationPlugin = /* @__PURE__ */ (() => ({\r\n [optionsValidationPluginModuleName]: {\r\n static: () => {\r\n const numberAllowedValues: OptionsTemplateValue<number> = oTypes.number;\r\n const booleanAllowedValues: OptionsTemplateValue<boolean> = oTypes.boolean;\r\n const arrayNullValues: OptionsTemplateValue<Array<unknown> | null> = [\r\n oTypes.array,\r\n oTypes.null,\r\n ];\r\n const overflowAllowedValues: OptionsTemplateValue<OverflowBehavior> =\r\n 'hidden scroll visible visible-hidden';\r\n const scrollbarsVisibilityAllowedValues: OptionsTemplateValue<ScrollbarsVisibilityBehavior> =\r\n 'visible hidden auto';\r\n const scrollbarsAutoHideAllowedValues: OptionsTemplateValue<ScrollbarsAutoHideBehavior> =\r\n 'never scroll leavemove';\r\n\r\n const optionsTemplate: OptionsTemplate<Options> = {\r\n // resize: resizeAllowedValues, // none || both || horizontal || vertical || n || b ||\r\n paddingAbsolute: booleanAllowedValues, // true || false\r\n showNativeOverlaidScrollbars: booleanAllowedValues, // true || false\r\n update: {\r\n elementEvents: arrayNullValues, // array of tuples || null\r\n attributes: arrayNullValues,\r\n debounce: [oTypes.number, oTypes.array, oTypes.null], // number || number array || null\r\n ignoreMutation: [oTypes.function, oTypes.null], // function || null\r\n },\r\n overflow: {\r\n x: overflowAllowedValues, // visible-hidden || visible-scroll || hidden || scrol\r\n y: overflowAllowedValues, // visible-hidden || visible-scroll || hidden || scrol\r\n },\r\n scrollbars: {\r\n theme: [oTypes.string, oTypes.null], // string || null\r\n visibility: scrollbarsVisibilityAllowedValues, // visible || hidden || auto || v ||\r\n autoHide: scrollbarsAutoHideAllowedValues, // never || scroll || leave || move ||\r\n autoHideDelay: numberAllowedValues, // number\r\n autoHideSuspend: booleanAllowedValues, // true || false\r\n dragScroll: booleanAllowedValues, // true || false\r\n clickScroll: booleanAllowedValues, // true || false\r\n pointers: [oTypes.array, oTypes.null], // string array\r\n },\r\n /*\r\n textarea: {\r\n dynWidth: booleanAllowedValues, // true || false\r\n dynHeight: booleanAllowedValues, // true || false\r\n inheritedAttrs: stringArrayNullAllowedValues, // string || array || nul\r\n },\r\n */\r\n };\r\n return (options: PartialOptions, doWriteErrors?: boolean): PartialOptions => {\r\n const [validated, foreign] = validateOptions(optionsTemplate, options, doWriteErrors);\r\n return { ...foreign, ...validated };\r\n };\r\n },\r\n },\r\n}))() satisfies StaticPlugin<typeof optionsValidationPluginModuleName>;\r\n","import {\r\n createDOM,\r\n appendChildren,\r\n getOffsetSize,\r\n addEventListener,\r\n addClass,\r\n equalWH,\r\n cAF,\r\n rAF,\r\n stopPropagation,\r\n bind,\r\n scrollElementTo,\r\n strWidth,\r\n strHeight,\r\n setStyles,\r\n} from '~/support';\r\nimport {\r\n classNameSizeObserverListenerScroll,\r\n classNameSizeObserverListenerItem,\r\n classNameSizeObserverListenerItemFinal,\r\n} from '~/classnames';\r\nimport type { StaticPlugin } from '../plugins';\r\n\r\nexport const sizeObserverPluginName = '__osSizeObserverPlugin';\r\n\r\nexport const SizeObserverPlugin = /* @__PURE__ */ (() => ({\r\n [sizeObserverPluginName]: {\r\n static:\r\n () =>\r\n (\r\n listenerElement: HTMLElement,\r\n onSizeChangedCallback: (appear: boolean) => any,\r\n observeAppearChange: boolean | null | undefined\r\n ): [appearCallback: () => void, offFns: (() => any)[]] => {\r\n const scrollAmount = 3333333;\r\n const scrollEventName = 'scroll';\r\n const observerElementChildren = createDOM(\r\n `<div class=\"${classNameSizeObserverListenerItem}\" dir=\"ltr\"><div class=\"${classNameSizeObserverListenerItem}\"><div class=\"${classNameSizeObserverListenerItemFinal}\"></div></div><div class=\"${classNameSizeObserverListenerItem}\"><div class=\"${classNameSizeObserverListenerItemFinal}\" style=\"width: 200%; height: 200%\"></div></div></div>`\r\n );\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 = getOffsetSize(observerElementChildrenRoot);\r\n let currSize = cacheSize;\r\n let isDirty = false;\r\n let rAFId: number;\r\n\r\n const reset = () => {\r\n scrollElementTo(expandElement, scrollAmount);\r\n scrollElementTo(shrinkElement, scrollAmount);\r\n };\r\n const onResized = (appear?: unknown) => {\r\n rAFId = 0;\r\n if (isDirty) {\r\n cacheSize = currSize;\r\n onSizeChangedCallback(appear === true);\r\n }\r\n };\r\n const onScroll = (scrollEvent?: Event | false) => {\r\n currSize = getOffsetSize(observerElementChildrenRoot);\r\n isDirty = !scrollEvent || !equalWH(currSize, cacheSize);\r\n\r\n if (scrollEvent) {\r\n stopPropagation(scrollEvent);\r\n\r\n if (isDirty && !rAFId) {\r\n cAF!(rAFId);\r\n rAFId = rAF!(onResized);\r\n }\r\n } else {\r\n onResized(scrollEvent === false);\r\n }\r\n\r\n reset();\r\n };\r\n const destroyFns = [\r\n appendChildren(listenerElement, observerElementChildren),\r\n addEventListener(expandElement, scrollEventName, onScroll),\r\n addEventListener(shrinkElement, scrollEventName, onScroll),\r\n ];\r\n\r\n addClass(listenerElement, classNameSizeObserverListenerScroll);\r\n\r\n // lets assume that the divs will never be that large and a constant value is enough\r\n setStyles(expandElementChild, {\r\n [strWidth]: scrollAmount,\r\n [strHeight]: scrollAmount,\r\n });\r\n\r\n rAF!(reset);\r\n\r\n return [observeAppearChange ? bind(onScroll, false) : reset, destroyFns];\r\n },\r\n },\r\n}))() satisfies StaticPlugin<typeof sizeObserverPluginName>;\r\n","import { strHidden, strScroll, strVisible } from '~/support';\r\nimport type { Env } from '~/environment';\r\nimport type { XY } from '~/support';\r\nimport type { Options, OptionsCheckFn, OverflowBehavior } from '~/options';\r\nimport type { OverflowStyle } from '~/typings';\r\n\r\nexport interface ViewportOverflowState {\r\n _overflowScroll: XY<boolean>;\r\n _overflowStyle: XY<OverflowStyle>;\r\n}\r\n\r\nexport const getShowNativeOverlaidScrollbars = (checkOption: OptionsCheckFn<Options>, env: Env) => {\r\n const { _nativeScrollbarsOverlaid } = env;\r\n const [showNativeOverlaidScrollbarsOption, showNativeOverlaidScrollbarsChanged] = checkOption(\r\n 'showNativeOverlaidScrollbars'\r\n );\r\n\r\n return [\r\n showNativeOverlaidScrollbarsOption &&\r\n _nativeScrollbarsOverlaid.x &&\r\n _nativeScrollbarsOverlaid.y,\r\n showNativeOverlaidScrollbarsChanged,\r\n ] as const;\r\n};\r\n\r\nexport const overflowIsVisible = (overflowBehavior: string) =>\r\n overflowBehavior.indexOf(strVisible) === 0;\r\n\r\n/**\r\n * Creates a viewport overflow state object.\r\n * @param hasOverflow The information whether an axis has overflow.\r\n * @param overflowBehavior The overflow behavior according to the options.\r\n * @returns A object which represents the newly set overflow state.\r\n */\r\nexport const createViewportOverflowState = (\r\n hasOverflow: Partial<XY<boolean>>,\r\n overflowBehavior: XY<OverflowBehavior>\r\n): ViewportOverflowState => {\r\n const getAxisOverflowStyle = (\r\n axisBehavior: OverflowBehavior,\r\n axisHasOverflow: boolean | undefined,\r\n perpendicularBehavior: OverflowBehavior,\r\n perpendicularOverflow: boolean | undefined\r\n ): OverflowStyle => {\r\n // convert behavior to style:\r\n // 'visible' -> 'hidden'\r\n // 'hidden' -> 'hidden'\r\n // 'scroll' -> 'scroll'\r\n // 'visible-hidden' -> 'hidden'\r\n // 'visible-scroll' -> 'scroll'\r\n const behaviorStyle =\r\n axisBehavior === strVisible\r\n ? strHidden\r\n : (axisBehavior.replace(`${strVisible}-`, '') as OverflowStyle);\r\n const axisOverflowVisible = overflowIsVisible(axisBehavior);\r\n const perpendicularOverflowVisible = overflowIsVisible(perpendicularBehavior);\r\n\r\n // if no axis has overflow set 'hidden'\r\n if (!axisHasOverflow && !perpendicularOverflow) {\r\n return strHidden;\r\n }\r\n\r\n // if both axis have a visible behavior ('visible', 'visible-hidden', 'visible-scroll') set 'visible'\r\n if (axisOverflowVisible && perpendicularOverflowVisible) {\r\n return strVisible;\r\n }\r\n\r\n // this this axis has a visible behavior\r\n if (axisOverflowVisible) {\r\n const nonPerpendicularOverflow = axisHasOverflow ? strVisible : strHidden;\r\n return axisHasOverflow && perpendicularOverflow\r\n ? behaviorStyle // if both axis have an overflow set ('hidden' or 'scroll')\r\n : nonPerpendicularOverflow; // if only this axis has an overflow set 'visible', if no axis has an overflow set 'hidden'\r\n }\r\n\r\n const nonOverflow =\r\n perpendicularOverflowVisible && perpendicularOverflow ? strVisible : strHidden;\r\n return axisHasOverflow\r\n ? behaviorStyle // if this axis has an overflow\r\n : nonOverflow; // if the perp. axis has a visible behavior and has an overflow set 'visible', otherwise set 'hidden'\r\n };\r\n\r\n const _overflowStyle = {\r\n x: getAxisOverflowStyle(overflowBehavior.x, hasOverflow.x, overflowBehavior.y, hasOverflow.y),\r\n y: getAxisOverflowStyle(overflowBehavior.y, hasOverflow.y, overflowBehavior.x, hasOverflow.x),\r\n };\r\n\r\n return {\r\n _overflowStyle,\r\n _overflowScroll: {\r\n x: _overflowStyle.x === strScroll,\r\n y: _overflowStyle.y === strScroll,\r\n },\r\n };\r\n};\r\n","import {\r\n keys,\r\n noop,\r\n each,\r\n assignDeep,\r\n strMarginBottom,\r\n strMarginLeft,\r\n strMarginRight,\r\n strPaddingBottom,\r\n strPaddingLeft,\r\n strPaddingRight,\r\n strPaddingTop,\r\n getStyles,\r\n setStyles,\r\n removeAttrClass,\r\n strWidth,\r\n strOverflowY,\r\n strOverflowX,\r\n strScroll,\r\n} from '~/support';\r\nimport { dataValueViewportArrange, dataAttributeViewport } from '~/classnames';\r\nimport { getShowNativeOverlaidScrollbars } from '~/setups/structureSetup/structureSetup.utils';\r\nimport type { ObserversSetupState } from '~/setups';\r\nimport type { Options, OptionsCheckFn } from '~/options';\r\nimport type { StructureSetupElementsObj } from '~/setups/structureSetup/structureSetup.elements';\r\nimport type { ViewportOverflowState } from '~/setups/structureSetup/structureSetup.utils';\r\nimport type { Env } from '~/environment';\r\nimport type { WH } from '~/support';\r\nimport type { OverflowStyle, StyleObject, StyleObjectKey } from '~/typings';\r\nimport type { StructureSetupState } from '~/setups/structureSetup';\r\nimport type { StaticPlugin } from '~/plugins';\r\n\r\nexport const scrollbarsHidingPluginName = '__osScrollbarsHidingPlugin';\r\n\r\nexport const ScrollbarsHidingPlugin = /* @__PURE__ */ (() => ({\r\n [scrollbarsHidingPluginName]: {\r\n static: () => ({\r\n _viewportArrangement: (\r\n structureSetupElements: StructureSetupElementsObj,\r\n structureSetupState: StructureSetupState,\r\n observersSetupState: ObserversSetupState,\r\n env: Env,\r\n checkOptions: OptionsCheckFn<Options>\r\n ) => {\r\n const { _viewportIsTarget, _viewport } = structureSetupElements;\r\n const { _nativeScrollbarsHiding, _nativeScrollbarsOverlaid, _nativeScrollbarsSize } = env;\r\n const doViewportArrange =\r\n !_viewportIsTarget &&\r\n !_nativeScrollbarsHiding &&\r\n (_nativeScrollbarsOverlaid.x || _nativeScrollbarsOverlaid.y);\r\n const [showNativeOverlaidScrollbars] = getShowNativeOverlaidScrollbars(checkOptions, env);\r\n\r\n /**\r\n * Gets the current overflow state of the viewport.\r\n */\r\n const readViewportOverflowState = (): ViewportOverflowState => {\r\n const getStatePerAxis = (styleKey: StyleObjectKey) => {\r\n const overflowStyle = getStyles(_viewport, styleKey) as OverflowStyle;\r\n const overflowScroll = overflowStyle === strScroll;\r\n\r\n return [overflowStyle, overflowScroll] as const;\r\n };\r\n\r\n const [xOverflowStyle, xOverflowScroll] = getStatePerAxis(strOverflowX);\r\n const [yOverflowStyle, yOverflowScroll] = getStatePerAxis(strOverflowY);\r\n\r\n return {\r\n _overflowStyle: {\r\n x: xOverflowStyle,\r\n y: yOverflowStyle,\r\n },\r\n _overflowScroll: {\r\n x: xOverflowScroll,\r\n y: yOverflowScroll,\r\n },\r\n };\r\n };\r\n\r\n /**\r\n * Gets the hide offset matching the passed overflow state.\r\n * @param viewportOverflowState The overflow state of the viewport\r\n */\r\n const _getViewportOverflowHideOffset = (viewportOverflowState: ViewportOverflowState) => {\r\n const { _overflowScroll } = viewportOverflowState;\r\n const arrangeHideOffset =\r\n _nativeScrollbarsHiding || showNativeOverlaidScrollbars ? 0 : 42;\r\n\r\n const getHideOffsetPerAxis = (\r\n isOverlaid: boolean,\r\n overflowScroll: boolean,\r\n nativeScrollbarSize: number\r\n ) => {\r\n const nonScrollbarStylingHideOffset = isOverlaid\r\n ? arrangeHideOffset\r\n : nativeScrollbarSize;\r\n const scrollbarsHideOffset =\r\n overflowScroll && !_nativeScrollbarsHiding ? nonScrollbarStylingHideOffset : 0;\r\n const scrollbarsHideOffsetArrange = isOverlaid && !!arrangeHideOffset;\r\n\r\n return [scrollbarsHideOffset, scrollbarsHideOffsetArrange] as const;\r\n };\r\n\r\n const [xScrollbarsHideOffset, xScrollbarsHideOffsetArrange] = getHideOffsetPerAxis(\r\n _nativeScrollbarsOverlaid.x,\r\n _overflowScroll.x,\r\n _nativeScrollbarsSize.x\r\n );\r\n const [yScrollbarsHideOffset, yScrollbarsHideOffsetArrange] = getHideOffsetPerAxis(\r\n _nativeScrollbarsOverlaid.y,\r\n _overflowScroll.y,\r\n _nativeScrollbarsSize.y\r\n );\r\n\r\n return {\r\n _scrollbarsHideOffset: {\r\n x: xScrollbarsHideOffset,\r\n y: yScrollbarsHideOffset,\r\n },\r\n _scrollbarsHideOffsetArrange: {\r\n x: xScrollbarsHideOffsetArrange,\r\n y: yScrollbarsHideOffsetArrange,\r\n },\r\n };\r\n };\r\n\r\n /**\r\n * Hides the native scrollbars according to the passed parameters.\r\n * @param viewportOverflowState The viewport overflow state.\r\n * @param directionIsRTL Whether the direction is RTL or not.\r\n * @param viewportArrange Whether special styles related to the viewport arrange strategy shall be applied.\r\n * @param viewportStyleObj The viewport style object to which the needed styles shall be applied.\r\n */\r\n const _hideNativeScrollbars = (\r\n viewportOverflowState: ViewportOverflowState,\r\n { _directionIsRTL }: ObserversSetupState,\r\n viewportArrange: boolean\r\n ): StyleObject | undefined => {\r\n if (!_viewportIsTarget) {\r\n const viewportStyleObj: StyleObject = assignDeep(\r\n {},\r\n {\r\n [strMarginRight]: 0,\r\n [strMarginBottom]: 0,\r\n [strMarginLeft]: 0,\r\n }\r\n );\r\n const { _scrollbarsHideOffset, _scrollbarsHideOffsetArrange } =\r\n _getViewportOverflowHideOffset(viewportOverflowState);\r\n const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;\r\n const { x: hideOffsetX, y: hideOffsetY } = _scrollbarsHideOffset;\r\n const { _viewportPaddingStyle } = structureSetupState;\r\n const horizontalMarginKey: keyof StyleObject = _directionIsRTL\r\n ? strMarginLeft\r\n : strMarginRight;\r\n const viewportHorizontalPaddingKey: keyof StyleObject = _directionIsRTL\r\n ? strPaddingLeft\r\n : strPaddingRight;\r\n const horizontalMarginValue = _viewportPaddingStyle[horizontalMarginKey] as number;\r\n const verticalMarginValue = _viewportPaddingStyle[strMarginBottom] as number;\r\n const horizontalPaddingValue = _viewportPaddingStyle[\r\n viewportHorizontalPaddingKey\r\n ] as number;\r\n const verticalPaddingValue = _viewportPaddingStyle[strPaddingBottom] as number;\r\n\r\n // horizontal\r\n viewportStyleObj[strWidth] = `calc(100% + ${\r\n hideOffsetY + horizontalMarginValue * -1\r\n }px)`;\r\n viewportStyleObj[horizontalMarginKey] = -hideOffsetY + horizontalMarginValue;\r\n\r\n // vertical\r\n viewportStyleObj[strMarginBottom] = -hideOffsetX + verticalMarginValue;\r\n\r\n // viewport arrange additional styles\r\n if (viewportArrange) {\r\n viewportStyleObj[viewportHorizontalPaddingKey] =\r\n horizontalPaddingValue + (arrangeY ? hideOffsetY : 0);\r\n viewportStyleObj[strPaddingBottom] =\r\n verticalPaddingValue + (arrangeX ? hideOffsetX : 0);\r\n }\r\n\r\n return viewportStyleObj;\r\n }\r\n };\r\n\r\n /**\r\n * Sets the styles of the viewport arrange element.\r\n * @param viewportOverflowState The viewport overflow state according to which the scrollbars shall be hidden.\r\n * @param viewportScrollSize The content scroll size.\r\n * @param directionIsRTL Whether the direction is RTL or not.\r\n * @returns A boolean which indicates whether the viewport arrange element was adjusted.\r\n */\r\n const _arrangeViewport = (\r\n viewportOverflowState: ViewportOverflowState,\r\n viewportScrollSize: WH<number>,\r\n sizeFraction: WH<number>\r\n ) => {\r\n if (doViewportArrange) {\r\n const { _viewportPaddingStyle } = structureSetupState;\r\n const { _scrollbarsHideOffset, _scrollbarsHideOffsetArrange } =\r\n _getViewportOverflowHideOffset(viewportOverflowState);\r\n const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;\r\n const { x: hideOffsetX, y: hideOffsetY } = _scrollbarsHideOffset;\r\n const { _directionIsRTL } = observersSetupState;\r\n const viewportArrangeHorizontalPaddingKey: keyof StyleObject = _directionIsRTL\r\n ? strPaddingRight\r\n : strPaddingLeft;\r\n const viewportArrangeHorizontalPaddingValue = _viewportPaddingStyle[\r\n viewportArrangeHorizontalPaddingKey\r\n ] as number;\r\n const viewportArrangeVerticalPaddingValue = _viewportPaddingStyle.paddingTop as number;\r\n const fractionalContentWidth = viewportScrollSize.w + sizeFraction.w;\r\n const fractionalContenHeight = viewportScrollSize.h + sizeFraction.h;\r\n const arrangeSize = {\r\n w:\r\n hideOffsetY && arrangeY\r\n ? `${\r\n hideOffsetY + fractionalContentWidth - viewportArrangeHorizontalPaddingValue\r\n }px`\r\n : '',\r\n h:\r\n hideOffsetX && arrangeX\r\n ? `${\r\n hideOffsetX + fractionalContenHeight - viewportArrangeVerticalPaddingValue\r\n }px`\r\n : '',\r\n };\r\n\r\n setStyles(_viewport, {\r\n '--os-vaw': arrangeSize.w,\r\n '--os-vah': arrangeSize.h,\r\n });\r\n }\r\n\r\n return doViewportArrange;\r\n };\r\n\r\n /**\r\n * Removes all styles applied because of the viewport arrange strategy.\r\n * @param showNativeOverlaidScrollbars Whether native overlaid scrollbars are shown instead of hidden.\r\n * @param directionIsRTL Whether the direction is RTL or not.\r\n * @param viewportOverflowState The currentviewport overflow state or undefined if it has to be determined.\r\n * @returns A object with a function which applies all the removed styles and the determined viewport vverflow state.\r\n */\r\n const _undoViewportArrange = (viewportOverflowState?: ViewportOverflowState) => {\r\n if (doViewportArrange) {\r\n const finalViewportOverflowState = viewportOverflowState || readViewportOverflowState();\r\n const { _viewportPaddingStyle: viewportPaddingStyle } = structureSetupState;\r\n const { _scrollbarsHideOffsetArrange } = _getViewportOverflowHideOffset(\r\n finalViewportOverflowState\r\n );\r\n const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;\r\n const finalPaddingStyle: StyleObject = {};\r\n const assignProps = (props: string[]) =>\r\n each(props, (prop) => {\r\n finalPaddingStyle[prop as StyleObjectKey] =\r\n viewportPaddingStyle[prop as StyleObjectKey];\r\n });\r\n\r\n if (arrangeX) {\r\n assignProps([strMarginBottom, strPaddingTop, strPaddingBottom]);\r\n }\r\n\r\n if (arrangeY) {\r\n assignProps([strMarginLeft, strMarginRight, strPaddingLeft, strPaddingRight]);\r\n }\r\n\r\n const prevStyle = getStyles(_viewport, keys(finalPaddingStyle) as StyleObjectKey[]);\r\n const addArrange = removeAttrClass(\r\n _viewport,\r\n dataAttributeViewport,\r\n dataValueViewportArrange\r\n );\r\n\r\n setStyles(_viewport, finalPaddingStyle);\r\n\r\n return [\r\n () => {\r\n setStyles(\r\n _viewport,\r\n assignDeep(\r\n {},\r\n prevStyle,\r\n _hideNativeScrollbars(\r\n finalViewportOverflowState,\r\n observersSetupState,\r\n doViewportArrange\r\n )\r\n )\r\n );\r\n addArrange();\r\n },\r\n finalViewportOverflowState,\r\n ] as const;\r\n }\r\n return [noop] as const;\r\n };\r\n\r\n return {\r\n _getViewportOverflowHideOffset,\r\n _arrangeViewport,\r\n _undoViewportArrange,\r\n _hideNativeScrollbars,\r\n };\r\n },\r\n }),\r\n },\r\n}))() satisfies StaticPlugin<typeof scrollbarsHidingPluginName>;\r\n","import { animateNumber, noop, selfClearTimeout } from '~/support';\r\nimport type { EasingFn } from '~/support';\r\nimport type { StaticPlugin } from '~/plugins';\r\n\r\nexport const clickScrollPluginModuleName = '__osClickScrollPlugin';\r\n\r\nexport const ClickScrollPlugin = /* @__PURE__ */ (() => ({\r\n [clickScrollPluginModuleName]: {\r\n static:\r\n () =>\r\n (\r\n moveHandleRelative: (deltaMovement: number) => void,\r\n getHandleOffset: (handleRect?: DOMRect, trackRect?: DOMRect) => number,\r\n startOffset: number,\r\n handleLength: number,\r\n relativeTrackPointerOffset: number\r\n ) => {\r\n // click scroll animation has 2 parts:\r\n // 1. the \"click\" which scrolls 100% of the viewport in a certain amount of time\r\n // 2. the \"press\" which scrolls to the point where the cursor is located, the \"press\" always waits for the \"click\" to finish\r\n // The \"click\" should not be canceled by a \"pointerup\" event because very fast clicks or taps would cancel it too fast\r\n // The \"click\" should only be canceled by a subsequent \"pointerdown\" event because otherwise 2 animations would run\r\n // The \"press\" should be canceld by the next \"pointerup\" event\r\n let stop = false;\r\n let stopClickAnimation = noop;\r\n let stopPressAnimation = noop;\r\n const [setFirstIterationPauseTimeout, clearFirstIterationPauseTimeout] =\r\n selfClearTimeout(133);\r\n const animateClickScroll = (\r\n clickScrollProgress: number,\r\n iteration: number,\r\n easing?: EasingFn | false\r\n ) =>\r\n animateNumber(\r\n clickScrollProgress,\r\n clickScrollProgress + handleLength * Math.sign(startOffset),\r\n iteration ? 133 : 222,\r\n (animationProgress, _, animationCompleted) => {\r\n moveHandleRelative(animationProgress);\r\n const handleStartBound = getHandleOffset();\r\n const handleEndBound = handleStartBound + handleLength;\r\n const mouseBetweenHandleBounds =\r\n relativeTrackPointerOffset >= handleStartBound &&\r\n relativeTrackPointerOffset <= handleEndBound;\r\n const animationCompletedAction = () => {\r\n stopPressAnimation = animateClickScroll(animationProgress, iteration + 1);\r\n };\r\n\r\n if (!stop && animationCompleted && !mouseBetweenHandleBounds) {\r\n if (iteration) {\r\n animationCompletedAction();\r\n } else {\r\n setFirstIterationPauseTimeout(animationCompletedAction);\r\n }\r\n }\r\n },\r\n easing\r\n );\r\n\r\n // easeOutQuad\r\n stopClickAnimation = animateClickScroll(0, 0, (x) => 1 - (1 - x) * (1 - x));\r\n\r\n return (stopClick?: boolean) => {\r\n stop = true;\r\n clearFirstIterationPauseTimeout();\r\n if (stopClick) {\r\n stopClickAnimation();\r\n stopPressAnimation();\r\n } else {\r\n stopPressAnimation();\r\n }\r\n };\r\n },\r\n },\r\n}))() satisfies StaticPlugin<typeof clickScrollPluginModuleName>;\r\n","import {\r\n createCache,\r\n createDOM,\r\n runEachAndClear,\r\n addEventListener,\r\n addClass,\r\n push,\r\n ResizeObserverConstructor,\r\n appendChildren,\r\n domRectHasDimensions,\r\n bind,\r\n noop,\r\n domRectAppeared,\r\n concat,\r\n} from '~/support';\r\nimport {\r\n classNameSizeObserver,\r\n classNameSizeObserverAppear,\r\n classNameSizeObserverListener,\r\n} from '~/classnames';\r\nimport { getStaticPluginModuleInstance, sizeObserverPluginName } from '~/plugins';\r\nimport type { SizeObserverPlugin } from '~/plugins';\r\n\r\nexport interface SizeObserverOptions {\r\n /** Whether appearing should be observed. */\r\n _appear?: boolean;\r\n}\r\n\r\nexport interface SizeObserverCallbackParams {\r\n _sizeChanged: boolean;\r\n _appear?: boolean;\r\n}\r\n\r\nexport type SizeObserver = () => () => void;\r\n\r\n/**\r\n * Creates a size observer which observes any size, padding, border, margin and box-sizing changes of the target element. Depending on the options also direction and appear can be observed.\r\n * @param target The target element which shall be observed.\r\n * @param onSizeChangedCallback The callback which gets called after a size change was detected.\r\n * @param options The options for size detection, whether to observe also direction and appear.\r\n * @returns A object which represents the instance of the size observer.\r\n */\r\nexport const createSizeObserver = (\r\n target: HTMLElement,\r\n onSizeChangedCallback: (params: SizeObserverCallbackParams) => any,\r\n options?: SizeObserverOptions\r\n): SizeObserver => {\r\n const { _appear: observeAppearChange } = options || {};\r\n const sizeObserverPlugin =\r\n getStaticPluginModuleInstance<typeof SizeObserverPlugin>(sizeObserverPluginName);\r\n const [updateResizeObserverContentRectCache] = createCache<DOMRectReadOnly | false>({\r\n _initialValue: false,\r\n _alwaysUpdateValues: true,\r\n });\r\n\r\n return () => {\r\n const destroyFns: (() => void)[] = [];\r\n const baseElements = createDOM(\r\n `<div class=\"${classNameSizeObserver}\"><div class=\"${classNameSizeObserverListener}\"></div></div>`\r\n );\r\n const sizeObserver = baseElements[0] as HTMLElement;\r\n const listenerElement = sizeObserver.firstChild as HTMLElement;\r\n const onSizeChangedCallbackProxy = (sizeChangedContext?: ResizeObserverEntry | boolean) => {\r\n const isResizeObserverCall = sizeChangedContext instanceof ResizeObserverEntry;\r\n\r\n let skip = false;\r\n let appear = false;\r\n\r\n // if triggered from RO.\r\n if (isResizeObserverCall) {\r\n const [currRContentRect, , prevContentRect] = updateResizeObserverContentRectCache(\r\n sizeChangedContext.contentRect\r\n );\r\n const hasDimensions = domRectHasDimensions(currRContentRect);\r\n appear = domRectAppeared(currRContentRect, prevContentRect);\r\n skip = !appear && !hasDimensions; // skip if display is none or when window resize\r\n }\r\n // else if it triggered with appear from polyfill\r\n else {\r\n appear = sizeChangedContext === true;\r\n }\r\n\r\n if (!skip) {\r\n onSizeChangedCallback({\r\n _sizeChanged: true,\r\n _appear: appear,\r\n });\r\n }\r\n };\r\n\r\n if (ResizeObserverConstructor) {\r\n const resizeObserverInstance = new ResizeObserverConstructor((entries) =>\r\n onSizeChangedCallbackProxy(entries.pop())\r\n );\r\n resizeObserverInstance.observe(listenerElement);\r\n push(destroyFns, () => {\r\n resizeObserverInstance.disconnect();\r\n });\r\n } else if (sizeObserverPlugin) {\r\n const [pluginAppearCallback, pluginDestroyFns] = sizeObserverPlugin(\r\n listenerElement,\r\n onSizeChangedCallbackProxy,\r\n observeAppearChange\r\n );\r\n push(\r\n destroyFns,\r\n concat(\r\n [\r\n addClass(sizeObserver, classNameSizeObserverAppear),\r\n addEventListener(sizeObserver, 'animationstart', pluginAppearCallback),\r\n ],\r\n pluginDestroyFns\r\n )\r\n );\r\n } else {\r\n return noop;\r\n }\r\n\r\n return bind(runEachAndClear, push(destroyFns, appendChildren(target, sizeObserver)));\r\n };\r\n};\r\n","import {\r\n createDiv,\r\n getOffsetSize,\r\n runEachAndClear,\r\n createCache,\r\n push,\r\n IntersectionObserverConstructor,\r\n appendChildren,\r\n bind,\r\n} from '~/support';\r\nimport { createSizeObserver } from '~/observers/sizeObserver';\r\nimport { classNameTrinsicObserver } from '~/classnames';\r\nimport type { WH, CacheValues } from '~/support';\r\n\r\nexport type TrinsicObserverCallback = (heightIntrinsic: CacheValues<boolean>) => any;\r\nexport type TrinsicObserver = [\r\n construct: () => () => void,\r\n update: () => void | false | null | undefined | Parameters<TrinsicObserverCallback>\r\n];\r\n\r\n/**\r\n * Creates a trinsic observer which observes changes to intrinsic or extrinsic sizing for the height of the target element.\r\n * @param target The element which shall be observed.\r\n * @param onTrinsicChangedCallback The callback which gets called after a change was detected.\r\n * @returns A object which represents the instance of the trinsic observer.\r\n */\r\nexport const createTrinsicObserver = (\r\n target: HTMLElement,\r\n onTrinsicChangedCallback: TrinsicObserverCallback\r\n): TrinsicObserver => {\r\n let intersectionObserverInstance: undefined | IntersectionObserver;\r\n const isHeightIntrinsic = (ioEntryOrSize: IntersectionObserverEntry | WH<number>): boolean =>\r\n (ioEntryOrSize as WH<number>).h === 0 ||\r\n (ioEntryOrSize as IntersectionObserverEntry).isIntersecting ||\r\n (ioEntryOrSize as IntersectionObserverEntry).intersectionRatio > 0;\r\n const trinsicObserver = createDiv(classNameTrinsicObserver);\r\n const [updateHeightIntrinsicCache] = createCache({\r\n _initialValue: false,\r\n });\r\n const triggerOnTrinsicChangedCallback = (\r\n updateValue: IntersectionObserverEntry | WH<number> | undefined,\r\n fromRecords?: boolean\r\n ): void | Parameters<TrinsicObserverCallback> => {\r\n if (updateValue) {\r\n const heightIntrinsic = updateHeightIntrinsicCache(isHeightIntrinsic(updateValue));\r\n const [, heightIntrinsicChanged] = heightIntrinsic;\r\n return (\r\n heightIntrinsicChanged &&\r\n !fromRecords &&\r\n onTrinsicChangedCallback(heightIntrinsic) && [heightIntrinsic]\r\n );\r\n }\r\n };\r\n const intersectionObserverCallback = (\r\n fromRecords: boolean,\r\n entries: IntersectionObserverEntry[]\r\n ) => triggerOnTrinsicChangedCallback(entries.pop(), fromRecords);\r\n\r\n return [\r\n () => {\r\n const destroyFns: (() => void)[] = [];\r\n\r\n if (IntersectionObserverConstructor) {\r\n intersectionObserverInstance = new IntersectionObserverConstructor(\r\n bind(intersectionObserverCallback, false),\r\n { root: target }\r\n );\r\n intersectionObserverInstance.observe(trinsicObserver);\r\n push(destroyFns, () => {\r\n intersectionObserverInstance!.disconnect();\r\n });\r\n } else {\r\n const onSizeChanged = () => {\r\n const newSize = getOffsetSize(trinsicObserver);\r\n triggerOnTrinsicChangedCallback(newSize);\r\n };\r\n push(destroyFns, createSizeObserver(trinsicObserver, onSizeChanged)());\r\n onSizeChanged();\r\n }\r\n\r\n return bind(runEachAndClear, push(destroyFns, appendChildren(target, trinsicObserver)));\r\n },\r\n () =>\r\n intersectionObserverInstance &&\r\n intersectionObserverCallback(true, intersectionObserverInstance.takeRecords()),\r\n ];\r\n};\r\n","import {\r\n ResizeObserverConstructor,\r\n assignDeep,\r\n closest,\r\n createCache,\r\n debounce,\r\n equalWH,\r\n getFractionalSize,\r\n isArray,\r\n isFunction,\r\n isNumber,\r\n keys,\r\n liesBetween,\r\n getScrollSize,\r\n getElementScroll,\r\n scrollElementTo,\r\n domRectAppeared,\r\n concat,\r\n getStyles,\r\n hasAttrClass,\r\n} from '~/support';\r\nimport { createDOMObserver, createSizeObserver, createTrinsicObserver } from '~/observers';\r\nimport { getEnvironment } from '~/environment';\r\nimport {\r\n classNameScrollbar,\r\n dataAttributeHost,\r\n dataAttributeViewport,\r\n dataValueViewportMeasuring,\r\n dataValueViewportArrange,\r\n dataValueNoClipping,\r\n} from '~/classnames';\r\nimport { getStaticPluginModuleInstance, scrollbarsHidingPluginName } from '~/plugins';\r\nimport type { Options, OptionsCheckFn } from '~/options';\r\nimport type { ScrollbarsHidingPlugin } from '~/plugins';\r\nimport type { SizeObserverCallbackParams } from '~/observers';\r\nimport type { StructureSetupElementsObj } from '../structureSetup/structureSetup.elements';\r\nimport type { Setup, SetupUpdateInfo, StructureSetupState } from '~/setups';\r\nimport type { CacheValues, WH } from '~/support';\r\nimport type { PlainObject } from '~/typings';\r\n\r\nexport interface ObserversSetupState {\r\n _heightIntrinsic: boolean;\r\n _directionIsRTL: boolean;\r\n}\r\n\r\nexport interface ObserversSetupUpdateInfo extends SetupUpdateInfo {\r\n _takeRecords?: boolean;\r\n}\r\n\r\nexport type ObserversSetupUpdateHints = {\r\n _sizeChanged?: boolean;\r\n _directionChanged?: boolean;\r\n _heightIntrinsicChanged?: boolean;\r\n _hostMutation?: boolean;\r\n _contentMutation?: boolean;\r\n _appear?: boolean;\r\n _scrollbarSizeChanged?: boolean;\r\n};\r\n\r\nexport type ObserversSetup = Setup<\r\n ObserversSetupUpdateInfo,\r\n ObserversSetupState,\r\n ObserversSetupUpdateHints\r\n>;\r\n\r\nexport const createObserversSetup = (\r\n structureSetupElements: StructureSetupElementsObj,\r\n structureSetupState: StructureSetupState,\r\n getCurrentOption: OptionsCheckFn<Options>,\r\n onObserversUpdated: (updateHints: ObserversSetupUpdateHints) => void\r\n): ObserversSetup => {\r\n let debounceTimeout: number | false | undefined;\r\n let debounceMaxDelay: number | false | undefined;\r\n let updateContentMutationObserver: (() => void) | undefined;\r\n let destroyContentMutationObserver: (() => void) | undefined;\r\n let prevContentRect: DOMRectReadOnly | undefined;\r\n let prevDirectionIsRTL: boolean | undefined;\r\n const hostSelector = `[${dataAttributeHost}]`;\r\n\r\n // TODO: observer textarea attrs if textarea\r\n\r\n const viewportSelector = `[${dataAttributeViewport}]`;\r\n const baseStyleChangingAttrs = ['id', 'class', 'style', 'open', 'wrap', 'cols', 'rows'];\r\n const {\r\n _target,\r\n _host,\r\n _viewport,\r\n _scrollOffsetElement,\r\n _content,\r\n _viewportIsTarget,\r\n _isBody,\r\n _viewportHasClass,\r\n _viewportAddRemoveClass,\r\n _removeScrollObscuringStyles,\r\n } = structureSetupElements;\r\n\r\n const getDirectionIsRTL = (elm: HTMLElement): boolean => getStyles(elm, 'direction') === 'rtl';\r\n\r\n const state: ObserversSetupState = {\r\n _heightIntrinsic: false,\r\n _directionIsRTL: getDirectionIsRTL(_target),\r\n };\r\n const env = getEnvironment();\r\n const scrollbarsHidingPlugin = getStaticPluginModuleInstance<typeof ScrollbarsHidingPlugin>(\r\n scrollbarsHidingPluginName\r\n );\r\n\r\n const [updateContentSizeCache] = createCache<WH<number>>(\r\n {\r\n _equal: equalWH,\r\n _initialValue: { w: 0, h: 0 },\r\n },\r\n () => {\r\n const _undoViewportArrange =\r\n scrollbarsHidingPlugin &&\r\n scrollbarsHidingPlugin._viewportArrangement(\r\n structureSetupElements,\r\n structureSetupState,\r\n state,\r\n env,\r\n getCurrentOption\r\n )._undoViewportArrange;\r\n\r\n const viewportIsTargetBody = _isBody && _viewportIsTarget;\r\n const noClipping =\r\n !viewportIsTargetBody && hasAttrClass(_host, dataAttributeHost, dataValueNoClipping);\r\n const isArranged = !_viewportIsTarget && _viewportHasClass(dataValueViewportArrange);\r\n const scrollOffset = isArranged && getElementScroll(_scrollOffsetElement);\r\n const revertScrollObscuringStyles = scrollOffset && _removeScrollObscuringStyles();\r\n\r\n const revertMeasuring = _viewportAddRemoveClass(dataValueViewportMeasuring, noClipping);\r\n const redoViewportArrange = isArranged && _undoViewportArrange && _undoViewportArrange()[0];\r\n const viewportScroll = getScrollSize(_viewport);\r\n const fractional = getFractionalSize(_viewport);\r\n\r\n redoViewportArrange && redoViewportArrange();\r\n\r\n scrollElementTo(_scrollOffsetElement, scrollOffset);\r\n revertScrollObscuringStyles && revertScrollObscuringStyles();\r\n noClipping && revertMeasuring();\r\n\r\n return {\r\n w: viewportScroll.w + fractional.w,\r\n h: viewportScroll.h + fractional.h,\r\n };\r\n }\r\n );\r\n\r\n const onObserversUpdatedDebounced = debounce(onObserversUpdated, {\r\n _timeout: () => debounceTimeout,\r\n _maxDelay: () => debounceMaxDelay,\r\n _mergeParams(prev, curr) {\r\n const [prevObj] = prev;\r\n const [currObj] = curr;\r\n return [\r\n concat(keys(prevObj), keys(currObj)).reduce((obj, key) => {\r\n obj[key] = prevObj[key as keyof typeof prevObj] || currObj[key as keyof typeof currObj];\r\n return obj;\r\n }, {} as PlainObject),\r\n ] as [Partial<ObserversSetupUpdateHints>];\r\n },\r\n });\r\n\r\n const setDirection = (updateHints: ObserversSetupUpdateHints) => {\r\n const newDirectionIsRTL = getDirectionIsRTL(_target);\r\n assignDeep(updateHints, { _directionChanged: prevDirectionIsRTL !== newDirectionIsRTL });\r\n assignDeep(state, { _directionIsRTL: newDirectionIsRTL });\r\n prevDirectionIsRTL = newDirectionIsRTL;\r\n };\r\n\r\n const onTrinsicChanged = (\r\n heightIntrinsicCache: CacheValues<boolean>,\r\n fromRecords?: true\r\n ): ObserversSetupUpdateHints => {\r\n const [heightIntrinsic, heightIntrinsicChanged] = heightIntrinsicCache;\r\n const updateHints: ObserversSetupUpdateHints = {\r\n _heightIntrinsicChanged: heightIntrinsicChanged,\r\n };\r\n\r\n assignDeep(state, { _heightIntrinsic: heightIntrinsic });\r\n !fromRecords && onObserversUpdated(updateHints);\r\n\r\n return updateHints;\r\n };\r\n\r\n const onSizeChanged = ({ _sizeChanged, _appear }: SizeObserverCallbackParams) => {\r\n const exclusiveSizeChange = _sizeChanged && !_appear;\r\n const updateFn =\r\n // use debounceed update:\r\n // if native scrollbars hiding is supported\r\n // and if the update is more than just a exclusive sizeChange (e.g. size change + appear, or size change + direction)\r\n !exclusiveSizeChange && env._nativeScrollbarsHiding\r\n ? onObserversUpdatedDebounced\r\n : onObserversUpdated;\r\n\r\n const updateHints: ObserversSetupUpdateHints = {\r\n _sizeChanged: _sizeChanged || _appear,\r\n _appear,\r\n };\r\n\r\n setDirection(updateHints);\r\n\r\n updateFn(updateHints);\r\n };\r\n\r\n const onContentMutation = (\r\n contentChangedThroughEvent: boolean,\r\n fromRecords?: true\r\n ): ObserversSetupUpdateHints => {\r\n const [, _contentMutation] = updateContentSizeCache();\r\n const updateHints: ObserversSetupUpdateHints = {\r\n _contentMutation,\r\n };\r\n\r\n setDirection(updateHints);\r\n\r\n // if contentChangedThroughEvent is true its already debounced\r\n const updateFn = contentChangedThroughEvent ? onObserversUpdated : onObserversUpdatedDebounced;\r\n\r\n _contentMutation && !fromRecords && updateFn(updateHints);\r\n\r\n return updateHints;\r\n };\r\n\r\n const onHostMutation = (\r\n targetChangedAttrs: string[],\r\n targetStyleChanged: boolean,\r\n fromRecords?: true\r\n ): ObserversSetupUpdateHints => {\r\n const updateHints: ObserversSetupUpdateHints = {\r\n _hostMutation: targetStyleChanged,\r\n };\r\n\r\n setDirection(updateHints);\r\n\r\n if (targetStyleChanged && !fromRecords) {\r\n onObserversUpdatedDebounced(updateHints);\r\n }\r\n /*\r\n else if (!_viewportIsTarget) {\r\n updateViewportAttrsFromHost(targetChangedAttrs);\r\n }\r\n */\r\n\r\n return updateHints;\r\n };\r\n\r\n const [constructTrinsicObserver, updateTrinsicObserver] = _content\r\n ? createTrinsicObserver(_host, onTrinsicChanged)\r\n : [];\r\n\r\n const constructSizeObserver =\r\n !_viewportIsTarget &&\r\n createSizeObserver(_host, onSizeChanged, {\r\n _appear: true,\r\n });\r\n\r\n const [constructHostMutationObserver, updateHostMutationObserver] = createDOMObserver(\r\n _host,\r\n false,\r\n onHostMutation,\r\n {\r\n _styleChangingAttributes: baseStyleChangingAttrs,\r\n _attributes: baseStyleChangingAttrs,\r\n }\r\n );\r\n\r\n const viewportIsTargetResizeObserver =\r\n _viewportIsTarget &&\r\n ResizeObserverConstructor &&\r\n new ResizeObserverConstructor((entries) => {\r\n const currContentRect = entries[entries.length - 1].contentRect;\r\n onSizeChanged({\r\n _sizeChanged: true,\r\n _appear: domRectAppeared(currContentRect, prevContentRect),\r\n });\r\n prevContentRect = currContentRect;\r\n });\r\n const onWindowResizeDebounced = debounce(\r\n () => {\r\n const [, _contentMutation] = updateContentSizeCache();\r\n onObserversUpdated({ _contentMutation });\r\n },\r\n {\r\n _timeout: 222,\r\n _leading: true,\r\n }\r\n );\r\n\r\n return [\r\n () => {\r\n // order is matter!\r\n // updateViewportAttrsFromHost();\r\n viewportIsTargetResizeObserver && viewportIsTargetResizeObserver.observe(_host);\r\n const destroySizeObserver = constructSizeObserver && constructSizeObserver();\r\n const destroyTrinsicObserver = constructTrinsicObserver && constructTrinsicObserver();\r\n const destroyHostMutationObserver = constructHostMutationObserver();\r\n const removeResizeListener = env._addResizeListener((_scrollbarSizeChanged) => {\r\n if (_scrollbarSizeChanged) {\r\n onObserversUpdatedDebounced({ _scrollbarSizeChanged });\r\n } else {\r\n onWindowResizeDebounced();\r\n }\r\n });\r\n\r\n return () => {\r\n viewportIsTargetResizeObserver && viewportIsTargetResizeObserver.disconnect();\r\n destroySizeObserver && destroySizeObserver();\r\n destroyTrinsicObserver && destroyTrinsicObserver();\r\n destroyContentMutationObserver && destroyContentMutationObserver();\r\n destroyHostMutationObserver();\r\n removeResizeListener();\r\n };\r\n },\r\n ({ _checkOption, _takeRecords, _force }) => {\r\n const updateHints: ObserversSetupUpdateHints = {};\r\n\r\n const [ignoreMutation] = _checkOption('update.ignoreMutation');\r\n const [attributes, attributesChanged] = _checkOption('update.attributes');\r\n const [elementEvents, elementEventsChanged] = _checkOption('update.elementEvents');\r\n const [debounceValue, debounceChanged] = _checkOption('update.debounce');\r\n const contentMutationObserverChanged = elementEventsChanged || attributesChanged;\r\n const takeRecords = _takeRecords || _force;\r\n const ignoreMutationFromOptions = (mutation: MutationRecord) =>\r\n isFunction(ignoreMutation) && ignoreMutation(mutation);\r\n\r\n if (contentMutationObserverChanged) {\r\n updateContentMutationObserver && updateContentMutationObserver();\r\n destroyContentMutationObserver && destroyContentMutationObserver();\r\n\r\n const [construct, update] = createDOMObserver(\r\n _content || _viewport,\r\n true,\r\n onContentMutation,\r\n {\r\n _attributes: concat(baseStyleChangingAttrs, attributes || []),\r\n _eventContentChange: elementEvents,\r\n _nestedTargetSelector: hostSelector,\r\n _ignoreContentChange: (mutation, isNestedTarget) => {\r\n const { target: mutationTarget, attributeName } = mutation;\r\n const ignore =\r\n !isNestedTarget && attributeName && !_viewportIsTarget\r\n ? liesBetween(mutationTarget, hostSelector, viewportSelector)\r\n : false;\r\n return (\r\n ignore ||\r\n !!closest(mutationTarget, `.${classNameScrollbar}`) || // ignore explicitely all scrollbar elements\r\n !!ignoreMutationFromOptions(mutation)\r\n );\r\n },\r\n }\r\n );\r\n\r\n destroyContentMutationObserver = construct();\r\n updateContentMutationObserver = update;\r\n }\r\n\r\n if (debounceChanged) {\r\n onObserversUpdatedDebounced._flush();\r\n if (isArray(debounceValue)) {\r\n const timeout = debounceValue[0];\r\n const maxWait = debounceValue[1];\r\n debounceTimeout = isNumber(timeout) && timeout;\r\n debounceMaxDelay = isNumber(maxWait) && maxWait;\r\n } else if (isNumber(debounceValue)) {\r\n debounceTimeout = debounceValue;\r\n debounceMaxDelay = false;\r\n } else {\r\n debounceTimeout = false;\r\n debounceMaxDelay = false;\r\n }\r\n }\r\n\r\n if (takeRecords) {\r\n const hostUpdateResult = updateHostMutationObserver();\r\n const trinsicUpdateResult = updateTrinsicObserver && updateTrinsicObserver();\r\n const contentUpdateResult =\r\n updateContentMutationObserver && updateContentMutationObserver();\r\n\r\n hostUpdateResult &&\r\n assignDeep(\r\n updateHints,\r\n onHostMutation(hostUpdateResult[0], hostUpdateResult[1], takeRecords)\r\n );\r\n\r\n trinsicUpdateResult &&\r\n assignDeep(updateHints, onTrinsicChanged(trinsicUpdateResult[0], takeRecords));\r\n\r\n contentUpdateResult &&\r\n assignDeep(updateHints, onContentMutation(contentUpdateResult[0], takeRecords));\r\n }\r\n\r\n setDirection(updateHints);\r\n\r\n return updateHints;\r\n },\r\n state,\r\n ];\r\n};\r\n","import {\r\n addClass,\r\n appendChildren,\r\n createDiv,\r\n each,\r\n getTrasformTranslateValue,\r\n isBoolean,\r\n parent,\r\n push,\r\n removeClass,\r\n removeElements,\r\n runEachAndClear,\r\n scrollT,\r\n bind,\r\n getElementScroll,\r\n numberToCssPx,\r\n setStyles,\r\n capNumber,\r\n getScrollCoordinatesPercent,\r\n isDefaultDirectionScrollCoordinates,\r\n roundCssNumber,\r\n} from '~/support';\r\nimport {\r\n classNameScrollbar,\r\n classNameScrollbarHorizontal,\r\n classNameScrollbarVertical,\r\n classNameScrollbarTrack,\r\n classNameScrollbarHandle,\r\n} from '~/classnames';\r\nimport { getEnvironment } from '~/environment';\r\nimport { dynamicInitializationElement as generalDynamicInitializationElement } from '~/initialization';\r\nimport type { XY } from '~/support';\r\nimport type {\r\n InitializationTarget,\r\n InitializationTargetElement,\r\n InitializationTargetObject,\r\n} from '~/initialization';\r\nimport type { StructureSetupElementsObj } from '../structureSetup/structureSetup.elements';\r\nimport type { ScrollbarsSetupEvents } from './scrollbarsSetup.events';\r\nimport type { StyleObject } from '~/typings';\r\nimport type { StructureSetupState } from '../structureSetup';\r\n\r\nexport interface ScrollbarStructure {\r\n _scrollbar: HTMLElement;\r\n _track: HTMLElement;\r\n _handle: HTMLElement;\r\n}\r\n\r\nexport interface ScrollbarsSetupElement {\r\n _scrollbarStructures: ScrollbarStructure[];\r\n _clone: () => ScrollbarStructure;\r\n _style: (\r\n elmStyle: (\r\n scrollbarStructure: ScrollbarStructure\r\n ) => [HTMLElement | false | null | undefined, StyleObject]\r\n ) => void;\r\n}\r\n\r\nexport interface ScrollbarsSetupElementsObj {\r\n _scrollbarsAddRemoveClass: (\r\n classNames: string | false | null | undefined,\r\n add?: boolean,\r\n isHorizontal?: boolean\r\n ) => void;\r\n _refreshScrollbarsHandleLength: () => void;\r\n _refreshScrollbarsHandleOffset: () => void;\r\n _refreshScrollbarsScrollbarOffset: () => void;\r\n _refreshScrollbarsScrollCoordinates: () => void;\r\n _horizontal: ScrollbarsSetupElement;\r\n _vertical: ScrollbarsSetupElement;\r\n}\r\n\r\nexport type ScrollbarsSetupElements = [\r\n elements: ScrollbarsSetupElementsObj,\r\n appendElements: () => () => void\r\n];\r\n\r\ntype ScrollbarStyleFn = (\r\n scrollbarStructure: ScrollbarStructure\r\n) => [HTMLElement | false | null | undefined, StyleObject | false | null | undefined];\r\n\r\nexport const createScrollbarsSetupElements = (\r\n target: InitializationTarget,\r\n structureSetupElements: StructureSetupElementsObj,\r\n structureSetupState: StructureSetupState,\r\n scrollbarsSetupEvents: ScrollbarsSetupEvents\r\n): ScrollbarsSetupElements => {\r\n const cssCustomPropViewportPercent = '--os-viewport-percent';\r\n const cssCustomPropScrollPercent = '--os-scroll-percent';\r\n const cssCustomPropScrollDirection = '--os-scroll-direction';\r\n const { _getDefaultInitialization } = getEnvironment();\r\n const { scrollbars: defaultInitScrollbars } = _getDefaultInitialization();\r\n const { slot: defaultInitScrollbarsSlot } = defaultInitScrollbars;\r\n const {\r\n _target,\r\n _host,\r\n _viewport,\r\n _targetIsElm,\r\n _scrollOffsetElement,\r\n _isBody,\r\n _viewportIsTarget,\r\n } = structureSetupElements;\r\n const { scrollbars: scrollbarsInit } = (_targetIsElm ? {} : target) as InitializationTargetObject;\r\n const { slot: initScrollbarsSlot } = scrollbarsInit || {};\r\n const destroyFns: (() => void)[] = [];\r\n const horizontalScrollbars: ScrollbarStructure[] = [];\r\n const verticalScrollbars: ScrollbarStructure[] = [];\r\n const evaluatedScrollbarSlot = generalDynamicInitializationElement<\r\n [InitializationTargetElement, HTMLElement, HTMLElement]\r\n >(\r\n [_target, _host, _viewport],\r\n () => (_viewportIsTarget && _isBody ? _target : _host),\r\n defaultInitScrollbarsSlot,\r\n initScrollbarsSlot\r\n );\r\n\r\n const initScrollTimeline = (axis: keyof XY<unknown>) => {\r\n if (scrollT) {\r\n const timeline = new scrollT({\r\n source: _scrollOffsetElement,\r\n axis,\r\n });\r\n\r\n const _addScrollPercentAnimation = (structure: ScrollbarStructure) => {\r\n const scrollPercentAnimation = structure._scrollbar.animate(\r\n {\r\n // dummy keyframe which fixes bug where the scrollbar handle is reverted to origin position when it should be at its max position\r\n clear: ['left'],\r\n [cssCustomPropScrollPercent]: [0, 1],\r\n },\r\n {\r\n timeline,\r\n }\r\n );\r\n return () => scrollPercentAnimation.cancel();\r\n };\r\n\r\n return {\r\n _addScrollPercentAnimation,\r\n };\r\n }\r\n };\r\n const scrollTimeline = {\r\n x: initScrollTimeline('x'),\r\n y: initScrollTimeline('y'),\r\n };\r\n const getViewportPercent = () => {\r\n const { _overflowAmount, _overflowEdge } = structureSetupState;\r\n const getAxisValue = (axisViewportSize: number, axisOverflowAmount: number) =>\r\n capNumber(0, 1, axisViewportSize / (axisViewportSize + axisOverflowAmount) || 0);\r\n\r\n return {\r\n x: getAxisValue(_overflowEdge.x, _overflowAmount.x),\r\n y: getAxisValue(_overflowEdge.y, _overflowAmount.y),\r\n };\r\n };\r\n const scrollbarStructureAddRemoveClass = (\r\n scrollbarStructures: ScrollbarStructure[],\r\n classNames: string | false | null | undefined,\r\n add?: boolean\r\n ) => {\r\n const action = add ? addClass : removeClass;\r\n each(scrollbarStructures, (scrollbarStructure) => {\r\n action(scrollbarStructure._scrollbar, classNames);\r\n });\r\n };\r\n const scrollbarStyle = (\r\n scrollbarStructures: ScrollbarStructure[],\r\n elmStyle: ScrollbarStyleFn\r\n ) => {\r\n each(scrollbarStructures, (scrollbarStructure) => {\r\n const [elm, styles] = elmStyle(scrollbarStructure);\r\n setStyles(elm, styles);\r\n });\r\n };\r\n const scrollbarsAddRemoveClass = (\r\n className: string | false | null | undefined,\r\n add?: boolean,\r\n onlyHorizontal?: boolean\r\n ) => {\r\n const singleAxis = isBoolean(onlyHorizontal);\r\n const runHorizontal = singleAxis ? onlyHorizontal : true;\r\n const runVertical = singleAxis ? !onlyHorizontal : true;\r\n runHorizontal && scrollbarStructureAddRemoveClass(horizontalScrollbars, className, add);\r\n runVertical && scrollbarStructureAddRemoveClass(verticalScrollbars, className, add);\r\n };\r\n const refreshScrollbarsHandleLength = () => {\r\n const viewportPercent = getViewportPercent();\r\n const createScrollbarStyleFn =\r\n (axisViewportPercent: number): ScrollbarStyleFn =>\r\n (structure: ScrollbarStructure) =>\r\n [\r\n structure._scrollbar,\r\n {\r\n [cssCustomPropViewportPercent]: roundCssNumber(axisViewportPercent) + '',\r\n },\r\n ];\r\n\r\n scrollbarStyle(horizontalScrollbars, createScrollbarStyleFn(viewportPercent.x));\r\n scrollbarStyle(verticalScrollbars, createScrollbarStyleFn(viewportPercent.y));\r\n };\r\n const refreshScrollbarsHandleOffset = () => {\r\n if (!scrollT) {\r\n const { _scrollCoordinates } = structureSetupState;\r\n const scrollPercent = getScrollCoordinatesPercent(\r\n _scrollCoordinates,\r\n getElementScroll(_scrollOffsetElement)\r\n );\r\n const createScrollbarStyleFn =\r\n (axisScrollPercent: number): ScrollbarStyleFn =>\r\n (structure: ScrollbarStructure) =>\r\n [\r\n structure._scrollbar,\r\n {\r\n [cssCustomPropScrollPercent]: roundCssNumber(axisScrollPercent) + '',\r\n },\r\n ];\r\n\r\n scrollbarStyle(horizontalScrollbars, createScrollbarStyleFn(scrollPercent.x));\r\n scrollbarStyle(verticalScrollbars, createScrollbarStyleFn(scrollPercent.y));\r\n }\r\n };\r\n const refreshScrollbarsScrollCoordinates = () => {\r\n const { _scrollCoordinates } = structureSetupState;\r\n const defaultDirectionScroll = isDefaultDirectionScrollCoordinates(_scrollCoordinates);\r\n const createScrollbarStyleFn =\r\n (axisIsDefaultDirectionScrollCoordinates: boolean): ScrollbarStyleFn =>\r\n (structure: ScrollbarStructure) =>\r\n [\r\n structure._scrollbar,\r\n {\r\n [cssCustomPropScrollDirection]: axisIsDefaultDirectionScrollCoordinates ? '0' : '1',\r\n },\r\n ];\r\n\r\n scrollbarStyle(horizontalScrollbars, createScrollbarStyleFn(defaultDirectionScroll.x));\r\n scrollbarStyle(verticalScrollbars, createScrollbarStyleFn(defaultDirectionScroll.y));\r\n };\r\n const refreshScrollbarsScrollbarOffset = () => {\r\n if (_viewportIsTarget && !_isBody) {\r\n const { _overflowAmount, _scrollCoordinates } = structureSetupState;\r\n const isDefaultDirectionScroll = isDefaultDirectionScrollCoordinates(_scrollCoordinates);\r\n const scrollPercent = getScrollCoordinatesPercent(\r\n _scrollCoordinates,\r\n getElementScroll(_scrollOffsetElement)\r\n );\r\n const styleScrollbarPosition: ScrollbarStyleFn = (structure: ScrollbarStructure) => {\r\n const { _scrollbar } = structure;\r\n const elm = parent(_scrollbar) === _viewport && _scrollbar;\r\n const getTranslateValue = (\r\n axisScrollPercent: number,\r\n axisOverflowAmount: number,\r\n axisIsDefaultCoordinates: boolean\r\n ) => {\r\n const px = axisOverflowAmount * axisScrollPercent;\r\n return numberToCssPx(axisIsDefaultCoordinates ? px : -px);\r\n };\r\n\r\n return [\r\n elm,\r\n elm && {\r\n transform: getTrasformTranslateValue({\r\n x: getTranslateValue(scrollPercent.x, _overflowAmount.x, isDefaultDirectionScroll.x),\r\n y: getTranslateValue(scrollPercent.y, _overflowAmount.y, isDefaultDirectionScroll.y),\r\n }),\r\n },\r\n ];\r\n };\r\n\r\n scrollbarStyle(horizontalScrollbars, styleScrollbarPosition);\r\n scrollbarStyle(verticalScrollbars, styleScrollbarPosition);\r\n }\r\n };\r\n const generateScrollbarDOM = (isHorizontal?: boolean): ScrollbarStructure => {\r\n const xyKey = isHorizontal ? 'x' : 'y';\r\n const scrollbarClassName = isHorizontal\r\n ? classNameScrollbarHorizontal\r\n : classNameScrollbarVertical;\r\n const scrollbar = createDiv(`${classNameScrollbar} ${scrollbarClassName}`);\r\n const track = createDiv(classNameScrollbarTrack);\r\n const handle = createDiv(classNameScrollbarHandle);\r\n const result = {\r\n _scrollbar: scrollbar,\r\n _track: track,\r\n _handle: handle,\r\n };\r\n const timeline = scrollTimeline[xyKey];\r\n\r\n push(isHorizontal ? horizontalScrollbars : verticalScrollbars, result);\r\n push(destroyFns, [\r\n appendChildren(scrollbar, track),\r\n appendChildren(track, handle),\r\n bind(removeElements, scrollbar),\r\n timeline && timeline._addScrollPercentAnimation(result),\r\n scrollbarsSetupEvents(result, scrollbarsAddRemoveClass, isHorizontal),\r\n ]);\r\n\r\n return result;\r\n };\r\n const generateHorizontalScrollbarStructure = bind(generateScrollbarDOM, true);\r\n const generateVerticalScrollbarStructure = bind(generateScrollbarDOM, false);\r\n const appendElements = () => {\r\n appendChildren(evaluatedScrollbarSlot, horizontalScrollbars[0]._scrollbar);\r\n appendChildren(evaluatedScrollbarSlot, verticalScrollbars[0]._scrollbar);\r\n\r\n return bind(runEachAndClear, destroyFns);\r\n };\r\n\r\n generateHorizontalScrollbarStructure();\r\n generateVerticalScrollbarStructure();\r\n\r\n return [\r\n {\r\n _refreshScrollbarsHandleLength: refreshScrollbarsHandleLength,\r\n _refreshScrollbarsHandleOffset: refreshScrollbarsHandleOffset,\r\n _refreshScrollbarsScrollCoordinates: refreshScrollbarsScrollCoordinates,\r\n _refreshScrollbarsScrollbarOffset: refreshScrollbarsScrollbarOffset,\r\n _scrollbarsAddRemoveClass: scrollbarsAddRemoveClass,\r\n _horizontal: {\r\n _scrollbarStructures: horizontalScrollbars,\r\n _clone: generateHorizontalScrollbarStructure,\r\n _style: bind(scrollbarStyle, horizontalScrollbars),\r\n },\r\n _vertical: {\r\n _scrollbarStructures: verticalScrollbars,\r\n _clone: generateVerticalScrollbarStructure,\r\n _style: bind(scrollbarStyle, verticalScrollbars),\r\n },\r\n },\r\n appendElements,\r\n ];\r\n};\r\n","import {\r\n getBoundingClientRect,\r\n getOffsetSize,\r\n addEventListener,\r\n preventDefault,\r\n runEachAndClear,\r\n selfClearTimeout,\r\n parent,\r\n closest,\r\n push,\r\n bind,\r\n mathRound,\r\n strWidth,\r\n strHeight,\r\n getElementScroll,\r\n scrollElementTo,\r\n getFocusedElement,\r\n setT,\r\n hasAttr,\r\n stopAndPrevent,\r\n isFunction,\r\n mathAbs,\r\n focusElement,\r\n} from '~/support';\r\nimport { clickScrollPluginModuleName, getStaticPluginModuleInstance } from '~/plugins';\r\nimport {\r\n classNameScrollbarHandle,\r\n classNameScrollbarInteraction,\r\n classNameScrollbarWheel,\r\n dataAttributeHost,\r\n dataAttributeViewport,\r\n} from '~/classnames';\r\nimport type { XY } from '~/support';\r\nimport type { ClickScrollPlugin } from '~/plugins';\r\nimport type { ReadonlyOptions } from '~/options';\r\nimport type { StructureSetupState } from '~/setups';\r\nimport type { ScrollbarsSetupElementsObj, ScrollbarStructure } from './scrollbarsSetup.elements';\r\nimport type { StructureSetupElementsObj } from '../structureSetup/structureSetup.elements';\r\n\r\nexport type ScrollbarsSetupEvents = (\r\n scrollbarStructure: ScrollbarStructure,\r\n scrollbarsAddRemoveClass: ScrollbarsSetupElementsObj['_scrollbarsAddRemoveClass'],\r\n isHorizontal?: boolean\r\n) => () => void;\r\n\r\nexport const createScrollbarsSetupEvents = (\r\n options: ReadonlyOptions,\r\n structureSetupElements: StructureSetupElementsObj,\r\n structureSetupState: StructureSetupState,\r\n scrollbarHandlePointerInteraction: (event: PointerEvent) => void\r\n): ScrollbarsSetupEvents => {\r\n return (scrollbarStructure, scrollbarsAddRemoveClass, isHorizontal) => {\r\n const {\r\n _host,\r\n _viewport,\r\n _viewportIsTarget,\r\n _scrollOffsetElement,\r\n _documentElm,\r\n _removeScrollObscuringStyles,\r\n } = structureSetupElements;\r\n const { _scrollbar, _track, _handle } = scrollbarStructure;\r\n const [wheelTimeout, clearWheelTimeout] = selfClearTimeout(333);\r\n const [scrollSnapScrollTransitionTimeout, clearScrollSnapScrollTransitionTimeout] =\r\n selfClearTimeout(444);\r\n const scrollOffsetElementScrollBy = (coordinates: XY<number>) => {\r\n isFunction(_scrollOffsetElement.scrollBy) &&\r\n _scrollOffsetElement.scrollBy({\r\n behavior: 'smooth',\r\n left: coordinates.x,\r\n top: coordinates.y,\r\n });\r\n };\r\n\r\n const createInteractiveScrollEvents = () => {\r\n const releasePointerCaptureEvents = 'pointerup pointercancel lostpointercapture';\r\n const clientXYKey = `client${isHorizontal ? 'X' : 'Y'}` as 'clientX' | 'clientY';\r\n const widthHeightKey = isHorizontal ? strWidth : strHeight;\r\n const leftTopKey = isHorizontal ? 'left' : 'top';\r\n const whKey = isHorizontal ? 'w' : 'h';\r\n const xyKey = isHorizontal ? 'x' : 'y';\r\n\r\n const createRelativeHandleMove =\r\n (mouseDownScroll: number, invertedScale: number) => (deltaMovement: number) => {\r\n const { _overflowAmount } = structureSetupState;\r\n const handleTrackDiff = getOffsetSize(_track)[whKey] - getOffsetSize(_handle)[whKey];\r\n const scrollDeltaPercent = (invertedScale * deltaMovement) / handleTrackDiff;\r\n const scrollDelta = scrollDeltaPercent * _overflowAmount[xyKey];\r\n\r\n scrollElementTo(_scrollOffsetElement, {\r\n [xyKey]: mouseDownScroll + scrollDelta,\r\n });\r\n };\r\n const pointerdownCleanupFns: Array<() => void> = [];\r\n\r\n return addEventListener(_track, 'pointerdown', (pointerDownEvent: PointerEvent) => {\r\n const isDragScroll =\r\n closest(pointerDownEvent.target as Node, `.${classNameScrollbarHandle}`) === _handle;\r\n const pointerCaptureElement = isDragScroll ? _handle : _track;\r\n\r\n const scrollbarOptions = options.scrollbars;\r\n const { button, isPrimary, pointerType } = pointerDownEvent;\r\n const { pointers } = scrollbarOptions;\r\n\r\n const continuePointerDown =\r\n button === 0 &&\r\n isPrimary &&\r\n scrollbarOptions[isDragScroll ? 'dragScroll' : 'clickScroll'] &&\r\n (pointers || []).includes(pointerType);\r\n\r\n if (continuePointerDown) {\r\n runEachAndClear(pointerdownCleanupFns);\r\n clearScrollSnapScrollTransitionTimeout();\r\n\r\n const instantClickScroll = !isDragScroll && pointerDownEvent.shiftKey;\r\n const getHandleRect = bind(getBoundingClientRect, _handle);\r\n const getTrackRect = bind(getBoundingClientRect, _track);\r\n const getHandleOffset = (handleRect?: DOMRect, trackRect?: DOMRect) =>\r\n (handleRect || getHandleRect())[leftTopKey] - (trackRect || getTrackRect())[leftTopKey];\r\n const axisScale =\r\n mathRound(getBoundingClientRect(_scrollOffsetElement)[widthHeightKey]) /\r\n getOffsetSize(_scrollOffsetElement)[whKey] || 1;\r\n const moveHandleRelative = createRelativeHandleMove(\r\n getElementScroll(_scrollOffsetElement)[xyKey],\r\n 1 / axisScale\r\n );\r\n const pointerDownOffset = pointerDownEvent[clientXYKey];\r\n const handleRect = getHandleRect();\r\n const trackRect = getTrackRect();\r\n const handleLength = handleRect[widthHeightKey];\r\n const handleCenter = getHandleOffset(handleRect, trackRect) + handleLength / 2;\r\n const relativeTrackPointerOffset = pointerDownOffset - trackRect[leftTopKey];\r\n const startOffset = isDragScroll ? 0 : relativeTrackPointerOffset - handleCenter;\r\n const releasePointerCapture = (pointerUpEvent: PointerEvent) => {\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n runEachAndClear(pointerupCleanupFns);\r\n pointerCaptureElement.releasePointerCapture(pointerUpEvent.pointerId);\r\n };\r\n const revertScrollObscuringStyles = _removeScrollObscuringStyles();\r\n\r\n const pointerupCleanupFns = [\r\n () => {\r\n const withoutSnapScrollOffset = getElementScroll(_scrollOffsetElement);\r\n revertScrollObscuringStyles();\r\n const withSnapScrollOffset = getElementScroll(_scrollOffsetElement);\r\n const snapScrollDiff = {\r\n x: withSnapScrollOffset.x - withoutSnapScrollOffset.x,\r\n y: withSnapScrollOffset.y - withoutSnapScrollOffset.y,\r\n };\r\n\r\n if (mathAbs(snapScrollDiff.x) > 3 || mathAbs(snapScrollDiff.y) > 3) {\r\n _removeScrollObscuringStyles();\r\n scrollElementTo(_scrollOffsetElement, withoutSnapScrollOffset);\r\n scrollOffsetElementScrollBy(snapScrollDiff);\r\n scrollSnapScrollTransitionTimeout(revertScrollObscuringStyles);\r\n }\r\n },\r\n addEventListener(_documentElm, releasePointerCaptureEvents, releasePointerCapture),\r\n addEventListener(_documentElm, 'selectstart', (event: Event) => preventDefault(event), {\r\n _passive: false,\r\n }),\r\n addEventListener(_track, releasePointerCaptureEvents, releasePointerCapture),\r\n addEventListener(_track, 'pointermove', (pointerMoveEvent: PointerEvent) => {\r\n const relativeMovement = pointerMoveEvent[clientXYKey] - pointerDownOffset;\r\n\r\n if (isDragScroll || instantClickScroll) {\r\n moveHandleRelative(startOffset + relativeMovement);\r\n }\r\n }),\r\n ];\r\n\r\n pointerCaptureElement.setPointerCapture(pointerDownEvent.pointerId);\r\n\r\n if (instantClickScroll) {\r\n moveHandleRelative(startOffset);\r\n } else if (!isDragScroll) {\r\n const animateClickScroll = getStaticPluginModuleInstance<typeof ClickScrollPlugin>(\r\n clickScrollPluginModuleName\r\n );\r\n if (animateClickScroll) {\r\n const stopClickScrollAnimation = animateClickScroll(\r\n moveHandleRelative,\r\n getHandleOffset,\r\n startOffset,\r\n handleLength,\r\n relativeTrackPointerOffset\r\n );\r\n\r\n push(pointerupCleanupFns, bind(stopClickScrollAnimation));\r\n push(pointerdownCleanupFns, bind(stopClickScrollAnimation, true));\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n let wheelScrollBy = true;\r\n\r\n return bind(runEachAndClear, [\r\n addEventListener(_handle, 'pointermove pointerleave', scrollbarHandlePointerInteraction),\r\n addEventListener(_scrollbar, 'pointerenter', () => {\r\n scrollbarsAddRemoveClass(classNameScrollbarInteraction, true);\r\n }),\r\n addEventListener(_scrollbar, 'pointerleave pointercancel', () => {\r\n scrollbarsAddRemoveClass(classNameScrollbarInteraction, false);\r\n }),\r\n // focus viewport when clicking on a scrollbar (mouse only)\r\n !_viewportIsTarget &&\r\n addEventListener(_scrollbar, 'mousedown', () => {\r\n const focusedElement = getFocusedElement();\r\n if (\r\n hasAttr(focusedElement, dataAttributeViewport) ||\r\n hasAttr(focusedElement, dataAttributeHost) ||\r\n focusedElement === document.body\r\n ) {\r\n setT(bind(focusElement, _viewport), 25);\r\n }\r\n }),\r\n // propagate wheel events to viewport when mouse is over scrollbar\r\n addEventListener(\r\n _scrollbar,\r\n 'wheel',\r\n (wheelEvent: WheelEvent) => {\r\n const { deltaX, deltaY, deltaMode } = wheelEvent;\r\n\r\n // the first wheel event is swallowed, simulate scroll to compensate for it\r\n if (wheelScrollBy && deltaMode === 0 && parent(_scrollbar) === _host) {\r\n scrollOffsetElementScrollBy({\r\n x: deltaX,\r\n y: deltaY,\r\n });\r\n }\r\n\r\n wheelScrollBy = false;\r\n scrollbarsAddRemoveClass(classNameScrollbarWheel, true);\r\n wheelTimeout(() => {\r\n wheelScrollBy = true;\r\n scrollbarsAddRemoveClass(classNameScrollbarWheel);\r\n });\r\n\r\n preventDefault(wheelEvent);\r\n },\r\n { _passive: false, _capture: true }\r\n ),\r\n // solve problem of interaction causing click events\r\n addEventListener(\r\n _scrollbar,\r\n 'pointerdown',\r\n // stopPropagation for stopping event propagation (causing click listeners to be invoked)\r\n // preventDefault to prevent the pointer to cause any actions (e.g. releasing mouse button over an <a> tag causes an navigation)\r\n bind(addEventListener, _documentElm, 'click', stopAndPrevent, {\r\n _once: true,\r\n _capture: true,\r\n _passive: false,\r\n }),\r\n { _capture: true }\r\n ),\r\n createInteractiveScrollEvents(),\r\n clearWheelTimeout,\r\n clearScrollSnapScrollTransitionTimeout,\r\n ]);\r\n };\r\n};\r\n","import {\r\n bind,\r\n noop,\r\n addEventListener,\r\n push,\r\n runEachAndClear,\r\n selfClearTimeout,\r\n strScroll,\r\n strVisible,\r\n} from '~/support';\r\nimport { getEnvironment } from '~/environment';\r\nimport {\r\n classNameScrollbarThemeNone,\r\n classNameScrollbarVisible,\r\n classNameScrollbarUnusable,\r\n classNameScrollbarCornerless,\r\n classNameScrollbarAutoHideHidden,\r\n classNameScrollbarHandleInteractive,\r\n classNameScrollbarTrackInteractive,\r\n classNameScrollbarRtl,\r\n classNameScrollbarAutoHide,\r\n} from '~/classnames';\r\nimport type { OverflowBehavior, ReadonlyOptions } from '~/options';\r\nimport type { ScrollbarsSetupElementsObj } from './scrollbarsSetup.elements';\r\nimport type {\r\n ObserversSetupState,\r\n ObserversSetupUpdateHints,\r\n Setup,\r\n SetupUpdateInfo,\r\n StructureSetupState,\r\n StructureSetupUpdateHints,\r\n} from '~/setups';\r\nimport type { InitializationTarget } from '~/initialization';\r\nimport type { OverflowStyle } from '~/typings';\r\nimport type { StructureSetupElementsObj } from '../structureSetup/structureSetup.elements';\r\nimport { createScrollbarsSetupElements } from './scrollbarsSetup.elements';\r\nimport { createScrollbarsSetupEvents } from './scrollbarsSetup.events';\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\r\nexport interface ScrollbarsSetupState {}\r\n\r\nexport interface ScrollbarsSetupUpdateInfo extends SetupUpdateInfo {\r\n _observersUpdateHints?: ObserversSetupUpdateHints;\r\n _structureUpdateHints?: StructureSetupUpdateHints;\r\n}\r\n\r\nexport type ScrollbarsSetup = [\r\n ...Setup<ScrollbarsSetupUpdateInfo, ScrollbarsSetupState, void>,\r\n /** The elements created by the scrollbars setup. */\r\n ScrollbarsSetupElementsObj\r\n];\r\n\r\nexport const createScrollbarsSetup = (\r\n target: InitializationTarget,\r\n options: ReadonlyOptions,\r\n observersSetupState: ObserversSetupState,\r\n structureSetupState: StructureSetupState,\r\n structureSetupElements: StructureSetupElementsObj,\r\n onScroll: (event: Event) => void\r\n): ScrollbarsSetup => {\r\n let mouseInHost: boolean | undefined;\r\n let autoHideIsMove: boolean | undefined;\r\n let autoHideIsLeave: boolean | undefined;\r\n let autoHideIsNever: boolean | undefined;\r\n let prevTheme: string | null | undefined;\r\n let instanceAutoHideSuspendScrollDestroyFn = noop;\r\n let instanceAutoHideDelay = 0;\r\n\r\n // needed to not fire unnecessary operations for pointer events on safari which will cause side effects: https://github.com/KingSora/OverlayScrollbars/issues/560\r\n const isHoverablePointerType = (event: PointerEvent) => event.pointerType === 'mouse';\r\n\r\n const [requestScrollAnimationFrame, cancelScrollAnimationFrame] = selfClearTimeout();\r\n const [autoHideInstantInteractionTimeout, clearAutoHideInstantInteractionTimeout] =\r\n selfClearTimeout(100);\r\n const [autoHideSuspendTimeout, clearAutoHideSuspendTimeout] = selfClearTimeout(100);\r\n const [auotHideTimeout, clearAutoHideTimeout] = selfClearTimeout(() => instanceAutoHideDelay);\r\n const [elements, appendElements] = createScrollbarsSetupElements(\r\n target,\r\n structureSetupElements,\r\n structureSetupState,\r\n createScrollbarsSetupEvents(\r\n options,\r\n structureSetupElements,\r\n structureSetupState,\r\n (event) =>\r\n isHoverablePointerType(event) &&\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n manageScrollbarsAutoHideInstantInteraction()\r\n )\r\n );\r\n const { _host, _scrollEventElement, _isBody } = structureSetupElements;\r\n const {\r\n _scrollbarsAddRemoveClass,\r\n _refreshScrollbarsHandleLength,\r\n _refreshScrollbarsHandleOffset,\r\n _refreshScrollbarsScrollCoordinates,\r\n _refreshScrollbarsScrollbarOffset,\r\n } = elements;\r\n const manageScrollbarsAutoHide = (removeAutoHide: boolean, delayless?: boolean) => {\r\n clearAutoHideTimeout();\r\n if (removeAutoHide) {\r\n _scrollbarsAddRemoveClass(classNameScrollbarAutoHideHidden);\r\n } else {\r\n const hide = bind(_scrollbarsAddRemoveClass, classNameScrollbarAutoHideHidden, true);\r\n if (instanceAutoHideDelay > 0 && !delayless) {\r\n auotHideTimeout(hide);\r\n } else {\r\n hide();\r\n }\r\n }\r\n };\r\n const manageScrollbarsAutoHideInstantInteraction = () => {\r\n if (autoHideIsLeave ? !mouseInHost : !autoHideIsNever) {\r\n manageScrollbarsAutoHide(true);\r\n autoHideInstantInteractionTimeout(() => {\r\n manageScrollbarsAutoHide(false);\r\n });\r\n }\r\n };\r\n const manageAutoHideSuspension = (add: boolean) => {\r\n _scrollbarsAddRemoveClass(classNameScrollbarAutoHide, add, true);\r\n _scrollbarsAddRemoveClass(classNameScrollbarAutoHide, add, false);\r\n };\r\n const onHostMouseEnter = (event: PointerEvent) => {\r\n if (isHoverablePointerType(event)) {\r\n mouseInHost = autoHideIsLeave;\r\n autoHideIsLeave && manageScrollbarsAutoHide(true);\r\n }\r\n };\r\n const destroyFns: (() => void)[] = [\r\n clearAutoHideTimeout,\r\n clearAutoHideInstantInteractionTimeout,\r\n clearAutoHideSuspendTimeout,\r\n cancelScrollAnimationFrame,\r\n () => instanceAutoHideSuspendScrollDestroyFn(),\r\n\r\n addEventListener(_host, 'pointerover', onHostMouseEnter, { _once: true }),\r\n addEventListener(_host, 'pointerenter', onHostMouseEnter),\r\n addEventListener(_host, 'pointerleave', (event: PointerEvent) => {\r\n if (isHoverablePointerType(event)) {\r\n mouseInHost = false;\r\n autoHideIsLeave && manageScrollbarsAutoHide(false);\r\n }\r\n }),\r\n addEventListener(_host, 'pointermove', (event: PointerEvent) => {\r\n isHoverablePointerType(event) &&\r\n autoHideIsMove &&\r\n manageScrollbarsAutoHideInstantInteraction();\r\n }),\r\n addEventListener(_scrollEventElement, 'scroll', (event) => {\r\n requestScrollAnimationFrame(() => {\r\n _refreshScrollbarsHandleOffset();\r\n manageScrollbarsAutoHideInstantInteraction();\r\n });\r\n\r\n onScroll(event);\r\n\r\n _refreshScrollbarsScrollbarOffset();\r\n }),\r\n ];\r\n\r\n return [\r\n () => bind(runEachAndClear, push(destroyFns, appendElements())),\r\n ({ _checkOption, _force, _observersUpdateHints, _structureUpdateHints }) => {\r\n const {\r\n _overflowEdgeChanged,\r\n _overflowAmountChanged,\r\n _overflowStyleChanged,\r\n _scrollCoordinatesChanged,\r\n } = _structureUpdateHints || {};\r\n const { _directionChanged, _appear } = _observersUpdateHints || {};\r\n const { _directionIsRTL } = observersSetupState;\r\n const { _nativeScrollbarsOverlaid } = getEnvironment();\r\n const { _overflowStyle, _hasOverflow } = structureSetupState;\r\n const [showNativeOverlaidScrollbarsOption, showNativeOverlaidScrollbarsChanged] =\r\n _checkOption('showNativeOverlaidScrollbars');\r\n const [theme, themeChanged] = _checkOption('scrollbars.theme');\r\n const [visibility, visibilityChanged] = _checkOption('scrollbars.visibility');\r\n const [autoHide, autoHideChanged] = _checkOption('scrollbars.autoHide');\r\n const [autoHideSuspend, autoHideSuspendChanged] = _checkOption('scrollbars.autoHideSuspend');\r\n const [autoHideDelay] = _checkOption('scrollbars.autoHideDelay');\r\n const [dragScroll, dragScrollChanged] = _checkOption('scrollbars.dragScroll');\r\n const [clickScroll, clickScrollChanged] = _checkOption('scrollbars.clickScroll');\r\n const [overflow, overflowChanged] = _checkOption('overflow');\r\n const trulyAppeared = _appear && !_force;\r\n const hasOverflow = _hasOverflow.x || _hasOverflow.y;\r\n const updateScrollbars =\r\n _overflowEdgeChanged ||\r\n _overflowAmountChanged ||\r\n _scrollCoordinatesChanged ||\r\n _directionChanged ||\r\n _force;\r\n const updateVisibility = _overflowStyleChanged || visibilityChanged || overflowChanged;\r\n const showNativeOverlaidScrollbars =\r\n showNativeOverlaidScrollbarsOption &&\r\n _nativeScrollbarsOverlaid.x &&\r\n _nativeScrollbarsOverlaid.y;\r\n\r\n const setScrollbarVisibility = (\r\n overflowBehavior: OverflowBehavior,\r\n overflowStyle: OverflowStyle,\r\n isHorizontal: boolean\r\n ) => {\r\n const isVisible =\r\n overflowBehavior.includes(strScroll) &&\r\n (visibility === strVisible || (visibility === 'auto' && overflowStyle === strScroll));\r\n\r\n _scrollbarsAddRemoveClass(classNameScrollbarVisible, isVisible, isHorizontal);\r\n\r\n return isVisible;\r\n };\r\n\r\n instanceAutoHideDelay = autoHideDelay;\r\n\r\n if (trulyAppeared) {\r\n if (autoHideSuspend && hasOverflow) {\r\n manageAutoHideSuspension(false);\r\n instanceAutoHideSuspendScrollDestroyFn();\r\n autoHideSuspendTimeout(() => {\r\n instanceAutoHideSuspendScrollDestroyFn = addEventListener(\r\n _scrollEventElement,\r\n 'scroll',\r\n bind(manageAutoHideSuspension, true),\r\n {\r\n _once: true,\r\n }\r\n );\r\n });\r\n } else {\r\n manageAutoHideSuspension(true);\r\n }\r\n }\r\n\r\n if (showNativeOverlaidScrollbarsChanged) {\r\n _scrollbarsAddRemoveClass(classNameScrollbarThemeNone, showNativeOverlaidScrollbars);\r\n }\r\n\r\n if (themeChanged) {\r\n _scrollbarsAddRemoveClass(prevTheme);\r\n _scrollbarsAddRemoveClass(theme, true);\r\n\r\n prevTheme = theme;\r\n }\r\n\r\n if (autoHideSuspendChanged && !autoHideSuspend) {\r\n manageAutoHideSuspension(true);\r\n }\r\n\r\n if (autoHideChanged) {\r\n autoHideIsMove = autoHide === 'move';\r\n autoHideIsLeave = autoHide === 'leave';\r\n autoHideIsNever = autoHide === 'never';\r\n manageScrollbarsAutoHide(autoHideIsNever, true);\r\n }\r\n\r\n if (dragScrollChanged) {\r\n _scrollbarsAddRemoveClass(classNameScrollbarHandleInteractive, dragScroll);\r\n }\r\n\r\n if (clickScrollChanged) {\r\n _scrollbarsAddRemoveClass(classNameScrollbarTrackInteractive, clickScroll);\r\n }\r\n\r\n // always update scrollbar visibility before scrollbar size\r\n // the scrollbar size is influenced whether both or just one scrollbar is visible (because of the corner element)\r\n if (updateVisibility) {\r\n const xVisible = setScrollbarVisibility(overflow.x, _overflowStyle.x, true);\r\n const yVisible = setScrollbarVisibility(overflow.y, _overflowStyle.y, false);\r\n const hasCorner = xVisible && yVisible;\r\n\r\n _scrollbarsAddRemoveClass(classNameScrollbarCornerless, !hasCorner);\r\n }\r\n\r\n // always update scrollbar sizes after the visibility\r\n if (updateScrollbars) {\r\n _refreshScrollbarsHandleOffset();\r\n _refreshScrollbarsHandleLength();\r\n _refreshScrollbarsScrollbarOffset();\r\n _scrollCoordinatesChanged && _refreshScrollbarsScrollCoordinates();\r\n\r\n _scrollbarsAddRemoveClass(classNameScrollbarUnusable, !_hasOverflow.x, true);\r\n _scrollbarsAddRemoveClass(classNameScrollbarUnusable, !_hasOverflow.y, false);\r\n _scrollbarsAddRemoveClass(classNameScrollbarRtl, _directionIsRTL && !_isBody);\r\n }\r\n },\r\n {},\r\n elements,\r\n ];\r\n};\r\n","import {\r\n isHTMLElement,\r\n appendChildren,\r\n createDiv,\r\n contents,\r\n parent,\r\n removeElements,\r\n push,\r\n runEachAndClear,\r\n removeAttrs,\r\n hasAttrClass,\r\n addEventListener,\r\n bind,\r\n inArray,\r\n addAttrClass,\r\n addRemoveAttrClass,\r\n setAttrs,\r\n getAttr,\r\n isBodyElement,\r\n getFocusedElement,\r\n wnd,\r\n focusElement,\r\n stopAndPrevent,\r\n getOffsetSize,\r\n getScrollSize,\r\n getStyles,\r\n strOverflowX,\r\n strOverflowY,\r\n} from '~/support';\r\nimport {\r\n dataAttributeHost,\r\n dataAttributeInitialize,\r\n dataAttributeViewport,\r\n dataValueViewportScrollbarHidden,\r\n dataAttributePadding,\r\n dataAttributeContent,\r\n dataAttributeHtmlBody,\r\n dataValueHostIsHost,\r\n dataValueViewportScrolling,\r\n} from '~/classnames';\r\nimport { getEnvironment } from '~/environment';\r\nimport {\r\n staticInitializationElement as generalStaticInitializationElement,\r\n dynamicInitializationElement as generalDynamicInitializationElement,\r\n} from '~/initialization';\r\nimport type {\r\n InitializationTarget,\r\n InitializationTargetElement,\r\n InitializationTargetObject,\r\n} from '~/initialization';\r\nimport { overflowIsVisible } from './structureSetup.utils';\r\n\r\nexport type StructureSetupElements = [\r\n elements: StructureSetupElementsObj,\r\n appendElements: () => () => void,\r\n canceled: () => void\r\n];\r\n\r\nexport interface StructureSetupElementsObj {\r\n _target: InitializationTargetElement;\r\n _host: HTMLElement;\r\n _viewport: HTMLElement;\r\n _padding: HTMLElement | false;\r\n _content: HTMLElement | false;\r\n _scrollOffsetElement: HTMLElement;\r\n _scrollEventElement: HTMLElement | Document;\r\n _originalScrollOffsetElement: HTMLElement;\r\n // ctx ----\r\n _isBody: boolean;\r\n _documentElm: Document;\r\n _targetIsElm: boolean;\r\n _viewportIsTarget: boolean;\r\n _windowElm: () => Window;\r\n _viewportHasClass: (viewportAttributeClassName: string) => boolean;\r\n _viewportAddRemoveClass: (viewportAttributeClassName: string, add?: boolean) => () => void;\r\n _removeScrollObscuringStyles: () => () => void;\r\n}\r\n\r\nexport const createStructureSetupElements = (\r\n target: InitializationTarget\r\n): StructureSetupElements => {\r\n const env = getEnvironment();\r\n const { _getDefaultInitialization, _nativeScrollbarsHiding } = env;\r\n const { elements: defaultInitElements } = _getDefaultInitialization();\r\n const {\r\n padding: defaultPaddingInitialization,\r\n viewport: defaultViewportInitialization,\r\n content: defaultContentInitialization,\r\n } = defaultInitElements;\r\n const targetIsElm = isHTMLElement(target);\r\n const targetStructureInitialization = (targetIsElm ? {} : target) as InitializationTargetObject;\r\n const { elements: initElements } = targetStructureInitialization;\r\n const {\r\n padding: paddingInitialization,\r\n viewport: viewportInitialization,\r\n content: contentInitialization,\r\n } = initElements || {};\r\n\r\n const targetElement = targetIsElm ? target : targetStructureInitialization.target;\r\n const isBody = isBodyElement(targetElement);\r\n const ownerDocument = targetElement.ownerDocument;\r\n const docElement = ownerDocument.documentElement;\r\n const getDocumentWindow = () => ownerDocument.defaultView || wnd;\r\n const staticInitializationElement = bind(generalStaticInitializationElement, [targetElement]);\r\n const dynamicInitializationElement = bind(generalDynamicInitializationElement, [targetElement]);\r\n const createNewDiv = bind(createDiv, '');\r\n const generateViewportElement = bind(\r\n staticInitializationElement,\r\n createNewDiv,\r\n defaultViewportInitialization\r\n );\r\n const generateContentElement = bind(\r\n dynamicInitializationElement,\r\n createNewDiv,\r\n defaultContentInitialization\r\n );\r\n const elementHasOverflow = (elm: HTMLElement) => {\r\n const offsetSize = getOffsetSize(elm);\r\n const scrollSize = getScrollSize(elm);\r\n const overflowX = getStyles(elm, strOverflowX);\r\n const overflowY = getStyles(elm, strOverflowY);\r\n\r\n return (\r\n (scrollSize.w - offsetSize.w > 0 && !overflowIsVisible(overflowX)) ||\r\n (scrollSize.h - offsetSize.h > 0 && !overflowIsVisible(overflowY))\r\n );\r\n };\r\n const possibleViewportElement = generateViewportElement(viewportInitialization);\r\n const viewportIsTarget = possibleViewportElement === targetElement;\r\n const viewportIsTargetBody = viewportIsTarget && isBody;\r\n const possibleContentElement = !viewportIsTarget && generateContentElement(contentInitialization);\r\n // edge case if passed viewportElement is contentElement:\r\n // viewport element has higher priority and content element will not be generated\r\n // will act the same way as initialization: `{ elements: { viewport, content: false } }`\r\n const viewportIsContent = !viewportIsTarget && possibleViewportElement === possibleContentElement;\r\n const viewportElement = viewportIsTargetBody ? docElement : possibleViewportElement;\r\n const hostElement = viewportIsTargetBody ? viewportElement : targetElement;\r\n const paddingElement =\r\n !viewportIsTarget &&\r\n dynamicInitializationElement(createNewDiv, defaultPaddingInitialization, paddingInitialization);\r\n const contentElement = !viewportIsContent && possibleContentElement;\r\n const generatedElements = [contentElement, viewportElement, paddingElement, hostElement].map(\r\n (elm) => isHTMLElement(elm) && !parent(elm) && elm\r\n );\r\n const elementIsGenerated = (elm: HTMLElement | false) => elm && inArray(generatedElements, elm);\r\n const originalNonBodyScrollOffsetElement =\r\n !elementIsGenerated(viewportElement) && elementHasOverflow(viewportElement)\r\n ? viewportElement\r\n : targetElement;\r\n const scrollOffsetElement = viewportIsTargetBody ? docElement : viewportElement;\r\n const scrollEventElement = viewportIsTargetBody ? ownerDocument : viewportElement;\r\n\r\n const evaluatedTargetObj: StructureSetupElementsObj = {\r\n _target: targetElement,\r\n _host: hostElement,\r\n _viewport: viewportElement,\r\n _padding: paddingElement,\r\n _content: contentElement,\r\n _scrollOffsetElement: scrollOffsetElement,\r\n _scrollEventElement: scrollEventElement,\r\n _originalScrollOffsetElement: isBody ? docElement : originalNonBodyScrollOffsetElement,\r\n _documentElm: ownerDocument,\r\n _isBody: isBody,\r\n _targetIsElm: targetIsElm,\r\n _viewportIsTarget: viewportIsTarget,\r\n _windowElm: getDocumentWindow,\r\n _viewportHasClass: (viewportAttributeClassName: string) =>\r\n hasAttrClass(viewportElement, dataAttributeViewport, viewportAttributeClassName),\r\n _viewportAddRemoveClass: (viewportAttributeClassName: string, add?: boolean) =>\r\n addRemoveAttrClass(viewportElement, dataAttributeViewport, viewportAttributeClassName, add),\r\n _removeScrollObscuringStyles: () =>\r\n addRemoveAttrClass(\r\n scrollOffsetElement,\r\n dataAttributeViewport,\r\n dataValueViewportScrolling,\r\n true\r\n ),\r\n };\r\n const { _target, _host, _padding, _viewport, _content } = evaluatedTargetObj;\r\n const destroyFns: (() => any)[] = [\r\n () => {\r\n // always remove dataAttributeHost & dataAttributeInitialize from host and from <html> element if target is body\r\n removeAttrs(_host, [dataAttributeHost, dataAttributeInitialize]);\r\n removeAttrs(_target, dataAttributeInitialize);\r\n if (isBody) {\r\n removeAttrs(docElement, [dataAttributeInitialize, dataAttributeHost]);\r\n }\r\n },\r\n ];\r\n let targetContents = contents(\r\n [_content, _viewport, _padding, _host, _target].find((elm) => elm && !elementIsGenerated(elm))\r\n );\r\n const contentSlot = viewportIsTargetBody ? _target : _content || _viewport;\r\n const destroy = bind(runEachAndClear, destroyFns);\r\n const appendElements = () => {\r\n const docWnd = getDocumentWindow();\r\n const initActiveElm = getFocusedElement();\r\n const unwrap = (elm: HTMLElement | false | null | undefined) => {\r\n appendChildren(parent(elm), contents(elm));\r\n removeElements(elm);\r\n };\r\n // wrapping / unwrapping will cause the focused element to blur, this should prevent those events to surface\r\n const prepareWrapUnwrapFocus = (activeElement: Element | false | null | undefined) =>\r\n addEventListener(activeElement, 'focusin focusout focus blur', stopAndPrevent, {\r\n _capture: true,\r\n _passive: false,\r\n });\r\n const tabIndexStr = 'tabindex';\r\n const originalViewportTabIndex = getAttr(_viewport, tabIndexStr);\r\n const undoInitWrapUndwrapFocus = prepareWrapUnwrapFocus(initActiveElm);\r\n setAttrs(_host, dataAttributeHost, viewportIsTarget ? '' : dataValueHostIsHost);\r\n setAttrs(_padding, dataAttributePadding, '');\r\n setAttrs(_viewport, dataAttributeViewport, '');\r\n setAttrs(_content, dataAttributeContent, '');\r\n\r\n if (!viewportIsTarget) {\r\n setAttrs(_viewport, tabIndexStr, originalViewportTabIndex || '-1');\r\n isBody && setAttrs(docElement, dataAttributeHtmlBody, '');\r\n }\r\n\r\n appendChildren(contentSlot, targetContents);\r\n appendChildren(_host, _padding);\r\n appendChildren(_padding || _host, !viewportIsTarget && _viewport);\r\n appendChildren(_viewport, _content);\r\n\r\n push(destroyFns, [\r\n undoInitWrapUndwrapFocus,\r\n () => {\r\n const destroyActiveElm = getFocusedElement();\r\n const viewportIsGenerated = elementIsGenerated(_viewport);\r\n // if the focused element is viewport and viewport will be destroyed shift the focus to target\r\n // otherwise keep the focused element\r\n const destroyFocusElement =\r\n viewportIsGenerated && destroyActiveElm === _viewport ? _target : destroyActiveElm;\r\n const undoDestroyWrapUndwrapFocus = prepareWrapUnwrapFocus(destroyFocusElement);\r\n removeAttrs(_padding, dataAttributePadding);\r\n removeAttrs(_content, dataAttributeContent);\r\n removeAttrs(_viewport, dataAttributeViewport);\r\n isBody && removeAttrs(docElement, dataAttributeHtmlBody);\r\n originalViewportTabIndex\r\n ? setAttrs(_viewport, tabIndexStr, originalViewportTabIndex)\r\n : removeAttrs(_viewport, tabIndexStr);\r\n\r\n elementIsGenerated(_content) && unwrap(_content);\r\n viewportIsGenerated && unwrap(_viewport);\r\n elementIsGenerated(_padding) && unwrap(_padding);\r\n focusElement(destroyFocusElement);\r\n undoDestroyWrapUndwrapFocus();\r\n },\r\n ]);\r\n\r\n if (_nativeScrollbarsHiding && !viewportIsTarget) {\r\n addAttrClass(_viewport, dataAttributeViewport, dataValueViewportScrollbarHidden);\r\n push(destroyFns, bind(removeAttrs, _viewport, dataAttributeViewport));\r\n }\r\n\r\n // keep the original focused element focused except when\r\n // the target is body and viewport is not target, then shift the focus to the viewport element\r\n focusElement(\r\n !viewportIsTarget && isBody && initActiveElm === _target && docWnd.top === docWnd\r\n ? _viewport\r\n : initActiveElm\r\n );\r\n undoInitWrapUndwrapFocus();\r\n\r\n // @ts-ignore\r\n targetContents = 0;\r\n\r\n return destroy;\r\n };\r\n\r\n return [evaluatedTargetObj, appendElements, destroy];\r\n};\r\n","import { setStyles, strHeight } from '~/support';\r\nimport type { CreateStructureUpdateSegment } from '../structureSetup';\r\n\r\n/**\r\n * Lifecycle with the responsibility to adjust the trinsic behavior of the content element.\r\n * @param structureUpdateHub\r\n * @returns\r\n */\r\nexport const createTrinsicUpdateSegment: CreateStructureUpdateSegment =\r\n ({ _content }) =>\r\n ({ _observersUpdateHints, _observersState, _force }) => {\r\n const { _heightIntrinsicChanged } = _observersUpdateHints || {};\r\n const { _heightIntrinsic } = _observersState;\r\n const heightIntrinsicChanged = _content && (_heightIntrinsicChanged || _force);\r\n\r\n if (heightIntrinsicChanged) {\r\n setStyles(_content, {\r\n [strHeight]: _heightIntrinsic && '100%',\r\n });\r\n }\r\n };\r\n","import {\r\n createCache,\r\n topRightBottomLeft,\r\n equalTRBL,\r\n assignDeep,\r\n bind,\r\n strMarginBottom,\r\n strMarginLeft,\r\n strMarginRight,\r\n strPaddingBottom,\r\n strPaddingLeft,\r\n strPaddingRight,\r\n strPaddingTop,\r\n strWidth,\r\n setStyles,\r\n} from '~/support';\r\nimport { getEnvironment } from '~/environment';\r\nimport type { StyleObject } from '~/typings';\r\nimport type { CreateStructureUpdateSegment } from '../structureSetup';\r\n\r\n/**\r\n * Lifecycle with the responsibility to adjust the padding styling of the padding and viewport element.\r\n * @param structureUpdateHub\r\n * @returns\r\n */\r\nexport const createPaddingUpdateSegment: CreateStructureUpdateSegment = (\r\n { _host, _padding, _viewport, _viewportIsTarget },\r\n state\r\n) => {\r\n const [updatePaddingCache, currentPaddingCache] = createCache(\r\n {\r\n _equal: equalTRBL,\r\n _initialValue: topRightBottomLeft(),\r\n },\r\n bind(topRightBottomLeft, _host, 'padding', '')\r\n );\r\n\r\n return ({ _checkOption, _observersUpdateHints, _observersState, _force }) => {\r\n let [padding, paddingChanged] = currentPaddingCache(_force);\r\n const { _nativeScrollbarsHiding } = getEnvironment();\r\n const { _sizeChanged, _contentMutation, _directionChanged } = _observersUpdateHints || {};\r\n const { _directionIsRTL } = _observersState;\r\n const [paddingAbsolute, paddingAbsoluteChanged] = _checkOption('paddingAbsolute');\r\n const contentMutation = _force || _contentMutation;\r\n\r\n if (_sizeChanged || paddingChanged || contentMutation) {\r\n [padding, paddingChanged] = updatePaddingCache(_force);\r\n }\r\n\r\n const paddingStyleChanged =\r\n !_viewportIsTarget && (paddingAbsoluteChanged || _directionChanged || paddingChanged);\r\n\r\n if (paddingStyleChanged) {\r\n // if there is no padding element and no scrollbar styling, paddingAbsolute isn't supported\r\n const paddingRelative = !paddingAbsolute || (!_padding && !_nativeScrollbarsHiding);\r\n const paddingHorizontal = padding.r + padding.l;\r\n const paddingVertical = padding.t + padding.b;\r\n\r\n const paddingStyle: StyleObject = {\r\n [strMarginRight]: paddingRelative && !_directionIsRTL ? -paddingHorizontal : 0,\r\n [strMarginBottom]: paddingRelative ? -paddingVertical : 0,\r\n [strMarginLeft]: paddingRelative && _directionIsRTL ? -paddingHorizontal : 0,\r\n top: paddingRelative ? -padding.t : 0,\r\n right: paddingRelative ? (_directionIsRTL ? -padding.r : 'auto') : 0,\r\n left: paddingRelative ? (_directionIsRTL ? 'auto' : -padding.l) : 0,\r\n [strWidth]: paddingRelative && `calc(100% + ${paddingHorizontal}px)`,\r\n };\r\n const viewportStyle: StyleObject = {\r\n [strPaddingTop]: paddingRelative ? padding.t : 0,\r\n [strPaddingRight]: paddingRelative ? padding.r : 0,\r\n [strPaddingBottom]: paddingRelative ? padding.b : 0,\r\n [strPaddingLeft]: paddingRelative ? padding.l : 0,\r\n };\r\n\r\n // if there is no padding element apply the style to the viewport element instead\r\n setStyles(_padding || _viewport, paddingStyle);\r\n setStyles(_viewport, viewportStyle);\r\n\r\n assignDeep(state, {\r\n _padding: padding,\r\n _paddingAbsolute: !paddingRelative,\r\n _viewportPaddingStyle: _padding\r\n ? viewportStyle\r\n : assignDeep({}, paddingStyle, viewportStyle),\r\n });\r\n }\r\n\r\n return {\r\n _paddingStyleChanged: paddingStyleChanged,\r\n };\r\n };\r\n};\r\n","import {\r\n createCache,\r\n getScrollSize,\r\n getFractionalSize,\r\n equalWH,\r\n getClientSize,\r\n equalXY,\r\n assignDeep,\r\n bind,\r\n wnd,\r\n mathMax,\r\n getWindowSize,\r\n addRemoveAttrClass,\r\n capitalizeFirstLetter,\r\n setStyles,\r\n strVisible,\r\n strHidden,\r\n keys,\r\n strScroll,\r\n scrollElementTo,\r\n getElementScroll,\r\n sanitizeScrollCoordinates,\r\n getStyles,\r\n equal,\r\n getZeroScrollCoordinates,\r\n hasDimensions,\r\n addEventListener,\r\n stopPropagation,\r\n rAF,\r\n hasAttrClass,\r\n} from '~/support';\r\nimport { getEnvironment } from '~/environment';\r\nimport {\r\n dataAttributeHost,\r\n dataValueNoClipping,\r\n dataValueViewportScrollbarHidden,\r\n dataAttributePadding,\r\n dataValueViewportOverflowXPrefix,\r\n dataValueViewportOverflowYPrefix,\r\n dataValueViewportNoContent,\r\n dataValueViewportMeasuring,\r\n} from '~/classnames';\r\nimport { getStaticPluginModuleInstance, scrollbarsHidingPluginName } from '~/plugins';\r\nimport type { ScrollCoordinates, WH, XY } from '~/support';\r\nimport type { ScrollbarsHidingPlugin } from '~/plugins/scrollbarsHidingPlugin';\r\nimport type { OverflowStyle } from '~/typings';\r\nimport type { CreateStructureUpdateSegment } from '../structureSetup';\r\nimport {\r\n createViewportOverflowState,\r\n getShowNativeOverlaidScrollbars,\r\n overflowIsVisible,\r\n} from '../structureSetup.utils';\r\n\r\ninterface FlowDirectionStyles {\r\n display?: string;\r\n direction?: string;\r\n flexDirection?: string;\r\n writingMode?: string;\r\n}\r\n\r\n/**\r\n * Lifecycle with the responsibility to set the correct overflow and scrollbar hiding styles of the viewport element.\r\n * @param structureUpdateHub\r\n * @returns\r\n */\r\nexport const createOverflowUpdateSegment: CreateStructureUpdateSegment = (\r\n structureSetupElements,\r\n structureSetupState\r\n) => {\r\n const env = getEnvironment();\r\n const {\r\n _host,\r\n _padding,\r\n _viewport,\r\n _viewportIsTarget,\r\n _scrollEventElement,\r\n _scrollOffsetElement,\r\n _isBody,\r\n _viewportAddRemoveClass,\r\n _windowElm,\r\n } = structureSetupElements;\r\n const { _nativeScrollbarsHiding } = env;\r\n const viewportIsTargetBody = _isBody && _viewportIsTarget;\r\n const max0 = bind(mathMax, 0);\r\n const flowDirectionCanBeNonDefaultMap: Record<\r\n keyof FlowDirectionStyles,\r\n (styleValue: string) => boolean\r\n > = {\r\n display: () => false,\r\n direction: (directionStyle) => directionStyle !== 'ltr',\r\n flexDirection: (flexDirectionStyle) => flexDirectionStyle.endsWith('-reverse'),\r\n writingMode: (writingModeStyle) => writingModeStyle !== 'horizontal-tb',\r\n };\r\n const flowDirectionStyleArr = keys(flowDirectionCanBeNonDefaultMap) as Array<\r\n keyof FlowDirectionStyles\r\n >;\r\n const whCacheOptions = {\r\n _equal: equalWH,\r\n _initialValue: { w: 0, h: 0 },\r\n };\r\n const partialXYOptions = {\r\n _equal: equalXY,\r\n _initialValue: {},\r\n };\r\n\r\n const setMeasuringMode = (active: boolean) => {\r\n // viewportIsTargetBody never needs measuring\r\n _viewportAddRemoveClass(dataValueViewportMeasuring, !viewportIsTargetBody && active);\r\n };\r\n\r\n const getMeasuredScrollCoordinates = (flowDirectionStyles: FlowDirectionStyles) => {\r\n const flowDirectionCanBeNonDefault = flowDirectionStyleArr.some((styleName) => {\r\n const styleValue = flowDirectionStyles[styleName];\r\n return styleValue && flowDirectionCanBeNonDefaultMap[styleName](styleValue);\r\n });\r\n\r\n // if the direction can not be non-default return default scroll coordinates (only the sign of the numbers matters)\r\n if (!flowDirectionCanBeNonDefault) {\r\n return {\r\n _start: { x: 0, y: 0 },\r\n _end: { x: 1, y: 1 },\r\n };\r\n }\r\n\r\n setMeasuringMode(true);\r\n\r\n const originalScrollOffset = getElementScroll(_scrollOffsetElement);\r\n const removeNoContent = _viewportAddRemoveClass(dataValueViewportNoContent, true);\r\n const removeScrollBlock = addEventListener(\r\n _scrollEventElement,\r\n strScroll,\r\n (event) => {\r\n const scrollEventScrollOffset = getElementScroll(_scrollOffsetElement);\r\n // if scroll offset didnt change\r\n if (\r\n event.isTrusted &&\r\n scrollEventScrollOffset.x === originalScrollOffset.x &&\r\n scrollEventScrollOffset.y === originalScrollOffset.y\r\n ) {\r\n stopPropagation(event);\r\n }\r\n },\r\n {\r\n _capture: true,\r\n _once: true,\r\n }\r\n );\r\n\r\n scrollElementTo(_scrollOffsetElement, {\r\n x: 0,\r\n y: 0,\r\n });\r\n removeNoContent();\r\n\r\n const _start = getElementScroll(_scrollOffsetElement);\r\n const scrollSize = getScrollSize(_scrollOffsetElement);\r\n scrollElementTo(_scrollOffsetElement, {\r\n x: scrollSize.w,\r\n y: scrollSize.h,\r\n });\r\n\r\n const tmp = getElementScroll(_scrollOffsetElement);\r\n scrollElementTo(_scrollOffsetElement, {\r\n // if tmp is very close start there porbably wasn't any scroll happening so scroll again in different direction\r\n x: tmp.x - _start.x < 1 && -scrollSize.w,\r\n y: tmp.y - _start.y < 1 && -scrollSize.h,\r\n });\r\n\r\n const _end = getElementScroll(_scrollOffsetElement);\r\n scrollElementTo(_scrollOffsetElement, originalScrollOffset);\r\n rAF(() => removeScrollBlock());\r\n\r\n return {\r\n _start,\r\n _end,\r\n };\r\n };\r\n const getOverflowAmount = (\r\n viewportScrollSize: WH<number>,\r\n viewportClientSize: WH<number>\r\n ): WH<number> => {\r\n const tollerance = wnd.devicePixelRatio % 1 !== 0 ? 1 : 0;\r\n const amount = {\r\n w: max0(viewportScrollSize.w - viewportClientSize.w),\r\n h: max0(viewportScrollSize.h - viewportClientSize.h),\r\n };\r\n\r\n return {\r\n w: amount.w > tollerance ? amount.w : 0,\r\n h: amount.h > tollerance ? amount.h : 0,\r\n };\r\n };\r\n const [updateSizeFraction, getCurrentSizeFraction] = createCache<WH<number>>(\r\n whCacheOptions,\r\n bind(getFractionalSize, _viewport)\r\n );\r\n const [updateViewportScrollSizeCache, getCurrentViewportScrollSizeCache] = createCache<\r\n WH<number>\r\n >(whCacheOptions, bind(getScrollSize, _viewport));\r\n const [updateOverflowAmountCache, getCurrentOverflowAmountCache] =\r\n createCache<WH<number>>(whCacheOptions);\r\n const [updateHasOverflowCache] = createCache<Partial<XY<boolean>>>(partialXYOptions);\r\n const [updateOverflowEdge, getCurrentOverflowEdgeCache] = createCache<WH<number>>(whCacheOptions);\r\n const [updateOverflowStyleCache] = createCache<Partial<XY<OverflowStyle>>>(partialXYOptions);\r\n const [updateFlowDirectionStyles] = createCache<FlowDirectionStyles>(\r\n {\r\n _equal: (currVal, newValu) => equal(currVal, newValu, flowDirectionStyleArr),\r\n _initialValue: {},\r\n },\r\n () => (hasDimensions(_viewport) ? getStyles(_viewport, flowDirectionStyleArr) : {})\r\n );\r\n const [updateMeasuredScrollCoordinates, getCurrentMeasuredScrollCoordinates] =\r\n createCache<ScrollCoordinates>({\r\n _equal: (currVal, newVal) =>\r\n equalXY(currVal._start, newVal._start) && equalXY(currVal._end, newVal._end),\r\n _initialValue: getZeroScrollCoordinates(),\r\n });\r\n\r\n const scrollbarsHidingPlugin = getStaticPluginModuleInstance<typeof ScrollbarsHidingPlugin>(\r\n scrollbarsHidingPluginName\r\n );\r\n\r\n const createViewportOverflowStyleClassName = (\r\n overflowStyle: OverflowStyle,\r\n isHorizontal?: boolean\r\n ) => {\r\n const prefix = isHorizontal\r\n ? dataValueViewportOverflowXPrefix\r\n : dataValueViewportOverflowYPrefix;\r\n return `${prefix}${capitalizeFirstLetter(overflowStyle)}`;\r\n };\r\n const setViewportOverflowStyle = (viewportOverflowStyle: XY<OverflowStyle>) => {\r\n // `createAllOverflowStyleClassNames` and `allOverflowStyleClassNames` could be one scope further up but would increase bundle size\r\n const createAllOverflowStyleClassNames = (isHorizontal?: boolean) =>\r\n ([strVisible, strHidden, strScroll] as OverflowStyle[]).map((style) =>\r\n createViewportOverflowStyleClassName(style, isHorizontal)\r\n );\r\n const allOverflowStyleClassNames = createAllOverflowStyleClassNames(true)\r\n .concat(createAllOverflowStyleClassNames())\r\n .join(' ');\r\n\r\n _viewportAddRemoveClass(allOverflowStyleClassNames);\r\n _viewportAddRemoveClass(\r\n (keys(viewportOverflowStyle) as Array<keyof typeof viewportOverflowStyle>)\r\n .map((axis) =>\r\n createViewportOverflowStyleClassName(viewportOverflowStyle[axis], axis === 'x')\r\n )\r\n .join(' '),\r\n true\r\n );\r\n };\r\n\r\n return (\r\n { _checkOption, _observersUpdateHints, _observersState, _force },\r\n { _paddingStyleChanged }\r\n ) => {\r\n const { _sizeChanged, _contentMutation, _directionChanged, _appear, _scrollbarSizeChanged } =\r\n _observersUpdateHints || {};\r\n const scrollbarsHidingPluginViewportArrangement =\r\n scrollbarsHidingPlugin &&\r\n scrollbarsHidingPlugin._viewportArrangement(\r\n structureSetupElements,\r\n structureSetupState,\r\n _observersState,\r\n env,\r\n _checkOption\r\n );\r\n\r\n const { _arrangeViewport, _undoViewportArrange, _hideNativeScrollbars } =\r\n scrollbarsHidingPluginViewportArrangement || {};\r\n\r\n const [showNativeOverlaidScrollbars, showNativeOverlaidScrollbarsChanged] =\r\n getShowNativeOverlaidScrollbars(_checkOption, env);\r\n const [overflow, overflowChanged] = _checkOption('overflow');\r\n const overflowXVisible = overflowIsVisible(overflow.x);\r\n const overflowYVisible = overflowIsVisible(overflow.y);\r\n\r\n const viewportChanged =\r\n true ||\r\n _sizeChanged ||\r\n _paddingStyleChanged ||\r\n _contentMutation ||\r\n _directionChanged ||\r\n _scrollbarSizeChanged ||\r\n showNativeOverlaidScrollbarsChanged;\r\n\r\n let sizeFractionCache = getCurrentSizeFraction(_force);\r\n let viewportScrollSizeCache = getCurrentViewportScrollSizeCache(_force);\r\n let overflowAmuntCache = getCurrentOverflowAmountCache(_force);\r\n let overflowEdgeCache = getCurrentOverflowEdgeCache(_force);\r\n\r\n if (showNativeOverlaidScrollbarsChanged && _nativeScrollbarsHiding) {\r\n _viewportAddRemoveClass(dataValueViewportScrollbarHidden, !showNativeOverlaidScrollbars);\r\n }\r\n\r\n if (viewportChanged) {\r\n if (hasAttrClass(_host, dataAttributeHost, dataValueNoClipping)) {\r\n setMeasuringMode(true);\r\n }\r\n\r\n const [redoViewportArrange] = _undoViewportArrange ? _undoViewportArrange() : [];\r\n\r\n const [sizeFraction] = (sizeFractionCache = updateSizeFraction(_force));\r\n const [viewportScrollSize] = (viewportScrollSizeCache =\r\n updateViewportScrollSizeCache(_force));\r\n const viewportClientSize = getClientSize(_viewport);\r\n const windowInnerSize = viewportIsTargetBody && getWindowSize(_windowElm());\r\n const overflowAmountScrollSize = {\r\n w: max0(viewportScrollSize.w + sizeFraction.w),\r\n h: max0(viewportScrollSize.h + sizeFraction.h),\r\n };\r\n\r\n const overflowAmountClientSize = {\r\n w: max0(\r\n (windowInnerSize\r\n ? windowInnerSize.w\r\n : viewportClientSize.w + max0(viewportClientSize.w - viewportScrollSize.w)) +\r\n sizeFraction.w\r\n ),\r\n h: max0(\r\n (windowInnerSize\r\n ? windowInnerSize.h\r\n : viewportClientSize.h + max0(viewportClientSize.h - viewportScrollSize.h)) +\r\n sizeFraction.h\r\n ),\r\n };\r\n\r\n redoViewportArrange && redoViewportArrange();\r\n\r\n overflowEdgeCache = updateOverflowEdge(overflowAmountClientSize);\r\n overflowAmuntCache = updateOverflowAmountCache(\r\n getOverflowAmount(overflowAmountScrollSize, overflowAmountClientSize),\r\n _force\r\n );\r\n }\r\n\r\n const [overflowEdge, overflowEdgeChanged] = overflowEdgeCache;\r\n const [overflowAmount, overflowAmountChanged] = overflowAmuntCache;\r\n const [viewportScrollSize, viewportScrollSizeChanged] = viewportScrollSizeCache;\r\n const [sizeFraction, sizeFractionChanged] = sizeFractionCache;\r\n const [hasOverflow, hasOverflowChanged] = updateHasOverflowCache({\r\n x: overflowAmount.w > 0,\r\n y: overflowAmount.h > 0,\r\n });\r\n const removeClipping =\r\n (overflowXVisible && overflowYVisible && (hasOverflow.x || hasOverflow.y)) ||\r\n (overflowXVisible && hasOverflow.x && !hasOverflow.y) ||\r\n (overflowYVisible && hasOverflow.y && !hasOverflow.x);\r\n const adjustViewportStyle =\r\n _paddingStyleChanged ||\r\n _directionChanged ||\r\n _scrollbarSizeChanged ||\r\n sizeFractionChanged ||\r\n viewportScrollSizeChanged ||\r\n overflowEdgeChanged ||\r\n overflowAmountChanged ||\r\n overflowChanged ||\r\n showNativeOverlaidScrollbarsChanged ||\r\n viewportChanged;\r\n const viewportOverflowState = createViewportOverflowState(hasOverflow, overflow);\r\n const [overflowStyle, overflowStyleChanged] = updateOverflowStyleCache(\r\n viewportOverflowState._overflowStyle\r\n );\r\n const [flowDirectionStyles, flowDirectionStylesChanged] = updateFlowDirectionStyles(_force);\r\n\r\n const adjustMeasuredScrollCoordinates =\r\n _directionChanged || _appear || flowDirectionStylesChanged || hasOverflowChanged || _force;\r\n const [scrollCoordinates, scrollCoordinatesChanged] = adjustMeasuredScrollCoordinates\r\n ? updateMeasuredScrollCoordinates(getMeasuredScrollCoordinates(flowDirectionStyles), _force)\r\n : getCurrentMeasuredScrollCoordinates();\r\n\r\n if (adjustViewportStyle) {\r\n overflowStyleChanged && setViewportOverflowStyle(viewportOverflowState._overflowStyle);\r\n\r\n if (_hideNativeScrollbars && _arrangeViewport) {\r\n setStyles(\r\n _viewport,\r\n _hideNativeScrollbars(\r\n viewportOverflowState,\r\n _observersState,\r\n _arrangeViewport(viewportOverflowState, viewportScrollSize, sizeFraction)\r\n )\r\n );\r\n }\r\n }\r\n\r\n setMeasuringMode(false);\r\n\r\n addRemoveAttrClass(_host, dataAttributeHost, dataValueNoClipping, removeClipping);\r\n addRemoveAttrClass(_padding, dataAttributePadding, dataValueNoClipping, removeClipping);\r\n\r\n assignDeep(structureSetupState, {\r\n _overflowStyle: overflowStyle,\r\n _overflowEdge: {\r\n x: overflowEdge.w,\r\n y: overflowEdge.h,\r\n },\r\n _overflowAmount: {\r\n x: overflowAmount.w,\r\n y: overflowAmount.h,\r\n },\r\n _hasOverflow: hasOverflow,\r\n _scrollCoordinates: sanitizeScrollCoordinates(scrollCoordinates, overflowAmount),\r\n });\r\n\r\n return {\r\n _overflowStyleChanged: overflowStyleChanged,\r\n _overflowEdgeChanged: overflowEdgeChanged,\r\n _overflowAmountChanged: overflowAmountChanged,\r\n _scrollCoordinatesChanged: scrollCoordinatesChanged || overflowAmountChanged,\r\n _scrolled: adjustMeasuredScrollCoordinates,\r\n };\r\n };\r\n};\r\n","import { getEnvironment } from '~/environment';\r\nimport {\r\n assignDeep,\r\n each,\r\n getElementScroll,\r\n getZeroScrollCoordinates,\r\n scrollElementTo,\r\n strHidden,\r\n strMarginBottom,\r\n strMarginLeft,\r\n strMarginRight,\r\n strPaddingBottom,\r\n strPaddingLeft,\r\n strPaddingRight,\r\n strPaddingTop,\r\n type TRBL,\r\n type XY,\r\n} from '~/support';\r\nimport type { ScrollCoordinates } from '~/support';\r\nimport type { StructureSetupElementsObj } from './structureSetup.elements';\r\nimport type {\r\n ObserversSetupState,\r\n ObserversSetupUpdateHints,\r\n Setup,\r\n SetupUpdateInfo,\r\n} from '~/setups';\r\nimport type { InitializationTarget } from '~/initialization';\r\nimport type { StyleObject, OverflowStyle } from '~/typings';\r\nimport { createStructureSetupElements } from './structureSetup.elements';\r\nimport {\r\n createOverflowUpdateSegment,\r\n createPaddingUpdateSegment,\r\n createTrinsicUpdateSegment,\r\n} from './updateSegments';\r\n\r\nexport interface StructureSetupState {\r\n _padding: TRBL;\r\n _paddingAbsolute: boolean;\r\n _viewportPaddingStyle: StyleObject;\r\n _overflowEdge: XY<number>;\r\n _overflowAmount: XY<number>;\r\n _overflowStyle: XY<OverflowStyle>;\r\n _hasOverflow: XY<boolean>;\r\n _scrollCoordinates: ScrollCoordinates;\r\n}\r\n\r\nexport interface StructureSetupUpdateInfo extends SetupUpdateInfo {\r\n _observersState: ObserversSetupState;\r\n _observersUpdateHints?: ObserversSetupUpdateHints;\r\n}\r\n\r\nexport type StructureSetupUpdateHints = {\r\n _overflowEdgeChanged?: boolean;\r\n _overflowAmountChanged?: boolean;\r\n _overflowStyleChanged?: boolean;\r\n _paddingStyleChanged?: boolean;\r\n _scrollCoordinatesChanged?: boolean;\r\n};\r\n\r\nexport type StructureSetup = [\r\n ...Setup<StructureSetupUpdateInfo, StructureSetupState, StructureSetupUpdateHints>,\r\n /** The elements created by the structure setup. */\r\n StructureSetupElementsObj,\r\n /** Function to be called when the initialization was canceled. */\r\n () => void\r\n];\r\n\r\nexport type StructureUpdateSegment = (\r\n updateInfo: StructureSetupUpdateInfo,\r\n updateHints: Readonly<StructureSetupUpdateHints>\r\n) => StructureSetupUpdateHints | void;\r\n\r\nexport type CreateStructureUpdateSegment = (\r\n structureSetupElements: StructureSetupElementsObj,\r\n state: StructureSetupState\r\n) => StructureUpdateSegment;\r\n\r\nexport const createStructureSetup = (target: InitializationTarget): StructureSetup => {\r\n const [elements, appendStructureElements, canceled] = createStructureSetupElements(target);\r\n const state: StructureSetupState = {\r\n _padding: {\r\n t: 0,\r\n r: 0,\r\n b: 0,\r\n l: 0,\r\n },\r\n _paddingAbsolute: false,\r\n _viewportPaddingStyle: {\r\n [strMarginRight]: 0,\r\n [strMarginBottom]: 0,\r\n [strMarginLeft]: 0,\r\n [strPaddingTop]: 0,\r\n [strPaddingRight]: 0,\r\n [strPaddingBottom]: 0,\r\n [strPaddingLeft]: 0,\r\n },\r\n _overflowEdge: { x: 0, y: 0 },\r\n _overflowAmount: { x: 0, y: 0 },\r\n _overflowStyle: {\r\n x: strHidden,\r\n y: strHidden,\r\n },\r\n _hasOverflow: {\r\n x: false,\r\n y: false,\r\n },\r\n _scrollCoordinates: getZeroScrollCoordinates(),\r\n };\r\n const { _target, _scrollOffsetElement, _viewportIsTarget, _removeScrollObscuringStyles } =\r\n elements;\r\n const { _nativeScrollbarsHiding, _nativeScrollbarsOverlaid } = getEnvironment();\r\n const doViewportArrange =\r\n !_nativeScrollbarsHiding && (_nativeScrollbarsOverlaid.x || _nativeScrollbarsOverlaid.y);\r\n\r\n const updateSegments: StructureUpdateSegment[] = [\r\n createTrinsicUpdateSegment(elements, state),\r\n createPaddingUpdateSegment(elements, state),\r\n createOverflowUpdateSegment(elements, state),\r\n ];\r\n\r\n return [\r\n appendStructureElements,\r\n (updateInfo) => {\r\n const updateHints: StructureSetupUpdateHints = {};\r\n const adjustScrollOffset = doViewportArrange;\r\n const scrollOffset = adjustScrollOffset && getElementScroll(_scrollOffsetElement);\r\n const revertScrollObscuringStyles = scrollOffset && _removeScrollObscuringStyles();\r\n\r\n each(updateSegments, (updateSegment) => {\r\n assignDeep(updateHints, updateSegment(updateInfo, updateHints) || {});\r\n });\r\n\r\n scrollElementTo(_scrollOffsetElement, scrollOffset);\r\n revertScrollObscuringStyles && revertScrollObscuringStyles();\r\n !_viewportIsTarget && scrollElementTo(_target, 0);\r\n\r\n return updateHints;\r\n },\r\n state,\r\n elements,\r\n canceled,\r\n ];\r\n};\r\n","import {\r\n assignDeep,\r\n bind,\r\n getElementScroll,\r\n isEmptyObject,\r\n keys,\r\n runEachAndClear,\r\n scrollElementTo,\r\n} from '~/support';\r\nimport { createOptionCheck } from '~/options';\r\nimport type { OptionsCheckFn, Options, PartialOptions, ReadonlyOptions } from '~/options';\r\nimport type { DeepReadonly } from '~/typings';\r\nimport type { InitializationTarget } from '~/initialization';\r\nimport type { ObserversSetupState, ObserversSetupUpdateHints } from './observersSetup';\r\nimport type { StructureSetupState, StructureSetupUpdateHints } from './structureSetup';\r\nimport type { StructureSetupElementsObj } from './structureSetup/structureSetup.elements';\r\nimport type { ScrollbarsSetupElementsObj } from './scrollbarsSetup/scrollbarsSetup.elements';\r\nimport { createObserversSetup } from './observersSetup';\r\nimport { createScrollbarsSetup } from './scrollbarsSetup';\r\nimport { createStructureSetup } from './structureSetup';\r\n\r\nexport type SetupUpdateHints = Partial<Record<string, boolean>>;\r\n\r\nexport type SetupUpdateInfo = {\r\n _checkOption: OptionsCheckFn<Options>;\r\n _changedOptions: PartialOptions;\r\n _force: boolean;\r\n};\r\n\r\nexport type Setup<\r\n U extends SetupUpdateInfo,\r\n S extends Readonly<Record<string, any>>,\r\n H extends SetupUpdateHints | void\r\n> = [\r\n /** The create function which returns the `destroy` function. */\r\n _create: () => () => void,\r\n /** Function which updates the setup and returns the update result. */\r\n _update: (updateInfo: U) => H,\r\n /** Function which returns the current state. */\r\n _state: S\r\n];\r\n\r\nexport interface SetupsUpdateInfo {\r\n /** The options that changed or `undefined` if none changed. */\r\n _changedOptions?: PartialOptions;\r\n /** Whether chache should be ignored. */\r\n _force?: boolean;\r\n /** Whether observers should take their records and thus update as well. */\r\n _takeRecords?: boolean;\r\n /** Whether one or more scrollbars has been cloned. */\r\n _cloneScrollbar?: boolean;\r\n}\r\n\r\nexport interface SetupsUpdateHints {\r\n readonly _observersUpdateHints: DeepReadonly<ObserversSetupUpdateHints>;\r\n readonly _structureUpdateHints: DeepReadonly<StructureSetupUpdateHints>;\r\n}\r\n\r\nexport interface SetupsState {\r\n readonly _observersSetupState: DeepReadonly<ObserversSetupState>;\r\n readonly _structureSetupState: DeepReadonly<StructureSetupState>;\r\n}\r\n\r\nexport interface SetupsElements {\r\n readonly _structureSetupElements: DeepReadonly<StructureSetupElementsObj>;\r\n readonly _scrollbarsSetupElements: DeepReadonly<ScrollbarsSetupElementsObj>;\r\n}\r\n\r\nexport type Setups = [\r\n construct: () => () => void,\r\n update: (updateInfo: SetupsUpdateInfo) => boolean,\r\n getState: () => SetupsState,\r\n elements: SetupsElements,\r\n canceled: () => void\r\n];\r\n\r\nexport const createSetups = (\r\n target: InitializationTarget,\r\n options: ReadonlyOptions,\r\n isDestroyed: () => boolean,\r\n onUpdated: (updateInfo: SetupsUpdateInfo, updateHints: SetupsUpdateHints) => void,\r\n onScroll: (scrollEvent: Event) => void\r\n): Setups => {\r\n let cacheAndOptionsInitialized = false;\r\n const getCurrentOption = createOptionCheck(options, {});\r\n const [\r\n structureSetupCreate,\r\n structureSetupUpdate,\r\n structureSetupState,\r\n structureSetupElements,\r\n structureSetupCanceled,\r\n ] = createStructureSetup(target);\r\n const [observersSetupCreate, observersSetupUpdate, observersSetupState] = createObserversSetup(\r\n structureSetupElements,\r\n structureSetupState,\r\n getCurrentOption,\r\n (observersUpdateHints) => {\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n update({}, observersUpdateHints);\r\n }\r\n );\r\n const [scrollbarsSetupCreate, scrollbarsSetupUpdate, , scrollbarsSetupElements] =\r\n createScrollbarsSetup(\r\n target,\r\n options,\r\n observersSetupState,\r\n structureSetupState,\r\n structureSetupElements,\r\n onScroll\r\n );\r\n\r\n const updateHintsAreTruthy = (hints: SetupUpdateHints) =>\r\n keys(hints).some((key) => !!hints[key as keyof typeof hints]);\r\n\r\n const update = (\r\n updateInfo: SetupsUpdateInfo,\r\n observerUpdateHints?: ObserversSetupUpdateHints\r\n ): boolean => {\r\n if (isDestroyed()) {\r\n return false;\r\n }\r\n\r\n const {\r\n _changedOptions: rawChangedOptions,\r\n _force: rawForce,\r\n _takeRecords,\r\n _cloneScrollbar,\r\n } = updateInfo;\r\n\r\n const _changedOptions = rawChangedOptions || {};\r\n const _force = !!rawForce || !cacheAndOptionsInitialized;\r\n const baseUpdateInfoObj: SetupUpdateInfo = {\r\n _checkOption: createOptionCheck(options, _changedOptions, _force),\r\n _changedOptions,\r\n _force,\r\n };\r\n\r\n if (_cloneScrollbar) {\r\n scrollbarsSetupUpdate(baseUpdateInfoObj);\r\n return false;\r\n }\r\n\r\n const observersHints =\r\n observerUpdateHints ||\r\n observersSetupUpdate(\r\n assignDeep({}, baseUpdateInfoObj, {\r\n _takeRecords,\r\n })\r\n );\r\n\r\n const structureHints = structureSetupUpdate(\r\n assignDeep({}, baseUpdateInfoObj, {\r\n _observersState: observersSetupState,\r\n _observersUpdateHints: observersHints,\r\n })\r\n );\r\n\r\n scrollbarsSetupUpdate(\r\n assignDeep({}, baseUpdateInfoObj, {\r\n _observersUpdateHints: observersHints,\r\n _structureUpdateHints: structureHints,\r\n })\r\n );\r\n\r\n const truthyObserversHints = updateHintsAreTruthy(observersHints);\r\n const truthyStructureHints = updateHintsAreTruthy(structureHints);\r\n const changed =\r\n truthyObserversHints || truthyStructureHints || !isEmptyObject(_changedOptions) || _force;\r\n\r\n cacheAndOptionsInitialized = true;\r\n\r\n changed &&\r\n onUpdated(updateInfo, {\r\n _observersUpdateHints: observersHints,\r\n _structureUpdateHints: structureHints,\r\n });\r\n\r\n return changed;\r\n };\r\n\r\n return [\r\n () => {\r\n const { _originalScrollOffsetElement, _scrollOffsetElement, _removeScrollObscuringStyles } =\r\n structureSetupElements;\r\n const initialScroll = getElementScroll(_originalScrollOffsetElement);\r\n const destroyFns = [observersSetupCreate(), structureSetupCreate(), scrollbarsSetupCreate()];\r\n const revertScrollObscuringStyles = _removeScrollObscuringStyles();\r\n\r\n scrollElementTo(_scrollOffsetElement, initialScroll);\r\n revertScrollObscuringStyles();\r\n\r\n return bind(runEachAndClear, destroyFns);\r\n },\r\n update,\r\n () => ({\r\n _observersSetupState: observersSetupState,\r\n _structureSetupState: structureSetupState,\r\n }),\r\n {\r\n _structureSetupElements: structureSetupElements,\r\n _scrollbarsSetupElements: scrollbarsSetupElements,\r\n },\r\n structureSetupCanceled,\r\n ];\r\n};\r\n","import {\r\n assignDeep,\r\n isEmptyObject,\r\n isFunction,\r\n isHTMLElement,\r\n createEventListenerHub,\r\n isPlainObject,\r\n keys,\r\n isArray,\r\n push,\r\n runEachAndClear,\r\n bind,\r\n removeUndefinedProperties,\r\n} from '~/support';\r\nimport { getOptionsDiff } from '~/options';\r\nimport { getEnvironment } from '~/environment';\r\nimport { cancelInitialization } from '~/initialization';\r\nimport { addInstance, getInstance, removeInstance } from '~/instances';\r\nimport { createSetups } from '~/setups';\r\nimport {\r\n addPlugins,\r\n getStaticPluginModuleInstance,\r\n optionsValidationPluginModuleName,\r\n pluginModules,\r\n registerPluginModuleInstances,\r\n} from '~/plugins';\r\nimport type { XY, TRBL } from '~/support';\r\nimport type { Options, PartialOptions, ReadonlyOptions } from '~/options';\r\nimport type {\r\n InferInstancePluginModuleInstance,\r\n InferStaticPluginModuleInstance,\r\n InstancePlugin,\r\n OptionsValidationPlugin,\r\n Plugin,\r\n PluginModuleInstance,\r\n StaticPlugin,\r\n} from '~/plugins';\r\nimport type { Initialization, InitializationTarget, PartialInitialization } from '~/initialization';\r\nimport type { OverflowStyle } from '~/typings';\r\nimport type { EventListenerArgs, EventListener, EventListeners } from '~/eventListeners';\r\nimport type {\r\n ScrollbarsSetupElement,\r\n ScrollbarStructure,\r\n} from '~/setups/scrollbarsSetup/scrollbarsSetup.elements';\r\nimport { setNonce } from './nonce';\r\n\r\n// Notes:\r\n// Height intrinsic detection use \"content: true\" init strategy - or open ticket for custom height intrinsic observer\r\n\r\n/**\r\n * Describes the OverlayScrollbars environment.\r\n */\r\nexport interface Environment {\r\n /** The native scrollbars size of the browser / system. */\r\n scrollbarsSize: XY<number>;\r\n /** Whether the native scrollbars are overlaid. */\r\n scrollbarsOverlaid: XY<boolean>;\r\n /** Whether the browser supports native scrollbars hiding. */\r\n scrollbarsHiding: boolean;\r\n /** Whether the browser supports the ScrollTimeline API. */\r\n scrollTimeline: boolean;\r\n /** The default Initialization to use if nothing else is specified. */\r\n staticDefaultInitialization: Initialization;\r\n /** The default Options to use if nothing else is specified. */\r\n staticDefaultOptions: Options;\r\n\r\n /** Returns the current default Initialization. */\r\n getDefaultInitialization(): Initialization;\r\n /** Returns the current default Options. */\r\n getDefaultOptions(): Options;\r\n\r\n /**\r\n * Sets a new default Initialization.\r\n * If the new default Initialization is partially filled, its deeply merged with the current default Initialization.\r\n * @param newDefaultInitialization The new default Initialization.\r\n * @returns The current default Initialization.\r\n */\r\n setDefaultInitialization(newDefaultInitialization: PartialInitialization): Initialization;\r\n /**\r\n * Sets new default Options.\r\n * If the new default Options are partially filled, they're deeply merged with the current default Options.\r\n * @param newDefaultOptions The new default Options.\r\n * @returns The current default options.\r\n */\r\n setDefaultOptions(newDefaultOptions: PartialOptions): Options;\r\n}\r\n\r\n/**\r\n * The primary entry point to OverlayScrollbars.\r\n */\r\nexport interface OverlayScrollbarsStatic {\r\n /**\r\n * Returns the current OverlayScrollbars instance if the target already has an instance.\r\n * @param target The initialization target to from which the instance shall be returned.\r\n */\r\n (target: InitializationTarget): OverlayScrollbars | undefined;\r\n /**\r\n * Initializes a new OverlayScrollbars instance to the given target\r\n * or returns the current OverlayScrollbars instance if the target already has an instance.\r\n * @param target The target.\r\n * @param options The options. (Can be just an empty object)\r\n * @param eventListeners Optional event listeners.\r\n */\r\n (\r\n target: InitializationTarget,\r\n options: PartialOptions,\r\n eventListeners?: EventListeners\r\n ): OverlayScrollbars;\r\n\r\n /**\r\n * Checks whether the passed value is a valid and not destroyed overlayscrollbars instance.\r\n * @param osInstance The value which shall be checked.\r\n */\r\n valid(osInstance: any): osInstance is OverlayScrollbars;\r\n /**\r\n * Gets the environment.\r\n */\r\n env(): Environment;\r\n /**\r\n * Sets the nonce attribute for inline styles.\r\n */\r\n nonce(newNonce: string | undefined): void;\r\n /**\r\n * Adds a single plugin.\r\n * @param plugin The plugin to be added.\r\n * @returns The plugins static modules instance or `void` if no instance was found.\r\n */\r\n plugin<P extends Plugin>(\r\n plugin: P\r\n ): P extends StaticPlugin ? InferStaticPluginModuleInstance<P> : void;\r\n /**\r\n * Adds multiple plugins.\r\n * @param plugins The plugins to be added.\r\n * @returns The plugins static modules instances or `void` if no instance was found.\r\n */\r\n plugin<P extends [Plugin, ...Plugin[]]>(\r\n plugins: P\r\n ): P extends [Plugin, ...Plugin[]]\r\n ? {\r\n [K in keyof P]: P[K] extends StaticPlugin ? InferStaticPluginModuleInstance<P[K]> : void;\r\n }\r\n : void;\r\n}\r\n\r\n/**\r\n * Describes a OverlayScrollbars instances state.\r\n */\r\nexport interface State {\r\n /** Describes the current padding in pixel. */\r\n padding: TRBL;\r\n /** Whether the current padding is absolute. */\r\n paddingAbsolute: boolean;\r\n /** The client width (x) & height (y) of the viewport in pixel. */\r\n overflowEdge: XY<number>;\r\n /** The overflow amount in pixel. */\r\n overflowAmount: XY<number>;\r\n /** The css overflow style of the viewport. */\r\n overflowStyle: XY<OverflowStyle>;\r\n /** Whether the viewport has an overflow. */\r\n hasOverflow: XY<boolean>;\r\n /** The scroll coordinates of the viewport. */\r\n scrollCoordinates: {\r\n /** The start (origin) scroll coordinates for each axis. */\r\n start: XY<number>;\r\n /** The end scroll coordinates for each axis. */\r\n end: XY<number>;\r\n };\r\n /** Whether the direction is considered rtl. */\r\n directionRTL: boolean;\r\n /** Whether the instance is considered destroyed. */\r\n destroyed: boolean;\r\n}\r\n\r\n/**\r\n * Describes the elements of a scrollbar.\r\n */\r\nexport interface ScrollbarElements {\r\n /**\r\n * The root element of the scrollbar.\r\n * The HTML structure looks like this:\r\n * <scrollbar>\r\n * <track>\r\n * <handle />\r\n * </track>\r\n * </scrollbar>\r\n */\r\n scrollbar: HTMLElement;\r\n /** The track element of the scrollbar. */\r\n track: HTMLElement;\r\n /** The handle element of the scrollbar. */\r\n handle: HTMLElement;\r\n}\r\n\r\n/**\r\n * Describes the elements of a scrollbar and provides the possibility to clone them.\r\n */\r\nexport interface CloneableScrollbarElements extends ScrollbarElements {\r\n /**\r\n * Clones the current scrollbar and returns the cloned elements.\r\n * The returned elements aren't added to the DOM.\r\n */\r\n clone(): ScrollbarElements;\r\n}\r\n\r\n/**\r\n * Describes the elements of a OverlayScrollbars instance.\r\n */\r\nexport interface Elements {\r\n /** The element the instance was applied to. */\r\n target: HTMLElement;\r\n /** The host element. Its the root of all other elements. */\r\n host: HTMLElement;\r\n /**\r\n * The element which is responsible to apply correct paddings.\r\n * Depending on the Initialization it can be the same as the viewport element.\r\n */\r\n padding: HTMLElement;\r\n /** The element which is responsible to do any scrolling. */\r\n viewport: HTMLElement;\r\n /**\r\n * The element which is responsible to hold the content.\r\n * Depending on the Initialization it can be the same as the viewport element.\r\n */\r\n content: HTMLElement;\r\n /**\r\n * The element through which you can get the current `scrollLeft` or `scrollTop` offset.\r\n * Depending on the target element it can be the same as the viewport element.\r\n */\r\n scrollOffsetElement: HTMLElement;\r\n /**\r\n * The element through which you can add `scroll` events.\r\n * Depending on the target element it can be the same as the viewport element.\r\n */\r\n scrollEventElement: HTMLElement | Document;\r\n /** The horizontal scrollbar elements. */\r\n scrollbarHorizontal: CloneableScrollbarElements;\r\n /** The vertical scrollbar elements. */\r\n scrollbarVertical: CloneableScrollbarElements;\r\n}\r\n\r\n/**\r\n * Describes a OverlayScrollbars instance.\r\n */\r\nexport interface OverlayScrollbars {\r\n /** Gets the current options of the instance. */\r\n options(): Options;\r\n /**\r\n * Sets the options of the instance.\r\n * If the new options are partially filled, they're deeply merged with either the current options or the current default options.\r\n * @param newOptions The new options which should be applied.\r\n * @param pure Whether the options should be reset before the new options are added.\r\n * @returns Returns the current options of the instance.\r\n */\r\n options(newOptions: PartialOptions, pure?: boolean): Options;\r\n\r\n /**\r\n * Adds event listeners to the instance.\r\n * @param eventListeners An object which contains the added listeners.\r\n * @param pure Whether all already added event listeners should be removed before the new listeners are added.\r\n * @returns Returns a function which removes the added listeners.\r\n */\r\n on(eventListeners: EventListeners, pure?: boolean): () => void;\r\n /**\r\n * Adds a single event listener to the instance.\r\n * @param name The name of the event.\r\n * @param listener The listener which is invoked on that event.\r\n * @returns Returns a function which removes the added listeners.\r\n */\r\n on<N extends keyof EventListenerArgs>(name: N, listener: EventListener<N>): () => void;\r\n /**\r\n * Adds multiple event listeners to the instance.\r\n * @param name The name of the event.\r\n * @param listener The listeners which are invoked on that event.\r\n * @returns Returns a function which removes the added listeners.\r\n */\r\n on<N extends keyof EventListenerArgs>(name: N, listener: EventListener<N>[]): () => void;\r\n\r\n /**\r\n * Removes a single event listener from the instance.\r\n * @param name The name of the event.\r\n * @param listener The listener which shall be removed.\r\n */\r\n off<N extends keyof EventListenerArgs>(name: N, listener: EventListener<N>): void;\r\n /**\r\n * Removes multiple event listeners from the instance.\r\n * @param name The name of the event.\r\n * @param listener The listeners which shall be removed.\r\n */\r\n off<N extends keyof EventListenerArgs>(name: N, listener: EventListener<N>[]): void;\r\n\r\n /**\r\n * Updates the instance.\r\n * @param force Whether the update should force the cache to be invalidated.\r\n * @returns A boolean which indicates whether the `update` event was triggered through this update.\r\n * The update event is only triggered if something changed because of this update.\r\n */\r\n update(force?: boolean): boolean;\r\n /** Returns the state of the instance. */\r\n state(): State;\r\n /** Returns the elements of the instance. */\r\n elements(): Elements;\r\n /** Destroys the instance and removes all added elements. */\r\n destroy(): void;\r\n /** Returns the instance of the passed plugin or `undefined` if no instance was found. */\r\n plugin<P extends InstancePlugin>(osPlugin: P): InferInstancePluginModuleInstance<P> | undefined;\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-redeclare\r\nexport const OverlayScrollbars: OverlayScrollbarsStatic = (\r\n target: InitializationTarget,\r\n options?: PartialOptions,\r\n eventListeners?: EventListeners\r\n) => {\r\n const { _getDefaultOptions } = getEnvironment();\r\n const targetIsElement = isHTMLElement(target);\r\n const instanceTarget = targetIsElement ? target : target.target;\r\n const potentialInstance = getInstance(instanceTarget);\r\n if (options && !potentialInstance) {\r\n let destroyed = false;\r\n const destroyFns: (() => void)[] = [];\r\n const instancePluginModuleInstances: Record<string, PluginModuleInstance> = {};\r\n const validateOptions = (newOptions: PartialOptions) => {\r\n const newOptionsWithoutUndefined = removeUndefinedProperties(newOptions, true);\r\n const pluginValidate = getStaticPluginModuleInstance<typeof OptionsValidationPlugin>(\r\n optionsValidationPluginModuleName\r\n );\r\n return pluginValidate\r\n ? pluginValidate(newOptionsWithoutUndefined, true)\r\n : newOptionsWithoutUndefined;\r\n };\r\n const currentOptions: ReadonlyOptions = assignDeep(\r\n {},\r\n _getDefaultOptions(),\r\n validateOptions(options)\r\n );\r\n const [addPluginEvent, removePluginEvents, triggerPluginEvent] =\r\n createEventListenerHub<EventListenerArgs>();\r\n const [addInstanceEvent, removeInstanceEvents, triggerInstanceEvent] =\r\n createEventListenerHub(eventListeners);\r\n const triggerEvent: typeof triggerPluginEvent = (name, args) => {\r\n triggerInstanceEvent(name, args);\r\n triggerPluginEvent(name, args);\r\n };\r\n const [setupsConstruct, setupsUpdate, setupsState, setupsElements, setupsCanceled] =\r\n createSetups(\r\n target,\r\n currentOptions,\r\n () => destroyed,\r\n ({ _changedOptions, _force }, { _observersUpdateHints, _structureUpdateHints }) => {\r\n const {\r\n _sizeChanged,\r\n _directionChanged,\r\n _heightIntrinsicChanged,\r\n _contentMutation,\r\n _hostMutation,\r\n _appear,\r\n } = _observersUpdateHints;\r\n\r\n const {\r\n _overflowEdgeChanged,\r\n _overflowAmountChanged,\r\n _overflowStyleChanged,\r\n _scrollCoordinatesChanged,\r\n } = _structureUpdateHints;\r\n\r\n triggerEvent('updated', [\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n instance,\r\n {\r\n updateHints: {\r\n sizeChanged: !!_sizeChanged,\r\n directionChanged: !!_directionChanged,\r\n heightIntrinsicChanged: !!_heightIntrinsicChanged,\r\n overflowEdgeChanged: !!_overflowEdgeChanged,\r\n overflowAmountChanged: !!_overflowAmountChanged,\r\n overflowStyleChanged: !!_overflowStyleChanged,\r\n scrollCoordinatesChanged: !!_scrollCoordinatesChanged,\r\n contentMutation: !!_contentMutation,\r\n hostMutation: !!_hostMutation,\r\n appear: !!_appear,\r\n },\r\n changedOptions: _changedOptions || {},\r\n force: !!_force,\r\n },\r\n ]);\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n (scrollEvent) => triggerEvent('scroll', [instance, scrollEvent])\r\n );\r\n\r\n const destroy = (canceled: boolean) => {\r\n removeInstance(instanceTarget);\r\n runEachAndClear(destroyFns);\r\n\r\n destroyed = true;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\r\n triggerEvent('destroyed', [instance, canceled]);\r\n removePluginEvents();\r\n removeInstanceEvents();\r\n };\r\n\r\n const instance: OverlayScrollbars = {\r\n options(newOptions?: PartialOptions, pure?: boolean) {\r\n if (newOptions) {\r\n const base = pure ? _getDefaultOptions() : {};\r\n const changedOptions = getOptionsDiff(\r\n currentOptions,\r\n assignDeep(base, validateOptions(newOptions))\r\n );\r\n if (!isEmptyObject(changedOptions)) {\r\n assignDeep(currentOptions, changedOptions);\r\n setupsUpdate({ _changedOptions: changedOptions });\r\n }\r\n }\r\n return assignDeep({}, currentOptions);\r\n },\r\n on: addInstanceEvent,\r\n off: (name, listener) => {\r\n name && listener && removeInstanceEvents(name, listener);\r\n },\r\n state() {\r\n const { _observersSetupState, _structureSetupState } = setupsState();\r\n const { _directionIsRTL } = _observersSetupState;\r\n const {\r\n _overflowEdge,\r\n _overflowAmount,\r\n _overflowStyle,\r\n _hasOverflow,\r\n _padding,\r\n _paddingAbsolute,\r\n _scrollCoordinates,\r\n } = _structureSetupState;\r\n return assignDeep(\r\n {},\r\n {\r\n overflowEdge: _overflowEdge,\r\n overflowAmount: _overflowAmount,\r\n overflowStyle: _overflowStyle,\r\n hasOverflow: _hasOverflow,\r\n scrollCoordinates: {\r\n start: _scrollCoordinates._start,\r\n end: _scrollCoordinates._end,\r\n },\r\n padding: _padding,\r\n paddingAbsolute: _paddingAbsolute,\r\n directionRTL: _directionIsRTL,\r\n destroyed,\r\n }\r\n );\r\n },\r\n elements() {\r\n const {\r\n _target,\r\n _host,\r\n _padding,\r\n _viewport,\r\n _content,\r\n _scrollOffsetElement,\r\n _scrollEventElement,\r\n } = setupsElements._structureSetupElements;\r\n const { _horizontal, _vertical } = setupsElements._scrollbarsSetupElements;\r\n const translateScrollbarStructure = (\r\n scrollbarStructure: ScrollbarStructure\r\n ): ScrollbarElements => {\r\n const { _handle, _track, _scrollbar } = scrollbarStructure;\r\n return {\r\n scrollbar: _scrollbar,\r\n track: _track,\r\n handle: _handle,\r\n };\r\n };\r\n const translateScrollbarsSetupElement = (\r\n scrollbarsSetupElement: ScrollbarsSetupElement\r\n ): CloneableScrollbarElements => {\r\n const { _scrollbarStructures, _clone } = scrollbarsSetupElement;\r\n const translatedStructure = translateScrollbarStructure(_scrollbarStructures[0]);\r\n\r\n return assignDeep({}, translatedStructure, {\r\n clone: () => {\r\n const result = translateScrollbarStructure(_clone());\r\n setupsUpdate({ _cloneScrollbar: true });\r\n return result;\r\n },\r\n });\r\n };\r\n return assignDeep(\r\n {},\r\n {\r\n target: _target,\r\n host: _host,\r\n padding: _padding || _viewport,\r\n viewport: _viewport,\r\n content: _content || _viewport,\r\n scrollOffsetElement: _scrollOffsetElement,\r\n scrollEventElement: _scrollEventElement,\r\n scrollbarHorizontal: translateScrollbarsSetupElement(_horizontal),\r\n scrollbarVertical: translateScrollbarsSetupElement(_vertical),\r\n }\r\n );\r\n },\r\n update: (_force?: boolean) => setupsUpdate({ _force, _takeRecords: true }),\r\n destroy: bind(destroy, false),\r\n plugin: <P extends InstancePlugin>(plugin: P) =>\r\n instancePluginModuleInstances[keys(plugin)[0]] as\r\n | InferInstancePluginModuleInstance<P>\r\n | undefined,\r\n };\r\n\r\n push(destroyFns, [setupsCanceled]);\r\n\r\n // valid inside plugins\r\n addInstance(instanceTarget, instance);\r\n\r\n // init plugins\r\n registerPluginModuleInstances(pluginModules, OverlayScrollbars, [\r\n instance,\r\n addPluginEvent,\r\n instancePluginModuleInstances,\r\n ]);\r\n\r\n if (\r\n cancelInitialization(\r\n setupsElements._structureSetupElements._isBody,\r\n !targetIsElement && target.cancel\r\n )\r\n ) {\r\n destroy(true);\r\n return instance;\r\n }\r\n\r\n push(destroyFns, setupsConstruct());\r\n\r\n triggerEvent('initialized', [instance]);\r\n\r\n instance.update();\r\n\r\n return instance;\r\n }\r\n return potentialInstance!;\r\n};\r\n\r\nOverlayScrollbars.plugin = (plugins: Plugin | Plugin[]) => {\r\n const isArr = isArray(plugins);\r\n const pluginsToAdd: Plugin<string, void | PluginModuleInstance, void | PluginModuleInstance>[] =\r\n isArr ? plugins : [plugins];\r\n const result = pluginsToAdd.map(\r\n (plugin) => registerPluginModuleInstances(plugin, OverlayScrollbars)[0]\r\n );\r\n addPlugins(pluginsToAdd);\r\n return isArr ? result : (result[0] as any);\r\n};\r\nOverlayScrollbars.valid = (osInstance: any): osInstance is OverlayScrollbars => {\r\n const hasElmsFn = osInstance && (osInstance as OverlayScrollbars).elements;\r\n const elements = isFunction(hasElmsFn) && hasElmsFn();\r\n return isPlainObject(elements) && !!getInstance(elements.target);\r\n};\r\nOverlayScrollbars.env = () => {\r\n const {\r\n _nativeScrollbarsSize,\r\n _nativeScrollbarsOverlaid,\r\n _nativeScrollbarsHiding,\r\n _scrollTimeline,\r\n _staticDefaultInitialization,\r\n _staticDefaultOptions,\r\n _getDefaultInitialization,\r\n _setDefaultInitialization,\r\n _getDefaultOptions,\r\n _setDefaultOptions,\r\n } = getEnvironment();\r\n return assignDeep(\r\n {},\r\n {\r\n scrollbarsSize: _nativeScrollbarsSize,\r\n scrollbarsOverlaid: _nativeScrollbarsOverlaid,\r\n scrollbarsHiding: _nativeScrollbarsHiding,\r\n scrollTimeline: _scrollTimeline,\r\n staticDefaultInitialization: _staticDefaultInitialization,\r\n staticDefaultOptions: _staticDefaultOptions,\r\n\r\n getDefaultInitialization: _getDefaultInitialization,\r\n setDefaultInitialization: _setDefaultInitialization,\r\n getDefaultOptions: _getDefaultOptions,\r\n setDefaultOptions: _setDefaultOptions,\r\n }\r\n );\r\n};\r\nOverlayScrollbars.nonce = setNonce;\r\n"],"names":["createCache","options","update","o","_initialValue","i","_equal","u","_alwaysUpdateValues","_value","_previous","cacheUpdateContextual","newValue","force","curr","newVal","changed","cacheUpdateIsolated","getCurrentCache","isBrowser","window","HTMLElement","document","wnd","mathMax","Math","max","mathMin","min","mathRound","round","mathAbs","abs","mathSign","sign","cAF","cancelAnimationFrame","rAF","requestAnimationFrame","setT","setTimeout","clearT","clearTimeout","getApi","name","undefined","MutationObserverConstructor","IntersectionObserverConstructor","ResizeObserverConstructor","scrollT","isUndefined","obj","isNull","isNumber","isString","isBoolean","isFunction","isArray","Array","isObject","isArrayLike","length","lengthCorrectFormat","isPlainObject","constructor","Object","isHTMLElement","isElement","Element","animationCurrentTime","performance","now","animateNumber","from","to","duration","onFrame","easing","animationFrameId","timeStart","finalDuration","frame","complete","timeNow","timeElapsed","stopAnimation","percent","progress","animationCompleted","each","source","callback","keys","key","inArray","arr","item","indexOf","concat","a","b","push","array","items","arrayIsSingleItem","prototype","apply","createOrKeepArray","value","isEmptyArray","deduplicateArray","Set","runEachAndClear","args","keep","runFn","fn","strPaddingTop","strPaddingRight","strPaddingLeft","strPaddingBottom","strMarginLeft","strMarginRight","strMarginBottom","strOverflowX","strOverflowY","strWidth","strHeight","strVisible","strHidden","strScroll","capitalizeFirstLetter","str","finalStr","String","toUpperCase","slice","equal","props","propMutation","result","prop","compareA","compareB","equalWH","equalXY","equalTRBL","noop","bind","selfClearTimeout","timeout","id","setTFn","clearTFn","debounce","functionToDebounce","_","_timeout","p","_maxDelay","v","_leading","S","_mergeParams","maxTimeoutId","prevArguments","latestArguments","leadingInvoked","clear","invokeFunctionToDebounce","this","mergeParms","flush","debouncedFn","arguments","finalTimeout","hasTimeout","finalMaxWait","hasMaxWait","setTimeoutFn","clearTimeoutFn","mergeParamsResult","invokedArgs","boundInvoke","timeoutId","_flush","hasOwnProperty","call","assignDeep","target","object1","object2","object3","object4","object5","object6","sources","copy","copyIsArray","src","clone","removeUndefinedProperties","deep","isEmptyObject","capNumber","number","getDomTokensArray","tokens","split","filter","token","getAttr","elm","attrName","getAttribute","hasAttr","hasAttribute","setAttrs","attrNames","setAttribute","removeAttrs","removeAttribute","domTokenListAttr","initialArr","setElmAttr","domTokenListOperation","operationTokens","operation","initialArrSet","join","_remove","removeTokens","_add","addTokens","_has","hasTokens","tokenSet","reduce","boolean","includes","removeAttrClass","addAttrClass","addRemoveAttrClass","add","hasAttrClass","createDomTokenListClass","removeClass","className","addClass","find","selector","rootElm","querySelectorAll","findFirst","querySelector","is","matches","isBodyElement","contents","childNodes","parent","parentElement","closest","getFocusedElement","doc","activeElement","liesBetween","highBoundarySelector","deepBoundarySelector","closestHighBoundaryElm","closestDeepBoundaryElm","deepBoundaryIsValid","removeElements","nodes","node","parentElm","removeChild","appendChildren","children","child","appendChild","createDiv","classNames","div","createElement","createDOM","html","createdDiv","innerHTML","trim","getCSSVal","computedStyle","getPropertyValue","validFiniteNumber","notNaN","isFinite","parseToZeroOrNumber","parseFloat","roundCssNumber","numberToCssPx","setStyles","styles","rawValue","elmStyle","style","setProperty","_unused","getStyles","pseudoElm","getSingleStyle","getStylesResult","getComputedStyle","topRightBottomLeft","propertyPrefix","propertySuffix","finalPrefix","finalSuffix","top","right","bottom","left","t","r","l","getTrasformTranslateValue","isHorizontal","x","y","elementHasDimensions","offsetWidth","offsetHeight","getClientRects","zeroObj","w","h","getElmWidthHeightProperty","property","getWindowSize","customWnd","getOffsetSize","getClientSize","getScrollSize","getFractionalSize","cssWidth","cssHeight","getBoundingClientRect","hasDimensions","domRectHasDimensions","rect","domRectAppeared","currContentRect","prevContentRect","rectHasDimensions","rectHadDimensions","removeEventListener","eventNames","listener","capture","eventName","addEventListener","_ref","passive","_passive","_capture","once","_once","nativeOptions","map","finalListener","evt","stopPropagation","preventDefault","stopAndPrevent","scrollElementTo","position","scrollLeft","scrollTop","getElementScroll","getZeroScrollCoordinates","_start","_end","sanitizeScrollCoordinates","rawScrollCoordinates","overflowAmount","D","T","sanitizeAxis","start","end","amount","newStart","newEnd","startAbs","endAbs","startX","endX","startY","endY","isDefaultDirectionScrollCoordinates","getAxis","getScrollCoordinatesPercent","currentScroll","current","focusElement","element","focus","preventScroll","manageListener","createEventListenerHub","initialEventListeners","events","Map","removeEvent","eventSet","get","currListener","forEach","addEvent","nameOrEventListeners","listenerOrPure","set","eventListenerKeys","offFns","eventListener","triggerEvent","event","opsStringify","JSON","stringify","val","getPropByPath","path","defaultOptions","paddingAbsolute","showNativeOverlaidScrollbars","elementEvents","attributes","ignoreMutation","overflow","scrollbars","theme","visibility","autoHide","autoHideDelay","autoHideSuspend","dragScroll","clickScroll","pointers","getOptionsDiff","currOptions","newOptions","diff","optionsKeys","optionKey","currOptionValue","newOptionValue","isDiff","createOptionCheck","changedOptions","dataAttributePrefix","classNameEnvironment","classNameEnvironmentScrollbarHidden","dataAttributeInitialize","dataValueNoClipping","dataAttributeHtmlBody","dataAttributeHost","dataValueHostIsHost","dataAttributeViewport","dataValueViewportOverflowXPrefix","dataValueViewportOverflowYPrefix","dataValueViewportArrange","dataValueViewportMeasuring","dataValueViewportScrolling","dataValueViewportScrollbarHidden","dataValueViewportNoContent","dataAttributePadding","dataAttributeContent","classNameSizeObserver","classNameSizeObserverAppear","classNameSizeObserverListener","classNameSizeObserverListenerScroll","classNameSizeObserverListenerItem","classNameSizeObserverListenerItemFinal","classNameTrinsicObserver","classNameScrollbarThemeNone","classNameScrollbar","classNameScrollbarRtl","classNameScrollbarHorizontal","classNameScrollbarVertical","classNameScrollbarTrack","classNameScrollbarHandle","classNameScrollbarVisible","classNameScrollbarCornerless","classNameScrollbarInteraction","classNameScrollbarUnusable","classNameScrollbarAutoHide","classNameScrollbarAutoHideHidden","classNameScrollbarWheel","classNameScrollbarTrackInteractive","classNameScrollbarHandleInteractive","nonce","getNonce","setNonce","newNonce","environmentInstance","createEnvironment","getNativeScrollbarSize","measureElm","measureElmChild","body","cSize","oSize","fSize","getNativeScrollbarsHiding","testElm","revertClass","envStyle","envDOM","envElm","envChildElm","firstChild","styleElm","lastChild","updateNativeScrollbarSizeCache","getNativeScrollbarSizeCache","nativeScrollbarsSize","nativeScrollbarsHiding","nativeScrollbarsOverlaid","staticDefaultInitialization","elements","host","padding","viewport","content","slot","cancel","staticDefaultOptions","getDefaultOptions","getDefaultInitialization","env","_nativeScrollbarsSize","_nativeScrollbarsOverlaid","_nativeScrollbarsHiding","_scrollTimeline","_addResizeListener","_getDefaultInitialization","_setDefaultInitialization","newInitializationStrategy","_getDefaultOptions","_setDefaultOptions","newDefaultOptions","_staticDefaultInitialization","_staticDefaultOptions","matchMedia","addZoomListener","onZoom","media","devicePixelRatio","updatedNativeScrollbarSize","nativeScrollbarSizeChanged","getEnvironment","resolveInitialization","staticInitializationElement","fallbackStaticInitializationElement","defaultStaticInitializationElement","staticInitializationElementValue","staticInitialization","resolvedInitialization","dynamicInitializationElement","fallbackDynamicInitializationElement","defaultDynamicInitializationElement","dynamicInitializationElementValue","dynamicInitialization","cancelInitialization","isBody","cancelInitializationValue","k","R","U","defaultNativeScrollbarsOverlaid","defaultbody","resolvedNativeScrollbarsOverlaid","resolvedDocumentScrollingElement","finalNativeScrollbarsOverlaid","finalDocumentScrollingElement","targetInstanceMap","WeakMap","addInstance","osInstance","removeInstance","delete","getInstance","createEventContentChange","eventContentChange","destroyed","destroy","updateElements","getElements","eventElmList","entries","isTargetChild","contains","removeListener","createDOMObserver","isContentObserver","isConnected","F","_attributes","X","_styleChangingAttributes","Y","_eventContentChange","W","_nestedTargetSelector","J","_ignoreTargetChange","G","_ignoreContentChange","debouncedEventContentChange","destroyEventContentChange","updateEventContentChangeElements","finalAttributes","finalStyleChangingAttributes","observedAttributes","observerCallback","fromRecords","mutations","ignoreTargetChange","ignoreContentChange","totalChangedNodes","targetChangedAttrs","targetStyleChanged","contentChanged","mutation","attributeName","mutationTarget","type","oldValue","addedNodes","removedNodes","isAttributesType","isChildListType","targetIsMutationTarget","isAttrChange","attributeValue","attributeChanged","styleChangingAttrChanged","contentAttrChanged","isNestedTarget","baseAssertion","contentFinalChanged","mutationObserver","observe","attributeOldValue","attributeFilter","subtree","childList","characterData","disconnect","takeRecords","pluginModules","staticPluginModuleInstances","addPlugins","addedPlugin","plugin","registerPluginModuleInstances","staticObj","instanceInfo","static","osStatic","instance","instanceObj","instancePluginMap","ctor","getStaticPluginModuleInstance","pluginModuleName","optionsValidationPluginModuleName","sizeObserverPluginName","SizeObserverPlugin","listenerElement","onSizeChangedCallback","observeAppearChange","scrollAmount","scrollEventName","observerElementChildren","observerElementChildrenRoot","shrinkElement","expandElement","expandElementChild","cacheSize","currSize","isDirty","rAFId","reset","onResized","appear","onScroll","scrollEvent","destroyFns","getShowNativeOverlaidScrollbars","checkOption","showNativeOverlaidScrollbarsOption","showNativeOverlaidScrollbarsChanged","overflowIsVisible","overflowBehavior","createViewportOverflowState","hasOverflow","getAxisOverflowStyle","axisBehavior","axisHasOverflow","perpendicularBehavior","perpendicularOverflow","behaviorStyle","replace","axisOverflowVisible","perpendicularOverflowVisible","nonPerpendicularOverflow","nonOverflow","_overflowStyle","_overflowScroll","scrollbarsHidingPluginName","ScrollbarsHidingPlugin","_viewportArrangement","structureSetupElements","structureSetupState","observersSetupState","checkOptions","nt","_viewportIsTarget","ot","_viewport","M","doViewportArrange","readViewportOverflowState","getStatePerAxis","styleKey","overflowStyle","overflowScroll","xOverflowStyle","xOverflowScroll","yOverflowStyle","yOverflowScroll","_getViewportOverflowHideOffset","viewportOverflowState","Z","arrangeHideOffset","getHideOffsetPerAxis","isOverlaid","nativeScrollbarSize","nonScrollbarStylingHideOffset","scrollbarsHideOffset","scrollbarsHideOffsetArrange","xScrollbarsHideOffset","xScrollbarsHideOffsetArrange","yScrollbarsHideOffset","yScrollbarsHideOffsetArrange","_scrollbarsHideOffset","_scrollbarsHideOffsetArrange","_hideNativeScrollbars","_directionIsRTL","viewportArrange","viewportStyleObj","st","et","arrangeX","arrangeY","hideOffsetX","hideOffsetY","rt","_viewportPaddingStyle","horizontalMarginKey","viewportHorizontalPaddingKey","horizontalMarginValue","verticalMarginValue","horizontalPaddingValue","verticalPaddingValue","_arrangeViewport","viewportScrollSize","sizeFraction","ct","viewportArrangeHorizontalPaddingKey","viewportArrangeHorizontalPaddingValue","viewportArrangeVerticalPaddingValue","paddingTop","fractionalContentWidth","fractionalContenHeight","arrangeSize","_undoViewportArrange","finalViewportOverflowState","viewportPaddingStyle","finalPaddingStyle","assignProps","prevStyle","addArrange","clickScrollPluginModuleName","ClickScrollPlugin","moveHandleRelative","getHandleOffset","startOffset","handleLength","relativeTrackPointerOffset","stop","stopClickAnimation","stopPressAnimation","setFirstIterationPauseTimeout","clearFirstIterationPauseTimeout","animateClickScroll","clickScrollProgress","iteration","animationProgress","handleStartBound","handleEndBound","mouseBetweenHandleBounds","animationCompletedAction","stopClick","createSizeObserver","_appear","sizeObserverPlugin","updateResizeObserverContentRectCache","baseElements","sizeObserver","onSizeChangedCallbackProxy","sizeChangedContext","isResizeObserverCall","ResizeObserverEntry","skip","currRContentRect","contentRect","_sizeChanged","resizeObserverInstance","pop","pluginAppearCallback","pluginDestroyFns","createTrinsicObserver","onTrinsicChangedCallback","intersectionObserverInstance","isHeightIntrinsic","ioEntryOrSize","isIntersecting","intersectionRatio","trinsicObserver","updateHeightIntrinsicCache","triggerOnTrinsicChangedCallback","updateValue","heightIntrinsic","heightIntrinsicChanged","intersectionObserverCallback","root","onSizeChanged","newSize","createObserversSetup","getCurrentOption","onObserversUpdated","debounceTimeout","debounceMaxDelay","updateContentMutationObserver","destroyContentMutationObserver","prevDirectionIsRTL","hostSelector","viewportSelector","baseStyleChangingAttrs","vt","_target","gt","_host","ht","_scrollOffsetElement","bt","_content","yt","_isBody","wt","_viewportHasClass","St","_viewportAddRemoveClass","Ot","_removeScrollObscuringStyles","getDirectionIsRTL","state","_heightIntrinsic","scrollbarsHidingPlugin","updateContentSizeCache","viewportIsTargetBody","noClipping","isArranged","scrollOffset","revertScrollObscuringStyles","revertMeasuring","redoViewportArrange","viewportScroll","fractional","onObserversUpdatedDebounced","prev","prevObj","currObj","setDirection","updateHints","newDirectionIsRTL","_directionChanged","onTrinsicChanged","heightIntrinsicCache","_heightIntrinsicChanged","exclusiveSizeChange","updateFn","onContentMutation","contentChangedThroughEvent","_contentMutation","onHostMutation","_hostMutation","constructTrinsicObserver","updateTrinsicObserver","constructSizeObserver","constructHostMutationObserver","updateHostMutationObserver","viewportIsTargetResizeObserver","onWindowResizeDebounced","destroySizeObserver","destroyTrinsicObserver","destroyHostMutationObserver","removeResizeListener","_scrollbarSizeChanged","_checkOption","_takeRecords","_force","attributesChanged","elementEventsChanged","debounceValue","debounceChanged","contentMutationObserverChanged","ignoreMutationFromOptions","construct","ignore","maxWait","hostUpdateResult","trinsicUpdateResult","contentUpdateResult","createScrollbarsSetupElements","scrollbarsSetupEvents","cssCustomPropViewportPercent","cssCustomPropScrollPercent","cssCustomPropScrollDirection","defaultInitScrollbars","defaultInitScrollbarsSlot","Tt","_targetIsElm","scrollbarsInit","initScrollbarsSlot","horizontalScrollbars","verticalScrollbars","evaluatedScrollbarSlot","generalDynamicInitializationElement","initScrollTimeline","axis","timeline","_addScrollPercentAnimation","structure","scrollPercentAnimation","_scrollbar","animate","scrollTimeline","getViewportPercent","Rt","_overflowAmount","Vt","_overflowEdge","getAxisValue","axisViewportSize","axisOverflowAmount","scrollbarStructureAddRemoveClass","scrollbarStructures","action","scrollbarStructure","scrollbarStyle","scrollbarsAddRemoveClass","onlyHorizontal","singleAxis","runHorizontal","runVertical","refreshScrollbarsHandleLength","viewportPercent","createScrollbarStyleFn","axisViewportPercent","refreshScrollbarsHandleOffset","Lt","_scrollCoordinates","scrollPercent","axisScrollPercent","refreshScrollbarsScrollCoordinates","defaultDirectionScroll","axisIsDefaultDirectionScrollCoordinates","refreshScrollbarsScrollbarOffset","isDefaultDirectionScroll","styleScrollbarPosition","Mt","getTranslateValue","axisIsDefaultCoordinates","px","transform","generateScrollbarDOM","xyKey","scrollbarClassName","scrollbar","track","handle","_track","_handle","generateHorizontalScrollbarStructure","generateVerticalScrollbarStructure","appendElements","_refreshScrollbarsHandleLength","_refreshScrollbarsHandleOffset","_refreshScrollbarsScrollCoordinates","_refreshScrollbarsScrollbarOffset","_scrollbarsAddRemoveClass","_horizontal","_scrollbarStructures","_clone","_style","_vertical","createScrollbarsSetupEvents","scrollbarHandlePointerInteraction","Kt","_documentElm","Ut","Pt","wheelTimeout","clearWheelTimeout","scrollSnapScrollTransitionTimeout","clearScrollSnapScrollTransitionTimeout","scrollOffsetElementScrollBy","coordinates","scrollBy","behavior","createInteractiveScrollEvents","releasePointerCaptureEvents","clientXYKey","widthHeightKey","leftTopKey","whKey","createRelativeHandleMove","mouseDownScroll","invertedScale","deltaMovement","handleTrackDiff","scrollDeltaPercent","scrollDelta","pointerdownCleanupFns","pointerDownEvent","isDragScroll","pointerCaptureElement","scrollbarOptions","button","isPrimary","pointerType","continuePointerDown","instantClickScroll","shiftKey","getHandleRect","getTrackRect","handleRect","trackRect","axisScale","pointerDownOffset","handleCenter","releasePointerCapture","pointerUpEvent","pointerupCleanupFns","pointerId","withoutSnapScrollOffset","withSnapScrollOffset","snapScrollDiff","pointerMoveEvent","relativeMovement","setPointerCapture","stopClickScrollAnimation","wheelScrollBy","focusedElement","wheelEvent","deltaX","deltaY","deltaMode","createScrollbarsSetup","mouseInHost","autoHideIsMove","autoHideIsLeave","autoHideIsNever","prevTheme","instanceAutoHideSuspendScrollDestroyFn","instanceAutoHideDelay","isHoverablePointerType","requestScrollAnimationFrame","cancelScrollAnimationFrame","autoHideInstantInteractionTimeout","clearAutoHideInstantInteractionTimeout","autoHideSuspendTimeout","clearAutoHideSuspendTimeout","auotHideTimeout","clearAutoHideTimeout","manageScrollbarsAutoHideInstantInteraction","Qt","_scrollEventElement","Ft","Nt","qt","jt","Bt","manageScrollbarsAutoHide","removeAutoHide","delayless","hide","manageAutoHideSuspension","onHostMouseEnter","_observersUpdateHints","_structureUpdateHints","nn","_overflowEdgeChanged","sn","_overflowAmountChanged","en","_overflowStyleChanged","cn","_scrollCoordinatesChanged","Ct","dt","K","rn","_hasOverflow","themeChanged","visibilityChanged","autoHideChanged","autoHideSuspendChanged","dragScrollChanged","clickScrollChanged","overflowChanged","trulyAppeared","updateScrollbars","updateVisibility","setScrollbarVisibility","isVisible","xVisible","yVisible","hasCorner","createStructureSetupElements","defaultInitElements","defaultPaddingInitialization","defaultViewportInitialization","defaultContentInitialization","targetIsElm","targetStructureInitialization","initElements","paddingInitialization","viewportInitialization","contentInitialization","targetElement","ownerDocument","docElement","documentElement","getDocumentWindow","defaultView","generalStaticInitializationElement","createNewDiv","generateViewportElement","generateContentElement","elementHasOverflow","offsetSize","scrollSize","overflowX","overflowY","possibleViewportElement","viewportIsTarget","possibleContentElement","viewportIsContent","viewportElement","hostElement","paddingElement","contentElement","generatedElements","elementIsGenerated","originalNonBodyScrollOffsetElement","scrollOffsetElement","scrollEventElement","evaluatedTargetObj","_padding","_originalScrollOffsetElement","_windowElm","viewportAttributeClassName","ln","targetContents","contentSlot","docWnd","initActiveElm","unwrap","prepareWrapUnwrapFocus","tabIndexStr","originalViewportTabIndex","undoInitWrapUndwrapFocus","destroyActiveElm","viewportIsGenerated","destroyFocusElement","undoDestroyWrapUndwrapFocus","createTrinsicUpdateSegment","_observersState","xt","$t","createPaddingUpdateSegment","updatePaddingCache","currentPaddingCache","paddingChanged","ft","Ht","paddingAbsoluteChanged","contentMutation","paddingStyleChanged","paddingRelative","paddingHorizontal","paddingVertical","paddingStyle","viewportStyle","_paddingAbsolute","_paddingStyleChanged","createOverflowUpdateSegment","un","max0","flowDirectionCanBeNonDefaultMap","display","direction","directionStyle","flexDirection","flexDirectionStyle","endsWith","writingMode","writingModeStyle","flowDirectionStyleArr","whCacheOptions","partialXYOptions","setMeasuringMode","active","getMeasuredScrollCoordinates","flowDirectionStyles","flowDirectionCanBeNonDefault","some","styleName","styleValue","originalScrollOffset","removeNoContent","removeScrollBlock","scrollEventScrollOffset","isTrusted","tmp","getOverflowAmount","viewportClientSize","tollerance","updateSizeFraction","getCurrentSizeFraction","updateViewportScrollSizeCache","getCurrentViewportScrollSizeCache","updateOverflowAmountCache","getCurrentOverflowAmountCache","updateHasOverflowCache","updateOverflowEdge","getCurrentOverflowEdgeCache","updateOverflowStyleCache","updateFlowDirectionStyles","currVal","newValu","updateMeasuredScrollCoordinates","getCurrentMeasuredScrollCoordinates","createViewportOverflowStyleClassName","prefix","setViewportOverflowStyle","viewportOverflowStyle","createAllOverflowStyleClassNames","allOverflowStyleClassNames","zt","scrollbarsHidingPluginViewportArrangement","it","ut","_t","overflowXVisible","overflowYVisible","viewportChanged","sizeFractionCache","viewportScrollSizeCache","overflowAmuntCache","overflowEdgeCache","windowInnerSize","overflowAmountScrollSize","overflowAmountClientSize","overflowEdge","overflowEdgeChanged","overflowAmountChanged","viewportScrollSizeChanged","sizeFractionChanged","hasOverflowChanged","removeClipping","adjustViewportStyle","overflowStyleChanged","flowDirectionStylesChanged","adjustMeasuredScrollCoordinates","scrollCoordinates","scrollCoordinatesChanged","_scrolled","createStructureSetup","appendStructureElements","canceled","updateSegments","updateInfo","adjustScrollOffset","updateSegment","createSetups","isDestroyed","onUpdated","cacheAndOptionsInitialized","structureSetupCreate","structureSetupUpdate","structureSetupCanceled","observersSetupCreate","observersSetupUpdate","observersUpdateHints","scrollbarsSetupCreate","scrollbarsSetupUpdate","scrollbarsSetupElements","updateHintsAreTruthy","hints","observerUpdateHints","_changedOptions","rawChangedOptions","rawForce","At","gn","_cloneScrollbar","baseUpdateInfoObj","observersHints","structureHints","truthyObserversHints","truthyStructureHints","an","initialScroll","_observersSetupState","_structureSetupState","_structureSetupElements","_scrollbarsSetupElements","OverlayScrollbars","eventListeners","N","targetIsElement","instanceTarget","potentialInstance","instancePluginModuleInstances","validateOptions","newOptionsWithoutUndefined","pluginValidate","currentOptions","addPluginEvent","removePluginEvents","triggerPluginEvent","addInstanceEvent","removeInstanceEvents","triggerInstanceEvent","setupsConstruct","setupsUpdate","setupsState","setupsElements","setupsCanceled","Et","sizeChanged","directionChanged","hostMutation","pure","base","on","off","hn","bn","dn","directionRTL","Xt","Gt","translateScrollbarStructure","translateScrollbarsSetupElement","scrollbarsSetupElement","Yt","Wt","translatedStructure","scrollbarHorizontal","scrollbarVertical","plugins","isArr","pluginsToAdd","valid","hasElmsFn","V","j","B","P","q","scrollbarsSize","scrollbarsOverlaid","scrollbarsHiding","setDefaultInitialization","setDefaultOptions"],"mappings":"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"}