@opentui/keymap 0.0.0-20260423-618ea9b1 → 0.1.106

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/src/types.d.ts CHANGED
@@ -41,11 +41,44 @@ export interface NormalizedKeyStroke extends KeyStrokeInput {
41
41
  meta: boolean;
42
42
  super: boolean;
43
43
  }
44
- export type KeyMatch = symbol;
44
+ export type KeyMatch = string;
45
45
  export interface EventMatchResolverContext {
46
46
  resolveKey(key: KeyLike): KeyMatch;
47
47
  }
48
48
  export type EventMatchResolver<TEvent extends KeymapEvent = KeymapEvent> = (event: TEvent, ctx: EventMatchResolverContext) => readonly KeyMatch[] | undefined;
49
+ export declare const KEY_DISAMBIGUATION_DECISION: unique symbol;
50
+ export declare const KEY_DEFERRED_DISAMBIGUATION_DECISION: unique symbol;
51
+ export interface KeyDisambiguationDecision {
52
+ readonly [KEY_DISAMBIGUATION_DECISION]: true;
53
+ }
54
+ export interface KeyDeferredDisambiguationDecision {
55
+ readonly [KEY_DEFERRED_DISAMBIGUATION_DECISION]: true;
56
+ }
57
+ export interface KeyDisambiguationContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
58
+ readonly event: Readonly<Omit<TEvent, "preventDefault" | "stopPropagation">>;
59
+ readonly focused: TTarget | null;
60
+ readonly sequence: readonly KeySequencePart[];
61
+ readonly stroke: KeySequencePart;
62
+ readonly exact: readonly ActiveBinding<TTarget, TEvent>[];
63
+ readonly continuations: readonly ActiveKey<TTarget, TEvent>[];
64
+ getData(name: string): unknown;
65
+ setData(name: string, value: unknown): void;
66
+ runExact(): KeyDisambiguationDecision;
67
+ continueSequence(): KeyDisambiguationDecision;
68
+ clear(): KeyDisambiguationDecision;
69
+ defer(run: KeyDeferredDisambiguationHandler<TTarget, TEvent>): KeyDisambiguationDecision;
70
+ }
71
+ export interface KeyDeferredDisambiguationContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
72
+ readonly signal: AbortSignal;
73
+ readonly sequence: readonly KeySequencePart[];
74
+ readonly focused: TTarget | null;
75
+ sleep(ms: number): Promise<boolean>;
76
+ runExact(): KeyDeferredDisambiguationDecision;
77
+ continueSequence(): KeyDeferredDisambiguationDecision;
78
+ clear(): KeyDeferredDisambiguationDecision;
79
+ }
80
+ export type KeyDeferredDisambiguationHandler<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (ctx: KeyDeferredDisambiguationContext<TTarget, TEvent>) => KeyDeferredDisambiguationDecision | void | Promise<KeyDeferredDisambiguationDecision | void>;
81
+ export type KeyDisambiguationResolver<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = (ctx: KeyDisambiguationContext<TTarget, TEvent>) => KeyDisambiguationDecision | undefined;
49
82
  export interface ResolvedKeyToken {
50
83
  stroke: NormalizedKeyStroke;
51
84
  match: KeyMatch;
@@ -97,7 +130,7 @@ export type RunCommandResult = {
97
130
  reason: "not-found";
98
131
  } | {
99
132
  ok: false;
100
- reason: "invalid-args" | "rejected" | "error";
133
+ reason: "inactive" | "disabled" | "invalid-args" | "rejected" | "error";
101
134
  command?: CommandRecord;
102
135
  };
103
136
  export interface CommandContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
@@ -136,27 +169,34 @@ export interface BindingInput<TTarget extends object = object, TEvent extends Ke
136
169
  }
137
170
  export type BindingShorthand<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = Record<string, BindingCommand<TTarget, TEvent>>;
138
171
  export type Bindings<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = BindingInput<TTarget, TEvent>[] | BindingShorthand<TTarget, TEvent>;
139
- export type Scope = "global" | "focus" | "focus-within";
172
+ export type TargetMode = "focus" | "focus-within";
140
173
  export interface LayerFields<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
141
174
  priority?: number;
142
175
  bindings?: Bindings<TTarget, TEvent>;
143
176
  commands?: readonly CommandDefinition<TTarget, TEvent>[];
177
+ targetMode?: TargetMode;
178
+ /**
179
+ * Extra layer fields feed layer-field compilers and binding compilation via
180
+ * `BindingParserContext.layer` / `BindingTransformerContext.layer`. Unlike
181
+ * binding and command fields, layer fields do not compile into public attrs.
182
+ */
144
183
  [key: string]: unknown;
145
184
  }
185
+ export interface Layer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> extends LayerFields<TTarget, TEvent> {
186
+ target?: TTarget;
187
+ }
146
188
  export interface GlobalLayer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> extends LayerFields<TTarget, TEvent> {
147
189
  target?: undefined;
148
- scope?: "global";
149
190
  }
150
191
  export interface FocusWithinLayer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> extends LayerFields<TTarget, TEvent> {
151
192
  target: TTarget;
152
- scope?: "focus-within";
193
+ targetMode?: TargetMode;
153
194
  }
154
195
  export interface FocusLayer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> extends LayerFields<TTarget, TEvent> {
155
196
  target: TTarget;
156
- scope: "focus";
197
+ targetMode?: TargetMode;
157
198
  }
158
199
  export type TargetLayer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = FocusWithinLayer<TTarget, TEvent> | FocusLayer<TTarget, TEvent>;
159
- export type Layer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = GlobalLayer<TTarget, TEvent> | TargetLayer<TTarget, TEvent>;
160
200
  export interface ParsedCommand {
161
201
  input: string;
162
202
  name: string;
@@ -245,6 +285,10 @@ export type BindingFieldCompiler = (value: unknown, ctx: BindingFieldContext) =>
245
285
  export interface LayerFieldContext {
246
286
  require(name: string, value: unknown): void;
247
287
  /**
288
+ * Layer fields only influence activation and binding compilation. They do
289
+ * not expose `attr(...)` because the current model has no layer-level attrs
290
+ * surface on `ActiveKey`, `ActiveBinding`, or `CommandRecord`.
291
+ *
248
292
  * Registers a runtime matcher. Raw callbacks re-run on every read;
249
293
  * reactive matchers stay cached until they notify.
250
294
  */
@@ -252,7 +296,6 @@ export interface LayerFieldContext {
252
296
  }
253
297
  export type LayerFieldCompiler = (value: unknown, ctx: LayerFieldContext) => void;
254
298
  export interface LayerAnalysisContext<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
255
- scope: Scope;
256
299
  target?: TTarget;
257
300
  order: number;
258
301
  bindingInputs: readonly BindingInput<TTarget, TEvent>[];
@@ -271,7 +314,6 @@ export interface LayerBindingAnalysis<TTarget extends object = object, TEvent ex
271
314
  preventDefault: boolean;
272
315
  fallthrough: boolean;
273
316
  sourceBinding: ParsedBindingInput<TTarget, TEvent>;
274
- sourceScope: Scope;
275
317
  sourceTarget?: TTarget;
276
318
  sourceLayerOrder: number;
277
319
  sourceBindingIndex: number;
@@ -386,11 +428,6 @@ export interface RawInterceptOptions {
386
428
  priority?: number;
387
429
  }
388
430
  export type { Keymap };
389
- export type KeymapActiveKey<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = ActiveKey<TTarget, TEvent>;
390
- export type KeymapBindingInput<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = BindingInput<TTarget, TEvent>;
391
- export type KeymapCommandDefinition<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = CommandDefinition<TTarget, TEvent>;
392
- export type KeymapCommandRecord = CommandRecord;
393
- export type KeymapCommandEntry<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> = CommandEntry<TTarget, TEvent>;
394
431
  export interface RuntimeMatcher {
395
432
  source: string;
396
433
  match: () => boolean;
@@ -419,7 +456,6 @@ export interface RuntimeMatchable {
419
456
  export interface CompiledBinding<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> extends ActiveBinding<TTarget, TEvent>, RuntimeMatchable {
420
457
  run?: CommandHandler<TTarget, TEvent>;
421
458
  sourceBinding: ParsedBindingInput<TTarget, TEvent>;
422
- sourceScope: Scope;
423
459
  sourceTarget?: TTarget;
424
460
  sourceLayerOrder: number;
425
461
  sourceBindingIndex: number;
@@ -466,8 +502,7 @@ export interface SequenceNode<TTarget extends object = object, TEvent extends Ke
466
502
  export interface RegisteredLayer<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
467
503
  order: number;
468
504
  target?: TTarget;
469
- indexTarget: TTarget;
470
- scope: Scope;
505
+ targetMode?: TargetMode;
471
506
  priority: number;
472
507
  requires: readonly [name: string, value: unknown][];
473
508
  matchers: readonly RuntimeMatcher[];
@@ -485,11 +520,6 @@ export interface RegisteredLayer<TTarget extends object = object, TEvent extends
485
520
  hasTokenBindings: boolean;
486
521
  root: SequenceNode<TTarget, TEvent>;
487
522
  offTargetDestroy?: () => void;
488
- bucket?: RegisteredLayerBucket<TTarget, TEvent>;
489
- }
490
- export interface RegisteredLayerBucket<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
491
- focusLayers: RegisteredLayer<TTarget, TEvent>[];
492
- focusWithinLayers: RegisteredLayer<TTarget, TEvent>[];
493
523
  }
494
524
  export interface PendingSequenceCapture<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
495
525
  layer: RegisteredLayer<TTarget, TEvent>;
@@ -1 +0,0 @@
1
- export {};