@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 CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  __export,
6
6
  __require,
7
7
  __toESM
8
- } from "./index-6kvgbzah.js";
8
+ } from "./index-tg3c4jgq.js";
9
9
 
10
10
  // ../../node_modules/omggif/omggif.js
11
11
  var require_omggif = __commonJS((exports) => {
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 { ParsedKey } from "./lib/parse.keypress";
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: ParsedKey) => void;
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: ParsedKey) => void) | null;
130
- protected pasteHandler: ((text: string) => void) | null;
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: ParsedKey | string): boolean;
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: ParsedKey) => void) | undefined);
280
- get onKeyDown(): ((key: ParsedKey) => void) | undefined;
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 = (text) => {
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.keyInput.on("keypress", this.keypressHandler);
6560
- this.ctx.keyInput.on("paste", this.pasteHandler);
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.keyInput.off("keypress", this.keypressHandler);
6668
+ this.ctx._internalKeyInput.offInternal("keypress", this.keypressHandler);
6570
6669
  this.keypressHandler = null;
6571
6670
  }
6572
6671
  if (this.pasteHandler) {
6573
- this.ctx.keyInput.off("paste", this.pasteHandler);
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 KeyHandler(this.stdin, config.useKittyKeyboard ?? false);
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=FA47EE78BCA83E8664756E2164756E21
9578
- //# sourceMappingURL=index-6kvgbzah.js.map
9679
+ //# debugId=03E8AF9E3F4FA3CB64756E2164756E21
9680
+ //# sourceMappingURL=index-tg3c4jgq.js.map