@opentui/core 0.1.20 → 0.1.21

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-23dkhv32.js";
8
+ } from "./index-8sac0sgm.js";
9
9
 
10
10
  // ../../node_modules/omggif/omggif.js
11
11
  var require_omggif = __commonJS((exports) => {
package/Renderable.d.ts CHANGED
@@ -5,7 +5,7 @@ import { TrackedNode } from "./lib/TrackedNode";
5
5
  import type { ParsedKey } from "./lib/parse.keypress";
6
6
  import { type AlignString, type FlexDirectionString, type JustifyString, type OverflowString, type PositionTypeString, type WrapString } from "./lib/yoga.options";
7
7
  import type { MouseEvent } from "./renderer";
8
- import type { RenderContext, ViewportBounds } from "./types";
8
+ import type { RenderContext } from "./types";
9
9
  import { type VNode } from "./renderables/composition/vnode";
10
10
  import type { Selection } from "./lib/selection";
11
11
  declare const BrandedRenderable: unique symbol;
@@ -145,11 +145,13 @@ export declare abstract class Renderable extends BaseRenderable {
145
145
  parent: Renderable | null;
146
146
  private childrenPrimarySortDirty;
147
147
  private childrenSortedByPrimaryAxis;
148
+ private _newChildren;
148
149
  renderBefore?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void;
149
150
  renderAfter?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void;
150
151
  constructor(ctx: RenderContext, options: RenderableOptions<any>);
151
152
  get ctx(): RenderContext;
152
153
  get visible(): boolean;
154
+ get primaryAxis(): "row" | "column";
153
155
  set visible(value: boolean);
154
156
  hasSelection(): boolean;
155
157
  onSelectionChanged(selection: Selection | null): boolean;
@@ -189,8 +191,7 @@ export declare abstract class Renderable extends BaseRenderable {
189
191
  set zIndex(value: number);
190
192
  private requestZIndexSort;
191
193
  private ensureZIndexSorted;
192
- getChildrenInViewport(viewport: ViewportBounds, padding?: number, minTriggerSize?: number): Renderable[];
193
- protected getChildrenSortedByPrimaryAxis(): Renderable[];
194
+ getChildrenSortedByPrimaryAxis(): Renderable[];
194
195
  private setupYogaProperties;
195
196
  private setupMarginAndPadding;
196
197
  set position(positionType: PositionTypeString);
@@ -234,6 +235,7 @@ export declare abstract class Renderable extends BaseRenderable {
234
235
  protected onRemove(): void;
235
236
  getChildren(): Renderable[];
236
237
  getChildrenCount(): number;
238
+ updateLayout(deltaTime: number, renderList?: RenderCommand[]): void;
237
239
  render(buffer: OptimizedBuffer, deltaTime: number): void;
238
240
  protected _getChildren(): Renderable[];
239
241
  protected onUpdate(deltaTime: number): void;
@@ -266,13 +268,33 @@ export declare abstract class Renderable extends BaseRenderable {
266
268
  get onSizeChange(): (() => void) | undefined;
267
269
  private applyEventOptions;
268
270
  }
271
+ interface RenderCommandBase {
272
+ action: "render" | "pushScissorRect" | "popScissorRect";
273
+ }
274
+ interface RenderCommandPushScissorRect extends RenderCommandBase {
275
+ action: "pushScissorRect";
276
+ x: number;
277
+ y: number;
278
+ width: number;
279
+ height: number;
280
+ }
281
+ interface RenderCommandPopScissorRect extends RenderCommandBase {
282
+ action: "popScissorRect";
283
+ }
284
+ interface RenderCommandRender extends RenderCommandBase {
285
+ action: "render";
286
+ renderable: Renderable;
287
+ }
288
+ export type RenderCommand = RenderCommandPushScissorRect | RenderCommandPopScissorRect | RenderCommandRender;
269
289
  export declare class RootRenderable extends Renderable {
270
290
  private yogaConfig;
291
+ private renderList;
271
292
  constructor(ctx: RenderContext);
293
+ render(buffer: OptimizedBuffer, deltaTime: number): void;
272
294
  protected propagateLiveCount(delta: number): void;
273
295
  calculateLayout(): void;
274
296
  resize(width: number, height: number): void;
275
- protected onUpdate(): void;
297
+ protected onUpdate(deltaTime: number): void;
276
298
  protected destroySelf(): void;
277
299
  }
278
300
  export {};
@@ -5932,6 +5932,7 @@ class Renderable extends BaseRenderable {
5932
5932
  parent = null;
5933
5933
  childrenPrimarySortDirty = true;
5934
5934
  childrenSortedByPrimaryAxis = [];
5935
+ _newChildren = [];
5935
5936
  renderBefore;
5936
5937
  renderAfter;
5937
5938
  constructor(ctx, options) {
@@ -5968,6 +5969,10 @@ class Renderable extends BaseRenderable {
5968
5969
  get visible() {
5969
5970
  return this._visible;
5970
5971
  }
5972
+ get primaryAxis() {
5973
+ const dir = this.layoutNode.yogaNode.getFlexDirection();
5974
+ return dir === 2 || dir === 3 ? "row" : "column";
5975
+ }
5971
5976
  set visible(value) {
5972
5977
  if (this._visible === value)
5973
5978
  return;
@@ -6169,80 +6174,6 @@ class Renderable extends BaseRenderable {
6169
6174
  this.needsZIndexSort = false;
6170
6175
  }
6171
6176
  }
6172
- getChildrenInViewport(viewport, padding = 10, minTriggerSize = 16) {
6173
- if (this.renderableArray.length < minTriggerSize)
6174
- return this.renderableArray;
6175
- const viewportTop = viewport.y - padding;
6176
- const viewportBottom = viewport.y + viewport.height + padding;
6177
- const viewportLeft = viewport.x - padding;
6178
- const viewportRight = viewport.x + viewport.width + padding;
6179
- const dir = this.layoutNode.yogaNode.getFlexDirection();
6180
- const isRow = dir === 2 || dir === 3;
6181
- const children = this.getChildrenSortedByPrimaryAxis();
6182
- const totalChildren = children.length;
6183
- if (totalChildren === 0)
6184
- return [];
6185
- const vpStart = isRow ? viewportLeft : viewportTop;
6186
- const vpEnd = isRow ? viewportRight : viewportBottom;
6187
- let lo = 0;
6188
- let hi = totalChildren - 1;
6189
- let candidate = -1;
6190
- while (lo <= hi) {
6191
- const mid = lo + hi >> 1;
6192
- const c = children[mid];
6193
- const start = isRow ? c.x : c.y;
6194
- const end = isRow ? c.x + c.width : c.y + c.height;
6195
- if (end < vpStart) {
6196
- lo = mid + 1;
6197
- } else if (start > vpEnd) {
6198
- hi = mid - 1;
6199
- } else {
6200
- candidate = mid;
6201
- break;
6202
- }
6203
- }
6204
- const visibleChildren = [];
6205
- if (candidate === -1) {
6206
- return visibleChildren;
6207
- }
6208
- let left = candidate;
6209
- while (left - 1 >= 0) {
6210
- const prev = children[left - 1];
6211
- if ((isRow ? prev.x + prev.width : prev.y + prev.height) < vpStart)
6212
- break;
6213
- left--;
6214
- }
6215
- let right = candidate + 1;
6216
- while (right < totalChildren) {
6217
- const next = children[right];
6218
- if ((isRow ? next.x : next.y) > vpEnd)
6219
- break;
6220
- right++;
6221
- }
6222
- for (let i = left;i < right; i++) {
6223
- const child = children[i];
6224
- if (isRow) {
6225
- const childBottom = child.y + child.height;
6226
- if (childBottom < viewportTop)
6227
- continue;
6228
- const childTop = child.y;
6229
- if (childTop > viewportBottom)
6230
- continue;
6231
- } else {
6232
- const childRight = child.x + child.width;
6233
- if (childRight < viewportLeft)
6234
- continue;
6235
- const childLeft = child.x;
6236
- if (childLeft > viewportRight)
6237
- continue;
6238
- }
6239
- visibleChildren.push(child);
6240
- }
6241
- if (visibleChildren.length > 1) {
6242
- visibleChildren.sort((a, b) => a.zIndex > b.zIndex ? 1 : a.zIndex < b.zIndex ? -1 : 0);
6243
- }
6244
- return visibleChildren;
6245
- }
6246
6177
  getChildrenSortedByPrimaryAxis() {
6247
6178
  if (!this.childrenPrimarySortDirty && this.childrenSortedByPrimaryAxis.length === this.renderableArray.length) {
6248
6179
  return this.childrenSortedByPrimaryAxis;
@@ -6645,6 +6576,7 @@ class Renderable extends BaseRenderable {
6645
6576
  this.needsZIndexSort = true;
6646
6577
  this.childrenPrimarySortDirty = true;
6647
6578
  this.renderableMap.set(renderable.id, renderable);
6579
+ this._newChildren.push(renderable);
6648
6580
  if (renderable._liveCount > 0) {
6649
6581
  this.propagateLiveCount(renderable._liveCount);
6650
6582
  }
@@ -6708,11 +6640,38 @@ class Renderable extends BaseRenderable {
6708
6640
  getChildrenCount() {
6709
6641
  return this.renderableArray.length;
6710
6642
  }
6711
- render(buffer, deltaTime) {
6643
+ updateLayout(deltaTime, renderList = []) {
6712
6644
  if (!this.visible)
6713
6645
  return;
6714
- this.onUpdate(deltaTime);
6715
6646
  this.updateFromLayout();
6647
+ this.onUpdate(deltaTime);
6648
+ renderList.push({ action: "render", renderable: this });
6649
+ if (this._newChildren.length > 0) {
6650
+ for (const child of this._newChildren) {
6651
+ child.updateFromLayout();
6652
+ }
6653
+ this._newChildren = [];
6654
+ }
6655
+ this.ensureZIndexSorted();
6656
+ const shouldPushScissor = this._overflow !== "visible" && this.width > 0 && this.height > 0;
6657
+ if (shouldPushScissor) {
6658
+ const scissorRect = this.getScissorRect();
6659
+ renderList.push({
6660
+ action: "pushScissorRect",
6661
+ x: scissorRect.x,
6662
+ y: scissorRect.y,
6663
+ width: scissorRect.width,
6664
+ height: scissorRect.height
6665
+ });
6666
+ }
6667
+ for (const child of this._getChildren()) {
6668
+ child.updateLayout(deltaTime, renderList);
6669
+ }
6670
+ if (shouldPushScissor) {
6671
+ renderList.push({ action: "popScissorRect" });
6672
+ }
6673
+ }
6674
+ render(buffer, deltaTime) {
6716
6675
  let renderBuffer = buffer;
6717
6676
  if (this.buffered && this.frameBuffer) {
6718
6677
  renderBuffer = this.frameBuffer;
@@ -6726,18 +6685,6 @@ class Renderable extends BaseRenderable {
6726
6685
  }
6727
6686
  this.markClean();
6728
6687
  this._ctx.addToHitGrid(this.x, this.y, this.width, this.height, this.num);
6729
- this.ensureZIndexSorted();
6730
- const shouldPushScissor = this._overflow !== "visible" && this.width > 0 && this.height > 0;
6731
- if (shouldPushScissor) {
6732
- const scissorRect = this.getScissorRect();
6733
- renderBuffer.pushScissorRect(scissorRect.x, scissorRect.y, scissorRect.width, scissorRect.height);
6734
- }
6735
- for (const child of this._getChildren()) {
6736
- child.render(renderBuffer, deltaTime);
6737
- }
6738
- if (shouldPushScissor) {
6739
- renderBuffer.popScissorRect();
6740
- }
6741
6688
  if (this.buffered && this.frameBuffer) {
6742
6689
  buffer.drawFrameBuffer(this.x, this.y, this.frameBuffer);
6743
6690
  }
@@ -6890,6 +6837,7 @@ class Renderable extends BaseRenderable {
6890
6837
 
6891
6838
  class RootRenderable extends Renderable {
6892
6839
  yogaConfig;
6840
+ renderList = [];
6893
6841
  constructor(ctx) {
6894
6842
  super(ctx, { id: "__root__", zIndex: 0, visible: true, width: ctx.width, height: ctx.height, enableLayout: true });
6895
6843
  this.yogaConfig = src_default.Config.create();
@@ -6904,6 +6852,29 @@ class RootRenderable extends Renderable {
6904
6852
  this.layoutNode.yogaNode.setFlexDirection(FlexDirection.Column);
6905
6853
  this.calculateLayout();
6906
6854
  }
6855
+ render(buffer, deltaTime) {
6856
+ if (!this.visible)
6857
+ return;
6858
+ if (this.layoutNode.yogaNode.isDirty()) {
6859
+ this.calculateLayout();
6860
+ }
6861
+ this.renderList.length = 0;
6862
+ this.updateLayout(deltaTime, this.renderList);
6863
+ for (let i = 1;i < this.renderList.length; i++) {
6864
+ const command = this.renderList[i];
6865
+ switch (command.action) {
6866
+ case "render":
6867
+ command.renderable.render(buffer, deltaTime);
6868
+ break;
6869
+ case "pushScissorRect":
6870
+ buffer.pushScissorRect(command.x, command.y, command.width, command.height);
6871
+ break;
6872
+ case "popScissorRect":
6873
+ buffer.popScissorRect();
6874
+ break;
6875
+ }
6876
+ }
6877
+ }
6907
6878
  propagateLiveCount(delta) {
6908
6879
  const oldCount = this._liveCount;
6909
6880
  this._liveCount += delta;
@@ -6922,11 +6893,7 @@ class RootRenderable extends Renderable {
6922
6893
  this.height = height;
6923
6894
  this.emit("resized" /* RESIZED */, { width, height });
6924
6895
  }
6925
- onUpdate() {
6926
- if (this.layoutNode.yogaNode.isDirty()) {
6927
- this.calculateLayout();
6928
- }
6929
- }
6896
+ onUpdate(deltaTime) {}
6930
6897
  destroySelf() {
6931
6898
  if (this.layoutNode) {
6932
6899
  this.layoutNode.destroy();
@@ -7791,6 +7758,83 @@ var ANSI = {
7791
7758
 
7792
7759
  // src/renderer.ts
7793
7760
  import { EventEmitter as EventEmitter6 } from "events";
7761
+
7762
+ // src/lib/objects-in-viewport.ts
7763
+ function getObjectsInViewport(viewport, objects, direction = "column", padding = 10, minTriggerSize = 16) {
7764
+ if (objects.length < minTriggerSize)
7765
+ return objects;
7766
+ const viewportTop = viewport.y - padding;
7767
+ const viewportBottom = viewport.y + viewport.height + padding;
7768
+ const viewportLeft = viewport.x - padding;
7769
+ const viewportRight = viewport.x + viewport.width + padding;
7770
+ const isRow = direction === "row";
7771
+ const children = objects;
7772
+ const totalChildren = children.length;
7773
+ if (totalChildren === 0)
7774
+ return [];
7775
+ const vpStart = isRow ? viewportLeft : viewportTop;
7776
+ const vpEnd = isRow ? viewportRight : viewportBottom;
7777
+ let lo = 0;
7778
+ let hi = totalChildren - 1;
7779
+ let candidate = -1;
7780
+ while (lo <= hi) {
7781
+ const mid = lo + hi >> 1;
7782
+ const c = children[mid];
7783
+ const start = isRow ? c.x : c.y;
7784
+ const end = isRow ? c.x + c.width : c.y + c.height;
7785
+ if (end < vpStart) {
7786
+ lo = mid + 1;
7787
+ } else if (start > vpEnd) {
7788
+ hi = mid - 1;
7789
+ } else {
7790
+ candidate = mid;
7791
+ break;
7792
+ }
7793
+ }
7794
+ const visibleChildren = [];
7795
+ if (candidate === -1) {
7796
+ return visibleChildren;
7797
+ }
7798
+ let left = candidate;
7799
+ while (left - 1 >= 0) {
7800
+ const prev = children[left - 1];
7801
+ if ((isRow ? prev.x + prev.width : prev.y + prev.height) < vpStart)
7802
+ break;
7803
+ left--;
7804
+ }
7805
+ let right = candidate + 1;
7806
+ while (right < totalChildren) {
7807
+ const next = children[right];
7808
+ if ((isRow ? next.x : next.y) > vpEnd)
7809
+ break;
7810
+ right++;
7811
+ }
7812
+ for (let i = left;i < right; i++) {
7813
+ const child = children[i];
7814
+ if (isRow) {
7815
+ const childBottom = child.y + child.height;
7816
+ if (childBottom < viewportTop)
7817
+ continue;
7818
+ const childTop = child.y;
7819
+ if (childTop > viewportBottom)
7820
+ continue;
7821
+ } else {
7822
+ const childRight = child.x + child.width;
7823
+ if (childRight < viewportLeft)
7824
+ continue;
7825
+ const childLeft = child.x;
7826
+ if (childLeft > viewportRight)
7827
+ continue;
7828
+ }
7829
+ visibleChildren.push(child);
7830
+ }
7831
+ if (visibleChildren.length > 1) {
7832
+ visibleChildren.sort((a, b) => a.zIndex > b.zIndex ? 1 : a.zIndex < b.zIndex ? -1 : 0);
7833
+ }
7834
+ return visibleChildren;
7835
+ }
7836
+
7837
+ // src/renderer.ts
7794
7838
  class MouseEvent {
7795
7839
  type;
7796
7840
  button;
@@ -8827,7 +8871,7 @@ Error details:
8827
8871
  }
8828
8872
  }
8829
8873
  walkSelectableRenderables(container, selectionBounds, selectedRenderables, touchedRenderables) {
8830
- const children = container.getChildrenInViewport(selectionBounds, 0);
8874
+ const children = getObjectsInViewport(selectionBounds, container.getChildrenSortedByPrimaryAxis(), container.primaryAxis, 0);
8831
8875
  for (const child of children) {
8832
8876
  if (child.selectable) {
8833
8877
  const hasSelection = child.onSelectionChanged(this.currentSelection);
@@ -8843,7 +8887,7 @@ Error details:
8843
8887
  }
8844
8888
  }
8845
8889
 
8846
- export { __toESM, __commonJS, __export, __require, Edge, Gutter, MeasureMode, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, TrackedNode, createTrackedNode, nonAlphanumericKeys, parseKeypress, KeyHandler, getKeyHandler, RGBA, hexToRgb, rgbToHex, hsvToRgb, parseColor, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, DebugOverlayCorner, createTextAttributes, 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, TextBuffer, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, OptimizedBuffer, h, isVNode, maybeMakeRenderable, wrapWithDelegates, instantiate, delegate, LayoutEvents, RenderableEvents, isValidPercentage, isMarginType, isPaddingType, isPositionType, isPositionTypeType, isOverflowType, isDimensionType, isFlexBasisType, isSizeType, isRenderable, BaseRenderable, Renderable, RootRenderable, capture, ConsolePosition, TerminalConsole, MouseEvent, MouseButton, createCliRenderer, CliRenderEvents, CliRenderer };
8890
+ export { __toESM, __commonJS, __export, __require, Edge, Gutter, MeasureMode, BorderChars, getBorderFromSides, getBorderSides, borderCharsToArray, BorderCharArrays, TrackedNode, createTrackedNode, nonAlphanumericKeys, parseKeypress, KeyHandler, getKeyHandler, RGBA, hexToRgb, rgbToHex, hsvToRgb, parseColor, fonts, measureText, getCharacterPositions, coordinateToCharacterIndex, renderFontToFrameBuffer, TextAttributes, DebugOverlayCorner, createTextAttributes, 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, TextBuffer, LogLevel2 as LogLevel, setRenderLibPath, resolveRenderLib, OptimizedBuffer, h, isVNode, maybeMakeRenderable, wrapWithDelegates, instantiate, delegate, LayoutEvents, RenderableEvents, isValidPercentage, isMarginType, isPaddingType, isPositionType, isPositionTypeType, isOverflowType, isDimensionType, isFlexBasisType, isSizeType, isRenderable, BaseRenderable, Renderable, RootRenderable, capture, ConsolePosition, TerminalConsole, getObjectsInViewport, MouseEvent, MouseButton, createCliRenderer, CliRenderEvents, CliRenderer };
8847
8891
 
8848
- //# debugId=8BB772CB4E9B00D664756E2164756E21
8849
- //# sourceMappingURL=index-23dkhv32.js.map
8892
+ //# debugId=C46E0EF37C964E9E64756E2164756E21
8893
+ //# sourceMappingURL=index-8sac0sgm.js.map