rsuite
Version:
A suite of react components
73 lines (71 loc) • 2.15 kB
JavaScript
'use client';
/**
* interactive elements should be skiped
* */
var INTERACTIVE_ELEMENTS = ['A', 'BUTTON', 'INPUT', 'OPTION', 'TEXTAREA', 'SELECT'];
export function isContainInteractiveElement(targetNode) {
return INTERACTIVE_ELEMENTS.includes(targetNode.tagName) || targetNode.contentEditable === 'true';
}
export 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;
}
}
}
export function setTranslate3d(node, translate) {
setInlineStyles(node, {
transform: translate ? "translate3d(" + translate.x + "px," + translate.y + "px,0)" : ''
});
}
export function setTransitionDuration(node, duration) {
setInlineStyles(node, {
transitionDuration: duration ? duration + "ms" : ''
});
}
/**
* find closest target node from source node
* */
export function closestNode(sourceNode, judge) {
var currentNode = sourceNode;
while (currentNode) {
if (judge(currentNode)) {
return currentNode;
}
currentNode = currentNode.parentNode;
}
return null;
}
export 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);
}
export 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]);
});
});
}