@opentui/core 0.2.14 → 0.2.16

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,7 +1,7 @@
1
1
  // @bun
2
2
  import {
3
3
  createRuntimePlugin
4
- } from "./index-5v692kqx.js";
4
+ } from "./index-qe67qr6s.js";
5
5
 
6
6
  // src/runtime-plugin-support-configure.ts
7
7
  var {plugin: registerBunPlugin } = globalThis.Bun;
@@ -41,4 +41,4 @@ function ensureRuntimePluginSupport(options = {}) {
41
41
  export { ensureRuntimePluginSupport };
42
42
 
43
43
  //# debugId=09C0597CB92E654F64756E2164756E21
44
- //# sourceMappingURL=index-wdak3pbx.js.map
44
+ //# sourceMappingURL=index-t1vzaxv4.js.map
package/index.js CHANGED
@@ -72,7 +72,7 @@ import {
72
72
  resolveCoreSlot,
73
73
  setupAudio,
74
74
  vstyles
75
- } from "./index-nhyfhtvf.js";
75
+ } from "./index-hzcw4q21.js";
76
76
  import {
77
77
  ASCIIFontSelectionHelper,
78
78
  ATTRIBUTE_BASE_BITS,
@@ -246,7 +246,7 @@ import {
246
246
  white,
247
247
  wrapWithDelegates,
248
248
  yellow
249
- } from "./index-3fq5hq97.js";
249
+ } from "./index-qfwqv8y3.js";
250
250
  export {
251
251
  yellow,
252
252
  wrapWithDelegates,
package/lib/extmarks.d.ts CHANGED
@@ -67,6 +67,7 @@ export declare class ExtmarksController {
67
67
  adjustExtmarksAfterDeletion(deleteOffset: number, length: number): void;
68
68
  private offsetToPosition;
69
69
  private positionToOffset;
70
+ private getNextCursorOffset;
70
71
  private updateHighlights;
71
72
  private offsetExcludingNewlines;
72
73
  create(options: ExtmarkOptions): 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.2.14",
7
+ "version": "0.2.16",
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": {
@@ -69,11 +69,11 @@
69
69
  "web-tree-sitter": "0.25.10"
70
70
  },
71
71
  "optionalDependencies": {
72
- "@opentui/core-darwin-x64": "0.2.14",
73
- "@opentui/core-darwin-arm64": "0.2.14",
74
- "@opentui/core-linux-x64": "0.2.14",
75
- "@opentui/core-linux-arm64": "0.2.14",
76
- "@opentui/core-win32-x64": "0.2.14",
77
- "@opentui/core-win32-arm64": "0.2.14"
72
+ "@opentui/core-darwin-x64": "0.2.16",
73
+ "@opentui/core-darwin-arm64": "0.2.16",
74
+ "@opentui/core-linux-x64": "0.2.16",
75
+ "@opentui/core-linux-arm64": "0.2.16",
76
+ "@opentui/core-win32-x64": "0.2.16",
77
+ "@opentui/core-win32-arm64": "0.2.16"
78
78
  }
79
79
  }
@@ -6,6 +6,8 @@ export type InputKeyBinding = TextareaKeyBinding;
6
6
  export interface InputRenderableOptions extends Omit<TextareaOptions, "height" | "minHeight" | "maxHeight" | "initialValue"> {
7
7
  /** Initial text value (newlines are stripped) */
8
8
  value?: string;
9
+ /** Minimum number of characters allowed */
10
+ minLength?: number;
9
11
  /** Maximum number of characters allowed */
10
12
  maxLength?: number;
11
13
  /** Placeholder text (Input only supports string, not StyledText) */
@@ -29,6 +31,7 @@ export declare enum InputRenderableEvents {
29
31
  */
30
32
  export declare class InputRenderable extends TextareaRenderable {
31
33
  private _maxLength;
34
+ private _minLength;
32
35
  private _lastCommittedValue;
33
36
  private static readonly defaultOptions;
34
37
  constructor(ctx: RenderContext, options: InputRenderableOptions);
@@ -61,6 +64,8 @@ export declare class InputRenderable extends TextareaRenderable {
61
64
  deleteCharacter(direction: "backward" | "forward"): void;
62
65
  set maxLength(maxLength: number);
63
66
  get maxLength(): number;
67
+ set minLength(minLength: number);
68
+ get minLength(): number;
64
69
  set placeholder(placeholder: string);
65
70
  get placeholder(): string;
66
71
  set initialValue(value: string);
@@ -123,6 +123,7 @@ export interface BlockState {
123
123
  marginTop?: number;
124
124
  renderable: Renderable;
125
125
  tableContentCache?: TableContentCache;
126
+ tracksInterBlockMargin?: boolean;
126
127
  }
127
128
  export type { ParseState };
128
129
  export declare class MarkdownRenderable extends Renderable {
@@ -190,7 +191,6 @@ export declare class MarkdownRenderable extends Renderable {
190
191
  private getRenderableListItemTokens;
191
192
  private applyListChildRenderable;
192
193
  private destroyListItemChildrenAfter;
193
- private getListChildMarkdownRaw;
194
194
  private applyListItemMarker;
195
195
  private createListChildRenderable;
196
196
  private createHorizontalRuleRenderable;
@@ -200,6 +200,7 @@ export declare class MarkdownRenderable extends Renderable {
200
200
  private applyCodeBlockRenderable;
201
201
  private shouldRenderSeparately;
202
202
  private getInterBlockMargin;
203
+ private applyInterBlockMargin;
203
204
  private createMarkdownBlockToken;
204
205
  private normalizeMarkdownBlockRaw;
205
206
  private normalizeScrollbackMarkdownBlockRaw;
@@ -86,6 +86,7 @@ export declare class ScrollBoxRenderable extends BoxRenderable {
86
86
  y: number;
87
87
  }): void;
88
88
  private isAtStickyPosition;
89
+ private isAtStickyReengagePoint;
89
90
  add(obj: Renderable | VNode<any, any[]>, index?: number): number;
90
91
  insertBefore(obj: Renderable | VNode<any, any[]> | unknown, anchor?: Renderable | unknown): number;
91
92
  remove(id: string): void;
package/renderer.d.ts CHANGED
@@ -3,7 +3,7 @@ import { DebugOverlayCorner, type CursorStyleOptions, type MousePointerStyle, ty
3
3
  import { RGBA, type ColorInput } from "./lib/RGBA.js";
4
4
  import type { Pointer } from "./platform/ffi.js";
5
5
  import { OptimizedBuffer } from "./buffer.js";
6
- import { type RenderLib } from "./zig.js";
6
+ import { type NativeRenderStats, type RenderLib } from "./zig.js";
7
7
  import { TerminalConsole, type ConsoleOptions } from "./console.js";
8
8
  import { type MouseEventType, type RawMouseEvent, type ScrollInfo } from "./lib/parse.mouse.js";
9
9
  import { Selection } from "./lib/selection.js";
@@ -48,11 +48,34 @@ export interface CliRendererConfig {
48
48
  }
49
49
  export type ScreenMode = "alternate-screen" | "main-screen" | "split-footer";
50
50
  export type ExternalOutputMode = "capture-stdout" | "passthrough";
51
+ export interface CliRendererExternalOutputEvent {
52
+ snapshot: OptimizedBuffer;
53
+ rowColumns: number;
54
+ startOnNewLine: boolean;
55
+ trailingNewline: boolean;
56
+ }
51
57
  export type ConsoleMode = "console-overlay" | "disabled";
52
58
  export type PixelResolution = {
53
59
  width: number;
54
60
  height: number;
55
61
  };
62
+ export interface CliRendererStats extends NativeRenderStats {
63
+ fps: number;
64
+ frameCount: number;
65
+ frameTimes: number[];
66
+ averageFrameTime: number;
67
+ minFrameTime: number;
68
+ maxFrameTime: number;
69
+ frameCallbackTime: number;
70
+ }
71
+ export interface CliRendererFrameEvent {
72
+ frameId: number;
73
+ }
74
+ export interface RendererSchedulerState {
75
+ isRunning: boolean;
76
+ isRendering: boolean;
77
+ hasScheduledRender: boolean;
78
+ }
56
79
  export interface ScrollbackRenderContext {
57
80
  width: number;
58
81
  widthMethod: WidthMethod;
@@ -145,6 +168,8 @@ export declare enum MouseButton {
145
168
  export declare function createCliRenderer(config?: CliRendererConfig): Promise<CliRenderer>;
146
169
  export declare enum CliRenderEvents {
147
170
  RESIZE = "resize",
171
+ FRAME = "frame",
172
+ EXTERNAL_OUTPUT = "external_output",
148
173
  FOCUS = "focus",
149
174
  BLUR = "blur",
150
175
  FOCUSED_RENDERABLE = "focused_renderable",
@@ -322,6 +347,7 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
322
347
  private isIdleNow;
323
348
  private resolveIdleIfNeeded;
324
349
  idle(): Promise<void>;
350
+ getSchedulerState(): RendererSchedulerState;
325
351
  get resolution(): PixelResolution | null;
326
352
  get console(): TerminalConsole;
327
353
  get keyInput(): KeyHandler;
@@ -478,14 +504,8 @@ export declare class CliRenderer extends EventEmitter implements RenderContext {
478
504
  intermediateRender(): void;
479
505
  private renderNative;
480
506
  private collectStatSample;
481
- getStats(): {
482
- fps: number;
483
- frameCount: number;
484
- frameTimes: number[];
485
- averageFrameTime: number;
486
- minFrameTime: number;
487
- maxFrameTime: number;
488
- };
507
+ getNativeStats(): NativeRenderStats;
508
+ getStats(): CliRendererStats;
489
509
  resetStats(): void;
490
510
  setGatherStats(enabled: boolean): void;
491
511
  getSelection(): Selection | null;
@@ -1,13 +1,13 @@
1
1
  // @bun
2
2
  import {
3
3
  ensureRuntimePluginSupport
4
- } from "./index-wdak3pbx.js";
4
+ } from "./index-t1vzaxv4.js";
5
5
  import {
6
6
  createRuntimePlugin,
7
7
  runtimeModuleIdForSpecifier
8
- } from "./index-5v692kqx.js";
9
- import"./index-nhyfhtvf.js";
10
- import"./index-3fq5hq97.js";
8
+ } from "./index-qe67qr6s.js";
9
+ import"./index-hzcw4q21.js";
10
+ import"./index-qfwqv8y3.js";
11
11
  export {
12
12
  runtimeModuleIdForSpecifier,
13
13
  ensureRuntimePluginSupport,
@@ -1,13 +1,13 @@
1
1
  // @bun
2
2
  import {
3
3
  ensureRuntimePluginSupport
4
- } from "./index-wdak3pbx.js";
4
+ } from "./index-t1vzaxv4.js";
5
5
  import {
6
6
  createRuntimePlugin,
7
7
  runtimeModuleIdForSpecifier
8
- } from "./index-5v692kqx.js";
9
- import"./index-nhyfhtvf.js";
10
- import"./index-3fq5hq97.js";
8
+ } from "./index-qe67qr6s.js";
9
+ import"./index-hzcw4q21.js";
10
+ import"./index-qfwqv8y3.js";
11
11
  // src/runtime-plugin-support.ts
12
12
  ensureRuntimePluginSupport();
13
13
  export {
package/runtime-plugin.js CHANGED
@@ -3,9 +3,9 @@ import {
3
3
  createRuntimePlugin,
4
4
  isCoreRuntimeModuleSpecifier,
5
5
  runtimeModuleIdForSpecifier
6
- } from "./index-5v692kqx.js";
7
- import"./index-nhyfhtvf.js";
8
- import"./index-3fq5hq97.js";
6
+ } from "./index-qe67qr6s.js";
7
+ import"./index-hzcw4q21.js";
8
+ import"./index-qfwqv8y3.js";
9
9
  export {
10
10
  runtimeModuleIdForSpecifier,
11
11
  isCoreRuntimeModuleSpecifier,
@@ -20,7 +20,7 @@ export interface TestRecorderOptions {
20
20
  now?: () => number;
21
21
  }
22
22
  /**
23
- * TestRecorder records frames from a TestRenderer by hooking into the render pipeline.
23
+ * TestRecorder records frames from a TestRenderer by listening to rendered frame events.
24
24
  * It captures the character frame after each native render pass.
25
25
  */
26
26
  export declare class TestRecorder {
@@ -29,17 +29,17 @@ export declare class TestRecorder {
29
29
  private recording;
30
30
  private frameNumber;
31
31
  private startTime;
32
- private originalRenderNative?;
33
32
  private decoder;
34
33
  private recordBuffers;
35
34
  private now;
35
+ private readonly onFrame;
36
36
  constructor(renderer: TestRenderer, options?: TestRecorderOptions);
37
37
  /**
38
- * Start recording frames. This hooks into the renderer's renderNative method.
38
+ * Start recording frames.
39
39
  */
40
40
  rec(): void;
41
41
  /**
42
- * Stop recording frames and restore the original renderNative method.
42
+ * Stop recording frames.
43
43
  */
44
44
  stop(): void;
45
45
  /**
@@ -1,4 +1,5 @@
1
1
  import { CliRenderer, type CliRendererConfig } from "../renderer.js";
2
+ import { type NativeRenderStats } from "../zig.js";
2
3
  import { createMockKeys } from "./mock-keys.js";
3
4
  import { createMockMouse } from "./mock-mouse.js";
4
5
  import type { CapturedFrame } from "../types.js";
@@ -12,12 +13,43 @@ export interface TestRenderer extends CliRenderer {
12
13
  }
13
14
  export type MockInput = ReturnType<typeof createMockKeys>;
14
15
  export type MockMouse = ReturnType<typeof createMockMouse>;
15
- export declare function createTestRenderer(options: TestRendererOptions): Promise<{
16
+ export interface TestFlushOptions {
17
+ maxPasses?: number;
18
+ }
19
+ export interface TestVisualIdleOptions {
20
+ quietFrames?: number;
21
+ maxFrames?: number;
22
+ }
23
+ export interface TestWaitForOptions {
24
+ maxPasses?: number;
25
+ }
26
+ export interface TestExternalOutputCommit {
27
+ text: string;
28
+ rows: string[];
29
+ width: number;
30
+ height: number;
31
+ rowColumns: number;
32
+ startOnNewLine: boolean;
33
+ trailingNewline: boolean;
34
+ }
35
+ export interface TestExternalOutput {
36
+ take(): TestExternalOutputCommit[];
37
+ takeText(): string;
38
+ clear(): void;
39
+ }
40
+ export interface TestRendererSetup {
16
41
  renderer: TestRenderer;
17
42
  mockInput: MockInput;
18
43
  mockMouse: MockMouse;
19
44
  renderOnce: () => Promise<void>;
45
+ flush: (options?: TestFlushOptions) => Promise<void>;
46
+ waitFor: (predicate: () => boolean | Promise<boolean>, options?: TestWaitForOptions) => Promise<void>;
47
+ waitForFrame: (predicate: (frame: string) => boolean | Promise<boolean>, options?: TestWaitForOptions) => Promise<string>;
48
+ waitForVisualIdle: (options?: TestVisualIdleOptions) => Promise<void>;
49
+ externalOutput: TestExternalOutput;
50
+ getNativeStats: () => NativeRenderStats;
20
51
  captureCharFrame: () => string;
21
52
  captureSpans: () => CapturedFrame;
22
53
  resize: (width: number, height: number) => void;
23
- }>;
54
+ }
55
+ export declare function createTestRenderer(options: TestRendererOptions): Promise<TestRendererSetup>;
package/testing.d.ts CHANGED
@@ -4,4 +4,5 @@ export * from "./testing/mock-mouse.js";
4
4
  export * from "./testing/mock-tree-sitter-client.js";
5
5
  export * from "./testing/terminal-capabilities.js";
6
6
  export * from "./testing/spy.js";
7
+ export { ManualClock } from "./testing/manual-clock.js";
7
8
  export { TestRecorder, type RecordedFrame } from "./testing/test-recorder.js";