diff --git a/src/components/EmojiPicker/EmojiPicker.vue b/src/components/EmojiPicker/EmojiPicker.vue
index 52c9c7889e..001d31b815 100644
--- a/src/components/EmojiPicker/EmojiPicker.vue
+++ b/src/components/EmojiPicker/EmojiPicker.vue
@@ -93,17 +93,13 @@
popover-inner-class="popover-emoji-picker-inner"
v-bind="$attrs"
v-on="$listeners"
- @after-show="afterShow">
+ @after-show="afterShow"
+ @after-hide="afterHide">
-<<<<<<< HEAD
- >>>>>> 4da67de7... make selectable by tab
color="var(--color-primary)"
:data="emojiIndex"
:emoji="previewFallbackEmoji"
@@ -225,13 +221,44 @@ export default {
}
},
afterShow() {
+ // add focus trap in modal
const picker = this.$refs.picker
+ picker.$el.addEventListener('keydown', this.checkKeyEvent)
+ // set focus on input search field
const input = picker.$refs.search.$el.querySelector('input')
-
if (input) {
input.focus()
}
-
+ },
+ afterHide() {
+ // remove keydown listner if popover is hidden
+ const picker = this.$refs.picker
+ picker.$el.removeEventListener('keydown', this.checkKeyEvent)
+ },
+ checkKeyEvent(event) {
+ window.console.log(event.key, 'eventkey')
+ if (event.key !== 'Tab') {
+ return
+ }
+ const picker = this.$refs.picker
+ const focusableList = picker.$el.querySelectorAll(
+ 'button, input'
+ )
+ const last = focusableList.length - 1
+ // escape early if only 1 or no elements to focus
+ if (focusableList.length <= 1) {
+ event.preventDefault()
+ return
+ }
+ if (event.shiftKey === false && event.target === focusableList[last]) {
+ // Jump to first item when pressing tab on the latest item
+ event.preventDefault()
+ focusableList[0].focus()
+ } else if (event.shiftKey === true && event.target === focusableList[0]) {
+ // Jump to the last item if pressing shift+tab on the first item
+ event.preventDefault()
+ focusableList[last].focus()
+ }
},
},
}
@@ -274,12 +301,6 @@ export default {
* {
cursor: pointer !important;
}
-
- &:focus-visible {
- background-color: var(--color-background-hover);
- border: 2px solid var(--color-primary-element) !important;
- border-radius: 50%;
- }
}
.emoji-mart-bar,
@@ -295,6 +316,11 @@ export default {
color: inherit !important;
}
+ .emoji-mart-search input:focus-visible {
+ box-shadow: inset 0 0 0 2px var(--color-primary);
+ outline: none;
+ }
+
.emoji-mart-bar {
&:first-child {
border-top-left-radius: var(--border-radius) !important;
@@ -307,6 +333,10 @@ export default {
border-radius: 0;
padding: 12px 4px;
height: auto;
+ &:focus-visible {
+ /* box-shadow: inset 0 0 0 2px var(--color-primary); */
+ outline: 2px solid var(--color-primary-element);
+ }
}
}
@@ -339,6 +369,14 @@ export default {
outline: 2px solid var(--color-primary-element);
}
}
+ button {
+
+ &:focus-visible {
+ background-color: var(--color-background-hover);
+ border: 2px solid var(--color-primary-element) !important;
+ border-radius: 50%;
+ }
+ }
}
}