X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/07b889547d28e68e5fc8f923c166bd607da17ad7..refs/pull/1630/head:/resources/assets/js/components/overlay.js diff --git a/resources/assets/js/components/overlay.js b/resources/assets/js/components/overlay.js index 1ba5efcea..ad6a01061 100644 --- a/resources/assets/js/components/overlay.js +++ b/resources/assets/js/components/overlay.js @@ -6,12 +6,22 @@ class Overlay { elem.addEventListener('click', event => { if (event.target === elem) return this.hide(); }); + + window.addEventListener('keyup', event => { + if (event.key === 'Escape') { + this.hide(); + } + }); + let closeButtons = elem.querySelectorAll('.popup-header-close'); for (let i=0; i < closeButtons.length; i++) { closeButtons[i].addEventListener('click', this.hide.bind(this)); } } + hide() { this.toggle(false); } + show() { this.toggle(true); } + toggle(show = true) { let start = Date.now(); let duration = 240; @@ -22,6 +32,9 @@ class Overlay { this.container.style.opacity = targetOpacity; if (elapsedTime > duration) { this.container.style.display = show ? 'flex' : 'none'; + if (show) { + this.focusOnBody(); + } this.container.style.opacity = ''; } else { requestAnimationFrame(setOpacity.bind(this)); @@ -31,8 +44,12 @@ class Overlay { requestAnimationFrame(setOpacity.bind(this)); } - hide() { this.toggle(false); } - show() { this.toggle(true); } + focusOnBody() { + const body = this.container.querySelector('.popup-body'); + if (body) { + body.focus(); + } + } }