You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					693 lines
				
				24 KiB
			
		
		
			
		
	
	
					693 lines
				
				24 KiB
			| 
											3 years ago
										 | (function (global, factory) { | ||
|  |   typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@floating-ui/core')) : | ||
|  |   typeof define === 'function' && define.amd ? define(['exports', '@floating-ui/core'], factory) : | ||
|  |   (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.FloatingUIDOM = {}, global.FloatingUICore)); | ||
|  | })(this, (function (exports, core) { 'use strict'; | ||
|  | 
 | ||
|  |   function getWindow(node) { | ||
|  |     var _node$ownerDocument; | ||
|  |     return ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getComputedStyle$1(element) { | ||
|  |     return getWindow(element).getComputedStyle(element); | ||
|  |   } | ||
|  | 
 | ||
|  |   function getNodeName(node) { | ||
|  |     return isNode(node) ? (node.nodeName || '').toLowerCase() : ''; | ||
|  |   } | ||
|  | 
 | ||
|  |   let uaString; | ||
|  |   function getUAString() { | ||
|  |     if (uaString) { | ||
|  |       return uaString; | ||
|  |     } | ||
|  |     const uaData = navigator.userAgentData; | ||
|  |     if (uaData && Array.isArray(uaData.brands)) { | ||
|  |       uaString = uaData.brands.map(item => item.brand + "/" + item.version).join(' '); | ||
|  |       return uaString; | ||
|  |     } | ||
|  |     return navigator.userAgent; | ||
|  |   } | ||
|  | 
 | ||
|  |   function isHTMLElement(value) { | ||
|  |     return value instanceof getWindow(value).HTMLElement; | ||
|  |   } | ||
|  |   function isElement(value) { | ||
|  |     return value instanceof getWindow(value).Element; | ||
|  |   } | ||
|  |   function isNode(value) { | ||
|  |     return value instanceof getWindow(value).Node; | ||
|  |   } | ||
|  |   function isShadowRoot(node) { | ||
|  |     // Browsers without `ShadowRoot` support
 | ||
|  |     if (typeof ShadowRoot === 'undefined') { | ||
|  |       return false; | ||
|  |     } | ||
|  |     const OwnElement = getWindow(node).ShadowRoot; | ||
|  |     return node instanceof OwnElement || node instanceof ShadowRoot; | ||
|  |   } | ||
|  |   function isOverflowElement(element) { | ||
|  |     const { | ||
|  |       overflow, | ||
|  |       overflowX, | ||
|  |       overflowY, | ||
|  |       display | ||
|  |     } = getComputedStyle$1(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 isContainingBlock(element) { | ||
|  |     // TODO: Try and use feature detection here instead
 | ||
|  |     const isFirefox = /firefox/i.test(getUAString()); | ||
|  |     const css = getComputedStyle$1(element); | ||
|  |     const backdropFilter = css.backdropFilter || css.WebkitBackdropFilter; | ||
|  | 
 | ||
|  |     // This is non-exhaustive but covers the most common CSS properties that
 | ||
|  |     // create a containing block.
 | ||
|  |     // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
 | ||
|  |     return css.transform !== 'none' || css.perspective !== 'none' || (backdropFilter ? backdropFilter !== 'none' : false) || isFirefox && css.willChange === 'filter' || isFirefox && (css.filter ? css.filter !== 'none' : false) || ['transform', 'perspective'].some(value => css.willChange.includes(value)) || ['paint', 'layout', 'strict', 'content'].some( | ||
|  |     // TS 4.1 compat
 | ||
|  |     value => { | ||
|  |       const contain = css.contain; | ||
|  |       return contain != null ? contain.includes(value) : false; | ||
|  |     }); | ||
|  |   } | ||
|  |   function isLayoutViewport() { | ||
|  |     // Not Safari
 | ||
|  |     return !/^((?!chrome|android).)*safari/i.test(getUAString()); | ||
|  |     // Feature detection for this fails in various ways
 | ||
|  |     // • Always-visible scrollbar or not
 | ||
|  |     // • Width of <html>, etc.
 | ||
|  |     // const vV = win.visualViewport;
 | ||
|  |     // return vV ? Math.abs(win.innerWidth / vV.scale - vV.width) < 0.5 : true;
 | ||
|  |   } | ||
|  | 
 | ||
|  |   function isLastTraversableNode(node) { | ||
|  |     return ['html', 'body', '#document'].includes(getNodeName(node)); | ||
|  |   } | ||
|  | 
 | ||
|  |   const min = Math.min; | ||
|  |   const max = Math.max; | ||
|  |   const round = Math.round; | ||
|  | 
 | ||
|  |   function getCssDimensions(element) { | ||
|  |     const css = getComputedStyle$1(element); | ||
|  |     let width = parseFloat(css.width); | ||
|  |     let height = parseFloat(css.height); | ||
|  |     const offsetWidth = element.offsetWidth; | ||
|  |     const offsetHeight = element.offsetHeight; | ||
|  |     const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; | ||
|  |     if (shouldFallback) { | ||
|  |       width = offsetWidth; | ||
|  |       height = offsetHeight; | ||
|  |     } | ||
|  |     return { | ||
|  |       width, | ||
|  |       height, | ||
|  |       fallback: shouldFallback | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   function unwrapElement(element) { | ||
|  |     return !isElement(element) ? element.contextElement : element; | ||
|  |   } | ||
|  | 
 | ||
|  |   const FALLBACK_SCALE = { | ||
|  |     x: 1, | ||
|  |     y: 1 | ||
|  |   }; | ||
|  |   function getScale(element) { | ||
|  |     const domElement = unwrapElement(element); | ||
|  |     if (!isHTMLElement(domElement)) { | ||
|  |       return FALLBACK_SCALE; | ||
|  |     } | ||
|  |     const rect = domElement.getBoundingClientRect(); | ||
|  |     const { | ||
|  |       width, | ||
|  |       height, | ||
|  |       fallback | ||
|  |     } = getCssDimensions(domElement); | ||
|  |     let x = (fallback ? round(rect.width) : rect.width) / width; | ||
|  |     let y = (fallback ? round(rect.height) : rect.height) / height; | ||
|  | 
 | ||
|  |     // 0, NaN, or Infinity should always fallback to 1.
 | ||
|  | 
 | ||
|  |     if (!x || !Number.isFinite(x)) { | ||
|  |       x = 1; | ||
|  |     } | ||
|  |     if (!y || !Number.isFinite(y)) { | ||
|  |       y = 1; | ||
|  |     } | ||
|  |     return { | ||
|  |       x, | ||
|  |       y | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { | ||
|  |     var _win$visualViewport, _win$visualViewport2; | ||
|  |     if (includeScale === void 0) { | ||
|  |       includeScale = false; | ||
|  |     } | ||
|  |     if (isFixedStrategy === void 0) { | ||
|  |       isFixedStrategy = false; | ||
|  |     } | ||
|  |     const clientRect = element.getBoundingClientRect(); | ||
|  |     const domElement = unwrapElement(element); | ||
|  |     let scale = FALLBACK_SCALE; | ||
|  |     if (includeScale) { | ||
|  |       if (offsetParent) { | ||
|  |         if (isElement(offsetParent)) { | ||
|  |           scale = getScale(offsetParent); | ||
|  |         } | ||
|  |       } else { | ||
|  |         scale = getScale(element); | ||
|  |       } | ||
|  |     } | ||
|  |     const win = domElement ? getWindow(domElement) : window; | ||
|  |     const addVisualOffsets = !isLayoutViewport() && isFixedStrategy; | ||
|  |     let x = (clientRect.left + (addVisualOffsets ? ((_win$visualViewport = win.visualViewport) == null ? void 0 : _win$visualViewport.offsetLeft) || 0 : 0)) / scale.x; | ||
|  |     let y = (clientRect.top + (addVisualOffsets ? ((_win$visualViewport2 = win.visualViewport) == null ? void 0 : _win$visualViewport2.offsetTop) || 0 : 0)) / scale.y; | ||
|  |     let width = clientRect.width / scale.x; | ||
|  |     let height = clientRect.height / scale.y; | ||
|  |     if (domElement) { | ||
|  |       const win = getWindow(domElement); | ||
|  |       const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent; | ||
|  |       let currentIFrame = win.frameElement; | ||
|  |       while (currentIFrame && offsetParent && offsetWin !== win) { | ||
|  |         const iframeScale = getScale(currentIFrame); | ||
|  |         const iframeRect = currentIFrame.getBoundingClientRect(); | ||
|  |         const css = getComputedStyle(currentIFrame); | ||
|  |         iframeRect.x += (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; | ||
|  |         iframeRect.y += (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; | ||
|  |         x *= iframeScale.x; | ||
|  |         y *= iframeScale.y; | ||
|  |         width *= iframeScale.x; | ||
|  |         height *= iframeScale.y; | ||
|  |         x += iframeRect.x; | ||
|  |         y += iframeRect.y; | ||
|  |         currentIFrame = getWindow(currentIFrame).frameElement; | ||
|  |       } | ||
|  |     } | ||
|  |     return { | ||
|  |       width, | ||
|  |       height, | ||
|  |       top: y, | ||
|  |       right: x + width, | ||
|  |       bottom: y + height, | ||
|  |       left: x, | ||
|  |       x, | ||
|  |       y | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getDocumentElement(node) { | ||
|  |     return ((isNode(node) ? node.ownerDocument : node.document) || window.document).documentElement; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getNodeScroll(element) { | ||
|  |     if (isElement(element)) { | ||
|  |       return { | ||
|  |         scrollLeft: element.scrollLeft, | ||
|  |         scrollTop: element.scrollTop | ||
|  |       }; | ||
|  |     } | ||
|  |     return { | ||
|  |       scrollLeft: element.pageXOffset, | ||
|  |       scrollTop: element.pageYOffset | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getWindowScrollBarX(element) { | ||
|  |     // If <html> has a CSS width greater than the viewport, then this will be
 | ||
|  |     // incorrect for RTL.
 | ||
|  |     return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getRectRelativeToOffsetParent(element, offsetParent, strategy) { | ||
|  |     const isOffsetParentAnElement = isHTMLElement(offsetParent); | ||
|  |     const documentElement = getDocumentElement(offsetParent); | ||
|  |     const rect = getBoundingClientRect(element, true, strategy === 'fixed', offsetParent); | ||
|  |     let scroll = { | ||
|  |       scrollLeft: 0, | ||
|  |       scrollTop: 0 | ||
|  |     }; | ||
|  |     const offsets = { | ||
|  |       x: 0, | ||
|  |       y: 0 | ||
|  |     }; | ||
|  |     if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') { | ||
|  |       if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) { | ||
|  |         scroll = getNodeScroll(offsetParent); | ||
|  |       } | ||
|  |       if (isHTMLElement(offsetParent)) { | ||
|  |         const offsetRect = getBoundingClientRect(offsetParent, true); | ||
|  |         offsets.x = offsetRect.x + offsetParent.clientLeft; | ||
|  |         offsets.y = offsetRect.y + offsetParent.clientTop; | ||
|  |       } else if (documentElement) { | ||
|  |         offsets.x = getWindowScrollBarX(documentElement); | ||
|  |       } | ||
|  |     } | ||
|  |     return { | ||
|  |       x: rect.left + scroll.scrollLeft - offsets.x, | ||
|  |       y: rect.top + scroll.scrollTop - offsets.y, | ||
|  |       width: rect.width, | ||
|  |       height: rect.height | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   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 : null) || | ||
|  |     // Fallback
 | ||
|  |     getDocumentElement(node); | ||
|  |     return isShadowRoot(result) ? result.host : result; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getTrueOffsetParent(element) { | ||
|  |     if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') { | ||
|  |       return null; | ||
|  |     } | ||
|  |     return element.offsetParent; | ||
|  |   } | ||
|  |   function getContainingBlock(element) { | ||
|  |     let currentNode = getParentNode(element); | ||
|  |     while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) { | ||
|  |       if (isContainingBlock(currentNode)) { | ||
|  |         return currentNode; | ||
|  |       } else { | ||
|  |         currentNode = getParentNode(currentNode); | ||
|  |       } | ||
|  |     } | ||
|  |     return null; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Gets the closest ancestor positioned element. Handles some edge cases,
 | ||
|  |   // such as table ancestors and cross browser bugs.
 | ||
|  |   function getOffsetParent(element) { | ||
|  |     const window = getWindow(element); | ||
|  |     let offsetParent = getTrueOffsetParent(element); | ||
|  |     while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') { | ||
|  |       offsetParent = getTrueOffsetParent(offsetParent); | ||
|  |     } | ||
|  |     if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) { | ||
|  |       return window; | ||
|  |     } | ||
|  |     return offsetParent || getContainingBlock(element) || window; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getDimensions(element) { | ||
|  |     return getCssDimensions(element); | ||
|  |   } | ||
|  | 
 | ||
|  |   function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { | ||
|  |     let { | ||
|  |       rect, | ||
|  |       offsetParent, | ||
|  |       strategy | ||
|  |     } = _ref; | ||
|  |     const isOffsetParentAnElement = isHTMLElement(offsetParent); | ||
|  |     const documentElement = getDocumentElement(offsetParent); | ||
|  |     if (offsetParent === documentElement) { | ||
|  |       return rect; | ||
|  |     } | ||
|  |     let scroll = { | ||
|  |       scrollLeft: 0, | ||
|  |       scrollTop: 0 | ||
|  |     }; | ||
|  |     let scale = { | ||
|  |       x: 1, | ||
|  |       y: 1 | ||
|  |     }; | ||
|  |     const offsets = { | ||
|  |       x: 0, | ||
|  |       y: 0 | ||
|  |     }; | ||
|  |     if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') { | ||
|  |       if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) { | ||
|  |         scroll = getNodeScroll(offsetParent); | ||
|  |       } | ||
|  |       if (isHTMLElement(offsetParent)) { | ||
|  |         const offsetRect = getBoundingClientRect(offsetParent); | ||
|  |         scale = getScale(offsetParent); | ||
|  |         offsets.x = offsetRect.x + offsetParent.clientLeft; | ||
|  |         offsets.y = offsetRect.y + offsetParent.clientTop; | ||
|  |       } | ||
|  |       // This doesn't appear to need to be negated.
 | ||
|  |       // else if (documentElement) {
 | ||
|  |       //   offsets.x = getWindowScrollBarX(documentElement);
 | ||
|  |       // }
 | ||
|  |     } | ||
|  | 
 | ||
|  |     return { | ||
|  |       width: rect.width * scale.x, | ||
|  |       height: rect.height * scale.y, | ||
|  |       x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x, | ||
|  |       y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getViewportRect(element, strategy) { | ||
|  |     const win = getWindow(element); | ||
|  |     const html = getDocumentElement(element); | ||
|  |     const visualViewport = win.visualViewport; | ||
|  |     let width = html.clientWidth; | ||
|  |     let height = html.clientHeight; | ||
|  |     let x = 0; | ||
|  |     let y = 0; | ||
|  |     if (visualViewport) { | ||
|  |       width = visualViewport.width; | ||
|  |       height = visualViewport.height; | ||
|  |       const layoutViewport = isLayoutViewport(); | ||
|  |       if (layoutViewport || !layoutViewport && strategy === 'fixed') { | ||
|  |         x = visualViewport.offsetLeft; | ||
|  |         y = visualViewport.offsetTop; | ||
|  |       } | ||
|  |     } | ||
|  |     return { | ||
|  |       width, | ||
|  |       height, | ||
|  |       x, | ||
|  |       y | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Gets the entire size of the scrollable document area, even extending outside
 | ||
|  |   // of the `<html>` and `<body>` rect bounds if horizontally scrollable
 | ||
|  |   function getDocumentRect(element) { | ||
|  |     var _element$ownerDocumen; | ||
|  |     const html = getDocumentElement(element); | ||
|  |     const scroll = getNodeScroll(element); | ||
|  |     const body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; | ||
|  |     const width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); | ||
|  |     const height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); | ||
|  |     let x = -scroll.scrollLeft + getWindowScrollBarX(element); | ||
|  |     const y = -scroll.scrollTop; | ||
|  |     if (getComputedStyle$1(body || html).direction === 'rtl') { | ||
|  |       x += max(html.clientWidth, body ? body.clientWidth : 0) - width; | ||
|  |     } | ||
|  |     return { | ||
|  |       width, | ||
|  |       height, | ||
|  |       x, | ||
|  |       y | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   function getNearestOverflowAncestor(node) { | ||
|  |     const parentNode = getParentNode(node); | ||
|  |     if (isLastTraversableNode(parentNode)) { | ||
|  |       // @ts-ignore assume body is always available
 | ||
|  |       return node.ownerDocument.body; | ||
|  |     } | ||
|  |     if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) { | ||
|  |       return parentNode; | ||
|  |     } | ||
|  |     return getNearestOverflowAncestor(parentNode); | ||
|  |   } | ||
|  | 
 | ||
|  |   function getOverflowAncestors(node, list) { | ||
|  |     var _node$ownerDocument; | ||
|  |     if (list === void 0) { | ||
|  |       list = []; | ||
|  |     } | ||
|  |     const scrollableAncestor = getNearestOverflowAncestor(node); | ||
|  |     const isBody = scrollableAncestor === ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.body); | ||
|  |     const win = getWindow(scrollableAncestor); | ||
|  |     if (isBody) { | ||
|  |       return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : []); | ||
|  |     } | ||
|  |     return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor)); | ||
|  |   } | ||
|  | 
 | ||
|  |   // Returns the inner client rect, subtracting scrollbars if present
 | ||
|  |   function getInnerBoundingClientRect(element, strategy) { | ||
|  |     const clientRect = getBoundingClientRect(element, true, strategy === 'fixed'); | ||
|  |     const top = clientRect.top + element.clientTop; | ||
|  |     const left = clientRect.left + element.clientLeft; | ||
|  |     const scale = isHTMLElement(element) ? getScale(element) : { | ||
|  |       x: 1, | ||
|  |       y: 1 | ||
|  |     }; | ||
|  |     const width = element.clientWidth * scale.x; | ||
|  |     const height = element.clientHeight * scale.y; | ||
|  |     const x = left * scale.x; | ||
|  |     const y = top * scale.y; | ||
|  |     return { | ||
|  |       top: y, | ||
|  |       left: x, | ||
|  |       right: x + width, | ||
|  |       bottom: y + height, | ||
|  |       x, | ||
|  |       y, | ||
|  |       width, | ||
|  |       height | ||
|  |     }; | ||
|  |   } | ||
|  |   function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { | ||
|  |     if (clippingAncestor === 'viewport') { | ||
|  |       return core.rectToClientRect(getViewportRect(element, strategy)); | ||
|  |     } | ||
|  |     if (isElement(clippingAncestor)) { | ||
|  |       return getInnerBoundingClientRect(clippingAncestor, strategy); | ||
|  |     } | ||
|  |     return core.rectToClientRect(getDocumentRect(getDocumentElement(element))); | ||
|  |   } | ||
|  | 
 | ||
|  |   // A "clipping ancestor" is an `overflow` element with the characteristic of
 | ||
|  |   // clipping (or hiding) child elements. This returns all clipping ancestors
 | ||
|  |   // of the given element up the tree.
 | ||
|  |   function getClippingElementAncestors(element, cache) { | ||
|  |     const cachedResult = cache.get(element); | ||
|  |     if (cachedResult) { | ||
|  |       return cachedResult; | ||
|  |     } | ||
|  |     let result = getOverflowAncestors(element).filter(el => isElement(el) && getNodeName(el) !== 'body'); | ||
|  |     let currentContainingBlockComputedStyle = null; | ||
|  |     const elementIsFixed = getComputedStyle$1(element).position === 'fixed'; | ||
|  |     let currentNode = elementIsFixed ? getParentNode(element) : element; | ||
|  | 
 | ||
|  |     // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
 | ||
|  |     while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { | ||
|  |       const computedStyle = getComputedStyle$1(currentNode); | ||
|  |       const containingBlock = isContainingBlock(currentNode); | ||
|  |       const shouldDropCurrentNode = elementIsFixed ? !containingBlock && !currentContainingBlockComputedStyle : !containingBlock && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position); | ||
|  |       if (shouldDropCurrentNode) { | ||
|  |         // Drop non-containing blocks
 | ||
|  |         result = result.filter(ancestor => ancestor !== currentNode); | ||
|  |       } else { | ||
|  |         // Record last containing block for next iteration
 | ||
|  |         currentContainingBlockComputedStyle = computedStyle; | ||
|  |       } | ||
|  |       currentNode = getParentNode(currentNode); | ||
|  |     } | ||
|  |     cache.set(element, result); | ||
|  |     return result; | ||
|  |   } | ||
|  | 
 | ||
|  |   // Gets the maximum area that the element is visible in due to any number of
 | ||
|  |   // clipping ancestors
 | ||
|  |   function getClippingRect(_ref) { | ||
|  |     let { | ||
|  |       element, | ||
|  |       boundary, | ||
|  |       rootBoundary, | ||
|  |       strategy | ||
|  |     } = _ref; | ||
|  |     const elementClippingAncestors = boundary === 'clippingAncestors' ? getClippingElementAncestors(element, this._c) : [].concat(boundary); | ||
|  |     const clippingAncestors = [...elementClippingAncestors, rootBoundary]; | ||
|  |     const firstClippingAncestor = clippingAncestors[0]; | ||
|  |     const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => { | ||
|  |       const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy); | ||
|  |       accRect.top = max(rect.top, accRect.top); | ||
|  |       accRect.right = min(rect.right, accRect.right); | ||
|  |       accRect.bottom = min(rect.bottom, accRect.bottom); | ||
|  |       accRect.left = max(rect.left, accRect.left); | ||
|  |       return accRect; | ||
|  |     }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)); | ||
|  |     return { | ||
|  |       width: clippingRect.right - clippingRect.left, | ||
|  |       height: clippingRect.bottom - clippingRect.top, | ||
|  |       x: clippingRect.left, | ||
|  |       y: clippingRect.top | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   const platform = { | ||
|  |     getClippingRect, | ||
|  |     convertOffsetParentRelativeRectToViewportRelativeRect, | ||
|  |     isElement, | ||
|  |     getDimensions, | ||
|  |     getOffsetParent, | ||
|  |     getDocumentElement, | ||
|  |     getScale, | ||
|  |     async getElementRects(_ref) { | ||
|  |       let { | ||
|  |         reference, | ||
|  |         floating, | ||
|  |         strategy | ||
|  |       } = _ref; | ||
|  |       const getOffsetParentFn = this.getOffsetParent || getOffsetParent; | ||
|  |       const getDimensionsFn = this.getDimensions; | ||
|  |       return { | ||
|  |         reference: getRectRelativeToOffsetParent(reference, await getOffsetParentFn(floating), strategy), | ||
|  |         floating: { | ||
|  |           x: 0, | ||
|  |           y: 0, | ||
|  |           ...(await getDimensionsFn(floating)) | ||
|  |         } | ||
|  |       }; | ||
|  |     }, | ||
|  |     getClientRects: element => Array.from(element.getClientRects()), | ||
|  |     isRTL: element => getComputedStyle$1(element).direction === 'rtl' | ||
|  |   }; | ||
|  | 
 | ||
|  |   /** | ||
|  |    * Automatically updates the position of the floating element when necessary. | ||
|  |    * @see https://floating-ui.com/docs/autoUpdate
 | ||
|  |    */ | ||
|  |   function autoUpdate(reference, floating, update, options) { | ||
|  |     if (options === void 0) { | ||
|  |       options = {}; | ||
|  |     } | ||
|  |     const { | ||
|  |       ancestorScroll: _ancestorScroll = true, | ||
|  |       ancestorResize = true, | ||
|  |       elementResize = true, | ||
|  |       animationFrame = false | ||
|  |     } = options; | ||
|  |     const ancestorScroll = _ancestorScroll && !animationFrame; | ||
|  |     const ancestors = ancestorScroll || ancestorResize ? [...(isElement(reference) ? getOverflowAncestors(reference) : reference.contextElement ? getOverflowAncestors(reference.contextElement) : []), ...getOverflowAncestors(floating)] : []; | ||
|  |     ancestors.forEach(ancestor => { | ||
|  |       ancestorScroll && ancestor.addEventListener('scroll', update, { | ||
|  |         passive: true | ||
|  |       }); | ||
|  |       ancestorResize && ancestor.addEventListener('resize', update); | ||
|  |     }); | ||
|  |     let observer = null; | ||
|  |     if (elementResize) { | ||
|  |       let initialUpdate = true; | ||
|  |       observer = new ResizeObserver(() => { | ||
|  |         if (!initialUpdate) { | ||
|  |           update(); | ||
|  |         } | ||
|  |         initialUpdate = false; | ||
|  |       }); | ||
|  |       isElement(reference) && !animationFrame && observer.observe(reference); | ||
|  |       if (!isElement(reference) && reference.contextElement && !animationFrame) { | ||
|  |         observer.observe(reference.contextElement); | ||
|  |       } | ||
|  |       observer.observe(floating); | ||
|  |     } | ||
|  |     let frameId; | ||
|  |     let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null; | ||
|  |     if (animationFrame) { | ||
|  |       frameLoop(); | ||
|  |     } | ||
|  |     function frameLoop() { | ||
|  |       const nextRefRect = getBoundingClientRect(reference); | ||
|  |       if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) { | ||
|  |         update(); | ||
|  |       } | ||
|  |       prevRefRect = nextRefRect; | ||
|  |       frameId = requestAnimationFrame(frameLoop); | ||
|  |     } | ||
|  |     update(); | ||
|  |     return () => { | ||
|  |       var _observer; | ||
|  |       ancestors.forEach(ancestor => { | ||
|  |         ancestorScroll && ancestor.removeEventListener('scroll', update); | ||
|  |         ancestorResize && ancestor.removeEventListener('resize', update); | ||
|  |       }); | ||
|  |       (_observer = observer) == null ? void 0 : _observer.disconnect(); | ||
|  |       observer = null; | ||
|  |       if (animationFrame) { | ||
|  |         cancelAnimationFrame(frameId); | ||
|  |       } | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   /** | ||
|  |    * Computes the `x` and `y` coordinates that will place the floating element | ||
|  |    * next to a reference element when it is given a certain CSS positioning | ||
|  |    * strategy. | ||
|  |    */ | ||
|  |   const computePosition = (reference, floating, options) => { | ||
|  |     // This caches the expensive `getClippingElementAncestors` function so that
 | ||
|  |     // multiple lifecycle resets re-use the same result. It only lives for a
 | ||
|  |     // single call. If other functions become expensive, we can add them as well.
 | ||
|  |     const cache = new Map(); | ||
|  |     const mergedOptions = { | ||
|  |       platform, | ||
|  |       ...options | ||
|  |     }; | ||
|  |     const platformWithCache = { | ||
|  |       ...mergedOptions.platform, | ||
|  |       _c: cache | ||
|  |     }; | ||
|  |     return core.computePosition(reference, floating, { | ||
|  |       ...mergedOptions, | ||
|  |       platform: platformWithCache | ||
|  |     }); | ||
|  |   }; | ||
|  | 
 | ||
|  |   Object.defineProperty(exports, 'arrow', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.arrow; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'autoPlacement', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.autoPlacement; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'detectOverflow', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.detectOverflow; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'flip', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.flip; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'hide', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.hide; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'inline', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.inline; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'limitShift', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.limitShift; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'offset', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.offset; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'shift', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.shift; } | ||
|  |   }); | ||
|  |   Object.defineProperty(exports, 'size', { | ||
|  |     enumerable: true, | ||
|  |     get: function () { return core.size; } | ||
|  |   }); | ||
|  |   exports.autoUpdate = autoUpdate; | ||
|  |   exports.computePosition = computePosition; | ||
|  |   exports.getOverflowAncestors = getOverflowAncestors; | ||
|  |   exports.platform = platform; | ||
|  | 
 | ||
|  |   Object.defineProperty(exports, '__esModule', { value: true }); | ||
|  | 
 | ||
|  | })); |