diff options
author | Mario <mario@mariovavti.com> | 2021-09-22 06:38:27 +0000 |
---|---|---|
committer | Mario <mario@mariovavti.com> | 2021-09-22 06:38:27 +0000 |
commit | 89e4006b2d84d398e34d407a019854823b1dd37d (patch) | |
tree | eed215c505af2395952b474917a92584f9e1866a /vendor/twbs/bootstrap/js/src/util/focustrap.js | |
parent | 26ac452c96ce499c140bcbae78643b8fe39b4243 (diff) | |
download | volse-hubzilla-89e4006b2d84d398e34d407a019854823b1dd37d.tar.gz volse-hubzilla-89e4006b2d84d398e34d407a019854823b1dd37d.tar.bz2 volse-hubzilla-89e4006b2d84d398e34d407a019854823b1dd37d.zip |
composer update bootstrap to version 5.1.1
Diffstat (limited to 'vendor/twbs/bootstrap/js/src/util/focustrap.js')
-rw-r--r-- | vendor/twbs/bootstrap/js/src/util/focustrap.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/vendor/twbs/bootstrap/js/src/util/focustrap.js b/vendor/twbs/bootstrap/js/src/util/focustrap.js new file mode 100644 index 000000000..ca6f8273f --- /dev/null +++ b/vendor/twbs/bootstrap/js/src/util/focustrap.js @@ -0,0 +1,109 @@ +/** + * -------------------------------------------------------------------------- + * Bootstrap (v5.1.1): util/focustrap.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + +import EventHandler from '../dom/event-handler' +import SelectorEngine from '../dom/selector-engine' +import { typeCheckConfig } from './index' + +const Default = { + trapElement: null, // The element to trap focus inside of + autofocus: true +} + +const DefaultType = { + trapElement: 'element', + autofocus: 'boolean' +} + +const NAME = 'focustrap' +const DATA_KEY = 'bs.focustrap' +const EVENT_KEY = `.${DATA_KEY}` +const EVENT_FOCUSIN = `focusin${EVENT_KEY}` +const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}` + +const TAB_KEY = 'Tab' +const TAB_NAV_FORWARD = 'forward' +const TAB_NAV_BACKWARD = 'backward' + +class FocusTrap { + constructor(config) { + this._config = this._getConfig(config) + this._isActive = false + this._lastTabNavDirection = null + } + + activate() { + const { trapElement, autofocus } = this._config + + if (this._isActive) { + return + } + + if (autofocus) { + trapElement.focus() + } + + EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop + EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event)) + EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event)) + + this._isActive = true + } + + deactivate() { + if (!this._isActive) { + return + } + + this._isActive = false + EventHandler.off(document, EVENT_KEY) + } + + // Private + + _handleFocusin(event) { + const { target } = event + const { trapElement } = this._config + + if ( + target === document || + target === trapElement || + trapElement.contains(target) + ) { + return + } + + const elements = SelectorEngine.focusableChildren(trapElement) + + if (elements.length === 0) { + trapElement.focus() + } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { + elements[elements.length - 1].focus() + } else { + elements[0].focus() + } + } + + _handleKeydown(event) { + if (event.key !== TAB_KEY) { + return + } + + this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD + } + + _getConfig(config) { + config = { + ...Default, + ...(typeof config === 'object' ? config : {}) + } + typeCheckConfig(NAME, config, DefaultType) + return config + } +} + +export default FocusTrap |