keyborg 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,8 +3,11 @@ export interface KeyborgFocusInEventDetails {
3
3
  relatedTarget?: HTMLElement;
4
4
  isFocusedProgrammatically?: boolean;
5
5
  }
6
- export interface KeyborgFocusInEvent extends Event {
7
- details: KeyborgFocusInEventDetails;
6
+ export interface KeyborgFocusInEvent extends CustomEvent<KeyborgFocusInEventDetails> {
7
+ /**
8
+ * @deprecated - used `event.detail`
9
+ */
10
+ details?: KeyborgFocusInEventDetails;
8
11
  }
9
12
  /**
10
13
  * Guarantees that the native `focus` will be used
@@ -9,17 +9,3 @@ export declare const _canUseWeakRef: boolean;
9
9
  export interface Disposable {
10
10
  isDisposed?(): boolean;
11
11
  }
12
- /**
13
- * WeakRef wrapper around a HTMLElement that also supports IE11
14
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef}
15
- * @internal
16
- */
17
- export declare class WeakRefInstance<T extends Disposable | object> {
18
- private _weakRef?;
19
- private _instance?;
20
- constructor(instance: T);
21
- /**
22
- * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef/deref}
23
- */
24
- deref(): T | undefined;
25
- }
package/dist/index.js CHANGED
@@ -105,30 +105,60 @@ function setupFocusEvent(win) {
105
105
  }
106
106
 
107
107
  kwin.HTMLElement.prototype.focus = focus;
108
- const data = kwin.__keyborgData = {
109
- focusInHandler: e => {
110
- var _a;
111
108
 
112
- const target = e.target;
109
+ const focusOutShadowRootHandler = e => {
110
+ const relatedTarget = e.relatedTarget;
111
+ const currentTarget = e.currentTarget; // cleanup polyfill event handlers once focus leaves the shadow root
113
112
 
114
- if (!target) {
115
- return;
116
- }
113
+ if (!currentTarget.contains(relatedTarget)) {
114
+ currentTarget.removeEventListener("focusin", focusInHandler);
115
+ currentTarget.removeEventListener("focusout", focusOutShadowRootHandler);
116
+ }
117
+ };
117
118
 
118
- const event = document.createEvent("HTMLEvents");
119
- event.initEvent(KEYBORG_FOCUSIN, true, true);
120
- const details = {
121
- relatedTarget: e.relatedTarget || undefined
122
- };
119
+ const focusInHandler = e => {
120
+ var _a;
123
121
 
124
- if (_canOverrideNativeFocus || data.lastFocusedProgrammatically) {
125
- details.isFocusedProgrammatically = target === ((_a = data.lastFocusedProgrammatically) === null || _a === void 0 ? void 0 : _a.deref());
126
- data.lastFocusedProgrammatically = undefined;
127
- }
122
+ let target = e.target;
123
+
124
+ if (!target) {
125
+ return;
126
+ }
128
127
 
129
- event.details = details;
130
- target.dispatchEvent(event);
128
+ if (target.shadowRoot) {
129
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=1512028
130
+ // focusin events don't bubble up through an open shadow root once focus is inside
131
+ // once focus moves into a shadow root - we drop the same focusin handler there
132
+ // keyborg's custom event will still bubble up since it is composed
133
+ // event handlers should be cleaned up once focus leaves the shadow root
134
+ target.shadowRoot.addEventListener("focusin", focusInHandler);
135
+ target.shadowRoot.addEventListener("focusout", focusOutShadowRootHandler);
136
+ target = e.composedPath()[0];
137
+ }
138
+
139
+ const details = {
140
+ relatedTarget: e.relatedTarget || undefined
141
+ };
142
+ const event = new CustomEvent(KEYBORG_FOCUSIN, {
143
+ cancelable: true,
144
+ bubbles: true,
145
+ // Allows the event to bubble past an open shadow root
146
+ composed: true,
147
+ detail: details
148
+ }); // Tabster (and other users) can still use the legacy details field - keeping for backwards compat
149
+
150
+ event.details = details;
151
+
152
+ if (_canOverrideNativeFocus || data.lastFocusedProgrammatically) {
153
+ details.isFocusedProgrammatically = target === ((_a = data.lastFocusedProgrammatically) === null || _a === void 0 ? void 0 : _a.deref());
154
+ data.lastFocusedProgrammatically = undefined;
131
155
  }
156
+
157
+ target.dispatchEvent(event);
158
+ };
159
+
160
+ const data = kwin.__keyborgData = {
161
+ focusInHandler
132
162
  };
133
163
  kwin.document.addEventListener("focusin", kwin.__keyborgData.focusInHandler, true);
134
164
 
@@ -258,7 +288,7 @@ class KeyborgCore {
258
288
  return;
259
289
  }
260
290
 
261
- const details = e.details;
291
+ const details = e.detail;
262
292
 
263
293
  if (!details.relatedTarget) {
264
294
  return;
@@ -530,7 +560,7 @@ function disposeKeyborg(instance) {
530
560
  * Copyright (c) Microsoft Corporation. All rights reserved.
531
561
  * Licensed under the MIT License.
532
562
  */
533
- const version = "2.2.0";
563
+ const version = "2.3.0";
534
564
 
535
565
  exports.KEYBORG_FOCUSIN = KEYBORG_FOCUSIN;
536
566
  exports.Keyborg = Keyborg;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/WeakRefInstance.ts","../src/FocusEvent.ts","../src/Keyborg.ts","../src/index.ts"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// IE11 compat, checks if WeakRef is supported\nexport const _canUseWeakRef = typeof WeakRef !== \"undefined\";\n\n/**\n * Allows disposable instances to be used\n */\nexport interface Disposable {\n isDisposed?(): boolean;\n}\n\n/**\n * WeakRef wrapper around a HTMLElement that also supports IE11\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef}\n * @internal\n */\nexport class WeakRefInstance<T extends Disposable | object> {\n private _weakRef?: WeakRef<T>;\n private _instance?: T;\n\n constructor(instance: T) {\n if (_canUseWeakRef && typeof instance === \"object\") {\n this._weakRef = new WeakRef(instance);\n } else {\n this._instance = instance;\n }\n }\n\n /**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef/deref}\n */\n deref(): T | undefined {\n let instance: T | undefined;\n\n if (this._weakRef) {\n instance = this._weakRef?.deref();\n\n if (!instance) {\n delete this._weakRef;\n }\n } else {\n instance = this._instance;\n if ((instance as Disposable)?.isDisposed?.()) {\n delete this._instance;\n }\n }\n\n return instance;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { WeakRefInstance } from \"./WeakRefInstance\";\n\nexport const KEYBORG_FOCUSIN = \"keyborg:focusin\";\n\ninterface KeyborgFocus {\n /**\n * This is the native `focus` function that is retained so that it can be restored when keyborg is disposed\n */\n __keyborgNativeFocus?: (options?: FocusOptions | undefined) => void;\n}\n\ninterface KeyborgFocusEventData {\n focusInHandler: (e: FocusEvent) => void;\n lastFocusedProgrammatically?: WeakRefInstance<HTMLElement>;\n}\n\n/**\n * Extends the global window with keyborg focus event data\n */\ninterface WindowWithKeyborgFocusEvent extends Window {\n HTMLElement: typeof HTMLElement;\n __keyborgData?: KeyborgFocusEventData;\n}\n\nfunction canOverrideNativeFocus(win: Window): boolean {\n const HTMLElement = (win as WindowWithKeyborgFocusEvent).HTMLElement;\n const origFocus = HTMLElement.prototype.focus;\n\n let isCustomFocusCalled = false;\n\n HTMLElement.prototype.focus = function focus(): void {\n isCustomFocusCalled = true;\n };\n\n const btn = win.document.createElement(\"button\");\n\n btn.focus();\n\n HTMLElement.prototype.focus = origFocus;\n\n return isCustomFocusCalled;\n}\n\nlet _canOverrideNativeFocus = false;\n\nexport interface KeyborgFocusInEventDetails {\n relatedTarget?: HTMLElement;\n isFocusedProgrammatically?: boolean;\n}\n\nexport interface KeyborgFocusInEvent\n extends CustomEvent<KeyborgFocusInEventDetails> {\n /**\n * @deprecated - used `event.detail`\n */\n details?: KeyborgFocusInEventDetails;\n}\n\n/**\n * Guarantees that the native `focus` will be used\n */\nexport function nativeFocus(element: HTMLElement): void {\n const focus = element.focus as KeyborgFocus;\n\n if (focus.__keyborgNativeFocus) {\n focus.__keyborgNativeFocus.call(element);\n } else {\n element.focus();\n }\n}\n\n/**\n * Overrides the native `focus` and setups the keyborg focus event\n */\nexport function setupFocusEvent(win: Window): void {\n const kwin = win as WindowWithKeyborgFocusEvent;\n\n if (!_canOverrideNativeFocus) {\n _canOverrideNativeFocus = canOverrideNativeFocus(kwin);\n }\n\n const origFocus = kwin.HTMLElement.prototype.focus;\n\n if ((origFocus as KeyborgFocus).__keyborgNativeFocus) {\n // Already set up.\n return;\n }\n\n kwin.HTMLElement.prototype.focus = focus;\n\n const focusOutShadowRootHandler = (e: FocusEvent) => {\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n const currentTarget = e.currentTarget as ShadowRoot;\n\n // cleanup polyfill event handlers once focus leaves the shadow root\n if (!currentTarget.contains(relatedTarget)) {\n currentTarget.removeEventListener(\"focusin\", focusInHandler);\n currentTarget.removeEventListener(\"focusout\", focusOutShadowRootHandler);\n }\n };\n\n const focusInHandler = (e: FocusEvent) => {\n let target = e.target as HTMLElement;\n if (!target) {\n return;\n }\n\n if (target.shadowRoot) {\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1512028\n // focusin events don't bubble up through an open shadow root once focus is inside\n // once focus moves into a shadow root - we drop the same focusin handler there\n // keyborg's custom event will still bubble up since it is composed\n // event handlers should be cleaned up once focus leaves the shadow root\n target.shadowRoot.addEventListener(\"focusin\", focusInHandler);\n target.shadowRoot.addEventListener(\"focusout\", focusOutShadowRootHandler);\n target = e.composedPath()[0] as HTMLElement;\n }\n\n const details: KeyborgFocusInEventDetails = {\n relatedTarget: (e.relatedTarget as HTMLElement) || undefined,\n };\n\n const event: KeyborgFocusInEvent = new CustomEvent(KEYBORG_FOCUSIN, {\n cancelable: true,\n bubbles: true,\n // Allows the event to bubble past an open shadow root\n composed: true,\n detail: details,\n });\n\n // Tabster (and other users) can still use the legacy details field - keeping for backwards compat\n event.details = details;\n\n if (_canOverrideNativeFocus || data.lastFocusedProgrammatically) {\n details.isFocusedProgrammatically =\n target === data.lastFocusedProgrammatically?.deref();\n\n data.lastFocusedProgrammatically = undefined;\n }\n\n target.dispatchEvent(event);\n };\n\n const data: KeyborgFocusEventData = (kwin.__keyborgData = {\n focusInHandler,\n });\n\n kwin.document.addEventListener(\n \"focusin\",\n kwin.__keyborgData.focusInHandler,\n true\n );\n\n function focus(this: HTMLElement) {\n const keyborgNativeFocusEvent = (kwin as WindowWithKeyborgFocusEvent)\n .__keyborgData;\n\n if (keyborgNativeFocusEvent) {\n keyborgNativeFocusEvent.lastFocusedProgrammatically = new WeakRefInstance(\n this\n );\n }\n\n // eslint-disable-next-line prefer-rest-params\n return origFocus.apply(this, arguments);\n }\n\n (focus as KeyborgFocus).__keyborgNativeFocus = origFocus;\n}\n\n/**\n * Removes keyborg event listeners and custom focus override\n * @param win The window that stores keyborg focus events\n */\nexport function disposeFocusEvent(win: Window): void {\n const kwin = win as WindowWithKeyborgFocusEvent;\n const proto = kwin.HTMLElement.prototype;\n const origFocus = (proto.focus as KeyborgFocus).__keyborgNativeFocus;\n const keyborgNativeFocusEvent = kwin.__keyborgData;\n\n if (keyborgNativeFocusEvent) {\n kwin.document.removeEventListener(\n \"focusin\",\n keyborgNativeFocusEvent.focusInHandler,\n true\n );\n delete kwin.__keyborgData;\n }\n\n if (origFocus) {\n proto.focus = origFocus;\n }\n}\n\n/**\n * @param win The window that stores keyborg focus events\n * @returns The last element focused with element.focus()\n */\nexport function getLastFocusedProgrammatically(\n win: Window\n): HTMLElement | null | undefined {\n const keyborgNativeFocusEvent = (win as WindowWithKeyborgFocusEvent)\n .__keyborgData;\n\n return keyborgNativeFocusEvent\n ? keyborgNativeFocusEvent.lastFocusedProgrammatically?.deref() || null\n : undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n disposeFocusEvent,\n KeyborgFocusInEvent,\n KEYBORG_FOCUSIN,\n setupFocusEvent,\n} from \"./FocusEvent\";\nimport { Disposable, WeakRefInstance } from \"./WeakRefInstance\";\n\ninterface WindowWithKeyborg extends Window {\n __keyborg?: {\n core: KeyborgCore;\n refs: { [id: string]: Keyborg };\n };\n}\n\nconst _dismissTimeout = 500; // When a key from dismissKeys is pressed and the focus is not moved\n// during _dismissTimeout time, dismiss the keyboard navigation mode.\n\nlet _lastId = 0;\n\nexport interface KeyborgProps {\n // Keys to be used to trigger keyboard navigation mode. By default, any key will trigger\n // it. Could be limited to, for example, just Tab (or Tab and arrow keys).\n triggerKeys?: number[];\n // Keys to be used to dismiss keyboard navigation mode using keyboard (in addition to\n // mouse clicks which dismiss it). For example, Esc could be used to dismiss.\n dismissKeys?: number[];\n}\n\nexport type KeyborgCallback = (isNavigatingWithKeyboard: boolean) => void;\n\n/**\n * Source of truth for all the keyborg core instances and the current keyboard navigation state\n */\nexport class KeyborgState {\n private __keyborgCoreRefs: { [id: string]: WeakRefInstance<KeyborgCore> } =\n {};\n private _isNavigatingWithKeyboard = false;\n\n add(keyborg: KeyborgCore): void {\n const id = keyborg.id;\n\n if (!(id in this.__keyborgCoreRefs)) {\n this.__keyborgCoreRefs[id] = new WeakRefInstance<KeyborgCore>(keyborg);\n }\n }\n\n remove(id: string): void {\n delete this.__keyborgCoreRefs[id];\n\n if (Object.keys(this.__keyborgCoreRefs).length === 0) {\n this._isNavigatingWithKeyboard = false;\n }\n }\n\n setVal(isNavigatingWithKeyboard: boolean): void {\n if (this._isNavigatingWithKeyboard === isNavigatingWithKeyboard) {\n return;\n }\n\n this._isNavigatingWithKeyboard = isNavigatingWithKeyboard;\n\n for (const id of Object.keys(this.__keyborgCoreRefs)) {\n const ref = this.__keyborgCoreRefs[id];\n const keyborg = ref.deref();\n\n if (keyborg) {\n keyborg.update(isNavigatingWithKeyboard);\n } else {\n this.remove(id);\n }\n }\n }\n\n getVal(): boolean {\n return this._isNavigatingWithKeyboard;\n }\n}\n\nconst _state = new KeyborgState();\n\n/**\n * Manages a collection of Keyborg instances in a window/document and updates keyborg state\n */\nclass KeyborgCore implements Disposable {\n readonly id: string;\n\n private _win?: WindowWithKeyborg;\n private _isMouseUsedTimer: number | undefined;\n private _dismissTimer: number | undefined;\n private _triggerKeys?: Set<number>;\n private _dismissKeys?: Set<number>;\n\n constructor(win: WindowWithKeyborg, props?: KeyborgProps) {\n this.id = \"c\" + ++_lastId;\n this._win = win;\n const doc = win.document;\n\n if (props) {\n const triggerKeys = props.triggerKeys;\n const dismissKeys = props.dismissKeys;\n\n if (triggerKeys?.length) {\n this._triggerKeys = new Set(triggerKeys);\n }\n\n if (dismissKeys?.length) {\n this._dismissKeys = new Set(dismissKeys);\n }\n }\n\n doc.addEventListener(KEYBORG_FOCUSIN, this._onFocusIn, true); // Capture!\n doc.addEventListener(\"mousedown\", this._onMouseDown, true); // Capture!\n win.addEventListener(\"keydown\", this._onKeyDown, true); // Capture!\n\n setupFocusEvent(win);\n\n _state.add(this);\n }\n\n dispose(): void {\n const win = this._win;\n\n if (win) {\n if (this._isMouseUsedTimer) {\n win.clearTimeout(this._isMouseUsedTimer);\n this._isMouseUsedTimer = undefined;\n }\n\n if (this._dismissTimer) {\n win.clearTimeout(this._dismissTimer);\n this._dismissTimer = undefined;\n }\n\n disposeFocusEvent(win);\n\n const doc = win.document;\n\n doc.removeEventListener(KEYBORG_FOCUSIN, this._onFocusIn, true); // Capture!\n doc.removeEventListener(\"mousedown\", this._onMouseDown, true); // Capture!\n win.removeEventListener(\"keydown\", this._onKeyDown, true); // Capture!\n\n delete this._win;\n\n _state.remove(this.id);\n }\n }\n\n isDisposed(): boolean {\n return !!this._win;\n }\n\n /**\n * Updates all keyborg instances with the keyboard navigation state\n */\n update(isNavigatingWithKeyboard: boolean): void {\n const keyborgs = this._win?.__keyborg?.refs;\n\n if (keyborgs) {\n for (const id of Object.keys(keyborgs)) {\n Keyborg.update(keyborgs[id], isNavigatingWithKeyboard);\n }\n }\n }\n\n private _onFocusIn = (e: KeyborgFocusInEvent) => {\n // When the focus is moved not programmatically and without keydown events,\n // it is likely that the focus is moved by screen reader (as it might swallow\n // the events when the screen reader shortcuts are used). The screen reader\n // usage is keyboard navigation.\n\n if (this._isMouseUsedTimer) {\n // There was a mouse event recently.\n return;\n }\n\n if (_state.getVal()) {\n return;\n }\n\n const details = e.detail;\n\n if (!details.relatedTarget) {\n return;\n }\n\n if (\n details.isFocusedProgrammatically ||\n details.isFocusedProgrammatically === undefined\n ) {\n // The element is focused programmatically, or the programmatic focus detection\n // is not working.\n return;\n }\n\n _state.setVal(true);\n };\n\n private _onMouseDown = (e: MouseEvent): void => {\n if (\n e.buttons === 0 ||\n (e.clientX === 0 && e.clientY === 0 && e.screenX === 0 && e.screenY === 0)\n ) {\n // This is most likely an event triggered by the screen reader to perform\n // an action on an element, do not dismiss the keyboard navigation mode.\n return;\n }\n\n const win = this._win;\n\n if (win) {\n if (this._isMouseUsedTimer) {\n win.clearTimeout(this._isMouseUsedTimer);\n }\n\n this._isMouseUsedTimer = win.setTimeout(() => {\n delete this._isMouseUsedTimer;\n }, 1000); // Keeping the indication of the mouse usage for some time.\n }\n\n _state.setVal(false);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n const isNavigatingWithKeyboard = _state.getVal();\n\n const keyCode = e.keyCode;\n const triggerKeys = this._triggerKeys;\n\n if (\n !isNavigatingWithKeyboard &&\n (!triggerKeys || triggerKeys.has(keyCode))\n ) {\n const activeElement = this._win?.document.activeElement as\n | HTMLElement\n | null\n | undefined;\n\n if (\n activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.contentEditable === \"true\")\n ) {\n // We're inside an input, textarea or contenteditable, it's not\n // keyboard navigation, it is text editing scenario.\n return;\n }\n\n _state.setVal(true);\n } else if (isNavigatingWithKeyboard && this._dismissKeys?.has(keyCode)) {\n this._scheduleDismiss();\n }\n };\n\n private _scheduleDismiss(): void {\n const win = this._win;\n\n if (win) {\n if (this._dismissTimer) {\n win.clearTimeout(this._dismissTimer);\n this._dismissTimer = undefined;\n }\n\n const was = win.document.activeElement;\n\n this._dismissTimer = win.setTimeout(() => {\n this._dismissTimer = undefined;\n\n const cur = win.document.activeElement;\n\n if (was && cur && was === cur) {\n // Esc was pressed, currently focused element hasn't changed.\n // Just dismiss the keyboard navigation mode.\n _state.setVal(false);\n }\n }, _dismissTimeout);\n }\n }\n}\n\n/**\n * Used to determine the keyboard navigation state\n */\nexport class Keyborg {\n private _id: string;\n private _win?: WindowWithKeyborg;\n private _core?: KeyborgCore;\n private _cb: KeyborgCallback[] = [];\n\n static create(win: WindowWithKeyborg, props?: KeyborgProps): Keyborg {\n return new Keyborg(win, props);\n }\n\n static dispose(instance: Keyborg): void {\n instance.dispose();\n }\n\n /**\n * Updates all subscribed callbacks with the keyboard navigation state\n */\n static update(instance: Keyborg, isNavigatingWithKeyboard: boolean): void {\n instance._cb.forEach((callback) => callback(isNavigatingWithKeyboard));\n }\n\n private constructor(win: WindowWithKeyborg, props?: KeyborgProps) {\n this._id = \"k\" + ++_lastId;\n this._win = win;\n\n const current = win.__keyborg;\n\n if (current) {\n this._core = current.core;\n current.refs[this._id] = this;\n } else {\n this._core = new KeyborgCore(win, props);\n win.__keyborg = {\n core: this._core,\n refs: { [this._id]: this },\n };\n }\n }\n\n private dispose(): void {\n const current = this._win?.__keyborg;\n\n if (current?.refs[this._id]) {\n delete current.refs[this._id];\n\n if (Object.keys(current.refs).length === 0) {\n current.core.dispose();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n delete this._win!.__keyborg;\n }\n } else if (__DEV__) {\n console.error(\n `Keyborg instance ${this._id} is being disposed incorrectly.`\n );\n }\n\n this._cb = [];\n delete this._core;\n delete this._win;\n }\n\n /**\n * @returns Whether the user is navigating with keyboard\n */\n isNavigatingWithKeyboard(): boolean {\n return _state.getVal();\n }\n\n /**\n * @param callback - Called when the keyboard navigation state changes\n */\n subscribe(callback: KeyborgCallback): void {\n this._cb.push(callback);\n }\n\n /**\n * @param callback - Registered with subscribe\n */\n unsubscribe(callback: KeyborgCallback): void {\n const index = this._cb.indexOf(callback);\n\n if (index >= 0) {\n this._cb.splice(index, 1);\n }\n }\n\n /**\n * Manually set the keyboard navigtion state\n */\n setVal(isNavigatingWithKeyboard: boolean): void {\n _state.setVal(isNavigatingWithKeyboard);\n }\n}\n\nexport function createKeyborg(win: Window, props?: KeyborgProps): Keyborg {\n return Keyborg.create(win, props);\n}\n\nexport function disposeKeyborg(instance: Keyborg) {\n Keyborg.dispose(instance);\n}\n","/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n Keyborg,\n KeyborgCallback,\n createKeyborg,\n disposeKeyborg,\n} from \"./Keyborg\";\n\nexport {\n getLastFocusedProgrammatically,\n nativeFocus,\n KEYBORG_FOCUSIN,\n KeyborgFocusInEvent,\n KeyborgFocusInEventDetails,\n} from \"./FocusEvent\";\n\nexport const version = __VERSION__;\n"],"names":["_canUseWeakRef","WeakRef","WeakRefInstance","constructor","instance","_weakRef","_instance","deref","isDisposed","KEYBORG_FOCUSIN","canOverrideNativeFocus","win","HTMLElement","origFocus","prototype","focus","isCustomFocusCalled","btn","document","createElement","_canOverrideNativeFocus","nativeFocus","element","__keyborgNativeFocus","call","setupFocusEvent","kwin","focusOutShadowRootHandler","e","relatedTarget","currentTarget","contains","removeEventListener","focusInHandler","target","shadowRoot","addEventListener","composedPath","details","undefined","event","CustomEvent","cancelable","bubbles","composed","detail","data","lastFocusedProgrammatically","isFocusedProgrammatically","dispatchEvent","__keyborgData","keyborgNativeFocusEvent","apply","arguments","disposeFocusEvent","proto","getLastFocusedProgrammatically","_dismissTimeout","_lastId","KeyborgState","add","keyborg","id","__keyborgCoreRefs","remove","Object","keys","length","_isNavigatingWithKeyboard","setVal","isNavigatingWithKeyboard","ref","update","getVal","_state","KeyborgCore","props","_isMouseUsedTimer","buttons","clientX","clientY","screenX","screenY","_win","clearTimeout","setTimeout","keyCode","triggerKeys","_triggerKeys","has","activeElement","tagName","contentEditable","_dismissKeys","_scheduleDismiss","doc","dismissKeys","Set","_onFocusIn","_onMouseDown","_onKeyDown","dispose","_dismissTimer","keyborgs","__keyborg","refs","Keyborg","was","cur","_id","current","_core","core","create","_cb","forEach","callback","__DEV__","console","error","subscribe","push","unsubscribe","index","indexOf","splice","createKeyborg","disposeKeyborg","version","__VERSION__"],"mappings":"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"}
@@ -101,30 +101,60 @@ function setupFocusEvent(win) {
101
101
  }
102
102
 
103
103
  kwin.HTMLElement.prototype.focus = focus;
104
- const data = kwin.__keyborgData = {
105
- focusInHandler: e => {
106
- var _a;
107
104
 
108
- const target = e.target;
105
+ const focusOutShadowRootHandler = e => {
106
+ const relatedTarget = e.relatedTarget;
107
+ const currentTarget = e.currentTarget; // cleanup polyfill event handlers once focus leaves the shadow root
109
108
 
110
- if (!target) {
111
- return;
112
- }
109
+ if (!currentTarget.contains(relatedTarget)) {
110
+ currentTarget.removeEventListener("focusin", focusInHandler);
111
+ currentTarget.removeEventListener("focusout", focusOutShadowRootHandler);
112
+ }
113
+ };
113
114
 
114
- const event = document.createEvent("HTMLEvents");
115
- event.initEvent(KEYBORG_FOCUSIN, true, true);
116
- const details = {
117
- relatedTarget: e.relatedTarget || undefined
118
- };
115
+ const focusInHandler = e => {
116
+ var _a;
119
117
 
120
- if (_canOverrideNativeFocus || data.lastFocusedProgrammatically) {
121
- details.isFocusedProgrammatically = target === ((_a = data.lastFocusedProgrammatically) === null || _a === void 0 ? void 0 : _a.deref());
122
- data.lastFocusedProgrammatically = undefined;
123
- }
118
+ let target = e.target;
119
+
120
+ if (!target) {
121
+ return;
122
+ }
124
123
 
125
- event.details = details;
126
- target.dispatchEvent(event);
124
+ if (target.shadowRoot) {
125
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=1512028
126
+ // focusin events don't bubble up through an open shadow root once focus is inside
127
+ // once focus moves into a shadow root - we drop the same focusin handler there
128
+ // keyborg's custom event will still bubble up since it is composed
129
+ // event handlers should be cleaned up once focus leaves the shadow root
130
+ target.shadowRoot.addEventListener("focusin", focusInHandler);
131
+ target.shadowRoot.addEventListener("focusout", focusOutShadowRootHandler);
132
+ target = e.composedPath()[0];
133
+ }
134
+
135
+ const details = {
136
+ relatedTarget: e.relatedTarget || undefined
137
+ };
138
+ const event = new CustomEvent(KEYBORG_FOCUSIN, {
139
+ cancelable: true,
140
+ bubbles: true,
141
+ // Allows the event to bubble past an open shadow root
142
+ composed: true,
143
+ detail: details
144
+ }); // Tabster (and other users) can still use the legacy details field - keeping for backwards compat
145
+
146
+ event.details = details;
147
+
148
+ if (_canOverrideNativeFocus || data.lastFocusedProgrammatically) {
149
+ details.isFocusedProgrammatically = target === ((_a = data.lastFocusedProgrammatically) === null || _a === void 0 ? void 0 : _a.deref());
150
+ data.lastFocusedProgrammatically = undefined;
127
151
  }
152
+
153
+ target.dispatchEvent(event);
154
+ };
155
+
156
+ const data = kwin.__keyborgData = {
157
+ focusInHandler
128
158
  };
129
159
  kwin.document.addEventListener("focusin", kwin.__keyborgData.focusInHandler, true);
130
160
 
@@ -254,7 +284,7 @@ class KeyborgCore {
254
284
  return;
255
285
  }
256
286
 
257
- const details = e.details;
287
+ const details = e.detail;
258
288
 
259
289
  if (!details.relatedTarget) {
260
290
  return;
@@ -526,7 +556,7 @@ function disposeKeyborg(instance) {
526
556
  * Copyright (c) Microsoft Corporation. All rights reserved.
527
557
  * Licensed under the MIT License.
528
558
  */
529
- const version = "2.2.0";
559
+ const version = "2.3.0";
530
560
 
531
561
  export { KEYBORG_FOCUSIN, Keyborg, createKeyborg, disposeKeyborg, getLastFocusedProgrammatically, nativeFocus, version };
532
562
  //# sourceMappingURL=keyborg.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keyborg.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"keyborg.esm.js","sources":["../src/WeakRefInstance.ts","../src/FocusEvent.ts","../src/Keyborg.ts","../src/index.ts"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\n// IE11 compat, checks if WeakRef is supported\nexport const _canUseWeakRef = typeof WeakRef !== \"undefined\";\n\n/**\n * Allows disposable instances to be used\n */\nexport interface Disposable {\n isDisposed?(): boolean;\n}\n\n/**\n * WeakRef wrapper around a HTMLElement that also supports IE11\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef}\n * @internal\n */\nexport class WeakRefInstance<T extends Disposable | object> {\n private _weakRef?: WeakRef<T>;\n private _instance?: T;\n\n constructor(instance: T) {\n if (_canUseWeakRef && typeof instance === \"object\") {\n this._weakRef = new WeakRef(instance);\n } else {\n this._instance = instance;\n }\n }\n\n /**\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef/deref}\n */\n deref(): T | undefined {\n let instance: T | undefined;\n\n if (this._weakRef) {\n instance = this._weakRef?.deref();\n\n if (!instance) {\n delete this._weakRef;\n }\n } else {\n instance = this._instance;\n if ((instance as Disposable)?.isDisposed?.()) {\n delete this._instance;\n }\n }\n\n return instance;\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { WeakRefInstance } from \"./WeakRefInstance\";\n\nexport const KEYBORG_FOCUSIN = \"keyborg:focusin\";\n\ninterface KeyborgFocus {\n /**\n * This is the native `focus` function that is retained so that it can be restored when keyborg is disposed\n */\n __keyborgNativeFocus?: (options?: FocusOptions | undefined) => void;\n}\n\ninterface KeyborgFocusEventData {\n focusInHandler: (e: FocusEvent) => void;\n lastFocusedProgrammatically?: WeakRefInstance<HTMLElement>;\n}\n\n/**\n * Extends the global window with keyborg focus event data\n */\ninterface WindowWithKeyborgFocusEvent extends Window {\n HTMLElement: typeof HTMLElement;\n __keyborgData?: KeyborgFocusEventData;\n}\n\nfunction canOverrideNativeFocus(win: Window): boolean {\n const HTMLElement = (win as WindowWithKeyborgFocusEvent).HTMLElement;\n const origFocus = HTMLElement.prototype.focus;\n\n let isCustomFocusCalled = false;\n\n HTMLElement.prototype.focus = function focus(): void {\n isCustomFocusCalled = true;\n };\n\n const btn = win.document.createElement(\"button\");\n\n btn.focus();\n\n HTMLElement.prototype.focus = origFocus;\n\n return isCustomFocusCalled;\n}\n\nlet _canOverrideNativeFocus = false;\n\nexport interface KeyborgFocusInEventDetails {\n relatedTarget?: HTMLElement;\n isFocusedProgrammatically?: boolean;\n}\n\nexport interface KeyborgFocusInEvent\n extends CustomEvent<KeyborgFocusInEventDetails> {\n /**\n * @deprecated - used `event.detail`\n */\n details?: KeyborgFocusInEventDetails;\n}\n\n/**\n * Guarantees that the native `focus` will be used\n */\nexport function nativeFocus(element: HTMLElement): void {\n const focus = element.focus as KeyborgFocus;\n\n if (focus.__keyborgNativeFocus) {\n focus.__keyborgNativeFocus.call(element);\n } else {\n element.focus();\n }\n}\n\n/**\n * Overrides the native `focus` and setups the keyborg focus event\n */\nexport function setupFocusEvent(win: Window): void {\n const kwin = win as WindowWithKeyborgFocusEvent;\n\n if (!_canOverrideNativeFocus) {\n _canOverrideNativeFocus = canOverrideNativeFocus(kwin);\n }\n\n const origFocus = kwin.HTMLElement.prototype.focus;\n\n if ((origFocus as KeyborgFocus).__keyborgNativeFocus) {\n // Already set up.\n return;\n }\n\n kwin.HTMLElement.prototype.focus = focus;\n\n const focusOutShadowRootHandler = (e: FocusEvent) => {\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n const currentTarget = e.currentTarget as ShadowRoot;\n\n // cleanup polyfill event handlers once focus leaves the shadow root\n if (!currentTarget.contains(relatedTarget)) {\n currentTarget.removeEventListener(\"focusin\", focusInHandler);\n currentTarget.removeEventListener(\"focusout\", focusOutShadowRootHandler);\n }\n };\n\n const focusInHandler = (e: FocusEvent) => {\n let target = e.target as HTMLElement;\n if (!target) {\n return;\n }\n\n if (target.shadowRoot) {\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1512028\n // focusin events don't bubble up through an open shadow root once focus is inside\n // once focus moves into a shadow root - we drop the same focusin handler there\n // keyborg's custom event will still bubble up since it is composed\n // event handlers should be cleaned up once focus leaves the shadow root\n target.shadowRoot.addEventListener(\"focusin\", focusInHandler);\n target.shadowRoot.addEventListener(\"focusout\", focusOutShadowRootHandler);\n target = e.composedPath()[0] as HTMLElement;\n }\n\n const details: KeyborgFocusInEventDetails = {\n relatedTarget: (e.relatedTarget as HTMLElement) || undefined,\n };\n\n const event: KeyborgFocusInEvent = new CustomEvent(KEYBORG_FOCUSIN, {\n cancelable: true,\n bubbles: true,\n // Allows the event to bubble past an open shadow root\n composed: true,\n detail: details,\n });\n\n // Tabster (and other users) can still use the legacy details field - keeping for backwards compat\n event.details = details;\n\n if (_canOverrideNativeFocus || data.lastFocusedProgrammatically) {\n details.isFocusedProgrammatically =\n target === data.lastFocusedProgrammatically?.deref();\n\n data.lastFocusedProgrammatically = undefined;\n }\n\n target.dispatchEvent(event);\n };\n\n const data: KeyborgFocusEventData = (kwin.__keyborgData = {\n focusInHandler,\n });\n\n kwin.document.addEventListener(\n \"focusin\",\n kwin.__keyborgData.focusInHandler,\n true\n );\n\n function focus(this: HTMLElement) {\n const keyborgNativeFocusEvent = (kwin as WindowWithKeyborgFocusEvent)\n .__keyborgData;\n\n if (keyborgNativeFocusEvent) {\n keyborgNativeFocusEvent.lastFocusedProgrammatically = new WeakRefInstance(\n this\n );\n }\n\n // eslint-disable-next-line prefer-rest-params\n return origFocus.apply(this, arguments);\n }\n\n (focus as KeyborgFocus).__keyborgNativeFocus = origFocus;\n}\n\n/**\n * Removes keyborg event listeners and custom focus override\n * @param win The window that stores keyborg focus events\n */\nexport function disposeFocusEvent(win: Window): void {\n const kwin = win as WindowWithKeyborgFocusEvent;\n const proto = kwin.HTMLElement.prototype;\n const origFocus = (proto.focus as KeyborgFocus).__keyborgNativeFocus;\n const keyborgNativeFocusEvent = kwin.__keyborgData;\n\n if (keyborgNativeFocusEvent) {\n kwin.document.removeEventListener(\n \"focusin\",\n keyborgNativeFocusEvent.focusInHandler,\n true\n );\n delete kwin.__keyborgData;\n }\n\n if (origFocus) {\n proto.focus = origFocus;\n }\n}\n\n/**\n * @param win The window that stores keyborg focus events\n * @returns The last element focused with element.focus()\n */\nexport function getLastFocusedProgrammatically(\n win: Window\n): HTMLElement | null | undefined {\n const keyborgNativeFocusEvent = (win as WindowWithKeyborgFocusEvent)\n .__keyborgData;\n\n return keyborgNativeFocusEvent\n ? keyborgNativeFocusEvent.lastFocusedProgrammatically?.deref() || null\n : undefined;\n}\n","/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n disposeFocusEvent,\n KeyborgFocusInEvent,\n KEYBORG_FOCUSIN,\n setupFocusEvent,\n} from \"./FocusEvent\";\nimport { Disposable, WeakRefInstance } from \"./WeakRefInstance\";\n\ninterface WindowWithKeyborg extends Window {\n __keyborg?: {\n core: KeyborgCore;\n refs: { [id: string]: Keyborg };\n };\n}\n\nconst _dismissTimeout = 500; // When a key from dismissKeys is pressed and the focus is not moved\n// during _dismissTimeout time, dismiss the keyboard navigation mode.\n\nlet _lastId = 0;\n\nexport interface KeyborgProps {\n // Keys to be used to trigger keyboard navigation mode. By default, any key will trigger\n // it. Could be limited to, for example, just Tab (or Tab and arrow keys).\n triggerKeys?: number[];\n // Keys to be used to dismiss keyboard navigation mode using keyboard (in addition to\n // mouse clicks which dismiss it). For example, Esc could be used to dismiss.\n dismissKeys?: number[];\n}\n\nexport type KeyborgCallback = (isNavigatingWithKeyboard: boolean) => void;\n\n/**\n * Source of truth for all the keyborg core instances and the current keyboard navigation state\n */\nexport class KeyborgState {\n private __keyborgCoreRefs: { [id: string]: WeakRefInstance<KeyborgCore> } =\n {};\n private _isNavigatingWithKeyboard = false;\n\n add(keyborg: KeyborgCore): void {\n const id = keyborg.id;\n\n if (!(id in this.__keyborgCoreRefs)) {\n this.__keyborgCoreRefs[id] = new WeakRefInstance<KeyborgCore>(keyborg);\n }\n }\n\n remove(id: string): void {\n delete this.__keyborgCoreRefs[id];\n\n if (Object.keys(this.__keyborgCoreRefs).length === 0) {\n this._isNavigatingWithKeyboard = false;\n }\n }\n\n setVal(isNavigatingWithKeyboard: boolean): void {\n if (this._isNavigatingWithKeyboard === isNavigatingWithKeyboard) {\n return;\n }\n\n this._isNavigatingWithKeyboard = isNavigatingWithKeyboard;\n\n for (const id of Object.keys(this.__keyborgCoreRefs)) {\n const ref = this.__keyborgCoreRefs[id];\n const keyborg = ref.deref();\n\n if (keyborg) {\n keyborg.update(isNavigatingWithKeyboard);\n } else {\n this.remove(id);\n }\n }\n }\n\n getVal(): boolean {\n return this._isNavigatingWithKeyboard;\n }\n}\n\nconst _state = new KeyborgState();\n\n/**\n * Manages a collection of Keyborg instances in a window/document and updates keyborg state\n */\nclass KeyborgCore implements Disposable {\n readonly id: string;\n\n private _win?: WindowWithKeyborg;\n private _isMouseUsedTimer: number | undefined;\n private _dismissTimer: number | undefined;\n private _triggerKeys?: Set<number>;\n private _dismissKeys?: Set<number>;\n\n constructor(win: WindowWithKeyborg, props?: KeyborgProps) {\n this.id = \"c\" + ++_lastId;\n this._win = win;\n const doc = win.document;\n\n if (props) {\n const triggerKeys = props.triggerKeys;\n const dismissKeys = props.dismissKeys;\n\n if (triggerKeys?.length) {\n this._triggerKeys = new Set(triggerKeys);\n }\n\n if (dismissKeys?.length) {\n this._dismissKeys = new Set(dismissKeys);\n }\n }\n\n doc.addEventListener(KEYBORG_FOCUSIN, this._onFocusIn, true); // Capture!\n doc.addEventListener(\"mousedown\", this._onMouseDown, true); // Capture!\n win.addEventListener(\"keydown\", this._onKeyDown, true); // Capture!\n\n setupFocusEvent(win);\n\n _state.add(this);\n }\n\n dispose(): void {\n const win = this._win;\n\n if (win) {\n if (this._isMouseUsedTimer) {\n win.clearTimeout(this._isMouseUsedTimer);\n this._isMouseUsedTimer = undefined;\n }\n\n if (this._dismissTimer) {\n win.clearTimeout(this._dismissTimer);\n this._dismissTimer = undefined;\n }\n\n disposeFocusEvent(win);\n\n const doc = win.document;\n\n doc.removeEventListener(KEYBORG_FOCUSIN, this._onFocusIn, true); // Capture!\n doc.removeEventListener(\"mousedown\", this._onMouseDown, true); // Capture!\n win.removeEventListener(\"keydown\", this._onKeyDown, true); // Capture!\n\n delete this._win;\n\n _state.remove(this.id);\n }\n }\n\n isDisposed(): boolean {\n return !!this._win;\n }\n\n /**\n * Updates all keyborg instances with the keyboard navigation state\n */\n update(isNavigatingWithKeyboard: boolean): void {\n const keyborgs = this._win?.__keyborg?.refs;\n\n if (keyborgs) {\n for (const id of Object.keys(keyborgs)) {\n Keyborg.update(keyborgs[id], isNavigatingWithKeyboard);\n }\n }\n }\n\n private _onFocusIn = (e: KeyborgFocusInEvent) => {\n // When the focus is moved not programmatically and without keydown events,\n // it is likely that the focus is moved by screen reader (as it might swallow\n // the events when the screen reader shortcuts are used). The screen reader\n // usage is keyboard navigation.\n\n if (this._isMouseUsedTimer) {\n // There was a mouse event recently.\n return;\n }\n\n if (_state.getVal()) {\n return;\n }\n\n const details = e.detail;\n\n if (!details.relatedTarget) {\n return;\n }\n\n if (\n details.isFocusedProgrammatically ||\n details.isFocusedProgrammatically === undefined\n ) {\n // The element is focused programmatically, or the programmatic focus detection\n // is not working.\n return;\n }\n\n _state.setVal(true);\n };\n\n private _onMouseDown = (e: MouseEvent): void => {\n if (\n e.buttons === 0 ||\n (e.clientX === 0 && e.clientY === 0 && e.screenX === 0 && e.screenY === 0)\n ) {\n // This is most likely an event triggered by the screen reader to perform\n // an action on an element, do not dismiss the keyboard navigation mode.\n return;\n }\n\n const win = this._win;\n\n if (win) {\n if (this._isMouseUsedTimer) {\n win.clearTimeout(this._isMouseUsedTimer);\n }\n\n this._isMouseUsedTimer = win.setTimeout(() => {\n delete this._isMouseUsedTimer;\n }, 1000); // Keeping the indication of the mouse usage for some time.\n }\n\n _state.setVal(false);\n };\n\n private _onKeyDown = (e: KeyboardEvent): void => {\n const isNavigatingWithKeyboard = _state.getVal();\n\n const keyCode = e.keyCode;\n const triggerKeys = this._triggerKeys;\n\n if (\n !isNavigatingWithKeyboard &&\n (!triggerKeys || triggerKeys.has(keyCode))\n ) {\n const activeElement = this._win?.document.activeElement as\n | HTMLElement\n | null\n | undefined;\n\n if (\n activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.contentEditable === \"true\")\n ) {\n // We're inside an input, textarea or contenteditable, it's not\n // keyboard navigation, it is text editing scenario.\n return;\n }\n\n _state.setVal(true);\n } else if (isNavigatingWithKeyboard && this._dismissKeys?.has(keyCode)) {\n this._scheduleDismiss();\n }\n };\n\n private _scheduleDismiss(): void {\n const win = this._win;\n\n if (win) {\n if (this._dismissTimer) {\n win.clearTimeout(this._dismissTimer);\n this._dismissTimer = undefined;\n }\n\n const was = win.document.activeElement;\n\n this._dismissTimer = win.setTimeout(() => {\n this._dismissTimer = undefined;\n\n const cur = win.document.activeElement;\n\n if (was && cur && was === cur) {\n // Esc was pressed, currently focused element hasn't changed.\n // Just dismiss the keyboard navigation mode.\n _state.setVal(false);\n }\n }, _dismissTimeout);\n }\n }\n}\n\n/**\n * Used to determine the keyboard navigation state\n */\nexport class Keyborg {\n private _id: string;\n private _win?: WindowWithKeyborg;\n private _core?: KeyborgCore;\n private _cb: KeyborgCallback[] = [];\n\n static create(win: WindowWithKeyborg, props?: KeyborgProps): Keyborg {\n return new Keyborg(win, props);\n }\n\n static dispose(instance: Keyborg): void {\n instance.dispose();\n }\n\n /**\n * Updates all subscribed callbacks with the keyboard navigation state\n */\n static update(instance: Keyborg, isNavigatingWithKeyboard: boolean): void {\n instance._cb.forEach((callback) => callback(isNavigatingWithKeyboard));\n }\n\n private constructor(win: WindowWithKeyborg, props?: KeyborgProps) {\n this._id = \"k\" + ++_lastId;\n this._win = win;\n\n const current = win.__keyborg;\n\n if (current) {\n this._core = current.core;\n current.refs[this._id] = this;\n } else {\n this._core = new KeyborgCore(win, props);\n win.__keyborg = {\n core: this._core,\n refs: { [this._id]: this },\n };\n }\n }\n\n private dispose(): void {\n const current = this._win?.__keyborg;\n\n if (current?.refs[this._id]) {\n delete current.refs[this._id];\n\n if (Object.keys(current.refs).length === 0) {\n current.core.dispose();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n delete this._win!.__keyborg;\n }\n } else if (__DEV__) {\n console.error(\n `Keyborg instance ${this._id} is being disposed incorrectly.`\n );\n }\n\n this._cb = [];\n delete this._core;\n delete this._win;\n }\n\n /**\n * @returns Whether the user is navigating with keyboard\n */\n isNavigatingWithKeyboard(): boolean {\n return _state.getVal();\n }\n\n /**\n * @param callback - Called when the keyboard navigation state changes\n */\n subscribe(callback: KeyborgCallback): void {\n this._cb.push(callback);\n }\n\n /**\n * @param callback - Registered with subscribe\n */\n unsubscribe(callback: KeyborgCallback): void {\n const index = this._cb.indexOf(callback);\n\n if (index >= 0) {\n this._cb.splice(index, 1);\n }\n }\n\n /**\n * Manually set the keyboard navigtion state\n */\n setVal(isNavigatingWithKeyboard: boolean): void {\n _state.setVal(isNavigatingWithKeyboard);\n }\n}\n\nexport function createKeyborg(win: Window, props?: KeyborgProps): Keyborg {\n return Keyborg.create(win, props);\n}\n\nexport function disposeKeyborg(instance: Keyborg) {\n Keyborg.dispose(instance);\n}\n","/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport {\n Keyborg,\n KeyborgCallback,\n createKeyborg,\n disposeKeyborg,\n} from \"./Keyborg\";\n\nexport {\n getLastFocusedProgrammatically,\n nativeFocus,\n KEYBORG_FOCUSIN,\n KeyborgFocusInEvent,\n KeyborgFocusInEventDetails,\n} from \"./FocusEvent\";\n\nexport const version = __VERSION__;\n"],"names":["_canUseWeakRef","WeakRef","WeakRefInstance","constructor","instance","_weakRef","_instance","deref","isDisposed","KEYBORG_FOCUSIN","canOverrideNativeFocus","win","HTMLElement","origFocus","prototype","focus","isCustomFocusCalled","btn","document","createElement","_canOverrideNativeFocus","nativeFocus","element","__keyborgNativeFocus","call","setupFocusEvent","kwin","focusOutShadowRootHandler","e","relatedTarget","currentTarget","contains","removeEventListener","focusInHandler","target","shadowRoot","addEventListener","composedPath","details","undefined","event","CustomEvent","cancelable","bubbles","composed","detail","data","lastFocusedProgrammatically","isFocusedProgrammatically","dispatchEvent","__keyborgData","keyborgNativeFocusEvent","apply","arguments","disposeFocusEvent","proto","getLastFocusedProgrammatically","_dismissTimeout","_lastId","KeyborgState","add","keyborg","id","__keyborgCoreRefs","remove","Object","keys","length","_isNavigatingWithKeyboard","setVal","isNavigatingWithKeyboard","ref","update","getVal","_state","KeyborgCore","props","_isMouseUsedTimer","buttons","clientX","clientY","screenX","screenY","_win","clearTimeout","setTimeout","keyCode","triggerKeys","_triggerKeys","has","activeElement","tagName","contentEditable","_dismissKeys","_scheduleDismiss","doc","dismissKeys","Set","_onFocusIn","_onMouseDown","_onKeyDown","dispose","_dismissTimer","keyborgs","__keyborg","refs","Keyborg","was","cur","_id","current","_core","core","create","_cb","forEach","callback","__DEV__","console","error","subscribe","push","unsubscribe","index","indexOf","splice","createKeyborg","disposeKeyborg","version","__VERSION__"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keyborg",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Keyboard Navigation Detection for Web",
5
5
  "author": "Marat Abdullin <marata@microsoft.com>",
6
6
  "license": "MIT",