@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
44 lines • 7.71 kB
JavaScript
import { tuiClamp } from '@taiga-ui/cdk/utils/math';
import { tuiIsPresent } from '@taiga-ui/cdk/utils/miscellaneous';
import { tuiGetDocumentOrShadowRoot } from './get-document-or-shadow-root';
/**
* Returns array of Elements covering edges of given element or null if at least one edge middle point is visible
*
* CAUTION: Empty array means element if offscreen i.e. covered by no elements, rather than not covered
* ```ts
* function tuiGetElementObscures(element: Element): readonly [Element, Element, Element, Element] | [] | null
* ```
*/
export function tuiGetElementObscures(element) {
const { ownerDocument } = element;
if (!ownerDocument?.defaultView || !element.getBoundingClientRect) {
return null;
}
const { innerWidth, innerHeight } = ownerDocument.defaultView;
const doc = tuiGetDocumentOrShadowRoot(element);
const rect = element.getBoundingClientRect();
if (rect.width === 0 && rect.height === 0) {
return null;
}
const left = tuiClamp(Math.round(rect.left) + 2, 0, innerWidth);
const top = tuiClamp(Math.round(rect.top) + 2, 0, innerHeight);
const right = tuiClamp(Math.round(rect.right) - 2, 0, innerWidth);
const bottom = tuiClamp(Math.round(rect.bottom) - 2, 0, innerHeight);
const horizontalMiddle = tuiClamp(Math.round(rect.left + rect.width / 2), 0, innerWidth);
const verticalMiddle = tuiClamp(Math.round(rect.top + rect.height / 2), 0, innerHeight);
const elements = [
doc.elementFromPoint(horizontalMiddle, top),
doc.elementFromPoint(horizontalMiddle, bottom),
doc.elementFromPoint(left, verticalMiddle),
doc.elementFromPoint(right, verticalMiddle),
];
const nonNull = elements.filter(tuiIsPresent);
if (!nonNull.length) {
return [];
}
const filtered = nonNull.filter((el) => !element.contains(el) && !el.contains(element));
return filtered.length === 4
? filtered
: null;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWVsZW1lbnQtb2JzY3VyZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3V0aWxzL2RvbS9nZXQtZWxlbWVudC1vYnNjdXJlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUV6RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNqQyxPQUFnQjtJQUVoQixNQUFNLEVBQUMsYUFBYSxFQUFDLEdBQUcsT0FBTyxDQUFDO0lBRWhDLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFO1FBQy9ELE9BQU8sSUFBSSxDQUFDO0tBQ2Y7SUFFRCxNQUFNLEVBQUMsVUFBVSxFQUFFLFdBQVcsRUFBQyxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFFN0MsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN2QyxPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEUsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckUsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUN0QyxDQUFDLEVBQ0QsVUFBVSxDQUNiLENBQUM7SUFDRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUN0QyxDQUFDLEVBQ0QsV0FBVyxDQUNkLENBQUM7SUFDRixNQUFNLFFBQVEsR0FBRztRQUNiLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUM7UUFDM0MsR0FBRyxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztRQUM5QyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQztRQUMxQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQztLQUM5QyxDQUFDO0lBQ0YsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU5QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUNqQixPQUFPLEVBQUUsQ0FBQztLQUNiO0lBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQ3pELENBQUM7SUFFRixPQUFPLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUN4QixDQUFDLENBQUUsUUFBaUQ7UUFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3R1aUNsYW1wfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21hdGgnO1xuaW1wb3J0IHt0dWlJc1ByZXNlbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWlzY2VsbGFuZW91cyc7XG5cbmltcG9ydCB7dHVpR2V0RG9jdW1lbnRPclNoYWRvd1Jvb3R9IGZyb20gJy4vZ2V0LWRvY3VtZW50LW9yLXNoYWRvdy1yb290JztcblxuLyoqXG4gKiBSZXR1cm5zIGFycmF5IG9mIEVsZW1lbnRzIGNvdmVyaW5nIGVkZ2VzIG9mIGdpdmVuIGVsZW1lbnQgb3IgbnVsbCBpZiBhdCBsZWFzdCBvbmUgZWRnZSBtaWRkbGUgcG9pbnQgaXMgdmlzaWJsZVxuICpcbiAqIENBVVRJT046IEVtcHR5IGFycmF5IG1lYW5zIGVsZW1lbnQgaWYgb2Zmc2NyZWVuIGkuZS4gY292ZXJlZCBieSBubyBlbGVtZW50cywgcmF0aGVyIHRoYW4gbm90IGNvdmVyZWRcbiAqIGBgYHRzXG4gKiBmdW5jdGlvbiB0dWlHZXRFbGVtZW50T2JzY3VyZXMoZWxlbWVudDogRWxlbWVudCk6IHJlYWRvbmx5IFtFbGVtZW50LCBFbGVtZW50LCBFbGVtZW50LCBFbGVtZW50XSB8IFtdIHwgbnVsbFxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0dWlHZXRFbGVtZW50T2JzY3VyZXMoXG4gICAgZWxlbWVudDogRWxlbWVudCxcbik6IHJlYWRvbmx5IFtFbGVtZW50LCBFbGVtZW50LCBFbGVtZW50LCBFbGVtZW50XSB8IFtdIHwgbnVsbCB7XG4gICAgY29uc3Qge293bmVyRG9jdW1lbnR9ID0gZWxlbWVudDtcblxuICAgIGlmICghb3duZXJEb2N1bWVudD8uZGVmYXVsdFZpZXcgfHwgIWVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHtpbm5lcldpZHRoLCBpbm5lckhlaWdodH0gPSBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIGNvbnN0IGRvYyA9IHR1aUdldERvY3VtZW50T3JTaGFkb3dSb290KGVsZW1lbnQpO1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYgKHJlY3Qud2lkdGggPT09IDAgJiYgcmVjdC5oZWlnaHQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdCA9IHR1aUNsYW1wKE1hdGgucm91bmQocmVjdC5sZWZ0KSArIDIsIDAsIGlubmVyV2lkdGgpO1xuICAgIGNvbnN0IHRvcCA9IHR1aUNsYW1wKE1hdGgucm91bmQocmVjdC50b3ApICsgMiwgMCwgaW5uZXJIZWlnaHQpO1xuICAgIGNvbnN0IHJpZ2h0ID0gdHVpQ2xhbXAoTWF0aC5yb3VuZChyZWN0LnJpZ2h0KSAtIDIsIDAsIGlubmVyV2lkdGgpO1xuICAgIGNvbnN0IGJvdHRvbSA9IHR1aUNsYW1wKE1hdGgucm91bmQocmVjdC5ib3R0b20pIC0gMiwgMCwgaW5uZXJIZWlnaHQpO1xuICAgIGNvbnN0IGhvcml6b250YWxNaWRkbGUgPSB0dWlDbGFtcChcbiAgICAgICAgTWF0aC5yb3VuZChyZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gMiksXG4gICAgICAgIDAsXG4gICAgICAgIGlubmVyV2lkdGgsXG4gICAgKTtcbiAgICBjb25zdCB2ZXJ0aWNhbE1pZGRsZSA9IHR1aUNsYW1wKFxuICAgICAgICBNYXRoLnJvdW5kKHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyKSxcbiAgICAgICAgMCxcbiAgICAgICAgaW5uZXJIZWlnaHQsXG4gICAgKTtcbiAgICBjb25zdCBlbGVtZW50cyA9IFtcbiAgICAgICAgZG9jLmVsZW1lbnRGcm9tUG9pbnQoaG9yaXpvbnRhbE1pZGRsZSwgdG9wKSxcbiAgICAgICAgZG9jLmVsZW1lbnRGcm9tUG9pbnQoaG9yaXpvbnRhbE1pZGRsZSwgYm90dG9tKSxcbiAgICAgICAgZG9jLmVsZW1lbnRGcm9tUG9pbnQobGVmdCwgdmVydGljYWxNaWRkbGUpLFxuICAgICAgICBkb2MuZWxlbWVudEZyb21Qb2ludChyaWdodCwgdmVydGljYWxNaWRkbGUpLFxuICAgIF07XG4gICAgY29uc3Qgbm9uTnVsbCA9IGVsZW1lbnRzLmZpbHRlcih0dWlJc1ByZXNlbnQpO1xuXG4gICAgaWYgKCFub25OdWxsLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBub25OdWxsLmZpbHRlcihcbiAgICAgICAgKGVsKSA9PiAhZWxlbWVudC5jb250YWlucyhlbCkgJiYgIWVsLmNvbnRhaW5zKGVsZW1lbnQpLFxuICAgICk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWQubGVuZ3RoID09PSA0XG4gICAgICAgID8gKGZpbHRlcmVkIGFzIFtFbGVtZW50LCBFbGVtZW50LCBFbGVtZW50LCBFbGVtZW50XSlcbiAgICAgICAgOiBudWxsO1xufVxuIl19