@opentui/core 0.0.0-20251010-2eed09fd → 0.0.0-20251026-8b7fde6b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/3d.js +140 -140
  2. package/3d.js.map +3 -3
  3. package/README.md +10 -0
  4. package/Renderable.d.ts +25 -24
  5. package/buffer.d.ts +4 -7
  6. package/edit-buffer.d.ts +77 -0
  7. package/editor-view.d.ts +55 -0
  8. package/{index-kqk5knmb.js → index-hgxcxzxa.js} +2557 -469
  9. package/index-hgxcxzxa.js.map +55 -0
  10. package/index.d.ts +4 -0
  11. package/index.js +3527 -2025
  12. package/index.js.map +19 -12
  13. package/lib/extmarks-history.d.ts +17 -0
  14. package/lib/extmarks.d.ts +80 -0
  15. package/lib/hast-styled-text.d.ts +2 -3
  16. package/lib/index.d.ts +1 -1
  17. package/lib/keymapping.d.ts +10 -0
  18. package/lib/objects-in-viewport.d.ts +14 -0
  19. package/lib/parse.keypress.d.ts +1 -1
  20. package/lib/tree-sitter/index.d.ts +0 -2
  21. package/lib/tree-sitter-styled-text.d.ts +1 -1
  22. package/lib/yoga.options.d.ts +6 -6
  23. package/package.json +9 -7
  24. package/renderables/Code.d.ts +1 -1
  25. package/renderables/EditBufferRenderable.d.ts +119 -0
  26. package/renderables/Text.d.ts +0 -3
  27. package/renderables/TextBufferRenderable.d.ts +8 -14
  28. package/renderables/TextNode.d.ts +2 -1
  29. package/renderables/Textarea.d.ts +95 -0
  30. package/renderables/index.d.ts +11 -9
  31. package/renderer.d.ts +6 -2
  32. package/{lib/syntax-style.d.ts → syntax-style.d.ts} +21 -5
  33. package/testing/mock-keys.d.ts +39 -2
  34. package/testing.js +54 -6
  35. package/testing.js.map +3 -3
  36. package/text-buffer-view.d.ts +31 -0
  37. package/text-buffer.d.ts +28 -21
  38. package/types.d.ts +10 -0
  39. package/zig-structs.d.ts +22 -0
  40. package/zig.d.ts +147 -23
  41. package/index-kqk5knmb.js.map +0 -52
  42. package/lib/word-jumps.d.ts +0 -2
@@ -52,17 +52,54 @@ 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";
82
+ readonly ALT_ENTER: "\u001B\r";
83
+ readonly ALT_RETURN: "\u001B\r";
55
84
  };
56
85
  export type KeyInput = string | keyof typeof KeyCodes;
57
86
  export declare function createMockKeys(renderer: CliRenderer): {
58
87
  pressKeys: (keys: KeyInput[], delayMs?: number) => Promise<void>;
59
- pressKey: (key: KeyInput) => void;
88
+ pressKey: (key: KeyInput, modifiers?: {
89
+ shift?: boolean;
90
+ ctrl?: boolean;
91
+ meta?: boolean;
92
+ }) => void;
60
93
  typeText: (text: string, delayMs?: number) => Promise<void>;
61
94
  pressEnter: () => void;
62
95
  pressEscape: () => void;
63
96
  pressTab: () => void;
64
97
  pressBackspace: () => void;
65
- pressArrow: (direction: "up" | "down" | "left" | "right") => void;
98
+ pressArrow: (direction: "up" | "down" | "left" | "right", modifiers?: {
99
+ shift?: boolean;
100
+ ctrl?: boolean;
101
+ meta?: boolean;
102
+ }) => void;
66
103
  pressCtrlC: () => void;
67
104
  pasteBracketedText: (text: string) => Promise<void>;
68
105
  };
package/testing.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  ANSI,
4
4
  CliRenderer,
5
5
  resolveRenderLib
6
- } from "./index-kqk5knmb.js";
6
+ } from "./index-hgxcxzxa.js";
7
7
 
8
8
  // src/testing/mock-keys.ts
9
9
  var KeyCodes = {
@@ -59,7 +59,36 @@ 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",
90
+ ALT_ENTER: "\x1B\r",
91
+ ALT_RETURN: "\x1B\r"
63
92
  };
64
93
  function createMockKeys(renderer) {
65
94
  const pressKeys = async (keys, delayMs = 0) => {
@@ -83,7 +112,7 @@ function createMockKeys(renderer) {
83
112
  }
84
113
  }
85
114
  };
86
- const pressKey = (key) => {
115
+ const pressKey = (key, modifiers) => {
87
116
  let keyCode;
88
117
  if (typeof key === "string") {
89
118
  if (key in KeyCodes) {
@@ -97,6 +126,25 @@ function createMockKeys(renderer) {
97
126
  throw new Error(`Unknown key: ${key}`);
98
127
  }
99
128
  }
129
+ if (modifiers) {
130
+ if (keyCode.startsWith("\x1B[") && keyCode.length > 2) {
131
+ const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.meta ? 2 : 0) + (modifiers.ctrl ? 4 : 0);
132
+ if (modifier > 1) {
133
+ const ending = keyCode.slice(-1);
134
+ keyCode = `\x1B[1;${modifier}${ending}`;
135
+ }
136
+ } else if (keyCode.length === 1 && !modifiers.ctrl) {
137
+ let char = keyCode;
138
+ if (modifiers.shift && char >= "a" && char <= "z") {
139
+ char = char.toUpperCase();
140
+ }
141
+ if (modifiers.meta) {
142
+ keyCode = `\x1B${char}`;
143
+ } else {
144
+ keyCode = char;
145
+ }
146
+ }
147
+ }
100
148
  renderer.stdin.emit("data", Buffer.from(keyCode));
101
149
  };
102
150
  const typeText = async (text, delayMs = 0) => {
@@ -115,14 +163,14 @@ function createMockKeys(renderer) {
115
163
  const pressBackspace = () => {
116
164
  pressKey(KeyCodes.BACKSPACE);
117
165
  };
118
- const pressArrow = (direction) => {
166
+ const pressArrow = (direction, modifiers) => {
119
167
  const keyMap = {
120
168
  up: KeyCodes.ARROW_UP,
121
169
  down: KeyCodes.ARROW_DOWN,
122
170
  left: KeyCodes.ARROW_LEFT,
123
171
  right: KeyCodes.ARROW_RIGHT
124
172
  };
125
- pressKey(keyMap[direction]);
173
+ pressKey(keyMap[direction], modifiers);
126
174
  };
127
175
  const pressCtrlC = () => {
128
176
  pressKey(KeyCodes.CTRL_C);
@@ -364,5 +412,5 @@ export {
364
412
  KeyCodes
365
413
  };
366
414
 
367
- //# debugId=6748818851F0715164756E2164756E21
415
+ //# debugId=4BC236939D47357864756E2164756E21
368
416
  //# 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 (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 ALT_ENTER: \"\\x1b\\r\",\n ALT_RETURN: \"\\x1b\\r\",\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": "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",
11
- "debugId": "6748818851F0715164756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "4BC236939D47357864756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -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,22 @@
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
+ }]], {}>;
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
@@ -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,24 @@ 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
+ }
30
+ export interface LogicalCursor {
31
+ row: number;
32
+ col: number;
33
+ offset: number;
34
+ }
17
35
  export interface RenderLib {
18
36
  createRenderer: (width: number, height: number, options?: {
19
37
  testing: boolean;
@@ -71,46 +89,152 @@ export interface RenderLib {
71
89
  createTextBuffer: (widthMethod: WidthMethod) => TextBuffer;
72
90
  destroyTextBuffer: (buffer: Pointer) => void;
73
91
  textBufferGetLength: (buffer: Pointer) => number;
92
+ textBufferGetByteSize: (buffer: Pointer) => number;
74
93
  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;
94
+ textBufferClear: (buffer: Pointer) => void;
95
+ textBufferRegisterMemBuffer: (buffer: Pointer, bytes: Uint8Array, owned?: boolean) => number;
96
+ textBufferReplaceMemBuffer: (buffer: Pointer, memId: number, bytes: Uint8Array, owned?: boolean) => boolean;
97
+ textBufferClearMemRegistry: (buffer: Pointer) => void;
98
+ textBufferSetTextFromMem: (buffer: Pointer, memId: number) => void;
99
+ textBufferLoadFile: (buffer: Pointer, path: string) => boolean;
100
+ textBufferSetStyledText: (buffer: Pointer, chunks: Array<{
101
+ text: string;
102
+ fg?: RGBA | null;
103
+ bg?: RGBA | null;
104
+ attributes?: number;
105
+ }>) => void;
79
106
  textBufferSetDefaultFg: (buffer: Pointer, fg: RGBA | null) => void;
80
107
  textBufferSetDefaultBg: (buffer: Pointer, bg: RGBA | null) => void;
81
108
  textBufferSetDefaultAttributes: (buffer: Pointer, attributes: number | null) => void;
82
109
  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
110
  textBufferGetLineCount: (buffer: Pointer) => number;
86
- textBufferGetLineInfoDirect: (buffer: Pointer, lineStartsPtr: Pointer, lineWidthsPtr: Pointer) => void;
87
- textBufferGetLineInfo: (buffer: Pointer) => LineInfo;
88
- textBufferGetSelection: (buffer: Pointer) => {
111
+ getPlainTextBytes: (buffer: Pointer, maxLength: number) => Uint8Array | null;
112
+ createTextBufferView: (textBuffer: Pointer) => Pointer;
113
+ destroyTextBufferView: (view: Pointer) => void;
114
+ textBufferViewSetSelection: (view: Pointer, start: number, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void;
115
+ textBufferViewResetSelection: (view: Pointer) => void;
116
+ textBufferViewGetSelection: (view: Pointer) => {
89
117
  start: number;
90
118
  end: number;
91
119
  } | null;
92
- getSelectedTextBytes: (buffer: Pointer, maxLength: number) => Uint8Array | null;
93
- getPlainTextBytes: (buffer: Pointer, maxLength: number) => Uint8Array | null;
120
+ textBufferViewSetLocalSelection: (view: Pointer, anchorX: number, anchorY: number, focusX: number, focusY: number, bgColor: RGBA | null, fgColor: RGBA | null) => boolean;
121
+ textBufferViewResetLocalSelection: (view: Pointer) => void;
122
+ textBufferViewSetWrapWidth: (view: Pointer, width: number) => void;
123
+ textBufferViewSetWrapMode: (view: Pointer, mode: "none" | "char" | "word") => void;
124
+ textBufferViewSetViewportSize: (view: Pointer, width: number, height: number) => void;
125
+ textBufferViewGetLineInfo: (view: Pointer) => LineInfo;
126
+ textBufferViewGetLogicalLineInfo: (view: Pointer) => LineInfo;
127
+ textBufferViewGetSelectedTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null;
128
+ textBufferViewGetPlainTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null;
94
129
  readonly encoder: TextEncoder;
95
130
  readonly decoder: TextDecoder;
96
- bufferDrawTextBuffer: (buffer: Pointer, textBuffer: Pointer, x: number, y: number, clipRect?: {
97
- x: number;
98
- y: number;
99
- width: number;
131
+ bufferDrawTextBufferView: (buffer: Pointer, view: Pointer, x: number, y: number) => void;
132
+ bufferDrawEditorView: (buffer: Pointer, view: Pointer, x: number, y: number) => void;
133
+ createEditBuffer: (widthMethod: WidthMethod) => Pointer;
134
+ destroyEditBuffer: (buffer: Pointer) => void;
135
+ editBufferSetText: (buffer: Pointer, textBytes: Uint8Array, retainHistory?: boolean) => void;
136
+ editBufferSetTextFromMem: (buffer: Pointer, memId: number, retainHistory?: boolean) => void;
137
+ editBufferGetText: (buffer: Pointer, maxLength: number) => Uint8Array | null;
138
+ editBufferInsertChar: (buffer: Pointer, char: string) => void;
139
+ editBufferInsertText: (buffer: Pointer, text: string) => void;
140
+ editBufferDeleteChar: (buffer: Pointer) => void;
141
+ editBufferDeleteCharBackward: (buffer: Pointer) => void;
142
+ editBufferDeleteRange: (buffer: Pointer, startLine: number, startCol: number, endLine: number, endCol: number) => void;
143
+ editBufferNewLine: (buffer: Pointer) => void;
144
+ editBufferDeleteLine: (buffer: Pointer) => void;
145
+ editBufferMoveCursorLeft: (buffer: Pointer) => void;
146
+ editBufferMoveCursorRight: (buffer: Pointer) => void;
147
+ editBufferMoveCursorUp: (buffer: Pointer) => void;
148
+ editBufferMoveCursorDown: (buffer: Pointer) => void;
149
+ editBufferGotoLine: (buffer: Pointer, line: number) => void;
150
+ editBufferSetCursor: (buffer: Pointer, line: number, col: number) => void;
151
+ editBufferSetCursorToLineCol: (buffer: Pointer, line: number, col: number) => void;
152
+ editBufferSetCursorByOffset: (buffer: Pointer, offset: number) => void;
153
+ editBufferGetCursorPosition: (buffer: Pointer) => LogicalCursor;
154
+ editBufferGetId: (buffer: Pointer) => number;
155
+ editBufferGetTextBuffer: (buffer: Pointer) => Pointer;
156
+ editBufferDebugLogRope: (buffer: Pointer) => void;
157
+ editBufferUndo: (buffer: Pointer, maxLength: number) => Uint8Array | null;
158
+ editBufferRedo: (buffer: Pointer, maxLength: number) => Uint8Array | null;
159
+ editBufferCanUndo: (buffer: Pointer) => boolean;
160
+ editBufferCanRedo: (buffer: Pointer) => boolean;
161
+ editBufferClearHistory: (buffer: Pointer) => void;
162
+ editBufferSetPlaceholder: (buffer: Pointer, text: string | null) => void;
163
+ editBufferSetPlaceholderColor: (buffer: Pointer, color: RGBA) => void;
164
+ editBufferClear: (buffer: Pointer) => void;
165
+ editBufferGetNextWordBoundary: (buffer: Pointer) => {
166
+ row: number;
167
+ col: number;
168
+ offset: number;
169
+ };
170
+ editBufferGetPrevWordBoundary: (buffer: Pointer) => {
171
+ row: number;
172
+ col: number;
173
+ offset: number;
174
+ };
175
+ editBufferGetEOL: (buffer: Pointer) => {
176
+ row: number;
177
+ col: number;
178
+ offset: number;
179
+ };
180
+ createEditorView: (editBufferPtr: Pointer, viewportWidth: number, viewportHeight: number) => Pointer;
181
+ destroyEditorView: (view: Pointer) => void;
182
+ editorViewSetViewportSize: (view: Pointer, width: number, height: number) => void;
183
+ editorViewGetViewport: (view: Pointer) => {
184
+ offsetY: number;
185
+ offsetX: number;
100
186
  height: number;
101
- }) => void;
187
+ width: number;
188
+ };
189
+ editorViewSetScrollMargin: (view: Pointer, margin: number) => void;
190
+ editorViewSetWrapMode: (view: Pointer, mode: "none" | "char" | "word") => void;
191
+ editorViewGetVirtualLineCount: (view: Pointer) => number;
192
+ editorViewGetTotalVirtualLineCount: (view: Pointer) => number;
193
+ editorViewGetTextBufferView: (view: Pointer) => Pointer;
194
+ editorViewSetSelection: (view: Pointer, start: number, end: number, bgColor: RGBA | null, fgColor: RGBA | null) => void;
195
+ editorViewResetSelection: (view: Pointer) => void;
196
+ editorViewGetSelection: (view: Pointer) => {
197
+ start: number;
198
+ end: number;
199
+ } | null;
200
+ editorViewSetLocalSelection: (view: Pointer, anchorX: number, anchorY: number, focusX: number, focusY: number, bgColor: RGBA | null, fgColor: RGBA | null) => boolean;
201
+ editorViewResetLocalSelection: (view: Pointer) => void;
202
+ editorViewGetSelectedTextBytes: (view: Pointer, maxLength: number) => Uint8Array | null;
203
+ editorViewGetCursor: (view: Pointer) => {
204
+ row: number;
205
+ col: number;
206
+ };
207
+ editorViewGetText: (view: Pointer, maxLength: number) => Uint8Array | null;
208
+ editorViewGetVisualCursor: (view: Pointer) => VisualCursor;
209
+ editorViewMoveUpVisual: (view: Pointer) => void;
210
+ editorViewMoveDownVisual: (view: Pointer) => void;
211
+ editorViewDeleteSelectedText: (view: Pointer) => void;
212
+ editorViewSetCursorByOffset: (view: Pointer, offset: number) => void;
213
+ editorViewGetNextWordBoundary: (view: Pointer) => VisualCursor;
214
+ editorViewGetPrevWordBoundary: (view: Pointer) => VisualCursor;
215
+ editorViewGetEOL: (view: Pointer) => VisualCursor;
102
216
  bufferPushScissorRect: (buffer: Pointer, x: number, y: number, width: number, height: number) => void;
103
217
  bufferPopScissorRect: (buffer: Pointer) => void;
104
218
  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;
219
+ textBufferAddHighlightByCharRange: (buffer: Pointer, highlight: Highlight) => void;
220
+ textBufferAddHighlight: (buffer: Pointer, lineIdx: number, highlight: Highlight) => void;
221
+ textBufferRemoveHighlightsByRef: (buffer: Pointer, hlRef: number) => void;
222
+ textBufferClearLineHighlights: (buffer: Pointer, lineIdx: number) => void;
223
+ textBufferClearAllHighlights: (buffer: Pointer) => void;
224
+ textBufferSetSyntaxStyle: (buffer: Pointer, style: Pointer | null) => void;
225
+ textBufferGetLineHighlights: (buffer: Pointer, lineIdx: number) => Array<Highlight>;
111
226
  getArenaAllocatedBytes: () => number;
227
+ createSyntaxStyle: () => Pointer;
228
+ destroySyntaxStyle: (style: Pointer) => void;
229
+ syntaxStyleRegister: (style: Pointer, name: string, fg: RGBA | null, bg: RGBA | null, attributes: number) => number;
230
+ syntaxStyleResolveByName: (style: Pointer, name: string) => number | null;
231
+ syntaxStyleGetStyleCount: (style: Pointer) => number;
112
232
  getTerminalCapabilities: (renderer: Pointer) => any;
113
233
  processCapabilityResponse: (renderer: Pointer, response: string) => void;
234
+ onNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void;
235
+ onceNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void;
236
+ offNativeEvent: (name: string, handler: (data: ArrayBuffer) => void) => void;
237
+ onAnyNativeEvent: (handler: (name: string, data: ArrayBuffer) => void) => void;
114
238
  }
115
239
  export declare function setRenderLibPath(libPath: string): void;
116
240
  export declare function resolveRenderLib(): RenderLib;