@opentui/keymap 0.2.1 → 0.2.3

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.
Files changed (86) hide show
  1. package/README.md +64 -30
  2. package/chunks/index-frk6sdcd.js +409 -0
  3. package/chunks/index-frk6sdcd.js.map +14 -0
  4. package/package.json +43 -23
  5. package/src/addons/index.js +1130 -0
  6. package/src/addons/index.js.map +25 -0
  7. package/src/addons/opentui/edit-buffer-bindings.d.ts +6 -2
  8. package/src/addons/opentui/index.d.ts +2 -2
  9. package/src/addons/opentui/index.js +467 -0
  10. package/src/addons/opentui/index.js.map +12 -0
  11. package/src/addons/universal/binding-overrides.d.ts +6 -0
  12. package/src/addons/universal/dead-bindings.d.ts +1 -1
  13. package/src/addons/universal/default-parser.d.ts +2 -2
  14. package/src/addons/universal/ex-commands.d.ts +11 -8
  15. package/src/addons/universal/index.d.ts +3 -1
  16. package/src/addons/universal/leader.d.ts +1 -1
  17. package/src/addons/universal/metadata.d.ts +2 -2
  18. package/src/addons/universal/mod-bindings.d.ts +6 -0
  19. package/src/addons/universal/unresolved-commands.d.ts +1 -1
  20. package/src/extras/binding-sections.d.ts +18 -0
  21. package/src/extras/command-bindings.d.ts +19 -0
  22. package/src/extras/formatting.d.ts +27 -0
  23. package/src/extras/graph.d.ts +9 -0
  24. package/src/extras/graph.js +373 -0
  25. package/src/extras/graph.js.map +11 -0
  26. package/src/extras/index.d.ts +6 -0
  27. package/src/extras/index.js +239 -0
  28. package/src/extras/index.js.map +12 -0
  29. package/src/extras/lib/graph-snapshot.d.ts +14 -0
  30. package/src/extras/lib/graph-types.d.ts +83 -0
  31. package/src/html.d.ts +3 -3
  32. package/src/html.js +297 -0
  33. package/src/html.js.map +10 -0
  34. package/src/index.d.ts +3 -1
  35. package/src/index.js +4492 -0
  36. package/src/index.js.map +34 -0
  37. package/src/keymap.d.ts +23 -35
  38. package/src/lib/emitter.d.ts +1 -2
  39. package/src/lib/registry.d.ts +2 -2
  40. package/src/lib/runtime-utils.d.ts +34 -0
  41. package/src/opentui.d.ts +1 -3
  42. package/src/opentui.js +133 -0
  43. package/src/opentui.js.map +10 -0
  44. package/src/react/index.d.ts +5 -19
  45. package/{react → src/react}/index.js +3 -0
  46. package/src/react/index.js.map +10 -0
  47. package/src/runtime-modules.d.ts +20 -0
  48. package/src/runtime-modules.js +28 -0
  49. package/src/runtime-modules.js.map +10 -0
  50. package/src/services/activation.d.ts +7 -33
  51. package/src/services/active-key-cache.d.ts +29 -0
  52. package/src/services/command-catalog.d.ts +28 -45
  53. package/src/services/command-executor.d.ts +7 -13
  54. package/src/services/compiler.d.ts +6 -12
  55. package/src/services/conditions.d.ts +4 -16
  56. package/src/services/dispatch-decisions.d.ts +21 -0
  57. package/src/services/dispatch-patterns.d.ts +5 -0
  58. package/src/services/dispatch.d.ts +6 -42
  59. package/src/services/environment.d.ts +6 -21
  60. package/src/services/extension-context.d.ts +16 -0
  61. package/src/services/layer-diagnostics.d.ts +10 -0
  62. package/src/services/layers.d.ts +15 -23
  63. package/src/services/notify.d.ts +6 -8
  64. package/src/services/pending-sequence.d.ts +4 -0
  65. package/src/services/primitives/active-layers.d.ts +2 -3
  66. package/src/services/primitives/bindings.d.ts +4 -0
  67. package/src/services/primitives/command-normalization.d.ts +3 -0
  68. package/src/services/primitives/field-invariants.d.ts +16 -1
  69. package/src/services/primitives/pending-captures.d.ts +5 -0
  70. package/src/services/runtime-view.d.ts +5 -0
  71. package/src/services/runtime.d.ts +2 -7
  72. package/src/services/sequence-index.d.ts +24 -0
  73. package/src/services/state.d.ts +46 -91
  74. package/src/solid/index.d.ts +5 -19
  75. package/{solid → src/solid}/index.js +3 -0
  76. package/src/solid/index.js.map +10 -0
  77. package/src/testing/index.d.ts +90 -0
  78. package/src/testing/index.js +276 -0
  79. package/src/testing/index.js.map +10 -0
  80. package/src/types.d.ts +194 -126
  81. package/addons/index.js +0 -5240
  82. package/addons/opentui/index.js +0 -5632
  83. package/html.js +0 -5042
  84. package/index.js +0 -4411
  85. package/opentui.js +0 -4887
  86. package/src/services/primitives/binding-inputs.d.ts +0 -4
package/src/html.js ADDED
@@ -0,0 +1,297 @@
1
+ // @bun
2
+ // src/html.ts
3
+ import { Keymap } from "@opentui/keymap";
4
+ import { registerDefaultKeys, registerEnabledFields, registerMetadataFields } from "@opentui/keymap/addons";
5
+ var HTML_KEY_NAME_ALIASES = new Map([
6
+ [" ", "space"],
7
+ ["Spacebar", "space"],
8
+ ["ArrowUp", "up"],
9
+ ["ArrowDown", "down"],
10
+ ["ArrowLeft", "left"],
11
+ ["ArrowRight", "right"],
12
+ ["Escape", "escape"],
13
+ ["Esc", "escape"],
14
+ ["Enter", "return"],
15
+ ["Backspace", "backspace"],
16
+ ["Delete", "delete"],
17
+ ["Tab", "tab"],
18
+ ["Home", "home"],
19
+ ["End", "end"],
20
+ ["PageUp", "pageup"],
21
+ ["PageDown", "pagedown"],
22
+ ["Insert", "insert"],
23
+ ["CapsLock", "capslock"],
24
+ ["NumLock", "numlock"],
25
+ ["ScrollLock", "scrolllock"],
26
+ ["ContextMenu", "menu"],
27
+ ["Meta", "super"],
28
+ ["OS", "super"],
29
+ ["Alt", "alt"],
30
+ ["Control", "control"],
31
+ ["Shift", "shift"]
32
+ ]);
33
+ function normalizeHostPlatform(value) {
34
+ const normalized = value?.trim().toLowerCase();
35
+ if (!normalized) {
36
+ return "unknown";
37
+ }
38
+ if (normalized.includes("mac") || normalized.includes("darwin")) {
39
+ return "macos";
40
+ }
41
+ if (normalized.includes("win")) {
42
+ return "windows";
43
+ }
44
+ if (normalized.includes("linux") || normalized.includes("x11")) {
45
+ return "linux";
46
+ }
47
+ return "unknown";
48
+ }
49
+ function detectBrowserPlatform() {
50
+ const navigatorLike = globalThis.navigator;
51
+ const userAgentPlatform = navigatorLike?.userAgentData?.platform;
52
+ const platform = normalizeHostPlatform(userAgentPlatform);
53
+ if (platform !== "unknown") {
54
+ return platform;
55
+ }
56
+ return normalizeHostPlatform(navigatorLike?.platform ?? navigatorLike?.userAgent);
57
+ }
58
+ function createHtmlHostMetadata() {
59
+ const platform = detectBrowserPlatform();
60
+ return {
61
+ platform,
62
+ primaryModifier: platform === "macos" ? "super" : platform === "unknown" ? "unknown" : "ctrl",
63
+ modifiers: {
64
+ ctrl: "supported",
65
+ shift: "supported",
66
+ meta: "supported",
67
+ super: "supported",
68
+ hyper: "unsupported"
69
+ }
70
+ };
71
+ }
72
+ function isPrintableSymbol(name) {
73
+ return name.length === 1 && !/^[a-z0-9]$/i.test(name);
74
+ }
75
+ function getHtmlEventMatchInputs(event) {
76
+ const primary = {
77
+ name: event.name,
78
+ ctrl: event.ctrl,
79
+ shift: event.shift,
80
+ meta: event.meta,
81
+ super: event.super ?? false,
82
+ hyper: event.hyper || undefined
83
+ };
84
+ if (!primary.shift || !isPrintableSymbol(primary.name)) {
85
+ return [primary];
86
+ }
87
+ return [
88
+ primary,
89
+ {
90
+ ...primary,
91
+ shift: false
92
+ }
93
+ ];
94
+ }
95
+
96
+ class HtmlWrappedKeymapEvent {
97
+ name;
98
+ ctrl;
99
+ shift;
100
+ meta;
101
+ superKey;
102
+ originalEvent;
103
+ propagationStopped = false;
104
+ constructor(name, ctrl, shift, meta, superKey, originalEvent) {
105
+ this.name = name;
106
+ this.ctrl = ctrl;
107
+ this.shift = shift;
108
+ this.meta = meta;
109
+ this.superKey = superKey;
110
+ this.originalEvent = originalEvent;
111
+ }
112
+ get super() {
113
+ return this.superKey;
114
+ }
115
+ preventDefault() {
116
+ this.originalEvent?.preventDefault();
117
+ }
118
+ stopPropagation() {
119
+ this.propagationStopped = true;
120
+ this.originalEvent?.stopPropagation();
121
+ }
122
+ }
123
+ function getMutationObserverCtor() {
124
+ return globalThis.MutationObserver;
125
+ }
126
+ function normalizeHtmlKeyName(key) {
127
+ const aliased = HTML_KEY_NAME_ALIASES.get(key);
128
+ if (aliased) {
129
+ return aliased;
130
+ }
131
+ if (/^F\d{1,2}$/i.test(key)) {
132
+ return key.toLowerCase();
133
+ }
134
+ if (key.length === 1) {
135
+ return key.toLowerCase();
136
+ }
137
+ return key.trim().toLowerCase().replace(/\s+/g, "");
138
+ }
139
+ function createHtmlKeymapEvent(event) {
140
+ if (!event) {
141
+ return new HtmlWrappedKeymapEvent("command", false, false, false, false);
142
+ }
143
+ const KeyboardEventCtor = globalThis.KeyboardEvent;
144
+ return new HtmlWrappedKeymapEvent(normalizeHtmlKeyName(event.key), event.ctrlKey, event.shiftKey, event.altKey, event.metaKey, KeyboardEventCtor && event instanceof KeyboardEventCtor ? event : undefined);
145
+ }
146
+
147
+ class HtmlKeymapHost {
148
+ metadata = createHtmlHostMetadata();
149
+ rootTarget;
150
+ isDestroyed = false;
151
+ observer;
152
+ targetDestroyListeners = new Map;
153
+ constructor(root) {
154
+ this.rootTarget = root;
155
+ }
156
+ getFocusedTarget() {
157
+ const active = this.rootTarget.ownerDocument.activeElement;
158
+ if (!active || typeof active !== "object") {
159
+ return null;
160
+ }
161
+ if (active === this.rootTarget || this.rootTarget.contains(active)) {
162
+ return active;
163
+ }
164
+ return null;
165
+ }
166
+ getParentTarget(target) {
167
+ return target.parentElement;
168
+ }
169
+ isTargetDestroyed(target) {
170
+ if (target === this.rootTarget) {
171
+ return false;
172
+ }
173
+ return !target.isConnected || !this.rootTarget.contains(target);
174
+ }
175
+ onKeyPress(listener) {
176
+ const onKeyDown = (event) => {
177
+ listener(createHtmlKeymapEvent(event));
178
+ };
179
+ this.rootTarget.addEventListener("keydown", onKeyDown, { capture: true });
180
+ return () => {
181
+ this.rootTarget.removeEventListener("keydown", onKeyDown, { capture: true });
182
+ };
183
+ }
184
+ onKeyRelease(listener) {
185
+ const onKeyUp = (event) => {
186
+ listener(createHtmlKeymapEvent(event));
187
+ };
188
+ this.rootTarget.addEventListener("keyup", onKeyUp, { capture: true });
189
+ return () => {
190
+ this.rootTarget.removeEventListener("keyup", onKeyUp, { capture: true });
191
+ };
192
+ }
193
+ onFocusChange(listener) {
194
+ const notifyFocus = () => {
195
+ queueMicrotask(() => {
196
+ listener(this.getFocusedTarget());
197
+ });
198
+ };
199
+ this.rootTarget.addEventListener("focusin", notifyFocus, { capture: true });
200
+ this.rootTarget.addEventListener("focusout", notifyFocus, { capture: true });
201
+ return () => {
202
+ this.rootTarget.removeEventListener("focusin", notifyFocus, { capture: true });
203
+ this.rootTarget.removeEventListener("focusout", notifyFocus, { capture: true });
204
+ };
205
+ }
206
+ onTargetDestroy(target, listener) {
207
+ let listeners = this.targetDestroyListeners.get(target);
208
+ if (!listeners) {
209
+ listeners = new Set;
210
+ this.targetDestroyListeners.set(target, listeners);
211
+ }
212
+ listeners.add(listener);
213
+ this.ensureObserver();
214
+ this.flushDisconnectedTargets();
215
+ return () => {
216
+ const current = this.targetDestroyListeners.get(target);
217
+ if (!current) {
218
+ return;
219
+ }
220
+ current.delete(listener);
221
+ if (current.size === 0) {
222
+ this.targetDestroyListeners.delete(target);
223
+ }
224
+ if (this.targetDestroyListeners.size === 0) {
225
+ this.disconnectObserver();
226
+ }
227
+ };
228
+ }
229
+ createCommandEvent() {
230
+ return createHtmlKeymapEvent();
231
+ }
232
+ ensureObserver() {
233
+ if (this.observer || this.targetDestroyListeners.size === 0) {
234
+ return;
235
+ }
236
+ const MutationObserverCtor = getMutationObserverCtor();
237
+ if (!MutationObserverCtor) {
238
+ return;
239
+ }
240
+ this.observer = new MutationObserverCtor(() => {
241
+ this.flushDisconnectedTargets();
242
+ });
243
+ this.observer.observe(this.rootTarget, {
244
+ childList: true,
245
+ subtree: true
246
+ });
247
+ }
248
+ disconnectObserver() {
249
+ if (!this.observer) {
250
+ return;
251
+ }
252
+ this.observer.disconnect();
253
+ this.observer = undefined;
254
+ }
255
+ flushDisconnectedTargets() {
256
+ for (const [target, listeners] of this.targetDestroyListeners) {
257
+ if (!this.isTargetDestroyed(target)) {
258
+ continue;
259
+ }
260
+ this.targetDestroyListeners.delete(target);
261
+ for (const current of [...listeners]) {
262
+ current();
263
+ }
264
+ }
265
+ if (this.targetDestroyListeners.size === 0) {
266
+ this.disconnectObserver();
267
+ }
268
+ }
269
+ }
270
+ function createHtmlKeymapHost(root) {
271
+ return new HtmlKeymapHost(root);
272
+ }
273
+ var htmlEventMatchResolver = (event, ctx) => {
274
+ return getHtmlEventMatchInputs(event).map((candidate) => ctx.resolveKey(candidate));
275
+ };
276
+ function createHtmlKeymap(root) {
277
+ return new Keymap(createHtmlKeymapHost(root));
278
+ }
279
+ function createDefaultHtmlKeymap(root) {
280
+ const keymap = new Keymap(createHtmlKeymapHost(root));
281
+ registerDefaultKeys(keymap);
282
+ registerEnabledFields(keymap);
283
+ registerMetadataFields(keymap);
284
+ keymap.prependEventMatchResolver(htmlEventMatchResolver);
285
+ return keymap;
286
+ }
287
+ export {
288
+ normalizeHtmlKeyName,
289
+ htmlEventMatchResolver,
290
+ createHtmlKeymapHost,
291
+ createHtmlKeymapEvent,
292
+ createHtmlKeymap,
293
+ createDefaultHtmlKeymap
294
+ };
295
+
296
+ //# debugId=3516C87AF5CEEBB664756E2164756E21
297
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/html.ts"],
4
+ "sourcesContent": [
5
+ "import { Keymap } from \"@opentui/keymap\"\nimport { registerDefaultKeys, registerEnabledFields, registerMetadataFields } from \"@opentui/keymap/addons\"\nimport type {\n EventMatchResolver,\n HostMetadata,\n HostPlatform,\n KeyStrokeInput,\n KeymapEvent,\n KeymapHost,\n} from \"@opentui/keymap\"\n\nexport interface HtmlKeymapEvent extends KeymapEvent {\n readonly originalEvent?: KeyboardEvent\n}\n\ninterface HtmlKeyboardEventLike {\n key: string\n ctrlKey: boolean\n shiftKey: boolean\n altKey: boolean\n metaKey: boolean\n preventDefault(): void\n stopPropagation(): void\n}\n\ninterface MutationObserverLike {\n observe(target: EventTarget, options?: unknown): void\n disconnect(): void\n}\n\ninterface MutationObserverCtorLike {\n new (callback: () => void): MutationObserverLike\n}\n\nconst HTML_KEY_NAME_ALIASES = new Map<string, string>([\n [\" \", \"space\"],\n [\"Spacebar\", \"space\"],\n [\"ArrowUp\", \"up\"],\n [\"ArrowDown\", \"down\"],\n [\"ArrowLeft\", \"left\"],\n [\"ArrowRight\", \"right\"],\n [\"Escape\", \"escape\"],\n [\"Esc\", \"escape\"],\n [\"Enter\", \"return\"],\n [\"Backspace\", \"backspace\"],\n [\"Delete\", \"delete\"],\n [\"Tab\", \"tab\"],\n [\"Home\", \"home\"],\n [\"End\", \"end\"],\n [\"PageUp\", \"pageup\"],\n [\"PageDown\", \"pagedown\"],\n [\"Insert\", \"insert\"],\n [\"CapsLock\", \"capslock\"],\n [\"NumLock\", \"numlock\"],\n [\"ScrollLock\", \"scrolllock\"],\n [\"ContextMenu\", \"menu\"],\n [\"Meta\", \"super\"],\n [\"OS\", \"super\"],\n [\"Alt\", \"alt\"],\n [\"Control\", \"control\"],\n [\"Shift\", \"shift\"],\n])\n\nfunction normalizeHostPlatform(value: string | undefined): HostPlatform {\n const normalized = value?.trim().toLowerCase()\n if (!normalized) {\n return \"unknown\"\n }\n\n if (normalized.includes(\"mac\") || normalized.includes(\"darwin\")) {\n return \"macos\"\n }\n\n if (normalized.includes(\"win\")) {\n return \"windows\"\n }\n\n if (normalized.includes(\"linux\") || normalized.includes(\"x11\")) {\n return \"linux\"\n }\n\n return \"unknown\"\n}\n\nfunction detectBrowserPlatform(): HostPlatform {\n const navigatorLike = globalThis.navigator as\n | (Navigator & { userAgentData?: { platform?: string }; userAgent?: string })\n | undefined\n const userAgentPlatform = navigatorLike?.userAgentData?.platform\n const platform = normalizeHostPlatform(userAgentPlatform)\n if (platform !== \"unknown\") {\n return platform\n }\n\n return normalizeHostPlatform(navigatorLike?.platform ?? navigatorLike?.userAgent)\n}\n\nfunction createHtmlHostMetadata(): HostMetadata {\n const platform = detectBrowserPlatform()\n\n return {\n platform,\n primaryModifier: platform === \"macos\" ? \"super\" : platform === \"unknown\" ? \"unknown\" : \"ctrl\",\n modifiers: {\n ctrl: \"supported\",\n shift: \"supported\",\n meta: \"supported\",\n super: \"supported\",\n hyper: \"unsupported\",\n },\n }\n}\n\nfunction isPrintableSymbol(name: string): boolean {\n return name.length === 1 && !/^[a-z0-9]$/i.test(name)\n}\n\nfunction getHtmlEventMatchInputs(event: HtmlKeymapEvent): KeyStrokeInput[] {\n const primary: KeyStrokeInput = {\n name: event.name,\n ctrl: event.ctrl,\n shift: event.shift,\n meta: event.meta,\n super: event.super ?? false,\n hyper: event.hyper || undefined,\n }\n\n if (!primary.shift || !isPrintableSymbol(primary.name)) {\n return [primary]\n }\n\n return [\n primary,\n {\n ...primary,\n shift: false,\n },\n ]\n}\n\nclass HtmlWrappedKeymapEvent implements HtmlKeymapEvent {\n public propagationStopped = false\n\n constructor(\n public readonly name: string,\n public readonly ctrl: boolean,\n public readonly shift: boolean,\n public readonly meta: boolean,\n private readonly superKey: boolean,\n public readonly originalEvent?: KeyboardEvent,\n ) {}\n\n public get super(): boolean {\n return this.superKey\n }\n\n public preventDefault(): void {\n this.originalEvent?.preventDefault()\n }\n\n public stopPropagation(): void {\n this.propagationStopped = true\n this.originalEvent?.stopPropagation()\n }\n}\n\nfunction getMutationObserverCtor(): MutationObserverCtorLike | undefined {\n return globalThis.MutationObserver as MutationObserverCtorLike | undefined\n}\n\nexport function normalizeHtmlKeyName(key: string): string {\n const aliased = HTML_KEY_NAME_ALIASES.get(key)\n if (aliased) {\n return aliased\n }\n\n if (/^F\\d{1,2}$/i.test(key)) {\n return key.toLowerCase()\n }\n\n if (key.length === 1) {\n return key.toLowerCase()\n }\n\n return key.trim().toLowerCase().replace(/\\s+/g, \"\")\n}\n\nexport function createHtmlKeymapEvent(event?: KeyboardEvent | HtmlKeyboardEventLike): HtmlKeymapEvent {\n if (!event) {\n return new HtmlWrappedKeymapEvent(\"command\", false, false, false, false)\n }\n\n const KeyboardEventCtor = globalThis.KeyboardEvent\n\n // Keymap uses `meta` for Alt/Option and `super` for the platform Meta key,\n // so browser `altKey` maps to `meta` and `metaKey` maps to `super`.\n return new HtmlWrappedKeymapEvent(\n normalizeHtmlKeyName(event.key),\n event.ctrlKey,\n event.shiftKey,\n event.altKey,\n event.metaKey,\n KeyboardEventCtor && event instanceof KeyboardEventCtor ? event : undefined,\n )\n}\n\nclass HtmlKeymapHost implements KeymapHost<HTMLElement, HtmlKeymapEvent> {\n public readonly metadata = createHtmlHostMetadata()\n public readonly rootTarget: HTMLElement\n public readonly isDestroyed = false\n\n private observer?: MutationObserverLike\n private readonly targetDestroyListeners = new Map<HTMLElement, Set<() => void>>()\n\n constructor(root: HTMLElement) {\n this.rootTarget = root\n }\n\n public getFocusedTarget(): HTMLElement | null {\n const active = this.rootTarget.ownerDocument.activeElement\n if (!active || typeof active !== \"object\") {\n return null\n }\n\n if (active === this.rootTarget || this.rootTarget.contains(active as HTMLElement)) {\n return active as HTMLElement\n }\n\n return null\n }\n\n public getParentTarget(target: HTMLElement): HTMLElement | null {\n return target.parentElement\n }\n\n public isTargetDestroyed(target: HTMLElement): boolean {\n if (target === this.rootTarget) {\n return false\n }\n\n return !target.isConnected || !this.rootTarget.contains(target)\n }\n\n public onKeyPress(listener: (event: HtmlKeymapEvent) => void): () => void {\n const onKeyDown = (event: KeyboardEvent) => {\n listener(createHtmlKeymapEvent(event))\n }\n\n this.rootTarget.addEventListener(\"keydown\", onKeyDown, { capture: true })\n return () => {\n this.rootTarget.removeEventListener(\"keydown\", onKeyDown, { capture: true })\n }\n }\n\n public onKeyRelease(listener: (event: HtmlKeymapEvent) => void): () => void {\n const onKeyUp = (event: KeyboardEvent) => {\n listener(createHtmlKeymapEvent(event))\n }\n\n this.rootTarget.addEventListener(\"keyup\", onKeyUp, { capture: true })\n return () => {\n this.rootTarget.removeEventListener(\"keyup\", onKeyUp, { capture: true })\n }\n }\n\n public onFocusChange(listener: (target: HTMLElement | null) => void): () => void {\n const notifyFocus = () => {\n queueMicrotask(() => {\n listener(this.getFocusedTarget())\n })\n }\n\n this.rootTarget.addEventListener(\"focusin\", notifyFocus, { capture: true })\n this.rootTarget.addEventListener(\"focusout\", notifyFocus, { capture: true })\n return () => {\n this.rootTarget.removeEventListener(\"focusin\", notifyFocus, { capture: true })\n this.rootTarget.removeEventListener(\"focusout\", notifyFocus, { capture: true })\n }\n }\n\n public onTargetDestroy(target: HTMLElement, listener: () => void): () => void {\n let listeners = this.targetDestroyListeners.get(target)\n if (!listeners) {\n listeners = new Set()\n this.targetDestroyListeners.set(target, listeners)\n }\n\n listeners.add(listener)\n this.ensureObserver()\n this.flushDisconnectedTargets()\n\n return () => {\n const current = this.targetDestroyListeners.get(target)\n if (!current) {\n return\n }\n\n current.delete(listener)\n if (current.size === 0) {\n this.targetDestroyListeners.delete(target)\n }\n\n if (this.targetDestroyListeners.size === 0) {\n this.disconnectObserver()\n }\n }\n }\n\n public createCommandEvent(): HtmlKeymapEvent {\n return createHtmlKeymapEvent()\n }\n\n private ensureObserver(): void {\n if (this.observer || this.targetDestroyListeners.size === 0) {\n return\n }\n\n const MutationObserverCtor = getMutationObserverCtor()\n if (!MutationObserverCtor) {\n return\n }\n\n this.observer = new MutationObserverCtor(() => {\n this.flushDisconnectedTargets()\n })\n this.observer.observe(this.rootTarget, {\n childList: true,\n subtree: true,\n })\n }\n\n private disconnectObserver(): void {\n if (!this.observer) {\n return\n }\n\n this.observer.disconnect()\n this.observer = undefined\n }\n\n private flushDisconnectedTargets(): void {\n for (const [target, listeners] of this.targetDestroyListeners) {\n if (!this.isTargetDestroyed(target)) {\n continue\n }\n\n this.targetDestroyListeners.delete(target)\n for (const current of [...listeners]) {\n current()\n }\n }\n\n if (this.targetDestroyListeners.size === 0) {\n this.disconnectObserver()\n }\n }\n}\n\nexport function createHtmlKeymapHost(root: HTMLElement): KeymapHost<HTMLElement, HtmlKeymapEvent> {\n return new HtmlKeymapHost(root)\n}\n\nexport const htmlEventMatchResolver: EventMatchResolver<HtmlKeymapEvent> = (event, ctx) => {\n return getHtmlEventMatchInputs(event).map((candidate) => ctx.resolveKey(candidate))\n}\n\nexport function createHtmlKeymap(root: HTMLElement): Keymap<HTMLElement, HtmlKeymapEvent> {\n return new Keymap(createHtmlKeymapHost(root))\n}\n\nexport function createDefaultHtmlKeymap(root: HTMLElement): Keymap<HTMLElement, HtmlKeymapEvent> {\n const keymap = new Keymap(createHtmlKeymapHost(root))\n registerDefaultKeys(keymap)\n registerEnabledFields(keymap)\n registerMetadataFields(keymap)\n keymap.prependEventMatchResolver(htmlEventMatchResolver)\n return keymap\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "3516C87AF5CEEBB664756E2164756E21",
9
+ "names": []
10
+ }
package/src/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { Keymap } from "./keymap.js";
2
+ export { KEYMAP_EXTENSION_CONTEXT } from "./services/extension-context.js";
2
3
  export { stringifyKeySequence, stringifyKeyStroke } from "./services/keys.js";
3
- export type { KeyLike, KeyMatch, ActiveBinding, KeyStringifyInput, StringifyOptions, Attributes, BindingCommand, BindingParser, BindingParserContext, BindingParserResult, BindingExpander, BindingExpanderContext, BindingEvent, BindingFieldCompiler, BindingFieldContext, BindingInput, BindingTransformer, BindingTransformerContext, ParsedBindingInput, BindingShorthand, Bindings, ActiveKey, ActiveKeyOptions, Listener, ErrorEvent, CommandDefinition, CommandEntry, CommandFilter, CommandQuery, CommandQueryValue, CommandRecord, RunCommandOptions, RunCommandResult, CommandHandler, CommandFieldCompiler, CommandFieldContext, CommandContext, CommandResolver, CommandResolverContext, CommandResult, EventData, KeyInputContext, KeymapEvent, KeymapHost, FocusLayer, FocusWithinLayer, GlobalLayer, LayerAnalysisContext, LayerBindingAnalysis, LayerAnalyzer, LayerFieldCompiler, LayerFieldContext, LayerFields, Layer, EventName, Events, InterceptName, Intercepts, KeyInterceptOptions, ParsedCommand, RawInterceptOptions, RawInputContext, ReactiveMatcher, WarningEvent, ResolvedBindingCommand, TargetMode, EventMatchResolverContext, EventMatchResolver, KeyDisambiguationContext, KeyDisambiguationDecision, KeyDeferredDisambiguationContext, KeyDeferredDisambiguationDecision, KeyDeferredDisambiguationHandler, KeyDisambiguationResolver, TargetLayer, KeyToken, ResolvedKeyToken, KeySequencePart, NormalizedKeyStroke, KeyStrokeInput, } from "./types.js";
4
+ export type { KeymapExtensionContext, KeymapExtensionProvider } from "./services/extension-context.js";
5
+ export type { KeyLike, KeyMatch, ActiveBinding, KeyStringifyInput, StringifyOptions, Attributes, BindingCommand, BindingParser, BindingParserContext, BindingParserResult, BindingExpansion, BindingExpander, BindingExpanderContext, BindingEvent, BindingFieldCompiler, BindingFieldContext, Binding, BindingsValidationResult, LayerBindingsTransformer, LayerBindingsTransformerContext, BindingTransformer, BindingTransformerContext, ParsedBinding, Bindings, ActiveKey, ActiveKeyOptions, DispatchBinding, DispatchEvent, DispatchLayer, DispatchPhase, KeyAfterInputContext, KeyAfterReason, Listener, ErrorEvent, Command, CommandEntry, CommandFilter, CommandBindingsQuery, CommandQuery, CommandQueryValue, RunCommandOptions, RunCommandResult, CommandHandler, CommandTransformer, CommandTransformerContext, CommandFieldCompiler, CommandFieldContext, CommandContext, CommandResolver, CommandResolverContext, CommandResult, EventData, KeyInputContext, KeymapEvent, KeymapHost, HostCapability, HostMetadata, HostModifier, HostPlatform, LayerAnalysisContext, LayerBindingAnalysis, LayerAnalyzer, LayerFieldCompiler, LayerFieldContext, Layer, EventName, Events, InterceptName, Intercepts, KeyInterceptOptions, ParsedCommand, RawInterceptOptions, RawInputContext, ReactiveMatcher, WarningEvent, TargetMode, EventMatchResolverContext, EventMatchResolver, KeyDisambiguationContext, KeyDisambiguationDecision, KeyDeferredDisambiguationContext, KeyDeferredDisambiguationDecision, KeyDeferredDisambiguationHandler, KeyDisambiguationResolver, KeyToken, SequencePattern, SequencePatternMatch, ResolvedSequencePattern, ResolvedKeyToken, KeySequencePart, NormalizedKeyStroke, KeyStrokeInput, } from "./types.js";