UNPKG

@taiga-ui/cdk

Version:

Base library for creating Angular components and applications using Taiga UI principles regarding of actual visual appearance

56 lines 14.3 kB
import { DOCUMENT } from '@angular/common'; import { inject, InjectionToken, NgZone } from '@angular/core'; import { WA_WINDOW } from '@ng-web-apis/common'; import { tuiTypedFromEvent, tuiZonefreeScheduler } from '@taiga-ui/cdk/observables'; import { tuiGetActualTarget, tuiGetDocumentOrShadowRoot, tuiIsNativeMouseFocusable, } from '@taiga-ui/cdk/utils'; import { distinctUntilChanged, filter, map, merge, of, repeat, share, startWith, switchMap, take, takeUntil, timer, withLatestFrom, } from 'rxjs'; import { TUI_REMOVED_ELEMENT } from './removed-element'; // Checks if focusout event should be considered leaving active zone function isValidFocusout(target, removedElement = null) { return ( // Not due to switching tabs/going to DevTools tuiGetDocumentOrShadowRoot(target).activeElement !== target && // Not due to button/input becoming disabled or under disabled fieldset !target.matches(':disabled') && // Not due to element being removed from DOM !removedElement?.contains(target) && // Not due to scrollable element became non-scrollable tuiIsNativeMouseFocusable(target)); } function shadowRootActiveElement(root) { return merge(tuiTypedFromEvent(root, 'focusin').pipe(map(({ target }) => target)), tuiTypedFromEvent(root, 'focusout').pipe(filter(({ target, relatedTarget }) => !!relatedTarget && isValidFocusout(target)), map(({ relatedTarget }) => relatedTarget))); } /** * Active element on the document for ActiveZone */ export const TUI_ACTIVE_ELEMENT = new InjectionToken(ngDevMode ? 'TUI_ACTIVE_ELEMENT' : '', { factory: () => { const removedElement$ = inject(TUI_REMOVED_ELEMENT); const win = inject(WA_WINDOW); const doc = inject(DOCUMENT); const zone = inject(NgZone); const focusout$ = tuiTypedFromEvent(win, 'focusout', { capture: true }); const focusin$ = tuiTypedFromEvent(win, 'focusin', { capture: true }); const blur$ = tuiTypedFromEvent(win, 'blur'); const mousedown$ = tuiTypedFromEvent(win, 'mousedown'); const mouseup$ = tuiTypedFromEvent(win, 'mouseup'); return merge(focusout$.pipe(takeUntil(mousedown$), repeat({ delay: () => mouseup$ }), withLatestFrom(removedElement$), filter(([event, removedElement]) => isValidFocusout(tuiGetActualTarget(event), removedElement)), map(([{ relatedTarget }]) => relatedTarget)), blur$.pipe(map(() => doc.activeElement), filter((element) => !!element?.matches('iframe'))), focusin$.pipe(switchMap((event) => { const target = tuiGetActualTarget(event); const root = tuiGetDocumentOrShadowRoot(target) || doc; return root === doc ? of(target) : shadowRootActiveElement(root).pipe(startWith(target)); })), mousedown$.pipe(switchMap((event) => { const actualTargetInCurrentTime = tuiGetActualTarget(event); return !doc.activeElement || doc.activeElement === doc.body ? of(actualTargetInCurrentTime) : focusout$.pipe(take(1), map( /** * Do not use `map(() => tuiGetActualTarget(event))` * because we have different result in runtime */ () => actualTargetInCurrentTime), takeUntil(timer(0, tuiZonefreeScheduler(zone)))); }))).pipe(distinctUntilChanged(), share()); }, }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvdG9rZW5zL2FjdGl2ZS1lbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ2xGLE9BQU8sRUFDSCxrQkFBa0IsRUFDbEIsMEJBQTBCLEVBQzFCLHlCQUF5QixHQUM1QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBRUwsRUFBRSxFQUNGLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEtBQUssRUFDTCxjQUFjLEdBQ2pCLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFdEQsb0VBQW9FO0FBQ3BFLFNBQVMsZUFBZSxDQUFDLE1BQVcsRUFBRSxpQkFBaUMsSUFBSTtJQUN2RSxPQUFPO0lBQ0gsOENBQThDO0lBQzlDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsS0FBSyxNQUFNO1FBQzNELHVFQUF1RTtRQUN2RSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzVCLDRDQUE0QztRQUM1QyxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ2pDLHNEQUFzRDtRQUN0RCx5QkFBeUIsQ0FBQyxNQUFNLENB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LENBQUMsTUFBTSxDQUFDO2dCQUNaLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFnQixDQUFDLENBQUMsSUFBSSxDQUMxQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQ3BCLENBQUM7UUFDWixDQUFDLENBQUMsQ0FDTCxFQUNELFVBQVUsQ0FBQyxJQUFJLENBQ1gsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDaEIsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU1RCxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxHQUFHLENBQUMsYUFBYSxLQUFLLEdBQUcsQ0FBQyxJQUFJO2dCQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDLHlCQUF5QixDQUFDO2dCQUMvQixDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDVixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRztnQkFDQzs7O21CQUdHO2dCQUNILEdBQUcsRUFBRSxDQUFDLHlCQUF5QixDQUNsQyxFQUNELFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDbEQsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUNMLENBQ0osQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDSixDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtpbmplY3QsIEluamVjdGlvblRva2VuLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXQV9XSU5ET1d9IGZyb20gJ0BuZy13ZWItYXBpcy9jb21tb24nO1xuaW1wb3J0IHt0dWlUeXBlZEZyb21FdmVudCwgdHVpWm9uZWZyZWVTY2hlZHVsZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtcbiAgICB0dWlHZXRBY3R1YWxUYXJnZXQsXG4gICAgdHVpR2V0RG9jdW1lbnRPclNoYWRvd1Jvb3QsXG4gICAgdHVpSXNOYXRpdmVNb3VzZUZvY3VzYWJsZSxcbn0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscyc7XG5pbXBvcnQge1xuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICAgIGZpbHRlcixcbiAgICBtYXAsXG4gICAgbWVyZ2UsXG4gICAgdHlwZSBPYnNlcnZhYmxlLFxuICAgIG9mLFxuICAgIHJlcGVhdCxcbiAgICBzaGFyZSxcbiAgICBzdGFydFdpdGgsXG4gICAgc3dpdGNoTWFwLFxuICAgIHRha2UsXG4gICAgdGFrZVVudGlsLFxuICAgIHRpbWVyLFxuICAgIHdpdGhMYXRlc3RGcm9tLFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUVUlfUkVNT1ZFRF9FTEVNRU5UfSBmcm9tICcuL3JlbW92ZWQtZWxlbWVudCc7XG5cbi8vIENoZWNrcyBpZiBmb2N1c291dCBldmVudCBzaG91bGQgYmUgY29uc2lkZXJlZCBsZWF2aW5nIGFjdGl2ZSB6b25lXG5mdW5jdGlvbiBpc1ZhbGlkRm9jdXNvdXQodGFyZ2V0OiBhbnksIHJlbW92ZWRFbGVtZW50OiBFbGVtZW50IHwgbnVsbCA9IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAvLyBOb3QgZHVlIHRvIHN3aXRjaGluZyB0YWJzL2dvaW5nIHRvIERldlRvb2xzXG4gICAgICAgIHR1aUdldERvY3VtZW50T3JTaGFkb3dSb290KHRhcmdldCkuYWN0aXZlRWxlbWVudCAhPT0gdGFyZ2V0ICYmXG4gICAgICAgIC8vIE5vdCBkdWUgdG8gYnV0dG9uL2lucHV0IGJlY29taW5nIGRpc2FibGVkIG9yIHVuZGVyIGRpc2FibGVkIGZpZWxkc2V0XG4gICAgICAgICF0YXJnZXQubWF0Y2hlcygnOmRpc2FibGVkJykgJiZcbiAgICAgICAgLy8gTm90IGR1ZSB0byBlbGVtZW50IGJlaW5nIHJlbW92ZWQgZnJvbSBET01cbiAgICAgICAgIXJlbW92ZWRFbGVtZW50Py5jb250YWlucyh0YXJnZXQpICYmXG4gICAgICAgIC8vIE5vdCBkdWUgdG8gc2Nyb2xsYWJsZSBlbGVtZW50IGJlY2FtZSBub24tc2Nyb2xsYWJsZVxuICAgICAgICB0dWlJc05hdGl2ZU1vdXNlRm9jdXNhYmxlKHRhcmdldClcbiAgICApO1xufVxuXG5mdW5jdGlvbiBzaGFkb3dSb290QWN0aXZlRWxlbWVudChyb290OiBEb2N1bWVudCk6IE9ic2VydmFibGU8RXZlbnRUYXJnZXQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICB0dWlUeXBlZEZyb21FdmVudChyb290LCAnZm9jdXNpbicpLnBpcGUobWFwKCh7dGFyZ2V0fSkgPT4gdGFyZ2V0KSksXG4gICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KHJvb3QsICdmb2N1c291dCcpLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgKHt0YXJnZXQsIHJlbGF0ZWRUYXJnZXR9KSA9PiAhIXJlbGF0ZWRUYXJnZXQgJiYgaXNWYWxpZEZvY3Vzb3V0KHRhcmdldCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbWFwKCh7cmVsYXRlZFRhcmdldH0pID0+IHJlbGF0ZWRUYXJnZXQpLFxuICAgICAgICApLFxuICAgICk7XG59XG5cbi8qKlxuICogQWN0aXZlIGVsZW1lbnQgb24gdGhlIGRvY3VtZW50IGZvciBBY3RpdmVab25lXG4gKi9cbmV4cG9ydCBjb25zdCBUVUlfQUNUSVZFX0VMRU1FTlQgPSBuZXcgSW5qZWN0aW9uVG9rZW48T2JzZXJ2YWJsZTxFdmVudFRhcmdldCB8IG51bGw+PihcbiAgICBuZ0Rldk1vZGUgPyAnVFVJX0FDVElWRV9FTEVNRU5UJyA6ICcnLFxuICAgIHtcbiAgICAgICAgZmFjdG9yeTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEVsZW1lbnQkID0gaW5qZWN0KFRVSV9SRU1PVkVEX0VMRU1FTlQpO1xuICAgICAgICAgICAgY29uc3Qgd2luID0gaW5qZWN0KFdBX1dJTkRPVyk7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBpbmplY3QoRE9DVU1FTlQpO1xuICAgICAgICAgICAgY29uc3Qgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNvdXQkID0gdHVpVHlwZWRGcm9tRXZlbnQod2luLCAnZm9jdXNvdXQnLCB7Y2FwdHVyZTogdHJ1ZX0pO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNpbiQgPSB0dWlUeXBlZEZyb21FdmVudCh3aW4sICdmb2N1c2luJywge2NhcHR1cmU6IHRydWV9KTtcbiAgICAgICAgICAgIGNvbnN0IGJsdXIkID0gdHVpVHlwZWRGcm9tRXZlbnQod2luLCAnYmx1cicpO1xuICAgICAgICAgICAgY29uc3QgbW91c2Vkb3duJCA9IHR1aVR5cGVkRnJvbUV2ZW50KHdpbiwgJ21vdXNlZG93bicpO1xuICAgICAgICAgICAgY29uc3QgbW91c2V1cCQgPSB0dWlUeXBlZEZyb21FdmVudCh3aW4sICdtb3VzZXVwJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICAgICAgICBmb2N1c291dCQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKG1vdXNlZG93biQpLFxuICAgICAgICAgICAgICAgICAgICByZXBlYXQoe2RlbGF5OiAoKSA9PiBtb3VzZXVwJH0pLFxuICAgICAgICAgICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbShyZW1vdmVkRWxlbWVudCQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKFtldmVudCwgcmVtb3ZlZEVsZW1lbnRdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZEZvY3Vzb3V0KHR1aUdldEFjdHVhbFRhcmdldChldmVudCksIHJlbW92ZWRFbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKChbe3JlbGF0ZWRUYXJnZXR9XSkgPT4gcmVsYXRlZFRhcmdldCksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBibHVyJC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4gZG9jLmFjdGl2ZUVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKGVsZW1lbnQpID0+ICEhZWxlbWVudD8ubWF0Y2hlcygnaWZyYW1lJykpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZm9jdXNpbiQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdHVpR2V0QWN0dWFsVGFyZ2V0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3QgPSB0dWlHZXREb2N1bWVudE9yU2hhZG93Um9vdCh0YXJnZXQpIHx8IGRvYztcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3QgPT09IGRvY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb2YodGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2hhZG93Um9vdEFjdGl2ZUVsZW1lbnQocm9vdCBhcyBEb2N1bWVudCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFdpdGgodGFyZ2V0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgbW91c2Vkb3duJC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxUYXJnZXRJbkN1cnJlbnRUaW1lID0gdHVpR2V0QWN0dWFsVGFyZ2V0KGV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYWN0aXZlRWxlbWVudCA9PT0gZG9jLmJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG9mKGFjdHVhbFRhcmdldEluQ3VycmVudFRpbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb2N1c291dCQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIERvIG5vdCB1c2UgYG1hcCgoKSA9PiB0dWlHZXRBY3R1YWxUYXJnZXQoZXZlbnQpKWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVjYXVzZSB3ZSBoYXZlIGRpZmZlcmVudCByZXN1bHQgaW4gcnVudGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gYWN0dWFsVGFyZ2V0SW5DdXJyZW50VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aW1lcigwLCB0dWlab25lZnJlZVNjaGVkdWxlcih6b25lKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzaGFyZSgpKTtcbiAgICAgICAgfSxcbiAgICB9LFxuKTtcbiJdfQ==