kyh 0.1.0 → 0.1.2

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 (2) hide show
  1. package/dist/index.js +461 -166
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -20,10 +20,10 @@ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports,
20
20
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
21
21
  var __require = import.meta.require;
22
22
 
23
- // node_modules/@opentui/react/chunk-e11q5a3p.js
23
+ // ../../node_modules/.pnpm/@opentui+react@0.1.74_react-devtools-core@7.0.1_react@19.2.3_stage-js@1.0.0-alpha.17_ty_fb46e0fc351a293c6633843011916d07/node_modules/@opentui/react/chunk-e11q5a3p.js
24
24
  var init_chunk_e11q5a3p = () => {};
25
25
 
26
- // node_modules/react/cjs/react.development.js
26
+ // ../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react.development.js
27
27
  var require_react_development = __commonJS((exports, module2) => {
28
28
  (function() {
29
29
  function defineDeprecationWarning(methodName, info) {
@@ -846,7 +846,7 @@ See https://react.dev/link/invalid-hook-call for tips about how to debug and fix
846
846
  })();
847
847
  });
848
848
 
849
- // node_modules/react/index.js
849
+ // ../../node_modules/.pnpm/react@19.2.3/node_modules/react/index.js
850
850
  var require_react = __commonJS((exports, module2) => {
851
851
  var react_development = __toESM(require_react_development());
852
852
  if (false) {} else {
@@ -854,7 +854,7 @@ var require_react = __commonJS((exports, module2) => {
854
854
  }
855
855
  });
856
856
 
857
- // node_modules/react/cjs/react-jsx-dev-runtime.development.js
857
+ // ../../node_modules/.pnpm/react@19.2.3/node_modules/react/cjs/react-jsx-dev-runtime.development.js
858
858
  var require_react_jsx_dev_runtime_development = __commonJS((exports) => {
859
859
  var React = __toESM(require_react());
860
860
  (function() {
@@ -1069,7 +1069,7 @@ React keys must be passed directly to JSX without using spread:
1069
1069
  })();
1070
1070
  });
1071
1071
 
1072
- // node_modules/react/jsx-dev-runtime.js
1072
+ // ../../node_modules/.pnpm/react@19.2.3/node_modules/react/jsx-dev-runtime.js
1073
1073
  var require_jsx_dev_runtime = __commonJS((exports, module2) => {
1074
1074
  var react_jsx_dev_runtime_development = __toESM(require_react_jsx_dev_runtime_development());
1075
1075
  if (false) {} else {
@@ -1077,7 +1077,7 @@ var require_jsx_dev_runtime = __commonJS((exports, module2) => {
1077
1077
  }
1078
1078
  });
1079
1079
 
1080
- // node_modules/scheduler/cjs/scheduler.development.js
1080
+ // ../../node_modules/.pnpm/scheduler@0.26.0/node_modules/scheduler/cjs/scheduler.development.js
1081
1081
  var require_scheduler_development = __commonJS((exports) => {
1082
1082
  (function() {
1083
1083
  function performWorkUntilDeadline() {
@@ -1332,7 +1332,7 @@ var require_scheduler_development = __commonJS((exports) => {
1332
1332
  })();
1333
1333
  });
1334
1334
 
1335
- // node_modules/scheduler/index.js
1335
+ // ../../node_modules/.pnpm/scheduler@0.26.0/node_modules/scheduler/index.js
1336
1336
  var require_scheduler = __commonJS((exports, module2) => {
1337
1337
  var scheduler_development = __toESM(require_scheduler_development());
1338
1338
  if (false) {} else {
@@ -1340,7 +1340,7 @@ var require_scheduler = __commonJS((exports, module2) => {
1340
1340
  }
1341
1341
  });
1342
1342
 
1343
- // node_modules/react-reconciler/cjs/react-reconciler.development.js
1343
+ // ../../node_modules/.pnpm/react-reconciler@0.32.0_react@19.2.3/node_modules/react-reconciler/cjs/react-reconciler.development.js
1344
1344
  var require_react_reconciler_development = __commonJS((exports, module2) => {
1345
1345
  var React = __toESM(require_react());
1346
1346
  var Scheduler = __toESM(require_scheduler());
@@ -10793,26 +10793,26 @@ No matching component was found for:
10793
10793
  }, module2.exports.default = module2.exports, Object.defineProperty(module2.exports, "__esModule", { value: true });
10794
10794
  });
10795
10795
 
10796
- // node_modules/react-reconciler/index.js
10796
+ // ../../node_modules/.pnpm/react-reconciler@0.32.0_react@19.2.3/node_modules/react-reconciler/index.js
10797
10797
  var require_react_reconciler = __commonJS((exports, module2) => {
10798
10798
  if (false) {} else {
10799
10799
  module2.exports = require_react_reconciler_development();
10800
10800
  }
10801
10801
  });
10802
10802
 
10803
- // node_modules/react-reconciler/cjs/react-reconciler-constants.development.js
10803
+ // ../../node_modules/.pnpm/react-reconciler@0.32.0_react@19.2.3/node_modules/react-reconciler/cjs/react-reconciler-constants.development.js
10804
10804
  var require_react_reconciler_constants_development = __commonJS((exports) => {
10805
10805
  exports.ConcurrentRoot = 1, exports.ContinuousEventPriority = 8, exports.DefaultEventPriority = 32, exports.DiscreteEventPriority = 2, exports.IdleEventPriority = 268435456, exports.LegacyRoot = 0, exports.NoEventPriority = 0;
10806
10806
  });
10807
10807
 
10808
- // node_modules/react-reconciler/constants.js
10808
+ // ../../node_modules/.pnpm/react-reconciler@0.32.0_react@19.2.3/node_modules/react-reconciler/constants.js
10809
10809
  var require_constants = __commonJS((exports, module2) => {
10810
10810
  if (false) {} else {
10811
10811
  module2.exports = require_react_reconciler_constants_development();
10812
10812
  }
10813
10813
  });
10814
10814
 
10815
- // node_modules/react-devtools-core/dist/backend.js
10815
+ // ../../node_modules/.pnpm/react-devtools-core@7.0.1/node_modules/react-devtools-core/dist/backend.js
10816
10816
  var require_backend = __commonJS((exports, module2) => {
10817
10817
  (function webpackUniversalModuleDefinition(root, factory) {
10818
10818
  if (typeof exports === "object" && typeof module2 === "object")
@@ -27606,7 +27606,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
27606
27606
  });
27607
27607
  });
27608
27608
 
27609
- // node_modules/@opentui/react/chunk-fcedq94e.js
27609
+ // ../../node_modules/.pnpm/@opentui+react@0.1.74_react-devtools-core@7.0.1_react@19.2.3_stage-js@1.0.0-alpha.17_ty_fb46e0fc351a293c6633843011916d07/node_modules/@opentui/react/chunk-fcedq94e.js
27610
27610
  var exports_chunk_fcedq94e = {};
27611
27611
  var import_react_devtools_core, g;
27612
27612
  var init_chunk_fcedq94e = __esm(async () => {
@@ -27633,7 +27633,7 @@ var init_chunk_fcedq94e = __esm(async () => {
27633
27633
  import_react_devtools_core.default.connectToDevTools();
27634
27634
  });
27635
27635
 
27636
- // node_modules/@opentui/core/index-zj0wwh9d.js
27636
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/index-93qf6w1k.js
27637
27637
  import { Buffer as Buffer2 } from "buffer";
27638
27638
  import { EventEmitter } from "events";
27639
27639
  import { EventEmitter as EventEmitter2 } from "events";
@@ -27641,40 +27641,40 @@ import { EventEmitter as EventEmitter3 } from "events";
27641
27641
  import { resolve, dirname } from "path";
27642
27642
  import { fileURLToPath } from "url";
27643
27643
 
27644
- // node_modules/@opentui/core/assets/javascript/highlights.scm
27644
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/javascript/highlights.scm
27645
27645
  var highlights_default = "./highlights-ghv9g403.scm";
27646
27646
 
27647
- // node_modules/@opentui/core/assets/javascript/tree-sitter-javascript.wasm
27647
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/javascript/tree-sitter-javascript.wasm
27648
27648
  var tree_sitter_javascript_default = "./tree-sitter-javascript-nd0q4pe9.wasm";
27649
27649
 
27650
- // node_modules/@opentui/core/assets/typescript/highlights.scm
27650
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/typescript/highlights.scm
27651
27651
  var highlights_default2 = "./highlights-eq9cgrbb.scm";
27652
27652
 
27653
- // node_modules/@opentui/core/assets/typescript/tree-sitter-typescript.wasm
27653
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/typescript/tree-sitter-typescript.wasm
27654
27654
  var tree_sitter_typescript_default = "./tree-sitter-typescript-zxjzwt75.wasm";
27655
27655
 
27656
- // node_modules/@opentui/core/assets/markdown/highlights.scm
27656
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/markdown/highlights.scm
27657
27657
  var highlights_default3 = "./highlights-r812a2qc.scm";
27658
27658
 
27659
- // node_modules/@opentui/core/assets/markdown/tree-sitter-markdown.wasm
27659
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/markdown/tree-sitter-markdown.wasm
27660
27660
  var tree_sitter_markdown_default = "./tree-sitter-markdown-411r6y9b.wasm";
27661
27661
 
27662
- // node_modules/@opentui/core/assets/markdown/injections.scm
27662
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/markdown/injections.scm
27663
27663
  var injections_default = "./injections-73j83es3.scm";
27664
27664
 
27665
- // node_modules/@opentui/core/assets/markdown_inline/highlights.scm
27665
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/markdown_inline/highlights.scm
27666
27666
  var highlights_default4 = "./highlights-x6tmsnaa.scm";
27667
27667
 
27668
- // node_modules/@opentui/core/assets/markdown_inline/tree-sitter-markdown_inline.wasm
27668
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/markdown_inline/tree-sitter-markdown_inline.wasm
27669
27669
  var tree_sitter_markdown_inline_default = "./tree-sitter-markdown_inline-j5349f42.wasm";
27670
27670
 
27671
- // node_modules/@opentui/core/assets/zig/highlights.scm
27671
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/zig/highlights.scm
27672
27672
  var highlights_default5 = "./highlights-hk7bwhj4.scm";
27673
27673
 
27674
- // node_modules/@opentui/core/assets/zig/tree-sitter-zig.wasm
27674
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/assets/zig/tree-sitter-zig.wasm
27675
27675
  var tree_sitter_zig_default = "./tree-sitter-zig-e78zbjpm.wasm";
27676
27676
 
27677
- // node_modules/@opentui/core/index-zj0wwh9d.js
27677
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/index-93qf6w1k.js
27678
27678
  import { resolve as resolve2, isAbsolute, parse } from "path";
27679
27679
  import { existsSync } from "fs";
27680
27680
  import { basename, join } from "path";
@@ -29730,6 +29730,8 @@ function parseKittyKeyboard(sequence) {
29730
29730
  if (isPrintable) {
29731
29731
  if (key.shift && shiftedCodepoint) {
29732
29732
  text = String.fromCodePoint(shiftedCodepoint);
29733
+ } else if (key.shift && key.name.length === 1) {
29734
+ text = key.name.toLocaleUpperCase();
29733
29735
  } else {
29734
29736
  text = key.name;
29735
29737
  }
@@ -30016,6 +30018,7 @@ class KeyEvent {
30016
30018
  baseCode;
30017
30019
  repeated;
30018
30020
  _defaultPrevented = false;
30021
+ _propagationStopped = false;
30019
30022
  constructor(key) {
30020
30023
  this.name = key.name;
30021
30024
  this.ctrl = key.ctrl;
@@ -30038,23 +30041,36 @@ class KeyEvent {
30038
30041
  get defaultPrevented() {
30039
30042
  return this._defaultPrevented;
30040
30043
  }
30044
+ get propagationStopped() {
30045
+ return this._propagationStopped;
30046
+ }
30041
30047
  preventDefault() {
30042
30048
  this._defaultPrevented = true;
30043
30049
  }
30050
+ stopPropagation() {
30051
+ this._propagationStopped = true;
30052
+ }
30044
30053
  }
30045
30054
 
30046
30055
  class PasteEvent {
30047
30056
  text;
30048
30057
  _defaultPrevented = false;
30058
+ _propagationStopped = false;
30049
30059
  constructor(text) {
30050
30060
  this.text = text;
30051
30061
  }
30052
30062
  get defaultPrevented() {
30053
30063
  return this._defaultPrevented;
30054
30064
  }
30065
+ get propagationStopped() {
30066
+ return this._propagationStopped;
30067
+ }
30055
30068
  preventDefault() {
30056
30069
  this._defaultPrevented = true;
30057
30070
  }
30071
+ stopPropagation() {
30072
+ this._propagationStopped = true;
30073
+ }
30058
30074
  }
30059
30075
 
30060
30076
  class KeyHandler extends EventEmitter {
@@ -30106,10 +30122,22 @@ class InternalKeyHandler extends KeyHandler {
30106
30122
  }
30107
30123
  emitWithPriority(event, ...args) {
30108
30124
  let hasGlobalListeners = false;
30109
- try {
30110
- hasGlobalListeners = super.emit(event, ...args);
30111
- } catch (error) {
30112
- console.error(`[KeyHandler] Error in global ${event} handler:`, error);
30125
+ const globalListeners = this.listeners(event);
30126
+ if (globalListeners.length > 0) {
30127
+ hasGlobalListeners = true;
30128
+ for (const listener of globalListeners) {
30129
+ try {
30130
+ listener(...args);
30131
+ } catch (error) {
30132
+ console.error(`[KeyHandler] Error in global ${event} handler:`, error);
30133
+ }
30134
+ if (event === "keypress" || event === "keyrelease" || event === "paste") {
30135
+ const keyEvent = args[0];
30136
+ if (keyEvent.propagationStopped) {
30137
+ return hasGlobalListeners;
30138
+ }
30139
+ }
30140
+ }
30113
30141
  }
30114
30142
  const renderableSet = this.renderableHandlers.get(event);
30115
30143
  const renderableHandlers = renderableSet && renderableSet.size > 0 ? [...renderableSet] : [];
@@ -30120,6 +30148,8 @@ class InternalKeyHandler extends KeyHandler {
30120
30148
  const keyEvent = args[0];
30121
30149
  if (keyEvent.defaultPrevented)
30122
30150
  return hasGlobalListeners || hasRenderableListeners;
30151
+ if (keyEvent.propagationStopped)
30152
+ return hasGlobalListeners || hasRenderableListeners;
30123
30153
  }
30124
30154
  for (const handler of renderableHandlers) {
30125
30155
  try {
@@ -30127,6 +30157,12 @@ class InternalKeyHandler extends KeyHandler {
30127
30157
  } catch (error) {
30128
30158
  console.error(`[KeyHandler] Error in renderable ${event} handler:`, error);
30129
30159
  }
30160
+ if (event === "keypress" || event === "keyrelease" || event === "paste") {
30161
+ const keyEvent = args[0];
30162
+ if (keyEvent.propagationStopped) {
30163
+ return hasGlobalListeners || hasRenderableListeners;
30164
+ }
30165
+ }
30130
30166
  }
30131
30167
  }
30132
30168
  return hasGlobalListeners || hasRenderableListeners;
@@ -36873,6 +36909,7 @@ var TerminalCapabilitiesStruct = defineStruct([
36873
36909
  ["sync", "bool_u8"],
36874
36910
  ["bracketed_paste", "bool_u8"],
36875
36911
  ["hyperlinks", "bool_u8"],
36912
+ ["explicit_cursor_positioning", "bool_u8"],
36876
36913
  ["term_name", "char*"],
36877
36914
  ["term_name_len", "u64", { lengthOf: "term_name" }],
36878
36915
  ["term_version", "char*"],
@@ -36941,6 +36978,18 @@ registerEnvVar({
36941
36978
  type: "boolean",
36942
36979
  default: false
36943
36980
  });
36981
+ registerEnvVar({
36982
+ name: "OPENTUI_NO_GRAPHICS",
36983
+ description: "Disable Kitty graphics protocol detection",
36984
+ type: "boolean",
36985
+ default: false
36986
+ });
36987
+ registerEnvVar({
36988
+ name: "OPENTUI_FORCE_NOZWJ",
36989
+ description: "Use no_zwj width method (Unicode without ZWJ joining)",
36990
+ type: "boolean",
36991
+ default: false
36992
+ });
36944
36993
  var globalTraceSymbols = null;
36945
36994
  var globalFFILogWriter = null;
36946
36995
  var exitHandlerRegistered = false;
@@ -37171,10 +37220,34 @@ function getOpenTUILib(libPath) {
37171
37220
  args: ["ptr", "i32", "i32", "u32", "u32", "u32"],
37172
37221
  returns: "void"
37173
37222
  },
37223
+ clearCurrentHitGrid: {
37224
+ args: ["ptr"],
37225
+ returns: "void"
37226
+ },
37227
+ hitGridPushScissorRect: {
37228
+ args: ["ptr", "i32", "i32", "u32", "u32"],
37229
+ returns: "void"
37230
+ },
37231
+ hitGridPopScissorRect: {
37232
+ args: ["ptr"],
37233
+ returns: "void"
37234
+ },
37235
+ hitGridClearScissorRects: {
37236
+ args: ["ptr"],
37237
+ returns: "void"
37238
+ },
37239
+ addToCurrentHitGridClipped: {
37240
+ args: ["ptr", "i32", "i32", "u32", "u32", "u32"],
37241
+ returns: "void"
37242
+ },
37174
37243
  checkHit: {
37175
37244
  args: ["ptr", "u32", "u32"],
37176
37245
  returns: "u32"
37177
37246
  },
37247
+ getHitGridDirty: {
37248
+ args: ["ptr"],
37249
+ returns: "bool"
37250
+ },
37178
37251
  dumpHitGrid: {
37179
37252
  args: ["ptr"],
37180
37253
  returns: "void"
@@ -37223,6 +37296,10 @@ function getOpenTUILib(libPath) {
37223
37296
  args: ["ptr"],
37224
37297
  returns: "void"
37225
37298
  },
37299
+ writeOut: {
37300
+ args: ["ptr", "ptr", "u64"],
37301
+ returns: "void"
37302
+ },
37226
37303
  createTextBuffer: {
37227
37304
  args: ["u8"],
37228
37305
  returns: "ptr"
@@ -37435,6 +37512,10 @@ function getOpenTUILib(libPath) {
37435
37512
  args: ["ptr", "ptr"],
37436
37513
  returns: "void"
37437
37514
  },
37515
+ textBufferViewSetTruncate: {
37516
+ args: ["ptr", "bool"],
37517
+ returns: "void"
37518
+ },
37438
37519
  textBufferViewMeasureForDimensions: {
37439
37520
  args: ["ptr", "u32", "u32", "ptr"],
37440
37521
  returns: "bool"
@@ -38267,9 +38348,27 @@ class FFIRenderLib {
38267
38348
  addToHitGrid(renderer, x, y, width, height, id) {
38268
38349
  this.opentui.symbols.addToHitGrid(renderer, x, y, width, height, id);
38269
38350
  }
38351
+ clearCurrentHitGrid(renderer) {
38352
+ this.opentui.symbols.clearCurrentHitGrid(renderer);
38353
+ }
38354
+ hitGridPushScissorRect(renderer, x, y, width, height) {
38355
+ this.opentui.symbols.hitGridPushScissorRect(renderer, x, y, width, height);
38356
+ }
38357
+ hitGridPopScissorRect(renderer) {
38358
+ this.opentui.symbols.hitGridPopScissorRect(renderer);
38359
+ }
38360
+ hitGridClearScissorRects(renderer) {
38361
+ this.opentui.symbols.hitGridClearScissorRects(renderer);
38362
+ }
38363
+ addToCurrentHitGridClipped(renderer, x, y, width, height, id) {
38364
+ this.opentui.symbols.addToCurrentHitGridClipped(renderer, x, y, width, height, id);
38365
+ }
38270
38366
  checkHit(renderer, x, y) {
38271
38367
  return this.opentui.symbols.checkHit(renderer, x, y);
38272
38368
  }
38369
+ getHitGridDirty(renderer) {
38370
+ return this.opentui.symbols.getHitGridDirty(renderer);
38371
+ }
38273
38372
  dumpHitGrid(renderer) {
38274
38373
  this.opentui.symbols.dumpHitGrid(renderer);
38275
38374
  }
@@ -38311,6 +38410,12 @@ class FFIRenderLib {
38311
38410
  queryPixelResolution(renderer) {
38312
38411
  this.opentui.symbols.queryPixelResolution(renderer);
38313
38412
  }
38413
+ writeOut(renderer, data) {
38414
+ const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
38415
+ if (bytes.length === 0)
38416
+ return;
38417
+ this.opentui.symbols.writeOut(renderer, ptr3(bytes), bytes.length);
38418
+ }
38314
38419
  createTextBuffer(widthMethod) {
38315
38420
  const widthMethodCode = widthMethod === "wcwidth" ? 0 : 1;
38316
38421
  const bufferPtr = this.opentui.symbols.createTextBuffer(widthMethodCode);
@@ -38557,6 +38662,9 @@ class FFIRenderLib {
38557
38662
  textBufferViewSetTabIndicatorColor(view, color) {
38558
38663
  this.opentui.symbols.textBufferViewSetTabIndicatorColor(view, color.buffer);
38559
38664
  }
38665
+ textBufferViewSetTruncate(view, truncate) {
38666
+ this.opentui.symbols.textBufferViewSetTruncate(view, truncate);
38667
+ }
38560
38668
  textBufferViewMeasureForDimensions(view, width, height) {
38561
38669
  const resultBuffer = new ArrayBuffer(MeasureResultStruct.size);
38562
38670
  const resultPtr = ptr3(new Uint8Array(resultBuffer));
@@ -38991,6 +39099,7 @@ class FFIRenderLib {
38991
39099
  sync: caps.sync,
38992
39100
  bracketed_paste: caps.bracketed_paste,
38993
39101
  hyperlinks: caps.hyperlinks,
39102
+ explicit_cursor_positioning: caps.explicit_cursor_positioning,
38994
39103
  terminal: {
38995
39104
  name: caps.term_name ?? "",
38996
39105
  version: caps.term_version ?? "",
@@ -39647,9 +39756,9 @@ class Renderable extends BaseRenderable {
39647
39756
  if (this._translateX === value)
39648
39757
  return;
39649
39758
  this._translateX = value;
39650
- this.requestRender();
39651
39759
  if (this.parent)
39652
39760
  this.parent.childrenPrimarySortDirty = true;
39761
+ this.requestRender();
39653
39762
  }
39654
39763
  get translateY() {
39655
39764
  return this._translateY;
@@ -39658,9 +39767,9 @@ class Renderable extends BaseRenderable {
39658
39767
  if (this._translateY === value)
39659
39768
  return;
39660
39769
  this._translateY = value;
39661
- this.requestRender();
39662
39770
  if (this.parent)
39663
39771
  this.parent.childrenPrimarySortDirty = true;
39772
+ this.requestRender();
39664
39773
  }
39665
39774
  get x() {
39666
39775
  if (this.parent) {
@@ -39747,6 +39856,7 @@ class Renderable extends BaseRenderable {
39747
39856
  if (this._zIndex !== value) {
39748
39857
  this._zIndex = value;
39749
39858
  this.parent?.requestZIndexSort();
39859
+ this.requestRender();
39750
39860
  }
39751
39861
  }
39752
39862
  requestZIndexSort() {
@@ -40070,17 +40180,20 @@ class Renderable extends BaseRenderable {
40070
40180
  const layout = this.yogaNode.getComputedLayout();
40071
40181
  const oldX = this._x;
40072
40182
  const oldY = this._y;
40183
+ const oldWidth = this._widthValue;
40184
+ const oldHeight = this._heightValue;
40073
40185
  this._x = layout.left;
40074
40186
  this._y = layout.top;
40075
40187
  const newWidth = Math.max(layout.width, 1);
40076
40188
  const newHeight = Math.max(layout.height, 1);
40077
- const sizeChanged = this.width !== newWidth || this.height !== newHeight;
40189
+ const sizeChanged = oldWidth !== newWidth || oldHeight !== newHeight;
40078
40190
  this._widthValue = newWidth;
40079
40191
  this._heightValue = newHeight;
40080
40192
  if (sizeChanged) {
40081
40193
  this.onLayoutResize(newWidth, newHeight);
40082
40194
  }
40083
- if (oldX !== this._x || oldY !== this._y) {
40195
+ const positionChanged = oldX !== this._x || oldY !== this._y;
40196
+ if (positionChanged) {
40084
40197
  if (this.parent)
40085
40198
  this.parent.childrenPrimarySortDirty = true;
40086
40199
  }
@@ -40293,7 +40406,9 @@ class Renderable extends BaseRenderable {
40293
40406
  x: scissorRect.x,
40294
40407
  y: scissorRect.y,
40295
40408
  width: scissorRect.width,
40296
- height: scissorRect.height
40409
+ height: scissorRect.height,
40410
+ screenX: this.x,
40411
+ screenY: this.y
40297
40412
  });
40298
40413
  }
40299
40414
  const visibleChildren = this._getVisibleChildren();
@@ -40509,6 +40624,7 @@ class RootRenderable extends Renderable {
40509
40624
  }
40510
40625
  this.renderList.length = 0;
40511
40626
  this.updateLayout(deltaTime, this.renderList);
40627
+ this._ctx.clearHitGridScissorRects();
40512
40628
  for (let i = 1;i < this.renderList.length; i++) {
40513
40629
  const command = this.renderList[i];
40514
40630
  switch (command.action) {
@@ -40519,9 +40635,11 @@ class RootRenderable extends Renderable {
40519
40635
  break;
40520
40636
  case "pushScissorRect":
40521
40637
  buffer.pushScissorRect(command.x, command.y, command.width, command.height);
40638
+ this._ctx.pushHitGridScissorRect(command.screenX, command.screenY, command.width, command.height);
40522
40639
  break;
40523
40640
  case "popScissorRect":
40524
40641
  buffer.popScissorRect();
40642
+ this._ctx.popHitGridScissorRect();
40525
40643
  break;
40526
40644
  case "pushOpacity":
40527
40645
  buffer.pushOpacity(command.opacity);
@@ -42037,6 +42155,8 @@ class CliRenderer extends EventEmitter9 {
42037
42155
  exitSignals;
42038
42156
  _exitListenersAdded = false;
42039
42157
  _isDestroyed = false;
42158
+ _destroyPending = false;
42159
+ _destroyFinalized = false;
42040
42160
  nextRenderBuffer;
42041
42161
  currentRenderBuffer;
42042
42162
  _isRunning = false;
@@ -42122,6 +42242,8 @@ class CliRenderer extends EventEmitter9 {
42122
42242
  }).bind(this);
42123
42243
  _capabilities = null;
42124
42244
  _latestPointer = { x: 0, y: 0 };
42245
+ _hasPointer = false;
42246
+ _lastPointerModifiers = { shift: false, alt: false, ctrl: false };
42125
42247
  _currentFocusedRenderable = null;
42126
42248
  lifecyclePasses = new Set;
42127
42249
  _openConsoleOnError = true;
@@ -42303,16 +42425,39 @@ Captured output:
42303
42425
  }
42304
42426
  this._currentFocusedRenderable = renderable;
42305
42427
  }
42428
+ setCapturedRenderable(renderable) {
42429
+ if (this.capturedRenderable === renderable) {
42430
+ return;
42431
+ }
42432
+ this.capturedRenderable = renderable;
42433
+ }
42306
42434
  addToHitGrid(x, y, width, height, id) {
42307
42435
  if (id !== this.capturedRenderable?.num) {
42308
42436
  this.lib.addToHitGrid(this.rendererPtr, x, y, width, height, id);
42309
42437
  }
42310
42438
  }
42439
+ pushHitGridScissorRect(x, y, width, height) {
42440
+ this.lib.hitGridPushScissorRect(this.rendererPtr, x, y, width, height);
42441
+ }
42442
+ popHitGridScissorRect() {
42443
+ this.lib.hitGridPopScissorRect(this.rendererPtr);
42444
+ }
42445
+ clearHitGridScissorRects() {
42446
+ this.lib.hitGridClearScissorRects(this.rendererPtr);
42447
+ }
42311
42448
  get widthMethod() {
42312
42449
  const caps = this.capabilities;
42313
42450
  return caps?.unicode === "wcwidth" ? "wcwidth" : "unicode";
42314
42451
  }
42315
42452
  writeOut(chunk, encoding, callback) {
42453
+ if (this.rendererPtr && this._useThread) {
42454
+ const data = typeof chunk === "string" ? chunk : chunk?.toString() ?? "";
42455
+ this.lib.writeOut(this.rendererPtr, data);
42456
+ if (typeof callback === "function") {
42457
+ process.nextTick(callback);
42458
+ }
42459
+ return true;
42460
+ }
42316
42461
  return this.realStdoutWrite.call(this.stdout, chunk, encoding, callback);
42317
42462
  }
42318
42463
  requestRender() {
@@ -42502,7 +42647,11 @@ Captured output:
42502
42647
  const backgroundColor = this.backgroundColor.toInts();
42503
42648
  const newlines = " ".repeat(this.width) + `
42504
42649
  `.repeat(space);
42505
- clear = ANSI.setRgbBackground(backgroundColor[0], backgroundColor[1], backgroundColor[2]) + newlines + ANSI.resetBackground;
42650
+ if (backgroundColor[3] === 0) {
42651
+ clear = newlines;
42652
+ } else {
42653
+ clear = ANSI.setRgbBackground(backgroundColor[0], backgroundColor[1], backgroundColor[2]) + newlines + ANSI.resetBackground;
42654
+ }
42506
42655
  }
42507
42656
  this.writeOut(flush + move + output + clear);
42508
42657
  return true;
@@ -42513,7 +42662,7 @@ Captured output:
42513
42662
  }
42514
42663
  disableMouse() {
42515
42664
  this._useMouse = false;
42516
- this.capturedRenderable = undefined;
42665
+ this.setCapturedRenderable(undefined);
42517
42666
  this.mouseParser.reset();
42518
42667
  this.lib.disableMouse(this.rendererPtr);
42519
42668
  }
@@ -42631,6 +42780,8 @@ Captured output:
42631
42780
  }
42632
42781
  this._latestPointer.x = mouseEvent.x;
42633
42782
  this._latestPointer.y = mouseEvent.y;
42783
+ this._hasPointer = true;
42784
+ this._lastPointerModifiers = mouseEvent.modifiers;
42634
42785
  if (this._console.visible) {
42635
42786
  const consoleBounds = this._console.bounds;
42636
42787
  if (mouseEvent.x >= consoleBounds.x && mouseEvent.x < consoleBounds.x + consoleBounds.width && mouseEvent.y >= consoleBounds.y && mouseEvent.y < consoleBounds.y + consoleBounds.height) {
@@ -42641,7 +42792,7 @@ Captured output:
42641
42792
  }
42642
42793
  }
42643
42794
  if (mouseEvent.type === "scroll") {
42644
- const maybeRenderableId2 = this.lib.checkHit(this.rendererPtr, mouseEvent.x, mouseEvent.y);
42795
+ const maybeRenderableId2 = this.hitTest(mouseEvent.x, mouseEvent.y);
42645
42796
  const maybeRenderable2 = Renderable.renderablesByNumber.get(maybeRenderableId2);
42646
42797
  if (maybeRenderable2) {
42647
42798
  const event2 = new MouseEvent(maybeRenderable2, mouseEvent);
@@ -42649,7 +42800,7 @@ Captured output:
42649
42800
  }
42650
42801
  return true;
42651
42802
  }
42652
- const maybeRenderableId = this.lib.checkHit(this.rendererPtr, mouseEvent.x, mouseEvent.y);
42803
+ const maybeRenderableId = this.hitTest(mouseEvent.x, mouseEvent.y);
42653
42804
  const sameElement = maybeRenderableId === this.lastOverRenderableNum;
42654
42805
  this.lastOverRenderableNum = maybeRenderableId;
42655
42806
  const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId);
@@ -42718,20 +42869,20 @@ Captured output:
42718
42869
  }
42719
42870
  this.lastOverRenderable = this.capturedRenderable;
42720
42871
  this.lastOverRenderableNum = this.capturedRenderable.num;
42721
- this.capturedRenderable = undefined;
42872
+ this.setCapturedRenderable(undefined);
42722
42873
  this.requestRender();
42723
42874
  }
42724
42875
  let event = undefined;
42725
42876
  if (maybeRenderable) {
42726
42877
  if (mouseEvent.type === "drag" && mouseEvent.button === 0) {
42727
- this.capturedRenderable = maybeRenderable;
42878
+ this.setCapturedRenderable(maybeRenderable);
42728
42879
  } else {
42729
- this.capturedRenderable = undefined;
42880
+ this.setCapturedRenderable(undefined);
42730
42881
  }
42731
42882
  event = new MouseEvent(maybeRenderable, mouseEvent);
42732
42883
  maybeRenderable.processMouseEvent(event);
42733
42884
  } else {
42734
- this.capturedRenderable = undefined;
42885
+ this.setCapturedRenderable(undefined);
42735
42886
  this.lastOverRenderable = undefined;
42736
42887
  }
42737
42888
  if (!event?.defaultPrevented && mouseEvent.type === "down" && this.currentSelection) {
@@ -42741,6 +42892,42 @@ Captured output:
42741
42892
  }
42742
42893
  return false;
42743
42894
  }
42895
+ recheckHoverState() {
42896
+ if (this._isDestroyed || !this._hasPointer)
42897
+ return;
42898
+ if (this.capturedRenderable)
42899
+ return;
42900
+ const hitId = this.hitTest(this._latestPointer.x, this._latestPointer.y);
42901
+ const hitRenderable = Renderable.renderablesByNumber.get(hitId);
42902
+ const lastOver = this.lastOverRenderable;
42903
+ if (lastOver?.num === hitId) {
42904
+ this.lastOverRenderableNum = hitId;
42905
+ return;
42906
+ }
42907
+ const baseEvent = {
42908
+ type: "move",
42909
+ button: 0,
42910
+ x: this._latestPointer.x,
42911
+ y: this._latestPointer.y,
42912
+ modifiers: this._lastPointerModifiers
42913
+ };
42914
+ if (lastOver) {
42915
+ const event = new MouseEvent(lastOver, { ...baseEvent, type: "out" });
42916
+ lastOver.processMouseEvent(event);
42917
+ }
42918
+ this.lastOverRenderable = hitRenderable;
42919
+ this.lastOverRenderableNum = hitId;
42920
+ if (hitRenderable) {
42921
+ const event = new MouseEvent(hitRenderable, {
42922
+ ...baseEvent,
42923
+ type: "over"
42924
+ });
42925
+ hitRenderable.processMouseEvent(event);
42926
+ }
42927
+ }
42928
+ hitTest(x, y) {
42929
+ return this.lib.checkHit(this.rendererPtr, x, y);
42930
+ }
42744
42931
  takeMemorySnapshot() {
42745
42932
  if (this._isDestroyed)
42746
42933
  return;
@@ -42801,7 +42988,7 @@ Captured output:
42801
42988
  this._terminalWidth = width;
42802
42989
  this._terminalHeight = height;
42803
42990
  this.queryPixelResolution();
42804
- this.capturedRenderable = undefined;
42991
+ this.setCapturedRenderable(undefined);
42805
42992
  this.mouseParser.reset();
42806
42993
  if (this._splitHeight > 0) {
42807
42994
  if (width < prevWidth) {
@@ -43013,6 +43200,17 @@ Captured output:
43013
43200
  if (this._isDestroyed)
43014
43201
  return;
43015
43202
  this._isDestroyed = true;
43203
+ this._destroyPending = true;
43204
+ if (this.rendering) {
43205
+ return;
43206
+ }
43207
+ this.finalizeDestroy();
43208
+ }
43209
+ finalizeDestroy() {
43210
+ if (this._destroyFinalized)
43211
+ return;
43212
+ this._destroyFinalized = true;
43213
+ this._destroyPending = false;
43016
43214
  process.removeListener("SIGWINCH", this.sigwinchHandler);
43017
43215
  process.removeListener("uncaughtException", this.handleError);
43018
43216
  process.removeListener("unhandledRejection", this.handleError);
@@ -43044,7 +43242,7 @@ Captured output:
43044
43242
  }
43045
43243
  this._isRunning = false;
43046
43244
  this.waitingForPixelResolution = false;
43047
- this.capturedRenderable = undefined;
43245
+ this.setCapturedRenderable(undefined);
43048
43246
  try {
43049
43247
  this.root.destroyRecursively();
43050
43248
  } catch (e) {
@@ -43089,65 +43287,74 @@ Captured output:
43089
43287
  clearTimeout(this.renderTimeout);
43090
43288
  this.renderTimeout = null;
43091
43289
  }
43092
- const now = Date.now();
43093
- const elapsed = now - this.lastTime;
43094
- const deltaTime = elapsed;
43095
- this.lastTime = now;
43096
- this.frameCount++;
43097
- if (now - this.lastFpsTime >= 1000) {
43098
- this.currentFps = this.frameCount;
43099
- this.frameCount = 0;
43100
- this.lastFpsTime = now;
43101
- }
43102
- this.renderStats.frameCount++;
43103
- this.renderStats.fps = this.currentFps;
43104
- const overallStart = performance.now();
43105
- const frameRequests = Array.from(this.animationRequest.values());
43106
- this.animationRequest.clear();
43107
- const animationRequestStart = performance.now();
43108
- frameRequests.forEach((callback) => {
43109
- callback(deltaTime);
43110
- this.dropLive();
43111
- });
43112
- const animationRequestEnd = performance.now();
43113
- const animationRequestTime = animationRequestEnd - animationRequestStart;
43114
- const start = performance.now();
43115
- for (const frameCallback of this.frameCallbacks) {
43116
- try {
43117
- await frameCallback(deltaTime);
43118
- } catch (error) {
43119
- console.error("Error in frame callback:", error);
43120
- }
43121
- }
43122
- const end = performance.now();
43123
- this.renderStats.frameCallbackTime = end - start;
43124
- this.root.render(this.nextRenderBuffer, deltaTime);
43125
- for (const postProcessFn of this.postProcessFns) {
43126
- postProcessFn(this.nextRenderBuffer, deltaTime);
43127
- }
43128
- this._console.renderToBuffer(this.nextRenderBuffer);
43129
- if (!this._isDestroyed) {
43130
- this.renderNative();
43131
- const overallFrameTime = performance.now() - overallStart;
43132
- this.lib.updateStats(this.rendererPtr, overallFrameTime, this.renderStats.fps, this.renderStats.frameCallbackTime);
43133
- if (this.gatherStats) {
43134
- this.collectStatSample(overallFrameTime);
43135
- }
43136
- if (this._isRunning || this.immediateRerenderRequested) {
43137
- const targetFrameTime = this.immediateRerenderRequested ? this.minTargetFrameTime : this.targetFrameTime;
43138
- const delay = Math.max(1, targetFrameTime - Math.floor(overallFrameTime));
43139
- this.immediateRerenderRequested = false;
43140
- this.renderTimeout = setTimeout(() => {
43290
+ try {
43291
+ const now = Date.now();
43292
+ const elapsed = now - this.lastTime;
43293
+ const deltaTime = elapsed;
43294
+ this.lastTime = now;
43295
+ this.frameCount++;
43296
+ if (now - this.lastFpsTime >= 1000) {
43297
+ this.currentFps = this.frameCount;
43298
+ this.frameCount = 0;
43299
+ this.lastFpsTime = now;
43300
+ }
43301
+ this.renderStats.frameCount++;
43302
+ this.renderStats.fps = this.currentFps;
43303
+ const overallStart = performance.now();
43304
+ const frameRequests = Array.from(this.animationRequest.values());
43305
+ this.animationRequest.clear();
43306
+ const animationRequestStart = performance.now();
43307
+ for (const callback of frameRequests) {
43308
+ callback(deltaTime);
43309
+ this.dropLive();
43310
+ }
43311
+ const animationRequestEnd = performance.now();
43312
+ const animationRequestTime = animationRequestEnd - animationRequestStart;
43313
+ const start = performance.now();
43314
+ for (const frameCallback of this.frameCallbacks) {
43315
+ try {
43316
+ await frameCallback(deltaTime);
43317
+ } catch (error) {
43318
+ console.error("Error in frame callback:", error);
43319
+ }
43320
+ }
43321
+ const end = performance.now();
43322
+ this.renderStats.frameCallbackTime = end - start;
43323
+ this.root.render(this.nextRenderBuffer, deltaTime);
43324
+ for (const postProcessFn of this.postProcessFns) {
43325
+ postProcessFn(this.nextRenderBuffer, deltaTime);
43326
+ }
43327
+ this._console.renderToBuffer(this.nextRenderBuffer);
43328
+ if (!this._isDestroyed) {
43329
+ this.renderNative();
43330
+ if (this._useMouse && this.lib.getHitGridDirty(this.rendererPtr)) {
43331
+ this.recheckHoverState();
43332
+ }
43333
+ const overallFrameTime = performance.now() - overallStart;
43334
+ this.lib.updateStats(this.rendererPtr, overallFrameTime, this.renderStats.fps, this.renderStats.frameCallbackTime);
43335
+ if (this.gatherStats) {
43336
+ this.collectStatSample(overallFrameTime);
43337
+ }
43338
+ if (this._isRunning || this.immediateRerenderRequested) {
43339
+ const targetFrameTime = this.immediateRerenderRequested ? this.minTargetFrameTime : this.targetFrameTime;
43340
+ const delay = Math.max(1, targetFrameTime - Math.floor(overallFrameTime));
43341
+ this.immediateRerenderRequested = false;
43342
+ this.renderTimeout = setTimeout(() => {
43343
+ this.renderTimeout = null;
43344
+ this.loop();
43345
+ }, delay);
43346
+ } else {
43347
+ clearTimeout(this.renderTimeout);
43141
43348
  this.renderTimeout = null;
43142
- this.loop();
43143
- }, delay);
43144
- } else {
43145
- clearTimeout(this.renderTimeout);
43146
- this.renderTimeout = null;
43349
+ }
43147
43350
  }
43351
+ } finally {
43352
+ this.rendering = false;
43353
+ if (this._destroyPending) {
43354
+ this.finalizeDestroy();
43355
+ }
43356
+ this.resolveIdleIfNeeded();
43148
43357
  }
43149
- this.rendering = false;
43150
- this.resolveIdleIfNeeded();
43151
43358
  }
43152
43359
  intermediateRender() {
43153
43360
  this.immediateRerenderRequested = true;
@@ -43252,7 +43459,7 @@ Captured output:
43252
43459
  requestSelectionUpdate() {
43253
43460
  if (this.currentSelection?.isSelecting) {
43254
43461
  const pointer = this._latestPointer;
43255
- const maybeRenderableId = this.lib.checkHit(this.rendererPtr, pointer.x, pointer.y);
43462
+ const maybeRenderableId = this.hitTest(pointer.x, pointer.y);
43256
43463
  const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId);
43257
43464
  this.updateSelection(maybeRenderable, pointer.x, pointer.y);
43258
43465
  }
@@ -43340,7 +43547,7 @@ Captured output:
43340
43547
  }
43341
43548
  }
43342
43549
 
43343
- // node_modules/@opentui/core/index.js
43550
+ // ../../node_modules/.pnpm/@opentui+core@0.1.74_stage-js@1.0.0-alpha.17_typescript@5.9.3_web-tree-sitter@0.25.10/node_modules/@opentui/core/index.js
43344
43551
  import { EventEmitter as EventEmitter10 } from "events";
43345
43552
 
43346
43553
  class TextBufferView {
@@ -43451,6 +43658,10 @@ class TextBufferView {
43451
43658
  this.guard();
43452
43659
  this.lib.textBufferViewSetTabIndicatorColor(this.viewPtr, color);
43453
43660
  }
43661
+ setTruncate(truncate) {
43662
+ this.guard();
43663
+ this.lib.textBufferViewSetTruncate(this.viewPtr, truncate);
43664
+ }
43454
43665
  measureForDimensions(width, height) {
43455
43666
  this.guard();
43456
43667
  return this.lib.textBufferViewMeasureForDimensions(this.viewPtr, width, height);
@@ -44645,6 +44856,7 @@ class TextBufferRenderable extends Renderable {
44645
44856
  _tabIndicatorColor;
44646
44857
  _scrollX = 0;
44647
44858
  _scrollY = 0;
44859
+ _truncate = false;
44648
44860
  textBuffer;
44649
44861
  textBufferView;
44650
44862
  _defaultOptions = {
@@ -44656,7 +44868,8 @@ class TextBufferRenderable extends Renderable {
44656
44868
  attributes: 0,
44657
44869
  wrapMode: "word",
44658
44870
  tabIndicator: undefined,
44659
- tabIndicatorColor: undefined
44871
+ tabIndicatorColor: undefined,
44872
+ truncate: false
44660
44873
  };
44661
44874
  constructor(ctx, options) {
44662
44875
  super(ctx, options);
@@ -44669,6 +44882,7 @@ class TextBufferRenderable extends Renderable {
44669
44882
  this._wrapMode = options.wrapMode ?? this._defaultOptions.wrapMode;
44670
44883
  this._tabIndicator = options.tabIndicator ?? this._defaultOptions.tabIndicator;
44671
44884
  this._tabIndicatorColor = options.tabIndicatorColor ? parseColor(options.tabIndicatorColor) : this._defaultOptions.tabIndicatorColor;
44885
+ this._truncate = options.truncate ?? this._defaultOptions.truncate;
44672
44886
  this.textBuffer = TextBuffer.create(this._ctx.widthMethod);
44673
44887
  this.textBufferView = TextBufferView.create(this.textBuffer);
44674
44888
  const style = SyntaxStyle.create();
@@ -44690,6 +44904,7 @@ class TextBufferRenderable extends Renderable {
44690
44904
  if (this.width > 0 && this.height > 0) {
44691
44905
  this.textBufferView.setViewport(this._scrollX, this._scrollY, this.width, this.height);
44692
44906
  }
44907
+ this.textBufferView.setTruncate(this._truncate);
44693
44908
  this.updateTextInfo();
44694
44909
  }
44695
44910
  onMouseEvent(event) {
@@ -44870,6 +45085,16 @@ class TextBufferRenderable extends Renderable {
44870
45085
  this.requestRender();
44871
45086
  }
44872
45087
  }
45088
+ get truncate() {
45089
+ return this._truncate;
45090
+ }
45091
+ set truncate(value) {
45092
+ if (this._truncate !== value) {
45093
+ this._truncate = value;
45094
+ this.textBufferView.setTruncate(value);
45095
+ this.requestRender();
45096
+ }
45097
+ }
44873
45098
  onResize(width, height) {
44874
45099
  this.textBufferView.setViewport(this._scrollX, this._scrollY, width, height);
44875
45100
  this.yogaNode.markDirty();
@@ -46648,7 +46873,8 @@ class TextRenderable extends TextBufferRenderable {
46648
46873
  const chunks = this.rootTextNode.gatherWithInheritedStyle({
46649
46874
  fg: this._defaultFg,
46650
46875
  bg: this._defaultBg,
46651
- attributes: this._defaultAttributes
46876
+ attributes: this._defaultAttributes,
46877
+ link: undefined
46652
46878
  });
46653
46879
  this.textBuffer.setStyledText(new StyledText(chunks));
46654
46880
  this.refreshLocalSelection();
@@ -50865,7 +51091,7 @@ class TextareaRenderable extends EditBufferRenderable {
50865
51091
  }
50866
51092
  }
50867
51093
 
50868
- // node_modules/@opentui/react/index.js
51094
+ // ../../node_modules/.pnpm/@opentui+react@0.1.74_react-devtools-core@7.0.1_react@19.2.3_stage-js@1.0.0-alpha.17_ty_fb46e0fc351a293c6633843011916d07/node_modules/@opentui/react/index.js
50869
51095
  init_chunk_e11q5a3p();
50870
51096
  var import_react = __toESM(require_react(), 1);
50871
51097
  var import_react2 = __toESM(require_react(), 1);
@@ -51000,6 +51226,36 @@ var useKeyboard = (handler, options = { release: false }) => {
51000
51226
  };
51001
51227
  }, [keyHandler, options.release]);
51002
51228
  };
51229
+ var useRenderer = () => {
51230
+ const { renderer } = useAppContext();
51231
+ if (!renderer) {
51232
+ throw new Error("Renderer not found.");
51233
+ }
51234
+ return renderer;
51235
+ };
51236
+ var useOnResize = (callback) => {
51237
+ const renderer = useRenderer();
51238
+ const stableCallback = useEffectEvent(callback);
51239
+ import_react4.useEffect(() => {
51240
+ renderer.on("resize", stableCallback);
51241
+ return () => {
51242
+ renderer.off("resize", stableCallback);
51243
+ };
51244
+ }, [renderer]);
51245
+ return renderer;
51246
+ };
51247
+ var useTerminalDimensions = () => {
51248
+ const renderer = useRenderer();
51249
+ const [dimensions, setDimensions] = import_react5.useState({
51250
+ width: renderer.width,
51251
+ height: renderer.height
51252
+ });
51253
+ const cb = (width, height) => {
51254
+ setDimensions({ width, height });
51255
+ };
51256
+ useOnResize(cb);
51257
+ return dimensions;
51258
+ };
51003
51259
  class ErrorBoundary extends import_react8.default.Component {
51004
51260
  constructor(props) {
51005
51261
  super(props);
@@ -51023,12 +51279,12 @@ class ErrorBoundary extends import_react8.default.Component {
51023
51279
  }
51024
51280
  var package_default = {
51025
51281
  name: "@opentui/react",
51026
- version: "0.1.68",
51282
+ version: "0.1.74",
51027
51283
  description: "React renderer for building terminal user interfaces using OpenTUI core",
51028
51284
  license: "MIT",
51029
51285
  repository: {
51030
51286
  type: "git",
51031
- url: "https://github.com/sst/opentui",
51287
+ url: "https://github.com/anomalyco/opentui",
51032
51288
  directory: "packages/react"
51033
51289
  },
51034
51290
  module: "src/index.ts",
@@ -51385,19 +51641,20 @@ var _r = reconciler;
51385
51641
  var flushSync = _r.flushSyncFromReconciler ?? _r.flushSync;
51386
51642
  function createRoot(renderer) {
51387
51643
  let container = null;
51644
+ const cleanup = () => {
51645
+ if (container) {
51646
+ reconciler.updateContainer(null, container, null, () => {});
51647
+ reconciler.flushSyncWork();
51648
+ container = null;
51649
+ }
51650
+ };
51651
+ renderer.once(CliRenderEvents.DESTROY, cleanup);
51388
51652
  return {
51389
51653
  render: (node) => {
51390
51654
  engine.attach(renderer);
51391
51655
  container = _render(import_react7.default.createElement(AppContext.Provider, { value: { keyHandler: renderer.keyInput, renderer } }, import_react7.default.createElement(ErrorBoundary, null, node)), renderer.root);
51392
51656
  },
51393
- unmount: () => {
51394
- if (!container) {
51395
- return;
51396
- }
51397
- reconciler.updateContainer(null, container, null, () => {});
51398
- reconciler.flushSyncWork();
51399
- container = null;
51400
- }
51657
+ unmount: cleanup
51401
51658
  };
51402
51659
  }
51403
51660
 
@@ -51410,7 +51667,7 @@ var heroText = `Hello world. You can call me Kai since we're pretty much friends
51410
51667
  var projects = [
51411
51668
  {
51412
51669
  title: "Vibedgames",
51413
- description: "Games made with vibes",
51670
+ description: "Design, publish, and play personalized multiplayer minigames with your friends",
51414
51671
  url: "https://vibedgames.com"
51415
51672
  },
51416
51673
  {
@@ -51425,14 +51682,19 @@ var projects = [
51425
51682
  },
51426
51683
  {
51427
51684
  title: "Inteligir",
51428
- description: "Lifelong learning",
51685
+ description: "Turn your social feed into your personal university with bite-sized lessons",
51429
51686
  url: "https://inteligir.com"
51430
51687
  },
51431
51688
  {
51432
51689
  title: "Dataembed",
51433
- description: "Search the web like a database",
51690
+ description: "Search the web like a database. Query and transform scattered web information",
51434
51691
  url: "https://dataembed.com"
51435
51692
  },
51693
+ {
51694
+ title: "LoremLLM",
51695
+ description: "Mock responses for LLMs",
51696
+ url: "https://loremllm.com"
51697
+ },
51436
51698
  {
51437
51699
  title: "Founding",
51438
51700
  description: "Your proxy founding team",
@@ -51445,7 +51707,7 @@ var projects = [
51445
51707
  },
51446
51708
  {
51447
51709
  title: "Covid-19 Dashboard",
51448
- description: "Visualize global Covid-19 data",
51710
+ description: "Visualize global Covid-19 data and trends",
51449
51711
  url: "https://covid-19.kyh.io"
51450
51712
  },
51451
51713
  {
@@ -51453,44 +51715,73 @@ var projects = [
51453
51715
  description: "Cute sticker pack",
51454
51716
  url: "https://apps.apple.com/us/app/id1209391711"
51455
51717
  },
51718
+ {
51719
+ title: "Policing Ice",
51720
+ description: "Documenting incidents of ICE overreach through crowdsourced video evidence",
51721
+ url: "https://policingice.com"
51722
+ },
51723
+ {
51724
+ title: "Kwadrants",
51725
+ description: "Everything lives in a 2x2 matrix",
51726
+ url: "https://kwadrants.com"
51727
+ },
51456
51728
  {
51457
51729
  title: "Init",
51458
51730
  description: "An AI native starter kit to build, launch, and scale your next project",
51459
51731
  url: "https://init.kyh.io"
51732
+ },
51733
+ {
51734
+ title: "AI Design Canvas",
51735
+ description: "A full-featured, hackable Next.js and AI sdk design canvas",
51736
+ url: "https://init.kyh.io"
51737
+ },
51738
+ {
51739
+ title: "AI Datagrid",
51740
+ description: "A full-featured, hackable Next.js AI datagrid",
51741
+ url: "https://init.kyh.io"
51460
51742
  }
51461
51743
  ];
51462
51744
  var work = [
51463
51745
  {
51464
- title: "Sequoia",
51465
- description: "Helping the daring build legendary companies",
51746
+ title: "Sequoia Capital",
51747
+ description: "Technical Staff",
51466
51748
  url: "https://sequoiacap.com"
51467
51749
  },
51468
51750
  {
51469
51751
  title: "Vercel",
51470
- description: "Build and publish wonderful things",
51752
+ description: "Software Engineer",
51471
51753
  url: "https://vercel.com"
51472
51754
  },
51473
51755
  {
51474
51756
  title: "Google",
51475
- description: "Looking for something?",
51757
+ description: "Design Engineer",
51476
51758
  url: "https://grow.google"
51477
51759
  },
51478
51760
  {
51479
51761
  title: "Amazon",
51480
- description: "Earth's biggest bookstore",
51762
+ description: "Software Engineer",
51481
51763
  url: "https://amazon.design"
51482
51764
  },
51765
+ {
51766
+ title: "Atrium",
51767
+ description: "Software Engineer",
51768
+ url: "https://crunchbase.com/organization/atrium-lts"
51769
+ },
51483
51770
  {
51484
51771
  title: "Cardiogram",
51485
- description: "Your personal healthcare assistant",
51486
- url: "https://apps.apple.com/us/app/cardiogram/id1000017994"
51772
+ description: "Design Engineer",
51773
+ url: "https://crunchbase.com/organization/cardiogram"
51487
51774
  }
51488
51775
  ];
51489
51776
  var contactLinks = [
51490
51777
  { label: "Website", value: "kyh.io", url: "https://kyh.io" },
51491
51778
  { label: "GitHub", value: "github.com/kyh", url: "https://github.com/kyh" },
51492
51779
  { label: "X", value: "x.com/kaiyuhsu", url: "https://x.com/kaiyuhsu" },
51493
- { label: "LinkedIn", value: "linkedin.com/in/kyh", url: "https://linkedin.com/in/kyh" },
51780
+ {
51781
+ label: "LinkedIn",
51782
+ value: "linkedin.com/in/kyh",
51783
+ url: "https://linkedin.com/in/kyh"
51784
+ },
51494
51785
  { label: "Email", value: "hello@kyh.io", url: "mailto:hello@kyh.io" }
51495
51786
  ];
51496
51787
 
@@ -51519,7 +51810,7 @@ function wrapText(text, width) {
51519
51810
  return lines;
51520
51811
  }
51521
51812
 
51522
- // node_modules/@opentui/react/jsx-dev-runtime.js
51813
+ // ../../node_modules/.pnpm/@opentui+react@0.1.74_react-devtools-core@7.0.1_react@19.2.3_stage-js@1.0.0-alpha.17_ty_fb46e0fc351a293c6633843011916d07/node_modules/@opentui/react/jsx-dev-runtime.js
51523
51814
  var import_jsx_dev_runtime2 = __toESM(require_jsx_dev_runtime(), 1);
51524
51815
 
51525
51816
  // src/index.tsx
@@ -51536,7 +51827,7 @@ function App() {
51536
51827
  const [selectedIndex, setSelectedIndex] = import_react12.useState(0);
51537
51828
  const [showContact, setShowContact] = import_react12.useState(false);
51538
51829
  const [contactIndex, setContactIndex] = import_react12.useState(0);
51539
- const termWidth = process.stdout.columns || 80;
51830
+ const { width: termWidth, height: termHeight } = useTerminalDimensions();
51540
51831
  const contentWidth = termWidth - 4;
51541
51832
  const descWidth = contentWidth - DESC_INDENT;
51542
51833
  useKeyboard((key) => {
@@ -51664,44 +51955,48 @@ function App() {
51664
51955
  flexDirection: "column",
51665
51956
  paddingLeft: 2,
51666
51957
  paddingTop: 1,
51667
- flexGrow: 1,
51958
+ height: termHeight,
51959
+ width: termWidth,
51668
51960
  children: [
51669
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("box", {
51670
- flexDirection: "column",
51961
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("scrollbox", {
51962
+ focused: true,
51671
51963
  flexGrow: 1,
51672
- children: [
51673
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51674
- children: name
51675
- }, undefined, false, undefined, this),
51676
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51677
- children: " "
51678
- }, undefined, false, undefined, this),
51679
- heroLines.map((line, i) => /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51680
- fg: DIM,
51681
- children: line
51682
- }, i, false, undefined, this)),
51683
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51684
- children: " "
51685
- }, undefined, false, undefined, this),
51686
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51687
- children: "Projects"
51688
- }, undefined, false, undefined, this),
51689
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51690
- children: " "
51691
- }, undefined, false, undefined, this),
51692
- projects.map((project, i) => renderItem(project, i, i === 0)),
51693
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51694
- children: " "
51695
- }, undefined, false, undefined, this),
51696
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51697
- children: "Work"
51698
- }, undefined, false, undefined, this),
51699
- /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51700
- children: " "
51701
- }, undefined, false, undefined, this),
51702
- work.map((item, i) => renderItem(item, projects.length + i, i === 0))
51703
- ]
51704
- }, undefined, true, undefined, this),
51964
+ children: /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("box", {
51965
+ flexDirection: "column",
51966
+ children: [
51967
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51968
+ children: name
51969
+ }, undefined, false, undefined, this),
51970
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51971
+ children: " "
51972
+ }, undefined, false, undefined, this),
51973
+ heroLines.map((line, i) => /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51974
+ fg: DIM,
51975
+ children: line
51976
+ }, i, false, undefined, this)),
51977
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51978
+ children: " "
51979
+ }, undefined, false, undefined, this),
51980
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51981
+ children: "Projects"
51982
+ }, undefined, false, undefined, this),
51983
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51984
+ children: " "
51985
+ }, undefined, false, undefined, this),
51986
+ projects.map((project, i) => renderItem(project, i, i === 0)),
51987
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51988
+ children: " "
51989
+ }, undefined, false, undefined, this),
51990
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51991
+ children: "Work"
51992
+ }, undefined, false, undefined, this),
51993
+ /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51994
+ children: " "
51995
+ }, undefined, false, undefined, this),
51996
+ work.map((item, i) => renderItem(item, projects.length + i, i === 0))
51997
+ ]
51998
+ }, undefined, true, undefined, this)
51999
+ }, undefined, false, undefined, this),
51705
52000
  /* @__PURE__ */ import_jsx_dev_runtime2.jsxDEV("text", {
51706
52001
  fg: DIM,
51707
52002
  children: "\u2191\u2193 navigate enter open c contact q quit"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kyh",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Personal CLI tool",
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,8 +13,8 @@
13
13
  "access": "public"
14
14
  },
15
15
  "dependencies": {
16
- "@opentui/core": "^0.1.69",
17
- "@opentui/react": "^0.1.69",
16
+ "@opentui/core": "^0.1.74",
17
+ "@opentui/react": "^0.1.74",
18
18
  "react": "^19.2.3"
19
19
  },
20
20
  "devDependencies": {