|
(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'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
const min = Math.min; |
|
const max = Math.max; |
|
const round = Math.round; |
|
const floor = Math.floor; |
|
const createCoords = v => ({ |
|
x: v, |
|
y: v |
|
}); |
|
|
|
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) { |
|
return value instanceof Node || value instanceof getWindow(value).Node; |
|
} |
|
function isElement(value) { |
|
return value instanceof Element || value instanceof getWindow(value).Element; |
|
} |
|
function isHTMLElement(value) { |
|
return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement; |
|
} |
|
function isShadowRoot(value) { |
|
|
|
if (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 isContainingBlock(element) { |
|
const webkit = isWebKit(); |
|
const css = getComputedStyle(element); |
|
|
|
|
|
return css.transform !== 'none' || css.perspective !== 'none' || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', '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; |
|
} |
|
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.pageXOffset, |
|
scrollTop: element.pageYOffset |
|
}; |
|
} |
|
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) { |
|
return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], win.frameElement && traverseIframes ? getOverflowAncestors(win.frameElement) : []); |
|
} |
|
return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes)); |
|
} |
|
|
|
function getCssDimensions(element) { |
|
const css = getComputedStyle(element); |
|
|
|
|
|
let width = parseFloat(css.width) || 0; |
|
let height = parseFloat(css.height) || 0; |
|
const hasOffset = isHTMLElement(element); |
|
const offsetWidth = hasOffset ? element.offsetWidth : width; |
|
const offsetHeight = hasOffset ? element.offsetHeight : height; |
|
const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight; |
|
if (shouldFallback) { |
|
width = offsetWidth; |
|
height = offsetHeight; |
|
} |
|
return { |
|
width, |
|
height, |
|
$: shouldFallback |
|
}; |
|
} |
|
|
|
function unwrapElement(element) { |
|
return !isElement(element) ? element.contextElement : element; |
|
} |
|
|
|
function getScale(element) { |
|
const domElement = unwrapElement(element); |
|
if (!isHTMLElement(domElement)) { |
|
return createCoords(1); |
|
} |
|
const rect = domElement.getBoundingClientRect(); |
|
const { |
|
width, |
|
height, |
|
$ |
|
} = getCssDimensions(domElement); |
|
let x = ($ ? round(rect.width) : rect.width) / width; |
|
let y = ($ ? round(rect.height) : rect.height) / height; |
|
|
|
|
|
|
|
if (!x || !Number.isFinite(x)) { |
|
x = 1; |
|
} |
|
if (!y || !Number.isFinite(y)) { |
|
y = 1; |
|
} |
|
return { |
|
x, |
|
y |
|
}; |
|
} |
|
|
|
const noOffsets = createCoords(0); |
|
function getVisualOffsets(element) { |
|
const win = getWindow(element); |
|
if (!isWebKit() || !win.visualViewport) { |
|
return noOffsets; |
|
} |
|
return { |
|
x: win.visualViewport.offsetLeft, |
|
y: win.visualViewport.offsetTop |
|
}; |
|
} |
|
function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) { |
|
if (isFixed === void 0) { |
|
isFixed = false; |
|
} |
|
if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) { |
|
return false; |
|
} |
|
return isFixed; |
|
} |
|
|
|
function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) { |
|
if (includeScale === void 0) { |
|
includeScale = false; |
|
} |
|
if (isFixedStrategy === void 0) { |
|
isFixedStrategy = false; |
|
} |
|
const clientRect = element.getBoundingClientRect(); |
|
const domElement = unwrapElement(element); |
|
let scale = createCoords(1); |
|
if (includeScale) { |
|
if (offsetParent) { |
|
if (isElement(offsetParent)) { |
|
scale = getScale(offsetParent); |
|
} |
|
} else { |
|
scale = getScale(element); |
|
} |
|
} |
|
const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0); |
|
let x = (clientRect.left + visualOffsets.x) / scale.x; |
|
let y = (clientRect.top + visualOffsets.y) / 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 currentWin = win; |
|
let currentIFrame = currentWin.frameElement; |
|
while (currentIFrame && offsetParent && offsetWin !== currentWin) { |
|
const iframeScale = getScale(currentIFrame); |
|
const iframeRect = currentIFrame.getBoundingClientRect(); |
|
const css = getComputedStyle(currentIFrame); |
|
const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x; |
|
const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y; |
|
x *= iframeScale.x; |
|
y *= iframeScale.y; |
|
width *= iframeScale.x; |
|
height *= iframeScale.y; |
|
x += left; |
|
y += top; |
|
currentWin = getWindow(currentIFrame); |
|
currentIFrame = currentWin.frameElement; |
|
} |
|
} |
|
return core.rectToClientRect({ |
|
width, |
|
height, |
|
x, |
|
y |
|
}); |
|
} |
|
|
|
const topLayerSelectors = [':popover-open', ':modal']; |
|
function isTopLayer(floating) { |
|
return topLayerSelectors.some(selector => { |
|
try { |
|
return floating.matches(selector); |
|
} catch (e) { |
|
return false; |
|
} |
|
}); |
|
} |
|
|
|
function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) { |
|
let { |
|
elements, |
|
rect, |
|
offsetParent, |
|
strategy |
|
} = _ref; |
|
const isFixed = strategy === 'fixed'; |
|
const documentElement = getDocumentElement(offsetParent); |
|
const topLayer = elements ? isTopLayer(elements.floating) : false; |
|
if (offsetParent === documentElement || topLayer && isFixed) { |
|
return rect; |
|
} |
|
let scroll = { |
|
scrollLeft: 0, |
|
scrollTop: 0 |
|
}; |
|
let scale = createCoords(1); |
|
const offsets = createCoords(0); |
|
const isOffsetParentAnElement = isHTMLElement(offsetParent); |
|
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { |
|
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; |
|
} |
|
} |
|
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 getClientRects(element) { |
|
return Array.from(element.getClientRects()); |
|
} |
|
|
|
function getWindowScrollBarX(element) { |
|
|
|
|
|
return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft; |
|
} |
|
|
|
|
|
|
|
function getDocumentRect(element) { |
|
const html = getDocumentElement(element); |
|
const scroll = getNodeScroll(element); |
|
const body = element.ownerDocument.body; |
|
const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth); |
|
const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight); |
|
let x = -scroll.scrollLeft + getWindowScrollBarX(element); |
|
const y = -scroll.scrollTop; |
|
if (getComputedStyle(body).direction === 'rtl') { |
|
x += max(html.clientWidth, body.clientWidth) - width; |
|
} |
|
return { |
|
width, |
|
height, |
|
x, |
|
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 visualViewportBased = isWebKit(); |
|
if (!visualViewportBased || visualViewportBased && strategy === 'fixed') { |
|
x = visualViewport.offsetLeft; |
|
y = visualViewport.offsetTop; |
|
} |
|
} |
|
return { |
|
width, |
|
height, |
|
x, |
|
y |
|
}; |
|
} |
|
|
|
|
|
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) : createCoords(1); |
|
const width = element.clientWidth * scale.x; |
|
const height = element.clientHeight * scale.y; |
|
const x = left * scale.x; |
|
const y = top * scale.y; |
|
return { |
|
width, |
|
height, |
|
x, |
|
y |
|
}; |
|
} |
|
function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) { |
|
let rect; |
|
if (clippingAncestor === 'viewport') { |
|
rect = getViewportRect(element, strategy); |
|
} else if (clippingAncestor === 'document') { |
|
rect = getDocumentRect(getDocumentElement(element)); |
|
} else if (isElement(clippingAncestor)) { |
|
rect = getInnerBoundingClientRect(clippingAncestor, strategy); |
|
} else { |
|
const visualOffsets = getVisualOffsets(element); |
|
rect = { |
|
...clippingAncestor, |
|
x: clippingAncestor.x - visualOffsets.x, |
|
y: clippingAncestor.y - visualOffsets.y |
|
}; |
|
} |
|
return core.rectToClientRect(rect); |
|
} |
|
function hasFixedPositionAncestor(element, stopNode) { |
|
const parentNode = getParentNode(element); |
|
if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) { |
|
return false; |
|
} |
|
return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode); |
|
} |
|
|
|
|
|
|
|
|
|
function getClippingElementAncestors(element, cache) { |
|
const cachedResult = cache.get(element); |
|
if (cachedResult) { |
|
return cachedResult; |
|
} |
|
let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body'); |
|
let currentContainingBlockComputedStyle = null; |
|
const elementIsFixed = getComputedStyle(element).position === 'fixed'; |
|
let currentNode = elementIsFixed ? getParentNode(element) : element; |
|
|
|
|
|
while (isElement(currentNode) && !isLastTraversableNode(currentNode)) { |
|
const computedStyle = getComputedStyle(currentNode); |
|
const currentNodeIsContaining = isContainingBlock(currentNode); |
|
if (!currentNodeIsContaining && computedStyle.position === 'fixed') { |
|
currentContainingBlockComputedStyle = null; |
|
} |
|
const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode); |
|
if (shouldDropCurrentNode) { |
|
|
|
result = result.filter(ancestor => ancestor !== currentNode); |
|
} else { |
|
|
|
currentContainingBlockComputedStyle = computedStyle; |
|
} |
|
currentNode = getParentNode(currentNode); |
|
} |
|
cache.set(element, result); |
|
return result; |
|
} |
|
|
|
|
|
|
|
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 |
|
}; |
|
} |
|
|
|
function getDimensions(element) { |
|
const { |
|
width, |
|
height |
|
} = getCssDimensions(element); |
|
return { |
|
width, |
|
height |
|
}; |
|
} |
|
|
|
function getRectRelativeToOffsetParent(element, offsetParent, strategy) { |
|
const isOffsetParentAnElement = isHTMLElement(offsetParent); |
|
const documentElement = getDocumentElement(offsetParent); |
|
const isFixed = strategy === 'fixed'; |
|
const rect = getBoundingClientRect(element, true, isFixed, offsetParent); |
|
let scroll = { |
|
scrollLeft: 0, |
|
scrollTop: 0 |
|
}; |
|
const offsets = createCoords(0); |
|
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { |
|
if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) { |
|
scroll = getNodeScroll(offsetParent); |
|
} |
|
if (isOffsetParentAnElement) { |
|
const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent); |
|
offsets.x = offsetRect.x + offsetParent.clientLeft; |
|
offsets.y = offsetRect.y + offsetParent.clientTop; |
|
} else if (documentElement) { |
|
offsets.x = getWindowScrollBarX(documentElement); |
|
} |
|
} |
|
const x = rect.left + scroll.scrollLeft - offsets.x; |
|
const y = rect.top + scroll.scrollTop - offsets.y; |
|
return { |
|
x, |
|
y, |
|
width: rect.width, |
|
height: rect.height |
|
}; |
|
} |
|
|
|
function getTrueOffsetParent(element, polyfill) { |
|
if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') { |
|
return null; |
|
} |
|
if (polyfill) { |
|
return polyfill(element); |
|
} |
|
return element.offsetParent; |
|
} |
|
|
|
|
|
|
|
function getOffsetParent(element, polyfill) { |
|
const window = getWindow(element); |
|
if (!isHTMLElement(element) || isTopLayer(element)) { |
|
return window; |
|
} |
|
let offsetParent = getTrueOffsetParent(element, polyfill); |
|
while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') { |
|
offsetParent = getTrueOffsetParent(offsetParent, polyfill); |
|
} |
|
if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) { |
|
return window; |
|
} |
|
return offsetParent || getContainingBlock(element) || window; |
|
} |
|
|
|
const getElementRects = async function (data) { |
|
const getOffsetParentFn = this.getOffsetParent || getOffsetParent; |
|
const getDimensionsFn = this.getDimensions; |
|
return { |
|
reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy), |
|
floating: { |
|
x: 0, |
|
y: 0, |
|
...(await getDimensionsFn(data.floating)) |
|
} |
|
}; |
|
}; |
|
|
|
function isRTL(element) { |
|
return getComputedStyle(element).direction === 'rtl'; |
|
} |
|
|
|
const platform = { |
|
convertOffsetParentRelativeRectToViewportRelativeRect, |
|
getDocumentElement, |
|
getClippingRect, |
|
getOffsetParent, |
|
getElementRects, |
|
getClientRects, |
|
getDimensions, |
|
getScale, |
|
isElement, |
|
isRTL |
|
}; |
|
|
|
|
|
function observeMove(element, onMove) { |
|
let io = null; |
|
let timeoutId; |
|
const root = getDocumentElement(element); |
|
function cleanup() { |
|
var _io; |
|
clearTimeout(timeoutId); |
|
(_io = io) == null || _io.disconnect(); |
|
io = null; |
|
} |
|
function refresh(skip, threshold) { |
|
if (skip === void 0) { |
|
skip = false; |
|
} |
|
if (threshold === void 0) { |
|
threshold = 1; |
|
} |
|
cleanup(); |
|
const { |
|
left, |
|
top, |
|
width, |
|
height |
|
} = element.getBoundingClientRect(); |
|
if (!skip) { |
|
onMove(); |
|
} |
|
if (!width || !height) { |
|
return; |
|
} |
|
const insetTop = floor(top); |
|
const insetRight = floor(root.clientWidth - (left + width)); |
|
const insetBottom = floor(root.clientHeight - (top + height)); |
|
const insetLeft = floor(left); |
|
const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px"; |
|
const options = { |
|
rootMargin, |
|
threshold: max(0, min(1, threshold)) || 1 |
|
}; |
|
let isFirstUpdate = true; |
|
function handleObserve(entries) { |
|
const ratio = entries[0].intersectionRatio; |
|
if (ratio !== threshold) { |
|
if (!isFirstUpdate) { |
|
return refresh(); |
|
} |
|
if (!ratio) { |
|
timeoutId = setTimeout(() => { |
|
refresh(false, 1e-7); |
|
}, 100); |
|
} else { |
|
refresh(false, ratio); |
|
} |
|
} |
|
isFirstUpdate = false; |
|
} |
|
|
|
|
|
|
|
try { |
|
io = new IntersectionObserver(handleObserve, { |
|
...options, |
|
|
|
root: root.ownerDocument |
|
}); |
|
} catch (e) { |
|
io = new IntersectionObserver(handleObserve, options); |
|
} |
|
io.observe(element); |
|
} |
|
refresh(true); |
|
return cleanup; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function autoUpdate(reference, floating, update, options) { |
|
if (options === void 0) { |
|
options = {}; |
|
} |
|
const { |
|
ancestorScroll = true, |
|
ancestorResize = true, |
|
elementResize = typeof ResizeObserver === 'function', |
|
layoutShift = typeof IntersectionObserver === 'function', |
|
animationFrame = false |
|
} = options; |
|
const referenceEl = unwrapElement(reference); |
|
const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : []; |
|
ancestors.forEach(ancestor => { |
|
ancestorScroll && ancestor.addEventListener('scroll', update, { |
|
passive: true |
|
}); |
|
ancestorResize && ancestor.addEventListener('resize', update); |
|
}); |
|
const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null; |
|
let reobserveFrame = -1; |
|
let resizeObserver = null; |
|
if (elementResize) { |
|
resizeObserver = new ResizeObserver(_ref => { |
|
let [firstEntry] = _ref; |
|
if (firstEntry && firstEntry.target === referenceEl && resizeObserver) { |
|
|
|
|
|
resizeObserver.unobserve(floating); |
|
cancelAnimationFrame(reobserveFrame); |
|
reobserveFrame = requestAnimationFrame(() => { |
|
var _resizeObserver; |
|
(_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating); |
|
}); |
|
} |
|
update(); |
|
}); |
|
if (referenceEl && !animationFrame) { |
|
resizeObserver.observe(referenceEl); |
|
} |
|
resizeObserver.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 _resizeObserver2; |
|
ancestors.forEach(ancestor => { |
|
ancestorScroll && ancestor.removeEventListener('scroll', update); |
|
ancestorResize && ancestor.removeEventListener('resize', update); |
|
}); |
|
cleanupIo == null || cleanupIo(); |
|
(_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect(); |
|
resizeObserver = null; |
|
if (animationFrame) { |
|
cancelAnimationFrame(frameId); |
|
} |
|
}; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const autoPlacement = core.autoPlacement; |
|
|
|
|
|
|
|
|
|
|
|
|
|
const shift = core.shift; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const flip = core.flip; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const size = core.size; |
|
|
|
|
|
|
|
|
|
|
|
|
|
const hide = core.hide; |
|
|
|
|
|
|
|
|
|
|
|
|
|
const arrow = core.arrow; |
|
|
|
|
|
|
|
|
|
|
|
|
|
const inline = core.inline; |
|
|
|
|
|
|
|
|
|
const limitShift = core.limitShift; |
|
|
|
|
|
|
|
|
|
|
|
const computePosition = (reference, floating, options) => { |
|
|
|
|
|
|
|
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, "detectOverflow", { |
|
enumerable: true, |
|
get: function () { return core.detectOverflow; } |
|
}); |
|
Object.defineProperty(exports, "offset", { |
|
enumerable: true, |
|
get: function () { return core.offset; } |
|
}); |
|
exports.arrow = arrow; |
|
exports.autoPlacement = autoPlacement; |
|
exports.autoUpdate = autoUpdate; |
|
exports.computePosition = computePosition; |
|
exports.flip = flip; |
|
exports.getOverflowAncestors = getOverflowAncestors; |
|
exports.hide = hide; |
|
exports.inline = inline; |
|
exports.limitShift = limitShift; |
|
exports.platform = platform; |
|
exports.shift = shift; |
|
exports.size = size; |
|
|
|
})); |
|
|