mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-06-21 19:10:35 +03:00
improve code
This commit is contained in:
@@ -38,7 +38,7 @@ export interface SizeObserverCallbackParams {
|
|||||||
_appear?: boolean;
|
_appear?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type DestroySizeObserver = () => void;
|
export type SizeObserver = [destroy: () => void, append: () => void];
|
||||||
|
|
||||||
const scrollAmount = 3333333;
|
const scrollAmount = 3333333;
|
||||||
const getElmDirectionIsRTL = (elm: HTMLElement): boolean => style(elm, 'direction') === 'rtl';
|
const getElmDirectionIsRTL = (elm: HTMLElement): boolean => style(elm, 'direction') === 'rtl';
|
||||||
@@ -55,7 +55,7 @@ export const createSizeObserver = (
|
|||||||
target: HTMLElement,
|
target: HTMLElement,
|
||||||
onSizeChangedCallback: (params: SizeObserverCallbackParams) => any,
|
onSizeChangedCallback: (params: SizeObserverCallbackParams) => any,
|
||||||
options?: SizeObserverOptions
|
options?: SizeObserverOptions
|
||||||
): DestroySizeObserver => {
|
): SizeObserver => {
|
||||||
const { _direction: observeDirectionChange = false, _appear: observeAppearChange = false } =
|
const { _direction: observeDirectionChange = false, _appear: observeAppearChange = false } =
|
||||||
options || {};
|
options || {};
|
||||||
const sizeObserverPlugin = getPlugins()[sizeObserverPluginName] as
|
const sizeObserverPlugin = getPlugins()[sizeObserverPluginName] as
|
||||||
@@ -147,68 +147,71 @@ export const createSizeObserver = (
|
|||||||
: false;
|
: false;
|
||||||
let directionIsRTLCache: Cache<boolean> | undefined;
|
let directionIsRTLCache: Cache<boolean> | undefined;
|
||||||
|
|
||||||
if (ResizeObserverConstructor) {
|
return [
|
||||||
const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);
|
() => {
|
||||||
resizeObserverInstance.observe(listenerElement);
|
runEachAndClear(offListeners);
|
||||||
push(offListeners, () => {
|
removeElements(sizeObserver);
|
||||||
resizeObserverInstance.disconnect();
|
},
|
||||||
});
|
() => {
|
||||||
} else if (sizeObserverPlugin) {
|
if (ResizeObserverConstructor) {
|
||||||
const [pluginAppearCallback, pluginOffListeners] = sizeObserverPlugin._(
|
const resizeObserverInstance = new ResizeObserverConstructor(onSizeChangedCallbackProxy);
|
||||||
listenerElement,
|
resizeObserverInstance.observe(listenerElement);
|
||||||
onSizeChangedCallbackProxy,
|
push(offListeners, () => {
|
||||||
observeAppearChange
|
resizeObserverInstance.disconnect();
|
||||||
);
|
});
|
||||||
appearCallback = pluginAppearCallback;
|
} else if (sizeObserverPlugin) {
|
||||||
push(offListeners, pluginOffListeners);
|
const [pluginAppearCallback, pluginOffListeners] = sizeObserverPlugin._(
|
||||||
}
|
listenerElement,
|
||||||
|
onSizeChangedCallbackProxy,
|
||||||
|
observeAppearChange
|
||||||
|
);
|
||||||
|
appearCallback = pluginAppearCallback;
|
||||||
|
push(offListeners, pluginOffListeners);
|
||||||
|
}
|
||||||
|
|
||||||
if (observeDirectionChange) {
|
if (observeDirectionChange) {
|
||||||
directionIsRTLCache = createCache(
|
directionIsRTLCache = createCache(
|
||||||
{
|
{
|
||||||
_initialValue: !getIsDirectionRTL(), // invert current value to trigger initial change
|
_initialValue: !getIsDirectionRTL(), // invert current value to trigger initial change
|
||||||
},
|
},
|
||||||
getIsDirectionRTL
|
getIsDirectionRTL
|
||||||
);
|
);
|
||||||
const [updateDirectionIsRTLCache] = directionIsRTLCache;
|
const [updateDirectionIsRTLCache] = directionIsRTLCache;
|
||||||
|
|
||||||
push(
|
push(
|
||||||
offListeners,
|
offListeners,
|
||||||
on(sizeObserver, 'scroll', (event: Event) => {
|
on(sizeObserver, 'scroll', (event: Event) => {
|
||||||
const directionIsRTLCacheValues = updateDirectionIsRTLCache();
|
const directionIsRTLCacheValues = updateDirectionIsRTLCache();
|
||||||
const [directionIsRTL, directionIsRTLChanged] = directionIsRTLCacheValues;
|
const [directionIsRTL, directionIsRTLChanged] = directionIsRTLCacheValues;
|
||||||
|
|
||||||
if (directionIsRTLChanged) {
|
if (directionIsRTLChanged) {
|
||||||
removeClass(listenerElement, 'ltr rtl');
|
removeClass(listenerElement, 'ltr rtl');
|
||||||
if (directionIsRTL) {
|
if (directionIsRTL) {
|
||||||
addClass(listenerElement, 'rtl');
|
addClass(listenerElement, 'rtl');
|
||||||
} else {
|
} else {
|
||||||
addClass(listenerElement, 'ltr');
|
addClass(listenerElement, 'ltr');
|
||||||
}
|
}
|
||||||
onSizeChangedCallbackProxy(directionIsRTLCacheValues);
|
onSizeChangedCallbackProxy(directionIsRTLCacheValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
stopPropagation(event);
|
stopPropagation(event);
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// appearCallback is always needed on scroll-observer strategy to reset it
|
// appearCallback is always needed on scroll-observer strategy to reset it
|
||||||
if (appearCallback) {
|
if (appearCallback) {
|
||||||
addClass(sizeObserver, classNameSizeObserverAppear);
|
addClass(sizeObserver, classNameSizeObserverAppear);
|
||||||
push(
|
push(
|
||||||
offListeners,
|
offListeners,
|
||||||
on(sizeObserver, 'animationstart', appearCallback, {
|
on(sizeObserver, 'animationstart', appearCallback, {
|
||||||
// Fire only once for "CSS is ready" event if ResizeObserver strategy is used
|
// Fire only once for "CSS is ready" event if ResizeObserver strategy is used
|
||||||
_once: !!ResizeObserverConstructor,
|
_once: !!ResizeObserverConstructor,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
prependChildren(target, sizeObserver);
|
prependChildren(target, sizeObserver);
|
||||||
|
},
|
||||||
return () => {
|
];
|
||||||
runEachAndClear(offListeners);
|
|
||||||
removeElements(sizeObserver);
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import { classNameTrinsicObserver } from 'classnames';
|
|||||||
export type TrinsicObserverCallback = (heightIntrinsic: CacheValues<boolean>) => any;
|
export type TrinsicObserverCallback = (heightIntrinsic: CacheValues<boolean>) => any;
|
||||||
export type TrinsicObserver = [
|
export type TrinsicObserver = [
|
||||||
destroy: () => void,
|
destroy: () => void,
|
||||||
|
append: () => void,
|
||||||
update: () => void | Parameters<TrinsicObserverCallback>
|
update: () => void | Parameters<TrinsicObserverCallback>
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -63,31 +64,37 @@ export const createTrinsicObserver = (
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (IntersectionObserverConstructor) {
|
|
||||||
intersectionObserverInstance = new IntersectionObserverConstructor(
|
|
||||||
(entries) => intersectionObserverCallback(entries),
|
|
||||||
{ root: target }
|
|
||||||
);
|
|
||||||
intersectionObserverInstance.observe(trinsicObserver);
|
|
||||||
push(offListeners, () => {
|
|
||||||
intersectionObserverInstance!.disconnect();
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
const onSizeChanged = () => {
|
|
||||||
const newSize = offsetSize(trinsicObserver);
|
|
||||||
triggerOnTrinsicChangedCallback(newSize);
|
|
||||||
};
|
|
||||||
push(offListeners, createSizeObserver(trinsicObserver, onSizeChanged));
|
|
||||||
onSizeChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
prependChildren(target, trinsicObserver);
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
() => {
|
() => {
|
||||||
runEachAndClear(offListeners);
|
runEachAndClear(offListeners);
|
||||||
removeElements(trinsicObserver);
|
removeElements(trinsicObserver);
|
||||||
},
|
},
|
||||||
|
() => {
|
||||||
|
if (IntersectionObserverConstructor) {
|
||||||
|
intersectionObserverInstance = new IntersectionObserverConstructor(
|
||||||
|
(entries) => intersectionObserverCallback(entries),
|
||||||
|
{ root: target }
|
||||||
|
);
|
||||||
|
intersectionObserverInstance.observe(trinsicObserver);
|
||||||
|
push(offListeners, () => {
|
||||||
|
intersectionObserverInstance!.disconnect();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const onSizeChanged = () => {
|
||||||
|
const newSize = offsetSize(trinsicObserver);
|
||||||
|
triggerOnTrinsicChangedCallback(newSize);
|
||||||
|
};
|
||||||
|
const [destroySizeObserver, appendSizeObserver] = createSizeObserver(
|
||||||
|
trinsicObserver,
|
||||||
|
onSizeChanged
|
||||||
|
);
|
||||||
|
push(offListeners, destroySizeObserver);
|
||||||
|
appendSizeObserver();
|
||||||
|
onSizeChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
prependChildren(target, trinsicObserver);
|
||||||
|
},
|
||||||
() => {
|
() => {
|
||||||
if (intersectionObserverInstance) {
|
if (intersectionObserverInstance) {
|
||||||
return intersectionObserverCallback(intersectionObserverInstance.takeRecords(), true);
|
return intersectionObserverCallback(intersectionObserverInstance.takeRecords(), true);
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ export const sizeObserverPlugin: Plugin<SizeObserverPluginInstance> = {
|
|||||||
height: scrollAmount,
|
height: scrollAmount,
|
||||||
});
|
});
|
||||||
|
|
||||||
reset();
|
rAF!(reset);
|
||||||
|
|
||||||
return [observeAppearChange ? onScroll.bind(0, false) : reset, offListeners];
|
return [observeAppearChange ? onScroll.bind(0, false) : reset, offListeners];
|
||||||
},
|
},
|
||||||
|
|||||||
+12
-3
@@ -1,7 +1,8 @@
|
|||||||
import { offsetSize } from 'support';
|
import { offsetSize } from 'support';
|
||||||
|
import { getEnvironment } from 'environment';
|
||||||
import type { StructureSetupState } from 'setups';
|
import type { StructureSetupState } from 'setups';
|
||||||
|
|
||||||
const { min, max } = Math;
|
const { min, max, abs } = Math;
|
||||||
export const getScrollbarHandleLengthRatio = (
|
export const getScrollbarHandleLengthRatio = (
|
||||||
scrollbarHandle: HTMLElement,
|
scrollbarHandle: HTMLElement,
|
||||||
scrollbarTrack: HTMLElement,
|
scrollbarTrack: HTMLElement,
|
||||||
@@ -26,14 +27,22 @@ export const getScrollbarHandleOffsetRatio = (
|
|||||||
scrollbarTrack: HTMLElement,
|
scrollbarTrack: HTMLElement,
|
||||||
scrollOffsetElement: HTMLElement,
|
scrollOffsetElement: HTMLElement,
|
||||||
structureSetupState: StructureSetupState,
|
structureSetupState: StructureSetupState,
|
||||||
|
isRTL: boolean,
|
||||||
isHorizontal?: boolean
|
isHorizontal?: boolean
|
||||||
) => {
|
) => {
|
||||||
|
const { _rtlScrollBehavior } = getEnvironment();
|
||||||
const axis = isHorizontal ? 'x' : 'y';
|
const axis = isHorizontal ? 'x' : 'y';
|
||||||
const scrollLeftTop = isHorizontal ? 'Left' : 'Top';
|
const scrollLeftTop = isHorizontal ? 'Left' : 'Top';
|
||||||
const { _overflowAmount } = structureSetupState;
|
const { _overflowAmount } = structureSetupState;
|
||||||
const scrollPosition = scrollOffsetElement[`scroll${scrollLeftTop}`] as number;
|
|
||||||
const scrollPositionMax = Math.floor(_overflowAmount[axis]);
|
const scrollPositionMax = Math.floor(_overflowAmount[axis]);
|
||||||
const scrollPercent = min(1, scrollPosition / scrollPositionMax);
|
const scrollPosition = abs(scrollOffsetElement[`scroll${scrollLeftTop}`]);
|
||||||
|
const handleRTL = isHorizontal && isRTL;
|
||||||
|
const rtlNormalizedScrollPosition = _rtlScrollBehavior.i
|
||||||
|
? scrollPosition
|
||||||
|
: scrollPositionMax - scrollPosition;
|
||||||
|
const finalScrollPosition = handleRTL ? rtlNormalizedScrollPosition : scrollPosition;
|
||||||
|
const scrollPercent = min(1, finalScrollPosition / scrollPositionMax);
|
||||||
const lengthRatio = getScrollbarHandleLengthRatio(scrollbarHandle, scrollbarTrack, isHorizontal);
|
const lengthRatio = getScrollbarHandleLengthRatio(scrollbarHandle, scrollbarTrack, isHorizontal);
|
||||||
|
|
||||||
return (1 / lengthRatio) * (1 - lengthRatio) * scrollPercent;
|
return (1 / lengthRatio) * (1 - lengthRatio) * scrollPercent;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -132,12 +132,13 @@ export const createScrollbarsSetupElements = (
|
|||||||
) => {
|
) => {
|
||||||
const translateAxis = isHorizontal ? 'X' : 'Y';
|
const translateAxis = isHorizontal ? 'X' : 'Y';
|
||||||
scrollbarsHandleStyle(scrollbarStructures, (structure) => {
|
scrollbarsHandleStyle(scrollbarStructures, (structure) => {
|
||||||
const { _handle, _track } = structure;
|
const { _handle, _track, _scrollbar } = structure;
|
||||||
const offsetRatio = getScrollbarHandleOffsetRatio(
|
const offsetRatio = getScrollbarHandleOffsetRatio(
|
||||||
_handle,
|
_handle,
|
||||||
_track,
|
_track,
|
||||||
_scrollOffsetElement,
|
_scrollOffsetElement,
|
||||||
structureSetupState,
|
structureSetupState,
|
||||||
|
style(_scrollbar, 'direction') === 'rtl',
|
||||||
isHorizontal
|
isHorizontal
|
||||||
);
|
);
|
||||||
// eslint-disable-next-line no-self-compare
|
// eslint-disable-next-line no-self-compare
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
preventDefault,
|
preventDefault,
|
||||||
runEachAndClear,
|
runEachAndClear,
|
||||||
stopPropagation,
|
stopPropagation,
|
||||||
|
style,
|
||||||
XY,
|
XY,
|
||||||
} from 'support';
|
} from 'support';
|
||||||
import { classNamesScrollbarInteraction } from 'classnames';
|
import { classNamesScrollbarInteraction } from 'classnames';
|
||||||
@@ -14,6 +15,7 @@ import type {
|
|||||||
ScrollbarsSetupElementsObj,
|
ScrollbarsSetupElementsObj,
|
||||||
ScrollbarStructure,
|
ScrollbarStructure,
|
||||||
} from 'setups/scrollbarsSetup/scrollbarsSetup.elements';
|
} from 'setups/scrollbarsSetup/scrollbarsSetup.elements';
|
||||||
|
import { getEnvironment } from 'environment';
|
||||||
|
|
||||||
export type ScrollbarsSetupEvents = (
|
export type ScrollbarsSetupEvents = (
|
||||||
scrollbarStructure: ScrollbarStructure,
|
scrollbarStructure: ScrollbarStructure,
|
||||||
@@ -23,6 +25,7 @@ export type ScrollbarsSetupEvents = (
|
|||||||
isHorizontal?: boolean
|
isHorizontal?: boolean
|
||||||
) => () => void;
|
) => () => void;
|
||||||
|
|
||||||
|
const { round, abs } = Math;
|
||||||
const getPageOffset = (event: PointerEvent): XY<number> => ({
|
const getPageOffset = (event: PointerEvent): XY<number> => ({
|
||||||
x: event.pageX,
|
x: event.pageX,
|
||||||
y: event.pageY,
|
y: event.pageY,
|
||||||
@@ -31,8 +34,8 @@ const getScale = (element: HTMLElement): XY<number> => {
|
|||||||
const { width, height } = getBoundingClientRect(element);
|
const { width, height } = getBoundingClientRect(element);
|
||||||
const { w, h } = offsetSize(element);
|
const { w, h } = offsetSize(element);
|
||||||
return {
|
return {
|
||||||
x: Math.round(width) / w || 1,
|
x: round(width) / w || 1,
|
||||||
y: Math.round(height) / h || 1,
|
y: round(height) / h || 1,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
const continuePointerDown = (
|
const continuePointerDown = (
|
||||||
@@ -65,7 +68,8 @@ const createDragScrollingEvents = (
|
|||||||
structureSetupState: () => StructureSetupState,
|
structureSetupState: () => StructureSetupState,
|
||||||
isHorizontal?: boolean
|
isHorizontal?: boolean
|
||||||
) => {
|
) => {
|
||||||
const { _handle, _track } = scrollbarStructure;
|
const { _rtlScrollBehavior } = getEnvironment();
|
||||||
|
const { _handle, _track, _scrollbar } = scrollbarStructure;
|
||||||
const scrollOffsetKey = `scroll${isHorizontal ? 'Left' : 'Top'}`;
|
const scrollOffsetKey = `scroll${isHorizontal ? 'Left' : 'Top'}`;
|
||||||
const xyKey = `${isHorizontal ? 'x' : 'y'}`;
|
const xyKey = `${isHorizontal ? 'x' : 'y'}`;
|
||||||
const whKey = `${isHorizontal ? 'w' : 'h'}`;
|
const whKey = `${isHorizontal ? 'w' : 'h'}`;
|
||||||
@@ -77,9 +81,12 @@ const createDragScrollingEvents = (
|
|||||||
const handleTrackDiff = offsetSize(_track)[whKey] - offsetSize(_handle)[whKey];
|
const handleTrackDiff = offsetSize(_track)[whKey] - offsetSize(_handle)[whKey];
|
||||||
const scrollDeltaPercent = movement / handleTrackDiff;
|
const scrollDeltaPercent = movement / handleTrackDiff;
|
||||||
const scrollDelta = scrollDeltaPercent * _overflowAmount[xyKey];
|
const scrollDelta = scrollDeltaPercent * _overflowAmount[xyKey];
|
||||||
|
const isRTL = style(_scrollbar, 'direction') === 'rtl';
|
||||||
|
const negateMultiplactor =
|
||||||
|
isRTL && isHorizontal ? (_rtlScrollBehavior.n || _rtlScrollBehavior.i ? 1 : -1) : 1;
|
||||||
|
|
||||||
scrollOffsetElement[scrollOffsetKey] = mouseDownScroll + scrollDelta;
|
scrollOffsetElement[scrollOffsetKey] =
|
||||||
// if (_isRTL && isHorizontal && !_rtlScrollBehavior.i) scrollDelta *= -1;
|
abs(mouseDownScroll) + scrollDelta * negateMultiplactor;
|
||||||
};
|
};
|
||||||
|
|
||||||
return on(_handle, 'pointerdown', (pointerDownEvent: PointerEvent) => {
|
return on(_handle, 'pointerdown', (pointerDownEvent: PointerEvent) => {
|
||||||
|
|||||||
@@ -173,8 +173,12 @@ export const createScrollbarsSetup = (
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
(changedOptions, force, structureUpdateHints) => {
|
(changedOptions, force, structureUpdateHints) => {
|
||||||
const { _overflowEdgeChanged, _overflowAmountChanged, _overflowStyleChanged } =
|
const {
|
||||||
structureUpdateHints;
|
_overflowEdgeChanged,
|
||||||
|
_overflowAmountChanged,
|
||||||
|
_overflowStyleChanged,
|
||||||
|
_directionChanged,
|
||||||
|
} = structureUpdateHints;
|
||||||
const checkOption = createOptionCheck(options, changedOptions, force);
|
const checkOption = createOptionCheck(options, changedOptions, force);
|
||||||
const currStructureSetupState = structureSetupState();
|
const currStructureSetupState = structureSetupState();
|
||||||
const { _overflowAmount, _overflowStyle } = currStructureSetupState;
|
const { _overflowAmount, _overflowStyle } = currStructureSetupState;
|
||||||
@@ -187,7 +191,7 @@ export const createScrollbarsSetup = (
|
|||||||
const [dragScroll, dragScrollChanged] = checkOption<boolean>('scrollbars.dragScroll');
|
const [dragScroll, dragScrollChanged] = checkOption<boolean>('scrollbars.dragScroll');
|
||||||
const [clickScroll, clickScrollChanged] = checkOption<boolean>('scrollbars.clickScroll');
|
const [clickScroll, clickScrollChanged] = checkOption<boolean>('scrollbars.clickScroll');
|
||||||
|
|
||||||
const updateHandle = _overflowEdgeChanged || _overflowAmountChanged;
|
const updateHandle = _overflowEdgeChanged || _overflowAmountChanged || _directionChanged;
|
||||||
const updateVisibility = _overflowStyleChanged || visibilityChanged;
|
const updateVisibility = _overflowStyleChanged || visibilityChanged;
|
||||||
|
|
||||||
const setScrollbarVisibility = (overflowStyle: OverflowStyle, isHorizontal: boolean) => {
|
const setScrollbarVisibility = (overflowStyle: OverflowStyle, isHorizontal: boolean) => {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import {
|
|||||||
push,
|
push,
|
||||||
scrollLeft,
|
scrollLeft,
|
||||||
scrollTop,
|
scrollTop,
|
||||||
|
noop,
|
||||||
} from 'support';
|
} from 'support';
|
||||||
import { getEnvironment } from 'environment';
|
import { getEnvironment } from 'environment';
|
||||||
import {
|
import {
|
||||||
@@ -48,6 +49,7 @@ export type StructureSetupObserversUpdate = (checkOption: SetupUpdateCheckOption
|
|||||||
|
|
||||||
export type StructureSetupObservers = [
|
export type StructureSetupObservers = [
|
||||||
destroy: () => void,
|
destroy: () => void,
|
||||||
|
appendElements: () => void,
|
||||||
updateObservers: () => Partial<StructureSetupUpdateHints>,
|
updateObservers: () => Partial<StructureSetupUpdateHints>,
|
||||||
updateObserversOptions: StructureSetupObserversUpdate
|
updateObserversOptions: StructureSetupObserversUpdate
|
||||||
];
|
];
|
||||||
@@ -87,7 +89,7 @@ export const createStructureSetupObservers = (
|
|||||||
_viewportHasClass,
|
_viewportHasClass,
|
||||||
_viewportAddRemoveClass,
|
_viewportAddRemoveClass,
|
||||||
} = structureSetupElements;
|
} = structureSetupElements;
|
||||||
const { _nativeScrollbarsHiding: _nativeScrollbarStyling, _flexboxGlue } = getEnvironment();
|
const { _flexboxGlue } = getEnvironment();
|
||||||
|
|
||||||
const [updateContentSizeCache] = createCache<WH<number>>(
|
const [updateContentSizeCache] = createCache<WH<number>>(
|
||||||
{
|
{
|
||||||
@@ -207,14 +209,14 @@ export const createStructureSetupObservers = (
|
|||||||
return updateHints;
|
return updateHints;
|
||||||
};
|
};
|
||||||
|
|
||||||
const trinsicObserver =
|
const [destroyTrinsicObserver, appendTrinsicObserver, updateTrinsicObserver] =
|
||||||
(_content || !_flexboxGlue) && createTrinsicObserver(_host, onTrinsicChanged);
|
_content || !_flexboxGlue ? createTrinsicObserver(_host, onTrinsicChanged) : [noop, noop, noop];
|
||||||
const destroySizeObserver =
|
const [destroySizeObserver, appendSizeObserver] = !_viewportIsTarget
|
||||||
!_viewportIsTarget &&
|
? createSizeObserver(_host, onSizeChanged, {
|
||||||
createSizeObserver(_host, onSizeChanged, {
|
_appear: true,
|
||||||
_appear: true,
|
_direction: true,
|
||||||
_direction: !_nativeScrollbarStyling,
|
})
|
||||||
});
|
: [noop, noop];
|
||||||
const [destroyHostMutationObserver, updateHostMutationObserver] = createDOMObserver(
|
const [destroyHostMutationObserver, updateHostMutationObserver] = createDOMObserver(
|
||||||
_host,
|
_host,
|
||||||
false,
|
false,
|
||||||
@@ -235,17 +237,21 @@ export const createStructureSetupObservers = (
|
|||||||
|
|
||||||
return [
|
return [
|
||||||
() => {
|
() => {
|
||||||
|
destroyTrinsicObserver();
|
||||||
|
destroySizeObserver();
|
||||||
contentMutationObserver && contentMutationObserver[0](); // destroy
|
contentMutationObserver && contentMutationObserver[0](); // destroy
|
||||||
trinsicObserver && trinsicObserver[0](); // destroy
|
|
||||||
destroySizeObserver && destroySizeObserver();
|
|
||||||
viewportIsTargetResizeObserver && viewportIsTargetResizeObserver.disconnect();
|
viewportIsTargetResizeObserver && viewportIsTargetResizeObserver.disconnect();
|
||||||
destroyHostMutationObserver();
|
destroyHostMutationObserver();
|
||||||
},
|
},
|
||||||
|
() => {
|
||||||
|
appendSizeObserver();
|
||||||
|
appendTrinsicObserver();
|
||||||
|
},
|
||||||
() => {
|
() => {
|
||||||
const updateHints: Partial<StructureSetupUpdateHints> = {};
|
const updateHints: Partial<StructureSetupUpdateHints> = {};
|
||||||
const hostUpdateResult = updateHostMutationObserver();
|
const hostUpdateResult = updateHostMutationObserver();
|
||||||
|
const trinsicUpdateResult = updateTrinsicObserver();
|
||||||
const contentUpdateResult = contentMutationObserver && contentMutationObserver[1](); // update
|
const contentUpdateResult = contentMutationObserver && contentMutationObserver[1](); // update
|
||||||
const trinsicUpdateResult = trinsicObserver && trinsicObserver[1](); // update
|
|
||||||
|
|
||||||
if (hostUpdateResult) {
|
if (hostUpdateResult) {
|
||||||
assignDeep(
|
assignDeep(
|
||||||
@@ -259,18 +265,6 @@ export const createStructureSetupObservers = (
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (contentUpdateResult) {
|
|
||||||
assignDeep(
|
|
||||||
updateHints,
|
|
||||||
onContentMutation.apply(
|
|
||||||
0,
|
|
||||||
push(contentUpdateResult, true) as [
|
|
||||||
...updateResult: typeof contentUpdateResult,
|
|
||||||
fromRecords: true
|
|
||||||
]
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (trinsicUpdateResult) {
|
if (trinsicUpdateResult) {
|
||||||
assignDeep(
|
assignDeep(
|
||||||
updateHints,
|
updateHints,
|
||||||
@@ -283,6 +277,18 @@ export const createStructureSetupObservers = (
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (contentUpdateResult) {
|
||||||
|
assignDeep(
|
||||||
|
updateHints,
|
||||||
|
onContentMutation.apply(
|
||||||
|
0,
|
||||||
|
push(contentUpdateResult, true) as [
|
||||||
|
...updateResult: typeof contentUpdateResult,
|
||||||
|
fromRecords: true
|
||||||
|
]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return updateHints;
|
return updateHints;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export const createStructureSetup = (
|
|||||||
const state = createState(initialStructureSetupUpdateState);
|
const state = createState(initialStructureSetupUpdateState);
|
||||||
const [addEvent, removeEvent, triggerEvent] = createEventListenerHub<StructureSetupEventMap>();
|
const [addEvent, removeEvent, triggerEvent] = createEventListenerHub<StructureSetupEventMap>();
|
||||||
const [getState] = state;
|
const [getState] = state;
|
||||||
const [elements, appendElements, destroyElements] = createStructureSetupElements(target);
|
const [elements, appendStructureElements, destroyElements] = createStructureSetupElements(target);
|
||||||
const updateStructure = createStructureSetupUpdate(elements, state);
|
const updateStructure = createStructureSetupUpdate(elements, state);
|
||||||
const triggerUpdateEvent: (...args: StructureSetupEventMap['u']) => void = (
|
const triggerUpdateEvent: (...args: StructureSetupEventMap['u']) => void = (
|
||||||
updateHints,
|
updateHints,
|
||||||
@@ -86,20 +86,20 @@ export const createStructureSetup = (
|
|||||||
triggerEvent('u', [updateHints, changedOptions, force]);
|
triggerEvent('u', [updateHints, changedOptions, force]);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const [destroyObservers, updateObservers, updateObserversOptions] = createStructureSetupObservers(
|
const [destroyObservers, appendObserverElements, updateObservers, updateObserversOptions] =
|
||||||
elements,
|
createStructureSetupObservers(elements, state, (updateHints) => {
|
||||||
state,
|
|
||||||
(updateHints) => {
|
|
||||||
triggerUpdateEvent(updateStructure(checkOptionsFallback, updateHints), {}, false);
|
triggerUpdateEvent(updateStructure(checkOptionsFallback, updateHints), {}, false);
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
|
||||||
const structureSetupState = getState.bind(0) as (() => StructureSetupState) &
|
const structureSetupState = getState.bind(0) as (() => StructureSetupState) &
|
||||||
StructureSetupStaticState;
|
StructureSetupStaticState;
|
||||||
structureSetupState._addOnUpdatedListener = (listener) => {
|
structureSetupState._addOnUpdatedListener = (listener) => {
|
||||||
addEvent('u', listener);
|
addEvent('u', listener);
|
||||||
};
|
};
|
||||||
structureSetupState._appendElements = appendElements;
|
structureSetupState._appendElements = () => {
|
||||||
|
appendStructureElements();
|
||||||
|
appendObserverElements();
|
||||||
|
};
|
||||||
structureSetupState._elements = elements;
|
structureSetupState._elements = elements;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ body > .os-scrollbar {
|
|||||||
}
|
}
|
||||||
.os-scrollbar-track {
|
.os-scrollbar-track {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
direction: ltr !important;
|
||||||
padding: 0 !important;
|
padding: 0 !important;
|
||||||
border: none !important;
|
border: none !important;
|
||||||
}
|
}
|
||||||
@@ -31,7 +32,7 @@ body > .os-scrollbar {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,
|
.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,
|
||||||
.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle {
|
.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle {
|
||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
touch-action: none;
|
touch-action: none;
|
||||||
}
|
}
|
||||||
@@ -61,10 +62,10 @@ body > .os-scrollbar {
|
|||||||
}
|
}
|
||||||
.os-scrollbar-unusable,
|
.os-scrollbar-unusable,
|
||||||
.os-scrollbar-unusable * {
|
.os-scrollbar-unusable * {
|
||||||
pointer-events: none !important;
|
pointer-events: none !important;
|
||||||
}
|
}
|
||||||
.os-scrollbar-unusable .os-scrollbar-handle {
|
.os-scrollbar-unusable .os-scrollbar-handle {
|
||||||
opacity: 0 !important;
|
opacity: 0 !important;
|
||||||
}
|
}
|
||||||
.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless {
|
.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless {
|
||||||
left: 0;
|
left: 0;
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ $shrink-scale: 0.1;
|
|||||||
z-index: -1;
|
z-index: -1;
|
||||||
contain: strict;
|
contain: strict;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: row;
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
padding: inherit;
|
padding: inherit;
|
||||||
border: inherit;
|
border: inherit;
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ const startBtn: HTMLButtonElement | null = document.querySelector('#start');
|
|||||||
const resizesSlot: HTMLButtonElement | null = document.querySelector('#resizes');
|
const resizesSlot: HTMLButtonElement | null = document.querySelector('#resizes');
|
||||||
const preInitChildren = targetElm?.children.length;
|
const preInitChildren = targetElm?.children.length;
|
||||||
|
|
||||||
const destroySizeObserver = createSizeObserver(
|
const [destroySizeObserver, appendSizeObserver] = createSizeObserver(
|
||||||
targetElm as HTMLElement,
|
targetElm as HTMLElement,
|
||||||
({ _directionIsRTLCache, _sizeChanged }) => {
|
({ _directionIsRTLCache, _sizeChanged }) => {
|
||||||
if (_sizeChanged) {
|
if (_sizeChanged) {
|
||||||
@@ -66,6 +66,7 @@ const destroySizeObserver = createSizeObserver(
|
|||||||
},
|
},
|
||||||
{ _direction: true, _appear: true }
|
{ _direction: true, _appear: true }
|
||||||
);
|
);
|
||||||
|
appendSizeObserver();
|
||||||
|
|
||||||
const selectCallback = generateClassChangeSelectCallback(targetElm as HTMLElement);
|
const selectCallback = generateClassChangeSelectCallback(targetElm as HTMLElement);
|
||||||
const iterate = async (select: HTMLSelectElement | null, afterEach?: () => any) => {
|
const iterate = async (select: HTMLSelectElement | null, afterEach?: () => any) => {
|
||||||
|
|||||||
+4
-5
@@ -29,9 +29,8 @@ const startBtn: HTMLButtonElement | null = document.querySelector('#start');
|
|||||||
const changesSlot: HTMLButtonElement | null = document.querySelector('#changes');
|
const changesSlot: HTMLButtonElement | null = document.querySelector('#changes');
|
||||||
const preInitChildren = targetElm?.children.length;
|
const preInitChildren = targetElm?.children.length;
|
||||||
|
|
||||||
const [destroyTrinsicObserver, updateTrinsicObserver] = createTrinsicObserver(
|
const [destroyTrinsicObserver, appendTrinsicObserver, updateTrinsicObserver] =
|
||||||
targetElm as HTMLElement,
|
createTrinsicObserver(targetElm as HTMLElement, (heightIntrinsicCache) => {
|
||||||
(heightIntrinsicCache) => {
|
|
||||||
const [currentHeightIntrinsic, currentHeightIntrinsicChanged] = heightIntrinsicCache;
|
const [currentHeightIntrinsic, currentHeightIntrinsicChanged] = heightIntrinsicCache;
|
||||||
if (currentHeightIntrinsicChanged) {
|
if (currentHeightIntrinsicChanged) {
|
||||||
heightIterations += 1;
|
heightIterations += 1;
|
||||||
@@ -42,8 +41,8 @@ const [destroyTrinsicObserver, updateTrinsicObserver] = createTrinsicObserver(
|
|||||||
changesSlot.textContent = heightIterations.toString();
|
changesSlot.textContent = heightIterations.toString();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
});
|
||||||
);
|
appendTrinsicObserver();
|
||||||
|
|
||||||
const envElmSelectCallback = generateClassChangeSelectCallback(envElm as HTMLElement);
|
const envElmSelectCallback = generateClassChangeSelectCallback(envElm as HTMLElement);
|
||||||
const targetElmSelectCallback = generateClassChangeSelectCallback(targetElm as HTMLElement);
|
const targetElmSelectCallback = generateClassChangeSelectCallback(targetElm as HTMLElement);
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
export {};
|
||||||
Reference in New Issue
Block a user