65 lines
3.4 KiB
Plaintext
65 lines
3.4 KiB
Plaintext
import getClippingRect from "../dom-utils/getClippingRect.js";
|
|
import getDocumentElement from "../dom-utils/getDocumentElement.js";
|
|
import getBoundingClientRect from "../dom-utils/getBoundingClientRect.js";
|
|
import computeOffsets from "./computeOffsets.js";
|
|
import rectToClientRect from "./rectToClientRect.js";
|
|
import { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from "../enums.js";
|
|
import { isElement } from "../dom-utils/instanceOf.js";
|
|
import mergePaddingObject from "./mergePaddingObject.js";
|
|
import expandToHashMap from "./expandToHashMap.js"; // eslint-disable-next-line import/no-unused-modules
|
|
|
|
export default function detectOverflow(state, options) {
|
|
if (options === void 0) {
|
|
options = {};
|
|
}
|
|
|
|
var _options = options,
|
|
_options$placement = _options.placement,
|
|
placement = _options$placement === void 0 ? state.placement : _options$placement,
|
|
_options$strategy = _options.strategy,
|
|
strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,
|
|
_options$boundary = _options.boundary,
|
|
boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,
|
|
_options$rootBoundary = _options.rootBoundary,
|
|
rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,
|
|
_options$elementConte = _options.elementContext,
|
|
elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,
|
|
_options$altBoundary = _options.altBoundary,
|
|
altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,
|
|
_options$padding = _options.padding,
|
|
padding = _options$padding === void 0 ? 0 : _options$padding;
|
|
var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));
|
|
var altContext = elementContext === popper ? reference : popper;
|
|
var popperRect = state.rects.popper;
|
|
var element = state.elements[altBoundary ? altContext : elementContext];
|
|
var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
|
|
var referenceClientRect = getBoundingClientRect(state.elements.reference);
|
|
var popperOffsets = computeOffsets({
|
|
reference: referenceClientRect,
|
|
element: popperRect,
|
|
strategy: 'absolute',
|
|
placement: placement
|
|
});
|
|
var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));
|
|
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect
|
|
// 0 or negative = within the clipping rect
|
|
|
|
var overflowOffsets = {
|
|
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
|
|
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
|
|
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
|
|
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
|
|
};
|
|
var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element
|
|
|
|
if (elementContext === popper && offsetData) {
|
|
var offset = offsetData[placement];
|
|
Object.keys(overflowOffsets).forEach(function (key) {
|
|
var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
|
|
var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';
|
|
overflowOffsets[key] += offset[axis] * multiply;
|
|
});
|
|
}
|
|
|
|
return overflowOffsets;
|
|
} |