{"version":3,"file":"primeng-focustrap.mjs","sources":["../../src/focustrap/focustrap.ts","../../src/focustrap/primeng-focustrap.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { booleanAttribute, Directive, effect, input, NgModule } from '@angular/core';\nimport { createElement, focus, getFirstFocusableElement, getLastFocusableElement } from '@primeuix/utils';\nimport { BaseComponent } from 'primeng/basecomponent';\n\n/**\n * Focus Trap keeps focus within a certain DOM element while tabbing.\n * @group Components\n */\n@Directive({\n    selector: '[pFocusTrap]',\n    standalone: true\n})\nexport class FocusTrap extends BaseComponent {\n    /**\n     * When set as true, focus wouldn't be managed.\n     * @group Props\n     */\n    pFocusTrapDisabled = input(false, { transform: booleanAttribute });\n\n    firstHiddenFocusableElement!: HTMLElement;\n\n    lastHiddenFocusableElement!: HTMLElement;\n\n    constructor() {\n        super();\n\n        effect(() => {\n            const disabled = this.pFocusTrapDisabled();\n            if (isPlatformBrowser(this.platformId)) {\n                if (disabled) {\n                    this.removeHiddenFocusableElements();\n                } else if (!this.firstHiddenFocusableElement && !this.lastHiddenFocusableElement) {\n                    this.createHiddenFocusableElements();\n                }\n            }\n        });\n    }\n\n    onInit() {\n        if (isPlatformBrowser(this.platformId) && !this.pFocusTrapDisabled()) {\n            !this.firstHiddenFocusableElement && !this.lastHiddenFocusableElement && this.createHiddenFocusableElements();\n        }\n    }\n\n    removeHiddenFocusableElements() {\n        if (this.firstHiddenFocusableElement && this.firstHiddenFocusableElement.parentNode) {\n            this.firstHiddenFocusableElement.parentNode.removeChild(this.firstHiddenFocusableElement);\n        }\n\n        if (this.lastHiddenFocusableElement && this.lastHiddenFocusableElement.parentNode) {\n            this.lastHiddenFocusableElement.parentNode.removeChild(this.lastHiddenFocusableElement);\n        }\n\n        this.firstHiddenFocusableElement = null!;\n        this.lastHiddenFocusableElement = null!;\n    }\n\n    getComputedSelector(selector: string | null) {\n        return `:not(.p-hidden-focusable):not([data-p-hidden-focusable=\"true\"])${selector ?? ''}`;\n    }\n\n    createHiddenFocusableElements() {\n        const tabindex = '0';\n\n        const createFocusableElement = (onFocus: (event: FocusEvent) => void) => {\n            return createElement('span', {\n                class: 'p-hidden-accessible p-hidden-focusable',\n                tabindex,\n                role: 'presentation',\n                'aria-hidden': true,\n                'data-p-hidden-accessible': true,\n                'data-p-hidden-focusable': true,\n                onFocus: onFocus?.bind(this)\n            }) as HTMLElement;\n        };\n\n        this.firstHiddenFocusableElement = createFocusableElement(this.onFirstHiddenElementFocus);\n        this.lastHiddenFocusableElement = createFocusableElement(this.onLastHiddenElementFocus);\n\n        this.firstHiddenFocusableElement.setAttribute('data-pc-section', 'firstfocusableelement');\n        this.lastHiddenFocusableElement.setAttribute('data-pc-section', 'lastfocusableelement');\n\n        this.el.nativeElement.prepend(this.firstHiddenFocusableElement);\n        this.el.nativeElement.append(this.lastHiddenFocusableElement);\n    }\n\n    onFirstHiddenElementFocus(event: FocusEvent) {\n        const { currentTarget, relatedTarget } = event;\n        const focusableElement =\n            relatedTarget === this.lastHiddenFocusableElement || !this.el.nativeElement?.contains(relatedTarget as Node)\n                ? getFirstFocusableElement((currentTarget as HTMLElement).parentElement!, ':not(.p-hidden-focusable)')\n                : this.lastHiddenFocusableElement;\n\n        focus(focusableElement as HTMLElement);\n    }\n\n    onLastHiddenElementFocus(event: FocusEvent) {\n        const { currentTarget, relatedTarget } = event;\n        const focusableElement =\n            relatedTarget === this.firstHiddenFocusableElement || !this.el.nativeElement?.contains(relatedTarget as Node)\n                ? getLastFocusableElement((currentTarget as HTMLElement).parentElement!, ':not(.p-hidden-focusable)')\n                : this.firstHiddenFocusableElement;\n\n        focus(focusableElement as HTMLElement);\n    }\n}\n\n@NgModule({\n    imports: [FocusTrap],\n    exports: [FocusTrap]\n})\nexport class FocusTrapModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}