@opentui/core 0.1.28 → 0.1.29
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/3d.js.map +1 -1
- package/README.md +10 -0
- package/Renderable.d.ts +25 -24
- package/buffer.d.ts +4 -7
- package/edit-buffer.d.ts +76 -0
- package/editor-view.d.ts +50 -0
- package/{index-phjxdb6g.js → index-bztetjc3.js} +1649 -323
- package/{index-phjxdb6g.js.map → index-bztetjc3.js.map} +18 -17
- package/index.d.ts +4 -0
- package/index.js +1334 -65
- package/index.js.map +12 -6
- package/lib/hast-styled-text.d.ts +2 -3
- package/lib/index.d.ts +0 -1
- package/lib/objects-in-viewport.d.ts +14 -0
- package/lib/tree-sitter/index.d.ts +0 -2
- package/lib/tree-sitter-styled-text.d.ts +1 -1
- package/lib/yoga.options.d.ts +6 -6
- package/package.json +8 -7
- package/renderables/Code.d.ts +1 -1
- package/renderables/EditBufferRenderable.d.ts +106 -0
- package/renderables/Text.d.ts +0 -3
- package/renderables/TextBufferRenderable.d.ts +8 -14
- package/renderables/Textarea.d.ts +66 -0
- package/renderables/index.d.ts +1 -0
- package/renderer.d.ts +6 -2
- package/{lib/syntax-style.d.ts → syntax-style.d.ts} +21 -5
- package/testing/mock-keys.d.ts +10 -2
- package/testing.js +14 -5
- package/testing.js.map +3 -3
- package/text-buffer-view.d.ts +31 -0
- package/text-buffer.d.ts +28 -21
- package/types.d.ts +10 -0
- package/zig-structs.d.ts +20 -0
- package/zig.d.ts +126 -23
- package/lib/word-jumps.d.ts +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StyledText } from "./styled-text";
|
|
2
|
-
import { SyntaxStyle } from "
|
|
2
|
+
import { SyntaxStyle } from "../syntax-style";
|
|
3
3
|
export interface HASTText {
|
|
4
4
|
type: "text";
|
|
5
5
|
value: string;
|
|
@@ -13,6 +13,5 @@ export interface HASTElement {
|
|
|
13
13
|
children: HASTNode[];
|
|
14
14
|
}
|
|
15
15
|
export type HASTNode = HASTText | HASTElement;
|
|
16
|
-
export {
|
|
17
|
-
export type { StyleDefinition } from "./syntax-style";
|
|
16
|
+
export type { StyleDefinition } from "../syntax-style";
|
|
18
17
|
export declare function hastToStyledText(hast: HASTNode, syntaxStyle: SyntaxStyle): StyledText;
|
package/lib/index.d.ts
CHANGED
|
@@ -6,5 +6,19 @@ interface ViewportObject {
|
|
|
6
6
|
height: number;
|
|
7
7
|
zIndex: number;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Returns objects that overlap with the viewport bounds.
|
|
11
|
+
*
|
|
12
|
+
* @param viewport - The viewport bounds to check against
|
|
13
|
+
* @param objects - Array of objects MUST be sorted by position (y for column, x for row direction)
|
|
14
|
+
* @param direction - Primary scroll direction: "column" (vertical) or "row" (horizontal)
|
|
15
|
+
* @param padding - Extra padding around viewport to include nearby objects
|
|
16
|
+
* @param minTriggerSize - Minimum array size to use binary search optimization
|
|
17
|
+
* @returns Array of visible objects sorted by zIndex
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* Objects must be pre-sorted by their start position (y for column direction, x for row direction).
|
|
21
|
+
* Unsorted input will produce incorrect results.
|
|
22
|
+
*/
|
|
9
23
|
export declare function getObjectsInViewport<T extends ViewportObject>(viewport: ViewportBounds, objects: T[], direction?: "row" | "column", padding?: number, minTriggerSize?: number): T[];
|
|
10
24
|
export {};
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { TreeSitterClient } from "./client";
|
|
2
2
|
export * from "./client";
|
|
3
3
|
export * from "../tree-sitter-styled-text";
|
|
4
|
-
export * from "../syntax-style";
|
|
5
4
|
export * from "./types";
|
|
6
|
-
export * from "../syntax-style";
|
|
7
5
|
export * from "./resolve-ft";
|
|
8
6
|
export type { UpdateOptions } from "./assets/update";
|
|
9
7
|
export { updateAssets } from "./assets/update";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { TextChunk } from "../text-buffer";
|
|
2
2
|
import { StyledText } from "./styled-text";
|
|
3
|
-
import { SyntaxStyle } from "
|
|
3
|
+
import { SyntaxStyle } from "../syntax-style";
|
|
4
4
|
import { TreeSitterClient } from "./tree-sitter/client";
|
|
5
5
|
import type { SimpleHighlight } from "./tree-sitter/types";
|
|
6
6
|
export declare function treeSitterToTextChunks(content: string, highlights: SimpleHighlight[], syntaxStyle: SyntaxStyle): TextChunk[];
|
package/lib/yoga.options.d.ts
CHANGED
|
@@ -14,18 +14,18 @@ export type OverflowString = "visible" | "hidden" | "scroll";
|
|
|
14
14
|
export type PositionTypeString = "static" | "relative" | "absolute";
|
|
15
15
|
export type UnitString = "undefined" | "point" | "percent" | "auto";
|
|
16
16
|
export type WrapString = "no-wrap" | "wrap" | "wrap-reverse";
|
|
17
|
-
export declare function parseAlign(value: string): Align;
|
|
17
|
+
export declare function parseAlign(value: string | null | undefined): Align;
|
|
18
18
|
export declare function parseBoxSizing(value: string): BoxSizing;
|
|
19
19
|
export declare function parseDimension(value: string): Dimension;
|
|
20
20
|
export declare function parseDirection(value: string): Direction;
|
|
21
21
|
export declare function parseDisplay(value: string): Display;
|
|
22
22
|
export declare function parseEdge(value: string): Edge;
|
|
23
|
-
export declare function parseFlexDirection(value: string): FlexDirection;
|
|
23
|
+
export declare function parseFlexDirection(value: string | null | undefined): FlexDirection;
|
|
24
24
|
export declare function parseGutter(value: string): Gutter;
|
|
25
|
-
export declare function parseJustify(value: string): Justify;
|
|
25
|
+
export declare function parseJustify(value: string | null | undefined): Justify;
|
|
26
26
|
export declare function parseLogLevel(value: string): LogLevel;
|
|
27
27
|
export declare function parseMeasureMode(value: string): MeasureMode;
|
|
28
|
-
export declare function parseOverflow(value: string): Overflow;
|
|
29
|
-
export declare function parsePositionType(value: string): PositionType;
|
|
28
|
+
export declare function parseOverflow(value: string | null | undefined): Overflow;
|
|
29
|
+
export declare function parsePositionType(value: string | null | undefined): PositionType;
|
|
30
30
|
export declare function parseUnit(value: string): Unit;
|
|
31
|
-
export declare function parseWrap(value: string): Wrap;
|
|
31
|
+
export declare function parseWrap(value: string | null | undefined): Wrap;
|
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.29",
|
|
8
8
|
"description": "OpenTUI is a TypeScript library for building terminal user interfaces (TUIs)",
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"repository": {
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
+
"bun-ffi-structs": "^0.1.0",
|
|
38
39
|
"jimp": "1.6.0",
|
|
39
40
|
"yoga-layout": "3.2.1"
|
|
40
41
|
},
|
|
@@ -54,11 +55,11 @@
|
|
|
54
55
|
"bun-webgpu": "0.1.3",
|
|
55
56
|
"planck": "^1.4.2",
|
|
56
57
|
"three": "0.177.0",
|
|
57
|
-
"@opentui/core-darwin-x64": "0.1.
|
|
58
|
-
"@opentui/core-darwin-arm64": "0.1.
|
|
59
|
-
"@opentui/core-linux-x64": "0.1.
|
|
60
|
-
"@opentui/core-linux-arm64": "0.1.
|
|
61
|
-
"@opentui/core-win32-x64": "0.1.
|
|
62
|
-
"@opentui/core-win32-arm64": "0.1.
|
|
58
|
+
"@opentui/core-darwin-x64": "0.1.29",
|
|
59
|
+
"@opentui/core-darwin-arm64": "0.1.29",
|
|
60
|
+
"@opentui/core-linux-x64": "0.1.29",
|
|
61
|
+
"@opentui/core-linux-arm64": "0.1.29",
|
|
62
|
+
"@opentui/core-win32-x64": "0.1.29",
|
|
63
|
+
"@opentui/core-win32-arm64": "0.1.29"
|
|
63
64
|
}
|
|
64
65
|
}
|
package/renderables/Code.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type RenderContext } from "../types";
|
|
2
|
-
import { SyntaxStyle } from "../
|
|
2
|
+
import { SyntaxStyle } from "../syntax-style";
|
|
3
3
|
import { TreeSitterClient } from "../lib/tree-sitter";
|
|
4
4
|
import { TextBufferRenderable, type TextBufferOptions } from "./TextBufferRenderable";
|
|
5
5
|
export interface CodeOptions extends TextBufferOptions {
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Renderable, type RenderableOptions } from "../Renderable";
|
|
2
|
+
import { Selection, type LocalSelectionBounds } from "../lib/selection";
|
|
3
|
+
import { EditBuffer, type CursorPosition } from "../edit-buffer";
|
|
4
|
+
import { EditorView, type VisualCursor } from "../editor-view";
|
|
5
|
+
import { RGBA } from "../lib/RGBA";
|
|
6
|
+
import { type RenderContext } from "../types";
|
|
7
|
+
import type { OptimizedBuffer } from "../buffer";
|
|
8
|
+
import type { SyntaxStyle } from "../syntax-style";
|
|
9
|
+
export interface CursorChangeEvent {
|
|
10
|
+
line: number;
|
|
11
|
+
visualColumn: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ContentChangeEvent {
|
|
14
|
+
}
|
|
15
|
+
export interface EditBufferOptions extends RenderableOptions<EditBufferRenderable> {
|
|
16
|
+
textColor?: string | RGBA;
|
|
17
|
+
backgroundColor?: string | RGBA;
|
|
18
|
+
selectionBg?: string | RGBA;
|
|
19
|
+
selectionFg?: string | RGBA;
|
|
20
|
+
selectable?: boolean;
|
|
21
|
+
attributes?: number;
|
|
22
|
+
wrapMode?: "none" | "char" | "word";
|
|
23
|
+
scrollMargin?: number;
|
|
24
|
+
showCursor?: boolean;
|
|
25
|
+
cursorColor?: string | RGBA;
|
|
26
|
+
syntaxStyle?: SyntaxStyle;
|
|
27
|
+
onCursorChange?: (event: CursorChangeEvent) => void;
|
|
28
|
+
onContentChange?: (event: ContentChangeEvent) => void;
|
|
29
|
+
}
|
|
30
|
+
export declare abstract class EditBufferRenderable extends Renderable {
|
|
31
|
+
protected _focusable: boolean;
|
|
32
|
+
selectable: boolean;
|
|
33
|
+
protected _textColor: RGBA;
|
|
34
|
+
protected _backgroundColor: RGBA;
|
|
35
|
+
protected _defaultAttributes: number;
|
|
36
|
+
protected _selectionBg: RGBA | undefined;
|
|
37
|
+
protected _selectionFg: RGBA | undefined;
|
|
38
|
+
protected _wrapMode: "none" | "char" | "word";
|
|
39
|
+
protected _scrollMargin: number;
|
|
40
|
+
protected _showCursor: boolean;
|
|
41
|
+
protected _cursorColor: RGBA;
|
|
42
|
+
protected lastLocalSelection: LocalSelectionBounds | null;
|
|
43
|
+
private _cursorChangeListener;
|
|
44
|
+
private _contentChangeListener;
|
|
45
|
+
editBuffer: EditBuffer;
|
|
46
|
+
editorView: EditorView;
|
|
47
|
+
protected _defaultOptions: {
|
|
48
|
+
textColor: RGBA;
|
|
49
|
+
backgroundColor: string;
|
|
50
|
+
selectionBg: undefined;
|
|
51
|
+
selectionFg: undefined;
|
|
52
|
+
selectable: true;
|
|
53
|
+
attributes: number;
|
|
54
|
+
wrapMode: "none" | "char" | "word";
|
|
55
|
+
scrollMargin: number;
|
|
56
|
+
showCursor: true;
|
|
57
|
+
cursorColor: RGBA;
|
|
58
|
+
};
|
|
59
|
+
constructor(ctx: RenderContext, options: EditBufferOptions);
|
|
60
|
+
private setupEventListeners;
|
|
61
|
+
get plainText(): string;
|
|
62
|
+
get cursor(): CursorPosition;
|
|
63
|
+
get visualCursor(): VisualCursor;
|
|
64
|
+
set cursorOffset(offset: number);
|
|
65
|
+
get textColor(): RGBA;
|
|
66
|
+
set textColor(value: RGBA | string | undefined);
|
|
67
|
+
get selectionBg(): RGBA | undefined;
|
|
68
|
+
set selectionBg(value: RGBA | string | undefined);
|
|
69
|
+
get selectionFg(): RGBA | undefined;
|
|
70
|
+
set selectionFg(value: RGBA | string | undefined);
|
|
71
|
+
get backgroundColor(): RGBA;
|
|
72
|
+
set backgroundColor(value: RGBA | string | undefined);
|
|
73
|
+
get attributes(): number;
|
|
74
|
+
set attributes(value: number);
|
|
75
|
+
get wrapMode(): "none" | "char" | "word";
|
|
76
|
+
set wrapMode(value: "none" | "char" | "word");
|
|
77
|
+
get showCursor(): boolean;
|
|
78
|
+
set showCursor(value: boolean);
|
|
79
|
+
get cursorColor(): RGBA;
|
|
80
|
+
set cursorColor(value: RGBA | string);
|
|
81
|
+
protected onResize(width: number, height: number): void;
|
|
82
|
+
protected refreshLocalSelection(): boolean;
|
|
83
|
+
private updateLocalSelection;
|
|
84
|
+
shouldStartSelection(x: number, y: number): boolean;
|
|
85
|
+
onSelectionChanged(selection: Selection | null): boolean;
|
|
86
|
+
getSelectedText(): string;
|
|
87
|
+
hasSelection(): boolean;
|
|
88
|
+
getSelection(): {
|
|
89
|
+
start: number;
|
|
90
|
+
end: number;
|
|
91
|
+
} | null;
|
|
92
|
+
private setupMeasureFunc;
|
|
93
|
+
render(buffer: OptimizedBuffer, deltaTime: number): void;
|
|
94
|
+
protected renderSelf(buffer: OptimizedBuffer): void;
|
|
95
|
+
protected renderCursor(buffer: OptimizedBuffer): void;
|
|
96
|
+
focus(): void;
|
|
97
|
+
blur(): void;
|
|
98
|
+
protected onRemove(): void;
|
|
99
|
+
destroy(): void;
|
|
100
|
+
set onCursorChange(handler: ((event: CursorChangeEvent) => void) | undefined);
|
|
101
|
+
get onCursorChange(): ((event: CursorChangeEvent) => void) | undefined;
|
|
102
|
+
set onContentChange(handler: ((event: ContentChangeEvent) => void) | undefined);
|
|
103
|
+
get onContentChange(): ((event: ContentChangeEvent) => void) | undefined;
|
|
104
|
+
get syntaxStyle(): SyntaxStyle | null;
|
|
105
|
+
set syntaxStyle(style: SyntaxStyle | null);
|
|
106
|
+
}
|
package/renderables/Text.d.ts
CHANGED
|
@@ -22,9 +22,6 @@ export declare class TextRenderable extends TextBufferRenderable {
|
|
|
22
22
|
get chunks(): TextChunk[];
|
|
23
23
|
get textNode(): RootTextNodeRenderable;
|
|
24
24
|
set content(value: StyledText | string);
|
|
25
|
-
insertChunk(chunk: TextChunk, index?: number): void;
|
|
26
|
-
removeChunkByObject(chunk: TextChunk): void;
|
|
27
|
-
replaceChunkByObject(chunk: TextChunk, oldChunk: TextChunk): void;
|
|
28
25
|
private updateTextFromNodes;
|
|
29
26
|
add(obj: TextNodeRenderable | StyledText | string, index?: number): number;
|
|
30
27
|
remove(id: string): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Renderable, type RenderableOptions } from "../Renderable";
|
|
2
2
|
import { Selection, type LocalSelectionBounds } from "../lib/selection";
|
|
3
|
-
import { TextBuffer
|
|
3
|
+
import { TextBuffer } from "../text-buffer";
|
|
4
|
+
import { TextBufferView } from "../text-buffer-view";
|
|
4
5
|
import { RGBA } from "../lib/RGBA";
|
|
5
6
|
import { type RenderContext } from "../types";
|
|
6
7
|
import type { OptimizedBuffer } from "../buffer";
|
|
@@ -12,8 +13,7 @@ export interface TextBufferOptions extends RenderableOptions<TextBufferRenderabl
|
|
|
12
13
|
selectionFg?: string | RGBA;
|
|
13
14
|
selectable?: boolean;
|
|
14
15
|
attributes?: number;
|
|
15
|
-
|
|
16
|
-
wrapMode?: "char" | "word";
|
|
16
|
+
wrapMode?: "none" | "char" | "word";
|
|
17
17
|
}
|
|
18
18
|
export declare abstract class TextBufferRenderable extends Renderable {
|
|
19
19
|
selectable: boolean;
|
|
@@ -22,10 +22,10 @@ export declare abstract class TextBufferRenderable extends Renderable {
|
|
|
22
22
|
protected _defaultAttributes: number;
|
|
23
23
|
protected _selectionBg: RGBA | undefined;
|
|
24
24
|
protected _selectionFg: RGBA | undefined;
|
|
25
|
-
protected
|
|
26
|
-
protected _wrapMode: "char" | "word";
|
|
25
|
+
protected _wrapMode: "none" | "char" | "word";
|
|
27
26
|
protected lastLocalSelection: LocalSelectionBounds | null;
|
|
28
27
|
protected textBuffer: TextBuffer;
|
|
28
|
+
protected textBufferView: TextBufferView;
|
|
29
29
|
protected _lineInfo: LineInfo;
|
|
30
30
|
protected _defaultOptions: {
|
|
31
31
|
fg: RGBA;
|
|
@@ -34,8 +34,7 @@ export declare abstract class TextBufferRenderable extends Renderable {
|
|
|
34
34
|
selectionFg: undefined;
|
|
35
35
|
selectable: true;
|
|
36
36
|
attributes: number;
|
|
37
|
-
|
|
38
|
-
wrapMode: "char" | "word";
|
|
37
|
+
wrapMode: "none" | "char" | "word";
|
|
39
38
|
};
|
|
40
39
|
constructor(ctx: RenderContext, options: TextBufferOptions);
|
|
41
40
|
get plainText(): string;
|
|
@@ -50,10 +49,8 @@ export declare abstract class TextBufferRenderable extends Renderable {
|
|
|
50
49
|
set bg(value: RGBA | string | undefined);
|
|
51
50
|
get attributes(): number;
|
|
52
51
|
set attributes(value: number);
|
|
53
|
-
get
|
|
54
|
-
set
|
|
55
|
-
get wrapMode(): "char" | "word";
|
|
56
|
-
set wrapMode(value: "char" | "word");
|
|
52
|
+
get wrapMode(): "none" | "char" | "word";
|
|
53
|
+
set wrapMode(value: "none" | "char" | "word");
|
|
57
54
|
protected onResize(width: number, height: number): void;
|
|
58
55
|
protected refreshLocalSelection(): boolean;
|
|
59
56
|
private updateLocalSelection;
|
|
@@ -61,9 +58,6 @@ export declare abstract class TextBufferRenderable extends Renderable {
|
|
|
61
58
|
private updateLineInfo;
|
|
62
59
|
private updateWrapWidth;
|
|
63
60
|
private setupMeasureFunc;
|
|
64
|
-
insertChunk(chunk: TextChunk, index?: number): void;
|
|
65
|
-
removeChunk(index: number): void;
|
|
66
|
-
replaceChunk(index: number, chunk: TextChunk): void;
|
|
67
61
|
shouldStartSelection(x: number, y: number): boolean;
|
|
68
62
|
onSelectionChanged(selection: Selection | null): boolean;
|
|
69
63
|
getSelectedText(): string;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type RenderContext, type Highlight } from "../types";
|
|
2
|
+
import { EditBufferRenderable, type EditBufferOptions } from "./EditBufferRenderable";
|
|
3
|
+
import type { KeyEvent } from "../lib/KeyHandler";
|
|
4
|
+
import { RGBA, type ColorInput } from "../lib/RGBA";
|
|
5
|
+
export interface TextareaOptions extends EditBufferOptions {
|
|
6
|
+
value?: string;
|
|
7
|
+
backgroundColor?: ColorInput;
|
|
8
|
+
textColor?: ColorInput;
|
|
9
|
+
focusedBackgroundColor?: ColorInput;
|
|
10
|
+
focusedTextColor?: ColorInput;
|
|
11
|
+
placeholder?: string | null;
|
|
12
|
+
placeholderColor?: ColorInput;
|
|
13
|
+
}
|
|
14
|
+
export declare class TextareaRenderable extends EditBufferRenderable {
|
|
15
|
+
private _placeholder;
|
|
16
|
+
private _unfocusedBackgroundColor;
|
|
17
|
+
private _unfocusedTextColor;
|
|
18
|
+
private _focusedBackgroundColor;
|
|
19
|
+
private _focusedTextColor;
|
|
20
|
+
private _placeholderColor;
|
|
21
|
+
private static readonly defaults;
|
|
22
|
+
constructor(ctx: RenderContext, options: TextareaOptions);
|
|
23
|
+
handlePaste(text: string): void;
|
|
24
|
+
handleKeyPress(key: KeyEvent | string): boolean;
|
|
25
|
+
get value(): string;
|
|
26
|
+
set value(value: string);
|
|
27
|
+
private updateValue;
|
|
28
|
+
private updateColors;
|
|
29
|
+
insertChar(char: string): void;
|
|
30
|
+
insertText(text: string): void;
|
|
31
|
+
deleteChar(): void;
|
|
32
|
+
deleteCharBackward(): void;
|
|
33
|
+
private deleteSelectedText;
|
|
34
|
+
newLine(): void;
|
|
35
|
+
deleteLine(): void;
|
|
36
|
+
moveCursorLeft(): void;
|
|
37
|
+
moveCursorRight(): void;
|
|
38
|
+
moveCursorUp(): void;
|
|
39
|
+
moveCursorDown(): void;
|
|
40
|
+
gotoLine(line: number): void;
|
|
41
|
+
gotoLineEnd(): void;
|
|
42
|
+
gotoBufferEnd(): void;
|
|
43
|
+
deleteToLineEnd(): void;
|
|
44
|
+
undo(): void;
|
|
45
|
+
redo(): void;
|
|
46
|
+
private handleShiftSelection;
|
|
47
|
+
focus(): void;
|
|
48
|
+
blur(): void;
|
|
49
|
+
get placeholder(): string | null;
|
|
50
|
+
set placeholder(value: string | null);
|
|
51
|
+
get backgroundColor(): RGBA;
|
|
52
|
+
set backgroundColor(value: RGBA | string | undefined);
|
|
53
|
+
get textColor(): RGBA;
|
|
54
|
+
set textColor(value: RGBA | string | undefined);
|
|
55
|
+
set focusedBackgroundColor(value: ColorInput);
|
|
56
|
+
set focusedTextColor(value: ColorInput);
|
|
57
|
+
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
|
+
}
|
package/renderables/index.d.ts
CHANGED
package/renderer.d.ts
CHANGED
|
@@ -255,8 +255,12 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
|
|
|
255
255
|
get hasSelection(): boolean;
|
|
256
256
|
getSelectionContainer(): Renderable | null;
|
|
257
257
|
clearSelection(): void;
|
|
258
|
-
|
|
259
|
-
|
|
258
|
+
/**
|
|
259
|
+
* Start a new selection at the given coordinates.
|
|
260
|
+
* Used by both mouse and keyboard selection.
|
|
261
|
+
*/
|
|
262
|
+
startSelection(renderable: Renderable, x: number, y: number): void;
|
|
263
|
+
updateSelection(currentRenderable: Renderable | undefined, x: number, y: number): void;
|
|
260
264
|
requestSelectionUpdate(): void;
|
|
261
265
|
private isWithinContainer;
|
|
262
266
|
private finishSelection;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { RGBA, type ColorInput } from "./RGBA";
|
|
1
|
+
import { RGBA, type ColorInput } from "./lib/RGBA";
|
|
2
|
+
import { type RenderLib } from "./zig";
|
|
3
|
+
import { type Pointer } from "bun:ffi";
|
|
2
4
|
export interface StyleDefinition {
|
|
3
5
|
fg?: RGBA;
|
|
4
6
|
bg?: RGBA;
|
|
@@ -25,12 +27,26 @@ export interface ThemeTokenStyle {
|
|
|
25
27
|
}
|
|
26
28
|
export declare function convertThemeToStyles(theme: ThemeTokenStyle[]): Record<string, StyleDefinition>;
|
|
27
29
|
export declare class SyntaxStyle {
|
|
28
|
-
private
|
|
29
|
-
private
|
|
30
|
-
|
|
30
|
+
private lib;
|
|
31
|
+
private stylePtr;
|
|
32
|
+
private _destroyed;
|
|
33
|
+
private nameCache;
|
|
34
|
+
private styleDefs;
|
|
35
|
+
private mergedCache;
|
|
36
|
+
constructor(lib: RenderLib, ptr: Pointer);
|
|
37
|
+
static create(): SyntaxStyle;
|
|
31
38
|
static fromTheme(theme: ThemeTokenStyle[]): SyntaxStyle;
|
|
32
|
-
|
|
39
|
+
static fromStyles(styles: Record<string, StyleDefinition>): SyntaxStyle;
|
|
40
|
+
private guard;
|
|
41
|
+
registerStyle(name: string, style: StyleDefinition): number;
|
|
42
|
+
resolveStyleId(name: string): number | null;
|
|
43
|
+
getStyleId(name: string): number | null;
|
|
44
|
+
get ptr(): Pointer;
|
|
45
|
+
getStyleCount(): number;
|
|
46
|
+
clearNameCache(): void;
|
|
33
47
|
getStyle(name: string): StyleDefinition | undefined;
|
|
48
|
+
mergeStyles(...styleNames: string[]): MergedStyle;
|
|
34
49
|
clearCache(): void;
|
|
35
50
|
getCacheSize(): number;
|
|
51
|
+
destroy(): void;
|
|
36
52
|
}
|
package/testing/mock-keys.d.ts
CHANGED
|
@@ -56,13 +56,21 @@ export declare const KeyCodes: {
|
|
|
56
56
|
export type KeyInput = string | keyof typeof KeyCodes;
|
|
57
57
|
export declare function createMockKeys(renderer: CliRenderer): {
|
|
58
58
|
pressKeys: (keys: KeyInput[], delayMs?: number) => Promise<void>;
|
|
59
|
-
pressKey: (key: KeyInput
|
|
59
|
+
pressKey: (key: KeyInput, modifiers?: {
|
|
60
|
+
shift?: boolean;
|
|
61
|
+
ctrl?: boolean;
|
|
62
|
+
alt?: boolean;
|
|
63
|
+
}) => void;
|
|
60
64
|
typeText: (text: string, delayMs?: number) => Promise<void>;
|
|
61
65
|
pressEnter: () => void;
|
|
62
66
|
pressEscape: () => void;
|
|
63
67
|
pressTab: () => void;
|
|
64
68
|
pressBackspace: () => void;
|
|
65
|
-
pressArrow: (direction: "up" | "down" | "left" | "right"
|
|
69
|
+
pressArrow: (direction: "up" | "down" | "left" | "right", modifiers?: {
|
|
70
|
+
shift?: boolean;
|
|
71
|
+
ctrl?: boolean;
|
|
72
|
+
alt?: boolean;
|
|
73
|
+
}) => void;
|
|
66
74
|
pressCtrlC: () => void;
|
|
67
75
|
pasteBracketedText: (text: string) => Promise<void>;
|
|
68
76
|
};
|
package/testing.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
ANSI,
|
|
4
4
|
CliRenderer,
|
|
5
5
|
resolveRenderLib
|
|
6
|
-
} from "./index-
|
|
6
|
+
} from "./index-bztetjc3.js";
|
|
7
7
|
|
|
8
8
|
// src/testing/mock-keys.ts
|
|
9
9
|
var KeyCodes = {
|
|
@@ -83,7 +83,7 @@ function createMockKeys(renderer) {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
};
|
|
86
|
-
const pressKey = (key) => {
|
|
86
|
+
const pressKey = (key, modifiers) => {
|
|
87
87
|
let keyCode;
|
|
88
88
|
if (typeof key === "string") {
|
|
89
89
|
if (key in KeyCodes) {
|
|
@@ -97,6 +97,15 @@ function createMockKeys(renderer) {
|
|
|
97
97
|
throw new Error(`Unknown key: ${key}`);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
+
if (modifiers) {
|
|
101
|
+
if (keyCode.startsWith("\x1B[") && keyCode.length > 2) {
|
|
102
|
+
const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.alt ? 2 : 0) + (modifiers.ctrl ? 4 : 0);
|
|
103
|
+
if (modifier > 1) {
|
|
104
|
+
const ending = keyCode.slice(-1);
|
|
105
|
+
keyCode = `\x1B[1;${modifier}${ending}`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
100
109
|
renderer.stdin.emit("data", Buffer.from(keyCode));
|
|
101
110
|
};
|
|
102
111
|
const typeText = async (text, delayMs = 0) => {
|
|
@@ -115,14 +124,14 @@ function createMockKeys(renderer) {
|
|
|
115
124
|
const pressBackspace = () => {
|
|
116
125
|
pressKey(KeyCodes.BACKSPACE);
|
|
117
126
|
};
|
|
118
|
-
const pressArrow = (direction) => {
|
|
127
|
+
const pressArrow = (direction, modifiers) => {
|
|
119
128
|
const keyMap = {
|
|
120
129
|
up: KeyCodes.ARROW_UP,
|
|
121
130
|
down: KeyCodes.ARROW_DOWN,
|
|
122
131
|
left: KeyCodes.ARROW_LEFT,
|
|
123
132
|
right: KeyCodes.ARROW_RIGHT
|
|
124
133
|
};
|
|
125
|
-
pressKey(keyMap[direction]);
|
|
134
|
+
pressKey(keyMap[direction], modifiers);
|
|
126
135
|
};
|
|
127
136
|
const pressCtrlC = () => {
|
|
128
137
|
pressKey(KeyCodes.CTRL_C);
|
|
@@ -364,5 +373,5 @@ export {
|
|
|
364
373
|
KeyCodes
|
|
365
374
|
};
|
|
366
375
|
|
|
367
|
-
//# debugId=
|
|
376
|
+
//# debugId=704FF4099B0B469E64756E2164756E21
|
|
368
377
|
//# 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 // ... add more as needed\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): 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 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 = (direction: \"up\" | \"down\" | \"left\" | \"right\"): 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])\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",
|
|
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 // ... add more as needed\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; alt?: 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.alt ? 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 }\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; alt?: 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;AAET;AAIO,SAAS,cAAc,CAAC,UAAuB;AAAA,EACpD,MAAM,YAAY,OAAO,MAAkB,UAAkB,MAAqB;AAAA,IAChF,WAAW,OAAO,MAAM;AAAA,MACtB,IAAI;AAAA,MACJ,IAAI,OAAO,QAAQ,UAAU;AAAA,QAE3B,IAAI,OAAO,UAAU;AAAA,UACnB,UAAU,SAAS;AAAA,QACrB,EAAO;AAAA,UACL,UAAU;AAAA;AAAA,MAEd,EAAO;AAAA,QAEL,UAAU,SAAS;AAAA,QACnB,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,IAAI,MAAM,gBAAgB,KAAK;AAAA,QACvC;AAAA;AAAA,MAGF,SAAS,MAAM,KAAK,QAAQ,OAAO,KAAK,OAAO,CAAC;AAAA,MAEhD,IAAI,UAAU,GAAG;AAAA,QACf,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA;AAAA,EAGF,MAAM,WAAW,CAAC,
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "704FF4099B0B469E64756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|