@opentui/core 0.4.1 → 0.4.3

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/Renderable.d.ts CHANGED
@@ -10,8 +10,6 @@ import type { RenderContext } from "./types.js";
10
10
  declare const BrandedRenderable: unique symbol;
11
11
  export declare enum LayoutEvents {
12
12
  LAYOUT_CHANGED = "layout-changed",
13
- ADDED = "added",
14
- REMOVED = "removed",
15
13
  RESIZED = "resized"
16
14
  }
17
15
  export declare enum RenderableEvents {
@@ -98,7 +96,7 @@ export declare abstract class BaseRenderable extends EventEmitter {
98
96
  protected _visible: boolean;
99
97
  constructor(options: BaseRenderableOptions);
100
98
  abstract add(obj: BaseRenderable | unknown, index?: number): number;
101
- abstract remove(id: string): void;
99
+ abstract remove(child: BaseRenderable): void;
102
100
  abstract insertBefore(obj: BaseRenderable | unknown, anchor: BaseRenderable | unknown): void;
103
101
  abstract getChildren(): BaseRenderable[];
104
102
  abstract getChildrenCount(): number;
@@ -151,7 +149,6 @@ export declare abstract class Renderable extends BaseRenderable {
151
149
  protected _position: Position;
152
150
  protected _opacity: number;
153
151
  private _flexShrink;
154
- private renderableMapById;
155
152
  protected _childrenInLayoutOrder: Renderable[];
156
153
  protected _childrenInZIndexOrder: Renderable[];
157
154
  private needsZIndexSort;
@@ -164,8 +161,6 @@ export declare abstract class Renderable extends BaseRenderable {
164
161
  renderBefore?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void;
165
162
  renderAfter?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void;
166
163
  constructor(ctx: RenderContext, options: RenderableOptions<any>);
167
- get id(): string;
168
- set id(value: string);
169
164
  get focusable(): boolean;
170
165
  set focusable(value: boolean);
171
166
  get ctx(): RenderContext;
@@ -267,7 +262,7 @@ export declare abstract class Renderable extends BaseRenderable {
267
262
  add(obj: Renderable | VNode<any, any[]> | unknown, index?: number): number;
268
263
  insertBefore(obj: Renderable | VNode<any, any[]> | unknown, anchor?: Renderable | unknown): number;
269
264
  getRenderable(id: string): Renderable | undefined;
270
- remove(id: string): void;
265
+ remove(child: BaseRenderable): void;
271
266
  protected onRemove(): void;
272
267
  getChildren(): Renderable[];
273
268
  getChildrenCount(): number;
@@ -351,7 +351,7 @@ function createNodeBackend(nodeFfi) {
351
351
  let closed = false;
352
352
  let libraryClosed = false;
353
353
  return {
354
- symbols: wrapNodeSymbols(functions, symbols, nodeFfi),
354
+ symbols: wrapNodeSymbols(functions, symbols),
355
355
  createCallback(callback, definition) {
356
356
  if (closed) {
357
357
  throw new Error(LIBRARY_CLOSED);
@@ -402,10 +402,10 @@ function toNodeLibraryPath(path) {
402
402
  function normalizeNodeDefinitions(definitions) {
403
403
  return Object.fromEntries(Object.entries(definitions).map(([name, definition]) => [name, normalizeNodeDefinition(definition)]));
404
404
  }
405
- function wrapNodeSymbols(functions, definitions, nodeFfi) {
406
- return Object.fromEntries(Object.entries(functions).map(([name, fn]) => [name, wrapNodeSymbol(fn, definitions[name], nodeFfi)]));
405
+ function wrapNodeSymbols(functions, definitions) {
406
+ return Object.fromEntries(Object.entries(functions).map(([name, fn]) => [name, wrapNodeSymbol(fn, definitions[name])]));
407
407
  }
408
- function wrapNodeSymbol(fn, definition, nodeFfi) {
408
+ function wrapNodeSymbol(fn, definition) {
409
409
  const pointerArgIndexes = (definition.args ?? []).flatMap((type, index) => isNodePointerArgumentType(type) ? [index] : []);
410
410
  if (pointerArgIndexes.length === 0) {
411
411
  return fn;
@@ -413,7 +413,7 @@ function wrapNodeSymbol(fn, definition, nodeFfi) {
413
413
  return (...args) => {
414
414
  const normalizedArgs = args.slice();
415
415
  for (const index of pointerArgIndexes) {
416
- normalizedArgs[index] = toNodePointerArgument(nodeFfi, normalizedArgs[index]);
416
+ normalizedArgs[index] = toNodePointerArgument(normalizedArgs[index]);
417
417
  }
418
418
  return fn(...normalizedArgs);
419
419
  };
@@ -421,7 +421,7 @@ function wrapNodeSymbol(fn, definition, nodeFfi) {
421
421
  function isNodePointerArgumentType(type) {
422
422
  return type === FFIType.ptr || type === FFIType.pointer || type === FFIType.function || type === FFIType.callback;
423
423
  }
424
- function toNodePointerArgument(nodeFfi, value) {
424
+ function toNodePointerArgument(value) {
425
425
  if (value == null) {
426
426
  return 0n;
427
427
  }
@@ -429,16 +429,19 @@ function toNodePointerArgument(nodeFfi, value) {
429
429
  return toBigIntPointer(value);
430
430
  }
431
431
  if (ArrayBuffer.isView(value)) {
432
+ if (!(value.buffer instanceof ArrayBuffer)) {
433
+ throw new TypeError(NODE_PTR_VALUE);
434
+ }
432
435
  if (value.byteLength === 0) {
433
436
  return 0n;
434
437
  }
435
- return toNodeSourcePointer(nodeFfi, value);
438
+ return value;
436
439
  }
437
440
  if (value instanceof ArrayBuffer) {
438
441
  if (value.byteLength === 0) {
439
442
  return 0n;
440
443
  }
441
- return toNodeSourcePointer(nodeFfi, value);
444
+ return value;
442
445
  }
443
446
  throw new TypeError(NODE_POINTER_ARGUMENT);
444
447
  }
@@ -10235,6 +10238,40 @@ function decodePasteBytes(bytes) {
10235
10238
  function stripAnsiSequences(text) {
10236
10239
  return stripANSI(text);
10237
10240
  }
10241
+ // src/lib/clipboard.ts
10242
+ var ClipboardTarget;
10243
+ ((ClipboardTarget2) => {
10244
+ ClipboardTarget2[ClipboardTarget2["Clipboard"] = 0] = "Clipboard";
10245
+ ClipboardTarget2[ClipboardTarget2["Primary"] = 1] = "Primary";
10246
+ ClipboardTarget2[ClipboardTarget2["Select"] = 2] = "Select";
10247
+ ClipboardTarget2[ClipboardTarget2["Secondary"] = 3] = "Secondary";
10248
+ })(ClipboardTarget ||= {});
10249
+
10250
+ class Clipboard {
10251
+ lib;
10252
+ rendererPtr;
10253
+ constructor(lib, rendererPtr) {
10254
+ this.lib = lib;
10255
+ this.rendererPtr = rendererPtr;
10256
+ }
10257
+ copyToClipboardOSC52(text, target = 0 /* Clipboard */) {
10258
+ if (!this.isOsc52Supported()) {
10259
+ return false;
10260
+ }
10261
+ const textUtf8 = this.lib.encoder.encode(text);
10262
+ return this.lib.copyToClipboardOSC52(this.rendererPtr, target, textUtf8);
10263
+ }
10264
+ clearClipboardOSC52(target = 0 /* Clipboard */) {
10265
+ if (!this.isOsc52Supported()) {
10266
+ return false;
10267
+ }
10268
+ return this.lib.clearClipboardOSC52(this.rendererPtr, target);
10269
+ }
10270
+ isOsc52Supported() {
10271
+ const caps = this.lib.getTerminalCapabilities(this.rendererPtr);
10272
+ return caps?.osc52_support !== "unsupported";
10273
+ }
10274
+ }
10238
10275
  // src/lib/detect-links.ts
10239
10276
  var URL_SCOPES = ["markup.link.url", "string.special.url"];
10240
10277
  function detectLinks(chunks, context) {
@@ -10784,7 +10821,7 @@ class TextBuffer {
10784
10821
  }
10785
10822
  }
10786
10823
 
10787
- // ../../node_modules/.bun/bun-ffi-structs@0.2.3+1fb4c65d43e298b9/node_modules/bun-ffi-structs/dist/index.js
10824
+ // ../../node_modules/.bun/bun-ffi-structs@0.2.4+1fb4c65d43e298b9/node_modules/bun-ffi-structs/dist/index.js
10788
10825
  var FFI_LOAD_ERROR = "bun-ffi-structs requires Bun or Node.js with node:ffi enabled (--experimental-ffi --allow-ffi).";
10789
10826
  var backend2 = await loadBackend2();
10790
10827
  function unavailable2(cause) {
@@ -11034,6 +11071,20 @@ function defineStruct(fields, structDefOptions) {
11034
11071
  size = typeSizes[typeOrStruct];
11035
11072
  align = typeAlignments[typeOrStruct];
11036
11073
  ({ pack, unpack } = primitivePackers(typeOrStruct));
11074
+ if (typeOrStruct === "pointer") {
11075
+ pack = (view, off, val) => {
11076
+ if (val instanceof ArrayBuffer || ArrayBuffer.isView(val)) {
11077
+ if (val.byteLength === 0) {
11078
+ pointerPacker(view, off, null);
11079
+ return;
11080
+ }
11081
+ pointerPacker(view, off, ptr2(val));
11082
+ retainPointerTarget(view.buffer, val);
11083
+ return;
11084
+ }
11085
+ pointerPacker(view, off, val);
11086
+ };
11087
+ }
11037
11088
  } else if (typeof typeOrStruct === "string" && typeOrStruct === "cstring") {
11038
11089
  size = pointerSize;
11039
11090
  align = pointerSize;
@@ -11507,7 +11558,7 @@ function defineStruct(fields, structDefOptions) {
11507
11558
  }
11508
11559
 
11509
11560
  // src/zig-structs.ts
11510
- var rgbaPackTransform = (rgba) => rgba ? ptr(rgba.buffer) : null;
11561
+ var rgbaPackTransform = (rgba) => rgba?.buffer ?? null;
11511
11562
  var rgbaUnpackTransform = (ptr3) => ptr3 ? RGBA.fromArray(new Uint16Array(toArrayBuffer(ptr3, 0, 8))) : undefined;
11512
11563
  var StyledChunkStruct = defineStruct([
11513
11564
  ["text", "char*"],
@@ -11573,6 +11624,7 @@ var VisualCursorStruct = defineStruct([
11573
11624
  ]);
11574
11625
  var UnicodeMethodEnum = defineEnum({ wcwidth: 0, unicode: 1 }, "u8");
11575
11626
  var TerminalMultiplexerEnum = defineEnum({ none: 0, tmux: 1, zellij: 2, screen: 3, unknown: 4 }, "u8");
11627
+ var Osc52SupportEnum = defineEnum({ unknown: 0, supported: 1, unsupported: 2 }, "u8");
11576
11628
  var TerminalCapabilitiesStruct = defineStruct([
11577
11629
  ["kitty_keyboard", "bool_u8"],
11578
11630
  ["kitty_graphics", "bool_u8"],
@@ -11597,7 +11649,8 @@ var TerminalCapabilitiesStruct = defineStruct([
11597
11649
  ["term_name_len", "u64", { lengthOf: "term_name" }],
11598
11650
  ["term_version", "char*"],
11599
11651
  ["term_version_len", "u64", { lengthOf: "term_version" }],
11600
- ["term_from_xtversion", "bool_u8"]
11652
+ ["term_from_xtversion", "bool_u8"],
11653
+ ["osc52_support", Osc52SupportEnum]
11601
11654
  ]);
11602
11655
  var EncodedCharStruct = defineStruct([
11603
11656
  ["width", "u8"],
@@ -11882,6 +11935,22 @@ function getOpenTUILib(libPath) {
11882
11935
  args: ["u32"],
11883
11936
  returns: "void"
11884
11937
  },
11938
+ createNativeRenderable: {
11939
+ args: [],
11940
+ returns: "u32"
11941
+ },
11942
+ destroyNativeRenderable: {
11943
+ args: ["u32"],
11944
+ returns: "void"
11945
+ },
11946
+ nativeRenderableAttachYogaNode: {
11947
+ args: ["u32", "ptr"],
11948
+ returns: "bool"
11949
+ },
11950
+ nativeRenderableSetMeasureTarget: {
11951
+ args: ["u32", "u32", "u32"],
11952
+ returns: "bool"
11953
+ },
11885
11954
  createRenderer: {
11886
11955
  args: ["u32", "u32", "u8", "u8", "ptr"],
11887
11956
  returns: "u32"
@@ -13015,7 +13084,7 @@ function getOpenTUILib(libPath) {
13015
13084
  returns: "u64"
13016
13085
  },
13017
13086
  yogaNodeSetMeasureFunc: {
13018
- args: ["ptr", "ptr"],
13087
+ args: ["ptr", "bool"],
13019
13088
  returns: "void"
13020
13089
  },
13021
13090
  yogaNodeUnsetMeasureFunc: {
@@ -13027,7 +13096,7 @@ function getOpenTUILib(libPath) {
13027
13096
  returns: "bool"
13028
13097
  },
13029
13098
  yogaNodeSetDirtiedFunc: {
13030
- args: ["ptr", "ptr"],
13099
+ args: ["ptr", "bool"],
13031
13100
  returns: "void"
13032
13101
  },
13033
13102
  yogaNodeUnsetDirtiedFunc: {
@@ -13038,6 +13107,14 @@ function getOpenTUILib(libPath) {
13038
13107
  args: ["f32", "f32"],
13039
13108
  returns: "void"
13040
13109
  },
13110
+ yogaSetMeasureCallback: {
13111
+ args: ["ptr"],
13112
+ returns: "void"
13113
+ },
13114
+ yogaSetDirtiedCallback: {
13115
+ args: ["ptr"],
13116
+ returns: "void"
13117
+ },
13041
13118
  createAudioEngine: {
13042
13119
  args: ["ptr"],
13043
13120
  returns: "u32"
@@ -13328,6 +13405,11 @@ var LogLevel2;
13328
13405
  LogLevel3[LogLevel3["Info"] = 2] = "Info";
13329
13406
  LogLevel3[LogLevel3["Debug"] = 3] = "Debug";
13330
13407
  })(LogLevel2 ||= {});
13408
+ var NativeMeasureTargetKind = {
13409
+ None: 0,
13410
+ TextBufferView: 1,
13411
+ EditorView: 2
13412
+ };
13331
13413
 
13332
13414
  class FFIRenderLib {
13333
13415
  opentui;
@@ -13340,6 +13422,21 @@ class FFIRenderLib {
13340
13422
  _anyEventHandlers = [];
13341
13423
  nativeSpanFeedCallbackWrapper = null;
13342
13424
  nativeSpanFeedHandlers = new Map;
13425
+ createNativeRenderable() {
13426
+ const handle = this.opentui.symbols.createNativeRenderable();
13427
+ if (!handle)
13428
+ throw new Error("Failed to create native renderable");
13429
+ return handle;
13430
+ }
13431
+ destroyNativeRenderable(handle) {
13432
+ this.opentui.symbols.destroyNativeRenderable(handle);
13433
+ }
13434
+ nativeRenderableAttachYogaNode(handle, node) {
13435
+ return Boolean(this.opentui.symbols.nativeRenderableAttachYogaNode(handle, node));
13436
+ }
13437
+ nativeRenderableSetMeasureTarget(handle, kind, target) {
13438
+ return Boolean(this.opentui.symbols.nativeRenderableSetMeasureTarget(handle, kind, target));
13439
+ }
13343
13440
  constructor(libPath) {
13344
13441
  this.opentui = getOpenTUILib(libPath);
13345
13442
  try {
@@ -13400,6 +13497,8 @@ class FFIRenderLib {
13400
13497
  this.opentui.symbols.destroyEventSink(this.eventSinkPtr);
13401
13498
  this.eventSinkPtr = null;
13402
13499
  }
13500
+ this.yogaSetMeasureCallback(null);
13501
+ this.yogaSetDirtiedCallback(null);
13403
13502
  this.setLogCallback(null);
13404
13503
  } finally {
13405
13504
  try {
@@ -13710,7 +13809,7 @@ class FFIRenderLib {
13710
13809
  const blinking = options.blinking != null ? options.blinking ? 1 : 0 : 255;
13711
13810
  const cursor = options.cursor != null ? MOUSE_STYLE_TO_ID[options.cursor] : 255;
13712
13811
  const buffer = CursorStyleOptionsStruct.pack({ style, blinking, color: options.color, cursor });
13713
- this.opentui.symbols.setCursorStyleOptions(renderer, ptr(buffer));
13812
+ this.opentui.symbols.setCursorStyleOptions(renderer, buffer);
13714
13813
  }
13715
13814
  render(renderer, force) {
13716
13815
  return this.opentui.symbols.render(renderer, ffiBool(force));
@@ -13761,8 +13860,10 @@ class FFIRenderLib {
13761
13860
  const titleBytes = this.encoder.encode(title);
13762
13861
  this.opentui.symbols.setTerminalTitle(renderer, ptrOrNull(titleBytes), titleBytes.byteLength);
13763
13862
  }
13764
- copyToClipboardOSC52(renderer, target, payload) {
13765
- return Boolean(this.opentui.symbols.copyToClipboardOSC52(renderer, target, ptrOrNull(payload), payload.byteLength));
13863
+ copyToClipboardOSC52(renderer, target, textUtf8) {
13864
+ if (textUtf8.byteLength > 4294967295)
13865
+ return false;
13866
+ return Boolean(this.opentui.symbols.copyToClipboardOSC52(renderer, target, ptrOrNull(textUtf8), textUtf8.byteLength));
13766
13867
  }
13767
13868
  clearClipboardOSC52(renderer, target) {
13768
13869
  return Boolean(this.opentui.symbols.clearClipboardOSC52(renderer, target));
@@ -13996,17 +14097,17 @@ class FFIRenderLib {
13996
14097
  yogaNodeStyleGetValue(node, kind, edgeOrGutter) {
13997
14098
  return this.opentui.symbols.yogaNodeStyleGetValue(node, kind, edgeOrGutter);
13998
14099
  }
13999
- yogaNodeSetMeasureFunc(node, callback) {
14000
- this.opentui.symbols.yogaNodeSetMeasureFunc(node, callback);
14100
+ yogaNodeSetMeasureFunc(node, enabled) {
14101
+ this.opentui.symbols.yogaNodeSetMeasureFunc(node, ffiBool(enabled));
14001
14102
  }
14002
14103
  yogaNodeUnsetMeasureFunc(node) {
14003
14104
  this.opentui.symbols.yogaNodeUnsetMeasureFunc(node);
14004
14105
  }
14005
14106
  yogaNodeHasMeasureFunc(node) {
14006
- return this.opentui.symbols.yogaNodeHasMeasureFunc(node);
14107
+ return Boolean(this.opentui.symbols.yogaNodeHasMeasureFunc(node));
14007
14108
  }
14008
- yogaNodeSetDirtiedFunc(node, callback) {
14009
- this.opentui.symbols.yogaNodeSetDirtiedFunc(node, callback);
14109
+ yogaNodeSetDirtiedFunc(node, enabled) {
14110
+ this.opentui.symbols.yogaNodeSetDirtiedFunc(node, ffiBool(enabled));
14010
14111
  }
14011
14112
  yogaNodeUnsetDirtiedFunc(node) {
14012
14113
  this.opentui.symbols.yogaNodeUnsetDirtiedFunc(node);
@@ -14014,6 +14115,12 @@ class FFIRenderLib {
14014
14115
  yogaStoreMeasureResult(width, height) {
14015
14116
  this.opentui.symbols.yogaStoreMeasureResult(width, height);
14016
14117
  }
14118
+ yogaSetMeasureCallback(callback) {
14119
+ this.opentui.symbols.yogaSetMeasureCallback(callback);
14120
+ }
14121
+ yogaSetDirtiedCallback(callback) {
14122
+ this.opentui.symbols.yogaSetDirtiedCallback(callback);
14123
+ }
14017
14124
  createYogaMeasureCallback(callback) {
14018
14125
  return this.opentui.createCallback(callback, {
14019
14126
  args: ["ptr", "f32", "u32", "f32", "u32"],
@@ -14022,7 +14129,7 @@ class FFIRenderLib {
14022
14129
  }
14023
14130
  createYogaDirtiedCallback(callback) {
14024
14131
  return this.opentui.createCallback(callback, {
14025
- args: [],
14132
+ args: ["ptr"],
14026
14133
  returns: "void"
14027
14134
  });
14028
14135
  }
@@ -14102,7 +14209,7 @@ class FFIRenderLib {
14102
14209
  return;
14103
14210
  }
14104
14211
  const chunksBuffer = StyledChunkStruct.packList(chunks);
14105
- this.opentui.symbols.textBufferSetStyledText(buffer, ptr(chunksBuffer), chunks.length);
14212
+ this.opentui.symbols.textBufferSetStyledText(buffer, chunksBuffer, chunks.length);
14106
14213
  }
14107
14214
  textBufferGetLineCount(buffer) {
14108
14215
  return this.opentui.symbols.textBufferGetLineCount(buffer);
@@ -14733,6 +14840,7 @@ class FFIRenderLib {
14733
14840
  bracketed_paste: caps.bracketed_paste,
14734
14841
  hyperlinks: caps.hyperlinks,
14735
14842
  osc52: caps.osc52,
14843
+ osc52_support: caps.osc52_support,
14736
14844
  notifications: caps.notifications,
14737
14845
  explicit_cursor_positioning: caps.explicit_cursor_positioning,
14738
14846
  remote: caps.remote,
@@ -14989,7 +15097,7 @@ class FFIRenderLib {
14989
15097
  return;
14990
15098
  }
14991
15099
  const chunksBuffer = StyledChunkStruct.packList(nonEmptyChunks);
14992
- this.opentui.symbols.editorViewSetPlaceholderStyledText(view, ptr(chunksBuffer), nonEmptyChunks.length);
15100
+ this.opentui.symbols.editorViewSetPlaceholderStyledText(view, chunksBuffer, nonEmptyChunks.length);
14993
15101
  }
14994
15102
  editorViewSetTabIndicator(view, indicator) {
14995
15103
  this.opentui.symbols.editorViewSetTabIndicator(view, indicator);
@@ -15278,11 +15386,52 @@ var YogaEdgeLayoutKind = {
15278
15386
  };
15279
15387
  var UNDEFINED_VALUE = { unit: 0 /* Undefined */, value: NaN };
15280
15388
  var nodeRegistry = new Map;
15389
+ var measureRegistry = new Map;
15390
+ var dirtiedRegistry = new Map;
15391
+ var measureCallback = null;
15392
+ var measureCallbackLib = null;
15393
+ var dirtiedCallback = null;
15394
+ var dirtiedCallbackLib = null;
15281
15395
  function lib() {
15282
15396
  return resolveRenderLib();
15283
15397
  }
15284
- function pointerKey(pointer) {
15285
- return String(pointer);
15398
+ function ensureMeasureCallback() {
15399
+ const renderLib = lib();
15400
+ if (measureCallback?.ptr && measureCallbackLib === renderLib)
15401
+ return;
15402
+ const callback = (node, width, widthMode, height, heightMode) => {
15403
+ const measureFunc = node ? measureRegistry.get(node) : undefined;
15404
+ const result = measureFunc?.(width, widthMode, height, heightMode);
15405
+ renderLib.yogaStoreMeasureResult(result?.width ?? NaN, result?.height ?? NaN);
15406
+ };
15407
+ measureCallback = renderLib.createYogaMeasureCallback(callback);
15408
+ if (!measureCallback.ptr) {
15409
+ measureCallback.close();
15410
+ measureCallback = null;
15411
+ throw new Error("Failed to create Yoga measure callback");
15412
+ }
15413
+ renderLib.yogaSetMeasureCallback(measureCallback.ptr);
15414
+ measureCallbackLib = renderLib;
15415
+ }
15416
+ function ensureDirtiedCallback() {
15417
+ const renderLib = lib();
15418
+ if (dirtiedCallback?.ptr && dirtiedCallbackLib === renderLib)
15419
+ return;
15420
+ const callback = (node) => {
15421
+ if (!node)
15422
+ return;
15423
+ const registration = dirtiedRegistry.get(node);
15424
+ if (registration)
15425
+ registration.callback(registration.node);
15426
+ };
15427
+ dirtiedCallback = renderLib.createYogaDirtiedCallback(callback);
15428
+ if (!dirtiedCallback.ptr) {
15429
+ dirtiedCallback.close();
15430
+ dirtiedCallback = null;
15431
+ throw new Error("Failed to create Yoga dirtied callback");
15432
+ }
15433
+ renderLib.yogaSetDirtiedCallback(dirtiedCallback.ptr);
15434
+ dirtiedCallbackLib = renderLib;
15286
15435
  }
15287
15436
  function isValueObject(value) {
15288
15437
  return typeof value === "object" && value !== null && "unit" in value && "value" in value;
@@ -15385,11 +15534,9 @@ class Config {
15385
15534
  class Node {
15386
15535
  ptr;
15387
15536
  freed = false;
15388
- measureCallback = null;
15389
- dirtiedCallback = null;
15390
15537
  constructor(ptr3) {
15391
15538
  this.ptr = ptr3;
15392
- nodeRegistry.set(pointerKey(ptr3), this);
15539
+ nodeRegistry.set(ptr3, this);
15393
15540
  }
15394
15541
  static create(config) {
15395
15542
  return Node.fromPointer(config ? lib().yogaNodeCreateWithConfig(config.ptr) : lib().yogaNodeCreate());
@@ -15407,8 +15554,7 @@ class Node {
15407
15554
  node.free();
15408
15555
  }
15409
15556
  static fromPointer(ptr3) {
15410
- const key = pointerKey(ptr3);
15411
- const existing = nodeRegistry.get(key);
15557
+ const existing = nodeRegistry.get(ptr3);
15412
15558
  if (existing)
15413
15559
  return existing;
15414
15560
  return new Node(ptr3);
@@ -15429,8 +15575,7 @@ class Node {
15429
15575
  return;
15430
15576
  const nodes = this.collectSubtree([]);
15431
15577
  for (const node of nodes) {
15432
- node.closeMeasureCallback();
15433
- node.closeDirtiedCallback();
15578
+ node.unregisterCallbacks();
15434
15579
  }
15435
15580
  lib().yogaNodeFreeRecursive(this.ptr);
15436
15581
  for (const node of nodes) {
@@ -15784,23 +15929,15 @@ class Node {
15784
15929
  this.unsetMeasureFunc();
15785
15930
  if (!measureFunc)
15786
15931
  return;
15787
- const callback = (_node, width, widthMode, height, heightMode) => {
15788
- const result = measureFunc(width, widthMode, height, heightMode);
15789
- lib().yogaStoreMeasureResult(result.width ?? NaN, result.height ?? NaN);
15790
- };
15791
- this.measureCallback = lib().createYogaMeasureCallback(callback);
15792
- if (!this.measureCallback.ptr) {
15793
- this.measureCallback.close();
15794
- this.measureCallback = null;
15795
- throw new Error("Failed to create Yoga measure callback");
15796
- }
15797
- lib().yogaNodeSetMeasureFunc(this.ptr, this.measureCallback.ptr);
15932
+ ensureMeasureCallback();
15933
+ measureRegistry.set(this.ptr, measureFunc);
15934
+ lib().yogaNodeSetMeasureFunc(this.ptr, true);
15798
15935
  }
15799
15936
  unsetMeasureFunc() {
15800
15937
  if (this.freed)
15801
15938
  return;
15802
15939
  lib().yogaNodeUnsetMeasureFunc(this.ptr);
15803
- this.closeMeasureCallback();
15940
+ measureRegistry.delete(this.ptr);
15804
15941
  }
15805
15942
  hasMeasureFunc() {
15806
15943
  if (this.freed)
@@ -15813,22 +15950,15 @@ class Node {
15813
15950
  this.unsetDirtiedFunc();
15814
15951
  if (!dirtiedFunc)
15815
15952
  return;
15816
- const callback = () => {
15817
- dirtiedFunc(this);
15818
- };
15819
- this.dirtiedCallback = lib().createYogaDirtiedCallback(callback);
15820
- if (!this.dirtiedCallback.ptr) {
15821
- this.dirtiedCallback.close();
15822
- this.dirtiedCallback = null;
15823
- throw new Error("Failed to create Yoga dirtied callback");
15824
- }
15825
- lib().yogaNodeSetDirtiedFunc(this.ptr, this.dirtiedCallback.ptr);
15953
+ ensureDirtiedCallback();
15954
+ dirtiedRegistry.set(this.ptr, { node: this, callback: dirtiedFunc });
15955
+ lib().yogaNodeSetDirtiedFunc(this.ptr, true);
15826
15956
  }
15827
15957
  unsetDirtiedFunc() {
15828
15958
  if (this.freed)
15829
15959
  return;
15830
15960
  lib().yogaNodeUnsetDirtiedFunc(this.ptr);
15831
- this.closeDirtiedCallback();
15961
+ dirtiedRegistry.delete(this.ptr);
15832
15962
  }
15833
15963
  setEnum(kind, value) {
15834
15964
  if (this.freed)
@@ -15868,21 +15998,14 @@ class Node {
15868
15998
  nodes.push(this);
15869
15999
  return nodes;
15870
16000
  }
15871
- closeMeasureCallback() {
15872
- if (!this.measureCallback)
15873
- return;
15874
- this.measureCallback.close();
15875
- this.measureCallback = null;
15876
- }
15877
- closeDirtiedCallback() {
15878
- if (!this.dirtiedCallback)
15879
- return;
15880
- this.dirtiedCallback.close();
15881
- this.dirtiedCallback = null;
16001
+ unregisterCallbacks() {
16002
+ measureRegistry.delete(this.ptr);
16003
+ dirtiedRegistry.delete(this.ptr);
15882
16004
  }
15883
16005
  markFreed() {
16006
+ this.unregisterCallbacks();
15884
16007
  this.freed = true;
15885
- nodeRegistry.delete(pointerKey(this.ptr));
16008
+ nodeRegistry.delete(this.ptr);
15886
16009
  }
15887
16010
  }
15888
16011
  var Yoga = {
@@ -15981,7 +16104,7 @@ var Yoga = {
15981
16104
  };
15982
16105
  var yoga_default = Yoga;
15983
16106
 
15984
- export { toArrayBuffer, sleep, stringWidth2 as stringWidth, DEFAULT_FOREGROUND_RGB, DEFAULT_BACKGROUND_RGB, normalizeIndexedColorIndex, ansi256IndexToRgb, RGBA, normalizeColorValue, hexToRgb, rgbToHex, hsvToRgb, parseColor, isValidBorderStyle, parseBorderStyle, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, KeyEvent, PasteEvent, KeyHandler, InternalKeyHandler, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, ATTRIBUTE_BASE_BITS, ATTRIBUTE_BASE_MASK, getBaseAttributes, DebugOverlayCorner, TargetChannel, createTextAttributes, attributesWithLink, getLinkId, 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, link, t, hastToStyledText, SystemClock, nonAlphanumericKeys, terminalNamedSingleStrokeKeys, parseKeypress, LinearScrollAccel, MacOSScrollAccel, parseAlign, parseAlignItems, parseBoxSizing, parseDimension, parseDirection, parseDisplay, parseEdge, parseFlexDirection, parseGutter, parseJustify, parseLogLevel, parseMeasureMode, parseOverflow, parsePositionType, parseUnit, parseWrap, MouseParser, Selection, convertGlobalToLocalSelection, ASCIIFontSelectionHelper, singleton, envRegistry, registerEnvVar, clearEnvCache, generateEnvMarkdown, generateEnvColored, env, StdinParser, treeSitterToTextChunks, treeSitterToStyledText, addDefaultParsers, TreeSitterClient, DataPathsManager, getDataPaths, extensionToFiletype, basenameToFiletype, extToFiletype, pathToFiletype, infoStringToFiletype, getTreeSitterClient, destroyTreeSitterClient, ExtmarksController, createExtmarksController, TerminalPalette, createTerminalPalette, normalizeTerminalPalette, buildTerminalPaletteSignature, decodePasteBytes, stripAnsiSequences, detectLinks, OptimizedBuffer, TextBuffer, SpanInfoStruct, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, Align, BoxSizing, Dimension, Direction, Display, Edge, Errata, ExperimentalFeature, FlexDirection, Gutter, Justify, LogLevel as LogLevel1, MeasureMode, NodeType, Overflow, PositionType, Unit, Wrap, ALIGN_AUTO, ALIGN_FLEX_START, ALIGN_CENTER, ALIGN_FLEX_END, ALIGN_STRETCH, ALIGN_BASELINE, ALIGN_SPACE_BETWEEN, ALIGN_SPACE_AROUND, ALIGN_SPACE_EVENLY, BOX_SIZING_BORDER_BOX, BOX_SIZING_CONTENT_BOX, DIMENSION_WIDTH, DIMENSION_HEIGHT, DIRECTION_INHERIT, DIRECTION_LTR, DIRECTION_RTL, DISPLAY_FLEX, DISPLAY_NONE, DISPLAY_CONTENTS, EDGE_LEFT, EDGE_TOP, EDGE_RIGHT, EDGE_BOTTOM, EDGE_START, EDGE_END, EDGE_HORIZONTAL, EDGE_VERTICAL, EDGE_ALL, ERRATA_NONE, ERRATA_STRETCH_FLEX_BASIS, ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING, ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE, ERRATA_ALL, ERRATA_CLASSIC, EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS, FLEX_DIRECTION_COLUMN, FLEX_DIRECTION_COLUMN_REVERSE, FLEX_DIRECTION_ROW, FLEX_DIRECTION_ROW_REVERSE, GUTTER_COLUMN, GUTTER_ROW, GUTTER_ALL, JUSTIFY_FLEX_START, JUSTIFY_CENTER, JUSTIFY_FLEX_END, JUSTIFY_SPACE_BETWEEN, JUSTIFY_SPACE_AROUND, JUSTIFY_SPACE_EVENLY, LOG_LEVEL_ERROR, LOG_LEVEL_WARN, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_VERBOSE, LOG_LEVEL_FATAL, MEASURE_MODE_UNDEFINED, MEASURE_MODE_EXACTLY, MEASURE_MODE_AT_MOST, NODE_TYPE_DEFAULT, NODE_TYPE_TEXT, OVERFLOW_VISIBLE, OVERFLOW_HIDDEN, OVERFLOW_SCROLL, POSITION_TYPE_STATIC, POSITION_TYPE_RELATIVE, POSITION_TYPE_ABSOLUTE, UNIT_UNDEFINED, UNIT_POINT, UNIT_PERCENT, UNIT_AUTO, WRAP_NO_WRAP, WRAP_WRAP, WRAP_WRAP_REVERSE, Config, Node, exports_yoga, yoga_default };
16107
+ export { toArrayBuffer, sleep, stringWidth2 as stringWidth, DEFAULT_FOREGROUND_RGB, DEFAULT_BACKGROUND_RGB, normalizeIndexedColorIndex, ansi256IndexToRgb, RGBA, normalizeColorValue, hexToRgb, rgbToHex, hsvToRgb, parseColor, isValidBorderStyle, parseBorderStyle, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, KeyEvent, PasteEvent, KeyHandler, InternalKeyHandler, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, ATTRIBUTE_BASE_BITS, ATTRIBUTE_BASE_MASK, getBaseAttributes, DebugOverlayCorner, TargetChannel, createTextAttributes, attributesWithLink, getLinkId, 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, link, t, hastToStyledText, SystemClock, nonAlphanumericKeys, terminalNamedSingleStrokeKeys, parseKeypress, LinearScrollAccel, MacOSScrollAccel, parseAlign, parseAlignItems, parseBoxSizing, parseDimension, parseDirection, parseDisplay, parseEdge, parseFlexDirection, parseGutter, parseJustify, parseLogLevel, parseMeasureMode, parseOverflow, parsePositionType, parseUnit, parseWrap, MouseParser, Selection, convertGlobalToLocalSelection, ASCIIFontSelectionHelper, singleton, envRegistry, registerEnvVar, clearEnvCache, generateEnvMarkdown, generateEnvColored, env, StdinParser, treeSitterToTextChunks, treeSitterToStyledText, addDefaultParsers, TreeSitterClient, DataPathsManager, getDataPaths, extensionToFiletype, basenameToFiletype, extToFiletype, pathToFiletype, infoStringToFiletype, getTreeSitterClient, destroyTreeSitterClient, ExtmarksController, createExtmarksController, TerminalPalette, createTerminalPalette, normalizeTerminalPalette, buildTerminalPaletteSignature, decodePasteBytes, stripAnsiSequences, ClipboardTarget, Clipboard, detectLinks, OptimizedBuffer, TextBuffer, SpanInfoStruct, LogLevel2 as LogLevel, NativeMeasureTargetKind, setRenderLibPath, resolveRenderLib, Align, BoxSizing, Dimension, Direction, Display, Edge, Errata, ExperimentalFeature, FlexDirection, Gutter, Justify, LogLevel as LogLevel1, MeasureMode, NodeType, Overflow, PositionType, Unit, Wrap, ALIGN_AUTO, ALIGN_FLEX_START, ALIGN_CENTER, ALIGN_FLEX_END, ALIGN_STRETCH, ALIGN_BASELINE, ALIGN_SPACE_BETWEEN, ALIGN_SPACE_AROUND, ALIGN_SPACE_EVENLY, BOX_SIZING_BORDER_BOX, BOX_SIZING_CONTENT_BOX, DIMENSION_WIDTH, DIMENSION_HEIGHT, DIRECTION_INHERIT, DIRECTION_LTR, DIRECTION_RTL, DISPLAY_FLEX, DISPLAY_NONE, DISPLAY_CONTENTS, EDGE_LEFT, EDGE_TOP, EDGE_RIGHT, EDGE_BOTTOM, EDGE_START, EDGE_END, EDGE_HORIZONTAL, EDGE_VERTICAL, EDGE_ALL, ERRATA_NONE, ERRATA_STRETCH_FLEX_BASIS, ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING, ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE, ERRATA_ALL, ERRATA_CLASSIC, EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS, FLEX_DIRECTION_COLUMN, FLEX_DIRECTION_COLUMN_REVERSE, FLEX_DIRECTION_ROW, FLEX_DIRECTION_ROW_REVERSE, GUTTER_COLUMN, GUTTER_ROW, GUTTER_ALL, JUSTIFY_FLEX_START, JUSTIFY_CENTER, JUSTIFY_FLEX_END, JUSTIFY_SPACE_BETWEEN, JUSTIFY_SPACE_AROUND, JUSTIFY_SPACE_EVENLY, LOG_LEVEL_ERROR, LOG_LEVEL_WARN, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_VERBOSE, LOG_LEVEL_FATAL, MEASURE_MODE_UNDEFINED, MEASURE_MODE_EXACTLY, MEASURE_MODE_AT_MOST, NODE_TYPE_DEFAULT, NODE_TYPE_TEXT, OVERFLOW_VISIBLE, OVERFLOW_HIDDEN, OVERFLOW_SCROLL, POSITION_TYPE_STATIC, POSITION_TYPE_RELATIVE, POSITION_TYPE_ABSOLUTE, UNIT_UNDEFINED, UNIT_POINT, UNIT_PERCENT, UNIT_AUTO, WRAP_NO_WRAP, WRAP_WRAP, WRAP_WRAP_REVERSE, Config, Node, exports_yoga, yoga_default };
15985
16108
 
15986
- //# debugId=DCFFDFC39A69C1FE64756E2164756E21
15987
- //# sourceMappingURL=index-pcvh9d34.js.map
16109
+ //# debugId=FC7AC9CF38562F8A64756E2164756E21
16110
+ //# sourceMappingURL=index-d5xqskty.js.map