{"version":3,"file":"taiga-ui-cdk-directives-focus-trap.mjs","sources":["../../../projects/cdk/directives/focus-trap/focus-trap.directive.ts","../../../projects/cdk/directives/focus-trap/taiga-ui-cdk-directives-focus-trap.ts"],"sourcesContent":["import {DOCUMENT} from '@angular/common';\nimport {Directive, inject, type OnDestroy} from '@angular/core';\nimport {\n    tuiContainsOrAfter,\n    tuiInjectElement,\n    tuiIsHTMLElement,\n} from '@taiga-ui/cdk/utils/dom';\nimport {\n    tuiBlurNativeFocused,\n    tuiGetClosestFocusable,\n    tuiGetNativeFocused,\n} from '@taiga-ui/cdk/utils/focus';\n\n@Directive({\n    standalone: true,\n    selector: '[tuiFocusTrap]',\n    host: {\n        tabIndex: '0',\n        '(window:focusin.zoneless)': 'initialized && onFocusIn($event.target)',\n    },\n})\nexport class TuiFocusTrap implements OnDestroy {\n    private readonly doc = inject(DOCUMENT);\n    private readonly el = tuiInjectElement();\n    private activeElement: Element | null = null;\n    protected initialized = false;\n\n    constructor() {\n        /**\n         * This would cause currently focused element to lose focus,\n         * but it might cause ExpressionChanged error due to potential HostBinding.\n         * Microtask keeps it in the same frame but allows change detection to run\n         */\n        Promise.resolve().then(() => {\n            /**\n             * The same event can synchronously close already opened focus trap and open another one.\n             * All focus traps have microtask inside its `ngOnDestroy` –\n             * they should be resolved before enabling of new focus trap.\n             * Don't enable any new event listeners before `initialized` equals to `true`!\n             */\n            this.initialized = true;\n            this.activeElement = tuiGetNativeFocused(this.doc);\n            this.el.focus();\n        });\n    }\n\n    public ngOnDestroy(): void {\n        tuiBlurNativeFocused(this.doc);\n\n        /**\n         * HostListeners are triggered even after ngOnDestroy\n         * {@link https://github.com/angular/angular/issues/38100}\n         * so we need to delay it but stay in the same sync cycle,\n         * therefore using Promise instead of setTimeout\n         */\n        Promise.resolve().then(() => {\n            if (tuiIsHTMLElement(this.activeElement)) {\n                this.activeElement.focus();\n            }\n        });\n    }\n\n    protected onFocusIn(node: Node): void {\n        const {firstElementChild} = this.el;\n\n        if (!tuiContainsOrAfter(this.el, node) && firstElementChild) {\n            tuiGetClosestFocusable({\n                initial: firstElementChild,\n                root: this.el,\n            })?.focus();\n        }\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAaA,MAQa,YAAY,CAAA;AAMrB,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAE,CAAA,EAAA,GAAG,gBAAgB,EAAE,CAAC;QACjC,IAAa,CAAA,aAAA,GAAmB,IAAI,CAAC;QACnC,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;AAG1B;;;;AAIG;AACH,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;AACxB;;;;;AAKG;AACH,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,YAAA,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;AACpB,SAAC,CAAC,CAAC;KACN;IAEM,WAAW,GAAA;AACd,QAAA,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/B;;;;;AAKG;AACH,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;AACxB,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACtC,gBAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC9B,aAAA;AACL,SAAC,CAAC,CAAC;KACN;AAES,IAAA,SAAS,CAAC,IAAU,EAAA;AAC1B,QAAA,MAAM,EAAC,iBAAiB,EAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QAEpC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,iBAAiB,EAAE;AACzD,YAAA,sBAAsB,CAAC;AACnB,gBAAA,OAAO,EAAE,iBAAiB;gBAC1B,IAAI,EAAE,IAAI,CAAC,EAAE;aAChB,CAAC,EAAE,KAAK,EAAE,CAAC;AACf,SAAA;KACJ;+GAlDQ,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,UAAA,EAAA,GAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBARxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACF,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,2BAA2B,EAAE,yCAAyC;AACzE,qBAAA;AACJ,iBAAA,CAAA;;;ACpBD;;AAEG;;;;"}