| function hasWindow() { |
| return typeof window !== 'undefined'; |
| } |
| function getNodeName(node) { |
| if (isNode(node)) { |
| return (node.nodeName || '').toLowerCase(); |
| } |
| |
| |
| |
| return '#document'; |
| } |
| function getWindow(node) { |
| var _node$ownerDocument; |
| return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; |
| } |
| function getDocumentElement(node) { |
| var _ref; |
| return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement; |
| } |
| function isNode(value) { |
| if (!hasWindow()) { |
| return false; |
| } |
| return value instanceof Node || value instanceof getWindow(value).Node; |
| } |
| function isElement(value) { |
| if (!hasWindow()) { |
| return false; |
| } |
| return value instanceof Element || value instanceof getWindow(value).Element; |
| } |
| function isHTMLElement(value) { |
| if (!hasWindow()) { |
| return false; |
| } |
| return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; |
| } |
| function isShadowRoot(value) { |
| if (!hasWindow() || typeof ShadowRoot === 'undefined') { |
| return false; |
| } |
| return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot; |
| } |
| function isOverflowElement(element) { |
| const { |
| overflow, |
| overflowX, |
| overflowY, |
| display |
| } = getComputedStyle(element); |
| return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display); |
| } |
| function isTableElement(element) { |
| return ['table', 'td', 'th'].includes(getNodeName(element)); |
| } |
| function isTopLayer(element) { |
| return [':popover-open', ':modal'].some(selector => { |
| try { |
| return element.matches(selector); |
| } catch (e) { |
| return false; |
| } |
| }); |
| } |
| function isContainingBlock(elementOrCss) { |
| const webkit = isWebKit(); |
| const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss; |
|
|
| |
| |
| return ['transform', 'translate', 'scale', 'rotate', 'perspective'].some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value)); |
| } |
| function getContainingBlock(element) { |
| let currentNode = getParentNode(element); |
| while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { |
| if (isContainingBlock(currentNode)) { |
| return currentNode; |
| } else if (isTopLayer(currentNode)) { |
| return null; |
| } |
| currentNode = getParentNode(currentNode); |
| } |
| return null; |
| } |
| function isWebKit() { |
| if (typeof CSS === 'undefined' || !CSS.supports) return false; |
| return CSS.supports('-webkit-backdrop-filter', 'none'); |
| } |
| function isLastTraversableNode(node) { |
| return ['html', 'body', '#document'].includes(getNodeName(node)); |
| } |
| function getComputedStyle(element) { |
| return getWindow(element).getComputedStyle(element); |
| } |
| function getNodeScroll(element) { |
| if (isElement(element)) { |
| return { |
| scrollLeft: element.scrollLeft, |
| scrollTop: element.scrollTop |
| }; |
| } |
| return { |
| scrollLeft: element.scrollX, |
| scrollTop: element.scrollY |
| }; |
| } |
| function getParentNode(node) { |
| if (getNodeName(node) === 'html') { |
| return node; |
| } |
| const result = |
| |
| node.assignedSlot || |
| |
| node.parentNode || |
| |
| isShadowRoot(node) && node.host || |
| |
| getDocumentElement(node); |
| return isShadowRoot(result) ? result.host : result; |
| } |
| function getNearestOverflowAncestor(node) { |
| const parentNode = getParentNode(node); |
| if (isLastTraversableNode(parentNode)) { |
| return node.ownerDocument ? node.ownerDocument.body : node.body; |
| } |
| if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { |
| return parentNode; |
| } |
| return getNearestOverflowAncestor(parentNode); |
| } |
| function getOverflowAncestors(node, list, traverseIframes) { |
| var _node$ownerDocument2; |
| if (list === void 0) { |
| list = []; |
| } |
| if (traverseIframes === void 0) { |
| traverseIframes = true; |
| } |
| const scrollableAncestor = getNearestOverflowAncestor(node); |
| const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body); |
| const win = getWindow(scrollableAncestor); |
| if (isBody) { |
| const frameElement = getFrameElement(win); |
| return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []); |
| } |
| return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); |
| } |
| function getFrameElement(win) { |
| return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null; |
| } |
|
|
| export { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit }; |
|
|