UNPKG

react-elegant-ui

Version:

Elegant UI components, made by BEM best practices for react

85 lines (84 loc) 2.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.hide = void 0; var _core = require("@popperjs/core"); var _utils = require("../utils"); // Imported from yandex-ui. Source: https://github.com/bem/yandex-ui/ var __assign = void 0 && (void 0).__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function getSideOffsets(overflow, rect, preventedOffsets) { if (preventedOffsets === void 0) { preventedOffsets = { x: 0, y: 0 }; } return { top: overflow.top - rect.height - preventedOffsets.y, right: overflow.right - rect.width + preventedOffsets.x, bottom: overflow.bottom - rect.height + preventedOffsets.y, left: overflow.left - rect.width - preventedOffsets.x }; } function isAnySideFullyClipped(overflow) { return [_utils.top, _utils.right, _utils.bottom, _utils.left].some(function (side) { return overflow[side] >= 0; }); } /** * Use it such as default modifier "hide" is not support some option for specify boundary * * This can be replace to default implementation in the future if it will support `boundary` option * Original issue: https://github.com/popperjs/popper-core/issues/1252 */ function hideFn(_a) { var state = _a.state, name = _a.name, options = _a.options; var boundary = options.boundary; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var preventedOffsets = state.modifiersData.preventOverflow; var referenceOverflow = (0, _core.detectOverflow)(state, { elementContext: 'reference', boundary: boundary }); var popperAltOverflow = (0, _core.detectOverflow)(state, { altBoundary: true, boundary: boundary }); var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); state.modifiersData[name] = { referenceClippingOffsets: referenceClippingOffsets, popperEscapeOffsets: popperEscapeOffsets, isReferenceHidden: isReferenceHidden, hasPopperEscaped: hasPopperEscaped }; state.attributes.popper = __assign(__assign({}, state.attributes.popper), { 'data-popper-reference-hidden': isReferenceHidden, 'data-popper-escaped': hasPopperEscaped }); } /** * Modifier to hide popup when reference or popup is out of viewport */ var hide = exports.hide = { name: 'hide', enabled: true, phase: 'main', requiresIfExists: ['preventOverflow'], fn: hideFn };