all files / popper/utils/ getPopperOffsets.js

100% Statements 13/13
100% Branches 10/10
100% Functions 1/1
100% Lines 13/13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41                        125×     125×     125×             125× 125× 125× 125× 125×   125× 125× 57×   68×     125×    
import getOuterSizes from './getOuterSizes';
import getOppositePlacement from './getOppositePlacement';
 
/**
 * Get offsets to the popper
 * @method
 * @memberof Popper.Utils
 * @param {Element} popper - the popper element
 * @param {Element} reference - the reference element (the popper will be relative to this)
 * @returns {Object} An object containing the offsets which will be applied to the popper
 */
export default function getPopperOffsets(state, popper, referenceOffsets, placement) {
    placement = placement.split('-')[0];
 
    // Get popper node sizes
    const popperRect = getOuterSizes(popper);
 
    // Add position, width and height to our offsets object
    const popperOffsets = {
        position: state.position,
        width: popperRect.width,
        height: popperRect.height,
    };
 
    // depending by the popper placement we have to compute its offsets slightly differently
    const isHoriz = ['right', 'left'].indexOf(placement) !== -1;
    const mainSide = isHoriz ? 'top' : 'left';
    const secondarySide = isHoriz ? 'left' : 'top';
    const measurement = isHoriz ? 'height' : 'width';
    const secondaryMeasurement = !isHoriz ? 'height' : 'width';
 
    popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
    if (placement === secondarySide) {
        popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
    } else {
        popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
    }
 
    return popperOffsets;
}