Latest updates from IceHrmPro
This commit is contained in:
193
web/node_modules/compute-scroll-into-view/es/index.js
generated
vendored
Normal file
193
web/node_modules/compute-scroll-into-view/es/index.js
generated
vendored
Normal file
@@ -0,0 +1,193 @@
|
||||
function isElement(el) {
|
||||
return el != null && typeof el === 'object' && el.nodeType === 1;
|
||||
}
|
||||
|
||||
function canOverflow(overflow, skipOverflowHiddenElements) {
|
||||
if (skipOverflowHiddenElements && overflow === 'hidden') {
|
||||
return false;
|
||||
}
|
||||
|
||||
return overflow !== 'visible' && overflow !== 'clip';
|
||||
}
|
||||
|
||||
function getFrameElement(el) {
|
||||
if (!el.ownerDocument || !el.ownerDocument.defaultView) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return el.ownerDocument.defaultView.frameElement;
|
||||
}
|
||||
|
||||
function isHiddenByFrame(el) {
|
||||
var frame = getFrameElement(el);
|
||||
|
||||
if (!frame) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return frame.clientHeight < el.scrollHeight || frame.clientWidth < el.scrollWidth;
|
||||
}
|
||||
|
||||
function isScrollable(el, skipOverflowHiddenElements) {
|
||||
if (el.clientHeight < el.scrollHeight || el.clientWidth < el.scrollWidth) {
|
||||
var style = getComputedStyle(el, null);
|
||||
return canOverflow(style.overflowY, skipOverflowHiddenElements) || canOverflow(style.overflowX, skipOverflowHiddenElements) || isHiddenByFrame(el);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function alignNearest(scrollingEdgeStart, scrollingEdgeEnd, scrollingSize, scrollingBorderStart, scrollingBorderEnd, elementEdgeStart, elementEdgeEnd, elementSize) {
|
||||
if (elementEdgeStart < scrollingEdgeStart && elementEdgeEnd > scrollingEdgeEnd || elementEdgeStart > scrollingEdgeStart && elementEdgeEnd < scrollingEdgeEnd) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (elementEdgeStart <= scrollingEdgeStart && elementSize <= scrollingSize || elementEdgeEnd >= scrollingEdgeEnd && elementSize >= scrollingSize) {
|
||||
return elementEdgeStart - scrollingEdgeStart - scrollingBorderStart;
|
||||
}
|
||||
|
||||
if (elementEdgeEnd > scrollingEdgeEnd && elementSize < scrollingSize || elementEdgeStart < scrollingEdgeStart && elementSize > scrollingSize) {
|
||||
return elementEdgeEnd - scrollingEdgeEnd + scrollingBorderEnd;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
export default (function (target, options) {
|
||||
var scrollMode = options.scrollMode,
|
||||
block = options.block,
|
||||
inline = options.inline,
|
||||
boundary = options.boundary,
|
||||
skipOverflowHiddenElements = options.skipOverflowHiddenElements;
|
||||
var checkBoundary = typeof boundary === 'function' ? boundary : function (node) {
|
||||
return node !== boundary;
|
||||
};
|
||||
|
||||
if (!isElement(target)) {
|
||||
throw new TypeError('Invalid target');
|
||||
}
|
||||
|
||||
var scrollingElement = document.scrollingElement || document.documentElement;
|
||||
var frames = [];
|
||||
var cursor = target;
|
||||
|
||||
while (isElement(cursor) && checkBoundary(cursor)) {
|
||||
cursor = cursor.parentNode;
|
||||
|
||||
if (cursor === scrollingElement) {
|
||||
frames.push(cursor);
|
||||
break;
|
||||
}
|
||||
|
||||
if (cursor === document.body && isScrollable(cursor) && !isScrollable(document.documentElement)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isScrollable(cursor, skipOverflowHiddenElements)) {
|
||||
frames.push(cursor);
|
||||
}
|
||||
}
|
||||
|
||||
var viewportWidth = window.visualViewport ? visualViewport.width : innerWidth;
|
||||
var viewportHeight = window.visualViewport ? visualViewport.height : innerHeight;
|
||||
var viewportX = window.scrollX || pageXOffset;
|
||||
var viewportY = window.scrollY || pageYOffset;
|
||||
|
||||
var _target$getBoundingCl = target.getBoundingClientRect(),
|
||||
targetHeight = _target$getBoundingCl.height,
|
||||
targetWidth = _target$getBoundingCl.width,
|
||||
targetTop = _target$getBoundingCl.top,
|
||||
targetRight = _target$getBoundingCl.right,
|
||||
targetBottom = _target$getBoundingCl.bottom,
|
||||
targetLeft = _target$getBoundingCl.left;
|
||||
|
||||
var targetBlock = block === 'start' || block === 'nearest' ? targetTop : block === 'end' ? targetBottom : targetTop + targetHeight / 2;
|
||||
var targetInline = inline === 'center' ? targetLeft + targetWidth / 2 : inline === 'end' ? targetRight : targetLeft;
|
||||
var computations = [];
|
||||
|
||||
for (var index = 0; index < frames.length; index++) {
|
||||
var frame = frames[index];
|
||||
|
||||
var _frame$getBoundingCli = frame.getBoundingClientRect(),
|
||||
height = _frame$getBoundingCli.height,
|
||||
width = _frame$getBoundingCli.width,
|
||||
top = _frame$getBoundingCli.top,
|
||||
right = _frame$getBoundingCli.right,
|
||||
bottom = _frame$getBoundingCli.bottom,
|
||||
left = _frame$getBoundingCli.left;
|
||||
|
||||
if (scrollMode === 'if-needed' && targetTop >= 0 && targetLeft >= 0 && targetBottom <= viewportHeight && targetRight <= viewportWidth && targetTop >= top && targetBottom <= bottom && targetLeft >= left && targetRight <= right) {
|
||||
return computations;
|
||||
}
|
||||
|
||||
var frameStyle = getComputedStyle(frame);
|
||||
var borderLeft = parseInt(frameStyle.borderLeftWidth, 10);
|
||||
var borderTop = parseInt(frameStyle.borderTopWidth, 10);
|
||||
var borderRight = parseInt(frameStyle.borderRightWidth, 10);
|
||||
var borderBottom = parseInt(frameStyle.borderBottomWidth, 10);
|
||||
var blockScroll = 0;
|
||||
var inlineScroll = 0;
|
||||
var scrollbarWidth = 'offsetWidth' in frame ? frame.offsetWidth - frame.clientWidth - borderLeft - borderRight : 0;
|
||||
var scrollbarHeight = 'offsetHeight' in frame ? frame.offsetHeight - frame.clientHeight - borderTop - borderBottom : 0;
|
||||
|
||||
if (scrollingElement === frame) {
|
||||
if (block === 'start') {
|
||||
blockScroll = targetBlock;
|
||||
} else if (block === 'end') {
|
||||
blockScroll = targetBlock - viewportHeight;
|
||||
} else if (block === 'nearest') {
|
||||
blockScroll = alignNearest(viewportY, viewportY + viewportHeight, viewportHeight, borderTop, borderBottom, viewportY + targetBlock, viewportY + targetBlock + targetHeight, targetHeight);
|
||||
} else {
|
||||
blockScroll = targetBlock - viewportHeight / 2;
|
||||
}
|
||||
|
||||
if (inline === 'start') {
|
||||
inlineScroll = targetInline;
|
||||
} else if (inline === 'center') {
|
||||
inlineScroll = targetInline - viewportWidth / 2;
|
||||
} else if (inline === 'end') {
|
||||
inlineScroll = targetInline - viewportWidth;
|
||||
} else {
|
||||
inlineScroll = alignNearest(viewportX, viewportX + viewportWidth, viewportWidth, borderLeft, borderRight, viewportX + targetInline, viewportX + targetInline + targetWidth, targetWidth);
|
||||
}
|
||||
|
||||
blockScroll = Math.max(0, blockScroll + viewportY);
|
||||
inlineScroll = Math.max(0, inlineScroll + viewportX);
|
||||
} else {
|
||||
if (block === 'start') {
|
||||
blockScroll = targetBlock - top - borderTop;
|
||||
} else if (block === 'end') {
|
||||
blockScroll = targetBlock - bottom + borderBottom + scrollbarHeight;
|
||||
} else if (block === 'nearest') {
|
||||
blockScroll = alignNearest(top, bottom, height, borderTop, borderBottom + scrollbarHeight, targetBlock, targetBlock + targetHeight, targetHeight);
|
||||
} else {
|
||||
blockScroll = targetBlock - (top + height / 2) + scrollbarHeight / 2;
|
||||
}
|
||||
|
||||
if (inline === 'start') {
|
||||
inlineScroll = targetInline - left - borderLeft;
|
||||
} else if (inline === 'center') {
|
||||
inlineScroll = targetInline - (left + width / 2) + scrollbarWidth / 2;
|
||||
} else if (inline === 'end') {
|
||||
inlineScroll = targetInline - right + borderRight + scrollbarWidth;
|
||||
} else {
|
||||
inlineScroll = alignNearest(left, right, width, borderLeft, borderRight + scrollbarWidth, targetInline, targetInline + targetWidth, targetWidth);
|
||||
}
|
||||
|
||||
var scrollLeft = frame.scrollLeft,
|
||||
scrollTop = frame.scrollTop;
|
||||
blockScroll = Math.max(0, Math.min(scrollTop + blockScroll, frame.scrollHeight - height + scrollbarHeight));
|
||||
inlineScroll = Math.max(0, Math.min(scrollLeft + inlineScroll, frame.scrollWidth - width + scrollbarWidth));
|
||||
targetBlock += scrollTop - blockScroll;
|
||||
targetInline += scrollLeft - inlineScroll;
|
||||
}
|
||||
|
||||
computations.push({
|
||||
el: frame,
|
||||
top: blockScroll,
|
||||
left: inlineScroll
|
||||
});
|
||||
}
|
||||
|
||||
return computations;
|
||||
});
|
||||
Reference in New Issue
Block a user