@opentui/core 0.1.81 → 0.1.83

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/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "type": "module",
7
- "version": "0.1.81",
7
+ "version": "0.1.83",
8
8
  "description": "OpenTUI is a TypeScript library on a native Zig core for building terminal user interfaces (TUIs)",
9
9
  "license": "MIT",
10
10
  "repository": {
@@ -57,11 +57,11 @@
57
57
  "bun-webgpu": "0.1.5",
58
58
  "planck": "^1.4.2",
59
59
  "three": "0.177.0",
60
- "@opentui/core-darwin-x64": "0.1.81",
61
- "@opentui/core-darwin-arm64": "0.1.81",
62
- "@opentui/core-linux-x64": "0.1.81",
63
- "@opentui/core-linux-arm64": "0.1.81",
64
- "@opentui/core-win32-x64": "0.1.81",
65
- "@opentui/core-win32-arm64": "0.1.81"
60
+ "@opentui/core-darwin-x64": "0.1.83",
61
+ "@opentui/core-darwin-arm64": "0.1.83",
62
+ "@opentui/core-linux-x64": "0.1.83",
63
+ "@opentui/core-linux-arm64": "0.1.83",
64
+ "@opentui/core-win32-x64": "0.1.83",
65
+ "@opentui/core-win32-arm64": "0.1.83"
66
66
  }
67
67
  }
@@ -1,10 +1,49 @@
1
1
  import { Renderable, type RenderableOptions } from "../Renderable";
2
2
  import { type RenderContext } from "../types";
3
3
  import { SyntaxStyle } from "../syntax-style";
4
+ import type { BorderStyle } from "../lib/border";
5
+ import type { ColorInput } from "../lib/RGBA";
4
6
  import { type MarkedToken, type Token } from "marked";
7
+ import { type TextTableColumnWidthMode, type TextTableContent } from "./TextTable";
5
8
  import type { TreeSitterClient } from "../lib/tree-sitter";
6
9
  import { type ParseState } from "./markdown-parser";
7
10
  import type { OptimizedBuffer } from "../buffer";
11
+ export interface MarkdownTableOptions {
12
+ /**
13
+ * Strategy for sizing table columns.
14
+ * - "content": columns fit to intrinsic content width.
15
+ * - "fill": columns expand to fill available width.
16
+ */
17
+ widthMode?: TextTableColumnWidthMode;
18
+ /**
19
+ * Wrapping strategy for table cell content.
20
+ */
21
+ wrapMode?: "none" | "char" | "word";
22
+ /**
23
+ * Padding applied on all sides of each table cell.
24
+ */
25
+ cellPadding?: number;
26
+ /**
27
+ * Enables/disables table border rendering.
28
+ */
29
+ borders?: boolean;
30
+ /**
31
+ * Overrides outer border visibility. Defaults to `borders`.
32
+ */
33
+ outerBorder?: boolean;
34
+ /**
35
+ * Border style for markdown tables.
36
+ */
37
+ borderStyle?: BorderStyle;
38
+ /**
39
+ * Border color for markdown tables. Defaults to conceal style color.
40
+ */
41
+ borderColor?: ColorInput;
42
+ /**
43
+ * Enables/disables selection support on markdown tables.
44
+ */
45
+ selectable?: boolean;
46
+ }
8
47
  export interface MarkdownOptions extends RenderableOptions<MarkdownRenderable> {
9
48
  content?: string;
10
49
  syntaxStyle: SyntaxStyle;
@@ -15,6 +54,10 @@ export interface MarkdownOptions extends RenderableOptions<MarkdownRenderable> {
15
54
  * When true, trailing tokens are kept unstable to handle incomplete content.
16
55
  */
17
56
  streaming?: boolean;
57
+ /**
58
+ * Options for internally rendered markdown tables.
59
+ */
60
+ tableOptions?: MarkdownTableOptions;
18
61
  /**
19
62
  * Custom node renderer. Return a Renderable to override default rendering,
20
63
  * or undefined/null to use default rendering.
@@ -28,10 +71,15 @@ export interface RenderNodeContext {
28
71
  /** Creates default renderable for this token */
29
72
  defaultRender: () => Renderable | null;
30
73
  }
74
+ interface TableContentCache {
75
+ content: TextTableContent;
76
+ cellKeys: Uint32Array[];
77
+ }
31
78
  export interface BlockState {
32
79
  token: MarkedToken;
33
80
  tokenRaw: string;
34
81
  renderable: Renderable;
82
+ tableContentCache?: TableContentCache;
35
83
  }
36
84
  export type { ParseState };
37
85
  export declare class MarkdownRenderable extends Renderable {
@@ -39,6 +87,7 @@ export declare class MarkdownRenderable extends Renderable {
39
87
  private _syntaxStyle;
40
88
  private _conceal;
41
89
  private _treeSitterClient?;
90
+ private _tableOptions?;
42
91
  private _renderNode?;
43
92
  _parseState: ParseState | null;
44
93
  private _streaming;
@@ -58,6 +107,8 @@ export declare class MarkdownRenderable extends Renderable {
58
107
  set conceal(value: boolean);
59
108
  get streaming(): boolean;
60
109
  set streaming(value: boolean);
110
+ get tableOptions(): MarkdownTableOptions | undefined;
111
+ set tableOptions(value: MarkdownTableOptions | undefined);
61
112
  private getStyle;
62
113
  private createChunk;
63
114
  private createDefaultChunk;
@@ -72,12 +123,18 @@ export declare class MarkdownRenderable extends Renderable {
72
123
  private renderTokenToChunks;
73
124
  private createTextRenderable;
74
125
  private createCodeRenderable;
75
- /**
76
- * Update an existing table renderable in-place for style/conceal changes.
77
- * Much faster than rebuilding the entire table structure.
78
- */
79
- private updateTableRenderable;
80
- private createTableRenderable;
126
+ private getTableRowsToRender;
127
+ private hashString;
128
+ private hashTableToken;
129
+ private getTableCellKey;
130
+ private createTableDataCellChunks;
131
+ private createTableHeaderCellChunks;
132
+ private buildTableContentCache;
133
+ private resolveTableRenderableOptions;
134
+ private applyTableRenderableOptions;
135
+ private applyTableOptionsToBlocks;
136
+ private createTextTableRenderable;
137
+ private createTableBlock;
81
138
  private createDefaultRenderable;
82
139
  private updateBlockRenderable;
83
140
  private updateBlocks;
@@ -88,5 +145,6 @@ export declare class MarkdownRenderable extends Renderable {
88
145
  */
89
146
  private rerenderBlocks;
90
147
  clearCache(): void;
148
+ refreshStyles(): void;
91
149
  protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void;
92
150
  }
@@ -6,6 +6,7 @@ import { RGBA } from "../lib/RGBA";
6
6
  import { type RenderContext, type LineInfoProvider } from "../types";
7
7
  import type { OptimizedBuffer } from "../buffer";
8
8
  import type { LineInfo } from "../zig";
9
+ import { SyntaxStyle } from "../syntax-style";
9
10
  export interface TextBufferOptions extends RenderableOptions<TextBufferRenderable> {
10
11
  fg?: string | RGBA;
11
12
  bg?: string | RGBA;
@@ -34,6 +35,7 @@ export declare abstract class TextBufferRenderable extends Renderable implements
34
35
  protected _truncate: boolean;
35
36
  protected textBuffer: TextBuffer;
36
37
  protected textBufferView: TextBufferView;
38
+ protected _textBufferSyntaxStyle: SyntaxStyle;
37
39
  protected _defaultOptions: {
38
40
  fg: RGBA;
39
41
  bg: RGBA;
@@ -0,0 +1,130 @@
1
+ import { type RenderableOptions, Renderable } from "../Renderable";
2
+ import type { OptimizedBuffer } from "../buffer";
3
+ import { type BorderStyle } from "../lib/border";
4
+ import { type Selection } from "../lib/selection";
5
+ import { RGBA, type ColorInput } from "../lib/RGBA";
6
+ import { type TextChunk } from "../text-buffer";
7
+ import type { RenderContext } from "../types";
8
+ export type TextTableCellContent = TextChunk[] | null | undefined;
9
+ export type TextTableContent = TextTableCellContent[][];
10
+ export type TextTableColumnWidthMode = "content" | "fill";
11
+ export interface TextTableOptions extends RenderableOptions<TextTableRenderable> {
12
+ content?: TextTableContent;
13
+ wrapMode?: "none" | "char" | "word";
14
+ columnWidthMode?: TextTableColumnWidthMode;
15
+ cellPadding?: number;
16
+ showBorders?: boolean;
17
+ border?: boolean;
18
+ outerBorder?: boolean;
19
+ selectable?: boolean;
20
+ selectionBg?: ColorInput;
21
+ selectionFg?: ColorInput;
22
+ borderStyle?: BorderStyle;
23
+ borderColor?: ColorInput;
24
+ borderBackgroundColor?: ColorInput;
25
+ backgroundColor?: ColorInput;
26
+ fg?: ColorInput;
27
+ bg?: ColorInput;
28
+ attributes?: number;
29
+ }
30
+ export declare class TextTableRenderable extends Renderable {
31
+ private _content;
32
+ private _wrapMode;
33
+ private _columnWidthMode;
34
+ private _cellPadding;
35
+ private _showBorders;
36
+ private _border;
37
+ private _outerBorder;
38
+ private _hasExplicitOuterBorder;
39
+ private _borderStyle;
40
+ private _borderColor;
41
+ private _borderBackgroundColor;
42
+ private _backgroundColor;
43
+ private _defaultFg;
44
+ private _defaultBg;
45
+ private _defaultAttributes;
46
+ private _selectionBg;
47
+ private _selectionFg;
48
+ private _lastLocalSelection;
49
+ private _lastSelectionMode;
50
+ private _cells;
51
+ private _prevCellContent;
52
+ private _rowCount;
53
+ private _columnCount;
54
+ private _layout;
55
+ private _layoutDirty;
56
+ private _rasterDirty;
57
+ private _cachedMeasureLayout;
58
+ private _cachedMeasureWidth;
59
+ private readonly _defaultOptions;
60
+ constructor(ctx: RenderContext, options?: TextTableOptions);
61
+ get content(): TextTableContent;
62
+ set content(value: TextTableContent);
63
+ get wrapMode(): "none" | "char" | "word";
64
+ set wrapMode(value: "none" | "char" | "word");
65
+ get columnWidthMode(): TextTableColumnWidthMode;
66
+ set columnWidthMode(value: TextTableColumnWidthMode);
67
+ get cellPadding(): number;
68
+ set cellPadding(value: number);
69
+ get showBorders(): boolean;
70
+ set showBorders(value: boolean);
71
+ get outerBorder(): boolean;
72
+ set outerBorder(value: boolean);
73
+ get border(): boolean;
74
+ set border(value: boolean);
75
+ get borderStyle(): BorderStyle;
76
+ set borderStyle(value: BorderStyle);
77
+ get borderColor(): RGBA;
78
+ set borderColor(value: ColorInput);
79
+ shouldStartSelection(x: number, y: number): boolean;
80
+ onSelectionChanged(selection: Selection | null): boolean;
81
+ hasSelection(): boolean;
82
+ getSelection(): {
83
+ start: number;
84
+ end: number;
85
+ } | null;
86
+ getSelectedText(): string;
87
+ protected onResize(width: number, height: number): void;
88
+ protected renderSelf(buffer: OptimizedBuffer): void;
89
+ protected destroySelf(): void;
90
+ private setupMeasureFunc;
91
+ private rebuildCells;
92
+ private updateCellsDiff;
93
+ private createCell;
94
+ private toStyledText;
95
+ private destroyCells;
96
+ private rebuildLayoutForCurrentWidth;
97
+ private computeLayout;
98
+ private computeColumnWidths;
99
+ private expandColumnWidths;
100
+ private fitColumnWidths;
101
+ private computeRowHeights;
102
+ private computeOffsets;
103
+ private applyLayoutToViews;
104
+ private resolveBorderLayout;
105
+ private getVerticalBorderCount;
106
+ private getHorizontalBorderCount;
107
+ private drawBorders;
108
+ private drawCells;
109
+ private drawCellRange;
110
+ private redrawSelectionRows;
111
+ private clearCellRange;
112
+ private ensureLayoutReady;
113
+ private getCellAtLocalPosition;
114
+ private applySelectionToCells;
115
+ private resolveSelectionResolution;
116
+ private getColumnAtLocalX;
117
+ private getFullCellSelectionCoords;
118
+ private findRowForLocalY;
119
+ private getSelectionRowRange;
120
+ private getDirtySelectionRowRange;
121
+ private resetRowSelection;
122
+ private resetCellSelections;
123
+ private createEmptyLayout;
124
+ private resolveLayoutWidthConstraint;
125
+ private getHorizontalCellPadding;
126
+ private getVerticalCellPadding;
127
+ private resolveCellPadding;
128
+ private invalidateLayoutAndRaster;
129
+ private invalidateRasterOnly;
130
+ }
@@ -13,6 +13,7 @@ export * from "./ScrollBar";
13
13
  export * from "./ScrollBox";
14
14
  export * from "./Select";
15
15
  export * from "./Slider";
16
+ export * from "./TextTable";
16
17
  export * from "./TabSelect";
17
18
  export * from "./Text";
18
19
  export * from "./TextBufferRenderable";
package/renderer.d.ts CHANGED
@@ -15,8 +15,10 @@ export interface CliRendererConfig {
15
15
  stdin?: NodeJS.ReadStream;
16
16
  stdout?: NodeJS.WriteStream;
17
17
  remote?: boolean;
18
+ testing?: boolean;
18
19
  exitOnCtrlC?: boolean;
19
20
  exitSignals?: NodeJS.Signals[];
21
+ forwardEnvKeys?: string[];
20
22
  debounceDelay?: number;
21
23
  targetFps?: number;
22
24
  maxFps?: number;
package/testing.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  CliRenderer,
5
5
  TreeSitterClient,
6
6
  resolveRenderLib
7
- } from "./index-ve2seej0.js";
7
+ } from "./index-a215gqtt.js";
8
8
 
9
9
  // src/testing/test-renderer.ts
10
10
  import { Readable } from "stream";
package/zig-structs.d.ts CHANGED
@@ -1,5 +1,14 @@
1
1
  import { type Pointer } from "bun:ffi";
2
2
  import { RGBA } from "./lib/RGBA";
3
+ type StyledChunkInput = {
4
+ text: string;
5
+ fg?: RGBA | null;
6
+ bg?: RGBA | null;
7
+ attributes?: number | null;
8
+ link?: {
9
+ url: string;
10
+ } | string | null;
11
+ };
3
12
  export declare const StyledChunkStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["text", "char*"], readonly ["text_len", "u64", {
4
13
  readonly lengthOf: "text";
5
14
  }], readonly ["fg", "pointer", {
@@ -11,8 +20,14 @@ export declare const StyledChunkStruct: import("bun-ffi-structs").DefineStructRe
11
20
  readonly packTransform: (rgba?: RGBA) => Pointer | null;
12
21
  readonly unpackTransform: (ptr?: Pointer) => RGBA | undefined;
13
22
  }], readonly ["attributes", "u32", {
14
- readonly optional: true;
15
- }]], {}>;
23
+ readonly default: 0;
24
+ }], readonly ["link", "char*", {
25
+ readonly default: "";
26
+ }], readonly ["link_len", "u64", {
27
+ readonly lengthOf: "link";
28
+ }]], {
29
+ readonly mapValue: (chunk: StyledChunkInput) => StyledChunkInput;
30
+ }>;
16
31
  export declare const HighlightStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["start", "u32"], readonly ["end", "u32"], readonly ["styleId", "u32"], readonly ["priority", "u8", {
17
32
  readonly default: 0;
18
33
  }], readonly ["hlRef", "u16", {
@@ -51,6 +66,24 @@ export declare const CursorStyleOptionsStruct: import("bun-ffi-structs").DefineS
51
66
  }], readonly ["cursor", "u8", {
52
67
  readonly default: 255;
53
68
  }]], {}>;
69
+ export declare const GridDrawOptionsStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["drawInner", "bool_u8", {
70
+ readonly default: true;
71
+ }], readonly ["drawOuter", "bool_u8", {
72
+ readonly default: true;
73
+ }]], {}>;
74
+ export type BuildOptions = {
75
+ gpaSafeStats: boolean;
76
+ gpaMemoryLimitTracking: boolean;
77
+ };
78
+ export declare const BuildOptionsStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["gpaSafeStats", "bool_u8"], readonly ["gpaMemoryLimitTracking", "bool_u8"]], {}>;
79
+ export type AllocatorStats = {
80
+ totalRequestedBytes: number;
81
+ activeAllocations: number;
82
+ smallAllocations: number;
83
+ largeAllocations: number;
84
+ requestedBytesValid: boolean;
85
+ };
86
+ export declare const AllocatorStatsStruct: import("bun-ffi-structs").DefineStructReturnType<[readonly ["totalRequestedBytes", "u64"], readonly ["activeAllocations", "u64"], readonly ["smallAllocations", "u64"], readonly ["largeAllocations", "u64"], readonly ["requestedBytesValid", "bool_u8"]], {}>;
54
87
  export type GrowthPolicy = "grow" | "block";
55
88
  export type NativeSpanFeedOptions = {
56
89
  chunkSize?: number;
@@ -119,3 +152,4 @@ export declare const ReserveInfoStruct: import("bun-ffi-structs").DefineStructRe
119
152
  len: number;
120
153
  };
121
154
  }>;
155
+ export {};
package/zig.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { type Pointer } from "bun:ffi";
2
2
  import { type CursorStyle, type CursorStyleOptions, type DebugOverlayCorner, type WidthMethod, type Highlight, type LineInfo } from "./types";
3
- export type { LineInfo };
3
+ export type { LineInfo, AllocatorStats, BuildOptions };
4
4
  import { RGBA } from "./lib/RGBA";
5
5
  import { OptimizedBuffer } from "./buffer";
6
6
  import { TextBuffer } from "./text-buffer";
7
- import type { NativeSpanFeedOptions, NativeSpanFeedStats, ReserveInfo } from "./zig-structs";
7
+ import type { NativeSpanFeedOptions, NativeSpanFeedStats, ReserveInfo, BuildOptions, AllocatorStats } from "./zig-structs";
8
8
  export declare enum LogLevel {
9
9
  Error = 0,
10
10
  Warn = 1,
@@ -43,6 +43,7 @@ export interface RenderLib {
43
43
  testing?: boolean;
44
44
  remote?: boolean;
45
45
  }) => Pointer | null;
46
+ setTerminalEnvVar: (renderer: Pointer, key: string, value: string) => boolean;
46
47
  destroyRenderer: (renderer: Pointer) => void;
47
48
  setUseThread: (renderer: Pointer, useThread: boolean) => void;
48
49
  setBackgroundColor: (renderer: Pointer, color: RGBA) => void;
@@ -75,6 +76,10 @@ export interface RenderLib {
75
76
  bufferDrawPackedBuffer: (buffer: Pointer, dataPtr: Pointer, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number) => void;
76
77
  bufferDrawGrayscaleBuffer: (buffer: Pointer, posX: number, posY: number, intensitiesPtr: Pointer, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => void;
77
78
  bufferDrawGrayscaleBufferSupersampled: (buffer: Pointer, posX: number, posY: number, intensitiesPtr: Pointer, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => void;
79
+ bufferDrawGrid: (buffer: Pointer, borderChars: Uint32Array, borderFg: RGBA, borderBg: RGBA, columnOffsets: Int32Array, columnCount: number, rowOffsets: Int32Array, rowCount: number, options: {
80
+ drawInner: boolean;
81
+ drawOuter: boolean;
82
+ }) => void;
78
83
  bufferDrawBox: (buffer: Pointer, x: number, y: number, width: number, height: number, borderChars: Uint32Array, packedOptions: number, borderColor: RGBA, backgroundColor: RGBA, title: string | null) => void;
79
84
  bufferResize: (buffer: Pointer, width: number, height: number) => void;
80
85
  resizeRenderer: (renderer: Pointer, width: number, height: number) => void;
@@ -297,6 +302,8 @@ export interface RenderLib {
297
302
  textBufferGetLineHighlights: (buffer: Pointer, lineIdx: number) => Array<Highlight>;
298
303
  textBufferGetHighlightCount: (buffer: Pointer) => number;
299
304
  getArenaAllocatedBytes: () => number;
305
+ getBuildOptions: () => BuildOptions;
306
+ getAllocatorStats: () => AllocatorStats;
300
307
  createSyntaxStyle: () => Pointer;
301
308
  destroySyntaxStyle: (style: Pointer) => void;
302
309
  syntaxStyleRegister: (style: Pointer, name: string, fg: RGBA | null, bg: RGBA | null, attributes: number) => number;