rsuite
Version:
A suite of react components
83 lines (80 loc) • 2.48 kB
JavaScript
'use client';
;
exports.__esModule = true;
exports.closestNode = closestNode;
exports.getEdgeOffset = getEdgeOffset;
exports.getScrollingParent = getScrollingParent;
exports.isContainInteractiveElement = isContainInteractiveElement;
exports.setInlineStyles = setInlineStyles;
exports.setTransitionDuration = setTransitionDuration;
exports.setTranslate3d = setTranslate3d;
/**
* interactive elements should be skiped
* */
var INTERACTIVE_ELEMENTS = ['A', 'BUTTON', 'INPUT', 'OPTION', 'TEXTAREA', 'SELECT'];
function isContainInteractiveElement(targetNode) {
return INTERACTIVE_ELEMENTS.includes(targetNode.tagName) || targetNode.contentEditable === 'true';
}
function setInlineStyles(node, styles) {
if (node !== null && styles !== null) {
for (var _i = 0, _Object$entries = Object.entries(styles); _i < _Object$entries.length; _i++) {
var _Object$entries$_i = _Object$entries[_i],
key = _Object$entries$_i[0],
value = _Object$entries$_i[1];
node.style[key] = value;
}
}
}
function setTranslate3d(node, translate) {
setInlineStyles(node, {
transform: translate ? "translate3d(" + translate.x + "px," + translate.y + "px,0)" : ''
});
}
function setTransitionDuration(node, duration) {
setInlineStyles(node, {
transitionDuration: duration ? duration + "ms" : ''
});
}
/**
* find closest target node from source node
* */
function closestNode(sourceNode, judge) {
var currentNode = sourceNode;
while (currentNode) {
if (judge(currentNode)) {
return currentNode;
}
currentNode = currentNode.parentNode;
}
return null;
}
function getEdgeOffset(node, parent, offset) {
if (offset === void 0) {
offset = {
left: 0,
top: 0
};
}
if (!node || !parent) {
return {};
}
// Get the actual offsetTop / offsetLeft value, no matter how deep the node is nested
var nodeOffset = {
left: (offset.left || 0) + node.offsetLeft,
top: (offset.top || 0) + node.offsetTop
};
if (node.parentNode === parent) {
return nodeOffset;
}
return getEdgeOffset(node.parentNode, parent, nodeOffset);
}
function getScrollingParent(el) {
return closestNode(el, function (el) {
var computedStyle = window.getComputedStyle(el);
var overflowRegex = /(auto|scroll)/;
var properties = ['overflow', 'overflowX', 'overflowY'];
return properties.some(function (property) {
return overflowRegex.test(computedStyle[property]);
});
});
}