UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

120 lines (93 loc) 4.06 kB
'use strict'; var _extends = require('babel-runtime/helpers/extends')['default']; var _interopRequireDefault = require('babel-runtime/helpers/interop-require-default')['default']; exports.__esModule = true; var _domUtils = require('./domUtils'); var _domUtils2 = _interopRequireDefault(_domUtils); var utils = { getContainerDimensions: function getContainerDimensions(containerNode) { var size = undefined, scroll = undefined; if (containerNode.tagName === 'BODY') { size = { width: window.innerWidth, height: window.innerHeight }; scroll = _domUtils2['default'].ownerDocument(containerNode).documentElement.scrollTop || containerNode.scrollTop; } else { size = _domUtils2['default'].getSize(containerNode); scroll = containerNode.scrollTop; } return _extends({}, size, { scroll: scroll }); }, getPosition: function getPosition(target, container) { var offset = container.tagName === 'BODY' ? _domUtils2['default'].getOffset(target) : _domUtils2['default'].getPosition(target, container); var size = _domUtils2['default'].getSize(target); return _extends({}, offset, size); }, calcOverlayPosition: function calcOverlayPosition(placement, overlayNode, target, container, padding) { var childOffset = utils.getPosition(target, container); var _domUtils$getSize = _domUtils2['default'].getSize(overlayNode); var overlayHeight = _domUtils$getSize.height; var overlayWidth = _domUtils$getSize.width; var positionLeft = undefined, positionTop = undefined, arrowOffsetLeft = undefined, arrowOffsetTop = undefined; if (placement === 'left' || placement === 'right') { positionTop = childOffset.top + (childOffset.height - overlayHeight) / 2; if (placement === 'left') { positionLeft = childOffset.left - overlayWidth; } else { positionLeft = childOffset.left + childOffset.width; } var topDelta = getTopDelta(positionTop, overlayHeight, container, padding); positionTop += topDelta; arrowOffsetTop = 50 * (1 - 2 * topDelta / overlayHeight) + '%'; arrowOffsetLeft = null; } else if (placement === 'top' || placement === 'bottom') { positionLeft = childOffset.left + (childOffset.width - overlayWidth) / 2; if (placement === 'top') { positionTop = childOffset.top - overlayHeight; } else { positionTop = childOffset.top + childOffset.height; } var leftDelta = getLeftDelta(positionLeft, overlayWidth, container, padding); positionLeft += leftDelta; arrowOffsetLeft = 50 * (1 - 2 * leftDelta / overlayWidth) + '%'; arrowOffsetTop = null; } else { throw new Error('calcOverlayPosition(): No such placement of "' + placement + '" found.'); } return { positionLeft: positionLeft, positionTop: positionTop, arrowOffsetLeft: arrowOffsetLeft, arrowOffsetTop: arrowOffsetTop }; } }; function getTopDelta(top, overlayHeight, container, padding) { var containerDimensions = utils.getContainerDimensions(container); var containerScroll = containerDimensions.scroll; var containerHeight = containerDimensions.height; var topEdgeOffset = top - padding - containerScroll; var bottomEdgeOffset = top + padding - containerScroll + overlayHeight; if (topEdgeOffset < 0) { return -topEdgeOffset; } else if (bottomEdgeOffset > containerHeight) { return containerHeight - bottomEdgeOffset; } else { return 0; } } function getLeftDelta(left, overlayWidth, container, padding) { var containerDimensions = utils.getContainerDimensions(container); var containerWidth = containerDimensions.width; var leftEdgeOffset = left - padding; var rightEdgeOffset = left + padding + overlayWidth; if (leftEdgeOffset < 0) { return -leftEdgeOffset; } else if (rightEdgeOffset > containerWidth) { return containerWidth - rightEdgeOffset; } else { return 0; } } exports['default'] = utils; module.exports = exports['default'];