@opentui/core 0.1.27 → 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.
@@ -0,0 +1,31 @@
1
+ import { RGBA } from "./lib/RGBA";
2
+ import { type LineInfo, type RenderLib } from "./zig";
3
+ import { type Pointer } from "bun:ffi";
4
+ import type { TextBuffer } from "./text-buffer";
5
+ export declare class TextBufferView {
6
+ private lib;
7
+ private viewPtr;
8
+ private textBuffer;
9
+ private _destroyed;
10
+ constructor(lib: RenderLib, ptr: Pointer, textBuffer: TextBuffer);
11
+ static create(textBuffer: TextBuffer): TextBufferView;
12
+ private guard;
13
+ get ptr(): Pointer;
14
+ setSelection(start: number, end: number, bgColor?: RGBA, fgColor?: RGBA): void;
15
+ resetSelection(): void;
16
+ getSelection(): {
17
+ start: number;
18
+ end: number;
19
+ } | null;
20
+ hasSelection(): boolean;
21
+ setLocalSelection(anchorX: number, anchorY: number, focusX: number, focusY: number, bgColor?: RGBA, fgColor?: RGBA): boolean;
22
+ resetLocalSelection(): void;
23
+ setWrapWidth(width: number | null): void;
24
+ setWrapMode(mode: "none" | "char" | "word"): void;
25
+ setViewportSize(width: number, height: number): void;
26
+ get lineInfo(): LineInfo;
27
+ get logicalLineInfo(): LineInfo;
28
+ getSelectedText(): string;
29
+ getPlainText(): string;
30
+ destroy(): void;
31
+ }
package/text-buffer.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import type { StyledText } from "./lib/styled-text";
2
2
  import { RGBA } from "./lib/RGBA";
3
- import { type LineInfo, type RenderLib } from "./zig";
3
+ import { type RenderLib } from "./zig";
4
4
  import { type Pointer } from "bun:ffi";
5
- import { type WidthMethod } from "./types";
5
+ import { type WidthMethod, type Highlight } from "./types";
6
+ import type { SyntaxStyle } from "./syntax-style";
6
7
  export interface TextChunk {
7
8
  __isChunk: true;
8
9
  text: string;
@@ -14,37 +15,43 @@ export declare class TextBuffer {
14
15
  private lib;
15
16
  private bufferPtr;
16
17
  private _length;
18
+ private _byteSize;
17
19
  private _lineInfo?;
18
20
  private _destroyed;
21
+ private _syntaxStyle?;
22
+ private _textBytes?;
23
+ private _memId?;
19
24
  constructor(lib: RenderLib, ptr: Pointer);
20
25
  static create(widthMethod: WidthMethod): TextBuffer;
21
26
  private guard;
27
+ setText(text: string): void;
28
+ loadFile(path: string): void;
22
29
  setStyledText(text: StyledText): void;
23
30
  setDefaultFg(fg: RGBA | null): void;
24
31
  setDefaultBg(bg: RGBA | null): void;
25
32
  setDefaultAttributes(attributes: number | null): void;
26
33
  resetDefaults(): void;
27
34
  get length(): number;
35
+ get byteSize(): number;
28
36
  get ptr(): Pointer;
29
- getSelectedText(): string;
30
37
  getPlainText(): string;
31
- get lineInfo(): LineInfo;
32
- setSelection(start: number, end: number, bgColor?: RGBA, fgColor?: RGBA): void;
33
- resetSelection(): void;
34
- setLocalSelection(anchorX: number, anchorY: number, focusX: number, focusY: number, bgColor?: RGBA, fgColor?: RGBA): boolean;
35
- resetLocalSelection(): void;
36
- getSelection(): {
37
- start: number;
38
- end: number;
39
- } | null;
40
- hasSelection(): boolean;
41
- insertChunkGroup(index: number, text: string, fg?: RGBA, bg?: RGBA, attributes?: number): void;
42
- insertEncodedChunkGroup(index: number, textBytes: Uint8Array, fg?: RGBA, bg?: RGBA, attributes?: number): void;
43
- removeChunkGroup(index: number): void;
44
- replaceChunkGroup(index: number, text: string, fg?: RGBA, bg?: RGBA, attributes?: number): void;
45
- replaceEncodedChunkGroup(index: number, textBytes: Uint8Array, fg?: RGBA, bg?: RGBA, attributes?: number): void;
46
- get chunkGroupCount(): number;
47
- setWrapWidth(width: number | null): void;
48
- setWrapMode(mode: "char" | "word"): void;
38
+ /**
39
+ * Add a highlight using character offsets into the full text.
40
+ * start/end in highlight represent absolute character positions.
41
+ */
42
+ addHighlightByCharRange(highlight: Highlight): void;
43
+ /**
44
+ * Add a highlight to a specific line by column positions.
45
+ * start/end in highlight represent column offsets.
46
+ */
47
+ addHighlight(lineIdx: number, highlight: Highlight): void;
48
+ removeHighlightsByRef(hlRef: number): void;
49
+ clearLineHighlights(lineIdx: number): void;
50
+ clearAllHighlights(): void;
51
+ getLineHighlights(lineIdx: number): Array<Highlight>;
52
+ setSyntaxStyle(style: SyntaxStyle | null): void;
53
+ getSyntaxStyle(): SyntaxStyle | null;
54
+ clear(): void;
55
+ reset(): void;
49
56
  destroy(): void;
50
57
  }
package/types.d.ts CHANGED
@@ -55,6 +55,9 @@ export interface RenderContext extends EventEmitter {
55
55
  getLifecyclePasses: () => Set<Renderable>;
56
56
  keyInput: KeyHandler;
57
57
  _internalKeyInput: InternalKeyHandler;
58
+ clearSelection: () => void;
59
+ startSelection: (renderable: Renderable, x: number, y: number) => void;
60
+ updateSelection: (currentRenderable: Renderable | undefined, x: number, y: number) => void;
58
61
  }
59
62
  export type Timeout = ReturnType<typeof setTimeout> | undefined;
60
63
  export interface ViewportBounds {
@@ -63,3 +66,10 @@ export interface ViewportBounds {
63
66
  width: number;
64
67
  height: number;
65
68
  }
69
+ export interface Highlight {
70
+ start: number;
71
+ end: number;
72
+ styleId: number;
73
+ priority?: number | null;
74
+ hlRef?: number | null;
75
+ }
@@ -0,0 +1,20 @@
1
+ import { type Pointer } from "bun:ffi";
2
+ import { RGBA } from "./lib/RGBA";
3
+ export declare const StyledChunkStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["text", "char*"], readonly ["text_len", "u64", {
4
+ readonly lengthOf: "text";
5
+ }], readonly ["fg", "pointer", {
6
+ readonly optional: true;
7
+ readonly packTransform: (rgba?: RGBA) => Pointer | null;
8
+ readonly unpackTransform: (ptr?: Pointer) => RGBA | undefined;
9
+ }], readonly ["bg", "pointer", {
10
+ readonly optional: true;
11
+ readonly packTransform: (rgba?: RGBA) => Pointer | null;
12
+ readonly unpackTransform: (ptr?: Pointer) => RGBA | undefined;
13
+ }], readonly ["attributes", "u8", {
14
+ readonly optional: true;
15
+ }]], {}>;
16
+ export declare const HighlightStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["start", "u32"], readonly ["end", "u32"], readonly ["styleId", "u32"], readonly ["priority", "u8", {
17
+ readonly default: 0;
18
+ }], readonly ["hlRef", "u16", {
19
+ readonly default: 0;
20
+ }]], {}>;
package/zig.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type Pointer } from "bun:ffi";
2
- import { type CursorStyle, type DebugOverlayCorner, type WidthMethod } from "./types";
2
+ import { type CursorStyle, type DebugOverlayCorner, type WidthMethod, type Highlight } from "./types";
3
3
  import { RGBA } from "./lib/RGBA";
4
4
  import { OptimizedBuffer } from "./buffer";
5
5
  import { TextBuffer } from "./text-buffer";
@@ -14,6 +14,19 @@ export interface LineInfo {
14
14
  lineWidths: number[];
15
15
  maxLineWidth: number;
16
16
  }
17
+ /**
18
+ * VisualCursor represents a cursor position with both visual and logical coordinates.
19
+ * Visual coordinates (visualRow, visualCol) are VIEWPORT-RELATIVE.
20
+ * This means visualRow=0 is the first visible line in the viewport, not the first line in the document.
21
+ * Logical coordinates (logicalRow, logicalCol) are document-absolute.
22
+ */
23
+ export interface VisualCursor {
24
+ visualRow: number;
25
+ visualCol: number;
26
+ logicalRow: number;
27
+ logicalCol: number;
28
+ offset: number;
29
+ }
17
30
  export interface RenderLib {
18
31
  createRenderer: (width: number, height: number, options?: {
19
32
  testing: boolean;
@@ -71,46 +84,136 @@ export interface RenderLib {
71
84
  createTextBuffer: (widthMethod: WidthMethod) => TextBuffer;
72
85
  destroyTextBuffer: (buffer: Pointer) => void;
73
86
  textBufferGetLength: (buffer: Pointer) => number;
87
+ textBufferGetByteSize: (buffer: Pointer) => number;
74
88
  textBufferReset: (buffer: Pointer) => void;
75
- textBufferSetSelection: (buffer: Pointer, start: number, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void;
76
- textBufferResetSelection: (buffer: Pointer) => void;
77
- textBufferSetLocalSelection: (buffer: Pointer, anchorX: number, anchorY: number, focusX: number, focusY: number, bgColor: RGBA | null, fgColor: RGBA | null) => boolean;
78
- textBufferResetLocalSelection: (buffer: Pointer) => void;
89
+ textBufferClear: (buffer: Pointer) => void;
90
+ textBufferRegisterMemBuffer: (buffer: Pointer, bytes: Uint8Array, owned?: boolean) => number;
91
+ textBufferReplaceMemBuffer: (buffer: Pointer, memId: number, bytes: Uint8Array, owned?: boolean) => boolean;
92
+ textBufferClearMemRegistry: (buffer: Pointer) => void;
93
+ textBufferSetTextFromMem: (buffer: Pointer, memId: number) => void;
94
+ textBufferLoadFile: (buffer: Pointer, path: string) => boolean;
95
+ textBufferSetStyledText: (buffer: Pointer, chunks: Array<{
96
+ text: string;
97
+ fg?: RGBA | null;
98
+ bg?: RGBA | null;
99
+ attributes?: number;
100
+ }>) => void;
79
101
  textBufferSetDefaultFg: (buffer: Pointer, fg: RGBA | null) => void;
80
102
  textBufferSetDefaultBg: (buffer: Pointer, bg: RGBA | null) => void;
81
103
  textBufferSetDefaultAttributes: (buffer: Pointer, attributes: number | null) => void;
82
104
  textBufferResetDefaults: (buffer: Pointer) => void;
83
- textBufferWriteChunk: (buffer: Pointer, textBytes: Uint8Array, fg: RGBA | null, bg: RGBA | null, attributes: number | null) => number;
84
- textBufferFinalizeLineInfo: (buffer: Pointer) => void;
85
105
  textBufferGetLineCount: (buffer: Pointer) => number;
86
- textBufferGetLineInfoDirect: (buffer: Pointer, lineStartsPtr: Pointer, lineWidthsPtr: Pointer) => void;
87
- textBufferGetLineInfo: (buffer: Pointer) => LineInfo;
88
- textBufferGetSelection: (buffer: Pointer) => {
106
+ getPlainTextBytes: (buffer: Pointer, maxLength: number) => Uint8Array | null;
107
+ createTextBufferView: (textBuffer: Pointer) => Pointer;
108
+ destroyTextBufferView: (view: Pointer) => void;
109
+ textBufferViewSetSelection: (view: Pointer, start: number, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void;
110
+ textBufferViewResetSelection: (view: Pointer) => void;
111
+ textBufferViewGetSelection: (view: Pointer) => {
89
112
  start: number;
90
113
  end: number;
91
114
  } | null;
92
- getSelectedTextBytes: (buffer: Pointer, maxLength: number) => Uint8Array | null;
93
- getPlainTextBytes: (buffer: Pointer, maxLength: number) => Uint8Array | null;
115
+ textBufferViewSetLocalSelection: (view: Pointer, anchorX: number, anchorY: number, focusX: number, focusY: number, bgColor: RGBA | null, fgColor: RGBA | null) => boolean;
116
+ textBufferViewResetLocalSelection: (view: Pointer) => void;
117
+ textBufferViewSetWrapWidth: (view: Pointer, width: number) => void;
118
+ textBufferViewSetWrapMode: (view: Pointer, mode: "none" | "char" | "word") => void;
119
+ textBufferViewSetViewportSize: (view: Pointer, width: number, height: number) => void;
120
+ textBufferViewGetLineInfo: (view: Pointer) => LineInfo;
121
+ textBufferViewGetLogicalLineInfo: (view: Pointer) => LineInfo;
122
+ textBufferViewGetSelectedTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null;
123
+ textBufferViewGetPlainTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null;
94
124
  readonly encoder: TextEncoder;
95
125
  readonly decoder: TextDecoder;
96
- bufferDrawTextBuffer: (buffer: Pointer, textBuffer: Pointer, x: number, y: number, clipRect?: {
97
- x: number;
98
- y: number;
99
- width: number;
126
+ bufferDrawTextBufferView: (buffer: Pointer, view: Pointer, x: number, y: number) => void;
127
+ bufferDrawEditorView: (buffer: Pointer, view: Pointer, x: number, y: number) => void;
128
+ createEditBuffer: (widthMethod: WidthMethod) => Pointer;
129
+ destroyEditBuffer: (buffer: Pointer) => void;
130
+ editBufferSetText: (buffer: Pointer, textBytes: Uint8Array, retainHistory?: boolean) => void;
131
+ editBufferSetTextFromMem: (buffer: Pointer, memId: number, retainHistory?: boolean) => void;
132
+ editBufferGetText: (buffer: Pointer, maxLength: number) => Uint8Array | null;
133
+ editBufferInsertChar: (buffer: Pointer, char: string) => void;
134
+ editBufferInsertText: (buffer: Pointer, text: string) => void;
135
+ editBufferDeleteChar: (buffer: Pointer) => void;
136
+ editBufferDeleteCharBackward: (buffer: Pointer) => void;
137
+ editBufferNewLine: (buffer: Pointer) => void;
138
+ editBufferDeleteLine: (buffer: Pointer) => void;
139
+ editBufferMoveCursorLeft: (buffer: Pointer) => void;
140
+ editBufferMoveCursorRight: (buffer: Pointer) => void;
141
+ editBufferMoveCursorUp: (buffer: Pointer) => void;
142
+ editBufferMoveCursorDown: (buffer: Pointer) => void;
143
+ editBufferGotoLine: (buffer: Pointer, line: number) => void;
144
+ editBufferSetCursor: (buffer: Pointer, line: number, col: number) => void;
145
+ editBufferSetCursorToLineCol: (buffer: Pointer, line: number, col: number) => void;
146
+ editBufferSetCursorByOffset: (buffer: Pointer, offset: number) => void;
147
+ editBufferGetCursorPosition: (buffer: Pointer) => {
148
+ line: number;
149
+ visualColumn: number;
150
+ offset: number;
151
+ };
152
+ editBufferGetId: (buffer: Pointer) => number;
153
+ editBufferGetTextBuffer: (buffer: Pointer) => Pointer;
154
+ editBufferDebugLogRope: (buffer: Pointer) => void;
155
+ editBufferUndo: (buffer: Pointer, maxLength: number) => Uint8Array | null;
156
+ editBufferRedo: (buffer: Pointer, maxLength: number) => Uint8Array | null;
157
+ editBufferCanUndo: (buffer: Pointer) => boolean;
158
+ editBufferCanRedo: (buffer: Pointer) => boolean;
159
+ editBufferClearHistory: (buffer: Pointer) => void;
160
+ editBufferSetPlaceholder: (buffer: Pointer, text: string | null) => void;
161
+ editBufferSetPlaceholderColor: (buffer: Pointer, color: RGBA) => void;
162
+ createEditorView: (editBufferPtr: Pointer, viewportWidth: number, viewportHeight: number) => Pointer;
163
+ destroyEditorView: (view: Pointer) => void;
164
+ editorViewSetViewportSize: (view: Pointer, width: number, height: number) => void;
165
+ editorViewGetViewport: (view: Pointer) => {
166
+ offsetY: number;
167
+ offsetX: number;
100
168
  height: number;
101
- }) => void;
169
+ width: number;
170
+ };
171
+ editorViewSetScrollMargin: (view: Pointer, margin: number) => void;
172
+ editorViewSetWrapMode: (view: Pointer, mode: "none" | "char" | "word") => void;
173
+ editorViewGetVirtualLineCount: (view: Pointer) => number;
174
+ editorViewGetTotalVirtualLineCount: (view: Pointer) => number;
175
+ editorViewGetTextBufferView: (view: Pointer) => Pointer;
176
+ editorViewSetSelection: (view: Pointer, start: number, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void;
177
+ editorViewResetSelection: (view: Pointer) => void;
178
+ editorViewGetSelection: (view: Pointer) => {
179
+ start: number;
180
+ end: number;
181
+ } | null;
182
+ editorViewSetLocalSelection: (view: Pointer, anchorX: number, anchorY: number, focusX: number, focusY: number, bgColor: RGBA | null, fgColor: RGBA | null) => boolean;
183
+ editorViewResetLocalSelection: (view: Pointer) => void;
184
+ editorViewGetSelectedTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null;
185
+ editorViewGetCursor: (view: Pointer) => {
186
+ row: number;
187
+ col: number;
188
+ };
189
+ editorViewGetText: (view: Pointer, maxLength: number) => Uint8Array | null;
190
+ editorViewGetVisualCursor: (view: Pointer) => VisualCursor;
191
+ editorViewMoveUpVisual: (view: Pointer) => void;
192
+ editorViewMoveDownVisual: (view: Pointer) => void;
193
+ editorViewDeleteSelectedText: (view: Pointer) => void;
194
+ editorViewSetCursorByOffset: (view: Pointer, offset: number) => void;
102
195
  bufferPushScissorRect: (buffer: Pointer, x: number, y: number, width: number, height: number) => void;
103
196
  bufferPopScissorRect: (buffer: Pointer) => void;
104
197
  bufferClearScissorRects: (buffer: Pointer) => void;
105
- textBufferInsertChunkGroup: (buffer: Pointer, index: number, textBytes: Uint8Array, fg: RGBA | null, bg: RGBA | null, attributes: number | null) => number;
106
- textBufferRemoveChunkGroup: (buffer: Pointer, index: number) => number;
107
- textBufferReplaceChunkGroup: (buffer: Pointer, index: number, textBytes: Uint8Array, fg: RGBA | null, bg: RGBA | null, attributes: number | null) => number;
108
- textBufferGetChunkGroupCount: (buffer: Pointer) => number;
109
- textBufferSetWrapWidth: (buffer: Pointer, width: number) => void;
110
- textBufferSetWrapMode: (buffer: Pointer, mode: "char" | "word") => void;
198
+ textBufferAddHighlightByCharRange: (buffer: Pointer, highlight: Highlight) => void;
199
+ textBufferAddHighlight: (buffer: Pointer, lineIdx: number, highlight: Highlight) => void;
200
+ textBufferRemoveHighlightsByRef: (buffer: Pointer, hlRef: number) => void;
201
+ textBufferClearLineHighlights: (buffer: Pointer, lineIdx: number) => void;
202
+ textBufferClearAllHighlights: (buffer: Pointer) => void;
203
+ textBufferSetSyntaxStyle: (buffer: Pointer, style: Pointer | null) => void;
204
+ textBufferGetLineHighlights: (buffer: Pointer, lineIdx: number) => Array<Highlight>;
111
205
  getArenaAllocatedBytes: () => number;
206
+ createSyntaxStyle: () => Pointer;
207
+ destroySyntaxStyle: (style: Pointer) => void;
208
+ syntaxStyleRegister: (style: Pointer, name: string, fg: RGBA | null, bg: RGBA | null, attributes: number) => number;
209
+ syntaxStyleResolveByName: (style: Pointer, name: string) => number | null;
210
+ syntaxStyleGetStyleCount: (style: Pointer) => number;
112
211
  getTerminalCapabilities: (renderer: Pointer) => any;
113
212
  processCapabilityResponse: (renderer: Pointer, response: string) => void;
213
+ onNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void;
214
+ onceNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void;
215
+ offNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void;
216
+ onAnyNativeEvent: (handler: (name: string, data: ArrayBuffer) => void) => void;
114
217
  }
115
218
  export declare function setRenderLibPath(libPath: string): void;
116
219
  export declare function resolveRenderLib(): RenderLib;
@@ -1,2 +0,0 @@
1
- export declare function nextWordEndCrossLines(text: string, caret: number): number;
2
- export declare function previousWordStartCrossLines(text: string, caret: number): number;