* @function * @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
(data, options)
| 2893 | * @returns {Object} The data object, properly modified |
| 2894 | */ |
| 2895 | function arrow(data, options) { |
| 2896 | var _data$offsets$arrow; |
| 2897 | |
| 2898 | // arrow depends on keepTogether in order to work |
| 2899 | if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { |
| 2900 | return data; |
| 2901 | } |
| 2902 | |
| 2903 | var arrowElement = options.element; |
| 2904 | |
| 2905 | // if arrowElement is a string, suppose it's a CSS selector |
| 2906 | if (typeof arrowElement === 'string') { |
| 2907 | arrowElement = data.instance.popper.querySelector(arrowElement); |
| 2908 | |
| 2909 | // if arrowElement is not found, don't run the modifier |
| 2910 | if (!arrowElement) { |
| 2911 | return data; |
| 2912 | } |
| 2913 | } else { |
| 2914 | // if the arrowElement isn't a query selector we must check that the |
| 2915 | // provided DOM node is child of its popper node |
| 2916 | if (!data.instance.popper.contains(arrowElement)) { |
| 2917 | console.warn('WARNING: `arrow.element` must be child of its popper element!'); |
| 2918 | return data; |
| 2919 | } |
| 2920 | } |
| 2921 | |
| 2922 | var placement = data.placement.split('-')[0]; |
| 2923 | var _data$offsets = data.offsets, |
| 2924 | popper = _data$offsets.popper, |
| 2925 | reference = _data$offsets.reference; |
| 2926 | |
| 2927 | var isVertical = ['left', 'right'].indexOf(placement) !== -1; |
| 2928 | |
| 2929 | var len = isVertical ? 'height' : 'width'; |
| 2930 | var sideCapitalized = isVertical ? 'Top' : 'Left'; |
| 2931 | var side = sideCapitalized.toLowerCase(); |
| 2932 | var altSide = isVertical ? 'left' : 'top'; |
| 2933 | var opSide = isVertical ? 'bottom' : 'right'; |
| 2934 | var arrowElementSize = getOuterSizes(arrowElement)[len]; |
| 2935 | |
| 2936 | // |
| 2937 | // extends keepTogether behavior making sure the popper and its |
| 2938 | // reference have enough pixels in conjunction |
| 2939 | // |
| 2940 | |
| 2941 | // top/left side |
| 2942 | if (reference[opSide] - arrowElementSize < popper[side]) { |
| 2943 | data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); |
| 2944 | } |
| 2945 | // bottom/right side |
| 2946 | if (reference[side] + arrowElementSize > popper[opSide]) { |
| 2947 | data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; |
| 2948 | } |
| 2949 | data.offsets.popper = getClientRect(data.offsets.popper); |
| 2950 | |
| 2951 | // compute center of the popper |
| 2952 | var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; |
nothing calls this directly
no test coverage detected