UNPKG

@yandex/ui

Version:

Yandex UI components

47 lines (46 loc) 2.33 kB
import { directions } from '../directions'; import { getLayoutRect, distanceAndSkiddingToXY } from '../utils'; /** * Модификатор, устанавливающий отступы для попапа и хвостика. */ export var 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 = getLayoutRect(state.elements.arrow).width; // Смещаем хвостик на половину, т.к. он всегда должен быть вписан в квадрат, // для правильного позиционирования во всех направлениях. var _c = 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.reduce(function (acc, placement) { acc[placement] = 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; }