Skip to content

Commit b1bb4fe

Browse files
authored
Merge pull request #40 from github/composition
Prevent keyboard events during text composition inside of details-menu
2 parents 0876179 + 2590a24 commit b1bb4fe

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

index.js

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class DetailsMenuElement extends HTMLElement {
3838
}
3939

4040
const subscriptions = [
41+
fromEvent(details, 'compositionstart', e => trackComposition(this, e)),
42+
fromEvent(details, 'compositionend', e => trackComposition(this, e)),
4143
fromEvent(details, 'click', e => shouldCommit(details, this, e)),
4244
fromEvent(details, 'change', e => shouldCommit(details, this, e)),
4345
fromEvent(details, 'keydown', e => keydown(details, this, e)),
@@ -49,7 +51,7 @@ class DetailsMenuElement extends HTMLElement {
4951
...focusOnOpen(details)
5052
]
5153

52-
states.set(this, {subscriptions, loaded: false})
54+
states.set(this, {subscriptions, loaded: false, isComposing: false})
5355
}
5456

5557
disconnectedCallback() {
@@ -214,10 +216,12 @@ function commit(selected: Element, details: Element) {
214216

215217
function keydown(details: Element, menu: DetailsMenuElement, event: Event) {
216218
if (!(event instanceof KeyboardEvent)) return
217-
const isSummaryFocused = event.target instanceof Element && event.target.tagName === 'SUMMARY'
218-
219219
// Ignore key presses from nested details.
220220
if (details.querySelector('details[open]')) return
221+
const state = states.get(menu)
222+
if (!state || state.isComposing) return
223+
224+
const isSummaryFocused = event.target instanceof Element && event.target.tagName === 'SUMMARY'
221225

222226
switch (event.key) {
223227
case 'Escape':
@@ -318,6 +322,12 @@ function labelHTML(el: ?Element): ?string {
318322
return contentsEl ? contentsEl.innerHTML : null
319323
}
320324

325+
function trackComposition(menu, event: Event) {
326+
const state = states.get(menu)
327+
if (!state) return
328+
state.isComposing = event.type === 'compositionstart'
329+
}
330+
321331
export default DetailsMenuElement
322332

323333
if (!window.customElements.get('details-menu')) {

0 commit comments

Comments
 (0)