@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
@@ -0,0 +1,467 @@
1
+ // @bun
2
+ // src/addons/opentui/index.ts
3
+ export * from "@opentui/keymap/addons";
4
+
5
+ // src/addons/opentui/base-layout.ts
6
+ var BASE_LAYOUT_FALLBACK_RESOURCE = Symbol("keymap:base-layout-fallback");
7
+ function getBaseLayoutKeyName(baseCode) {
8
+ if (baseCode === undefined || baseCode < 32 || baseCode === 127) {
9
+ return;
10
+ }
11
+ try {
12
+ const name = String.fromCodePoint(baseCode);
13
+ if (name.length === 1 && name >= "A" && name <= "Z") {
14
+ return name.toLowerCase();
15
+ }
16
+ return name;
17
+ } catch {
18
+ return;
19
+ }
20
+ }
21
+ function registerBaseLayoutFallback(keymap) {
22
+ return keymap.acquireResource(BASE_LAYOUT_FALLBACK_RESOURCE, () => {
23
+ return keymap.appendEventMatchResolver((event, ctx) => {
24
+ const name = getBaseLayoutKeyName(event.baseCode);
25
+ if (!name) {
26
+ return;
27
+ }
28
+ return [
29
+ ctx.resolveKey({
30
+ name,
31
+ ctrl: event.ctrl,
32
+ shift: event.shift,
33
+ meta: event.meta,
34
+ super: event.super ?? false,
35
+ hyper: event.hyper || undefined
36
+ })
37
+ ];
38
+ });
39
+ });
40
+ }
41
+ // src/addons/opentui/edit-buffer-bindings.ts
42
+ import {
43
+ CliRenderEvents,
44
+ InputRenderable,
45
+ TextareaRenderable,
46
+ defaultTextareaKeyBindings
47
+ } from "@opentui/core";
48
+ function keyBindingToString(binding) {
49
+ const parts = [];
50
+ if (binding.ctrl)
51
+ parts.push("ctrl");
52
+ if (binding.shift)
53
+ parts.push("shift");
54
+ if (binding.meta)
55
+ parts.push("meta");
56
+ if (binding.super)
57
+ parts.push("super");
58
+ parts.push(binding.name);
59
+ return parts.join("+");
60
+ }
61
+ var editBufferActions = [
62
+ "move-left",
63
+ "move-right",
64
+ "move-up",
65
+ "move-down",
66
+ "select-left",
67
+ "select-right",
68
+ "select-up",
69
+ "select-down",
70
+ "line-home",
71
+ "line-end",
72
+ "select-line-home",
73
+ "select-line-end",
74
+ "visual-line-home",
75
+ "visual-line-end",
76
+ "select-visual-line-home",
77
+ "select-visual-line-end",
78
+ "buffer-home",
79
+ "buffer-end",
80
+ "select-buffer-home",
81
+ "select-buffer-end",
82
+ "delete-line",
83
+ "delete-to-line-end",
84
+ "delete-to-line-start",
85
+ "backspace",
86
+ "delete",
87
+ "newline",
88
+ "undo",
89
+ "redo",
90
+ "word-forward",
91
+ "word-backward",
92
+ "select-word-forward",
93
+ "select-word-backward",
94
+ "delete-word-forward",
95
+ "delete-word-backward",
96
+ "select-all",
97
+ "submit"
98
+ ];
99
+ var DEFAULT_EDIT_BUFFER_METADATA_GROUP = "Text Editing";
100
+ var editBufferCommandNames = {
101
+ "move-left": "input.move.left",
102
+ "move-right": "input.move.right",
103
+ "move-up": "input.move.up",
104
+ "move-down": "input.move.down",
105
+ "select-left": "input.select.left",
106
+ "select-right": "input.select.right",
107
+ "select-up": "input.select.up",
108
+ "select-down": "input.select.down",
109
+ "line-home": "input.line.home",
110
+ "line-end": "input.line.end",
111
+ "select-line-home": "input.select.line.home",
112
+ "select-line-end": "input.select.line.end",
113
+ "visual-line-home": "input.visual.line.home",
114
+ "visual-line-end": "input.visual.line.end",
115
+ "select-visual-line-home": "input.select.visual.line.home",
116
+ "select-visual-line-end": "input.select.visual.line.end",
117
+ "buffer-home": "input.buffer.home",
118
+ "buffer-end": "input.buffer.end",
119
+ "select-buffer-home": "input.select.buffer.home",
120
+ "select-buffer-end": "input.select.buffer.end",
121
+ "delete-line": "input.delete.line",
122
+ "delete-to-line-end": "input.delete.to.line.end",
123
+ "delete-to-line-start": "input.delete.to.line.start",
124
+ backspace: "input.backspace",
125
+ delete: "input.delete",
126
+ newline: "input.newline",
127
+ undo: "input.undo",
128
+ redo: "input.redo",
129
+ "word-forward": "input.word.forward",
130
+ "word-backward": "input.word.backward",
131
+ "select-word-forward": "input.select.word.forward",
132
+ "select-word-backward": "input.select.word.backward",
133
+ "delete-word-forward": "input.delete.word.forward",
134
+ "delete-word-backward": "input.delete.word.backward",
135
+ "select-all": "input.select.all",
136
+ submit: "input.submit"
137
+ };
138
+ var editBufferCommandDescriptions = {
139
+ "move-left": "Cursor left",
140
+ "move-right": "Cursor right",
141
+ "move-up": "Cursor up",
142
+ "move-down": "Cursor down",
143
+ "select-left": "Select left",
144
+ "select-right": "Select right",
145
+ "select-up": "Select up",
146
+ "select-down": "Select down",
147
+ "line-home": "Line start",
148
+ "line-end": "Line end",
149
+ "select-line-home": "Select to line start",
150
+ "select-line-end": "Select to line end",
151
+ "visual-line-home": "Visual line start",
152
+ "visual-line-end": "Visual line end",
153
+ "select-visual-line-home": "Select to visual line start",
154
+ "select-visual-line-end": "Select to visual line end",
155
+ "buffer-home": "Buffer start",
156
+ "buffer-end": "Buffer end",
157
+ "select-buffer-home": "Select to buffer start",
158
+ "select-buffer-end": "Select to buffer end",
159
+ "delete-line": "Delete line",
160
+ "delete-to-line-end": "Delete to line end",
161
+ "delete-to-line-start": "Delete to line start",
162
+ backspace: "Delete backward",
163
+ delete: "Delete forward",
164
+ newline: "New line",
165
+ undo: "Undo",
166
+ redo: "Redo",
167
+ "word-forward": "Next word",
168
+ "word-backward": "Previous word",
169
+ "select-word-forward": "Select next word",
170
+ "select-word-backward": "Select previous word",
171
+ "delete-word-forward": "Delete next word",
172
+ "delete-word-backward": "Delete previous word",
173
+ "select-all": "Select all",
174
+ submit: "Submit"
175
+ };
176
+ var editBufferFineGroups = {
177
+ "move-left": "Cursor",
178
+ "move-right": "Cursor",
179
+ "move-up": "Cursor",
180
+ "move-down": "Cursor",
181
+ "select-left": "Selection",
182
+ "select-right": "Selection",
183
+ "select-up": "Selection",
184
+ "select-down": "Selection",
185
+ "line-home": "Cursor",
186
+ "line-end": "Cursor",
187
+ "select-line-home": "Selection",
188
+ "select-line-end": "Selection",
189
+ "visual-line-home": "Cursor",
190
+ "visual-line-end": "Cursor",
191
+ "select-visual-line-home": "Selection",
192
+ "select-visual-line-end": "Selection",
193
+ "buffer-home": "Cursor",
194
+ "buffer-end": "Cursor",
195
+ "select-buffer-home": "Selection",
196
+ "select-buffer-end": "Selection",
197
+ "delete-line": "Delete",
198
+ "delete-to-line-end": "Delete",
199
+ "delete-to-line-start": "Delete",
200
+ backspace: "Delete",
201
+ delete: "Delete",
202
+ newline: "Insert",
203
+ undo: "History",
204
+ redo: "History",
205
+ "word-forward": "Cursor",
206
+ "word-backward": "Cursor",
207
+ "select-word-forward": "Selection",
208
+ "select-word-backward": "Selection",
209
+ "delete-word-forward": "Delete",
210
+ "delete-word-backward": "Delete",
211
+ "select-all": "Selection",
212
+ submit: "Submit"
213
+ };
214
+ var EDIT_BUFFER_COMMANDS_RESOURCE = Symbol("keymap:edit-buffer-commands");
215
+ var TEXTAREA_MAPPING_SUSPENSION_RESOURCE = Symbol("keymap:textarea-mapping-suspension");
216
+ function isManagedTextarea(editor) {
217
+ return editor instanceof TextareaRenderable && !(editor instanceof InputRenderable);
218
+ }
219
+ function resolveEditBufferCommandDescriptions(options) {
220
+ const descriptions = { ...editBufferCommandDescriptions };
221
+ const overrides = options?.descriptions;
222
+ if (!overrides) {
223
+ return descriptions;
224
+ }
225
+ for (const name of editBufferActions) {
226
+ const override = overrides[name];
227
+ if (override === undefined) {
228
+ continue;
229
+ }
230
+ const normalized = override.trim();
231
+ if (!normalized) {
232
+ throw new Error(`Edit buffer command description for "${name}" cannot be empty`);
233
+ }
234
+ descriptions[name] = normalized;
235
+ }
236
+ return descriptions;
237
+ }
238
+ function normalizeEditBufferMetadataField(fieldName, value) {
239
+ const normalized = (value ?? DEFAULT_EDIT_BUFFER_METADATA_GROUP).trim();
240
+ if (!normalized) {
241
+ throw new Error(`Edit buffer metadata field "${fieldName}" cannot be empty`);
242
+ }
243
+ return normalized;
244
+ }
245
+ function resolveEditBufferMetadataOptions(options) {
246
+ return {
247
+ category: normalizeEditBufferMetadataField("category", options?.category),
248
+ group: normalizeEditBufferMetadataField("group", options?.group),
249
+ includeFineGroup: options?.includeFineGroup === true
250
+ };
251
+ }
252
+ function resolveEditBufferCommandNames(options) {
253
+ const commandNames = { ...editBufferCommandNames };
254
+ const overrides = options?.commandNames;
255
+ if (overrides) {
256
+ for (const action of editBufferActions) {
257
+ const override = overrides[action];
258
+ if (override === undefined) {
259
+ continue;
260
+ }
261
+ const normalized = override.trim();
262
+ if (!normalized) {
263
+ throw new Error(`Edit buffer command name for "${action}" cannot be empty`);
264
+ }
265
+ commandNames[action] = normalized;
266
+ }
267
+ }
268
+ const seenNames = new Map;
269
+ for (const action of editBufferActions) {
270
+ const commandName = commandNames[action];
271
+ const existingAction = seenNames.get(commandName);
272
+ if (existingAction !== undefined) {
273
+ throw new Error(`Edit buffer command name "${commandName}" is assigned to both "${existingAction}" and "${action}"`);
274
+ }
275
+ seenNames.set(commandName, action);
276
+ }
277
+ return commandNames;
278
+ }
279
+ function setTextareaSuspend(editor, suspended) {
280
+ const nextTraits = { ...editor.traits };
281
+ if (suspended) {
282
+ nextTraits.suspend = true;
283
+ } else {
284
+ delete nextTraits.suspend;
285
+ }
286
+ editor.traits = nextTraits;
287
+ }
288
+ function createDefaultTextareaBindings(commandNames, descriptions, metadata) {
289
+ return defaultTextareaKeyBindings.map((binding) => {
290
+ const generated = {
291
+ key: keyBindingToString(binding),
292
+ cmd: commandNames[binding.action],
293
+ desc: descriptions[binding.action],
294
+ group: metadata.group
295
+ };
296
+ if (metadata.includeFineGroup) {
297
+ generated.fineGroup = editBufferFineGroups[binding.action];
298
+ }
299
+ return generated;
300
+ });
301
+ }
302
+ function createTextareaBindings(overrides, options) {
303
+ return createTextareaBindingsWithResolvedOptions(overrides, resolveEditBufferCommandNames(options), resolveEditBufferCommandDescriptions(options), resolveEditBufferMetadataOptions(options));
304
+ }
305
+ function createTextareaBindingsWithResolvedOptions(overrides, commandNames, descriptions, metadata) {
306
+ const overrideBindings = overrides ?? [];
307
+ return [...overrideBindings, ...createDefaultTextareaBindings(commandNames, descriptions, metadata)];
308
+ }
309
+ function getLiveRenderer(renderer) {
310
+ if (renderer.isDestroyed) {
311
+ throw new Error("Cannot use a keymap after its renderer was destroyed");
312
+ }
313
+ return renderer;
314
+ }
315
+ function registerTextareaMappingSuspension(keymap, renderer) {
316
+ return keymap.acquireResource(TEXTAREA_MAPPING_SUSPENSION_RESOURCE, () => {
317
+ const previousSuspendStates = new WeakMap;
318
+ let suspendedEditor = null;
319
+ const suspendEditor = (editor) => {
320
+ if (!isManagedTextarea(editor) || editor.isDestroyed) {
321
+ suspendedEditor = null;
322
+ return;
323
+ }
324
+ if (!previousSuspendStates.has(editor)) {
325
+ previousSuspendStates.set(editor, editor.traits.suspend === true);
326
+ }
327
+ setTextareaSuspend(editor, true);
328
+ suspendedEditor = editor;
329
+ };
330
+ const restoreEditor = (editor) => {
331
+ if (!isManagedTextarea(editor)) {
332
+ return;
333
+ }
334
+ const previousSuspend = previousSuspendStates.get(editor);
335
+ if (previousSuspend === undefined) {
336
+ return;
337
+ }
338
+ previousSuspendStates.delete(editor);
339
+ if (!editor.isDestroyed) {
340
+ setTextareaSuspend(editor, previousSuspend);
341
+ }
342
+ if (suspendedEditor === editor) {
343
+ suspendedEditor = null;
344
+ }
345
+ };
346
+ const onFocusedEditor = (current, previous) => {
347
+ restoreEditor(previous);
348
+ suspendEditor(current);
349
+ };
350
+ const liveRenderer = getLiveRenderer(renderer);
351
+ liveRenderer.on(CliRenderEvents.FOCUSED_EDITOR, onFocusedEditor);
352
+ suspendEditor(liveRenderer.currentFocusedEditor);
353
+ return () => {
354
+ liveRenderer.off(CliRenderEvents.FOCUSED_EDITOR, onFocusedEditor);
355
+ restoreEditor(suspendedEditor);
356
+ };
357
+ });
358
+ }
359
+ function withFocusedEditor(renderer, run) {
360
+ const editor = getLiveRenderer(renderer).currentFocusedEditor;
361
+ if (!editor || editor.isDestroyed) {
362
+ return false;
363
+ }
364
+ return run(editor);
365
+ }
366
+ function hasSubmit(editor) {
367
+ return typeof editor.submit === "function";
368
+ }
369
+ var editBufferCommandHandlers = {
370
+ "move-left": (editor) => editor.moveCursorLeft(),
371
+ "move-right": (editor) => editor.moveCursorRight(),
372
+ "move-up": (editor) => editor.moveCursorUp(),
373
+ "move-down": (editor) => editor.moveCursorDown(),
374
+ "select-left": (editor) => editor.moveCursorLeft({ select: true }),
375
+ "select-right": (editor) => editor.moveCursorRight({ select: true }),
376
+ "select-up": (editor) => editor.moveCursorUp({ select: true }),
377
+ "select-down": (editor) => editor.moveCursorDown({ select: true }),
378
+ "line-home": (editor) => editor.gotoLineHome(),
379
+ "line-end": (editor) => editor.gotoLineEnd(),
380
+ "select-line-home": (editor) => editor.gotoLineHome({ select: true }),
381
+ "select-line-end": (editor) => editor.gotoLineEnd({ select: true }),
382
+ "visual-line-home": (editor) => editor.gotoVisualLineHome(),
383
+ "visual-line-end": (editor) => editor.gotoVisualLineEnd(),
384
+ "select-visual-line-home": (editor) => editor.gotoVisualLineHome({ select: true }),
385
+ "select-visual-line-end": (editor) => editor.gotoVisualLineEnd({ select: true }),
386
+ "buffer-home": (editor) => editor.gotoBufferHome(),
387
+ "buffer-end": (editor) => editor.gotoBufferEnd(),
388
+ "select-buffer-home": (editor) => editor.gotoBufferHome({ select: true }),
389
+ "select-buffer-end": (editor) => editor.gotoBufferEnd({ select: true }),
390
+ "delete-line": (editor) => editor.deleteLine(),
391
+ "delete-to-line-end": (editor) => editor.deleteToLineEnd(),
392
+ "delete-to-line-start": (editor) => editor.deleteToLineStart(),
393
+ backspace: (editor) => editor.deleteCharBackward(),
394
+ delete: (editor) => editor.deleteChar(),
395
+ newline: (editor) => editor.newLine(),
396
+ undo: (editor) => editor.undo(),
397
+ redo: (editor) => editor.redo(),
398
+ "word-forward": (editor) => editor.moveWordForward(),
399
+ "word-backward": (editor) => editor.moveWordBackward(),
400
+ "select-word-forward": (editor) => editor.moveWordForward({ select: true }),
401
+ "select-word-backward": (editor) => editor.moveWordBackward({ select: true }),
402
+ "delete-word-forward": (editor) => editor.deleteWordForward(),
403
+ "delete-word-backward": (editor) => editor.deleteWordBackward(),
404
+ "select-all": (editor) => editor.selectAll(),
405
+ submit: (editor) => {
406
+ if (!hasSubmit(editor)) {
407
+ return false;
408
+ }
409
+ return editor.submit();
410
+ }
411
+ };
412
+ function createEditBufferCommand(renderer, action, commandNames, run, descriptions, metadata) {
413
+ return {
414
+ name: commandNames[action],
415
+ desc: descriptions[action],
416
+ category: metadata.category,
417
+ run() {
418
+ return withFocusedEditor(renderer, run);
419
+ }
420
+ };
421
+ }
422
+ function createEditBufferCommands(renderer, commandNames, descriptions, metadata) {
423
+ return editBufferActions.map((action) => createEditBufferCommand(renderer, action, commandNames, editBufferCommandHandlers[action], descriptions, metadata));
424
+ }
425
+ function registerEditBufferCommands(keymap, renderer, options) {
426
+ const commandNames = resolveEditBufferCommandNames(options);
427
+ const descriptions = resolveEditBufferCommandDescriptions(options);
428
+ const metadata = resolveEditBufferMetadataOptions(options);
429
+ return keymap.acquireResource(EDIT_BUFFER_COMMANDS_RESOURCE, () => {
430
+ return keymap.registerLayer({
431
+ commands: createEditBufferCommands(renderer, commandNames, descriptions, metadata)
432
+ });
433
+ });
434
+ }
435
+ function registerManagedTextareaLayer(keymap, renderer, layer, options) {
436
+ const commandNames = resolveEditBufferCommandNames(options);
437
+ const descriptions = resolveEditBufferCommandDescriptions(options);
438
+ const metadata = resolveEditBufferMetadataOptions(options);
439
+ const offCommands = registerEditBufferCommands(keymap, renderer, options);
440
+ const offSuspension = registerTextareaMappingSuspension(keymap, renderer);
441
+ try {
442
+ const { bindings, target: _ignoredTarget, targetMode: _ignoredTargetMode, ...rest } = layer;
443
+ const offLayer = keymap.registerLayer({
444
+ ...rest,
445
+ bindings: createTextareaBindingsWithResolvedOptions(bindings, commandNames, descriptions, metadata)
446
+ });
447
+ return () => {
448
+ offLayer();
449
+ offSuspension();
450
+ offCommands();
451
+ };
452
+ } catch (error) {
453
+ offSuspension();
454
+ offCommands();
455
+ throw error;
456
+ }
457
+ }
458
+ export {
459
+ registerTextareaMappingSuspension,
460
+ registerManagedTextareaLayer,
461
+ registerEditBufferCommands,
462
+ registerBaseLayoutFallback,
463
+ createTextareaBindings
464
+ };
465
+
466
+ //# debugId=41E23EFAAC69B76764756E2164756E21
467
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,12 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/addons/opentui/index.ts", "../src/addons/opentui/base-layout.ts", "../src/addons/opentui/edit-buffer-bindings.ts"],
4
+ "sourcesContent": [
5
+ "export * from \"@opentui/keymap/addons\"\nexport { registerBaseLayoutFallback } from \"./base-layout.js\"\nexport {\n createTextareaBindings,\n registerEditBufferCommands,\n registerManagedTextareaLayer,\n registerTextareaMappingSuspension,\n} from \"./edit-buffer-bindings.js\"\nexport type { EditBufferCommandName, EditBufferCommandOptions, EditBufferFineGroup } from \"./edit-buffer-bindings.js\"\n",
6
+ "import type { KeyEvent, Renderable } from \"@opentui/core\"\nimport type { Keymap } from \"../../index.js\"\n\nconst BASE_LAYOUT_FALLBACK_RESOURCE = Symbol(\"keymap:base-layout-fallback\")\n\nfunction getBaseLayoutKeyName(baseCode: number | undefined): string | undefined {\n if (baseCode === undefined || baseCode < 32 || baseCode === 127) {\n return undefined\n }\n\n try {\n const name = String.fromCodePoint(baseCode)\n\n if (name.length === 1 && name >= \"A\" && name <= \"Z\") {\n return name.toLowerCase()\n }\n\n return name\n } catch {\n return undefined\n }\n}\n\n/**\n * Falls back to the event's base layout code so bindings can ignore active\n * keyboard layout changes.\n */\nexport function registerBaseLayoutFallback(keymap: Keymap<Renderable, KeyEvent>): () => void {\n return keymap.acquireResource(BASE_LAYOUT_FALLBACK_RESOURCE, () => {\n return keymap.appendEventMatchResolver((event, ctx) => {\n const name = getBaseLayoutKeyName(event.baseCode)\n if (!name) {\n return undefined\n }\n\n return [\n ctx.resolveKey({\n 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 })\n })\n}\n",
7
+ "import {\n CliRenderEvents,\n InputRenderable,\n TextareaRenderable,\n defaultTextareaKeyBindings,\n type CliRenderer,\n type EditBufferRenderable,\n type KeyEvent,\n type Renderable,\n type TextareaAction,\n} from \"@opentui/core\"\nimport type { Binding, Bindings, Command, Keymap, Layer } from \"../../index.js\"\n\ninterface KeyBindingLike {\n name: string\n ctrl?: boolean\n shift?: boolean\n meta?: boolean\n super?: boolean\n}\n\nfunction keyBindingToString(binding: KeyBindingLike): string {\n const parts: string[] = []\n\n if (binding.ctrl) parts.push(\"ctrl\")\n if (binding.shift) parts.push(\"shift\")\n if (binding.meta) parts.push(\"meta\")\n if (binding.super) parts.push(\"super\")\n\n parts.push(binding.name)\n\n return parts.join(\"+\")\n}\n\nconst editBufferActions = [\n \"move-left\",\n \"move-right\",\n \"move-up\",\n \"move-down\",\n \"select-left\",\n \"select-right\",\n \"select-up\",\n \"select-down\",\n \"line-home\",\n \"line-end\",\n \"select-line-home\",\n \"select-line-end\",\n \"visual-line-home\",\n \"visual-line-end\",\n \"select-visual-line-home\",\n \"select-visual-line-end\",\n \"buffer-home\",\n \"buffer-end\",\n \"select-buffer-home\",\n \"select-buffer-end\",\n \"delete-line\",\n \"delete-to-line-end\",\n \"delete-to-line-start\",\n \"backspace\",\n \"delete\",\n \"newline\",\n \"undo\",\n \"redo\",\n \"word-forward\",\n \"word-backward\",\n \"select-word-forward\",\n \"select-word-backward\",\n \"delete-word-forward\",\n \"delete-word-backward\",\n \"select-all\",\n \"submit\",\n] as const satisfies readonly TextareaAction[]\n\nexport type EditBufferCommandName = (typeof editBufferActions)[number]\n\nexport type EditBufferFineGroup = \"Cursor\" | \"Selection\" | \"Delete\" | \"History\" | \"Insert\" | \"Submit\"\n\nconst DEFAULT_EDIT_BUFFER_METADATA_GROUP = \"Text Editing\"\n\nconst editBufferCommandNames = {\n \"move-left\": \"input.move.left\",\n \"move-right\": \"input.move.right\",\n \"move-up\": \"input.move.up\",\n \"move-down\": \"input.move.down\",\n \"select-left\": \"input.select.left\",\n \"select-right\": \"input.select.right\",\n \"select-up\": \"input.select.up\",\n \"select-down\": \"input.select.down\",\n \"line-home\": \"input.line.home\",\n \"line-end\": \"input.line.end\",\n \"select-line-home\": \"input.select.line.home\",\n \"select-line-end\": \"input.select.line.end\",\n \"visual-line-home\": \"input.visual.line.home\",\n \"visual-line-end\": \"input.visual.line.end\",\n \"select-visual-line-home\": \"input.select.visual.line.home\",\n \"select-visual-line-end\": \"input.select.visual.line.end\",\n \"buffer-home\": \"input.buffer.home\",\n \"buffer-end\": \"input.buffer.end\",\n \"select-buffer-home\": \"input.select.buffer.home\",\n \"select-buffer-end\": \"input.select.buffer.end\",\n \"delete-line\": \"input.delete.line\",\n \"delete-to-line-end\": \"input.delete.to.line.end\",\n \"delete-to-line-start\": \"input.delete.to.line.start\",\n backspace: \"input.backspace\",\n delete: \"input.delete\",\n newline: \"input.newline\",\n undo: \"input.undo\",\n redo: \"input.redo\",\n \"word-forward\": \"input.word.forward\",\n \"word-backward\": \"input.word.backward\",\n \"select-word-forward\": \"input.select.word.forward\",\n \"select-word-backward\": \"input.select.word.backward\",\n \"delete-word-forward\": \"input.delete.word.forward\",\n \"delete-word-backward\": \"input.delete.word.backward\",\n \"select-all\": \"input.select.all\",\n submit: \"input.submit\",\n} as const satisfies Record<EditBufferCommandName, string>\n\nconst editBufferCommandDescriptions = {\n \"move-left\": \"Cursor left\",\n \"move-right\": \"Cursor right\",\n \"move-up\": \"Cursor up\",\n \"move-down\": \"Cursor down\",\n \"select-left\": \"Select left\",\n \"select-right\": \"Select right\",\n \"select-up\": \"Select up\",\n \"select-down\": \"Select down\",\n \"line-home\": \"Line start\",\n \"line-end\": \"Line end\",\n \"select-line-home\": \"Select to line start\",\n \"select-line-end\": \"Select to line end\",\n \"visual-line-home\": \"Visual line start\",\n \"visual-line-end\": \"Visual line end\",\n \"select-visual-line-home\": \"Select to visual line start\",\n \"select-visual-line-end\": \"Select to visual line end\",\n \"buffer-home\": \"Buffer start\",\n \"buffer-end\": \"Buffer end\",\n \"select-buffer-home\": \"Select to buffer start\",\n \"select-buffer-end\": \"Select to buffer end\",\n \"delete-line\": \"Delete line\",\n \"delete-to-line-end\": \"Delete to line end\",\n \"delete-to-line-start\": \"Delete to line start\",\n backspace: \"Delete backward\",\n delete: \"Delete forward\",\n newline: \"New line\",\n undo: \"Undo\",\n redo: \"Redo\",\n \"word-forward\": \"Next word\",\n \"word-backward\": \"Previous word\",\n \"select-word-forward\": \"Select next word\",\n \"select-word-backward\": \"Select previous word\",\n \"delete-word-forward\": \"Delete next word\",\n \"delete-word-backward\": \"Delete previous word\",\n \"select-all\": \"Select all\",\n submit: \"Submit\",\n} as const satisfies Record<EditBufferCommandName, string>\n\nconst editBufferFineGroups = {\n \"move-left\": \"Cursor\",\n \"move-right\": \"Cursor\",\n \"move-up\": \"Cursor\",\n \"move-down\": \"Cursor\",\n \"select-left\": \"Selection\",\n \"select-right\": \"Selection\",\n \"select-up\": \"Selection\",\n \"select-down\": \"Selection\",\n \"line-home\": \"Cursor\",\n \"line-end\": \"Cursor\",\n \"select-line-home\": \"Selection\",\n \"select-line-end\": \"Selection\",\n \"visual-line-home\": \"Cursor\",\n \"visual-line-end\": \"Cursor\",\n \"select-visual-line-home\": \"Selection\",\n \"select-visual-line-end\": \"Selection\",\n \"buffer-home\": \"Cursor\",\n \"buffer-end\": \"Cursor\",\n \"select-buffer-home\": \"Selection\",\n \"select-buffer-end\": \"Selection\",\n \"delete-line\": \"Delete\",\n \"delete-to-line-end\": \"Delete\",\n \"delete-to-line-start\": \"Delete\",\n backspace: \"Delete\",\n delete: \"Delete\",\n newline: \"Insert\",\n undo: \"History\",\n redo: \"History\",\n \"word-forward\": \"Cursor\",\n \"word-backward\": \"Cursor\",\n \"select-word-forward\": \"Selection\",\n \"select-word-backward\": \"Selection\",\n \"delete-word-forward\": \"Delete\",\n \"delete-word-backward\": \"Delete\",\n \"select-all\": \"Selection\",\n submit: \"Submit\",\n} as const satisfies Record<EditBufferCommandName, EditBufferFineGroup>\n\ninterface EditBufferMetadataOptions {\n category: string\n group: string\n includeFineGroup: boolean\n}\n\nexport interface EditBufferCommandOptions {\n category?: string\n group?: string\n includeFineGroup?: boolean\n commandNames?: Partial<Record<EditBufferCommandName, string>>\n descriptions?: Partial<Record<EditBufferCommandName, string>>\n}\n\nconst EDIT_BUFFER_COMMANDS_RESOURCE = Symbol(\"keymap:edit-buffer-commands\")\nconst TEXTAREA_MAPPING_SUSPENSION_RESOURCE = Symbol(\"keymap:textarea-mapping-suspension\")\n\nexport type ManagedTextareaLayer = Omit<Layer<Renderable, KeyEvent>, \"bindings\" | \"target\" | \"targetMode\"> & {\n bindings?: Bindings<Renderable, KeyEvent>\n target?: never\n targetMode?: never\n}\n\nfunction isManagedTextarea(editor: EditBufferRenderable | null): editor is TextareaRenderable {\n return editor instanceof TextareaRenderable && !(editor instanceof InputRenderable)\n}\n\nfunction resolveEditBufferCommandDescriptions(\n options?: EditBufferCommandOptions,\n): Record<EditBufferCommandName, string> {\n const descriptions: Record<EditBufferCommandName, string> = { ...editBufferCommandDescriptions }\n const overrides = options?.descriptions\n if (!overrides) {\n return descriptions\n }\n\n for (const name of editBufferActions) {\n const override = overrides[name]\n if (override === undefined) {\n continue\n }\n\n const normalized = override.trim()\n if (!normalized) {\n throw new Error(`Edit buffer command description for \"${name}\" cannot be empty`)\n }\n\n descriptions[name] = normalized\n }\n\n return descriptions\n}\n\nfunction normalizeEditBufferMetadataField(fieldName: \"category\" | \"group\", value: string | undefined): string {\n const normalized = (value ?? DEFAULT_EDIT_BUFFER_METADATA_GROUP).trim()\n if (!normalized) {\n throw new Error(`Edit buffer metadata field \"${fieldName}\" cannot be empty`)\n }\n\n return normalized\n}\n\nfunction resolveEditBufferMetadataOptions(options?: EditBufferCommandOptions): EditBufferMetadataOptions {\n return {\n category: normalizeEditBufferMetadataField(\"category\", options?.category),\n group: normalizeEditBufferMetadataField(\"group\", options?.group),\n includeFineGroup: options?.includeFineGroup === true,\n }\n}\n\nfunction resolveEditBufferCommandNames(options?: EditBufferCommandOptions): Record<EditBufferCommandName, string> {\n const commandNames: Record<EditBufferCommandName, string> = { ...editBufferCommandNames }\n const overrides = options?.commandNames\n\n if (overrides) {\n for (const action of editBufferActions) {\n const override = overrides[action]\n if (override === undefined) {\n continue\n }\n\n const normalized = override.trim()\n if (!normalized) {\n throw new Error(`Edit buffer command name for \"${action}\" cannot be empty`)\n }\n\n commandNames[action] = normalized\n }\n }\n\n const seenNames = new Map<string, EditBufferCommandName>()\n\n for (const action of editBufferActions) {\n const commandName = commandNames[action]\n const existingAction = seenNames.get(commandName)\n if (existingAction !== undefined) {\n throw new Error(\n `Edit buffer command name \"${commandName}\" is assigned to both \"${existingAction}\" and \"${action}\"`,\n )\n }\n\n seenNames.set(commandName, action)\n }\n\n return commandNames\n}\n\nfunction setTextareaSuspend(editor: TextareaRenderable, suspended: boolean): void {\n const nextTraits = { ...editor.traits }\n if (suspended) {\n nextTraits.suspend = true\n } else {\n delete nextTraits.suspend\n }\n\n editor.traits = nextTraits\n}\n\nfunction createDefaultTextareaBindings(\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Binding[] {\n return defaultTextareaKeyBindings.map((binding) => {\n const generated: Binding = {\n key: keyBindingToString(binding),\n cmd: commandNames[binding.action],\n desc: descriptions[binding.action],\n group: metadata.group,\n }\n\n if (metadata.includeFineGroup) {\n generated.fineGroup = editBufferFineGroups[binding.action]\n }\n\n return generated\n })\n}\n\n/**\n * Returns the default textarea bindings with any overrides prepended so they\n * take precedence. Prefer `registerManagedTextareaLayer` unless you are\n * composing a custom textarea integration.\n */\nexport function createTextareaBindings(overrides?: readonly Binding[], options?: EditBufferCommandOptions): Binding[] {\n return createTextareaBindingsWithResolvedOptions(\n overrides,\n resolveEditBufferCommandNames(options),\n resolveEditBufferCommandDescriptions(options),\n resolveEditBufferMetadataOptions(options),\n )\n}\n\nfunction createTextareaBindingsWithResolvedOptions(\n overrides: readonly Binding[] | undefined,\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Binding[] {\n const overrideBindings = overrides ?? []\n return [...overrideBindings, ...createDefaultTextareaBindings(commandNames, descriptions, metadata)]\n}\n\nfunction getLiveRenderer(renderer: CliRenderer): CliRenderer {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot use a keymap after its renderer was destroyed\")\n }\n\n return renderer\n}\n\n/**\n * Suspends a focused `TextareaRenderable`'s own key handling so keymap\n * bindings can take over, restoring the previous suspend state on cleanup or\n * focus change. Reference-counted per `Keymap`; prefer\n * `registerManagedTextareaLayer` unless you need this separately.\n */\nexport function registerTextareaMappingSuspension(\n keymap: Keymap<Renderable, KeyEvent>,\n renderer: CliRenderer,\n): () => void {\n return keymap.acquireResource(TEXTAREA_MAPPING_SUSPENSION_RESOURCE, () => {\n const previousSuspendStates = new WeakMap<TextareaRenderable, boolean>()\n let suspendedEditor: TextareaRenderable | null = null\n\n const suspendEditor = (editor: EditBufferRenderable | null): void => {\n if (!isManagedTextarea(editor) || editor.isDestroyed) {\n suspendedEditor = null\n return\n }\n\n if (!previousSuspendStates.has(editor)) {\n previousSuspendStates.set(editor, editor.traits.suspend === true)\n }\n\n setTextareaSuspend(editor, true)\n suspendedEditor = editor\n }\n\n const restoreEditor = (editor: EditBufferRenderable | null): void => {\n if (!isManagedTextarea(editor)) {\n return\n }\n\n const previousSuspend = previousSuspendStates.get(editor)\n if (previousSuspend === undefined) {\n return\n }\n\n previousSuspendStates.delete(editor)\n if (!editor.isDestroyed) {\n setTextareaSuspend(editor, previousSuspend)\n }\n\n if (suspendedEditor === editor) {\n suspendedEditor = null\n }\n }\n\n const onFocusedEditor = (current: EditBufferRenderable | null, previous: EditBufferRenderable | null): void => {\n restoreEditor(previous)\n suspendEditor(current)\n }\n\n const liveRenderer = getLiveRenderer(renderer)\n\n liveRenderer.on(CliRenderEvents.FOCUSED_EDITOR, onFocusedEditor)\n suspendEditor(liveRenderer.currentFocusedEditor)\n\n return () => {\n liveRenderer.off(CliRenderEvents.FOCUSED_EDITOR, onFocusedEditor)\n restoreEditor(suspendedEditor)\n }\n })\n}\n\nfunction withFocusedEditor(renderer: CliRenderer, run: (editor: EditBufferRenderable) => boolean): boolean {\n const editor = getLiveRenderer(renderer).currentFocusedEditor\n if (!editor || editor.isDestroyed) {\n return false\n }\n\n return run(editor)\n}\n\nfunction hasSubmit(editor: EditBufferRenderable): editor is EditBufferRenderable & { submit: () => boolean } {\n return typeof (editor as { submit?: unknown }).submit === \"function\"\n}\n\nconst editBufferCommandHandlers = {\n \"move-left\": (editor: EditBufferRenderable) => editor.moveCursorLeft(),\n \"move-right\": (editor: EditBufferRenderable) => editor.moveCursorRight(),\n \"move-up\": (editor: EditBufferRenderable) => editor.moveCursorUp(),\n \"move-down\": (editor: EditBufferRenderable) => editor.moveCursorDown(),\n \"select-left\": (editor: EditBufferRenderable) => editor.moveCursorLeft({ select: true }),\n \"select-right\": (editor: EditBufferRenderable) => editor.moveCursorRight({ select: true }),\n \"select-up\": (editor: EditBufferRenderable) => editor.moveCursorUp({ select: true }),\n \"select-down\": (editor: EditBufferRenderable) => editor.moveCursorDown({ select: true }),\n \"line-home\": (editor: EditBufferRenderable) => editor.gotoLineHome(),\n \"line-end\": (editor: EditBufferRenderable) => editor.gotoLineEnd(),\n \"select-line-home\": (editor: EditBufferRenderable) => editor.gotoLineHome({ select: true }),\n \"select-line-end\": (editor: EditBufferRenderable) => editor.gotoLineEnd({ select: true }),\n \"visual-line-home\": (editor: EditBufferRenderable) => editor.gotoVisualLineHome(),\n \"visual-line-end\": (editor: EditBufferRenderable) => editor.gotoVisualLineEnd(),\n \"select-visual-line-home\": (editor: EditBufferRenderable) => editor.gotoVisualLineHome({ select: true }),\n \"select-visual-line-end\": (editor: EditBufferRenderable) => editor.gotoVisualLineEnd({ select: true }),\n \"buffer-home\": (editor: EditBufferRenderable) => editor.gotoBufferHome(),\n \"buffer-end\": (editor: EditBufferRenderable) => editor.gotoBufferEnd(),\n \"select-buffer-home\": (editor: EditBufferRenderable) => editor.gotoBufferHome({ select: true }),\n \"select-buffer-end\": (editor: EditBufferRenderable) => editor.gotoBufferEnd({ select: true }),\n \"delete-line\": (editor: EditBufferRenderable) => editor.deleteLine(),\n \"delete-to-line-end\": (editor: EditBufferRenderable) => editor.deleteToLineEnd(),\n \"delete-to-line-start\": (editor: EditBufferRenderable) => editor.deleteToLineStart(),\n backspace: (editor: EditBufferRenderable) => editor.deleteCharBackward(),\n delete: (editor: EditBufferRenderable) => editor.deleteChar(),\n newline: (editor: EditBufferRenderable) => editor.newLine(),\n undo: (editor: EditBufferRenderable) => editor.undo(),\n redo: (editor: EditBufferRenderable) => editor.redo(),\n \"word-forward\": (editor: EditBufferRenderable) => editor.moveWordForward(),\n \"word-backward\": (editor: EditBufferRenderable) => editor.moveWordBackward(),\n \"select-word-forward\": (editor: EditBufferRenderable) => editor.moveWordForward({ select: true }),\n \"select-word-backward\": (editor: EditBufferRenderable) => editor.moveWordBackward({ select: true }),\n \"delete-word-forward\": (editor: EditBufferRenderable) => editor.deleteWordForward(),\n \"delete-word-backward\": (editor: EditBufferRenderable) => editor.deleteWordBackward(),\n \"select-all\": (editor: EditBufferRenderable) => editor.selectAll(),\n submit: (editor: EditBufferRenderable) => {\n if (!hasSubmit(editor)) {\n return false\n }\n\n return editor.submit()\n },\n} as const satisfies Record<EditBufferCommandName, (editor: EditBufferRenderable) => boolean>\n\nfunction createEditBufferCommand(\n renderer: CliRenderer,\n action: EditBufferCommandName,\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n run: (editor: EditBufferRenderable) => boolean,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Command<Renderable, KeyEvent> {\n return {\n name: commandNames[action],\n desc: descriptions[action],\n category: metadata.category,\n run() {\n return withFocusedEditor(renderer, run)\n },\n }\n}\n\nfunction createEditBufferCommands(\n renderer: CliRenderer,\n commandNames: Readonly<Record<EditBufferCommandName, string>>,\n descriptions: Readonly<Record<EditBufferCommandName, string>>,\n metadata: Readonly<EditBufferMetadataOptions>,\n): Command<Renderable, KeyEvent>[] {\n return editBufferActions.map((action) =>\n createEditBufferCommand(renderer, action, commandNames, editBufferCommandHandlers[action], descriptions, metadata),\n )\n}\n\n/**\n * Registers the standard edit-buffer commands against\n * `renderer.currentFocusedEditor`. Reference-counted per `Keymap`; prefer\n * `registerManagedTextareaLayer` unless you need the commands without the\n * default bindings or textarea suspension.\n */\nexport function registerEditBufferCommands(\n keymap: Keymap<Renderable, KeyEvent>,\n renderer: CliRenderer,\n options?: EditBufferCommandOptions,\n): () => void {\n const commandNames = resolveEditBufferCommandNames(options)\n const descriptions = resolveEditBufferCommandDescriptions(options)\n const metadata = resolveEditBufferMetadataOptions(options)\n\n return keymap.acquireResource(EDIT_BUFFER_COMMANDS_RESOURCE, () => {\n return keymap.registerLayer({\n commands: createEditBufferCommands(renderer, commandNames, descriptions, metadata),\n })\n })\n}\n\n/**\n * High-level global textarea integration: registers the edit-buffer commands,\n * suspends the textarea's built-in key handling while focused, and installs\n * the layer with default bindings plus overrides. Safe to combine with the\n * lower-level helpers because they are reference-counted.\n */\nexport function registerManagedTextareaLayer(\n keymap: Keymap<Renderable, KeyEvent>,\n renderer: CliRenderer,\n layer: ManagedTextareaLayer,\n options?: EditBufferCommandOptions,\n): () => void {\n const commandNames = resolveEditBufferCommandNames(options)\n const descriptions = resolveEditBufferCommandDescriptions(options)\n const metadata = resolveEditBufferMetadataOptions(options)\n const offCommands = registerEditBufferCommands(keymap, renderer, options)\n const offSuspension = registerTextareaMappingSuspension(keymap, renderer)\n\n try {\n const { bindings, target: _ignoredTarget, targetMode: _ignoredTargetMode, ...rest } = layer\n const offLayer = keymap.registerLayer({\n ...rest,\n bindings: createTextareaBindingsWithResolvedOptions(bindings, commandNames, descriptions, metadata),\n })\n\n return () => {\n offLayer()\n offSuspension()\n offCommands()\n }\n } catch (error) {\n offSuspension()\n offCommands()\n throw error\n }\n}\n"
8
+ ],
9
+ "mappings": "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",
10
+ "debugId": "41E23EFAAC69B76764756E2164756E21",
11
+ "names": []
12
+ }
@@ -0,0 +1,6 @@
1
+ import type { Keymap, KeymapEvent } from "../../index.js";
2
+ /**
3
+ * Adds a `bindingOverrides` layer field that replaces bindings by string
4
+ * command name within that layer before compilation.
5
+ */
6
+ export declare function registerBindingOverrides<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -1,4 +1,4 @@
1
- import type { Keymap, KeymapEvent } from "../../index.js";
1
+ import type { Keymap, KeymapEvent } from "@opentui/keymap";
2
2
  /**
3
3
  * Warns about bindings that can never trigger because they have no command and
4
4
  * no reachable continuation.
@@ -2,8 +2,8 @@ import type { BindingParser, EventMatchResolver, Keymap, KeymapEvent } from "../
2
2
  export declare const defaultBindingParser: BindingParser;
3
3
  export declare const defaultEventMatchResolver: EventMatchResolver<KeymapEvent>;
4
4
  /**
5
- * Parses the built-in string binding syntax, including modifiers and
6
- * `<token>` segments.
5
+ * Parses the built-in string binding syntax, including modifiers,
6
+ * `<token>` aliases, and `{pattern}` dynamic sequence segments.
7
7
  */
8
8
  export declare function registerDefaultBindingParser<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
9
9
  /**
@@ -1,16 +1,19 @@
1
- import type { CommandContext, Keymap, KeymapEvent } from "../../index.js";
1
+ import type { CommandContext, CommandResult, Keymap, KeymapEvent } from "../../index.js";
2
+ export interface ExCommandPayload {
3
+ raw: string;
4
+ args: readonly string[];
5
+ payload?: unknown;
6
+ }
2
7
  export interface ExCommand<TTarget extends object = object, TEvent extends KeymapEvent = KeymapEvent> {
3
8
  name: string;
4
9
  aliases?: string[];
5
10
  nargs?: "0" | "1" | "?" | "*" | "+";
6
- run: (ctx: CommandContext<TTarget, TEvent> & {
7
- raw: string;
8
- args: string[];
9
- }) => void | Promise<void>;
11
+ run: (ctx: CommandContext<TTarget, TEvent, ExCommandPayload>) => CommandResult<TTarget, TEvent>;
10
12
  [key: string]: unknown;
11
13
  }
12
14
  /**
13
- * Resolves `:name ...args` strings against the provided Ex commands and
14
- * validated argument lists.
15
+ * Installs Ex command support. Ex commands are registered through normal
16
+ * keymap layers by using a colon-prefixed command name or
17
+ * `namespace: "excommands"`.
15
18
  */
16
- export declare function registerExCommands<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, commands: ExCommand<TTarget, TEvent>[]): () => void;
19
+ export declare function registerExCommands<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;
@@ -1,4 +1,5 @@
1
1
  export { defaultBindingParser, defaultEventMatchResolver, registerDefaultBindingParser, registerDefaultEventMatchResolver, registerDefaultKeys, } from "./default-parser.js";
2
+ export { registerBindingOverrides } from "./binding-overrides.js";
2
3
  export { registerAliasesField } from "./aliases.js";
3
4
  export { registerBackspacePopsPendingSequence } from "./backspace-pops-pending-sequence.js";
4
5
  export { registerCommaBindings } from "./comma-bindings.js";
@@ -9,6 +10,7 @@ export { registerEmacsBindings } from "./emacs-bindings.js";
9
10
  export { registerExCommands } from "./ex-commands.js";
10
11
  export { registerLeader } from "./leader.js";
11
12
  export { registerMetadataFields } from "./metadata.js";
13
+ export { registerModBindings } from "./mod-bindings.js";
12
14
  export { registerNeovimDisambiguation } from "./neovim-disambiguation.js";
13
15
  export { registerTimedLeader } from "./timed-leader.js";
14
16
  export { registerUnresolvedCommandWarnings } from "./unresolved-commands.js";
@@ -16,7 +18,7 @@ export type { Aliases } from "./aliases.js";
16
18
  export type { BackspacePopsPendingSequenceOptions } from "./backspace-pops-pending-sequence.js";
17
19
  export type { EscapeClearsPendingSequenceOptions } from "./escape-clears-pending-sequence.js";
18
20
  export type { Enabled } from "./enabled.js";
19
- export type { ExCommand } from "./ex-commands.js";
21
+ export type { ExCommand, ExCommandPayload } from "./ex-commands.js";
20
22
  export type { LeaderOptions } from "./leader.js";
21
23
  export type { NeovimDisambiguationOptions } from "./neovim-disambiguation.js";
22
24
  export type { TimedLeaderOptions } from "./timed-leader.js";
@@ -4,6 +4,6 @@ export interface LeaderOptions {
4
4
  name?: string;
5
5
  }
6
6
  /**
7
- * Defines a token such as `<leader>` that expands to a chosen trigger key.
7
+ * Defines a token such as `leader` that the default parser can reference as `<leader>`.
8
8
  */
9
9
  export declare function registerLeader<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>, options: LeaderOptions): () => void;
@@ -3,7 +3,7 @@ import type { Keymap, KeymapEvent } from "../../index.js";
3
3
  * Maps `desc`, `group`, `title`, and `category` fields into binding and
4
4
  * command attrs.
5
5
  *
6
- * Layer fields intentionally do not compile into attrs in the current model,
7
- * so this addon only registers binding and command field compilers.
6
+ * This addon only registers binding and command field compilers. Apps can
7
+ * register layer metadata fields directly with `registerLayerFields`.
8
8
  */
9
9
  export declare function registerMetadataFields<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
+ * Adds a platform-aware `mod+...` modifier alias. `mod` resolves to the host's
4
+ * primary modifier, with `ctrl` as the fallback when the host is unknown.
5
+ */
6
+ export declare function registerModBindings<TTarget extends object, TEvent extends KeymapEvent>(keymap: Keymap<TTarget, TEvent>): () => void;