From 22a6995c335fe8e366bc4dd7df4e13b05640db19 Mon Sep 17 00:00:00 2001
From: Kushagra Gour <chinchang457@gmail.com>
Date: Mon, 30 Apr 2018 11:07:03 +0530
Subject: [PATCH] add focus trapping to modals.

---
 src/script.js | 33 ++++++++++++++++++++++++++++++---
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/src/script.js b/src/script.js
index dd6f8e2..d255f03 100644
--- a/src/script.js
+++ b/src/script.js
@@ -1891,9 +1891,23 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo
 	 */
 	scope.toggleModal = function(modal) {
 		modal.classList.toggle('is-modal-visible');
-		document.body.classList[
-			modal.classList.contains('is-modal-visible') ? 'add' : 'remove'
-		]('overlay-visible');
+		const hasOpened = modal.classList.contains('is-modal-visible');
+		document.body.classList[hasOpened ? 'add' : 'remove']('overlay-visible');
+
+		if (hasOpened) {
+			/* eslint-disable no-inner-declarations */
+			function onTransitionEnd() {
+				modal.querySelector('.js-modal__close-btn').focus();
+				modal
+					.querySelector('.modal__content')
+					.removeEventListener('transitionend', onTransitionEnd);
+			}
+			/* eslint-enable no-inner-declarations */
+
+			modal
+				.querySelector('.modal__content')
+				.addEventListener('transitionend', onTransitionEnd);
+		}
 	};
 	scope.onSearchInputChange = function(e) {
 		const text = e.target.value;
@@ -2653,6 +2667,19 @@ loginModal, profileModal, profileAvatarImg, profileUserName, openItemsBtn, askTo
 		document.querySelector('[data-setting="editorTheme"]').innerHTML = options;
 
 		requestAnimationFrame(compileNodes);
+
+		window.addEventListener('focusin', e => {
+			if (document.body.classList.contains('overlay-visible')) {
+				const modal = $('.is-modal-visible');
+				if (!modal) {
+					return;
+				}
+				if (!modal.contains(e.target)) {
+					e.preventDefault();
+					modal.querySelector('.js-modal__close-btn').focus();
+				}
+			}
+		});
 	}
 
 	// Set few stuff on a 'scope' object so that they can be referenced dynamically.