@opentui/core 0.1.29 → 0.1.30
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/3d.js +1 -1
- package/edit-buffer.d.ts +4 -0
- package/editor-view.d.ts +3 -0
- package/{index-bztetjc3.js → index-0qmm1k4p.js} +80 -20
- package/{index-bztetjc3.js.map → index-0qmm1k4p.js.map} +4 -4
- package/index.js +284 -113
- package/index.js.map +8 -7
- package/lib/keymapping.d.ts +10 -0
- package/package.json +7 -7
- package/renderables/EditBufferRenderable.d.ts +8 -1
- package/renderables/Textarea.d.ts +43 -22
- package/testing/mock-keys.d.ts +29 -2
- package/testing.js +41 -4
- package/testing.js.map +3 -3
- package/zig-structs.d.ts +2 -0
- package/zig.d.ts +19 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface KeyBinding<Action extends string = string> {
|
|
2
|
+
name: string;
|
|
3
|
+
ctrl?: boolean;
|
|
4
|
+
shift?: boolean;
|
|
5
|
+
meta?: boolean;
|
|
6
|
+
action: Action;
|
|
7
|
+
}
|
|
8
|
+
export declare function mergeKeyBindings<Action extends string>(defaults: KeyBinding<Action>[], custom: KeyBinding<Action>[]): KeyBinding<Action>[];
|
|
9
|
+
export declare function getKeyBindingKey<Action extends string>(binding: KeyBinding<Action>): string;
|
|
10
|
+
export declare function buildKeyBindingsMap<Action extends string>(bindings: KeyBinding<Action>[]): Map<string, Action>;
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"version": "0.1.
|
|
7
|
+
"version": "0.1.30",
|
|
8
8
|
"description": "OpenTUI is a TypeScript library for building terminal user interfaces (TUIs)",
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"repository": {
|
|
@@ -55,11 +55,11 @@
|
|
|
55
55
|
"bun-webgpu": "0.1.3",
|
|
56
56
|
"planck": "^1.4.2",
|
|
57
57
|
"three": "0.177.0",
|
|
58
|
-
"@opentui/core-darwin-x64": "0.1.
|
|
59
|
-
"@opentui/core-darwin-arm64": "0.1.
|
|
60
|
-
"@opentui/core-linux-x64": "0.1.
|
|
61
|
-
"@opentui/core-linux-arm64": "0.1.
|
|
62
|
-
"@opentui/core-win32-x64": "0.1.
|
|
63
|
-
"@opentui/core-win32-arm64": "0.1.
|
|
58
|
+
"@opentui/core-darwin-x64": "0.1.30",
|
|
59
|
+
"@opentui/core-darwin-arm64": "0.1.30",
|
|
60
|
+
"@opentui/core-linux-x64": "0.1.30",
|
|
61
|
+
"@opentui/core-linux-arm64": "0.1.30",
|
|
62
|
+
"@opentui/core-win32-x64": "0.1.30",
|
|
63
|
+
"@opentui/core-win32-arm64": "0.1.30"
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -3,7 +3,7 @@ import { Selection, type LocalSelectionBounds } from "../lib/selection";
|
|
|
3
3
|
import { EditBuffer, type CursorPosition } from "../edit-buffer";
|
|
4
4
|
import { EditorView, type VisualCursor } from "../editor-view";
|
|
5
5
|
import { RGBA } from "../lib/RGBA";
|
|
6
|
-
import { type RenderContext } from "../types";
|
|
6
|
+
import { type RenderContext, type Highlight } from "../types";
|
|
7
7
|
import type { OptimizedBuffer } from "../buffer";
|
|
8
8
|
import type { SyntaxStyle } from "../syntax-style";
|
|
9
9
|
export interface CursorChangeEvent {
|
|
@@ -61,6 +61,7 @@ export declare abstract class EditBufferRenderable extends Renderable {
|
|
|
61
61
|
get plainText(): string;
|
|
62
62
|
get cursor(): CursorPosition;
|
|
63
63
|
get visualCursor(): VisualCursor;
|
|
64
|
+
get cursorOffset(): number;
|
|
64
65
|
set cursorOffset(offset: number);
|
|
65
66
|
get textColor(): RGBA;
|
|
66
67
|
set textColor(value: RGBA | string | undefined);
|
|
@@ -103,4 +104,10 @@ export declare abstract class EditBufferRenderable extends Renderable {
|
|
|
103
104
|
get onContentChange(): ((event: ContentChangeEvent) => void) | undefined;
|
|
104
105
|
get syntaxStyle(): SyntaxStyle | null;
|
|
105
106
|
set syntaxStyle(style: SyntaxStyle | null);
|
|
107
|
+
addHighlight(lineIdx: number, highlight: Highlight): void;
|
|
108
|
+
addHighlightByCharRange(highlight: Highlight): void;
|
|
109
|
+
removeHighlightsByRef(hlRef: number): void;
|
|
110
|
+
clearLineHighlights(lineIdx: number): void;
|
|
111
|
+
clearAllHighlights(): void;
|
|
112
|
+
getLineHighlights(lineIdx: number): Array<Highlight>;
|
|
106
113
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { type RenderContext
|
|
1
|
+
import { type RenderContext } from "../types";
|
|
2
2
|
import { EditBufferRenderable, type EditBufferOptions } from "./EditBufferRenderable";
|
|
3
3
|
import type { KeyEvent } from "../lib/KeyHandler";
|
|
4
4
|
import { RGBA, type ColorInput } from "../lib/RGBA";
|
|
5
|
+
import { type KeyBinding as BaseKeyBinding } from "../lib/keymapping";
|
|
6
|
+
export type TextareaAction = "move-left" | "move-right" | "move-up" | "move-down" | "select-left" | "select-right" | "select-up" | "select-down" | "line-home" | "line-end" | "select-line-home" | "select-line-end" | "buffer-home" | "buffer-end" | "delete-line" | "delete-to-line-end" | "backspace" | "delete" | "newline" | "undo" | "redo" | "word-forward" | "word-backward" | "select-word-forward" | "select-word-backward" | "delete-word-forward" | "delete-word-backward";
|
|
7
|
+
export type KeyBinding = BaseKeyBinding<TextareaAction>;
|
|
5
8
|
export interface TextareaOptions extends EditBufferOptions {
|
|
6
9
|
value?: string;
|
|
7
10
|
backgroundColor?: ColorInput;
|
|
@@ -10,6 +13,7 @@ export interface TextareaOptions extends EditBufferOptions {
|
|
|
10
13
|
focusedTextColor?: ColorInput;
|
|
11
14
|
placeholder?: string | null;
|
|
12
15
|
placeholderColor?: ColorInput;
|
|
16
|
+
keyBindings?: KeyBinding[];
|
|
13
17
|
}
|
|
14
18
|
export declare class TextareaRenderable extends EditBufferRenderable {
|
|
15
19
|
private _placeholder;
|
|
@@ -18,8 +22,11 @@ export declare class TextareaRenderable extends EditBufferRenderable {
|
|
|
18
22
|
private _focusedBackgroundColor;
|
|
19
23
|
private _focusedTextColor;
|
|
20
24
|
private _placeholderColor;
|
|
25
|
+
private _keyBindingsMap;
|
|
26
|
+
private _actionHandlers;
|
|
21
27
|
private static readonly defaults;
|
|
22
28
|
constructor(ctx: RenderContext, options: TextareaOptions);
|
|
29
|
+
private buildActionHandlers;
|
|
23
30
|
handlePaste(text: string): void;
|
|
24
31
|
handleKeyPress(key: KeyEvent | string): boolean;
|
|
25
32
|
get value(): string;
|
|
@@ -28,21 +35,43 @@ export declare class TextareaRenderable extends EditBufferRenderable {
|
|
|
28
35
|
private updateColors;
|
|
29
36
|
insertChar(char: string): void;
|
|
30
37
|
insertText(text: string): void;
|
|
31
|
-
deleteChar():
|
|
32
|
-
deleteCharBackward():
|
|
38
|
+
deleteChar(): boolean;
|
|
39
|
+
deleteCharBackward(): boolean;
|
|
33
40
|
private deleteSelectedText;
|
|
34
|
-
newLine():
|
|
35
|
-
deleteLine():
|
|
36
|
-
moveCursorLeft(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
newLine(): boolean;
|
|
42
|
+
deleteLine(): boolean;
|
|
43
|
+
moveCursorLeft(options?: {
|
|
44
|
+
select?: boolean;
|
|
45
|
+
}): boolean;
|
|
46
|
+
moveCursorRight(options?: {
|
|
47
|
+
select?: boolean;
|
|
48
|
+
}): boolean;
|
|
49
|
+
moveCursorUp(options?: {
|
|
50
|
+
select?: boolean;
|
|
51
|
+
}): boolean;
|
|
52
|
+
moveCursorDown(options?: {
|
|
53
|
+
select?: boolean;
|
|
54
|
+
}): boolean;
|
|
40
55
|
gotoLine(line: number): void;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
56
|
+
gotoLineHome(options?: {
|
|
57
|
+
select?: boolean;
|
|
58
|
+
}): boolean;
|
|
59
|
+
gotoLineEnd(options?: {
|
|
60
|
+
select?: boolean;
|
|
61
|
+
}): boolean;
|
|
62
|
+
gotoBufferHome(): boolean;
|
|
63
|
+
gotoBufferEnd(): boolean;
|
|
64
|
+
deleteToLineEnd(): boolean;
|
|
65
|
+
undo(): boolean;
|
|
66
|
+
redo(): boolean;
|
|
67
|
+
moveWordForward(options?: {
|
|
68
|
+
select?: boolean;
|
|
69
|
+
}): boolean;
|
|
70
|
+
moveWordBackward(options?: {
|
|
71
|
+
select?: boolean;
|
|
72
|
+
}): boolean;
|
|
73
|
+
deleteWordForward(): boolean;
|
|
74
|
+
deleteWordBackward(): boolean;
|
|
46
75
|
private handleShiftSelection;
|
|
47
76
|
focus(): void;
|
|
48
77
|
blur(): void;
|
|
@@ -55,12 +84,4 @@ export declare class TextareaRenderable extends EditBufferRenderable {
|
|
|
55
84
|
set focusedBackgroundColor(value: ColorInput);
|
|
56
85
|
set focusedTextColor(value: ColorInput);
|
|
57
86
|
set placeholderColor(value: ColorInput);
|
|
58
|
-
get cursorOffset(): number;
|
|
59
|
-
set cursorOffset(offset: number);
|
|
60
|
-
addHighlight(lineIdx: number, highlight: Highlight): void;
|
|
61
|
-
addHighlightByCharRange(highlight: Highlight): void;
|
|
62
|
-
removeHighlightsByRef(hlRef: number): void;
|
|
63
|
-
clearLineHighlights(lineIdx: number): void;
|
|
64
|
-
clearAllHighlights(): void;
|
|
65
|
-
getLineHighlights(lineIdx: number): Array<Highlight>;
|
|
66
87
|
}
|
package/testing/mock-keys.d.ts
CHANGED
|
@@ -52,6 +52,33 @@ export declare const KeyCodes: {
|
|
|
52
52
|
readonly ALT_A: "\u001Ba";
|
|
53
53
|
readonly ALT_B: "\u001Bb";
|
|
54
54
|
readonly ALT_C: "\u001Bc";
|
|
55
|
+
readonly ALT_D: "\u001Bd";
|
|
56
|
+
readonly ALT_E: "\u001Be";
|
|
57
|
+
readonly ALT_F: "\u001Bf";
|
|
58
|
+
readonly ALT_G: "\u001Bg";
|
|
59
|
+
readonly ALT_H: "\u001Bh";
|
|
60
|
+
readonly ALT_I: "\u001Bi";
|
|
61
|
+
readonly ALT_J: "\u001Bj";
|
|
62
|
+
readonly ALT_K: "\u001Bk";
|
|
63
|
+
readonly ALT_L: "\u001Bl";
|
|
64
|
+
readonly ALT_M: "\u001Bm";
|
|
65
|
+
readonly ALT_N: "\u001Bn";
|
|
66
|
+
readonly ALT_O: "\u001Bo";
|
|
67
|
+
readonly ALT_P: "\u001Bp";
|
|
68
|
+
readonly ALT_Q: "\u001Bq";
|
|
69
|
+
readonly ALT_R: "\u001Br";
|
|
70
|
+
readonly ALT_S: "\u001Bs";
|
|
71
|
+
readonly ALT_T: "\u001Bt";
|
|
72
|
+
readonly ALT_U: "\u001Bu";
|
|
73
|
+
readonly ALT_V: "\u001Bv";
|
|
74
|
+
readonly ALT_W: "\u001Bw";
|
|
75
|
+
readonly ALT_X: "\u001Bx";
|
|
76
|
+
readonly ALT_Y: "\u001By";
|
|
77
|
+
readonly ALT_Z: "\u001Bz";
|
|
78
|
+
readonly ALT_LEFT: "\u001B\u001B[D";
|
|
79
|
+
readonly ALT_RIGHT: "\u001B\u001B[C";
|
|
80
|
+
readonly ALT_UP: "\u001B\u001B[A";
|
|
81
|
+
readonly ALT_DOWN: "\u001B\u001B[B";
|
|
55
82
|
};
|
|
56
83
|
export type KeyInput = string | keyof typeof KeyCodes;
|
|
57
84
|
export declare function createMockKeys(renderer: CliRenderer): {
|
|
@@ -59,7 +86,7 @@ export declare function createMockKeys(renderer: CliRenderer): {
|
|
|
59
86
|
pressKey: (key: KeyInput, modifiers?: {
|
|
60
87
|
shift?: boolean;
|
|
61
88
|
ctrl?: boolean;
|
|
62
|
-
|
|
89
|
+
meta?: boolean;
|
|
63
90
|
}) => void;
|
|
64
91
|
typeText: (text: string, delayMs?: number) => Promise<void>;
|
|
65
92
|
pressEnter: () => void;
|
|
@@ -69,7 +96,7 @@ export declare function createMockKeys(renderer: CliRenderer): {
|
|
|
69
96
|
pressArrow: (direction: "up" | "down" | "left" | "right", modifiers?: {
|
|
70
97
|
shift?: boolean;
|
|
71
98
|
ctrl?: boolean;
|
|
72
|
-
|
|
99
|
+
meta?: boolean;
|
|
73
100
|
}) => void;
|
|
74
101
|
pressCtrlC: () => void;
|
|
75
102
|
pasteBracketedText: (text: string) => Promise<void>;
|
package/testing.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
ANSI,
|
|
4
4
|
CliRenderer,
|
|
5
5
|
resolveRenderLib
|
|
6
|
-
} from "./index-
|
|
6
|
+
} from "./index-0qmm1k4p.js";
|
|
7
7
|
|
|
8
8
|
// src/testing/mock-keys.ts
|
|
9
9
|
var KeyCodes = {
|
|
@@ -59,7 +59,34 @@ var KeyCodes = {
|
|
|
59
59
|
CTRL_Z: "\x1A",
|
|
60
60
|
ALT_A: "\x1Ba",
|
|
61
61
|
ALT_B: "\x1Bb",
|
|
62
|
-
ALT_C: "\x1Bc"
|
|
62
|
+
ALT_C: "\x1Bc",
|
|
63
|
+
ALT_D: "\x1Bd",
|
|
64
|
+
ALT_E: "\x1Be",
|
|
65
|
+
ALT_F: "\x1Bf",
|
|
66
|
+
ALT_G: "\x1Bg",
|
|
67
|
+
ALT_H: "\x1Bh",
|
|
68
|
+
ALT_I: "\x1Bi",
|
|
69
|
+
ALT_J: "\x1Bj",
|
|
70
|
+
ALT_K: "\x1Bk",
|
|
71
|
+
ALT_L: "\x1Bl",
|
|
72
|
+
ALT_M: "\x1Bm",
|
|
73
|
+
ALT_N: "\x1Bn",
|
|
74
|
+
ALT_O: "\x1Bo",
|
|
75
|
+
ALT_P: "\x1Bp",
|
|
76
|
+
ALT_Q: "\x1Bq",
|
|
77
|
+
ALT_R: "\x1Br",
|
|
78
|
+
ALT_S: "\x1Bs",
|
|
79
|
+
ALT_T: "\x1Bt",
|
|
80
|
+
ALT_U: "\x1Bu",
|
|
81
|
+
ALT_V: "\x1Bv",
|
|
82
|
+
ALT_W: "\x1Bw",
|
|
83
|
+
ALT_X: "\x1Bx",
|
|
84
|
+
ALT_Y: "\x1By",
|
|
85
|
+
ALT_Z: "\x1Bz",
|
|
86
|
+
ALT_LEFT: "\x1B\x1B[D",
|
|
87
|
+
ALT_RIGHT: "\x1B\x1B[C",
|
|
88
|
+
ALT_UP: "\x1B\x1B[A",
|
|
89
|
+
ALT_DOWN: "\x1B\x1B[B"
|
|
63
90
|
};
|
|
64
91
|
function createMockKeys(renderer) {
|
|
65
92
|
const pressKeys = async (keys, delayMs = 0) => {
|
|
@@ -99,11 +126,21 @@ function createMockKeys(renderer) {
|
|
|
99
126
|
}
|
|
100
127
|
if (modifiers) {
|
|
101
128
|
if (keyCode.startsWith("\x1B[") && keyCode.length > 2) {
|
|
102
|
-
const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.
|
|
129
|
+
const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.meta ? 2 : 0) + (modifiers.ctrl ? 4 : 0);
|
|
103
130
|
if (modifier > 1) {
|
|
104
131
|
const ending = keyCode.slice(-1);
|
|
105
132
|
keyCode = `\x1B[1;${modifier}${ending}`;
|
|
106
133
|
}
|
|
134
|
+
} else if (keyCode.length === 1 && !modifiers.ctrl) {
|
|
135
|
+
let char = keyCode;
|
|
136
|
+
if (modifiers.shift && char >= "a" && char <= "z") {
|
|
137
|
+
char = char.toUpperCase();
|
|
138
|
+
}
|
|
139
|
+
if (modifiers.meta) {
|
|
140
|
+
keyCode = `\x1B${char}`;
|
|
141
|
+
} else {
|
|
142
|
+
keyCode = char;
|
|
143
|
+
}
|
|
107
144
|
}
|
|
108
145
|
}
|
|
109
146
|
renderer.stdin.emit("data", Buffer.from(keyCode));
|
|
@@ -373,5 +410,5 @@ export {
|
|
|
373
410
|
KeyCodes
|
|
374
411
|
};
|
|
375
412
|
|
|
376
|
-
//# debugId=
|
|
413
|
+
//# debugId=4F737E7B09ACF94364756E2164756E21
|
|
377
414
|
//# sourceMappingURL=testing.js.map
|
package/testing.js.map
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/testing/mock-keys.ts", "../src/testing/mock-mouse.ts", "../src/testing/test-renderer.ts", "../src/testing/spy.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { CliRenderer } from \"../renderer\"\nimport { ANSI } from \"../ansi\"\n\nexport const KeyCodes = {\n // Control keys\n ENTER: \"\\r\",\n TAB: \"\\t\",\n BACKSPACE: \"\\b\",\n // NOTE: This may depend on the platform and terminals\n DELETE: \"\\x1b[3~\",\n HOME: \"\\x1b[H\",\n END: \"\\x1b[F\",\n ESCAPE: \"\\x1b\",\n\n // Arrow keys\n ARROW_UP: \"\\x1b[A\",\n ARROW_DOWN: \"\\x1b[B\",\n ARROW_RIGHT: \"\\x1b[C\",\n ARROW_LEFT: \"\\x1b[D\",\n\n // Function keys\n F1: \"\\x1bOP\",\n F2: \"\\x1bOQ\",\n F3: \"\\x1bOR\",\n F4: \"\\x1bOS\",\n F5: \"\\x1b[15~\",\n F6: \"\\x1b[17~\",\n F7: \"\\x1b[18~\",\n F8: \"\\x1b[19~\",\n F9: \"\\x1b[20~\",\n F10: \"\\x1b[21~\",\n F11: \"\\x1b[23~\",\n F12: \"\\x1b[24~\",\n\n // Control combinations\n CTRL_A: \"\\x01\",\n CTRL_B: \"\\x02\",\n CTRL_C: \"\\x03\",\n CTRL_D: \"\\x04\",\n CTRL_E: \"\\x05\",\n CTRL_F: \"\\x06\",\n CTRL_G: \"\\x07\",\n CTRL_H: \"\\x08\",\n CTRL_I: \"\\t\",\n CTRL_J: \"\\n\",\n CTRL_K: \"\\x0b\",\n CTRL_L: \"\\x0c\",\n CTRL_M: \"\\r\",\n CTRL_N: \"\\x0e\",\n CTRL_O: \"\\x0f\",\n CTRL_P: \"\\x10\",\n CTRL_Q: \"\\x11\",\n CTRL_R: \"\\x12\",\n CTRL_S: \"\\x13\",\n CTRL_T: \"\\x14\",\n CTRL_U: \"\\x15\",\n CTRL_V: \"\\x16\",\n CTRL_W: \"\\x17\",\n CTRL_X: \"\\x18\",\n CTRL_Y: \"\\x19\",\n CTRL_Z: \"\\x1a\",\n\n // Alt combinations\n ALT_A: \"\\x1ba\",\n ALT_B: \"\\x1bb\",\n ALT_C: \"\\x1bc\",\n
|
|
5
|
+
"import type { CliRenderer } from \"../renderer\"\nimport { ANSI } from \"../ansi\"\n\nexport const KeyCodes = {\n // Control keys\n ENTER: \"\\r\",\n TAB: \"\\t\",\n BACKSPACE: \"\\b\",\n // NOTE: This may depend on the platform and terminals\n DELETE: \"\\x1b[3~\",\n HOME: \"\\x1b[H\",\n END: \"\\x1b[F\",\n ESCAPE: \"\\x1b\",\n\n // Arrow keys\n ARROW_UP: \"\\x1b[A\",\n ARROW_DOWN: \"\\x1b[B\",\n ARROW_RIGHT: \"\\x1b[C\",\n ARROW_LEFT: \"\\x1b[D\",\n\n // Function keys\n F1: \"\\x1bOP\",\n F2: \"\\x1bOQ\",\n F3: \"\\x1bOR\",\n F4: \"\\x1bOS\",\n F5: \"\\x1b[15~\",\n F6: \"\\x1b[17~\",\n F7: \"\\x1b[18~\",\n F8: \"\\x1b[19~\",\n F9: \"\\x1b[20~\",\n F10: \"\\x1b[21~\",\n F11: \"\\x1b[23~\",\n F12: \"\\x1b[24~\",\n\n // Control combinations\n CTRL_A: \"\\x01\",\n CTRL_B: \"\\x02\",\n CTRL_C: \"\\x03\",\n CTRL_D: \"\\x04\",\n CTRL_E: \"\\x05\",\n CTRL_F: \"\\x06\",\n CTRL_G: \"\\x07\",\n CTRL_H: \"\\x08\",\n CTRL_I: \"\\t\",\n CTRL_J: \"\\n\",\n CTRL_K: \"\\x0b\",\n CTRL_L: \"\\x0c\",\n CTRL_M: \"\\r\",\n CTRL_N: \"\\x0e\",\n CTRL_O: \"\\x0f\",\n CTRL_P: \"\\x10\",\n CTRL_Q: \"\\x11\",\n CTRL_R: \"\\x12\",\n CTRL_S: \"\\x13\",\n CTRL_T: \"\\x14\",\n CTRL_U: \"\\x15\",\n CTRL_V: \"\\x16\",\n CTRL_W: \"\\x17\",\n CTRL_X: \"\\x18\",\n CTRL_Y: \"\\x19\",\n CTRL_Z: \"\\x1a\",\n\n // Alt combinations (meta key)\n ALT_A: \"\\x1ba\",\n ALT_B: \"\\x1bb\",\n ALT_C: \"\\x1bc\",\n ALT_D: \"\\x1bd\",\n ALT_E: \"\\x1be\",\n ALT_F: \"\\x1bf\",\n ALT_G: \"\\x1bg\",\n ALT_H: \"\\x1bh\",\n ALT_I: \"\\x1bi\",\n ALT_J: \"\\x1bj\",\n ALT_K: \"\\x1bk\",\n ALT_L: \"\\x1bl\",\n ALT_M: \"\\x1bm\",\n ALT_N: \"\\x1bn\",\n ALT_O: \"\\x1bo\",\n ALT_P: \"\\x1bp\",\n ALT_Q: \"\\x1bq\",\n ALT_R: \"\\x1br\",\n ALT_S: \"\\x1bs\",\n ALT_T: \"\\x1bt\",\n ALT_U: \"\\x1bu\",\n ALT_V: \"\\x1bv\",\n ALT_W: \"\\x1bw\",\n ALT_X: \"\\x1bx\",\n ALT_Y: \"\\x1by\",\n ALT_Z: \"\\x1bz\",\n ALT_LEFT: \"\\x1b\\x1b[D\",\n ALT_RIGHT: \"\\x1b\\x1b[C\",\n ALT_UP: \"\\x1b\\x1b[A\",\n ALT_DOWN: \"\\x1b\\x1b[B\",\n} as const\n\nexport type KeyInput = string | keyof typeof KeyCodes\n\nexport function createMockKeys(renderer: CliRenderer) {\n const pressKeys = async (keys: KeyInput[], delayMs: number = 0): Promise<void> => {\n for (const key of keys) {\n let keyCode: string\n if (typeof key === \"string\") {\n // If it's a string but also exists in KeyCodes, use the KeyCodes value\n if (key in KeyCodes) {\n keyCode = KeyCodes[key as keyof typeof KeyCodes]\n } else {\n keyCode = key\n }\n } else {\n // It's a KeyCode enum value\n keyCode = KeyCodes[key]\n if (!keyCode) {\n throw new Error(`Unknown key: ${key}`)\n }\n }\n\n renderer.stdin.emit(\"data\", Buffer.from(keyCode))\n\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n }\n }\n }\n\n const pressKey = (key: KeyInput, modifiers?: { shift?: boolean; ctrl?: boolean; meta?: boolean }): void => {\n let keyCode: string\n if (typeof key === \"string\") {\n // If it's a string but also exists in KeyCodes, use the KeyCodes value\n if (key in KeyCodes) {\n keyCode = KeyCodes[key as keyof typeof KeyCodes]\n } else {\n keyCode = key\n }\n } else {\n // This branch handles KeyCode enum values (though they're strings at runtime)\n keyCode = KeyCodes[key]\n if (!keyCode) {\n throw new Error(`Unknown key: ${key}`)\n }\n }\n\n // Apply modifiers if present\n if (modifiers) {\n // For arrow keys and special keys, modify the escape sequence\n if (keyCode.startsWith(\"\\x1b[\") && keyCode.length > 2) {\n // Arrow keys: \\x1b[A, \\x1b[B, \\x1b[C, \\x1b[D\n // With shift modifier: \\x1b[1;2A, \\x1b[1;2B, \\x1b[1;2C, \\x1b[1;2D\n const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.meta ? 2 : 0) + (modifiers.ctrl ? 4 : 0)\n if (modifier > 1) {\n // Insert modifier into sequence\n const ending = keyCode.slice(-1)\n keyCode = `\\x1b[1;${modifier}${ending}`\n }\n } else if (keyCode.length === 1 && !modifiers.ctrl) {\n // For regular characters with modifiers\n let char = keyCode\n if (modifiers.shift && char >= \"a\" && char <= \"z\") {\n char = char.toUpperCase()\n }\n if (modifiers.meta) {\n // For meta+character, prefix with escape\n keyCode = `\\x1b${char}`\n } else {\n keyCode = char\n }\n }\n }\n\n renderer.stdin.emit(\"data\", Buffer.from(keyCode))\n }\n\n const typeText = async (text: string, delayMs: number = 0): Promise<void> => {\n const keys = text.split(\"\")\n await pressKeys(keys, delayMs)\n }\n\n const pressEnter = (): void => {\n pressKey(KeyCodes.ENTER)\n }\n\n const pressEscape = (): void => {\n pressKey(KeyCodes.ESCAPE)\n }\n\n const pressTab = (): void => {\n pressKey(KeyCodes.TAB)\n }\n\n const pressBackspace = (): void => {\n pressKey(KeyCodes.BACKSPACE)\n }\n\n const pressArrow = (\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n modifiers?: { shift?: boolean; ctrl?: boolean; meta?: boolean },\n ): void => {\n const keyMap = {\n up: KeyCodes.ARROW_UP,\n down: KeyCodes.ARROW_DOWN,\n left: KeyCodes.ARROW_LEFT,\n right: KeyCodes.ARROW_RIGHT,\n }\n pressKey(keyMap[direction], modifiers)\n }\n\n const pressCtrlC = (): void => {\n pressKey(KeyCodes.CTRL_C)\n }\n\n const pasteBracketedText = (text: string): Promise<void> => {\n return pressKeys([ANSI.bracketedPasteStart, text, ANSI.bracketedPasteEnd])\n }\n\n return {\n pressKeys,\n pressKey,\n typeText,\n pressEnter,\n pressEscape,\n pressTab,\n pressBackspace,\n pressArrow,\n pressCtrlC,\n pasteBracketedText,\n }\n}\n",
|
|
6
6
|
"import type { CliRenderer } from \"../renderer\"\n\nexport const MouseButtons = {\n LEFT: 0,\n MIDDLE: 1,\n RIGHT: 2,\n\n WHEEL_UP: 64, // 64 = scroll flag + 0\n WHEEL_DOWN: 65, // 64 + 1\n WHEEL_LEFT: 66, // 64 + 2\n WHEEL_RIGHT: 67, // 64 + 3\n} as const\n\nexport type MouseButton = (typeof MouseButtons)[keyof typeof MouseButtons]\n\nexport interface MousePosition {\n x: number\n y: number\n}\n\nexport interface MouseModifiers {\n shift?: boolean\n alt?: boolean\n ctrl?: boolean\n}\n\nexport type MouseEventType = \"down\" | \"up\" | \"move\" | \"drag\" | \"scroll\"\n\nexport interface MouseEventOptions {\n button?: MouseButton\n modifiers?: MouseModifiers\n delayMs?: number\n}\n\nexport function createMockMouse(renderer: CliRenderer) {\n let currentPosition: MousePosition = { x: 0, y: 0 }\n let buttonsPressed = new Set<MouseButton>()\n\n // Generate SGR mouse event sequence\n const generateMouseEvent = (\n type: MouseEventType,\n x: number,\n y: number,\n button: MouseButton = MouseButtons.LEFT,\n modifiers: MouseModifiers = {},\n ): string => {\n // SGR format: \\x1b[<b;x;yM or \\x1b[<b;x;ym\n // where b = button code + modifier flags + motion/scroll flags\n\n let buttonCode: number = button\n\n // Add modifier flags\n if (modifiers.shift) buttonCode |= 4\n if (modifiers.alt) buttonCode |= 8\n if (modifiers.ctrl) buttonCode |= 16\n\n switch (type) {\n case \"move\":\n buttonCode = 32 | 3 // motion flag (32) + button 3 for motion without button press\n if (modifiers.shift) buttonCode |= 4\n if (modifiers.alt) buttonCode |= 8\n if (modifiers.ctrl) buttonCode |= 16\n break\n case \"drag\":\n buttonCode = (buttonsPressed.size > 0 ? Array.from(buttonsPressed)[0] : button) | 32\n if (modifiers.shift) buttonCode |= 4\n if (modifiers.alt) buttonCode |= 8\n if (modifiers.ctrl) buttonCode |= 16\n break\n case \"scroll\":\n // Scroll events already have the scroll flag set in the button code\n break\n }\n\n // Convert to 1-based coordinates for ANSI\n const ansiX = x + 1\n const ansiY = y + 1\n\n let pressRelease = \"M\" // Default to press\n if (type === \"up\" || type === \"move\" || type === \"drag\") {\n pressRelease = \"m\"\n }\n\n return `\\x1b[<${buttonCode};${ansiX};${ansiY}${pressRelease}`\n }\n\n const emitMouseEvent = async (\n type: MouseEventType,\n x: number,\n y: number,\n button: MouseButton = MouseButtons.LEFT,\n options: Omit<MouseEventOptions, \"button\"> = {},\n ): Promise<void> => {\n const { modifiers = {}, delayMs = 0 } = options\n\n const eventSequence = generateMouseEvent(type, x, y, button, modifiers)\n renderer.stdin.emit(\"data\", Buffer.from(eventSequence))\n\n currentPosition = { x, y }\n\n if (type === \"down\" && button < 64) {\n buttonsPressed.add(button)\n } else if (type === \"up\") {\n buttonsPressed.delete(button)\n }\n\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n }\n }\n\n const moveTo = async (x: number, y: number, options: MouseEventOptions = {}): Promise<void> => {\n const { button = MouseButtons.LEFT, delayMs = 0, modifiers = {} } = options\n\n if (buttonsPressed.size > 0) {\n await emitMouseEvent(\"drag\", x, y, Array.from(buttonsPressed)[0], { modifiers, delayMs })\n } else {\n await emitMouseEvent(\"move\", x, y, button, { modifiers, delayMs })\n }\n\n currentPosition = { x, y }\n }\n\n const click = async (\n x: number,\n y: number,\n button: MouseButton = MouseButtons.LEFT,\n options: MouseEventOptions = {},\n ): Promise<void> => {\n const { delayMs = 10, modifiers = {} } = options\n\n await emitMouseEvent(\"down\", x, y, button, { modifiers, delayMs })\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n await emitMouseEvent(\"up\", x, y, button, { modifiers, delayMs })\n }\n\n const doubleClick = async (\n x: number,\n y: number,\n button: MouseButton = MouseButtons.LEFT,\n options: MouseEventOptions = {},\n ): Promise<void> => {\n const { delayMs = 10, modifiers = {} } = options\n\n await click(x, y, button, { modifiers, delayMs })\n await new Promise((resolve) => setTimeout(resolve, delayMs))\n await click(x, y, button, { modifiers, delayMs })\n }\n\n const pressDown = async (\n x: number,\n y: number,\n button: MouseButton = MouseButtons.LEFT,\n options: MouseEventOptions = {},\n ): Promise<void> => {\n const { modifiers = {}, delayMs = 0 } = options\n await emitMouseEvent(\"down\", x, y, button, { modifiers, delayMs })\n }\n\n const release = async (\n x: number,\n y: number,\n button: MouseButton = MouseButtons.LEFT,\n options: MouseEventOptions = {},\n ): Promise<void> => {\n const { modifiers = {}, delayMs = 0 } = options\n await emitMouseEvent(\"up\", x, y, button, { modifiers, delayMs })\n }\n\n const drag = async (\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n button: MouseButton = MouseButtons.LEFT,\n options: MouseEventOptions = {},\n ): Promise<void> => {\n const { delayMs = 10, modifiers = {} } = options\n\n await pressDown(startX, startY, button, { modifiers })\n\n const steps = 5\n const dx = (endX - startX) / steps\n const dy = (endY - startY) / steps\n\n for (let i = 1; i <= steps; i++) {\n const currentX = Math.round(startX + dx * i)\n const currentY = Math.round(startY + dy * i)\n await emitMouseEvent(\"drag\", currentX, currentY, button, { modifiers, delayMs })\n }\n\n await release(endX, endY, button, { modifiers })\n }\n\n const scroll = async (\n x: number,\n y: number,\n direction: \"up\" | \"down\" | \"left\" | \"right\",\n options: MouseEventOptions = {},\n ): Promise<void> => {\n const { modifiers = {}, delayMs = 0 } = options\n\n let button: MouseButton\n switch (direction) {\n case \"up\":\n button = MouseButtons.WHEEL_UP\n break\n case \"down\":\n button = MouseButtons.WHEEL_DOWN\n break\n case \"left\":\n button = MouseButtons.WHEEL_LEFT\n break\n case \"right\":\n button = MouseButtons.WHEEL_RIGHT\n break\n }\n\n await emitMouseEvent(\"scroll\", x, y, button, { modifiers, delayMs })\n }\n\n const getCurrentPosition = (): MousePosition => {\n return { ...currentPosition }\n }\n\n const getPressedButtons = (): MouseButton[] => {\n return Array.from(buttonsPressed)\n }\n\n return {\n // Core interaction methods\n moveTo,\n click,\n doubleClick,\n pressDown,\n release,\n drag,\n scroll,\n\n // State getters\n getCurrentPosition,\n getPressedButtons,\n\n // Low-level event emission (for advanced use cases)\n emitMouseEvent,\n }\n}\n",
|
|
7
7
|
"import { CliRenderer, type CliRendererConfig } from \"../renderer\"\nimport { resolveRenderLib } from \"../zig\"\nimport { createMockKeys } from \"./mock-keys\"\nimport { createMockMouse } from \"./mock-mouse\"\n\nexport interface TestRendererOptions extends CliRendererConfig {\n width?: number\n height?: number\n}\nexport interface TestRenderer extends CliRenderer {}\nexport type MockInput = ReturnType<typeof createMockKeys>\nexport type MockMouse = ReturnType<typeof createMockMouse>\n\nconst decoder = new TextDecoder()\n\nexport async function createTestRenderer(options: TestRendererOptions): Promise<{\n renderer: TestRenderer\n mockInput: MockInput\n mockMouse: MockMouse\n renderOnce: () => Promise<void>\n captureCharFrame: () => string\n resize: (width: number, height: number) => void\n}> {\n process.env.OTUI_USE_CONSOLE = \"false\"\n const renderer = await setupTestRenderer({\n ...options,\n useAlternateScreen: false,\n useConsole: false,\n })\n\n renderer.disableStdoutInterception()\n\n const mockInput = createMockKeys(renderer)\n const mockMouse = createMockMouse(renderer)\n\n const renderOnce = async () => {\n //@ts-expect-error - this is a test renderer\n await renderer.loop()\n }\n\n return {\n renderer,\n mockInput,\n mockMouse,\n renderOnce,\n captureCharFrame: () => {\n const currentBuffer = renderer.currentRenderBuffer\n const frameBytes = currentBuffer.getRealCharBytes(true)\n return decoder.decode(frameBytes)\n },\n resize: (width: number, height: number) => {\n //@ts-expect-error - this is a test renderer\n renderer.processResize(width, height)\n },\n }\n}\n\nasync function setupTestRenderer(config: TestRendererOptions) {\n const stdin = config.stdin || process.stdin\n const stdout = config.stdout || process.stdout\n\n const width = config.width || stdout.columns || 80\n const height = config.height || stdout.rows || 24\n const renderHeight =\n config.experimental_splitHeight && config.experimental_splitHeight > 0 ? config.experimental_splitHeight : height\n\n const ziglib = resolveRenderLib()\n const rendererPtr = ziglib.createRenderer(width, renderHeight, { testing: true })\n if (!rendererPtr) {\n throw new Error(\"Failed to create test renderer\")\n }\n if (config.useThread === undefined) {\n config.useThread = true\n }\n\n if (process.platform === \"linux\") {\n config.useThread = false\n }\n ziglib.setUseThread(rendererPtr, config.useThread)\n\n const renderer = new CliRenderer(ziglib, rendererPtr, stdin, stdout, width, height, config)\n\n // Do not setup the terminal for testing as we will not actualy output anything to the terminal\n // await renderer.setupTerminal()\n\n return renderer\n}\n",
|
|
8
8
|
"export function createSpy() {\n const calls: any[][] = []\n const spy = (...args: any[]) => {\n calls.push(args)\n }\n spy.calls = calls\n spy.callCount = () => calls.length\n spy.calledWith = (...expected: any[]) => {\n return calls.some((call) => JSON.stringify(call) === JSON.stringify(expected))\n }\n spy.reset = () => (calls.length = 0)\n return spy\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": ";;;;;;;;AAGO,IAAM,WAAW;AAAA,EAEtB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,WAAW;AAAA,EAEX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EAGR,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EAGZ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EAGL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EAGR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "4F737E7B09ACF94364756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/zig-structs.d.ts
CHANGED
|
@@ -18,3 +18,5 @@ export declare const HighlightStruct: import("bun-ffi-structs").DefineStructRetu
|
|
|
18
18
|
}], readonly ["hlRef", "u16", {
|
|
19
19
|
readonly default: 0;
|
|
20
20
|
}]], {}>;
|
|
21
|
+
export declare const LogicalCursorStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["row", "u32"], readonly ["col", "u32"], readonly ["offset", "u32"]], {}>;
|
|
22
|
+
export declare const VisualCursorStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["visualRow", "u32"], readonly ["visualCol", "u32"], readonly ["logicalRow", "u32"], readonly ["logicalCol", "u32"], readonly ["offset", "u32"]], {}>;
|
package/zig.d.ts
CHANGED
|
@@ -134,6 +134,7 @@ export interface RenderLib {
|
|
|
134
134
|
editBufferInsertText: (buffer: Pointer, text: string) => void;
|
|
135
135
|
editBufferDeleteChar: (buffer: Pointer) => void;
|
|
136
136
|
editBufferDeleteCharBackward: (buffer: Pointer) => void;
|
|
137
|
+
editBufferDeleteRange: (buffer: Pointer, startLine: number, startCol: number, endLine: number, endCol: number) => void;
|
|
137
138
|
editBufferNewLine: (buffer: Pointer) => void;
|
|
138
139
|
editBufferDeleteLine: (buffer: Pointer) => void;
|
|
139
140
|
editBufferMoveCursorLeft: (buffer: Pointer) => void;
|
|
@@ -159,6 +160,21 @@ export interface RenderLib {
|
|
|
159
160
|
editBufferClearHistory: (buffer: Pointer) => void;
|
|
160
161
|
editBufferSetPlaceholder: (buffer: Pointer, text: string | null) => void;
|
|
161
162
|
editBufferSetPlaceholderColor: (buffer: Pointer, color: RGBA) => void;
|
|
163
|
+
editBufferGetNextWordBoundary: (buffer: Pointer) => {
|
|
164
|
+
row: number;
|
|
165
|
+
col: number;
|
|
166
|
+
offset: number;
|
|
167
|
+
};
|
|
168
|
+
editBufferGetPrevWordBoundary: (buffer: Pointer) => {
|
|
169
|
+
row: number;
|
|
170
|
+
col: number;
|
|
171
|
+
offset: number;
|
|
172
|
+
};
|
|
173
|
+
editBufferGetEOL: (buffer: Pointer) => {
|
|
174
|
+
row: number;
|
|
175
|
+
col: number;
|
|
176
|
+
offset: number;
|
|
177
|
+
};
|
|
162
178
|
createEditorView: (editBufferPtr: Pointer, viewportWidth: number, viewportHeight: number) => Pointer;
|
|
163
179
|
destroyEditorView: (view: Pointer) => void;
|
|
164
180
|
editorViewSetViewportSize: (view: Pointer, width: number, height: number) => void;
|
|
@@ -192,6 +208,9 @@ export interface RenderLib {
|
|
|
192
208
|
editorViewMoveDownVisual: (view: Pointer) => void;
|
|
193
209
|
editorViewDeleteSelectedText: (view: Pointer) => void;
|
|
194
210
|
editorViewSetCursorByOffset: (view: Pointer, offset: number) => void;
|
|
211
|
+
editorViewGetNextWordBoundary: (view: Pointer) => VisualCursor;
|
|
212
|
+
editorViewGetPrevWordBoundary: (view: Pointer) => VisualCursor;
|
|
213
|
+
editorViewGetEOL: (view: Pointer) => VisualCursor;
|
|
195
214
|
bufferPushScissorRect: (buffer: Pointer, x: number, y: number, width: number, height: number) => void;
|
|
196
215
|
bufferPopScissorRect: (buffer: Pointer) => void;
|
|
197
216
|
bufferClearScissorRects: (buffer: Pointer) => void;
|