@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.
- package/README.md +64 -30
- package/chunks/index-frk6sdcd.js +409 -0
- package/chunks/index-frk6sdcd.js.map +14 -0
- package/package.json +43 -23
- package/src/addons/index.js +1130 -0
- package/src/addons/index.js.map +25 -0
- package/src/addons/opentui/edit-buffer-bindings.d.ts +6 -2
- package/src/addons/opentui/index.d.ts +2 -2
- package/src/addons/opentui/index.js +467 -0
- package/src/addons/opentui/index.js.map +12 -0
- package/src/addons/universal/binding-overrides.d.ts +6 -0
- package/src/addons/universal/dead-bindings.d.ts +1 -1
- package/src/addons/universal/default-parser.d.ts +2 -2
- package/src/addons/universal/ex-commands.d.ts +11 -8
- package/src/addons/universal/index.d.ts +3 -1
- package/src/addons/universal/leader.d.ts +1 -1
- package/src/addons/universal/metadata.d.ts +2 -2
- package/src/addons/universal/mod-bindings.d.ts +6 -0
- package/src/addons/universal/unresolved-commands.d.ts +1 -1
- package/src/extras/binding-sections.d.ts +18 -0
- package/src/extras/command-bindings.d.ts +19 -0
- package/src/extras/formatting.d.ts +27 -0
- package/src/extras/graph.d.ts +9 -0
- package/src/extras/graph.js +373 -0
- package/src/extras/graph.js.map +11 -0
- package/src/extras/index.d.ts +6 -0
- package/src/extras/index.js +239 -0
- package/src/extras/index.js.map +12 -0
- package/src/extras/lib/graph-snapshot.d.ts +14 -0
- package/src/extras/lib/graph-types.d.ts +83 -0
- package/src/html.d.ts +3 -3
- package/src/html.js +297 -0
- package/src/html.js.map +10 -0
- package/src/index.d.ts +3 -1
- package/src/index.js +4492 -0
- package/src/index.js.map +34 -0
- package/src/keymap.d.ts +23 -35
- package/src/lib/emitter.d.ts +1 -2
- package/src/lib/registry.d.ts +2 -2
- package/src/lib/runtime-utils.d.ts +34 -0
- package/src/opentui.d.ts +1 -3
- package/src/opentui.js +133 -0
- package/src/opentui.js.map +10 -0
- package/src/react/index.d.ts +5 -19
- package/{react → src/react}/index.js +3 -0
- package/src/react/index.js.map +10 -0
- package/src/runtime-modules.d.ts +20 -0
- package/src/runtime-modules.js +28 -0
- package/src/runtime-modules.js.map +10 -0
- package/src/services/activation.d.ts +7 -33
- package/src/services/active-key-cache.d.ts +29 -0
- package/src/services/command-catalog.d.ts +28 -45
- package/src/services/command-executor.d.ts +7 -13
- package/src/services/compiler.d.ts +6 -12
- package/src/services/conditions.d.ts +4 -16
- package/src/services/dispatch-decisions.d.ts +21 -0
- package/src/services/dispatch-patterns.d.ts +5 -0
- package/src/services/dispatch.d.ts +6 -42
- package/src/services/environment.d.ts +6 -21
- package/src/services/extension-context.d.ts +16 -0
- package/src/services/layer-diagnostics.d.ts +10 -0
- package/src/services/layers.d.ts +15 -23
- package/src/services/notify.d.ts +6 -8
- package/src/services/pending-sequence.d.ts +4 -0
- package/src/services/primitives/active-layers.d.ts +2 -3
- package/src/services/primitives/bindings.d.ts +4 -0
- package/src/services/primitives/command-normalization.d.ts +3 -0
- package/src/services/primitives/field-invariants.d.ts +16 -1
- package/src/services/primitives/pending-captures.d.ts +5 -0
- package/src/services/runtime-view.d.ts +5 -0
- package/src/services/runtime.d.ts +2 -7
- package/src/services/sequence-index.d.ts +24 -0
- package/src/services/state.d.ts +46 -91
- package/src/solid/index.d.ts +5 -19
- package/{solid → src/solid}/index.js +3 -0
- package/src/solid/index.js.map +10 -0
- package/src/testing/index.d.ts +90 -0
- package/src/testing/index.js +276 -0
- package/src/testing/index.js.map +10 -0
- package/src/types.d.ts +194 -126
- package/addons/index.js +0 -5240
- package/addons/opentui/index.js +0 -5632
- package/html.js +0 -5042
- package/index.js +0 -4411
- package/opentui.js +0 -4887
- package/src/services/primitives/binding-inputs.d.ts +0 -4
package/src/keymap.d.ts
CHANGED
|
@@ -1,58 +1,50 @@
|
|
|
1
|
-
import type { ActiveKey, ActiveKeyOptions,
|
|
1
|
+
import type { ActiveBinding, ActiveKey, ActiveKeyOptions, BindingExpander, BindingParser, BindingFieldCompiler, LayerBindingsTransformer, BindingTransformer, Events, CommandFieldCompiler, CommandTransformer, CommandBindingsQuery, CommandEntry, CommandQuery, Command, KeymapEvent, KeymapHost, HostMetadata, LayerAnalyzer, Listener, RunCommandOptions, RunCommandResult, CommandResolver, KeyAfterInputContext, KeyInterceptOptions, KeyInputContext, Layer, LayerFieldCompiler, KeyDisambiguationResolver, RawInterceptOptions, RawInputContext, EventMatchResolver, KeyStringifyInput, KeyToken, SequencePattern, KeyLike, KeySequencePart, StringifyOptions } from "./types.js";
|
|
2
|
+
import { KEYMAP_EXTENSION_CONTEXT, type KeymapExtensionContext } from "./services/extension-context.js";
|
|
2
3
|
export declare class Keymap<TTarget extends object, TEvent extends KeymapEvent = KeymapEvent> {
|
|
3
|
-
private
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
private readonly resources;
|
|
7
|
-
private readonly cleanupListeners;
|
|
8
|
-
private events;
|
|
9
|
-
private hooks;
|
|
10
|
-
private readonly notify;
|
|
11
|
-
private readonly activation;
|
|
12
|
-
private readonly runtime;
|
|
13
|
-
private readonly conditions;
|
|
14
|
-
private readonly catalog;
|
|
15
|
-
private readonly executor;
|
|
16
|
-
private readonly compiler;
|
|
17
|
-
private readonly dispatch;
|
|
18
|
-
private readonly layers;
|
|
19
|
-
private readonly environment;
|
|
20
|
-
private readonly keypressListener;
|
|
21
|
-
private readonly keyreleaseListener;
|
|
22
|
-
private readonly rawListener;
|
|
23
|
-
private readonly focusedTargetListener;
|
|
4
|
+
#private;
|
|
5
|
+
getPendingSequence: () => readonly KeySequencePart[];
|
|
6
|
+
getActiveKeys: (options?: ActiveKeyOptions) => readonly ActiveKey<TTarget, TEvent>[];
|
|
24
7
|
constructor(host: KeymapHost<TTarget, TEvent>);
|
|
25
|
-
|
|
8
|
+
[KEYMAP_EXTENSION_CONTEXT](): KeymapExtensionContext<TTarget, TEvent>;
|
|
26
9
|
setData(name: string, value: unknown): void;
|
|
27
10
|
getData(name: string): unknown;
|
|
11
|
+
getHostMetadata(): Readonly<HostMetadata>;
|
|
28
12
|
hasPendingSequence(): boolean;
|
|
29
|
-
getPendingSequence(): readonly KeySequencePart[];
|
|
30
13
|
createKeyMatcher(key: KeyLike): (input: KeyStringifyInput | null | undefined) => boolean;
|
|
14
|
+
parseKeySequence(key: KeyLike): readonly KeySequencePart[];
|
|
15
|
+
formatKey(key: KeyLike, options?: StringifyOptions): string;
|
|
31
16
|
clearPendingSequence(): void;
|
|
32
17
|
popPendingSequence(): boolean;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
normalizeCommandName(name: string): string;
|
|
37
|
-
normalizeBindings(bindings: Bindings<TTarget, TEvent>): BindingInput<TTarget, TEvent>[];
|
|
18
|
+
getCommands(query?: CommandQuery<TTarget, TEvent>): readonly Command<TTarget, TEvent>[];
|
|
19
|
+
getCommandEntries(query?: CommandQuery<TTarget, TEvent>): readonly CommandEntry<TTarget, TEvent>[];
|
|
20
|
+
getCommandBindings(query: CommandBindingsQuery<TTarget>): ReadonlyMap<string, readonly ActiveBinding<TTarget, TEvent>[]>;
|
|
38
21
|
acquireResource(key: symbol, setup: () => () => void): () => void;
|
|
39
|
-
runCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult
|
|
40
|
-
dispatchCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult
|
|
22
|
+
runCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult<TTarget, TEvent>;
|
|
23
|
+
dispatchCommand(cmd: string, options?: RunCommandOptions<TTarget, TEvent>): RunCommandResult<TTarget, TEvent>;
|
|
41
24
|
on(name: "state", fn: Listener<Events<TTarget, TEvent>["state"]>): () => void;
|
|
42
25
|
on(name: "pendingSequence", fn: Listener<Events<TTarget, TEvent>["pendingSequence"]>): () => void;
|
|
26
|
+
on(name: "dispatch", fn: Listener<Events<TTarget, TEvent>["dispatch"]>): () => void;
|
|
43
27
|
on(name: "warning", fn: Listener<Events<TTarget, TEvent>["warning"]>): () => void;
|
|
44
28
|
on(name: "error", fn: Listener<Events<TTarget, TEvent>["error"]>): () => void;
|
|
45
29
|
intercept(name: "key", fn: (ctx: KeyInputContext<TEvent>) => void, options?: KeyInterceptOptions): () => void;
|
|
30
|
+
intercept(name: "key:after", fn: (ctx: KeyAfterInputContext<TTarget, TEvent>) => void, options?: KeyInterceptOptions): () => void;
|
|
46
31
|
intercept(name: "raw", fn: (ctx: RawInputContext) => void, options?: RawInterceptOptions): () => void;
|
|
47
32
|
registerLayer(layer: Layer<TTarget, TEvent>): () => void;
|
|
48
33
|
registerLayerFields(fields: Record<string, LayerFieldCompiler>): () => void;
|
|
34
|
+
prependLayerBindingsTransformer(transformer: LayerBindingsTransformer<TTarget, TEvent>): () => void;
|
|
35
|
+
appendLayerBindingsTransformer(transformer: LayerBindingsTransformer<TTarget, TEvent>): () => void;
|
|
36
|
+
clearLayerBindingsTransformers(): void;
|
|
49
37
|
prependBindingTransformer(transformer: BindingTransformer<TTarget, TEvent>): () => void;
|
|
50
38
|
appendBindingTransformer(transformer: BindingTransformer<TTarget, TEvent>): () => void;
|
|
51
39
|
clearBindingTransformers(): void;
|
|
40
|
+
prependCommandTransformer(transformer: CommandTransformer<TTarget, TEvent>): () => void;
|
|
41
|
+
appendCommandTransformer(transformer: CommandTransformer<TTarget, TEvent>): () => void;
|
|
42
|
+
clearCommandTransformers(): void;
|
|
52
43
|
prependBindingParser(parser: BindingParser): () => void;
|
|
53
44
|
appendBindingParser(parser: BindingParser): () => void;
|
|
54
45
|
clearBindingParsers(): void;
|
|
55
46
|
registerToken(token: KeyToken): () => void;
|
|
47
|
+
registerSequencePattern(pattern: SequencePattern<TEvent>): () => void;
|
|
56
48
|
prependBindingExpander(expander: BindingExpander): () => void;
|
|
57
49
|
appendBindingExpander(expander: BindingExpander): () => void;
|
|
58
50
|
clearBindingExpanders(): void;
|
|
@@ -70,8 +62,4 @@ export declare class Keymap<TTarget extends object, TEvent extends KeymapEvent =
|
|
|
70
62
|
prependDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void;
|
|
71
63
|
appendDisambiguationResolver(resolver: KeyDisambiguationResolver<TTarget, TEvent>): () => void;
|
|
72
64
|
clearDisambiguationResolvers(): void;
|
|
73
|
-
private handleFocusedTargetChange;
|
|
74
|
-
private warnUnknownField;
|
|
75
|
-
private warnUnknownToken;
|
|
76
|
-
private releaseResource;
|
|
77
65
|
}
|
package/src/lib/emitter.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export type EmitterListener<TValue> = [TValue] extends [void] ? () => void : (value: TValue) => void;
|
|
2
2
|
type EmitterArgs<TValue> = [TValue] extends [void] ? [] : [TValue];
|
|
3
3
|
export declare class Emitter<TEvents extends Record<string, unknown>> {
|
|
4
|
-
private
|
|
5
|
-
private listeners;
|
|
4
|
+
#private;
|
|
6
5
|
constructor(onError: (name: keyof TEvents, error: unknown) => void);
|
|
7
6
|
hook<TName extends keyof TEvents>(name: TName, listener: EmitterListener<TEvents[TName]>): () => void;
|
|
8
7
|
has<TName extends keyof TEvents>(name: TName): boolean;
|
package/src/lib/registry.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type PriorityRegistration<TListener, TOptions extends {
|
|
|
5
5
|
order: number;
|
|
6
6
|
}>;
|
|
7
7
|
declare abstract class CopyOnWriteRegistry<TValue> {
|
|
8
|
-
private
|
|
8
|
+
#private;
|
|
9
9
|
protected getItems(): readonly TValue[];
|
|
10
10
|
protected setItems(items: readonly TValue[]): void;
|
|
11
11
|
protected removeItem(value: TValue): boolean;
|
|
@@ -21,7 +21,7 @@ export declare class OrderedRegistry<TValue> extends CopyOnWriteRegistry<TValue>
|
|
|
21
21
|
export declare class PriorityRegistry<TListener, TOptions extends {
|
|
22
22
|
priority: number;
|
|
23
23
|
}> extends CopyOnWriteRegistry<PriorityRegistration<TListener, TOptions>> {
|
|
24
|
-
private
|
|
24
|
+
#private;
|
|
25
25
|
register(listener: TListener, options: TOptions): () => void;
|
|
26
26
|
entries(): readonly PriorityRegistration<TListener, TOptions>[];
|
|
27
27
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type RuntimeEmitterListener<TValue> = [TValue] extends [void] ? () => void : (value: TValue) => void;
|
|
2
|
+
type RuntimeEmitterArgs<TValue> = [TValue] extends [void] ? [] : [TValue];
|
|
3
|
+
export interface RuntimeEmitter<TEvents extends Record<string, unknown>> {
|
|
4
|
+
hook<TName extends keyof TEvents>(name: TName, listener: RuntimeEmitterListener<TEvents[TName]>): () => void;
|
|
5
|
+
has<TName extends keyof TEvents>(name: TName): boolean;
|
|
6
|
+
emit<TName extends keyof TEvents>(name: TName, ...args: RuntimeEmitterArgs<TEvents[TName]>): void;
|
|
7
|
+
}
|
|
8
|
+
export declare function createRuntimeEmitter<TEvents extends Record<string, unknown>>(onError: (name: keyof TEvents, error: unknown) => void): RuntimeEmitter<TEvents>;
|
|
9
|
+
export type RuntimePriorityRegistration<TListener, TOptions extends {
|
|
10
|
+
priority: number;
|
|
11
|
+
}> = Readonly<TOptions & {
|
|
12
|
+
listener: TListener;
|
|
13
|
+
order: number;
|
|
14
|
+
}>;
|
|
15
|
+
export interface RuntimeOrderedRegistry<TValue> {
|
|
16
|
+
append(value: TValue): () => void;
|
|
17
|
+
prepend(value: TValue): () => void;
|
|
18
|
+
values(): readonly TValue[];
|
|
19
|
+
has(): boolean;
|
|
20
|
+
clear(): void;
|
|
21
|
+
}
|
|
22
|
+
export interface RuntimePriorityRegistry<TListener, TOptions extends {
|
|
23
|
+
priority: number;
|
|
24
|
+
}> {
|
|
25
|
+
register(listener: TListener, options: TOptions): () => void;
|
|
26
|
+
entries(): readonly RuntimePriorityRegistration<TListener, TOptions>[];
|
|
27
|
+
has(): boolean;
|
|
28
|
+
clear(): void;
|
|
29
|
+
}
|
|
30
|
+
export declare function createRuntimeOrderedRegistry<TValue>(): RuntimeOrderedRegistry<TValue>;
|
|
31
|
+
export declare function createRuntimePriorityRegistry<TListener, TOptions extends {
|
|
32
|
+
priority: number;
|
|
33
|
+
}>(): RuntimePriorityRegistry<TListener, TOptions>;
|
|
34
|
+
export {};
|
package/src/opentui.d.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { KeyEvent, type CliRenderer, type Renderable } from "@opentui/core";
|
|
2
|
-
import { Keymap } from "
|
|
3
|
-
import type { KeymapHost } from "./types.js";
|
|
4
|
-
export * from "./index.js";
|
|
2
|
+
import { Keymap, type KeymapHost } from "@opentui/keymap";
|
|
5
3
|
export declare function createOpenTuiKeymapHost(renderer: CliRenderer): KeymapHost<Renderable, KeyEvent>;
|
|
6
4
|
export declare function createOpenTuiKeymap(renderer: CliRenderer): Keymap<Renderable, KeyEvent>;
|
|
7
5
|
export declare function createDefaultOpenTuiKeymap(renderer: CliRenderer): Keymap<Renderable, KeyEvent>;
|
package/src/opentui.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/opentui.ts
|
|
3
|
+
import { CliRenderEvents, KeyEvent, RenderableEvents } from "@opentui/core";
|
|
4
|
+
import { Keymap } from "@opentui/keymap";
|
|
5
|
+
import { registerDefaultKeys, registerEnabledFields, registerMetadataFields } from "@opentui/keymap/addons";
|
|
6
|
+
function createSyntheticCommandEvent() {
|
|
7
|
+
return new KeyEvent({
|
|
8
|
+
name: "command",
|
|
9
|
+
ctrl: false,
|
|
10
|
+
meta: false,
|
|
11
|
+
shift: false,
|
|
12
|
+
option: false,
|
|
13
|
+
sequence: "",
|
|
14
|
+
number: false,
|
|
15
|
+
raw: "",
|
|
16
|
+
eventType: "press",
|
|
17
|
+
source: "raw"
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function normalizeRuntimePlatform(platform) {
|
|
21
|
+
if (platform === "darwin") {
|
|
22
|
+
return "macos";
|
|
23
|
+
}
|
|
24
|
+
if (platform === "win32") {
|
|
25
|
+
return "windows";
|
|
26
|
+
}
|
|
27
|
+
if (platform === "linux") {
|
|
28
|
+
return "linux";
|
|
29
|
+
}
|
|
30
|
+
return "unknown";
|
|
31
|
+
}
|
|
32
|
+
function createOpenTuiHostMetadata(renderer) {
|
|
33
|
+
const platform = normalizeRuntimePlatform(process.platform);
|
|
34
|
+
const hasKittyKeyboard = renderer.capabilities?.kitty_keyboard === true;
|
|
35
|
+
return {
|
|
36
|
+
platform,
|
|
37
|
+
primaryModifier: platform === "macos" ? "super" : platform === "unknown" ? "unknown" : "ctrl",
|
|
38
|
+
modifiers: {
|
|
39
|
+
ctrl: "supported",
|
|
40
|
+
shift: "supported",
|
|
41
|
+
meta: "supported",
|
|
42
|
+
super: hasKittyKeyboard ? "supported" : "unknown",
|
|
43
|
+
hyper: hasKittyKeyboard ? "supported" : "unknown"
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function createOpenTuiKeymapHost(renderer) {
|
|
48
|
+
return {
|
|
49
|
+
get metadata() {
|
|
50
|
+
return createOpenTuiHostMetadata(renderer);
|
|
51
|
+
},
|
|
52
|
+
rootTarget: renderer.root,
|
|
53
|
+
get isDestroyed() {
|
|
54
|
+
return renderer.isDestroyed;
|
|
55
|
+
},
|
|
56
|
+
getFocusedTarget() {
|
|
57
|
+
const focused = renderer.currentFocusedRenderable;
|
|
58
|
+
if (!focused || focused.isDestroyed || !focused.focused) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return focused;
|
|
62
|
+
},
|
|
63
|
+
getParentTarget(target) {
|
|
64
|
+
return target.parent;
|
|
65
|
+
},
|
|
66
|
+
isTargetDestroyed(target) {
|
|
67
|
+
return target.isDestroyed;
|
|
68
|
+
},
|
|
69
|
+
onKeyPress(listener) {
|
|
70
|
+
renderer.keyInput.prependListener("keypress", listener);
|
|
71
|
+
return () => {
|
|
72
|
+
renderer.keyInput.off("keypress", listener);
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
onKeyRelease(listener) {
|
|
76
|
+
renderer.keyInput.prependListener("keyrelease", listener);
|
|
77
|
+
return () => {
|
|
78
|
+
renderer.keyInput.off("keyrelease", listener);
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
onFocusChange(listener) {
|
|
82
|
+
renderer.on(CliRenderEvents.FOCUSED_RENDERABLE, listener);
|
|
83
|
+
return () => {
|
|
84
|
+
renderer.off(CliRenderEvents.FOCUSED_RENDERABLE, listener);
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
onDestroy(listener) {
|
|
88
|
+
renderer.once(CliRenderEvents.DESTROY, listener);
|
|
89
|
+
return () => {
|
|
90
|
+
renderer.off(CliRenderEvents.DESTROY, listener);
|
|
91
|
+
};
|
|
92
|
+
},
|
|
93
|
+
onTargetDestroy(target, listener) {
|
|
94
|
+
target.once(RenderableEvents.DESTROYED, listener);
|
|
95
|
+
return () => {
|
|
96
|
+
target.off(RenderableEvents.DESTROYED, listener);
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
onRawInput(listener) {
|
|
100
|
+
renderer.prependInputHandler(listener);
|
|
101
|
+
return () => {
|
|
102
|
+
renderer.removeInputHandler(listener);
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
createCommandEvent() {
|
|
106
|
+
return createSyntheticCommandEvent();
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function createOpenTuiKeymap(renderer) {
|
|
111
|
+
if (renderer.isDestroyed) {
|
|
112
|
+
throw new Error("Cannot create a keymap for a destroyed renderer");
|
|
113
|
+
}
|
|
114
|
+
return new Keymap(createOpenTuiKeymapHost(renderer));
|
|
115
|
+
}
|
|
116
|
+
function createDefaultOpenTuiKeymap(renderer) {
|
|
117
|
+
if (renderer.isDestroyed) {
|
|
118
|
+
throw new Error("Cannot create a keymap for a destroyed renderer");
|
|
119
|
+
}
|
|
120
|
+
const keymap = new Keymap(createOpenTuiKeymapHost(renderer));
|
|
121
|
+
registerDefaultKeys(keymap);
|
|
122
|
+
registerEnabledFields(keymap);
|
|
123
|
+
registerMetadataFields(keymap);
|
|
124
|
+
return keymap;
|
|
125
|
+
}
|
|
126
|
+
export {
|
|
127
|
+
createOpenTuiKeymapHost,
|
|
128
|
+
createOpenTuiKeymap,
|
|
129
|
+
createDefaultOpenTuiKeymap
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
//# debugId=7616A56E1652597164756E2164756E21
|
|
133
|
+
//# sourceMappingURL=opentui.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/opentui.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { CliRenderEvents, KeyEvent, RenderableEvents, type CliRenderer, type Renderable } from \"@opentui/core\"\nimport { Keymap, type HostMetadata, type HostPlatform, type KeymapHost } from \"@opentui/keymap\"\nimport { registerDefaultKeys, registerEnabledFields, registerMetadataFields } from \"@opentui/keymap/addons\"\n\nfunction createSyntheticCommandEvent(): KeyEvent {\n return new KeyEvent({\n name: \"command\",\n ctrl: false,\n meta: false,\n shift: false,\n option: false,\n sequence: \"\",\n number: false,\n raw: \"\",\n eventType: \"press\",\n source: \"raw\",\n })\n}\n\nfunction normalizeRuntimePlatform(platform: NodeJS.Platform | string | undefined): HostPlatform {\n if (platform === \"darwin\") {\n return \"macos\"\n }\n\n if (platform === \"win32\") {\n return \"windows\"\n }\n\n if (platform === \"linux\") {\n return \"linux\"\n }\n\n return \"unknown\"\n}\n\nfunction createOpenTuiHostMetadata(renderer: CliRenderer): HostMetadata {\n const platform = normalizeRuntimePlatform(process.platform)\n const hasKittyKeyboard = renderer.capabilities?.kitty_keyboard === true\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: hasKittyKeyboard ? \"supported\" : \"unknown\",\n hyper: hasKittyKeyboard ? \"supported\" : \"unknown\",\n },\n }\n}\n\nexport function createOpenTuiKeymapHost(renderer: CliRenderer): KeymapHost<Renderable, KeyEvent> {\n return {\n get metadata() {\n return createOpenTuiHostMetadata(renderer)\n },\n rootTarget: renderer.root,\n get isDestroyed() {\n return renderer.isDestroyed\n },\n getFocusedTarget() {\n const focused = renderer.currentFocusedRenderable\n if (!focused || focused.isDestroyed || !focused.focused) {\n return null\n }\n\n return focused\n },\n getParentTarget(target) {\n return target.parent\n },\n isTargetDestroyed(target) {\n return target.isDestroyed\n },\n onKeyPress(listener) {\n renderer.keyInput.prependListener(\"keypress\", listener)\n return () => {\n renderer.keyInput.off(\"keypress\", listener)\n }\n },\n onKeyRelease(listener) {\n renderer.keyInput.prependListener(\"keyrelease\", listener)\n return () => {\n renderer.keyInput.off(\"keyrelease\", listener)\n }\n },\n onFocusChange(listener) {\n renderer.on(CliRenderEvents.FOCUSED_RENDERABLE, listener)\n return () => {\n renderer.off(CliRenderEvents.FOCUSED_RENDERABLE, listener)\n }\n },\n onDestroy(listener) {\n renderer.once(CliRenderEvents.DESTROY, listener)\n return () => {\n renderer.off(CliRenderEvents.DESTROY, listener)\n }\n },\n onTargetDestroy(target, listener) {\n target.once(RenderableEvents.DESTROYED, listener)\n return () => {\n target.off(RenderableEvents.DESTROYED, listener)\n }\n },\n onRawInput(listener) {\n renderer.prependInputHandler(listener)\n return () => {\n renderer.removeInputHandler(listener)\n }\n },\n createCommandEvent() {\n return createSyntheticCommandEvent()\n },\n }\n}\n\nexport function createOpenTuiKeymap(renderer: CliRenderer): Keymap<Renderable, KeyEvent> {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot create a keymap for a destroyed renderer\")\n }\n\n return new Keymap(createOpenTuiKeymapHost(renderer))\n}\n\nexport function createDefaultOpenTuiKeymap(renderer: CliRenderer): Keymap<Renderable, KeyEvent> {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot create a keymap for a destroyed renderer\")\n }\n\n const keymap = new Keymap(createOpenTuiKeymapHost(renderer))\n registerDefaultKeys(keymap)\n registerEnabledFields(keymap)\n registerMetadataFields(keymap)\n return keymap\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "7616A56E1652597164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/src/react/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { KeyEvent, Renderable } from "@opentui/core";
|
|
2
|
-
import { type ActiveKey, type ActiveKeyOptions, type
|
|
2
|
+
import { type ActiveKey, type ActiveKeyOptions, type Layer, type Keymap, type ReactiveMatcher, type KeySequencePart, type TargetMode } from "../index.js";
|
|
3
3
|
import { type DependencyList, type ReactNode } from "react";
|
|
4
4
|
type OpenTuiKeymap = Keymap<Renderable, KeyEvent>;
|
|
5
5
|
export interface KeymapProviderProps {
|
|
@@ -10,28 +10,14 @@ export declare function KeymapProvider({ keymap, children }: KeymapProviderProps
|
|
|
10
10
|
export interface UseBindingsTargetRef<TRenderable extends Renderable = Renderable> {
|
|
11
11
|
current: TRenderable | null;
|
|
12
12
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
export interface UseBindingsLayer<TRenderable extends Renderable = Renderable> extends Omit<Layer<Renderable, KeyEvent>, "target" | "targetMode"> {
|
|
14
|
+
targetRef?: UseBindingsTargetRef<TRenderable>;
|
|
15
|
+
targetMode?: TargetMode;
|
|
16
16
|
}
|
|
17
|
-
export interface UseFocusBindingsLayer<TRenderable extends Renderable = Renderable> extends UseBindingsLayerBase {
|
|
18
|
-
targetMode: "focus";
|
|
19
|
-
targetRef: UseBindingsTargetRef<TRenderable>;
|
|
20
|
-
}
|
|
21
|
-
export interface UseFocusWithinBindingsLayer<TRenderable extends Renderable = Renderable> extends UseBindingsLayerBase {
|
|
22
|
-
targetMode?: "focus-within";
|
|
23
|
-
targetRef: UseBindingsTargetRef<TRenderable>;
|
|
24
|
-
}
|
|
25
|
-
export interface UseInferredFocusWithinBindingsLayer<TRenderable extends Renderable = Renderable> extends UseBindingsLayerBase {
|
|
26
|
-
targetRef: UseBindingsTargetRef<TRenderable>;
|
|
27
|
-
}
|
|
28
|
-
export type UseTargetBindingsLayer<TRenderable extends Renderable = Renderable> = UseFocusBindingsLayer<TRenderable> | UseFocusWithinBindingsLayer<TRenderable> | UseInferredFocusWithinBindingsLayer<TRenderable>;
|
|
29
|
-
export type UseBindingsLayer<TRenderable extends Renderable = Renderable> = UseGlobalBindingsLayer | UseTargetBindingsLayer<TRenderable>;
|
|
30
17
|
export declare const useKeymap: () => OpenTuiKeymap;
|
|
31
18
|
export declare const useActiveKeys: (options?: ActiveKeyOptions) => readonly ActiveKey[];
|
|
32
19
|
export declare const usePendingSequence: () => readonly KeySequencePart[];
|
|
33
|
-
export declare function useBindings<TRenderable extends Renderable = Renderable>(createLayer: () =>
|
|
34
|
-
export declare function useBindings<TRenderable extends Renderable = Renderable>(createLayer: () => UseTargetBindingsLayer<TRenderable>, deps?: DependencyList): void;
|
|
20
|
+
export declare function useBindings<TRenderable extends Renderable = Renderable>(createLayer: () => UseBindingsLayer<TRenderable>, deps?: DependencyList): void;
|
|
35
21
|
/**
|
|
36
22
|
* Adapts any `subscribe` + `getSnapshot` store to
|
|
37
23
|
* `ReactiveMatcher`. Pass `predicate` when the snapshot value is not
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/react/index.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { KeyEvent, Renderable } from \"@opentui/core\"\nimport {\n type ActiveKey,\n type ActiveKeyOptions,\n type Layer,\n type Keymap,\n type ReactiveMatcher,\n type KeySequencePart,\n type TargetMode,\n} from \"../index.js\"\nimport {\n createElement,\n createContext,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useReducer,\n useRef,\n type DependencyList,\n type ReactNode,\n} from \"react\"\n\ntype OpenTuiKeymap = Keymap<Renderable, KeyEvent>\n\nconst KeymapContext = createContext<OpenTuiKeymap | null>(null)\n\nexport interface KeymapProviderProps {\n keymap: OpenTuiKeymap\n children?: ReactNode\n}\n\nexport function KeymapProvider({ keymap, children }: KeymapProviderProps) {\n return createElement(KeymapContext.Provider, { value: keymap }, children)\n}\n\nexport interface UseBindingsTargetRef<TRenderable extends Renderable = Renderable> {\n current: TRenderable | null\n}\n\nexport interface UseBindingsLayer<TRenderable extends Renderable = Renderable> extends Omit<\n Layer<Renderable, KeyEvent>,\n \"target\" | \"targetMode\"\n> {\n targetRef?: UseBindingsTargetRef<TRenderable>\n targetMode?: TargetMode\n}\n\nfunction resolveBindingsTarget(targetRef: UseBindingsTargetRef | undefined): Renderable | undefined {\n return targetRef?.current ?? undefined\n}\n\nexport const useKeymap = (): OpenTuiKeymap => {\n const keymap = useContext(KeymapContext)\n\n if (!keymap) {\n throw new Error(\"Keymap not found. Wrap the tree in <KeymapProvider>.\")\n }\n\n return keymap\n}\n\n// Use the batched `state` event for derived reads. Pending-sequence changes\n// already flow through `state`, so subscribing to both would duplicate work.\nfunction useKeymapStateVersion(keymap: OpenTuiKeymap): number {\n const [version, bumpVersion] = useReducer((value: number) => value + 1, 0)\n\n useLayoutEffect(() => {\n const dispose = keymap.on(\"state\", () => {\n bumpVersion()\n })\n\n return () => {\n dispose()\n }\n }, [keymap])\n\n return version\n}\n\nexport const useActiveKeys = (options?: ActiveKeyOptions): readonly ActiveKey[] => {\n const keymap = useKeymap()\n const version = useKeymapStateVersion(keymap)\n\n return useMemo(() => {\n void version\n return keymap.getActiveKeys(options)\n }, [keymap, options, version])\n}\n\nexport const usePendingSequence = (): readonly KeySequencePart[] => {\n const keymap = useKeymap()\n const version = useKeymapStateVersion(keymap)\n\n return useMemo(() => {\n void version\n return keymap.getPendingSequence()\n }, [keymap, version])\n}\n\nexport function useBindings<TRenderable extends Renderable = Renderable>(\n createLayer: () => UseBindingsLayer<TRenderable>,\n deps: DependencyList = [],\n): void {\n const keymap = useKeymap()\n const layer = useMemo(createLayer, deps)\n const layerRef = useRef(layer)\n const disposeRef = useRef<(() => void) | undefined>(undefined)\n const registeredLayerRef = useRef<UseBindingsLayer<TRenderable> | undefined>(undefined)\n const registeredTargetModeRef = useRef<TargetMode | undefined>(undefined)\n const registeredTargetRef = useRef<Renderable | undefined>(undefined)\n\n layerRef.current = layer\n\n const unregister = useCallback(() => {\n disposeRef.current?.()\n disposeRef.current = undefined\n registeredLayerRef.current = undefined\n registeredTargetModeRef.current = undefined\n registeredTargetRef.current = undefined\n }, [])\n\n useEffect(() => {\n const currentLayer = layerRef.current\n const hasExplicitTarget = currentLayer.targetRef !== undefined\n const explicitTarget = resolveBindingsTarget(currentLayer.targetRef)\n const nextTargetMode = currentLayer.targetMode ?? (hasExplicitTarget ? \"focus-within\" : undefined)\n const nextTarget = nextTargetMode ? explicitTarget : undefined\n\n if (!hasExplicitTarget && nextTargetMode) {\n throw new Error(\"useBindings local bindings need a targetRef\")\n }\n\n if (\n registeredLayerRef.current === currentLayer &&\n registeredTargetModeRef.current === nextTargetMode &&\n registeredTargetRef.current === nextTarget\n ) {\n return\n }\n\n unregister()\n\n if (!nextTarget && nextTargetMode) {\n registeredLayerRef.current = currentLayer\n registeredTargetModeRef.current = nextTargetMode\n registeredTargetRef.current = undefined\n return\n }\n\n const { targetRef: _targetRef, targetMode: _targetMode, ...baseLayer } = currentLayer\n disposeRef.current = keymap.registerLayer(\n !nextTargetMode\n ? {\n ...baseLayer,\n }\n : {\n ...baseLayer,\n target: nextTarget!,\n targetMode: nextTargetMode,\n },\n )\n registeredLayerRef.current = currentLayer\n registeredTargetModeRef.current = nextTargetMode\n registeredTargetRef.current = nextTarget\n })\n\n useEffect(() => {\n return () => {\n unregister()\n }\n }, [unregister])\n}\n\n/**\n * Adapts any `subscribe` + `getSnapshot` store to\n * `ReactiveMatcher`. Pass `predicate` when the snapshot value is not\n * already boolean.\n */\nexport function reactiveMatcherFromStore<T>(\n subscribe: (onStoreChange: () => void) => () => void,\n getSnapshot: () => T,\n predicate?: (value: T) => boolean,\n): ReactiveMatcher {\n return {\n get() {\n return predicate ? predicate(getSnapshot()) : Boolean(getSnapshot())\n },\n subscribe(onChange) {\n return subscribe(onChange)\n },\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "88193D455507349A64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as keymap from "@opentui/keymap";
|
|
2
|
+
import * as keymapExtras from "@opentui/keymap/extras";
|
|
3
|
+
import * as keymapGraphExtra from "@opentui/keymap/extras/graph";
|
|
4
|
+
import * as keymapAddons from "@opentui/keymap/addons";
|
|
5
|
+
import * as keymapOpenTuiAddons from "@opentui/keymap/addons/opentui";
|
|
6
|
+
import * as keymapHtml from "@opentui/keymap/html";
|
|
7
|
+
import * as keymapOpenTui from "@opentui/keymap/opentui";
|
|
8
|
+
import * as keymapReact from "@opentui/keymap/react";
|
|
9
|
+
import * as keymapSolid from "@opentui/keymap/solid";
|
|
10
|
+
export declare const runtimeModules: {
|
|
11
|
+
"@opentui/keymap": typeof keymap;
|
|
12
|
+
"@opentui/keymap/extras": typeof keymapExtras;
|
|
13
|
+
"@opentui/keymap/extras/graph": typeof keymapGraphExtra;
|
|
14
|
+
"@opentui/keymap/addons": typeof keymapAddons;
|
|
15
|
+
"@opentui/keymap/addons/opentui": typeof keymapOpenTuiAddons;
|
|
16
|
+
"@opentui/keymap/html": typeof keymapHtml;
|
|
17
|
+
"@opentui/keymap/opentui": typeof keymapOpenTui;
|
|
18
|
+
"@opentui/keymap/react": typeof keymapReact;
|
|
19
|
+
"@opentui/keymap/solid": typeof keymapSolid;
|
|
20
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/runtime-modules.ts
|
|
3
|
+
import * as keymap from "@opentui/keymap";
|
|
4
|
+
import * as keymapExtras from "@opentui/keymap/extras";
|
|
5
|
+
import * as keymapGraphExtra from "@opentui/keymap/extras/graph";
|
|
6
|
+
import * as keymapAddons from "@opentui/keymap/addons";
|
|
7
|
+
import * as keymapOpenTuiAddons from "@opentui/keymap/addons/opentui";
|
|
8
|
+
import * as keymapHtml from "@opentui/keymap/html";
|
|
9
|
+
import * as keymapOpenTui from "@opentui/keymap/opentui";
|
|
10
|
+
import * as keymapReact from "@opentui/keymap/react";
|
|
11
|
+
import * as keymapSolid from "@opentui/keymap/solid";
|
|
12
|
+
var runtimeModules = {
|
|
13
|
+
"@opentui/keymap": keymap,
|
|
14
|
+
"@opentui/keymap/extras": keymapExtras,
|
|
15
|
+
"@opentui/keymap/extras/graph": keymapGraphExtra,
|
|
16
|
+
"@opentui/keymap/addons": keymapAddons,
|
|
17
|
+
"@opentui/keymap/addons/opentui": keymapOpenTuiAddons,
|
|
18
|
+
"@opentui/keymap/html": keymapHtml,
|
|
19
|
+
"@opentui/keymap/opentui": keymapOpenTui,
|
|
20
|
+
"@opentui/keymap/react": keymapReact,
|
|
21
|
+
"@opentui/keymap/solid": keymapSolid
|
|
22
|
+
};
|
|
23
|
+
export {
|
|
24
|
+
runtimeModules
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
//# debugId=0BF94D448A4CF4C764756E2164756E21
|
|
28
|
+
//# sourceMappingURL=runtime-modules.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/runtime-modules.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { RuntimeModuleEntry } from \"@opentui/core/runtime-plugin\"\nimport * as keymap from \"@opentui/keymap\"\nimport * as keymapExtras from \"@opentui/keymap/extras\"\nimport * as keymapGraphExtra from \"@opentui/keymap/extras/graph\"\nimport * as keymapAddons from \"@opentui/keymap/addons\"\nimport * as keymapOpenTuiAddons from \"@opentui/keymap/addons/opentui\"\nimport * as keymapHtml from \"@opentui/keymap/html\"\nimport * as keymapOpenTui from \"@opentui/keymap/opentui\"\nimport * as keymapReact from \"@opentui/keymap/react\"\nimport * as keymapSolid from \"@opentui/keymap/solid\"\n\nexport const runtimeModules = {\n \"@opentui/keymap\": keymap,\n \"@opentui/keymap/extras\": keymapExtras,\n \"@opentui/keymap/extras/graph\": keymapGraphExtra,\n \"@opentui/keymap/addons\": keymapAddons,\n \"@opentui/keymap/addons/opentui\": keymapOpenTuiAddons,\n \"@opentui/keymap/html\": keymapHtml,\n \"@opentui/keymap/opentui\": keymapOpenTui,\n \"@opentui/keymap/react\": keymapReact,\n \"@opentui/keymap/solid\": keymapSolid,\n} satisfies Record<string, RuntimeModuleEntry>\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEO,IAAM,iBAAiB;AAAA,EAC5B,mBAAmB;AAAA,EACnB,0BAA0B;AAAA,EAC1B,gCAAgC;AAAA,EAChC,0BAA0B;AAAA,EAC1B,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,2BAA2B;AAAA,EAC3B,yBAAyB;AAAA,EACzB,yBAAyB;AAC3B;",
|
|
8
|
+
"debugId": "0BF94D448A4CF4C764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { ActiveBinding, ActiveKey, ActiveKeyOptions,
|
|
1
|
+
import type { RuntimeEmitter } from "../lib/runtime-utils.js";
|
|
2
|
+
import type { ActiveBinding, ActiveKey, ActiveKeyOptions, BindingState, Hooks, KeymapEvent, KeymapHost, PendingSequenceCapture, KeySequencePart, PendingSequenceState, RegisteredLayer } from "../types.js";
|
|
3
3
|
import type { CommandCatalogService } from "./command-catalog.js";
|
|
4
4
|
import type { ConditionService } from "./conditions.js";
|
|
5
5
|
import type { NotificationService } from "./notify.js";
|
|
@@ -7,15 +7,7 @@ import type { ActiveCommandView, State } from "./state.js";
|
|
|
7
7
|
interface ActivationOptions<TTarget extends object, TEvent extends KeymapEvent> {
|
|
8
8
|
onPendingSequenceChanged?: (previous: PendingSequenceState<TTarget, TEvent> | null, next: PendingSequenceState<TTarget, TEvent> | null) => void;
|
|
9
9
|
}
|
|
10
|
-
export
|
|
11
|
-
private readonly state;
|
|
12
|
-
private readonly host;
|
|
13
|
-
private readonly hooks;
|
|
14
|
-
private readonly notify;
|
|
15
|
-
private readonly conditions;
|
|
16
|
-
private readonly catalog;
|
|
17
|
-
private readonly options;
|
|
18
|
-
constructor(state: State<TTarget, TEvent>, host: KeymapHost<TTarget, TEvent>, hooks: Emitter<Hooks<TTarget, TEvent>>, notify: NotificationService<TTarget, TEvent>, conditions: ConditionService<TTarget, TEvent>, catalog: CommandCatalogService<TTarget, TEvent>, options?: ActivationOptions<TTarget, TEvent>);
|
|
10
|
+
export interface ActivationService<TTarget extends object, TEvent extends KeymapEvent> {
|
|
19
11
|
getFocusedTarget(): TTarget | null;
|
|
20
12
|
getFocusedTargetIfAvailable(): TTarget | null;
|
|
21
13
|
setPendingSequence(next: PendingSequenceState<TTarget, TEvent> | null): void;
|
|
@@ -26,30 +18,12 @@ export declare class ActivationService<TTarget extends object, TEvent extends Ke
|
|
|
26
18
|
popPendingSequence(): boolean;
|
|
27
19
|
getActiveKeys(options?: ActiveKeyOptions): readonly ActiveKey<TTarget, TEvent>[];
|
|
28
20
|
getActiveKeysForCaptures(captures: readonly PendingSequenceCapture<TTarget, TEvent>[], options?: ActiveKeyOptions): readonly ActiveKey<TTarget, TEvent>[];
|
|
29
|
-
|
|
21
|
+
getActiveKeysForFocused(focused: TTarget | null, options?: ActiveKeyOptions): readonly ActiveKey<TTarget, TEvent>[];
|
|
30
22
|
getActiveLayers(focused: TTarget | null): RegisteredLayer<TTarget, TEvent>[];
|
|
31
|
-
refreshActiveLayers(focused?: TTarget | null): void;
|
|
32
|
-
invalidateActiveLayers(): void;
|
|
33
23
|
isLayerActiveForFocused(layer: RegisteredLayer<TTarget, TEvent>, focused: TTarget | null): boolean;
|
|
34
|
-
layerCanCacheActiveKeys(layer: RegisteredLayer<TTarget, TEvent>): boolean;
|
|
35
|
-
activeLayersCanCacheActiveKeys(activeLayers: readonly RegisteredLayer<TTarget, TEvent>[]): boolean;
|
|
36
|
-
private collectNodesFromNode;
|
|
37
24
|
collectSequencePartsFromPending(pending: PendingSequenceState<TTarget, TEvent>): KeySequencePart[];
|
|
38
|
-
collectMatchingBindings(bindings: readonly
|
|
39
|
-
|
|
40
|
-
private getNodePresentation;
|
|
41
|
-
private toActiveBinding;
|
|
42
|
-
collectActiveBindings(bindings: readonly CompiledBinding<TTarget, TEvent>[], focused: TTarget | null, activeView: ActiveCommandView<TTarget, TEvent>): ActiveBinding<TTarget, TEvent>[];
|
|
43
|
-
private collectActiveKeysAtRoot;
|
|
44
|
-
private collectActiveKeysFromPending;
|
|
45
|
-
private selectActiveKey;
|
|
46
|
-
private selectPrefixActiveKey;
|
|
47
|
-
private selectExactActiveKey;
|
|
48
|
-
private selectActiveBindings;
|
|
49
|
-
private createActiveKeyState;
|
|
50
|
-
private updateActiveKeyState;
|
|
51
|
-
private materializeActiveKey;
|
|
52
|
-
private invalidateCaches;
|
|
53
|
-
private notifyPendingSequenceChange;
|
|
25
|
+
collectMatchingBindings(bindings: readonly BindingState<TTarget, TEvent>[], focused: TTarget | null, activeView: ActiveCommandView<TTarget, TEvent>): BindingState<TTarget, TEvent>[];
|
|
26
|
+
collectActiveBindings(bindings: readonly BindingState<TTarget, TEvent>[], focused: TTarget | null, activeView: ActiveCommandView<TTarget, TEvent>): ActiveBinding<TTarget, TEvent>[];
|
|
54
27
|
}
|
|
28
|
+
export declare function createActivationService<TTarget extends object, TEvent extends KeymapEvent>(state: State<TTarget, TEvent>, host: KeymapHost<TTarget, TEvent>, hooks: RuntimeEmitter<Hooks<TTarget, TEvent>>, notify: NotificationService<TTarget, TEvent>, conditions: ConditionService<TTarget, TEvent>, catalog: CommandCatalogService<TTarget, TEvent>, options?: ActivationOptions<TTarget, TEvent>): ActivationService<TTarget, TEvent>;
|
|
55
29
|
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ActiveKey, ActiveKeyOptions, KeymapEvent } from "../types.js";
|
|
2
|
+
export interface ActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent> {
|
|
3
|
+
version: number;
|
|
4
|
+
notifyVersion: number;
|
|
5
|
+
focused: TTarget | null | undefined;
|
|
6
|
+
value: readonly ActiveKey<TTarget, TEvent>[];
|
|
7
|
+
targets: WeakMap<TTarget, {
|
|
8
|
+
version: number;
|
|
9
|
+
value: readonly ActiveKey<TTarget, TEvent>[];
|
|
10
|
+
}>;
|
|
11
|
+
nullTarget?: {
|
|
12
|
+
version: number;
|
|
13
|
+
value: readonly ActiveKey<TTarget, TEvent>[];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface ActiveKeysCaches<TTarget extends object, TEvent extends KeymapEvent> {
|
|
17
|
+
plain: ActiveKeysCache<TTarget, TEvent>;
|
|
18
|
+
bindings: ActiveKeysCache<TTarget, TEvent>;
|
|
19
|
+
metadata: ActiveKeysCache<TTarget, TEvent>;
|
|
20
|
+
bindingsAndMetadata: ActiveKeysCache<TTarget, TEvent>;
|
|
21
|
+
}
|
|
22
|
+
export declare function createActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(): ActiveKeysCache<TTarget, TEvent>;
|
|
23
|
+
export declare function createActiveKeysCaches<TTarget extends object, TEvent extends KeymapEvent>(): ActiveKeysCaches<TTarget, TEvent>;
|
|
24
|
+
export declare function getActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(caches: ActiveKeysCaches<TTarget, TEvent>, options?: ActiveKeyOptions): ActiveKeysCache<TTarget, TEvent>;
|
|
25
|
+
export declare function getFocusedActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(cache: ActiveKeysCache<TTarget, TEvent>, cacheVersion: number, focused: TTarget | null): {
|
|
26
|
+
version: number;
|
|
27
|
+
value: readonly ActiveKey<TTarget, TEvent>[];
|
|
28
|
+
} | undefined;
|
|
29
|
+
export declare function setFocusedActiveKeysCache<TTarget extends object, TEvent extends KeymapEvent>(cache: ActiveKeysCache<TTarget, TEvent>, cacheVersion: number, focused: TTarget | null, value: readonly ActiveKey<TTarget, TEvent>[]): void;
|