UNPKG

@yandex/ui

Version:

Yandex UI components

61 lines (60 loc) 2.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.hide = void 0; var tslib_1 = require("tslib"); var core_1 = require("@popperjs/core"); var utils_1 = require("../utils"); /** * Модификатор, позволяющий скрыть попап, если якорь или папап находится вне видимой области. */ exports.hide = { name: 'hide', enabled: true, phase: 'main', requiresIfExists: ['preventOverflow'], fn: hideFn, }; /** * Не используем модификатор из popper, т.к. у него отсутствует возможность задать границу, * относительно которой будут производится вычисления. * Выпилить, если это поддержат в самом @popperjs/core * FIXME: 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 = core_1.detectOverflow(state, { elementContext: 'reference', boundary: boundary, }); var popperAltOverflow = core_1.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 = tslib_1.__assign(tslib_1.__assign({}, state.attributes.popper), { 'data-popper-reference-hidden': isReferenceHidden, 'data-popper-escaped': hasPopperEscaped }); } 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_1.top, utils_1.right, utils_1.bottom, utils_1.left].some(function (side) { return overflow[side] >= 0; }); }