@taiga-ui/cdk
Version:
Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance
36 lines • 5.67 kB
JavaScript
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) {
if (!element.getBoundingClientRect) {
return null;
}
const { left, right, top, bottom, width, height } = element.getBoundingClientRect();
if (width === 0 && height === 0) {
return null;
}
const doc = tuiGetDocumentOrShadowRoot(element);
const horizontalMiddle = Math.round(left + width / 2);
const verticalMiddle = Math.round(top + height / 2);
const elements = [
doc.elementFromPoint(horizontalMiddle, Math.round(top) + 2),
doc.elementFromPoint(horizontalMiddle, Math.round(bottom) - 2),
doc.elementFromPoint(Math.round(left) + 2, verticalMiddle),
doc.elementFromPoint(Math.round(right) - 2, verticalMiddle),
].filter(tuiIsPresent);
if (!elements.length) {
return [];
}
const filtered = elements.filter((el) => !element.contains(el) && !el.contains(element));
return filtered.length === 4
? filtered
: null;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWVsZW1lbnQtb2JzY3VyZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3V0aWxzL2RvbS9nZXQtZWxlbWVudC1vYnNjdXJlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBRS9ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRXpFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsT0FBZ0I7SUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtRQUNoQyxPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsTUFBTSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFFbEYsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0IsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELE1BQU0sR0FBRyxHQUFHLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRCxNQUFNLFFBQVEsR0FBRztRQUNiLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGNBQWMsQ0FBQztRQUMxRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsY0FBYyxDQUFDO0tBQzlELENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXZCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1FBQ2xCLE9BQU8sRUFBRSxDQUFDO0tBQ2I7SUFFRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUM1QixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FDekQsQ0FBQztJQUVGLE9BQU8sUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQ3hCLENBQUMsQ0FBRSxRQUFpRDtRQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dHVpSXNQcmVzZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21pc2NlbGxhbmVvdXMnO1xuXG5pbXBvcnQge3R1aUdldERvY3VtZW50T3JTaGFkb3dSb290fSBmcm9tICcuL2dldC1kb2N1bWVudC1vci1zaGFkb3ctcm9vdCc7XG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBvZiBFbGVtZW50cyBjb3ZlcmluZyBlZGdlcyBvZiBnaXZlbiBlbGVtZW50IG9yIG51bGwgaWYgYXQgbGVhc3Qgb25lIGVkZ2UgbWlkZGxlIHBvaW50IGlzIHZpc2libGVcbiAqXG4gKiBDQVVUSU9OOiBFbXB0eSBhcnJheSBtZWFucyBlbGVtZW50IGlmIG9mZnNjcmVlbiBpLmUuIGNvdmVyZWQgYnkgbm8gZWxlbWVudHMsIHJhdGhlciB0aGFuIG5vdCBjb3ZlcmVkXG4gKiBgYGB0c1xuICogZnVuY3Rpb24gdHVpR2V0RWxlbWVudE9ic2N1cmVzKGVsZW1lbnQ6IEVsZW1lbnQpOiByZWFkb25seSBbRWxlbWVudCwgRWxlbWVudCwgRWxlbWVudCwgRWxlbWVudF0gfCBbXSB8IG51bGxcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHVpR2V0RWxlbWVudE9ic2N1cmVzKGVsZW1lbnQ6IEVsZW1lbnQpOiByZWFkb25seSBFbGVtZW50W10gfCBudWxsIHtcbiAgICBpZiAoIWVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHtsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHdpZHRoLCBoZWlnaHR9ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICh3aWR0aCA9PT0gMCAmJiBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jID0gdHVpR2V0RG9jdW1lbnRPclNoYWRvd1Jvb3QoZWxlbWVudCk7XG4gICAgY29uc3QgaG9yaXpvbnRhbE1pZGRsZSA9IE1hdGgucm91bmQobGVmdCArIHdpZHRoIC8gMik7XG4gICAgY29uc3QgdmVydGljYWxNaWRkbGUgPSBNYXRoLnJvdW5kKHRvcCArIGhlaWdodCAvIDIpO1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW1xuICAgICAgICBkb2MuZWxlbWVudEZyb21Qb2ludChob3Jpem9udGFsTWlkZGxlLCBNYXRoLnJvdW5kKHRvcCkgKyAyKSxcbiAgICAgICAgZG9jLmVsZW1lbnRGcm9tUG9pbnQoaG9yaXpvbnRhbE1pZGRsZSwgTWF0aC5yb3VuZChib3R0b20pIC0gMiksXG4gICAgICAgIGRvYy5lbGVtZW50RnJvbVBvaW50KE1hdGgucm91bmQobGVmdCkgKyAyLCB2ZXJ0aWNhbE1pZGRsZSksXG4gICAgICAgIGRvYy5lbGVtZW50RnJvbVBvaW50KE1hdGgucm91bmQocmlnaHQpIC0gMiwgdmVydGljYWxNaWRkbGUpLFxuICAgIF0uZmlsdGVyKHR1aUlzUHJlc2VudCk7XG5cbiAgICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWQgPSBlbGVtZW50cy5maWx0ZXIoXG4gICAgICAgIChlbCkgPT4gIWVsZW1lbnQuY29udGFpbnMoZWwpICYmICFlbC5jb250YWlucyhlbGVtZW50KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkLmxlbmd0aCA9PT0gNFxuICAgICAgICA/IChmaWx0ZXJlZCBhcyBbRWxlbWVudCwgRWxlbWVudCwgRWxlbWVudCwgRWxlbWVudF0pXG4gICAgICAgIDogbnVsbDtcbn1cbiJdfQ==