react-elegant-ui
Version:
Elegant UI components, made by BEM best practices for react
79 lines • 2.75 kB
JavaScript
// Imported from yandex-ui. Source: https://github.com/bem/yandex-ui/
var __assign = this && this.__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);
};
import { detectOverflow } from '@popperjs/core';
import { top, bottom, left, right } from '../utils';
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 [top, right, bottom, 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 = detectOverflow(state, {
elementContext: 'reference',
boundary: boundary
});
var popperAltOverflow = 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
*/
export var hide = {
name: 'hide',
enabled: true,
phase: 'main',
requiresIfExists: ['preventOverflow'],
fn: hideFn
};