react-elegant-ui
Version:
Elegant UI components, made by BEM best practices for react
85 lines (84 loc) • 2.89 kB
JavaScript
;
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
};