diff options
Diffstat (limited to 'popperjs/package/dist/esm/utils/detectOverflow.js')
-rw-r--r-- | popperjs/package/dist/esm/utils/detectOverflow.js | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/popperjs/package/dist/esm/utils/detectOverflow.js b/popperjs/package/dist/esm/utils/detectOverflow.js new file mode 100644 index 0000000..493b8f9 --- /dev/null +++ b/popperjs/package/dist/esm/utils/detectOverflow.js @@ -0,0 +1,63 @@ +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$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); + 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; +}
\ No newline at end of file |