"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
Object.defineProperty(exports, "FocusManager", {
    enumerable: true,
    get: function() {
        return FocusManager;
    }
});
const _tabbable = require("./tabbable");
function _define_property(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}
class FocusManager {
    constructor(){
        // массив с элементами, которые нужно зафокусить после анмаунта
        _define_property(this, "focusAfterElements", []);
        // массив с trap нодами
        _define_property(this, "focusNodes", []);
        _define_property(this, "handleFocus", ()=>{
            // Фокус всегда должен находиться внутри необходимой ноды
            const focusNode = this.focusNodes[this.focusNodes.length - 1];
            if (!focusNode || focusNode.contains(document.activeElement)) {
                return;
            }
            // Выделяем первый tabbable элемент
            const el = (0, _tabbable.findTabbableDescendants)(focusNode)[0] || focusNode;
            el.focus();
        });
        // добавление на фокус после анмаунта
        _define_property(this, "markForFocusAfter", (focusAfterNode)=>{
            const node = focusAfterNode && focusAfterNode.current ? focusAfterNode.current : document.activeElement;
            this.focusAfterElements.push(node);
        });
        // фокус на необходимый элемент
        _define_property(this, "returnFocus", ()=>{
            const toFocus = this.focusAfterElements.pop() ?? null;
            if (toFocus) {
                toFocus.focus();
            }
        });
        // при маунте ноды
        _define_property(this, "setupScopedFocus", (element)=>{
            this.focusNodes.push(element);
            document.addEventListener('focusin', this.handleFocus, true);
        });
        // при анмаунте
        _define_property(this, "teardownScopedFocus", ()=>{
            this.focusNodes.pop();
            document.removeEventListener('focusin', this.handleFocus);
        });
    }
}
