189 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function (global, factory) {
 | |
|   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
 | |
|   typeof define === 'function' && define.amd ? define(['exports'], factory) :
 | |
|   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.FloatingUIUtilsDOM = {}));
 | |
| })(this, (function (exports) { 'use strict';
 | |
| 
 | |
|   function hasWindow() {
 | |
|     return typeof window !== 'undefined';
 | |
|   }
 | |
|   function getNodeName(node) {
 | |
|     if (isNode(node)) {
 | |
|       return (node.nodeName || '').toLowerCase();
 | |
|     }
 | |
|     // Mocked nodes in testing environments may not be instances of Node. By
 | |
|     // returning `#document` an infinite loop won't occur.
 | |
|     // https://github.com/floating-ui/floating-ui/issues/2317
 | |
|     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;
 | |
|   }
 | |
|   const invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);
 | |
|   function isOverflowElement(element) {
 | |
|     const {
 | |
|       overflow,
 | |
|       overflowX,
 | |
|       overflowY,
 | |
|       display
 | |
|     } = getComputedStyle(element);
 | |
|     return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);
 | |
|   }
 | |
|   const tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);
 | |
|   function isTableElement(element) {
 | |
|     return tableElements.has(getNodeName(element));
 | |
|   }
 | |
|   const topLayerSelectors = [':popover-open', ':modal'];
 | |
|   function isTopLayer(element) {
 | |
|     return topLayerSelectors.some(selector => {
 | |
|       try {
 | |
|         return element.matches(selector);
 | |
|       } catch (_e) {
 | |
|         return false;
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   const transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];
 | |
|   const willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];
 | |
|   const containValues = ['paint', 'layout', 'strict', 'content'];
 | |
|   function isContainingBlock(elementOrCss) {
 | |
|     const webkit = isWebKit();
 | |
|     const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;
 | |
| 
 | |
|     // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
 | |
|     // https://drafts.csswg.org/css-transforms-2/#individual-transforms
 | |
|     return transformProperties.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) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.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');
 | |
|   }
 | |
|   const lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);
 | |
|   function isLastTraversableNode(node) {
 | |
|     return lastTraversableNodeNames.has(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 =
 | |
|     // Step into the shadow DOM of the parent of a slotted node.
 | |
|     node.assignedSlot ||
 | |
|     // DOM Element detected.
 | |
|     node.parentNode ||
 | |
|     // ShadowRoot detected.
 | |
|     isShadowRoot(node) && node.host ||
 | |
|     // Fallback.
 | |
|     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;
 | |
|   }
 | |
| 
 | |
|   exports.getComputedStyle = getComputedStyle;
 | |
|   exports.getContainingBlock = getContainingBlock;
 | |
|   exports.getDocumentElement = getDocumentElement;
 | |
|   exports.getFrameElement = getFrameElement;
 | |
|   exports.getNearestOverflowAncestor = getNearestOverflowAncestor;
 | |
|   exports.getNodeName = getNodeName;
 | |
|   exports.getNodeScroll = getNodeScroll;
 | |
|   exports.getOverflowAncestors = getOverflowAncestors;
 | |
|   exports.getParentNode = getParentNode;
 | |
|   exports.getWindow = getWindow;
 | |
|   exports.isContainingBlock = isContainingBlock;
 | |
|   exports.isElement = isElement;
 | |
|   exports.isHTMLElement = isHTMLElement;
 | |
|   exports.isLastTraversableNode = isLastTraversableNode;
 | |
|   exports.isNode = isNode;
 | |
|   exports.isOverflowElement = isOverflowElement;
 | |
|   exports.isShadowRoot = isShadowRoot;
 | |
|   exports.isTableElement = isTableElement;
 | |
|   exports.isTopLayer = isTopLayer;
 | |
|   exports.isWebKit = isWebKit;
 | |
| 
 | |
| }));
 |