From 24eadd5f1d34a0d64915f94e348085776adcd9f8 Mon Sep 17 00:00:00 2001 From: Rene Date: Sun, 18 Oct 2020 23:32:21 +0200 Subject: [PATCH] size observer --- babel.config.base.js | 2 + config/jest-puppeteer.rollup.js | 139 +++++++++++++++--- jest-puppeteer.config.base.js | 3 + package.json | 1 + .../dist/overlayscrollbars.esm.js | 22 +-- .../dist/overlayscrollbars.esm.js.map | 2 +- .../dist/overlayscrollbars.esm.min.js | 2 +- .../dist/overlayscrollbars.js | 22 +-- .../dist/overlayscrollbars.js.map | 2 +- .../dist/overlayscrollbars.min.js | 2 +- .../src/environment/environment.ts | 37 ++--- .../src/overlayscrollbars.scss | 48 ++++++ .../overlayscrollbars/OverlayScrollbars.ts | 54 +++++++ .../src/overlayscrollbars/index.ts | 3 + .../lifecycles/StructureLifecycle.ts | 18 +++ .../src/overlayscrollbars/lifecycles/index.ts | 14 ++ .../observers/createSizeObserver.ts | 92 ++++++++++++ .../overlayscrollbars/src/sizeobserver.scss | 70 +++++++++ packages/overlayscrollbars/src/some.css | 3 - packages/overlayscrollbars/src/some.scss | 5 - .../src/support/options/index.ts | 9 +- .../src/support/options/validation.ts | 10 +- .../tests/puppeteer/Environment/index.test.ts | 12 +- .../tests/puppeteer/Environment/index.ts | 6 +- .../tests/puppeteer/SizeObserver/index.html | 23 +++ .../tests/puppeteer/SizeObserver/index.scss | 37 +++++ .../puppeteer/SizeObserver/index.test.ts | 15 ++ .../tests/puppeteer/SizeObserver/index.ts | 128 ++++++++++++++++ .../types/environment/environment.d.ts | 14 +- .../overlayscrollbars/OverlayScrollbars.d.ts | 1 + .../types/overlayscrollbars/index.d.ts | 2 + .../lifecycles/StructureLifecycle.d.ts | 14 ++ .../overlayscrollbars/lifecycles/index.d.ts | 8 + .../observers/createSizeObserver.d.ts | 1 + .../types/support/options/index.d.ts | 5 +- .../types/support/options/validation.d.ts | 4 +- rollup.config.base.js | 8 +- yarn.lock | 5 + 38 files changed, 741 insertions(+), 102 deletions(-) create mode 100644 packages/overlayscrollbars/src/overlayscrollbars.scss create mode 100644 packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts create mode 100644 packages/overlayscrollbars/src/overlayscrollbars/index.ts create mode 100644 packages/overlayscrollbars/src/overlayscrollbars/lifecycles/StructureLifecycle.ts create mode 100644 packages/overlayscrollbars/src/overlayscrollbars/lifecycles/index.ts create mode 100644 packages/overlayscrollbars/src/overlayscrollbars/observers/createSizeObserver.ts create mode 100644 packages/overlayscrollbars/src/sizeobserver.scss delete mode 100644 packages/overlayscrollbars/src/some.css delete mode 100644 packages/overlayscrollbars/src/some.scss create mode 100644 packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.html create mode 100644 packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.scss create mode 100644 packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.test.ts create mode 100644 packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.ts create mode 100644 packages/overlayscrollbars/types/overlayscrollbars/OverlayScrollbars.d.ts create mode 100644 packages/overlayscrollbars/types/overlayscrollbars/index.d.ts create mode 100644 packages/overlayscrollbars/types/overlayscrollbars/lifecycles/StructureLifecycle.d.ts create mode 100644 packages/overlayscrollbars/types/overlayscrollbars/lifecycles/index.d.ts create mode 100644 packages/overlayscrollbars/types/overlayscrollbars/observers/createSizeObserver.d.ts diff --git a/babel.config.base.js b/babel.config.base.js index 066caa1..5eaf88c 100644 --- a/babel.config.base.js +++ b/babel.config.base.js @@ -14,6 +14,8 @@ module.exports = function (api) { [ '@babel/preset-env', { + useBuiltIns: 'usage', + corejs: { version: 3, proposals: true }, targets: { node: 'current', }, diff --git a/config/jest-puppeteer.rollup.js b/config/jest-puppeteer.rollup.js index dfb7bd8..a4b5a72 100644 --- a/config/jest-puppeteer.rollup.js +++ b/config/jest-puppeteer.rollup.js @@ -12,6 +12,45 @@ const rollupNodeEnv = 'build'; const cacheFilePrefix = 'jest-puppeteer-overlayscrollbars-cache-'; const cacheEncoding = 'utf8'; const cacheHash = 'md5'; +const legacyBabelConfigAssign = { + exclude: [/\/core-js\//], + presets: [ + [ + '@babel/preset-env', + { + useBuiltIns: 'usage', + corejs: { version: 3, proposals: true }, + }, + ], + ], +}; + +const mergeBabelConfigs = (currentConfig, mergeConfig) => { + const { presets: assignPresets, exclude: assignExclude } = mergeConfig; + const { presets: configPresets, exclude: configExclude } = currentConfig; + + assignPresets.forEach((assignPreset) => { + if (Array.isArray(assignPreset)) { + const [assignName, assignConfig] = assignPreset; + + configPresets.forEach((configPreset) => { + if (Array.isArray(configPreset)) { + const [configName, configConfig] = configPreset; + + if (configName === assignName && typeof configConfig === 'object' && typeof assignConfig === 'object') { + Object.assign(configConfig, { + ...assignConfig, + }); + } + } + }); + } + }); + + const finalAssignExclude = Array.isArray(assignExclude) ? assignExclude : [assignExclude]; + const finalConfigExclude = Array.isArray(configExclude) ? configExclude : [configExclude, ...finalAssignExclude]; + currentConfig.exclude = finalConfigExclude.filter((exc) => !!exc); +}; const makeHtmlAttributes = (attributes) => { if (!attributes) { @@ -40,11 +79,68 @@ const genHtmlTemplateFunc = (content) => ({ attributes, files, meta, publicPath, ${metas} ${title} + ${links} ${content || ''} ${scripts} +
+ `; }; @@ -112,26 +208,29 @@ const setupRollupTest = async (rootDir, testPath, cacheDir) => { let rollupConfigObj = rollupConfig(undefined, { project: rootDir, - overwrite: (rollupConfigDefaults) => ({ - input: path.resolve(testDir, deploymentConfig.js.input), - dist: path.resolve(testDir, deploymentConfig.build), - file: deploymentConfig.js.output, - types: null, - minVersions: false, - esmBuild: false, - sourcemap: true, - name: testName, - pipeline: [ - rollupPluginStyles(), - ...rollupConfigDefaults.pipeline, - rollupPluginHtml({ - title: `Jest-Puppeteer: ${testName}`, - fileName: deploymentConfig.html.output, - template: genHtmlTemplateFunc(htmlFileContent), - meta: [{ charset: 'utf-8' }, { 'http-equiv': 'X-UA-Compatible', content: 'IE=edge' }], - }), - ], - }), + overwrite: (rollupConfigDefaults, legacyBabelConfig) => { + mergeBabelConfigs(legacyBabelConfig, legacyBabelConfigAssign); + return { + input: path.resolve(testDir, deploymentConfig.js.input), + dist: path.resolve(testDir, deploymentConfig.build), + file: deploymentConfig.js.output, + types: null, + minVersions: false, + esmBuild: false, + sourcemap: true, + name: testName, + pipeline: [ + rollupPluginStyles(), + ...rollupConfigDefaults.pipeline, + rollupPluginHtml({ + title: `Jest-Puppeteer: ${testName}`, + fileName: deploymentConfig.html.output, + template: genHtmlTemplateFunc(htmlFileContent), + meta: [{ charset: 'utf-8' }, { 'http-equiv': 'X-UA-Compatible', content: 'IE=edge' }], + }), + ], + }; + }, silent: true, fast: true, }); diff --git a/jest-puppeteer.config.base.js b/jest-puppeteer.config.base.js index 229cb7d..84e826b 100644 --- a/jest-puppeteer.config.base.js +++ b/jest-puppeteer.config.base.js @@ -9,6 +9,9 @@ process.env.TEST_SERVER_PORT = port; module.exports = { browser: 'chromium', browserContext: 'incognito', + launch: { + headless: false, + }, server: { command: `cross-env TEST_SERVER_PORT=${port} node ${testServerPath}`, port, diff --git a/package.json b/package.json index 6e9af47..23660fa 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "babel-jest": "^26.0.1", "bufferutil": "^4.0.1", "canvas": "^2.6.1", + "core-js": "^3.6.5", "cross-env": "^7.0.2", "del": "^5.1.0", "eslint": "^7.5.0", diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js index b434200..6efd00f 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js @@ -335,6 +335,7 @@ const optionsTemplateTypes = ['boolean', 'number', 'string', 'array', 'object', }, {}); const { abs, round } = Math; +const envornmentElmId = 'os-envornment'; const nativeScrollbarSize = (body, measureElm) => { appendChildren(body, measureElm); @@ -363,6 +364,7 @@ const rtlScrollBehavior = (parentElm, childElm) => { style(parentElm, { overflowX: strHidden, overflowY: strHidden, + direction: 'rtl', }); scrollLeft(parentElm, 0); const parentOffset = absoluteCoordinates(parentElm); @@ -419,7 +421,7 @@ class Environment { const _self = this; const { body } = document; - const envDOM = createDOM('
'); + const envDOM = createDOM(`
`); const envElm = envDOM[0]; const envChildElm = envElm.firstChild; const nScrollBarSize = nativeScrollbarSize(body, envElm); @@ -427,13 +429,13 @@ class Environment { x: nScrollBarSize.x === 0, y: nScrollBarSize.y === 0, }; - _self.autoUpdateLoop = false; - _self.nativeScrollbarSize = nScrollBarSize; - _self.nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid; - _self.nativeScrollbarStyling = nativeScrollbarStyling(envElm); - _self.rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm); - _self.supportPassiveEvents = passiveEvents(); - _self.supportResizeObserver = !!jsAPI('ResizeObserver'); + _self._autoUpdateLoop = false; + _self._nativeScrollbarSize = nScrollBarSize; + _self._nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid; + _self._nativeScrollbarStyling = nativeScrollbarStyling(envElm); + _self._rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm); + _self._supportPassiveEvents = passiveEvents(); + _self._supportResizeObserver = !!jsAPI('ResizeObserver'); removeAttr(envElm, 'style'); removeElements(envElm); @@ -464,11 +466,11 @@ class Environment { const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h); const dprChanged = dprNew !== dpr && dpr > 0; const isZoom = deltaIsBigger && difference && dprChanged; - const oldScrollbarSize = _self.nativeScrollbarSize; + const oldScrollbarSize = _self._nativeScrollbarSize; let newScrollbarSize; if (isZoom) { - newScrollbarSize = _self.nativeScrollbarSize = nativeScrollbarSize(body, envElm); + newScrollbarSize = _self._nativeScrollbarSize = nativeScrollbarSize(body, envElm); removeElements(envElm); if (oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) { diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map index 24e4062..c07a805 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map +++ b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"overlayscrollbars.esm.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../../../node_modules/@babel/runtime/helpers/classPrivateFieldGet.js","../../../node_modules/@babel/runtime/helpers/classPrivateFieldSet.js","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/environment/environment.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T | any, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst elementIsVisible = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n if (selector === ':visible') {\r\n return elementIsVisible(elm as HTMLElement);\r\n }\r\n if (selector === ':hidden') {\r\n return !elementIsVisible(elm as HTMLElement);\r\n }\r\n if (elm.matches(selector)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (child.matches(selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (): HTMLDivElement => document.createElement('div');\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","import { WH } from 'support/dom';\r\n\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\nimport { XY } from 'support/dom';\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","function _classPrivateFieldGet(receiver, privateMap) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n\n return descriptor.value;\n}\n\nmodule.exports = _classPrivateFieldGet;","function _classPrivateFieldSet(receiver, privateMap, value) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n if (descriptor.set) {\n descriptor.set.call(receiver, value);\n } else {\n if (!descriptor.writable) {\n throw new TypeError(\"attempted to set read only private field\");\n }\n\n descriptor.value = value;\n }\n\n return value;\n}\n\nmodule.exports = _classPrivateFieldSet;","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, indexOf, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, OptionsValidated, Func, OptionsValidatedResult } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: OptionsValidated,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidatedResult => {\r\n const validatedOptions: OptionsValidated = {};\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult.validated;\r\n optionsCopy[prop] = validatedResult.foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n const isEnumString = indexOf(Object.values(optionsTemplateTypes), currTemplateType) < 0;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : currTemplateType);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n foreign: optionsCopy,\r\n validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validate = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: OptionsValidated,\r\n doWriteErrors?: boolean\r\n): OptionsValidatedResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || {}, doWriteErrors || false);\r\n};\r\n\r\nexport { validate, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n jsAPI,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n} from 'support';\r\n\r\ntype OnEnvironmentChanged = (env: Environment) => void;\r\n\r\nconst { abs, round } = Math;\r\n\r\nconst nativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst nativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-native-scrollbars-invisible');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst rtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst passiveEvents = (): boolean => {\r\n let supportsPassive = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n supportsPassive = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n return supportsPassive;\r\n};\r\n\r\nconst windowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nexport class Environment {\r\n #onChangedListener: Set = new Set();\r\n\r\n autoUpdateLoop!: boolean;\r\n\r\n nativeScrollbarSize!: XY;\r\n\r\n nativeScrollbarIsOverlaid!: XY;\r\n\r\n nativeScrollbarStyling!: boolean;\r\n\r\n rtlScrollBehavior!: { n: boolean; i: boolean };\r\n\r\n supportPassiveEvents!: boolean;\r\n\r\n supportResizeObserver!: boolean;\r\n\r\n constructor() {\r\n const _self = this;\r\n const { body } = document;\r\n const envDOM = createDOM('
');\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const nScrollBarSize = nativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nScrollBarSize.x === 0,\r\n y: nScrollBarSize.y === 0,\r\n };\r\n\r\n _self.autoUpdateLoop = false;\r\n _self.nativeScrollbarSize = nScrollBarSize;\r\n _self.nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid;\r\n _self.nativeScrollbarStyling = nativeScrollbarStyling(envElm);\r\n _self.rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm);\r\n _self.supportPassiveEvents = passiveEvents();\r\n _self.supportResizeObserver = !!jsAPI('ResizeObserver');\r\n\r\n removeAttr(envElm, 'style');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = windowDPR();\r\n const onChangedListener = this.#onChangedListener;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = windowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n const oldScrollbarSize = _self.nativeScrollbarSize;\r\n let newScrollbarSize;\r\n\r\n if (isZoom) {\r\n newScrollbarSize = _self.nativeScrollbarSize = nativeScrollbarSize(body, envElm);\r\n removeElements(envElm);\r\n\r\n if (oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) {\r\n onChangedListener.forEach((listener) => listener && listener(_self));\r\n }\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n }\r\n\r\n addListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.add(listener);\r\n }\r\n\r\n removeListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.delete(listener);\r\n }\r\n}\r\n","import { createDOM } from 'support/dom';\r\nimport { Environment } from 'environment';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n new Environment(),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["isNumber","obj","isString","isFunction","isUndefined","undefined","isArray","Array","isArrayLike","length","getSetProp","topLeft","fallback","elm","value","removeAttr","attrName","removeAttribute","scrollLeft","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","Object","keys","key","from","arr","push","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","removeElements","nodes","e","removeChild","createDiv","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","window","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","hasOwnProperty","prop","prototype","call","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","adaptCSSVal","val","toLowerCase","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","x","y","absoluteCoordinates","rect","left","pageYOffset","top","pageXOffset","_classPrivateFieldGet","receiver","privateMap","descriptor","get","TypeError","_classPrivateFieldSet","set","writable","firstLetterToUpper","str","charAt","toUpperCase","slice","jsPrefixes","jsCache","jsAPI","name","prefix","resizeObserver","_extends","module","assign","target","arguments","apply","templateTypePrefixSuffix","optionsTemplateTypes","item","abs","round","Math","nativeScrollbarSize","body","measureElm","cSize","oSize","nativeScrollbarStyling","testElm","ex","rtlScrollBehavior","childElm","strHidden","overflowX","overflowY","parentOffset","childOffset","childOffsetAfterScroll","n","passiveEvents","supportsPassive","addEventListener","defineProperty","windowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","Environment","constructor","Set","_self","envDOM","envElm","envChildElm","nScrollBarSize","nativeScrollbarIsOverlaid","autoUpdateLoop","supportPassiveEvents","supportResizeObserver","size","dpr","onChangedListener","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","oldScrollbarSize","newScrollbarSize","forEach","listener","addListener","removeListener","delete"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"overlayscrollbars.esm.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../../../node_modules/@babel/runtime/helpers/classPrivateFieldGet.js","../../../node_modules/@babel/runtime/helpers/classPrivateFieldSet.js","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/environment/environment.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T | any, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst elementIsVisible = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n if (selector === ':visible') {\r\n return elementIsVisible(elm as HTMLElement);\r\n }\r\n if (selector === ':hidden') {\r\n return !elementIsVisible(elm as HTMLElement);\r\n }\r\n if (elm.matches(selector)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (child.matches(selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (): HTMLDivElement => document.createElement('div');\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","import { WH } from 'support/dom';\r\n\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\nimport { XY } from 'support/dom';\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","function _classPrivateFieldGet(receiver, privateMap) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n\n return descriptor.value;\n}\n\nmodule.exports = _classPrivateFieldGet;","function _classPrivateFieldSet(receiver, privateMap, value) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n if (descriptor.set) {\n descriptor.set.call(receiver, value);\n } else {\n if (!descriptor.writable) {\n throw new TypeError(\"attempted to set read only private field\");\n }\n\n descriptor.value = value;\n }\n\n return value;\n}\n\nmodule.exports = _classPrivateFieldSet;","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, indexOf, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidatedResult } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: T,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidatedResult => {\r\n const validatedOptions: T = {} as T;\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult.validated;\r\n optionsCopy[prop] = validatedResult.foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n const isEnumString = indexOf(Object.values(optionsTemplateTypes), currTemplateType) < 0;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : currTemplateType);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n foreign: optionsCopy,\r\n validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validate = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: T,\r\n doWriteErrors?: boolean\r\n): OptionsValidatedResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false);\r\n};\r\n\r\nexport { validate, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n jsAPI,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n} from 'support';\r\n\r\ntype OnEnvironmentChanged = (env: Environment) => void;\r\n\r\nconst { abs, round } = Math;\r\nconst envornmentElmId = 'os-envornment';\r\n\r\nconst nativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst nativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-native-scrollbars-invisible');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst rtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst passiveEvents = (): boolean => {\r\n let supportsPassive = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n supportsPassive = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n return supportsPassive;\r\n};\r\n\r\nconst windowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nexport class Environment {\r\n #onChangedListener: Set = new Set();\r\n\r\n _autoUpdateLoop!: boolean;\r\n\r\n _nativeScrollbarSize!: XY;\r\n\r\n _nativeScrollbarIsOverlaid!: XY;\r\n\r\n _nativeScrollbarStyling!: boolean;\r\n\r\n _rtlScrollBehavior!: { n: boolean; i: boolean };\r\n\r\n _supportPassiveEvents!: boolean;\r\n\r\n _supportResizeObserver!: boolean;\r\n\r\n constructor() {\r\n const _self = this;\r\n const { body } = document;\r\n const envDOM = createDOM(`
`);\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const nScrollBarSize = nativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nScrollBarSize.x === 0,\r\n y: nScrollBarSize.y === 0,\r\n };\r\n\r\n _self._autoUpdateLoop = false;\r\n _self._nativeScrollbarSize = nScrollBarSize;\r\n _self._nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid;\r\n _self._nativeScrollbarStyling = nativeScrollbarStyling(envElm);\r\n _self._rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm);\r\n _self._supportPassiveEvents = passiveEvents();\r\n _self._supportResizeObserver = !!jsAPI('ResizeObserver');\r\n\r\n removeAttr(envElm, 'style');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = windowDPR();\r\n const onChangedListener = this.#onChangedListener;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = windowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n const oldScrollbarSize = _self._nativeScrollbarSize;\r\n let newScrollbarSize;\r\n\r\n if (isZoom) {\r\n newScrollbarSize = _self._nativeScrollbarSize = nativeScrollbarSize(body, envElm);\r\n removeElements(envElm);\r\n\r\n if (oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) {\r\n onChangedListener.forEach((listener) => listener && listener(_self));\r\n }\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n }\r\n\r\n addListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.add(listener);\r\n }\r\n\r\n removeListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.delete(listener);\r\n }\r\n}\r\n","import { createDOM } from 'support/dom';\r\nimport { Environment } from 'environment';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n new Environment(),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["isNumber","obj","isString","isFunction","isUndefined","undefined","isArray","Array","isArrayLike","length","getSetProp","topLeft","fallback","elm","value","removeAttr","attrName","removeAttribute","scrollLeft","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","Object","keys","key","from","arr","push","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","removeElements","nodes","e","removeChild","createDiv","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","window","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","hasOwnProperty","prop","prototype","call","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","adaptCSSVal","val","toLowerCase","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","x","y","absoluteCoordinates","rect","left","pageYOffset","top","pageXOffset","_classPrivateFieldGet","receiver","privateMap","descriptor","get","TypeError","_classPrivateFieldSet","set","writable","firstLetterToUpper","str","charAt","toUpperCase","slice","jsPrefixes","jsCache","jsAPI","name","prefix","resizeObserver","_extends","module","assign","target","arguments","apply","templateTypePrefixSuffix","optionsTemplateTypes","item","abs","round","Math","envornmentElmId","nativeScrollbarSize","body","measureElm","cSize","oSize","nativeScrollbarStyling","testElm","ex","rtlScrollBehavior","childElm","strHidden","overflowX","overflowY","direction","parentOffset","childOffset","childOffsetAfterScroll","n","passiveEvents","supportsPassive","addEventListener","defineProperty","windowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","Environment","constructor","Set","_self","envDOM","envElm","envChildElm","nScrollBarSize","nativeScrollbarIsOverlaid","_autoUpdateLoop","_nativeScrollbarSize","_nativeScrollbarIsOverlaid","_nativeScrollbarStyling","_rtlScrollBehavior","_supportPassiveEvents","_supportResizeObserver","size","dpr","onChangedListener","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","oldScrollbarSize","newScrollbarSize","forEach","listener","addListener","removeListener","delete"],"mappings":"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"} \ No newline at end of file diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js b/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js index 3d805e5..2a121e2 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.esm.min.js @@ -1 +1 @@ -function e(e){return"number"==typeof e}function t(e){return"string"==typeof e}function r(e){return Array.isArray(e)}function n(t){const n=!!t&&t.length;return r(t)||!function(e){return"function"==typeof e}(t)&&e(n)&&n>-1&&n%1==0}function o(e,t){return function(e,t,r,n){if(void 0===n)return r?r[e]:t;r&&(r[e]=n)}("scrollLeft",0,e,t)}const i=/[^\x20\t\r\n\f]+/g,s=(e,r)=>{((e,r,n)=>{let o,s=0,l=!1;if(e&&t(r)){const t=r.match(i)||[];for(l=t.length>0;o=t[s++];)l=n(e.classList,o)&&l}})(e,r,(e,t)=>e.add(t))};function l(e,t){if(n(e))for(let r=0;rt(e[r],r,e));return e}const a=e=>{if(Array.from)return Array.from(e);const t=[];return l(e,e=>{t.push(e)}),t},c=(e,t)=>{((e,t,r)=>{if(r){let o,i=t;e&&(n(r)?(o=document.createDocumentFragment(),l(r,e=>{e===i&&(i=e.previousSibling),o.appendChild(e)})):o=r,t&&(i?i!==t&&(i=i.nextSibling):i=e.firstChild),e.insertBefore(o,i))}})(e,null,t)},d=e=>{if(n(e))l(a(e),e=>d(e));else if(e){const r=(t=e)?t.parentElement:null;r&&r.removeChild(e)}var t},u=e=>{const t=document.createElement("div");return t.innerHTML=e.trim(),l((r=t)?a(r.childNodes):[],e=>d(e));var r},v={w:0,h:0},f=()=>({w:window.innerWidth,h:window.innerHeight}),h={animationiterationcount:1,columncount:1,fillopacity:1,flexgrow:1,flexshrink:1,fontweight:1,lineheight:1,opacity:1,order:1,orphans:1,widows:1,zindex:1,zoom:1},w=(e,t,r)=>null!=t?t.getPropertyValue(r):e.style[r],p=(t,r,n)=>{try{t&&void 0!==t.style[r]&&(t.style[r]=((t,r)=>!h[t.toLowerCase()]&&e(r)?r+"px":r)(r,n))}catch(o){}};function y(e,n){const o=t(n);if(r(n)||o){let t=o?"":{};if(e){const r=window.getComputedStyle(e,null);t=o?w(e,r,n):n.reduce((t,n)=>(t[n]=w(e,r,n),t),t)}return t}var i;l((i=n)?Object.keys(i):[],t=>p(e,t,n[t]))}const b={x:0,y:0},g=e=>{const t=e?(e=>e.getBoundingClientRect())(e):0;return t?{x:t.left+window.pageYOffset,y:t.top+window.pageXOffset}:b};var m=function(e,t){var r=t.get(e);if(!r)throw new TypeError("attempted to get private field on non-instance");return r.get?r.get.call(e):r.value};var x=function(e,t,r){var n=t.get(e);if(!n)throw new TypeError("attempted to set private field on non-instance");if(n.set)n.set.call(e,r);else{if(!n.writable)throw new TypeError("attempted to set read only private field");n.value=r}return r};const S=["WebKit","Moz","O","MS","webkit","moz","o","ms"],z={},O=e=>{let t=z[e]||window[e];return r=z,n=e,Object.prototype.hasOwnProperty.call(r,n)||(l(S,r=>{var n;return t=t||window[r+(n=e,n.charAt(0).toUpperCase()+n.slice(1))],!t}),z[e]=t),t;var r,n};O("ResizeObserver");!function(e,t,r){e(r={path:t,exports:{},require:function(e,t){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==t&&r.path)}},r.exports),r.exports}((function(e){function t(){return e.exports=t=Object.assign||function(e){for(var t=1;t(e[t]=E[0]+t+E[1],e),{}),Math),C=(e,t)=>{c(e,t);const r=(n=t)?{w:n.clientWidth,h:n.clientHeight}:v;var n;const o=(e=>e?{w:e.offsetWidth,h:e.offsetHeight}:v)(t);return{x:o.h-r.h,y:o.w-r.w}},j=()=>{const e=window.screen.deviceXDPI||0,t=window.screen.logicalXDPI||1;return window.devicePixelRatio||e/t};var k=new WeakMap;class A{constructor(){k.set(this,{writable:!0,value:void 0}),x(this,k,new Set);const e=this,{body:t}=document,r=u('
')[0],n=r.firstChild,i=C(t,r),l={x:0===i.x,y:0===i.y};var a,c;if(e.autoUpdateLoop=!1,e.nativeScrollbarSize=i,e.nativeScrollbarIsOverlaid=l,e.nativeScrollbarStyling=(e=>{let t=!1;s(e,"os-viewport-native-scrollbars-invisible");try{t="none"===y(e,"scrollbar-width")||"none"===window.getComputedStyle(e,"::-webkit-scrollbar").getPropertyValue("display")}catch(r){}return t})(r),e.rtlScrollBehavior=((e,t)=>{y(e,{overflowX:"hidden",overflowY:"hidden"}),o(e,0);const r=g(e),n=g(t);o(e,-999);const i=g(t);return{i:r.x===n.x,n:n.x!==i.x}})(r,n),e.supportPassiveEvents=(()=>{let e=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){e=!0}}))}catch(t){}return e})(),e.supportResizeObserver=!!O("ResizeObserver"),c="style",null==(a=r)||a.removeAttribute(c),d(r),!l.x||!l.y){let n=f(),o=j();const i=m(this,k);window.addEventListener("resize",()=>{if(i.size){const s=f(),l={w:s.w-n.w,h:s.h-n.h};if(0===l.w&&0===l.h)return;const a={w:P(l.w),h:P(l.h)},c={w:P(L(s.w/(n.w/100))),h:P(L(s.h/(n.h/100)))},u=j(),v=a.w>2&&a.h>2,h=!((e,t)=>{const r=P(e),n=P(t);return!(r===n||r+1===n||r-1===n)})(c.w,c.h),w=u!==o&&o>0,p=v&&h&&w,y=e.nativeScrollbarSize;let b;p&&(b=e.nativeScrollbarSize=C(t,r),d(r),y.x===b.x&&y.y===b.y||i.forEach(t=>t&&t(e))),n=s,o=u}})}}addListener(e){m(this,k).add(e)}removeListener(e){m(this,k).delete(e)}}export default()=>[new A,u('
fdfhdfgh
')]; \ No newline at end of file +function n(n){return"number"==typeof n}function r(n){return"string"==typeof n}function t(n){return Array.isArray(n)}function o(r){const o=!!r&&r.length;return t(r)||!function(n){return"function"==typeof n}(r)&&n(o)&&o>-1&&o%1==0}function e(n,r){return function(n,r,t,o){if(void 0===o)return t?t[n]:r;t&&(t[n]=o)}("scrollLeft",0,n,r)}const i=/[^\x20\t\r\n\f]+/g,s=(n,t)=>{((n,t,o)=>{let e,s=0,c=!1;if(n&&r(t)){const r=t.match(i)||[];for(c=r.length>0;e=r[s++];)c=o(n.classList,e)&&c}})(n,t,(n,r)=>n.add(r))};function c(n,r){if(o(n))for(let t=0;tr(n[t],t,n));return n}const l=n=>{if(Array.from)return Array.from(n);const r=[];return c(n,n=>{r.push(n)}),r},a=(n,r)=>{((n,r,t)=>{if(t){let e,i=r;n&&(o(t)?(e=document.createDocumentFragment(),c(t,n=>{n===i&&(i=n.previousSibling),e.appendChild(n)})):e=t,r&&(i?i!==r&&(i=i.nextSibling):i=n.firstChild),n.insertBefore(e,i))}})(n,null,r)},d=n=>{if(o(n))c(l(n),n=>d(n));else if(n){const t=(r=n)?r.parentElement:null;t&&t.removeChild(n)}var r},u=n=>{const r=document.createElement("div");return r.innerHTML=n.trim(),c((t=r)?l(t.childNodes):[],n=>d(n));var t},v={w:0,h:0},f=()=>({w:window.innerWidth,h:window.innerHeight}),w={animationiterationcount:1,columncount:1,fillopacity:1,flexgrow:1,flexshrink:1,fontweight:1,lineheight:1,opacity:1,order:1,orphans:1,widows:1,zindex:1,zoom:1},h=(n,r,t)=>null!=r?r.getPropertyValue(t):n.style[t],b=(r,t,o)=>{try{r&&void 0!==r.style[t]&&(r.style[t]=((r,t)=>!w[r.toLowerCase()]&&n(t)?t+"px":t)(t,o))}catch(e){}};function p(n,o){const e=r(o);if(t(o)||e){let r=e?"":{};if(n){const t=window.getComputedStyle(n,null);r=e?h(n,t,o):o.reduce((r,o)=>(r[o]=h(n,t,o),r),r)}return r}var i;c((i=o)?Object.keys(i):[],r=>b(n,r,o[r]))}const y={x:0,y:0},m=n=>{const r=n?(n=>n.getBoundingClientRect())(n):0;return r?{x:r.left+window.pageYOffset,y:r.top+window.pageXOffset}:y};var g=function(n,r){var t=r.get(n);if(!t)throw new TypeError("attempted to get private field on non-instance");return t.get?t.get.call(n):t.value};var x=function(n,r,t){var o=r.get(n);if(!o)throw new TypeError("attempted to set private field on non-instance");if(o.set)o.set.call(n,t);else{if(!o.writable)throw new TypeError("attempted to set read only private field");o.value=t}return t};const z=["WebKit","Moz","O","MS","webkit","moz","o","ms"],O={},j=n=>{let r=O[n]||window[n];return t=O,o=n,Object.prototype.hasOwnProperty.call(t,o)||(c(z,t=>{var o;return r=r||window[t+(o=n,o.charAt(0).toUpperCase()+o.slice(1))],!r}),O[n]=r),r;var t,o};j("ResizeObserver");!function(n,r,t){n(t={path:r,exports:{},require:function(n,r){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==r&&t.path)}},t.exports),t.exports}((function(n){function r(){return n.exports=r=Object.assign||function(n){for(var r=1;r(n[r]=k[0]+r+k[1],n),{}),Math),T=(n,r)=>{a(n,r);const t=(o=r)?{w:o.clientWidth,h:o.clientHeight}:v;var o;const e=(n=>n?{w:n.offsetWidth,h:n.offsetHeight}:v)(r);return{x:e.h-t.h,y:e.w-t.w}},L=()=>{const n=window.screen.deviceXDPI||0,r=window.screen.logicalXDPI||1;return window.devicePixelRatio||n/r};var M=new WeakMap;class A{constructor(){M.set(this,{writable:!0,value:void 0}),x(this,M,new Set);const n=this,{body:r}=document,t=u('
')[0],o=t.firstChild,i=T(r,t),c={x:0===i.x,y:0===i.y};var l,a;if(n.t=!1,n.o=i,n.s=c,n.l=(n=>{let r=!1;s(n,"os-viewport-native-scrollbars-invisible");try{r="none"===p(n,"scrollbar-width")||"none"===window.getComputedStyle(n,"::-webkit-scrollbar").getPropertyValue("display")}catch(t){}return r})(t),n.u=((n,r)=>{p(n,{overflowX:"hidden",overflowY:"hidden",direction:"rtl"}),e(n,0);const t=m(n),o=m(r);e(n,-999);const i=m(r);return{i:t.x===o.x,n:o.x!==i.x}})(t,o),n.v=(()=>{let n=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){n=!0}}))}catch(r){}return n})(),n.p=!!j("ResizeObserver"),a="style",null==(l=t)||l.removeAttribute(a),d(t),!c.x||!c.y){let o=f(),e=L();const i=g(this,M);window.addEventListener("resize",()=>{if(i.size){const s=f(),c={w:s.w-o.w,h:s.h-o.h};if(0===c.w&&0===c.h)return;const l={w:_(c.w),h:_(c.h)},a={w:_(E(s.w/(o.w/100))),h:_(E(s.h/(o.h/100)))},u=L(),v=l.w>2&&l.h>2,w=!((n,r)=>{const t=_(n),o=_(r);return!(t===o||t+1===o||t-1===o)})(a.w,a.h),h=u!==e&&e>0,b=v&&w&&h,p=n.o;let y;b&&(y=n.o=T(r,t),d(t),p.x===y.x&&p.y===y.y||i.forEach(r=>r&&r(n))),o=s,e=u}})}}addListener(n){g(this,M).add(n)}removeListener(n){g(this,M).delete(n)}}export default()=>[new A,u('
fdfhdfgh
')]; \ No newline at end of file diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.js b/packages/overlayscrollbars/dist/overlayscrollbars.js index def0006..9720e6c 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.js @@ -377,6 +377,7 @@ var abs = Math.abs, round = Math.round; + var envornmentElmId = 'os-envornment'; var nativeScrollbarSize = function nativeScrollbarSize(body, measureElm) { appendChildren(body, measureElm); @@ -406,6 +407,7 @@ style(parentElm, { overflowX: strHidden, overflowY: strHidden, + direction: 'rtl', }); scrollLeft(parentElm, 0); var parentOffset = absoluteCoordinates(parentElm); @@ -463,7 +465,7 @@ var _document = document, body = _document.body; - var envDOM = createDOM('
'); + var envDOM = createDOM('
'); var envElm = envDOM[0]; var envChildElm = envElm.firstChild; var nScrollBarSize = nativeScrollbarSize(body, envElm); @@ -471,13 +473,13 @@ x: nScrollBarSize.x === 0, y: nScrollBarSize.y === 0, }; - _self.autoUpdateLoop = false; - _self.nativeScrollbarSize = nScrollBarSize; - _self.nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid; - _self.nativeScrollbarStyling = nativeScrollbarStyling(envElm); - _self.rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm); - _self.supportPassiveEvents = passiveEvents(); - _self.supportResizeObserver = !!jsAPI('ResizeObserver'); + _self._autoUpdateLoop = false; + _self._nativeScrollbarSize = nScrollBarSize; + _self._nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid; + _self._nativeScrollbarStyling = nativeScrollbarStyling(envElm); + _self._rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm); + _self._supportPassiveEvents = passiveEvents(); + _self._supportResizeObserver = !!jsAPI('ResizeObserver'); removeAttr(envElm, 'style'); removeElements(envElm); @@ -508,11 +510,11 @@ var difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h); var dprChanged = dprNew !== dpr && dpr > 0; var isZoom = deltaIsBigger && difference && dprChanged; - var oldScrollbarSize = _self.nativeScrollbarSize; + var oldScrollbarSize = _self._nativeScrollbarSize; var newScrollbarSize; if (isZoom) { - newScrollbarSize = _self.nativeScrollbarSize = nativeScrollbarSize(body, envElm); + newScrollbarSize = _self._nativeScrollbarSize = nativeScrollbarSize(body, envElm); removeElements(envElm); if (oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) { diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.js.map b/packages/overlayscrollbars/dist/overlayscrollbars.js.map index caad1b7..2b8f747 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.js.map +++ b/packages/overlayscrollbars/dist/overlayscrollbars.js.map @@ -1 +1 @@ -{"version":3,"file":"overlayscrollbars.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../../../node_modules/@babel/runtime/helpers/classPrivateFieldGet.js","../../../node_modules/@babel/runtime/helpers/classPrivateFieldSet.js","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/environment/environment.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T | any, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst elementIsVisible = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n if (selector === ':visible') {\r\n return elementIsVisible(elm as HTMLElement);\r\n }\r\n if (selector === ':hidden') {\r\n return !elementIsVisible(elm as HTMLElement);\r\n }\r\n if (elm.matches(selector)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (child.matches(selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (): HTMLDivElement => document.createElement('div');\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","import { WH } from 'support/dom';\r\n\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\nimport { XY } from 'support/dom';\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","function _classPrivateFieldGet(receiver, privateMap) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n\n return descriptor.value;\n}\n\nmodule.exports = _classPrivateFieldGet;","function _classPrivateFieldSet(receiver, privateMap, value) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n if (descriptor.set) {\n descriptor.set.call(receiver, value);\n } else {\n if (!descriptor.writable) {\n throw new TypeError(\"attempted to set read only private field\");\n }\n\n descriptor.value = value;\n }\n\n return value;\n}\n\nmodule.exports = _classPrivateFieldSet;","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, indexOf, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, OptionsValidated, Func, OptionsValidatedResult } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: OptionsValidated,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidatedResult => {\r\n const validatedOptions: OptionsValidated = {};\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult.validated;\r\n optionsCopy[prop] = validatedResult.foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n const isEnumString = indexOf(Object.values(optionsTemplateTypes), currTemplateType) < 0;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : currTemplateType);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n foreign: optionsCopy,\r\n validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validate = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: OptionsValidated,\r\n doWriteErrors?: boolean\r\n): OptionsValidatedResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || {}, doWriteErrors || false);\r\n};\r\n\r\nexport { validate, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n jsAPI,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n} from 'support';\r\n\r\ntype OnEnvironmentChanged = (env: Environment) => void;\r\n\r\nconst { abs, round } = Math;\r\n\r\nconst nativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst nativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-native-scrollbars-invisible');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst rtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst passiveEvents = (): boolean => {\r\n let supportsPassive = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n supportsPassive = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n return supportsPassive;\r\n};\r\n\r\nconst windowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nexport class Environment {\r\n #onChangedListener: Set = new Set();\r\n\r\n autoUpdateLoop!: boolean;\r\n\r\n nativeScrollbarSize!: XY;\r\n\r\n nativeScrollbarIsOverlaid!: XY;\r\n\r\n nativeScrollbarStyling!: boolean;\r\n\r\n rtlScrollBehavior!: { n: boolean; i: boolean };\r\n\r\n supportPassiveEvents!: boolean;\r\n\r\n supportResizeObserver!: boolean;\r\n\r\n constructor() {\r\n const _self = this;\r\n const { body } = document;\r\n const envDOM = createDOM('
');\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const nScrollBarSize = nativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nScrollBarSize.x === 0,\r\n y: nScrollBarSize.y === 0,\r\n };\r\n\r\n _self.autoUpdateLoop = false;\r\n _self.nativeScrollbarSize = nScrollBarSize;\r\n _self.nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid;\r\n _self.nativeScrollbarStyling = nativeScrollbarStyling(envElm);\r\n _self.rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm);\r\n _self.supportPassiveEvents = passiveEvents();\r\n _self.supportResizeObserver = !!jsAPI('ResizeObserver');\r\n\r\n removeAttr(envElm, 'style');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = windowDPR();\r\n const onChangedListener = this.#onChangedListener;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = windowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n const oldScrollbarSize = _self.nativeScrollbarSize;\r\n let newScrollbarSize;\r\n\r\n if (isZoom) {\r\n newScrollbarSize = _self.nativeScrollbarSize = nativeScrollbarSize(body, envElm);\r\n removeElements(envElm);\r\n\r\n if (oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) {\r\n onChangedListener.forEach((listener) => listener && listener(_self));\r\n }\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n }\r\n\r\n addListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.add(listener);\r\n }\r\n\r\n removeListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.delete(listener);\r\n }\r\n}\r\n","import { createDOM } from 'support/dom';\r\nimport { Environment } from 'environment';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n new Environment(),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["isNumber","obj","isString","isFunction","isUndefined","undefined","isArray","Array","isArrayLike","length","getSetProp","topLeft","fallback","elm","value","removeAttr","attrName","removeAttribute","scrollLeft","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","Object","keys","key","from","arr","push","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","removeElements","nodes","e","removeChild","createDiv","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","window","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","hasOwnProperty","prop","prototype","call","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","adaptCSSVal","val","toLowerCase","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","x","y","absoluteCoordinates","rect","left","pageYOffset","top","pageXOffset","_classPrivateFieldGet","receiver","privateMap","descriptor","get","TypeError","_classPrivateFieldSet","set","writable","firstLetterToUpper","str","charAt","toUpperCase","slice","jsPrefixes","jsCache","jsAPI","name","prefix","resizeObserver","_extends","module","assign","target","arguments","apply","templateTypePrefixSuffix","optionsTemplateTypes","item","abs","Math","round","nativeScrollbarSize","body","measureElm","cSize","oSize","nativeScrollbarStyling","testElm","ex","rtlScrollBehavior","childElm","strHidden","overflowX","overflowY","parentOffset","childOffset","childOffsetAfterScroll","n","passiveEvents","supportsPassive","addEventListener","defineProperty","windowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","Environment","Set","_self","envDOM","envElm","envChildElm","nScrollBarSize","nativeScrollbarIsOverlaid","autoUpdateLoop","supportPassiveEvents","supportResizeObserver","size","dpr","onChangedListener","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","oldScrollbarSize","newScrollbarSize","forEach","listener","addListener","removeListener","delete"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"overlayscrollbars.js","sources":["../src/support/utils/types.ts","../src/support/dom/attribute.ts","../src/support/dom/class.ts","../src/support/utils/array.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/utils/object.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../../../node_modules/@babel/runtime/helpers/classPrivateFieldGet.js","../../../node_modules/@babel/runtime/helpers/classPrivateFieldSet.js","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/environment/environment.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nexport const type: (obj: any) => string = (obj) => {\r\n if (obj === undefined) return `${obj}`;\r\n if (obj === null) return `${obj}`;\r\n return Object.prototype.toString\r\n .call(obj)\r\n .replace(/^\\[object (.+)\\]$/, '$1')\r\n .toLowerCase();\r\n};\r\n\r\nexport function isNumber(obj: any): obj is number {\r\n return typeof obj === 'number';\r\n}\r\n\r\nexport function isString(obj: any): obj is string {\r\n return typeof obj === 'string';\r\n}\r\n\r\nexport function isBoolean(obj: any): obj is boolean {\r\n return typeof obj === 'boolean';\r\n}\r\n\r\nexport function isFunction(obj: any): obj is (...args: Array) => unknown {\r\n return typeof obj === 'function';\r\n}\r\n\r\nexport function isUndefined(obj: any): obj is undefined {\r\n return obj === undefined;\r\n}\r\n\r\nexport function isNull(obj: any): obj is null {\r\n return obj === null;\r\n}\r\n\r\nexport function isArray(obj: any): obj is Array {\r\n return Array.isArray(obj);\r\n}\r\n\r\nexport function isObject(obj: any): boolean {\r\n return typeof obj === 'object' && !isArray(obj) && !isNull(obj);\r\n}\r\n\r\n/**\r\n * Returns true if the given object is array like, false otherwise.\r\n * @param obj The Object\r\n */\r\nexport function isArrayLike(obj: any): obj is ArrayLike {\r\n const length = !!obj && obj.length;\r\n return isArray(obj) || (!isFunction(obj) && isNumber(length) && length > -1 && length % 1 == 0); // eslint-disable-line eqeqeq\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isPlainObject(obj: any): obj is PlainObject {\r\n if (!obj || !isObject(obj) || type(obj) !== 'object') return false;\r\n\r\n let key;\r\n const proto = 'prototype';\r\n const { hasOwnProperty } = Object[proto];\r\n const hasOwnConstructor = hasOwnProperty.call(obj, 'constructor');\r\n const hasIsPrototypeOf = obj.constructor && obj.constructor[proto] && hasOwnProperty.call(obj.constructor[proto], 'isPrototypeOf');\r\n\r\n if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\r\n return false;\r\n }\r\n\r\n /* eslint-disable no-restricted-syntax */\r\n for (key in obj) {\r\n /**/\r\n }\r\n /* eslint-enable */\r\n\r\n return isUndefined(key) || hasOwnProperty.call(obj, key);\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a HTMLElement.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isHTMLElement(obj: any): obj is HTMLElement {\r\n const instaceOfRightHandSide = window.HTMLElement;\r\n const doInstanceOf = isObject(instaceOfRightHandSide) || isFunction(instaceOfRightHandSide);\r\n return !!(doInstanceOf ? obj instanceof instaceOfRightHandSide : obj && isObject(obj) && obj.nodeType === 1 && isString(obj.nodeName));\r\n}\r\n\r\n/**\r\n * Returns true if the given object is empty, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport function isEmptyObject(obj: any): boolean {\r\n /* eslint-disable no-restricted-syntax, guard-for-in */\r\n for (const name in obj) return false;\r\n return true;\r\n /* eslint-enable */\r\n}\r\n","import { isUndefined } from 'support/utils/types';\r\n\r\ntype GetSetPropName = 'scrollLeft' | 'scrollTop' | 'value';\r\n\r\nfunction getSetProp(\r\n topLeft: GetSetPropName,\r\n fallback: number | string,\r\n elm: HTMLElement | HTMLInputElement | null,\r\n value?: number | string\r\n): number | string | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm[topLeft] : fallback;\r\n }\r\n elm && (elm[topLeft] = value);\r\n}\r\n\r\n/**\r\n * Gets or sets a attribute with the given attribute of the given element depending whether the value attribute is given.\r\n * Returns null if the element has no attribute with the given name.\r\n * @param elm The element of which the attribute shall be get or set.\r\n * @param attrName The attribute name which shall be get or set.\r\n * @param value The value of the attribute which shall be set.\r\n */\r\nexport function attr(elm: HTMLElement | null, attrName: string): string | null;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value: string): void;\r\nexport function attr(elm: HTMLElement | null, attrName: string, value?: string): string | null | void {\r\n if (isUndefined(value)) {\r\n return elm ? elm.getAttribute(attrName) : null;\r\n }\r\n elm && elm.setAttribute(attrName, value);\r\n}\r\n\r\n/**\r\n * Removes the given attribute from the given element.\r\n * @param elm The element of which the attribute shall be removed.\r\n * @param attrName The attribute name.\r\n */\r\nexport const removeAttr = (elm: Element | null, attrName: string): void => {\r\n elm?.removeAttribute(attrName);\r\n};\r\n\r\n/**\r\n * Gets or sets the scrollLeft value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollLeft value shall be get or set.\r\n * @param value The scrollLeft value which shall be set.\r\n */\r\nexport function scrollLeft(elm: HTMLElement | null): number;\r\nexport function scrollLeft(elm: HTMLElement | null, value: number): void;\r\nexport function scrollLeft(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollLeft', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the scrollTop value of the given element depending whether the value attribute is given.\r\n * @param elm The element of which the scrollTop value shall be get or set.\r\n * @param value The scrollTop value which shall be set.\r\n */\r\nexport function scrollTop(elm: HTMLElement | null): number;\r\nexport function scrollTop(elm: HTMLElement | null, value: number): void;\r\nexport function scrollTop(elm: HTMLElement | null, value?: number): number | void {\r\n return getSetProp('scrollTop', 0, elm, value) as number;\r\n}\r\n\r\n/**\r\n * Gets or sets the value of the given input element depending whether the value attribute is given.\r\n * @param elm The input element of which the value shall be get or set.\r\n * @param value The value which shall be set.\r\n */\r\nexport function val(elm: HTMLInputElement | null): string;\r\nexport function val(elm: HTMLInputElement | null, value: string): void;\r\nexport function val(elm: HTMLInputElement | null, value?: string): string | void {\r\n return getSetProp('value', '', elm, value) as string;\r\n}\r\n","import { isString } from 'support/utils/types';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (elm: Element | null, className: string, action: (elmClassList: DOMTokenList, clazz: string) => boolean | void): boolean => {\r\n let clazz: string;\r\n let i = 0;\r\n let result = false;\r\n\r\n if (elm && isString(className)) {\r\n const classes: Array = className.match(rnothtmlwhite) || [];\r\n result = classes.length > 0;\r\n while ((clazz = classes[i++])) {\r\n result = (action(elm.classList, clazz) as boolean) && result;\r\n }\r\n }\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the given element has the given class name(s).\r\n * @param elm The element.\r\n * @param className The class name(s).\r\n */\r\nexport const hasClass = (elm: Element | null, className: string): boolean =>\r\n classListAction(elm, className, (classList, clazz) => classList.contains(clazz));\r\n\r\n/**\r\n * Adds the given class name(s) to the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be added. (separated by spaces)\r\n */\r\nexport const addClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.add(clazz));\r\n};\r\n\r\n/**\r\n * Removes the given class name(s) from the given element.\r\n * @param elm The element.\r\n * @param className The class name(s) which shall be removed. (separated by spaces)\r\n */\r\nexport const removeClass = (elm: Element | null, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null;\r\nexport function each(\r\n arrayLikeObject: ArrayLike,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike;\r\nexport function each(\r\n arrayLikeObject: ArrayLike | null,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(obj: PlainObject | null, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject | null;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null,\r\n callback: (value: T | any, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null {\r\n if (isArrayLike(source)) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (callback(source[i], i, source) === false) {\r\n break;\r\n }\r\n }\r\n } else if (source) {\r\n each(Object.keys(source), (key) => callback(source[key], key, source));\r\n }\r\n return source;\r\n}\r\n\r\n/**\r\n * Returns the index of the given inside the given array or -1 if the given item isn't part of the given array.\r\n * @param arr The array.\r\n * @param item The item.\r\n * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\r\n */\r\nexport const indexOf = (arr: Array, item: T, fromIndex?: number): number => arr.indexOf(item, fromIndex);\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n each(arr, (elm) => {\r\n result.push(elm);\r\n });\r\n return result;\r\n};\r\n","import { each, from } from 'support/utils/array';\r\n\r\nconst elementIsVisible = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\n\r\n/**\r\n * Find all elements with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const find = (selector: string, elm?: Element | null): ReadonlyArray => {\r\n const arr: Array = [];\r\n\r\n each((elm || document).querySelectorAll(selector), (e: Element) => {\r\n arr.push(e);\r\n });\r\n\r\n return arr;\r\n};\r\n\r\n/**\r\n * Find the first element with the passed selector, outgoing (and including) the passed element or the document if no element was provided.\r\n * @param selector The selector which has to be searched by.\r\n * @param elm The element from which the search shall be outgoing.\r\n */\r\nexport const findFirst = (selector: string, elm?: Element | null): Element | null => (elm || document).querySelector(selector);\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nexport const is = (elm: Element | null, selector: string): boolean => {\r\n if (elm) {\r\n if (selector === ':visible') {\r\n return elementIsVisible(elm as HTMLElement);\r\n }\r\n if (selector === ':hidden') {\r\n return !elementIsVisible(elm as HTMLElement);\r\n }\r\n if (elm.matches(selector)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Returns the children (no text-nodes or comments) of the passed element which are matching the passed selector. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the children shall be returned.\r\n * @param selector The selector which must match with the children elements.\r\n */\r\nexport const children = (elm: Element | null, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n each(elm && elm.children, (child: Element) => {\r\n if (selector) {\r\n if (child.matches(selector)) {\r\n childs.push(child);\r\n }\r\n } else {\r\n childs.push(child);\r\n }\r\n });\r\n\r\n return childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nexport const contents = (elm: Element | null): ReadonlyArray => (elm ? from(elm.childNodes) : []);\r\n\r\n/**\r\n * Returns the parent element of the passed element, or null if the passed element is null.\r\n * @param elm The element of which the parent element shall be returned.\r\n */\r\nexport const parent = (elm: Node | null): Node | null => (elm ? elm.parentElement : null);\r\n","import { isArrayLike } from 'support/utils/types';\r\nimport { each, from } from 'support/utils/array';\r\nimport { parent } from 'support/dom/traversal';\r\n\r\ntype NodeCollection = ArrayLike | Node | undefined | null;\r\n\r\n/**\r\n * Inserts Nodes before the given preferredAnchor element.\r\n * @param parentElm The parent of the preferredAnchor element or the element which shall be the parent of the inserted Nodes.\r\n * @param preferredAnchor The element before which the Nodes shall be inserted or null if the elements shall be appended at the end.\r\n * @param insertedElms The Nodes which shall be inserted.\r\n */\r\nconst before = (parentElm: Node | null, preferredAnchor: Node | null, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null = preferredAnchor;\r\n let fragment: DocumentFragment | Node | undefined | null;\r\n\r\n // parent must be defined\r\n if (parentElm) {\r\n if (isArrayLike(insertedElms)) {\r\n fragment = document.createDocumentFragment();\r\n\r\n // append all insertedElms to the fragment and if one of these is the anchor, change the anchor\r\n each(insertedElms, (insertedElm) => {\r\n if (insertedElm === anchor) {\r\n anchor = insertedElm.previousSibling;\r\n }\r\n fragment!.appendChild(insertedElm);\r\n });\r\n } else {\r\n fragment = insertedElms;\r\n }\r\n\r\n // if the preferred anchor isn't null set it to a valid anchor\r\n if (preferredAnchor) {\r\n if (!anchor) {\r\n anchor = parentElm.firstChild;\r\n } else if (anchor !== preferredAnchor) {\r\n anchor = anchor.nextSibling;\r\n }\r\n }\r\n\r\n parentElm.insertBefore(fragment, anchor);\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Appends the given children at the end of the given Node.\r\n * @param node The Node to which the children shall be appended.\r\n * @param children The Nodes which shall be appended.\r\n */\r\nexport const appendChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, null, children);\r\n};\r\n\r\n/**\r\n * Prepends the given children at the start of the given Node.\r\n * @param node The Node to which the children shall be prepended.\r\n * @param children The Nodes which shall be prepended.\r\n */\r\nexport const prependChildren = (node: Node | null, children: NodeCollection): void => {\r\n before(node, node && node.firstChild, children);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes before the given Node.\r\n * @param node The Node before which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertBefore = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node, insertedNodes);\r\n};\r\n\r\n/**\r\n * Inserts the given Nodes after the given Node.\r\n * @param node The Node after which the given Nodes shall be inserted.\r\n * @param insertedNodes The Nodes which shall be inserted.\r\n */\r\nexport const insertAfter = (node: Node | null, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (): HTMLDivElement => document.createElement('div');\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","import { WH } from 'support/dom';\r\n\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the offset- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the offset- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.offsetWidth,\r\n h: elm.offsetHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the client- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the client- width and height shall be returned.\r\n */\r\nexport const clientSize = (elm: HTMLElement | null): WH =>\r\n elm\r\n ? {\r\n w: elm.clientWidth,\r\n h: elm.clientHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n","import { isArray, isFunction, isPlainObject, isNull } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\n\r\n/**\r\n * Determines whether the passed object has a property with the passed name.\r\n * @param obj The object.\r\n * @param prop The name of the property.\r\n */\r\nexport const hasOwnProperty = (obj: any, prop: string | number | symbol): boolean => Object.prototype.hasOwnProperty.call(obj, prop);\r\n\r\n/**\r\n * Returns the names of the enumerable string properties and methods of an object.\r\n * @param obj The object of which the properties shall be returned.\r\n */\r\nexport const keys = (obj: any): Array => (obj ? Object.keys(obj) : []);\r\n\r\n// https://github.com/jquery/jquery/blob/master/src/core.js#L116\r\nexport function assignDeep(target: T, object1: U): T & U;\r\nexport function assignDeep(target: T, object1: U, object2: V): T & U & V;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W): T & U & V & W;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X): T & U & V & W & X;\r\nexport function assignDeep(target: T, object1: U, object2: V, object3: W, object4: X, object5: Y): T & U & V & W & X & Y;\r\nexport function assignDeep(\r\n target: T,\r\n object1?: U,\r\n object2?: V,\r\n object3?: W,\r\n object4?: X,\r\n object5?: Y,\r\n object6?: Z\r\n): T & U & V & W & X & Y & Z {\r\n const sources: Array = [object1, object2, object3, object4, object5, object6];\r\n\r\n // Handle case when target is a string or something (possible in deep copy)\r\n if ((typeof target !== 'object' || isNull(target)) && !isFunction(target)) {\r\n target = {} as T;\r\n }\r\n\r\n each(sources, (source) => {\r\n // Extend the base object\r\n each(keys(source), (key) => {\r\n const copy: any = source[key];\r\n\r\n // Prevent Object.prototype pollution\r\n // Prevent never-ending loop\r\n if (target === copy) {\r\n return true;\r\n }\r\n\r\n const copyIsArray = isArray(copy);\r\n\r\n // Recurse if we're merging plain objects or arrays\r\n if (copy && (isPlainObject(copy) || copyIsArray)) {\r\n const src = target[key];\r\n let clone: any = src;\r\n\r\n // Ensure proper type for the source value\r\n if (copyIsArray && !isArray(src)) {\r\n clone = [];\r\n } else if (!copyIsArray && !isPlainObject(src)) {\r\n clone = {};\r\n }\r\n\r\n // Never move original objects, clone them\r\n target[key] = assignDeep(clone, copy) as any;\r\n } else {\r\n target[key] = copy;\r\n }\r\n });\r\n });\r\n\r\n // Return the modified object\r\n return target as any;\r\n}\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null, prop: string, val: string | number): void => {\r\n try {\r\n if (elm && elm.style[prop] !== undefined) {\r\n elm.style[prop] = adaptCSSVal(prop, val);\r\n }\r\n } catch (e) {}\r\n};\r\n\r\n/**\r\n * Gets or sets the passed styles to the passed element.\r\n * @param elm The element to which the styles shall be applied to / be read from.\r\n * @param styles The styles which shall be set or read.\r\n */\r\nexport function style(elm: HTMLElement | null, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null, styles: string): string;\r\nexport function style(elm: HTMLElement | null, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null, styles: CssStyles | Array | string): { [key: string]: string } | string | void {\r\n const getSingleStyle = isString(styles);\r\n const getStyles = isArray(styles) || getSingleStyle;\r\n\r\n if (getStyles) {\r\n let getStylesResult: string | PlainObject = getSingleStyle ? '' : {};\r\n if (elm) {\r\n const computedStyle: CSSStyleDeclaration = window.getComputedStyle(elm, null);\r\n getStylesResult = getSingleStyle\r\n ? getCSSVal(elm, computedStyle, styles as string)\r\n : (styles as Array).reduce((result, key) => {\r\n result[key] = getCSSVal(elm, computedStyle, key as string);\r\n return result;\r\n }, getStylesResult);\r\n }\r\n return getStylesResult;\r\n }\r\n each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));\r\n}\r\n\r\n/**\r\n * Hides the passed element (display: none).\r\n * @param elm The element which shall be hidden.\r\n */\r\nexport const hide = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'none' });\r\n};\r\n\r\n/**\r\n * Shows the passed element (display: block).\r\n * @param elm The element which shall be shown.\r\n */\r\nexport const show = (elm: HTMLElement | null): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\nimport { XY } from 'support/dom';\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null): XY => {\r\n const rect = elm ? getBoundingClientRect(elm) : 0;\r\n return rect\r\n ? {\r\n x: rect.left + window.pageYOffset,\r\n y: rect.top + window.pageXOffset,\r\n }\r\n : zeroObj;\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const offsetCoordinates = (elm: HTMLElement | null): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","function _classPrivateFieldGet(receiver, privateMap) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to get private field on non-instance\");\n }\n\n if (descriptor.get) {\n return descriptor.get.call(receiver);\n }\n\n return descriptor.value;\n}\n\nmodule.exports = _classPrivateFieldGet;","function _classPrivateFieldSet(receiver, privateMap, value) {\n var descriptor = privateMap.get(receiver);\n\n if (!descriptor) {\n throw new TypeError(\"attempted to set private field on non-instance\");\n }\n\n if (descriptor.set) {\n descriptor.set.call(receiver, value);\n } else {\n if (!descriptor.writable) {\n throw new TypeError(\"attempted to set read only private field\");\n }\n\n descriptor.value = value;\n }\n\n return value;\n}\n\nmodule.exports = _classPrivateFieldSet;","import { each, hasOwnProperty } from 'support/utils';\r\nimport { createDiv } from 'support/dom';\r\n\r\nconst firstLetterToUpper = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\r\nconst getDummyStyle = (): CSSStyleDeclaration => createDiv().style;\r\n\r\n// https://developer.mozilla.org/en-US/docs/Glossary/Vendor_Prefix\r\n\r\nexport const cssPrefixes: ReadonlyArray = ['-webkit-', '-moz-', '-o-', '-ms-'];\r\nexport const jsPrefixes: ReadonlyArray = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];\r\n\r\nexport const jsCache: { [key: string]: any } = {};\r\nexport const cssCache: { [key: string]: string } = {};\r\n\r\n/**\r\n * Gets the name of the given CSS property with vendor prefix if it isn't supported without, or undefined if unsupported.\r\n * @param name The name of the CSS property which shall be get.\r\n */\r\nexport const cssProperty = (name: string): string | undefined => {\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const uppercasedName: string = firstLetterToUpper(name);\r\n const elmStyle: CSSStyleDeclaration = getDummyStyle();\r\n\r\n each(cssPrefixes, (prefix: string) => {\r\n const prefixWithoutDashes: string = prefix.replace(/-/g, '');\r\n const resultPossibilities: Array = [\r\n name, // transition\r\n prefix + name, // -webkit-transition\r\n prefixWithoutDashes + uppercasedName, // webkitTransition\r\n firstLetterToUpper(prefixWithoutDashes) + uppercasedName, // WebkitTransition\r\n ];\r\n result = resultPossibilities.find((resultPossibility: string) => elmStyle[resultPossibility] !== undefined);\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the name of the given CSS property value(s), with vendor prefix if it isn't supported wuthout, or undefined if no value is supported.\r\n * @param property The CSS property to which the CSS property value(s) belong.\r\n * @param values The value(s) separated by spaces which shall be get.\r\n * @param suffix A suffix which is added to each value in case the value is a function or something else more advanced.\r\n */\r\nexport const cssPropertyValue = (property: string, values: string, suffix?: string): string | undefined => {\r\n const name = `${property} ${values}`;\r\n let result: string | undefined = cssCache[name];\r\n\r\n if (hasOwnProperty(cssCache, name)) {\r\n return result;\r\n }\r\n\r\n const dummyStyle: CSSStyleDeclaration = getDummyStyle();\r\n const possbleValues: Array = values.split(' ');\r\n const preparedSuffix: string = suffix || '';\r\n const cssPrefixesWithFirstEmpty = [''].concat(cssPrefixes);\r\n\r\n each(possbleValues, (possibleValue: string) => {\r\n each(cssPrefixesWithFirstEmpty, (prefix: string) => {\r\n const prop = prefix + possibleValue;\r\n dummyStyle.cssText = `${property}:${prop}${preparedSuffix}`;\r\n if (dummyStyle.length) {\r\n result = prop;\r\n return false;\r\n }\r\n });\r\n return !result;\r\n });\r\n\r\n cssCache[name] = result;\r\n return result;\r\n};\r\n\r\n/**\r\n * Get the requested JS function, object or constructor with vendor prefix if it isn't supported without or undefined if unsupported.\r\n * @param name The name of the JS function, object or constructor.\r\n */\r\nexport const jsAPI = (name: string): T | undefined => {\r\n let result: any = jsCache[name] || window[name];\r\n\r\n if (hasOwnProperty(jsCache, name)) {\r\n return result;\r\n }\r\n\r\n each(jsPrefixes, (prefix: string) => {\r\n result = result || window[prefix + firstLetterToUpper(name)];\r\n return !result;\r\n });\r\n\r\n jsCache[name] = result;\r\n return result;\r\n};\r\n","import { jsAPI } from 'support/compatibility/vendors';\r\n\r\nexport const resizeObserver: any | undefined = jsAPI('ResizeObserver');\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, indexOf, hasOwnProperty, keys } from 'support/utils';\r\nimport { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidatedResult } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: T,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidatedResult => {\r\n const validatedOptions: T = {} as T;\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult.validated;\r\n optionsCopy[prop] = validatedResult.foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n const isEnumString = indexOf(Object.values(optionsTemplateTypes), currTemplateType) < 0;\r\n if (isEnumString && isString(optionsValue)) {\r\n // split it into a array which contains all possible values for example: [\"yes\", \"no\", \"maybe\"]\r\n const enumStringSplit = currTemplateType.split(' ');\r\n isValid = !!enumStringSplit.find((possibility) => possibility === optionsValue);\r\n\r\n // build error message\r\n errorEnumStrings.push(...enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n errorPossibleTypes.push(isEnumString ? optionsTemplateTypes.string : currTemplateType);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n foreign: optionsCopy,\r\n validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validate = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: T,\r\n doWriteErrors?: boolean\r\n): OptionsValidatedResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false);\r\n};\r\n\r\nexport { validate, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType; // eslint-disable-line @typescript-eslint/ban-types\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n jsAPI,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n} from 'support';\r\n\r\ntype OnEnvironmentChanged = (env: Environment) => void;\r\n\r\nconst { abs, round } = Math;\r\nconst envornmentElmId = 'os-envornment';\r\n\r\nconst nativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst nativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, 'os-viewport-native-scrollbars-invisible');\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst rtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst passiveEvents = (): boolean => {\r\n let supportsPassive = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n supportsPassive = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n return supportsPassive;\r\n};\r\n\r\nconst windowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nexport class Environment {\r\n #onChangedListener: Set = new Set();\r\n\r\n _autoUpdateLoop!: boolean;\r\n\r\n _nativeScrollbarSize!: XY;\r\n\r\n _nativeScrollbarIsOverlaid!: XY;\r\n\r\n _nativeScrollbarStyling!: boolean;\r\n\r\n _rtlScrollBehavior!: { n: boolean; i: boolean };\r\n\r\n _supportPassiveEvents!: boolean;\r\n\r\n _supportResizeObserver!: boolean;\r\n\r\n constructor() {\r\n const _self = this;\r\n const { body } = document;\r\n const envDOM = createDOM(`
`);\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const nScrollBarSize = nativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nScrollBarSize.x === 0,\r\n y: nScrollBarSize.y === 0,\r\n };\r\n\r\n _self._autoUpdateLoop = false;\r\n _self._nativeScrollbarSize = nScrollBarSize;\r\n _self._nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid;\r\n _self._nativeScrollbarStyling = nativeScrollbarStyling(envElm);\r\n _self._rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm);\r\n _self._supportPassiveEvents = passiveEvents();\r\n _self._supportResizeObserver = !!jsAPI('ResizeObserver');\r\n\r\n removeAttr(envElm, 'style');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = windowDPR();\r\n const onChangedListener = this.#onChangedListener;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = windowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n const oldScrollbarSize = _self._nativeScrollbarSize;\r\n let newScrollbarSize;\r\n\r\n if (isZoom) {\r\n newScrollbarSize = _self._nativeScrollbarSize = nativeScrollbarSize(body, envElm);\r\n removeElements(envElm);\r\n\r\n if (oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) {\r\n onChangedListener.forEach((listener) => listener && listener(_self));\r\n }\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n }\r\n\r\n addListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.add(listener);\r\n }\r\n\r\n removeListener(listener: OnEnvironmentChanged): void {\r\n this.#onChangedListener.delete(listener);\r\n }\r\n}\r\n","import { createDOM } from 'support/dom';\r\nimport { Environment } from 'environment';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n new Environment(),\r\n createDOM(\r\n '\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["isNumber","obj","isString","isFunction","isUndefined","undefined","isArray","Array","isArrayLike","length","getSetProp","topLeft","fallback","elm","value","removeAttr","attrName","removeAttribute","scrollLeft","rnothtmlwhite","classListAction","className","action","clazz","i","result","classes","match","classList","addClass","add","each","source","callback","Object","keys","key","from","arr","push","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","document","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","removeElements","nodes","e","removeChild","createDiv","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","window","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","getBoundingClientRect","hasOwnProperty","prop","prototype","call","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","adaptCSSVal","val","toLowerCase","getCSSVal","computedStyle","getPropertyValue","style","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","x","y","absoluteCoordinates","rect","left","pageYOffset","top","pageXOffset","_classPrivateFieldGet","receiver","privateMap","descriptor","get","TypeError","_classPrivateFieldSet","set","writable","firstLetterToUpper","str","charAt","toUpperCase","slice","jsPrefixes","jsCache","jsAPI","name","prefix","resizeObserver","_extends","module","assign","target","arguments","apply","templateTypePrefixSuffix","optionsTemplateTypes","item","abs","Math","round","envornmentElmId","nativeScrollbarSize","body","measureElm","cSize","oSize","nativeScrollbarStyling","testElm","ex","rtlScrollBehavior","childElm","strHidden","overflowX","overflowY","direction","parentOffset","childOffset","childOffsetAfterScroll","n","passiveEvents","supportsPassive","addEventListener","defineProperty","windowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","Environment","Set","_self","envDOM","envElm","envChildElm","nScrollBarSize","nativeScrollbarIsOverlaid","_autoUpdateLoop","_nativeScrollbarSize","_nativeScrollbarIsOverlaid","_nativeScrollbarStyling","_rtlScrollBehavior","_supportPassiveEvents","_supportResizeObserver","size","dpr","onChangedListener","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","oldScrollbarSize","newScrollbarSize","forEach","listener","addListener","removeListener","delete"],"mappings":"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"} \ No newline at end of file diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.min.js b/packages/overlayscrollbars/dist/overlayscrollbars.min.js index 0e3784e..7cd0cc2 100644 --- a/packages/overlayscrollbars/dist/overlayscrollbars.min.js +++ b/packages/overlayscrollbars/dist/overlayscrollbars.min.js @@ -1 +1 @@ -!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(e="undefined"!=typeof globalThis?globalThis:e||self).OverlayScrollbars=r()}(this,(function(){"use strict";function e(e){return"number"==typeof e}function r(e){return"string"==typeof e}function t(e){return Array.isArray(e)}function n(r){var n=!!r&&r.length;return t(r)||!function(e){return"function"==typeof e}(r)&&e(n)&&n>-1&&n%1==0}function i(e,r){return function(e,r,t,n){if(void 0===n)return t?t[e]:r;t&&(t[e]=n)}("scrollLeft",0,e,r)}var o=/[^\x20\t\r\n\f]+/g,a=function(e,t){!function(e,t,n){var i,a=0,s=!1;if(e&&r(t)){var l=t.match(o)||[];for(s=l.length>0;i=l[a++];)s=n(e.classList,i)&&s}}(e,t,(function(e,r){return e.add(r)}))};function s(e,r){if(n(e))for(var t=0;t
')[0],s=o.firstChild,l=j(n,o),c={x:0===l.x,y:0===l.y};if(t.autoUpdateLoop=!1,t.nativeScrollbarSize=l,t.nativeScrollbarIsOverlaid=c,t.nativeScrollbarStyling=function(e){var r=!1;a(e,"os-viewport-native-scrollbars-invisible");try{r="none"===y(e,"scrollbar-width")||"none"===window.getComputedStyle(e,"::-webkit-scrollbar").getPropertyValue("display")}catch(t){}return r}(o),t.rtlScrollBehavior=function(e,r){y(e,{overflowX:"hidden",overflowY:"hidden"}),i(e,0);var t=g(e),n=g(r);i(e,-999);var o=g(r);return{i:t.x===n.x,n:n.x!==o.x}}(o,s),t.supportPassiveEvents=function(){var e=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){e=!0}}))}catch(r){}return e}(),t.supportResizeObserver=!!z("ResizeObserver"),r="style",null==(e=o)||e.removeAttribute(r),u(o),!c.x||!c.y){var d=v(),h=C(),p=m(this,k);window.addEventListener("resize",(function(){if(p.size){var e=v(),r={w:e.w-d.w,h:e.h-d.h};if(0===r.w&&0===r.h)return;var i,a={w:P(r.w),h:P(r.h)},s={w:P(L(e.w/(d.w/100))),h:P(L(e.h/(d.h/100)))},l=C(),c=a.w>2&&a.h>2,f=(b=s.h,g=P(s.w),m=P(b),!(g!==m&&g+1!==m&&g-1!==m)),w=c&&f&&(l!==h&&h>0),y=t.nativeScrollbarSize;w&&(i=t.nativeScrollbarSize=j(n,o),u(o),y.x===i.x&&y.y===i.y||p.forEach((function(e){return e&&e(t)}))),d=e,h=l}var b,g,m}))}}var r=e.prototype;return r.addListener=function(e){m(this,k).add(e)},r.removeListener=function(e){m(this,k).delete(e)},e}();return function(){return[new T,f('
fdfhdfgh
')]}})); \ No newline at end of file +!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):(n="undefined"!=typeof globalThis?globalThis:n||self).OverlayScrollbars=r()}(this,(function(){"use strict";function n(n){return"number"==typeof n}function r(n){return"string"==typeof n}function t(n){return Array.isArray(n)}function i(r){var i=!!r&&r.length;return t(r)||!function(n){return"function"==typeof n}(r)&&n(i)&&i>-1&&i%1==0}function o(n,r){return function(n,r,t,i){if(void 0===i)return t?t[n]:r;t&&(t[n]=i)}("scrollLeft",0,n,r)}var e=/[^\x20\t\r\n\f]+/g,u=function(n,t){!function(n,t,i){var o,u=0,c=!1;if(n&&r(t)){var a=t.match(e)||[];for(c=a.length>0;o=a[u++];)c=i(n.classList,o)&&c}}(n,t,(function(n,r){return n.add(r)}))};function c(n,r){if(i(n))for(var t=0;t
')[0],c=e.firstChild,a=E(i,e),f={x:0===a.x,y:0===a.y};if(t.t=!1,t.o=a,t.u=f,t.s=function(n){var r=!1;u(n,"os-viewport-native-scrollbars-invisible");try{r="none"===p(n,"scrollbar-width")||"none"===window.getComputedStyle(n,"::-webkit-scrollbar").getPropertyValue("display")}catch(t){}return r}(e),t.l=function(n,r){p(n,{overflowX:"hidden",overflowY:"hidden",direction:"rtl"}),o(n,0);var t=m(n),i=m(r);o(n,-999);var e=m(r);return{i:t.x===i.x,n:i.x!==e.x}}(e,c),t.v=function(){var n=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){n=!0}}))}catch(r){}return n}(),t.p=!!O("ResizeObserver"),r="style",null==(n=e)||n.removeAttribute(r),s(e),!f.x||!f.y){var v=d(),w=M(),h=g(this,A);window.addEventListener("resize",(function(){if(h.size){var n=d(),r={w:n.w-v.w,h:n.h-v.h};if(0===r.w&&0===r.h)return;var o,u={w:k(r.w),h:k(r.h)},c={w:k(_(n.w/(v.w/100))),h:k(_(n.h/(v.h/100)))},a=M(),f=u.w>2&&u.h>2,l=(y=c.h,m=k(c.w),g=k(y),!(m!==g&&m+1!==g&&m-1!==g)),b=f&&l&&(a!==w&&w>0),p=t.o;b&&(o=t.o=E(i,e),s(e),p.x===o.x&&p.y===o.y||h.forEach((function(n){return n&&n(t)}))),v=n,w=a}var y,m,g}))}}var r=n.prototype;return r.addListener=function(n){g(this,A).add(n)},r.removeListener=function(n){g(this,A).delete(n)},n}();return function(){return[new q,l('
fdfhdfgh
')]}})); \ No newline at end of file diff --git a/packages/overlayscrollbars/src/environment/environment.ts b/packages/overlayscrollbars/src/environment/environment.ts index 7161567..963c17b 100644 --- a/packages/overlayscrollbars/src/environment/environment.ts +++ b/packages/overlayscrollbars/src/environment/environment.ts @@ -17,6 +17,7 @@ import { type OnEnvironmentChanged = (env: Environment) => void; const { abs, round } = Math; +const envornmentElmId = 'os-envornment'; const nativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => { appendChildren(body, measureElm); @@ -42,7 +43,7 @@ const nativeScrollbarStyling = (testElm: HTMLElement): boolean => { const rtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => { const strHidden = 'hidden'; - style(parentElm, { overflowX: strHidden, overflowY: strHidden }); + style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' }); scrollLeft(parentElm, 0); const parentOffset = absoluteCoordinates(parentElm); @@ -105,24 +106,24 @@ const diffBiggerThanOne = (valOne: number, valTwo: number): boolean => { export class Environment { #onChangedListener: Set = new Set(); - autoUpdateLoop!: boolean; + _autoUpdateLoop!: boolean; - nativeScrollbarSize!: XY; + _nativeScrollbarSize!: XY; - nativeScrollbarIsOverlaid!: XY; + _nativeScrollbarIsOverlaid!: XY; - nativeScrollbarStyling!: boolean; + _nativeScrollbarStyling!: boolean; - rtlScrollBehavior!: { n: boolean; i: boolean }; + _rtlScrollBehavior!: { n: boolean; i: boolean }; - supportPassiveEvents!: boolean; + _supportPassiveEvents!: boolean; - supportResizeObserver!: boolean; + _supportResizeObserver!: boolean; constructor() { const _self = this; const { body } = document; - const envDOM = createDOM('
'); + const envDOM = createDOM(`
`); const envElm = envDOM[0] as HTMLElement; const envChildElm = envElm.firstChild as HTMLElement; @@ -132,13 +133,13 @@ export class Environment { y: nScrollBarSize.y === 0, }; - _self.autoUpdateLoop = false; - _self.nativeScrollbarSize = nScrollBarSize; - _self.nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid; - _self.nativeScrollbarStyling = nativeScrollbarStyling(envElm); - _self.rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm); - _self.supportPassiveEvents = passiveEvents(); - _self.supportResizeObserver = !!jsAPI('ResizeObserver'); + _self._autoUpdateLoop = false; + _self._nativeScrollbarSize = nScrollBarSize; + _self._nativeScrollbarIsOverlaid = nativeScrollbarIsOverlaid; + _self._nativeScrollbarStyling = nativeScrollbarStyling(envElm); + _self._rtlScrollBehavior = rtlScrollBehavior(envElm, envChildElm); + _self._supportPassiveEvents = passiveEvents(); + _self._supportResizeObserver = !!jsAPI('ResizeObserver'); removeAttr(envElm, 'style'); removeElements(envElm); @@ -172,11 +173,11 @@ export class Environment { const dprChanged = dprNew !== dpr && dpr > 0; const isZoom = deltaIsBigger && difference && dprChanged; - const oldScrollbarSize = _self.nativeScrollbarSize; + const oldScrollbarSize = _self._nativeScrollbarSize; let newScrollbarSize; if (isZoom) { - newScrollbarSize = _self.nativeScrollbarSize = nativeScrollbarSize(body, envElm); + newScrollbarSize = _self._nativeScrollbarSize = nativeScrollbarSize(body, envElm); removeElements(envElm); if (oldScrollbarSize.x !== newScrollbarSize.x || oldScrollbarSize.y !== newScrollbarSize.y) { diff --git a/packages/overlayscrollbars/src/overlayscrollbars.scss b/packages/overlayscrollbars/src/overlayscrollbars.scss new file mode 100644 index 0000000..fc5929b --- /dev/null +++ b/packages/overlayscrollbars/src/overlayscrollbars.scss @@ -0,0 +1,48 @@ +@import './sizeobserver.scss'; + +#os-envornment { + position: fixed; + opacity: 0; + visibility: hidden; + overflow: scroll; + height: 500px; + width: 500px; +} +#os-envornment > div { + width: 200%; + height: 200%; + margin: 10px 0; +} +/* fix restricted measuring */ +#os-envornment:before, +#os-envornment:after, +.os-content:before, +.os-content:after { + content: ''; + display: table; + width: 0.01px; + height: 0.01px; + line-height: 0; + font-size: 0; + flex-grow: 0; + flex-shrink: 0; + visibility: hidden; +} +#os-envornment, +.os-viewport { + -ms-overflow-style: scrollbar !important; +} +.os-viewport-native-scrollbars-invisible#os-envornment, +.os-viewport-native-scrollbars-invisible.os-viewport { + scrollbar-width: none !important; +} +.os-viewport-native-scrollbars-invisible#os-envornment::-webkit-scrollbar, +.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar, +.os-viewport-native-scrollbars-invisible#os-envornment::-webkit-scrollbar-corner, +.os-viewport-native-scrollbars-invisible.os-viewport::-webkit-scrollbar-corner { + display: none !important; + width: 0px !important; + height: 0px !important; + visibility: hidden !important; + background: transparent !important; +} diff --git a/packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts b/packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts new file mode 100644 index 0000000..01720df --- /dev/null +++ b/packages/overlayscrollbars/src/overlayscrollbars/OverlayScrollbars.ts @@ -0,0 +1,54 @@ +import { validate, assignDeep } from 'support'; +import { Options, optionsTemplate } from 'options'; +import { TargetElement } from 'overlayscrollbars'; +import { Environment } from 'environment'; + +let ENVIRONMENT: Environment; + +interface UpdateHints { + _changedOptions: Options; +} + +interface OverlayScrollbarsInstanceVars { + _documentElm: Document; + _windowElm: Window; + _htmlElm: HTMLElement; + _bodyElm: HTMLElement; + _targetElm: TargetElement; + _isTextarea: boolean; + _isBody: boolean; + _currentOptions: Options; + _setOptions(newOptions: Options): Options; + _update(updateHints: UpdateHints): void; +} +/* +const initSingletons = () => { + if (!ENVIRONMENT) { + ENVIRONMENT = new Environment(); + } +}; + +export class OverlayScrollbars { + #instanceVars: OverlayScrollbarsInstanceVars = { + _setOptions(newOptions: Options): Options { + const { _currentOptions } = this; + const { validated } = validate(newOptions, optionsTemplate, _currentOptions, true); + + this._currentOptions = assignDeep({}, _currentOptions, validated); + + return validated; + }, + }; + + constructor(target: HTMLElement, options: Options) { + this.#instanceVars._documentElm = document; + this.#instanceVars._windowElm = window; + this.#instanceVars._htmlElm = document.body; + this.#instanceVars._bodyElm = document.body; + this.#instanceVars._targetElm = document.body; + this.#instanceVars._isTextarea = false; + this.#instanceVars._isBody = false; + initSingletons(); + } +} +*/ diff --git a/packages/overlayscrollbars/src/overlayscrollbars/index.ts b/packages/overlayscrollbars/src/overlayscrollbars/index.ts new file mode 100644 index 0000000..8377403 --- /dev/null +++ b/packages/overlayscrollbars/src/overlayscrollbars/index.ts @@ -0,0 +1,3 @@ +export * from 'overlayscrollbars'; + +export type TargetElement = HTMLElement | HTMLTextAreaElement; diff --git a/packages/overlayscrollbars/src/overlayscrollbars/lifecycles/StructureLifecycle.ts b/packages/overlayscrollbars/src/overlayscrollbars/lifecycles/StructureLifecycle.ts new file mode 100644 index 0000000..a1aaee1 --- /dev/null +++ b/packages/overlayscrollbars/src/overlayscrollbars/lifecycles/StructureLifecycle.ts @@ -0,0 +1,18 @@ +import { OverlayScrollbarsLifecycle } from 'overlayscrollbars/lifecycles'; + +export interface StructureLifecycleOptions { + _paddingAbsolute: boolean; + _autoSizeCapable: boolean; + _heightAuto: boolean; + _widthAuto: boolean; + _border: [number, number, number, number]; + _padding: [number, number, number, number]; + _margin: [number, number, number, number]; +} + +export class StructureLifecycle extends OverlayScrollbarsLifecycle { + // eslint-disable-next-line + _update(options?: StructureLifecycleOptions): void {} + // eslint-disable-next-line + _destruct(): void {} +} diff --git a/packages/overlayscrollbars/src/overlayscrollbars/lifecycles/index.ts b/packages/overlayscrollbars/src/overlayscrollbars/lifecycles/index.ts new file mode 100644 index 0000000..30fc536 --- /dev/null +++ b/packages/overlayscrollbars/src/overlayscrollbars/lifecycles/index.ts @@ -0,0 +1,14 @@ +import { PlainObject } from 'typings'; +import { Environment } from 'environment'; + +export abstract class OverlayScrollbarsLifecycle { + protected environment: Environment; + + constructor(environment: Environment) { + this.environment = environment; + } + + abstract _update(options?: T): void; + + abstract _destruct(): void; +} diff --git a/packages/overlayscrollbars/src/overlayscrollbars/observers/createSizeObserver.ts b/packages/overlayscrollbars/src/overlayscrollbars/observers/createSizeObserver.ts new file mode 100644 index 0000000..05f3b7d --- /dev/null +++ b/packages/overlayscrollbars/src/overlayscrollbars/observers/createSizeObserver.ts @@ -0,0 +1,92 @@ +import { createDOM, style, appendChildren, offsetSize, scrollLeft, scrollTop, jsAPI, addClass, each } from 'support'; + +const animationStartEventName = 'animationstart mozAnimationStart webkitAnimationStart MSAnimationStart'; +const scrollEventName = 'scroll'; +const scrollAmount = 3333333; +const ResizeObserverConstructor = jsAPI('ResizeObserver'); +const classNameSizeObserver = 'os-size-observer'; +const classNameSizeObserverListener = `${classNameSizeObserver}-listener`; +const classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`; +const classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`; +const cAF = cancelAnimationFrame; +const rAF = requestAnimationFrame; + +// TODO: +// 1. handling for event listeners (animationStartEventName.split(' ')) +// 2. return not just element but also destruction function +// 3. shorthand handling for preventDefault & stopPropagation etc. +// 4. add test for appearance (display: none => display: block) +// 5. add functionality & tests for direction change +// 6. MAYBE add comparison function to offsetSize etc. +// 7. Create test utils (waitFor) + +export const createSizeObserver = (onSizeChangedCallback: () => void) => { + const baseElements = createDOM(`
`); + const sizeObserver = baseElements[0] as HTMLElement; + const listenerElement = sizeObserver.firstChild as HTMLElement; + if (ResizeObserverConstructor) { + addClass(sizeObserver, 'resize-observer'); + const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallback); + resizeObserverInstance.observe(listenerElement); + } else { + const observerElementChildren = createDOM( + `
` + ); + appendChildren(listenerElement, observerElementChildren); + const observerElementChildrenRoot = observerElementChildren[0] as HTMLElement; + const shrinkElement = observerElementChildrenRoot.lastChild as HTMLElement; + const expandElement = observerElementChildrenRoot.firstChild as HTMLElement; + const expandElementChild = expandElement?.firstChild as HTMLElement; + + let cacheSize = offsetSize(listenerElement); + let currSize = cacheSize; + let isDirty = false; + let rAFId: number; + + const reset = () => { + scrollLeft(expandElement, scrollAmount); + scrollTop(expandElement, scrollAmount); + scrollLeft(shrinkElement, scrollAmount); + scrollTop(shrinkElement, scrollAmount); + }; + const onResized = function () { + rAFId = 0; + if (!isDirty) return; + + cacheSize = currSize; + onSizeChangedCallback(); + }; + const onScroll = (scrollEvent?: Event) => { + currSize = offsetSize(listenerElement); + isDirty = currSize.w !== cacheSize.w || currSize.h !== cacheSize.h; + + if (scrollEvent && isDirty && !rAFId) { + cAF(rAFId); + rAFId = rAF(onResized); + } else if (!scrollEvent) onResized(); + + reset(); + if (scrollEvent) { + scrollEvent.preventDefault(); + scrollEvent.stopPropagation(); + } + return false; + }; + + expandElement.addEventListener(scrollEventName, onScroll); + shrinkElement.addEventListener(scrollEventName, onScroll); + each(animationStartEventName.split(' '), (eventName) => { + sizeObserver.addEventListener(eventName, () => { + onScroll(); + }); + }); + // lets assume that the divs will never be that large and a constant value is enough + style(expandElementChild, { + width: scrollAmount, + height: scrollAmount, + }); + reset(); + } + + return sizeObserver; +}; diff --git a/packages/overlayscrollbars/src/sizeobserver.scss b/packages/overlayscrollbars/src/sizeobserver.scss new file mode 100644 index 0000000..27960a1 --- /dev/null +++ b/packages/overlayscrollbars/src/sizeobserver.scss @@ -0,0 +1,70 @@ +$scrollbar-cushion: 100px; + +.os-size-observer, +.os-size-observer-listener { + padding: inherit; + margin: 0; + pointer-events: none; + overflow: hidden; + visibility: hidden; +} + +.os-size-observer, +.os-size-observer-listener, +.os-size-observer-listener-item, +.os-size-observer-listener-item-final { + position: absolute; + left: 0; + top: 0; +} + +.os-size-observer { + height: 100%; + width: 100%; + z-index: -1; + animation-duration: 0.001s; + animation-name: os-size-observer-appear-animation; + + &.resize-observer { + .os-size-observer-listener { + position: absolute; + box-sizing: border-box; + } + } +} + +.os-size-observer-listener { + display: block; + height: 200%; + width: 200%; + box-sizing: content-box; + + // lets assume no scrollbar is 100px wide + & > .os-size-observer-listener-item { + top: -$scrollbar-cushion; + right: -$scrollbar-cushion; + bottom: -$scrollbar-cushion; + left: -$scrollbar-cushion; + } +} + +.os-size-observer-listener-item { + right: 0; + bottom: 0; + overflow: hidden; + direction: ltr; + flex: none; +} + +.os-size-observer-listener-item-final { + transition: none; +} + +@keyframes os-size-observer-appear-animation { + from { + z-index: 0; + } + to { + z-index: -1; + } +} diff --git a/packages/overlayscrollbars/src/some.css b/packages/overlayscrollbars/src/some.css deleted file mode 100644 index ae844dc..0000000 --- a/packages/overlayscrollbars/src/some.css +++ /dev/null @@ -1,3 +0,0 @@ -body { - background: blue; -} diff --git a/packages/overlayscrollbars/src/some.scss b/packages/overlayscrollbars/src/some.scss deleted file mode 100644 index bcdcf98..0000000 --- a/packages/overlayscrollbars/src/some.scss +++ /dev/null @@ -1,5 +0,0 @@ -$c: red; - -body { - background: $c; -} diff --git a/packages/overlayscrollbars/src/support/options/index.ts b/packages/overlayscrollbars/src/support/options/index.ts index 56a4c5b..a46b746 100644 --- a/packages/overlayscrollbars/src/support/options/index.ts +++ b/packages/overlayscrollbars/src/support/options/index.ts @@ -19,12 +19,9 @@ export type OptionsTemplate> = { ? OptionsTemplateValue : never; }; -export type OptionsValidated = { - [P in keyof T]?: OptionsValidated; -}; export type OptionsValidatedResult = { readonly foreign: PlainObject; - readonly validated: OptionsValidated; + readonly validated: T; }; // Options With Options Template Typings: export type OptionsAndOptionsTemplateValue = [T, OptionsTemplateValue]; @@ -48,5 +45,5 @@ type OptionsTemplateValueNonEnum = | OptionsTemplateType | [OptionsTemplateType, ...Array]; type ExtractPropsKey = { - [P in keyof T]: TProps extends T[P] ? P : never; -}[keyof T]; \ No newline at end of file + [P in keyof T]: TProps extends T[P] ? P : never; +}[keyof T]; diff --git a/packages/overlayscrollbars/src/support/options/validation.ts b/packages/overlayscrollbars/src/support/options/validation.ts index b64ab61..21118ca 100644 --- a/packages/overlayscrollbars/src/support/options/validation.ts +++ b/packages/overlayscrollbars/src/support/options/validation.ts @@ -1,6 +1,6 @@ import { each, indexOf, hasOwnProperty, keys } from 'support/utils'; import { type, isArray, isUndefined, isEmptyObject, isPlainObject, isString } from 'support/utils/types'; -import { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, OptionsValidated, Func, OptionsValidatedResult } from 'support/options'; +import { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidatedResult } from 'support/options'; import { PlainObject } from 'typings'; const { stringify } = JSON; @@ -43,11 +43,11 @@ const optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number const validateRecursive = ( options: T, template: OptionsTemplate>, - optionsDiff: OptionsValidated, + optionsDiff: T, doWriteErrors?: boolean, propPath?: string ): OptionsValidatedResult => { - const validatedOptions: OptionsValidated = {}; + const validatedOptions: T = {} as T; const optionsCopy: T = { ...options }; const props = keys(template).filter((prop) => hasOwnProperty(options, prop)); @@ -143,7 +143,7 @@ const validateRecursive = ( const validate = ( options: T, template: OptionsTemplate>, - optionsDiff?: OptionsValidated, + optionsDiff?: T, doWriteErrors?: boolean ): OptionsValidatedResult => { /* @@ -155,7 +155,7 @@ const validate = ( Object.assign(result.validated, foreign); } */ - return validateRecursive(options, template, optionsDiff || {}, doWriteErrors || false); + return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false); }; export { validate, optionsTemplateTypes }; diff --git a/packages/overlayscrollbars/tests/puppeteer/Environment/index.test.ts b/packages/overlayscrollbars/tests/puppeteer/Environment/index.test.ts index 8a08968..c156c16 100644 --- a/packages/overlayscrollbars/tests/puppeteer/Environment/index.test.ts +++ b/packages/overlayscrollbars/tests/puppeteer/Environment/index.test.ts @@ -1,3 +1,4 @@ +import { Environment } from 'environment'; import url from './.build/build.html'; describe('Environment', () => { @@ -6,10 +7,13 @@ describe('Environment', () => { }); it('should be titled "Environment"', async () => { - await expect(page).toMatchElement('#a'); - await expect(page).toMatchElement('#b'); - await expect(page).toMatchElement('#c'); - await expect(page).toMatchElement('#d'); + //await expect(page).toMatchElement('#a'); + //await expect(page).toMatchElement('#b'); + //await expect(page).toMatchElement('#c'); + //await expect(page).toMatchElement('#d'); + + const a: Environment = await page.evaluate(() => window.envInstance); + console.log(a); await expect(page.title()).resolves.toMatch('Environment'); }); }); diff --git a/packages/overlayscrollbars/tests/puppeteer/Environment/index.ts b/packages/overlayscrollbars/tests/puppeteer/Environment/index.ts index bf3c451..8eb6e85 100644 --- a/packages/overlayscrollbars/tests/puppeteer/Environment/index.ts +++ b/packages/overlayscrollbars/tests/puppeteer/Environment/index.ts @@ -1,7 +1,7 @@ +import 'overlayscrollbars.scss'; import { Environment } from 'environment'; -import 'some.scss'; -import 'some.css'; -document.body.append(JSON.stringify(new Environment())); +window.envInstance = new Environment(); +document.body.textContent = JSON.stringify(window.envInstance); export { Environment }; diff --git a/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.html b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.html new file mode 100644 index 0000000..f7b44ad --- /dev/null +++ b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.html @@ -0,0 +1,23 @@ + + + + + + + +Detected resizes: 0 +
+ +
diff --git a/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.scss b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.scss new file mode 100644 index 0000000..7226546 --- /dev/null +++ b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.scss @@ -0,0 +1,37 @@ +#target { + border: 2px solid red; + overflow: scroll; + resize: both; + position: relative; +} + +.padding0 { + padding: 0; +} +.padding10 { + padding: 10px; +} +.padding50 { + padding: 50px; +} + +.heightAuto { + height: auto; +} +.height200 { + height: 200px; +} +.heightHundred { + height: 100%; +} + +.widthAuto { + width: auto; + float: left; +} +.width200 { + width: 200px; +} +.widthHundred { + width: 100%; +} diff --git a/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.test.ts b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.test.ts new file mode 100644 index 0000000..f327962 --- /dev/null +++ b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.test.ts @@ -0,0 +1,15 @@ +import expectPuppeteer from 'expect-puppeteer'; +import url from './.build/build.html'; + +describe('Environment', () => { + beforeAll(async () => { + await page.goto(url); + }); + + it('test', async () => { + await expectPuppeteer(page).toClick('#start'); + await expectPuppeteer(page).toMatchElement('#testResult.passed', { + timeout: 30000, + }); + }, 30000); +}); diff --git a/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.ts b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.ts new file mode 100644 index 0000000..2a0deb7 --- /dev/null +++ b/packages/overlayscrollbars/tests/puppeteer/SizeObserver/index.ts @@ -0,0 +1,128 @@ +import 'overlayscrollbars.scss'; +import './index.scss'; +import { createSizeObserver } from 'overlayscrollbars/observers/createSizeObserver'; +import { from, removeClass, addClass } from 'support'; + +const targetElm = document.querySelector('#target'); +const heightSelect: HTMLSelectElement | null = document.querySelector('#height'); +const widthSelect: HTMLSelectElement | null = document.querySelector('#width'); +const paddingSelect: HTMLSelectElement | null = document.querySelector('#padding'); +const startBtn: HTMLButtonElement | null = document.querySelector('#start'); +const resizesSlot: HTMLButtonElement | null = document.querySelector('#resizes'); + +const getSelectOptions = (selectElement: HTMLSelectElement) => { + const arr = from(selectElement.options).map((option) => option.value); + return arr; +}; + +const selectCallback = (event: Event) => { + const target = event.target as HTMLSelectElement; + const selectedOption = target.value; + const selectOptions = getSelectOptions(target); + + removeClass(targetElm, selectOptions.join(' ')); + addClass(targetElm, selectedOption); +}; + +heightSelect?.addEventListener('change', selectCallback); +widthSelect?.addEventListener('change', selectCallback); +paddingSelect?.addEventListener('change', selectCallback); + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +selectCallback({ target: heightSelect }); +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +selectCallback({ target: widthSelect }); +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +selectCallback({ target: paddingSelect }); + +let iterations = 0; +const observerElm = createSizeObserver(() => { + iterations += 1; + requestAnimationFrame(() => { + if (resizesSlot) { + resizesSlot.textContent = iterations.toString(); + } + }); +}); + +targetElm?.appendChild(observerElm); + +const waitFor = (func: () => any) => { + const start = Date.now(); + + return new Promise((resolve, reject) => { + const intervalId = setInterval(() => { + const now = Date.now(); + + if (func()) { + clearInterval(intervalId); + resolve(); + } + if (now - start > 5000) { + clearInterval(intervalId); + window.setTestResult(false); + reject(); + } + }, 30); + }); +}; + +const iterateSelect = async (select: HTMLSelectElement | null, afterEach?: () => any) => { + if (select) { + const selectOptions = getSelectOptions(select); + const selectOptionsReversed = getSelectOptions(select).reverse(); + const iterateOptions = [...selectOptions, ...selectOptionsReversed]; + for (let i = 0; i < iterateOptions.length; i++) { + const option = iterateOptions[i]; + const currValue = select.value; + if (option === currValue) { + continue; + } + select.value = option; + const currIterations = iterations; + + let event; + if (typeof Event === 'function') { + event = new Event('change'); + } else { + event = document.createEvent('Event'); + event.initEvent('change', true, true); + } + select.dispatchEvent(event); + + // eslint-disable-next-line + await waitFor(() => iterations === currIterations + 1); + + if (typeof afterEach === 'function') { + // eslint-disable-next-line + await afterEach(); + } + } + } +}; + +window.iteratePadding = async (afterEach?: () => any) => { + await iterateSelect(paddingSelect, afterEach); +}; +window.iterateHeight = async (afterEach?: () => any) => { + await iterateSelect(heightSelect, afterEach); +}; +window.iterateWidth = async (afterEach?: () => any) => { + await iterateSelect(widthSelect, afterEach); +}; + +const start = (window.iterate = async () => { + window.setTestResult(null); + targetElm?.removeAttribute('style'); + await iterateHeight(async () => { + await iterateWidth(async () => { + await iteratePadding(); + }); + }); + window.setTestResult(true); +}); + +startBtn?.addEventListener('click', start); diff --git a/packages/overlayscrollbars/types/environment/environment.d.ts b/packages/overlayscrollbars/types/environment/environment.d.ts index 89ce019..1953c04 100644 --- a/packages/overlayscrollbars/types/environment/environment.d.ts +++ b/packages/overlayscrollbars/types/environment/environment.d.ts @@ -2,16 +2,16 @@ import { XY } from 'support'; declare type OnEnvironmentChanged = (env: Environment) => void; export declare class Environment { #private; - autoUpdateLoop: boolean; - nativeScrollbarSize: XY; - nativeScrollbarIsOverlaid: XY; - nativeScrollbarStyling: boolean; - rtlScrollBehavior: { + _autoUpdateLoop: boolean; + _nativeScrollbarSize: XY; + _nativeScrollbarIsOverlaid: XY; + _nativeScrollbarStyling: boolean; + _rtlScrollBehavior: { n: boolean; i: boolean; }; - supportPassiveEvents: boolean; - supportResizeObserver: boolean; + _supportPassiveEvents: boolean; + _supportResizeObserver: boolean; constructor(); addListener(listener: OnEnvironmentChanged): void; removeListener(listener: OnEnvironmentChanged): void; diff --git a/packages/overlayscrollbars/types/overlayscrollbars/OverlayScrollbars.d.ts b/packages/overlayscrollbars/types/overlayscrollbars/OverlayScrollbars.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/overlayscrollbars/types/overlayscrollbars/OverlayScrollbars.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/overlayscrollbars/types/overlayscrollbars/index.d.ts b/packages/overlayscrollbars/types/overlayscrollbars/index.d.ts new file mode 100644 index 0000000..9e5e234 --- /dev/null +++ b/packages/overlayscrollbars/types/overlayscrollbars/index.d.ts @@ -0,0 +1,2 @@ +export * from 'overlayscrollbars'; +export declare type TargetElement = HTMLElement | HTMLTextAreaElement; diff --git a/packages/overlayscrollbars/types/overlayscrollbars/lifecycles/StructureLifecycle.d.ts b/packages/overlayscrollbars/types/overlayscrollbars/lifecycles/StructureLifecycle.d.ts new file mode 100644 index 0000000..8b3f0d2 --- /dev/null +++ b/packages/overlayscrollbars/types/overlayscrollbars/lifecycles/StructureLifecycle.d.ts @@ -0,0 +1,14 @@ +import { OverlayScrollbarsLifecycle } from 'overlayscrollbars/lifecycles'; +export interface StructureLifecycleOptions { + _paddingAbsolute: boolean; + _autoSizeCapable: boolean; + _heightAuto: boolean; + _widthAuto: boolean; + _border: [number, number, number, number]; + _padding: [number, number, number, number]; + _margin: [number, number, number, number]; +} +export declare class StructureLifecycle extends OverlayScrollbarsLifecycle { + _update(options?: StructureLifecycleOptions): void; + _destruct(): void; +} diff --git a/packages/overlayscrollbars/types/overlayscrollbars/lifecycles/index.d.ts b/packages/overlayscrollbars/types/overlayscrollbars/lifecycles/index.d.ts new file mode 100644 index 0000000..7c8a980 --- /dev/null +++ b/packages/overlayscrollbars/types/overlayscrollbars/lifecycles/index.d.ts @@ -0,0 +1,8 @@ +import { PlainObject } from 'typings'; +import { Environment } from 'environment'; +export declare abstract class OverlayScrollbarsLifecycle { + protected environment: Environment; + constructor(environment: Environment); + abstract _update(options?: T): void; + abstract _destruct(): void; +} diff --git a/packages/overlayscrollbars/types/overlayscrollbars/observers/createSizeObserver.d.ts b/packages/overlayscrollbars/types/overlayscrollbars/observers/createSizeObserver.d.ts new file mode 100644 index 0000000..e58856d --- /dev/null +++ b/packages/overlayscrollbars/types/overlayscrollbars/observers/createSizeObserver.d.ts @@ -0,0 +1 @@ +export declare const createSizeObserver: (onSizeChangedCallback: () => void) => HTMLElement; diff --git a/packages/overlayscrollbars/types/support/options/index.d.ts b/packages/overlayscrollbars/types/support/options/index.d.ts index 945a27c..6f0634b 100644 --- a/packages/overlayscrollbars/types/support/options/index.d.ts +++ b/packages/overlayscrollbars/types/support/options/index.d.ts @@ -9,12 +9,9 @@ export declare type OptionsTemplateValue> = { [P in keyof T]: PlainObject extends T[P] ? OptionsTemplate> : T[P] extends OptionsTemplateNativeTypes ? OptionsTemplateValue : never; }; -export declare type OptionsValidated = { - [P in keyof T]?: OptionsValidated; -}; export declare type OptionsValidatedResult = { readonly foreign: PlainObject; - readonly validated: OptionsValidated; + readonly validated: T; }; export declare type OptionsAndOptionsTemplateValue = [T, OptionsTemplateValue]; export declare type OptionsAndOptionsTemplate> = { diff --git a/packages/overlayscrollbars/types/support/options/validation.d.ts b/packages/overlayscrollbars/types/support/options/validation.d.ts index fb69df7..90756c8 100644 --- a/packages/overlayscrollbars/types/support/options/validation.d.ts +++ b/packages/overlayscrollbars/types/support/options/validation.d.ts @@ -1,7 +1,7 @@ -import { OptionsTemplate, OptionsTemplateType, OptionsValidated, Func, OptionsValidatedResult } from 'support/options'; +import { OptionsTemplate, OptionsTemplateType, Func, OptionsValidatedResult } from 'support/options'; import { PlainObject } from 'typings'; declare const optionsTemplateTypes: OptionsTemplateTypesDictionary; -declare const validate: >(options: T, template: OptionsTemplate>, optionsDiff?: OptionsValidated | undefined, doWriteErrors?: boolean | undefined) => OptionsValidatedResult; +declare const validate: >(options: T, template: OptionsTemplate>, optionsDiff?: T | undefined, doWriteErrors?: boolean | undefined) => OptionsValidatedResult; export { validate, optionsTemplateTypes }; declare type OptionsTemplateTypesDictionary = { readonly boolean: OptionsTemplateType; diff --git a/rollup.config.base.js b/rollup.config.base.js index 5cf35e1..b2986fb 100644 --- a/rollup.config.base.js +++ b/rollup.config.base.js @@ -66,7 +66,7 @@ const resolvePath = (basePath, pathToResolve, appendExt) => { const resolveConfig = (config) => { if (typeof config === 'function') { - return config(rollupConfigDefaults) || {}; + return config(rollupConfigDefaults, legacyBabelConfig, esmBabelConfig) || {}; } return config; }; @@ -164,6 +164,12 @@ const rollupConfig = (config = {}, { project = process.cwd(), overwrite = {}, si rollupTerser({ ecma: 8, safari10: true, + mangle: { + safari10: true, + properties: { + regex: /^_/, + }, + }, }), ], } diff --git a/yarn.lock b/yarn.lock index e93e453..925e379 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2543,6 +2543,11 @@ core-js@^2.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"