diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js
index 44147b2..4d34ed3 100644
--- a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js
+++ b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js
@@ -388,34 +388,10 @@ const equal = (a, b, props) => {
};
const equalWH = (a, b) => equal(a, b, ['w', 'h']);
const equalXY = (a, b) => equal(a, b, ['x', 'y']);
-const equalTRBL = (a, b) => equal(a, b, ['t', 'r', 'b', 'l']);
const firstLetterToUpper = (str) => str.charAt(0).toUpperCase() + str.slice(1);
-
-const getDummyStyle = () => createDiv().style;
-
-const cssPrefixes = ['-webkit-', '-moz-', '-o-', '-ms-'];
const jsPrefixes = ['WebKit', 'Moz', 'O', 'MS', 'webkit', 'moz', 'o', 'ms'];
const jsCache = {};
-const cssCache = {};
-const cssProperty = (name) => {
- let result = cssCache[name];
-
- if (hasOwnProperty$1(cssCache, name)) {
- return result;
- }
-
- const uppercasedName = firstLetterToUpper(name);
- const elmStyle = getDummyStyle();
- each(cssPrefixes, (prefix) => {
- const prefixWithoutDashes = prefix.replace(/-/g, '');
- const resultPossibilities = [name, prefix + name, prefixWithoutDashes + uppercasedName, firstLetterToUpper(prefixWithoutDashes) + uppercasedName];
- result = resultPossibilities.find((resultPossibility) => elmStyle[resultPossibility] !== undefined);
- return !result;
- });
- cssCache[name] = result;
- return result;
-};
const jsAPI = (name) => {
let result = jsCache[name] || window[name];
@@ -476,11 +452,6 @@ const cssNumber = {
zoom: 1,
};
-const parseToZeroOrNumber = (value, toFloat) => {
- const num = toFloat ? parseFloat(value) : parseInt(value, 10);
- return Number.isNaN(num) ? 0 : num;
-};
-
const adaptCSSVal = (prop, val) => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);
const getCSSVal = (elm, computedStyle, prop) => (computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop]);
@@ -515,20 +486,6 @@ function style(elm, styles) {
each(keys(styles), (key) => setCSSVal(elm, key, styles[key]));
}
-const topRightBottomLeft = (elm, property) => {
- const finalProp = property || '';
- const top = `${finalProp}-top`;
- const right = `${finalProp}-right`;
- const bottom = `${finalProp}-bottom`;
- const left = `${finalProp}-left`;
- const result = style(elm, [top, right, bottom, left]);
- return {
- t: parseToZeroOrNumber(result[top]),
- r: parseToZeroOrNumber(result[right]),
- b: parseToZeroOrNumber(result[bottom]),
- l: parseToZeroOrNumber(result[left]),
- };
-};
const zeroObj$1 = {
x: 0,
@@ -567,7 +524,14 @@ const createCache = (update, options) => {
};
};
- return cacheUpdate;
+ return {
+ _update: cacheUpdate,
+ _current: (force) => ({
+ _value,
+ _previous,
+ _changed: !!force,
+ }),
+ };
};
function createCommonjsModule(fn) {
@@ -710,6 +674,7 @@ const classNameHost = 'os-host';
const classNamePadding = 'os-padding';
const classNameViewport = 'os-viewport';
const classNameContent = 'os-content';
+const classNameContentArrange = `${classNameContent}-arrange`;
const classNameViewportScrollbarStyling = `${classNameViewport}-scrollbar-styled`;
const classNameSizeObserver = 'os-size-observer';
const classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;
@@ -732,18 +697,6 @@ const getNativeScrollbarSize = (body, measureElm) => {
};
};
-const getNativeScrollbarStyling = (testElm) => {
- let result = false;
- addClass(testElm, classNameViewportScrollbarStyling);
-
- try {
- result =
- style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';
- } catch (ex) {}
-
- return result;
-};
-
const getRtlScrollBehavior = (parentElm, childElm) => {
const strHidden = 'hidden';
style(parentElm, {
@@ -792,16 +745,17 @@ const createEnvironment = () => {
const envElm = envDOM[0];
const envChildElm = envElm.firstChild;
const onChangedListener = new Set();
- const nativeScrollBarSize = getNativeScrollbarSize(body, envElm);
+ const nativeScrollbarSize = getNativeScrollbarSize(body, envElm);
+ const nativeScrollbarStyling = false;
const nativeScrollbarIsOverlaid = {
- x: nativeScrollBarSize.x === 0,
- y: nativeScrollBarSize.y === 0,
+ x: nativeScrollbarSize.x === 0,
+ y: nativeScrollbarSize.y === 0,
};
const env = {
_autoUpdateLoop: false,
- _nativeScrollbarSize: nativeScrollBarSize,
+ _nativeScrollbarSize: nativeScrollbarSize,
_nativeScrollbarIsOverlaid: nativeScrollbarIsOverlaid,
- _nativeScrollbarStyling: getNativeScrollbarStyling(envElm),
+ _nativeScrollbarStyling: nativeScrollbarStyling,
_rtlScrollBehavior: getRtlScrollBehavior(envElm, envChildElm),
_flexboxGlue: getFlexboxGlue(envElm, envChildElm),
@@ -814,13 +768,12 @@ const createEnvironment = () => {
},
};
removeAttr(envElm, 'style');
- removeAttr(envElm, 'class');
removeElements(envElm);
if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {
let size = windowSize();
let dpr = getWindowDPR();
- let scrollbarSize = nativeScrollBarSize;
+ let scrollbarSize = nativeScrollbarSize;
window.addEventListener('resize', () => {
if (onChangedListener.size) {
const sizeNew = windowSize();
@@ -871,555 +824,6 @@ const getEnvironment = () => {
return environmentInstance;
};
-const getPropByPath = (obj, path) => obj && path.split('.').reduce((o, prop) => (o && hasOwnProperty$1(o, prop) ? o[prop] : undefined), obj);
-
-const createLifecycleBase = (defaultOptionsWithTemplate, initialOptions, updateFunction) => {
- const { _template: optionsTemplate, _options: defaultOptions } = transformOptions(defaultOptionsWithTemplate);
- const options = assignDeep({}, defaultOptions, validateOptions(initialOptions || {}, optionsTemplate, null, true)._validated);
-
- const update = (hints) => {
- const { _force, _changedOptions } = hints;
-
- const checkOption = (path) => ({
- _value: getPropByPath(options, path),
- _changed: _force || getPropByPath(_changedOptions, path) !== undefined,
- });
-
- updateFunction(!!_force, checkOption);
- };
-
- update({
- _force: true,
- });
- return {
- _options(newOptions) {
- if (newOptions) {
- const { _validated: _changedOptions } = validateOptions(newOptions, optionsTemplate, options, true);
-
- if (!isEmptyObject(_changedOptions)) {
- assignDeep(options, _changedOptions);
- update({
- _changedOptions,
- });
- }
- }
-
- return options;
- },
-
- _update: (_force) => {
- update({
- _force,
- });
- },
- };
-};
-
-const overflowBehaviorAllowedValues = 'visible-hidden visible-scroll scroll hidden';
-const defaultOptionsWithTemplate = {
- paddingAbsolute: [false, optionsTemplateTypes.boolean],
- overflowBehavior: {
- x: ['scroll', overflowBehaviorAllowedValues],
- y: ['scroll', overflowBehaviorAllowedValues],
- },
-};
-const cssMarginEnd = cssProperty('margin-inline-end');
-const cssBorderEnd = cssProperty('border-inline-end');
-const createStructureLifecycle = (target, initialOptions) => {
- const { _host, _padding, _viewport, _content } = target;
- const destructFns = [];
- const env = getEnvironment();
- const scrollbarsOverlaid = env._nativeScrollbarIsOverlaid;
- const supportsScrollbarStyling = env._nativeScrollbarStyling;
- const supportFlexboxGlue = env._flexboxGlue;
- const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y;
- const updatePaddingCache = createCache(() => topRightBottomLeft(_host, 'padding'), {
- _equal: equalTRBL,
- });
- const updateOverflowAmountCache = createCache(
- (ctx) => ({
- x: Math.max(0, Math.round((ctx._contentScrollSize.w - ctx._viewportSize.w) * 100) / 100),
- y: Math.max(0, Math.round((ctx._contentScrollSize.h - ctx._viewportSize.h) * 100) / 100),
- }),
- {
- _equal: equalXY,
- }
- );
- const { _options, _update } = createLifecycleBase(defaultOptionsWithTemplate, initialOptions, (force, checkOption) => {
- const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = checkOption('paddingAbsolute');
- const { _value: padding, _changed: paddingChanged } = updatePaddingCache(force);
-
- if (paddingAbsoluteChanged || paddingChanged) {
- const paddingStyle = {
- t: 0,
- r: 0,
- b: 0,
- l: 0,
- };
-
- if (!paddingAbsolute) {
- paddingStyle.t = -padding.t;
- paddingStyle.r = -(padding.r + padding.l);
- paddingStyle.b = -(padding.b + padding.t);
- paddingStyle.l = -padding.l;
- }
-
- style(_padding, {
- top: paddingStyle.t,
- left: paddingStyle.l,
- 'margin-right': paddingStyle.r,
- 'margin-bottom': paddingStyle.b,
- 'max-width': `calc(100% + ${paddingStyle.r * -1}px)`,
- });
- }
-
- const viewportOffsetSize = offsetSize(_padding);
- const contentClientSize = offsetSize(_content);
- const contentScrollSize = scrollSize(_content);
- const overflowAmuntCache = updateOverflowAmountCache(force, {
- _contentScrollSize: contentScrollSize,
- _viewportSize: {
- w: viewportOffsetSize.w + Math.max(0, contentClientSize.w - contentScrollSize.w),
- h: viewportOffsetSize.h + Math.max(0, contentClientSize.h - contentScrollSize.h),
- },
- });
- const { _value: overflowAmount, _changed: overflowAmountChanged } = overflowAmuntCache;
- console.log('overflowAmount', overflowAmount);
- console.log('overflowAmountChanged', overflowAmountChanged);
- });
-
- const onSizeChanged = () => {
- _update();
- };
-
- const onTrinsicChanged = (widthIntrinsic, heightIntrinsicCache) => {
- const { _changed, _value } = heightIntrinsicCache;
-
- if (_changed) {
- style(_content, {
- height: _value ? 'auto' : '100%',
- });
- }
- };
-
- return {
- _options,
- _update,
- _onSizeChanged: onSizeChanged,
- _onTrinsicChanged: onTrinsicChanged,
-
- _destruct() {
- runEach(destructFns);
- },
- };
-};
-
-const animationStartEventName = 'animationstart';
-const scrollEventName = 'scroll';
-const scrollAmount = 3333333;
-const directionIsRTLMap = {
- direction: ['rtl'],
-};
-
-const directionIsRTL = (elm) => {
- let isRTL = false;
- const styles = style(elm, ['direction']);
- each(styles, (value, key) => {
- isRTL = isRTL || indexOf(directionIsRTLMap[key], value) > -1;
- });
- return isRTL;
-};
-
-const domRectHasDimensions = (rect) => rect && (rect.height || rect.width);
-
-const createSizeObserver = (target, onSizeChangedCallback, options) => {
- const { _direction: observeDirectionChange = false, _appear: observeAppearChange = false } = options || {};
-
- const rtlScrollBehavior = getEnvironment()._rtlScrollBehavior;
-
- const baseElements = createDOM(`
`);
- const sizeObserver = baseElements[0];
- const listenerElement = sizeObserver.firstChild;
- const updateResizeObserverContentRectCache = createCache(0, {
- _alwaysUpdateValues: true,
- _equal: (currVal, newVal) => !(!currVal || (!domRectHasDimensions(currVal) && domRectHasDimensions(newVal))),
- });
-
- const onSizeChangedCallbackProxy = (sizeChangedContext) => {
- const hasDirectionCache = sizeChangedContext && isBoolean(sizeChangedContext._value);
- let skip = false;
-
- if (isArray(sizeChangedContext) && sizeChangedContext.length > 0) {
- const { _previous, _value, _changed } = updateResizeObserverContentRectCache(0, sizeChangedContext.pop().contentRect);
- skip = !_previous || !domRectHasDimensions(_value);
- } else if (hasDirectionCache) {
- sizeChangedContext._changed;
- }
-
- if (observeDirectionChange) {
- const rtl = hasDirectionCache ? sizeChangedContext._value : directionIsRTL(sizeObserver);
- scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount);
- scrollTop(sizeObserver, scrollAmount);
- }
-
- if (!skip) {
- onSizeChangedCallback(hasDirectionCache ? sizeChangedContext : undefined);
- }
- };
-
- const offListeners = [];
- let appearCallback = observeAppearChange ? onSizeChangedCallbackProxy : false;
-
- if (ResizeObserverConstructor) {
- const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);
- resizeObserverInstance.observe(listenerElement);
- push(offListeners, () => resizeObserverInstance.disconnect());
- } else {
- const observerElementChildren = createDOM(
- ``
- );
- appendChildren(listenerElement, observerElementChildren);
- addClass(listenerElement, classNameSizeObserverListenerScroll);
- const observerElementChildrenRoot = observerElementChildren[0];
- const shrinkElement = observerElementChildrenRoot.lastChild;
- const expandElement = observerElementChildrenRoot.firstChild;
- const expandElementChild = expandElement == null ? void 0 : expandElement.firstChild;
- let cacheSize = offsetSize(listenerElement);
- let currSize = cacheSize;
- let isDirty = false;
- let rAFId;
-
- const reset = () => {
- scrollLeft(expandElement, scrollAmount);
- scrollTop(expandElement, scrollAmount);
- scrollLeft(shrinkElement, scrollAmount);
- scrollTop(shrinkElement, scrollAmount);
- };
-
- const onResized = () => {
- rAFId = 0;
-
- if (isDirty) {
- cacheSize = currSize;
- onSizeChangedCallbackProxy();
- }
- };
-
- const onScroll = (scrollEvent) => {
- currSize = offsetSize(listenerElement);
- isDirty = !scrollEvent || !equalWH(currSize, cacheSize);
-
- if (scrollEvent && isDirty && !rAFId) {
- cAF(rAFId);
- rAFId = rAF(onResized);
- } else if (!scrollEvent) {
- onResized();
- }
-
- reset();
-
- if (scrollEvent) {
- preventDefault(scrollEvent);
- stopPropagation(scrollEvent);
- }
-
- return false;
- };
-
- push(offListeners, [on(expandElement, scrollEventName, onScroll), on(shrinkElement, scrollEventName, onScroll)]);
- style(expandElementChild, {
- width: scrollAmount,
- height: scrollAmount,
- });
- reset();
- appearCallback = observeAppearChange ? () => onScroll() : reset;
- }
-
- if (observeDirectionChange) {
- const updateDirectionIsRTLCache = createCache(() => directionIsRTL(sizeObserver));
- push(
- offListeners,
- on(sizeObserver, scrollEventName, (event) => {
- const directionIsRTLCache = updateDirectionIsRTLCache();
- const { _value, _changed } = directionIsRTLCache;
-
- if (_changed) {
- if (_value) {
- style(listenerElement, {
- left: 'auto',
- right: 0,
- });
- } else {
- style(listenerElement, {
- left: 0,
- right: 'auto',
- });
- }
-
- onSizeChangedCallbackProxy(directionIsRTLCache);
- }
-
- preventDefault(event);
- stopPropagation(event);
- return false;
- })
- );
- }
-
- if (appearCallback) {
- addClass(sizeObserver, classNameSizeObserverAppear);
- push(
- offListeners,
- on(sizeObserver, animationStartEventName, appearCallback, {
- _once: !!ResizeObserverConstructor,
- })
- );
- }
-
- prependChildren(target, sizeObserver);
- return () => {
- runEach(offListeners);
- removeElements(sizeObserver);
- };
-};
-
-const createTrinsicObserver = (target, onTrinsicChangedCallback) => {
- const trinsicObserver = createDOM(``)[0];
- const offListeners = [];
- const updateHeightIntrinsicCache = createCache(
- (ioEntryOrSize) => ioEntryOrSize.h === 0 || ioEntryOrSize.isIntersecting || ioEntryOrSize.intersectionRatio > 0,
- {
- _initialValue: false,
- }
- );
-
- if (IntersectionObserverConstructor) {
- const intersectionObserverInstance = new IntersectionObserverConstructor(
- (entries) => {
- if (entries && entries.length > 0) {
- const last = entries.pop();
-
- if (last) {
- const heightIntrinsicCache = updateHeightIntrinsicCache(0, last);
-
- if (heightIntrinsicCache._changed) {
- onTrinsicChangedCallback(false, heightIntrinsicCache);
- }
- }
- }
- },
- {
- root: target,
- }
- );
- intersectionObserverInstance.observe(trinsicObserver);
- push(offListeners, () => intersectionObserverInstance.disconnect());
- } else {
- push(
- offListeners,
- createSizeObserver(trinsicObserver, () => {
- const newSize = offsetSize(trinsicObserver);
- const heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize);
-
- if (heightIntrinsicCache._changed) {
- onTrinsicChangedCallback(false, heightIntrinsicCache);
- }
- })
- );
- }
-
- prependChildren(target, trinsicObserver);
- return () => {
- runEach(offListeners);
- removeElements(trinsicObserver);
- };
-};
-
-const createEventContentChange = (target, eventContentChange, map, callback) => {
- let eventContentChangeRef;
-
- const addEvent = (elm, eventName) => {
- const entry = map.get(elm);
- const newEntry = isUndefined(entry);
-
- const registerEvent = () => {
- map.set(elm, eventName);
- on(elm, eventName, callback);
- };
-
- if (!newEntry && eventName !== entry) {
- off(elm, entry, callback);
- registerEvent();
- } else if (newEntry) {
- registerEvent();
- }
- };
-
- const _destroy = () => {
- map.forEach((eventName, elm) => {
- off(elm, eventName, callback);
- });
- map.clear();
- };
-
- const _updateElements = (getElements) => {
- if (eventContentChangeRef) {
- const eventElmList = eventContentChangeRef.reduce((arr, item) => {
- if (item) {
- const selector = item[0];
- const eventName = item[1];
- const elements = eventName && selector && (getElements ? getElements(selector) : find(selector, target));
-
- if (elements) {
- push(arr, [elements, isFunction(eventName) ? eventName(elements) : eventName], true);
- }
- }
-
- return arr;
- }, []);
- each(eventElmList, (item) => {
- const elements = item[0];
- const eventName = item[1];
- each(elements, (elm) => {
- addEvent(elm, eventName);
- });
- });
- }
- };
-
- const _update = (newEventContentChange) => {
- eventContentChangeRef = newEventContentChange;
-
- _destroy();
-
- _updateElements();
- };
-
- if (eventContentChange) {
- _update(eventContentChange);
- }
-
- return {
- _destroy,
- _updateElements,
- _update,
- };
-};
-
-const createDOMObserver = (target, callback, options) => {
- let isConnected = false;
- const {
- _observeContent,
- _attributes,
- _styleChangingAttributes,
- _eventContentChange,
- _nestedTargetSelector,
- _ignoreTargetAttrChange: _ignoreTargetChange,
- _ignoreContentChange,
- } = options || {};
- const {
- _updateElements: updateEventContentChangeElements,
- _destroy: destroyEventContentChange,
- _update: updateEventContentChange,
- } = createEventContentChange(
- target,
- _observeContent && _eventContentChange,
- new Map(),
- debounce(() => {
- if (isConnected) {
- callback([], false, true);
- }
- }, 80)
- );
- const finalAttributes = _attributes || [];
- const finalStyleChangingAttributes = _styleChangingAttributes || [];
- const observedAttributes = finalAttributes.concat(finalStyleChangingAttributes);
-
- const observerCallback = (mutations) => {
- const ignoreTargetChange = _ignoreTargetChange || noop;
- const ignoreContentChange = _ignoreContentChange || noop;
- const targetChangedAttrs = [];
- const totalAddedNodes = [];
- let targetStyleChanged = false;
- let contentChanged = false;
- let childListChanged = false;
- each(mutations, (mutation) => {
- const { attributeName, target: mutationTarget, type, oldValue, addedNodes } = mutation;
- const isAttributesType = type === 'attributes';
- const isChildListType = type === 'childList';
- const targetIsMutationTarget = target === mutationTarget;
- const attributeValue = isAttributesType && isString(attributeName) ? attr(mutationTarget, attributeName) : 0;
- const attributeChanged = attributeValue !== 0 && oldValue !== attributeValue;
- const targetAttrChanged =
- attributeChanged &&
- targetIsMutationTarget &&
- !_observeContent &&
- !ignoreTargetChange(mutationTarget, attributeName, oldValue, attributeValue);
- const styleChangingAttrChanged = indexOf(finalStyleChangingAttributes, attributeName) > -1 && attributeChanged;
-
- if (targetAttrChanged) {
- push(targetChangedAttrs, attributeName);
- }
-
- if (_observeContent) {
- const notOnlyAttrChanged = !isAttributesType;
- const contentAttrChanged = isAttributesType && styleChangingAttrChanged && !targetIsMutationTarget;
- const isNestedTarget = contentAttrChanged && _nestedTargetSelector && is(mutationTarget, _nestedTargetSelector);
- const baseAssertion = isNestedTarget
- ? !ignoreTargetChange(mutationTarget, attributeName, oldValue, attributeValue)
- : notOnlyAttrChanged || contentAttrChanged;
- const contentFinalChanged = baseAssertion && !ignoreContentChange(mutation, !!isNestedTarget, target, options);
- push(totalAddedNodes, addedNodes);
- contentChanged = contentChanged || contentFinalChanged;
- childListChanged = childListChanged || isChildListType;
- }
-
- targetStyleChanged = targetStyleChanged || (targetAttrChanged && styleChangingAttrChanged);
- });
-
- if (childListChanged && !isEmptyArray(totalAddedNodes)) {
- updateEventContentChangeElements((selector) =>
- totalAddedNodes.reduce((arr, node) => {
- push(arr, find(selector, node));
- return is(node, selector) ? push(arr, node) : arr;
- }, [])
- );
- }
-
- if (!isEmptyArray(targetChangedAttrs) || targetStyleChanged || contentChanged) {
- callback(targetChangedAttrs, targetStyleChanged, contentChanged);
- }
- };
-
- const mutationObserver = new MutationObserverConstructor(observerCallback);
- mutationObserver.observe(target, {
- attributes: true,
- attributeOldValue: true,
- attributeFilter: observedAttributes,
- subtree: _observeContent,
- childList: _observeContent,
- characterData: _observeContent,
- });
- isConnected = true;
- return {
- _disconnect: () => {
- if (isConnected) {
- destroyEventContentChange();
- mutationObserver.disconnect();
- isConnected = false;
- }
- },
- _updateEventContentChange: (newEventContentChange) => {
- updateEventContentChange(isConnected && _observeContent && newEventContentChange);
- },
- _update: () => {
- if (isConnected) {
- observerCallback(mutationObserver.takeRecords());
- }
- },
- };
-};
-
const unwrap = (elm) => {
appendChildren(parent(elm), contents(elm));
removeElements(elm);
@@ -1530,6 +934,19 @@ const createStructureSetup = (target) => {
_host,
});
+ const { _nativeScrollbarStyling, _nativeScrollbarIsOverlaid } = getEnvironment();
+
+ if (_nativeScrollbarStyling) {
+ push(destroyFns, removeClass.bind(0, _viewport, classNameViewportScrollbarStyling));
+ } else if (_nativeScrollbarIsOverlaid.x || _nativeScrollbarIsOverlaid.y) {
+ if (obj._content) {
+ const contentArrangeElm = createDiv(classNameContentArrange);
+ prependChildren(_viewport, contentArrangeElm);
+ push(destroyFns, removeElements.bind(0, contentArrangeElm));
+ obj._contentArrange = contentArrangeElm;
+ }
+ }
+
return {
_targetObj: obj,
_targetCtx: ctx,
@@ -1539,47 +956,814 @@ const createStructureSetup = (target) => {
};
};
-const OverlayScrollbars = (target, options, extensions) => {
- const structureSetup = createStructureSetup(target);
- const lifecycles = [];
- const { _host, _viewport, _content } = structureSetup._targetObj;
- push(lifecycles, createStructureLifecycle(structureSetup._targetObj));
+const getPropByPath = (obj, path) => obj && path.split('.').reduce((o, prop) => (o && hasOwnProperty$1(o, prop) ? o[prop] : undefined), obj);
- const onSizeChanged = (directionCache) => {
- if (directionCache) {
- each(lifecycles, (lifecycle) => {
- lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(directionCache);
+const createLifecycleUpdateFunction = (lifecycleHub, updateFunction) => {
+ return (updateHints, changedOptions, force) => {
+ const checkOption = (path) => ({
+ _value: getPropByPath(lifecycleHub._options, path),
+ _changed: force || getPropByPath(changedOptions, path) !== undefined,
+ });
+
+ return updateFunction(!!force, updateHints, checkOption) || {};
+ };
+};
+
+const overlaidScrollbarsHideOffset = 42;
+const overlaidScrollbarsHideBorderStyle = `${overlaidScrollbarsHideOffset}px solid transparent`;
+const createOverflowLifecycle = (lifecycleHub) => {
+ const { _host, _padding, _viewport, _content, _contentArrange } = lifecycleHub._structureSetup._targetObj;
+ const { _update: updateContentScrollSizeCache, _current: getCurrentContentScrollSizeCache } = createCache(() => scrollSize(_content || _viewport), {
+ _equal: equalWH,
+ });
+ const { _update: updateOverflowAmountCache, _current: getCurrentOverflowAmountCache } = createCache(
+ (ctx) => ({
+ x: Math.max(0, Math.round((ctx._contentScrollSize.w - ctx._viewportSize.w) * 100) / 100),
+ y: Math.max(0, Math.round((ctx._contentScrollSize.h - ctx._viewportSize.h) * 100) / 100),
+ }),
+ {
+ _equal: equalXY,
+ }
+ );
+
+ const setViewportOverflowStyle = (horizontal, amount, behavior, styleObj) => {
+ const overflowKey = horizontal ? 'overflowX' : 'overflowY';
+ const behaviorIsScroll = behavior === 'scroll';
+ const behaviorIsVisibleScroll = behavior === 'visible-scroll';
+ const hideOverflow = behaviorIsScroll || behavior === 'hidden';
+ const applyStyle = amount > 0 && hideOverflow;
+
+ if (applyStyle) {
+ styleObj[overflowKey] = behavior;
+ }
+
+ return {
+ _visible: !applyStyle,
+ _behavior: behaviorIsVisibleScroll ? 'scroll' : 'hidden',
+ };
+ };
+
+ const hideNativeScrollbars = (contentScrollSize, showNativeOverlaidScrollbars, directionIsRTL, viewportStyleObj, contentStyleObj) => {
+ const { _nativeScrollbarSize, _nativeScrollbarIsOverlaid, _nativeScrollbarStyling } = getEnvironment();
+ const { x: overlaidX, y: overlaidY } = _nativeScrollbarIsOverlaid;
+ const scrollX = viewportStyleObj.overflowX === 'scroll';
+ const scrollY = viewportStyleObj.overflowY === 'scroll';
+ const horizontalMarginKey = directionIsRTL ? 'marginLeft' : 'marginRight';
+ const horizontalBorderKey = directionIsRTL ? 'borderLeft' : 'borderRight';
+ const overlaidHideOffset = _content && !showNativeOverlaidScrollbars ? overlaidScrollbarsHideOffset : 0;
+ const scrollbarsHideOffset = {
+ x: overlaidX ? overlaidHideOffset : _nativeScrollbarSize.x,
+ y: overlaidY ? overlaidHideOffset : _nativeScrollbarSize.y,
+ };
+
+ if (!_nativeScrollbarStyling) {
+ if (scrollX) {
+ viewportStyleObj.marginBottom = -scrollbarsHideOffset.x;
+ contentStyleObj.borderBottom = overlaidX && overlaidHideOffset ? overlaidScrollbarsHideBorderStyle : '';
+ }
+
+ if (scrollY) {
+ viewportStyleObj.maxWidth = `calc(100% + ${scrollbarsHideOffset.y}px)`;
+ viewportStyleObj[horizontalMarginKey] = -scrollbarsHideOffset.y;
+ contentStyleObj[horizontalBorderKey] = overlaidY && overlaidHideOffset ? overlaidScrollbarsHideBorderStyle : '';
+ }
+
+ if (_contentArrange) {
+ style(_contentArrange, {
+ width: scrollY && !showNativeOverlaidScrollbars ? overlaidHideOffset + contentScrollSize.w : '',
+ height: scrollX && !showNativeOverlaidScrollbars ? overlaidHideOffset + contentScrollSize.h : '',
+ });
+ }
+ }
+
+ return {
+ _scrollbarsHideOffset: scrollbarsHideOffset,
+ _scroll: {
+ x: scrollX,
+ y: scrollY,
+ },
+ };
+ };
+
+ const setFlexboxGlueStyle = (heightIntrinsic, scrollX, scrollbarsHideOffsetX) => {
+ const offsetLeft = scrollLeft(_viewport);
+ const offsetTop = scrollTop(_viewport);
+ style(_viewport, {
+ maxHeight: '',
+ });
+
+ if (heightIntrinsic) {
+ style(_viewport, {
+ maxHeight: _host.clientHeight + (scrollX ? scrollbarsHideOffsetX : 0),
});
- } else {
- each(lifecycles, (lifecycle) => {
- lifecycle._onSizeChanged && lifecycle._onSizeChanged();
+ }
+
+ scrollLeft(_viewport, offsetLeft);
+ scrollTop(_viewport, offsetTop);
+ };
+
+ return createLifecycleUpdateFunction(lifecycleHub, (force, updateHints, checkOption) => {
+ const { _directionIsRTL, _heightIntrinsic, _sizeChanged, _hostMutation, _contentMutation } = updateHints;
+ const { _flexboxGlue, _nativeScrollbarStyling, _nativeScrollbarIsOverlaid } = getEnvironment();
+ const { _value: showNativeOverlaidScrollbarsOption, _changed: showNativeOverlaidScrollbarsChanged } = checkOption(
+ 'nativeScrollbarsOverlaid.show'
+ );
+ const adjustFlexboxGlue = !_flexboxGlue && (_sizeChanged || _contentMutation || _hostMutation || showNativeOverlaidScrollbarsChanged);
+ const showNativeOverlaidScrollbars = showNativeOverlaidScrollbarsOption && _nativeScrollbarIsOverlaid.x && _nativeScrollbarIsOverlaid.y;
+ let overflowAmuntCache = getCurrentOverflowAmountCache();
+ let contentScrollSizeCache = getCurrentContentScrollSizeCache();
+
+ if (showNativeOverlaidScrollbarsChanged && _nativeScrollbarStyling) {
+ if (showNativeOverlaidScrollbars) {
+ removeClass(_viewport, classNameViewportScrollbarStyling);
+ } else {
+ addClass(_viewport, classNameViewportScrollbarStyling);
+ }
+ }
+
+ if (_sizeChanged || _contentMutation) {
+ const viewportOffsetSize = offsetSize(_padding);
+ const contentClientSize = offsetSize(_content || _viewport);
+ const contentArrangeOffsetSize = offsetSize(_contentArrange);
+ contentScrollSizeCache = updateContentScrollSizeCache(force);
+ const { _value: _contentScrollSize } = contentScrollSizeCache;
+ overflowAmuntCache = updateOverflowAmountCache(force, {
+ _contentScrollSize: {
+ w: Math.max(_contentScrollSize.w, contentArrangeOffsetSize.w),
+ h: Math.max(_contentScrollSize.h, contentArrangeOffsetSize.h),
+ },
+ _viewportSize: {
+ w: viewportOffsetSize.w + Math.max(0, contentClientSize.w - _contentScrollSize.w),
+ h: viewportOffsetSize.h + Math.max(0, contentClientSize.h - _contentScrollSize.h),
+ },
+ });
+ }
+
+ const { _value: directionIsRTL, _changed: directionChanged } = _directionIsRTL;
+ const { _value: contentScrollSize, _changed: contentScrollSizeChanged } = contentScrollSizeCache;
+ const { _value: overflowAmount, _changed: overflowAmountChanged } = overflowAmuntCache;
+ const { _value: overflow, _changed: overflowChanged } = checkOption('overflow');
+ const adjustDirection = directionChanged && !_nativeScrollbarStyling;
+
+ if (
+ contentScrollSizeChanged ||
+ overflowAmountChanged ||
+ overflowChanged ||
+ showNativeOverlaidScrollbarsChanged ||
+ adjustDirection ||
+ adjustFlexboxGlue
+ ) {
+ const viewportStyle = {
+ overflowY: '',
+ overflowX: '',
+ marginTop: '',
+ marginRight: '',
+ marginBottom: '',
+ marginLeft: '',
+ maxWidth: '',
+ };
+ const contentStyle = {
+ borderTop: '',
+ borderRight: '',
+ borderBottom: '',
+ borderLeft: '',
+ };
+ const { _visible: xVisible, _behavior: xVisibleBehavior } = setViewportOverflowStyle(true, overflowAmount.x, overflow.x, viewportStyle);
+ const { _visible: yVisible, _behavior: yVisibleBehavior } = setViewportOverflowStyle(false, overflowAmount.y, overflow.y, viewportStyle);
+
+ if (xVisible && !yVisible) {
+ viewportStyle.overflowX = xVisibleBehavior;
+ }
+
+ if (yVisible && !xVisible) {
+ viewportStyle.overflowY = yVisibleBehavior;
+ }
+
+ const { _scrollbarsHideOffset, _scroll } = hideNativeScrollbars(
+ contentScrollSize,
+ showNativeOverlaidScrollbars,
+ directionIsRTL,
+ viewportStyle,
+ contentStyle
+ );
+
+ if (adjustFlexboxGlue) {
+ setFlexboxGlueStyle(!!_heightIntrinsic._value, _scroll.x, _scrollbarsHideOffset.x);
+ }
+
+ style(_viewport, viewportStyle);
+ style(_content, contentStyle);
+ }
+ });
+};
+
+const animationStartEventName = 'animationstart';
+const scrollEventName = 'scroll';
+const scrollAmount = 3333333;
+const directionIsRTLMap = {
+ direction: ['rtl'],
+};
+
+const directionIsRTL = (elm) => {
+ let isRTL = false;
+ const styles = style(elm, ['direction']);
+ each(styles, (value, key) => {
+ isRTL = isRTL || indexOf(directionIsRTLMap[key], value) > -1;
+ });
+ return isRTL;
+};
+
+const domRectHasDimensions = (rect) => rect && (rect.height || rect.width);
+
+const createSizeObserver = (target, onSizeChangedCallback, options) => {
+ const { _direction: observeDirectionChange = false, _appear: observeAppearChange = false } = options || {};
+ const { _rtlScrollBehavior: rtlScrollBehavior } = getEnvironment();
+ const baseElements = createDOM(``);
+ const sizeObserver = baseElements[0];
+ const listenerElement = sizeObserver.firstChild;
+ const { _update: updateResizeObserverContentRectCache } = createCache(0, {
+ _alwaysUpdateValues: true,
+ _equal: (currVal, newVal) => !(!currVal || (!domRectHasDimensions(currVal) && domRectHasDimensions(newVal))),
+ });
+
+ const onSizeChangedCallbackProxy = (sizeChangedContext) => {
+ const hasDirectionCache = sizeChangedContext && isBoolean(sizeChangedContext._value);
+ let skip = false;
+
+ if (isArray(sizeChangedContext) && sizeChangedContext.length > 0) {
+ const { _previous, _value, _changed } = updateResizeObserverContentRectCache(0, sizeChangedContext.pop().contentRect);
+ skip = !_previous || !domRectHasDimensions(_value);
+ } else if (hasDirectionCache) {
+ sizeChangedContext._changed;
+ }
+
+ if (observeDirectionChange) {
+ const rtl = hasDirectionCache ? sizeChangedContext._value : directionIsRTL(sizeObserver);
+ scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount);
+ scrollTop(sizeObserver, scrollAmount);
+ }
+
+ if (!skip) {
+ onSizeChangedCallback(hasDirectionCache ? sizeChangedContext : undefined);
+ }
+ };
+
+ const offListeners = [];
+ let appearCallback = observeAppearChange ? onSizeChangedCallbackProxy : false;
+ let directionIsRTLCache;
+
+ if (ResizeObserverConstructor) {
+ const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);
+ resizeObserverInstance.observe(listenerElement);
+ push(offListeners, () => resizeObserverInstance.disconnect());
+ } else {
+ const observerElementChildren = createDOM(
+ ``
+ );
+ appendChildren(listenerElement, observerElementChildren);
+ addClass(listenerElement, classNameSizeObserverListenerScroll);
+ const observerElementChildrenRoot = observerElementChildren[0];
+ const shrinkElement = observerElementChildrenRoot.lastChild;
+ const expandElement = observerElementChildrenRoot.firstChild;
+ const expandElementChild = expandElement == null ? void 0 : expandElement.firstChild;
+ let cacheSize = offsetSize(listenerElement);
+ let currSize = cacheSize;
+ let isDirty = false;
+ let rAFId;
+
+ const reset = () => {
+ scrollLeft(expandElement, scrollAmount);
+ scrollTop(expandElement, scrollAmount);
+ scrollLeft(shrinkElement, scrollAmount);
+ scrollTop(shrinkElement, scrollAmount);
+ };
+
+ const onResized = () => {
+ rAFId = 0;
+
+ if (isDirty) {
+ cacheSize = currSize;
+ onSizeChangedCallbackProxy();
+ }
+ };
+
+ const onScroll = (scrollEvent) => {
+ currSize = offsetSize(listenerElement);
+ isDirty = !scrollEvent || !equalWH(currSize, cacheSize);
+
+ if (scrollEvent && isDirty && !rAFId) {
+ cAF(rAFId);
+ rAFId = rAF(onResized);
+ } else if (!scrollEvent) {
+ onResized();
+ }
+
+ reset();
+
+ if (scrollEvent) {
+ preventDefault(scrollEvent);
+ stopPropagation(scrollEvent);
+ }
+
+ return false;
+ };
+
+ push(offListeners, [on(expandElement, scrollEventName, onScroll), on(shrinkElement, scrollEventName, onScroll)]);
+ style(expandElementChild, {
+ width: scrollAmount,
+ height: scrollAmount,
+ });
+ reset();
+ appearCallback = observeAppearChange ? () => onScroll() : reset;
+ }
+
+ if (observeDirectionChange) {
+ directionIsRTLCache = createCache(() => directionIsRTL(sizeObserver));
+ const { _update: updateDirectionIsRTLCache } = directionIsRTLCache;
+ push(
+ offListeners,
+ on(sizeObserver, scrollEventName, (event) => {
+ const directionIsRTLCacheValues = updateDirectionIsRTLCache();
+ const { _value, _changed } = directionIsRTLCacheValues;
+
+ if (_changed) {
+ if (_value) {
+ style(listenerElement, {
+ left: 'auto',
+ right: 0,
+ });
+ } else {
+ style(listenerElement, {
+ left: 0,
+ right: 'auto',
+ });
+ }
+
+ onSizeChangedCallbackProxy(directionIsRTLCacheValues);
+ }
+
+ preventDefault(event);
+ stopPropagation(event);
+ return false;
+ })
+ );
+ }
+
+ if (appearCallback) {
+ addClass(sizeObserver, classNameSizeObserverAppear);
+ push(
+ offListeners,
+ on(sizeObserver, animationStartEventName, appearCallback, {
+ _once: !!ResizeObserverConstructor,
+ })
+ );
+ }
+
+ prependChildren(target, sizeObserver);
+ return {
+ _destroy() {
+ runEach(offListeners);
+ removeElements(sizeObserver);
+ },
+
+ _getCurrentCacheValues(force) {
+ return {
+ _directionIsRTL: directionIsRTLCache
+ ? directionIsRTLCache._current(force)
+ : {
+ _value: false,
+ _previous: false,
+ _changed: false,
+ },
+ };
+ },
+ };
+};
+
+const createTrinsicObserver = (target, onTrinsicChangedCallback) => {
+ const trinsicObserver = createDOM(``)[0];
+ const offListeners = [];
+ const { _update: updateHeightIntrinsicCache, _current: getCurrentHeightIntrinsicCache } = createCache(
+ (ioEntryOrSize) => ioEntryOrSize.h === 0 || ioEntryOrSize.isIntersecting || ioEntryOrSize.intersectionRatio > 0,
+ {
+ _initialValue: false,
+ }
+ );
+
+ if (IntersectionObserverConstructor) {
+ const intersectionObserverInstance = new IntersectionObserverConstructor(
+ (entries) => {
+ if (entries && entries.length > 0) {
+ const last = entries.pop();
+
+ if (last) {
+ const heightIntrinsic = updateHeightIntrinsicCache(0, last);
+
+ if (heightIntrinsic._changed) {
+ onTrinsicChangedCallback(heightIntrinsic);
+ }
+ }
+ }
+ },
+ {
+ root: target,
+ }
+ );
+ intersectionObserverInstance.observe(trinsicObserver);
+ push(offListeners, () => intersectionObserverInstance.disconnect());
+ } else {
+ push(
+ offListeners,
+ createSizeObserver(trinsicObserver, () => {
+ const newSize = offsetSize(trinsicObserver);
+ const heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize);
+
+ if (heightIntrinsicCache._changed) {
+ onTrinsicChangedCallback(heightIntrinsicCache);
+ }
+ })._destroy
+ );
+ }
+
+ prependChildren(target, trinsicObserver);
+ return {
+ _destroy() {
+ runEach(offListeners);
+ removeElements(trinsicObserver);
+ },
+
+ _getCurrentCacheValues(force) {
+ return {
+ _heightIntrinsic: getCurrentHeightIntrinsicCache(force),
+ };
+ },
+ };
+};
+
+const createEventContentChange = (target, eventContentChange, map, callback) => {
+ let eventContentChangeRef;
+
+ const addEvent = (elm, eventName) => {
+ const entry = map.get(elm);
+ const newEntry = isUndefined(entry);
+
+ const registerEvent = () => {
+ map.set(elm, eventName);
+ on(elm, eventName, callback);
+ };
+
+ if (!newEntry && eventName !== entry) {
+ off(elm, entry, callback);
+ registerEvent();
+ } else if (newEntry) {
+ registerEvent();
+ }
+ };
+
+ const _destroy = () => {
+ map.forEach((eventName, elm) => {
+ off(elm, eventName, callback);
+ });
+ map.clear();
+ };
+
+ const _updateElements = (getElements) => {
+ if (eventContentChangeRef) {
+ const eventElmList = eventContentChangeRef.reduce((arr, item) => {
+ if (item) {
+ const selector = item[0];
+ const eventName = item[1];
+ const elements = eventName && selector && (getElements ? getElements(selector) : find(selector, target));
+
+ if (elements) {
+ push(arr, [elements, isFunction(eventName) ? eventName(elements) : eventName], true);
+ }
+ }
+
+ return arr;
+ }, []);
+ each(eventElmList, (item) => {
+ const elements = item[0];
+ const eventName = item[1];
+ each(elements, (elm) => {
+ addEvent(elm, eventName);
+ });
});
}
};
- const onTrinsicChanged = (widthIntrinsic, heightIntrinsicCache) => {
+ const _update = (newEventContentChange) => {
+ eventContentChangeRef = newEventContentChange;
+
+ _destroy();
+
+ _updateElements();
+ };
+
+ if (eventContentChange) {
+ _update(eventContentChange);
+ }
+
+ return {
+ _destroy,
+ _updateElements,
+ _update,
+ };
+};
+
+const createDOMObserver = (target, callback, options) => {
+ let isConnected = false;
+ const {
+ _observeContent,
+ _attributes,
+ _styleChangingAttributes,
+ _eventContentChange,
+ _nestedTargetSelector,
+ _ignoreTargetAttrChange: _ignoreTargetChange,
+ _ignoreContentChange,
+ } = options || {};
+ const {
+ _updateElements: updateEventContentChangeElements,
+ _destroy: destroyEventContentChange,
+ _update: updateEventContentChange,
+ } = createEventContentChange(
+ target,
+ _observeContent && _eventContentChange,
+ new Map(),
+ debounce(() => {
+ if (isConnected) {
+ callback([], false, true);
+ }
+ }, 84)
+ );
+ const finalAttributes = _attributes || [];
+ const finalStyleChangingAttributes = _styleChangingAttributes || [];
+ const observedAttributes = finalAttributes.concat(finalStyleChangingAttributes);
+
+ const observerCallback = (mutations) => {
+ const ignoreTargetChange = _ignoreTargetChange || noop;
+ const ignoreContentChange = _ignoreContentChange || noop;
+ const targetChangedAttrs = [];
+ const totalAddedNodes = [];
+ let targetStyleChanged = false;
+ let contentChanged = false;
+ let childListChanged = false;
+ each(mutations, (mutation) => {
+ const { attributeName, target: mutationTarget, type, oldValue, addedNodes } = mutation;
+ const isAttributesType = type === 'attributes';
+ const isChildListType = type === 'childList';
+ const targetIsMutationTarget = target === mutationTarget;
+ const attributeValue = isAttributesType && isString(attributeName) ? attr(mutationTarget, attributeName) : 0;
+ const attributeChanged = attributeValue !== 0 && oldValue !== attributeValue;
+ const targetAttrChanged =
+ attributeChanged &&
+ targetIsMutationTarget &&
+ !_observeContent &&
+ !ignoreTargetChange(mutationTarget, attributeName, oldValue, attributeValue);
+ const styleChangingAttrChanged = indexOf(finalStyleChangingAttributes, attributeName) > -1 && attributeChanged;
+
+ if (targetAttrChanged) {
+ push(targetChangedAttrs, attributeName);
+ }
+
+ if (_observeContent) {
+ const notOnlyAttrChanged = !isAttributesType;
+ const contentAttrChanged = isAttributesType && styleChangingAttrChanged && !targetIsMutationTarget;
+ const isNestedTarget = contentAttrChanged && _nestedTargetSelector && is(mutationTarget, _nestedTargetSelector);
+ const baseAssertion = isNestedTarget
+ ? !ignoreTargetChange(mutationTarget, attributeName, oldValue, attributeValue)
+ : notOnlyAttrChanged || contentAttrChanged;
+ const contentFinalChanged = baseAssertion && !ignoreContentChange(mutation, !!isNestedTarget, target, options);
+ push(totalAddedNodes, addedNodes);
+ contentChanged = contentChanged || contentFinalChanged;
+ childListChanged = childListChanged || isChildListType;
+ }
+
+ targetStyleChanged = targetStyleChanged || (targetAttrChanged && styleChangingAttrChanged);
+ });
+
+ if (childListChanged && !isEmptyArray(totalAddedNodes)) {
+ updateEventContentChangeElements((selector) =>
+ totalAddedNodes.reduce((arr, node) => {
+ push(arr, find(selector, node));
+ return is(node, selector) ? push(arr, node) : arr;
+ }, [])
+ );
+ }
+
+ if (!isEmptyArray(targetChangedAttrs) || targetStyleChanged || contentChanged) {
+ callback(targetChangedAttrs, targetStyleChanged, contentChanged);
+ }
+ };
+
+ const mutationObserver = new MutationObserverConstructor(observerCallback);
+ mutationObserver.observe(target, {
+ attributes: true,
+ attributeOldValue: true,
+ attributeFilter: observedAttributes,
+ subtree: _observeContent,
+ childList: _observeContent,
+ characterData: _observeContent,
+ });
+ isConnected = true;
+ return {
+ _disconnect: () => {
+ if (isConnected) {
+ destroyEventContentChange();
+ mutationObserver.disconnect();
+ isConnected = false;
+ }
+ },
+ _updateEventContentChange: (newEventContentChange) => {
+ updateEventContentChange(isConnected && _observeContent && newEventContentChange);
+ },
+ _update: () => {
+ if (isConnected) {
+ observerCallback(mutationObserver.takeRecords());
+ }
+ },
+ };
+};
+
+const attrs = ['id', 'class', 'style', 'open'];
+const directionIsRTLCacheValuesFallback = {
+ _value: false,
+ _previous: false,
+ _changed: false,
+};
+const heightIntrinsicCacheValuesFallback = {
+ _value: false,
+ _previous: false,
+ _changed: false,
+};
+const createLifecycleHub = (options, structureSetup) => {
+ const { _host, _viewport, _content } = structureSetup._targetObj;
+ const {
+ _nativeScrollbarStyling,
+ _flexboxGlue,
+ _addListener: addEnvironmentListener,
+ _removeListener: removeEnvironmentListener,
+ } = getEnvironment();
+ const lifecycles = [];
+ const instance = {
+ _options: options,
+ _structureSetup: structureSetup,
+ };
+ push(lifecycles, createOverflowLifecycle(instance));
+
+ const runLifecycles = (updateHints, changedOptions, force) => {
+ let { _directionIsRTL, _heightIntrinsic, _sizeChanged = force || false, _hostMutation = force || false, _contentMutation = force || false } =
+ updateHints || {};
+ const finalDirectionIsRTL =
+ _directionIsRTL || (sizeObserver ? sizeObserver._getCurrentCacheValues(force)._directionIsRTL : directionIsRTLCacheValuesFallback);
+ const finalHeightIntrinsic =
+ _heightIntrinsic || (trinsicObserver ? trinsicObserver._getCurrentCacheValues(force)._heightIntrinsic : heightIntrinsicCacheValuesFallback);
each(lifecycles, (lifecycle) => {
- lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsicCache);
+ const { _sizeChanged: adaptiveSizeChanged, _hostMutation: adaptiveHostMutation, _contentMutation: adaptiveContentMutation } = lifecycle(
+ {
+ _directionIsRTL: finalDirectionIsRTL,
+ _heightIntrinsic: finalHeightIntrinsic,
+ _sizeChanged,
+ _hostMutation,
+ _contentMutation,
+ },
+ changedOptions,
+ force
+ );
+ _sizeChanged = adaptiveSizeChanged || _sizeChanged;
+ _hostMutation = adaptiveHostMutation || _hostMutation;
+ _contentMutation = adaptiveContentMutation || _contentMutation;
});
};
- createSizeObserver(_host, onSizeChanged, {
+ const onSizeChanged = (directionIsRTL) => {
+ const sizeChanged = !directionIsRTL;
+ runLifecycles({
+ _directionIsRTL: directionIsRTL,
+ _sizeChanged: sizeChanged,
+ });
+ };
+
+ const onTrinsicChanged = (heightIntrinsic) => {
+ runLifecycles({
+ _heightIntrinsic: heightIntrinsic,
+ });
+ };
+
+ const onHostMutation = () => {
+ requestAnimationFrame(() => {
+ runLifecycles({
+ _hostMutation: true,
+ });
+ });
+ };
+
+ const onContentMutation = () => {
+ requestAnimationFrame(() => {
+ runLifecycles({
+ _contentMutation: true,
+ });
+ });
+ };
+
+ const sizeObserver = createSizeObserver(_host, onSizeChanged, {
_appear: true,
- _direction: true,
+ _direction: !_nativeScrollbarStyling,
});
- createTrinsicObserver(_host, onTrinsicChanged);
- createDOMObserver(_host, () => {
- return null;
+ const trinsicObserver = createTrinsicObserver(_host, onTrinsicChanged);
+ const hostMutationObserver = createDOMObserver(_host, onHostMutation, {
+ _styleChangingAttributes: attrs,
+ _attributes: attrs,
});
- createDOMObserver(
- _content || _viewport,
- () => {
- return null;
+ const contentMutationObserver = createDOMObserver(_content || _viewport, onContentMutation, {
+ _observeContent: true,
+ _styleChangingAttributes: attrs,
+ _attributes: attrs,
+ _eventContentChange: options.updating.elementEvents,
+ });
+
+ const updateAll = (changedOptions, force) => {
+ runLifecycles(null, changedOptions, force);
+ };
+
+ const envUpdateListener = updateAll.bind(null, null, true);
+ addEnvironmentListener(envUpdateListener);
+ console.log('flexboxGlue', _flexboxGlue);
+ return {
+ _update: updateAll,
+
+ _destroy() {
+ removeEnvironmentListener(envUpdateListener);
},
- {
- _observeContent: true,
- }
- );
+ };
+};
+
+const numberAllowedValues = optionsTemplateTypes.number;
+const stringArrayNullAllowedValues = [optionsTemplateTypes.string, optionsTemplateTypes.array, optionsTemplateTypes.null];
+const booleanTrueTemplate = [true, optionsTemplateTypes.boolean];
+const booleanFalseTemplate = [false, optionsTemplateTypes.boolean];
+const resizeAllowedValues = 'none both horizontal vertical';
+const overflowAllowedValues = 'visible-hidden visible-scroll scroll hidden';
+const scrollbarsVisibilityAllowedValues = 'visible hidden auto';
+const scrollbarsAutoHideAllowedValues = 'never scroll leavemove';
+const defaultOptionsWithTemplate = {
+ resize: ['none', resizeAllowedValues],
+ paddingAbsolute: booleanFalseTemplate,
+ updating: {
+ elementEvents: [[['img', 'load']], [optionsTemplateTypes.array, optionsTemplateTypes.null]],
+ contentMutationDebounce: [80, numberAllowedValues],
+ hostMutationDebounce: [0, numberAllowedValues],
+ resizeDebounce: [0, numberAllowedValues],
+ },
+ overflow: {
+ x: ['scroll', overflowAllowedValues],
+ y: ['scroll', overflowAllowedValues],
+ },
+ scrollbars: {
+ visibility: ['auto', scrollbarsVisibilityAllowedValues],
+ autoHide: ['never', scrollbarsAutoHideAllowedValues],
+ autoHideDelay: [800, numberAllowedValues],
+ dragScroll: booleanTrueTemplate,
+ clickScroll: booleanFalseTemplate,
+ touch: booleanTrueTemplate,
+ },
+ textarea: {
+ dynWidth: booleanFalseTemplate,
+ dynHeight: booleanFalseTemplate,
+ inheritedAttrs: [['style', 'class'], stringArrayNullAllowedValues],
+ },
+ nativeScrollbarsOverlaid: {
+ show: booleanFalseTemplate,
+ initialize: booleanFalseTemplate,
+ },
+};
+const { _template: optionsTemplate, _options: defaultOptions } = transformOptions(defaultOptionsWithTemplate);
+
+const OverlayScrollbars = (target, options, extensions) => {
+ const currentOptions = assignDeep({}, defaultOptions, validateOptions(options || {}, optionsTemplate, null, true)._validated);
+ const structureSetup = createStructureSetup(target);
+ const lifecycleHub = createLifecycleHub(currentOptions, structureSetup);
+ const instance = {
+ options(newOptions) {
+ if (newOptions) {
+ const { _validated: _changedOptions } = validateOptions(newOptions, optionsTemplate, currentOptions, true);
+
+ if (!isEmptyObject(_changedOptions)) {
+ assignDeep(currentOptions, _changedOptions);
+
+ lifecycleHub._update(_changedOptions);
+ }
+ }
+
+ return currentOptions;
+ },
+
+ update(force) {
+ lifecycleHub._update(null, force);
+ },
+ };
+ instance.update(true);
+ return instance;
};
var index = () => {
diff --git a/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map b/packages/overlayscrollbars/dist/overlayscrollbars.esm.js.map
index 2aa674a..5a4e34b 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/utils/array.ts","../src/support/utils/object.ts","../src/support/dom/class.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/dom/events.ts","../src/support/utils/equal.ts","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../src/support/utils/function.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../src/support/cache/cache.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/support/options/transformation.ts","../src/classnames.ts","../src/environment/environment.ts","../src/lifecycles/lifecycleBase.ts","../src/lifecycles/structureLifecycle.ts","../src/observers/sizeObserver.ts","../src/observers/trinsicObserver.ts","../src/observers/domObserver.ts","../src/setups/structureSetup.ts","../src/overlayscrollbars/overlayscrollbars.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nconst ElementNodeType = Node.ELEMENT_NODE;\r\nconst { toString, hasOwnProperty } = Object.prototype;\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 const type: (obj: any) => string = (obj) => {\r\n return isUndefined(obj) || isNull(obj)\r\n ? `${obj}`\r\n : 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 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 const lengthCorrectFormat = isNumber(length) && length > -1 && length % 1 == 0; // eslint-disable-line eqeqeq\r\n\r\n return isArray(obj) || (!isFunction(obj) && lengthCorrectFormat) ? (length > 0 && isObject(obj) ? length - 1 in obj : true) : false;\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport 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 cstr = 'constructor';\r\n const ctor = obj[cstr];\r\n const ctorProto = ctor && ctor.prototype;\r\n const hasOwnConstructor = hasOwnProperty.call(obj, cstr);\r\n const hasIsPrototypeOf = ctorProto && hasOwnProperty.call(ctorProto, 'isPrototypeOf');\r\n\r\n if (ctor && !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 instanceofObj = window.HTMLElement;\r\n return obj ? (instanceofObj ? obj instanceof instanceofObj : obj.nodeType === ElementNodeType) : false;\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a Element.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isElement(obj: any): obj is Element {\r\n const instanceofObj = window.Element;\r\n return obj ? (instanceofObj ? obj instanceof instanceofObj : obj.nodeType === ElementNodeType) : false;\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 && 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 { isArrayLike, isString } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype RunEachItem = ((...args: any) => any | any[]) | null | undefined;\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null | undefined,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null | undefined;\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 | undefined,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null | undefined;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(\r\n obj: PlainObject | null | undefined,\r\n callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void\r\n): PlainObject | null | undefined;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null | undefined,\r\n callback: (value: T, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null | undefined {\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 * Pushesh all given items into the given array and returns it.\r\n * @param array The array the items shall be pushed into.\r\n * @param items The items which shall be pushed into the array.\r\n */\r\nexport const push = (array: Array, items: T | ArrayLike, arrayIsSingleItem?: boolean): Array => {\r\n !arrayIsSingleItem && !isString(items) && isArrayLike(items) ? Array.prototype.push.apply(array, items as Array) : array.push(items as T);\r\n return array;\r\n};\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n\r\n each(arr, (elm) => {\r\n push(result, elm);\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the passed array is empty.\r\n * @param array The array which shall be checked.\r\n */\r\nexport const isEmptyArray = (array: Array | null | undefined) => array && array.length === 0;\r\n\r\n/**\r\n * Calls all functions in the passed array/set of functions.\r\n * @param arr The array filled with function which shall be called.\r\n * @param p1 The first param.\r\n */\r\nexport const runEach = (arr: ArrayLike | Set, p1?: unknown): void => {\r\n const runFn = (fn: RunEachItem) => fn && fn(p1);\r\n if (arr instanceof Set) {\r\n arr.forEach(runFn);\r\n } else {\r\n each(arr, runFn);\r\n }\r\n};\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\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 { isString } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\nimport { keys } from 'support/utils/object';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (\r\n elm: Element | null | undefined,\r\n className: string,\r\n action: (elmClassList: DOMTokenList, clazz: string) => boolean | void\r\n): 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) && 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 | undefined, 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 | undefined, 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 | undefined, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n\r\n/**\r\n * Takes two className strings, compares them and returns the difference as array.\r\n * @param classNameA ClassName A.\r\n * @param classNameB ClassName B.\r\n */\r\nexport const diffClass = (classNameA: string | null | undefined, classNameB: string | null | undefined) => {\r\n const classNameASplit = classNameA && classNameA.split(' ');\r\n const classNameBSplit = classNameB && classNameB.split(' ');\r\n const tempObj = {};\r\n\r\n each(classNameASplit, (className) => {\r\n tempObj[className] = 1;\r\n });\r\n each(classNameBSplit, (className) => {\r\n if (tempObj[className]) {\r\n delete tempObj[className];\r\n } else {\r\n tempObj[className] = 1;\r\n }\r\n });\r\n\r\n return keys(tempObj);\r\n};\r\n","import { isElement } from 'support/utils/types';\r\nimport { push, from } from 'support/utils/array';\r\n\r\ntype InputElementType = Element | Node | null | undefined;\r\ntype OutputElementType = Element | null;\r\n\r\nconst elmPrototype = Element.prototype;\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\nconst find = (selector: string, elm?: InputElementType): Element[] => {\r\n const arr: Array = [];\r\n const rootElm = elm ? (isElement(elm) ? elm : null) : document;\r\n\r\n return rootElm ? push(arr, rootElm.querySelectorAll(selector)) : 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\nconst findFirst = (selector: string, elm?: InputElementType): OutputElementType => {\r\n const rootElm = elm ? (isElement(elm) ? elm : null) : document;\r\n\r\n return rootElm ? rootElm.querySelector(selector) : null;\r\n};\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nconst is = (elm: InputElementType, selector: string): boolean => {\r\n if (isElement(elm)) {\r\n /* istanbul ignore next */\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const fn: (...args: any) => boolean = elmPrototype.matches || elmPrototype.msMatchesSelector;\r\n return fn.call(elm, selector);\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\nconst children = (elm: InputElementType, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n return isElement(elm)\r\n ? push(\r\n childs,\r\n from(elm.children).filter((child) => (selector ? is(child, selector) : child))\r\n )\r\n : childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nconst contents = (elm: InputElementType): 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\nconst parent = (elm: InputElementType): OutputElementType => (elm ? elm.parentElement : null);\r\n\r\nconst closest = (elm: InputElementType, selector: string): OutputElementType => {\r\n if (isElement(elm)) {\r\n const closestFn = elmPrototype.closest;\r\n if (closestFn) {\r\n return closestFn.call(elm, selector);\r\n }\r\n\r\n do {\r\n if (is(elm, selector)) {\r\n return elm as Element;\r\n }\r\n elm = parent(elm);\r\n } while (elm);\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Determines whether the given element lies between two selectors in the DOM.\r\n * @param elm The element.\r\n * @param highBoundarySelector The high boundary selector.\r\n * @param deepBoundarySelector The deep boundary selector.\r\n */\r\nconst liesBetween = (elm: InputElementType, highBoundarySelector: string, deepBoundarySelector: string): boolean => {\r\n const closestHighBoundaryElm = elm && closest(elm, highBoundarySelector);\r\n const closestDeepBoundaryElm = elm && findFirst(deepBoundarySelector, closestHighBoundaryElm);\r\n\r\n return closestHighBoundaryElm && closestDeepBoundaryElm\r\n ? closestHighBoundaryElm === elm ||\r\n closestDeepBoundaryElm === elm ||\r\n closest(closest(elm, deepBoundarySelector), highBoundarySelector) !== closestHighBoundaryElm\r\n : false;\r\n};\r\n\r\nexport { find, findFirst, is, children, contents, parent, liesBetween };\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 | null | undefined;\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 | undefined, preferredAnchor: Node | null | undefined, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null | undefined = preferredAnchor;\r\n let fragment: DocumentFragment | Node | null | undefined;\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 || null);\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 | undefined, 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 | undefined, 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 | undefined, 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 | undefined, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { attr } from 'support/dom/attribute';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (classNames?: string): HTMLDivElement => {\r\n const div = document.createElement('div');\r\n if (classNames) {\r\n attr(div, 'class', classNames);\r\n }\r\n return div;\r\n};\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","export interface WH {\r\n w: T;\r\n h: T;\r\n}\r\n\r\nconst elementHasDimensions = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the scroll- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the scroll- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null | undefined): 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 | undefined): 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 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 scrollSize = (elm: HTMLElement | null | undefined): WH =>\r\n elm\r\n ? {\r\n w: elm.scrollWidth,\r\n h: elm.scrollHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n\r\n/**\r\n * Determines whether the passed element has any dimensions.\r\n * @param elm The element.\r\n */\r\nexport const hasDimensions = (elm: HTMLElement | null | undefined): boolean => (elm ? elementHasDimensions(elm as HTMLElement) : false);\r\n","import { isUndefined } from 'support/utils/types';\r\nimport { each, push, runEach } from 'support/utils/array';\r\n\r\nlet passiveEventsSupport: boolean;\r\nconst supportPassiveEvents = (): boolean => {\r\n if (isUndefined(passiveEventsSupport)) {\r\n passiveEventsSupport = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n passiveEventsSupport = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n }\r\n return passiveEventsSupport;\r\n};\r\nconst splitEventNames = (eventNames: string) => eventNames.split(' ');\r\n\r\nexport interface OnOptions {\r\n _capture?: boolean;\r\n _passive?: boolean;\r\n _once?: boolean;\r\n}\r\n\r\n/**\r\n * Removes the passed event listener for the passed events with the passed options.\r\n * @param target The element from which the listener shall be removed.\r\n * @param eventNames The eventsnames for which the listener shall be removed.\r\n * @param listener The listener which shall be removed.\r\n * @param capture The options of the removed listener.\r\n */\r\nexport const off = (target: EventTarget, eventNames: string, listener: EventListener, capture?: boolean): void => {\r\n each(splitEventNames(eventNames), (eventName) => {\r\n target.removeEventListener(eventName, listener, capture);\r\n });\r\n};\r\n\r\n/**\r\n * Adds the passed event listener for the passed eventnames with the passed options.\r\n * @param target The element to which the listener shall be added.\r\n * @param eventNames The eventsnames for which the listener shall be called.\r\n * @param listener The listener which is called on the eventnames.\r\n * @param options The options of the added listener.\r\n */\r\nexport const on = (target: EventTarget, eventNames: string, listener: EventListener, options?: OnOptions): (() => void) => {\r\n const doSupportPassiveEvents = supportPassiveEvents();\r\n const passive = (doSupportPassiveEvents && options && options._passive) || false;\r\n const capture = (options && options._capture) || false;\r\n const once = (options && options._once) || false;\r\n const offListeners: (() => void)[] = [];\r\n const nativeOptions: AddEventListenerOptions | boolean = doSupportPassiveEvents\r\n ? {\r\n passive,\r\n capture,\r\n }\r\n : capture;\r\n\r\n each(splitEventNames(eventNames), (eventName) => {\r\n const finalListener = once\r\n ? (evt: Event) => {\r\n target.removeEventListener(eventName, finalListener, capture);\r\n listener && listener(evt);\r\n }\r\n : listener;\r\n\r\n push(offListeners, off.bind(null, target, eventName, finalListener, capture));\r\n target.addEventListener(eventName, finalListener, nativeOptions);\r\n });\r\n\r\n return runEach.bind(0, offListeners);\r\n};\r\n\r\n/**\r\n * Shorthand for the stopPropagation event Method.\r\n * @param evt The event of which the stopPropagation method shall be called.\r\n */\r\nexport const stopPropagation = (evt: Event) => evt.stopPropagation();\r\n\r\n/**\r\n * Shorthand for the preventDefault event Method.\r\n * @param evt The event of which the preventDefault method shall be called.\r\n */\r\nexport const preventDefault = (evt: Event) => evt.preventDefault();\r\n","import { each } from 'support/utils/array';\r\nimport { WH, XY, TRBL } from 'support/dom';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Compares two objects and returns true if all values of the passed prop names are identical, false otherwise or if one of the two object is falsy.\r\n * @param a Object a.\r\n * @param b Object b.\r\n * @param props The props which shall be compared.\r\n */\r\nexport const equal = (a: T | undefined, b: T | undefined, props: Array): boolean => {\r\n if (a && b) {\r\n let result = true;\r\n each(props, (prop) => {\r\n if (a[prop] !== b[prop]) {\r\n result = false;\r\n }\r\n });\r\n return result;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalWH = (a?: WH, b?: WH) => equal(a, b, ['w', 'h']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalXY = (a?: XY, b?: XY) => equal(a, b, ['x', 'y']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalTRBL = (a?: TRBL, b?: TRBL) => equal(a, b, ['t', 'r', 'b', 'l']);\r\n","import { each } from 'support/utils/array';\r\nimport { hasOwnProperty } from 'support/utils/object';\r\nimport { createDiv } from 'support/dom/create';\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 MutationObserverConstructor = jsAPI('MutationObserver');\r\nexport const IntersectionObserverConstructor = jsAPI('IntersectionObserver');\r\nexport const ResizeObserverConstructor: any | undefined = jsAPI('ResizeObserver');\r\nexport const cAF = jsAPI('cancelAnimationFrame');\r\nexport const rAF = jsAPI('requestAnimationFrame');\r\n","import { isNumber } from 'support/utils/types';\r\nimport { cAF, rAF } from 'support/compatibility/apis';\r\n\r\nexport const noop = () => {}; // eslint-disable-line\r\n\r\n/**\r\n * Debounces the given function either with a timeout or a animation frame.\r\n * @param functionToDebounce The function which shall be debounced.\r\n * @param timeout The timeout for debouncing. If 0 or lower animation frame is used for debouncing, a timeout otherwise.\r\n * @param maxWait A maximum amount of ms. before the function will be called even with debounce.\r\n */\r\nexport const debounce = (functionToDebounce: (...args: any) => any, timeout?: number, maxWait?: number) => {\r\n let timeoutId: number | void;\r\n let lastCallTime: number;\r\n const hasTimeout = isNumber(timeout) && timeout > 0;\r\n const hasMaxWait = isNumber(maxWait) && maxWait > 0;\r\n const cancel = hasTimeout ? window.clearTimeout : cAF!;\r\n const set = hasTimeout ? window.setTimeout : rAF!;\r\n const setFn = function (args: IArguments) {\r\n lastCallTime = hasMaxWait ? performance.now() : 0;\r\n timeoutId && cancel(timeoutId);\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n functionToDebounce.apply(this, args);\r\n };\r\n\r\n return function () {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const boundSetFn = setFn.bind(this, arguments); // eslint-disable-line\r\n const forceCall = hasMaxWait ? performance.now() - lastCallTime >= maxWait! : false;\r\n\r\n timeoutId && cancel(timeoutId);\r\n timeoutId = forceCall ? boundSetFn() : (set(boundSetFn, timeout!) as number);\r\n };\r\n};\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\nexport interface TRBL {\r\n t: number;\r\n r: number;\r\n b: number;\r\n l: number;\r\n}\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst parseToZeroOrNumber = (value: string, toFloat?: boolean): number => {\r\n /* istanbul ignore next */\r\n const num = toFloat ? parseFloat(value) : parseInt(value, 10);\r\n /* istanbul ignore next */\r\n return Number.isNaN(num) ? 0 : num;\r\n};\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null | undefined, 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 | undefined, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null | undefined, styles: string): string;\r\nexport function style(elm: HTMLElement | null | undefined, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null | undefined, 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 | undefined): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n\r\n/**\r\n * Returns a top\r\n * @param elm\r\n * @param property\r\n */\r\nexport const topRightBottomLeft = (elm: HTMLElement | null | undefined, property?: string): TRBL => {\r\n const finalProp = property || '';\r\n const top = `${finalProp}-top`;\r\n const right = `${finalProp}-right`;\r\n const bottom = `${finalProp}-bottom`;\r\n const left = `${finalProp}-left`;\r\n const result = style(elm, [top, right, bottom, left]);\r\n return {\r\n t: parseToZeroOrNumber(result[top]),\r\n r: parseToZeroOrNumber(result[right]),\r\n b: parseToZeroOrNumber(result[bottom]),\r\n l: parseToZeroOrNumber(result[left]),\r\n };\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\n\r\nexport interface XY {\r\n x: T;\r\n y: T;\r\n}\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null | undefined): 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 | undefined): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","export interface Cache {\r\n readonly _value?: T;\r\n readonly _previous?: T;\r\n readonly _changed: boolean;\r\n}\r\n\r\nexport interface CacheOptions {\r\n // Custom comparison function if shallow compare isn't enough. Returns true if nothing changed.\r\n _equal?: EqualCachePropFunction;\r\n // Initial value for _value\r\n _initialValue?: T;\r\n // If true updates always _value and _previous, otherwise they update only when changed\r\n _alwaysUpdateValues?: boolean;\r\n}\r\n\r\nexport type CacheUpdate = undefined extends C ? (force?: boolean | 0, context?: C) => Cache : (force: boolean | 0, context: C) => Cache;\r\n\r\nexport type UpdateCachePropFunction = undefined extends C\r\n ? (context?: C, current?: T, previous?: T) => T\r\n : C extends T\r\n ? ((context: C, current?: T, previous?: T) => T) | 0\r\n : (context: C, current?: T, previous?: T) => T;\r\n\r\nexport type EqualCachePropFunction = (currentVal?: T, newVal?: T) => boolean;\r\n\r\nexport const createCache = (update: UpdateCachePropFunction, options?: CacheOptions): CacheUpdate => {\r\n const { _equal, _initialValue, _alwaysUpdateValues } = options || {};\r\n let _value: T | undefined = _initialValue;\r\n let _previous: T | undefined;\r\n\r\n const cacheUpdate = ((force?: boolean | 0, context?: C) => {\r\n const curr = _value;\r\n // @ts-ignore\r\n // update can only not be a function if C extends T as described in \"UpdateCachePropFunction\" type definition\r\n // if C extends T the cast (context as T) is perfectly valid\r\n const newVal = update ? update(context, _value, _previous) : (context as T);\r\n const changed = force || (_equal ? !_equal(curr, newVal) : curr !== newVal);\r\n\r\n if (changed || _alwaysUpdateValues) {\r\n _value = newVal;\r\n _previous = curr;\r\n }\r\n\r\n return {\r\n _value,\r\n _previous,\r\n _changed: changed,\r\n };\r\n }) as CacheUpdate;\r\n\r\n return cacheUpdate;\r\n};\r\n","function _extends() {\n module.exports = _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import { each, hasOwnProperty, keys, push, isEmptyObject } from 'support/utils';\r\nimport { type, isArray, isUndefined, isPlainObject, isString } from 'support/utils/types';\r\nimport { OptionsTemplate, OptionsTemplateTypes, OptionsTemplateType, Func, OptionsValidationResult, OptionsValidated } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\n\r\nconst { stringify } = JSON;\r\n\r\n/**\r\n * A prefix and suffix tuple which serves as recognition pattern for template types.\r\n */\r\nconst templateTypePrefixSuffix: readonly [string, string] = ['__TPL_', '_TYPE__'];\r\n/**\r\n * A object which serves as a mapping for \"normal\" types and template types.\r\n * Key = normal type string\r\n * value = template type string\r\n */\r\nconst optionsTemplateTypes: OptionsTemplateTypesDictionary = ['boolean', 'number', 'string', 'array', 'object', 'function', 'null'].reduce(\r\n (result, item) => {\r\n result[item] = templateTypePrefixSuffix[0] + item + templateTypePrefixSuffix[1];\r\n return result;\r\n },\r\n {} as OptionsTemplateTypesDictionary\r\n);\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n * @param propPath The propertyPath which lead to this object. (used for error logging)\r\n */\r\nconst validateRecursive = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff: T,\r\n doWriteErrors?: boolean,\r\n propPath?: string\r\n): OptionsValidationResult => {\r\n const validatedOptions: OptionsValidated = {};\r\n const optionsCopy: T = { ...options };\r\n const props = keys(template).filter((prop) => hasOwnProperty(options, prop));\r\n\r\n each(props, (prop: Extract) => {\r\n const optionsDiffValue: any = isUndefined(optionsDiff[prop]) ? {} : optionsDiff[prop];\r\n const optionsValue: any = options[prop];\r\n const templateValue: PlainObject | string | OptionsTemplateTypes | Array = template[prop];\r\n const templateIsComplex = isPlainObject(templateValue);\r\n const propPrefix = propPath ? `${propPath}.` : '';\r\n\r\n // if the template has a object as value, it means that the options are complex (verschachtelt)\r\n if (templateIsComplex && isPlainObject(optionsValue)) {\r\n const validatedResult = validateRecursive(optionsValue, templateValue as PlainObject, optionsDiffValue, doWriteErrors, propPrefix + prop);\r\n validatedOptions[prop] = validatedResult._validated as any;\r\n optionsCopy[prop] = validatedResult._foreign as any;\r\n\r\n each([optionsCopy, validatedOptions], (value) => {\r\n if (isEmptyObject(value[prop])) {\r\n delete value[prop];\r\n }\r\n });\r\n } else if (!templateIsComplex) {\r\n let isValid = false;\r\n const errorEnumStrings: Array = [];\r\n const errorPossibleTypes: Array = [];\r\n const optionsValueType = type(optionsValue);\r\n const templateValueArr: Array = !isArray(templateValue)\r\n ? [templateValue as string | OptionsTemplateTypes]\r\n : (templateValue as Array);\r\n\r\n each(templateValueArr, (currTemplateType) => {\r\n // if currType value isn't inside possibleTemplateTypes we assume its a enum string value\r\n let typeString: string | undefined;\r\n each(optionsTemplateTypes, (value: string, key: string) => {\r\n if (value === currTemplateType) {\r\n typeString = key;\r\n }\r\n });\r\n const isEnumString = isUndefined(typeString);\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 push(errorEnumStrings, enumStringSplit);\r\n } else {\r\n isValid = optionsTemplateTypes[optionsValueType] === currTemplateType;\r\n }\r\n\r\n // build error message\r\n push(errorPossibleTypes, isEnumString ? optionsTemplateTypes.string : typeString!);\r\n\r\n // continue if invalid, break if valid\r\n return !isValid;\r\n });\r\n\r\n if (isValid) {\r\n const doStringifyComparison = isArray(optionsValue) || isPlainObject(optionsValue);\r\n if (doStringifyComparison ? stringify(optionsValue) !== stringify(optionsDiffValue) : optionsValue !== optionsDiffValue) {\r\n validatedOptions[prop] = optionsValue;\r\n }\r\n } else if (doWriteErrors) {\r\n console.warn(\r\n `${\r\n `The option \"${propPrefix}${prop}\" wasn't set, because it doesn't accept the type [ ${optionsValueType.toUpperCase()} ] with the value of \"${optionsValue}\".\\r\\n` +\r\n `Accepted types are: [ ${errorPossibleTypes.join(', ').toUpperCase()} ].\\r\\n`\r\n }${errorEnumStrings.length > 0 ? `\\r\\nValid strings are: [ ${errorEnumStrings.join(', ')} ].` : ''}`\r\n );\r\n }\r\n\r\n delete optionsCopy[prop];\r\n }\r\n });\r\n\r\n return {\r\n _foreign: optionsCopy,\r\n _validated: validatedOptions,\r\n };\r\n};\r\n\r\n/**\r\n * Validates the given options object according to the given template object and returns a object which looks like:\r\n * {\r\n * foreign : a object which consists of properties which aren't defined inside the template. (foreign properties)\r\n * validated : a object which consists only of valid properties. (property name is inside the template and value has a correct type)\r\n * }\r\n * @param options The options object which shall be validated.\r\n * @param template The template according to which the options object shall be validated.\r\n * @param optionsDiff When provided the returned validated object will only have properties which are different to this objects properties.\r\n * Example (assume all properties are valid to the template):\r\n * Options object : { a: 'a', b: 'b', c: 'c' }\r\n * optionsDiff object : { a: 'a', b: 'b', c: undefined }\r\n * Returned validated object : { c: 'c' }\r\n * Because the value of the properties a and b didn't change, they aren't included in the returned object.\r\n * Without the optionsDiff object the returned validated object would be: { a: 'a', b: 'b', c: 'c' }\r\n * @param doWriteErrors True if errors shall be logged into the console, false otherwise.\r\n */\r\nconst validateOptions = (\r\n options: T,\r\n template: OptionsTemplate>,\r\n optionsDiff?: T | null,\r\n doWriteErrors?: boolean\r\n): OptionsValidationResult => {\r\n /*\r\n if (!isEmptyObject(foreign) && doWriteErrors)\r\n console.warn(`The following options are discarded due to invalidity:\\r\\n ${window.JSON.stringify(foreign, null, 2)}`);\r\n\r\n //add values, which aren't specified in the template, to the finished validated object to prevent them from being discarded\r\n if (keepForeignProps) {\r\n Object.assign(result.validated, foreign);\r\n }\r\n */\r\n return validateRecursive(options, template, optionsDiff || ({} as T), doWriteErrors || false);\r\n};\r\n\r\nexport { validateOptions, optionsTemplateTypes };\r\n\r\ntype OptionsTemplateTypesDictionary = {\r\n readonly boolean: OptionsTemplateType;\r\n readonly number: OptionsTemplateType;\r\n readonly string: OptionsTemplateType;\r\n readonly array: OptionsTemplateType>;\r\n readonly object: OptionsTemplateType>;\r\n readonly function: OptionsTemplateType;\r\n readonly null: OptionsTemplateType;\r\n};\r\n","import { OptionsTemplate, OptionsWithOptionsTemplate, OptionsTemplateTypes } from 'support/options';\r\nimport { PlainObject } from 'typings';\r\nimport { isArray } from 'support/utils/types';\r\nimport { each, keys } from 'support/utils';\r\n\r\nexport interface OptionsWithOptionsTemplateTransformation> {\r\n _template: OptionsTemplate;\r\n _options: T;\r\n}\r\n\r\n/**\r\n * Transforms the given OptionsWithOptionsTemplate object to its corresponding generic (T) Object or its corresponding Template object.\r\n * @param optionsWithOptionsTemplate The OptionsWithOptionsTemplate object which shall be converted.\r\n * @param toTemplate True if the given OptionsWithOptionsTemplate shall be converted to its corresponding Template object.\r\n */\r\nexport function transformOptions>(\r\n optionsWithOptionsTemplate: OptionsWithOptionsTemplate\r\n): OptionsWithOptionsTemplateTransformation {\r\n const result: any = {\r\n _template: {},\r\n _options: {},\r\n };\r\n\r\n each(keys(optionsWithOptionsTemplate), (key: Extract) => {\r\n const val: PlainObject | OptionsTemplateTypes | Array = optionsWithOptionsTemplate[key];\r\n\r\n if (isArray(val)) {\r\n result._template[key] = val[1];\r\n result._options[key] = val[0];\r\n } else {\r\n // if (isObject(val))\r\n const tmpResult = transformOptions(val as OptionsWithOptionsTemplate);\r\n result._template[key] = tmpResult._template;\r\n result._options[key] = tmpResult._options;\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","export const classNameEnvironment = 'os-environment';\r\nexport const classNameEnvironmentFlexboxGlue = `${classNameEnvironment}-flexbox-glue`;\r\nexport const classNameEnvironmentFlexboxGlueMax = `${classNameEnvironmentFlexboxGlue}-max`;\r\n\r\nexport const classNameHost = 'os-host';\r\nexport const classNamePadding = 'os-padding';\r\nexport const classNameViewport = 'os-viewport';\r\nexport const classNameContent = 'os-content';\r\nexport const classNameViewportScrollbarStyling = `${classNameViewport}-scrollbar-styled`;\r\n\r\nexport const classNameSizeObserver = 'os-size-observer';\r\nexport const classNameSizeObserverAppear = `${classNameSizeObserver}-appear`;\r\nexport const classNameSizeObserverListener = `${classNameSizeObserver}-listener`;\r\nexport const classNameSizeObserverListenerScroll = `${classNameSizeObserverListener}-scroll`;\r\nexport const classNameSizeObserverListenerItem = `${classNameSizeObserverListener}-item`;\r\nexport const classNameSizeObserverListenerItemFinal = `${classNameSizeObserverListenerItem}-final`;\r\n\r\nexport const classNameTrinsicObserver = 'os-trinsic-observer';\r\n","import {\r\n createDOM,\r\n addClass,\r\n style,\r\n appendChildren,\r\n clientSize,\r\n absoluteCoordinates,\r\n offsetSize,\r\n scrollLeft,\r\n XY,\r\n removeAttr,\r\n removeElements,\r\n windowSize,\r\n runEach,\r\n equalWH,\r\n} from 'support';\r\nimport {\r\n classNameEnvironment,\r\n classNameEnvironmentFlexboxGlue,\r\n classNameEnvironmentFlexboxGlueMax,\r\n classNameViewportScrollbarStyling,\r\n} from 'classnames';\r\n\r\nexport type OnEnvironmentChanged = (env: Environment) => void;\r\nexport interface Environment {\r\n _autoUpdateLoop: boolean;\r\n _nativeScrollbarSize: XY;\r\n _nativeScrollbarIsOverlaid: XY;\r\n _nativeScrollbarStyling: boolean;\r\n _rtlScrollBehavior: { n: boolean; i: boolean };\r\n _flexboxGlue: boolean;\r\n _addListener(listener: OnEnvironmentChanged): void;\r\n _removeListener(listener: OnEnvironmentChanged): void;\r\n}\r\n\r\nlet environmentInstance: Environment;\r\nconst { abs, round } = Math;\r\n\r\nconst getNativeScrollbarSize = (body: HTMLElement, measureElm: HTMLElement): XY => {\r\n appendChildren(body, measureElm);\r\n const cSize = clientSize(measureElm);\r\n const oSize = offsetSize(measureElm);\r\n\r\n return {\r\n x: oSize.h - cSize.h,\r\n y: oSize.w - cSize.w,\r\n };\r\n};\r\n\r\nconst getNativeScrollbarStyling = (testElm: HTMLElement): boolean => {\r\n let result = false;\r\n addClass(testElm, classNameViewportScrollbarStyling);\r\n try {\r\n result =\r\n style(testElm, 'scrollbar-width') === 'none' || window.getComputedStyle(testElm, '::-webkit-scrollbar').getPropertyValue('display') === 'none';\r\n } catch (ex) {}\r\n\r\n return result;\r\n};\r\n\r\nconst getRtlScrollBehavior = (parentElm: HTMLElement, childElm: HTMLElement): { i: boolean; n: boolean } => {\r\n const strHidden = 'hidden';\r\n style(parentElm, { overflowX: strHidden, overflowY: strHidden, direction: 'rtl' });\r\n scrollLeft(parentElm, 0);\r\n\r\n const parentOffset = absoluteCoordinates(parentElm);\r\n const childOffset = absoluteCoordinates(childElm);\r\n scrollLeft(parentElm, -999); // https://github.com/KingSora/OverlayScrollbars/issues/187\r\n const childOffsetAfterScroll = absoluteCoordinates(childElm);\r\n return {\r\n /**\r\n * origin direction = determines if the zero scroll position is on the left or right side\r\n * 'i' means 'invert' (i === true means that the axis must be inverted to be correct)\r\n * true = on the left side\r\n * false = on the right side\r\n */\r\n i: parentOffset.x === childOffset.x,\r\n /**\r\n * negative = determines if the maximum scroll is positive or negative\r\n * 'n' means 'negate' (n === true means that the axis must be negated to be correct)\r\n * true = negative\r\n * false = positive\r\n */\r\n n: childOffset.x !== childOffsetAfterScroll.x,\r\n };\r\n};\r\n\r\nconst getFlexboxGlue = (parentElm: HTMLElement, childElm: HTMLElement): boolean => {\r\n addClass(parentElm, classNameEnvironmentFlexboxGlue);\r\n const minOffsetsizeParent = offsetSize(parentElm);\r\n const minOffsetsize = offsetSize(childElm);\r\n const supportsMin = equalWH(minOffsetsize, minOffsetsizeParent);\r\n\r\n addClass(parentElm, classNameEnvironmentFlexboxGlueMax);\r\n const maxOffsetsizeParent = offsetSize(parentElm);\r\n const maxOffsetsize = offsetSize(childElm);\r\n const supportsMax = equalWH(maxOffsetsize, maxOffsetsizeParent);\r\n\r\n return supportsMin && supportsMax;\r\n};\r\n\r\nconst getWindowDPR = (): number => {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const dDPI = window.screen.deviceXDPI || 0;\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const sDPI = window.screen.logicalXDPI || 1;\r\n return window.devicePixelRatio || dDPI / sDPI;\r\n};\r\n\r\nconst diffBiggerThanOne = (valOne: number, valTwo: number): boolean => {\r\n const absValOne = abs(valOne);\r\n const absValTwo = abs(valTwo);\r\n return !(absValOne === absValTwo || absValOne + 1 === absValTwo || absValOne - 1 === absValTwo);\r\n};\r\n\r\nconst createEnvironment = (): Environment => {\r\n const { body } = document;\r\n const envDOM = createDOM(``);\r\n const envElm = envDOM[0] as HTMLElement;\r\n const envChildElm = envElm.firstChild as HTMLElement;\r\n\r\n const onChangedListener: Set = new Set();\r\n const nativeScrollBarSize = getNativeScrollbarSize(body, envElm);\r\n const nativeScrollbarIsOverlaid = {\r\n x: nativeScrollBarSize.x === 0,\r\n y: nativeScrollBarSize.y === 0,\r\n };\r\n\r\n const env: Environment = {\r\n _autoUpdateLoop: false,\r\n _nativeScrollbarSize: nativeScrollBarSize,\r\n _nativeScrollbarIsOverlaid: nativeScrollbarIsOverlaid,\r\n _nativeScrollbarStyling: getNativeScrollbarStyling(envElm),\r\n _rtlScrollBehavior: getRtlScrollBehavior(envElm, envChildElm),\r\n _flexboxGlue: getFlexboxGlue(envElm, envChildElm),\r\n _addListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.add(listener);\r\n },\r\n _removeListener(listener: OnEnvironmentChanged): void {\r\n onChangedListener.delete(listener);\r\n },\r\n };\r\n\r\n removeAttr(envElm, 'style');\r\n removeAttr(envElm, 'class');\r\n removeElements(envElm);\r\n\r\n if (!nativeScrollbarIsOverlaid.x || !nativeScrollbarIsOverlaid.y) {\r\n let size = windowSize();\r\n let dpr = getWindowDPR();\r\n let scrollbarSize = nativeScrollBarSize;\r\n\r\n window.addEventListener('resize', () => {\r\n if (onChangedListener.size) {\r\n const sizeNew = windowSize();\r\n const deltaSize = {\r\n w: sizeNew.w - size.w,\r\n h: sizeNew.h - size.h,\r\n };\r\n\r\n if (deltaSize.w === 0 && deltaSize.h === 0) return;\r\n\r\n const deltaAbsSize = {\r\n w: abs(deltaSize.w),\r\n h: abs(deltaSize.h),\r\n };\r\n const deltaAbsRatio = {\r\n w: abs(round(sizeNew.w / (size.w / 100.0))),\r\n h: abs(round(sizeNew.h / (size.h / 100.0))),\r\n };\r\n const dprNew = getWindowDPR();\r\n const deltaIsBigger = deltaAbsSize.w > 2 && deltaAbsSize.h > 2;\r\n const difference = !diffBiggerThanOne(deltaAbsRatio.w, deltaAbsRatio.h);\r\n const dprChanged = dprNew !== dpr && dpr > 0;\r\n const isZoom = deltaIsBigger && difference && dprChanged;\r\n\r\n if (isZoom) {\r\n const newScrollbarSize = (environmentInstance._nativeScrollbarSize = getNativeScrollbarSize(body, envElm));\r\n removeElements(envElm);\r\n\r\n if (scrollbarSize.x !== newScrollbarSize.x || scrollbarSize.y !== newScrollbarSize.y) {\r\n runEach(onChangedListener);\r\n }\r\n\r\n scrollbarSize = newScrollbarSize;\r\n }\r\n\r\n size = sizeNew;\r\n dpr = dprNew;\r\n }\r\n });\r\n }\r\n\r\n return env;\r\n};\r\n\r\nexport const getEnvironment = (): Environment => {\r\n if (!environmentInstance) {\r\n environmentInstance = createEnvironment();\r\n }\r\n return environmentInstance;\r\n};\r\n","import {\r\n Cache,\r\n OptionsValidated,\r\n OptionsWithOptionsTemplate,\r\n transformOptions,\r\n validateOptions,\r\n assignDeep,\r\n hasOwnProperty,\r\n isEmptyObject,\r\n} from 'support';\r\nimport { PlainObject } from 'typings';\r\n\r\ninterface LifecycleBaseUpdateHints {\r\n _force?: boolean;\r\n _changedOptions?: OptionsValidated;\r\n}\r\n\r\nexport interface LifecycleBase {\r\n _options(newOptions?: O): O;\r\n _update(force?: boolean): void;\r\n}\r\n\r\nexport interface Lifecycle extends LifecycleBase {\r\n _destruct(): void;\r\n _onSizeChanged?(): void;\r\n _onDirectionChanged?(directionCache: Cache): void;\r\n _onTrinsicChanged?(widthIntrinsic: boolean, heightIntrinsicCache: Cache): void;\r\n}\r\n\r\nexport interface LifecycleOptionInfo {\r\n _value: T;\r\n _changed: boolean;\r\n}\r\n\r\nexport type LifecycleCheckOption = (path: string) => LifecycleOptionInfo;\r\n\r\nconst getPropByPath = (obj: any, path: string): T =>\r\n obj && path.split('.').reduce((o, prop) => (o && hasOwnProperty(o, prop) ? o[prop] : undefined), obj);\r\n\r\n/**\r\n * Creates a object which can be seen as the base of a lifecycle because it provides all the tools to manage a lifecycle and its options, cache and base functions.\r\n * @param defaultOptionsWithTemplate A object which describes the options and the default options of the lifecycle.\r\n * @param initialOptions The initialOptions for the lifecylce. (Can be undefined)\r\n * @param updateFunction The update function where cache and options updates are handled. Has two arguments which are the changedOptions and the changedCache objects.\r\n */\r\nexport const createLifecycleBase = (\r\n defaultOptionsWithTemplate: OptionsWithOptionsTemplate>,\r\n initialOptions: O | undefined,\r\n updateFunction: (force: boolean, checkOption: LifecycleCheckOption) => any\r\n): LifecycleBase => {\r\n const { _template: optionsTemplate, _options: defaultOptions } = transformOptions>(defaultOptionsWithTemplate);\r\n const options: Required = assignDeep(\r\n {},\r\n defaultOptions,\r\n validateOptions(initialOptions || ({} as O), optionsTemplate, null, true)._validated\r\n );\r\n\r\n const update = (hints: LifecycleBaseUpdateHints) => {\r\n const { _force, _changedOptions } = hints;\r\n const checkOption: LifecycleCheckOption = (path) => ({\r\n _value: getPropByPath(options, path),\r\n _changed: _force || getPropByPath(_changedOptions, path) !== undefined,\r\n });\r\n updateFunction(!!_force, checkOption);\r\n };\r\n\r\n update({ _force: true });\r\n\r\n return {\r\n _options(newOptions?: O) {\r\n if (newOptions) {\r\n const { _validated: _changedOptions } = validateOptions(newOptions, optionsTemplate, options, true);\r\n\r\n if (!isEmptyObject(_changedOptions)) {\r\n assignDeep(options, _changedOptions);\r\n update({ _changedOptions });\r\n }\r\n }\r\n return options;\r\n },\r\n _update: (_force?: boolean) => {\r\n update({ _force });\r\n },\r\n };\r\n};\r\n","import {\r\n Cache,\r\n cssProperty,\r\n runEach,\r\n createCache,\r\n topRightBottomLeft,\r\n TRBL,\r\n WH,\r\n XY,\r\n equalTRBL,\r\n equalXY,\r\n optionsTemplateTypes as oTypes,\r\n OptionsTemplateValue,\r\n style,\r\n OptionsWithOptionsTemplate,\r\n scrollSize,\r\n offsetSize,\r\n} from 'support';\r\nimport { PreparedOSTargetObject } from 'setups/structureSetup';\r\nimport { createLifecycleBase, Lifecycle } from 'lifecycles/lifecycleBase';\r\nimport { getEnvironment, Environment } from 'environment';\r\n\r\nexport type OverflowBehavior = 'hidden' | 'scroll' | 'visible-hidden' | 'visible-scroll';\r\nexport interface StructureLifecycleOptions {\r\n paddingAbsolute: boolean;\r\n overflowBehavior?: {\r\n x?: OverflowBehavior;\r\n y?: OverflowBehavior;\r\n };\r\n}\r\n\r\nconst overflowBehaviorAllowedValues: OptionsTemplateValue = 'visible-hidden visible-scroll scroll hidden';\r\nconst defaultOptionsWithTemplate: OptionsWithOptionsTemplate> = {\r\n paddingAbsolute: [false, oTypes.boolean],\r\n overflowBehavior: {\r\n x: ['scroll', overflowBehaviorAllowedValues],\r\n y: ['scroll', overflowBehaviorAllowedValues],\r\n },\r\n};\r\n\r\nconst cssMarginEnd = cssProperty('margin-inline-end');\r\nconst cssBorderEnd = cssProperty('border-inline-end');\r\n\r\nexport const createStructureLifecycle = (\r\n target: PreparedOSTargetObject,\r\n initialOptions?: StructureLifecycleOptions\r\n): Lifecycle => {\r\n const { _host, _padding, _viewport, _content } = target;\r\n const destructFns: (() => any)[] = [];\r\n const env: Environment = getEnvironment();\r\n const scrollbarsOverlaid = env._nativeScrollbarIsOverlaid;\r\n const supportsScrollbarStyling = env._nativeScrollbarStyling;\r\n const supportFlexboxGlue = env._flexboxGlue;\r\n // direction change is only needed to update scrollbar hiding, therefore its not needed if css can do it, scrollbars are invisible or overlaid on y axis\r\n const directionObserverObsolete = (cssMarginEnd && cssBorderEnd) || supportsScrollbarStyling || scrollbarsOverlaid.y;\r\n\r\n const updatePaddingCache = createCache(() => topRightBottomLeft(_host, 'padding'), { _equal: equalTRBL });\r\n const updateOverflowAmountCache = createCache, { _contentScrollSize: WH; _viewportSize: WH }>(\r\n (ctx) => ({\r\n x: Math.max(0, Math.round((ctx!._contentScrollSize.w - ctx!._viewportSize.w) * 100) / 100),\r\n y: Math.max(0, Math.round((ctx!._contentScrollSize.h - ctx!._viewportSize.h) * 100) / 100),\r\n }),\r\n { _equal: equalXY }\r\n );\r\n\r\n const { _options, _update } = createLifecycleBase(defaultOptionsWithTemplate, initialOptions, (force, checkOption) => {\r\n const { _value: paddingAbsolute, _changed: paddingAbsoluteChanged } = checkOption('paddingAbsolute');\r\n const { _value: padding, _changed: paddingChanged } = updatePaddingCache(force);\r\n\r\n if (paddingAbsoluteChanged || paddingChanged) {\r\n const paddingStyle: TRBL = {\r\n t: 0,\r\n r: 0,\r\n b: 0,\r\n l: 0,\r\n };\r\n\r\n if (!paddingAbsolute) {\r\n paddingStyle.t = -padding!.t;\r\n paddingStyle.r = -(padding!.r + padding!.l);\r\n paddingStyle.b = -(padding!.b + padding!.t);\r\n paddingStyle.l = -padding!.l;\r\n }\r\n\r\n style(_padding, {\r\n top: paddingStyle.t,\r\n left: paddingStyle.l,\r\n 'margin-right': paddingStyle.r,\r\n 'margin-bottom': paddingStyle.b,\r\n 'max-width': `calc(100% + ${paddingStyle.r * -1}px)`,\r\n });\r\n }\r\n\r\n const viewportOffsetSize = offsetSize(_padding);\r\n const contentClientSize = offsetSize(_content);\r\n const contentScrollSize = scrollSize(_content);\r\n const overflowAmuntCache = updateOverflowAmountCache(force, {\r\n _contentScrollSize: contentScrollSize,\r\n _viewportSize: {\r\n w: viewportOffsetSize.w + Math.max(0, contentClientSize.w - contentScrollSize.w),\r\n h: viewportOffsetSize.h + Math.max(0, contentClientSize.h - contentScrollSize.h),\r\n },\r\n });\r\n const { _value: overflowAmount, _changed: overflowAmountChanged } = overflowAmuntCache;\r\n\r\n console.log('overflowAmount', overflowAmount);\r\n console.log('overflowAmountChanged', overflowAmountChanged);\r\n\r\n /*\r\n var setOverflowVariables = function (horizontal) {\r\n var scrollbarVars = getScrollbarVars(horizontal);\r\n var scrollbarVarsInverted = getScrollbarVars(!horizontal);\r\n var xyI = scrollbarVarsInverted._x_y;\r\n var xy = scrollbarVars._x_y;\r\n var wh = scrollbarVars._w_h;\r\n var widthHeight = scrollbarVars._width_height;\r\n var scrollMax = _strScroll + scrollbarVars._Left_Top + 'Max';\r\n var fractionalOverflowAmount = viewportRect[widthHeight] ? MATH.abs(viewportRect[widthHeight] - _viewportSize[wh]) : 0;\r\n var checkFractionalOverflowAmount = previousOverflowAmount && previousOverflowAmount[xy] > 0 && _viewportElementNative[scrollMax] === 0;\r\n overflowBehaviorIsVS[xy] = overflowBehavior[xy] === 'v-s';\r\n overflowBehaviorIsVH[xy] = overflowBehavior[xy] === 'v-h';\r\n overflowBehaviorIsS[xy] = overflowBehavior[xy] === 's';\r\n overflowAmount[xy] = MATH.max(0, MATH.round((contentScrollSize[wh] - _viewportSize[wh]) * 100) / 100);\r\n overflowAmount[xy] *=\r\n hideOverflowForceTextarea || (checkFractionalOverflowAmount && fractionalOverflowAmount > 0 && fractionalOverflowAmount < 1) ? 0 : 1;\r\n hasOverflow[xy] = overflowAmount[xy] > 0;\r\n\r\n //hideOverflow:\r\n //x || y : true === overflow is hidden by \"overflow: scroll\" OR \"overflow: hidden\"\r\n //xs || ys : true === overflow is hidden by \"overflow: scroll\"\r\n hideOverflow[xy] =\r\n overflowBehaviorIsVS[xy] || overflowBehaviorIsVH[xy]\r\n ? hasOverflow[xyI] && !overflowBehaviorIsVS[xyI] && !overflowBehaviorIsVH[xyI]\r\n : hasOverflow[xy];\r\n hideOverflow[xy + 's'] = hideOverflow[xy] ? overflowBehaviorIsS[xy] || overflowBehaviorIsVS[xy] : false;\r\n\r\n canScroll[xy] = hasOverflow[xy] && hideOverflow[xy + 's'];\r\n };\r\n*/\r\n /*\r\n if (!supportsScrollbarStyling) {\r\n paddingStyle.r -= env._nativeScrollbarSize.y;\r\n paddingStyle.b -= env._nativeScrollbarSize.x;\r\n }\r\n */\r\n });\r\n\r\n const onSizeChanged = () => {\r\n _update();\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => {\r\n const { _changed, _value } = heightIntrinsicCache;\r\n if (_changed) {\r\n style(_content, { height: _value ? 'auto' : '100%' });\r\n }\r\n };\r\n\r\n return {\r\n _options,\r\n _update,\r\n _onSizeChanged: onSizeChanged,\r\n _onTrinsicChanged: onTrinsicChanged,\r\n _destruct() {\r\n runEach(destructFns);\r\n },\r\n };\r\n};\r\n","import {\r\n Cache,\r\n createCache,\r\n createDOM,\r\n style,\r\n appendChildren,\r\n offsetSize,\r\n scrollLeft,\r\n scrollTop,\r\n runEach,\r\n prependChildren,\r\n removeElements,\r\n on,\r\n preventDefault,\r\n stopPropagation,\r\n addClass,\r\n equalWH,\r\n push,\r\n cAF,\r\n rAF,\r\n ResizeObserverConstructor,\r\n isArray,\r\n indexOf,\r\n each,\r\n isBoolean,\r\n} from 'support';\r\nimport { getEnvironment } from 'environment';\r\nimport {\r\n classNameSizeObserver,\r\n classNameSizeObserverAppear,\r\n classNameSizeObserverListener,\r\n classNameSizeObserverListenerScroll,\r\n classNameSizeObserverListenerItem,\r\n classNameSizeObserverListenerItemFinal,\r\n} from 'classnames';\r\n\r\nconst animationStartEventName = 'animationstart';\r\nconst scrollEventName = 'scroll';\r\nconst scrollAmount = 3333333;\r\nconst directionIsRTLMap = {\r\n direction: ['rtl'],\r\n // 'writing-mode': ['sideways-rl', 'tb', 'tb-rl', 'vertical-rl'],\r\n};\r\nconst directionIsRTL = (elm: HTMLElement): boolean => {\r\n let isRTL = false;\r\n const styles = style(elm, ['direction' /* , 'writing-mode' */]);\r\n each(styles, (value, key) => {\r\n isRTL = isRTL || indexOf(directionIsRTLMap[key], value) > -1;\r\n });\r\n return isRTL;\r\n};\r\nconst domRectHasDimensions = (rect?: DOMRectReadOnly) => rect && (rect.height || rect.width);\r\n\r\ninterface SizeObserverEntry {\r\n contentRect: DOMRectReadOnly;\r\n}\r\nexport type SizeObserverOptions = { _direction?: boolean; _appear?: boolean };\r\nexport const createSizeObserver = (\r\n target: HTMLElement,\r\n onSizeChangedCallback: (directionIsRTLCache?: Cache) => any,\r\n options?: SizeObserverOptions\r\n): (() => void) => {\r\n const { _direction: observeDirectionChange = false, _appear: observeAppearChange = false } = options || {};\r\n const rtlScrollBehavior = getEnvironment()._rtlScrollBehavior;\r\n const baseElements = createDOM(``);\r\n const sizeObserver = baseElements[0] as HTMLElement;\r\n const listenerElement = sizeObserver.firstChild as HTMLElement;\r\n const updateResizeObserverContentRectCache = createCache(0, {\r\n _alwaysUpdateValues: true,\r\n _equal: (currVal, newVal) =>\r\n !(\r\n !currVal || // if no initial value\r\n // if from display: none to display: block\r\n (!domRectHasDimensions(currVal) && domRectHasDimensions(newVal))\r\n ),\r\n });\r\n const onSizeChangedCallbackProxy = (sizeChangedContext?: Cache | SizeObserverEntry[] | Event) => {\r\n const hasDirectionCache = sizeChangedContext && isBoolean((sizeChangedContext as Cache)._value);\r\n\r\n let skip = false;\r\n let doDirectionScroll = true; // always true if sizeChangedContext is Event (appear callback or RO. Polyfill)\r\n\r\n // if triggered from RO.\r\n if (isArray(sizeChangedContext) && sizeChangedContext.length > 0) {\r\n const { _previous, _value, _changed } = updateResizeObserverContentRectCache(0, sizeChangedContext.pop()!.contentRect);\r\n skip = !_previous || !domRectHasDimensions(_value); // skip on initial RO. call or if display is none\r\n doDirectionScroll = !skip && _changed; // direction scroll when not skipping and changing from display: none to block, false otherwise\r\n }\r\n // else if its triggered with DirectionCache\r\n else if (hasDirectionCache) {\r\n doDirectionScroll = (sizeChangedContext as Cache)._changed; // direction scroll when DirectionCache changed, false toherwise\r\n }\r\n\r\n if (observeDirectionChange) {\r\n const rtl = hasDirectionCache ? (sizeChangedContext as Cache)._value : directionIsRTL(sizeObserver);\r\n scrollLeft(sizeObserver, rtl ? (rtlScrollBehavior.n ? -scrollAmount : rtlScrollBehavior.i ? 0 : scrollAmount) : scrollAmount);\r\n scrollTop(sizeObserver, scrollAmount);\r\n }\r\n\r\n if (!skip) {\r\n onSizeChangedCallback(hasDirectionCache ? (sizeChangedContext as Cache) : undefined);\r\n }\r\n };\r\n const offListeners: (() => void)[] = [];\r\n let appearCallback: ((...args: any) => any) | false = observeAppearChange ? onSizeChangedCallbackProxy : false;\r\n\r\n if (ResizeObserverConstructor) {\r\n const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);\r\n resizeObserverInstance.observe(listenerElement);\r\n push(offListeners, () => resizeObserverInstance.disconnect());\r\n } else {\r\n const observerElementChildren = createDOM(\r\n ``\r\n );\r\n appendChildren(listenerElement, observerElementChildren);\r\n addClass(listenerElement, classNameSizeObserverListenerScroll);\r\n const observerElementChildrenRoot = observerElementChildren[0] as HTMLElement;\r\n const shrinkElement = observerElementChildrenRoot.lastChild as HTMLElement;\r\n const expandElement = observerElementChildrenRoot.firstChild as HTMLElement;\r\n const expandElementChild = expandElement?.firstChild as HTMLElement;\r\n\r\n let cacheSize = offsetSize(listenerElement);\r\n let currSize = cacheSize;\r\n let isDirty = false;\r\n let rAFId: number;\r\n\r\n const reset = () => {\r\n scrollLeft(expandElement, scrollAmount);\r\n scrollTop(expandElement, scrollAmount);\r\n scrollLeft(shrinkElement, scrollAmount);\r\n scrollTop(shrinkElement, scrollAmount);\r\n };\r\n const onResized = () => {\r\n rAFId = 0;\r\n if (isDirty) {\r\n cacheSize = currSize;\r\n onSizeChangedCallbackProxy();\r\n }\r\n };\r\n const onScroll = (scrollEvent?: Event) => {\r\n currSize = offsetSize(listenerElement);\r\n isDirty = !scrollEvent || !equalWH(currSize, cacheSize);\r\n\r\n if (scrollEvent && isDirty && !rAFId) {\r\n cAF!(rAFId);\r\n rAFId = rAF!(onResized);\r\n } else if (!scrollEvent) {\r\n onResized();\r\n }\r\n\r\n reset();\r\n\r\n if (scrollEvent) {\r\n preventDefault(scrollEvent);\r\n stopPropagation(scrollEvent);\r\n }\r\n return false;\r\n };\r\n\r\n push(offListeners, [on(expandElement, scrollEventName, onScroll), on(shrinkElement, scrollEventName, onScroll)]);\r\n\r\n // lets assume that the divs will never be that large and a constant value is enough\r\n style(expandElementChild, {\r\n width: scrollAmount,\r\n height: scrollAmount,\r\n });\r\n reset();\r\n appearCallback = observeAppearChange ? () => onScroll() : reset;\r\n }\r\n\r\n if (observeDirectionChange) {\r\n const updateDirectionIsRTLCache = createCache(() => directionIsRTL(sizeObserver));\r\n push(\r\n offListeners,\r\n on(sizeObserver, scrollEventName, (event: Event) => {\r\n const directionIsRTLCache = updateDirectionIsRTLCache();\r\n const { _value, _changed } = directionIsRTLCache;\r\n if (_changed) {\r\n if (_value) {\r\n style(listenerElement, { left: 'auto', right: 0 });\r\n } else {\r\n style(listenerElement, { left: 0, right: 'auto' });\r\n }\r\n onSizeChangedCallbackProxy(directionIsRTLCache);\r\n }\r\n\r\n preventDefault(event);\r\n stopPropagation(event);\r\n return false;\r\n })\r\n );\r\n }\r\n\r\n // appearCallback is always needed on scroll-observer strategy to reset it\r\n if (appearCallback) {\r\n addClass(sizeObserver, classNameSizeObserverAppear);\r\n push(\r\n offListeners,\r\n on(sizeObserver, animationStartEventName, appearCallback, {\r\n // Fire only once for \"CSS is ready\" event if ResizeObserver strategy is used\r\n _once: !!ResizeObserverConstructor,\r\n })\r\n );\r\n }\r\n\r\n prependChildren(target, sizeObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(sizeObserver);\r\n };\r\n};\r\n","import {\r\n WH,\r\n Cache,\r\n createDOM,\r\n offsetSize,\r\n runEach,\r\n prependChildren,\r\n removeElements,\r\n createCache,\r\n push,\r\n IntersectionObserverConstructor,\r\n} from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\nimport { classNameTrinsicObserver } from 'classnames';\r\n\r\nexport const createTrinsicObserver = (\r\n target: HTMLElement,\r\n onTrinsicChangedCallback: (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => any\r\n): (() => void) => {\r\n const trinsicObserver = createDOM(``)[0] as HTMLElement;\r\n const offListeners: (() => void)[] = [];\r\n const updateHeightIntrinsicCache = createCache>(\r\n (ioEntryOrSize: IntersectionObserverEntry | WH) =>\r\n (ioEntryOrSize! as WH).h === 0 ||\r\n (ioEntryOrSize! as IntersectionObserverEntry).isIntersecting ||\r\n (ioEntryOrSize! as IntersectionObserverEntry).intersectionRatio > 0,\r\n {\r\n _initialValue: false,\r\n }\r\n );\r\n\r\n if (IntersectionObserverConstructor) {\r\n const intersectionObserverInstance: IntersectionObserver = new IntersectionObserverConstructor(\r\n (entries: IntersectionObserverEntry[]) => {\r\n if (entries && entries.length > 0) {\r\n const last = entries.pop();\r\n if (last) {\r\n const heightIntrinsicCache = updateHeightIntrinsicCache(0, last);\r\n\r\n if (heightIntrinsicCache._changed) {\r\n onTrinsicChangedCallback(false, heightIntrinsicCache);\r\n }\r\n }\r\n }\r\n },\r\n { root: target }\r\n );\r\n intersectionObserverInstance.observe(trinsicObserver);\r\n push(offListeners, () => intersectionObserverInstance.disconnect());\r\n } else {\r\n push(\r\n offListeners,\r\n createSizeObserver(trinsicObserver, () => {\r\n const newSize = offsetSize(trinsicObserver);\r\n const heightIntrinsicCache = updateHeightIntrinsicCache(0, newSize);\r\n\r\n if (heightIntrinsicCache._changed) {\r\n onTrinsicChangedCallback(false, heightIntrinsicCache);\r\n }\r\n })\r\n );\r\n }\r\n\r\n prependChildren(target, trinsicObserver);\r\n\r\n return () => {\r\n runEach(offListeners);\r\n removeElements(trinsicObserver);\r\n };\r\n};\r\n","import {\r\n each,\r\n noop,\r\n debounce,\r\n indexOf,\r\n isString,\r\n MutationObserverConstructor,\r\n isEmptyArray,\r\n on,\r\n off,\r\n attr,\r\n is,\r\n find,\r\n push,\r\n isUndefined,\r\n isFunction,\r\n} from 'support';\r\n\r\ntype StringNullUndefined = string | null | undefined;\r\nexport type DOMObserverEventContentChange =\r\n | Array<[StringNullUndefined, ((elms: Node[]) => string) | StringNullUndefined] | null | undefined>\r\n | false\r\n | null\r\n | undefined;\r\nexport type DOMObserverIgnoreContentChange = (\r\n mutation: MutationRecord,\r\n isNestedTarget: boolean,\r\n domObserverTarget: HTMLElement,\r\n domObserverOptions: DOMObserverOptions | undefined\r\n) => boolean;\r\nexport type DOMObserverIgnoreTargetAttrChange = (\r\n target: Node,\r\n attributeName: string,\r\n oldAttributeValue: string | null,\r\n newAttributeValue: string | null\r\n) => boolean;\r\nexport interface DOMObserverOptions {\r\n _observeContent?: boolean; // do observe children and trigger content change\r\n _attributes?: string[]; // observed attributes\r\n _styleChangingAttributes?: string[]; // list of attributes that trigger a contentChange or a targetStyleChange if changed\r\n _eventContentChange?: DOMObserverEventContentChange; // [selector, eventname]\r\n _nestedTargetSelector?: string;\r\n _ignoreTargetAttrChange?: DOMObserverIgnoreTargetAttrChange;\r\n _ignoreContentChange?: DOMObserverIgnoreContentChange;\r\n}\r\nexport interface DOMObserver {\r\n _disconnect: () => void;\r\n _updateEventContentChange: (newEventContentChange?: DOMObserverEventContentChange) => void;\r\n _update: () => void;\r\n}\r\n\r\n// const styleChangingAttributes = ['id', 'class', 'style', 'open'];\r\n// const mutationObserverAttrsTextarea = ['wrap', 'cols', 'rows'];\r\n\r\nconst createEventContentChange = (\r\n target: Element,\r\n eventContentChange: DOMObserverEventContentChange,\r\n map: Map,\r\n callback: (...args: any) => any\r\n) => {\r\n let eventContentChangeRef: DOMObserverEventContentChange;\r\n const addEvent = (elm: Node, eventName: string) => {\r\n const entry = map.get(elm);\r\n const newEntry = isUndefined(entry);\r\n const registerEvent = () => {\r\n map.set(elm, eventName);\r\n on(elm, eventName, callback);\r\n };\r\n\r\n if (!newEntry && eventName !== entry) {\r\n off(elm, entry!, callback);\r\n registerEvent();\r\n } else if (newEntry) {\r\n registerEvent();\r\n }\r\n };\r\n const _destroy = () => {\r\n map.forEach((eventName: string, elm: Node) => {\r\n off(elm, eventName, callback);\r\n });\r\n map.clear();\r\n };\r\n const _updateElements = (getElements?: (selector: string) => Node[]) => {\r\n if (eventContentChangeRef) {\r\n const eventElmList = eventContentChangeRef.reduce>((arr, item) => {\r\n if (item) {\r\n const selector = item[0];\r\n const eventName = item[1];\r\n const elements = eventName && selector && (getElements ? getElements(selector) : find(selector, target));\r\n\r\n if (elements) {\r\n push(arr, [elements, isFunction(eventName) ? eventName(elements) : eventName!], true);\r\n }\r\n }\r\n return arr;\r\n }, []);\r\n\r\n each(eventElmList, (item) => {\r\n const elements = item[0];\r\n const eventName = item[1];\r\n\r\n each(elements, (elm) => {\r\n addEvent(elm, eventName);\r\n });\r\n });\r\n }\r\n };\r\n const _update = (newEventContentChange: DOMObserverEventContentChange) => {\r\n eventContentChangeRef = newEventContentChange;\r\n _destroy();\r\n _updateElements();\r\n };\r\n\r\n if (eventContentChange) {\r\n _update(eventContentChange);\r\n }\r\n\r\n return {\r\n _destroy,\r\n _updateElements,\r\n _update,\r\n };\r\n};\r\n\r\nexport const createDOMObserver = (\r\n target: HTMLElement,\r\n callback: (targetChangedAttrs: string[], targetStyleChanged: boolean, contentChanged: boolean) => any,\r\n options?: DOMObserverOptions\r\n): DOMObserver => {\r\n let isConnected = false;\r\n const {\r\n _observeContent,\r\n _attributes,\r\n _styleChangingAttributes,\r\n _eventContentChange,\r\n _nestedTargetSelector,\r\n _ignoreTargetAttrChange: _ignoreTargetChange,\r\n _ignoreContentChange,\r\n } = options || {};\r\n const {\r\n _updateElements: updateEventContentChangeElements,\r\n _destroy: destroyEventContentChange,\r\n _update: updateEventContentChange,\r\n } = createEventContentChange(\r\n target,\r\n _observeContent && _eventContentChange,\r\n new Map(),\r\n debounce(() => {\r\n if (isConnected) {\r\n callback([], false, true);\r\n }\r\n }, 80)\r\n );\r\n\r\n // MutationObserver\r\n const finalAttributes = _attributes || [];\r\n const finalStyleChangingAttributes = _styleChangingAttributes || [];\r\n const observedAttributes = finalAttributes.concat(finalStyleChangingAttributes); // TODO: observer textarea attrs if textarea\r\n const observerCallback = (mutations: MutationRecord[]) => {\r\n const ignoreTargetChange = _ignoreTargetChange || noop;\r\n const ignoreContentChange = _ignoreContentChange || noop;\r\n const targetChangedAttrs: string[] = [];\r\n const totalAddedNodes: Node[] = [];\r\n let targetStyleChanged = false;\r\n let contentChanged = false;\r\n let childListChanged = false;\r\n each(mutations, (mutation) => {\r\n const { attributeName, target: mutationTarget, type, oldValue, addedNodes } = mutation;\r\n const isAttributesType = type === 'attributes';\r\n const isChildListType = type === 'childList';\r\n const targetIsMutationTarget = target === mutationTarget;\r\n const attributeValue = isAttributesType && isString(attributeName) ? attr(mutationTarget as HTMLElement, attributeName!) : 0;\r\n const attributeChanged = attributeValue !== 0 && oldValue !== attributeValue;\r\n const targetAttrChanged =\r\n attributeChanged &&\r\n targetIsMutationTarget &&\r\n !_observeContent &&\r\n !ignoreTargetChange(mutationTarget, attributeName!, oldValue, attributeValue as string | null);\r\n const styleChangingAttrChanged = indexOf(finalStyleChangingAttributes, attributeName) > -1 && attributeChanged;\r\n\r\n if (targetAttrChanged) {\r\n push(targetChangedAttrs, attributeName!);\r\n }\r\n if (_observeContent) {\r\n const notOnlyAttrChanged = !isAttributesType;\r\n const contentAttrChanged = isAttributesType && styleChangingAttrChanged && !targetIsMutationTarget;\r\n const isNestedTarget = contentAttrChanged && _nestedTargetSelector && is(mutationTarget, _nestedTargetSelector);\r\n const baseAssertion = isNestedTarget\r\n ? !ignoreTargetChange(mutationTarget, attributeName!, oldValue, attributeValue as string | null)\r\n : notOnlyAttrChanged || contentAttrChanged;\r\n const contentFinalChanged = baseAssertion && !ignoreContentChange(mutation, !!isNestedTarget, target, options);\r\n\r\n push(totalAddedNodes, addedNodes);\r\n\r\n contentChanged = contentChanged || contentFinalChanged;\r\n childListChanged = childListChanged || isChildListType;\r\n }\r\n targetStyleChanged = targetStyleChanged || (targetAttrChanged && styleChangingAttrChanged);\r\n });\r\n\r\n if (childListChanged && !isEmptyArray(totalAddedNodes)) {\r\n updateEventContentChangeElements((selector) =>\r\n totalAddedNodes.reduce((arr, node) => {\r\n push(arr, find(selector, node));\r\n return is(node, selector) ? push(arr, node) : arr;\r\n }, [])\r\n );\r\n }\r\n if (!isEmptyArray(targetChangedAttrs) || targetStyleChanged || contentChanged) {\r\n callback(targetChangedAttrs, targetStyleChanged, contentChanged);\r\n }\r\n };\r\n const mutationObserver: MutationObserver = new MutationObserverConstructor!(observerCallback);\r\n\r\n // Connect\r\n mutationObserver.observe(target, {\r\n attributes: true,\r\n attributeOldValue: true,\r\n attributeFilter: observedAttributes,\r\n subtree: _observeContent,\r\n childList: _observeContent,\r\n characterData: _observeContent,\r\n });\r\n isConnected = true;\r\n\r\n return {\r\n _disconnect: () => {\r\n if (isConnected) {\r\n destroyEventContentChange();\r\n mutationObserver.disconnect();\r\n isConnected = false;\r\n }\r\n },\r\n _updateEventContentChange: (newEventContentChange?: DOMObserverEventContentChange) => {\r\n updateEventContentChange(isConnected && _observeContent && newEventContentChange);\r\n },\r\n _update: () => {\r\n if (isConnected) {\r\n observerCallback(mutationObserver.takeRecords());\r\n }\r\n },\r\n };\r\n};\r\n","import {\r\n isHTMLElement,\r\n appendChildren,\r\n is,\r\n createDiv,\r\n contents,\r\n insertAfter,\r\n addClass,\r\n parent,\r\n isUndefined,\r\n removeElements,\r\n removeClass,\r\n push,\r\n runEach,\r\n} from 'support';\r\nimport { classNameHost, classNamePadding, classNameViewport, classNameContent } from 'classnames';\r\nimport { OSTarget, OSTargetObject, InternalVersionOf, OSTargetElement } from 'typings';\r\n\r\nexport interface OSTargetContext {\r\n _isTextarea: boolean;\r\n _isBody: boolean;\r\n _htmlElm: HTMLHtmlElement;\r\n _bodyElm: HTMLBodyElement;\r\n _windowElm: Window;\r\n _documentElm: HTMLDocument;\r\n}\r\n\r\nexport interface PreparedOSTargetObject extends Required> {\r\n _host: HTMLElement;\r\n}\r\n\r\nexport interface StructureSetup {\r\n _targetObj: PreparedOSTargetObject;\r\n _targetCtx: OSTargetContext;\r\n _destroy: () => void;\r\n}\r\n\r\nconst unwrap = (elm: HTMLElement | null | undefined) => {\r\n appendChildren(parent(elm), contents(elm));\r\n removeElements(elm);\r\n};\r\n\r\nexport const createStructureSetup = (target: OSTarget | OSTargetObject): StructureSetup => {\r\n const targetIsElm = isHTMLElement(target);\r\n const osTargetObj: InternalVersionOf = targetIsElm\r\n ? ({} as InternalVersionOf)\r\n : {\r\n _host: (target as OSTargetObject).host,\r\n _target: (target as OSTargetObject).target,\r\n _padding: (target as OSTargetObject).padding,\r\n _viewport: (target as OSTargetObject).viewport,\r\n _content: (target as OSTargetObject).content,\r\n };\r\n\r\n if (targetIsElm) {\r\n const padding = createDiv(classNamePadding);\r\n const viewport = createDiv(classNameViewport);\r\n const content = createDiv(classNameContent);\r\n\r\n appendChildren(padding, viewport);\r\n appendChildren(viewport, content);\r\n\r\n osTargetObj._target = target as OSTargetElement;\r\n osTargetObj._padding = padding;\r\n osTargetObj._viewport = viewport;\r\n osTargetObj._content = content;\r\n }\r\n\r\n let { _target, _padding, _viewport, _content } = osTargetObj;\r\n const destroyFns: (() => any)[] = [];\r\n const isTextarea = is(_target, 'textarea');\r\n const isBody = !isTextarea && is(_target, 'body');\r\n const _host = (isTextarea ? osTargetObj._host || createDiv() : _target) as HTMLElement;\r\n const getTargetContents = (contentSlot: HTMLElement) => (isTextarea ? (_target as HTMLTextAreaElement) : contents(contentSlot as HTMLElement));\r\n const isTextareaHostGenerated = isTextarea && _host !== osTargetObj._host;\r\n\r\n // only insert host for textarea after target if it was generated\r\n if (isTextareaHostGenerated) {\r\n insertAfter(_target, _host);\r\n\r\n push(destroyFns, () => {\r\n insertAfter(_host, _target);\r\n removeElements(_host);\r\n });\r\n }\r\n\r\n if (targetIsElm) {\r\n appendChildren(_content!, getTargetContents(_target));\r\n appendChildren(_host, _padding);\r\n\r\n push(destroyFns, () => {\r\n appendChildren(_host, contents(_content));\r\n removeElements(_padding);\r\n removeClass(_host, classNameHost);\r\n });\r\n } else {\r\n const contentContainingElm = _content || _viewport || _padding || _host;\r\n const createPadding = isUndefined(_padding);\r\n const createViewport = isUndefined(_viewport);\r\n const createContent = isUndefined(_content);\r\n const targetContents = getTargetContents(contentContainingElm);\r\n\r\n _padding = osTargetObj._padding = createPadding ? createDiv() : _padding;\r\n _viewport = osTargetObj._viewport = createViewport ? createDiv() : _viewport;\r\n _content = osTargetObj._content = createContent ? createDiv() : _content;\r\n\r\n appendChildren(_host, _padding);\r\n appendChildren(_padding || _host, _viewport);\r\n appendChildren(_viewport, _content);\r\n\r\n const contentSlot = _content || _viewport;\r\n appendChildren(contentSlot, targetContents);\r\n\r\n push(destroyFns, () => {\r\n if (createContent) {\r\n unwrap(_content);\r\n }\r\n if (createViewport) {\r\n unwrap(_viewport);\r\n }\r\n if (createPadding) {\r\n unwrap(_padding);\r\n }\r\n removeClass(_host, classNameHost);\r\n removeClass(_padding, classNamePadding);\r\n removeClass(_viewport, classNameViewport);\r\n removeClass(_content, classNameContent);\r\n });\r\n }\r\n\r\n addClass(_host, classNameHost);\r\n addClass(_padding, classNamePadding);\r\n addClass(_viewport, classNameViewport);\r\n addClass(_content, classNameContent);\r\n\r\n const ownerDocument: HTMLDocument = _target.ownerDocument;\r\n const bodyElm = ownerDocument.body as HTMLBodyElement;\r\n const wnd = ownerDocument.defaultView as Window;\r\n const ctx: OSTargetContext = {\r\n _windowElm: wnd,\r\n _documentElm: ownerDocument,\r\n _htmlElm: parent(bodyElm) as HTMLHtmlElement,\r\n _bodyElm: bodyElm,\r\n _isTextarea: isTextarea,\r\n _isBody: isBody,\r\n };\r\n // @ts-ignore\r\n const obj: PreparedOSTargetObject = {\r\n ...osTargetObj,\r\n _host,\r\n };\r\n\r\n return {\r\n _targetObj: obj,\r\n _targetCtx: ctx,\r\n _destroy: () => {\r\n runEach(destroyFns);\r\n },\r\n };\r\n};\r\n","import { OSTarget, OSTargetObject } from 'typings';\r\nimport { createStructureLifecycle } from 'lifecycles/structureLifecycle';\r\nimport { Cache, each, push } from 'support';\r\nimport { createSizeObserver } from 'observers/sizeObserver';\r\nimport { createTrinsicObserver } from 'observers/trinsicObserver';\r\nimport { createDOMObserver } from 'observers/domObserver';\r\nimport { createStructureSetup, StructureSetup } from 'setups/structureSetup';\r\nimport { Lifecycle } from 'lifecycles/lifecycleBase';\r\n\r\nconst OverlayScrollbars = (target: OSTarget | OSTargetObject, options?: any, extensions?: any): void => {\r\n const structureSetup: StructureSetup = createStructureSetup(target);\r\n const lifecycles: Lifecycle[] = [];\r\n const { _host, _viewport, _content } = structureSetup._targetObj;\r\n\r\n push(lifecycles, createStructureLifecycle(structureSetup._targetObj));\r\n\r\n // eslint-disable-next-line\r\n const onSizeChanged = (directionCache?: Cache) => {\r\n if (directionCache) {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onDirectionChanged && lifecycle._onDirectionChanged(directionCache);\r\n });\r\n } else {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onSizeChanged && lifecycle._onSizeChanged();\r\n });\r\n }\r\n };\r\n const onTrinsicChanged = (widthIntrinsic: boolean, heightIntrinsicCache: Cache) => {\r\n each(lifecycles, (lifecycle) => {\r\n lifecycle._onTrinsicChanged && lifecycle._onTrinsicChanged(widthIntrinsic, heightIntrinsicCache);\r\n });\r\n };\r\n\r\n createSizeObserver(_host, onSizeChanged, { _appear: true, _direction: true });\r\n createTrinsicObserver(_host, onTrinsicChanged);\r\n createDOMObserver(_host, () => {\r\n return null;\r\n });\r\n createDOMObserver(\r\n _content || _viewport,\r\n () => {\r\n return null;\r\n },\r\n { _observeContent: true }\r\n );\r\n};\r\n\r\nexport { OverlayScrollbars };\r\n","import { createDOM } from 'support/dom';\r\nimport { getEnvironment } from 'environment';\r\nimport { OverlayScrollbars } from 'overlayscrollbars/overlayscrollbars';\r\n\r\nconst abc = {\r\n a: 1,\r\n b: 1,\r\n c: 1,\r\n};\r\n\r\nexport default () => {\r\n return [\r\n getEnvironment(),\r\n OverlayScrollbars(document.body),\r\n createDOM(\r\n '\\\r\n \\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n fdfhdfgh\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
\\\r\n
'\r\n ),\r\n ];\r\n};\r\n"],"names":["ElementNodeType","Node","ELEMENT_NODE","toString","hasOwnProperty","Object","prototype","isUndefined","obj","undefined","isNull","type","call","replace","toLowerCase","isNumber","isString","isBoolean","isFunction","isArray","Array","isObject","isArrayLike","length","lengthCorrectFormat","isPlainObject","key","cstr","ctor","ctorProto","hasOwnConstructor","hasIsPrototypeOf","isHTMLElement","instanceofObj","window","HTMLElement","nodeType","isElement","Element","getSetProp","topLeft","fallback","elm","value","attr","attrName","getAttribute","setAttribute","removeAttr","removeAttribute","scrollLeft","scrollTop","each","source","callback","i","keys","indexOf","arr","item","fromIndex","push","array","items","arrayIsSingleItem","apply","from","result","isEmptyArray","runEach","p1","runFn","fn","Set","forEach","prop","assignDeep","target","object1","object2","object3","object4","object5","object6","sources","copy","copyIsArray","src","clone","isEmptyObject","name","rnothtmlwhite","classListAction","className","action","clazz","classes","match","classList","addClass","add","removeClass","remove","elmPrototype","find","selector","rootElm","document","querySelectorAll","is","matches","msMatchesSelector","contents","childNodes","parent","parentElement","before","parentElm","preferredAnchor","insertedElms","anchor","fragment","createDocumentFragment","insertedElm","previousSibling","appendChild","firstChild","nextSibling","insertBefore","appendChildren","node","children","prependChildren","insertAfter","insertedNodes","removeElements","nodes","e","removeChild","createDiv","classNames","div","createElement","createDOM","html","createdDiv","innerHTML","trim","zeroObj","w","h","windowSize","innerWidth","innerHeight","offsetSize","offsetWidth","offsetHeight","clientSize","clientWidth","clientHeight","scrollSize","scrollWidth","scrollHeight","getBoundingClientRect","passiveEventsSupport","supportPassiveEvents","addEventListener","defineProperty","get","splitEventNames","eventNames","split","off","listener","capture","eventName","removeEventListener","on","options","doSupportPassiveEvents","passive","_passive","_capture","once","_once","offListeners","nativeOptions","finalListener","evt","bind","stopPropagation","preventDefault","equal","a","b","props","equalWH","equalXY","equalTRBL","firstLetterToUpper","str","charAt","toUpperCase","slice","getDummyStyle","style","cssPrefixes","jsPrefixes","jsCache","cssCache","cssProperty","uppercasedName","elmStyle","prefix","prefixWithoutDashes","resultPossibilities","resultPossibility","jsAPI","MutationObserverConstructor","IntersectionObserverConstructor","ResizeObserverConstructor","cAF","rAF","noop","debounce","functionToDebounce","timeout","maxWait","timeoutId","lastCallTime","hasTimeout","hasMaxWait","cancel","clearTimeout","set","setTimeout","setFn","args","performance","now","boundSetFn","arguments","forceCall","cssNumber","animationiterationcount","columncount","fillopacity","flexgrow","flexshrink","fontweight","lineheight","opacity","order","orphans","widows","zindex","zoom","parseToZeroOrNumber","toFloat","num","parseFloat","parseInt","Number","isNaN","adaptCSSVal","val","getCSSVal","computedStyle","getPropertyValue","setCSSVal","styles","getSingleStyle","getStyles","getStylesResult","getComputedStyle","reduce","topRightBottomLeft","property","finalProp","top","right","bottom","left","t","r","l","x","y","absoluteCoordinates","rect","pageYOffset","pageXOffset","createCache","update","_equal","_initialValue","_alwaysUpdateValues","_value","_previous","cacheUpdate","force","context","curr","newVal","changed","_changed","_extends","module","assign","stringify","JSON","templateTypePrefixSuffix","optionsTemplateTypes","validateRecursive","template","optionsDiff","doWriteErrors","propPath","validatedOptions","optionsCopy","filter","optionsDiffValue","optionsValue","templateValue","templateIsComplex","propPrefix","validatedResult","_validated","_foreign","isValid","errorEnumStrings","errorPossibleTypes","optionsValueType","templateValueArr","currTemplateType","typeString","isEnumString","enumStringSplit","possibility","string","doStringifyComparison","console","warn","join","validateOptions","transformOptions","optionsWithOptionsTemplate","_template","_options","tmpResult","classNameEnvironment","classNameEnvironmentFlexboxGlue","classNameEnvironmentFlexboxGlueMax","classNameHost","classNamePadding","classNameViewport","classNameContent","classNameViewportScrollbarStyling","classNameSizeObserver","classNameSizeObserverAppear","classNameSizeObserverListener","classNameSizeObserverListenerScroll","classNameSizeObserverListenerItem","classNameSizeObserverListenerItemFinal","classNameTrinsicObserver","environmentInstance","abs","round","Math","getNativeScrollbarSize","body","measureElm","cSize","oSize","getNativeScrollbarStyling","testElm","ex","getRtlScrollBehavior","childElm","strHidden","overflowX","overflowY","direction","parentOffset","childOffset","childOffsetAfterScroll","n","getFlexboxGlue","minOffsetsizeParent","minOffsetsize","supportsMin","maxOffsetsizeParent","maxOffsetsize","supportsMax","getWindowDPR","dDPI","screen","deviceXDPI","sDPI","logicalXDPI","devicePixelRatio","diffBiggerThanOne","valOne","valTwo","absValOne","absValTwo","createEnvironment","envDOM","envElm","envChildElm","onChangedListener","nativeScrollBarSize","nativeScrollbarIsOverlaid","env","_autoUpdateLoop","_nativeScrollbarSize","_nativeScrollbarIsOverlaid","_nativeScrollbarStyling","_rtlScrollBehavior","_flexboxGlue","_addListener","_removeListener","delete","size","dpr","scrollbarSize","sizeNew","deltaSize","deltaAbsSize","deltaAbsRatio","dprNew","deltaIsBigger","difference","dprChanged","isZoom","newScrollbarSize","getEnvironment","getPropByPath","path","o","createLifecycleBase","defaultOptionsWithTemplate","initialOptions","updateFunction","optionsTemplate","defaultOptions","hints","_force","_changedOptions","checkOption","newOptions","_update","overflowBehaviorAllowedValues","paddingAbsolute","oTypes","boolean","overflowBehavior","cssMarginEnd","cssBorderEnd","createStructureLifecycle","_host","_padding","_viewport","_content","destructFns","scrollbarsOverlaid","supportsScrollbarStyling","supportFlexboxGlue","directionObserverObsolete","updatePaddingCache","updateOverflowAmountCache","ctx","max","_contentScrollSize","_viewportSize","paddingAbsoluteChanged","padding","paddingChanged","paddingStyle","viewportOffsetSize","contentClientSize","contentScrollSize","overflowAmuntCache","overflowAmount","overflowAmountChanged","log","onSizeChanged","onTrinsicChanged","widthIntrinsic","heightIntrinsicCache","height","_onSizeChanged","_onTrinsicChanged","_destruct","animationStartEventName","scrollEventName","scrollAmount","directionIsRTLMap","directionIsRTL","isRTL","domRectHasDimensions","width","createSizeObserver","onSizeChangedCallback","_direction","observeDirectionChange","_appear","observeAppearChange","rtlScrollBehavior","baseElements","sizeObserver","listenerElement","updateResizeObserverContentRectCache","currVal","onSizeChangedCallbackProxy","sizeChangedContext","hasDirectionCache","skip","pop","contentRect","doDirectionScroll","rtl","appearCallback","resizeObserverInstance","observe","disconnect","observerElementChildren","observerElementChildrenRoot","shrinkElement","lastChild","expandElement","expandElementChild","cacheSize","currSize","isDirty","rAFId","reset","onResized","onScroll","scrollEvent","updateDirectionIsRTLCache","event","directionIsRTLCache","createTrinsicObserver","onTrinsicChangedCallback","trinsicObserver","updateHeightIntrinsicCache","ioEntryOrSize","isIntersecting","intersectionRatio","intersectionObserverInstance","entries","last","root","newSize","createEventContentChange","eventContentChange","map","eventContentChangeRef","addEvent","entry","newEntry","registerEvent","_destroy","clear","_updateElements","getElements","eventElmList","elements","newEventContentChange","createDOMObserver","isConnected","_observeContent","_attributes","_styleChangingAttributes","_eventContentChange","_nestedTargetSelector","_ignoreTargetAttrChange","_ignoreTargetChange","_ignoreContentChange","updateEventContentChangeElements","destroyEventContentChange","updateEventContentChange","Map","finalAttributes","finalStyleChangingAttributes","observedAttributes","concat","observerCallback","mutations","ignoreTargetChange","ignoreContentChange","targetChangedAttrs","totalAddedNodes","targetStyleChanged","contentChanged","childListChanged","mutation","attributeName","mutationTarget","oldValue","addedNodes","isAttributesType","isChildListType","targetIsMutationTarget","attributeValue","attributeChanged","targetAttrChanged","styleChangingAttrChanged","notOnlyAttrChanged","contentAttrChanged","isNestedTarget","baseAssertion","contentFinalChanged","mutationObserver","attributes","attributeOldValue","attributeFilter","subtree","childList","characterData","_disconnect","_updateEventContentChange","takeRecords","unwrap","createStructureSetup","targetIsElm","osTargetObj","host","_target","viewport","content","destroyFns","isTextarea","isBody","getTargetContents","contentSlot","isTextareaHostGenerated","contentContainingElm","createPadding","createViewport","createContent","targetContents","ownerDocument","bodyElm","wnd","defaultView","_windowElm","_documentElm","_htmlElm","_bodyElm","_isTextarea","_isBody","_targetObj","_targetCtx","OverlayScrollbars","extensions","structureSetup","lifecycles","directionCache","lifecycle","_onDirectionChanged"],"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/utils/array.ts","../src/support/utils/object.ts","../src/support/dom/class.ts","../src/support/dom/traversal.ts","../src/support/dom/manipulation.ts","../src/support/dom/create.ts","../src/support/dom/dimensions.ts","../src/support/dom/events.ts","../src/support/utils/equal.ts","../src/support/compatibility/vendors.ts","../src/support/compatibility/apis.ts","../src/support/utils/function.ts","../src/support/dom/style.ts","../src/support/dom/offset.ts","../src/support/cache/cache.ts","../../../node_modules/@babel/runtime/helpers/extends.js","../src/support/options/validation.ts","../src/support/options/transformation.ts","../src/classnames.ts","../src/environment/environment.ts","../src/setups/structureSetup.ts","../src/lifecycles/lifecycleUpdateFunction.ts","../src/lifecycles/overflowLifecycle.ts","../src/observers/sizeObserver.ts","../src/observers/trinsicObserver.ts","../src/observers/domObserver.ts","../src/lifecycles/lifecycleHub.ts","../src/options/options.ts","../src/overlayscrollbars/overlayscrollbars.ts","../src/index.ts"],"sourcesContent":["import { PlainObject } from 'typings';\r\n\r\nconst ElementNodeType = Node.ELEMENT_NODE;\r\nconst { toString, hasOwnProperty } = Object.prototype;\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 const type: (obj: any) => string = (obj) => {\r\n return isUndefined(obj) || isNull(obj)\r\n ? `${obj}`\r\n : 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 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 const lengthCorrectFormat = isNumber(length) && length > -1 && length % 1 == 0; // eslint-disable-line eqeqeq\r\n\r\n return isArray(obj) || (!isFunction(obj) && lengthCorrectFormat) ? (length > 0 && isObject(obj) ? length - 1 in obj : true) : false;\r\n}\r\n\r\n/**\r\n * Returns true if the given object is a \"plain\" (e.g. { key: value }) object, false otherwise.\r\n * @param obj The Object.\r\n */\r\nexport 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 cstr = 'constructor';\r\n const ctor = obj[cstr];\r\n const ctorProto = ctor && ctor.prototype;\r\n const hasOwnConstructor = hasOwnProperty.call(obj, cstr);\r\n const hasIsPrototypeOf = ctorProto && hasOwnProperty.call(ctorProto, 'isPrototypeOf');\r\n\r\n if (ctor && !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 instanceofObj = window.HTMLElement;\r\n return obj ? (instanceofObj ? obj instanceof instanceofObj : obj.nodeType === ElementNodeType) : false;\r\n}\r\n\r\n/**\r\n * Checks whether the given object is a Element.\r\n * @param obj The object which shall be checked.\r\n */\r\nexport function isElement(obj: any): obj is Element {\r\n const instanceofObj = window.Element;\r\n return obj ? (instanceofObj ? obj instanceof instanceofObj : obj.nodeType === ElementNodeType) : false;\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 && 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 { isArrayLike, isString } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\ntype RunEachItem = ((...args: any) => any | any[]) | null | undefined;\r\n\r\n/**\r\n * Iterates through a array or object\r\n * @param arrayLikeOrObject The array or object through which shall be iterated.\r\n * @param callback The function which is responsible for the iteration.\r\n * If the function returns true its treated like a \"continue\" statement.\r\n * If the function returns false its treated like a \"break\" statement.\r\n */\r\nexport function each(\r\n array: Array | ReadonlyArray,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray;\r\nexport function each(\r\n array: Array | ReadonlyArray | null | undefined,\r\n callback: (value: T, indexOrKey: number, source: Array) => boolean | void\r\n): Array | ReadonlyArray | null | undefined;\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 | undefined,\r\n callback: (value: T, indexOrKey: number, source: ArrayLike) => boolean | void\r\n): ArrayLike | null | undefined;\r\nexport function each(obj: PlainObject, callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void): PlainObject;\r\nexport function each(\r\n obj: PlainObject | null | undefined,\r\n callback: (value: any, indexOrKey: string, source: PlainObject) => boolean | void\r\n): PlainObject | null | undefined;\r\nexport function each(\r\n source: ArrayLike | PlainObject | null | undefined,\r\n callback: (value: T, indexOrKey: any, source: any) => boolean | void\r\n): Array | ReadonlyArray | ArrayLike | PlainObject | null | undefined {\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 * Pushesh all given items into the given array and returns it.\r\n * @param array The array the items shall be pushed into.\r\n * @param items The items which shall be pushed into the array.\r\n */\r\nexport const push = (array: Array, items: T | ArrayLike, arrayIsSingleItem?: boolean): Array => {\r\n !arrayIsSingleItem && !isString(items) && isArrayLike(items) ? Array.prototype.push.apply(array, items as Array) : array.push(items as T);\r\n return array;\r\n};\r\n\r\n/**\r\n * Creates a shallow-copied Array instance from an array-like or iterable object.\r\n * @param arr The object from which the array instance shall be created.\r\n */\r\nexport const from = (arr: ArrayLike) => {\r\n if (Array.from) {\r\n return Array.from(arr);\r\n }\r\n const result: Array = [];\r\n\r\n each(arr, (elm) => {\r\n push(result, elm);\r\n });\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * Check whether the passed array is empty.\r\n * @param array The array which shall be checked.\r\n */\r\nexport const isEmptyArray = (array: Array | null | undefined) => array && array.length === 0;\r\n\r\n/**\r\n * Calls all functions in the passed array/set of functions.\r\n * @param arr The array filled with function which shall be called.\r\n * @param p1 The first param.\r\n */\r\nexport const runEach = (arr: ArrayLike | Set, p1?: unknown): void => {\r\n const runFn = (fn: RunEachItem) => fn && fn(p1);\r\n if (arr instanceof Set) {\r\n arr.forEach(runFn);\r\n } else {\r\n each(arr, runFn);\r\n }\r\n};\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\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 { isString } from 'support/utils/types';\r\nimport { each } from 'support/utils/array';\r\nimport { keys } from 'support/utils/object';\r\n\r\nconst rnothtmlwhite = /[^\\x20\\t\\r\\n\\f]+/g;\r\nconst classListAction = (\r\n elm: Element | null | undefined,\r\n className: string,\r\n action: (elmClassList: DOMTokenList, clazz: string) => boolean | void\r\n): 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) && 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 | undefined, 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 | undefined, 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 | undefined, className: string): void => {\r\n classListAction(elm, className, (classList, clazz) => classList.remove(clazz));\r\n};\r\n\r\n/**\r\n * Takes two className strings, compares them and returns the difference as array.\r\n * @param classNameA ClassName A.\r\n * @param classNameB ClassName B.\r\n */\r\nexport const diffClass = (classNameA: string | null | undefined, classNameB: string | null | undefined) => {\r\n const classNameASplit = classNameA && classNameA.split(' ');\r\n const classNameBSplit = classNameB && classNameB.split(' ');\r\n const tempObj = {};\r\n\r\n each(classNameASplit, (className) => {\r\n tempObj[className] = 1;\r\n });\r\n each(classNameBSplit, (className) => {\r\n if (tempObj[className]) {\r\n delete tempObj[className];\r\n } else {\r\n tempObj[className] = 1;\r\n }\r\n });\r\n\r\n return keys(tempObj);\r\n};\r\n","import { isElement } from 'support/utils/types';\r\nimport { push, from } from 'support/utils/array';\r\n\r\ntype InputElementType = Element | Node | null | undefined;\r\ntype OutputElementType = Element | null;\r\n\r\nconst elmPrototype = Element.prototype;\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\nconst find = (selector: string, elm?: InputElementType): Element[] => {\r\n const arr: Array = [];\r\n const rootElm = elm ? (isElement(elm) ? elm : null) : document;\r\n\r\n return rootElm ? push(arr, rootElm.querySelectorAll(selector)) : 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\nconst findFirst = (selector: string, elm?: InputElementType): OutputElementType => {\r\n const rootElm = elm ? (isElement(elm) ? elm : null) : document;\r\n\r\n return rootElm ? rootElm.querySelector(selector) : null;\r\n};\r\n\r\n/**\r\n * Determines whether the passed element is matching with the passed selector.\r\n * @param elm The element which has to be compared with the passed selector.\r\n * @param selector The selector which has to be compared with the passed element. Additional selectors: ':visible' and ':hidden'.\r\n */\r\nconst is = (elm: InputElementType, selector: string): boolean => {\r\n if (isElement(elm)) {\r\n /* istanbul ignore next */\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const fn: (...args: any) => boolean = elmPrototype.matches || elmPrototype.msMatchesSelector;\r\n return fn.call(elm, selector);\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\nconst children = (elm: InputElementType, selector?: string): ReadonlyArray => {\r\n const childs: Array = [];\r\n\r\n return isElement(elm)\r\n ? push(\r\n childs,\r\n from(elm.children).filter((child) => (selector ? is(child, selector) : child))\r\n )\r\n : childs;\r\n};\r\n\r\n/**\r\n * Returns the childNodes (incl. text-nodes or comments etc.) of the passed element. An empty array is returned if the passed element is null.\r\n * @param elm The element of which the childNodes shall be returned.\r\n */\r\nconst contents = (elm: InputElementType): 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\nconst parent = (elm: InputElementType): OutputElementType => (elm ? elm.parentElement : null);\r\n\r\nconst closest = (elm: InputElementType, selector: string): OutputElementType => {\r\n if (isElement(elm)) {\r\n const closestFn = elmPrototype.closest;\r\n if (closestFn) {\r\n return closestFn.call(elm, selector);\r\n }\r\n\r\n do {\r\n if (is(elm, selector)) {\r\n return elm as Element;\r\n }\r\n elm = parent(elm);\r\n } while (elm);\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * Determines whether the given element lies between two selectors in the DOM.\r\n * @param elm The element.\r\n * @param highBoundarySelector The high boundary selector.\r\n * @param deepBoundarySelector The deep boundary selector.\r\n */\r\nconst liesBetween = (elm: InputElementType, highBoundarySelector: string, deepBoundarySelector: string): boolean => {\r\n const closestHighBoundaryElm = elm && closest(elm, highBoundarySelector);\r\n const closestDeepBoundaryElm = elm && findFirst(deepBoundarySelector, closestHighBoundaryElm);\r\n\r\n return closestHighBoundaryElm && closestDeepBoundaryElm\r\n ? closestHighBoundaryElm === elm ||\r\n closestDeepBoundaryElm === elm ||\r\n closest(closest(elm, deepBoundarySelector), highBoundarySelector) !== closestHighBoundaryElm\r\n : false;\r\n};\r\n\r\nexport { find, findFirst, is, children, contents, parent, liesBetween };\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 | null | undefined;\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 | undefined, preferredAnchor: Node | null | undefined, insertedElms: NodeCollection): void => {\r\n if (insertedElms) {\r\n let anchor: Node | null | undefined = preferredAnchor;\r\n let fragment: DocumentFragment | Node | null | undefined;\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 || null);\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 | undefined, 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 | undefined, 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 | undefined, 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 | undefined, insertedNodes: NodeCollection): void => {\r\n before(parent(node), node && node.nextSibling, insertedNodes);\r\n};\r\n\r\n/**\r\n * Removes the given Nodes from their parent.\r\n * @param nodes The Nodes which shall be removed.\r\n */\r\nexport const removeElements = (nodes: NodeCollection): void => {\r\n if (isArrayLike(nodes)) {\r\n each(from(nodes), (e) => removeElements(e));\r\n } else if (nodes) {\r\n const parentElm = parent(nodes);\r\n if (parentElm) {\r\n parentElm.removeChild(nodes);\r\n }\r\n }\r\n};\r\n","import { each } from 'support/utils/array';\r\nimport { attr } from 'support/dom/attribute';\r\nimport { contents } from 'support/dom/traversal';\r\nimport { removeElements } from 'support/dom/manipulation';\r\n\r\n/**\r\n * Creates a div DOM node.\r\n */\r\nexport const createDiv = (classNames?: string): HTMLDivElement => {\r\n const div = document.createElement('div');\r\n if (classNames) {\r\n attr(div, 'class', classNames);\r\n }\r\n return div;\r\n};\r\n\r\n/**\r\n * Creates DOM nodes modeled after the passed html string and returns the root dom nodes as a array.\r\n * @param html The html string after which the DOM nodes shall be created.\r\n */\r\nexport const createDOM = (html: string): ReadonlyArray => {\r\n const createdDiv = createDiv();\r\n createdDiv.innerHTML = html.trim();\r\n\r\n return each(contents(createdDiv), (elm) => removeElements(elm));\r\n};\r\n","export interface WH {\r\n w: T;\r\n h: T;\r\n}\r\n\r\nconst elementHasDimensions = (elm: HTMLElement): boolean => !!(elm.offsetWidth || elm.offsetHeight || elm.getClientRects().length);\r\nconst zeroObj: WH = {\r\n w: 0,\r\n h: 0,\r\n};\r\n\r\n/**\r\n * Returns the window inner- width and height.\r\n */\r\nexport const windowSize = (): WH => ({\r\n w: window.innerWidth,\r\n h: window.innerHeight,\r\n});\r\n\r\n/**\r\n * Returns the scroll- width and height of the passed element. If the element is null the width and height values are 0.\r\n * @param elm The element of which the scroll- width and height shall be returned.\r\n */\r\nexport const offsetSize = (elm: HTMLElement | null | undefined): 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 | undefined): 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 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 scrollSize = (elm: HTMLElement | null | undefined): WH =>\r\n elm\r\n ? {\r\n w: elm.scrollWidth,\r\n h: elm.scrollHeight,\r\n }\r\n : zeroObj;\r\n\r\n/**\r\n * Returns the BoundingClientRect of the passed element.\r\n * @param elm The element of which the BoundingClientRect shall be returned.\r\n */\r\nexport const getBoundingClientRect = (elm: HTMLElement): DOMRect => elm.getBoundingClientRect();\r\n\r\n/**\r\n * Determines whether the passed element has any dimensions.\r\n * @param elm The element.\r\n */\r\nexport const hasDimensions = (elm: HTMLElement | null | undefined): boolean => (elm ? elementHasDimensions(elm as HTMLElement) : false);\r\n","import { isUndefined } from 'support/utils/types';\r\nimport { each, push, runEach } from 'support/utils/array';\r\n\r\nlet passiveEventsSupport: boolean;\r\nconst supportPassiveEvents = (): boolean => {\r\n if (isUndefined(passiveEventsSupport)) {\r\n passiveEventsSupport = false;\r\n try {\r\n /* eslint-disable */\r\n // @ts-ignore\r\n window.addEventListener(\r\n 'test',\r\n null,\r\n Object.defineProperty({}, 'passive', {\r\n get: function () {\r\n passiveEventsSupport = true;\r\n },\r\n })\r\n );\r\n /* eslint-enable */\r\n } catch (e) {}\r\n }\r\n return passiveEventsSupport;\r\n};\r\nconst splitEventNames = (eventNames: string) => eventNames.split(' ');\r\n\r\nexport interface OnOptions {\r\n _capture?: boolean;\r\n _passive?: boolean;\r\n _once?: boolean;\r\n}\r\n\r\n/**\r\n * Removes the passed event listener for the passed events with the passed options.\r\n * @param target The element from which the listener shall be removed.\r\n * @param eventNames The eventsnames for which the listener shall be removed.\r\n * @param listener The listener which shall be removed.\r\n * @param capture The options of the removed listener.\r\n */\r\nexport const off = (target: EventTarget, eventNames: string, listener: (event: T) => any, capture?: boolean): void => {\r\n each(splitEventNames(eventNames), (eventName) => {\r\n target.removeEventListener(eventName, listener as EventListener, capture);\r\n });\r\n};\r\n\r\n/**\r\n * Adds the passed event listener for the passed eventnames with the passed options.\r\n * @param target The element to which the listener shall be added.\r\n * @param eventNames The eventsnames for which the listener shall be called.\r\n * @param listener The listener which is called on the eventnames.\r\n * @param options The options of the added listener.\r\n */\r\nexport const on = (\r\n target: EventTarget,\r\n eventNames: string,\r\n listener: (event: T) => any,\r\n options?: OnOptions\r\n): (() => void) => {\r\n const doSupportPassiveEvents = supportPassiveEvents();\r\n const passive = (doSupportPassiveEvents && options && options._passive) || false;\r\n const capture = (options && options._capture) || false;\r\n const once = (options && options._once) || false;\r\n const offListeners: (() => void)[] = [];\r\n const nativeOptions: AddEventListenerOptions | boolean = doSupportPassiveEvents\r\n ? {\r\n passive,\r\n capture,\r\n }\r\n : capture;\r\n\r\n each(splitEventNames(eventNames), (eventName) => {\r\n const finalListener = (once\r\n ? (evt: T) => {\r\n target.removeEventListener(eventName, finalListener, capture);\r\n listener && listener(evt);\r\n }\r\n : listener) as EventListener;\r\n\r\n push(offListeners, off.bind(null, target, eventName, finalListener, capture));\r\n target.addEventListener(eventName, finalListener, nativeOptions);\r\n });\r\n\r\n return runEach.bind(0, offListeners);\r\n};\r\n\r\n/**\r\n * Shorthand for the stopPropagation event Method.\r\n * @param evt The event of which the stopPropagation method shall be called.\r\n */\r\nexport const stopPropagation = (evt: Event) => evt.stopPropagation();\r\n\r\n/**\r\n * Shorthand for the preventDefault event Method.\r\n * @param evt The event of which the preventDefault method shall be called.\r\n */\r\nexport const preventDefault = (evt: Event) => evt.preventDefault();\r\n","import { each } from 'support/utils/array';\r\nimport { WH, XY, TRBL } from 'support/dom';\r\nimport { PlainObject } from 'typings';\r\n\r\n/**\r\n * Compares two objects and returns true if all values of the passed prop names are identical, false otherwise or if one of the two object is falsy.\r\n * @param a Object a.\r\n * @param b Object b.\r\n * @param props The props which shall be compared.\r\n */\r\nexport const equal = (a: T | undefined, b: T | undefined, props: Array): boolean => {\r\n if (a && b) {\r\n let result = true;\r\n each(props, (prop) => {\r\n if (a[prop] !== b[prop]) {\r\n result = false;\r\n }\r\n });\r\n return result;\r\n }\r\n return false;\r\n};\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalWH = (a?: WH, b?: WH) => equal(a, b, ['w', 'h']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalXY = (a?: XY, b?: XY) => equal(a, b, ['x', 'y']);\r\n\r\n/**\r\n * Compares object a with object b and returns true if both have the same property values, false otherwise.\r\n * Also returns false if one of the objects is undefined or null.\r\n * @param a Object a.\r\n * @param b Object b.\r\n */\r\nexport const equalTRBL = (a?: TRBL, b?: TRBL) => equal(a, b, ['t', 'r', 'b', 'l']);\r\n","import { each } from 'support/utils/array';\r\nimport { hasOwnProperty } from 'support/utils/object';\r\nimport { createDiv } from 'support/dom/create';\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 MutationObserverConstructor = jsAPI('MutationObserver');\r\nexport const IntersectionObserverConstructor = jsAPI('IntersectionObserver');\r\nexport const ResizeObserverConstructor: any | undefined = jsAPI('ResizeObserver');\r\nexport const cAF = jsAPI('cancelAnimationFrame');\r\nexport const rAF = jsAPI('requestAnimationFrame');\r\n","import { isNumber } from 'support/utils/types';\r\nimport { cAF, rAF } from 'support/compatibility/apis';\r\n\r\nexport const noop = () => {}; // eslint-disable-line\r\n\r\n/**\r\n * Debounces the given function either with a timeout or a animation frame.\r\n * @param functionToDebounce The function which shall be debounced.\r\n * @param timeout The timeout for debouncing. If 0 or lower animation frame is used for debouncing, a timeout otherwise.\r\n * @param maxWait A maximum amount of ms. before the function will be called even with debounce.\r\n */\r\nexport const debounce = (functionToDebounce: (...args: any) => any, timeout?: number, maxWait?: number) => {\r\n let timeoutId: number | void;\r\n let lastCallTime: number;\r\n const hasTimeout = isNumber(timeout) && timeout > 0;\r\n const hasMaxWait = isNumber(maxWait) && maxWait > 0;\r\n const cancel = hasTimeout ? window.clearTimeout : cAF!;\r\n const set = hasTimeout ? window.setTimeout : rAF!;\r\n const setFn = function (args: IArguments) {\r\n lastCallTime = hasMaxWait ? performance.now() : 0;\r\n timeoutId && cancel(timeoutId);\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n functionToDebounce.apply(this, args);\r\n };\r\n\r\n return function () {\r\n // eslint-disable-next-line\r\n // @ts-ignore\r\n const boundSetFn = setFn.bind(this, arguments); // eslint-disable-line\r\n const forceCall = hasMaxWait ? performance.now() - lastCallTime >= maxWait! : false;\r\n\r\n timeoutId && cancel(timeoutId);\r\n timeoutId = forceCall ? boundSetFn() : (set(boundSetFn, timeout!) as number);\r\n };\r\n};\r\n","import { each, keys } from 'support/utils';\r\nimport { isString, isNumber, isArray } from 'support/utils/types';\r\nimport { PlainObject } from 'typings';\r\n\r\nexport interface TRBL {\r\n t: number;\r\n r: number;\r\n b: number;\r\n l: number;\r\n}\r\n\r\ntype CssStyles = { [key: string]: string | number };\r\nconst cssNumber = {\r\n animationiterationcount: 1,\r\n columncount: 1,\r\n fillopacity: 1,\r\n flexgrow: 1,\r\n flexshrink: 1,\r\n fontweight: 1,\r\n lineheight: 1,\r\n opacity: 1,\r\n order: 1,\r\n orphans: 1,\r\n widows: 1,\r\n zindex: 1,\r\n zoom: 1,\r\n};\r\n\r\nconst parseToZeroOrNumber = (value: string, toFloat?: boolean): number => {\r\n /* istanbul ignore next */\r\n const num = toFloat ? parseFloat(value) : parseInt(value, 10);\r\n /* istanbul ignore next */\r\n return Number.isNaN(num) ? 0 : num;\r\n};\r\nconst adaptCSSVal = (prop: string, val: string | number): string | number => (!cssNumber[prop.toLowerCase()] && isNumber(val) ? `${val}px` : val);\r\nconst getCSSVal = (elm: HTMLElement, computedStyle: CSSStyleDeclaration, prop: string): string =>\r\n /* istanbul ignore next */\r\n computedStyle != null ? computedStyle.getPropertyValue(prop) : elm.style[prop];\r\nconst setCSSVal = (elm: HTMLElement | null | undefined, 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 | undefined, styles: CssStyles): void;\r\nexport function style(elm: HTMLElement | null | undefined, styles: string): string;\r\nexport function style(elm: HTMLElement | null | undefined, styles: Array | string): { [key: string]: string };\r\nexport function style(elm: HTMLElement | null | undefined, 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 | undefined): void => {\r\n style(elm, { display: 'block' });\r\n};\r\n\r\n/**\r\n * Returns a top\r\n * @param elm\r\n * @param property\r\n */\r\nexport const topRightBottomLeft = (elm: HTMLElement | null | undefined, property?: string): TRBL => {\r\n const finalProp = property || '';\r\n const top = `${finalProp}-top`;\r\n const right = `${finalProp}-right`;\r\n const bottom = `${finalProp}-bottom`;\r\n const left = `${finalProp}-left`;\r\n const result = style(elm, [top, right, bottom, left]);\r\n return {\r\n t: parseToZeroOrNumber(result[top]),\r\n r: parseToZeroOrNumber(result[right]),\r\n b: parseToZeroOrNumber(result[bottom]),\r\n l: parseToZeroOrNumber(result[left]),\r\n };\r\n};\r\n","import { getBoundingClientRect } from 'support/dom/dimensions';\r\n\r\nexport interface XY {\r\n x: T;\r\n y: T;\r\n}\r\n\r\nconst zeroObj: XY = {\r\n x: 0,\r\n y: 0,\r\n};\r\n\r\n/**\r\n * Returns the offset- left and top coordinates of the passed element relative to the document. If the element is null the top and left values are 0.\r\n * @param elm The element of which the offset- top and left coordinates shall be returned.\r\n */\r\nexport const absoluteCoordinates = (elm: HTMLElement | null | undefined): 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 | undefined): XY =>\r\n elm\r\n ? {\r\n x: elm.offsetLeft,\r\n y: elm.offsetTop,\r\n }\r\n : zeroObj;\r\n","export interface CacheValues {\r\n readonly _value?: T;\r\n readonly _previous?: T;\r\n _changed: boolean;\r\n}\r\n\r\nexport interface CacheOptions