improve code

This commit is contained in:
Rene
2022-07-27 20:56:47 +02:00
parent b3494f8f9c
commit 352501f2f1
14 changed files with 174 additions and 135 deletions
@@ -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];
}, },
@@ -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) => {
@@ -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);
+1
View File
@@ -0,0 +1 @@
export {};