@opentui/core 0.1.19 → 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-0h2r5adk.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);
@@ -227,13 +228,14 @@ export declare abstract class Renderable extends BaseRenderable {
227
228
  protected createFrameBuffer(): void;
228
229
  protected onResize(width: number, height: number): void;
229
230
  private replaceParent;
230
- add(obj: Renderable | VNode<any, any[]>, index?: number): number;
231
- insertBefore(obj: Renderable | VNode<any, any[]>, anchor?: Renderable): number;
231
+ add(obj: Renderable | VNode<any, any[]> | unknown, index?: number): number;
232
+ insertBefore(obj: Renderable | VNode<any, any[]> | unknown, anchor?: Renderable | unknown): number;
232
233
  getRenderable(id: string): Renderable | undefined;
233
234
  remove(id: string): void;
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 {};
@@ -3938,7 +3938,13 @@ function createTextAttributes({
3938
3938
  }
3939
3939
 
3940
3940
  // src/lib/styled-text.ts
3941
+ var BrandedStyledText = Symbol.for("@opentui/core/StyledText");
3942
+ function isStyledText(obj) {
3943
+ return obj && obj[BrandedStyledText];
3944
+ }
3945
+
3941
3946
  class StyledText {
3947
+ [BrandedStyledText] = true;
3942
3948
  chunks;
3943
3949
  textRenderable;
3944
3950
  constructor(chunks) {
@@ -5926,6 +5932,7 @@ class Renderable extends BaseRenderable {
5926
5932
  parent = null;
5927
5933
  childrenPrimarySortDirty = true;
5928
5934
  childrenSortedByPrimaryAxis = [];
5935
+ _newChildren = [];
5929
5936
  renderBefore;
5930
5937
  renderAfter;
5931
5938
  constructor(ctx, options) {
@@ -5962,6 +5969,10 @@ class Renderable extends BaseRenderable {
5962
5969
  get visible() {
5963
5970
  return this._visible;
5964
5971
  }
5972
+ get primaryAxis() {
5973
+ const dir = this.layoutNode.yogaNode.getFlexDirection();
5974
+ return dir === 2 || dir === 3 ? "row" : "column";
5975
+ }
5965
5976
  set visible(value) {
5966
5977
  if (this._visible === value)
5967
5978
  return;
@@ -6163,80 +6174,6 @@ class Renderable extends BaseRenderable {
6163
6174
  this.needsZIndexSort = false;
6164
6175
  }
6165
6176
  }
6166
- getChildrenInViewport(viewport, padding = 10, minTriggerSize = 16) {
6167
- if (this.renderableArray.length < minTriggerSize)
6168
- return this.renderableArray;
6169
- const viewportTop = viewport.y - padding;
6170
- const viewportBottom = viewport.y + viewport.height + padding;
6171
- const viewportLeft = viewport.x - padding;
6172
- const viewportRight = viewport.x + viewport.width + padding;
6173
- const dir = this.layoutNode.yogaNode.getFlexDirection();
6174
- const isRow = dir === 2 || dir === 3;
6175
- const children = this.getChildrenSortedByPrimaryAxis();
6176
- const totalChildren = children.length;
6177
- if (totalChildren === 0)
6178
- return [];
6179
- const vpStart = isRow ? viewportLeft : viewportTop;
6180
- const vpEnd = isRow ? viewportRight : viewportBottom;
6181
- let lo = 0;
6182
- let hi = totalChildren - 1;
6183
- let candidate = -1;
6184
- while (lo <= hi) {
6185
- const mid = lo + hi >> 1;
6186
- const c = children[mid];
6187
- const start = isRow ? c.x : c.y;
6188
- const end = isRow ? c.x + c.width : c.y + c.height;
6189
- if (end < vpStart) {
6190
- lo = mid + 1;
6191
- } else if (start > vpEnd) {
6192
- hi = mid - 1;
6193
- } else {
6194
- candidate = mid;
6195
- break;
6196
- }
6197
- }
6198
- const visibleChildren = [];
6199
- if (candidate === -1) {
6200
- return visibleChildren;
6201
- }
6202
- let left = candidate;
6203
- while (left - 1 >= 0) {
6204
- const prev = children[left - 1];
6205
- if ((isRow ? prev.x + prev.width : prev.y + prev.height) < vpStart)
6206
- break;
6207
- left--;
6208
- }
6209
- let right = candidate + 1;
6210
- while (right < totalChildren) {
6211
- const next = children[right];
6212
- if ((isRow ? next.x : next.y) > vpEnd)
6213
- break;
6214
- right++;
6215
- }
6216
- for (let i = left;i < right; i++) {
6217
- const child = children[i];
6218
- if (isRow) {
6219
- const childBottom = child.y + child.height;
6220
- if (childBottom < viewportTop)
6221
- continue;
6222
- const childTop = child.y;
6223
- if (childTop > viewportBottom)
6224
- continue;
6225
- } else {
6226
- const childRight = child.x + child.width;
6227
- if (childRight < viewportLeft)
6228
- continue;
6229
- const childLeft = child.x;
6230
- if (childLeft > viewportRight)
6231
- continue;
6232
- }
6233
- visibleChildren.push(child);
6234
- }
6235
- if (visibleChildren.length > 1) {
6236
- visibleChildren.sort((a, b) => a.zIndex > b.zIndex ? 1 : a.zIndex < b.zIndex ? -1 : 0);
6237
- }
6238
- return visibleChildren;
6239
- }
6240
6177
  getChildrenSortedByPrimaryAxis() {
6241
6178
  if (!this.childrenPrimarySortDirty && this.childrenSortedByPrimaryAxis.length === this.renderableArray.length) {
6242
6179
  return this.childrenSortedByPrimaryAxis;
@@ -6639,6 +6576,7 @@ class Renderable extends BaseRenderable {
6639
6576
  this.needsZIndexSort = true;
6640
6577
  this.childrenPrimarySortDirty = true;
6641
6578
  this.renderableMap.set(renderable.id, renderable);
6579
+ this._newChildren.push(renderable);
6642
6580
  if (renderable._liveCount > 0) {
6643
6581
  this.propagateLiveCount(renderable._liveCount);
6644
6582
  }
@@ -6656,6 +6594,9 @@ class Renderable extends BaseRenderable {
6656
6594
  if (!anchor) {
6657
6595
  return this.add(renderable);
6658
6596
  }
6597
+ if (!isRenderable(anchor)) {
6598
+ throw new Error("Anchor must be a Renderable");
6599
+ }
6659
6600
  if (!this.renderableMap.has(anchor.id)) {
6660
6601
  throw new Error("Anchor does not exist");
6661
6602
  }
@@ -6699,11 +6640,38 @@ class Renderable extends BaseRenderable {
6699
6640
  getChildrenCount() {
6700
6641
  return this.renderableArray.length;
6701
6642
  }
6702
- render(buffer, deltaTime) {
6643
+ updateLayout(deltaTime, renderList = []) {
6703
6644
  if (!this.visible)
6704
6645
  return;
6705
- this.onUpdate(deltaTime);
6706
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) {
6707
6675
  let renderBuffer = buffer;
6708
6676
  if (this.buffered && this.frameBuffer) {
6709
6677
  renderBuffer = this.frameBuffer;
@@ -6717,18 +6685,6 @@ class Renderable extends BaseRenderable {
6717
6685
  }
6718
6686
  this.markClean();
6719
6687
  this._ctx.addToHitGrid(this.x, this.y, this.width, this.height, this.num);
6720
- this.ensureZIndexSorted();
6721
- const shouldPushScissor = this._overflow !== "visible" && this.width > 0 && this.height > 0;
6722
- if (shouldPushScissor) {
6723
- const scissorRect = this.getScissorRect();
6724
- renderBuffer.pushScissorRect(scissorRect.x, scissorRect.y, scissorRect.width, scissorRect.height);
6725
- }
6726
- for (const child of this._getChildren()) {
6727
- child.render(renderBuffer, deltaTime);
6728
- }
6729
- if (shouldPushScissor) {
6730
- renderBuffer.popScissorRect();
6731
- }
6732
6688
  if (this.buffered && this.frameBuffer) {
6733
6689
  buffer.drawFrameBuffer(this.x, this.y, this.frameBuffer);
6734
6690
  }
@@ -6881,6 +6837,7 @@ class Renderable extends BaseRenderable {
6881
6837
 
6882
6838
  class RootRenderable extends Renderable {
6883
6839
  yogaConfig;
6840
+ renderList = [];
6884
6841
  constructor(ctx) {
6885
6842
  super(ctx, { id: "__root__", zIndex: 0, visible: true, width: ctx.width, height: ctx.height, enableLayout: true });
6886
6843
  this.yogaConfig = src_default.Config.create();
@@ -6895,6 +6852,29 @@ class RootRenderable extends Renderable {
6895
6852
  this.layoutNode.yogaNode.setFlexDirection(FlexDirection.Column);
6896
6853
  this.calculateLayout();
6897
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
+ }
6898
6878
  propagateLiveCount(delta) {
6899
6879
  const oldCount = this._liveCount;
6900
6880
  this._liveCount += delta;
@@ -6913,11 +6893,7 @@ class RootRenderable extends Renderable {
6913
6893
  this.height = height;
6914
6894
  this.emit("resized" /* RESIZED */, { width, height });
6915
6895
  }
6916
- onUpdate() {
6917
- if (this.layoutNode.yogaNode.isDirty()) {
6918
- this.calculateLayout();
6919
- }
6920
- }
6896
+ onUpdate(deltaTime) {}
6921
6897
  destroySelf() {
6922
6898
  if (this.layoutNode) {
6923
6899
  this.layoutNode.destroy();
@@ -7782,6 +7758,83 @@ var ANSI = {
7782
7758
 
7783
7759
  // src/renderer.ts
7784
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
7785
7838
  class MouseEvent {
7786
7839
  type;
7787
7840
  button;
@@ -8818,7 +8871,7 @@ Error details:
8818
8871
  }
8819
8872
  }
8820
8873
  walkSelectableRenderables(container, selectionBounds, selectedRenderables, touchedRenderables) {
8821
- const children = container.getChildrenInViewport(selectionBounds, 0);
8874
+ const children = getObjectsInViewport(selectionBounds, container.getChildrenSortedByPrimaryAxis(), container.primaryAxis, 0);
8822
8875
  for (const child of children) {
8823
8876
  if (child.selectable) {
8824
8877
  const hasSelection = child.onSelectionChanged(this.currentSelection);
@@ -8834,7 +8887,7 @@ Error details:
8834
8887
  }
8835
8888
  }
8836
8889
 
8837
- 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, 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 };
8838
8891
 
8839
- //# debugId=C116B02488BF34D464756E2164756E21
8840
- //# sourceMappingURL=index-0h2r5adk.js.map
8892
+ //# debugId=C46E0EF37C964E9E64756E2164756E21
8893
+ //# sourceMappingURL=index-8sac0sgm.js.map