{"version":3,"sources":["focustrap.js"],"names":["EventHandler","SelectorEngine","Config","NAME","DATA_KEY","EVENT_KEY","concat","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_KEY","TAB_NAV_FORWARD","TAB_NAV_BACKWARD","Default","autofocus","trapElement","DefaultType","FocusTrap","config","_this","_classCallCheck","this","_callSuper","_config","_getConfig","_isActive","_lastTabNavDirection","_inherits","_createClass","key","value","_this2","focus","off","document","on","event","_handleFocusin","_handleKeydown","target","contains","elements","focusableChildren","length","shiftKey","get"],"mappings":"w3EAOAA,iBAAA,iCACAC,mBAAA,mCACAC,WAAA,cAPA,IAAAC,KAAA,YACAC,SAAA,eACAC,UAAA,IAAAC,OAAAF,QAAA,EACAG,cAAA,UAAAD,OAAAD,SAAA,EAcAG,kBAAA,cAAAF,OAAAD,SAAA,EAXAI,QAAA,MACAC,gBAAA,UAcAC,iBAAA,WAXAC,QAAA,CACAC,UAAA,CAAA,EAcAC,YAAA,IAZA,EAEAC,YAAA,CACAF,UAAA,UACAC,YAAA,SAEA,EAOAE,UAAA,WAEA,SAAAA,EAAAC,GAAA,IAAAC,EAcA,OAdAC,gBAAAC,KAAAJ,CAAA,GAWAE,EAAAG,WAAAD,KAAAJ,CAAA,GACAM,QAAAJ,EAAAK,WAAAN,CAAA,EATAC,EAAAM,UAAA,CAAA,EAWAN,EAAAO,qBAAA,KAAAP,CATA,CAEA,OAAAQ,UAAAV,EATAd,MASA,EAAAyB,aAAAX,EAAA,CAAA,CAAAY,IAAA,WAAAC,MAwBA,WAAA,IAAAC,EAAAV,KACAA,KAAAI,YAIAJ,KAAAE,QAAAT,WACAO,KAAAE,QAAAR,YAAAiB,MAAA,EAGA/B,aAAAgC,IAAAC,SAAA5B,SAAA,EACAL,aAAAkC,GAAAD,SAAA1B,cAAA,SAAA4B,GAAA,OAAAL,EAAAM,eAAAD,CAAA,CAAA,CAAA,EACAnC,aAAAkC,GAAAD,SAAAzB,kBAAA,SAAA2B,GAAA,OAAAL,EAAAO,eAAAF,CAAA,CAAA,CAAA,EAEAf,KAAAI,UAAA,CAAA,EACA,CAAA,EAAA,CAAAI,IAAA,aAAAC,MAEA,WACAT,KAAAI,YAIAJ,KAAAI,UAAA,CAAA,EACAxB,aAAAgC,IAAAC,SAAA5B,SAAA,EACA,CAEA,EAAA,CAAAuB,IAAA,iBAAAC,MACA,SAAAM,GACA,IAAArB,EAAAM,KAAAE,QAAAR,YAEAqB,EAAAG,SAAAL,UAAAE,EAAAG,SAAAxB,GAAAA,EAAAyB,SAAAJ,EAAAG,MAAA,IAMA,KAFAE,EAAAvC,eAAAwC,kBAAA3B,CAAA,GAEA4B,OACA5B,EACAM,KAAAK,uBAAAd,iBACA6B,EAAAA,EAAAE,OAAA,GAEAF,EAAA,IAJAT,MAAA,CAMA,CAAA,EAAA,CAAAH,IAAA,iBAAAC,MAEA,SAAAM,GACAA,EAAAP,MAAAnB,UAIAW,KAAAK,qBAAAU,EAAAQ,SAAAhC,iBAAAD,gBACA,CAAA,GAAA,CAAA,CAAAkB,IAAA,UAAAgB,IA5EA,WAcA,OAAAhC,OACA,CAAA,EAAA,CAAAgB,IAAA,cAAAgB,IAEA,WACA,OAAA7B,WACA,CAAA,EAAA,CAAAa,IAAA,OAAAgB,IAEA,WACA,OAAAzC,IACA,CAAA,EAAA,CAAA,EA9BA,iBAsFAa","file":"focustrap.js","sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n"]}