From 48a5d16335660474c563e898a5ee276995cf2dbb Mon Sep 17 00:00:00 2001 From: dqzx <4139931+dqzx@users.noreply.github.com> Date: Fri, 2 Jul 2021 20:31:49 +0100 Subject: [PATCH] Fix: trap tab focus within ComposedModal --- src/ComposedModal/ComposedModal.svelte | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/ComposedModal/ComposedModal.svelte b/src/ComposedModal/ComposedModal.svelte index 43c4621e..094eba37 100644 --- a/src/ComposedModal/ComposedModal.svelte +++ b/src/ComposedModal/ComposedModal.svelte @@ -103,6 +103,33 @@ class:is-visible="{open}" class:bx--modal--danger="{danger}" {...$$restProps} + on:keydown + on:keydown="{(e) => { + if (open) { + if (e.key === 'Escape') { + open = false; + } else if (e.key === 'Tab') { + // taken from github.com/carbon-design-system/carbon/packages/react/src/internal/keyboard/navigation.js + const selectorTabbable = ` + a[href], area[href], input:not([disabled]):not([tabindex='-1']), + button:not([disabled]):not([tabindex='-1']),select:not([disabled]):not([tabindex='-1']), + textarea:not([disabled]):not([tabindex='-1']), + iframe, object, embed, *[tabindex]:not([tabindex='-1']):not([disabled]), *[contenteditable=true] +`; + + const tabbable = Array.from(ref.querySelectorAll(selectorTabbable)); + + let index = tabbable.indexOf(document.activeElement); + if (index === -1 && e.shiftKey) index = 0; + + index += tabbable.length + (e.shiftKey ? -1 : 1); + index %= tabbable.length; + + tabbable[index].focus(); + e.preventDefault(); + } + } + }}" on:click on:click="{() => { if (!didClickInnerModal && !preventCloseOnClickOutside) open = false;