react-bootstrap
Version:
Bootstrap 3 components build with React
120 lines (93 loc) • 4.06 kB
JavaScript
;
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'];