react-elegant-ui
Version:
Elegant UI components, made by BEM best practices for react
72 lines • 2.13 kB
JavaScript
var __values = this && this.__values || function (o) {
var s = typeof Symbol === "function" && Symbol.iterator,
m = s && o[s],
i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return {
value: o && o[i++],
done: !o
};
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
var getSize = function (node) {
return {
x: node.scrollWidth - node.clientWidth,
y: node.scrollHeight - node.clientHeight
};
};
var handleNode = function (node, callback) {
var size = getSize(node);
if (size.y > 0 && size.x == 0) {
requestAnimationFrame(function () {
var newSize = getSize(node);
if (newSize.x > 0) {
callback(newSize);
}
});
} else {
callback(size);
}
};
/**
* Tool for correction a size of elements with `overflow: auto`
*
* This tool detect resize of element and call user handler with calculated X and Y indents
*
* WARNING: to avoid memory leaks you must call a clean function when element removed from DOM or when you want stop handling
* Return cleanup function that is stop a observing
*
* Original bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1424328
*/
export var overflowAutoFix = function (wrapper, callback) {
var observer = new ResizeObserver(function (entries) {
var e_1, _a;
try {
for (var entries_1 = __values(entries), entries_1_1 = entries_1.next(); !entries_1_1.done; entries_1_1 = entries_1.next()) {
var entry = entries_1_1.value;
var node = entry.target;
if (!(node instanceof HTMLElement) || node !== wrapper) continue;
handleNode(node, callback);
}
} catch (e_1_1) {
e_1 = {
error: e_1_1
};
} finally {
try {
if (entries_1_1 && !entries_1_1.done && (_a = entries_1.return)) _a.call(entries_1);
} finally {
if (e_1) throw e_1.error;
}
}
});
observer.observe(wrapper);
return function () {
return observer.disconnect();
};
};