{"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 {tuiGetClosestFocusable, tuiGetFocused} from '@taiga-ui/cdk/utils/focus';\n\n@Directive({\n    selector: '[tuiFocusTrap]',\n    host: {\n        tabIndex: '0',\n        '(window:focusin.zoneless)': 'initialized && onFocusIn($event.target)',\n        '(pointerdown)': '$event.currentTarget?.removeAttribute(\"tabindex\")',\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` is equal to `true`!\n             */\n            this.initialized = true;\n            this.activeElement = tuiGetFocused(this.doc);\n            this.el.focus();\n        });\n    }\n\n    public ngOnDestroy(): void {\n        this.initialized = false;\n\n        if (tuiIsHTMLElement(this.activeElement)) {\n            this.activeElement.focus();\n        }\n    }\n\n    protected onFocusIn(node: Node): void {\n        const {firstElementChild} = this.el;\n\n        if (!tuiContainsOrAfter(this.el, node) && firstElementChild) {\n            tuiGetClosestFocusable({initial: firstElementChild, root: this.el})?.focus();\n        }\n    }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAiBa,YAAY,CAAA;AAMrB,IAAA,WAAA,GAAA;AALiB,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QACtB,IAAA,CAAA,EAAE,GAAG,gBAAgB,EAAE;QAChC,IAAA,CAAA,aAAa,GAAmB,IAAI;QAClC,IAAA,CAAA,WAAW,GAAG,KAAK;AAGzB;;;;AAIG;AACH,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAK;AACxB;;;;;AAKG;AACH,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5C,YAAA,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;AACnB,QAAA,CAAC,CAAC;IACN;IAEO,WAAW,GAAA;AACd,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AAExB,QAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAC9B;IACJ;AAEU,IAAA,SAAS,CAAC,IAAU,EAAA;AAC1B,QAAA,MAAM,EAAC,iBAAiB,EAAC,GAAG,IAAI,CAAC,EAAE;AAEnC,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,iBAAiB,EAAE;AACzD,YAAA,sBAAsB,CAAC,EAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAC,CAAC,EAAE,KAAK,EAAE;QAChF;IACJ;+GAvCS,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;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,aAAA,EAAA,qDAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBARxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,IAAI,EAAE;AACF,wBAAA,QAAQ,EAAE,GAAG;AACb,wBAAA,2BAA2B,EAAE,yCAAyC;AACtE,wBAAA,eAAe,EAAE,mDAAmD;AACvE,qBAAA;AACJ,iBAAA;;;AChBD;;AAEG;;;;"}