@yandex/ui
Version:
Yandex UI components
50 lines (49 loc) • 2.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.offset = void 0;
var directions_1 = require("../directions");
var utils_1 = require("../utils");
/**
* Модификатор, устанавливающий отступы для попапа и хвостика.
*/
exports.offset = {
name: 'offset',
enabled: true,
fn: offsetFn,
phase: 'main',
requires: ['popperOffsets'],
};
// Не используем offset из popper, т.к. нам необходимо
// применить дополнительное смещение с учетом хвостика, а также
// округлить значения для правильного выравнивания.
function offsetFn(_a) {
var state = _a.state, options = _a.options;
var _b = options.offset, offset = _b === void 0 ? [0, 0] : _b, tailOffset = options.tailOffset;
if (state.modifiersData.arrow && tailOffset) {
if (state.modifiersData.arrow.x) {
state.modifiersData.arrow.x += tailOffset;
}
if (state.modifiersData.arrow.y) {
state.modifiersData.arrow.y += tailOffset;
}
}
if (state.modifiersData.popperOffsets && state.elements.arrow) {
var width = utils_1.getLayoutRect(state.elements.arrow).width;
// Смещаем хвостик на половину, т.к. он всегда должен быть вписан в квадрат,
// для правильного позиционирования во всех направлениях.
var _c = utils_1.distanceAndSkiddingToXY(state.placement, [0, width / 2]), x_1 = _c.x, y_1 = _c.y;
state.modifiersData.popperOffsets.x += x_1;
state.modifiersData.popperOffsets.y += y_1;
}
var data = directions_1.directions.reduce(function (acc, placement) {
acc[placement] = utils_1.distanceAndSkiddingToXY(placement, offset);
return acc;
}, {});
var _d = data[state.placement], x = _d.x, y = _d.y;
if (state.modifiersData.popperOffsets) {
state.modifiersData.popperOffsets.x = Math.ceil(state.modifiersData.popperOffsets.x + x);
state.modifiersData.popperOffsets.y = Math.ceil(state.modifiersData.popperOffsets.y + y);
}
// Записываем данные для дальнейшего использования в detectOverflow.
state.modifiersData.offset = data;
}