import getClientRect from '../utils/getClientRect';
/**
* Modifier used to make sure the popper is always near its reference element
* It cares only about the first axis, you can still have poppers with margin
* between the popper and its reference element.
* @method
* @memberof Modifiers
* @argument {Object} data - The data object generated by update method
* @argument {Object} options - Modifiers configuration and options
* @returns {Object} The data object, properly modified
*/
export default function keepTogether(data) {
const popper = getClientRect(data.offsets.popper);
const reference = data.offsets.reference;
const placement = data.placement.split('-')[0];
const floor = Math.floor;
const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
const side = isVertical ? 'right' : 'bottom';
const opSide = isVertical ? 'left' : 'top';
const measurement = isVertical ? 'width' : 'height';
Iif (popper[side] < floor(reference[opSide])) {
data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];
}
Iif (popper[opSide] > floor(reference[side])) {
data.offsets.popper[opSide] = floor(reference[side]);
}
return data;
}
|