79 lines
2.4 KiB
JavaScript
79 lines
2.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ensureViewBoundingRect = ensureViewBoundingRect;
|
|
exports.getPointRect = getPointRect;
|
|
exports.getRect = getRect;
|
|
exports.getParentNode = getParentNode;
|
|
exports.getScrollParent = getScrollParent;
|
|
let viewMeasurer = null;
|
|
function ensureViewBoundingRect() {
|
|
if (viewMeasurer === null) {
|
|
viewMeasurer = document.getElementById('v-binder-view-measurer');
|
|
if (viewMeasurer === null) {
|
|
viewMeasurer = document.createElement('div');
|
|
viewMeasurer.id = 'v-binder-view-measurer';
|
|
const { style } = viewMeasurer;
|
|
style.position = 'fixed';
|
|
style.left = '0';
|
|
style.right = '0';
|
|
style.top = '0';
|
|
style.bottom = '0';
|
|
style.pointerEvents = 'none';
|
|
style.visibility = 'hidden';
|
|
document.body.appendChild(viewMeasurer);
|
|
}
|
|
}
|
|
return viewMeasurer.getBoundingClientRect();
|
|
}
|
|
function getPointRect(x, y) {
|
|
const viewRect = ensureViewBoundingRect();
|
|
return {
|
|
top: y,
|
|
left: x,
|
|
height: 0,
|
|
width: 0,
|
|
right: viewRect.width - x,
|
|
bottom: viewRect.height - y
|
|
};
|
|
}
|
|
function getRect(el) {
|
|
const elRect = el.getBoundingClientRect();
|
|
const viewRect = ensureViewBoundingRect();
|
|
return {
|
|
left: elRect.left - viewRect.left,
|
|
top: elRect.top - viewRect.top,
|
|
bottom: viewRect.height + viewRect.top - elRect.bottom,
|
|
right: viewRect.width + viewRect.left - elRect.right,
|
|
width: elRect.width,
|
|
height: elRect.height
|
|
};
|
|
}
|
|
function getParentNode(node) {
|
|
// document type
|
|
if (node.nodeType === 9) {
|
|
return null;
|
|
}
|
|
return node.parentNode;
|
|
}
|
|
function getScrollParent(node) {
|
|
if (node === null)
|
|
return null;
|
|
const parentNode = getParentNode(node);
|
|
if (parentNode === null) {
|
|
return null;
|
|
}
|
|
// Document
|
|
if (parentNode.nodeType === 9) {
|
|
return document;
|
|
}
|
|
// Element
|
|
if (parentNode.nodeType === 1) {
|
|
// Firefox want us to check `-x` and `-y` variations as well
|
|
const { overflow, overflowX, overflowY } = getComputedStyle(parentNode);
|
|
if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
|
|
return parentNode;
|
|
}
|
|
}
|
|
return getScrollParent(parentNode);
|
|
}
|