These docs describe the main branch, including unreleased changes. Read the 0.6.0 docs.

OpenTUI 0.5.6

npmGitHub release

Added

  • core: EmbeddedTerminalRenderable renders terminal output into the layout. Call write() to send output to it. It handles focus, key, paste, and mouse input, scrollback, text selection, resize, and the hardware cursor. Options are cols, rows, maxScrollback, selectable, onData, onScreenChange, and onTerminalResize. onData receives the encoded bytes for your process, and its source argument is "input" or "response". screen() returns the visible text, and getSelectedText() returns the selection. The renderable does not start or own a process or PTY. It does not send SGR-pixel mouse reports because OpenTUI uses cell coordinates. See Embedded terminal. (#1340)
  • native: The native library exports the embedded terminal interface. On custom targets that do not support it, the exported functions return an explicit unsupported status. See Embedded terminal. (#1340)

Changed

  • core: OptimizedBuffer.drawPackedBuffer() and OptimizedBuffer.drawSuperSampleBuffer() accept a Uint8Array as well as a pointer. The parameters are renamed from dataPtr to data and from pixelDataPtr to pixelData. See Buffer API. (#1394)
  • core: RenderLib.bufferColorMatrix, bufferColorMatrixUniform, bufferDrawGrayscaleBuffer, bufferDrawGrayscaleBufferSupersampled, bufferDrawPackedBuffer, and bufferDrawSuperSampleBuffer accept a typed array as well as a pointer. See FrameBuffer color matrices. (#1394)

Fixed

  • core: Typed arrays passed to native calls on Bun no longer risk a stale native address when the array moves into separate ArrayBuffer storage. (#1394)

API changes#

@opentui/core#

Added

  • class EmbeddedTerminalRenderable extends Renderable
  • constructor EmbeddedTerminalRenderable(ctx: RenderContext, options: EmbeddedTerminalOptions)
  • interface EmbeddedTerminalOptions extends RenderableOptions<EmbeddedTerminalRenderable>
  • property RenderLib.createEmbeddedTerminal: (options: { cols: number; rows: number; maxScrollback?: number; }) => EmbeddedTerminalHandle
  • property RenderLib.destroyEmbeddedTerminal: (handle: EmbeddedTerminalHandle) => void
  • property RenderLib.embeddedTerminalClearSelection: (handle: EmbeddedTerminalHandle) => void
  • property RenderLib.embeddedTerminalCompose: (handle: EmbeddedTerminalHandle, target: OptimizedBufferHandle, x: number, y: number) => void
  • property RenderLib.embeddedTerminalCursor: (handle: EmbeddedTerminalHandle) => EmbeddedTerminalCursor
  • property RenderLib.embeddedTerminalDrainResponses: (handle: EmbeddedTerminalHandle) => Uint8Array
  • property RenderLib.embeddedTerminalEncodeFocus: (handle: EmbeddedTerminalHandle, focused: boolean) => Uint8Array
  • property RenderLib.embeddedTerminalEncodeKey: (handle: EmbeddedTerminalHandle, key: EmbeddedTerminalKey) => Uint8Array
  • property RenderLib.embeddedTerminalEncodeMouse: (handle: EmbeddedTerminalHandle, mouse: EmbeddedTerminalMouse) => Uint8Array
  • property RenderLib.embeddedTerminalEncodePaste: (handle: EmbeddedTerminalHandle, input: Uint8Array) => Uint8Array
  • property RenderLib.embeddedTerminalGetSelectedText: (handle: EmbeddedTerminalHandle) => Uint8Array
  • property RenderLib.embeddedTerminalInvalidate: (handle: EmbeddedTerminalHandle) => void
  • property RenderLib.embeddedTerminalResize: (handle: EmbeddedTerminalHandle, cols: number, rows: number) => void
  • property RenderLib.embeddedTerminalScroll: (handle: EmbeddedTerminalHandle, delta: number) => void
  • property RenderLib.embeddedTerminalSetSelection: (handle: EmbeddedTerminalHandle, start: { x: number; y: number; }, end: { x: number; y: number; }) => void
  • property RenderLib.embeddedTerminalWrite: (handle: EmbeddedTerminalHandle, data: string | Uint8Array) => void
  • type EmbeddedTerminalCursor = { x: number; y: number; hasValue: boolean; visible: boolean; blinking: boolean; wideTail: boolean; style: "bar" | "block" | "underline" | "block-hollow"; color?: { r: number; g: number; b: number; }; }
  • type EmbeddedTerminalDataSource = "input" | "response"
  • type EmbeddedTerminalHandle = NativeHandle<"embedded_terminal">
  • type EmbeddedTerminalKey = { action?: "release" | "press" | "repeat"; key?: string; mods?: number; consumedMods?: number; composing?: boolean; text?: string; unshiftedCodepoint?: number; }
  • type EmbeddedTerminalMouse = { action: "press" | "release" | "motion"; button?: "unknown" | "left" | "right" | "middle" | "four" | "five" | "six" | "seven"; mods?: number; x: number; y: number; anyButtonPressed?: boolean; }
  • type EmbeddedTerminalScreen = { text: string; lines: string[]; columns: number; rows: number; cursor: { x: number; y: number; visible: boolean; }; }

Changed

  • method OptimizedBuffer.drawPackedBuffer(dataPtr: PointerInput, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number): voidmethod OptimizedBuffer.drawPackedBuffer(data: PointerInput | Uint8Array, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number): void
  • method OptimizedBuffer.drawSuperSampleBuffer(x: number, y: number, pixelDataPtr: PointerInput, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number): voidmethod OptimizedBuffer.drawSuperSampleBuffer(x: number, y: number, pixelData: PointerInput | Uint8Array, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number): void
  • property RenderLib.bufferColorMatrix: (buffer: OptimizedBufferHandle, matrixPtr: Pointer, cellMaskPtr: Pointer, cellMaskCount: number, strength: number, target: TargetChannel) => voidproperty RenderLib.bufferColorMatrix: (buffer: OptimizedBufferHandle, matrix: Pointer | Float32Array, cellMask: Pointer | Float32Array, cellMaskCount: number, strength: number, target: TargetChannel) => void
  • property RenderLib.bufferColorMatrixUniform: (buffer: OptimizedBufferHandle, matrixPtr: Pointer, strength: number, target: TargetChannel) => voidproperty RenderLib.bufferColorMatrixUniform: (buffer: OptimizedBufferHandle, matrix: Pointer | Float32Array, strength: number, target: TargetChannel) => void
  • property RenderLib.bufferDrawGrayscaleBuffer: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensitiesPtr: Pointer, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => voidproperty RenderLib.bufferDrawGrayscaleBuffer: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensities: Pointer | Float32Array, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => void
  • property RenderLib.bufferDrawGrayscaleBufferSupersampled: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensitiesPtr: Pointer, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => voidproperty RenderLib.bufferDrawGrayscaleBufferSupersampled: (buffer: OptimizedBufferHandle, posX: number, posY: number, intensities: Pointer | Float32Array, srcWidth: number, srcHeight: number, fg: RGBA | null, bg: RGBA | null) => void
  • property RenderLib.bufferDrawPackedBuffer: (buffer: OptimizedBufferHandle, dataPtr: Pointer, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number) => voidproperty RenderLib.bufferDrawPackedBuffer: (buffer: OptimizedBufferHandle, data: Pointer | Uint8Array, dataLen: number, posX: number, posY: number, terminalWidthCells: number, terminalHeightCells: number) => void
  • property RenderLib.bufferDrawSuperSampleBuffer: (buffer: OptimizedBufferHandle, x: number, y: number, pixelDataPtr: Pointer, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number) => voidproperty RenderLib.bufferDrawSuperSampleBuffer: (buffer: OptimizedBufferHandle, x: number, y: number, pixelData: Pointer | Uint8Array, pixelDataLength: number, format: "bgra8unorm" | "rgba8unorm", alignedBytesPerRow: number) => void