@fairyhunter13/opentui-core 0.1.130 → 0.1.131

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.
@@ -1,10 +1,10 @@
1
1
  // @bun
2
2
  import {
3
3
  exports_src
4
- } from "./index-3dryhc1d.js";
4
+ } from "./index-gwfqqvw5.js";
5
5
  import {
6
6
  __require
7
- } from "./index-pr4swpf9.js";
7
+ } from "./index-t3rrpex7.js";
8
8
 
9
9
  // src/runtime-plugin.ts
10
10
  import { existsSync, readFileSync, realpathSync } from "fs";
@@ -408,4 +408,4 @@ function createRuntimePlugin(input = {}) {
408
408
  export { isCoreRuntimeModuleSpecifier, runtimeModuleIdForSpecifier, createRuntimePlugin };
409
409
 
410
410
  //# debugId=127A9B143CE0234164756E2164756E21
411
- //# sourceMappingURL=index-983h7jnd.js.map
411
+ //# sourceMappingURL=index-t54p24hr.js.map
package/index.js CHANGED
@@ -6,11 +6,9 @@ import {
6
6
  ArrowRenderable,
7
7
  BloomEffect,
8
8
  Box,
9
- BoxRenderable,
10
9
  CRTRollingBarEffect,
11
10
  CloudsEffect,
12
11
  Code,
13
- CodeRenderable,
14
12
  DEUTERANOPIA_COMP_MATRIX,
15
13
  DEUTERANOPIA_SIM_MATRIX,
16
14
  DiffRenderable,
@@ -31,7 +29,6 @@ import {
31
29
  PROTANOPIA_COMP_MATRIX,
32
30
  PROTANOPIA_SIM_MATRIX,
33
31
  RainbowTextEffect,
34
- RootTextNodeRenderable,
35
32
  SEPIA_MATRIX,
36
33
  SOLARIZATION_MATRIX,
37
34
  SYNTHWAVE_MATRIX,
@@ -44,7 +41,6 @@ import {
44
41
  SliderRenderable,
45
42
  SlotRegistry,
46
43
  SlotRenderable,
47
- SyntaxStyle,
48
44
  TECHNICOLOR_MATRIX,
49
45
  TRITANOPIA_COMP_MATRIX,
50
46
  TRITANOPIA_SIM_MATRIX,
@@ -52,10 +48,6 @@ import {
52
48
  TabSelectRenderable,
53
49
  TabSelectRenderableEvents,
54
50
  Text,
55
- TextBufferRenderable,
56
- TextBufferView,
57
- TextNodeRenderable,
58
- TextRenderable,
59
51
  TextTableRenderable,
60
52
  TextareaRenderable,
61
53
  TimeToFirstDrawRenderable,
@@ -70,16 +62,14 @@ import {
70
62
  applyNoise,
71
63
  applySaturation,
72
64
  applyScanlines,
73
- convertThemeToStyles,
74
65
  createCoreSlotRegistry,
75
66
  createSlotRegistry,
76
67
  createTimeline,
77
68
  engine,
78
- isTextNodeRenderable,
79
69
  registerCorePlugin,
80
70
  resolveCoreSlot,
81
71
  vstyles
82
- } from "./index-3dryhc1d.js";
72
+ } from "./index-gwfqqvw5.js";
83
73
  import {
84
74
  ASCIIFontSelectionHelper,
85
75
  ATTRIBUTE_BASE_BITS,
@@ -87,8 +77,10 @@ import {
87
77
  BaseRenderable,
88
78
  BorderCharArrays,
89
79
  BorderChars,
80
+ BoxRenderable,
90
81
  CliRenderEvents,
91
82
  CliRenderer,
83
+ CodeRenderable,
92
84
  ConsolePosition,
93
85
  DataPathsManager,
94
86
  DebugOverlayCorner,
@@ -114,15 +106,21 @@ import {
114
106
  RenderableEvents,
115
107
  RendererControlState,
116
108
  RootRenderable,
109
+ RootTextNodeRenderable,
117
110
  Selection,
118
111
  StdinParser,
119
112
  StyledText,
113
+ SyntaxStyle,
120
114
  SystemClock,
121
115
  TargetChannel,
122
116
  TerminalConsole,
123
117
  TerminalPalette,
124
118
  TextAttributes,
125
119
  TextBuffer,
120
+ TextBufferRenderable,
121
+ TextBufferView,
122
+ TextNodeRenderable,
123
+ TextRenderable,
126
124
  TreeSitterClient,
127
125
  addDefaultParsers,
128
126
  attributesWithLink,
@@ -153,6 +151,7 @@ import {
153
151
  capture,
154
152
  clearEnvCache,
155
153
  convertGlobalToLocalSelection,
154
+ convertThemeToStyles,
156
155
  coordinateToCharacterIndex,
157
156
  createCliRenderer,
158
157
  createExtmarksController,
@@ -189,6 +188,7 @@ import {
189
188
  isEditBufferRenderable,
190
189
  isRenderable,
191
190
  isStyledText,
191
+ isTextNodeRenderable,
192
192
  isVNode,
193
193
  isValidBorderStyle,
194
194
  italic,
@@ -236,7 +236,7 @@ import {
236
236
  white,
237
237
  wrapWithDelegates,
238
238
  yellow
239
- } from "./index-pr4swpf9.js";
239
+ } from "./index-t3rrpex7.js";
240
240
  export {
241
241
  yellow,
242
242
  wrapWithDelegates,
@@ -474,5 +474,5 @@ export {
474
474
  ACHROMATOPSIA_MATRIX
475
475
  };
476
476
 
477
- //# debugId=FD2591B7A1AB109264756E2164756E21
477
+ //# debugId=32A13A6074BDA33364756E2164756E21
478
478
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "FD2591B7A1AB109264756E2164756E21",
7
+ "debugId": "32A13A6074BDA33364756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -0,0 +1,8 @@
1
+ export type RenderGeometryScreenMode = "alternate-screen" | "main-screen" | "split-footer";
2
+ export interface RenderGeometry {
3
+ effectiveFooterHeight: number;
4
+ renderOffset: number;
5
+ renderWidth: number;
6
+ renderHeight: number;
7
+ }
8
+ export declare function calculateRenderGeometry(screenMode: RenderGeometryScreenMode, terminalWidth: number, terminalHeight: number, footerHeight: number): RenderGeometry;
@@ -3,7 +3,7 @@ import { type ParsedKey } from "./parse.keypress.js";
3
3
  import { type RawMouseEvent } from "./parse.mouse.js";
4
4
  import type { PasteMetadata } from "./paste.js";
5
5
  export { SystemClock, type Clock, type TimerHandle } from "./clock.js";
6
- export type StdinResponseProtocol = "csi" | "osc" | "dcs" | "apc" | "unknown";
6
+ export type StdinResponseProtocol = "csi" | "cpr" | "osc" | "dcs" | "apc" | "unknown";
7
7
  export type StdinEvent = {
8
8
  type: "key";
9
9
  raw: string;
@@ -27,6 +27,7 @@ export interface StdinParserProtocolContext {
27
27
  privateCapabilityRepliesActive: boolean;
28
28
  pixelResolutionQueryActive: boolean;
29
29
  explicitWidthCprActive: boolean;
30
+ startupCursorCprActive: boolean;
30
31
  }
31
32
  export interface StdinParserOptions {
32
33
  timeoutMs?: number;
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.130",
7
+ "version": "0.1.131",
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": {
@@ -67,12 +67,12 @@
67
67
  "bun-webgpu": "0.1.5",
68
68
  "planck": "^1.4.2",
69
69
  "three": "0.177.0",
70
- "@fairyhunter13/opentui-core-darwin-x64": "0.1.130",
71
- "@fairyhunter13/opentui-core-darwin-arm64": "0.1.130",
72
- "@fairyhunter13/opentui-core-linux-x64": "0.1.130",
73
- "@fairyhunter13/opentui-core-linux-arm64": "0.1.130",
74
- "@fairyhunter13/opentui-core-win32-x64": "0.1.130",
75
- "@fairyhunter13/opentui-core-win32-arm64": "0.1.130"
70
+ "@fairyhunter13/opentui-core-darwin-x64": "0.1.131",
71
+ "@fairyhunter13/opentui-core-darwin-arm64": "0.1.131",
72
+ "@fairyhunter13/opentui-core-linux-x64": "0.1.131",
73
+ "@fairyhunter13/opentui-core-linux-arm64": "0.1.131",
74
+ "@fairyhunter13/opentui-core-win32-x64": "0.1.131",
75
+ "@fairyhunter13/opentui-core-win32-arm64": "0.1.131"
76
76
  },
77
77
  "publishConfig": {
78
78
  "access": "public"
@@ -8,7 +8,16 @@ import { type TextTableColumnFitter, type TextTableColumnWidthMode, type TextTab
8
8
  import type { TreeSitterClient } from "../lib/tree-sitter/index.js";
9
9
  import { type ParseState } from "./markdown-parser.js";
10
10
  import type { OptimizedBuffer } from "../buffer.js";
11
+ export type MarkdownTableStyle = "grid" | "columns";
11
12
  export interface MarkdownTableOptions {
13
+ /**
14
+ * Visual style preset for markdown tables.
15
+ * - "grid": boxed table with visible borders.
16
+ * - "columns": borderless columns optimized for separated block output.
17
+ *
18
+ * Defaults to "columns" in `internalBlockMode: "top-level"`, otherwise "grid".
19
+ */
20
+ style?: MarkdownTableStyle;
12
21
  /**
13
22
  * Strategy for sizing table columns.
14
23
  * - "content": columns fit to intrinsic content width.
@@ -81,6 +90,12 @@ export interface MarkdownOptions extends RenderableOptions<MarkdownRenderable> {
81
90
  * or undefined/null to use default rendering.
82
91
  */
83
92
  renderNode?: (token: Token, context: RenderNodeContext) => Renderable | undefined | null;
93
+ /**
94
+ * Internal only.
95
+ * - "coalesced": combine ordinary markdown into larger render blocks.
96
+ * - "top-level": preserve top-level markdown blocks as separate render blocks.
97
+ */
98
+ internalBlockMode?: "coalesced" | "top-level";
84
99
  }
85
100
  export interface RenderNodeContext {
86
101
  syntaxStyle: SyntaxStyle;
@@ -97,6 +112,7 @@ interface TableContentCache {
97
112
  export interface BlockState {
98
113
  token: MarkedToken;
99
114
  tokenRaw: string;
115
+ marginTop?: number;
100
116
  renderable: Renderable;
101
117
  tableContentCache?: TableContentCache;
102
118
  }
@@ -111,9 +127,11 @@ export declare class MarkdownRenderable extends Renderable {
111
127
  private _treeSitterClient?;
112
128
  private _tableOptions?;
113
129
  private _renderNode?;
130
+ private _internalBlockMode;
114
131
  _parseState: ParseState | null;
115
132
  private _streaming;
116
133
  _blockStates: BlockState[];
134
+ _stableBlockCount: number;
117
135
  private _styleDirty;
118
136
  private _linkifyMarkdownChunks;
119
137
  private _inlineConcealChunks;
@@ -122,6 +140,7 @@ export declare class MarkdownRenderable extends Renderable {
122
140
  conceal: true;
123
141
  concealCode: false;
124
142
  streaming: false;
143
+ internalBlockMode: "coalesced";
125
144
  };
126
145
  constructor(ctx: RenderContext, options: MarkdownOptions);
127
146
  get content(): string;
@@ -146,6 +165,7 @@ export declare class MarkdownRenderable extends Renderable {
146
165
  private renderInlineContent;
147
166
  private renderInlineToken;
148
167
  private renderInlineTokenWithStyle;
168
+ private applyMargins;
149
169
  private buildInlineConcealChunks;
150
170
  private renderBlockTokenInline;
151
171
  private renderListInline;
@@ -157,7 +177,9 @@ export declare class MarkdownRenderable extends Renderable {
157
177
  private getInterBlockMargin;
158
178
  private createMarkdownBlockToken;
159
179
  private normalizeMarkdownBlockRaw;
180
+ private normalizeScrollbackMarkdownBlockRaw;
160
181
  private buildRenderableTokens;
182
+ private buildTopLevelRenderBlocks;
161
183
  private getTableRowsToRender;
162
184
  private hashString;
163
185
  private hashTableToken;
@@ -165,13 +187,21 @@ export declare class MarkdownRenderable extends Renderable {
165
187
  private createTableDataCellChunks;
166
188
  private createTableHeaderCellChunks;
167
189
  private buildTableContentCache;
190
+ private resolveTableStyle;
191
+ private usesBorderlessColumnSpacing;
168
192
  private resolveTableRenderableOptions;
169
193
  private applyTableRenderableOptions;
170
194
  private applyTableOptionsToBlocks;
171
195
  private createTextTableRenderable;
172
196
  private createTableBlock;
197
+ private getStableBlockCount;
198
+ private syncTopLevelBlockState;
199
+ private getTopLevelBlockRaw;
200
+ private createTopLevelDefaultRenderable;
201
+ private createTopLevelRenderable;
173
202
  private createDefaultRenderable;
174
203
  private updateBlockRenderable;
204
+ private updateTopLevelBlocks;
175
205
  private updateBlocks;
176
206
  private clearBlockStates;
177
207
  /**
@@ -33,6 +33,7 @@ export declare abstract class TextBufferRenderable extends Renderable implements
33
33
  protected _scrollX: number;
34
34
  protected _scrollY: number;
35
35
  protected _truncate: boolean;
36
+ protected _firstLineOffset: number;
36
37
  protected textBuffer: TextBuffer;
37
38
  protected textBufferView: TextBufferView;
38
39
  protected _textBufferSyntaxStyle: SyntaxStyle;
@@ -15,6 +15,7 @@ export interface TextTableOptions extends RenderableOptions<TextTableRenderable>
15
15
  columnWidthMode?: TextTableColumnWidthMode;
16
16
  columnFitter?: TextTableColumnFitter;
17
17
  cellPadding?: number;
18
+ columnGap?: number;
18
19
  showBorders?: boolean;
19
20
  border?: boolean;
20
21
  outerBorder?: boolean;
@@ -35,6 +36,7 @@ export declare class TextTableRenderable extends Renderable {
35
36
  private _columnWidthMode;
36
37
  private _columnFitter;
37
38
  private _cellPadding;
39
+ private _columnGap;
38
40
  private _showBorders;
39
41
  private _border;
40
42
  private _outerBorder;
@@ -71,6 +73,8 @@ export declare class TextTableRenderable extends Renderable {
71
73
  set columnFitter(value: TextTableColumnFitter);
72
74
  get cellPadding(): number;
73
75
  set cellPadding(value: number);
76
+ get columnGap(): number;
77
+ set columnGap(value: number);
74
78
  get showBorders(): boolean;
75
79
  set showBorders(value: boolean);
76
80
  get outerBorder(): boolean;
@@ -109,6 +113,8 @@ export declare class TextTableRenderable extends Renderable {
109
113
  private allocateShrinkByWeight;
110
114
  private computeRowHeights;
111
115
  private computeOffsets;
116
+ private getInterColumnGap;
117
+ private getTotalInterColumnGap;
112
118
  private applyLayoutToViews;
113
119
  private resolveBorderLayout;
114
120
  private getVerticalBorderCount;
@@ -135,6 +141,7 @@ export declare class TextTableRenderable extends Renderable {
135
141
  private getVerticalCellPadding;
136
142
  private resolveColumnFitter;
137
143
  private resolveCellPadding;
144
+ private resolveColumnGap;
138
145
  private invalidateLayoutAndRaster;
139
146
  private invalidateRasterOnly;
140
147
  }
@@ -2,6 +2,7 @@ import { type MarkedToken } from "marked";
2
2
  export interface ParseState {
3
3
  content: string;
4
4
  tokens: MarkedToken[];
5
+ stableTokenCount?: number;
5
6
  }
6
7
  /**
7
8
  * Incrementally parse markdown, reusing unchanged tokens from previous parse.
package/renderer.d.ts CHANGED
@@ -20,6 +20,7 @@ export interface CliRendererConfig {
20
20
  testing?: boolean;
21
21
  exitOnCtrlC?: boolean;
22
22
  exitSignals?: NodeJS.Signals[];
23
+ clearOnShutdown?: boolean;
23
24
  forwardEnvKeys?: string[];
24
25
  debounceDelay?: number;
25
26
  targetFps?: number;
@@ -52,6 +53,40 @@ export type PixelResolution = {
52
53
  width: number;
53
54
  height: number;
54
55
  };
56
+ export interface ScrollbackRenderContext {
57
+ width: number;
58
+ widthMethod: WidthMethod;
59
+ tailColumn: number;
60
+ renderContext: RenderContext;
61
+ }
62
+ export interface ScrollbackSnapshot {
63
+ root: Renderable;
64
+ width?: number;
65
+ height?: number;
66
+ rowColumns?: number;
67
+ startOnNewLine?: boolean;
68
+ trailingNewline?: boolean;
69
+ teardown?: () => void;
70
+ }
71
+ export type ScrollbackWriter = (ctx: ScrollbackRenderContext) => ScrollbackSnapshot;
72
+ export interface ScrollbackSurfaceOptions {
73
+ startOnNewLine?: boolean;
74
+ }
75
+ export interface ScrollbackSurfaceCommitOptions {
76
+ rowColumns?: number;
77
+ trailingNewline?: boolean;
78
+ }
79
+ export interface ScrollbackSurface {
80
+ readonly renderContext: RenderContext;
81
+ readonly root: Renderable;
82
+ readonly width: number;
83
+ readonly height: number;
84
+ readonly isDestroyed: boolean;
85
+ render(): void;
86
+ settle(timeoutMs?: number): Promise<void>;
87
+ commitRows(startRow: number, endRowExclusive: number, options?: ScrollbackSurfaceCommitOptions): void;
88
+ destroy(): void;
89
+ }
55
90
  /**
56
91
  * Kitty Keyboard Protocol configuration options
57
92
  * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#progressive-enhancement
@@ -190,6 +225,8 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
190
225
  private animationRequest;
191
226
  private resizeTimeoutId;
192
227
  private capabilityTimeoutId;
228
+ private splitStartupSeedTimeoutId;
229
+ private pendingSplitStartupCursorSeed;
193
230
  private resizeDebounceDelay;
194
231
  private enableMouseMovement;
195
232
  private _useMouse;
@@ -197,6 +234,7 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
197
234
  private _screenMode;
198
235
  private _footerHeight;
199
236
  private _externalOutputMode;
237
+ private clearOnShutdown;
200
238
  private _suspendedMouseEnabled;
201
239
  private _previousControlState;
202
240
  private capturedRenderable?;
@@ -207,11 +245,15 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
207
245
  private clipboard;
208
246
  private _splitHeight;
209
247
  private renderOffset;
248
+ private splitTailColumn;
249
+ private pendingSplitFooterTransition;
250
+ private forceFullRepaintRequested;
251
+ private readonly maxSplitCommitsPerFrame;
210
252
  private _terminalWidth;
211
253
  private _terminalHeight;
212
254
  private _terminalIsSetup;
255
+ private externalOutputQueue;
213
256
  private realStdoutWrite;
214
- private captureCallback;
215
257
  private _useConsole;
216
258
  private sigwinchHandler;
217
259
  private _capabilities;
@@ -227,6 +269,10 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
227
269
  private _paletteDetectionPromise;
228
270
  private _onDestroy?;
229
271
  private _themeMode;
272
+ private _themeModeSource;
273
+ private _themeFallbackPending;
274
+ private _themeOscForeground;
275
+ private _themeOscBackground;
230
276
  private _terminalFocusState;
231
277
  private sequenceHandlers;
232
278
  private prependedInputHandlers;
@@ -291,13 +337,36 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
291
337
  get currentControlState(): string;
292
338
  get capabilities(): any | null;
293
339
  get themeMode(): ThemeMode | null;
340
+ waitForThemeMode(timeoutMs?: number): Promise<ThemeMode | null>;
294
341
  getDebugInputs(): Array<{
295
342
  timestamp: string;
296
343
  sequence: string;
297
344
  }>;
298
345
  get useKittyKeyboard(): boolean;
299
346
  set useKittyKeyboard(use: boolean);
347
+ createScrollbackSurface(options?: ScrollbackSurfaceOptions): ScrollbackSurface;
348
+ writeToScrollback(write: ScrollbackWriter): void;
349
+ private getSnapshotWidth;
350
+ private getSnapshotHeight;
351
+ private getSnapshotRowWidths;
352
+ private publishSplitTailColumns;
353
+ private recordSplitCommit;
354
+ private enqueueRenderedScrollbackCommit;
355
+ private enqueueSplitCommit;
356
+ private createStdoutSnapshotCommit;
357
+ private splitStdoutRows;
358
+ private createStdoutSnapshotCommits;
359
+ private flushPendingSplitCommits;
300
360
  private interceptStdoutWrite;
361
+ private getSplitPinnedRenderOffset;
362
+ private getSplitCursorSeedRows;
363
+ private flushPendingSplitOutputBeforeTransition;
364
+ private resetSplitScrollback;
365
+ private syncSplitScrollback;
366
+ private clearPendingSplitFooterTransition;
367
+ private setPendingSplitFooterTransition;
368
+ private syncSplitFooterState;
369
+ private clearStaleSplitSurfaceRows;
301
370
  private applyScreenMode;
302
371
  private flushStdoutCache;
303
372
  private enableMouse;
@@ -312,9 +381,11 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
312
381
  removeInputHandler(handler: (sequence: string) => boolean): void;
313
382
  private updateStdinParserProtocolContext;
314
383
  subscribeOsc(handler: (sequence: string) => void): () => void;
384
+ private processCapabilitySequence;
315
385
  private capabilityHandler;
316
386
  private focusHandler;
317
387
  private themeModeHandler;
388
+ private applyThemeMode;
318
389
  private dispatchSequenceHandlers;
319
390
  private drainStdinParser;
320
391
  private handleStdinEvent;
@@ -2,9 +2,9 @@
2
2
  import {
3
3
  createRuntimePlugin,
4
4
  runtimeModuleIdForSpecifier
5
- } from "./index-983h7jnd.js";
6
- import"./index-3dryhc1d.js";
7
- import"./index-pr4swpf9.js";
5
+ } from "./index-t54p24hr.js";
6
+ import"./index-gwfqqvw5.js";
7
+ import"./index-t3rrpex7.js";
8
8
 
9
9
  // src/runtime-plugin-support.ts
10
10
  var {plugin: registerBunPlugin } = globalThis.Bun;
package/runtime-plugin.js CHANGED
@@ -3,9 +3,9 @@ import {
3
3
  createRuntimePlugin,
4
4
  isCoreRuntimeModuleSpecifier,
5
5
  runtimeModuleIdForSpecifier
6
- } from "./index-983h7jnd.js";
7
- import"./index-3dryhc1d.js";
8
- import"./index-pr4swpf9.js";
6
+ } from "./index-t54p24hr.js";
7
+ import"./index-gwfqqvw5.js";
8
+ import"./index-t3rrpex7.js";
9
9
  export {
10
10
  runtimeModuleIdForSpecifier,
11
11
  isCoreRuntimeModuleSpecifier,
package/testing.js CHANGED
@@ -3,8 +3,9 @@ import {
3
3
  ANSI,
4
4
  CliRenderer,
5
5
  TreeSitterClient,
6
+ calculateRenderGeometry,
6
7
  resolveRenderLib
7
- } from "./index-pr4swpf9.js";
8
+ } from "./index-t3rrpex7.js";
8
9
 
9
10
  // src/testing/test-renderer.ts
10
11
  import { Readable, Writable } from "stream";
@@ -522,9 +523,11 @@ async function setupTestRenderer(config) {
522
523
  const width = config.width || config.stdout?.columns || process.stdout.columns || 80;
523
524
  const height = config.height || config.stdout?.rows || process.stdout.rows || 24;
524
525
  const stdout = config.stdout || new TestWriteStream(width, height);
525
- const renderHeight = config.screenMode === "split-footer" ? config.footerHeight ?? 12 : height;
526
+ const screenMode = config.screenMode ?? "alternate-screen";
527
+ const footerHeight = config.footerHeight ?? 12;
528
+ const geometry = calculateRenderGeometry(screenMode, width, height, footerHeight);
526
529
  const ziglib = resolveRenderLib();
527
- const rendererPtr = ziglib.createRenderer(width, renderHeight, {
530
+ const rendererPtr = ziglib.createRenderer(geometry.renderWidth, geometry.renderHeight, {
528
531
  testing: true,
529
532
  remote: config.remote ?? false
530
533
  });
@@ -693,5 +696,5 @@ export {
693
696
  KeyCodes
694
697
  };
695
698
 
696
- //# debugId=75C57AE1327A974C64756E2164756E21
699
+ //# debugId=269D1D9A5FEEE19764756E2164756E21
697
700
  //# sourceMappingURL=testing.js.map