* @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)
| 4374 | |
| 4375 | |
| 4376 | function arrow(data, options) { |
| 4377 | var _data$offsets$arrow; // arrow depends on keepTogether in order to work |
| 4378 | |
| 4379 | |
| 4380 | if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { |
| 4381 | return data; |
| 4382 | } |
| 4383 | |
| 4384 | var arrowElement = options.element; // if arrowElement is a string, suppose it's a CSS selector |
| 4385 | |
| 4386 | if (typeof arrowElement === 'string') { |
| 4387 | arrowElement = data.instance.popper.querySelector(arrowElement); // if arrowElement is not found, don't run the modifier |
| 4388 | |
| 4389 | if (!arrowElement) { |
| 4390 | return data; |
| 4391 | } |
| 4392 | } else { |
| 4393 | // if the arrowElement isn't a query selector we must check that the |
| 4394 | // provided DOM node is child of its popper node |
| 4395 | if (!data.instance.popper.contains(arrowElement)) { |
| 4396 | console.warn('WARNING: `arrow.element` must be child of its popper element!'); |
| 4397 | return data; |
| 4398 | } |
| 4399 | } |
| 4400 | |
| 4401 | var placement = data.placement.split('-')[0]; |
| 4402 | var _data$offsets = data.offsets, |
| 4403 | popper = _data$offsets.popper, |
| 4404 | reference = _data$offsets.reference; |
| 4405 | var isVertical = ['left', 'right'].indexOf(placement) !== -1; |
| 4406 | var len = isVertical ? 'height' : 'width'; |
| 4407 | var sideCapitalized = isVertical ? 'Top' : 'Left'; |
| 4408 | var side = sideCapitalized.toLowerCase(); |
| 4409 | var altSide = isVertical ? 'left' : 'top'; |
| 4410 | var opSide = isVertical ? 'bottom' : 'right'; |
| 4411 | var arrowElementSize = getOuterSizes(arrowElement)[len]; // |
| 4412 | // extends keepTogether behavior making sure the popper and its |
| 4413 | // reference have enough pixels in conjunction |
| 4414 | // |
| 4415 | // top/left side |
| 4416 | |
| 4417 | if (reference[opSide] - arrowElementSize < popper[side]) { |
| 4418 | data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); |
| 4419 | } // bottom/right side |
| 4420 | |
| 4421 | |
| 4422 | if (reference[side] + arrowElementSize > popper[opSide]) { |
| 4423 | data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; |
| 4424 | } |
| 4425 | |
| 4426 | data.offsets.popper = getClientRect(data.offsets.popper); // compute center of the popper |
| 4427 | |
| 4428 | var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; // Compute the sideValue using the updated popper offsets |
| 4429 | // take popper margin in account because we don't have this info available |
| 4430 | |
| 4431 | var css = getStyleComputedProperty(data.instance.popper); |
| 4432 | var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10); |
| 4433 | var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10); |
nothing calls this directly
no test coverage detected
searching dependent graphs…