UNPKG

@zohodesk/components

Version:

In this Package, we Provide Some Basic Components to Build Web App

368 lines (350 loc) • 14.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var defaultOrder = ['bottomCenter', 'bottomLeftToRight', 'bottomCenterToRight', 'bottomRightToLeft', 'bottomCenterToLeft', 'topCenter', 'topLeftToRight', 'topCenterToRight', 'topRightToLeft', 'topCenterToLeft', 'rightTopToBottom', 'rightCenterToBottom', 'rightCenter', 'rightBottomToTop', 'rightCenterToTop', 'leftTopToBottom', 'leftCenterToBottom', 'leftCenter', 'leftBottomToTop', 'leftCenterToTop', 'bottomRight', 'bottomLeft', 'topRight', 'topLeft', 'rightBottom', 'rightTop', 'leftBottom', 'leftTop']; var viewPort = { frameRelativeRects: function frameRelativeRects(el, customFrame, documentEle) { if (!el) { return; } var rectTemp = el.getBoundingClientRect(); var rect = { height: rectTemp.height || el.clientHeight, width: rectTemp.width || el.clientWidth, top: rectTemp.top, bottom: rectTemp.bottom, left: rectTemp.left, right: rectTemp.right, x: rectTemp.x, y: rectTemp.y }; documentEle = documentEle ? documentEle : document.documentElement; var customFrameRect = { top: 0, left: 0, right: documentEle.clientWidth, bottom: documentEle.clientHeight, height: documentEle.clientHeight, width: documentEle.clientWidth, x: 0, y: 0 }; if (customFrame) { customFrameRect = customFrame.getBoundingClientRect(); } var newRect = { top: rect.top - customFrameRect.top, left: rect.left - customFrameRect.left, height: rect.height, width: rect.width }; newRect.bottom = newRect.top + newRect.height; newRect.right = newRect.left + newRect.width; newRect.x = newRect.left; newRect.y = newRect.top; var rectGap = { top: newRect.top, left: newRect.left, bottom: customFrameRect.height - newRect.bottom, right: customFrameRect.width - newRect.right }; rectGap.center = { top: rectGap.top + newRect.height / 2, left: rectGap.left + newRect.width / 2, bottom: rectGap.bottom + newRect.height / 2, right: rectGap.right + newRect.width / 2 }; return { frameRect: customFrameRect, rect: newRect, rectGap: rectGap }; }, isInViewPort: function isInViewPort(el, customFrame) { if (!el) { return; } var elRects = viewPort.frameRelativeRects(el, customFrame); var rect = elRects.rect; var frameRect = elRects.frameRect; return rect.top >= 0 && rect.left >= 0 && rect.bottom <= frameRect.height && rect.right <= frameRect.width; }, getViewPortEle: function getViewPortEle(el) { return el.closest('[data-viewport-container=true]') ? el.closest('[data-viewport-container=true]') : document.documentElement; }, possibilities: function possibilities(el, relativeBox, customFrame) { var _ref = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, needArrow = _ref.needArrow, isAbsolute = _ref.isAbsolute; if (!el) { return; } var elViewPortEle = viewPort.getViewPortEle(el); var elRects = viewPort.frameRelativeRects(el, customFrame, elViewPortEle); var rect = elRects.rect; var relativeBoxViewPortEle = viewPort.getViewPortEle(relativeBox); var relativeBoxRects = viewPort.frameRelativeRects(relativeBox, customFrame, relativeBoxViewPortEle); var relativeBoxGap = relativeBoxRects.rectGap, relativeBoxRect = relativeBoxRects.rect; var relativeBoxDocumentRects = viewPort.frameRelativeRects(relativeBox, customFrame); var documentGap = relativeBoxDocumentRects.rectGap; //rect => PopOverContainer, relativeBoxGap => PopOverTarget //Horizontal ~ ----- X axis //Vertical ~ ||||||| Y axis var paddingSpace = 5; // space between target and relative element var arrowSize = needArrow ? 10 : 0; rect.height = rect.height + (needArrow ? arrowSize : paddingSpace); rect.width = rect.width + (needArrow ? arrowSize : paddingSpace); var arrowHorizontalBalancePx = !isAbsolute && needArrow ? 30 : 0; var arrowVerticalBalancePx = !isAbsolute && needArrow ? 27 : 0; var bottomOverFlow = rect.height > relativeBoxGap.bottom; var topOverFlow = rect.height > relativeBoxGap.top; var rightOverFlow = rect.width > relativeBoxGap.right; var leftOverFlow = rect.width > relativeBoxGap.left; var horizontalCenterOverFlow = rect.width / 2 > relativeBoxGap.center.right || rect.width / 2 > relativeBoxGap.center.left; var verticalCenterOverFlow = rect.height / 2 > relativeBoxGap.center.top || rect.height / 2 > relativeBoxGap.center.bottom; var horizontalLeftToRightOverFlow = rect.width > relativeBoxRect.width + relativeBoxGap.right; var horizontalCenterToRightOverFlow = rect.width > relativeBoxGap.center.right || arrowHorizontalBalancePx > relativeBoxGap.center.left; var horizontalRightToLeft = rect.width > relativeBoxRect.width + relativeBoxGap.left; var horizontalCenterToLeft = rect.width > relativeBoxGap.center.left || arrowHorizontalBalancePx > relativeBoxGap.center.right; var verticalTopToBottomOverFlow = rect.height > relativeBoxRect.height + relativeBoxGap.bottom; var verticalCenterToBottomOverFlow = rect.height > relativeBoxGap.center.bottom || arrowVerticalBalancePx > relativeBoxGap.center.top; var verticalBottomToTopOverFlow = rect.height > relativeBoxRect.height + relativeBoxGap.top; var verticalCenterToTopOverFlow = rect.height > relativeBoxGap.center.top || arrowVerticalBalancePx > relativeBoxGap.center.bottom; var views = { bottomCenter: !(bottomOverFlow || horizontalCenterOverFlow), bottomLeftToRight: !(bottomOverFlow || horizontalLeftToRightOverFlow), bottomCenterToRight: !(bottomOverFlow || horizontalCenterToRightOverFlow), bottomRight: !(bottomOverFlow || rightOverFlow || arrowHorizontalBalancePx > relativeBoxRect.right), bottomRightToLeft: !(bottomOverFlow || horizontalRightToLeft), bottomCenterToLeft: !(bottomOverFlow || horizontalCenterToLeft), bottomLeft: !(bottomOverFlow || leftOverFlow || arrowHorizontalBalancePx > relativeBoxGap.right + relativeBoxRect.width), topCenter: !(topOverFlow || horizontalCenterOverFlow), topLeftToRight: !(topOverFlow || horizontalLeftToRightOverFlow), topCenterToRight: !(topOverFlow || horizontalCenterToRightOverFlow), topRight: !(topOverFlow || rightOverFlow || arrowHorizontalBalancePx > relativeBoxRect.right), topRightToLeft: !(topOverFlow || horizontalRightToLeft), topCenterToLeft: !(topOverFlow || horizontalCenterToLeft), topLeft: !(topOverFlow || leftOverFlow || arrowHorizontalBalancePx > relativeBoxGap.right + relativeBoxRect.width), rightCenter: !(rightOverFlow || verticalCenterOverFlow), rightTopToBottom: !(rightOverFlow || verticalTopToBottomOverFlow), rightCenterToBottom: !(rightOverFlow || verticalCenterToBottomOverFlow), rightBottom: !(rightOverFlow || bottomOverFlow || arrowVerticalBalancePx > relativeBoxRect.bottom), rightBottomToTop: !(rightOverFlow || verticalBottomToTopOverFlow), rightCenterToTop: !(rightOverFlow || verticalCenterToTopOverFlow), rightTop: !(rightOverFlow || topOverFlow || arrowVerticalBalancePx > relativeBoxGap.bottom + relativeBoxRect.height), leftCenter: !(leftOverFlow || verticalCenterOverFlow), leftTopToBottom: !(leftOverFlow || verticalTopToBottomOverFlow), leftCenterToBottom: !(leftOverFlow || verticalCenterToBottomOverFlow), leftBottom: !(leftOverFlow || bottomOverFlow || arrowVerticalBalancePx > relativeBoxRect.bottom), leftBottomToTop: !(leftOverFlow || verticalBottomToTopOverFlow), leftCenterToTop: !(leftOverFlow || verticalCenterToTopOverFlow), leftTop: !(leftOverFlow || topOverFlow || arrowVerticalBalancePx > relativeBoxGap.bottom + relativeBoxRect.height) }; var horizontalCenter = relativeBoxGap.left + relativeBoxRect.width / 2; var horizontalLeft = relativeBoxGap.left; var horizontalRight = relativeBoxGap.left + relativeBoxRect.width; var verticalBottom = relativeBoxGap.top + relativeBoxRect.height; var verticalTop = relativeBoxGap.top; var verticalCenter = relativeBoxGap.top + relativeBoxRect.height / 2; var horizontalTop = documentGap.bottom + relativeBoxRect.height; var verticalCenterToTop = documentGap.bottom + relativeBoxRect.height / 2; var viewsOffset = { bottomCenter: { left: horizontalCenter - rect.width / 2, top: verticalBottom + arrowSize }, bottomLeftToRight: { left: horizontalLeft, top: verticalBottom + arrowSize }, bottomCenterToRight: { left: horizontalCenter - arrowHorizontalBalancePx, top: verticalBottom + arrowSize }, bottomRight: { left: horizontalRight - arrowHorizontalBalancePx, top: verticalBottom + arrowSize }, bottomRightToLeft: { left: horizontalRight - rect.width, top: verticalBottom + arrowSize }, bottomCenterToLeft: { left: horizontalCenter - rect.width + arrowHorizontalBalancePx, top: verticalBottom + arrowSize }, bottomLeft: { left: horizontalLeft - rect.width + arrowHorizontalBalancePx, top: verticalBottom + arrowSize }, topCenter: { left: horizontalCenter - rect.width / 2, bottom: horizontalTop + arrowSize }, topLeftToRight: { left: horizontalLeft, bottom: horizontalTop + arrowSize }, topCenterToRight: { left: horizontalCenter - arrowHorizontalBalancePx, bottom: horizontalTop + arrowSize }, topRight: { left: horizontalRight - arrowHorizontalBalancePx, bottom: horizontalTop + arrowSize }, topRightToLeft: { left: horizontalRight - rect.width, bottom: horizontalTop + arrowSize }, topCenterToLeft: { left: horizontalCenter - rect.width + arrowHorizontalBalancePx, bottom: horizontalTop + arrowSize }, topLeft: { left: horizontalLeft - rect.width + arrowHorizontalBalancePx, top: verticalTop - (rect.height + arrowSize) }, rightCenter: { left: horizontalRight + arrowSize, top: verticalCenter - rect.height / 2 }, rightTopToBottom: { left: horizontalRight + arrowSize, top: verticalTop }, rightCenterToBottom: { left: horizontalRight + arrowSize, top: verticalCenter - arrowVerticalBalancePx }, rightBottom: { left: horizontalRight + arrowSize, top: verticalBottom - arrowVerticalBalancePx }, rightBottomToTop: { left: horizontalRight + arrowSize, bottom: documentGap.bottom }, rightCenterToTop: { left: horizontalRight + arrowSize, bottom: verticalCenterToTop - arrowVerticalBalancePx }, rightTop: { left: horizontalRight + arrowSize, bottom: horizontalTop - arrowVerticalBalancePx }, leftCenter: { left: horizontalLeft - (rect.width + arrowSize), top: verticalCenter - rect.height / 2 }, leftTopToBottom: { left: horizontalLeft - (rect.width + arrowSize), top: verticalTop }, leftCenterToBottom: { left: horizontalLeft - (rect.width + arrowSize), top: verticalCenter - arrowVerticalBalancePx }, leftBottom: { left: horizontalLeft - (rect.width + arrowSize), top: verticalBottom - arrowVerticalBalancePx }, leftBottomToTop: { left: horizontalLeft - (rect.width + arrowSize), bottom: documentGap.bottom }, leftCenterToTop: { left: horizontalLeft - (rect.width + arrowSize), bottom: verticalCenterToTop - arrowVerticalBalancePx }, leftTop: { left: horizontalLeft - (rect.width + arrowSize), bottom: horizontalTop - arrowVerticalBalancePx } }; return { views: views, viewsOffset: viewsOffset, targetOffset: relativeBoxRect, popupOffset: rect }; }, getArrowAdjustments: function getArrowAdjustments(el, relativeBox, customFrame) { if (!el) { return; } var elRects = viewPort.frameRelativeRects(el, customFrame); var rectGap = elRects.rectGap; var relativeBoxRects = viewPort.frameRelativeRects(relativeBox, customFrame); var relativeBoxGap = relativeBoxRects.rectGap; return { left: relativeBoxGap.center.left - rectGap.left, right: relativeBoxGap.center.right - rectGap.right, top: relativeBoxGap.center.top - rectGap.top, bottom: relativeBoxGap.center.bottom - rectGap.bottom }; }, betterView: function betterView(popup, relativeBox) { var defaultView = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; var customFrame = arguments.length > 3 ? arguments[3] : undefined; var _ref2 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}, needArrow = _ref2.needArrow, isAbsolute = _ref2.isAbsolute, _ref2$customOrder = _ref2.customOrder, customOrder = _ref2$customOrder === void 0 ? [] : _ref2$customOrder; var customScrollFrame = isAbsolute ? customFrame : ''; var viewPortPossibilities = viewPort.possibilities(popup, relativeBox, customScrollFrame, { needArrow: needArrow, isAbsolute: isAbsolute }); if (!viewPortPossibilities) { return; } var views = viewPortPossibilities.views, viewsOffset = viewPortPossibilities.viewsOffset, targetOffset = viewPortPossibilities.targetOffset, popupOffset = viewPortPossibilities.popupOffset; var view = null; var isViewFound = false; if (!isViewFound && defaultView && views[defaultView]) { view = defaultView; isViewFound = true; } if (!isViewFound) { if (customOrder.length > 0) { isViewFound = customOrder.some(function (position) { if (views[position]) { view = position; return true; } }); } else { isViewFound = defaultOrder.some(function (position) { if (views[position]) { view = position; return true; } }); } } if (!isViewFound) { view = defaultView; } return { view: view, views: views, viewsOffset: viewsOffset, targetOffset: targetOffset, popupOffset: popupOffset }; } }; var _default = { betterView: viewPort.betterView, frameRelativeRects: viewPort.frameRelativeRects, getArrowAdjustments: viewPort.getArrowAdjustments, isInViewPort: viewPort.isInViewPort }; exports["default"] = _default;