@opentui/core 0.0.0-20250924-d06b64fa → 0.0.0-20250926-77b41db5
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/Renderable.d.ts +7 -7
- package/{index-6kvgbzah.js → index-tg3c4jgq.js} +118 -16
- package/{index-6kvgbzah.js.map → index-tg3c4jgq.js.map} +8 -8
- package/index.js +8 -2
- package/index.js.map +7 -7
- package/lib/KeyHandler.d.ts +51 -12
- package/lib/parse.keypress.d.ts +2 -2
- package/package.json +7 -7
- package/renderables/Input.d.ts +2 -2
- package/renderables/ScrollBar.d.ts +2 -2
- package/renderables/ScrollBox.d.ts +2 -2
- package/renderables/Select.d.ts +2 -2
- package/renderables/TabSelect.d.ts +2 -2
- package/renderer.d.ts +2 -1
- package/testing.js +1 -1
- package/types.d.ts +2 -1
package/3d.js
CHANGED
package/Renderable.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from "events";
|
|
2
2
|
import { type Node as YogaNode } from "yoga-layout";
|
|
3
3
|
import { OptimizedBuffer } from "./buffer";
|
|
4
|
-
import type {
|
|
4
|
+
import type { KeyEvent, PasteEvent } from "./lib/KeyHandler";
|
|
5
5
|
import type { Selection } from "./lib/selection";
|
|
6
6
|
import { type AlignString, type FlexDirectionString, type JustifyString, type OverflowString, type PositionTypeString, type WrapString } from "./lib/yoga.options";
|
|
7
7
|
import { type VNode } from "./renderables/composition/vnode";
|
|
@@ -78,7 +78,7 @@ export interface RenderableOptions<T extends BaseRenderable = BaseRenderable> ex
|
|
|
78
78
|
onMouseOut?: (this: T, event: MouseEvent) => void;
|
|
79
79
|
onMouseScroll?: (this: T, event: MouseEvent) => void;
|
|
80
80
|
onPaste?: (this: T, text: string) => void;
|
|
81
|
-
onKeyDown?: (key:
|
|
81
|
+
onKeyDown?: (key: KeyEvent) => void;
|
|
82
82
|
onSizeChange?: (this: T) => void;
|
|
83
83
|
}
|
|
84
84
|
export declare function isRenderable(obj: any): obj is Renderable;
|
|
@@ -126,8 +126,8 @@ export declare abstract class Renderable extends BaseRenderable {
|
|
|
126
126
|
protected frameBuffer: OptimizedBuffer | null;
|
|
127
127
|
protected _focusable: boolean;
|
|
128
128
|
protected _focused: boolean;
|
|
129
|
-
protected keypressHandler: ((key:
|
|
130
|
-
protected pasteHandler: ((
|
|
129
|
+
protected keypressHandler: ((key: KeyEvent) => void) | null;
|
|
130
|
+
protected pasteHandler: ((event: PasteEvent) => void) | null;
|
|
131
131
|
private _live;
|
|
132
132
|
protected _liveCount: number;
|
|
133
133
|
private _sizeChangeListener;
|
|
@@ -169,7 +169,7 @@ export declare abstract class Renderable extends BaseRenderable {
|
|
|
169
169
|
get liveCount(): number;
|
|
170
170
|
set live(value: boolean);
|
|
171
171
|
protected propagateLiveCount(delta: number): void;
|
|
172
|
-
handleKeyPress?(key:
|
|
172
|
+
handleKeyPress?(key: KeyEvent | string): boolean;
|
|
173
173
|
handlePaste?(text: string): void;
|
|
174
174
|
findDescendantById(id: string): Renderable | undefined;
|
|
175
175
|
requestRender(): void;
|
|
@@ -276,8 +276,8 @@ export declare abstract class Renderable extends BaseRenderable {
|
|
|
276
276
|
set onMouseScroll(handler: ((event: MouseEvent) => void) | undefined);
|
|
277
277
|
set onPaste(handler: ((text: string) => void) | undefined);
|
|
278
278
|
get onPaste(): ((text: string) => void) | undefined;
|
|
279
|
-
set onKeyDown(handler: ((key:
|
|
280
|
-
get onKeyDown(): ((key:
|
|
279
|
+
set onKeyDown(handler: ((key: KeyEvent) => void) | undefined);
|
|
280
|
+
get onKeyDown(): ((key: KeyEvent) => void) | undefined;
|
|
281
281
|
set onSizeChange(handler: (() => void) | undefined);
|
|
282
282
|
get onSizeChange(): (() => void) | undefined;
|
|
283
283
|
private applyEventOptions;
|
|
@@ -2143,6 +2143,10 @@ var parseKeypress = (s = "", options = {}) => {
|
|
|
2143
2143
|
key.meta = true;
|
|
2144
2144
|
key.shift = /^[A-Z]$/.test(parts[1]);
|
|
2145
2145
|
key.name = parts[1];
|
|
2146
|
+
} else if (s.length === 2 && s[0] === "\x1B" && s[1] <= "\x1A") {
|
|
2147
|
+
key.meta = true;
|
|
2148
|
+
key.ctrl = true;
|
|
2149
|
+
key.name = String.fromCharCode(s.charCodeAt(1) + 97 - 1);
|
|
2146
2150
|
} else if (parts = fnKeyRe.exec(s)) {
|
|
2147
2151
|
const segs = [...s];
|
|
2148
2152
|
if (segs[0] === "\x1B" && segs[1] === "\x1B") {
|
|
@@ -2191,6 +2195,62 @@ var ANSI = {
|
|
|
2191
2195
|
};
|
|
2192
2196
|
|
|
2193
2197
|
// src/lib/KeyHandler.ts
|
|
2198
|
+
class KeyEvent {
|
|
2199
|
+
name;
|
|
2200
|
+
ctrl;
|
|
2201
|
+
meta;
|
|
2202
|
+
shift;
|
|
2203
|
+
option;
|
|
2204
|
+
sequence;
|
|
2205
|
+
number;
|
|
2206
|
+
raw;
|
|
2207
|
+
eventType;
|
|
2208
|
+
code;
|
|
2209
|
+
super;
|
|
2210
|
+
hyper;
|
|
2211
|
+
capsLock;
|
|
2212
|
+
numLock;
|
|
2213
|
+
baseCode;
|
|
2214
|
+
_defaultPrevented = false;
|
|
2215
|
+
constructor(key) {
|
|
2216
|
+
this.name = key.name;
|
|
2217
|
+
this.ctrl = key.ctrl;
|
|
2218
|
+
this.meta = key.meta;
|
|
2219
|
+
this.shift = key.shift;
|
|
2220
|
+
this.option = key.option;
|
|
2221
|
+
this.sequence = key.sequence;
|
|
2222
|
+
this.number = key.number;
|
|
2223
|
+
this.raw = key.raw;
|
|
2224
|
+
this.eventType = key.eventType;
|
|
2225
|
+
this.code = key.code;
|
|
2226
|
+
this.super = key.super;
|
|
2227
|
+
this.hyper = key.hyper;
|
|
2228
|
+
this.capsLock = key.capsLock;
|
|
2229
|
+
this.numLock = key.numLock;
|
|
2230
|
+
this.baseCode = key.baseCode;
|
|
2231
|
+
}
|
|
2232
|
+
get defaultPrevented() {
|
|
2233
|
+
return this._defaultPrevented;
|
|
2234
|
+
}
|
|
2235
|
+
preventDefault() {
|
|
2236
|
+
this._defaultPrevented = true;
|
|
2237
|
+
}
|
|
2238
|
+
}
|
|
2239
|
+
|
|
2240
|
+
class PasteEvent {
|
|
2241
|
+
text;
|
|
2242
|
+
_defaultPrevented = false;
|
|
2243
|
+
constructor(text) {
|
|
2244
|
+
this.text = text;
|
|
2245
|
+
}
|
|
2246
|
+
get defaultPrevented() {
|
|
2247
|
+
return this._defaultPrevented;
|
|
2248
|
+
}
|
|
2249
|
+
preventDefault() {
|
|
2250
|
+
this._defaultPrevented = true;
|
|
2251
|
+
}
|
|
2252
|
+
}
|
|
2253
|
+
|
|
2194
2254
|
class KeyHandler extends EventEmitter {
|
|
2195
2255
|
stdin;
|
|
2196
2256
|
useKittyKeyboard;
|
|
@@ -2210,7 +2270,7 @@ class KeyHandler extends EventEmitter {
|
|
|
2210
2270
|
this.pasteBuffer.push(Bun.stripANSI(data));
|
|
2211
2271
|
if (data.endsWith(ANSI.bracketedPasteEnd)) {
|
|
2212
2272
|
this.pasteMode = false;
|
|
2213
|
-
this.emit("paste", this.pasteBuffer.join(""));
|
|
2273
|
+
this.emit("paste", new PasteEvent(this.pasteBuffer.join("")));
|
|
2214
2274
|
this.pasteBuffer = [];
|
|
2215
2275
|
}
|
|
2216
2276
|
return;
|
|
@@ -2218,16 +2278,16 @@ class KeyHandler extends EventEmitter {
|
|
|
2218
2278
|
const parsedKey = parseKeypress(key, { useKittyKeyboard: this.useKittyKeyboard });
|
|
2219
2279
|
switch (parsedKey.eventType) {
|
|
2220
2280
|
case "press":
|
|
2221
|
-
this.emit("keypress", parsedKey);
|
|
2281
|
+
this.emit("keypress", new KeyEvent(parsedKey));
|
|
2222
2282
|
break;
|
|
2223
2283
|
case "repeat":
|
|
2224
|
-
this.emit("keyrepeat", parsedKey);
|
|
2284
|
+
this.emit("keyrepeat", new KeyEvent(parsedKey));
|
|
2225
2285
|
break;
|
|
2226
2286
|
case "release":
|
|
2227
|
-
this.emit("keyrelease", parsedKey);
|
|
2287
|
+
this.emit("keyrelease", new KeyEvent(parsedKey));
|
|
2228
2288
|
break;
|
|
2229
2289
|
default:
|
|
2230
|
-
this.emit("keypress", parsedKey);
|
|
2290
|
+
this.emit("keypress", new KeyEvent(parsedKey));
|
|
2231
2291
|
break;
|
|
2232
2292
|
}
|
|
2233
2293
|
};
|
|
@@ -2238,6 +2298,45 @@ class KeyHandler extends EventEmitter {
|
|
|
2238
2298
|
}
|
|
2239
2299
|
}
|
|
2240
2300
|
|
|
2301
|
+
class InternalKeyHandler extends KeyHandler {
|
|
2302
|
+
renderableHandlers = new Map;
|
|
2303
|
+
constructor(stdin, useKittyKeyboard = false) {
|
|
2304
|
+
super(stdin, useKittyKeyboard);
|
|
2305
|
+
}
|
|
2306
|
+
emit(event, ...args) {
|
|
2307
|
+
return this.emitWithPriority(event, ...args);
|
|
2308
|
+
}
|
|
2309
|
+
emitWithPriority(event, ...args) {
|
|
2310
|
+
const hasGlobalListeners = super.emit(event, ...args);
|
|
2311
|
+
const renderableSet = this.renderableHandlers.get(event);
|
|
2312
|
+
let hasRenderableListeners = false;
|
|
2313
|
+
if (renderableSet && renderableSet.size > 0) {
|
|
2314
|
+
hasRenderableListeners = true;
|
|
2315
|
+
if (event === "keypress" || event === "keyrepeat" || event === "keyrelease" || event === "paste") {
|
|
2316
|
+
const keyEvent = args[0];
|
|
2317
|
+
if (keyEvent.defaultPrevented)
|
|
2318
|
+
return hasGlobalListeners || hasRenderableListeners;
|
|
2319
|
+
}
|
|
2320
|
+
for (const handler of renderableSet) {
|
|
2321
|
+
handler(...args);
|
|
2322
|
+
}
|
|
2323
|
+
}
|
|
2324
|
+
return hasGlobalListeners || hasRenderableListeners;
|
|
2325
|
+
}
|
|
2326
|
+
onInternal(event, handler) {
|
|
2327
|
+
if (!this.renderableHandlers.has(event)) {
|
|
2328
|
+
this.renderableHandlers.set(event, new Set);
|
|
2329
|
+
}
|
|
2330
|
+
this.renderableHandlers.get(event).add(handler);
|
|
2331
|
+
}
|
|
2332
|
+
offInternal(event, handler) {
|
|
2333
|
+
const handlers = this.renderableHandlers.get(event);
|
|
2334
|
+
if (handlers) {
|
|
2335
|
+
handlers.delete(handler);
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
}
|
|
2339
|
+
|
|
2241
2340
|
// src/lib/RGBA.ts
|
|
2242
2341
|
class RGBA {
|
|
2243
2342
|
buffer;
|
|
@@ -6550,14 +6649,14 @@ class Renderable extends BaseRenderable {
|
|
|
6550
6649
|
this.handleKeyPress(key);
|
|
6551
6650
|
}
|
|
6552
6651
|
};
|
|
6553
|
-
this.pasteHandler = (
|
|
6554
|
-
this._pasteListener?.call(this, text);
|
|
6652
|
+
this.pasteHandler = (event) => {
|
|
6653
|
+
this._pasteListener?.call(this, event.text);
|
|
6555
6654
|
if (this.handlePaste) {
|
|
6556
|
-
this.handlePaste(text);
|
|
6655
|
+
this.handlePaste(event.text);
|
|
6557
6656
|
}
|
|
6558
6657
|
};
|
|
6559
|
-
this.ctx.
|
|
6560
|
-
this.ctx.
|
|
6658
|
+
this.ctx._internalKeyInput.onInternal("keypress", this.keypressHandler);
|
|
6659
|
+
this.ctx._internalKeyInput.onInternal("paste", this.pasteHandler);
|
|
6561
6660
|
this.emit("focused" /* FOCUSED */);
|
|
6562
6661
|
}
|
|
6563
6662
|
blur() {
|
|
@@ -6566,11 +6665,11 @@ class Renderable extends BaseRenderable {
|
|
|
6566
6665
|
this._focused = false;
|
|
6567
6666
|
this.requestRender();
|
|
6568
6667
|
if (this.keypressHandler) {
|
|
6569
|
-
this.ctx.
|
|
6668
|
+
this.ctx._internalKeyInput.offInternal("keypress", this.keypressHandler);
|
|
6570
6669
|
this.keypressHandler = null;
|
|
6571
6670
|
}
|
|
6572
6671
|
if (this.pasteHandler) {
|
|
6573
|
-
this.ctx.
|
|
6672
|
+
this.ctx._internalKeyInput.offInternal("paste", this.pasteHandler);
|
|
6574
6673
|
this.pasteHandler = null;
|
|
6575
6674
|
}
|
|
6576
6675
|
this.emit("blurred" /* BLURRED */);
|
|
@@ -8707,7 +8806,7 @@ Captured output:
|
|
|
8707
8806
|
process.on("exit", this.exitHandler);
|
|
8708
8807
|
this._console = new TerminalConsole(this, config.consoleOptions);
|
|
8709
8808
|
this.useConsole = config.useConsole ?? true;
|
|
8710
|
-
this._keyHandler = new
|
|
8809
|
+
this._keyHandler = new InternalKeyHandler(this.stdin, config.useKittyKeyboard ?? false);
|
|
8711
8810
|
global.requestAnimationFrame = (callback) => {
|
|
8712
8811
|
const id = CliRenderer.animationFrameId++;
|
|
8713
8812
|
this.animationRequest.set(id, callback);
|
|
@@ -8795,6 +8894,9 @@ Captured output:
|
|
|
8795
8894
|
get keyInput() {
|
|
8796
8895
|
return this._keyHandler;
|
|
8797
8896
|
}
|
|
8897
|
+
get _internalKeyInput() {
|
|
8898
|
+
return this._keyHandler;
|
|
8899
|
+
}
|
|
8798
8900
|
get terminalWidth() {
|
|
8799
8901
|
return this._terminalWidth;
|
|
8800
8902
|
}
|
|
@@ -9572,7 +9674,7 @@ Captured output:
|
|
|
9572
9674
|
}
|
|
9573
9675
|
}
|
|
9574
9676
|
|
|
9575
|
-
export { __toESM, __commonJS, __export, __require, Edge, Gutter, exports_src, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, nonAlphanumericKeys, parseKeypress, ANSI, KeyHandler, RGBA, hexToRgb, rgbToHex, hsvToRgb, parseColor, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, DebugOverlayCorner, createTextAttributes, visualizeRenderableTree, isStyledText, StyledText, stringToStyledText, black, red, green, yellow, blue, magenta, cyan, white, brightBlack, brightRed, brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan, brightWhite, bgBlack, bgRed, bgGreen, bgYellow, bgBlue, bgMagenta, bgCyan, bgWhite, bold, italic, underline, strikethrough, dim, reverse, blink, fg, bg, t, SyntaxStyle, hastToStyledText, parseAlign, parseBoxSizing, parseDimension, parseDirection, parseDisplay, parseEdge, parseFlexDirection, parseGutter, parseJustify, parseLogLevel, parseMeasureMode, parseOverflow, parsePositionType, parseUnit, parseWrap, MouseParser, Selection, convertGlobalToLocalSelection, ASCIIFontSelectionHelper, envRegistry, registerEnvVar, generateEnvMarkdown, generateEnvColored, env, TextBuffer, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, OptimizedBuffer, h, isVNode, maybeMakeRenderable, wrapWithDelegates, instantiate, delegate, isValidPercentage, LayoutEvents, RenderableEvents, isRenderable, BaseRenderable, Renderable, RootRenderable, capture, ConsolePosition, TerminalConsole, getObjectsInViewport, MouseEvent, MouseButton, createCliRenderer, CliRenderEvents, CliRenderer };
|
|
9677
|
+
export { __toESM, __commonJS, __export, __require, Edge, Gutter, exports_src, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, nonAlphanumericKeys, parseKeypress, ANSI, KeyEvent, PasteEvent, KeyHandler, InternalKeyHandler, RGBA, hexToRgb, rgbToHex, hsvToRgb, parseColor, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, DebugOverlayCorner, createTextAttributes, visualizeRenderableTree, isStyledText, StyledText, stringToStyledText, black, red, green, yellow, blue, magenta, cyan, white, brightBlack, brightRed, brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan, brightWhite, bgBlack, bgRed, bgGreen, bgYellow, bgBlue, bgMagenta, bgCyan, bgWhite, bold, italic, underline, strikethrough, dim, reverse, blink, fg, bg, t, SyntaxStyle, hastToStyledText, parseAlign, parseBoxSizing, parseDimension, parseDirection, parseDisplay, parseEdge, parseFlexDirection, parseGutter, parseJustify, parseLogLevel, parseMeasureMode, parseOverflow, parsePositionType, parseUnit, parseWrap, MouseParser, Selection, convertGlobalToLocalSelection, ASCIIFontSelectionHelper, envRegistry, registerEnvVar, generateEnvMarkdown, generateEnvColored, env, TextBuffer, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, OptimizedBuffer, h, isVNode, maybeMakeRenderable, wrapWithDelegates, instantiate, delegate, isValidPercentage, LayoutEvents, RenderableEvents, isRenderable, BaseRenderable, Renderable, RootRenderable, capture, ConsolePosition, TerminalConsole, getObjectsInViewport, MouseEvent, MouseButton, createCliRenderer, CliRenderEvents, CliRenderer };
|
|
9576
9678
|
|
|
9577
|
-
//# debugId=
|
|
9578
|
-
//# sourceMappingURL=index-
|
|
9679
|
+
//# debugId=03E8AF9E3F4FA3CB64756E2164756E21
|
|
9680
|
+
//# sourceMappingURL=index-tg3c4jgq.js.map
|