@opentui/keymap 0.0.0-20260423-76a94f40

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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +54 -0
  3. package/addons/index.js +4390 -0
  4. package/addons/opentui/index.js +4712 -0
  5. package/html.js +4151 -0
  6. package/index.js +3631 -0
  7. package/opentui.js +3996 -0
  8. package/package.json +85 -0
  9. package/react/index.js +151 -0
  10. package/solid/index.js +119 -0
  11. package/src/addons/index.d.ts +1 -0
  12. package/src/addons/opentui/base-layout.d.ts +7 -0
  13. package/src/addons/opentui/edit-buffer-bindings.d.ts +38 -0
  14. package/src/addons/opentui/index.d.ts +4 -0
  15. package/src/addons/universal/aliases.d.ts +7 -0
  16. package/src/addons/universal/backspace-pops-pending-sequence.d.ts +13 -0
  17. package/src/addons/universal/comma-bindings.d.ts +6 -0
  18. package/src/addons/universal/dead-bindings.d.ts +6 -0
  19. package/src/addons/universal/default-parser.d.ts +16 -0
  20. package/src/addons/universal/emacs-bindings.d.ts +5 -0
  21. package/src/addons/universal/enabled.d.ts +16 -0
  22. package/src/addons/universal/escape-clears-pending-sequence.d.ts +14 -0
  23. package/src/addons/universal/ex-commands.d.ts +16 -0
  24. package/src/addons/universal/index.d.ts +21 -0
  25. package/src/addons/universal/leader.d.ts +9 -0
  26. package/src/addons/universal/metadata.d.ts +6 -0
  27. package/src/addons/universal/timed-leader.d.ts +12 -0
  28. package/src/addons/universal/unresolved-commands.d.ts +6 -0
  29. package/src/html.d.ts +21 -0
  30. package/src/index.d.ts +3 -0
  31. package/src/keymap-benchmark.d.ts +1 -0
  32. package/src/keymap.d.ts +73 -0
  33. package/src/lib/emitter.d.ts +13 -0
  34. package/src/lib/registry.d.ts +28 -0
  35. package/src/opentui.d.ts +7 -0
  36. package/src/react/index.d.ts +42 -0
  37. package/src/schema.d.ts +3 -0
  38. package/src/services/activation.d.ts +44 -0
  39. package/src/services/command-catalog.d.ts +49 -0
  40. package/src/services/command-executor.d.ts +22 -0
  41. package/src/services/compiler.d.ts +21 -0
  42. package/src/services/conditions.d.ts +20 -0
  43. package/src/services/dispatch.d.ts +34 -0
  44. package/src/services/environment.d.ts +25 -0
  45. package/src/services/keys.d.ts +18 -0
  46. package/src/services/layers.d.ts +34 -0
  47. package/src/services/notify.d.ts +18 -0
  48. package/src/services/primitives/active-layers.d.ts +5 -0
  49. package/src/services/primitives/binding-inputs.d.ts +4 -0
  50. package/src/services/primitives/field-invariants.d.ts +3 -0
  51. package/src/services/runtime.d.ts +15 -0
  52. package/src/services/state.d.ts +102 -0
  53. package/src/services/values.d.ts +7 -0
  54. package/src/solid/index.d.ts +45 -0
  55. package/src/types.d.ts +497 -0
package/package.json ADDED
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "@opentui/keymap",
3
+ "module": "index.js",
4
+ "main": "index.js",
5
+ "types": "src/index.d.ts",
6
+ "type": "module",
7
+ "version": "0.0.0-20260423-76a94f40",
8
+ "description": "Standalone keymap package for OpenTUI",
9
+ "license": "MIT",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/anomalyco/opentui",
13
+ "directory": "packages/keymap"
14
+ },
15
+ "exports": {
16
+ ".": {
17
+ "types": "./src/index.d.ts",
18
+ "import": "./index.js",
19
+ "require": "./index.js"
20
+ },
21
+ "./addons": {
22
+ "types": "./src/addons/index.d.ts",
23
+ "import": "./addons/index.js",
24
+ "require": "./addons/index.js"
25
+ },
26
+ "./addons/opentui": {
27
+ "types": "./src/addons/opentui/index.d.ts",
28
+ "import": "./addons/opentui/index.js",
29
+ "require": "./addons/opentui/index.js"
30
+ },
31
+ "./html": {
32
+ "types": "./src/html.d.ts",
33
+ "import": "./html.js",
34
+ "require": "./html.js"
35
+ },
36
+ "./opentui": {
37
+ "types": "./src/opentui.d.ts",
38
+ "import": "./opentui.js",
39
+ "require": "./opentui.js"
40
+ },
41
+ "./react": {
42
+ "types": "./src/react/index.d.ts",
43
+ "import": "./react/index.js",
44
+ "require": "./react/index.js"
45
+ },
46
+ "./solid": {
47
+ "types": "./src/solid/index.d.ts",
48
+ "import": "./solid/index.js",
49
+ "require": "./solid/index.js"
50
+ }
51
+ },
52
+ "dependencies": {
53
+ "@opentui/core": "0.0.0-20260423-76a94f40"
54
+ },
55
+ "devDependencies": {
56
+ "@opentui/react": "workspace:*",
57
+ "@opentui/solid": "workspace:*",
58
+ "@types/bun": "latest",
59
+ "@types/node": "^24.0.0",
60
+ "@types/react": "^19.0.0",
61
+ "react": ">=19.0.0",
62
+ "solid-js": "1.9.11",
63
+ "typescript": "^5"
64
+ },
65
+ "peerDependencies": {
66
+ "@opentui/react": "0.0.0-20260423-76a94f40",
67
+ "@opentui/solid": "0.0.0-20260423-76a94f40",
68
+ "react": ">=19.0.0",
69
+ "solid-js": "1.9.11"
70
+ },
71
+ "peerDependenciesMeta": {
72
+ "@opentui/react": {
73
+ "optional": true
74
+ },
75
+ "@opentui/solid": {
76
+ "optional": true
77
+ },
78
+ "react": {
79
+ "optional": true
80
+ },
81
+ "solid-js": {
82
+ "optional": true
83
+ }
84
+ }
85
+ }
package/react/index.js ADDED
@@ -0,0 +1,151 @@
1
+ // @bun
2
+ // src/react/index.ts
3
+ import {
4
+ createElement,
5
+ createContext,
6
+ useCallback,
7
+ useContext,
8
+ useEffect,
9
+ useLayoutEffect,
10
+ useMemo,
11
+ useReducer,
12
+ useRef
13
+ } from "react";
14
+ var KeymapContext = createContext(null);
15
+ function KeymapProvider({ keymap, children }) {
16
+ return createElement(KeymapContext.Provider, { value: keymap }, children);
17
+ }
18
+ function resolveBindingsTarget(target) {
19
+ if (typeof target === "function") {
20
+ return target() ?? undefined;
21
+ }
22
+ return target ?? undefined;
23
+ }
24
+ var useKeymap = () => {
25
+ const keymap = useContext(KeymapContext);
26
+ if (!keymap) {
27
+ throw new Error("Keymap not found. Wrap the tree in <KeymapProvider>.");
28
+ }
29
+ return keymap;
30
+ };
31
+ function useKeymapStateVersion(keymap) {
32
+ const [version, bumpVersion] = useReducer((value) => value + 1, 0);
33
+ useLayoutEffect(() => {
34
+ const dispose = keymap.on("state", () => {
35
+ bumpVersion();
36
+ });
37
+ return () => {
38
+ dispose();
39
+ };
40
+ }, [keymap]);
41
+ return version;
42
+ }
43
+ var useActiveKeys = (options) => {
44
+ const keymap = useKeymap();
45
+ const version = useKeymapStateVersion(keymap);
46
+ return useMemo(() => {
47
+ return keymap.getActiveKeys(options);
48
+ }, [keymap, options, version]);
49
+ };
50
+ var usePendingSequence = () => {
51
+ const keymap = useKeymap();
52
+ const version = useKeymapStateVersion(keymap);
53
+ return useMemo(() => {
54
+ return keymap.getPendingSequence();
55
+ }, [keymap, version]);
56
+ };
57
+ function useBindings(createLayer, deps = []) {
58
+ const keymap = useKeymap();
59
+ const layer = useMemo(createLayer, deps);
60
+ const layerRef = useRef(layer);
61
+ const refTargetRef = useRef(undefined);
62
+ const disposeRef = useRef(undefined);
63
+ const mountedRef = useRef(false);
64
+ const registeredScopeRef = useRef(undefined);
65
+ const registeredTargetRef = useRef(undefined);
66
+ layerRef.current = layer;
67
+ const unregister = useCallback(() => {
68
+ disposeRef.current?.();
69
+ disposeRef.current = undefined;
70
+ registeredScopeRef.current = undefined;
71
+ registeredTargetRef.current = undefined;
72
+ }, []);
73
+ const register = useCallback(() => {
74
+ if (disposeRef.current) {
75
+ return;
76
+ }
77
+ const currentLayer = layerRef.current;
78
+ const explicitTarget = resolveBindingsTarget(currentLayer.target);
79
+ const resolvedTarget = explicitTarget ?? refTargetRef.current;
80
+ const resolvedScope = currentLayer.scope ?? (resolvedTarget ? "focus-within" : "global");
81
+ if (currentLayer.target !== undefined && !explicitTarget) {
82
+ throw new Error("useBindings target was not available during mount");
83
+ }
84
+ if (resolvedScope !== "global" && !resolvedTarget) {
85
+ throw new Error("useBindings local bindings need a target or the returned ref callback attached to a renderable");
86
+ }
87
+ const { scope: _scope, target: _target, ...baseLayer } = currentLayer;
88
+ const resolvedLayer = resolvedScope === "global" ? {
89
+ ...baseLayer,
90
+ scope: "global"
91
+ } : {
92
+ ...baseLayer,
93
+ scope: resolvedScope,
94
+ target: resolvedTarget
95
+ };
96
+ disposeRef.current = keymap.registerLayer(resolvedLayer);
97
+ registeredScopeRef.current = resolvedScope;
98
+ registeredTargetRef.current = resolvedScope === "global" ? undefined : resolvedTarget;
99
+ }, [keymap]);
100
+ const ref = useCallback((value) => {
101
+ refTargetRef.current = value ?? undefined;
102
+ }, []);
103
+ useEffect(() => {
104
+ mountedRef.current = true;
105
+ unregister();
106
+ register();
107
+ return () => {
108
+ mountedRef.current = false;
109
+ unregister();
110
+ };
111
+ }, [layer, register, unregister]);
112
+ useEffect(() => {
113
+ if (!mountedRef.current) {
114
+ return;
115
+ }
116
+ const currentLayer = layerRef.current;
117
+ if (currentLayer.target !== undefined || currentLayer.scope === "global") {
118
+ return;
119
+ }
120
+ const resolvedTarget = refTargetRef.current;
121
+ const resolvedScope = currentLayer.scope ?? (resolvedTarget ? "focus-within" : "global");
122
+ const nextTarget = resolvedScope === "global" ? undefined : resolvedTarget;
123
+ if (registeredScopeRef.current === resolvedScope && registeredTargetRef.current === nextTarget) {
124
+ return;
125
+ }
126
+ unregister();
127
+ if (!nextTarget && currentLayer.scope !== undefined) {
128
+ return;
129
+ }
130
+ register();
131
+ });
132
+ return ref;
133
+ }
134
+ function reactiveMatcherFromStore(subscribe, getSnapshot, predicate) {
135
+ return {
136
+ get() {
137
+ return predicate ? predicate(getSnapshot()) : Boolean(getSnapshot());
138
+ },
139
+ subscribe(onChange) {
140
+ return subscribe(onChange);
141
+ }
142
+ };
143
+ }
144
+ export {
145
+ usePendingSequence,
146
+ useKeymap,
147
+ useBindings,
148
+ useActiveKeys,
149
+ reactiveMatcherFromStore,
150
+ KeymapProvider
151
+ };
package/solid/index.js ADDED
@@ -0,0 +1,119 @@
1
+ // @bun
2
+ // src/solid/index.ts
3
+ import {
4
+ createComponent,
5
+ createContext,
6
+ createEffect,
7
+ createMemo,
8
+ createRoot,
9
+ createSignal,
10
+ on,
11
+ onCleanup,
12
+ onMount,
13
+ useContext
14
+ } from "solid-js";
15
+ var KeymapContext = createContext();
16
+ function KeymapProvider(props) {
17
+ return createComponent(KeymapContext.Provider, {
18
+ get value() {
19
+ return props.keymap;
20
+ },
21
+ get children() {
22
+ return props.children;
23
+ }
24
+ });
25
+ }
26
+ function resolveBindingsTarget(target) {
27
+ if (typeof target === "function") {
28
+ return target() ?? undefined;
29
+ }
30
+ return target ?? undefined;
31
+ }
32
+ var useKeymap = () => {
33
+ const keymap = useContext(KeymapContext);
34
+ if (!keymap) {
35
+ throw new Error("Keymap not found. Wrap the tree in <KeymapProvider>.");
36
+ }
37
+ return keymap;
38
+ };
39
+ function useKeymapStateVersion(keymap) {
40
+ const [version, setVersion] = createSignal(0);
41
+ let dispose;
42
+ onMount(() => {
43
+ dispose = keymap.on("state", () => {
44
+ setVersion((value) => value + 1);
45
+ });
46
+ setVersion((value) => value + 1);
47
+ });
48
+ onCleanup(() => {
49
+ dispose?.();
50
+ });
51
+ return version;
52
+ }
53
+ var useKeymapSelector = (selector) => {
54
+ const keymap = useKeymap();
55
+ const version = useKeymapStateVersion(keymap);
56
+ return createMemo((previous) => {
57
+ version();
58
+ try {
59
+ return selector(keymap);
60
+ } catch (error) {
61
+ if (previous !== undefined && error instanceof Error && error.message === "Cannot use a keymap after its host was destroyed") {
62
+ return previous;
63
+ }
64
+ throw error;
65
+ }
66
+ });
67
+ };
68
+ function useBindings(createLayer) {
69
+ const keymap = useKeymap();
70
+ const [refTarget, setRefTarget] = createSignal(undefined);
71
+ createEffect(() => {
72
+ const layer = createLayer();
73
+ const explicitTarget = resolveBindingsTarget(layer.target);
74
+ const resolvedTarget = explicitTarget ?? refTarget();
75
+ const resolvedScope = layer.scope ?? (resolvedTarget ? "focus-within" : "global");
76
+ if (layer.target !== undefined && !explicitTarget) {
77
+ throw new Error("useBindings target was not available during mount");
78
+ }
79
+ if (resolvedScope !== "global" && !resolvedTarget) {
80
+ throw new Error("useBindings local bindings need a target or the returned ref callback attached to a renderable");
81
+ }
82
+ const { scope: _scope, target: _target, ...baseLayer } = layer;
83
+ const resolvedLayer = resolvedScope === "global" ? {
84
+ ...baseLayer,
85
+ scope: "global"
86
+ } : {
87
+ ...baseLayer,
88
+ scope: resolvedScope,
89
+ target: resolvedTarget
90
+ };
91
+ const dispose = keymap.registerLayer(resolvedLayer);
92
+ onCleanup(() => {
93
+ dispose();
94
+ });
95
+ });
96
+ return (value) => {
97
+ setRefTarget(() => value);
98
+ };
99
+ }
100
+ function reactiveMatcherFromSignal(accessor, predicate) {
101
+ return {
102
+ get() {
103
+ return predicate ? predicate(accessor()) : Boolean(accessor());
104
+ },
105
+ subscribe(onChange) {
106
+ return createRoot((dispose) => {
107
+ createEffect(on(accessor, () => onChange(), { defer: true }));
108
+ return dispose;
109
+ });
110
+ }
111
+ };
112
+ }
113
+ export {
114
+ useKeymapSelector,
115
+ useKeymap,
116
+ useBindings,
117
+ reactiveMatcherFromSignal,
118
+ KeymapProvider
119
+ };
@@ -0,0 +1 @@
1
+ export * from "./universal/index.js";
@@ -0,0 +1,7 @@
1
+ import type { KeyEvent, Renderable } from "@opentui/core";
2
+ import type { Keymap } from "../../index.js";
3
+ /**
4
+ * Falls back to the event's base layout code so bindings can ignore active
5
+ * keyboard layout changes.
6
+ */
7
+ export declare function registerBaseLayoutFallback(keymap: Keymap<Renderable, KeyEvent>): () => void;
@@ -0,0 +1,38 @@
1
+ import { type CliRenderer, type KeyEvent, type Renderable } from "@opentui/core";
2
+ import type { BindingInput, Bindings, Keymap, Layer } from "../../index.js";
3
+ declare const editBufferCommandNames: readonly ["move-left", "move-right", "move-up", "move-down", "select-left", "select-right", "select-up", "select-down", "line-home", "line-end", "select-line-home", "select-line-end", "visual-line-home", "visual-line-end", "select-visual-line-home", "select-visual-line-end", "buffer-home", "buffer-end", "select-buffer-home", "select-buffer-end", "delete-line", "delete-to-line-end", "delete-to-line-start", "backspace", "delete", "newline", "undo", "redo", "word-forward", "word-backward", "select-word-forward", "select-word-backward", "delete-word-forward", "delete-word-backward", "select-all", "submit"];
4
+ export type EditBufferCommandName = (typeof editBufferCommandNames)[number];
5
+ export interface EditBufferCommandOptions {
6
+ descriptions?: Partial<Record<EditBufferCommandName, string>>;
7
+ }
8
+ export type ManagedTextareaLayer = Omit<Layer<Renderable, KeyEvent>, "bindings"> & {
9
+ bindings?: Bindings<Renderable, KeyEvent>;
10
+ };
11
+ /**
12
+ * Returns the default textarea bindings with any overrides prepended so they
13
+ * take precedence. Prefer `registerManagedTextareaLayer` unless you are
14
+ * composing a custom textarea integration.
15
+ */
16
+ export declare function createTextareaBindings(overrides?: readonly BindingInput[]): BindingInput[];
17
+ /**
18
+ * Suspends a focused `TextareaRenderable`'s own key handling so keymap
19
+ * bindings can take over, restoring the previous suspend state on cleanup or
20
+ * focus change. Reference-counted per `Keymap`; prefer
21
+ * `registerManagedTextareaLayer` unless you need this separately.
22
+ */
23
+ export declare function registerTextareaMappingSuspension(keymap: Keymap<Renderable, KeyEvent>, renderer: CliRenderer): () => void;
24
+ /**
25
+ * Registers the standard edit-buffer commands against
26
+ * `renderer.currentFocusedEditor`. Reference-counted per `Keymap`; prefer
27
+ * `registerManagedTextareaLayer` unless you need the commands without the
28
+ * default bindings or textarea suspension.
29
+ */
30
+ export declare function registerEditBufferCommands(keymap: Keymap<Renderable, KeyEvent>, renderer: CliRenderer, options?: EditBufferCommandOptions): () => void;
31
+ /**
32
+ * High-level textarea integration: registers the edit-buffer commands,
33
+ * suspends the textarea's built-in key handling while focused, and installs
34
+ * the layer with default bindings plus overrides. Safe to combine with the
35
+ * lower-level helpers because they are reference-counted.
36
+ */
37
+ export declare function registerManagedTextareaLayer(keymap: Keymap<Renderable, KeyEvent>, renderer: CliRenderer, layer: ManagedTextareaLayer, options?: EditBufferCommandOptions): () => void;
38
+ export {};
@@ -0,0 +1,4 @@
1
+ export * from "../universal/index.js";
2
+ export { registerBaseLayoutFallback } from "./base-layout.js";
3
+ export { createTextareaBindings, registerEditBufferCommands, registerManagedTextareaLayer, registerTextareaMappingSuspension, } from "./edit-buffer-bindings.js";
4
+ export type { EditBufferCommandName, EditBufferCommandOptions } from "./edit-buffer-bindings.js";
@@ -0,0 +1,7 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ export type Aliases = Record<string, string>;
3
+ /**
4
+ * Adds an `aliases` layer field for remapping single-key binding names within
5
+ * that layer.
6
+ */
7
+ export declare function registerAliasesField<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -0,0 +1,13 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ export interface BackspacePopsPendingSequenceOptions {
3
+ /**
4
+ * When true, consume Backspace after popping the sequence so it does not
5
+ * reach the focused target or lower-priority listeners. Default: `true`.
6
+ */
7
+ preventDefault?: boolean;
8
+ priority?: number;
9
+ }
10
+ /**
11
+ * Lets `Backspace` step back through the current pending multi-key sequence.
12
+ */
13
+ export declare function registerBackspacePopsPendingSequence<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, options?: BackspacePopsPendingSequenceOptions): () => void;
@@ -0,0 +1,6 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ /**
3
+ * Expands comma-separated binding strings such as `j,k` into separate
4
+ * bindings.
5
+ */
6
+ export declare function registerCommaBindings<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -0,0 +1,6 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ /**
3
+ * Warns about bindings that can never trigger because they have no command and
4
+ * no reachable continuation.
5
+ */
6
+ export declare function registerDeadBindingWarnings<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -0,0 +1,16 @@
1
+ import type { BindingParser, EventMatchResolver, Keymap, KeymapEvent } from "../../index.js";
2
+ export declare const defaultBindingParser: BindingParser;
3
+ export declare const defaultEventMatchResolver: EventMatchResolver<KeymapEvent>;
4
+ /**
5
+ * Parses the built-in string binding syntax, including modifiers and
6
+ * `<token>` segments.
7
+ */
8
+ export declare function registerDefaultBindingParser<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
9
+ /**
10
+ * Matches incoming key events against their canonical normalized stroke.
11
+ */
12
+ export declare function registerDefaultEventMatchResolver<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
13
+ /**
14
+ * Installs the standard parser and event matcher used by most keymaps.
15
+ */
16
+ export declare function registerDefaultKeys<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -0,0 +1,5 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ /**
3
+ * Parses Emacs-style space-separated chords such as `ctrl+x ctrl+s`.
4
+ */
5
+ export declare function registerEmacsBindings<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -0,0 +1,16 @@
1
+ import type { Keymap, KeymapEvent, ReactiveMatcher } from "../../index.js";
2
+ /**
3
+ * Accepted `enabled` values: boolean, raw `() => boolean`, or an
4
+ * `ReactiveMatcher` for subscription-driven invalidation.
5
+ */
6
+ export type Enabled = boolean | (() => boolean) | ReactiveMatcher;
7
+ /**
8
+ * Adds an `enabled` layer field for boolean, callback, or reactive matcher
9
+ * gating.
10
+ */
11
+ export declare function registerEnabledField<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
12
+ /**
13
+ * Adds an `enabled` command field for boolean, callback, or reactive matcher
14
+ * gating.
15
+ */
16
+ export declare function registerEnabledCommandField<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -0,0 +1,14 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ export interface EscapeClearsPendingSequenceOptions {
3
+ /**
4
+ * When true, consume Escape after clearing the sequence so it does not
5
+ * reach the focused renderable or lower-priority listeners. Default: `true`.
6
+ */
7
+ preventDefault?: boolean;
8
+ priority?: number;
9
+ }
10
+ /**
11
+ * Lets `Escape` cancel an in-progress multi-key sequence before it dispatches
12
+ * further.
13
+ */
14
+ export declare function registerEscapeClearsPendingSequence<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, options?: EscapeClearsPendingSequenceOptions): () => void;
@@ -0,0 +1,16 @@
1
+ import type { CommandContext, Keymap, KeymapEvent } from "../../index.js";
2
+ export interface ExCommand<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
3
+ name: string;
4
+ aliases?: string[];
5
+ nargs?: "0" | "1" | "?" | "*" | "+";
6
+ run: (ctx: CommandContext<TTarget, TEvent> & {
7
+ raw: string;
8
+ args: string[];
9
+ }) => void | Promise<void>;
10
+ [key: string]: unknown;
11
+ }
12
+ /**
13
+ * Resolves `:name ...args` strings against the provided Ex commands and
14
+ * validated argument lists.
15
+ */
16
+ export declare function registerExCommands<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, commands: ExCommand<TTarget, TEvent>[]): () => void;
@@ -0,0 +1,21 @@
1
+ export { defaultBindingParser, defaultEventMatchResolver, registerDefaultBindingParser, registerDefaultEventMatchResolver, registerDefaultKeys, } from "./default-parser.js";
2
+ export { registerAliasesField } from "./aliases.js";
3
+ export { registerBackspacePopsPendingSequence } from "./backspace-pops-pending-sequence.js";
4
+ export { registerCommaBindings } from "./comma-bindings.js";
5
+ export { registerDeadBindingWarnings } from "./dead-bindings.js";
6
+ export { registerEscapeClearsPendingSequence } from "./escape-clears-pending-sequence.js";
7
+ export { registerEnabledField } from "./enabled.js";
8
+ export { registerEnabledCommandField } from "./enabled.js";
9
+ export { registerEmacsBindings } from "./emacs-bindings.js";
10
+ export { registerExCommands } from "./ex-commands.js";
11
+ export { registerLeader } from "./leader.js";
12
+ export { registerMetadataFields } from "./metadata.js";
13
+ export { registerTimedLeader } from "./timed-leader.js";
14
+ export { registerUnresolvedCommandWarnings } from "./unresolved-commands.js";
15
+ export type { Aliases } from "./aliases.js";
16
+ export type { BackspacePopsPendingSequenceOptions } from "./backspace-pops-pending-sequence.js";
17
+ export type { EscapeClearsPendingSequenceOptions } from "./escape-clears-pending-sequence.js";
18
+ export type { Enabled } from "./enabled.js";
19
+ export type { ExCommand } from "./ex-commands.js";
20
+ export type { LeaderOptions } from "./leader.js";
21
+ export type { TimedLeaderOptions } from "./timed-leader.js";
@@ -0,0 +1,9 @@
1
+ import type { KeyLike, Keymap, KeymapEvent } from "../../index.js";
2
+ export interface LeaderOptions {
3
+ trigger: KeyLike;
4
+ name?: string;
5
+ }
6
+ /**
7
+ * Defines a token such as `<leader>` that expands to a chosen trigger key.
8
+ */
9
+ export declare function registerLeader<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, options: LeaderOptions): () => void;
@@ -0,0 +1,6 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ /**
3
+ * Maps `desc`, `group`, `title`, and `category` fields into binding and
4
+ * command attrs.
5
+ */
6
+ export declare function registerMetadataFields<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -0,0 +1,12 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ import { type LeaderOptions } from "./leader.js";
3
+ export interface TimedLeaderOptions extends LeaderOptions {
4
+ timeoutMs?: number;
5
+ onArm?: () => void;
6
+ onDisarm?: () => void;
7
+ }
8
+ /**
9
+ * Defines a leader token and clears it if no follow-up key arrives before the
10
+ * timeout.
11
+ */
12
+ export declare function registerTimedLeader<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, options: TimedLeaderOptions): () => void;
@@ -0,0 +1,6 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ /**
3
+ * Warns when a string command name cannot be resolved by registered commands
4
+ * or resolvers.
5
+ */
6
+ export declare function registerUnresolvedCommandWarnings<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
package/src/html.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { Keymap } from "./keymap.js";
2
+ import type { EventMatchResolver, KeymapEvent, KeymapHost } from "./types.js";
3
+ export * from "./index.js";
4
+ export interface HtmlKeymapEvent extends KeymapEvent {
5
+ readonly originalEvent?: KeyboardEvent;
6
+ }
7
+ interface HtmlKeyboardEventLike {
8
+ key: string;
9
+ ctrlKey: boolean;
10
+ shiftKey: boolean;
11
+ altKey: boolean;
12
+ metaKey: boolean;
13
+ preventDefault(): void;
14
+ stopPropagation(): void;
15
+ }
16
+ export declare function normalizeHtmlKeyName(key: string): string;
17
+ export declare function createHtmlKeymapEvent(event?: KeyboardEvent | HtmlKeyboardEventLike): HtmlKeymapEvent;
18
+ export declare function createHtmlKeymapHost(root: HTMLElement): KeymapHost<HTMLElement, HtmlKeymapEvent>;
19
+ export declare const htmlEventMatchResolver: EventMatchResolver<HtmlKeymapEvent>;
20
+ export declare function createHtmlKeymap(root: HTMLElement): Keymap<HTMLElement, HtmlKeymapEvent>;
21
+ export declare function createDefaultHtmlKeymap(root: HTMLElement): Keymap<HTMLElement, HtmlKeymapEvent>;
package/src/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { Keymap } from "./keymap.js";
2
+ 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, KeymapActiveKey, KeymapBindingInput, KeymapCommandEntry, KeymapCommandDefinition, KeymapCommandRecord, 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, Scope, EventMatchResolverContext, EventMatchResolver, TargetLayer, KeyToken, ResolvedKeyToken, KeySequencePart, NormalizedKeyStroke, KeyStrokeInput, } from "./types.js";
@@ -0,0 +1 @@
1
+ export {};