@opentui/core 0.4.1 → 0.4.3

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.
@@ -0,0 +1,32 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/Renderable.ts", "../src/lib/renderable.validations.ts", "../src/renderables/composition/vnode.ts", "../src/text-buffer-view.ts", "../src/edit-buffer.ts", "../src/editor-view.ts", "../src/syntax-style.ts", "../src/renderables/Box.ts", "../src/renderables/TextBufferRenderable.ts", "../src/renderables/Code.ts", "../src/renderables/TextNode.ts", "../src/renderables/Text.ts", "../src/NativeSpanFeed.ts", "../src/console.ts", "../src/lib/output.capture.ts", "../src/lib/keybinding.internal.ts", "../src/renderables/EditBufferRenderable.ts", "../src/ansi.ts", "../src/renderer.ts", "../src/lib/objects-in-viewport.ts", "../src/lib/render-geometry.ts", "../src/lib/terminal-capability-detection.ts", "../src/renderer-theme-mode.ts"],
4
+ "sourcesContent": [
5
+ "import { EventEmitter } from \"events\"\nimport Yoga, { Direction, Display, Edge, FlexDirection, type Node as YogaNode } from \"./yoga.js\"\nimport { OptimizedBuffer } from \"./buffer.js\"\nimport type { KeyEvent, PasteEvent } from \"./lib/KeyHandler.js\"\nimport type { MouseEventType } from \"./lib/parse.mouse.js\"\nimport type { Selection } from \"./lib/selection.js\"\nimport {\n parseAlign,\n parseAlignItems,\n parseFlexDirection,\n parseJustify,\n parseOverflow,\n parsePositionType,\n parseWrap,\n type AlignString,\n type FlexDirectionString,\n type JustifyString,\n type OverflowString,\n type PositionTypeString,\n type WrapString,\n} from \"./lib/yoga.options.js\"\nimport { maybeMakeRenderable, type VNode } from \"./renderables/composition/vnode.js\"\nimport type { MouseEvent } from \"./renderer.js\"\nimport type { RenderContext } from \"./types.js\"\nimport {\n validateOptions,\n isPositionType,\n isDimensionType,\n isFlexBasisType,\n isSizeType,\n isMarginType,\n isPaddingType,\n isPositionTypeType,\n isOverflowType,\n} from \"./lib/renderable.validations.js\"\n\nconst BrandedRenderable: unique symbol = Symbol.for(\"@opentui/core/Renderable\")\n\nexport enum LayoutEvents {\n LAYOUT_CHANGED = \"layout-changed\",\n RESIZED = \"resized\",\n}\n\nexport enum RenderableEvents {\n FOCUSED = \"focused\",\n BLURRED = \"blurred\",\n DESTROYED = \"destroyed\",\n}\n\nexport interface Position {\n top?: number | \"auto\" | `${number}%`\n right?: number | \"auto\" | `${number}%`\n bottom?: number | \"auto\" | `${number}%`\n left?: number | \"auto\" | `${number}%`\n}\n\nexport interface BaseRenderableOptions {\n id?: string\n}\n\nexport interface LayoutOptions extends BaseRenderableOptions {\n flexGrow?: number\n flexShrink?: number\n flexDirection?: FlexDirectionString\n flexWrap?: WrapString\n alignItems?: AlignString\n justifyContent?: JustifyString\n alignSelf?: AlignString\n flexBasis?: number | \"auto\" | undefined\n position?: PositionTypeString\n overflow?: OverflowString\n top?: number | \"auto\" | `${number}%`\n right?: number | \"auto\" | `${number}%`\n bottom?: number | \"auto\" | `${number}%`\n left?: number | \"auto\" | `${number}%`\n minWidth?: number | \"auto\" | `${number}%`\n minHeight?: number | \"auto\" | `${number}%`\n maxWidth?: number | \"auto\" | `${number}%`\n maxHeight?: number | \"auto\" | `${number}%`\n margin?: number | \"auto\" | `${number}%`\n marginX?: number | \"auto\" | `${number}%`\n marginY?: number | \"auto\" | `${number}%`\n marginTop?: number | \"auto\" | `${number}%`\n marginRight?: number | \"auto\" | `${number}%`\n marginBottom?: number | \"auto\" | `${number}%`\n marginLeft?: number | \"auto\" | `${number}%`\n padding?: number | `${number}%`\n paddingX?: number | `${number}%`\n paddingY?: number | `${number}%`\n paddingTop?: number | `${number}%`\n paddingRight?: number | `${number}%`\n paddingBottom?: number | `${number}%`\n paddingLeft?: number | `${number}%`\n enableLayout?: boolean\n}\n\nexport interface RenderableOptions<T extends BaseRenderable = BaseRenderable> extends Partial<LayoutOptions> {\n width?: number | \"auto\" | `${number}%`\n height?: number | \"auto\" | `${number}%`\n zIndex?: number\n visible?: boolean\n buffered?: boolean\n live?: boolean\n opacity?: number\n\n // Draw-only hooks for custom rendering/decorations. They run after layout\n // and viewport culling, so do not mutate layout, children, or reactive state here.\n // Culled children do not run these hooks.\n renderBefore?: (this: T, buffer: OptimizedBuffer, deltaTime: number) => void\n renderAfter?: (this: T, buffer: OptimizedBuffer, deltaTime: number) => void\n\n // catch all\n onMouse?: (this: T, event: MouseEvent) => void\n\n onMouseDown?: (this: T, event: MouseEvent) => void\n onMouseUp?: (this: T, event: MouseEvent) => void\n onMouseMove?: (this: T, event: MouseEvent) => void\n onMouseDrag?: (this: T, event: MouseEvent) => void\n onMouseDragEnd?: (this: T, event: MouseEvent) => void\n onMouseDrop?: (this: T, event: MouseEvent) => void\n onMouseOver?: (this: T, event: MouseEvent) => void\n onMouseOut?: (this: T, event: MouseEvent) => void\n onMouseScroll?: (this: T, event: MouseEvent) => void\n\n onPaste?: (this: T, event: PasteEvent) => void\n\n onKeyDown?: (key: KeyEvent) => void\n\n onSizeChange?: (this: T) => void\n}\n\nexport function isRenderable(obj: any): obj is Renderable {\n return !!obj?.[BrandedRenderable]\n}\n\nexport abstract class BaseRenderable extends EventEmitter {\n [BrandedRenderable] = true\n\n private static renderableNumber = 1\n protected _id: string\n public readonly num: number\n protected _dirty: boolean = false\n public parent: BaseRenderable | null = null\n protected _visible: boolean = true\n\n constructor(options: BaseRenderableOptions) {\n super()\n this.num = BaseRenderable.renderableNumber++\n this._id = options.id ?? `renderable-${this.num}`\n }\n\n public abstract add(obj: BaseRenderable | unknown, index?: number): number\n public abstract remove(child: BaseRenderable): void\n public abstract insertBefore(obj: BaseRenderable | unknown, anchor: BaseRenderable | unknown): void\n public abstract getChildren(): BaseRenderable[]\n public abstract getChildrenCount(): number\n public abstract getRenderable(id: string): BaseRenderable | undefined\n public abstract requestRender(): void\n public abstract findDescendantById(id: string): BaseRenderable | undefined\n\n public get id(): string {\n return this._id\n }\n\n public set id(value: string) {\n this._id = value\n }\n\n public get isDirty(): boolean {\n return this._dirty\n }\n\n protected markClean(): void {\n this._dirty = false\n }\n\n protected markDirty(): void {\n this._dirty = true\n }\n\n public destroy(): void {\n // Default implementation: do nothing\n // Override this method to provide custom removal logic\n }\n\n public destroyRecursively(): void {\n // Default implementation: do nothing\n // Override this method to provide custom destruction logic\n }\n\n public get visible(): boolean {\n return this._visible\n }\n\n public set visible(value: boolean) {\n this._visible = value\n }\n}\n\ninterface LayoutGenerationContext extends RenderContext {\n __otuiLayoutGeneration?: number\n __otuiRenderListRevision?: number\n}\n\nfunction getLayoutGeneration(ctx: RenderContext): number {\n return (ctx as LayoutGenerationContext).__otuiLayoutGeneration ?? 0\n}\n\nfunction bumpLayoutGeneration(ctx: RenderContext): number {\n const next = getLayoutGeneration(ctx) + 1\n const generationContext = ctx as LayoutGenerationContext\n generationContext.__otuiLayoutGeneration = next\n return next\n}\n\nfunction getRenderListRevision(ctx: RenderContext): number {\n return (ctx as LayoutGenerationContext).__otuiRenderListRevision ?? 0\n}\n\nfunction bumpRenderListRevision(ctx: RenderContext): void {\n const generationContext = ctx as LayoutGenerationContext\n generationContext.__otuiRenderListRevision = getRenderListRevision(ctx) + 1\n}\n\nexport abstract class Renderable extends BaseRenderable {\n static renderablesByNumber: Map<number, Renderable> = new Map()\n\n protected _isDestroyed: boolean = false\n protected _ctx: RenderContext\n protected _translateX: number = 0\n protected _translateY: number = 0\n protected _x: number = 0\n protected _y: number = 0\n // Render hot paths only need absolute terminal coordinates. Cache them during\n // layout so render-time code does not keep walking parent chains via x/y.\n protected _screenX: number = 0\n protected _screenY: number = 0\n protected _width: number | \"auto\" | `${number}%`\n protected _height: number | \"auto\" | `${number}%`\n protected _widthValue: number = 0\n protected _heightValue: number = 0\n private _zIndex: number\n public selectable: boolean = false\n protected buffered: boolean\n protected frameBuffer: OptimizedBuffer | null = null\n\n protected _focusable: boolean = false\n protected _focused: boolean = false\n protected _hasFocusedDescendant: boolean = false\n protected keypressHandler: ((key: KeyEvent) => void) | null = null\n protected pasteHandler: ((event: PasteEvent) => void) | null = null\n\n private _live: boolean = false\n protected _liveCount: number = 0\n\n private _sizeChangeListener: (() => void) | undefined = undefined\n private _mouseListener: ((event: MouseEvent) => void) | null = null\n private _mouseListeners: Partial<Record<MouseEventType, (event: MouseEvent) => void>> = {}\n private _pasteListener: ((event: PasteEvent) => void) | undefined = undefined\n private _keyListeners: Partial<Record<\"down\", (key: KeyEvent) => void>> = {}\n\n protected yogaNode: YogaNode\n protected _positionType: PositionTypeString = \"relative\"\n protected _overflow: OverflowString = \"visible\"\n protected _position: Position = {}\n protected _opacity: number = 1.0\n private _flexShrink: number = 1\n\n protected _childrenInLayoutOrder: Renderable[] = []\n protected _childrenInZIndexOrder: Renderable[] = []\n private needsZIndexSort: boolean = false\n public parent: Renderable | null = null\n\n private childrenPrimarySortDirty: boolean = true\n private childrenSortedByPrimaryAxis: Renderable[] = []\n private _shouldUpdateBefore: Set<Renderable> = new Set()\n\n // Frame id of the last updateFromLayout(); -1 ensures the first call runs.\n private _lastLayoutFrame: number = -1\n\n public onLifecyclePass: (() => void) | null = null\n\n public renderBefore?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void\n public renderAfter?: (this: Renderable, buffer: OptimizedBuffer, deltaTime: number) => void\n\n constructor(ctx: RenderContext, options: RenderableOptions<any>) {\n super(options)\n\n this._ctx = ctx\n Renderable.renderablesByNumber.set(this.num, this)\n\n validateOptions(this.id, options)\n\n this.renderBefore = options.renderBefore\n this.renderAfter = options.renderAfter\n\n this._width = options.width ?? \"auto\"\n this._height = options.height ?? \"auto\"\n\n if (typeof this._width === \"number\") {\n this._widthValue = this._width\n }\n if (typeof this._height === \"number\") {\n this._heightValue = this._height\n }\n\n this._zIndex = options.zIndex ?? 0\n this._visible = options.visible !== false\n this.buffered = options.buffered ?? false\n this._live = options.live ?? false\n this._liveCount = this._live && this._visible ? 1 : 0\n this._opacity = options.opacity !== undefined ? Math.max(0, Math.min(1, options.opacity)) : 1.0\n\n this.yogaNode = Yoga.Node.createForOpenTUI()\n this.yogaNode.setDisplay(this._visible ? Display.Flex : Display.None)\n this.setupYogaProperties(options)\n\n this.applyEventOptions(options)\n\n if (this.buffered) {\n this.createFrameBuffer()\n }\n }\n\n public get focusable(): boolean {\n return this._focusable\n }\n\n public set focusable(value: boolean) {\n this._focusable = value\n }\n\n public get ctx(): RenderContext {\n return this._ctx\n }\n\n public get visible(): boolean {\n return this._visible\n }\n\n public get primaryAxis(): \"row\" | \"column\" {\n const dir = this.yogaNode.getFlexDirection()\n return dir === 2 || dir === 3 ? \"row\" : \"column\"\n }\n\n public set visible(value: boolean) {\n if (this._visible === value) return\n\n const wasVisible = this._visible\n this._visible = value\n this.yogaNode.setDisplay(value ? Display.Flex : Display.None)\n bumpRenderListRevision(this._ctx)\n\n if (this._live) {\n if (!wasVisible && value) {\n this.propagateLiveCount(1)\n } else if (wasVisible && !value) {\n this.propagateLiveCount(-1)\n }\n }\n\n if (this._focused) {\n this.blur()\n }\n this.requestRender()\n }\n\n public get opacity(): number {\n return this._opacity\n }\n\n public set opacity(value: number) {\n const clamped = Math.max(0, Math.min(1, value))\n if (this._opacity !== clamped) {\n this._opacity = clamped\n bumpRenderListRevision(this._ctx)\n this.requestRender()\n }\n }\n\n public hasSelection(): boolean {\n return false\n }\n\n public onSelectionChanged(selection: Selection | null): boolean {\n // Default implementation: do nothing\n // Override this method to provide custom selection handling\n return false\n }\n\n public getSelectedText(): string {\n return \"\"\n }\n\n public shouldStartSelection(x: number, y: number): boolean {\n return false\n }\n\n public focus(): void {\n if (this._isDestroyed || this._focused || !this._focusable) return\n\n this._focused = true\n this._ctx.focusRenderable(this)\n this.requestRender()\n\n this.keypressHandler = (key: KeyEvent) => {\n if (this._isDestroyed) return\n this._keyListeners[\"down\"]?.(key)\n // Check again after user listener - it might have destroyed the renderable\n if (this._isDestroyed) return\n if (!key.defaultPrevented && this.handleKeyPress) {\n this.handleKeyPress(key)\n }\n }\n\n this.pasteHandler = (event: PasteEvent) => {\n if (this._isDestroyed) return\n this._pasteListener?.call(this, event)\n // Check again after user listener - it might have destroyed the renderable\n if (this._isDestroyed) return\n if (!event.defaultPrevented && this.handlePaste) {\n this.handlePaste(event)\n }\n }\n\n this.ctx._internalKeyInput.onInternal(\"keypress\", this.keypressHandler)\n this.ctx._internalKeyInput.onInternal(\"paste\", this.pasteHandler)\n this.propagateFocusChange(true)\n this.emit(RenderableEvents.FOCUSED)\n }\n\n protected propagateFocusChange(hasFocus: boolean): void {\n let parent = this.parent\n while (parent) {\n if (parent._hasFocusedDescendant !== hasFocus) {\n parent._hasFocusedDescendant = hasFocus\n parent.markDirty()\n }\n parent = parent.parent\n }\n\n this.requestRender()\n }\n\n public blur(): void {\n if (!this._focused || !this._focusable) return\n\n this._ctx.blurRenderable(this)\n this._focused = false\n this.requestRender()\n\n if (this.keypressHandler) {\n this.ctx._internalKeyInput.offInternal(\"keypress\", this.keypressHandler)\n this.keypressHandler = null\n }\n\n if (this.pasteHandler) {\n this.ctx._internalKeyInput.offInternal(\"paste\", this.pasteHandler)\n this.pasteHandler = null\n }\n\n this.propagateFocusChange(false)\n this.emit(RenderableEvents.BLURRED)\n }\n\n public get focused(): boolean {\n return this._focused\n }\n\n public get hasFocusedDescendant(): boolean {\n return this._hasFocusedDescendant\n }\n\n public get live(): boolean {\n return this._live\n }\n\n public get liveCount(): number {\n return this._liveCount\n }\n\n public set live(value: boolean) {\n if (this._live === value) return\n\n this._live = value\n\n if (this._visible) {\n const delta = value ? 1 : -1\n this.propagateLiveCount(delta)\n }\n }\n\n protected propagateLiveCount(delta: number): void {\n this._liveCount += delta\n this.parent?.propagateLiveCount(delta)\n }\n\n public handleKeyPress?(key: KeyEvent): boolean\n public handlePaste?(event: PasteEvent): void\n\n public findDescendantById(id: string): Renderable | undefined {\n for (const child of this._childrenInLayoutOrder) {\n if (child.id === id) return child\n if (isRenderable(child)) {\n const found = child.findDescendantById(id)\n if (found) return found\n }\n }\n return undefined\n }\n\n public requestRender() {\n this.markDirty()\n this._ctx.requestRender()\n }\n\n public get translateX(): number {\n return this._translateX\n }\n\n // Translate updates bypass layout, so keep the absolute screen cache current\n // here to make same-frame sort/cull/render reads observe the new position.\n public set translateX(value: number) {\n if (this._translateX === value) return\n this._translateX = value\n const parentScreenX = this.parent ? this.parent._screenX : 0\n this._screenX = parentScreenX + this._x + this._translateX\n if (this.parent) this.parent.childrenPrimarySortDirty = true\n bumpRenderListRevision(this._ctx)\n this.requestRender()\n }\n\n public get translateY(): number {\n return this._translateY\n }\n\n public set translateY(value: number) {\n if (this._translateY === value) return\n this._translateY = value\n const parentScreenY = this.parent ? this.parent._screenY : 0\n this._screenY = parentScreenY + this._y + this._translateY\n if (this.parent) this.parent.childrenPrimarySortDirty = true\n bumpRenderListRevision(this._ctx)\n this.requestRender()\n }\n\n // Use the cached parent screen position plus this node's current local offset.\n // That keeps culling/sorting in sync even before this node refreshes _screenX/Y.\n public get screenX(): number {\n const parentScreenX = this.parent ? this.parent._screenX : 0\n return parentScreenX + this._x + this._translateX\n }\n\n public get screenY(): number {\n const parentScreenY = this.parent ? this.parent._screenY : 0\n return parentScreenY + this._y + this._translateY\n }\n\n public get x(): number {\n if (this.parent) {\n return this.parent.x + this._x + this._translateX\n }\n return this._x + this._translateX\n }\n\n public set x(value: number) {\n this.left = value\n }\n\n public get top(): number | \"auto\" | `${number}%` | undefined {\n return this._position.top\n }\n\n public set top(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ top: value })\n }\n }\n\n public get right(): number | \"auto\" | `${number}%` | undefined {\n return this._position.right\n }\n\n public set right(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ right: value })\n }\n }\n\n public get bottom(): number | \"auto\" | `${number}%` | undefined {\n return this._position.bottom\n }\n\n public set bottom(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ bottom: value })\n }\n }\n\n public get left(): number | \"auto\" | `${number}%` | undefined {\n return this._position.left\n }\n\n public set left(value: number | \"auto\" | `${number}%` | undefined) {\n if (isPositionType(value) || value === undefined) {\n this.setPosition({ left: value })\n }\n }\n\n public get y(): number {\n if (this.parent) {\n return this.parent.y + this._y + this._translateY\n }\n return this._y + this._translateY\n }\n\n public set y(value: number) {\n this.top = value\n }\n\n public get width(): number {\n return this._widthValue\n }\n\n public set width(value: number | \"auto\" | `${number}%`) {\n if (!isDimensionType(value) || this._width === value) {\n return\n }\n\n this._width = value\n this.yogaNode.setWidth(value)\n\n if (typeof value === \"number\" && this._flexShrink === 1) {\n this._flexShrink = 0\n this.yogaNode.setFlexShrink(0)\n }\n\n this.requestRender()\n }\n\n public get height(): number {\n return this._heightValue\n }\n\n public set height(value: number | \"auto\" | `${number}%`) {\n if (!isDimensionType(value) || this._height === value) {\n return\n }\n\n this._height = value\n this.yogaNode.setHeight(value)\n\n if (typeof value === \"number\" && this._flexShrink === 1) {\n this._flexShrink = 0\n this.yogaNode.setFlexShrink(0)\n }\n\n this.requestRender()\n }\n\n public get zIndex(): number {\n return this._zIndex\n }\n\n public set zIndex(value: number) {\n if (this._zIndex !== value) {\n this._zIndex = value\n this.parent?.requestZIndexSort()\n bumpRenderListRevision(this._ctx)\n this.requestRender()\n }\n }\n\n private requestZIndexSort(): void {\n this.needsZIndexSort = true\n }\n\n private ensureZIndexSorted(): void {\n if (this.needsZIndexSort) {\n this._childrenInZIndexOrder.sort((a, b) => (a.zIndex > b.zIndex ? 1 : a.zIndex < b.zIndex ? -1 : 0))\n this.needsZIndexSort = false\n }\n }\n\n public getChildrenSortedByPrimaryAxis(): Renderable[] {\n if (\n !this.childrenPrimarySortDirty &&\n this.childrenSortedByPrimaryAxis.length === this._childrenInLayoutOrder.length\n ) {\n return this.childrenSortedByPrimaryAxis\n }\n\n const dir = this.yogaNode.getFlexDirection()\n const axis: \"x\" | \"y\" = dir === 2 || dir === 3 ? \"x\" : \"y\"\n\n const sorted = [...this._childrenInLayoutOrder]\n sorted.sort((a, b) => {\n // Viewport culling compares against screen-space bounds, so primary-axis\n // ordering has to use absolute positions instead of parent-relative x/y.\n const va = axis === \"y\" ? a.screenY : a.screenX\n const vb = axis === \"y\" ? b.screenY : b.screenX\n return va - vb\n })\n\n this.childrenSortedByPrimaryAxis = sorted\n this.childrenPrimarySortDirty = false\n return this.childrenSortedByPrimaryAxis\n }\n\n private setupYogaProperties(options: RenderableOptions<Renderable>): void {\n const node = this.yogaNode\n\n if (isFlexBasisType(options.flexBasis)) {\n node.setFlexBasis(options.flexBasis)\n }\n\n if (isSizeType(options.minWidth)) {\n node.setMinWidth(options.minWidth)\n }\n if (isSizeType(options.minHeight)) {\n node.setMinHeight(options.minHeight)\n }\n\n if (options.flexGrow !== undefined) {\n node.setFlexGrow(options.flexGrow)\n } else {\n node.setFlexGrow(0)\n }\n\n if (options.flexShrink !== undefined) {\n this._flexShrink = options.flexShrink\n node.setFlexShrink(options.flexShrink)\n } else {\n // If explicit numeric width is set, don't shrink by default\n // Otherwise follow web default of 1\n const hasExplicitWidth = typeof options.width === \"number\"\n const hasExplicitHeight = typeof options.height === \"number\"\n this._flexShrink = hasExplicitWidth || hasExplicitHeight ? 0 : 1\n node.setFlexShrink(this._flexShrink)\n }\n\n node.setFlexDirection(parseFlexDirection(options.flexDirection))\n node.setFlexWrap(parseWrap(options.flexWrap))\n node.setAlignItems(parseAlignItems(options.alignItems))\n node.setJustifyContent(parseJustify(options.justifyContent))\n node.setAlignSelf(parseAlign(options.alignSelf))\n\n if (isDimensionType(options.width)) {\n this._width = options.width\n this.yogaNode.setWidth(options.width)\n }\n if (isDimensionType(options.height)) {\n this._height = options.height\n this.yogaNode.setHeight(options.height)\n }\n\n this._positionType = options.position === \"absolute\" ? \"absolute\" : \"relative\"\n if (this._positionType !== \"relative\") {\n node.setPositionType(parsePositionType(this._positionType))\n }\n\n this._overflow = options.overflow === \"hidden\" ? \"hidden\" : options.overflow === \"scroll\" ? \"scroll\" : \"visible\"\n if (this._overflow !== \"visible\") {\n node.setOverflow(parseOverflow(this._overflow))\n }\n\n // TODO: flatten position properties internally as well\n const hasPositionProps =\n options.top !== undefined ||\n options.right !== undefined ||\n options.bottom !== undefined ||\n options.left !== undefined\n if (hasPositionProps) {\n this._position = {\n top: options.top,\n right: options.right,\n bottom: options.bottom,\n left: options.left,\n }\n this.updateYogaPosition(this._position)\n }\n\n if (isSizeType(options.maxWidth)) {\n node.setMaxWidth(options.maxWidth)\n }\n if (isSizeType(options.maxHeight)) {\n node.setMaxHeight(options.maxHeight)\n }\n\n this.setupMarginAndPadding(options)\n }\n\n private setupMarginAndPadding(options: RenderableOptions<Renderable>): void {\n const node = this.yogaNode\n\n if (isMarginType(options.margin)) {\n node.setMargin(Edge.All, options.margin)\n }\n\n if (isMarginType(options.marginX)) {\n node.setMargin(Edge.Horizontal, options.marginX)\n }\n if (isMarginType(options.marginY)) {\n node.setMargin(Edge.Vertical, options.marginY)\n }\n if (isMarginType(options.marginTop)) {\n node.setMargin(Edge.Top, options.marginTop)\n }\n if (isMarginType(options.marginRight)) {\n node.setMargin(Edge.Right, options.marginRight)\n }\n if (isMarginType(options.marginBottom)) {\n node.setMargin(Edge.Bottom, options.marginBottom)\n }\n if (isMarginType(options.marginLeft)) {\n node.setMargin(Edge.Left, options.marginLeft)\n }\n\n if (isPaddingType(options.padding)) {\n node.setPadding(Edge.All, options.padding)\n }\n\n if (isPaddingType(options.paddingX)) {\n node.setPadding(Edge.Horizontal, options.paddingX)\n }\n if (isPaddingType(options.paddingY)) {\n node.setPadding(Edge.Vertical, options.paddingY)\n }\n if (isPaddingType(options.paddingTop)) {\n node.setPadding(Edge.Top, options.paddingTop)\n }\n if (isPaddingType(options.paddingRight)) {\n node.setPadding(Edge.Right, options.paddingRight)\n }\n if (isPaddingType(options.paddingBottom)) {\n node.setPadding(Edge.Bottom, options.paddingBottom)\n }\n if (isPaddingType(options.paddingLeft)) {\n node.setPadding(Edge.Left, options.paddingLeft)\n }\n }\n\n set position(positionType: PositionTypeString | null | undefined) {\n if (!isPositionTypeType(positionType) || this._positionType === positionType) return\n\n this._positionType = positionType\n this.yogaNode.setPositionType(parsePositionType(positionType))\n this.requestRender()\n }\n\n get overflow(): OverflowString {\n return this._overflow\n }\n\n set overflow(overflow: OverflowString | null | undefined) {\n if (!isOverflowType(overflow) || this._overflow === overflow) return\n\n this._overflow = overflow\n this.yogaNode.setOverflow(parseOverflow(overflow))\n bumpRenderListRevision(this._ctx)\n this.requestRender()\n }\n\n public setPosition(position: Position): void {\n this._position = { ...this._position, ...position }\n this.updateYogaPosition(position)\n }\n\n private updateYogaPosition(position: Position): void {\n const node = this.yogaNode\n const { top, right, bottom, left } = position\n\n if (isPositionType(top)) {\n if (top === \"auto\") {\n node.setPositionAuto(Edge.Top)\n } else {\n node.setPosition(Edge.Top, top)\n }\n }\n if (isPositionType(right)) {\n if (right === \"auto\") {\n node.setPositionAuto(Edge.Right)\n } else {\n node.setPosition(Edge.Right, right)\n }\n }\n if (isPositionType(bottom)) {\n if (bottom === \"auto\") {\n node.setPositionAuto(Edge.Bottom)\n } else {\n node.setPosition(Edge.Bottom, bottom)\n }\n }\n if (isPositionType(left)) {\n if (left === \"auto\") {\n node.setPositionAuto(Edge.Left)\n } else {\n node.setPosition(Edge.Left, left)\n }\n }\n this.requestRender()\n }\n\n public set flexGrow(grow: number | null | undefined) {\n if (grow == null) {\n this.yogaNode.setFlexGrow(0)\n } else {\n this.yogaNode.setFlexGrow(grow)\n }\n this.requestRender()\n }\n\n public set flexShrink(shrink: number | null | undefined) {\n const value = shrink == null ? 1 : shrink\n this._flexShrink = value\n this.yogaNode.setFlexShrink(value)\n this.requestRender()\n }\n\n public set flexDirection(direction: FlexDirectionString | null | undefined) {\n this.yogaNode.setFlexDirection(parseFlexDirection(direction))\n this.requestRender()\n }\n\n public set flexWrap(wrap: WrapString | null | undefined) {\n this.yogaNode.setFlexWrap(parseWrap(wrap))\n this.requestRender()\n }\n\n public set alignItems(alignItems: AlignString | null | undefined) {\n this.yogaNode.setAlignItems(parseAlignItems(alignItems))\n this.requestRender()\n }\n\n public set justifyContent(justifyContent: JustifyString | null | undefined) {\n this.yogaNode.setJustifyContent(parseJustify(justifyContent))\n this.requestRender()\n }\n\n public set alignSelf(alignSelf: AlignString | null | undefined) {\n this.yogaNode.setAlignSelf(parseAlign(alignSelf))\n this.requestRender()\n }\n\n public set flexBasis(basis: number | \"auto\" | null | undefined) {\n if (isFlexBasisType(basis)) {\n this.yogaNode.setFlexBasis(basis)\n this.requestRender()\n }\n }\n\n public set minWidth(minWidth: number | `${number}%` | null | undefined) {\n if (isSizeType(minWidth)) {\n this.yogaNode.setMinWidth(minWidth)\n this.requestRender()\n }\n }\n\n public set maxWidth(maxWidth: number | `${number}%` | null | undefined) {\n if (isSizeType(maxWidth)) {\n this.yogaNode.setMaxWidth(maxWidth)\n this.requestRender()\n }\n }\n\n public set minHeight(minHeight: number | `${number}%` | null | undefined) {\n if (isSizeType(minHeight)) {\n this.yogaNode.setMinHeight(minHeight)\n this.requestRender()\n }\n }\n\n public set maxHeight(maxHeight: number | `${number}%` | null | undefined) {\n if (isSizeType(maxHeight)) {\n this.yogaNode.setMaxHeight(maxHeight)\n this.requestRender()\n }\n }\n\n public set margin(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.All, margin)\n this.requestRender()\n }\n }\n\n public set marginX(marginX: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(marginX)) {\n this.yogaNode.setMargin(Edge.Horizontal, marginX)\n this.requestRender()\n }\n }\n\n public set marginY(marginY: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(marginY)) {\n this.yogaNode.setMargin(Edge.Vertical, marginY)\n this.requestRender()\n }\n }\n\n public set marginTop(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Top, margin)\n this.requestRender()\n }\n }\n\n public get marginTop(): number | \"auto\" | `${number}%` {\n const margin = this.yogaNode.getMargin(Edge.Top) as unknown\n if (typeof margin === \"number\") return margin\n if (typeof margin === \"object\" && margin && \"value\" in margin && typeof margin.value === \"number\")\n return margin.value\n return 0\n }\n\n public set marginRight(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Right, margin)\n this.requestRender()\n }\n }\n\n public set marginBottom(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Bottom, margin)\n this.requestRender()\n }\n }\n\n public set marginLeft(margin: number | \"auto\" | `${number}%` | null | undefined) {\n if (isMarginType(margin)) {\n this.yogaNode.setMargin(Edge.Left, margin)\n this.requestRender()\n }\n }\n\n public set padding(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.All, padding)\n this.requestRender()\n }\n }\n\n public set paddingX(paddingX: number | `${number}%` | null | undefined) {\n if (isPaddingType(paddingX)) {\n this.yogaNode.setPadding(Edge.Horizontal, paddingX)\n this.requestRender()\n }\n }\n\n public set paddingY(paddingY: number | `${number}%` | null | undefined) {\n if (isPaddingType(paddingY)) {\n this.yogaNode.setPadding(Edge.Vertical, paddingY)\n this.requestRender()\n }\n }\n\n public set paddingTop(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Top, padding)\n this.requestRender()\n }\n }\n\n public set paddingRight(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Right, padding)\n this.requestRender()\n }\n }\n\n public set paddingBottom(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Bottom, padding)\n this.requestRender()\n }\n }\n\n public set paddingLeft(padding: number | `${number}%` | null | undefined) {\n if (isPaddingType(padding)) {\n this.yogaNode.setPadding(Edge.Left, padding)\n this.requestRender()\n }\n }\n\n public getLayoutNode(): YogaNode {\n return this.yogaNode\n }\n\n public updateFromLayout(): void {\n // Yoga layout is stable within a frame; skip the FFI round-trip on repeat calls.\n const frameId = this._ctx.frameId\n if (this._lastLayoutFrame === frameId) return\n this._lastLayoutFrame = frameId\n\n const layout = this.yogaNode.getComputedLayout()\n\n const oldX = this._x\n const oldY = this._y\n const oldWidth = this._widthValue\n const oldHeight = this._heightValue\n\n this._x = layout.left\n this._y = layout.top\n // Layout is updated top-down, so the parent cache is already current here.\n // Recomputing once per layout pass keeps render-time coordinate reads cheap.\n const parentScreenX = this.parent ? this.parent._screenX : 0\n const parentScreenY = this.parent ? this.parent._screenY : 0\n this._screenX = parentScreenX + this._x + this._translateX\n this._screenY = parentScreenY + this._y + this._translateY\n\n const newWidth = Math.max(layout.width, 1)\n const newHeight = Math.max(layout.height, 1)\n const sizeChanged = oldWidth !== newWidth || oldHeight !== newHeight\n\n this._widthValue = newWidth\n this._heightValue = newHeight\n\n if (sizeChanged) {\n this.onLayoutResize(newWidth, newHeight)\n }\n\n const positionChanged = oldX !== this._x || oldY !== this._y\n if (positionChanged) {\n if (this.parent) this.parent.childrenPrimarySortDirty = true\n }\n }\n\n protected onLayoutResize(width: number, height: number): void {\n if (this._visible) {\n // TODO: Should probably .markDirty()\n this.handleFrameBufferResize(width, height)\n this.onResize(width, height)\n this.requestRender()\n }\n }\n\n protected handleFrameBufferResize(width: number, height: number): void {\n if (!this.buffered) return\n\n if (width <= 0 || height <= 0) {\n return\n }\n\n if (this.frameBuffer) {\n this.frameBuffer.resize(width, height)\n } else {\n this.createFrameBuffer()\n }\n }\n\n protected createFrameBuffer(): void {\n const w = this.width\n const h = this.height\n\n if (w <= 0 || h <= 0) {\n return\n }\n\n try {\n const widthMethod = this._ctx.widthMethod\n this.frameBuffer = OptimizedBuffer.create(w, h, widthMethod, {\n respectAlpha: true,\n id: `framebuffer-${this.id}`,\n })\n } catch (error) {\n console.error(`Failed to create frame buffer for ${this.id}:`, error)\n this.frameBuffer = null\n }\n }\n\n /**\n * This will be called during a render pass.\n * Requesting a render during a render pass will drop the requested render.\n * If you need to request a render during a render pass, use process.nextTick.\n */\n protected onResize(width: number, height: number): void {\n this.onSizeChange?.()\n this.emit(\"resize\")\n // Override in subclasses for additional resize logic\n }\n\n private replaceParent(obj: Renderable) {\n if (obj.parent) {\n obj.parent.remove(obj)\n }\n obj.parent = this\n }\n\n public add(obj: Renderable | VNode<any, any[]> | unknown, index?: number): number {\n if (!obj) {\n return -1\n }\n\n const renderable = maybeMakeRenderable(this._ctx, obj)\n if (!renderable) {\n return -1\n }\n\n if (renderable.isDestroyed) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Renderable with id ${renderable.id} was already destroyed, skipping add`)\n }\n return -1\n }\n\n const anchorRenderable = index !== undefined ? this._childrenInLayoutOrder[index] : undefined\n\n if (anchorRenderable) {\n return this.insertBefore(renderable, anchorRenderable)\n }\n\n if (renderable.parent === this) {\n this.yogaNode.removeChild(renderable.getLayoutNode())\n this._childrenInLayoutOrder.splice(this._childrenInLayoutOrder.indexOf(renderable), 1)\n } else {\n this.replaceParent(renderable)\n this.needsZIndexSort = true\n this._childrenInZIndexOrder.push(renderable)\n\n if (typeof renderable.onLifecyclePass === \"function\") {\n this._ctx.registerLifecyclePass(renderable)\n }\n\n if (renderable._liveCount > 0) {\n this.propagateLiveCount(renderable._liveCount)\n }\n }\n\n const childLayoutNode = renderable.getLayoutNode()\n const insertedIndex = this._childrenInLayoutOrder.length\n this._childrenInLayoutOrder.push(renderable)\n this.yogaNode.insertChild(childLayoutNode, insertedIndex)\n\n this.childrenPrimarySortDirty = true\n this._shouldUpdateBefore.add(renderable)\n bumpRenderListRevision(this._ctx)\n\n this.requestRender()\n\n return insertedIndex\n }\n\n insertBefore(obj: Renderable | VNode<any, any[]> | unknown, anchor?: Renderable | unknown): number {\n if (!anchor) {\n return this.add(obj)\n }\n\n if (!obj) {\n return -1\n }\n\n const renderable = maybeMakeRenderable(this._ctx, obj)\n if (!renderable) {\n return -1\n }\n\n if (renderable.isDestroyed) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Renderable with id ${renderable.id} was already destroyed, skipping insertBefore`)\n }\n return -1\n }\n\n if (!isRenderable(anchor)) {\n throw new Error(\"Anchor must be a Renderable\")\n }\n\n if (anchor.isDestroyed) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Anchor with id ${anchor.id} was already destroyed, skipping insertBefore`)\n }\n return -1\n }\n\n if (this._childrenInLayoutOrder.indexOf(anchor) === -1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Anchor with id ${anchor.id} does not exist within the parent ${this.id}, skipping insertBefore`)\n }\n return -1\n }\n\n if (renderable === anchor) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Anchor is the same as the node ${renderable.id} being inserted, skipping insertBefore`)\n }\n return -1\n }\n\n if (renderable.parent === this) {\n this.yogaNode.removeChild(renderable.getLayoutNode())\n this._childrenInLayoutOrder.splice(this._childrenInLayoutOrder.indexOf(renderable), 1)\n } else {\n this.replaceParent(renderable)\n this.needsZIndexSort = true\n this._childrenInZIndexOrder.push(renderable)\n\n if (typeof renderable.onLifecyclePass === \"function\") {\n this._ctx.registerLifecyclePass(renderable)\n }\n\n if (renderable._liveCount > 0) {\n this.propagateLiveCount(renderable._liveCount)\n }\n }\n\n this.childrenPrimarySortDirty = true\n\n const anchorIndex = this._childrenInLayoutOrder.indexOf(anchor)\n const insertedIndex = Math.max(0, Math.min(anchorIndex, this._childrenInLayoutOrder.length))\n\n this._childrenInLayoutOrder.splice(insertedIndex, 0, renderable)\n this.yogaNode.insertChild(renderable.getLayoutNode(), insertedIndex)\n\n this._shouldUpdateBefore.add(renderable)\n bumpRenderListRevision(this._ctx)\n\n this.requestRender()\n\n return insertedIndex\n }\n\n // TODO: that naming is meh\n public getRenderable(id: string): Renderable | undefined {\n return this._childrenInLayoutOrder.find((child) => child.id === id)\n }\n\n public remove(child: BaseRenderable): void {\n if (!(child instanceof BaseRenderable)) {\n throw new Error(\"remove expects a renderable child object\")\n }\n\n // Membership in _childrenInLayoutOrder proves child is a Renderable with a\n // layout node; anything else (text nodes, children of other parents,\n // already-detached renderables) is a caller bug worth surfacing in dev.\n const index = this._childrenInLayoutOrder.indexOf(child as Renderable)\n if (index === -1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`Renderable with id ${child.id} is not a child of ${this.id}, skipping remove`)\n }\n return\n }\n\n const renderable = this._childrenInLayoutOrder[index]\n\n if (renderable._liveCount > 0) {\n this.propagateLiveCount(-renderable._liveCount)\n }\n\n this.yogaNode.removeChild(renderable.getLayoutNode())\n this._childrenInLayoutOrder.splice(index, 1)\n\n const zIndexIndex = this._childrenInZIndexOrder.indexOf(renderable)\n if (zIndexIndex !== -1) {\n this._childrenInZIndexOrder.splice(zIndexIndex, 1)\n }\n\n this._shouldUpdateBefore.delete(renderable)\n this.requestRender()\n\n renderable.onRemove()\n renderable.parent = null\n this._ctx.unregisterLifecyclePass(renderable)\n\n this.childrenPrimarySortDirty = true\n bumpRenderListRevision(this._ctx)\n }\n\n protected onRemove(): void {\n // Default implementation: do nothing\n // Override this method to provide custom removal logic\n }\n\n public getChildren(): Renderable[] {\n return [...this._childrenInLayoutOrder]\n }\n\n public getChildrenCount(): number {\n return this._childrenInLayoutOrder.length\n }\n\n public updateLayout(deltaTime: number, renderList: RenderCommand[] = []): void {\n if (!this.visible) return\n\n this.onUpdate(deltaTime)\n\n // If destroyed during onUpdate, don't add to render list\n if (this._isDestroyed) return\n\n // NOTE: worst case updateFromLayout is called throughout the whole tree,\n // which currently still has yoga performance issues.\n // This can be mitigated at some point when the layout tree moved to native,\n // as in the native yoga tree we can use events during the calculateLayout phase,\n // and anctually know if a child has changed or not.\n // That would allow us to to generate optimised render commands,\n // including the layout updates, in one pass.\n this.updateFromLayout()\n\n // Update newly added children before getting visible children\n // This ensures their positions are current when culling happens\n if (this._shouldUpdateBefore.size > 0) {\n for (const child of this._shouldUpdateBefore) {\n if (!child.isDestroyed) {\n child.updateFromLayout()\n }\n }\n this._shouldUpdateBefore.clear()\n }\n\n // Check again after updateFromLayout, which calls onResize/onSizeChange\n if (this._isDestroyed) return\n\n // Push opacity BEFORE rendering this element so it affects this element and all children\n const shouldPushOpacity = this._opacity < 1.0\n if (shouldPushOpacity) {\n renderList.push({ action: \"pushOpacity\", opacity: this._opacity })\n }\n\n renderList.push({ action: \"render\", renderable: this })\n\n this.ensureZIndexSorted()\n\n const shouldPushScissor = this._overflow !== \"visible\" && this.width > 0 && this.height > 0\n if (shouldPushScissor) {\n const scissorRect = this.getScissorRect()\n renderList.push({\n action: \"pushScissorRect\",\n x: scissorRect.x,\n y: scissorRect.y,\n width: scissorRect.width,\n height: scissorRect.height,\n screenX: this._screenX,\n screenY: this._screenY,\n })\n }\n // Most renderables expose all children. Skip building a visible-child list\n // unless a subclass actually performs viewport/style-based child filtering.\n if (!this._hasVisibleChildFilter()) {\n for (const child of this._childrenInZIndexOrder) {\n child.updateLayout(deltaTime, renderList)\n }\n } else {\n // Refresh every child's layout before culling reads their screen\n // coordinates; otherwise culling runs against last frame's positions\n // and drops content that shifted this frame. The per-frame guard in\n // updateFromLayout keeps this at one FFI call per child per frame.\n for (const child of this._childrenInZIndexOrder) {\n if (child.isDestroyed) continue\n child.updateFromLayout()\n }\n const visibleChildren = this._getVisibleChildren()\n const visibleChildSet = new Set(visibleChildren)\n for (const child of this._childrenInZIndexOrder) {\n if (!visibleChildSet.has(child.num)) continue\n child.updateLayout(deltaTime, renderList)\n }\n }\n\n if (shouldPushScissor) {\n renderList.push({ action: \"popScissorRect\" })\n }\n if (shouldPushOpacity) {\n renderList.push({ action: \"popOpacity\" })\n }\n }\n\n public render(buffer: OptimizedBuffer, deltaTime: number): void {\n let renderBuffer = buffer\n if (this.buffered && this.frameBuffer) {\n renderBuffer = this.frameBuffer\n }\n\n // Layout and culling are already finalized for this frame. These hooks are\n // only safe for drawing into the buffer; avoid renderable/reactive mutations.\n if (this.renderBefore) {\n this.renderBefore.call(this, renderBuffer, deltaTime)\n }\n\n this.renderSelf(renderBuffer, deltaTime)\n\n if (this.renderAfter) {\n this.renderAfter.call(this, renderBuffer, deltaTime)\n }\n\n // Hooks may move the renderable mid-frame, so sample the cached absolute\n // position after they run before hit-grid writes or framebuffer compositing.\n const screenX = this._screenX\n const screenY = this._screenY\n\n this.markClean()\n this._ctx.addToHitGrid(screenX, screenY, this.width, this.height, this.num)\n\n if (this.buffered && this.frameBuffer) {\n buffer.drawFrameBuffer(screenX, screenY, this.frameBuffer)\n }\n }\n\n protected _hasVisibleChildFilter(): boolean {\n // Presume an override of _getVisibleChildren means this subclass is using\n // the legacy filtering hook, so existing custom renderables keep working.\n return this._getVisibleChildren !== Renderable.prototype._getVisibleChildren\n }\n\n protected _getVisibleChildren(): number[] {\n return this._childrenInZIndexOrder.map((child) => child.num)\n }\n\n public canReuseRenderCommandList(): boolean {\n return (\n this.onUpdate === Renderable.prototype.onUpdate &&\n (this._overflow === \"visible\" || this.getScissorRect === Renderable.prototype.getScissorRect) &&\n !this._hasVisibleChildFilter()\n )\n }\n\n protected onUpdate(deltaTime: number): void {\n // Default implementation: do nothing\n // Override this method to provide custom rendering\n }\n\n protected getScissorRect(): {\n x: number\n y: number\n width: number\n height: number\n } {\n return {\n x: this.buffered ? 0 : this._screenX,\n y: this.buffered ? 0 : this._screenY,\n width: this.width,\n height: this.height,\n }\n }\n\n protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {\n // Default implementation: do nothing\n // Override this method to provide custom rendering\n }\n\n public get isDestroyed(): boolean {\n return this._isDestroyed\n }\n\n public destroy(): void {\n if (this._isDestroyed) {\n return\n }\n\n this._isDestroyed = true\n this.emit(RenderableEvents.DESTROYED)\n\n if (this.parent) {\n this.parent.remove(this)\n }\n\n if (this.frameBuffer) {\n this.frameBuffer.destroy()\n this.frameBuffer = null\n }\n\n for (const child of [...this._childrenInLayoutOrder]) {\n this.remove(child)\n }\n\n this._childrenInLayoutOrder = []\n this._childrenInZIndexOrder = []\n this._shouldUpdateBefore.clear()\n Renderable.renderablesByNumber.delete(this.num)\n\n this.blur()\n this.removeAllListeners()\n\n this.destroySelf()\n\n try {\n this.yogaNode.free()\n } catch (e) {\n // Might be already freed and will throw an error if we try to free it again\n }\n }\n\n public destroyRecursively(): void {\n // Destroy children first to ensure removal as destroy clears child array\n // Make a copy of the children array to avoid iteration issues when children are destroyed\n const children = [...this._childrenInLayoutOrder]\n for (const child of children) {\n child.destroyRecursively()\n }\n this.destroy()\n }\n\n protected destroySelf(): void {\n // Default implementation: do nothing else\n // Override this method to provide custom cleanup\n }\n\n public processMouseEvent(event: MouseEvent): void {\n this._mouseListener?.call(this, event)\n this._mouseListeners[event.type]?.call(this, event)\n this.onMouseEvent(event)\n\n if (this.parent && !event.propagationStopped) {\n this.parent.processMouseEvent(event)\n }\n }\n\n protected onMouseEvent(event: MouseEvent): void {\n // Default implementation: do nothing\n // Override this method to provide custom event handling\n }\n\n public set onMouse(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListener = handler\n else this._mouseListener = null\n }\n\n public set onMouseDown(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"down\"] = handler\n else delete this._mouseListeners[\"down\"]\n }\n\n public set onMouseUp(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"up\"] = handler\n else delete this._mouseListeners[\"up\"]\n }\n\n public set onMouseMove(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"move\"] = handler\n else delete this._mouseListeners[\"move\"]\n }\n\n public set onMouseDrag(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"drag\"] = handler\n else delete this._mouseListeners[\"drag\"]\n }\n\n public set onMouseDragEnd(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"drag-end\"] = handler\n else delete this._mouseListeners[\"drag-end\"]\n }\n\n public set onMouseDrop(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"drop\"] = handler\n else delete this._mouseListeners[\"drop\"]\n }\n\n public set onMouseOver(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"over\"] = handler\n else delete this._mouseListeners[\"over\"]\n }\n\n public set onMouseOut(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"out\"] = handler\n else delete this._mouseListeners[\"out\"]\n }\n\n public set onMouseScroll(handler: ((event: MouseEvent) => void) | undefined) {\n if (handler) this._mouseListeners[\"scroll\"] = handler\n else delete this._mouseListeners[\"scroll\"]\n }\n\n public set onPaste(handler: ((event: PasteEvent) => void) | undefined) {\n this._pasteListener = handler\n }\n public get onPaste(): ((event: PasteEvent) => void) | undefined {\n return this._pasteListener\n }\n\n public set onKeyDown(handler: ((key: KeyEvent) => void) | undefined) {\n if (handler) this._keyListeners[\"down\"] = handler\n else delete this._keyListeners[\"down\"]\n }\n public get onKeyDown(): ((key: KeyEvent) => void) | undefined {\n return this._keyListeners[\"down\"]\n }\n\n public set onSizeChange(handler: (() => void) | undefined) {\n this._sizeChangeListener = handler\n }\n public get onSizeChange(): (() => void) | undefined {\n return this._sizeChangeListener\n }\n\n private applyEventOptions(options: RenderableOptions<Renderable>): void {\n this.onMouse = options.onMouse\n this.onMouseDown = options.onMouseDown\n this.onMouseUp = options.onMouseUp\n this.onMouseMove = options.onMouseMove\n this.onMouseDrag = options.onMouseDrag\n this.onMouseDragEnd = options.onMouseDragEnd\n this.onMouseDrop = options.onMouseDrop\n this.onMouseOver = options.onMouseOver\n this.onMouseOut = options.onMouseOut\n this.onMouseScroll = options.onMouseScroll\n this.onPaste = options.onPaste\n this.onKeyDown = options.onKeyDown\n this.onSizeChange = options.onSizeChange\n }\n}\n\ninterface RenderCommandBase {\n action: \"render\" | \"pushScissorRect\" | \"popScissorRect\" | \"pushOpacity\" | \"popOpacity\"\n}\n\ninterface RenderCommandPushScissorRect extends RenderCommandBase {\n action: \"pushScissorRect\"\n x: number\n y: number\n width: number\n height: number\n screenX: number\n screenY: number\n}\n\ninterface RenderCommandPopScissorRect extends RenderCommandBase {\n action: \"popScissorRect\"\n}\n\ninterface RenderCommandRender extends RenderCommandBase {\n action: \"render\"\n renderable: Renderable\n}\n\ninterface RenderCommandPushOpacity extends RenderCommandBase {\n action: \"pushOpacity\"\n opacity: number\n}\n\ninterface RenderCommandPopOpacity extends RenderCommandBase {\n action: \"popOpacity\"\n}\n\nexport type RenderCommand =\n | RenderCommandPushScissorRect\n | RenderCommandPopScissorRect\n | RenderCommandRender\n | RenderCommandPushOpacity\n | RenderCommandPopOpacity\n\nexport class RootRenderable extends Renderable {\n private renderList: RenderCommand[] = []\n private appliedLayoutGeneration: number = -1\n private appliedRenderListRevision: number = -1\n private renderListReusable: boolean = false\n\n constructor(ctx: RenderContext) {\n super(ctx, {\n id: \"__root__\",\n zIndex: 0,\n visible: true,\n width: ctx.width,\n height: ctx.height,\n enableLayout: true,\n })\n\n if (this.yogaNode) {\n this.yogaNode.free()\n }\n\n this.yogaNode = Yoga.Node.createForOpenTUI()\n this.yogaNode.setWidth(ctx.width)\n this.yogaNode.setHeight(ctx.height)\n this.yogaNode.setFlexDirection(FlexDirection.Column)\n\n this.calculateLayout()\n }\n\n public render(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible) return\n\n // 0. Run lifecycle pass\n for (const renderable of this._ctx.getLifecyclePasses()) {\n if (!renderable.isDestroyed) {\n renderable.onLifecyclePass?.call(renderable)\n }\n }\n\n // NOTE: Strictly speaking, this is a 3-pass rendering process:\n // 1. Calculate layout from root\n // 2. Update layout throughout the tree and collect render list\n // 3. Render all collected renderables\n // Should be 2-pass by hooking into the calculateLayout phase,\n // but that's only possible if we move the layout tree to native.\n\n // 1. Calculate layout from root\n if (this.yogaNode.isDirty()) {\n this.calculateLayout()\n } else {\n this.syncExternalLayoutGeneration()\n }\n\n // 2. Update layout throughout the tree and collect render list\n const layoutGeneration = getLayoutGeneration(this._ctx)\n const renderListRevision = getRenderListRevision(this._ctx)\n const canReuseRenderList =\n this.renderListReusable &&\n this.appliedLayoutGeneration === layoutGeneration &&\n this.appliedRenderListRevision === renderListRevision\n\n if (!canReuseRenderList) {\n this.renderList.length = 0\n super.updateLayout(deltaTime, this.renderList)\n this.appliedLayoutGeneration = layoutGeneration\n this.appliedRenderListRevision = getRenderListRevision(this._ctx)\n this.renderListReusable = this.canReuseCurrentRenderList()\n }\n\n // 3. Render all collected renderables\n this._ctx.clearHitGridScissorRects()\n for (let i = 1; i < this.renderList.length; i++) {\n const command = this.renderList[i]\n switch (command.action) {\n case \"render\":\n // Skip if renderable was destroyed during a previous render callback\n if (!command.renderable.isDestroyed) {\n command.renderable.render(buffer, deltaTime)\n }\n break\n case \"pushScissorRect\":\n buffer.pushScissorRect(command.x, command.y, command.width, command.height)\n this._ctx.pushHitGridScissorRect(command.screenX, command.screenY, command.width, command.height)\n break\n case \"popScissorRect\":\n buffer.popScissorRect()\n this._ctx.popHitGridScissorRect()\n break\n case \"pushOpacity\":\n buffer.pushOpacity(command.opacity)\n break\n case \"popOpacity\":\n buffer.popOpacity()\n break\n }\n }\n }\n\n protected propagateLiveCount(delta: number): void {\n const oldCount = this._liveCount\n this._liveCount += delta\n\n if (oldCount === 0 && this._liveCount > 0) {\n this._ctx.requestLive()\n } else if (oldCount > 0 && this._liveCount === 0) {\n this._ctx.dropLive()\n }\n }\n\n public calculateLayout(): void {\n this.yogaNode.calculateLayout(this.width, this.height, Direction.LTR)\n bumpLayoutGeneration(this._ctx)\n this.yogaNode.markLayoutSeen()\n this.emit(LayoutEvents.LAYOUT_CHANGED)\n }\n\n private syncExternalLayoutGeneration(): void {\n if (!this.yogaNode.hasNewLayout()) return\n bumpLayoutGeneration(this._ctx)\n this.yogaNode.markLayoutSeen()\n }\n\n private canReuseCurrentRenderList(): boolean {\n if (this._liveCount > 0) return false\n\n for (const command of this.renderList) {\n if (command.action !== \"render\") continue\n if (!command.renderable.canReuseRenderCommandList()) return false\n }\n\n return true\n }\n\n public resize(width: number, height: number): void {\n this.width = width\n this.height = height\n\n this.emit(LayoutEvents.RESIZED, { width, height })\n }\n}\n",
6
+ "import type { RenderableOptions, Renderable } from \"../Renderable.js\"\nimport type { PositionTypeString, OverflowString } from \"./yoga.options.js\"\n\nexport function validateOptions(id: string, options: RenderableOptions<Renderable>): void {\n if (typeof options.width === \"number\") {\n if (options.width < 0) {\n throw new TypeError(`Invalid width for Renderable ${id}: ${options.width}`)\n }\n }\n if (typeof options.height === \"number\") {\n if (options.height < 0) {\n throw new TypeError(`Invalid height for Renderable ${id}: ${options.height}`)\n }\n }\n}\n\nexport function isValidPercentage(value: any): value is `${number}%` {\n if (typeof value === \"string\" && value.endsWith(\"%\")) {\n const numPart = value.slice(0, -1)\n const num = parseFloat(numPart)\n return !Number.isNaN(num)\n }\n return false\n}\n\nexport function isMarginType(value: any): value is number | \"auto\" | `${number}%` {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n if (value === \"auto\") {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport function isPaddingType(value: any): value is number | `${number}%` {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport function isPositionType(value: any): value is number | \"auto\" | `${number}%` {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n if (value === \"auto\") {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport function isPositionTypeType(value: any): value is PositionTypeString {\n return value === \"relative\" || value === \"absolute\"\n}\n\nexport function isOverflowType(value: any): value is OverflowString {\n return value === \"visible\" || value === \"hidden\" || value === \"scroll\"\n}\n\nexport function isDimensionType(value: any): value is number | \"auto\" | `${number}%` {\n return isPositionType(value)\n}\n\nexport function isFlexBasisType(value: any): value is number | \"auto\" | undefined {\n if (value === undefined || value === \"auto\") {\n return true\n }\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return false\n}\n\nexport function isSizeType(value: any): value is number | `${number}%` | undefined {\n if (value === undefined) {\n return true\n }\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return isValidPercentage(value)\n}\n",
7
+ "import { isRenderable, Renderable, type RenderableOptions } from \"../../Renderable.js\"\nimport type { RenderContext } from \"../../types.js\"\nimport util from \"node:util\"\n\nexport type VChild = VNode | Renderable | VChild[] | null | undefined | false\n\nexport interface PendingCall {\n method: string\n args: any[]\n isProperty?: boolean\n}\n\nconst BrandedVNode: unique symbol = Symbol.for(\"@opentui/core/VNode\")\n\nexport interface VNode<P = any, C = VChild[]> {\n [BrandedVNode]: true\n type: Construct<P>\n props?: P\n children?: C\n __delegateMap?: Record<string, string>\n __pendingCalls?: PendingCall[]\n}\n\n// Type that represents a VNode with Renderable methods available for chaining\nexport type ProxiedVNode<TCtor extends RenderableConstructor<any>> = VNode<\n TCtor extends RenderableConstructor<infer P> ? P : any\n> & {\n [K in keyof InstanceType<TCtor>]: InstanceType<TCtor>[K] extends (...args: infer Args) => any\n ? (...args: Args) => ProxiedVNode<TCtor>\n : InstanceType<TCtor>[K]\n}\n\nexport interface RenderableConstructor<P extends RenderableOptions<any> = RenderableOptions<any>> {\n new (ctx: RenderContext, options: P): Renderable\n}\n\nexport type FunctionalConstruct<P = any> = (props: P, children?: VChild[]) => VNode\n\nexport type Construct<P = any> =\n | RenderableConstructor<P extends RenderableOptions<any> ? P : never>\n | FunctionalConstruct<P>\n\nfunction isRenderableConstructor<P extends RenderableOptions<any> = RenderableOptions<any>>(\n value: any,\n): value is RenderableConstructor<P> {\n return typeof value === \"function\" && value.prototype && Renderable.prototype.isPrototypeOf(value.prototype)\n}\n\nfunction flattenChildren(children: VChild[]): VChild[] {\n const result: VChild[] = []\n for (const child of children) {\n if (Array.isArray(child)) {\n result.push(...flattenChildren(child))\n } else if (child !== null && child !== undefined && child !== false) {\n result.push(child)\n }\n }\n return result\n}\n\n// Overloads for proper typing\nexport function h<TCtor extends RenderableConstructor<any>>(\n type: TCtor,\n props?: TCtor extends RenderableConstructor<infer P> ? P : never,\n ...children: VChild[]\n): ProxiedVNode<TCtor>\nexport function h<P>(type: FunctionalConstruct<P>, props?: P, ...children: VChild[]): VNode<P>\nexport function h<P>(type: Construct<P>, props?: P, ...children: VChild[]): VNode<P> | ProxiedVNode<any>\nexport function h<P>(type: Construct<P>, props?: P, ...children: VChild[]): any {\n if (typeof type !== \"function\") {\n throw new TypeError(\"h() received an invalid vnode type\")\n }\n\n const vnode: VNode<P> = {\n [BrandedVNode]: true,\n type,\n props,\n children: flattenChildren(children),\n __pendingCalls: [],\n }\n\n if (isRenderableConstructor(type)) {\n return new Proxy(vnode, {\n get(target, prop, receiver) {\n // Return VNode properties directly\n if (prop in target) {\n return Reflect.get(target, prop, receiver)\n }\n\n if (typeof prop === \"string\") {\n const prototype = type.prototype\n const hasMethod =\n prototype &&\n (typeof prototype[prop] === \"function\" ||\n Object.getOwnPropertyDescriptor(prototype, prop) ||\n Object.getOwnPropertyDescriptor(Object.getPrototypeOf(prototype), prop))\n\n if (hasMethod) {\n return (...args: any[]) => {\n target.__pendingCalls = target.__pendingCalls || []\n target.__pendingCalls.push({ method: prop, args })\n return target\n }\n }\n }\n\n return Reflect.get(target, prop, receiver)\n },\n\n set(target, prop, value, receiver) {\n if (typeof prop === \"string\" && isRenderableConstructor(type)) {\n const prototype = type.prototype\n const descriptor =\n Object.getOwnPropertyDescriptor(prototype, prop) ||\n Object.getOwnPropertyDescriptor(Object.getPrototypeOf(prototype), prop)\n\n if (descriptor && descriptor.set) {\n target.__pendingCalls = target.__pendingCalls || []\n target.__pendingCalls.push({ method: prop, args: [value], isProperty: true })\n return true\n }\n }\n\n return Reflect.set(target, prop, value, receiver)\n },\n })\n }\n\n return vnode\n}\n\nexport function isVNode(node: any): node is VNode {\n return node && node[BrandedVNode]\n}\n\nexport function maybeMakeRenderable(\n ctx: RenderContext,\n node: Renderable | VNode<any, any[]> | unknown,\n): Renderable | null {\n if (isRenderable(node)) return node\n if (isVNode(node)) return instantiate(ctx, node)\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"maybeMakeRenderable received an invalid node\", util.inspect(node, { depth: 2 }))\n }\n return null\n}\n\nexport function wrapWithDelegates<T extends InstanceType<RenderableConstructor>>(\n instance: T,\n delegateMap: Record<string, string> | undefined,\n): T {\n if (!delegateMap || Object.keys(delegateMap).length === 0) return instance\n\n const getDescendant = (id: string): Renderable | undefined => {\n return (instance as Renderable).findDescendantById(id)\n }\n\n const proxy = new Proxy(instance as any, {\n get(target, prop, receiver) {\n if (typeof prop === \"string\" && delegateMap[prop]) {\n const host = getDescendant(delegateMap[prop])\n if (host) {\n const value = (host as any)[prop]\n if (typeof value === \"function\") {\n return value.bind(host)\n }\n return value\n }\n }\n return Reflect.get(target, prop, receiver)\n },\n set(target, prop, value, receiver) {\n if (typeof prop === \"string\" && delegateMap[prop]) {\n const host = getDescendant(delegateMap[prop])\n if (host) {\n return Reflect.set(host as any, prop, value)\n }\n }\n return Reflect.set(target, prop, value, receiver)\n },\n })\n return proxy\n}\n\nexport type InstantiateFn<NodeType extends VNode | Renderable> = Renderable & { __node?: NodeType }\n\nexport function instantiate<NodeType extends VNode | Renderable>(\n ctx: RenderContext,\n node: NodeType,\n): InstantiateFn<NodeType> {\n if (isRenderable(node)) return node\n\n if (!node || typeof node !== \"object\") {\n throw new TypeError(\"mount() received an invalid vnode\")\n }\n\n const vnode = node as VNode\n const { type, props } = vnode\n const children = flattenChildren(vnode.children || [])\n const delegateMap = (vnode as any).__delegateMap as Record<string, string> | undefined\n\n if (isRenderableConstructor(type)) {\n const instance = new type(ctx, (props || {}) as any)\n\n for (const child of children) {\n if (isRenderable(child)) {\n instance.add(child)\n } else {\n const mounted = instantiate(ctx, child as NodeType)\n instance.add(mounted)\n }\n }\n\n const delegatedInstance = wrapWithDelegates(instance, delegateMap)\n\n const pendingCalls = (vnode as any).__pendingCalls as PendingCall[] | undefined\n if (pendingCalls) {\n for (const call of pendingCalls) {\n if (call.isProperty) {\n ;(delegatedInstance as any)[call.method] = call.args[0]\n } else {\n ;(delegatedInstance as any)[call.method].apply(delegatedInstance, call.args)\n }\n }\n }\n\n return delegatedInstance\n }\n\n // Functional construct: resolve to a concrete vnode and mount it\n const resolved = (type as FunctionalConstruct)(props || ({} as any), children)\n const inst = instantiate(ctx, resolved)\n\n return wrapWithDelegates(inst, delegateMap) as InstantiateFn<NodeType>\n}\n\nexport type DelegateMap<T> = Partial<Record<keyof T, string>>\n\nexport type ValidateShape<Given, AllowedKeys> = {\n [K in keyof Given]: K extends keyof AllowedKeys ? NonNullable<Given[K]> : never\n}\n\ntype InferNode<T> = T extends InstantiateFn<infer U> ? U : never\n\nexport function delegate<\n Factory extends InstantiateFn<any>,\n InnerNode extends InferNode<Factory>,\n TargetMap extends Record<keyof InnerNode, string>,\n const Mapping extends Partial<TargetMap>,\n>(mapping: ValidateShape<Mapping, TargetMap>, vnode: Factory): Renderable\n\nexport function delegate<\n ConstructorType extends RenderableConstructor<any>,\n TargetMap extends Record<keyof InstanceType<ConstructorType>, string>,\n const Mapping extends Partial<TargetMap>,\n>(mapping: ValidateShape<Mapping, TargetMap>, vnode: ProxiedVNode<ConstructorType>): ProxiedVNode<ConstructorType>\n\nexport function delegate<\n ConstructorType extends RenderableConstructor<any>,\n const Mapping extends DelegateMap<InstanceType<ConstructorType>>,\n>(mapping: ValidateShape<Mapping, string>, vnode: VNode & { type: ConstructorType }): VNode\n\n/**\n * Controlled delegation that routes selected properties/methods\n * to a descendant renderable identified by ID.\n */\nexport function delegate<NodeType extends VNode | Renderable | InstantiateFn<any>>(\n mapping: Record<string, string>,\n vnode: NodeType,\n): VNode | Renderable {\n if (isRenderable(vnode)) {\n return wrapWithDelegates(vnode, mapping)\n }\n if (!vnode || typeof vnode !== \"object\") return vnode\n vnode.__delegateMap = { ...(vnode.__delegateMap || {}), ...mapping }\n return vnode\n}\n",
8
+ "import { RGBA } from \"./lib/RGBA.js\"\nimport { resolveRenderLib, type LineInfo, type RenderLib, type TextBufferViewHandle } from \"./zig.js\"\nimport type { TextBuffer } from \"./text-buffer.js\"\n\nexport class TextBufferView {\n private lib: RenderLib\n private viewPtr: TextBufferViewHandle\n private textBuffer: TextBuffer\n private _destroyed: boolean = false\n\n constructor(lib: RenderLib, ptr: TextBufferViewHandle, textBuffer: TextBuffer) {\n this.lib = lib\n this.viewPtr = ptr\n this.textBuffer = textBuffer\n }\n\n static create(textBuffer: TextBuffer): TextBufferView {\n const lib = resolveRenderLib()\n const viewPtr = lib.createTextBufferView(textBuffer.ptr)\n return new TextBufferView(lib, viewPtr, textBuffer)\n }\n\n // Fail loud and clear\n private guard(): void {\n if (this._destroyed) throw new Error(\"TextBufferView is destroyed\")\n }\n\n public get ptr(): TextBufferViewHandle {\n this.guard()\n return this.viewPtr\n }\n\n public setSelection(start: number, end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.textBufferViewSetSelection(this.viewPtr, start, end, bgColor || null, fgColor || null)\n }\n\n public updateSelection(end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.textBufferViewUpdateSelection(this.viewPtr, end, bgColor || null, fgColor || null)\n }\n\n public resetSelection(): void {\n this.guard()\n this.lib.textBufferViewResetSelection(this.viewPtr)\n }\n\n public getSelection(): { start: number; end: number } | null {\n this.guard()\n return this.lib.textBufferViewGetSelection(this.viewPtr)\n }\n\n public hasSelection(): boolean {\n this.guard()\n return this.getSelection() !== null\n }\n\n public setLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n ): boolean {\n this.guard()\n return this.lib.textBufferViewSetLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n )\n }\n\n public updateLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n ): boolean {\n this.guard()\n return this.lib.textBufferViewUpdateLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n )\n }\n\n public resetLocalSelection(): void {\n this.guard()\n this.lib.textBufferViewResetLocalSelection(this.viewPtr)\n }\n\n public setWrapWidth(width: number | null): void {\n this.guard()\n this.lib.textBufferViewSetWrapWidth(this.viewPtr, width ?? 0)\n }\n\n public setWrapMode(mode: \"none\" | \"char\" | \"word\"): void {\n this.guard()\n this.lib.textBufferViewSetWrapMode(this.viewPtr, mode)\n }\n\n public setFirstLineOffset(offset: number): void {\n this.guard()\n this.lib.textBufferViewSetFirstLineOffset(this.viewPtr, offset)\n }\n\n public setViewportSize(width: number, height: number): void {\n this.guard()\n this.lib.textBufferViewSetViewportSize(this.viewPtr, width, height)\n }\n\n public setViewport(x: number, y: number, width: number, height: number): void {\n this.guard()\n this.lib.textBufferViewSetViewport(this.viewPtr, x, y, width, height)\n }\n\n public get lineInfo(): LineInfo {\n this.guard()\n return this.lib.textBufferViewGetLineInfo(this.viewPtr)\n }\n\n public get logicalLineInfo(): LineInfo {\n this.guard()\n return this.lib.textBufferViewGetLogicalLineInfo(this.viewPtr)\n }\n\n public getSelectedText(): string {\n this.guard()\n const byteSize = this.textBuffer.byteSize\n if (byteSize === 0) return \"\"\n\n const selectedBytes = this.lib.textBufferViewGetSelectedTextBytes(this.viewPtr, byteSize)\n\n if (!selectedBytes) return \"\"\n\n return this.lib.decoder.decode(selectedBytes)\n }\n\n public getPlainText(): string {\n this.guard()\n const byteSize = this.textBuffer.byteSize\n if (byteSize === 0) return \"\"\n\n const plainBytes = this.lib.textBufferViewGetPlainTextBytes(this.viewPtr, byteSize)\n\n if (!plainBytes) return \"\"\n\n return this.lib.decoder.decode(plainBytes)\n }\n\n public setTabIndicator(indicator: string | number): void {\n this.guard()\n const codePoint = typeof indicator === \"string\" ? (indicator.codePointAt(0) ?? 0) : indicator\n this.lib.textBufferViewSetTabIndicator(this.viewPtr, codePoint)\n }\n\n public setTabIndicatorColor(color: RGBA): void {\n this.guard()\n this.lib.textBufferViewSetTabIndicatorColor(this.viewPtr, color)\n }\n\n public setTruncate(truncate: boolean): void {\n this.guard()\n this.lib.textBufferViewSetTruncate(this.viewPtr, truncate)\n }\n\n public measureForDimensions(width: number, height: number): { lineCount: number; widthColsMax: number } | null {\n this.guard()\n return this.lib.textBufferViewMeasureForDimensions(this.viewPtr, width, height)\n }\n\n public getVirtualLineCount(): number {\n this.guard()\n return this.lib.textBufferViewGetVirtualLineCount(this.viewPtr)\n }\n\n public destroy(): void {\n if (this._destroyed) return\n this._destroyed = true\n this.lib.destroyTextBufferView(this.viewPtr)\n }\n}\n",
9
+ "import {\n resolveRenderLib,\n type EditBufferHandle,\n type LogicalCursor,\n type RenderLib,\n type TextBufferHandle,\n} from \"./zig.js\"\nimport { type WidthMethod, type Highlight } from \"./types.js\"\nimport { RGBA } from \"./lib/RGBA.js\"\nimport { EventEmitter } from \"events\"\nimport type { SyntaxStyle } from \"./syntax-style.js\"\n\nexport type { LogicalCursor }\n\n/**\n * EditBuffer provides a text editing buffer with cursor management,\n * incremental editing, and grapheme-aware operations.\n */\nexport class EditBuffer extends EventEmitter {\n private static registry = new Map<number, EditBuffer>()\n private static nativeEventsSubscribed = false\n\n private lib: RenderLib\n private bufferPtr: EditBufferHandle\n private textBufferPtr: TextBufferHandle\n public readonly id: number\n private _destroyed: boolean = false\n private _textBytes: Uint8Array[] = []\n private _singleTextBytes: Uint8Array | null = null\n private _singleTextMemId: number | null = null\n private _syntaxStyle?: SyntaxStyle\n\n constructor(lib: RenderLib, ptr: EditBufferHandle) {\n super()\n this.lib = lib\n this.bufferPtr = ptr\n this.textBufferPtr = lib.editBufferGetTextBuffer(ptr)\n this.id = lib.editBufferGetId(ptr)\n\n EditBuffer.registry.set(this.id, this)\n EditBuffer.subscribeToNativeEvents(lib)\n }\n\n static create(widthMethod: WidthMethod): EditBuffer {\n const lib = resolveRenderLib()\n const ptr = lib.createEditBuffer(widthMethod)\n return new EditBuffer(lib, ptr)\n }\n\n private static subscribeToNativeEvents(lib: RenderLib): void {\n if (EditBuffer.nativeEventsSubscribed) return\n EditBuffer.nativeEventsSubscribed = true\n\n lib.onAnyNativeEvent((name: string, data: ArrayBuffer) => {\n const buffer = new Uint16Array(data)\n\n if (name.startsWith(\"eb_\") && buffer.length >= 1) {\n const id = buffer[0]\n const instance = EditBuffer.registry.get(id)\n\n if (instance) {\n // Strip the \"eb_\" prefix and forward the event\n const eventName = name.slice(3)\n const eventData = data.slice(2)\n instance.emit(eventName, eventData)\n }\n }\n })\n }\n\n private guard(): void {\n if (this._destroyed) throw new Error(\"EditBuffer is destroyed\")\n }\n\n public get ptr(): EditBufferHandle {\n this.guard()\n return this.bufferPtr\n }\n\n /**\n * Set text and completely reset the buffer state (clears history, resets add_buffer).\n * Use this for initial text setting or when you want a clean slate.\n */\n public setText(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n\n if (this._singleTextMemId !== null) {\n this.lib.textBufferReplaceMemBuffer(this.textBufferPtr, this._singleTextMemId, textBytes, false)\n } else {\n this._singleTextMemId = this.lib.textBufferRegisterMemBuffer(this.textBufferPtr, textBytes, false)\n }\n this._singleTextBytes = textBytes\n this.lib.editBufferSetTextFromMem(this.bufferPtr, this._singleTextMemId)\n }\n\n /**\n * Set text using owned memory and completely reset the buffer state (clears history, resets add_buffer).\n * The native code takes ownership of the memory.\n */\n public setTextOwned(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n this.lib.editBufferSetText(this.bufferPtr, textBytes)\n }\n\n /**\n * Replace text while preserving undo history (creates an undo point).\n * Use this when you want the setText operation to be undoable.\n */\n public replaceText(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n this._textBytes.push(textBytes)\n const memId = this.lib.textBufferRegisterMemBuffer(this.textBufferPtr, textBytes, false)\n this.lib.editBufferReplaceTextFromMem(this.bufferPtr, memId)\n }\n\n /**\n * Replace text using owned memory while preserving undo history (creates an undo point).\n * The native code takes ownership of the memory.\n */\n public replaceTextOwned(text: string): void {\n this.guard()\n const textBytes = this.lib.encoder.encode(text)\n this.lib.editBufferReplaceText(this.bufferPtr, textBytes)\n }\n\n public getLineCount(): number {\n this.guard()\n return this.lib.textBufferGetLineCount(this.textBufferPtr)\n }\n\n public getText(): string {\n this.guard()\n // TODO: Use byte size of text buffer to get the actual size of the text\n // actually native can stack alloc all the text and decode will alloc as js string then\n const maxSize = 1024 * 1024 // 1MB max\n const textBytes = this.lib.editBufferGetText(this.bufferPtr, maxSize)\n\n if (!textBytes) return \"\"\n\n return this.lib.decoder.decode(textBytes)\n }\n\n public insertChar(char: string): void {\n this.guard()\n this.lib.editBufferInsertChar(this.bufferPtr, char)\n }\n\n public insertText(text: string): void {\n this.guard()\n this.lib.editBufferInsertText(this.bufferPtr, text)\n }\n\n public deleteChar(): void {\n this.guard()\n this.lib.editBufferDeleteChar(this.bufferPtr)\n }\n\n public deleteCharBackward(): void {\n this.guard()\n this.lib.editBufferDeleteCharBackward(this.bufferPtr)\n }\n\n public deleteRange(startLine: number, startCol: number, endLine: number, endCol: number): void {\n this.guard()\n this.lib.editBufferDeleteRange(this.bufferPtr, startLine, startCol, endLine, endCol)\n }\n\n public newLine(): void {\n this.guard()\n this.lib.editBufferNewLine(this.bufferPtr)\n }\n\n public deleteLine(): void {\n this.guard()\n this.lib.editBufferDeleteLine(this.bufferPtr)\n }\n\n public moveCursorLeft(): void {\n this.guard()\n this.lib.editBufferMoveCursorLeft(this.bufferPtr)\n }\n\n public moveCursorRight(): void {\n this.guard()\n this.lib.editBufferMoveCursorRight(this.bufferPtr)\n }\n\n public moveCursorUp(): void {\n this.guard()\n this.lib.editBufferMoveCursorUp(this.bufferPtr)\n }\n\n public moveCursorDown(): void {\n this.guard()\n this.lib.editBufferMoveCursorDown(this.bufferPtr)\n }\n\n public gotoLine(line: number): void {\n this.guard()\n this.lib.editBufferGotoLine(this.bufferPtr, line)\n }\n\n public setCursor(line: number, col: number): void {\n this.guard()\n this.lib.editBufferSetCursor(this.bufferPtr, line, col)\n }\n\n public setCursorToLineCol(line: number, col: number): void {\n this.guard()\n this.lib.editBufferSetCursorToLineCol(this.bufferPtr, line, col)\n }\n\n public setCursorByOffset(offset: number): void {\n this.guard()\n this.lib.editBufferSetCursorByOffset(this.bufferPtr, offset)\n }\n\n public getCursorPosition(): LogicalCursor {\n this.guard()\n return this.lib.editBufferGetCursorPosition(this.bufferPtr)\n }\n\n public getNextWordBoundary(): LogicalCursor {\n this.guard()\n const boundary = this.lib.editBufferGetNextWordBoundary(this.bufferPtr)\n return {\n row: boundary.row,\n col: boundary.col,\n offset: boundary.offset,\n }\n }\n\n public getPrevWordBoundary(): LogicalCursor {\n this.guard()\n const boundary = this.lib.editBufferGetPrevWordBoundary(this.bufferPtr)\n return {\n row: boundary.row,\n col: boundary.col,\n offset: boundary.offset,\n }\n }\n\n public getEOL(): LogicalCursor {\n this.guard()\n const boundary = this.lib.editBufferGetEOL(this.bufferPtr)\n return {\n row: boundary.row,\n col: boundary.col,\n offset: boundary.offset,\n }\n }\n\n public offsetToPosition(offset: number): { row: number; col: number } | null {\n this.guard()\n const result = this.lib.editBufferOffsetToPosition(this.bufferPtr, offset)\n if (!result) return null\n return { row: result.row, col: result.col }\n }\n\n public positionToOffset(row: number, col: number): number {\n this.guard()\n return this.lib.editBufferPositionToOffset(this.bufferPtr, row, col)\n }\n\n public getLineStartOffset(row: number): number {\n this.guard()\n return this.lib.editBufferGetLineStartOffset(this.bufferPtr, row)\n }\n\n public getTextRange(startOffset: number, endOffset: number): string {\n this.guard()\n if (startOffset >= endOffset) return \"\"\n\n // TODO: Use actual expected size of the text\n // like other methods native can just return a pointer and size\n // and we immediately decode the text into a js string then the native stack\n // can go out of scope\n const maxSize = 1024 * 1024 // 1MB max\n const textBytes = this.lib.editBufferGetTextRange(this.bufferPtr, startOffset, endOffset, maxSize)\n\n if (!textBytes) return \"\"\n\n return this.lib.decoder.decode(textBytes)\n }\n\n public getTextRangeByCoords(startRow: number, startCol: number, endRow: number, endCol: number): string {\n this.guard()\n\n const maxSize = 1024 * 1024 // 1MB max\n const textBytes = this.lib.editBufferGetTextRangeByCoords(\n this.bufferPtr,\n startRow,\n startCol,\n endRow,\n endCol,\n maxSize,\n )\n\n if (!textBytes) return \"\"\n\n return this.lib.decoder.decode(textBytes)\n }\n\n public debugLogRope(): void {\n this.guard()\n this.lib.editBufferDebugLogRope(this.bufferPtr)\n }\n\n public undo(): string | null {\n this.guard()\n const maxSize = 256\n const metaBytes = this.lib.editBufferUndo(this.bufferPtr, maxSize)\n if (!metaBytes) return null\n return this.lib.decoder.decode(metaBytes)\n }\n\n public redo(): string | null {\n this.guard()\n const maxSize = 256\n const metaBytes = this.lib.editBufferRedo(this.bufferPtr, maxSize)\n if (!metaBytes) return null\n return this.lib.decoder.decode(metaBytes)\n }\n\n public canUndo(): boolean {\n this.guard()\n return this.lib.editBufferCanUndo(this.bufferPtr)\n }\n\n public canRedo(): boolean {\n this.guard()\n return this.lib.editBufferCanRedo(this.bufferPtr)\n }\n\n public clearHistory(): void {\n this.guard()\n this.lib.editBufferClearHistory(this.bufferPtr)\n }\n\n public setDefaultFg(fg: RGBA | null): void {\n this.guard()\n this.lib.textBufferSetDefaultFg(this.textBufferPtr, fg)\n }\n\n public setDefaultBg(bg: RGBA | null): void {\n this.guard()\n this.lib.textBufferSetDefaultBg(this.textBufferPtr, bg)\n }\n\n public setDefaultAttributes(attributes: number | null): void {\n this.guard()\n this.lib.textBufferSetDefaultAttributes(this.textBufferPtr, attributes)\n }\n\n public resetDefaults(): void {\n this.guard()\n this.lib.textBufferResetDefaults(this.textBufferPtr)\n }\n\n public setSyntaxStyle(style: SyntaxStyle | null): void {\n this.guard()\n if (this.lib.textBufferSetSyntaxStyle(this.textBufferPtr, style?.ptr ?? null)) {\n this._syntaxStyle = style ?? undefined\n }\n }\n\n public getSyntaxStyle(): SyntaxStyle | null {\n this.guard()\n return this._syntaxStyle ?? null\n }\n\n public addHighlight(lineIdx: number, highlight: Highlight): void {\n this.guard()\n this.lib.textBufferAddHighlight(this.textBufferPtr, lineIdx, highlight)\n }\n\n public addHighlightByCharRange(highlight: Highlight): void {\n this.guard()\n this.lib.textBufferAddHighlightByCharRange(this.textBufferPtr, highlight)\n }\n\n public removeHighlightsByRef(hlRef: number): void {\n this.guard()\n this.lib.textBufferRemoveHighlightsByRef(this.textBufferPtr, hlRef)\n }\n\n public clearLineHighlights(lineIdx: number): void {\n this.guard()\n this.lib.textBufferClearLineHighlights(this.textBufferPtr, lineIdx)\n }\n\n public clearAllHighlights(): void {\n this.guard()\n this.lib.textBufferClearAllHighlights(this.textBufferPtr)\n }\n\n public getLineHighlights(lineIdx: number): Array<Highlight> {\n this.guard()\n return this.lib.textBufferGetLineHighlights(this.textBufferPtr, lineIdx)\n }\n\n public clear(): void {\n this.guard()\n this.lib.editBufferClear(this.bufferPtr)\n }\n\n public destroy(): void {\n if (this._destroyed) return\n\n this._destroyed = true\n EditBuffer.registry.delete(this.id)\n this.lib.destroyEditBuffer(this.bufferPtr)\n }\n}\n",
10
+ "import { RGBA } from \"./lib/RGBA.js\"\nimport {\n resolveRenderLib,\n type EditorViewHandle,\n type RenderLib,\n type TextBufferViewHandle,\n type VisualCursor,\n type LineInfo,\n} from \"./zig.js\"\nimport type { EditBuffer } from \"./edit-buffer.js\"\nimport { createExtmarksController } from \"./lib/index.js\"\n\nexport interface Viewport {\n offsetY: number\n offsetX: number\n height: number\n width: number\n}\n\nexport type { VisualCursor }\n\nexport class EditorView {\n private lib: RenderLib\n private viewPtr: EditorViewHandle\n private editBuffer: EditBuffer\n private _destroyed: boolean = false\n private _extmarksController?: any\n private _textBufferViewPtr?: TextBufferViewHandle\n\n constructor(lib: RenderLib, ptr: EditorViewHandle, editBuffer: EditBuffer) {\n this.lib = lib\n this.viewPtr = ptr\n this.editBuffer = editBuffer\n }\n\n static create(editBuffer: EditBuffer, viewportWidth: number, viewportHeight: number): EditorView {\n const lib = resolveRenderLib()\n const viewPtr = lib.createEditorView(editBuffer.ptr, viewportWidth, viewportHeight)\n return new EditorView(lib, viewPtr, editBuffer)\n }\n\n private guard(): void {\n if (this._destroyed) throw new Error(\"EditorView is destroyed\")\n }\n\n public get ptr(): EditorViewHandle {\n this.guard()\n return this.viewPtr\n }\n\n public setViewportSize(width: number, height: number): void {\n this.guard()\n this.lib.editorViewSetViewportSize(this.viewPtr, width, height)\n }\n\n public setViewport(x: number, y: number, width: number, height: number, moveCursor: boolean = true): void {\n this.guard()\n this.lib.editorViewSetViewport(this.viewPtr, x, y, width, height, moveCursor)\n }\n\n public getViewport(): Viewport {\n this.guard()\n return this.lib.editorViewGetViewport(this.viewPtr)\n }\n\n public setScrollMargin(margin: number): void {\n this.guard()\n this.lib.editorViewSetScrollMargin(this.viewPtr, margin)\n }\n\n public setWrapMode(mode: \"none\" | \"char\" | \"word\"): void {\n this.guard()\n this.lib.editorViewSetWrapMode(this.viewPtr, mode)\n }\n\n public getVirtualLineCount(): number {\n this.guard()\n return this.lib.editorViewGetVirtualLineCount(this.viewPtr)\n }\n\n public getTotalVirtualLineCount(): number {\n this.guard()\n return this.lib.editorViewGetTotalVirtualLineCount(this.viewPtr)\n }\n\n public setSelection(start: number, end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.editorViewSetSelection(this.viewPtr, start, end, bgColor || null, fgColor || null)\n }\n\n public updateSelection(end: number, bgColor?: RGBA, fgColor?: RGBA): void {\n this.guard()\n this.lib.editorViewUpdateSelection(this.viewPtr, end, bgColor || null, fgColor || null)\n }\n\n public resetSelection(): void {\n this.guard()\n this.lib.editorViewResetSelection(this.viewPtr)\n }\n\n public getSelection(): { start: number; end: number } | null {\n this.guard()\n return this.lib.editorViewGetSelection(this.viewPtr)\n }\n\n public hasSelection(): boolean {\n this.guard()\n return this.getSelection() !== null\n }\n\n public setLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n updateCursor?: boolean,\n followCursor?: boolean,\n ): boolean {\n this.guard()\n return this.lib.editorViewSetLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n updateCursor ?? false,\n followCursor ?? false,\n )\n }\n\n public updateLocalSelection(\n anchorX: number,\n anchorY: number,\n focusX: number,\n focusY: number,\n bgColor?: RGBA,\n fgColor?: RGBA,\n updateCursor?: boolean,\n followCursor?: boolean,\n ): boolean {\n this.guard()\n return this.lib.editorViewUpdateLocalSelection(\n this.viewPtr,\n anchorX,\n anchorY,\n focusX,\n focusY,\n bgColor || null,\n fgColor || null,\n updateCursor ?? false,\n followCursor ?? false,\n )\n }\n\n public resetLocalSelection(): void {\n this.guard()\n this.lib.editorViewResetLocalSelection(this.viewPtr)\n }\n\n public getSelectedText(): string {\n this.guard()\n // TODO: native can stack alloc all the text and decode will alloc as js string then\n const maxLength = 1024 * 1024 // 1MB should be enough for most selections\n const selectedBytes = this.lib.editorViewGetSelectedTextBytes(this.viewPtr, maxLength)\n\n if (!selectedBytes) return \"\"\n\n return this.lib.decoder.decode(selectedBytes)\n }\n\n public getCursor(): { row: number; col: number } {\n this.guard()\n return this.lib.editorViewGetCursor(this.viewPtr)\n }\n\n public getText(): string {\n this.guard()\n const maxLength = 1024 * 1024 // 1MB buffer\n const textBytes = this.lib.editorViewGetText(this.viewPtr, maxLength)\n if (!textBytes) return \"\"\n return this.lib.decoder.decode(textBytes)\n }\n\n public getVisualCursor(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetVisualCursor(this.viewPtr)\n }\n\n public moveUpVisual(): void {\n this.guard()\n this.lib.editorViewMoveUpVisual(this.viewPtr)\n }\n\n public moveDownVisual(): void {\n this.guard()\n this.lib.editorViewMoveDownVisual(this.viewPtr)\n }\n\n public deleteSelectedText(): void {\n this.guard()\n this.lib.editorViewDeleteSelectedText(this.viewPtr)\n }\n\n public setCursorByOffset(offset: number): void {\n this.guard()\n this.lib.editorViewSetCursorByOffset(this.viewPtr, offset)\n }\n\n public getNextWordBoundary(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetNextWordBoundary(this.viewPtr)\n }\n\n public getPrevWordBoundary(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetPrevWordBoundary(this.viewPtr)\n }\n\n public getEOL(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetEOL(this.viewPtr)\n }\n\n public getVisualSOL(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetVisualSOL(this.viewPtr)\n }\n\n public getVisualEOL(): VisualCursor {\n this.guard()\n return this.lib.editorViewGetVisualEOL(this.viewPtr)\n }\n\n public getLineInfo(): LineInfo {\n this.guard()\n return this.lib.editorViewGetLineInfo(this.viewPtr)\n }\n\n public getLogicalLineInfo(): LineInfo {\n this.guard()\n return this.lib.editorViewGetLogicalLineInfo(this.viewPtr)\n }\n\n public get extmarks(): any {\n if (!this._extmarksController) {\n this._extmarksController = createExtmarksController(this.editBuffer, this)\n }\n return this._extmarksController\n }\n\n public setPlaceholderStyledText(chunks: { text: string; fg?: RGBA; bg?: RGBA; attributes?: number }[]): void {\n this.guard()\n this.lib.editorViewSetPlaceholderStyledText(this.viewPtr, chunks)\n }\n\n public setTabIndicator(indicator: string | number): void {\n this.guard()\n const codePoint = typeof indicator === \"string\" ? (indicator.codePointAt(0) ?? 0) : indicator\n this.lib.editorViewSetTabIndicator(this.viewPtr, codePoint)\n }\n\n public setTabIndicatorColor(color: RGBA): void {\n this.guard()\n this.lib.editorViewSetTabIndicatorColor(this.viewPtr, color)\n }\n\n public measureForDimensions(width: number, height: number): { lineCount: number; widthColsMax: number } | null {\n this.guard()\n if (!this._textBufferViewPtr) {\n this._textBufferViewPtr = this.lib.editorViewGetTextBufferView(this.viewPtr)\n }\n return this.lib.textBufferViewMeasureForDimensions(this._textBufferViewPtr, width, height)\n }\n\n public destroy(): void {\n if (this._destroyed) return\n\n if (this._extmarksController) {\n this._extmarksController.destroy()\n this._extmarksController = undefined\n }\n\n this._destroyed = true\n this.lib.destroyEditorView(this.viewPtr)\n }\n}\n",
11
+ "import { RGBA, parseColor, type ColorInput } from \"./lib/RGBA.js\"\nimport { resolveRenderLib, type RenderLib, type SyntaxStyleHandle } from \"./zig.js\"\nimport { createTextAttributes } from \"./utils.js\"\n\nexport interface StyleDefinition {\n fg?: RGBA\n bg?: RGBA\n bold?: boolean\n italic?: boolean\n underline?: boolean\n dim?: boolean\n}\n\nexport interface StyleDefinitionInput {\n fg?: ColorInput\n bg?: ColorInput\n bold?: boolean\n italic?: boolean\n underline?: boolean\n dim?: boolean\n}\n\nexport interface MergedStyle {\n fg?: RGBA\n bg?: RGBA\n attributes: number\n}\n\nexport interface ThemeTokenStyle {\n scope: string[]\n style: {\n foreground?: ColorInput\n background?: ColorInput\n bold?: boolean\n italic?: boolean\n underline?: boolean\n dim?: boolean\n }\n}\n\nexport function convertThemeToStyles(theme: ThemeTokenStyle[]): Record<string, StyleDefinition> {\n const flatStyles: Record<string, StyleDefinition> = {}\n\n for (const tokenStyle of theme) {\n const styleDefinition: StyleDefinition = {}\n\n if (tokenStyle.style.foreground) {\n styleDefinition.fg = parseColor(tokenStyle.style.foreground)\n }\n if (tokenStyle.style.background) {\n styleDefinition.bg = parseColor(tokenStyle.style.background)\n }\n\n if (tokenStyle.style.bold !== undefined) {\n styleDefinition.bold = tokenStyle.style.bold\n }\n if (tokenStyle.style.italic !== undefined) {\n styleDefinition.italic = tokenStyle.style.italic\n }\n if (tokenStyle.style.underline !== undefined) {\n styleDefinition.underline = tokenStyle.style.underline\n }\n if (tokenStyle.style.dim !== undefined) {\n styleDefinition.dim = tokenStyle.style.dim\n }\n\n // Apply the same style to all scopes\n for (const scope of tokenStyle.scope) {\n flatStyles[scope] = styleDefinition\n }\n }\n\n return flatStyles\n}\n\nexport class SyntaxStyle {\n private lib: RenderLib\n private stylePtr: SyntaxStyleHandle\n private _destroyed: boolean = false\n private nameCache: Map<string, number> = new Map()\n private styleDefs: Map<string, StyleDefinition> = new Map()\n private mergedCache: Map<string, MergedStyle> = new Map()\n\n constructor(lib: RenderLib, ptr: SyntaxStyleHandle) {\n this.lib = lib\n this.stylePtr = ptr\n }\n\n static create(): SyntaxStyle {\n const lib = resolveRenderLib()\n const ptr = lib.createSyntaxStyle()\n return new SyntaxStyle(lib, ptr)\n }\n\n static fromTheme(theme: ThemeTokenStyle[]): SyntaxStyle {\n const style = SyntaxStyle.create()\n const flatStyles = convertThemeToStyles(theme)\n\n for (const [name, styleDef] of Object.entries(flatStyles)) {\n style.registerStyle(name, styleDef)\n }\n\n return style\n }\n\n static fromStyles(styles: Record<string, StyleDefinitionInput>): SyntaxStyle {\n const style = SyntaxStyle.create()\n\n for (const [name, styleDef] of Object.entries(styles)) {\n style.registerStyle(name, styleDef)\n }\n\n return style\n }\n\n private guard(): void {\n if (this._destroyed) throw new Error(\"NativeSyntaxStyle is destroyed\")\n }\n\n public registerStyle(name: string, style: StyleDefinitionInput): number {\n this.guard()\n\n const attributes = createTextAttributes({\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n dim: style.dim,\n })\n\n const fg = style.fg ? parseColor(style.fg) : null\n const bg = style.bg ? parseColor(style.bg) : null\n const id = this.lib.syntaxStyleRegister(this.stylePtr, name, fg, bg, attributes)\n\n this.nameCache.set(name, id)\n this.styleDefs.set(name, { ...style, fg: fg ?? undefined, bg: bg ?? undefined })\n\n return id\n }\n\n public resolveStyleId(name: string): number | null {\n this.guard()\n\n // Check cache first\n const cached = this.nameCache.get(name)\n if (cached !== undefined) return cached\n\n const id = this.lib.syntaxStyleResolveByName(this.stylePtr, name)\n\n if (id !== null) {\n this.nameCache.set(name, id)\n }\n\n return id\n }\n\n public getStyleId(name: string): number | null {\n this.guard()\n\n const id = this.resolveStyleId(name)\n if (id !== null) return id\n\n // Try base name if it's a scoped style\n if (name.includes(\".\")) {\n const baseName = name.split(\".\")[0]\n return this.resolveStyleId(baseName)\n }\n\n return null\n }\n\n public get ptr(): SyntaxStyleHandle {\n this.guard()\n return this.stylePtr\n }\n\n public getStyleCount(): number {\n this.guard()\n return this.lib.syntaxStyleGetStyleCount(this.stylePtr)\n }\n\n public clearNameCache(): void {\n this.nameCache.clear()\n }\n\n public getStyle(name: string): StyleDefinition | undefined {\n this.guard()\n\n if (Object.prototype.hasOwnProperty.call(this.styleDefs, name)) {\n return undefined\n }\n\n const style = this.styleDefs.get(name)\n if (style) return style\n\n if (name.includes(\".\")) {\n const baseName = name.split(\".\")[0]\n if (Object.prototype.hasOwnProperty.call(this.styleDefs, baseName)) {\n return undefined\n }\n return this.styleDefs.get(baseName)\n }\n\n return undefined\n }\n\n public mergeStyles(...styleNames: string[]): MergedStyle {\n this.guard()\n\n const cacheKey = styleNames.join(\":\")\n const cached = this.mergedCache.get(cacheKey)\n if (cached) return cached\n\n const styleDefinition: StyleDefinition = {}\n\n for (const name of styleNames) {\n const style = this.getStyle(name)\n\n if (!style) continue\n\n if (style.fg) styleDefinition.fg = style.fg\n if (style.bg) styleDefinition.bg = style.bg\n if (style.bold !== undefined) styleDefinition.bold = style.bold\n if (style.italic !== undefined) styleDefinition.italic = style.italic\n if (style.underline !== undefined) styleDefinition.underline = style.underline\n if (style.dim !== undefined) styleDefinition.dim = style.dim\n }\n\n const attributes = createTextAttributes({\n bold: styleDefinition.bold,\n italic: styleDefinition.italic,\n underline: styleDefinition.underline,\n dim: styleDefinition.dim,\n })\n\n const merged: MergedStyle = {\n fg: styleDefinition.fg,\n bg: styleDefinition.bg,\n attributes,\n }\n\n this.mergedCache.set(cacheKey, merged)\n\n return merged\n }\n\n public clearCache(): void {\n this.guard()\n this.mergedCache.clear()\n }\n\n public getCacheSize(): number {\n this.guard()\n return this.mergedCache.size\n }\n\n public getAllStyles(): Map<string, StyleDefinition> {\n this.guard()\n return new Map(this.styleDefs)\n }\n\n public getRegisteredNames(): string[] {\n this.guard()\n return Array.from(this.styleDefs.keys())\n }\n\n public destroy(): void {\n if (this._destroyed) return\n this._destroyed = true\n this.nameCache.clear()\n this.styleDefs.clear()\n this.mergedCache.clear()\n this.lib.destroySyntaxStyle(this.stylePtr)\n }\n}\n",
12
+ "import { Edge, Gutter } from \"../yoga.js\"\nimport { type RenderableOptions, Renderable } from \"../Renderable.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport {\n type BorderCharacters,\n type BorderSides,\n type BorderSidesConfig,\n type BorderStyle,\n borderCharsToArray,\n getBorderSides,\n parseBorderStyle,\n} from \"../lib/index.js\"\nimport { type ColorInput, RGBA, parseColor } from \"../lib/RGBA.js\"\nimport { isValidPercentage } from \"../lib/renderable.validations.js\"\nimport type { RenderContext } from \"../types.js\"\n\nexport interface BoxOptions<TRenderable extends Renderable = BoxRenderable> extends RenderableOptions<TRenderable> {\n backgroundColor?: string | RGBA\n borderStyle?: BorderStyle\n border?: boolean | BorderSides[]\n borderColor?: string | RGBA\n customBorderChars?: BorderCharacters\n shouldFill?: boolean\n title?: string\n titleColor?: string | RGBA\n titleAlignment?: \"left\" | \"center\" | \"right\"\n bottomTitle?: string\n bottomTitleAlignment?: \"left\" | \"center\" | \"right\"\n focusedBorderColor?: ColorInput\n focusable?: boolean\n gap?: number | `${number}%`\n rowGap?: number | `${number}%`\n columnGap?: number | `${number}%`\n}\n\nfunction isGapType(value: any): value is number | undefined {\n if (value === undefined) {\n return true\n }\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return true\n }\n return isValidPercentage(value)\n}\n\nexport class BoxRenderable extends Renderable {\n protected _backgroundColor: RGBA\n protected _border: boolean | BorderSides[]\n protected _borderStyle: BorderStyle\n protected _borderColor: RGBA\n protected _focusedBorderColor: RGBA\n private _customBorderCharsObj: BorderCharacters | undefined\n protected _customBorderChars?: Uint32Array\n protected borderSides: BorderSidesConfig\n public shouldFill: boolean\n protected _title?: string\n protected _titleColor?: RGBA\n protected _titleAlignment: \"left\" | \"center\" | \"right\"\n protected _bottomTitle?: string\n protected _bottomTitleAlignment: \"left\" | \"center\" | \"right\"\n\n protected _defaultOptions = {\n backgroundColor: \"transparent\",\n borderStyle: \"single\",\n border: false,\n borderColor: \"#FFFFFF\",\n shouldFill: true,\n titleAlignment: \"left\",\n bottomTitleAlignment: \"left\",\n focusedBorderColor: \"#00AAFF\",\n } satisfies Partial<BoxOptions>\n\n constructor(ctx: RenderContext, options: BoxOptions) {\n super(ctx, options)\n\n if (options.focusable === true) {\n this._focusable = true\n }\n\n this._backgroundColor = parseColor(options.backgroundColor || this._defaultOptions.backgroundColor)\n this._border = options.border ?? this._defaultOptions.border\n if (\n !options.border &&\n (options.borderStyle || options.borderColor || options.focusedBorderColor || options.customBorderChars)\n ) {\n this._border = true\n }\n this._borderStyle = parseBorderStyle(options.borderStyle, this._defaultOptions.borderStyle)\n this._borderColor = parseColor(options.borderColor || this._defaultOptions.borderColor)\n this._focusedBorderColor = parseColor(options.focusedBorderColor || this._defaultOptions.focusedBorderColor)\n this._customBorderCharsObj = options.customBorderChars\n this._customBorderChars = this._customBorderCharsObj ? borderCharsToArray(this._customBorderCharsObj) : undefined\n this.borderSides = getBorderSides(this._border)\n this.shouldFill = options.shouldFill ?? this._defaultOptions.shouldFill\n this._title = options.title\n this._titleColor = options.titleColor ? parseColor(options.titleColor) : undefined\n this._titleAlignment = options.titleAlignment || this._defaultOptions.titleAlignment\n this._bottomTitle = options.bottomTitle\n this._bottomTitleAlignment = options.bottomTitleAlignment || this._defaultOptions.bottomTitleAlignment\n\n this.applyYogaBorders()\n\n const hasInitialGapProps =\n options.gap !== undefined || options.rowGap !== undefined || options.columnGap !== undefined\n if (hasInitialGapProps) {\n this.applyYogaGap(options)\n }\n }\n\n private initializeBorder(): void {\n // https://github.com/anomalyco/opentui/issues/186\n // Solid-js reconciler does not pass props to constructor on init,\n // so we need to initialize the border when supporting properties are set.\n // borderStyle, borderColor, focusedBorderColor\n if (this._border === false) {\n this._border = true\n this.borderSides = getBorderSides(this._border)\n this.applyYogaBorders()\n }\n }\n\n public get customBorderChars(): BorderCharacters | undefined {\n return this._customBorderCharsObj\n }\n\n public set customBorderChars(value: BorderCharacters | undefined) {\n this._customBorderCharsObj = value\n this._customBorderChars = value ? borderCharsToArray(value) : undefined\n this.requestRender()\n }\n\n public get backgroundColor(): RGBA {\n return this._backgroundColor\n }\n\n public set backgroundColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.backgroundColor)\n if (this._backgroundColor !== newColor) {\n this._backgroundColor = newColor\n this.requestRender()\n }\n }\n\n public get border(): boolean | BorderSides[] {\n return this._border\n }\n\n public set border(value: boolean | BorderSides[]) {\n if (this._border !== value) {\n this._border = value\n this.borderSides = getBorderSides(value)\n this.applyYogaBorders()\n this.requestRender()\n }\n }\n\n public get borderStyle(): BorderStyle {\n return this._borderStyle\n }\n\n public set borderStyle(value: BorderStyle) {\n const _value = parseBorderStyle(value, this._defaultOptions.borderStyle)\n if (this._borderStyle !== _value || !this._border) {\n this._borderStyle = _value\n this._customBorderChars = undefined\n this.initializeBorder()\n this.requestRender()\n }\n }\n\n public get borderColor(): RGBA {\n return this._borderColor\n }\n\n public set borderColor(value: RGBA | string) {\n const newColor = parseColor(value ?? this._defaultOptions.borderColor)\n if (this._borderColor !== newColor) {\n this._borderColor = newColor\n this.initializeBorder()\n this.requestRender()\n }\n }\n\n public get focusedBorderColor(): RGBA {\n return this._focusedBorderColor\n }\n\n public set focusedBorderColor(value: RGBA | string) {\n const newColor = parseColor(value ?? this._defaultOptions.focusedBorderColor)\n if (this._focusedBorderColor !== newColor) {\n this._focusedBorderColor = newColor\n this.initializeBorder()\n if (this._focused) {\n this.requestRender()\n }\n }\n }\n\n public get title(): string | undefined {\n return this._title\n }\n\n public set title(value: string | undefined) {\n if (this._title !== value) {\n this._title = value\n this.requestRender()\n }\n }\n\n public get titleColor(): RGBA | undefined {\n return this._titleColor\n }\n\n public set titleColor(value: string | RGBA | undefined) {\n const newColor = value ? parseColor(value) : undefined\n if (this._titleColor !== newColor) {\n this._titleColor = newColor\n this.requestRender()\n }\n }\n\n public get titleAlignment(): \"left\" | \"center\" | \"right\" {\n return this._titleAlignment\n }\n\n public set titleAlignment(value: \"left\" | \"center\" | \"right\") {\n if (this._titleAlignment !== value) {\n this._titleAlignment = value\n this.requestRender()\n }\n }\n\n public get bottomTitle(): string | undefined {\n return this._bottomTitle\n }\n\n public set bottomTitle(value: string | undefined) {\n if (this._bottomTitle !== value) {\n this._bottomTitle = value\n this.requestRender()\n }\n }\n\n public get bottomTitleAlignment(): \"left\" | \"center\" | \"right\" {\n return this._bottomTitleAlignment\n }\n\n public set bottomTitleAlignment(value: \"left\" | \"center\" | \"right\") {\n if (this._bottomTitleAlignment !== value) {\n this._bottomTitleAlignment = value\n this.requestRender()\n }\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n const hasBorder = this.borderSides.top || this.borderSides.right || this.borderSides.bottom || this.borderSides.left\n const hasVisibleFill = this.shouldFill && this._backgroundColor.a > 0\n // Many boxes are used only for layout. Skip drawBox entirely when a box\n // would not draw pixels so wrapper nodes do not pay the FFI/native cost.\n if (!hasBorder && !hasVisibleFill) {\n return\n }\n\n const hasFocusWithin = this._focusable && (this._focused || this._hasFocusedDescendant)\n const currentBorderColor = hasFocusWithin ? this._focusedBorderColor : this._borderColor\n const screenX = this._screenX\n const screenY = this._screenY\n\n buffer.drawBox({\n x: screenX,\n y: screenY,\n width: this.width,\n height: this.height,\n borderStyle: this._borderStyle,\n customBorderChars: this._customBorderChars,\n border: this._border,\n borderColor: currentBorderColor,\n backgroundColor: this._backgroundColor,\n shouldFill: this.shouldFill,\n title: this._title,\n titleColor: this._titleColor ?? currentBorderColor,\n titleAlignment: this._titleAlignment,\n bottomTitle: this._bottomTitle,\n bottomTitleAlignment: this._bottomTitleAlignment,\n })\n }\n\n protected getScissorRect(): { x: number; y: number; width: number; height: number } {\n const baseRect = super.getScissorRect()\n\n if (!this.borderSides.top && !this.borderSides.right && !this.borderSides.bottom && !this.borderSides.left) {\n return baseRect\n }\n\n const leftInset = this.borderSides.left ? 1 : 0\n const rightInset = this.borderSides.right ? 1 : 0\n const topInset = this.borderSides.top ? 1 : 0\n const bottomInset = this.borderSides.bottom ? 1 : 0\n\n return {\n x: baseRect.x + leftInset,\n y: baseRect.y + topInset,\n width: Math.max(0, baseRect.width - leftInset - rightInset),\n height: Math.max(0, baseRect.height - topInset - bottomInset),\n }\n }\n\n private applyYogaBorders(): void {\n const node = this.yogaNode\n node.setBorder(Edge.Left, this.borderSides.left ? 1 : 0)\n node.setBorder(Edge.Right, this.borderSides.right ? 1 : 0)\n node.setBorder(Edge.Top, this.borderSides.top ? 1 : 0)\n node.setBorder(Edge.Bottom, this.borderSides.bottom ? 1 : 0)\n this.requestRender()\n }\n\n private applyYogaGap(options: BoxOptions): void {\n const node = this.yogaNode\n\n if (isGapType(options.gap)) {\n node.setGap(Gutter.All, options.gap)\n }\n\n if (isGapType(options.rowGap)) {\n node.setGap(Gutter.Row, options.rowGap)\n }\n\n if (isGapType(options.columnGap)) {\n node.setGap(Gutter.Column, options.columnGap)\n }\n }\n\n public set gap(gap: number | `${number}%` | undefined) {\n if (isGapType(gap)) {\n this.yogaNode.setGap(Gutter.All, gap)\n this.requestRender()\n }\n }\n\n public set rowGap(rowGap: number | `${number}%` | undefined) {\n if (isGapType(rowGap)) {\n this.yogaNode.setGap(Gutter.Row, rowGap)\n this.requestRender()\n }\n }\n\n public set columnGap(columnGap: number | `${number}%` | undefined) {\n if (isGapType(columnGap)) {\n this.yogaNode.setGap(Gutter.Column, columnGap)\n this.requestRender()\n }\n }\n}\n",
13
+ "import { Renderable, type RenderableOptions } from \"../Renderable.js\"\nimport { convertGlobalToLocalSelection, Selection, type LocalSelectionBounds } from \"../lib/selection.js\"\nimport { TextBuffer, type TextChunk } from \"../text-buffer.js\"\nimport { TextBufferView } from \"../text-buffer-view.js\"\nimport { RGBA, parseColor } from \"../lib/RGBA.js\"\nimport { type RenderContext, type LineInfoProvider } from \"../types.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport { NativeMeasureTargetKind, resolveRenderLib, type LineInfo, type NativeRenderableHandle } from \"../zig.js\"\nimport { SyntaxStyle } from \"../syntax-style.js\"\n\nexport interface TextBufferOptions extends RenderableOptions<TextBufferRenderable> {\n fg?: string | RGBA\n bg?: string | RGBA\n selectionBg?: string | RGBA\n selectionFg?: string | RGBA\n selectable?: boolean\n attributes?: number\n wrapMode?: \"none\" | \"char\" | \"word\"\n tabIndicator?: string | number\n tabIndicatorColor?: string | RGBA\n truncate?: boolean\n}\n\nexport abstract class TextBufferRenderable extends Renderable implements LineInfoProvider {\n public selectable: boolean = true\n\n protected _defaultFg: RGBA\n protected _defaultBg: RGBA\n protected _defaultAttributes: number\n protected _selectionBg: RGBA | undefined\n protected _selectionFg: RGBA | undefined\n protected _wrapMode: \"none\" | \"char\" | \"word\" = \"word\"\n protected lastLocalSelection: LocalSelectionBounds | null = null\n protected _tabIndicator?: string | number\n protected _tabIndicatorColor?: RGBA\n protected _scrollX: number = 0\n protected _scrollY: number = 0\n protected _truncate: boolean = false\n protected _firstLineOffset: number = 0\n\n protected textBuffer: TextBuffer\n protected textBufferView: TextBufferView\n protected _textBufferSyntaxStyle: SyntaxStyle\n private nativeRenderable: NativeRenderableHandle | null = null\n\n protected _defaultOptions = {\n fg: RGBA.fromValues(1, 1, 1, 1),\n bg: RGBA.fromValues(0, 0, 0, 0),\n selectionBg: undefined,\n selectionFg: undefined,\n selectable: true,\n attributes: 0,\n wrapMode: \"word\" as \"none\" | \"char\" | \"word\",\n tabIndicator: undefined,\n tabIndicatorColor: undefined,\n truncate: false,\n } satisfies Partial<TextBufferOptions>\n\n constructor(ctx: RenderContext, options: TextBufferOptions) {\n super(ctx, options)\n\n this._defaultFg = parseColor(options.fg ?? this._defaultOptions.fg)\n this._defaultBg = parseColor(options.bg ?? this._defaultOptions.bg)\n this._defaultAttributes = options.attributes ?? this._defaultOptions.attributes\n this._selectionBg = options.selectionBg ? parseColor(options.selectionBg) : this._defaultOptions.selectionBg\n this._selectionFg = options.selectionFg ? parseColor(options.selectionFg) : this._defaultOptions.selectionFg\n this.selectable = options.selectable ?? this._defaultOptions.selectable\n this._wrapMode = options.wrapMode ?? this._defaultOptions.wrapMode\n this._tabIndicator = options.tabIndicator ?? this._defaultOptions.tabIndicator\n this._tabIndicatorColor = options.tabIndicatorColor\n ? parseColor(options.tabIndicatorColor)\n : this._defaultOptions.tabIndicatorColor\n this._truncate = options.truncate ?? this._defaultOptions.truncate\n\n this.textBuffer = TextBuffer.create(this._ctx.widthMethod)\n this.textBufferView = TextBufferView.create(this.textBuffer)\n this._firstLineOffset = ctx.claimFirstLineOffset?.(this) ?? 0\n\n this._textBufferSyntaxStyle = SyntaxStyle.create()\n this.textBuffer.setSyntaxStyle(this._textBufferSyntaxStyle)\n\n this.textBufferView.setWrapMode(this._wrapMode)\n this.textBufferView.setFirstLineOffset(this._firstLineOffset)\n this.setupNativeRenderable()\n\n this.textBuffer.setDefaultFg(this._defaultFg)\n this.textBuffer.setDefaultBg(this._defaultBg)\n this.textBuffer.setDefaultAttributes(this._defaultAttributes)\n\n if (this._tabIndicator !== undefined) {\n this.textBufferView.setTabIndicator(this._tabIndicator)\n }\n if (this._tabIndicatorColor !== undefined) {\n this.textBufferView.setTabIndicatorColor(this._tabIndicatorColor)\n }\n\n if (this._wrapMode !== \"none\" && this.width > 0) {\n this.textBufferView.setWrapWidth(this.width)\n }\n\n if (this.width > 0 && this.height > 0) {\n this.textBufferView.setViewport(this._scrollX, this._scrollY, this.width, this.height)\n }\n\n this.textBufferView.setTruncate(this._truncate)\n\n this.updateTextInfo()\n }\n\n protected onMouseEvent(event: any): void {\n if (event.type === \"scroll\") {\n this.handleScroll(event)\n }\n }\n\n protected handleScroll(event: any): void {\n if (!event.scroll) return\n\n const { direction, delta } = event.scroll\n\n if (direction === \"up\") {\n this.scrollY -= delta\n } else if (direction === \"down\") {\n this.scrollY += delta\n }\n\n if (this._wrapMode === \"none\") {\n if (direction === \"left\") {\n this.scrollX -= delta\n } else if (direction === \"right\") {\n this.scrollX += delta\n }\n }\n }\n\n public get lineInfo(): LineInfo {\n return this.textBufferView.logicalLineInfo\n }\n\n public get lineCount(): number {\n return this.textBuffer.getLineCount()\n }\n\n public get virtualLineCount(): number {\n return this.textBufferView.getVirtualLineCount()\n }\n\n public get scrollY(): number {\n return this._scrollY\n }\n\n public set scrollY(value: number) {\n const maxScrollY = Math.max(0, this.scrollHeight - this.height)\n const clamped = Math.max(0, Math.min(value, maxScrollY))\n if (this._scrollY !== clamped) {\n this._scrollY = clamped\n this.updateViewportOffset()\n this.requestRender()\n }\n }\n\n public get scrollX(): number {\n return this._scrollX\n }\n\n public set scrollX(value: number) {\n const maxScrollX = Math.max(0, this.scrollWidth - this.width)\n const clamped = Math.max(0, Math.min(value, maxScrollX))\n if (this._scrollX !== clamped) {\n this._scrollX = clamped\n this.updateViewportOffset()\n this.requestRender()\n }\n }\n\n public get scrollWidth(): number {\n return this.lineInfo.lineWidthColsMax\n }\n\n public get scrollHeight(): number {\n return this.lineInfo.lineStartCols.length\n }\n\n public get maxScrollY(): number {\n return Math.max(0, this.scrollHeight - this.height)\n }\n\n public get maxScrollX(): number {\n return Math.max(0, this.scrollWidth - this.width)\n }\n\n protected updateViewportOffset(): void {\n // Update the viewport with the new scroll position\n if (this.width > 0 && this.height > 0) {\n this.textBufferView.setViewport(this._scrollX, this._scrollY, this.width, this.height)\n }\n }\n\n get plainText(): string {\n return this.textBuffer.getPlainText()\n }\n\n get textLength(): number {\n return this.textBuffer.length\n }\n\n get fg(): RGBA {\n return this._defaultFg\n }\n\n set fg(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.fg)\n if (this._defaultFg !== newColor) {\n this._defaultFg = newColor\n this.textBuffer.setDefaultFg(this._defaultFg)\n this.onFgChanged(newColor)\n this.requestRender()\n }\n }\n\n get selectionBg(): RGBA | undefined {\n return this._selectionBg\n }\n\n set selectionBg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionBg\n if (this._selectionBg !== newColor) {\n this._selectionBg = newColor\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n }\n this.requestRender()\n }\n }\n\n get selectionFg(): RGBA | undefined {\n return this._selectionFg\n }\n\n set selectionFg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionFg\n if (this._selectionFg !== newColor) {\n this._selectionFg = newColor\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n }\n this.requestRender()\n }\n }\n\n get bg(): RGBA {\n return this._defaultBg\n }\n\n set bg(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.bg)\n if (this._defaultBg !== newColor) {\n this._defaultBg = newColor\n this.textBuffer.setDefaultBg(this._defaultBg)\n this.onBgChanged(newColor)\n this.requestRender()\n }\n }\n\n get attributes(): number {\n return this._defaultAttributes\n }\n\n set attributes(value: number) {\n if (this._defaultAttributes !== value) {\n this._defaultAttributes = value\n this.textBuffer.setDefaultAttributes(this._defaultAttributes)\n this.onAttributesChanged(value)\n this.requestRender()\n }\n }\n\n get wrapMode(): \"none\" | \"char\" | \"word\" {\n return this._wrapMode\n }\n\n set wrapMode(value: \"none\" | \"char\" | \"word\") {\n if (this._wrapMode !== value) {\n this._wrapMode = value\n this.textBufferView.setWrapMode(this._wrapMode)\n if (value !== \"none\" && this.width > 0) {\n this.textBufferView.setWrapWidth(this.width)\n }\n // Changing wrap mode can change dimensions, so mark yoga node dirty to trigger re-measurement\n this.yogaNode.markDirty()\n this.requestRender()\n }\n }\n\n get tabIndicator(): string | number | undefined {\n return this._tabIndicator\n }\n\n set tabIndicator(value: string | number | undefined) {\n if (this._tabIndicator !== value) {\n this._tabIndicator = value\n if (value !== undefined) {\n this.textBufferView.setTabIndicator(value)\n }\n this.requestRender()\n }\n }\n\n get tabIndicatorColor(): RGBA | undefined {\n return this._tabIndicatorColor\n }\n\n set tabIndicatorColor(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : undefined\n if (this._tabIndicatorColor !== newColor) {\n this._tabIndicatorColor = newColor\n if (newColor !== undefined) {\n this.textBufferView.setTabIndicatorColor(newColor)\n }\n this.requestRender()\n }\n }\n\n get truncate(): boolean {\n return this._truncate\n }\n\n set truncate(value: boolean) {\n if (this._truncate !== value) {\n this._truncate = value\n this.textBufferView.setTruncate(value)\n this.requestRender()\n }\n }\n\n protected onResize(width: number, height: number): void {\n this.textBufferView.setViewport(this._scrollX, this._scrollY, width, height)\n this.yogaNode.markDirty()\n this.requestRender()\n this.emit(\"line-info-change\")\n }\n\n protected refreshLocalSelection(): boolean {\n if (this.lastLocalSelection) {\n return this.updateLocalSelection(this.lastLocalSelection)\n }\n return false\n }\n\n private updateLocalSelection(localSelection: LocalSelectionBounds | null): boolean {\n if (!localSelection?.isActive) {\n this.textBufferView.resetLocalSelection()\n return true\n }\n\n return this.textBufferView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n )\n }\n\n protected updateTextInfo(): void {\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n }\n\n this.yogaNode.markDirty()\n this.requestRender()\n this.emit(\"line-info-change\")\n }\n\n private setupNativeRenderable(): void {\n const lib = resolveRenderLib()\n // Transitional native backing: JS still owns the render tree and Yoga nodes,\n // while native owns only hot measurement state. Attach the existing JS-created\n // Yoga node for now. The intended direction is for every Renderable to become\n // native-backed and for Yoga node ownership to move native-side with it.\n const nativeRenderable = lib.createNativeRenderable()\n if (!lib.nativeRenderableAttachYogaNode(nativeRenderable, this.yogaNode.ptr)) {\n lib.destroyNativeRenderable(nativeRenderable)\n throw new Error(\"Failed to attach native renderable Yoga node\")\n }\n if (\n !lib.nativeRenderableSetMeasureTarget(\n nativeRenderable,\n NativeMeasureTargetKind.TextBufferView,\n this.textBufferView.ptr,\n )\n ) {\n lib.destroyNativeRenderable(nativeRenderable)\n throw new Error(\"Failed to attach text buffer native measure target\")\n }\n this.nativeRenderable = nativeRenderable\n }\n\n shouldStartSelection(x: number, y: number): boolean {\n if (!this.selectable) return false\n\n const localX = x - this.x\n const localY = y - this.y\n\n return localX >= 0 && localX < this.width && localY >= 0 && localY < this.height\n }\n\n onSelectionChanged(selection: Selection | null): boolean {\n const localSelection = convertGlobalToLocalSelection(selection, this.x, this.y)\n this.lastLocalSelection = localSelection\n\n let changed: boolean\n if (!localSelection?.isActive) {\n this.textBufferView.resetLocalSelection()\n changed = true\n } else if (selection?.isStart) {\n changed = this.textBufferView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n )\n } else {\n changed = this.textBufferView.updateLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n )\n }\n\n if (changed) {\n this.requestRender()\n }\n\n return this.hasSelection()\n }\n\n getSelectedText(): string {\n return this.textBufferView.getSelectedText()\n }\n\n hasSelection(): boolean {\n return this.textBufferView.hasSelection()\n }\n\n getSelection(): { start: number; end: number } | null {\n return this.textBufferView.getSelection()\n }\n\n render(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible) return\n // Text views do enough per-frame work that avoiding recursive x/y lookups is\n // measurable; use the layout cache for hit-grid and draw entry points.\n const screenX = this._screenX\n const screenY = this._screenY\n\n this.markClean()\n this._ctx.addToHitGrid(screenX, screenY, this.width, this.height, this.num)\n\n this.renderSelf(buffer)\n\n if (this.buffered && this.frameBuffer) {\n buffer.drawFrameBuffer(screenX, screenY, this.frameBuffer)\n }\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n if (this.textBuffer.ptr) {\n buffer.drawTextBuffer(this.textBufferView, this._screenX, this._screenY)\n }\n }\n\n destroy(): void {\n if (this.isDestroyed) return\n\n if (this.nativeRenderable) {\n resolveRenderLib().destroyNativeRenderable(this.nativeRenderable)\n this.nativeRenderable = null\n }\n this.textBuffer.setSyntaxStyle(null)\n this._textBufferSyntaxStyle.destroy()\n this.textBufferView.destroy()\n this.textBuffer.destroy()\n super.destroy()\n }\n\n protected onFgChanged(newColor: RGBA): void {\n // Override in subclasses if needed\n }\n\n protected onBgChanged(newColor: RGBA): void {\n // Override in subclasses if needed\n }\n\n protected onAttributesChanged(newAttributes: number): void {\n // Override in subclasses if needed\n }\n}\n",
14
+ "import { type LineInfo, type RenderContext } from \"../types.js\"\nimport { StyledText } from \"../lib/styled-text.js\"\nimport { SyntaxStyle } from \"../syntax-style.js\"\nimport { getTreeSitterClient, TreeSitterClient } from \"../lib/tree-sitter/index.js\"\nimport { TextBufferRenderable, type TextBufferOptions } from \"./TextBufferRenderable.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport type { SimpleHighlight } from \"../lib/tree-sitter/types.js\"\nimport type { TextChunk } from \"../text-buffer.js\"\nimport { treeSitterToTextChunks } from \"../lib/tree-sitter-styled-text.js\"\n\nexport interface HighlightContext {\n content: string\n filetype: string\n syntaxStyle: SyntaxStyle\n}\n\nexport type OnHighlightCallback = (\n highlights: SimpleHighlight[],\n context: HighlightContext,\n) => SimpleHighlight[] | undefined | Promise<SimpleHighlight[] | undefined>\n\nexport interface ChunkRenderContext extends HighlightContext {\n highlights: SimpleHighlight[]\n}\n\nexport type OnChunksCallback = (\n chunks: TextChunk[],\n context: ChunkRenderContext,\n) => TextChunk[] | undefined | Promise<TextChunk[] | undefined>\n\nexport interface CodeOptions extends TextBufferOptions {\n content?: string\n filetype?: string\n syntaxStyle: SyntaxStyle\n treeSitterClient?: TreeSitterClient\n conceal?: boolean\n drawUnstyledText?: boolean\n streaming?: boolean\n initialStyledText?: StyledText\n baseHighlight?: string\n onHighlight?: OnHighlightCallback\n onChunks?: OnChunksCallback\n}\n\ntype ConcealLineRange = [start: number, end: number]\n\nexport class CodeRenderable extends TextBufferRenderable {\n private _content: string\n private _filetype?: string\n private _syntaxStyle: SyntaxStyle\n private _isHighlighting: boolean = false\n private _treeSitterClient: TreeSitterClient\n private _highlightsDirty: boolean = false\n private _highlightSnapshotId: number = 0\n private _conceal: boolean\n private _drawUnstyledText: boolean\n private _shouldRenderTextBuffer: boolean = true\n private _streaming: boolean\n private _initialStyledText?: StyledText\n private _hadInitialContent: boolean = false\n private _lastHighlights: SimpleHighlight[] = []\n private _baseHighlight?: string\n private _onHighlight?: OnHighlightCallback\n private _onChunks?: OnChunksCallback\n private _highlightingPromise: Promise<void> = Promise.resolve()\n // Temporary rendered-line -> source-line map for concealment; native extmarks should replace this.\n private _renderedLineSources?: number[]\n private _mappedLineInfo?: LineInfo\n\n protected _contentDefaultOptions = {\n content: \"\",\n conceal: true,\n drawUnstyledText: true,\n streaming: false,\n } satisfies Partial<CodeOptions>\n\n constructor(ctx: RenderContext, options: CodeOptions) {\n super(ctx, options)\n\n this._content = options.content ?? this._contentDefaultOptions.content\n this._filetype = options.filetype\n this._syntaxStyle = options.syntaxStyle\n this._treeSitterClient = options.treeSitterClient ?? getTreeSitterClient()\n this._conceal = options.conceal ?? this._contentDefaultOptions.conceal\n this._drawUnstyledText = options.drawUnstyledText ?? this._contentDefaultOptions.drawUnstyledText\n this._streaming = options.streaming ?? this._contentDefaultOptions.streaming\n this._initialStyledText = options.initialStyledText\n this._baseHighlight = options.baseHighlight\n this._onHighlight = options.onHighlight\n this._onChunks = options.onChunks\n\n if (this._content.length > 0) {\n if (this._initialStyledText && this._drawUnstyledText) {\n this.textBuffer.setStyledText(this._initialStyledText)\n } else {\n this.textBuffer.setText(this._content)\n }\n this.updateTextInfo()\n this._shouldRenderTextBuffer = this._drawUnstyledText || !this._filetype\n }\n\n this._highlightsDirty = this._content.length > 0\n }\n\n get content(): string {\n return this._content\n }\n\n set content(value: string) {\n if (this._content !== value) {\n this._content = value\n this._highlightsDirty = true\n this._highlightSnapshotId++\n\n if (this._streaming && this._filetype && !this._drawUnstyledText) {\n this.requestRender()\n return\n }\n\n if (this._initialStyledText && this._drawUnstyledText) {\n this.textBuffer.setStyledText(this._initialStyledText)\n } else {\n this.textBuffer.setText(value)\n }\n this.setRenderedLineSources(undefined)\n this.updateTextInfo()\n }\n }\n\n public override get lineInfo(): LineInfo {\n if (!this._renderedLineSources) return super.lineInfo\n if (this._mappedLineInfo) return this._mappedLineInfo\n\n const lineInfo = super.lineInfo\n const renderedLineSources = this._renderedLineSources\n\n // Native reports visual rows for the rendered buffer; remap those rows back to source lines.\n this._mappedLineInfo = {\n ...lineInfo,\n lineSources: lineInfo.lineSources.map((line) => renderedLineSources[line] ?? line),\n }\n return this._mappedLineInfo\n }\n\n public override get wrapMode(): \"none\" | \"char\" | \"word\" {\n return super.wrapMode\n }\n\n public override set wrapMode(value: \"none\" | \"char\" | \"word\") {\n if (super.wrapMode !== value) {\n this._mappedLineInfo = undefined\n super.wrapMode = value\n }\n }\n\n protected override onResize(width: number, height: number): void {\n this._mappedLineInfo = undefined\n super.onResize(width, height)\n }\n\n protected override updateTextInfo(): void {\n this._mappedLineInfo = undefined\n super.updateTextInfo()\n }\n\n get filetype(): string | undefined {\n return this._filetype\n }\n\n set filetype(value: string | undefined) {\n if (this._filetype !== value) {\n this._filetype = value\n this._highlightsDirty = true\n }\n }\n\n get syntaxStyle(): SyntaxStyle {\n return this._syntaxStyle\n }\n\n set syntaxStyle(value: SyntaxStyle) {\n if (this._syntaxStyle !== value) {\n this._syntaxStyle = value\n this._highlightsDirty = true\n }\n }\n\n get conceal(): boolean {\n return this._conceal\n }\n\n set conceal(value: boolean) {\n if (this._conceal !== value) {\n this._conceal = value\n this._highlightsDirty = true\n }\n }\n\n get drawUnstyledText(): boolean {\n return this._drawUnstyledText\n }\n\n set drawUnstyledText(value: boolean) {\n if (this._drawUnstyledText !== value) {\n this._drawUnstyledText = value\n this._highlightsDirty = true\n }\n }\n\n get streaming(): boolean {\n return this._streaming\n }\n\n set initialStyledText(value: StyledText | undefined) {\n if (this._initialStyledText !== value) {\n this._initialStyledText = value\n this._highlightsDirty = true\n }\n }\n\n set streaming(value: boolean) {\n if (this._streaming !== value) {\n this._streaming = value\n this._hadInitialContent = false\n this._lastHighlights = []\n this._highlightsDirty = true\n }\n }\n\n get treeSitterClient(): TreeSitterClient {\n return this._treeSitterClient\n }\n\n set treeSitterClient(value: TreeSitterClient) {\n if (this._treeSitterClient !== value) {\n this._treeSitterClient = value\n this._highlightsDirty = true\n }\n }\n\n get onHighlight(): OnHighlightCallback | undefined {\n return this._onHighlight\n }\n\n get baseHighlight(): string | undefined {\n return this._baseHighlight\n }\n\n set baseHighlight(value: string | undefined) {\n if (this._baseHighlight !== value) {\n this._baseHighlight = value\n this._highlightsDirty = true\n }\n }\n\n set onHighlight(value: OnHighlightCallback | undefined) {\n if (this._onHighlight !== value) {\n this._onHighlight = value\n this._highlightsDirty = true\n }\n }\n\n get onChunks(): OnChunksCallback | undefined {\n return this._onChunks\n }\n\n set onChunks(value: OnChunksCallback | undefined) {\n if (this._onChunks !== value) {\n this._onChunks = value\n this._highlightsDirty = true\n }\n }\n\n get isHighlighting(): boolean {\n return this._isHighlighting\n }\n\n get highlightingDone(): Promise<void> {\n return this._highlightingPromise\n }\n\n protected async transformChunks(chunks: TextChunk[], context: ChunkRenderContext): Promise<TextChunk[]> {\n if (!this._onChunks) return chunks\n\n const modified = await this._onChunks(chunks, context)\n return modified ?? chunks\n }\n\n private ensureVisibleTextBeforeHighlight(): void {\n if (this.isDestroyed) return\n\n const content = this._content\n\n if (!this._filetype) {\n this._shouldRenderTextBuffer = true\n return\n }\n\n const isInitialContent = this._streaming && !this._hadInitialContent\n const shouldDrawUnstyledNow = this._streaming ? isInitialContent && this._drawUnstyledText : this._drawUnstyledText\n\n if (this._streaming && !isInitialContent) {\n this._shouldRenderTextBuffer = true\n } else if (shouldDrawUnstyledNow) {\n if (this._initialStyledText) {\n this.textBuffer.setStyledText(this._initialStyledText)\n } else {\n this.textBuffer.setText(content)\n }\n this.setRenderedLineSources(undefined)\n this._shouldRenderTextBuffer = true\n } else {\n this._shouldRenderTextBuffer = false\n }\n }\n\n private async startHighlight(): Promise<void> {\n const content = this._content\n const filetype = this._filetype\n const snapshotId = ++this._highlightSnapshotId\n\n if (!filetype) return\n\n const isInitialContent = this._streaming && !this._hadInitialContent\n if (isInitialContent) {\n this._hadInitialContent = true\n }\n\n this._isHighlighting = true\n\n try {\n const result = await this._treeSitterClient.highlightOnce(content, filetype)\n\n if (snapshotId !== this._highlightSnapshotId) {\n this.requestRender()\n return\n }\n\n if (this.isDestroyed) return\n\n let highlights = result.highlights ?? []\n\n if (this._onHighlight && highlights.length >= 0) {\n const context: HighlightContext = {\n content,\n filetype,\n syntaxStyle: this._syntaxStyle,\n }\n const modified = await this._onHighlight(highlights, context)\n if (modified !== undefined) {\n highlights = modified\n }\n }\n\n if (snapshotId !== this._highlightSnapshotId) {\n this.requestRender()\n return\n }\n\n if (this.isDestroyed) return\n\n if (highlights.length > 0) {\n if (this._streaming) {\n this._lastHighlights = highlights\n }\n }\n\n if (highlights.length > 0 || this._onChunks || this._baseHighlight) {\n const context: ChunkRenderContext = {\n content,\n filetype,\n syntaxStyle: this._syntaxStyle,\n highlights,\n }\n\n let chunks = treeSitterToTextChunks(content, highlights, this._syntaxStyle, {\n enabled: this._conceal,\n baseHighlight: this._baseHighlight,\n })\n // onChunks may rewrite text arbitrarily, so the conceal-only source map would be invalid.\n const renderedLineSources = this._onChunks ? undefined : this.getConcealLinesSourceMap(content, highlights)\n\n chunks = await this.transformChunks(chunks, context)\n\n if (snapshotId !== this._highlightSnapshotId) {\n this.requestRender()\n return\n }\n\n if (this.isDestroyed) return\n\n const styledText = new StyledText(chunks)\n this.textBuffer.setStyledText(styledText)\n this.setRenderedLineSources(renderedLineSources)\n } else {\n this.textBuffer.setText(content)\n this.setRenderedLineSources(undefined)\n }\n\n this._shouldRenderTextBuffer = true\n this._isHighlighting = false\n this._highlightsDirty = false\n this.updateTextInfo()\n this.requestRender()\n } catch (error) {\n if (snapshotId !== this._highlightSnapshotId) {\n this.requestRender()\n return\n }\n\n console.warn(\"Code highlighting failed, falling back to plain text:\", error)\n if (this.isDestroyed) return\n this.textBuffer.setText(content)\n this.setRenderedLineSources(undefined)\n this._shouldRenderTextBuffer = true\n this._isHighlighting = false\n this._highlightsDirty = false\n this.updateTextInfo()\n this.requestRender()\n }\n }\n\n private setRenderedLineSources(lineSources: number[] | undefined): void {\n this._renderedLineSources = lineSources\n this._mappedLineInfo = undefined\n }\n\n private static isIdentityLineSources(lineSources: number[]): boolean {\n for (let i = 0; i < lineSources.length; i++) {\n if (lineSources[i] !== i) return false\n }\n return true\n }\n\n private static getMergedConcealLineRanges(highlights: SimpleHighlight[]): ConcealLineRange[] {\n const ranges: ConcealLineRange[] = []\n\n for (const highlight of highlights) {\n const meta = highlight[3]\n if (meta?.concealLines === undefined) continue\n\n const group = highlight[2]\n const isEmptyConceal =\n meta.conceal === \"\" || (meta.conceal === undefined && (group === \"conceal\" || group.startsWith(\"conceal.\")))\n if (isEmptyConceal) {\n ranges.push([highlight[0], highlight[1]])\n }\n }\n\n if (ranges.length <= 1) return ranges\n\n // Overlapping conceal ranges must collapse before line-by-line source mapping.\n ranges.sort((a, b) => a[0] - b[0])\n let writeIndex = 0\n\n for (let i = 1; i < ranges.length; i++) {\n const current = ranges[writeIndex]\n const next = ranges[i]\n\n if (next[0] <= current[1]) {\n current[1] = Math.max(current[1], next[1])\n } else {\n writeIndex++\n ranges[writeIndex] = next\n }\n }\n\n ranges.length = writeIndex + 1\n return ranges\n }\n\n private getConcealLinesSourceMap(content: string, highlights: SimpleHighlight[]): number[] | undefined {\n if (!this._conceal || content.length === 0) return undefined\n\n // setStyledText gives native only rendered text; rebuild enough source identity for concealed lines.\n // Native view-resolved extmarks should make this a layout query instead of a parallel map.\n const concealLineRanges = CodeRenderable.getMergedConcealLineRanges(highlights)\n if (concealLineRanges.length === 0) return undefined\n\n const lineSources: number[] = []\n let sourceLine = 0\n let lineStart = 0\n let rangeIndex = 0\n let currentRenderedLineHasText = false\n\n const setCurrentRenderedLineSource = (line: number, hasText: boolean): void => {\n // Until visible text is emitted, a rendered line can still map to a later collapsed source line.\n if (lineSources.length === 0) {\n lineSources.push(line)\n } else if (!currentRenderedLineHasText) {\n lineSources[lineSources.length - 1] = line\n }\n\n if (hasText) currentRenderedLineHasText = true\n }\n\n while (lineStart <= content.length) {\n const newlineOffset = content.indexOf(\"\\n\", lineStart)\n const lineEnd = newlineOffset === -1 ? content.length : newlineOffset\n\n while (rangeIndex < concealLineRanges.length && concealLineRanges[rangeIndex][1] <= lineStart) {\n rangeIndex++\n }\n\n const range = concealLineRanges[rangeIndex]\n const fullyConcealed = !!range && lineEnd > lineStart && range[0] <= lineStart && range[1] >= lineEnd\n const lineBreakConcealed =\n newlineOffset !== -1 && !!range && range[0] <= newlineOffset && range[1] >= newlineOffset\n\n if (!fullyConcealed || !lineBreakConcealed) {\n const hasText = lineEnd > lineStart && !fullyConcealed\n if (hasText || newlineOffset !== -1 || !fullyConcealed) {\n setCurrentRenderedLineSource(sourceLine, hasText)\n }\n\n if (newlineOffset !== -1 && !lineBreakConcealed) {\n lineSources.push(sourceLine + 1)\n currentRenderedLineHasText = false\n }\n }\n\n sourceLine++\n if (newlineOffset === -1) break\n lineStart = newlineOffset + 1\n }\n\n if (lineSources.length === 0 || CodeRenderable.isIdentityLineSources(lineSources)) return undefined\n return lineSources\n }\n\n public getLineHighlights(lineIdx: number) {\n return this.textBuffer.getLineHighlights(lineIdx)\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n if (this._highlightsDirty) {\n if (this.isDestroyed) return\n\n if (this._content.length === 0) {\n this._shouldRenderTextBuffer = false\n this._highlightsDirty = false\n } else if (!this._filetype) {\n this._shouldRenderTextBuffer = true\n this._highlightsDirty = false\n } else {\n this.ensureVisibleTextBeforeHighlight()\n this._highlightsDirty = false\n this._highlightingPromise = this.startHighlight()\n }\n }\n\n if (!this._shouldRenderTextBuffer) return\n super.renderSelf(buffer)\n }\n}\n",
15
+ "import type { TextRenderable } from \"./Text.js\"\nimport { BaseRenderable, type BaseRenderableOptions } from \"../Renderable.js\"\nimport { RGBA, parseColor } from \"../lib/RGBA.js\"\nimport { isStyledText, StyledText } from \"../lib/styled-text.js\"\nimport { type TextChunk } from \"../text-buffer.js\"\nimport type { RenderContext } from \"../types.js\"\n\nexport interface TextNodeOptions extends BaseRenderableOptions {\n fg?: string | RGBA\n bg?: string | RGBA\n attributes?: number\n link?: { url: string }\n}\n\nconst BrandedTextNodeRenderable: unique symbol = Symbol.for(\"@opentui/core/TextNodeRenderable\")\n\nexport function isTextNodeRenderable(obj: any): obj is TextNodeRenderable {\n return !!obj?.[BrandedTextNodeRenderable]\n}\n\nfunction styledTextToTextNodes(styledText: StyledText): TextNodeRenderable[] {\n return styledText.chunks.map((chunk) => {\n const node = new TextNodeRenderable({\n fg: chunk.fg,\n bg: chunk.bg,\n attributes: chunk.attributes,\n link: chunk.link,\n })\n node.add(chunk.text)\n return node\n })\n}\n\nexport class TextNodeRenderable extends BaseRenderable {\n [BrandedTextNodeRenderable] = true\n\n private _fg?: RGBA\n private _bg?: RGBA\n private _attributes: number\n private _link?: { url: string }\n private _children: (string | TextNodeRenderable)[] = []\n public parent: TextNodeRenderable | null = null\n\n constructor(options: TextNodeOptions) {\n super(options)\n\n this._fg = options.fg ? parseColor(options.fg) : undefined\n this._bg = options.bg ? parseColor(options.bg) : undefined\n this._attributes = options.attributes ?? 0\n this._link = options.link\n }\n\n public get children(): (string | TextNodeRenderable)[] {\n return this._children\n }\n\n public set children(children: (string | TextNodeRenderable)[]) {\n for (const child of this._children) {\n if (isTextNodeRenderable(child) && child.parent === this) {\n child.parent = null\n }\n }\n\n for (const child of children) {\n if (isTextNodeRenderable(child)) {\n if (child.parent && child.parent !== this) {\n child.parent.remove(child)\n }\n child.parent = this\n }\n }\n\n this._children = children\n this.requestRender()\n }\n\n public requestRender(): void {\n this.markDirty()\n this.parent?.requestRender()\n }\n\n public add(obj: TextNodeRenderable | StyledText | string, index?: number): number {\n if (typeof obj === \"string\") {\n if (index !== undefined) {\n this._children.splice(index, 0, obj)\n this.requestRender()\n return index\n }\n\n const insertIndex = this._children.length\n this._children.push(obj)\n this.requestRender()\n return insertIndex\n }\n\n if (isTextNodeRenderable(obj)) {\n const insertIndex = this.prepareChildInsert(obj, index)\n this._children.splice(insertIndex, 0, obj)\n obj.parent = this\n this.requestRender()\n return insertIndex\n }\n\n if (isStyledText(obj)) {\n const textNodes = styledTextToTextNodes(obj)\n if (index !== undefined) {\n this._children.splice(index, 0, ...textNodes)\n textNodes.forEach((node) => (node.parent = this))\n this.requestRender()\n return index\n }\n\n const insertIndex = this._children.length\n this._children.push(...textNodes)\n textNodes.forEach((node) => (node.parent = this))\n this.requestRender()\n return insertIndex\n }\n\n throw new Error(\"TextNodeRenderable only accepts strings, TextNodeRenderable instances, or StyledText instances\")\n }\n\n private prepareChildInsert(child: TextNodeRenderable, index?: number): number {\n let insertIndex = index ?? this._children.length\n\n if (child.parent && child.parent !== this) {\n child.parent.remove(child)\n } else if (child.parent === this) {\n const currentIndex = this._children.indexOf(child)\n if (currentIndex !== -1) {\n this._children.splice(currentIndex, 1)\n if (currentIndex < insertIndex) insertIndex -= 1\n }\n }\n\n return Math.max(0, Math.min(insertIndex, this._children.length))\n }\n\n public replace(obj: TextNodeRenderable | string, index: number) {\n const existing = this._children[index]\n if (isTextNodeRenderable(existing) && existing.parent === this) {\n existing.parent = null\n }\n\n if (isTextNodeRenderable(obj)) {\n if (obj.parent && obj.parent !== this) {\n obj.parent.remove(obj)\n } else if (obj.parent === this) {\n const currentIndex = this._children.indexOf(obj)\n if (currentIndex !== -1 && currentIndex !== index) {\n this._children.splice(currentIndex, 1)\n if (currentIndex < index) index -= 1\n }\n }\n obj.parent = this\n }\n\n this._children[index] = obj\n this.requestRender()\n }\n\n public insertBefore(\n child: string | TextNodeRenderable | StyledText,\n anchorNode: TextNodeRenderable | string | unknown,\n ): this {\n if (!anchorNode || !isTextNodeRenderable(anchorNode)) {\n throw new Error(\"Anchor must be a TextNodeRenderable\")\n }\n\n const anchorIndex = this._children.indexOf(anchorNode)\n if (anchorIndex === -1) {\n throw new Error(\"Anchor node not found in children\")\n }\n\n if (child === anchorNode) {\n return this\n }\n\n if (isTextNodeRenderable(child)) {\n this.add(child, anchorIndex)\n return this\n }\n\n if (typeof child === \"string\") {\n this._children.splice(anchorIndex, 0, child)\n } else if (isStyledText(child)) {\n const textNodes = styledTextToTextNodes(child)\n this._children.splice(anchorIndex, 0, ...textNodes)\n textNodes.forEach((node) => (node.parent = this))\n } else {\n throw new Error(\"Child must be a string, TextNodeRenderable, or StyledText instance\")\n }\n\n this.requestRender()\n return this\n }\n\n public remove(child: BaseRenderable): void {\n if (!isTextNodeRenderable(child)) {\n throw new Error(\"remove expects a TextNodeRenderable child object\")\n }\n\n const childIndex = this._children.indexOf(child)\n if (childIndex === -1) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(`TextNodeRenderable with id ${child.id} is not a child of ${this.id}, skipping remove`)\n }\n return\n }\n\n this._children.splice(childIndex, 1)\n child.parent = null\n this.requestRender()\n }\n\n public clear(): void {\n for (const child of this._children) {\n if (isTextNodeRenderable(child) && child.parent === this) {\n child.parent = null\n }\n }\n this._children = []\n this.requestRender()\n }\n\n public mergeStyles(parentStyle: { fg?: RGBA; bg?: RGBA; attributes: number; link?: { url: string } }): {\n fg?: RGBA\n bg?: RGBA\n attributes: number\n link?: { url: string }\n } {\n return {\n fg: this._fg ?? parentStyle.fg,\n bg: this._bg ?? parentStyle.bg,\n attributes: this._attributes | parentStyle.attributes,\n link: this._link ?? parentStyle.link,\n }\n }\n\n public gatherWithInheritedStyle(\n parentStyle: { fg?: RGBA; bg?: RGBA; attributes: number; link?: { url: string } } = {\n fg: undefined,\n bg: undefined,\n attributes: 0,\n },\n ): TextChunk[] {\n const currentStyle = this.mergeStyles(parentStyle)\n\n const chunks: TextChunk[] = []\n\n for (const child of this._children) {\n if (typeof child === \"string\") {\n chunks.push({\n __isChunk: true,\n text: child,\n fg: currentStyle.fg,\n bg: currentStyle.bg,\n attributes: currentStyle.attributes,\n link: currentStyle.link,\n })\n } else {\n const childChunks = child.gatherWithInheritedStyle(currentStyle)\n chunks.push(...childChunks)\n }\n }\n\n this.markClean()\n\n return chunks\n }\n\n public static fromString(text: string, options: Partial<TextNodeOptions> = {}): TextNodeRenderable {\n const node = new TextNodeRenderable(options)\n node.add(text)\n return node\n }\n\n public static fromNodes(nodes: TextNodeRenderable[], options: Partial<TextNodeOptions> = {}): TextNodeRenderable {\n const node = new TextNodeRenderable(options)\n for (const childNode of nodes) {\n node.add(childNode)\n }\n return node\n }\n\n public toChunks(\n parentStyle: { fg?: RGBA; bg?: RGBA; attributes: number; link?: { url: string } } = {\n fg: undefined,\n bg: undefined,\n attributes: 0,\n },\n ): TextChunk[] {\n return this.gatherWithInheritedStyle(parentStyle)\n }\n\n public getChildren(): BaseRenderable[] {\n return this._children.filter((child): child is TextNodeRenderable => typeof child !== \"string\")\n }\n\n public getChildrenCount(): number {\n return this._children.length\n }\n\n public getRenderable(id: string): BaseRenderable | undefined {\n return this._children.find((child): child is TextNodeRenderable => typeof child !== \"string\" && child.id === id)\n }\n\n public getRenderableIndex(id: string): number {\n return this._children.findIndex((child) => isTextNodeRenderable(child) && child.id === id)\n }\n\n public get fg(): RGBA | undefined {\n return this._fg\n }\n\n public set fg(fg: RGBA | string | undefined) {\n if (!fg) {\n this._fg = undefined\n this.requestRender()\n return\n }\n this._fg = parseColor(fg)\n this.requestRender()\n }\n\n public set bg(bg: RGBA | string | undefined) {\n if (!bg) {\n this._bg = undefined\n this.requestRender()\n return\n }\n this._bg = parseColor(bg)\n this.requestRender()\n }\n\n public get bg(): RGBA | undefined {\n return this._bg\n }\n\n public set attributes(attributes: number) {\n this._attributes = attributes\n this.requestRender()\n }\n\n public get attributes(): number {\n return this._attributes\n }\n\n public set link(link: { url: string } | undefined) {\n this._link = link\n this.requestRender()\n }\n\n public get link(): { url: string } | undefined {\n return this._link\n }\n\n public findDescendantById(id: string): BaseRenderable | undefined {\n return undefined\n }\n}\n\nexport class RootTextNodeRenderable extends TextNodeRenderable {\n textParent: TextRenderable\n\n constructor(\n private readonly ctx: RenderContext,\n options: TextNodeOptions,\n textParent: TextRenderable,\n ) {\n super(options)\n this.textParent = textParent\n }\n\n public requestRender(): void {\n this.markDirty()\n this.ctx.requestRender()\n }\n}\n",
16
+ "import { BaseRenderable } from \"../Renderable.js\"\nimport { stringToStyledText, StyledText } from \"../lib/styled-text.js\"\nimport { type TextChunk } from \"../text-buffer.js\"\nimport { RGBA } from \"../lib/RGBA.js\"\nimport { type RenderContext } from \"../types.js\"\nimport { RootTextNodeRenderable, TextNodeRenderable } from \"./TextNode.js\"\nimport { TextBufferRenderable, type TextBufferOptions } from \"./TextBufferRenderable.js\"\n\nexport interface TextOptions extends TextBufferOptions {\n content?: StyledText | string\n}\n\nexport class TextRenderable extends TextBufferRenderable {\n private _text: StyledText\n\n // TODO: The TextRenderable is currently juggling both a StyledText and a RootTextNodeRenderable.\n // We should refactor this to only use the RootTextNodeRenderable here and have a separate StyledTextRenderable with `content`.\n private _hasManualStyledText: boolean = false\n\n protected rootTextNode: RootTextNodeRenderable\n\n protected _contentDefaultOptions = {\n content: \"\",\n } satisfies Partial<TextOptions>\n\n constructor(ctx: RenderContext, options: TextOptions) {\n super(ctx, options)\n\n const content = options.content ?? this._contentDefaultOptions.content\n const styledText = typeof content === \"string\" ? stringToStyledText(content) : content\n this._text = styledText\n this._hasManualStyledText = options.content !== undefined && content !== \"\"\n\n this.rootTextNode = new RootTextNodeRenderable(\n ctx,\n {\n id: `${this.id}-root`,\n fg: this._defaultFg,\n bg: this._defaultBg,\n attributes: this._defaultAttributes,\n },\n this,\n )\n\n this.updateTextBuffer(styledText)\n }\n\n private updateTextBuffer(styledText: StyledText): void {\n this.textBuffer.setStyledText(styledText)\n this.clearChunks(styledText)\n }\n\n private clearChunks(styledText: StyledText): void {\n // Clearing chunks that were already writtend to the text buffer,\n // to not retain references to the text data in js\n // TODO: This is causing issues in the solid renderer\n // styledText.chunks.forEach((chunk) => {\n // // @ts-ignore\n // chunk.text = undefined\n // })\n }\n\n get content(): StyledText {\n return this._text\n }\n\n get chunks(): TextChunk[] {\n return this._text.chunks\n }\n\n get textNode(): RootTextNodeRenderable {\n return this.rootTextNode\n }\n\n set content(value: StyledText | string) {\n this._hasManualStyledText = true\n const styledText = typeof value === \"string\" ? stringToStyledText(value) : value\n if (this._text !== styledText) {\n this._text = styledText\n this.updateTextBuffer(styledText)\n this.updateTextInfo()\n }\n }\n\n private updateTextFromNodes(): void {\n if (this.rootTextNode.isDirty && !this._hasManualStyledText) {\n const chunks = this.rootTextNode.gatherWithInheritedStyle({\n fg: this._defaultFg,\n bg: this._defaultBg,\n attributes: this._defaultAttributes,\n link: undefined,\n })\n this.textBuffer.setStyledText(new StyledText(chunks))\n this.refreshLocalSelection()\n this.yogaNode.markDirty()\n }\n }\n\n public add(obj: TextNodeRenderable | StyledText | string, index?: number): number {\n return this.rootTextNode.add(obj, index)\n }\n\n public remove(child: BaseRenderable): void {\n this.rootTextNode.remove(child)\n }\n\n public insertBefore(obj: BaseRenderable | any, anchor?: TextNodeRenderable): number {\n this.rootTextNode.insertBefore(obj, anchor)\n return this.rootTextNode.children.indexOf(obj)\n }\n\n public getTextChildren(): BaseRenderable[] {\n return this.rootTextNode.getChildren()\n }\n\n public clear(): void {\n this.rootTextNode.clear()\n\n const emptyStyledText = stringToStyledText(\"\")\n this._text = emptyStyledText\n this.updateTextBuffer(emptyStyledText)\n this.updateTextInfo()\n\n this.requestRender()\n }\n\n public onLifecyclePass = () => {\n this.updateTextFromNodes()\n }\n\n protected onFgChanged(newColor: RGBA): void {\n this.rootTextNode.fg = newColor\n }\n\n protected onBgChanged(newColor: RGBA): void {\n this.rootTextNode.bg = newColor\n }\n\n protected onAttributesChanged(newAttributes: number): void {\n this.rootTextNode.attributes = newAttributes\n }\n\n destroy(): void {\n this.rootTextNode.children.length = 0\n super.destroy()\n }\n}\n",
17
+ "import { toArrayBuffer, type Pointer } from \"./platform/ffi.js\"\nimport { resolveRenderLib } from \"./zig.js\"\nimport { SpanInfoStruct } from \"./zig-structs.js\"\nimport type { NativeSpanFeedOptions } from \"./zig-structs.js\"\n\nexport type { GrowthPolicy, NativeSpanFeedOptions, NativeSpanFeedStats } from \"./zig-structs.js\"\n\nconst enum EventId {\n ChunkAdded = 2,\n Closed = 5,\n Error = 6,\n DataAvailable = 7,\n StateBuffer = 8,\n}\n\nfunction toNumber(value: number | bigint): number {\n return typeof value === \"bigint\" ? Number(value) : value\n}\n\ntype StreamEventHandler = (eventId: number, arg0: Pointer, arg1: number | bigint) => void\n\nexport type DataHandler = (data: Uint8Array) => void | Promise<void>\n\nconst canThrowAcrossNativeCallback =\n typeof process !== \"undefined\" &&\n typeof process.versions === \"object\" &&\n process.versions !== null &&\n typeof process.versions.bun === \"string\"\n\n/**\n * Zero-copy wrapper over Zig memory; not a full stream interface.\n * Chunk and state typed-array views are borrowed and invalid after destroy.\n */\nexport class NativeSpanFeed {\n static create(options?: NativeSpanFeedOptions): NativeSpanFeed {\n const lib = resolveRenderLib()\n const streamPtr = lib.createNativeSpanFeed(options)\n const stream = new NativeSpanFeed(streamPtr)\n\n lib.registerNativeSpanFeedStream(streamPtr, stream.eventHandler)\n\n const status = lib.attachNativeSpanFeed(streamPtr)\n if (status !== 0) {\n lib.unregisterNativeSpanFeedStream(streamPtr)\n lib.destroyNativeSpanFeed(streamPtr)\n throw new Error(`Failed to attach stream: ${status}`)\n }\n\n return stream\n }\n\n static attach(streamPtr: Pointer, _options?: NativeSpanFeedOptions): NativeSpanFeed {\n const lib = resolveRenderLib()\n const stream = new NativeSpanFeed(streamPtr)\n\n lib.registerNativeSpanFeedStream(streamPtr, stream.eventHandler)\n\n const status = lib.attachNativeSpanFeed(streamPtr)\n if (status !== 0) {\n lib.unregisterNativeSpanFeedStream(streamPtr)\n throw new Error(`Failed to attach stream: ${status}`)\n }\n\n return stream\n }\n\n readonly streamPtr: Pointer\n private readonly lib = resolveRenderLib()\n private readonly eventHandler: StreamEventHandler\n private chunkMap = new Map<Pointer, ArrayBuffer>()\n private chunkSizes = new Map<Pointer, number>()\n private dataHandlers = new Set<DataHandler>()\n private errorHandlers = new Set<(code: number) => void>()\n private drainBuffer: Uint8Array | null = null\n private stateBuffer: Uint8Array | null = null\n private closed = false\n private destroyed = false\n private draining = false\n private pendingDataAvailable = false\n private pendingClose = false\n private closing = false\n private pendingAsyncHandlers = 0\n private inCallback = false\n private closeQueued = false\n private idleResolvers: Array<() => void> = []\n private pendingHandlerError: unknown = null\n private pendingHandlerErrorQueued = false\n\n private constructor(streamPtr: Pointer) {\n this.streamPtr = streamPtr\n this.eventHandler = (eventId, arg0, arg1) => {\n this.handleEvent(eventId, arg0, arg1)\n }\n this.ensureDrainBuffer()\n }\n\n private ensureDrainBuffer(): void {\n if (this.drainBuffer) return\n const capacity = 256\n this.drainBuffer = new Uint8Array(capacity * SpanInfoStruct.size)\n }\n\n onData(handler: DataHandler): () => void {\n this.dataHandlers.add(handler)\n if (this.pendingDataAvailable) {\n this.pendingDataAvailable = false\n this.drainAll()\n }\n return () => this.dataHandlers.delete(handler)\n }\n\n onError(handler: (code: number) => void): () => void {\n this.errorHandlers.add(handler)\n return () => this.errorHandlers.delete(handler)\n }\n\n private hasPinnedChunks(): boolean {\n if (!this.stateBuffer) return false\n for (const refcount of this.stateBuffer) {\n if (refcount > 0) return true\n }\n return false\n }\n\n isBackpressured(): boolean {\n return this.pendingAsyncHandlers > 0 || this.pendingDataAvailable || this.hasPinnedChunks()\n }\n\n close(): void {\n if (this.destroyed) return\n if (this.inCallback || this.draining || this.pendingAsyncHandlers > 0) {\n this.pendingClose = true\n if (!this.closeQueued) {\n this.closeQueued = true\n queueMicrotask(() => {\n this.closeQueued = false\n this.processPendingClose()\n })\n }\n return\n }\n this.performClose()\n }\n\n private processPendingClose(): void {\n if (!this.pendingClose || this.destroyed) return\n if (this.inCallback || this.draining || this.pendingAsyncHandlers > 0) return\n this.pendingClose = false\n this.performClose()\n this.resolveIdleIfNeeded()\n }\n\n private performClose(): void {\n if (this.closing) return\n this.closing = true\n if (!this.closed) {\n const status = this.lib.streamClose(this.streamPtr)\n if (status !== 0) {\n this.closing = false\n return\n }\n this.closed = true\n }\n this.finalizeDestroy()\n }\n\n private finalizeDestroy(): void {\n if (this.destroyed) return\n this.lib.unregisterNativeSpanFeedStream(this.streamPtr)\n this.lib.destroyNativeSpanFeed(this.streamPtr)\n this.destroyed = true\n this.chunkMap.clear()\n this.chunkSizes.clear()\n this.stateBuffer = null\n this.drainBuffer = null\n this.dataHandlers.clear()\n this.errorHandlers.clear()\n this.pendingDataAvailable = false\n this.resolveIdleIfNeeded()\n }\n\n private isIdle(): boolean {\n return (\n !this.inCallback &&\n !this.draining &&\n this.pendingAsyncHandlers === 0 &&\n !this.pendingDataAvailable &&\n !this.hasPinnedChunks()\n )\n }\n\n private resolveIdleIfNeeded(): void {\n if (!this.isIdle()) return\n const resolvers = this.idleResolvers.splice(0)\n for (const resolve of resolvers) {\n resolve()\n }\n }\n\n idle(): Promise<void> {\n if (this.isIdle()) return Promise.resolve()\n return new Promise<void>((resolve) => {\n this.idleResolvers.push(resolve)\n })\n }\n\n private handleEvent(eventId: number, arg0: Pointer, arg1: number | bigint): void {\n this.inCallback = true\n try {\n switch (eventId) {\n case EventId.StateBuffer: {\n const len = toNumber(arg1)\n if (len > 0 && arg0) {\n // toArrayBuffer must alias Zig memory so refcount writes are visible.\n const buffer = toArrayBuffer(arg0, 0, len)\n this.stateBuffer = new Uint8Array(buffer)\n }\n break\n }\n case EventId.DataAvailable: {\n if (this.closing) break\n if (this.dataHandlers.size === 0) {\n this.pendingDataAvailable = true\n break\n }\n this.drainAll()\n break\n }\n case EventId.ChunkAdded: {\n const chunkLen = toNumber(arg1)\n if (chunkLen > 0 && arg0) {\n if (!this.chunkMap.has(arg0)) {\n const buffer = toArrayBuffer(arg0, 0, chunkLen)\n this.chunkMap.set(arg0, buffer)\n }\n this.chunkSizes.set(arg0, chunkLen)\n }\n break\n }\n case EventId.Error: {\n const code = toNumber(arg0)\n for (const handler of this.errorHandlers) handler(code)\n break\n }\n case EventId.Closed: {\n this.closed = true\n break\n }\n default:\n break\n }\n } finally {\n this.inCallback = false\n this.resolveIdleIfNeeded()\n }\n }\n\n private decrementRefcount(chunkIndex: number): void {\n if (this.stateBuffer && chunkIndex < this.stateBuffer.length) {\n const prev = this.stateBuffer[chunkIndex]\n this.stateBuffer[chunkIndex] = prev > 0 ? prev - 1 : 0\n }\n }\n\n private queuePendingHandlerError(error: unknown): void {\n this.pendingHandlerError ??= error\n if (this.pendingHandlerErrorQueued) return\n\n this.pendingHandlerErrorQueued = true\n queueMicrotask(() => {\n this.pendingHandlerErrorQueued = false\n if (this.pendingHandlerError === null) return\n\n const pendingError = this.pendingHandlerError\n this.pendingHandlerError = null\n throw pendingError\n })\n }\n\n private throwPendingHandlerError(): void {\n if (this.pendingHandlerError === null) return\n\n const pendingError = this.pendingHandlerError\n this.pendingHandlerError = null\n throw pendingError\n }\n\n private drainOnce(): number {\n if (!this.drainBuffer || this.draining || this.pendingClose) return 0\n const capacity = Math.floor(this.drainBuffer.byteLength / SpanInfoStruct.size)\n if (capacity === 0) return 0\n\n const count = this.lib.streamDrainSpans(this.streamPtr, this.drainBuffer, capacity)\n if (count === 0) return 0\n\n this.draining = true\n const spans = SpanInfoStruct.unpackList(this.drainBuffer.buffer, count)\n let firstError: unknown = null\n\n try {\n for (const span of spans) {\n if (span.len === 0) continue\n\n let buffer = this.chunkMap.get(span.chunkPtr)\n if (!buffer) {\n const size = this.chunkSizes.get(span.chunkPtr)\n if (!size) continue\n buffer = toArrayBuffer(span.chunkPtr, 0, size)\n this.chunkMap.set(span.chunkPtr, buffer)\n }\n\n if (span.offset + span.len > buffer.byteLength) continue\n\n const slice = new Uint8Array(buffer, span.offset, span.len)\n let asyncResults: Promise<void>[] | null = null\n\n for (const handler of this.dataHandlers) {\n try {\n const result = handler(slice)\n // Async handlers keep the chunk pinned until they settle.\n if (result && typeof result.then === \"function\") {\n asyncResults ??= []\n asyncResults.push(result)\n }\n } catch (e) {\n firstError ??= e\n }\n }\n\n const shouldStopAfterThisSpan = this.pendingClose\n\n if (asyncResults) {\n // Use allSettled so rejections still release refcounts.\n const chunkIndex = span.chunkIndex\n this.pendingAsyncHandlers += 1\n Promise.allSettled(asyncResults).then(() => {\n this.decrementRefcount(chunkIndex)\n this.pendingAsyncHandlers -= 1\n this.processPendingClose()\n this.resolveIdleIfNeeded()\n })\n } else {\n this.decrementRefcount(span.chunkIndex)\n }\n\n if (shouldStopAfterThisSpan) break\n }\n } finally {\n this.draining = false\n this.resolveIdleIfNeeded()\n }\n\n if (firstError) {\n if (!this.inCallback || canThrowAcrossNativeCallback) {\n throw firstError\n }\n\n // Node FFI terminates when JS exceptions cross a native callback boundary.\n // Surface the error after the callback returns instead of swallowing it.\n this.queuePendingHandlerError(firstError)\n }\n\n return count\n }\n\n drainAll(): void {\n let count = this.drainOnce()\n while (count > 0) {\n count = this.drainOnce()\n }\n if (!this.inCallback) {\n this.throwPendingHandlerError()\n }\n }\n}\n",
18
+ "import { EventEmitter } from \"events\"\nimport { Console } from \"node:console\"\nimport fs from \"node:fs\"\nimport path from \"node:path\"\nimport util from \"node:util\"\nimport type { CliRenderer, MouseEvent } from \"./renderer.js\"\nimport type { ColorInput } from \"./lib/RGBA.js\"\nimport { OptimizedBuffer } from \"./buffer.js\"\nimport { type Clock, SystemClock } from \"./lib/clock.js\"\nimport { Capture, CapturedWritableStream } from \"./lib/output.capture.js\"\nimport { parseColor, RGBA } from \"./lib/RGBA.js\"\nimport { singleton } from \"./lib/singleton.js\"\nimport { env, registerEnvVar } from \"./lib/env.js\"\nimport type { KeyEvent } from \"./lib/KeyHandler.js\"\nimport {\n type KeyBinding as BaseKeyBinding,\n mergeKeyBindings,\n buildKeyBindingsMap,\n getKeyBindingAction,\n defaultKeyAliases,\n mergeKeyAliases,\n keyBindingToString,\n} from \"./lib/keybinding.internal.js\"\n\ntype KeyAliasMap = Record<string, string>\n\ninterface CallerInfo {\n functionName: string\n fullPath: string\n fileName: string\n lineNumber: number\n columnNumber: number\n}\n\nfunction getCallerInfo(): CallerInfo | null {\n const err = new Error()\n const stackLines = err.stack?.split(\"\\n\").slice(5) || []\n if (!stackLines.length) return null\n\n const callerLine = stackLines[0].trim()\n\n const regex = /at\\s+(?:([\\w$.<>]+)\\s+\\()?((?:\\/|[A-Za-z]:\\\\)[^:]+):(\\d+):(\\d+)\\)?/\n const match = callerLine.match(regex)\n\n if (!match) return null\n\n // Extract details from the match.\n const functionName = match[1] || \"<anonymous>\"\n const fullPath = match[2]\n const fileName = fullPath.split(/[\\\\/]/).pop() || \"<unknown>\"\n const lineNumber = parseInt(match[3], 10) || 0\n const columnNumber = parseInt(match[4], 10) || 0\n\n return { functionName, fullPath, fileName, lineNumber, columnNumber }\n}\n\nenum LogLevel {\n LOG = \"LOG\",\n INFO = \"INFO\",\n WARN = \"WARN\",\n ERROR = \"ERROR\",\n DEBUG = \"DEBUG\",\n}\n\nexport const capture = singleton(\"ConsoleCapture\", () => new Capture())\n\nregisterEnvVar({\n name: \"OTUI_USE_CONSOLE\",\n description: \"Whether to use the console. Will not capture console output if set to false.\",\n type: \"boolean\",\n default: true,\n})\n\nregisterEnvVar({\n name: \"SHOW_CONSOLE\",\n description: \"Show the console at startup if set to true.\",\n type: \"boolean\",\n default: false,\n})\n\nclass TerminalConsoleCache extends EventEmitter {\n private _cachedLogs: [Date, LogLevel, any[], CallerInfo | null][] = []\n private readonly MAX_CACHE_SIZE = 1000\n private _collectCallerInfo: boolean = false\n private _cachingEnabled: boolean = true\n private _originalConsole: typeof console | null = null\n\n get cachedLogs(): [Date, LogLevel, any[], CallerInfo | null][] {\n return this._cachedLogs\n }\n\n constructor() {\n super()\n\n // Note: Console activation will be handled by the renderer when needed\n // Don't activate on import to avoid hiding console.log globally\n }\n\n public activate(): void {\n if (!this._originalConsole) {\n this._originalConsole = global.console\n }\n this.setupConsoleCapture()\n this.overrideConsoleMethods()\n }\n\n private setupConsoleCapture(): void {\n if (!env.OTUI_USE_CONSOLE) return\n\n const mockStdout = new CapturedWritableStream(\"stdout\", capture)\n const mockStderr = new CapturedWritableStream(\"stderr\", capture)\n\n // TODO: The Console constructor doesn't return a full Console interface implementation,\n // it only provides a subset of methods (log, info, warn, error, debug, etc.).\n // TypeScript's Console interface requires all methods (assert, clear, count, etc.).\n // Using 'as any' as a workaround since we override the methods we use immediately after.\n global.console = new Console({\n stdout: mockStdout,\n stderr: mockStderr,\n colorMode: true,\n inspectOptions: {\n compact: false,\n breakLength: 80,\n depth: 2,\n },\n }) as any\n }\n\n private overrideConsoleMethods(): void {\n console.log = (...args: any[]) => {\n this.appendToConsole(LogLevel.LOG, ...args)\n }\n\n console.info = (...args: any[]) => {\n this.appendToConsole(LogLevel.INFO, ...args)\n }\n\n console.warn = (...args: any[]) => {\n this.appendToConsole(LogLevel.WARN, ...args)\n }\n\n console.error = (...args: any[]) => {\n this.appendToConsole(LogLevel.ERROR, ...args)\n }\n\n console.debug = (...args: any[]) => {\n this.appendToConsole(LogLevel.DEBUG, ...args)\n }\n\n // React 19.2's reconciler calls console.timeStamp with a 6-arg Performance Tracks signature.\n // The new Console instance from setupConsoleCapture lacks timeStamp, so provide a no-op\n // unless the runtime already supplies one.\n if (typeof console.timeStamp !== \"function\") {\n console.timeStamp = () => {}\n }\n }\n\n public setCollectCallerInfo(enabled: boolean): void {\n this._collectCallerInfo = enabled\n }\n\n public clearConsole(): void {\n this._cachedLogs = []\n }\n\n public setCachingEnabled(enabled: boolean): void {\n this._cachingEnabled = enabled\n }\n\n public deactivate(): void {\n this.restoreOriginalConsole()\n }\n\n private restoreOriginalConsole(): void {\n if (this._originalConsole) {\n global.console = this._originalConsole\n }\n }\n\n public addLogEntry(level: LogLevel, ...args: any[]) {\n const callerInfo = this._collectCallerInfo ? getCallerInfo() : null\n const logEntry: [Date, LogLevel, any[], CallerInfo | null] = [new Date(), level, args, callerInfo]\n\n if (this._cachingEnabled) {\n if (this._cachedLogs.length >= this.MAX_CACHE_SIZE) {\n this._cachedLogs.shift()\n }\n this._cachedLogs.push(logEntry)\n }\n\n return logEntry\n }\n\n private appendToConsole(level: LogLevel, ...args: any[]): void {\n if (this._cachedLogs.length >= this.MAX_CACHE_SIZE) {\n this._cachedLogs.shift()\n }\n const entry = this.addLogEntry(level, ...args)\n this.emit(\"entry\", entry)\n }\n\n public destroy(): void {\n this.deactivate()\n }\n}\n\nconst terminalConsoleCache = singleton(\"TerminalConsoleCache\", () => {\n const terminalConsoleCache = new TerminalConsoleCache()\n process.on(\"exit\", () => {\n terminalConsoleCache.destroy()\n })\n return terminalConsoleCache\n})\n\nexport enum ConsolePosition {\n TOP = \"top\",\n BOTTOM = \"bottom\",\n LEFT = \"left\",\n RIGHT = \"right\",\n}\n\ninterface ConsoleSelection {\n startLine: number\n startCol: number\n endLine: number\n endCol: number\n}\n\nexport type ConsoleAction =\n | \"scroll-up\"\n | \"scroll-down\"\n | \"scroll-to-top\"\n | \"scroll-to-bottom\"\n | \"position-previous\"\n | \"position-next\"\n | \"size-increase\"\n | \"size-decrease\"\n | \"save-logs\"\n | \"copy-selection\"\n\nexport type ConsoleKeyBinding = BaseKeyBinding<ConsoleAction>\n\nconst defaultConsoleKeybindings: ConsoleKeyBinding[] = [\n { name: \"up\", action: \"scroll-up\" },\n { name: \"down\", action: \"scroll-down\" },\n { name: \"up\", shift: true, action: \"scroll-to-top\" },\n { name: \"down\", shift: true, action: \"scroll-to-bottom\" },\n { name: \"p\", ctrl: true, action: \"position-previous\" },\n { name: \"o\", ctrl: true, action: \"position-next\" },\n { name: \"+\", action: \"size-increase\" },\n { name: \"=\", shift: true, action: \"size-increase\" },\n { name: \"-\", action: \"size-decrease\" },\n { name: \"s\", ctrl: true, action: \"save-logs\" },\n { name: \"c\", ctrl: true, shift: true, action: \"copy-selection\" },\n]\n\nexport interface ConsoleOptions {\n position?: ConsolePosition\n sizePercent?: number\n zIndex?: number\n colorInfo?: ColorInput\n colorWarn?: ColorInput\n colorError?: ColorInput\n colorDebug?: ColorInput\n colorDefault?: ColorInput\n backgroundColor?: ColorInput\n startInDebugMode?: boolean\n title?: string\n titleBarColor?: ColorInput\n titleBarTextColor?: ColorInput\n cursorColor?: ColorInput\n maxStoredLogs?: number\n maxDisplayLines?: number\n onCopySelection?: (text: string) => void\n keyBindings?: ConsoleKeyBinding[]\n keyAliasMap?: KeyAliasMap\n selectionColor?: ColorInput\n copyButtonColor?: ColorInput\n clock?: Clock\n}\n\nconst DEFAULT_CONSOLE_OPTIONS: Required<\n Omit<ConsoleOptions, \"onCopySelection\" | \"keyBindings\" | \"keyAliasMap\" | \"clock\">\n> & {\n onCopySelection?: (text: string) => void\n keyBindings?: ConsoleKeyBinding[]\n keyAliasMap?: KeyAliasMap\n} = {\n position: ConsolePosition.BOTTOM,\n sizePercent: 30,\n zIndex: Infinity,\n colorInfo: \"#00FFFF\", // Cyan\n colorWarn: \"#FFFF00\", // Yellow\n colorError: \"#FF0000\", // Red\n colorDebug: \"#808080\", // Gray\n colorDefault: \"#FFFFFF\", // White\n backgroundColor: RGBA.fromValues(0.1, 0.1, 0.1, 0.7),\n startInDebugMode: false,\n title: \"Console\",\n titleBarColor: RGBA.fromValues(0.05, 0.05, 0.05, 0.7),\n titleBarTextColor: \"#FFFFFF\",\n cursorColor: \"#00A0FF\",\n maxStoredLogs: 2000,\n maxDisplayLines: 3000,\n onCopySelection: undefined,\n keyBindings: undefined,\n keyAliasMap: undefined,\n selectionColor: RGBA.fromValues(0.3, 0.5, 0.8, 0.5),\n copyButtonColor: \"#00A0FF\",\n}\n\nconst INDENT_WIDTH = 2\n\ninterface DisplayLine {\n text: string\n level: LogLevel\n indent: boolean\n}\n\nexport class TerminalConsole extends EventEmitter {\n private isVisible: boolean = false\n private isFocused: boolean = false\n private renderer: CliRenderer\n private keyHandler: (event: KeyEvent) => void\n private options: Required<Omit<ConsoleOptions, \"onCopySelection\" | \"keyBindings\" | \"keyAliasMap\" | \"clock\">> & {\n onCopySelection?: (text: string) => void\n keyBindings?: ConsoleKeyBinding[]\n keyAliasMap?: KeyAliasMap\n }\n private _debugModeEnabled: boolean = false\n\n private frameBuffer: OptimizedBuffer | null = null\n private consoleX: number = 0\n private consoleY: number = 0\n private consoleWidth: number = 0\n private consoleHeight: number = 0\n private scrollTopIndex: number = 0\n private isScrolledToBottom: boolean = true\n private currentLineIndex: number = 0\n private _displayLines: DisplayLine[] = []\n private _allLogEntries: [Date, LogLevel, any[], CallerInfo | null][] = []\n private _needsFrameBufferUpdate: boolean = false\n private _entryListener: (logEntry: [Date, LogLevel, any[], CallerInfo | null]) => void\n\n private _selectionStart: { line: number; col: number } | null = null\n private _selectionEnd: { line: number; col: number } | null = null\n private _isDragging: boolean = false\n private _copyButtonBounds: { x: number; y: number; width: number; height: number } = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n }\n private _autoScrollInterval: ReturnType<Clock[\"setInterval\"]> | null = null\n private readonly clock: Clock\n\n private _keyBindingsMap: Map<string, ConsoleAction>\n private _keyAliasMap: KeyAliasMap\n private _keyBindings: ConsoleKeyBinding[]\n private _mergedKeyBindings: ConsoleKeyBinding[]\n private _actionHandlers: Map<ConsoleAction, () => boolean>\n\n private markNeedsRerender(): void {\n this._needsFrameBufferUpdate = true\n this.renderer.requestRender()\n }\n\n private getCopyButtonLabel(): string {\n const copyBindings = this._mergedKeyBindings.filter((b) => b.action === \"copy-selection\")\n const copyBinding = copyBindings[copyBindings.length - 1]\n if (copyBinding) {\n const shortcut = keyBindingToString(copyBinding)\n return `[Copy (${shortcut})]`\n }\n return \"[Copy]\"\n }\n\n private _rgbaInfo: RGBA\n private _rgbaWarn: RGBA\n private _rgbaError: RGBA\n private _rgbaDebug: RGBA\n private _rgbaDefault: RGBA\n private backgroundColor: RGBA\n private _rgbaTitleBar: RGBA\n private _rgbaTitleBarText: RGBA\n private _title: string\n private _rgbaCursor: RGBA\n private _rgbaSelection: RGBA\n private _rgbaCopyButton: RGBA\n\n private _positions: ConsolePosition[] = [\n ConsolePosition.TOP,\n ConsolePosition.RIGHT,\n ConsolePosition.BOTTOM,\n ConsolePosition.LEFT,\n ]\n\n constructor(renderer: CliRenderer, options: ConsoleOptions = {}) {\n super()\n this.renderer = renderer\n this.clock = options.clock ?? new SystemClock()\n this.options = { ...DEFAULT_CONSOLE_OPTIONS, ...options }\n this.keyHandler = this.handleKeyPress.bind(this)\n this._debugModeEnabled = this.options.startInDebugMode\n terminalConsoleCache.setCollectCallerInfo(this._debugModeEnabled)\n\n this._rgbaInfo = parseColor(this.options.colorInfo)\n this._rgbaWarn = parseColor(this.options.colorWarn)\n this._rgbaError = parseColor(this.options.colorError)\n this._rgbaDebug = parseColor(this.options.colorDebug)\n this._rgbaDefault = parseColor(this.options.colorDefault)\n this.backgroundColor = parseColor(this.options.backgroundColor)\n this._rgbaTitleBar = parseColor(this.options.titleBarColor)\n this._rgbaTitleBarText = parseColor(this.options.titleBarTextColor || this.options.colorDefault)\n this._title = this.options.title\n this._rgbaCursor = parseColor(this.options.cursorColor)\n this._rgbaSelection = parseColor(this.options.selectionColor)\n this._rgbaCopyButton = parseColor(this.options.copyButtonColor)\n\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, options.keyAliasMap || {})\n this._keyBindings = options.keyBindings || []\n this._mergedKeyBindings = mergeKeyBindings(defaultConsoleKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(this._mergedKeyBindings, this._keyAliasMap)\n this._actionHandlers = this.buildActionHandlers()\n\n this._updateConsoleDimensions()\n this._scrollToBottom(true)\n\n this._entryListener = (logEntry: [Date, LogLevel, any[], CallerInfo | null]) => {\n this._handleNewLog(logEntry)\n }\n terminalConsoleCache.on(\"entry\", this._entryListener)\n\n if (env.SHOW_CONSOLE) {\n this.show()\n }\n }\n\n private buildActionHandlers(): Map<ConsoleAction, () => boolean> {\n return new Map([\n [\"scroll-up\", () => this.scrollUp()],\n [\"scroll-down\", () => this.scrollDown()],\n [\"scroll-to-top\", () => this.scrollToTop()],\n [\"scroll-to-bottom\", () => this.scrollToBottomAction()],\n [\"position-previous\", () => this.positionPrevious()],\n [\"position-next\", () => this.positionNext()],\n [\"size-increase\", () => this.sizeIncrease()],\n [\"size-decrease\", () => this.sizeDecrease()],\n [\"save-logs\", () => this.saveLogsAction()],\n [\"copy-selection\", () => this.triggerCopyAction()],\n ])\n }\n\n public activate(): void {\n terminalConsoleCache.activate()\n }\n\n public deactivate(): void {\n terminalConsoleCache.deactivate()\n }\n\n // Handles a single new log entry *while the console is visible*\n private _handleNewLog(logEntry: [Date, LogLevel, any[], CallerInfo | null]): void {\n if (!this.isVisible) return\n\n this._allLogEntries.push(logEntry)\n\n if (this._allLogEntries.length > this.options.maxStoredLogs) {\n this._allLogEntries.splice(0, this._allLogEntries.length - this.options.maxStoredLogs)\n }\n\n const newDisplayLines = this._processLogEntry(logEntry)\n this._displayLines.push(...newDisplayLines)\n\n if (this._displayLines.length > this.options.maxDisplayLines) {\n this._displayLines.splice(0, this._displayLines.length - this.options.maxDisplayLines)\n const linesRemoved = this._displayLines.length - this.options.maxDisplayLines\n this.scrollTopIndex = Math.max(0, this.scrollTopIndex - linesRemoved)\n }\n\n if (this.isScrolledToBottom) {\n this._scrollToBottom()\n }\n this.markNeedsRerender()\n }\n\n private _updateConsoleDimensions(termWidth?: number, termHeight?: number): void {\n const width = termWidth ?? this.renderer.width\n const height = termHeight ?? this.renderer.height\n const sizePercent = this.options.sizePercent / 100\n\n switch (this.options.position) {\n case ConsolePosition.TOP:\n this.consoleX = 0\n this.consoleY = 0\n this.consoleWidth = width\n this.consoleHeight = Math.max(1, Math.floor(height * sizePercent))\n break\n case ConsolePosition.BOTTOM:\n this.consoleHeight = Math.max(1, Math.floor(height * sizePercent))\n this.consoleWidth = width\n this.consoleX = 0\n this.consoleY = height - this.consoleHeight\n break\n case ConsolePosition.LEFT:\n this.consoleWidth = Math.max(1, Math.floor(width * sizePercent))\n this.consoleHeight = height\n this.consoleX = 0\n this.consoleY = 0\n break\n case ConsolePosition.RIGHT:\n this.consoleWidth = Math.max(1, Math.floor(width * sizePercent))\n this.consoleHeight = height\n this.consoleY = 0\n this.consoleX = width - this.consoleWidth\n break\n }\n this.currentLineIndex = Math.max(0, Math.min(this.currentLineIndex, this.consoleHeight - 1))\n }\n\n private handleKeyPress(event: KeyEvent): void {\n if (event.name === \"escape\") {\n this.blur()\n return\n }\n\n const action = getKeyBindingAction(this._keyBindingsMap, event)\n\n if (action) {\n const handler = this._actionHandlers.get(action)\n if (handler) {\n handler()\n return\n }\n }\n }\n\n private scrollUp(): boolean {\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n\n if (this.currentLineIndex > 0) {\n this.currentLineIndex--\n this.markNeedsRerender()\n } else if (this.scrollTopIndex > 0) {\n this.scrollTopIndex--\n this.isScrolledToBottom = false\n this.markNeedsRerender()\n }\n return true\n }\n\n private scrollDown(): boolean {\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n const canCursorMoveDown =\n this.currentLineIndex < logAreaHeight - 1 && this.scrollTopIndex + this.currentLineIndex < displayLineCount - 1\n\n if (canCursorMoveDown) {\n this.currentLineIndex++\n this.markNeedsRerender()\n } else if (this.scrollTopIndex < maxScrollTop) {\n this.scrollTopIndex++\n this.isScrolledToBottom = this.scrollTopIndex === maxScrollTop\n this.markNeedsRerender()\n }\n return true\n }\n\n private scrollToTop(): boolean {\n if (this.scrollTopIndex > 0 || this.currentLineIndex > 0) {\n this.scrollTopIndex = 0\n this.currentLineIndex = 0\n this.isScrolledToBottom = this._displayLines.length <= Math.max(1, this.consoleHeight - 1)\n this.markNeedsRerender()\n }\n return true\n }\n\n private scrollToBottomAction(): boolean {\n const logAreaHeightForScroll = Math.max(1, this.consoleHeight - 1)\n const maxScrollPossible = Math.max(0, this._displayLines.length - logAreaHeightForScroll)\n if (this.scrollTopIndex < maxScrollPossible || !this.isScrolledToBottom) {\n this._scrollToBottom(true)\n this.markNeedsRerender()\n }\n return true\n }\n\n private positionPrevious(): boolean {\n const currentPositionIndex = this._positions.indexOf(this.options.position)\n const prevIndex = (currentPositionIndex - 1 + this._positions.length) % this._positions.length\n this.options.position = this._positions[prevIndex]\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private positionNext(): boolean {\n const currentPositionIndex = this._positions.indexOf(this.options.position)\n const nextIndex = (currentPositionIndex + 1) % this._positions.length\n this.options.position = this._positions[nextIndex]\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private sizeIncrease(): boolean {\n this.options.sizePercent = Math.min(100, this.options.sizePercent + 5)\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private sizeDecrease(): boolean {\n this.options.sizePercent = Math.max(10, this.options.sizePercent - 5)\n this.resize(this.renderer.width, this.renderer.height)\n return true\n }\n\n private saveLogsAction(): boolean {\n this.saveLogsToFile()\n return true\n }\n\n private triggerCopyAction(): boolean {\n this.triggerCopy()\n return true\n }\n\n private attachStdin(): void {\n if (this.isFocused) return\n this.renderer.keyInput.on(\"keypress\", this.keyHandler)\n this.isFocused = true\n }\n\n private detachStdin(): void {\n if (!this.isFocused) return\n this.renderer.keyInput.off(\"keypress\", this.keyHandler)\n this.isFocused = false\n }\n\n private formatTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n }).format(date)\n }\n\n private formatArguments(args: any[]): string {\n return args\n .map((arg) => {\n if (arg instanceof Error) {\n const errorProps = arg\n return `Error: ${errorProps.message}\\n` + (errorProps.stack ? `${errorProps.stack}\\n` : \"\")\n }\n if (typeof arg === \"object\" && arg !== null) {\n try {\n return util.inspect(arg, { depth: 2 })\n } catch (e) {\n return String(arg)\n }\n }\n try {\n return util.inspect(arg, { depth: 2 })\n } catch (e) {\n return String(arg)\n }\n })\n .join(\" \")\n }\n\n public resize(width: number, height: number): void {\n this._updateConsoleDimensions(width, height)\n\n if (this.frameBuffer) {\n this.frameBuffer.resize(this.consoleWidth, this.consoleHeight)\n\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n this.scrollTopIndex = Math.min(this.scrollTopIndex, maxScrollTop)\n this.isScrolledToBottom = this.scrollTopIndex === maxScrollTop\n const visibleLineCount = Math.min(logAreaHeight, displayLineCount - this.scrollTopIndex)\n this.currentLineIndex = Math.max(0, Math.min(this.currentLineIndex, visibleLineCount - 1))\n\n if (this.isVisible) {\n this.markNeedsRerender()\n }\n }\n }\n\n public clear(): void {\n terminalConsoleCache.clearConsole()\n this._allLogEntries = []\n this._displayLines = []\n this.markNeedsRerender()\n }\n\n public toggle(): void {\n if (this.isVisible) {\n if (this.isFocused) {\n this.hide()\n } else {\n this.focus()\n }\n } else {\n this.show()\n }\n if (!this.renderer.isRunning) {\n this.renderer.requestRender()\n }\n }\n\n public focus(): void {\n this.attachStdin()\n this._scrollToBottom(true)\n this.markNeedsRerender()\n }\n\n public blur(): void {\n this.detachStdin()\n this.markNeedsRerender()\n }\n\n public show(): void {\n if (!this.isVisible) {\n this.isVisible = true\n this._processCachedLogs()\n terminalConsoleCache.setCachingEnabled(false)\n\n if (!this.frameBuffer) {\n this.frameBuffer = OptimizedBuffer.create(this.consoleWidth, this.consoleHeight, this.renderer.widthMethod, {\n respectAlpha: this.backgroundColor.a < 1,\n id: \"console framebuffer\",\n })\n }\n const logCount = terminalConsoleCache.cachedLogs.length\n const visibleLogLines = Math.min(this.consoleHeight, logCount)\n this.currentLineIndex = Math.max(0, visibleLogLines - 1)\n this.scrollTopIndex = 0\n this._scrollToBottom(true)\n\n this.focus()\n this.markNeedsRerender()\n }\n }\n\n public hide(): void {\n if (this.isVisible) {\n this.isVisible = false\n this.blur()\n terminalConsoleCache.setCachingEnabled(true)\n }\n }\n\n public destroy(): void {\n this.stopAutoScroll()\n this.hide()\n this.deactivate()\n terminalConsoleCache.off(\"entry\", this._entryListener)\n }\n\n public getCachedLogs(): string {\n return terminalConsoleCache.cachedLogs\n .map((logEntry) => logEntry[0].toISOString() + \" \" + logEntry.slice(1).join(\" \"))\n .join(\"\\n\")\n }\n\n private updateFrameBuffer(): void {\n if (!this.frameBuffer) return\n\n this.frameBuffer.clear(this.backgroundColor)\n\n const displayLines = this._displayLines\n const displayLineCount = displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n\n // --- Draw Title Bar ---\n this.frameBuffer.fillRect(0, 0, this.consoleWidth, 1, this._rgbaTitleBar)\n const dynamicTitle = `${this._title}${this.isFocused ? \" (Focused)\" : \"\"}`\n const titleX = Math.max(0, Math.floor((this.consoleWidth - dynamicTitle.length) / 2))\n this.frameBuffer.drawText(dynamicTitle, titleX, 0, this._rgbaTitleBarText, this._rgbaTitleBar)\n\n // --- Draw [Copy] Button ---\n const copyLabel = this.getCopyButtonLabel()\n const copyButtonX = this.consoleWidth - copyLabel.length - 1\n if (copyButtonX >= 0) {\n const copyButtonEnabled = this.hasSelection()\n const disabledColor = RGBA.fromInts(100, 100, 100, 255)\n const copyColor = copyButtonEnabled ? this._rgbaCopyButton : disabledColor\n this.frameBuffer.drawText(copyLabel, copyButtonX, 0, copyColor, this._rgbaTitleBar)\n this._copyButtonBounds = { x: copyButtonX, y: 0, width: copyLabel.length, height: 1 }\n } else {\n this._copyButtonBounds = { x: -1, y: -1, width: 0, height: 0 }\n }\n\n const startIndex = this.scrollTopIndex\n const endIndex = Math.min(startIndex + logAreaHeight, displayLineCount)\n const visibleDisplayLines = displayLines.slice(startIndex, endIndex)\n\n let lineY = 1\n for (let i = 0; i < visibleDisplayLines.length; i++) {\n if (lineY >= this.consoleHeight) break\n\n const displayLine = visibleDisplayLines[i]\n const absoluteLineIndex = startIndex + i\n\n let levelColor = this._rgbaDefault\n switch (displayLine.level) {\n case LogLevel.INFO:\n levelColor = this._rgbaInfo\n break\n case LogLevel.WARN:\n levelColor = this._rgbaWarn\n break\n case LogLevel.ERROR:\n levelColor = this._rgbaError\n break\n case LogLevel.DEBUG:\n levelColor = this._rgbaDebug\n break\n }\n\n const linePrefix = displayLine.indent ? \" \".repeat(INDENT_WIDTH) : \"\"\n const textToDraw = displayLine.text\n const textAvailableWidth = this.consoleWidth - 1 - (displayLine.indent ? INDENT_WIDTH : 0)\n const showCursor = this.isFocused && lineY - 1 === this.currentLineIndex\n\n if (showCursor) {\n this.frameBuffer.drawText(\">\", 0, lineY, this._rgbaCursor, this.backgroundColor)\n } else {\n this.frameBuffer.drawText(\" \", 0, lineY, this._rgbaDefault, this.backgroundColor)\n }\n\n const fullText = `${linePrefix}${textToDraw.substring(0, textAvailableWidth)}`\n const selectionRange = this.getLineSelectionRange(absoluteLineIndex)\n\n if (selectionRange) {\n const adjustedStart = Math.max(0, selectionRange.start)\n const adjustedEnd = Math.min(fullText.length, selectionRange.end)\n\n if (adjustedStart > 0) {\n this.frameBuffer.drawText(fullText.substring(0, adjustedStart), 1, lineY, levelColor)\n }\n\n if (adjustedStart < adjustedEnd) {\n this.frameBuffer.fillRect(1 + adjustedStart, lineY, adjustedEnd - adjustedStart, 1, this._rgbaSelection)\n this.frameBuffer.drawText(\n fullText.substring(adjustedStart, adjustedEnd),\n 1 + adjustedStart,\n lineY,\n levelColor,\n this._rgbaSelection,\n )\n }\n\n if (adjustedEnd < fullText.length) {\n this.frameBuffer.drawText(fullText.substring(adjustedEnd), 1 + adjustedEnd, lineY, levelColor)\n }\n } else {\n this.frameBuffer.drawText(fullText, 1, lineY, levelColor)\n }\n\n lineY++\n }\n }\n\n public renderToBuffer(buffer: OptimizedBuffer): void {\n if (!this.isVisible || !this.frameBuffer) return\n\n if (this._needsFrameBufferUpdate) {\n this.updateFrameBuffer()\n this._needsFrameBufferUpdate = false\n }\n\n buffer.drawFrameBuffer(this.consoleX, this.consoleY, this.frameBuffer)\n }\n\n public setDebugMode(enabled: boolean): void {\n this._debugModeEnabled = enabled\n terminalConsoleCache.setCollectCallerInfo(enabled)\n if (this.isVisible) {\n this.markNeedsRerender()\n }\n }\n\n public toggleDebugMode(): void {\n this.setDebugMode(!this._debugModeEnabled)\n }\n\n public set keyBindings(bindings: ConsoleKeyBinding[]) {\n this._keyBindings = bindings\n this._mergedKeyBindings = mergeKeyBindings(defaultConsoleKeybindings, bindings)\n this._keyBindingsMap = buildKeyBindingsMap(this._mergedKeyBindings, this._keyAliasMap)\n this.markNeedsRerender()\n }\n\n public set keyAliasMap(aliases: KeyAliasMap) {\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, aliases)\n this._mergedKeyBindings = mergeKeyBindings(defaultConsoleKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(this._mergedKeyBindings, this._keyAliasMap)\n this.markNeedsRerender()\n }\n\n public set onCopySelection(callback: ((text: string) => void) | undefined) {\n this.options.onCopySelection = callback\n }\n\n public get onCopySelection(): ((text: string) => void) | undefined {\n return this.options.onCopySelection\n }\n\n private _scrollToBottom(forceCursorToLastLine: boolean = false): void {\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n this.scrollTopIndex = maxScrollTop\n this.isScrolledToBottom = true\n\n const visibleLineCount = Math.min(logAreaHeight, displayLineCount - this.scrollTopIndex)\n if (forceCursorToLastLine || this.currentLineIndex >= visibleLineCount) {\n this.currentLineIndex = Math.max(0, visibleLineCount - 1)\n }\n }\n\n private _processLogEntry(logEntry: [Date, LogLevel, any[], CallerInfo | null]): DisplayLine[] {\n const [date, level, args, callerInfo] = logEntry\n const displayLines: DisplayLine[] = []\n\n const timestamp = this.formatTimestamp(date)\n const callerSource = callerInfo ? `${callerInfo.fileName}:${callerInfo.lineNumber}` : \"unknown\"\n const prefix = `[${timestamp}] [${level}]` + (this._debugModeEnabled ? ` [${callerSource}]` : \"\") + \" \"\n\n const formattedArgs = this.formatArguments(args)\n const initialLines = formattedArgs.split(\"\\n\")\n\n for (let i = 0; i < initialLines.length; i++) {\n const lineText = initialLines[i]\n const isFirstLineOfEntry = i === 0\n const availableWidth = this.consoleWidth - 1 - (isFirstLineOfEntry ? 0 : INDENT_WIDTH)\n const linePrefix = isFirstLineOfEntry ? prefix : \" \".repeat(INDENT_WIDTH)\n const textToWrap = isFirstLineOfEntry ? linePrefix + lineText : lineText\n\n let currentPos = 0\n while (currentPos < textToWrap.length || (isFirstLineOfEntry && currentPos === 0 && textToWrap.length === 0)) {\n const segment = textToWrap.substring(currentPos, currentPos + availableWidth)\n const isFirstSegmentOfLine = currentPos === 0\n\n displayLines.push({\n text: isFirstSegmentOfLine && !isFirstLineOfEntry ? linePrefix + segment : segment,\n level: level,\n indent: !isFirstLineOfEntry || !isFirstSegmentOfLine,\n })\n\n currentPos += availableWidth\n if (isFirstLineOfEntry && currentPos === 0 && textToWrap.length === 0) break\n }\n }\n\n return displayLines\n }\n\n private _processCachedLogs(): void {\n const logsToProcess = [...terminalConsoleCache.cachedLogs]\n terminalConsoleCache.clearConsole()\n\n this._allLogEntries.push(...logsToProcess)\n\n if (this._allLogEntries.length > this.options.maxStoredLogs) {\n this._allLogEntries.splice(0, this._allLogEntries.length - this.options.maxStoredLogs)\n }\n\n for (const logEntry of logsToProcess) {\n const processed = this._processLogEntry(logEntry)\n this._displayLines.push(...processed)\n }\n\n if (this._displayLines.length > this.options.maxDisplayLines) {\n this._displayLines.splice(0, this._displayLines.length - this.options.maxDisplayLines)\n }\n }\n\n private hasSelection(): boolean {\n if (this._selectionStart === null || this._selectionEnd === null) return false\n\n return this._selectionStart.line !== this._selectionEnd.line || this._selectionStart.col !== this._selectionEnd.col\n }\n\n private normalizeSelection(): ConsoleSelection | null {\n if (!this._selectionStart || !this._selectionEnd) return null\n\n const start = this._selectionStart\n const end = this._selectionEnd\n\n const startBeforeEnd = start.line < end.line || (start.line === end.line && start.col <= end.col)\n\n if (startBeforeEnd) {\n return {\n startLine: start.line,\n startCol: start.col,\n endLine: end.line,\n endCol: end.col,\n }\n } else {\n return {\n startLine: end.line,\n startCol: end.col,\n endLine: start.line,\n endCol: start.col,\n }\n }\n }\n\n private getSelectedText(): string {\n const selection = this.normalizeSelection()\n if (!selection) return \"\"\n\n const lines: string[] = []\n for (let i = selection.startLine; i <= selection.endLine; i++) {\n if (i < 0 || i >= this._displayLines.length) continue\n const line = this._displayLines[i]\n const linePrefix = line.indent ? \" \".repeat(INDENT_WIDTH) : \"\"\n const textAvailableWidth = this.consoleWidth - 1 - (line.indent ? INDENT_WIDTH : 0)\n const fullText = linePrefix + line.text.substring(0, textAvailableWidth)\n let text = fullText\n\n if (i === selection.startLine && i === selection.endLine) {\n text = fullText.substring(selection.startCol, selection.endCol)\n } else if (i === selection.startLine) {\n text = fullText.substring(selection.startCol)\n } else if (i === selection.endLine) {\n text = fullText.substring(0, selection.endCol)\n }\n\n lines.push(text)\n }\n\n return lines.join(\"\\n\")\n }\n\n private clearSelection(): void {\n this._selectionStart = null\n this._selectionEnd = null\n this._isDragging = false\n this.stopAutoScroll()\n }\n\n private stopAutoScroll(): void {\n if (this._autoScrollInterval !== null) {\n this.clock.clearInterval(this._autoScrollInterval)\n this._autoScrollInterval = null\n }\n }\n\n private startAutoScroll(direction: \"up\" | \"down\"): void {\n this.stopAutoScroll()\n this._autoScrollInterval = this.clock.setInterval(() => {\n if (direction === \"up\") {\n if (this.scrollTopIndex > 0) {\n this.scrollTopIndex--\n this.isScrolledToBottom = false\n if (this._selectionEnd) {\n this._selectionEnd = {\n line: this.scrollTopIndex,\n col: this._selectionEnd.col,\n }\n }\n this.markNeedsRerender()\n } else {\n this.stopAutoScroll()\n }\n } else {\n const displayLineCount = this._displayLines.length\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const maxScrollTop = Math.max(0, displayLineCount - logAreaHeight)\n if (this.scrollTopIndex < maxScrollTop) {\n this.scrollTopIndex++\n this.isScrolledToBottom = this.scrollTopIndex === maxScrollTop\n if (this._selectionEnd) {\n const maxLine = this.scrollTopIndex + logAreaHeight - 1\n this._selectionEnd = {\n line: Math.min(maxLine, displayLineCount - 1),\n col: this._selectionEnd.col,\n }\n }\n this.markNeedsRerender()\n } else {\n this.stopAutoScroll()\n }\n }\n }, 50)\n }\n\n private triggerCopy(): void {\n if (!this.hasSelection()) return\n const text = this.getSelectedText()\n if (text && this.options.onCopySelection) {\n try {\n this.options.onCopySelection(text)\n } catch {}\n this.clearSelection()\n this.markNeedsRerender()\n }\n }\n\n private getLineSelectionRange(lineIndex: number): { start: number; end: number } | null {\n const selection = this.normalizeSelection()\n if (!selection) return null\n\n if (lineIndex < selection.startLine || lineIndex > selection.endLine) {\n return null\n }\n\n const line = this._displayLines[lineIndex]\n if (!line) return null\n\n const linePrefix = line.indent ? \" \".repeat(INDENT_WIDTH) : \"\"\n const textAvailableWidth = this.consoleWidth - 1 - (line.indent ? INDENT_WIDTH : 0)\n const fullTextLength = linePrefix.length + Math.min(line.text.length, textAvailableWidth)\n\n let start = 0\n let end = fullTextLength\n\n if (lineIndex === selection.startLine) {\n start = Math.max(0, selection.startCol)\n }\n if (lineIndex === selection.endLine) {\n end = Math.min(fullTextLength, selection.endCol)\n }\n\n if (start >= end) return null\n return { start, end }\n }\n\n public handleMouse(event: MouseEvent): boolean {\n if (!this.isVisible) return false\n\n const localX = event.x - this.consoleX\n const localY = event.y - this.consoleY\n\n if (localX < 0 || localX >= this.consoleWidth || localY < 0 || localY >= this.consoleHeight) {\n return false\n }\n\n if (event.type === \"scroll\" && event.scroll) {\n if (event.scroll.direction === \"up\") {\n this.scrollUp()\n } else if (event.scroll.direction === \"down\") {\n this.scrollDown()\n }\n return true\n }\n\n if (localY === 0) {\n if (\n event.type === \"down\" &&\n event.button === 0 &&\n localX >= this._copyButtonBounds.x &&\n localX < this._copyButtonBounds.x + this._copyButtonBounds.width\n ) {\n this.triggerCopy()\n return true\n }\n return true\n }\n\n const lineIndex = this.scrollTopIndex + (localY - 1)\n const colIndex = Math.max(0, localX - 1)\n\n if (event.type === \"down\" && event.button === 0) {\n this.clearSelection()\n this._selectionStart = { line: lineIndex, col: colIndex }\n this._selectionEnd = { line: lineIndex, col: colIndex }\n this._isDragging = true\n this.markNeedsRerender()\n return true\n }\n\n if (event.type === \"drag\" && this._isDragging) {\n this._selectionEnd = { line: lineIndex, col: colIndex }\n\n // Check if drag is at the edge and trigger auto-scroll\n const logAreaHeight = Math.max(1, this.consoleHeight - 1)\n const relativeY = localY - 1 // Subtract 1 for title bar\n\n if (relativeY <= 0) {\n // Dragging at top edge\n this.startAutoScroll(\"up\")\n } else if (relativeY >= logAreaHeight - 1) {\n // Dragging at bottom edge\n this.startAutoScroll(\"down\")\n } else {\n // Not at edge, stop auto-scrolling\n this.stopAutoScroll()\n }\n\n this.markNeedsRerender()\n return true\n }\n\n if (event.type === \"up\") {\n if (this._isDragging) {\n this._selectionEnd = { line: lineIndex, col: colIndex }\n this._isDragging = false\n this.stopAutoScroll()\n this.markNeedsRerender()\n }\n return true\n }\n\n return true\n }\n\n public get visible(): boolean {\n return this.isVisible\n }\n\n public get bounds(): { x: number; y: number; width: number; height: number } {\n return {\n x: this.consoleX,\n y: this.consoleY,\n width: this.consoleWidth,\n height: this.consoleHeight,\n }\n }\n\n private saveLogsToFile(): void {\n try {\n const timestamp = Date.now()\n const filename = `_console_${timestamp}.log`\n const filepath = path.join(process.cwd(), filename)\n\n const allLogEntries = [...this._allLogEntries, ...terminalConsoleCache.cachedLogs]\n\n const logLines: string[] = []\n\n for (const [date, level, args, callerInfo] of allLogEntries) {\n const timestampStr = this.formatTimestamp(date)\n const callerSource = callerInfo ? `${callerInfo.fileName}:${callerInfo.lineNumber}` : \"unknown\"\n const prefix = `[${timestampStr}] [${level}]` + (this._debugModeEnabled ? ` [${callerSource}]` : \"\") + \" \"\n const formattedArgs = this.formatArguments(args)\n logLines.push(prefix + formattedArgs)\n }\n\n const content = logLines.join(\"\\n\")\n fs.writeFileSync(filepath, content, \"utf8\")\n\n console.info(`Console logs saved to: ${filename}`)\n } catch (error) {\n console.error(`Failed to save console logs:`, error)\n }\n }\n}\n",
19
+ "import { Writable } from \"stream\"\nimport { EventEmitter } from \"events\"\n\nexport type CapturedOutput = {\n stream: \"stdout\" | \"stderr\"\n output: string\n}\n\nexport class Capture extends EventEmitter {\n // TODO: Cache could rather be a buffer to avoid join()?\n private output: CapturedOutput[] = []\n\n constructor() {\n super()\n }\n\n get size(): number {\n return this.output.length\n }\n\n write(stream: \"stdout\" | \"stderr\", data: string): void {\n this.output.push({ stream, output: data })\n this.emit(\"write\", stream, data)\n }\n\n claimOutput() {\n const output = this.output.map((o) => o.output).join(\"\")\n this.clear()\n return output\n }\n\n private clear(): void {\n this.output = []\n }\n}\n\nexport class CapturedWritableStream extends Writable {\n public isTTY: boolean = true\n public columns: number = process.stdout.columns || 80\n public rows: number = process.stdout.rows || 24\n\n constructor(\n private stream: \"stdout\" | \"stderr\",\n private capture: Capture,\n ) {\n super()\n }\n\n _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void {\n const data = chunk.toString()\n this.capture.write(this.stream, data)\n callback()\n }\n\n getColorDepth(): number {\n return process.stdout.getColorDepth?.() || 8\n }\n}\n",
20
+ "export interface KeyBindingLike {\n name: string\n ctrl?: boolean\n shift?: boolean\n meta?: boolean\n super?: boolean\n}\n\nexport interface KeyBinding<Action extends string = string> extends KeyBindingLike {\n action: Action\n}\n\nexport interface KeyBindingLookup extends KeyBindingLike {\n // Kitty's base-layout codepoint as a Unicode number. Example: 99 means \"c\".\n baseCode?: number\n}\n\nexport type KeyAliasMap = Record<string, string>\n\nexport const defaultKeyAliases: KeyAliasMap = {\n enter: \"return\",\n esc: \"escape\",\n kp0: \"0\",\n kp1: \"1\",\n kp2: \"2\",\n kp3: \"3\",\n kp4: \"4\",\n kp5: \"5\",\n kp6: \"6\",\n kp7: \"7\",\n kp8: \"8\",\n kp9: \"9\",\n kpdecimal: \".\",\n kpdivide: \"/\",\n kpmultiply: \"*\",\n kpminus: \"-\",\n kpplus: \"+\",\n kpenter: \"enter\",\n kpequal: \"=\",\n kpseparator: \",\",\n kpleft: \"left\",\n kpright: \"right\",\n kpup: \"up\",\n kpdown: \"down\",\n kppageup: \"pageup\",\n kppagedown: \"pagedown\",\n kphome: \"home\",\n kpend: \"end\",\n kpinsert: \"insert\",\n kpdelete: \"delete\",\n}\n\nexport function mergeKeyAliases(defaults: KeyAliasMap, custom: KeyAliasMap): KeyAliasMap {\n return { ...defaults, ...custom }\n}\n\nexport function mergeKeyBindings<Action extends string>(\n defaults: KeyBinding<Action>[],\n custom: KeyBinding<Action>[],\n): KeyBinding<Action>[] {\n const map = new Map<string, KeyBinding<Action>>()\n for (const binding of defaults) {\n const key = getKeyBindingKey(binding)\n map.set(key, binding)\n }\n for (const binding of custom) {\n const key = getKeyBindingKey(binding)\n map.set(key, binding)\n }\n return Array.from(map.values())\n}\n\nexport function getKeyBindingKey(binding: KeyBindingLike): string {\n return `${binding.name}:${binding.ctrl ? 1 : 0}:${binding.shift ? 1 : 0}:${binding.meta ? 1 : 0}:${binding.super ? 1 : 0}`\n}\n\n// `baseCode` is Kitty's \"base layout codepoint\": the character for the same\n// physical key on the keyboard's base layout. Example: an event may arrive as\n// `name: \"ㅊ\", baseCode: 99`, where `99` is Unicode `c`. We normalize that\n// numeric codepoint to the key names we store in key maps so Ctrl+ㅊ can still\n// match a Ctrl+C binding.\nfunction getBaseCodeKeyName(baseCode: number | undefined): string | undefined {\n if (baseCode === undefined || baseCode < 32 || baseCode === 127) {\n return undefined\n }\n\n try {\n const name = String.fromCodePoint(baseCode)\n\n if (name.length === 1 && name >= \"A\" && name <= \"Z\") {\n return name.toLowerCase()\n }\n\n return name\n } catch {\n return undefined\n }\n}\n\n// Return every lookup key that can represent this event. We try the parsed\n// name first, then the base-layout key when Kitty provides one. That keeps\n// direct character bindings precise, and still lets physical-layout\n// shortcuts resolve.\nexport function getKeyBindingKeys(binding: KeyBindingLookup): string[] {\n const names = new Set([binding.name])\n const baseCodeName = getBaseCodeKeyName(binding.baseCode)\n\n if (baseCodeName) {\n names.add(baseCodeName)\n }\n\n return [...names].map((name) => getKeyBindingKey({ ...binding, name }))\n}\n\nexport function getKeyBindingAction<Action extends string>(\n map: Map<string, Action>,\n binding: KeyBindingLookup,\n): Action | undefined {\n for (const key of getKeyBindingKeys(binding)) {\n const action = map.get(key)\n\n if (action !== undefined) {\n return action\n }\n }\n\n return undefined\n}\n\nexport function matchesKeyBinding(binding: KeyBindingLookup, match: KeyBindingLike): boolean {\n const matchKey = getKeyBindingKey(match)\n\n return getKeyBindingKeys(binding).includes(matchKey)\n}\n\nexport function buildKeyBindingsMap<Action extends string>(\n bindings: KeyBinding<Action>[],\n aliasMap?: KeyAliasMap,\n): Map<string, Action> {\n const map = new Map<string, Action>()\n const aliases = aliasMap || {}\n\n for (const binding of bindings) {\n const key = getKeyBindingKey(binding)\n map.set(key, binding.action)\n }\n\n // Add aliased versions of all bindings\n for (const binding of bindings) {\n const normalizedName = aliases[binding.name] || binding.name\n if (normalizedName !== binding.name) {\n // Create aliased key with normalized name\n const aliasedKey = getKeyBindingKey({ ...binding, name: normalizedName })\n map.set(aliasedKey, binding.action)\n }\n }\n\n return map\n}\n\n/**\n * Converts a key binding to a human-readable string representation\n * @param binding The key binding to stringify\n * @returns A string like \"ctrl+shift+y\" or just \"escape\"\n * @example\n * keyBindingToString({ name: \"y\", ctrl: true, shift: true }) // \"ctrl+shift+y\"\n * keyBindingToString({ name: \"escape\" }) // \"escape\"\n * keyBindingToString({ name: \"c\", ctrl: true }) // \"ctrl+c\"\n * keyBindingToString({ name: \"s\", super: true }) // \"super+s\"\n */\nexport function keyBindingToString<Action extends string>(binding: KeyBinding<Action>): string {\n const parts: string[] = []\n\n if (binding.ctrl) parts.push(\"ctrl\")\n if (binding.shift) parts.push(\"shift\")\n if (binding.meta) parts.push(\"meta\")\n if (binding.super) parts.push(\"super\")\n\n parts.push(binding.name)\n\n return parts.join(\"+\")\n}\n",
21
+ "import { Renderable, type RenderableOptions } from \"../Renderable.js\"\nimport { convertGlobalToLocalSelection, Selection, type LocalSelectionBounds } from \"../lib/selection.js\"\nimport { EditBuffer, type LogicalCursor } from \"../edit-buffer.js\"\nimport { EditorView, type VisualCursor } from \"../editor-view.js\"\nimport { RGBA, parseColor } from \"../lib/RGBA.js\"\nimport type { RenderContext, Highlight, CursorStyleOptions, LineInfoProvider, LineInfo } from \"../types.js\"\nimport type { OptimizedBuffer } from \"../buffer.js\"\nimport type { SyntaxStyle } from \"../syntax-style.js\"\nimport { NativeMeasureTargetKind, resolveRenderLib, type NativeRenderableHandle } from \"../zig.js\"\n\nconst BrandedEditBufferRenderable: unique symbol = Symbol.for(\"@opentui/core/EditBufferRenderable\")\n\nexport type EditorCapture = \"escape\" | \"navigate\" | \"submit\" | \"tab\"\n\nexport interface EditorTraits {\n capture?: readonly EditorCapture[]\n suspend?: boolean\n status?: string\n}\n\nexport enum EditBufferRenderableEvents {\n TRAITS_CHANGED = \"traits-changed\",\n}\n\nfunction sameCapture(a?: readonly EditorCapture[], b?: readonly EditorCapture[]) {\n if (a === b) return true\n if (!a || !b) return !a && !b\n if (a.length !== b.length) return false\n return a.every((item, i) => item === b[i])\n}\n\nfunction sameTraits(a: EditorTraits, b: EditorTraits) {\n return a.suspend === b.suspend && a.status === b.status && sameCapture(a.capture, b.capture)\n}\n\nexport function isEditBufferRenderable(obj: unknown): obj is EditBufferRenderable {\n return !!(obj && typeof obj === \"object\" && BrandedEditBufferRenderable in obj)\n}\n\nexport interface CursorChangeEvent {\n line: number\n visualColumn: number\n}\n\nexport interface ContentChangeEvent {\n // No payload - use getText() to retrieve content if needed\n}\n\nexport interface EditBufferOptions extends RenderableOptions<EditBufferRenderable> {\n textColor?: string | RGBA\n backgroundColor?: string | RGBA\n selectionBg?: string | RGBA\n selectionFg?: string | RGBA\n selectable?: boolean\n attributes?: number\n wrapMode?: \"none\" | \"char\" | \"word\"\n scrollMargin?: number\n scrollSpeed?: number\n showCursor?: boolean\n cursorColor?: string | RGBA\n cursorStyle?: CursorStyleOptions\n syntaxStyle?: SyntaxStyle\n tabIndicator?: string | number\n tabIndicatorColor?: string | RGBA\n onCursorChange?: (event: CursorChangeEvent) => void\n onContentChange?: (event: ContentChangeEvent) => void\n}\n\nexport abstract class EditBufferRenderable extends Renderable implements LineInfoProvider {\n [BrandedEditBufferRenderable] = true\n protected _focusable: boolean = true\n public selectable: boolean = true\n private _traits: EditorTraits = {}\n\n protected _textColor: RGBA\n protected _backgroundColor: RGBA\n protected _defaultAttributes: number\n protected _selectionBg: RGBA | undefined\n protected _selectionFg: RGBA | undefined\n protected _wrapMode: \"none\" | \"char\" | \"word\" = \"word\"\n protected _scrollMargin: number = 0.2\n protected _showCursor: boolean = true\n protected _cursorColor: RGBA\n protected _cursorStyle: CursorStyleOptions\n protected lastLocalSelection: LocalSelectionBounds | null = null\n protected _tabIndicator?: string | number\n protected _tabIndicatorColor?: RGBA\n\n private _cursorChangeListener: ((event: CursorChangeEvent) => void) | undefined = undefined\n private _contentChangeListener: ((event: ContentChangeEvent) => void) | undefined = undefined\n\n private _autoScrollVelocity: number = 0\n private _autoScrollAccumulator: number = 0\n private _scrollSpeed: number = 16\n private _keyboardSelectionActive: boolean = false\n\n public readonly editBuffer: EditBuffer\n public readonly editorView: EditorView\n private nativeRenderable: NativeRenderableHandle | null = null\n\n protected _defaultOptions = {\n textColor: RGBA.fromValues(1, 1, 1, 1),\n backgroundColor: \"transparent\",\n selectionBg: undefined,\n selectionFg: undefined,\n selectable: true,\n attributes: 0,\n wrapMode: \"word\" as \"none\" | \"char\" | \"word\",\n scrollMargin: 0.2,\n scrollSpeed: 16,\n showCursor: true,\n cursorColor: RGBA.fromValues(1, 1, 1, 1),\n cursorStyle: {\n style: \"block\",\n blinking: true,\n },\n tabIndicator: undefined,\n tabIndicatorColor: undefined,\n } satisfies Partial<EditBufferOptions>\n\n constructor(ctx: RenderContext, options: EditBufferOptions) {\n super(ctx, options)\n\n this._textColor = parseColor(options.textColor ?? this._defaultOptions.textColor)\n this._backgroundColor = parseColor(options.backgroundColor ?? this._defaultOptions.backgroundColor)\n this._defaultAttributes = options.attributes ?? this._defaultOptions.attributes\n this._selectionBg = options.selectionBg ? parseColor(options.selectionBg) : this._defaultOptions.selectionBg\n this._selectionFg = options.selectionFg ? parseColor(options.selectionFg) : this._defaultOptions.selectionFg\n this.selectable = options.selectable ?? this._defaultOptions.selectable\n this._wrapMode = options.wrapMode ?? this._defaultOptions.wrapMode\n this._scrollMargin = options.scrollMargin ?? this._defaultOptions.scrollMargin\n this._scrollSpeed = options.scrollSpeed ?? this._defaultOptions.scrollSpeed\n this._showCursor = options.showCursor ?? this._defaultOptions.showCursor\n this._cursorColor = parseColor(options.cursorColor ?? this._defaultOptions.cursorColor)\n this._cursorStyle = options.cursorStyle ?? this._defaultOptions.cursorStyle\n this._tabIndicator = options.tabIndicator ?? this._defaultOptions.tabIndicator\n this._tabIndicatorColor = options.tabIndicatorColor\n ? parseColor(options.tabIndicatorColor)\n : this._defaultOptions.tabIndicatorColor\n\n this.editBuffer = EditBuffer.create(this._ctx.widthMethod)\n this.editorView = EditorView.create(this.editBuffer, this.width || 80, this.height || 24)\n\n this.editorView.setWrapMode(this._wrapMode)\n this.editorView.setScrollMargin(this._scrollMargin)\n\n this.editBuffer.setDefaultFg(this._textColor)\n this.editBuffer.setDefaultBg(this._backgroundColor)\n this.editBuffer.setDefaultAttributes(this._defaultAttributes)\n\n if (options.syntaxStyle) {\n this.editBuffer.setSyntaxStyle(options.syntaxStyle)\n }\n\n if (this._tabIndicator !== undefined) {\n this.editorView.setTabIndicator(this._tabIndicator)\n }\n if (this._tabIndicatorColor !== undefined) {\n this.editorView.setTabIndicatorColor(this._tabIndicatorColor)\n }\n\n this.setupNativeRenderable()\n this.setupEventListeners(options)\n }\n\n public get lineInfo(): LineInfo {\n return this.editorView.getLogicalLineInfo()\n }\n\n private setupEventListeners(options: EditBufferOptions): void {\n this._cursorChangeListener = options.onCursorChange\n this._contentChangeListener = options.onContentChange\n\n this.editBuffer.on(\"cursor-changed\", () => {\n if (this._cursorChangeListener) {\n const cursor = this.editBuffer.getCursorPosition()\n this._cursorChangeListener({\n line: cursor.row,\n visualColumn: cursor.col,\n })\n }\n })\n\n this.editBuffer.on(\"content-changed\", () => {\n this.yogaNode.markDirty()\n this.requestRender()\n this.emit(\"line-info-change\")\n if (this._contentChangeListener) {\n this._contentChangeListener({})\n }\n })\n }\n\n public get lineCount(): number {\n return this.editBuffer.getLineCount()\n }\n\n public get virtualLineCount(): number {\n return this.editorView.getVirtualLineCount()\n }\n\n public get scrollY(): number {\n return this.editorView.getViewport().offsetY\n }\n\n get plainText(): string {\n return this.editBuffer.getText()\n }\n\n get logicalCursor(): LogicalCursor {\n return this.editBuffer.getCursorPosition()\n }\n\n get visualCursor(): VisualCursor {\n return this.editorView.getVisualCursor()\n }\n\n get cursorOffset(): number {\n return this.editorView.getVisualCursor().offset\n }\n\n set cursorOffset(offset: number) {\n this.editorView.setCursorByOffset(offset)\n this.requestRender()\n }\n\n get cursorCharacterOffset(): number | undefined {\n const len = this.plainText.length\n if (len <= 0) return\n\n const cursor = this.logicalCursor\n const offset = this.cursorOffset\n if (offset >= len) {\n if (cursor.col > 0) return len - 1\n return 0\n }\n\n if (this.plainText[offset] === \"\\n\" && cursor.col > 0) {\n return offset - 1\n }\n\n return offset\n }\n\n get textColor(): RGBA {\n return this._textColor\n }\n\n set textColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.textColor)\n if (this._textColor !== newColor) {\n this._textColor = newColor\n this.editBuffer.setDefaultFg(newColor)\n this.requestRender()\n }\n }\n\n get selectionBg(): RGBA | undefined {\n return this._selectionBg\n }\n\n get traits(): EditorTraits {\n return this._traits\n }\n\n set traits(value: EditorTraits) {\n if (sameTraits(this._traits, value)) return\n const prev = this._traits\n this._traits = value\n this.emit(EditBufferRenderableEvents.TRAITS_CHANGED, value, prev)\n }\n\n set selectionBg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionBg\n if (this._selectionBg !== newColor) {\n this._selectionBg = newColor\n this.refreshSelectionStyle()\n this.requestRender()\n }\n }\n\n get selectionFg(): RGBA | undefined {\n return this._selectionFg\n }\n\n set selectionFg(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : this._defaultOptions.selectionFg\n if (this._selectionFg !== newColor) {\n this._selectionFg = newColor\n this.refreshSelectionStyle()\n this.requestRender()\n }\n }\n\n get backgroundColor(): RGBA {\n return this._backgroundColor\n }\n\n set backgroundColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? this._defaultOptions.backgroundColor)\n if (this._backgroundColor !== newColor) {\n this._backgroundColor = newColor\n this.editBuffer.setDefaultBg(newColor)\n this.requestRender()\n }\n }\n\n get attributes(): number {\n return this._defaultAttributes\n }\n\n set attributes(value: number) {\n if (this._defaultAttributes !== value) {\n this._defaultAttributes = value\n this.editBuffer.setDefaultAttributes(value)\n this.requestRender()\n }\n }\n\n get wrapMode(): \"none\" | \"char\" | \"word\" {\n return this._wrapMode\n }\n\n set wrapMode(value: \"none\" | \"char\" | \"word\") {\n if (this._wrapMode !== value) {\n this._wrapMode = value\n this.editorView.setWrapMode(value)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n }\n\n get showCursor(): boolean {\n return this._showCursor\n }\n\n set showCursor(value: boolean) {\n if (this._showCursor !== value) {\n this._showCursor = value\n if (!value && this._focused) {\n this._ctx.setCursorPosition(0, 0, false)\n }\n this.requestRender()\n }\n }\n\n get cursorColor(): RGBA {\n return this._cursorColor\n }\n\n set cursorColor(value: RGBA | string) {\n const newColor = parseColor(value)\n if (this._cursorColor !== newColor) {\n this._cursorColor = newColor\n if (this._focused) {\n this.requestRender()\n }\n }\n }\n\n get cursorStyle(): CursorStyleOptions {\n return this._cursorStyle\n }\n\n set cursorStyle(style: CursorStyleOptions) {\n const newStyle = style\n if (this.cursorStyle.style !== newStyle.style || this.cursorStyle.blinking !== newStyle.blinking) {\n this._cursorStyle = newStyle\n if (this._focused) {\n this.requestRender()\n }\n }\n }\n\n get tabIndicator(): string | number | undefined {\n return this._tabIndicator\n }\n\n set tabIndicator(value: string | number | undefined) {\n if (this._tabIndicator !== value) {\n this._tabIndicator = value\n if (value !== undefined) {\n this.editorView.setTabIndicator(value)\n }\n this.requestRender()\n }\n }\n\n get tabIndicatorColor(): RGBA | undefined {\n return this._tabIndicatorColor\n }\n\n set tabIndicatorColor(value: RGBA | string | undefined) {\n const newColor = value ? parseColor(value) : undefined\n if (this._tabIndicatorColor !== newColor) {\n this._tabIndicatorColor = newColor\n if (newColor !== undefined) {\n this.editorView.setTabIndicatorColor(newColor)\n }\n this.requestRender()\n }\n }\n\n get scrollSpeed(): number {\n return this._scrollSpeed\n }\n\n set scrollSpeed(value: number) {\n this._scrollSpeed = Math.max(0, value)\n }\n\n protected override onMouseEvent(event: any): void {\n if (event.type === \"scroll\") {\n this.handleScroll(event)\n }\n }\n\n protected handleScroll(event: any): void {\n if (!event.scroll) return\n\n const { direction, delta } = event.scroll\n const viewport = this.editorView.getViewport()\n\n if (direction === \"up\") {\n const newOffsetY = Math.max(0, viewport.offsetY - delta)\n this.editorView.setViewport(viewport.offsetX, newOffsetY, viewport.width, viewport.height, true)\n this.requestRender()\n } else if (direction === \"down\") {\n const totalVirtualLines = this.editorView.getTotalVirtualLineCount()\n const maxOffsetY = Math.max(0, totalVirtualLines - viewport.height)\n const newOffsetY = Math.min(viewport.offsetY + delta, maxOffsetY)\n this.editorView.setViewport(viewport.offsetX, newOffsetY, viewport.width, viewport.height, true)\n this.requestRender()\n }\n\n if (this._wrapMode === \"none\") {\n if (direction === \"left\") {\n const newOffsetX = Math.max(0, viewport.offsetX - delta)\n this.editorView.setViewport(newOffsetX, viewport.offsetY, viewport.width, viewport.height, true)\n this.requestRender()\n } else if (direction === \"right\") {\n const newOffsetX = viewport.offsetX + delta\n this.editorView.setViewport(newOffsetX, viewport.offsetY, viewport.width, viewport.height, true)\n this.requestRender()\n }\n }\n }\n\n protected onResize(width: number, height: number): void {\n this.editorView.setViewportSize(width, height)\n }\n\n protected refreshLocalSelection(): boolean {\n if (this.lastLocalSelection) {\n return this.updateLocalSelection(this.lastLocalSelection)\n }\n return false\n }\n\n private updateLocalSelection(localSelection: LocalSelectionBounds | null): boolean {\n if (!localSelection?.isActive) {\n this.editorView.resetLocalSelection()\n return true\n }\n return this.editorView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n false,\n )\n }\n\n shouldStartSelection(x: number, y: number): boolean {\n if (!this.selectable) return false\n\n const localX = x - this.x\n const localY = y - this.y\n\n return localX >= 0 && localX < this.width && localY >= 0 && localY < this.height\n }\n\n onSelectionChanged(selection: Selection | null): boolean {\n const localSelection = convertGlobalToLocalSelection(selection, this.x, this.y)\n this.lastLocalSelection = localSelection\n\n const updateCursor = true\n const followCursor = this._keyboardSelectionActive\n\n let changed: boolean\n if (!localSelection?.isActive) {\n this._keyboardSelectionActive = false\n this.editorView.resetLocalSelection()\n changed = true\n } else if (selection?.isStart) {\n changed = this.editorView.setLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n updateCursor,\n followCursor,\n )\n } else {\n changed = this.editorView.updateLocalSelection(\n localSelection.anchorX,\n localSelection.anchorY,\n localSelection.focusX,\n localSelection.focusY,\n this._selectionBg,\n this._selectionFg,\n updateCursor,\n followCursor,\n )\n }\n\n if (changed && localSelection?.isActive && selection?.isDragging) {\n const viewport = this.editorView.getViewport()\n const focusY = localSelection.focusY\n const scrollMargin = Math.max(1, Math.floor(viewport.height * this._scrollMargin))\n\n if (focusY < scrollMargin) {\n this._autoScrollVelocity = -this._scrollSpeed\n } else if (focusY >= viewport.height - scrollMargin) {\n this._autoScrollVelocity = this._scrollSpeed\n } else {\n this._autoScrollVelocity = 0\n }\n } else {\n this._keyboardSelectionActive = false\n this._autoScrollVelocity = 0\n this._autoScrollAccumulator = 0\n }\n\n if (changed) {\n this.requestRender()\n }\n\n return this.hasSelection()\n }\n\n protected override onUpdate(deltaTime: number): void {\n super.onUpdate(deltaTime)\n\n if (this._autoScrollVelocity !== 0 && this.hasSelection()) {\n const deltaSeconds = deltaTime / 1000\n this._autoScrollAccumulator += this._autoScrollVelocity * deltaSeconds\n\n const linesToScroll = Math.floor(Math.abs(this._autoScrollAccumulator))\n if (linesToScroll > 0) {\n const direction = this._autoScrollVelocity > 0 ? 1 : -1\n const viewport = this.editorView.getViewport()\n const totalVirtualLines = this.editorView.getTotalVirtualLineCount()\n const maxOffsetY = Math.max(0, totalVirtualLines - viewport.height)\n const newOffsetY = Math.max(0, Math.min(viewport.offsetY + direction * linesToScroll, maxOffsetY))\n\n if (newOffsetY !== viewport.offsetY) {\n this.editorView.setViewport(viewport.offsetX, newOffsetY, viewport.width, viewport.height, false)\n\n this._ctx.requestSelectionUpdate()\n }\n\n this._autoScrollAccumulator -= direction * linesToScroll\n }\n }\n }\n\n getSelectedText(): string {\n return this.editorView.getSelectedText()\n }\n\n hasSelection(): boolean {\n return this.editorView.hasSelection()\n }\n\n getSelection(): { start: number; end: number } | null {\n return this.editorView.getSelection()\n }\n\n private refreshSelectionStyle(): void {\n if (this.lastLocalSelection) {\n this.updateLocalSelection(this.lastLocalSelection)\n return\n }\n\n const selection = this.getSelection()\n if (!selection) return\n this.editorView.setSelection(selection.start, selection.end, this._selectionBg, this._selectionFg)\n }\n\n private deleteSelectedText(): void {\n this.editorView.deleteSelectedText()\n this._ctx.clearSelection()\n this.requestRender()\n }\n\n setSelection(start: number, end: number): void {\n this.lastLocalSelection = null\n this.editorView.resetLocalSelection()\n this._ctx.clearSelection()\n this.editorView.setSelection(start, end, this._selectionBg, this._selectionFg)\n this.requestRender()\n }\n\n setSelectionInclusive(start: number, end: number): void {\n this.setSelection(Math.min(start, end), Math.max(start, end) + 1)\n }\n\n clearSelection(): boolean {\n const had = this.hasSelection()\n this.lastLocalSelection = null\n this.editorView.resetSelection()\n this.editorView.resetLocalSelection()\n this._ctx.clearSelection()\n if (had) {\n this.requestRender()\n }\n return had\n }\n\n deleteSelection(): boolean {\n if (!this.hasSelection()) return false\n\n this.lastLocalSelection = null\n this.deleteSelectedText()\n return true\n }\n\n setCursor(row: number, col: number): void {\n this.editBuffer.setCursor(row, col)\n this.requestRender()\n }\n\n public insertChar(char: string): void {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n }\n\n this.editBuffer.insertChar(char)\n this.requestRender()\n }\n\n public insertText(text: string): void {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n }\n\n this.editBuffer.insertText(text)\n this.requestRender()\n }\n\n public deleteChar(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n this._ctx.clearSelection()\n this.editBuffer.deleteChar()\n this.requestRender()\n return true\n }\n\n public deleteCharBackward(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n this._ctx.clearSelection()\n this.editBuffer.deleteCharBackward()\n this.requestRender()\n return true\n }\n\n public newLine(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.newLine()\n this.requestRender()\n return true\n }\n\n public deleteLine(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.deleteLine()\n this.requestRender()\n return true\n }\n\n public moveCursorLeft(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n\n if (!select && this.hasSelection()) {\n const selection = this.getSelection()!\n this.editBuffer.setCursorByOffset(selection.start)\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n this.updateSelectionForMovement(select, true)\n this.editBuffer.moveCursorLeft()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveCursorRight(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n\n if (!select && this.hasSelection()) {\n const selection = this.getSelection()!\n const targetOffset = this.cursorOffset === selection.start ? selection.end - 1 : selection.end\n this.editBuffer.setCursorByOffset(targetOffset)\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n this.updateSelectionForMovement(select, true)\n this.editBuffer.moveCursorRight()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveCursorUp(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editorView.moveUpVisual()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveCursorDown(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editorView.moveDownVisual()\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoLine(line: number): void {\n this.editBuffer.gotoLine(line)\n this.requestRender()\n }\n\n public gotoLineStart(): void {\n this.setCursor(this.logicalCursor.row, 0)\n }\n\n public gotoLineTextEnd(): void {\n const eol = this.editBuffer.getEOL()\n this.setCursor(eol.row, eol.col)\n }\n\n public gotoLineHome(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const cursor = this.editorView.getCursor()\n if (cursor.col === 0 && cursor.row > 0) {\n this.editBuffer.setCursor(cursor.row - 1, 0)\n const prevLineEol = this.editBuffer.getEOL()\n this.editBuffer.setCursor(prevLineEol.row, prevLineEol.col)\n } else {\n this.editBuffer.setCursor(cursor.row, 0)\n }\n\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoLineEnd(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const cursor = this.editorView.getCursor()\n const eol = this.editBuffer.getEOL()\n const lineCount = this.editBuffer.getLineCount()\n if (cursor.col === eol.col && cursor.row < lineCount - 1) {\n this.editBuffer.setCursor(cursor.row + 1, 0)\n } else {\n this.editBuffer.setCursor(eol.row, eol.col)\n }\n\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoVisualLineHome(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const sol = this.editorView.getVisualSOL()\n this.editBuffer.setCursor(sol.logicalRow, sol.logicalCol)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoVisualLineEnd(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const eol = this.editorView.getVisualEOL()\n this.editBuffer.setCursor(eol.logicalRow, eol.logicalCol)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoBufferHome(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editBuffer.setCursor(0, 0)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public gotoBufferEnd(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n this.editBuffer.gotoLine(999999)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public selectAll(): boolean {\n this.updateSelectionForMovement(false, true)\n this.editBuffer.setCursor(0, 0)\n return this.gotoBufferEnd({ select: true })\n }\n\n public deleteToLineEnd(): boolean {\n const cursor = this.editorView.getCursor()\n const eol = this.editBuffer.getEOL()\n\n if (eol.col > cursor.col) {\n this.editBuffer.deleteRange(cursor.row, cursor.col, eol.row, eol.col)\n }\n\n this.requestRender()\n return true\n }\n\n public deleteToLineStart(): boolean {\n const cursor = this.editorView.getCursor()\n\n if (cursor.col > 0) {\n this.editBuffer.deleteRange(cursor.row, 0, cursor.row, cursor.col)\n } else if (cursor.row > 0) {\n this.editBuffer.deleteCharBackward()\n }\n\n this.requestRender()\n return true\n }\n\n public undo(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.undo()\n this.requestRender()\n return true\n }\n\n public redo(): boolean {\n this._ctx.clearSelection()\n this.editBuffer.redo()\n this.requestRender()\n return true\n }\n\n public moveWordForward(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const nextWord = this.editBuffer.getNextWordBoundary()\n this.editBuffer.setCursorByOffset(nextWord.offset)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public moveWordBackward(options?: { select?: boolean }): boolean {\n const select = options?.select ?? false\n this.updateSelectionForMovement(select, true)\n const prevWord = this.editBuffer.getPrevWordBoundary()\n this.editBuffer.setCursorByOffset(prevWord.offset)\n this.updateSelectionForMovement(select, false)\n this.requestRender()\n return true\n }\n\n public deleteWordForward(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n const currentCursor = this.editBuffer.getCursorPosition()\n const nextWord = this.editBuffer.getNextWordBoundary()\n\n if (nextWord.offset > currentCursor.offset) {\n this.editBuffer.deleteRange(currentCursor.row, currentCursor.col, nextWord.row, nextWord.col)\n }\n\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n public deleteWordBackward(): boolean {\n if (this.hasSelection()) {\n this.deleteSelectedText()\n return true\n }\n\n const currentCursor = this.editBuffer.getCursorPosition()\n const prevWord = this.editBuffer.getPrevWordBoundary()\n\n if (prevWord.offset < currentCursor.offset) {\n this.editBuffer.deleteRange(prevWord.row, prevWord.col, currentCursor.row, currentCursor.col)\n }\n\n this._ctx.clearSelection()\n this.requestRender()\n return true\n }\n\n private setupNativeRenderable(): void {\n const lib = resolveRenderLib()\n // Transitional native backing: JS still owns the render tree and Yoga nodes,\n // while native owns only hot measurement state. Attach the existing JS-created\n // Yoga node for now. The intended direction is for every Renderable to become\n // native-backed and for Yoga node ownership to move native-side with it.\n const nativeRenderable = lib.createNativeRenderable()\n if (!lib.nativeRenderableAttachYogaNode(nativeRenderable, this.yogaNode.ptr)) {\n lib.destroyNativeRenderable(nativeRenderable)\n throw new Error(\"Failed to attach native renderable Yoga node\")\n }\n if (\n !lib.nativeRenderableSetMeasureTarget(nativeRenderable, NativeMeasureTargetKind.EditorView, this.editorView.ptr)\n ) {\n lib.destroyNativeRenderable(nativeRenderable)\n throw new Error(\"Failed to attach editor native measure target\")\n }\n this.nativeRenderable = nativeRenderable\n }\n\n render(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible) return\n if (this.isDestroyed) return\n // Editor rendering/cursor placement reads absolute coordinates multiple\n // times per frame, so it benefits from the same cached screen position.\n const screenX = this._screenX\n const screenY = this._screenY\n\n this.markClean()\n this._ctx.addToHitGrid(screenX, screenY, this.width, this.height, this.num)\n\n this.renderSelf(buffer)\n this.renderCursor(buffer)\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n buffer.drawEditorView(this.editorView, this._screenX, this._screenY)\n }\n\n protected renderCursor(buffer: OptimizedBuffer): void {\n if (!this._showCursor || !this._focused) return\n\n const visualCursor = this.editorView.getVisualCursor()\n const screenX = this._screenX\n const screenY = this._screenY\n\n const cursorX = screenX + visualCursor.visualCol + 1 // +1 for 1-based terminal coords\n const cursorY = screenY + visualCursor.visualRow + 1 // +1 for 1-based terminal coords\n\n this._ctx.setCursorPosition(cursorX, cursorY, true)\n this._ctx.setCursorStyle({ ...this._cursorStyle, color: this._cursorColor })\n }\n\n public focus(): void {\n super.focus()\n this._ctx.setCursorStyle({ ...this._cursorStyle, color: this._cursorColor })\n this.requestRender()\n }\n\n public blur(): void {\n super.blur()\n this._ctx.setCursorPosition(0, 0, false)\n this.requestRender()\n }\n\n protected onRemove(): void {\n if (this._focused) {\n this._ctx.setCursorPosition(0, 0, false)\n }\n }\n\n override destroy(): void {\n if (this.isDestroyed) return\n\n this.traits = {}\n\n if (this._focused) {\n this._ctx.setCursorPosition(0, 0, false)\n // Manually blur to unhook event handlers BEFORE setting destroyed flag\n // This prevents the guard in super.destroy() from skipping blur()\n this.blur()\n }\n\n // Destroy dependent resources in correct order BEFORE calling super\n // EditorView depends on EditBuffer, so destroy it first\n if (this.nativeRenderable) {\n resolveRenderLib().destroyNativeRenderable(this.nativeRenderable)\n this.nativeRenderable = null\n }\n this.editorView.destroy()\n this.editBuffer.destroy()\n\n // Finally clean up parent resources\n // Note: super.destroy() will try to blur() again, but blur() has guards to prevent double-blur\n super.destroy()\n }\n\n public set onCursorChange(handler: ((event: CursorChangeEvent) => void) | undefined) {\n this._cursorChangeListener = handler\n }\n\n public get onCursorChange(): ((event: CursorChangeEvent) => void) | undefined {\n return this._cursorChangeListener\n }\n\n public set onContentChange(handler: ((event: ContentChangeEvent) => void) | undefined) {\n this._contentChangeListener = handler\n }\n\n public get onContentChange(): ((event: ContentChangeEvent) => void) | undefined {\n return this._contentChangeListener\n }\n\n get syntaxStyle(): SyntaxStyle | null {\n return this.editBuffer.getSyntaxStyle()\n }\n\n set syntaxStyle(style: SyntaxStyle | null) {\n this.editBuffer.setSyntaxStyle(style)\n this.requestRender()\n }\n\n public addHighlight(lineIdx: number, highlight: Highlight): void {\n this.editBuffer.addHighlight(lineIdx, highlight)\n this.requestRender()\n }\n\n public addHighlightByCharRange(highlight: Highlight): void {\n this.editBuffer.addHighlightByCharRange(highlight)\n this.requestRender()\n }\n\n public removeHighlightsByRef(hlRef: number): void {\n this.editBuffer.removeHighlightsByRef(hlRef)\n this.requestRender()\n }\n\n public clearLineHighlights(lineIdx: number): void {\n this.editBuffer.clearLineHighlights(lineIdx)\n this.requestRender()\n }\n\n public clearAllHighlights(): void {\n this.editBuffer.clearAllHighlights()\n this.requestRender()\n }\n\n public getLineHighlights(lineIdx: number): Array<Highlight> {\n return this.editBuffer.getLineHighlights(lineIdx)\n }\n\n /**\n * Set text and completely reset the buffer state (clears history, resets add_buffer).\n * Use this for initial text setting or when you want a clean slate.\n */\n public setText(text: string): void {\n this.editBuffer.setText(text)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n /**\n * Replace text while preserving undo history (creates an undo point).\n * Use this when you want the setText operation to be undoable.\n */\n public replaceText(text: string): void {\n this.editBuffer.replaceText(text)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n public clear(): void {\n this.editBuffer.clear()\n this.editBuffer.clearAllHighlights()\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n public deleteRange(startLine: number, startCol: number, endLine: number, endCol: number): void {\n this.editBuffer.deleteRange(startLine, startCol, endLine, endCol)\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n public getTextRange(startOffset: number, endOffset: number): string {\n return this.editBuffer.getTextRange(startOffset, endOffset)\n }\n\n public getTextRangeByCoords(startRow: number, startCol: number, endRow: number, endCol: number): string {\n return this.editBuffer.getTextRangeByCoords(startRow, startCol, endRow, endCol)\n }\n\n protected updateSelectionForMovement(shiftPressed: boolean, isBeforeMovement: boolean): void {\n if (!this.selectable) return\n\n if (!shiftPressed) {\n this._keyboardSelectionActive = false\n this._ctx.clearSelection()\n return\n }\n\n this._keyboardSelectionActive = true\n\n const visualCursor = this.editorView.getVisualCursor()\n const cursorX = this.x + visualCursor.visualCol\n const cursorY = this.y + visualCursor.visualRow\n\n if (isBeforeMovement) {\n if (!this._ctx.hasSelection) {\n this._ctx.startSelection(this, cursorX, cursorY)\n }\n return\n }\n\n this._ctx.updateSelection(this, cursorX, cursorY, { finishDragging: true })\n }\n}\n",
22
+ "export const ANSI = {\n switchToAlternateScreen: \"\\x1b[?1049h\",\n switchToMainScreen: \"\\x1b[?1049l\",\n reset: \"\\x1b[0m\",\n resetScrollRegion: \"\\x1b[r\",\n home: \"\\x1b[H\",\n clearScreen: \"\\x1b[2J\",\n clearSavedLines: \"\\x1b[3J\",\n\n scrollDown: (lines: number) => `\\x1b[${lines}T`,\n scrollUp: (lines: number) => `\\x1b[${lines}S`,\n\n moveCursor: (row: number, col: number) => `\\x1b[${row};${col}H`,\n moveCursorAndClear: (row: number, col: number) => `\\x1b[${row};${col}H\\x1b[J`,\n\n setRgbBackground: (r: number, g: number, b: number) => `\\x1b[48;2;${r};${g};${b}m`,\n resetBackground: \"\\x1b[49m\",\n\n // Bracketed paste mode\n bracketedPasteStart: \"\\u001b[200~\",\n bracketedPasteEnd: \"\\u001b[201~\",\n}\n",
23
+ "import { ANSI } from \"./ansi.js\"\nimport { Renderable, RootRenderable } from \"./Renderable.js\"\nimport { BoxRenderable } from \"./renderables/Box.js\"\nimport { CodeRenderable } from \"./renderables/Code.js\"\nimport { TextRenderable } from \"./renderables/Text.js\"\nimport {\n DebugOverlayCorner,\n type CursorStyleOptions,\n type MousePointerStyle,\n type RenderContext,\n type TerminalCapabilities,\n type ThemeMode,\n type ViewportBounds,\n type WidthMethod,\n} from \"./types.js\"\nimport { RGBA, parseColor, type ColorInput } from \"./lib/RGBA.js\"\nimport { sleep } from \"./platform/runtime.js\"\nimport { OptimizedBuffer } from \"./buffer.js\"\nimport {\n resolveRenderLib,\n type NativeBufferedOutput,\n type NativeRenderStats,\n type RenderLib,\n type RendererHandle,\n} from \"./zig.js\"\nimport { NativeSpanFeed } from \"./NativeSpanFeed.js\"\nimport { TerminalConsole, type ConsoleOptions, capture } from \"./console.js\"\nimport { type MouseEventType, type RawMouseEvent, type ScrollInfo } from \"./lib/parse.mouse.js\"\nimport { Selection } from \"./lib/selection.js\"\nimport { Clipboard, type ClipboardTarget } from \"./lib/clipboard.js\"\nimport { EventEmitter } from \"events\"\nimport { singleton } from \"./lib/singleton.js\"\nimport { getObjectsInViewport } from \"./lib/objects-in-viewport.js\"\nimport { KeyHandler, InternalKeyHandler } from \"./lib/KeyHandler.js\"\nimport { isEditBufferRenderable, type EditBufferRenderable } from \"./renderables/EditBufferRenderable.js\"\nimport { env, registerEnvVar } from \"./lib/env.js\"\nimport { destroyTreeSitterClient } from \"./lib/tree-sitter/index.js\"\nimport {\n buildTerminalPaletteSignature,\n createTerminalPalette,\n normalizeTerminalPalette,\n type TerminalPaletteDetector,\n type TerminalColors,\n type GetPaletteOptions,\n} from \"./lib/terminal-palette.js\"\nimport { calculateRenderGeometry } from \"./lib/render-geometry.js\"\nimport {\n isCapabilityResponse,\n isPixelResolutionResponse,\n parsePixelResolution,\n} from \"./lib/terminal-capability-detection.js\"\nimport { type Clock, type TimerHandle, SystemClock } from \"./lib/clock.js\"\nimport { StdinParser, type StdinEvent, type StdinParserProtocolContext } from \"./lib/stdin-parser.js\"\nimport { matchesKeyBinding } from \"./lib/keybinding.internal.js\"\nimport { RendererThemeMode } from \"./renderer-theme-mode.js\"\n\nregisterEnvVar({\n name: \"OTUI_DUMP_CAPTURES\",\n description: \"Dump captured stdout and console caches when the renderer exit handler runs.\",\n type: \"boolean\",\n default: false,\n})\n\nregisterEnvVar({\n name: \"OTUI_NO_NATIVE_RENDER\",\n description:\n \"Skip the Zig/native frame renderer. Useful for debugging the render loop; split-footer stdout flushing may still write ANSI.\",\n type: \"boolean\",\n default: false,\n})\n\nregisterEnvVar({\n name: \"OTUI_USE_ALTERNATE_SCREEN\",\n description: \"When explicitly set, force screen mode selection: true=alternate-screen, false=main-screen.\",\n type: \"boolean\",\n default: true,\n})\n\nregisterEnvVar({\n name: \"OTUI_OVERRIDE_STDOUT\",\n description: \"When explicitly set, force stdout routing: false=passthrough, true=capture in split-footer mode.\",\n type: \"boolean\",\n default: true,\n})\n\nregisterEnvVar({\n name: \"OTUI_DEBUG\",\n description: \"Enable debug mode to capture all raw input for debugging purposes.\",\n type: \"boolean\",\n default: false,\n})\n\nregisterEnvVar({\n name: \"OTUI_SHOW_STATS\",\n description: \"Show the debug overlay at startup.\",\n type: \"boolean\",\n default: false,\n})\n\nexport interface CliRendererConfig {\n // Read input from this stream. Defaults to process.stdin. Any `Readable`\n // works; capabilities like `setRawMode` are duck-typed and used when present.\n stdin?: NodeJS.ReadStream\n\n // Destination for rendered output. Defaults to process.stdout. When this is\n // not `process.stdout`, the renderer internally wires a `NativeSpanFeed`\n // between Zig and the provided `Writable` so frames flow there instead of\n // the host terminal. TTY capabilities like `columns`/`rows` are duck-typed.\n stdout?: NodeJS.WriteStream\n\n // Fallback terminal width when `stdout.columns` is not available. Useful\n // when running against a non-TTY `Writable` (e.g. an SSH channel) where\n // initial dimensions come from elsewhere. Default 80.\n width?: number\n\n // Fallback terminal height when `stdout.rows` is not available. Default 24.\n height?: number\n\n // Tell the native renderer it is driving a remote terminal. When omitted,\n // native startup auto-detects SSH/mosh sessions; custom stdout feed output\n // defaults to remote because it is not connected to the host TTY directly.\n remote?: boolean\n\n // Use an in-memory native buffered output destination instead of process stdout.\n // Intended for test helpers that need native rendering without terminal I/O.\n bufferedOutput?: NativeBufferedOutput\n\n // Call renderer.destroy() when Ctrl+C is pressed. Defaults to true.\n exitOnCtrlC?: boolean\n\n // Clean up on these signals. Defaults to the common termination signals.\n exitSignals?: NodeJS.Signals[]\n\n // Clear owned screen regions on suspend/destroy. Defaults to true.\n clearOnShutdown?: boolean\n\n // Forward these env var names to native terminal detection.\n forwardEnvKeys?: string[]\n\n // Wait this long before handling resize events. Defaults to 100 ms.\n debounceDelay?: number\n\n // Aim for this many frames per second in continuous mode. Defaults to 30.\n targetFps?: number\n\n // Cap immediate re-renders at this frame rate. Defaults to 60.\n maxFps?: number\n\n // Emit memory snapshots on this interval in ms. Set 0 to disable.\n memorySnapshotInterval?: number\n\n // Render from a separate thread when the platform supports it.\n useThread?: boolean\n\n // Collect frame timing stats for the debug overlay.\n gatherStats?: boolean\n\n // Keep this many timing samples. Defaults to 300.\n maxStatSamples?: number\n\n // Pass options to the built-in console overlay.\n consoleOptions?: Omit<ConsoleOptions, \"clock\">\n\n // Run these hooks after each render pass.\n postProcessFns?: ((buffer: OptimizedBuffer, deltaTime: number) => void)[]\n\n // Track mouse move events. Defaults to true.\n enableMouseMovement?: boolean\n\n // Enable mouse input. Defaults to true.\n useMouse?: boolean\n\n // Focus the nearest focusable renderable on left click. Defaults to true.\n autoFocus?: boolean\n\n // Choose where the renderer owns terminal space. Defaults to \"alternate-screen\".\n screenMode?: ScreenMode\n\n // Set the requested footer height for \"split-footer\". Defaults to 12.\n footerHeight?: number\n\n // Choose what happens to writes that go through `stdout.write`.\n externalOutputMode?: ExternalOutputMode\n\n // Choose what the built-in console overlay does.\n consoleMode?: ConsoleMode\n\n // Set Kitty keyboard protocol flags, or null to disable them.\n useKittyKeyboard?: KittyKeyboardOptions | null\n\n // Fill the render buffer with this background color. Default transparent.\n backgroundColor?: ColorInput\n\n // Open the console overlay on uncaught errors. Defaults to true in development.\n openConsoleOnError?: boolean\n\n // Run these input handlers before the built-in handlers.\n prependInputHandlers?: ((sequence: string) => boolean)[]\n\n // Cap the stdin parser buffer size in bytes. Defaults to 64 MB.\n stdinParserMaxBufferBytes?: number\n\n // Use a custom clock for timers and tests.\n clock?: Clock\n\n // Run after destroy() finishes cleanup.\n onDestroy?: () => void\n}\n\n// Controls how the renderer uses terminal space:\n//\n// - \"alternate-screen\": Use the terminal's alternate screen buffer.\n//\n// - \"main-screen\": Render on the main screen.\n//\n// - \"split-footer\": Keep the renderer in a reserved footer on the main screen.\nexport type ScreenMode = \"alternate-screen\" | \"main-screen\" | \"split-footer\"\n\n// Controls writes that go through the configured `stdout.write`.\n//\n// - \"capture-stdout\": Queue stdout and replay it above the split footer.\n// Only valid with \"split-footer\".\n//\n// - \"passthrough\": Leave stdout alone.\nexport type ExternalOutputMode = \"capture-stdout\" | \"passthrough\"\n\nexport interface CliRendererExternalOutputEvent {\n snapshot: OptimizedBuffer\n rowColumns: number\n startOnNewLine: boolean\n trailingNewline: boolean\n}\n\n// Controls the built-in console overlay:\n//\n// - \"console-overlay\": Capture `console.*` output and show the overlay.\n//\n// - \"disabled\": Hide the overlay. `OTUI_USE_CONSOLE` controls global console\n// capture.\nexport type ConsoleMode = \"console-overlay\" | \"disabled\"\n\nexport type PixelResolution = {\n width: number\n height: number\n}\n\nexport interface CliRendererStats extends NativeRenderStats {\n fps: number\n frameCount: number\n frameTimes: number[]\n averageFrameTime: number\n minFrameTime: number\n maxFrameTime: number\n frameCallbackTime: number\n}\n\nexport interface CliRendererFrameEvent {\n frameId: number\n}\n\nexport interface RendererSchedulerState {\n isRunning: boolean\n isRendering: boolean\n hasScheduledRender: boolean\n}\n\nexport interface ScrollbackRenderContext {\n width: number\n widthMethod: WidthMethod\n tailColumn: number\n renderContext: RenderContext\n}\n\nexport interface ScrollbackSnapshot {\n root: Renderable\n width?: number\n height?: number\n rowColumns?: number\n startOnNewLine?: boolean\n trailingNewline?: boolean\n teardown?: () => void\n}\n\nexport type ScrollbackWriter = (ctx: ScrollbackRenderContext) => ScrollbackSnapshot\n\nexport interface ScrollbackSurfaceOptions {\n startOnNewLine?: boolean\n}\n\nexport interface ScrollbackSurfaceCommitOptions {\n rowColumns?: number\n trailingNewline?: boolean\n}\n\nexport interface ScrollbackSurface {\n readonly renderContext: RenderContext\n readonly root: Renderable\n readonly width: number\n readonly height: number\n readonly isDestroyed: boolean\n\n render(): void\n settle(timeoutMs?: number): Promise<void>\n commitRows(startRow: number, endRowExclusive: number, options?: ScrollbackSurfaceCommitOptions): void\n destroy(): void\n}\n\nexport interface SplitFooterReplayResetOptions {\n clearSavedLines?: boolean\n}\n\nconst DEFAULT_FOOTER_HEIGHT = 12\nconst MAX_SCROLLBACK_SURFACE_HEIGHT_PASSES = 4\nconst TRANSPARENT_RGBA = RGBA.fromValues(0, 0, 0, 0)\n\nlet scrollbackSurfaceCounter = 0\n\nfunction normalizeFooterHeight(footerHeight: number | undefined): number {\n if (footerHeight === undefined) {\n return DEFAULT_FOOTER_HEIGHT\n }\n\n if (!Number.isFinite(footerHeight)) {\n throw new Error(\"footerHeight must be a finite number\")\n }\n\n const normalizedFooterHeight = Math.trunc(footerHeight)\n if (normalizedFooterHeight <= 0) {\n throw new Error(\"footerHeight must be greater than 0\")\n }\n\n return normalizedFooterHeight\n}\n\nfunction resolveModes(config: CliRendererConfig): {\n screenMode: ScreenMode\n footerHeight: number\n externalOutputMode: ExternalOutputMode\n} {\n let screenMode = config.screenMode ?? \"alternate-screen\"\n if (process.env.OTUI_USE_ALTERNATE_SCREEN !== undefined) {\n screenMode = env.OTUI_USE_ALTERNATE_SCREEN ? \"alternate-screen\" : \"main-screen\"\n }\n\n const footerHeight =\n screenMode === \"split-footer\" ? normalizeFooterHeight(config.footerHeight) : DEFAULT_FOOTER_HEIGHT\n\n let externalOutputMode =\n config.externalOutputMode ?? (screenMode === \"split-footer\" ? \"capture-stdout\" : \"passthrough\")\n if (process.env.OTUI_OVERRIDE_STDOUT !== undefined) {\n externalOutputMode = env.OTUI_OVERRIDE_STDOUT && screenMode === \"split-footer\" ? \"capture-stdout\" : \"passthrough\"\n }\n\n if (externalOutputMode === \"capture-stdout\" && screenMode !== \"split-footer\") {\n throw new Error('externalOutputMode \"capture-stdout\" requires screenMode \"split-footer\"')\n }\n\n return {\n screenMode,\n footerHeight,\n externalOutputMode,\n }\n}\n\ntype ExternalOutputCommit = {\n snapshot: OptimizedBuffer\n rowColumns: number\n startOnNewLine: boolean\n trailingNewline: boolean\n}\n\ntype PendingSplitFooterTransition = {\n mode: \"viewport-scroll\" | \"clear-stale-rows\"\n sourceTopLine: number\n sourceHeight: number\n targetTopLine: number\n targetHeight: number\n scrollLines?: number\n}\n\nclass ExternalOutputQueue {\n private commits: ExternalOutputCommit[] = []\n\n get size(): number {\n return this.commits.length\n }\n\n writeSnapshot(commit: ExternalOutputCommit): void {\n this.commits.push(commit)\n }\n\n peek(limit: number = Number.POSITIVE_INFINITY): readonly ExternalOutputCommit[] {\n const clampedLimit = Number.isFinite(limit) ? Math.max(1, Math.trunc(limit)) : this.commits.length\n return this.commits.slice(0, clampedLimit)\n }\n\n claim(limit: number = Number.POSITIVE_INFINITY): ExternalOutputCommit[] {\n if (this.commits.length === 0) {\n return []\n }\n\n // Split-footer capture can enqueue many tiny commits in a burst (for example,\n // simulated Ctrl+R hold). Taking everything at once creates very large native\n // frames that increase visible churn. We keep claim() bounded so one render tick\n // produces one modest frame and schedules another tick if work remains.\n const clampedLimit = Number.isFinite(limit) ? Math.max(1, Math.trunc(limit)) : this.commits.length\n if (clampedLimit >= this.commits.length) {\n const output = this.commits\n this.commits = []\n return output\n }\n\n const output = this.commits.slice(0, clampedLimit)\n this.commits = this.commits.slice(clampedLimit)\n return output\n }\n\n drop(count: number): void {\n for (const commit of this.commits.splice(0, count)) {\n commit.snapshot.destroy()\n }\n }\n\n clear(): void {\n this.drop(this.commits.length)\n }\n}\n\nconst CHAR_FLAG_CONTINUATION = 0xc0000000 >>> 0\nconst CHAR_FLAG_MASK = 0xc0000000 >>> 0\n\nclass ScrollbackSnapshotRenderContext extends EventEmitter implements RenderContext {\n public width: number\n public height: number\n public frameId = 0\n public widthMethod: WidthMethod\n public capabilities: TerminalCapabilities | null = null\n public hasSelection: boolean = false\n public currentFocusedRenderable: Renderable | null = null\n public keyInput: KeyHandler\n public _internalKeyInput: InternalKeyHandler\n\n private lifecyclePasses: Set<Renderable> = new Set()\n\n constructor(width: number, height: number, widthMethod: WidthMethod) {\n super()\n this.width = width\n this.height = height\n this.widthMethod = widthMethod\n this.keyInput = new KeyHandler()\n this._internalKeyInput = new InternalKeyHandler()\n }\n\n public addToHitGrid(_x: number, _y: number, _width: number, _height: number, _id: number): void {}\n public pushHitGridScissorRect(_x: number, _y: number, _width: number, _height: number): void {}\n public popHitGridScissorRect(): void {}\n public clearHitGridScissorRects(): void {}\n public requestRender(): void {}\n public setCursorPosition(_x: number, _y: number, _visible: boolean): void {}\n public setCursorStyle(_options: CursorStyleOptions): void {}\n public setCursorColor(_color: RGBA): void {}\n public setMousePointer(_shape: MousePointerStyle): void {}\n public requestLive(): void {}\n public dropLive(): void {}\n public getSelection(): Selection | null {\n return null\n }\n public get currentFocusedEditor(): EditBufferRenderable | null {\n if (!this.currentFocusedRenderable) return null\n if (!isEditBufferRenderable(this.currentFocusedRenderable)) return null\n return this.currentFocusedRenderable\n }\n public requestSelectionUpdate(): void {}\n public focusRenderable(renderable: Renderable): void {\n this.currentFocusedRenderable = renderable\n }\n public blurRenderable(renderable: Renderable): void {\n if (this.currentFocusedRenderable === renderable) {\n this.currentFocusedRenderable = null\n }\n }\n public registerLifecyclePass(renderable: Renderable): void {\n this.lifecyclePasses.add(renderable)\n }\n public unregisterLifecyclePass(renderable: Renderable): void {\n this.lifecyclePasses.delete(renderable)\n }\n public getLifecyclePasses(): Set<Renderable> {\n return this.lifecyclePasses\n }\n public clearSelection(): void {}\n public startSelection(_renderable: Renderable, _x: number, _y: number): void {}\n public updateSelection(\n _currentRenderable: Renderable | undefined,\n _x: number,\n _y: number,\n _options?: { finishDragging?: boolean },\n ): void {}\n}\n\nconst DEFAULT_FORWARDED_ENV_KEYS = [\n \"TMUX\",\n \"ZELLIJ\",\n \"ZELLIJ_SESSION_NAME\",\n \"ZELLIJ_PANE_ID\",\n \"TERM\",\n \"OPENTUI_GRAPHICS\",\n \"TERM_PROGRAM\",\n \"TERM_PROGRAM_VERSION\",\n \"TERM_FEATURES\",\n \"ALACRITTY_SOCKET\",\n \"ALACRITTY_LOG\",\n \"COLORTERM\",\n \"TERMUX_VERSION\",\n \"VHS_RECORD\",\n \"OPENTUI_FORCE_WCWIDTH\",\n \"OPENTUI_FORCE_UNICODE\",\n \"OPENTUI_FORCE_NOZWJ\",\n \"OPENTUI_FORCE_EXPLICIT_WIDTH\",\n \"OPENTUI_NOTIFICATION_PROTOCOL\",\n \"OPENTUI_NOTIFICATIONS\",\n \"WT_SESSION\",\n \"STY\",\n \"WSL_DISTRO_NAME\",\n \"WSL_INTEROP\",\n] as const\n\nconst NATIVE_RENDER_STATUS_SKIPPED = 1\nconst NATIVE_RENDER_STATUS_FAILED = 2\n\n// Kitty keyboard protocol flags\n// See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\nconst KITTY_FLAG_DISAMBIGUATE = 0b1 // Report disambiguated escape codes\nconst KITTY_FLAG_EVENT_TYPES = 0b10 // Report event types (press/repeat/release)\nconst KITTY_FLAG_ALTERNATE_KEYS = 0b100 // Report alternate keys (e.g., numpad vs regular)\nconst KITTY_FLAG_ALL_KEYS_AS_ESCAPES = 0b1000 // Report all keys as escape codes\nconst KITTY_FLAG_REPORT_TEXT = 0b10000 // Report text associated with key events\n\nconst DEFAULT_STDIN_PARSER_MAX_BUFFER_BYTES = 64 * 1024 * 1024\nconst NATIVE_PALETTE_QUERY_SIZE = 16\n\n/**\n * Kitty Keyboard Protocol configuration options\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#progressive-enhancement\n */\nexport interface KittyKeyboardOptions {\n /** Disambiguate escape codes (fixes ESC timing, alt+key ambiguity, ctrl+c as event). Default: true */\n disambiguate?: boolean\n /** Report alternate keys (numpad, shifted, base layout) for cross-keyboard shortcuts. Default: true */\n alternateKeys?: boolean\n /** Report event types (press/repeat/release). Default: false */\n events?: boolean\n /** Report all keys as escape codes. Default: false */\n allKeysAsEscapes?: boolean\n /** Report text associated with key events. Default: false */\n reportText?: boolean\n}\n\n/**\n * Build kitty keyboard protocol flags based on configuration\n * @param config Kitty keyboard configuration object (null/undefined = disabled)\n * @returns The combined flags value (0 = disabled, >0 = enabled)\n * @internal Exported for testing\n */\nexport function buildKittyKeyboardFlags(config: KittyKeyboardOptions | null | undefined): number {\n if (!config) {\n return 0\n }\n\n let flags = 0\n\n // Default: disambiguate + alternate keys (both default to true)\n // - Disambiguate (0b1): Fixes ESC timing issues, alt+key ambiguity, makes ctrl+c a key event\n // - Alternate keys (0b100): Reports shifted/base-layout keys for cross-keyboard shortcuts\n\n // disambiguate defaults to true unless explicitly set to false\n if (config.disambiguate !== false) {\n flags |= KITTY_FLAG_DISAMBIGUATE\n }\n\n // alternateKeys defaults to true unless explicitly set to false\n if (config.alternateKeys !== false) {\n flags |= KITTY_FLAG_ALTERNATE_KEYS\n }\n\n // Optional flags (default to false, only enabled when explicitly true)\n if (config.events === true) {\n flags |= KITTY_FLAG_EVENT_TYPES\n }\n\n if (config.allKeysAsEscapes === true) {\n flags |= KITTY_FLAG_ALL_KEYS_AS_ESCAPES\n }\n\n if (config.reportText === true) {\n flags |= KITTY_FLAG_REPORT_TEXT\n }\n\n return flags\n}\n\nexport class MouseEvent {\n public readonly type: MouseEventType\n public readonly button: number\n public readonly x: number\n public readonly y: number\n public readonly source?: Renderable\n public readonly modifiers: {\n shift: boolean\n alt: boolean\n ctrl: boolean\n }\n public readonly scroll?: ScrollInfo\n public readonly target: Renderable | null\n public readonly isDragging?: boolean\n private _propagationStopped: boolean = false\n private _defaultPrevented: boolean = false\n\n public get propagationStopped(): boolean {\n return this._propagationStopped\n }\n\n public get defaultPrevented(): boolean {\n return this._defaultPrevented\n }\n\n constructor(target: Renderable | null, attributes: RawMouseEvent & { source?: Renderable; isDragging?: boolean }) {\n this.target = target\n this.type = attributes.type\n this.button = attributes.button\n this.x = attributes.x\n this.y = attributes.y\n this.modifiers = attributes.modifiers\n this.scroll = attributes.scroll\n this.source = attributes.source\n this.isDragging = attributes.isDragging\n }\n\n public stopPropagation(): void {\n this._propagationStopped = true\n }\n\n public preventDefault(): void {\n this._defaultPrevented = true\n }\n}\n\nexport enum MouseButton {\n LEFT = 0,\n MIDDLE = 1,\n RIGHT = 2,\n WHEEL_UP = 4,\n WHEEL_DOWN = 5,\n}\n\nconst rendererTracker = singleton(\"RendererTracker\", () => ({\n renderers: new Set<CliRenderer>(),\n streamOwners: new WeakMap<object, CliRenderer>(),\n}))\n\n/**\n * Create a CLI renderer and run its async terminal setup. The constructor\n * owns all stream and backend decisions; this factory only layers on the\n * `--delay-start` flag and the `await setupTerminal()` convenience.\n */\nexport async function createCliRenderer(config: CliRendererConfig = {}): Promise<CliRenderer> {\n if (process.argv.includes(\"--delay-start\")) {\n await new Promise((resolve) => setTimeout(resolve, 5000))\n }\n const stdin = config.stdin ?? process.stdin\n const stdout = config.stdout ?? process.stdout\n\n // Prefer real TTY dimensions, then explicit config fallbacks, then defaults.\n // `||` (not `??`) preserves the historical falsy-fallback semantics where\n // `stdout.columns === 0` falls through rather than being treated as valid.\n const width = stdout.columns || config.width || 80\n const height = stdout.rows || config.height || 24\n\n const renderer = new CliRenderer(stdin, stdout, width, height, config)\n try {\n await renderer.setupTerminal()\n return renderer\n } catch (error) {\n try {\n renderer.destroy()\n } catch (destroyError) {\n console.error(\"Error destroying partially-set-up renderer:\", destroyError)\n }\n throw error\n }\n}\n\nexport enum CliRenderEvents {\n RESIZE = \"resize\",\n FRAME = \"frame\",\n EXTERNAL_OUTPUT = \"external_output\",\n FOCUS = \"focus\",\n BLUR = \"blur\",\n FOCUSED_RENDERABLE = \"focused_renderable\",\n FOCUSED_EDITOR = \"focused_editor\",\n THEME_MODE = \"theme_mode\",\n PALETTE = \"palette\",\n CAPABILITIES = \"capabilities\",\n SELECTION = \"selection\",\n DEBUG_OVERLAY_TOGGLE = \"debugOverlay:toggle\",\n DESTROY = \"destroy\",\n MEMORY_SNAPSHOT = \"memory:snapshot\",\n}\n\nexport enum RendererControlState {\n IDLE = \"idle\",\n AUTO_STARTED = \"auto_started\",\n EXPLICIT_STARTED = \"explicit_started\",\n EXPLICIT_PAUSED = \"explicit_paused\",\n EXPLICIT_SUSPENDED = \"explicit_suspended\",\n EXPLICIT_STOPPED = \"explicit_stopped\",\n}\n\nexport class CliRenderer extends EventEmitter implements RenderContext {\n private static animationFrameId = 0\n private lib: RenderLib\n public rendererPtr: RendererHandle\n public stdin: NodeJS.ReadStream\n private stdout: NodeJS.WriteStream\n private exitOnCtrlC: boolean\n private exitSignals: NodeJS.Signals[]\n private _exitListenersAdded: boolean = false\n private _isDestroyed: boolean = false\n private _destroyPending: boolean = false\n private _destroyFinalized: boolean = false\n private _destroyCleanupPrepared: boolean = false\n private _streamLeaseAcquired: boolean = false\n public nextRenderBuffer: OptimizedBuffer\n public currentRenderBuffer: OptimizedBuffer\n private _isRunning: boolean = false\n private _targetFps: number = 30\n private _maxFps: number = 60\n private automaticMemorySnapshot: boolean = false\n private memorySnapshotInterval: number\n private memorySnapshotTimer: TimerHandle | null = null\n private lastMemorySnapshot: {\n heapUsed: number\n heapTotal: number\n arrayBuffers: number\n } = {\n heapUsed: 0,\n heapTotal: 0,\n arrayBuffers: 0,\n }\n public readonly root: RootRenderable\n public width: number\n public height: number\n private _useThread: boolean = false\n private gatherStats: boolean = false\n private frameTimes: number[] = []\n private maxStatSamples: number = 300\n private postProcessFns: ((buffer: OptimizedBuffer, deltaTime: number) => void)[] = []\n private backgroundColor: RGBA = RGBA.fromInts(0, 0, 0, 0)\n private waitingForPixelResolution: boolean = false\n private readonly clock: Clock\n\n private rendering: boolean = false\n private renderingNative: boolean = false\n private renderTimeout: TimerHandle | null = null\n private lastTime: number = 0\n private frameCount: number = 0\n // Bumped once per loop() iteration; see RenderContext.frameId.\n private _frameId: number = 0\n private lastFpsTime: number = 0\n private currentFps: number = 0\n private targetFrameTime: number = 1000 / this._targetFps\n private minTargetFrameTime: number = 1000 / this._maxFps\n private immediateRerenderRequested: boolean = false\n private updateScheduled: boolean = false\n\n private liveRequestCounter: number = 0\n private _controlState: RendererControlState = RendererControlState.IDLE\n\n private frameCallbacks: ((deltaTime: number) => Promise<void>)[] = []\n private renderStats: {\n frameCount: number\n fps: number\n renderTime?: number\n frameCallbackTime: number\n } = {\n frameCount: 0,\n fps: 0,\n renderTime: 0,\n frameCallbackTime: 0,\n }\n public debugOverlay = {\n enabled: env.OTUI_SHOW_STATS,\n corner: DebugOverlayCorner.bottomRight,\n }\n\n private _console: TerminalConsole\n private _resolution: PixelResolution | null = null\n private _keyHandler: InternalKeyHandler\n private stdinParser: StdinParser | null = null\n private readonly oscSubscribers = new Set<(sequence: string) => void>()\n private hasLoggedStdinParserError = false\n\n private animationRequest: Map<number, FrameRequestCallback> = new Map()\n\n private resizeTimeoutId: TimerHandle | null = null\n private capabilityTimeoutId: TimerHandle | null = null\n private xtVersionWaiters = new Set<() => void>()\n private splitStartupSeedTimeoutId: TimerHandle | null = null\n private pendingSplitStartupCursorSeed: boolean = false\n private resizeDebounceDelay: number = 100\n\n private enableMouseMovement: boolean = false\n private _useMouse: boolean = true\n private autoFocus: boolean = true\n private _screenMode: ScreenMode = \"alternate-screen\"\n private _footerHeight: number = DEFAULT_FOOTER_HEIGHT\n private _externalOutputMode: ExternalOutputMode = \"passthrough\"\n private clearOnShutdown: boolean = true\n private _suspendedMouseEnabled: boolean = false\n private _previousControlState: RendererControlState = RendererControlState.IDLE\n private pendingSuspendedTerminalSetup: boolean = false\n private suspendedNonAltSurfacePreserved: boolean = false\n private capturedRenderable?: Renderable\n private lastOverRenderableNum: number = 0\n private lastOverRenderable?: Renderable\n\n private currentSelection: Selection | null = null\n private selectionContainers: Renderable[] = []\n private clipboard: Clipboard\n\n private _splitHeight: number = 0\n private renderOffset: number = 0\n private splitTailColumn: number = 0\n private pendingSplitFooterTransition: PendingSplitFooterTransition | null = null\n // One-shot latch used to request a full split repaint after transitions\n // (resize/mode/output-path changes). Cleared on first renderNative tick.\n private forceFullRepaintRequested: boolean = false\n // Upper bound for captured stdout commits consumed per native frame.\n // This is a visual smoothness control: smaller batches reduce frame envelope\n // churn and keep render latency predictable under heavy scrollback append load.\n private readonly maxSplitCommitsPerFrame: number = 8\n\n private _terminalWidth: number = 0\n private _terminalHeight: number = 0\n private _terminalIsSetup: boolean = false\n\n private externalOutputQueue = new ExternalOutputQueue()\n private pendingExternalOutputMode: ExternalOutputMode | null = null\n private realStdoutWrite: (chunk: any, encoding?: any, callback?: any) => boolean\n\n private _useConsole: boolean = true\n private sigwinchHandler: () => void = (() => {\n const width = this.stdout.columns || 80\n const height = this.stdout.rows || 24\n this.handleResize(width, height)\n }).bind(this)\n private _capabilities: TerminalCapabilities | null = null\n private _latestPointer: { x: number; y: number } = { x: 0, y: 0 }\n private _hasPointer: boolean = false\n private _lastPointerModifiers: RawMouseEvent[\"modifiers\"] = {\n shift: false,\n alt: false,\n ctrl: false,\n }\n private _currentMousePointerStyle: MousePointerStyle | undefined = undefined\n\n private _currentFocusedRenderable: Renderable | null = null\n private lifecyclePasses: Set<Renderable> = new Set()\n private _openConsoleOnError: boolean = true\n private _paletteDetector: TerminalPaletteDetector | null = null\n private _paletteCache = new Map<number, TerminalColors>()\n private _paletteDetectionPromise: Promise<TerminalColors> | null = null\n private _paletteDetectionSize = 0\n private _paletteEpoch = 0\n private _nativePaletteSignature: string | null = null\n private _emittedPaletteSignature: string | null = null\n private _palettePublishGeneration = 0\n private _onDestroy?: () => void\n private themeModeState: RendererThemeMode\n private _terminalFocusState: boolean | null = null\n\n private sequenceHandlers: ((sequence: string) => boolean)[] = []\n private prependedInputHandlers: ((sequence: string) => boolean)[] = []\n private shouldRestoreModesOnNextFocus: boolean = false\n private themeModeHandler!: (sequence: string) => boolean\n\n private idleResolvers: (() => void)[] = []\n\n private _debugInputs: Array<{ timestamp: string; sequence: string }> = []\n private _debugModeEnabled: boolean = env.OTUI_DEBUG\n\n private handleError: (error: Error) => void = ((error: Error) => {\n console.error(error)\n\n if (this._openConsoleOnError) {\n this.console.show()\n }\n }).bind(this)\n\n private dumpOutputCache(optionalMessage: string = \"\"): void {\n const cachedLogs = this.console.getCachedLogs()\n const capturedConsoleOutput = capture.claimOutput()\n const capturedExternalOutputCommits = this.externalOutputQueue.claim()\n\n let capturedExternalOutput = \"\"\n for (const commit of capturedExternalOutputCommits) {\n capturedExternalOutput += `[snapshot ${commit.snapshot.width}x${commit.snapshot.height}]\\n`\n commit.snapshot.destroy()\n }\n\n if (capturedConsoleOutput.length > 0 || capturedExternalOutput.length > 0 || cachedLogs.length > 0) {\n this.realStdoutWrite.call(this.stdout, optionalMessage)\n }\n\n if (cachedLogs.length > 0) {\n this.realStdoutWrite.call(this.stdout, \"Console cache:\\n\")\n this.realStdoutWrite.call(this.stdout, cachedLogs)\n }\n\n if (capturedConsoleOutput.length > 0) {\n this.realStdoutWrite.call(this.stdout, \"\\nCaptured console output:\\n\")\n this.realStdoutWrite.call(this.stdout, capturedConsoleOutput + \"\\n\")\n }\n\n if (capturedExternalOutput.length > 0) {\n this.realStdoutWrite.call(this.stdout, \"\\nCaptured external output:\\n\")\n this.realStdoutWrite.call(this.stdout, capturedExternalOutput + \"\\n\")\n }\n\n this.realStdoutWrite.call(this.stdout, ANSI.reset)\n }\n\n private exitHandler: () => void = (() => {\n this.destroy()\n if (env.OTUI_DUMP_CAPTURES) {\n sleep(100).then(() => {\n this.dumpOutputCache(\"=== CAPTURED OUTPUT ===\\n\")\n })\n }\n }).bind(this)\n\n private warningHandler: (warning: any) => void = ((warning: any) => {\n console.warn(JSON.stringify(warning.message, null, 2))\n }).bind(this)\n\n // Stream identity flag. Used only for SIGWINCH gating (terminal-driven\n // resize only fires for process.stdout). Other per-stream behavior uses\n // identity checks inline (e.g. rendererTracker compares `stdin` directly)\n // or duck-typed capability checks (e.g. `stdin.setRawMode?.()`).\n private readonly _usesProcessStdout: boolean\n\n // Feed wiring. Non-null when the given stdout is not process.stdout and native\n // output is not explicitly redirected to a buffered memory destination.\n private _feed: NativeSpanFeed | null = null\n private _detachFeed: (() => void) | null = null\n private _detachFeedError: (() => void) | null = null\n private feedIdleRenderScheduled = false\n private ordinaryFrameWaitingForFeed = false\n private ordinaryFrameWaitControlState: RendererControlState | null = null\n\n public get controlState(): RendererControlState {\n return this._controlState\n }\n\n /**\n * Construct a renderer over the given streams.\n *\n * If `stdout` is not `process.stdout`, a `NativeSpanFeed` is allocated\n * internally and rendered bytes are piped through it to `stdout` unless\n * `bufferedOutput: \"memory\"` is set. Prefer `createCliRenderer` for the async\n * `setupTerminal` convenience.\n *\n * Construction side effects (observable before the constructor returns):\n * - Acquires exclusive ownership of the given stdin/stdout streams\n * - Allocates a `NativeSpanFeed` (for non-process stdout unless bufferedOutput is \"memory\")\n * - Calls `lib.createRenderer` → native Zig allocation\n * - Registers in the process-wide `rendererTracker`\n * - Adds `process.on(...)` listeners for SIGWINCH (process.stdout only),\n * \"warning\", \"uncaughtException\", \"unhandledRejection\", \"beforeExit\",\n * plus the configured `exitSignals`\n * - Replaces `global.requestAnimationFrame` with the renderer's impl\n * - When `setupTerminal()` is called, it will put `stdin` in raw mode and\n * call `stdin.resume()`\n *\n * Some late constructor side effects are not rolled back if construction\n * throws partway; production callers should use `createCliRenderer`, which\n * wraps `setupTerminal()` in a try/catch that calls `destroy()` on failure.\n */\n constructor(\n stdin: NodeJS.ReadStream,\n stdout: NodeJS.WriteStream,\n width: number,\n height: number,\n config: CliRendererConfig = {},\n ) {\n super()\n\n this.stdin = stdin\n this.stdout = stdout\n this._usesProcessStdout = stdout === process.stdout\n this.realStdoutWrite = stdout.write\n\n const lib = resolveRenderLib()\n const useMemoryBufferedOutput = config.bufferedOutput === \"memory\"\n const useFeedOutput = !this._usesProcessStdout && !useMemoryBufferedOutput\n const { screenMode, footerHeight, externalOutputMode } = resolveModes(config)\n const initialGeometry = calculateRenderGeometry(screenMode, width, height, footerHeight)\n const remoteMode = config.remote ?? (useFeedOutput ? true : undefined)\n\n if (rendererTracker.streamOwners.get(stdin)) {\n throw new Error(\"Cannot create CliRenderer: stdin is already used by another CliRenderer\")\n }\n if (rendererTracker.streamOwners.get(stdout)) {\n throw new Error(\"Cannot create CliRenderer: stdout is already used by another CliRenderer\")\n }\n\n // Feed allocation: only when the output target is a non-process Writable.\n // Tests use custom Writable instances too; those should exercise the same\n // output transport as production custom stdout.\n let feed: NativeSpanFeed | null = null\n if (useFeedOutput) {\n try {\n feed = NativeSpanFeed.create()\n } catch (error) {\n throw new Error(\n `Failed to allocate NativeSpanFeed for custom stdout: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n // Native renderer creation. Custom writable feed output defaults to remote\n // so Zig skips local-TTY capability-query timing assumptions; process\n // stdout and memory output preserve native auto detection.\n //\n let rendererPtr: RendererHandle | null\n try {\n rendererPtr = lib.createRenderer(initialGeometry.renderWidth, initialGeometry.renderHeight, {\n remote: remoteMode,\n feedPtr: feed?.streamPtr ?? null,\n bufferedOutput: config.bufferedOutput,\n })\n } catch (error) {\n feed?.close()\n throw error\n }\n if (!rendererPtr) {\n feed?.close()\n throw new Error(\"Failed to create renderer\")\n }\n\n // Threading defaults (on everywhere except linux, where it currently\n // crashes — likely a missing build dep).\n if (config.useThread === undefined) config.useThread = true\n if (process.platform === \"linux\") config.useThread = false\n lib.setUseThread(rendererPtr, config.useThread)\n\n const kittyConfig = config.useKittyKeyboard ?? {}\n const kittyFlags = buildKittyKeyboardFlags(kittyConfig)\n lib.setKittyKeyboardFlags(rendererPtr, kittyFlags)\n\n // Wire feed → Writable piping. The returned Promise keeps the chunk\n // pinned (refcount held) until Node's write callback fires; this turns\n // Node's Writable flow control into async backpressure for the feed.\n // Write errors are surfaced via feed.onError / console.error; we do not\n // interfere with the Writable's own error handling (matches the\n // pre-feed-integration posture where process.stdout EPIPE was the OS's\n // problem, not the renderer's).\n this._feed = feed\n if (feed) {\n this._detachFeed = feed.onData((bytes: Uint8Array) => {\n return new Promise<void>((resolve) => {\n // Renderer-owned frame bytes must bypass any later stdout.write\n // interception (e.g. split-footer capture) and go straight to the\n // caller's actual sink.\n this.realStdoutWrite.call(this.stdout, bytes, () => resolve())\n })\n })\n this._detachFeedError = feed.onError((code) => {\n console.error(`[CliRenderer] NativeSpanFeed error: code=${code}`)\n })\n }\n\n this.lib = lib\n this._terminalWidth = width\n this._terminalHeight = height\n this._useThread = config.useThread\n this._externalOutputMode = externalOutputMode\n\n this.width = initialGeometry.renderWidth\n this.height = initialGeometry.renderHeight\n this._splitHeight = initialGeometry.effectiveFooterHeight\n this.renderOffset = screenMode === \"split-footer\" ? 0 : initialGeometry.renderOffset\n\n this._footerHeight = footerHeight\n\n this.rendererPtr = rendererPtr\n this.clearOnShutdown = config.clearOnShutdown ?? true\n this.lib.setClearOnShutdown(this.rendererPtr, this.clearOnShutdown)\n\n const forwardEnvKeys = config.forwardEnvKeys ?? (config.remote === false ? [...DEFAULT_FORWARDED_ENV_KEYS] : [])\n for (const key of forwardEnvKeys) {\n const value = process.env[key]\n if (value === undefined) continue\n this.lib.setTerminalEnvVar(this.rendererPtr, key, value)\n }\n\n this.exitOnCtrlC = config.exitOnCtrlC === undefined ? true : config.exitOnCtrlC\n this.exitSignals = config.exitSignals || [\n \"SIGINT\", // Ctrl+C\n \"SIGTERM\", // Termination signal\n \"SIGQUIT\", // Ctrl+\\\n \"SIGABRT\", // Abort signal\n \"SIGHUP\", // Hangup (terminal closed)\n \"SIGBREAK\", // Ctrl+Break on Windows\n \"SIGPIPE\", // Broken pipe\n \"SIGBUS\", // Bus error\n ]\n\n this.clipboard = new Clipboard(this.lib, this.rendererPtr)\n this.resizeDebounceDelay = config.debounceDelay || 100\n this.targetFps = config.targetFps || 30\n this.maxFps = config.maxFps || 60\n this.clock = config.clock ?? new SystemClock()\n this.themeModeState = new RendererThemeMode(\n {\n queryThemeColors: () => {\n this.lib.queryThemeColors(this.rendererPtr)\n },\n },\n this.clock,\n )\n this.themeModeHandler = (sequence: string) => {\n const result = this.themeModeState.handleSequence(sequence)\n if (result.changedMode) {\n this.clearPaletteCache()\n if (this.shouldSyncNativePaletteState() || this.listenerCount(CliRenderEvents.PALETTE) > 0) {\n this.refreshPalette()\n }\n this.emit(CliRenderEvents.THEME_MODE, result.changedMode)\n }\n return result.handled\n }\n this.memorySnapshotInterval = config.memorySnapshotInterval ?? 0\n this.gatherStats = config.gatherStats || false\n this.maxStatSamples = config.maxStatSamples || 300\n this.enableMouseMovement = config.enableMouseMovement ?? true\n this._useMouse = config.useMouse ?? true\n this.autoFocus = config.autoFocus ?? true\n this.nextRenderBuffer = this.lib.getNextBuffer(this.rendererPtr)\n this.currentRenderBuffer = this.lib.getCurrentBuffer(this.rendererPtr)\n this.postProcessFns = config.postProcessFns || []\n this.prependedInputHandlers = config.prependInputHandlers || []\n\n this.root = new RootRenderable(this)\n\n if (this.memorySnapshotInterval > 0) {\n this.startMemorySnapshotTimer()\n }\n\n // Handle terminal resize via SIGWINCH, but only when attached to the\n // process's real stdout — a custom Writable wouldn't drive SIGWINCH\n // anyway, and external consumers can call `renderer.resize(w, h)` to\n // announce dimension changes themselves.\n if (this._usesProcessStdout) {\n process.on(\"SIGWINCH\", this.sigwinchHandler)\n }\n\n process.on(\"warning\", this.warningHandler)\n\n process.on(\"uncaughtException\", this.handleError)\n process.on(\"unhandledRejection\", this.handleError)\n process.on(\"beforeExit\", this.exitHandler)\n\n const useKittyForParsing = kittyConfig !== null\n this._keyHandler = new InternalKeyHandler()\n this._keyHandler.on(\"keypress\", (event) => {\n // Use the shared matcher here too. Kitty can report a non-Latin\n // character plus a base-layout `c`, and Ctrl+C should still exit.\n if (this.exitOnCtrlC && matchesKeyBinding(event, { name: \"c\", ctrl: true })) {\n process.nextTick(() => {\n this.destroy()\n })\n return\n }\n })\n\n this.addExitListeners()\n\n const stdinParserMaxBufferBytes = config.stdinParserMaxBufferBytes ?? DEFAULT_STDIN_PARSER_MAX_BUFFER_BYTES\n this.stdinParser = new StdinParser({\n timeoutMs: 20,\n maxPendingBytes: stdinParserMaxBufferBytes,\n armTimeouts: true,\n onTimeoutFlush: () => {\n this.drainStdinParser()\n },\n useKittyKeyboard: useKittyForParsing,\n protocolContext: {\n kittyKeyboardEnabled: useKittyForParsing,\n privateCapabilityRepliesActive: false,\n pixelResolutionQueryActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n },\n clock: this.clock,\n })\n\n this._console = new TerminalConsole(this, {\n ...(config.consoleOptions ?? {}),\n clock: this.clock,\n })\n this.consoleMode = config.consoleMode ?? \"console-overlay\"\n this.applyScreenMode(screenMode, false, false)\n rendererTracker.streamOwners.set(stdin, this)\n rendererTracker.streamOwners.set(stdout, this)\n this._streamLeaseAcquired = true\n rendererTracker.renderers.add(this)\n this.stdout.write = externalOutputMode === \"capture-stdout\" ? this.interceptStdoutWrite : this.realStdoutWrite\n this._openConsoleOnError = config.openConsoleOnError ?? process.env.NODE_ENV !== \"production\"\n this._onDestroy = config.onDestroy\n\n global.requestAnimationFrame = (callback: FrameRequestCallback) => {\n const id = CliRenderer.animationFrameId++\n this.animationRequest.set(id, callback)\n this.requestLive()\n return id\n }\n global.cancelAnimationFrame = (handle: number) => {\n this.animationRequest.delete(handle)\n }\n\n const window = global.window\n if (!window) {\n global.window = {} as Window & typeof globalThis\n }\n global.window.requestAnimationFrame = requestAnimationFrame\n\n // Prevents output from being written to the terminal, useful for debugging\n if (env.OTUI_NO_NATIVE_RENDER) {\n this.renderNative = () => {\n if (this._splitHeight > 0) {\n this.flushStdoutCache(this._splitHeight)\n }\n return \"rendered\"\n }\n }\n\n try {\n this.setupInput()\n } catch (error) {\n try {\n this.destroy()\n } catch (destroyError) {\n console.error(\"Error destroying renderer after input setup failure:\", destroyError)\n }\n throw error\n }\n }\n\n private addExitListeners(): void {\n if (this._exitListenersAdded || this.exitSignals.length === 0) return\n\n this.exitSignals.forEach((signal) => {\n process.addListener(signal, this.exitHandler)\n })\n\n this._exitListenersAdded = true\n }\n\n private removeExitListeners(): void {\n if (!this._exitListenersAdded || this.exitSignals.length === 0) return\n\n this.exitSignals.forEach((signal) => {\n process.removeListener(signal, this.exitHandler)\n })\n\n this._exitListenersAdded = false\n }\n\n public get isDestroyed(): boolean {\n return this._isDestroyed\n }\n\n public registerLifecyclePass(renderable: Renderable) {\n this.lifecyclePasses.add(renderable)\n }\n\n public unregisterLifecyclePass(renderable: Renderable) {\n this.lifecyclePasses.delete(renderable)\n }\n\n public getLifecyclePasses() {\n return this.lifecyclePasses\n }\n\n public get currentFocusedRenderable(): Renderable | null {\n return this._currentFocusedRenderable\n }\n\n public get currentFocusedEditor(): EditBufferRenderable | null {\n if (!this._currentFocusedRenderable) return null\n if (!isEditBufferRenderable(this._currentFocusedRenderable)) return null\n return this._currentFocusedRenderable\n }\n\n private normalizeClockTime(now: number, fallback: number): number {\n if (Number.isFinite(now)) {\n return now\n }\n\n return Number.isFinite(fallback) ? fallback : 0\n }\n\n private getElapsedMs(now: number, then: number): number {\n if (!Number.isFinite(now) || !Number.isFinite(then)) {\n return 0\n }\n\n return Math.max(now - then, 0)\n }\n\n public focusRenderable(renderable: Renderable) {\n if (this._currentFocusedRenderable === renderable) {\n return\n }\n\n const previousRenderable = this._currentFocusedRenderable\n const previousEditor = this.currentFocusedEditor\n\n this._currentFocusedRenderable = renderable\n previousRenderable?.blur()\n\n const currentEditor = this.currentFocusedEditor\n if (previousEditor !== currentEditor) {\n this.emit(CliRenderEvents.FOCUSED_EDITOR, currentEditor, previousEditor)\n }\n\n this.emit(CliRenderEvents.FOCUSED_RENDERABLE, renderable, previousRenderable)\n }\n\n public blurRenderable(renderable: Renderable): void {\n if (this._currentFocusedRenderable !== renderable) {\n return\n }\n\n const previousEditor = this.currentFocusedEditor\n this._currentFocusedRenderable = null\n\n if (previousEditor !== null) {\n this.emit(CliRenderEvents.FOCUSED_EDITOR, null, previousEditor)\n }\n\n this.emit(CliRenderEvents.FOCUSED_RENDERABLE, null, renderable)\n }\n\n private setCapturedRenderable(renderable: Renderable | undefined): void {\n if (this.capturedRenderable === renderable) {\n return\n }\n this.capturedRenderable = renderable\n }\n\n public addToHitGrid(x: number, y: number, width: number, height: number, id: number) {\n if (!this._useMouse) return\n if (id !== this.capturedRenderable?.num) {\n this.lib.addToHitGrid(this.rendererPtr, x, y, width, height, id)\n }\n }\n\n public pushHitGridScissorRect(x: number, y: number, width: number, height: number): void {\n this.lib.hitGridPushScissorRect(this.rendererPtr, x, y, width, height)\n }\n\n public popHitGridScissorRect(): void {\n this.lib.hitGridPopScissorRect(this.rendererPtr)\n }\n\n public clearHitGridScissorRects(): void {\n this.lib.hitGridClearScissorRects(this.rendererPtr)\n }\n\n public get widthMethod(): WidthMethod {\n const caps = this.capabilities\n return caps?.unicode === \"wcwidth\" ? \"wcwidth\" : \"unicode\"\n }\n\n public get frameId(): number {\n return this._frameId\n }\n\n private writeOut(chunk: any, encoding?: any, callback?: any): boolean {\n // Route through the native backend whenever:\n // (a) threading is on (pre-existing path — batches with the render thread), OR\n // (b) a feed is wired (custom stdout) — otherwise the else-branch would\n // write directly to the user's Writable, bypassing the feed and\n // causing TS-side ANSI to interleave with Zig-emitted frame bytes\n // on Linux where threading is forced off.\n if (this.rendererPtr && (this._useThread || this._feed !== null)) {\n const data = typeof chunk === \"string\" ? chunk : (chunk?.toString() ?? \"\")\n this.lib.writeOut(this.rendererPtr, data)\n if (typeof callback === \"function\") {\n process.nextTick(callback)\n }\n return true\n }\n\n return this.realStdoutWrite.call(this.stdout, chunk, encoding, callback)\n }\n\n private scheduleRenderAfterFeedIdle(): void {\n const feed = this._feed\n if (!feed || this.feedIdleRenderScheduled || this._isDestroyed) return\n\n this.feedIdleRenderScheduled = true\n feed.idle().then(() => {\n this.feedIdleRenderScheduled = false\n const ordinaryFrameWasWaiting = this.ordinaryFrameWaitingForFeed\n const ordinaryFrameWaitControlState = this.ordinaryFrameWaitControlState\n this.ordinaryFrameWaitingForFeed = false\n this.ordinaryFrameWaitControlState = null\n if (\n this._isDestroyed ||\n (ordinaryFrameWasWaiting &&\n this._controlState !== ordinaryFrameWaitControlState &&\n (this._controlState === RendererControlState.EXPLICIT_PAUSED ||\n this._controlState === RendererControlState.EXPLICIT_STOPPED ||\n this._controlState === RendererControlState.EXPLICIT_SUSPENDED))\n ) {\n this.resolveIdleIfNeeded()\n return\n }\n\n this.scheduleRenderTimer()\n this.resolveIdleIfNeeded()\n })\n }\n\n private handleNativeRenderRejection(status: number): \"retryable-skip\" | \"backpressured\" | \"failed\" {\n if (status === NATIVE_RENDER_STATUS_SKIPPED && this._feed) {\n this.ordinaryFrameWaitingForFeed = true\n this.ordinaryFrameWaitControlState = this._controlState\n this.scheduleRenderAfterFeedIdle()\n return \"retryable-skip\"\n }\n\n if (status === NATIVE_RENDER_STATUS_SKIPPED) {\n if (this._useThread && this._usesProcessStdout) return \"backpressured\"\n console.error(\"[CliRenderer] Native frame render unexpectedly skipped without a feed\")\n return \"failed\"\n }\n\n return this.reportNativeRenderFailure()\n }\n\n private reportNativeRenderFailure(): \"failed\" {\n console.error(\"[CliRenderer] Native frame render failed; waiting for the next render request to force repaint\")\n return \"failed\"\n }\n\n private scheduleRenderTimer(): void {\n if (this.renderTimeout || this._isDestroyed || this._controlState === RendererControlState.EXPLICIT_SUSPENDED)\n return\n\n const now = this.normalizeClockTime(this.clock.now(), this.lastTime)\n const elapsed = this.getElapsedMs(now, this.lastTime)\n const delay = Math.max(this.minTargetFrameTime - elapsed, 0)\n this.renderTimeout = this.clock.setTimeout(() => {\n this.renderTimeout = null\n this.loop()\n }, delay)\n }\n\n private scheduleRenderAfterBackpressure(): void {\n if (this._feed) {\n this.scheduleRenderAfterFeedIdle()\n return\n }\n\n this.scheduleRenderTimer()\n }\n\n public requestRender() {\n if (this._controlState === RendererControlState.EXPLICIT_SUSPENDED) {\n return\n }\n\n // A skipped feed-backed frame already owns the next scheduling attempt through\n // feed.idle(). Coalesce normal invalidations into that retry so split-footer\n // output and UI updates cannot start competing render passes while the feed is busy.\n if (this.feedIdleRenderScheduled) {\n return\n }\n\n if (this._isRunning) {\n if (!this.rendering && !this.renderTimeout && !this.ordinaryFrameWaitingForFeed) {\n this.scheduleRenderTimer()\n }\n return\n }\n\n if (this.ordinaryFrameWaitingForFeed) {\n return\n }\n\n // NOTE: Using a frame callback that causes a re-render while already rendering\n // leads to a continuous loop of renders.\n if (this.rendering) {\n this.immediateRerenderRequested = true\n return\n }\n\n if (!this.updateScheduled && !this.renderTimeout) {\n this.updateScheduled = true\n const now = this.normalizeClockTime(this.clock.now(), this.lastTime)\n const elapsed = this.getElapsedMs(now, this.lastTime)\n const delay = Math.max(this.minTargetFrameTime - elapsed, 0)\n\n if (delay === 0) {\n process.nextTick(() => this.activateFrame())\n return\n }\n\n this.clock.setTimeout(() => this.activateFrame(), delay)\n }\n }\n\n private async activateFrame() {\n if (!this.updateScheduled) {\n this.resolveIdleIfNeeded()\n return\n }\n\n try {\n await this.loop()\n } finally {\n this.updateScheduled = false\n this.resolveIdleIfNeeded()\n }\n }\n\n public get consoleMode(): ConsoleMode {\n return this._useConsole ? \"console-overlay\" : \"disabled\"\n }\n\n public set consoleMode(mode: ConsoleMode) {\n this._useConsole = mode === \"console-overlay\"\n if (this._useConsole) {\n this.console.activate()\n } else {\n this.console.deactivate()\n }\n }\n\n public get isRunning(): boolean {\n return this._isRunning\n }\n\n private isIdleNow(): boolean {\n if (this._isDestroyed) return true\n\n return (\n !this._isRunning &&\n !this.rendering &&\n !this.renderTimeout &&\n !this.updateScheduled &&\n !this.feedIdleRenderScheduled &&\n !this.immediateRerenderRequested\n )\n }\n\n private resolveIdleIfNeeded(): void {\n if (!this.isIdleNow()) return\n const resolvers = this.idleResolvers.splice(0)\n for (const resolve of resolvers) {\n resolve()\n }\n }\n\n public idle(): Promise<void> {\n if (this._isDestroyed) return Promise.resolve()\n if (this.isIdleNow()) return Promise.resolve()\n return new Promise<void>((resolve) => {\n this.idleResolvers.push(resolve)\n })\n }\n\n public getSchedulerState(): RendererSchedulerState {\n return {\n isRunning: this._isRunning,\n isRendering: this.rendering,\n hasScheduledRender: Boolean(this.renderTimeout || this.updateScheduled || this.immediateRerenderRequested),\n }\n }\n\n public get resolution(): PixelResolution | null {\n return this._resolution\n }\n\n public get console(): TerminalConsole {\n return this._console\n }\n\n public get keyInput(): KeyHandler {\n return this._keyHandler\n }\n\n public get _internalKeyInput(): InternalKeyHandler {\n return this._keyHandler\n }\n\n public get terminalWidth(): number {\n return this._terminalWidth\n }\n\n public get terminalHeight(): number {\n return this._terminalHeight\n }\n\n public get useThread(): boolean {\n return this._useThread\n }\n\n public get targetFps(): number {\n return this._targetFps\n }\n\n public set targetFps(targetFps: number) {\n this._targetFps = targetFps\n this.targetFrameTime = 1000 / this._targetFps\n }\n\n public get maxFps(): number {\n return this._maxFps\n }\n\n public set maxFps(maxFps: number) {\n this._maxFps = maxFps\n this.minTargetFrameTime = 1000 / this._maxFps\n }\n\n public get useMouse(): boolean {\n return this._useMouse\n }\n\n public set useMouse(useMouse: boolean) {\n if (this._useMouse === useMouse) return // No change needed\n\n this._useMouse = useMouse\n\n if (useMouse) {\n this.enableMouse()\n this.requestRender()\n } else {\n this.disableMouse()\n }\n }\n\n public get screenMode(): ScreenMode {\n return this._screenMode\n }\n\n public set screenMode(mode: ScreenMode) {\n if (this.externalOutputMode === \"capture-stdout\" && mode !== \"split-footer\") {\n if (this.pendingExternalOutputMode === \"passthrough\") {\n this.flushPendingSplitOutputBeforeLeavingSplitFooter()\n }\n\n if (this.externalOutputMode !== \"capture-stdout\") {\n this.applyScreenMode(mode)\n return\n }\n\n throw new Error('externalOutputMode \"capture-stdout\" requires screenMode \"split-footer\"')\n }\n\n this.applyScreenMode(mode)\n }\n\n public get footerHeight(): number {\n return this._footerHeight\n }\n\n public set footerHeight(footerHeight: number) {\n const normalizedFooterHeight = normalizeFooterHeight(footerHeight)\n if (normalizedFooterHeight === this._footerHeight) {\n return\n }\n\n this._footerHeight = normalizedFooterHeight\n if (this.screenMode === \"split-footer\") {\n this.applyScreenMode(\"split-footer\")\n }\n }\n\n public get externalOutputMode(): ExternalOutputMode {\n return this._externalOutputMode\n }\n\n public set externalOutputMode(mode: ExternalOutputMode) {\n if (mode === \"capture-stdout\" && this.screenMode !== \"split-footer\") {\n throw new Error('externalOutputMode \"capture-stdout\" requires screenMode \"split-footer\"')\n }\n\n const previousMode = this._externalOutputMode\n if (previousMode === mode) {\n if (this.pendingExternalOutputMode !== null && this.pendingExternalOutputMode !== mode) {\n this.pendingExternalOutputMode = null\n }\n return\n }\n\n const canFlushSplitOutputBeforeTransition = this.canFlushSplitOutputBeforeTransition()\n const isSplitCaptureToPassthrough =\n previousMode === \"capture-stdout\" &&\n mode === \"passthrough\" &&\n this._screenMode === \"split-footer\" &&\n this._splitHeight > 0\n\n if (isSplitCaptureToPassthrough && this.externalOutputQueue.size > 0 && !canFlushSplitOutputBeforeTransition) {\n this.pendingExternalOutputMode = \"passthrough\"\n return\n }\n\n if (isSplitCaptureToPassthrough && canFlushSplitOutputBeforeTransition) {\n this.flushPendingSplitOutputBeforeTransition()\n }\n\n this.pendingExternalOutputMode = null\n this.applyExternalOutputMode(mode)\n this.afterExternalOutputModeChanged(previousMode, mode)\n }\n\n private applyExternalOutputMode(mode: ExternalOutputMode): void {\n this._externalOutputMode = mode\n this.stdout.write = mode === \"capture-stdout\" ? this.interceptStdoutWrite : this.realStdoutWrite\n }\n\n private afterExternalOutputModeChanged(previousMode: ExternalOutputMode, mode: ExternalOutputMode): void {\n if (this._screenMode === \"split-footer\" && this._splitHeight > 0 && mode === \"capture-stdout\") {\n const previousSurfaceTopLine = this.renderOffset + 1\n const previousSurfaceHeight = this._splitHeight\n\n this.clearPendingSplitFooterTransition()\n this.resetSplitScrollback(this.getSplitCursorSeedRows())\n\n if (previousMode === \"passthrough\" && this._terminalIsSetup) {\n const nextSurfaceTopLine = this.renderOffset + 1\n if (previousSurfaceTopLine !== nextSurfaceTopLine) {\n this.setPendingSplitFooterTransition({\n mode: \"clear-stale-rows\",\n sourceTopLine: previousSurfaceTopLine,\n sourceHeight: previousSurfaceHeight,\n targetTopLine: nextSurfaceTopLine,\n targetHeight: this._splitHeight,\n scrollLines: 0,\n })\n this.forceFullRepaintRequested = true\n }\n }\n\n this.requestRender()\n return\n }\n\n if (\n this._screenMode === \"split-footer\" &&\n this._splitHeight > 0 &&\n previousMode === \"capture-stdout\" &&\n mode === \"passthrough\"\n ) {\n this.clearPendingSplitFooterTransition()\n return\n }\n\n this.syncSplitFooterState()\n }\n\n private applyPendingExternalOutputModeIfReady(): void {\n const pendingMode = this.pendingExternalOutputMode\n if (pendingMode === null || this.externalOutputQueue.size > 0) {\n return\n }\n\n const previousMode = this._externalOutputMode\n this.pendingExternalOutputMode = null\n\n if (previousMode === pendingMode) {\n return\n }\n\n this.applyExternalOutputMode(pendingMode)\n this.afterExternalOutputModeChanged(previousMode, pendingMode)\n }\n\n private flushPendingSplitOutputBeforeLeavingSplitFooter(): void {\n if (this.pendingExternalOutputMode !== \"passthrough\") {\n return\n }\n\n if (this.isSplitCursorSeedFrameBlocked() && this._controlState !== RendererControlState.EXPLICIT_SUSPENDED) {\n this.abortSplitStartupCursorSeed()\n }\n\n this.flushPendingSplitOutputBeforeTransition()\n\n if (this.pendingExternalOutputMode !== null) {\n throw new Error(\"Cannot leave split-footer while captured output is pending\")\n }\n }\n\n public get liveRequestCount(): number {\n return this.liveRequestCounter\n }\n\n public get currentControlState(): string {\n return this._controlState\n }\n\n public get capabilities(): TerminalCapabilities | null {\n return this._capabilities\n }\n\n public triggerNotification(message: string, title?: string): boolean {\n if (this._isDestroyed) return false\n return this.lib.triggerNotification(this.rendererPtr, message, title)\n }\n\n public get themeMode(): ThemeMode | null {\n return this.themeModeState.themeMode\n }\n\n public waitForThemeMode(timeoutMs: number = 1000): Promise<ThemeMode | null> {\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new Error(\"timeoutMs must be a non-negative finite number\")\n }\n\n return this.themeModeState.waitForThemeMode(timeoutMs, this._isDestroyed)\n }\n\n public getDebugInputs(): Array<{ timestamp: string; sequence: string }> {\n return [...this._debugInputs]\n }\n\n public get useKittyKeyboard(): boolean {\n return this.lib.getKittyKeyboardFlags(this.rendererPtr) > 0\n }\n\n public set useKittyKeyboard(use: boolean) {\n const flags = use ? KITTY_FLAG_DISAMBIGUATE | KITTY_FLAG_ALTERNATE_KEYS : 0\n this.lib.setKittyKeyboardFlags(this.rendererPtr, flags)\n }\n\n public createScrollbackSurface(options: ScrollbackSurfaceOptions = {}): ScrollbackSurface {\n if (this._screenMode !== \"split-footer\" || this._externalOutputMode !== \"capture-stdout\") {\n throw new Error(\n 'createScrollbackSurface requires screenMode \"split-footer\" and externalOutputMode \"capture-stdout\"',\n )\n }\n\n const renderer = this\n const surfaceId = scrollbackSurfaceCounter++\n const startOnNewLine = options.startOnNewLine ?? true\n const tailColumn = renderer.getPendingSplitTailColumn()\n const firstLineOffset = !startOnNewLine && tailColumn > 0 && tailColumn < renderer.width ? tailColumn : 0\n\n const snapshotContext = new ScrollbackSnapshotRenderContext(renderer.width, 1, renderer.widthMethod)\n let firstLineOffsetOwner: Renderable | null = null\n const renderContext = Object.create(snapshotContext) as RenderContext\n Object.defineProperty(renderContext, \"claimFirstLineOffset\", {\n value: (renderable?: Renderable): number => {\n if (firstLineOffsetOwner?.isDestroyed) {\n firstLineOffsetOwner = null\n }\n\n if (firstLineOffsetOwner) {\n return 0\n }\n\n firstLineOffsetOwner = renderable ?? null\n return firstLineOffset\n },\n enumerable: true,\n configurable: true,\n })\n\n const internalRoot = new RootRenderable(renderContext)\n const publicRoot = new BoxRenderable(renderContext, {\n id: `scrollback-surface-root-${surfaceId}`,\n position: \"absolute\",\n left: 0,\n top: 0,\n width: renderer.width,\n height: \"auto\",\n border: false,\n backgroundColor: \"transparent\",\n shouldFill: false,\n flexDirection: \"column\",\n })\n internalRoot.add(publicRoot)\n\n let surfaceWidth = renderer.width\n let surfaceHeight = 1\n let surfaceWidthMethod = renderer.widthMethod\n let surfaceDestroyed = false\n let hasRendered = false\n let nextCommitStartOnNewLine = startOnNewLine\n let backingBuffer = OptimizedBuffer.create(surfaceWidth, surfaceHeight, surfaceWidthMethod, {\n id: `scrollback-surface-buffer-${surfaceId}`,\n })\n\n const destroyListener = (): void => {\n destroySurface()\n }\n\n const assertNotDestroyed = (): void => {\n if (surfaceDestroyed) {\n throw new Error(\"ScrollbackSurface is destroyed\")\n }\n }\n\n const assertRendered = (): void => {\n if (!hasRendered) {\n throw new Error(\"ScrollbackSurface.commitRows requires render() before commitRows()\")\n }\n }\n\n const assertGeometryStillCurrent = (): void => {\n if (renderer.width !== surfaceWidth || renderer.widthMethod !== surfaceWidthMethod) {\n throw new Error(\"ScrollbackSurface.commitRows requires render() after renderer geometry changes\")\n }\n }\n\n const assertRowRange = (startRow: number, endRowExclusive: number): void => {\n if (!Number.isInteger(startRow) || !Number.isInteger(endRowExclusive)) {\n throw new Error(\"ScrollbackSurface.commitRows requires finite integer row bounds\")\n }\n\n if (startRow < 0) {\n throw new Error(\"ScrollbackSurface.commitRows requires startRow >= 0\")\n }\n\n if (endRowExclusive < startRow) {\n throw new Error(\"ScrollbackSurface.commitRows requires endRowExclusive >= startRow\")\n }\n\n if (endRowExclusive > surfaceHeight) {\n throw new Error(\"ScrollbackSurface.commitRows row range exceeds rendered surface height\")\n }\n }\n\n const collectPendingCodeRenderables = (node: Renderable): CodeRenderable[] => {\n const pending: CodeRenderable[] = []\n\n if (node instanceof CodeRenderable && node.isHighlighting) {\n pending.push(node)\n }\n\n for (const child of node.getChildren()) {\n pending.push(...collectPendingCodeRenderables(child))\n }\n\n return pending\n }\n\n const waitForPendingHighlights = async (pending: CodeRenderable[], timeoutMs: number): Promise<void> => {\n await new Promise<void>((resolve, reject) => {\n let settled = false\n const timeoutHandle = renderer.clock.setTimeout(() => {\n if (settled) {\n return\n }\n\n settled = true\n reject(new Error(\"ScrollbackSurface.settle timed out waiting for CodeRenderable highlighting\"))\n }, timeoutMs)\n\n Promise.all(pending.map((renderable) => renderable.highlightingDone)).then(\n () => {\n if (settled) {\n return\n }\n\n settled = true\n renderer.clock.clearTimeout(timeoutHandle)\n resolve()\n },\n (error) => {\n if (settled) {\n return\n }\n\n settled = true\n renderer.clock.clearTimeout(timeoutHandle)\n reject(error)\n },\n )\n })\n }\n\n const renderSurface = (): void => {\n assertNotDestroyed()\n\n const width = renderer.width\n const widthMethod = renderer.widthMethod\n\n snapshotContext.width = width\n snapshotContext.widthMethod = widthMethod\n publicRoot.width = width\n\n const renderPass = (height: number): void => {\n snapshotContext.height = height\n internalRoot.resize(width, height)\n backingBuffer.resize(width, height)\n backingBuffer.clear(TRANSPARENT_RGBA)\n snapshotContext.frameId += 1\n internalRoot.render(backingBuffer, 0)\n }\n\n let targetHeight = Math.max(1, surfaceHeight)\n\n if (surfaceWidthMethod !== widthMethod) {\n backingBuffer.destroy()\n backingBuffer = OptimizedBuffer.create(width, targetHeight, widthMethod, {\n id: `scrollback-surface-buffer-${surfaceId}`,\n })\n } else {\n backingBuffer.resize(width, targetHeight)\n }\n\n for (let pass = 0; pass < MAX_SCROLLBACK_SURFACE_HEIGHT_PASSES; pass += 1) {\n renderPass(targetHeight)\n\n const measuredHeight = Math.max(1, publicRoot.height)\n if (measuredHeight === targetHeight) {\n surfaceWidth = width\n surfaceHeight = measuredHeight\n surfaceWidthMethod = widthMethod\n hasRendered = true\n return\n }\n\n targetHeight = measuredHeight\n }\n\n renderPass(targetHeight)\n\n surfaceWidth = width\n surfaceHeight = targetHeight\n surfaceWidthMethod = widthMethod\n hasRendered = true\n }\n\n const settleSurface = async (timeoutMs: number = 2000): Promise<void> => {\n assertNotDestroyed()\n\n const startedAt = renderer.clock.now()\n renderSurface()\n\n while (true) {\n assertNotDestroyed()\n\n const pending = collectPendingCodeRenderables(publicRoot)\n if (pending.length === 0) {\n return\n }\n\n const remainingMs = timeoutMs - (renderer.clock.now() - startedAt)\n if (remainingMs <= 0) {\n throw new Error(\"ScrollbackSurface.settle timed out waiting for CodeRenderable highlighting\")\n }\n\n await waitForPendingHighlights(pending, remainingMs)\n assertNotDestroyed()\n renderSurface()\n }\n }\n\n const commitRows = (\n startRow: number,\n endRowExclusive: number,\n commitOptions: ScrollbackSurfaceCommitOptions = {},\n ): void => {\n assertNotDestroyed()\n assertRendered()\n assertGeometryStillCurrent()\n assertRowRange(startRow, endRowExclusive)\n\n if (startRow === endRowExclusive) {\n return\n }\n\n const rowCount = endRowExclusive - startRow\n const commitBuffer = OptimizedBuffer.create(surfaceWidth, rowCount, surfaceWidthMethod, {\n id: `scrollback-surface-commit-${surfaceId}`,\n })\n\n try {\n commitBuffer.drawFrameBuffer(0, 0, backingBuffer, 0, startRow, surfaceWidth, rowCount)\n\n renderer.enqueueRenderedScrollbackCommit({\n snapshot: commitBuffer,\n rowColumns: commitOptions.rowColumns,\n startOnNewLine: nextCommitStartOnNewLine,\n trailingNewline: commitOptions.trailingNewline ?? true,\n })\n\n nextCommitStartOnNewLine = false\n } catch (error) {\n commitBuffer.destroy()\n throw error\n }\n }\n\n const destroySurface = (): void => {\n if (surfaceDestroyed) {\n return\n }\n\n surfaceDestroyed = true\n renderer.off(CliRenderEvents.DESTROY, destroyListener)\n\n let destroyError: unknown = null\n\n try {\n internalRoot.destroyRecursively()\n } catch (error) {\n destroyError = error\n }\n\n try {\n backingBuffer.destroy()\n } catch (error) {\n if (destroyError === null) {\n destroyError = error\n }\n }\n\n renderContext.removeAllListeners()\n snapshotContext.removeAllListeners()\n\n if (destroyError !== null) {\n throw destroyError\n }\n }\n\n renderer.on(CliRenderEvents.DESTROY, destroyListener)\n\n return {\n get renderContext(): RenderContext {\n return renderContext\n },\n get root(): Renderable {\n return publicRoot\n },\n get width(): number {\n return surfaceWidth\n },\n get height(): number {\n return surfaceHeight\n },\n get isDestroyed(): boolean {\n return surfaceDestroyed\n },\n render: renderSurface,\n settle: settleSurface,\n commitRows,\n destroy: destroySurface,\n }\n }\n\n // writeToScrollback is a \"render to scrollback commit\" API, not a direct stdout\n // write. The callback returns a renderable tree, we render that tree into an\n // off-screen OptimizedBuffer, then enqueue the result as one ExternalOutputCommit.\n //\n // Why this shape exists:\n // - It keeps app-authored scrollback output in the same FIFO queue as captured\n // stdout, so ordering is deterministic even when both sources interleave.\n // - It lets the render loop batch multiple queued commits into one native frame,\n // which is the key mechanism that avoids repeated sync/cursor toggles (flicker).\n // - It reuses the normal renderable pipeline (layout, styling, grapheme shaping),\n // so scrollback payloads match what users see in the live UI.\n //\n // startOnNewLine and trailingNewline preserve newline intent when one logical\n // write spans multiple commits. startOnNewLine adds a newline before this commit\n // if the previous commit ended mid-row. trailingNewline adds a newline after this\n // commit's final row.\n //\n // Native split append uses these flags to avoid glued rows (missing newline), and\n // double-advance gaps (extra newline), while still appending payload and repainting\n // footer in the same frame.\n //\n // Side effects: throws if split-footer capture mode is not active, transfers\n // snapshot buffer ownership to the queue on success, triggers async render,\n // and invokes snapshot teardown when cleanup runs.\n public writeToScrollback(write: ScrollbackWriter): void {\n if (this._screenMode !== \"split-footer\" || this._externalOutputMode !== \"capture-stdout\") {\n throw new Error('writeToScrollback requires screenMode \"split-footer\" and externalOutputMode \"capture-stdout\"')\n }\n\n const snapshotContext = new ScrollbackSnapshotRenderContext(this.width, this.height, this.widthMethod)\n const snapshot = write({\n width: this.width,\n widthMethod: this.widthMethod,\n tailColumn: this.getPendingSplitTailColumn(),\n renderContext: snapshotContext,\n })\n\n if (!snapshot || !snapshot.root) {\n throw new Error(\"writeToScrollback must return a snapshot root renderable\")\n }\n\n let renderFailed = false\n let snapshotRoot: RootRenderable | null = null\n let snapshotBuffer: OptimizedBuffer | null = null\n\n try {\n const rootRenderable = snapshot.root\n const snapshotWidth = this.getSnapshotWidth(snapshot.width, rootRenderable.width)\n const snapshotHeight = this.getSnapshotHeight(snapshot.height, rootRenderable.height)\n\n snapshotContext.width = snapshotWidth\n snapshotContext.height = snapshotHeight\n snapshotContext.widthMethod = this.widthMethod\n\n snapshotRoot = new RootRenderable(snapshotContext)\n snapshotBuffer = OptimizedBuffer.create(snapshotWidth, snapshotHeight, this.widthMethod, {\n id: \"scrollback-snapshot-commit\",\n })\n\n // Render through normal renderables so split scrollback output uses the same\n // text shaping/styling pipeline as the rest of the renderer.\n snapshotRoot.add(rootRenderable)\n snapshotRoot.render(snapshotBuffer, 0)\n this.enqueueRenderedScrollbackCommit({\n snapshot: snapshotBuffer,\n rowColumns: snapshot.rowColumns,\n startOnNewLine: snapshot.startOnNewLine,\n trailingNewline: snapshot.trailingNewline,\n })\n } catch (error) {\n renderFailed = true\n snapshotBuffer?.destroy()\n throw error\n } finally {\n let cleanupError: unknown | null = null\n\n try {\n if (snapshotRoot) {\n snapshotRoot.destroyRecursively()\n } else {\n snapshot.root.destroyRecursively()\n }\n } catch (error) {\n cleanupError = error\n }\n\n try {\n snapshot.teardown?.()\n } catch (error) {\n if (cleanupError === null) {\n cleanupError = error\n }\n }\n\n if (!renderFailed && cleanupError) {\n throw cleanupError\n }\n }\n }\n\n public resetSplitFooterForReplay(options: SplitFooterReplayResetOptions = {}): void {\n if (this._isDestroyed) return\n if (this._screenMode !== \"split-footer\" || this._externalOutputMode !== \"capture-stdout\") {\n throw new Error(\n 'resetSplitFooterForReplay requires screenMode \"split-footer\" and externalOutputMode \"capture-stdout\"',\n )\n }\n if (!this._terminalIsSetup || this._controlState === RendererControlState.EXPLICIT_SUSPENDED) {\n throw new Error(\"resetSplitFooterForReplay requires an active terminal\")\n }\n\n this.flushPendingSplitOutputBeforeTransition(true)\n this.externalOutputQueue.clear()\n this.abortSplitStartupCursorSeed()\n this.clearPendingSplitFooterTransition()\n this.resetSplitScrollback()\n this.currentRenderBuffer.clear(this.backgroundColor)\n this.nextRenderBuffer.clear(this.backgroundColor)\n this.forceFullRepaintRequested = true\n this.writeOut(\n ANSI.resetScrollRegion +\n ANSI.reset +\n ANSI.home +\n ANSI.clearScreen +\n (options.clearSavedLines ? ANSI.clearSavedLines : \"\") +\n ANSI.home,\n )\n this.requestRender()\n }\n\n private getSnapshotWidth(value: number | undefined, fallback: number): number {\n const rawValue = value ?? fallback\n\n if (!Number.isFinite(rawValue)) {\n throw new Error(\"writeToScrollback produced a non-finite width\")\n }\n\n return Math.min(Math.max(Math.trunc(rawValue), 1), Math.max(this.width, 1))\n }\n\n private getSnapshotHeight(value: number | undefined, fallback: number): number {\n const rawValue = value ?? fallback\n\n if (!Number.isFinite(rawValue)) {\n throw new Error(\"writeToScrollback produced a non-finite height\")\n }\n\n return Math.max(Math.trunc(rawValue), 1)\n }\n\n private getSnapshotRowWidths(snapshot: OptimizedBuffer, rowColumns: number): number[] {\n const widths: number[] = []\n const limit = Math.min(Math.max(Math.trunc(rowColumns), 0), snapshot.width)\n const chars = snapshot.buffers.char\n\n for (let y = 0; y < snapshot.height; y += 1) {\n let x = limit\n\n while (x > 0) {\n const cp = chars[y * snapshot.width + x - 1]\n if (cp === 0 || (cp & CHAR_FLAG_MASK) === CHAR_FLAG_CONTINUATION) {\n x -= 1\n continue\n }\n\n break\n }\n\n widths.push(x)\n }\n\n return widths\n }\n\n private advanceSplitTailColumn(tailColumn: number, columns: number, width: number): number {\n if (columns <= 0) {\n return tailColumn\n }\n\n let tail = tailColumn\n let remaining = columns\n\n while (remaining > 0) {\n if (tail >= width) {\n tail = 0\n }\n\n const step = Math.min(remaining, width - tail)\n tail += step\n remaining -= step\n\n if (remaining > 0 && tail >= width) {\n tail = 0\n }\n }\n\n return tail\n }\n\n private getSplitTailColumnAfterCommit(\n commit: ExternalOutputCommit,\n initialTailColumn: number,\n width: number,\n ): number {\n let tailColumn = initialTailColumn\n\n if (commit.startOnNewLine && tailColumn > 0) {\n tailColumn = 0\n }\n\n const rowWidths = this.getSnapshotRowWidths(commit.snapshot, commit.rowColumns)\n for (const [index, rowWidth] of rowWidths.entries()) {\n tailColumn = this.advanceSplitTailColumn(tailColumn, rowWidth, width)\n if (index < rowWidths.length - 1 || commit.trailingNewline) {\n tailColumn = 0\n }\n }\n\n return tailColumn\n }\n\n private recordSplitCommit(commit: ExternalOutputCommit): void {\n this.splitTailColumn = this.getSplitTailColumnAfterCommit(commit, this.splitTailColumn, Math.max(this.width, 1))\n }\n\n private getPendingSplitTailColumn(): number {\n const width = Math.max(this.width, 1)\n let tailColumn = this.splitTailColumn\n\n for (const commit of this.externalOutputQueue.peek()) {\n tailColumn = this.getSplitTailColumnAfterCommit(commit, tailColumn, width)\n }\n\n return tailColumn\n }\n\n private enqueueRenderedScrollbackCommit(options: {\n snapshot: OptimizedBuffer\n rowColumns?: number\n startOnNewLine?: boolean\n trailingNewline?: boolean\n }): void {\n if (this._screenMode !== \"split-footer\" || this._externalOutputMode !== \"capture-stdout\") {\n throw new Error('scrollback commit requires screenMode \"split-footer\" and externalOutputMode \"capture-stdout\"')\n }\n\n const rowColumns = Math.min(\n Math.max(Math.trunc(options.rowColumns ?? options.snapshot.width), 0),\n options.snapshot.width,\n )\n\n this.enqueueSplitCommit({\n snapshot: options.snapshot,\n rowColumns,\n startOnNewLine: options.startOnNewLine ?? true,\n trailingNewline: options.trailingNewline ?? true,\n })\n\n this.requestRender()\n }\n\n private enqueueSplitCommit(commit: ExternalOutputCommit): void {\n this.externalOutputQueue.writeSnapshot(commit)\n if (this.listenerCount(CliRenderEvents.EXTERNAL_OUTPUT) > 0) {\n this.emit(CliRenderEvents.EXTERNAL_OUTPUT, commit)\n }\n }\n\n private createStdoutSnapshotCommit(line: string, trailingNewline: boolean): ExternalOutputCommit {\n // Convert captured stdout into the same commit shape used by writeToScrollback.\n // One commit format keeps split append behavior consistent across both sources.\n const snapshotContext = new ScrollbackSnapshotRenderContext(this.width, 1, this.widthMethod)\n const maxWidth = Math.max(1, this.width)\n const lineCells = [...line]\n const rowColumns = Math.min(lineCells.length, maxWidth)\n const renderedLine = lineCells.slice(0, maxWidth).join(\"\")\n const snapshotRoot = new RootRenderable(snapshotContext)\n const snapshotRenderable = new TextRenderable(snapshotContext, {\n id: \"captured-stdout-snapshot\",\n position: \"absolute\",\n left: 0,\n top: 0,\n width: Math.max(1, rowColumns),\n height: 1,\n content: renderedLine,\n })\n const snapshotBuffer = OptimizedBuffer.create(Math.max(1, rowColumns), 1, this.widthMethod, {\n id: \"captured-stdout-snapshot\",\n })\n\n try {\n snapshotRoot.add(snapshotRenderable)\n snapshotRoot.render(snapshotBuffer, 0)\n return {\n snapshot: snapshotBuffer,\n rowColumns,\n startOnNewLine: false,\n trailingNewline,\n }\n } catch (error) {\n snapshotBuffer.destroy()\n throw error\n } finally {\n snapshotRoot.destroyRecursively()\n }\n }\n\n private splitStdoutRows(text: string): Array<{ line: string; trailingNewline: boolean }> {\n // Captured stdout arrives as an arbitrary byte stream, but split append commits\n // are row-based (line text + whether that row ended with '\\n'). We normalize\n // here because native split append expects already-decoded row intent, not raw\n // control characters.\n //\n // '\\r' must restart the in-progress row so in-place status updates (progress\n // bars/spinners) do not accumulate stale prefixes in scrollback. '\\n' commits\n // the row and marks newline intent for the final chunk of that logical row.\n const rows: Array<{ line: string; trailingNewline: boolean }> = []\n let current = \"\"\n\n for (const char of text) {\n if (char === \"\\r\") {\n current = \"\"\n continue\n }\n\n if (char === \"\\n\") {\n rows.push({ line: current, trailingNewline: true })\n current = \"\"\n continue\n }\n\n current += char\n }\n\n if (current.length > 0) {\n rows.push({ line: current, trailingNewline: false })\n }\n\n return rows\n }\n\n private createStdoutSnapshotCommits(text: string): ExternalOutputCommit[] {\n if (text.length === 0) {\n return []\n }\n\n // Chunk captured stdout into width-bounded row commits so each commit is a\n // small, deterministic append step. This keeps bursty output smooth while\n // preserving newline ownership on the final chunk of each logical row.\n const commits: ExternalOutputCommit[] = []\n // Split commits are row-oriented snapshots. We chunk by renderer width so each\n // commit maps to a single logical terminal row append operation.\n const chunkWidth = Math.max(1, this.width)\n for (const row of this.splitStdoutRows(text)) {\n const rowCells = [...row.line]\n if (rowCells.length === 0) {\n // Preserve empty-line writes: newline-only chunks still need a commit so\n // split scrollback state advances correctly in native code.\n commits.push(this.createStdoutSnapshotCommit(\"\", row.trailingNewline))\n continue\n }\n\n let offset = 0\n while (offset < rowCells.length) {\n const chunk = rowCells.slice(offset, offset + chunkWidth).join(\"\")\n offset += chunkWidth\n const isLastChunk = offset >= rowCells.length\n // Only the final wrapped chunk carries newline intent.\n commits.push(this.createStdoutSnapshotCommit(chunk, isLastChunk ? row.trailingNewline : false))\n }\n }\n\n return commits\n }\n\n private flushPendingSplitCommits(\n forceFooterRepaint: boolean = false,\n drainAll: boolean = false,\n ): \"rendered\" | \"backpressured\" | \"failed\" {\n // Drain only a bounded prefix so one JS render pass maps to one native frame.\n // Remaining commits are intentionally left queued and rendered on subsequent\n // ticks to avoid giant multi-thousand-cell frames that can flicker.\n const commits = this.externalOutputQueue.peek(drainAll ? Number.POSITIVE_INFINITY : this.maxSplitCommitsPerFrame)\n let hasCommittedOutput = false\n const lastCommitIndex = commits.length - 1\n let acceptedCommits = 0\n let nativeBackpressured = false\n let nativeFailed = false\n\n for (const [index, commit] of commits.entries()) {\n // Force repaint only on the last commit in a frame. Repainting after every\n // chunk negates batching and reintroduces duplicate clear/move traffic.\n const forceCommit = forceFooterRepaint && index === lastCommitIndex\n // beginFrame/finalizeFrame tell native code whether this commit opens or\n // closes the shared frame envelope. Intermediate commits append payload only.\n const beginFrame = index === 0\n const finalizeFrame = index === lastCommitIndex\n\n // Keep split append policy in native code so every producer (captured stdout\n // and writeToScrollback) shares the same cursor/scrollback invariants.\n const nativeResult = this.lib.commitSplitFooterSnapshot(\n this.rendererPtr,\n commit.snapshot,\n commit.rowColumns,\n commit.startOnNewLine,\n commit.trailingNewline,\n this.getSplitPinnedRenderOffset(),\n forceCommit,\n beginFrame,\n finalizeFrame,\n )\n if (nativeResult.status === NATIVE_RENDER_STATUS_SKIPPED) {\n nativeBackpressured = true\n break\n }\n\n if (nativeResult.status === NATIVE_RENDER_STATUS_FAILED) {\n nativeFailed = true\n break\n }\n\n this.renderOffset = nativeResult.renderOffset\n this.recordSplitCommit(commit)\n hasCommittedOutput = true\n acceptedCommits++\n }\n\n if (acceptedCommits > 0) {\n this.externalOutputQueue.drop(acceptedCommits)\n }\n\n if (nativeFailed) {\n return this.reportNativeRenderFailure()\n }\n\n if (nativeBackpressured) {\n this.scheduleRenderAfterFeedIdle()\n return \"backpressured\"\n }\n\n if (!hasCommittedOutput) {\n const nativeResult = this.lib.repaintSplitFooter(\n this.rendererPtr,\n this.getSplitPinnedRenderOffset(),\n forceFooterRepaint,\n )\n if (nativeResult.status === NATIVE_RENDER_STATUS_SKIPPED) {\n this.scheduleRenderAfterFeedIdle()\n return \"backpressured\"\n }\n if (nativeResult.status === NATIVE_RENDER_STATUS_FAILED) {\n return this.reportNativeRenderFailure()\n }\n this.renderOffset = nativeResult.renderOffset\n }\n\n this.pendingSplitFooterTransition = null\n\n if (this.externalOutputQueue.size > 0) {\n // Preserve FIFO ordering without doing unbounded work in one tick.\n // This keeps sustained stdout bursts smooth instead of blocking on one frame.\n this.requestRender()\n } else {\n this.applyPendingExternalOutputModeIfReady()\n }\n\n return \"rendered\"\n }\n\n private interceptStdoutWrite = (chunk: any, encoding?: any, callback?: any): boolean => {\n const resolvedCallback = typeof encoding === \"function\" ? encoding : callback\n const resolvedEncoding = typeof encoding === \"string\" ? encoding : undefined\n const text = typeof chunk === \"string\" ? chunk : (chunk?.toString(resolvedEncoding) ?? \"\")\n\n if (this._externalOutputMode === \"capture-stdout\" && this._screenMode === \"split-footer\" && this._splitHeight > 0) {\n // Capture mode intentionally diverts stdout into split commit snapshots\n // instead of writing directly to process stdout. Native flushing will append\n // and repaint in one controlled frame, which is what avoids footer flicker.\n const commits = this.createStdoutSnapshotCommits(text)\n for (const commit of commits) {\n this.enqueueSplitCommit(commit)\n }\n\n if (commits.length > 0) {\n // Defer actual terminal writes to the render loop so commits can be batched.\n this.requestRender()\n }\n }\n\n if (typeof resolvedCallback === \"function\") {\n process.nextTick(resolvedCallback)\n }\n\n return true\n }\n\n private getSplitPinnedRenderOffset(): number {\n return this._screenMode === \"split-footer\" ? Math.max(this._terminalHeight - this._splitHeight, 0) : 0\n }\n\n private getSplitCursorSeedRows(): number {\n const cursorState = this.lib.getCursorState(this.rendererPtr)\n const cursorRow = Number.isFinite(cursorState.y) ? Math.max(Math.trunc(cursorState.y), 1) : 1\n return Math.min(cursorRow, Math.max(this._terminalHeight, 1))\n }\n\n private isSplitCursorSeedFrameBlocked(): boolean {\n return (\n this._screenMode === \"split-footer\" &&\n this._externalOutputMode === \"capture-stdout\" &&\n this._splitHeight > 0 &&\n this.pendingSplitStartupCursorSeed &&\n this.splitStartupSeedTimeoutId !== null\n )\n }\n\n private canFlushSplitOutputBeforeTransition(allowSuspended: boolean = false, allowUnsetup: boolean = false): boolean {\n return (\n (this._terminalIsSetup || allowUnsetup) &&\n (allowSuspended || this._controlState !== RendererControlState.EXPLICIT_SUSPENDED) &&\n !this.isSplitCursorSeedFrameBlocked()\n )\n }\n\n private clearSplitStartupCursorSeed(): void {\n this.pendingSplitStartupCursorSeed = false\n if (this.splitStartupSeedTimeoutId !== null) {\n this.clock.clearTimeout(this.splitStartupSeedTimeoutId)\n this.splitStartupSeedTimeoutId = null\n }\n }\n\n private abortSplitStartupCursorSeed(): void {\n this.clearSplitStartupCursorSeed()\n this.stdinParser?.abortPendingStartupCursorCpr()\n this.updateStdinParserProtocolContext({ startupCursorCprActive: false })\n }\n\n private flushPendingSplitOutputBeforeTransition(\n forceFooterRepaint: boolean = false,\n options: { allowSuspended?: boolean; allowPassthrough?: boolean; allowUnsetup?: boolean } = {},\n ): void {\n const hasDeferredCapturedOutput = this.externalOutputQueue.size > 0 || this.pendingExternalOutputMode !== null\n if (\n this._screenMode !== \"split-footer\" ||\n this._splitHeight <= 0 ||\n (this._externalOutputMode !== \"capture-stdout\" && !(options.allowPassthrough && hasDeferredCapturedOutput))\n ) {\n return\n }\n\n if (!this.canFlushSplitOutputBeforeTransition(options.allowSuspended ?? false, options.allowUnsetup ?? false)) {\n return\n }\n\n if (this.externalOutputQueue.size === 0 && !forceFooterRepaint) {\n this.applyPendingExternalOutputModeIfReady()\n return\n }\n\n this.flushPendingSplitCommits(this._externalOutputMode === \"capture-stdout\" ? forceFooterRepaint : false, true)\n }\n\n private resetSplitScrollback(seedRows: number = 0): void {\n this.splitTailColumn = 0\n this.renderOffset = this.lib.resetSplitScrollback(this.rendererPtr, seedRows, this.getSplitPinnedRenderOffset())\n }\n\n private syncSplitScrollback(): void {\n this.renderOffset = this.lib.syncSplitScrollback(this.rendererPtr, this.getSplitPinnedRenderOffset())\n }\n\n private getSplitOutputOffset(surfaceOffset: number = this.renderOffset): number {\n return this.lib.getSplitOutputOffset(this.rendererPtr, surfaceOffset)\n }\n\n private clearPendingSplitFooterTransition(): void {\n if (this.pendingSplitFooterTransition === null) {\n return\n }\n\n this.pendingSplitFooterTransition = null\n this.lib.clearPendingSplitFooterTransition(this.rendererPtr)\n }\n\n private setPendingSplitFooterTransition(transition: PendingSplitFooterTransition): void {\n this.pendingSplitFooterTransition = transition\n this.lib.setPendingSplitFooterTransition(\n this.rendererPtr,\n transition.mode === \"viewport-scroll\" ? 1 : 2,\n transition.sourceTopLine,\n transition.sourceHeight,\n transition.targetTopLine,\n transition.targetHeight,\n transition.scrollLines ?? 0,\n )\n }\n\n private syncSplitFooterState(): void {\n const splitActive = this._screenMode === \"split-footer\" && this._splitHeight > 0\n\n if (!splitActive) {\n this.clearPendingSplitFooterTransition()\n this.splitTailColumn = 0\n this.lib.resetSplitScrollback(this.rendererPtr, 0, 0)\n this.renderOffset = 0\n this.lib.setRenderOffset(this.rendererPtr, this.renderOffset)\n return\n }\n\n if (this._externalOutputMode === \"capture-stdout\") {\n this.syncSplitScrollback()\n } else {\n this.clearPendingSplitFooterTransition()\n this.splitTailColumn = 0\n this.lib.resetSplitScrollback(this.rendererPtr, 0, 0)\n this.renderOffset = this.getSplitPinnedRenderOffset()\n this.lib.setRenderOffset(this.rendererPtr, this.renderOffset)\n }\n }\n\n private clearStaleSplitSurfaceRows(\n previousTopLine: number,\n previousHeight: number,\n nextTopLine: number,\n nextHeight: number,\n ): void {\n if (!this._terminalIsSetup || previousHeight <= 0 || this._terminalHeight <= 0) {\n return\n }\n\n const terminalBottom = this._terminalHeight\n const previousStart = Math.max(1, previousTopLine)\n const previousEnd = Math.min(terminalBottom, previousTopLine + previousHeight - 1)\n\n if (previousEnd < previousStart) {\n return\n }\n\n const nextStart = Math.max(1, nextTopLine)\n const nextEnd = Math.min(terminalBottom, nextTopLine + Math.max(nextHeight, 0) - 1)\n\n let clear = \"\"\n for (let line = previousStart; line <= previousEnd; line += 1) {\n if (line >= nextStart && line <= nextEnd) {\n continue\n }\n\n clear += `${ANSI.moveCursor(line, 1)}\\x1b[2K`\n }\n\n if (clear.length > 0) {\n this.writeOut(clear)\n }\n }\n\n private applyScreenMode(screenMode: ScreenMode, emitResize: boolean = true, requestRender: boolean = true): void {\n const prevScreenMode = this._screenMode\n const prevSplitHeight = this._splitHeight\n const nextGeometry = calculateRenderGeometry(\n screenMode,\n this._terminalWidth,\n this._terminalHeight,\n this._footerHeight,\n )\n const nextSplitHeight = nextGeometry.effectiveFooterHeight\n\n if (prevScreenMode === screenMode && prevSplitHeight === nextSplitHeight) {\n return\n }\n\n const terminalWritable = this._terminalIsSetup && this._controlState !== RendererControlState.EXPLICIT_SUSPENDED\n const prevUseAlternateScreen = prevScreenMode === \"alternate-screen\"\n const nextUseAlternateScreen = screenMode === \"alternate-screen\"\n const terminalScreenModeChanged = this._terminalIsSetup && prevUseAlternateScreen !== nextUseAlternateScreen\n const leavingSplitFooter = prevSplitHeight > 0 && nextSplitHeight === 0\n\n if (terminalWritable && prevSplitHeight > 0) {\n this.flushPendingSplitOutputBeforeTransition()\n }\n\n const previousSurfaceTopLine = this.renderOffset + 1\n const shouldDeferSplitFooterResizeTransition =\n this._terminalIsSetup &&\n prevScreenMode === \"split-footer\" &&\n screenMode === \"split-footer\" &&\n this._externalOutputMode === \"capture-stdout\" &&\n prevSplitHeight > 0 &&\n nextSplitHeight > 0 &&\n !terminalScreenModeChanged\n const splitStartupSeedBlocksFirstNativeFrame =\n this.pendingSplitStartupCursorSeed && this.splitStartupSeedTimeoutId !== null\n const splitTransitionSourceTopLine = this.pendingSplitFooterTransition?.sourceTopLine ?? previousSurfaceTopLine\n const splitTransitionSourceHeight = this.pendingSplitFooterTransition?.sourceHeight ?? prevSplitHeight\n const splitTransitionSourceSurfaceOffset = Math.max(splitTransitionSourceTopLine - 1, 0)\n const splitTransitionSourceOutputOffset =\n prevScreenMode === \"split-footer\" && prevSplitHeight > 0 && this._externalOutputMode === \"capture-stdout\"\n ? this.getSplitOutputOffset(splitTransitionSourceSurfaceOffset)\n : splitTransitionSourceSurfaceOffset\n const nextPinnedRenderOffset = nextGeometry.renderOffset\n const nextSplitOutputOffset =\n screenMode === \"split-footer\" && nextSplitHeight > 0 && this._externalOutputMode === \"capture-stdout\"\n ? this.getSplitOutputOffset(nextPinnedRenderOffset)\n : nextPinnedRenderOffset\n const pendingSplitFooterTransition = this.pendingSplitFooterTransition\n const pendingSplitFooterReturn =\n pendingSplitFooterTransition !== null && nextSplitHeight === splitTransitionSourceHeight\n const pendingSplitFooterViewportReturn =\n pendingSplitFooterReturn &&\n pendingSplitFooterTransition.mode === \"viewport-scroll\" &&\n (pendingSplitFooterTransition.scrollLines ?? 0) > 0\n const shrinkingSplitFooter = nextSplitHeight > 0 && nextSplitHeight < splitTransitionSourceHeight\n const growingSplitFooter = nextSplitHeight > splitTransitionSourceHeight && splitTransitionSourceHeight > 0\n const nextSplitSurfaceOffset =\n screenMode !== \"split-footer\" || nextSplitHeight === 0\n ? 0\n : pendingSplitFooterViewportReturn\n ? pendingSplitFooterTransition.targetTopLine - 1\n : pendingSplitFooterReturn\n ? splitTransitionSourceSurfaceOffset\n : shrinkingSplitFooter && splitTransitionSourceSurfaceOffset > 0\n ? splitTransitionSourceSurfaceOffset\n : shrinkingSplitFooter\n ? nextSplitOutputOffset\n : growingSplitFooter\n ? Math.max(\n nextSplitOutputOffset,\n Math.min(splitTransitionSourceSurfaceOffset, nextPinnedRenderOffset),\n )\n : nextPinnedRenderOffset\n const splitTransitionTargetTopLine = nextSplitSurfaceOffset + 1\n const splitViewportScrollLines = pendingSplitFooterViewportReturn\n ? (pendingSplitFooterTransition.scrollLines ?? 0)\n : nextSplitHeight > 0 && !pendingSplitFooterReturn\n ? Math.max(splitTransitionSourceOutputOffset - nextSplitOutputOffset, 0)\n : 0\n const splitTransitionMode =\n (!shrinkingSplitFooter || pendingSplitFooterViewportReturn) && splitViewportScrollLines > 0\n ? \"viewport-scroll\"\n : \"clear-stale-rows\"\n const splitFooterSurfaceMovesDown = nextSplitSurfaceOffset > splitTransitionSourceSurfaceOffset\n const splitFooterSurfaceLeavesStaleRows = splitFooterSurfaceMovesDown || shrinkingSplitFooter\n const shouldClearSplitSurfaceRowsImmediately =\n terminalWritable &&\n !terminalScreenModeChanged &&\n !shouldDeferSplitFooterResizeTransition &&\n splitFooterSurfaceLeavesStaleRows &&\n nextSplitHeight > 0\n\n if (terminalWritable && leavingSplitFooter) {\n this.clearPendingSplitFooterTransition()\n this.renderOffset = 0\n this.lib.setRenderOffset(this.rendererPtr, 0)\n }\n\n if (terminalWritable && !terminalScreenModeChanged && !shouldDeferSplitFooterResizeTransition) {\n if (prevSplitHeight === 0 && nextSplitHeight > 0) {\n const freedLines = this._terminalHeight - nextSplitHeight\n const scrollDown = ANSI.scrollDown(freedLines)\n this.writeOut(scrollDown)\n } else if (splitViewportScrollLines > 0) {\n const additionalLines = splitViewportScrollLines\n const scrollUp = ANSI.scrollUp(additionalLines)\n this.writeOut(scrollUp)\n }\n }\n\n this._screenMode = screenMode\n this._splitHeight = nextSplitHeight\n this.width = nextGeometry.renderWidth\n this.height = nextGeometry.renderHeight\n\n this.lib.resizeRenderer(this.rendererPtr, this.width, this.height)\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n if (prevScreenMode !== \"split-footer\") {\n this.resetSplitScrollback(this.getSplitCursorSeedRows())\n } else {\n this.renderOffset = nextSplitSurfaceOffset\n this.lib.setRenderOffset(this.rendererPtr, this.renderOffset)\n }\n\n if (shouldDeferSplitFooterResizeTransition) {\n if (splitStartupSeedBlocksFirstNativeFrame) {\n this.clearPendingSplitFooterTransition()\n } else {\n this.setPendingSplitFooterTransition({\n mode: splitTransitionMode,\n sourceTopLine: splitTransitionSourceTopLine,\n sourceHeight: splitTransitionSourceHeight,\n targetTopLine: splitTransitionTargetTopLine,\n targetHeight: nextSplitHeight,\n scrollLines: splitViewportScrollLines,\n })\n }\n this.forceFullRepaintRequested = true\n } else if (shouldClearSplitSurfaceRowsImmediately) {\n this.clearPendingSplitFooterTransition()\n this.clearStaleSplitSurfaceRows(\n splitTransitionSourceTopLine,\n splitTransitionSourceHeight,\n splitTransitionTargetTopLine,\n nextSplitHeight,\n )\n } else {\n this.clearPendingSplitFooterTransition()\n }\n } else {\n this.syncSplitFooterState()\n if (shouldClearSplitSurfaceRowsImmediately) {\n this.clearStaleSplitSurfaceRows(\n splitTransitionSourceTopLine,\n splitTransitionSourceHeight,\n this.renderOffset + 1,\n nextSplitHeight,\n )\n }\n }\n\n this.nextRenderBuffer = this.lib.getNextBuffer(this.rendererPtr)\n this.currentRenderBuffer = this.lib.getCurrentBuffer(this.rendererPtr)\n\n this._console.resize(this.width, this.height)\n this.root.resize(this.width, this.height)\n\n if (terminalScreenModeChanged) {\n if (terminalWritable) {\n this.lib.suspendRenderer(this.rendererPtr)\n this.lib.setupTerminal(this.rendererPtr, nextUseAlternateScreen)\n this.pendingSuspendedTerminalSetup = false\n } else {\n this.pendingSuspendedTerminalSetup = true\n }\n\n if (terminalWritable && this._useMouse) {\n this.enableMouse()\n }\n }\n\n if (emitResize) {\n this.emit(CliRenderEvents.RESIZE, this.width, this.height)\n }\n\n if (requestRender) {\n this.requestRender()\n }\n }\n\n // TODO: Move this to native\n private flushStdoutCache(space: number, force: boolean = false): boolean {\n if (this.externalOutputQueue.size === 0 && !force) return false\n\n const outputCommits = this.externalOutputQueue.claim()\n let output = \"\"\n for (const commit of outputCommits) {\n output += `[snapshot ${commit.snapshot.width}x${commit.snapshot.height}]\\n`\n commit.snapshot.destroy()\n }\n\n const rendererStartLine = this.renderOffset + 1\n const flush = ANSI.moveCursorAndClear(rendererStartLine, 1)\n\n const outputLine = this.renderOffset + 1\n const move = ANSI.moveCursor(outputLine, 1)\n\n let clear = \"\"\n if (space > 0) {\n const backgroundColor = this.backgroundColor.toInts()\n const newlines = \" \".repeat(this.width) + \"\\n\".repeat(space)\n // Check if background is transparent (alpha = 0)\n if (backgroundColor[3] === 0) {\n clear = newlines\n } else {\n clear =\n ANSI.setRgbBackground(backgroundColor[0], backgroundColor[1], backgroundColor[2]) +\n newlines +\n ANSI.resetBackground\n }\n }\n\n this.writeOut(flush + move + output + clear)\n\n return true\n }\n\n private enableMouse(): void {\n this._useMouse = true\n this.lib.enableMouse(this.rendererPtr, this.enableMouseMovement)\n }\n\n private disableMouse(): void {\n this._useMouse = false\n this.setCapturedRenderable(undefined)\n this.stdinParser?.resetMouseState()\n this.lib.disableMouse(this.rendererPtr)\n }\n\n public enableKittyKeyboard(flags: number = 0b00011): void {\n this.lib.enableKittyKeyboard(this.rendererPtr, flags)\n this.updateStdinParserProtocolContext({ kittyKeyboardEnabled: true })\n }\n\n public disableKittyKeyboard(): void {\n this.lib.disableKittyKeyboard(this.rendererPtr)\n this.updateStdinParserProtocolContext({ kittyKeyboardEnabled: false }, true)\n }\n\n public set useThread(useThread: boolean) {\n this._useThread = useThread\n this.lib.setUseThread(this.rendererPtr, useThread)\n }\n\n // TODO: All input management may move to native when zig finally has async io support again,\n // without rolling a full event loop\n public async setupTerminal(): Promise<void> {\n if (this._terminalIsSetup) return\n this._terminalIsSetup = true\n\n const startupCursorCprActive = this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\"\n this.updateStdinParserProtocolContext({\n privateCapabilityRepliesActive: true,\n explicitWidthCprActive: true,\n startupCursorCprActive,\n })\n this.lib.setupTerminal(this.rendererPtr, this._screenMode === \"alternate-screen\")\n this._capabilities = this.lib.getTerminalCapabilities(this.rendererPtr)\n\n if (this.debugOverlay.enabled) {\n this.lib.setDebugOverlay(this.rendererPtr, true, this.debugOverlay.corner)\n if (!this.memorySnapshotInterval) {\n this.memorySnapshotInterval = 3000\n this.startMemorySnapshotTimer()\n this.automaticMemorySnapshot = true\n }\n }\n\n this.capabilityTimeoutId = this.clock.setTimeout(() => {\n this.capabilityTimeoutId = null\n this.clearSplitStartupCursorSeed()\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.requestRender()\n }\n\n this.removeInputHandler(this.capabilityHandler)\n this.updateStdinParserProtocolContext(\n {\n privateCapabilityRepliesActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n },\n true,\n )\n this.resolveXtVersionWaiters()\n }, 5000)\n\n if (this._useMouse) {\n this.enableMouse()\n }\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.pendingSplitStartupCursorSeed = true\n\n if (this.splitStartupSeedTimeoutId !== null) {\n this.clock.clearTimeout(this.splitStartupSeedTimeoutId)\n }\n\n this.splitStartupSeedTimeoutId = this.clock.setTimeout(() => {\n this.splitStartupSeedTimeoutId = null\n\n if (!this.pendingSplitStartupCursorSeed) {\n return\n }\n\n this.updateStdinParserProtocolContext({ startupCursorCprActive: false })\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.requestRender()\n }\n\n this.flushPendingSplitOutputBeforeTransition(false, { allowPassthrough: true })\n }, 120)\n }\n\n this.queryPixelResolution()\n if (this.shouldSyncNativePaletteState()) {\n this.refreshPalette()\n }\n\n // Feed-backed startup writes are async relative to the JS Writable. Wait\n // until they drain so callers can safely destroy immediately after\n // createCliRenderer() resolves.\n if (this._feed?.isBackpressured()) {\n await this._feed.idle()\n }\n }\n\n private stdinListener: (chunk: Buffer | string) => void = ((chunk: Buffer | string) => {\n const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n if (!this.stdinParser) return\n\n try {\n this.stdinParser.push(data)\n this.drainStdinParser()\n } catch (error) {\n this.handleStdinParserFailure(error)\n }\n }).bind(this)\n\n public addInputHandler(handler: (sequence: string) => boolean): void {\n this.sequenceHandlers.push(handler)\n }\n\n public prependInputHandler(handler: (sequence: string) => boolean): void {\n this.sequenceHandlers.unshift(handler)\n }\n\n public removeInputHandler(handler: (sequence: string) => boolean): void {\n this.sequenceHandlers = this.sequenceHandlers.filter((candidate) => candidate !== handler)\n }\n\n private updateStdinParserProtocolContext(patch: Partial<StdinParserProtocolContext>, drain = false): void {\n if (!this.stdinParser) return\n this.stdinParser.updateProtocolContext(patch)\n if (drain) this.drainStdinParser()\n }\n\n public subscribeOsc(handler: (sequence: string) => void): () => void {\n this.oscSubscribers.add(handler)\n return () => {\n this.oscSubscribers.delete(handler)\n }\n }\n\n private processCapabilitySequence(sequence: string, hasCursorReport: boolean): boolean {\n const hasStandardCapabilitySignature = isCapabilityResponse(sequence)\n const shouldProcessAsCapability =\n hasStandardCapabilitySignature || (hasCursorReport && this.capabilityTimeoutId !== null)\n\n if (!shouldProcessAsCapability) {\n return false\n }\n\n this.lib.processCapabilityResponse(this.rendererPtr, sequence)\n this._capabilities = this.lib.getTerminalCapabilities(this.rendererPtr)\n if (this._capabilities?.terminal?.from_xtversion) {\n this.resolveXtVersionWaiters()\n }\n if (hasStandardCapabilitySignature) {\n this.forceFullRepaintRequested = true\n this.requestRender()\n }\n this.emit(CliRenderEvents.CAPABILITIES, this._capabilities)\n\n const hadPendingSplitStartupCursorSeed = this.pendingSplitStartupCursorSeed\n\n if (\n hadPendingSplitStartupCursorSeed &&\n hasCursorReport &&\n this._screenMode === \"split-footer\" &&\n this._externalOutputMode === \"capture-stdout\"\n ) {\n this.resetSplitScrollback(this.getSplitCursorSeedRows())\n this.clearPendingSplitFooterTransition()\n this.clearSplitStartupCursorSeed()\n this.updateStdinParserProtocolContext({ startupCursorCprActive: false })\n\n this.requestRender()\n if (this.pendingExternalOutputMode === \"passthrough\") {\n this.flushPendingSplitOutputBeforeTransition()\n }\n }\n\n const consumeStartupCursorReport =\n hadPendingSplitStartupCursorSeed && hasCursorReport && this.splitStartupSeedTimeoutId !== null\n\n return hasStandardCapabilitySignature || consumeStartupCursorReport\n }\n\n private capabilityHandler: (sequence: string) => boolean = ((sequence: string) => {\n return this.processCapabilitySequence(sequence, false)\n }).bind(this)\n\n private focusHandler: (sequence: string) => boolean = ((sequence: string) => {\n if (sequence === \"\\x1b[I\") {\n // When the terminal regains focus, some terminal emulators (notably\n // Windows Terminal / ConPTY) may have stripped DEC private modes like\n // mouse tracking, bracketed paste, and focus tracking itself while the\n // window was unfocused.\n if (this.shouldRestoreModesOnNextFocus) {\n this.lib.restoreTerminalModes(this.rendererPtr)\n this.shouldRestoreModesOnNextFocus = false\n }\n if (this._terminalFocusState !== true) {\n this._terminalFocusState = true\n this.emit(CliRenderEvents.FOCUS)\n }\n return true\n }\n if (sequence === \"\\x1b[O\") {\n this.shouldRestoreModesOnNextFocus = true\n if (this._terminalFocusState !== false) {\n this._terminalFocusState = false\n this.emit(CliRenderEvents.BLUR)\n }\n return true\n }\n return false\n }).bind(this)\n\n private dispatchSequenceHandlers(sequence: string): boolean {\n if (this._debugModeEnabled) {\n this._debugInputs.push({\n timestamp: new Date().toISOString(),\n sequence,\n })\n }\n\n for (const handler of this.sequenceHandlers) {\n if (handler(sequence)) {\n return true\n }\n }\n\n return false\n }\n\n private drainStdinParser(): void {\n if (!this.stdinParser) return\n\n this.stdinParser.drain((event) => {\n this.handleStdinEvent(event)\n })\n }\n\n private handleStdinEvent(event: StdinEvent): void {\n switch (event.type) {\n case \"key\":\n if (this.dispatchSequenceHandlers(event.raw)) {\n return\n }\n\n this._keyHandler.processParsedKey(event.key)\n return\n case \"mouse\":\n if (this._useMouse && this.processSingleMouseEvent(event.event)) {\n return\n }\n\n this.dispatchSequenceHandlers(event.raw)\n return\n case \"paste\":\n this._keyHandler.processPaste(event.bytes, event.metadata)\n return\n case \"response\":\n if (event.protocol === \"osc\") {\n for (const subscriber of this.oscSubscribers) {\n subscriber(event.sequence)\n }\n }\n\n if (event.protocol === \"cpr\" && this.processCapabilitySequence(event.sequence, true)) {\n return\n }\n\n this.dispatchSequenceHandlers(event.sequence)\n return\n }\n }\n\n private handleStdinParserFailure(error: unknown): void {\n if (!this.hasLoggedStdinParserError) {\n this.hasLoggedStdinParserError = true\n if (process.env.NODE_ENV !== \"test\") {\n console.error(\"[stdin-parser-error] parser failure, resetting parser\", error)\n }\n }\n\n try {\n this.stdinParser?.reset()\n } catch (resetError) {\n console.error(\"stdin parser reset failed after parser error\", resetError)\n }\n }\n\n private setupInput(): void {\n for (const handler of this.prependedInputHandlers) {\n this.addInputHandler(handler)\n }\n\n this.addInputHandler((sequence: string) => {\n if (isPixelResolutionResponse(sequence) && this.waitingForPixelResolution) {\n const resolution = parsePixelResolution(sequence)\n if (resolution) {\n this._resolution = resolution\n }\n this.waitingForPixelResolution = false\n this.updateStdinParserProtocolContext({ pixelResolutionQueryActive: false }, true)\n return true\n }\n return false\n })\n this.addInputHandler(this.capabilityHandler)\n this.addInputHandler(this.focusHandler)\n this.addInputHandler(this.themeModeHandler)\n\n if (this.stdin.setRawMode) {\n this.stdin.setRawMode(true)\n }\n\n this.stdin.on(\"data\", this.stdinListener)\n this.stdin.resume()\n }\n\n private dispatchMouseEvent(\n target: Renderable,\n attributes: RawMouseEvent & { source?: Renderable; isDragging?: boolean },\n ): MouseEvent {\n const event = new MouseEvent(target, attributes)\n target.processMouseEvent(event)\n\n if (this.autoFocus && event.type === \"down\" && event.button === MouseButton.LEFT && !event.defaultPrevented) {\n let current: Renderable | null = target\n while (current) {\n if (current.focusable) {\n current.focus()\n break\n }\n current = current.parent\n }\n }\n\n return event\n }\n\n private processSingleMouseEvent(mouseEvent: RawMouseEvent): boolean {\n if (this._splitHeight > 0) {\n if (mouseEvent.y < this.renderOffset) {\n return false\n }\n mouseEvent.y -= this.renderOffset\n }\n\n this._latestPointer.x = mouseEvent.x\n this._latestPointer.y = mouseEvent.y\n this._hasPointer = true\n this._lastPointerModifiers = mouseEvent.modifiers\n\n if (this._console.visible) {\n const consoleBounds = this._console.bounds\n if (\n mouseEvent.x >= consoleBounds.x &&\n mouseEvent.x < consoleBounds.x + consoleBounds.width &&\n mouseEvent.y >= consoleBounds.y &&\n mouseEvent.y < consoleBounds.y + consoleBounds.height\n ) {\n const event = new MouseEvent(null, mouseEvent)\n const handled = this._console.handleMouse(event)\n if (handled) return true\n }\n }\n\n if (mouseEvent.type === \"scroll\") {\n const maybeRenderableId = this.hitTest(mouseEvent.x, mouseEvent.y)\n const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId)\n const fallbackTarget =\n this._currentFocusedRenderable &&\n !this._currentFocusedRenderable.isDestroyed &&\n this._currentFocusedRenderable.focused\n ? this._currentFocusedRenderable\n : null\n const scrollTarget = maybeRenderable ?? fallbackTarget\n\n if (scrollTarget) {\n const event = new MouseEvent(scrollTarget, mouseEvent)\n scrollTarget.processMouseEvent(event)\n }\n return true\n }\n\n const maybeRenderableId = this.hitTest(mouseEvent.x, mouseEvent.y)\n const sameElement = maybeRenderableId === this.lastOverRenderableNum\n this.lastOverRenderableNum = maybeRenderableId\n const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId)\n\n if (\n mouseEvent.type === \"down\" &&\n mouseEvent.button === MouseButton.LEFT &&\n !this.currentSelection?.isDragging &&\n !mouseEvent.modifiers.ctrl\n ) {\n const canStartSelection = Boolean(\n maybeRenderable &&\n maybeRenderable.selectable &&\n !maybeRenderable.isDestroyed &&\n maybeRenderable.shouldStartSelection(mouseEvent.x, mouseEvent.y),\n )\n\n if (canStartSelection && maybeRenderable) {\n this.startSelection(maybeRenderable, mouseEvent.x, mouseEvent.y)\n this.dispatchMouseEvent(maybeRenderable, mouseEvent)\n return true\n }\n }\n\n if (mouseEvent.type === \"drag\" && this.currentSelection?.isDragging) {\n this.updateSelection(maybeRenderable, mouseEvent.x, mouseEvent.y)\n\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n isDragging: true,\n })\n maybeRenderable.processMouseEvent(event)\n }\n\n return true\n }\n\n if (mouseEvent.type === \"up\" && this.currentSelection?.isDragging) {\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n isDragging: true,\n })\n maybeRenderable.processMouseEvent(event)\n }\n\n this.finishSelection()\n return true\n }\n\n if (mouseEvent.type === \"down\" && mouseEvent.button === MouseButton.LEFT && this.currentSelection) {\n if (mouseEvent.modifiers.ctrl) {\n this.currentSelection.isDragging = true\n this.updateSelection(maybeRenderable, mouseEvent.x, mouseEvent.y)\n return true\n }\n }\n\n if (!sameElement && (mouseEvent.type === \"drag\" || mouseEvent.type === \"move\")) {\n if (\n this.lastOverRenderable &&\n this.lastOverRenderable !== this.capturedRenderable &&\n !this.lastOverRenderable.isDestroyed\n ) {\n const event = new MouseEvent(this.lastOverRenderable, {\n ...mouseEvent,\n type: \"out\",\n })\n this.lastOverRenderable.processMouseEvent(event)\n }\n this.lastOverRenderable = maybeRenderable\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n type: \"over\",\n source: this.capturedRenderable,\n })\n maybeRenderable.processMouseEvent(event)\n }\n }\n\n if (this.capturedRenderable && mouseEvent.type !== \"up\") {\n const event = new MouseEvent(this.capturedRenderable, mouseEvent)\n this.capturedRenderable.processMouseEvent(event)\n return true\n }\n\n if (this.capturedRenderable && mouseEvent.type === \"up\") {\n const event = new MouseEvent(this.capturedRenderable, {\n ...mouseEvent,\n type: \"drag-end\",\n })\n this.capturedRenderable.processMouseEvent(event)\n this.capturedRenderable.processMouseEvent(new MouseEvent(this.capturedRenderable, mouseEvent))\n if (maybeRenderable) {\n const event = new MouseEvent(maybeRenderable, {\n ...mouseEvent,\n type: \"drop\",\n source: this.capturedRenderable,\n })\n maybeRenderable.processMouseEvent(event)\n }\n this.lastOverRenderable = this.capturedRenderable\n this.lastOverRenderableNum = this.capturedRenderable.num\n this.setCapturedRenderable(undefined)\n // Dropping the renderable needs to push another frame when the renderer is not live\n // to update the hit grid, otherwise capturedRenderable won't be in the hit grid and will not receive mouse events\n this.requestRender()\n }\n\n let event: MouseEvent | undefined\n if (maybeRenderable) {\n if (mouseEvent.type === \"drag\" && mouseEvent.button === MouseButton.LEFT) {\n this.setCapturedRenderable(maybeRenderable)\n } else {\n this.setCapturedRenderable(undefined)\n }\n event = this.dispatchMouseEvent(maybeRenderable, mouseEvent)\n } else {\n this.setCapturedRenderable(undefined)\n this.lastOverRenderable = undefined\n }\n\n if (!event?.defaultPrevented && mouseEvent.type === \"down\" && this.currentSelection) {\n this.clearSelection()\n }\n\n return true\n }\n\n /**\n * Recheck hover state after hit grid changes.\n * Called after render when native code detects the hit grid changed.\n * Fires out/over events if the element under the cursor changed.\n */\n private recheckHoverState(): void {\n if (this._isDestroyed || !this._hasPointer) return\n if (this.capturedRenderable) return\n\n const hitId = this.hitTest(this._latestPointer.x, this._latestPointer.y)\n const hitRenderable = Renderable.renderablesByNumber.get(hitId)\n const lastOver = this.lastOverRenderable\n\n // No change\n if (lastOver?.num === hitId) {\n this.lastOverRenderableNum = hitId\n return\n }\n\n const baseEvent: RawMouseEvent = {\n type: \"move\",\n button: 0,\n x: this._latestPointer.x,\n y: this._latestPointer.y,\n modifiers: this._lastPointerModifiers,\n }\n\n // Fire out on old element\n if (lastOver && !lastOver.isDestroyed) {\n const event = new MouseEvent(lastOver, { ...baseEvent, type: \"out\" })\n lastOver.processMouseEvent(event)\n }\n\n this.lastOverRenderable = hitRenderable\n this.lastOverRenderableNum = hitId\n\n // Fire over on new element\n if (hitRenderable) {\n const event = new MouseEvent(hitRenderable, {\n ...baseEvent,\n type: \"over\",\n })\n hitRenderable.processMouseEvent(event)\n }\n }\n public setMousePointer(style: MousePointerStyle): void {\n this._currentMousePointerStyle = style\n this.lib.setCursorStyleOptions(this.rendererPtr, { cursor: style })\n }\n\n public hitTest(x: number, y: number): number {\n return this.lib.checkHit(this.rendererPtr, x, y)\n }\n\n private takeMemorySnapshot(): void {\n if (this._isDestroyed) return\n\n const memoryUsage = process.memoryUsage()\n this.lastMemorySnapshot = {\n heapUsed: memoryUsage.heapUsed,\n heapTotal: memoryUsage.heapTotal,\n arrayBuffers: memoryUsage.arrayBuffers,\n }\n\n this.lib.updateMemoryStats(\n this.rendererPtr,\n this.lastMemorySnapshot.heapUsed,\n this.lastMemorySnapshot.heapTotal,\n this.lastMemorySnapshot.arrayBuffers,\n )\n\n this.emit(CliRenderEvents.MEMORY_SNAPSHOT, this.lastMemorySnapshot)\n }\n\n private startMemorySnapshotTimer(): void {\n this.stopMemorySnapshotTimer()\n\n this.memorySnapshotTimer = this.clock.setInterval(() => {\n this.takeMemorySnapshot()\n }, this.memorySnapshotInterval)\n }\n\n private stopMemorySnapshotTimer(): void {\n if (this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n }\n\n public setMemorySnapshotInterval(interval: number): void {\n this.memorySnapshotInterval = interval\n\n if (this._isRunning && interval > 0) {\n this.startMemorySnapshotTimer()\n } else if (interval <= 0 && this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n }\n\n private handleResize(width: number, height: number): void {\n if (this._isDestroyed) return\n if (this._splitHeight > 0) {\n this.processResize(width, height)\n return\n }\n\n if (this.resizeTimeoutId !== null) {\n this.clock.clearTimeout(this.resizeTimeoutId)\n this.resizeTimeoutId = null\n }\n\n this.resizeTimeoutId = this.clock.setTimeout(() => {\n this.resizeTimeoutId = null\n this.processResize(width, height)\n }, this.resizeDebounceDelay)\n }\n\n private queryPixelResolution() {\n this.waitingForPixelResolution = true\n this.updateStdinParserProtocolContext({ pixelResolutionQueryActive: true })\n this.lib.queryPixelResolution(this.rendererPtr)\n }\n\n private processResize(width: number, height: number): void {\n if (width === this._terminalWidth && height === this._terminalHeight) return\n\n if (\n this._terminalIsSetup &&\n this._controlState !== RendererControlState.EXPLICIT_SUSPENDED &&\n !this.isSplitCursorSeedFrameBlocked()\n ) {\n this.flushPendingSplitOutputBeforeTransition()\n }\n\n const pendingSplitFooterTransition = this.pendingSplitFooterTransition\n const previousGeometry = calculateRenderGeometry(\n this._screenMode,\n this._terminalWidth,\n this._terminalHeight,\n this._footerHeight,\n )\n const prevWidth = this._terminalWidth\n const previousTerminalHeight = this._terminalHeight\n const visiblePreviousSplitHeight =\n pendingSplitFooterTransition?.sourceHeight ?? previousGeometry.effectiveFooterHeight\n\n this._terminalWidth = width\n this._terminalHeight = height\n this.queryPixelResolution()\n\n this.setCapturedRenderable(undefined)\n this.stdinParser?.resetMouseState()\n\n const nextGeometry = calculateRenderGeometry(\n this._screenMode,\n this._terminalWidth,\n this._terminalHeight,\n this._footerHeight,\n )\n const splitFooterActive = this._screenMode === \"split-footer\"\n\n if (splitFooterActive) {\n // Width shrink historically needs a broader scrub band, but if resize interrupts\n // a deferred footer transition we also need to clear from that visible source surface.\n let clearStart: number | null = null\n\n if (width < prevWidth && visiblePreviousSplitHeight > 0) {\n clearStart = Math.max(previousTerminalHeight - visiblePreviousSplitHeight * 2, 1)\n }\n\n if (pendingSplitFooterTransition !== null) {\n clearStart =\n clearStart === null\n ? pendingSplitFooterTransition.sourceTopLine\n : Math.min(clearStart, pendingSplitFooterTransition.sourceTopLine)\n }\n\n if (clearStart !== null) {\n const flush = ANSI.moveCursorAndClear(clearStart, 1)\n this.writeOut(flush)\n }\n\n this.currentRenderBuffer.clear(this.backgroundColor)\n }\n\n this.clearPendingSplitFooterTransition()\n\n this._splitHeight = nextGeometry.effectiveFooterHeight\n this.width = nextGeometry.renderWidth\n this.height = nextGeometry.renderHeight\n\n this.lib.resizeRenderer(this.rendererPtr, this.width, this.height)\n\n if (this._screenMode === \"split-footer\" && this._externalOutputMode === \"capture-stdout\") {\n this.syncSplitScrollback()\n } else {\n this.syncSplitFooterState()\n }\n\n this.nextRenderBuffer = this.lib.getNextBuffer(this.rendererPtr)\n this.currentRenderBuffer = this.lib.getCurrentBuffer(this.rendererPtr)\n this._console.resize(this.width, this.height)\n this.root.resize(this.width, this.height)\n this.emit(CliRenderEvents.RESIZE, this.width, this.height)\n this.requestRender()\n }\n\n /**\n * Programmatically resize the renderer to new dimensions.\n *\n * Use this for externally-driven resize events — for example, an SSH\n * `window-change` signal or a test harness simulating a terminal resize.\n * When the renderer is attached to `process.stdout`, `SIGWINCH` is handled\n * automatically and callers do not need this method.\n */\n public resize(width: number, height: number): void {\n if (this._isDestroyed) return\n this.processResize(width, height)\n }\n\n public setBackgroundColor(color: ColorInput): void {\n const parsedColor = parseColor(color)\n this.lib.setBackgroundColor(this.rendererPtr, parsedColor as RGBA)\n this.backgroundColor = parsedColor as RGBA\n this.nextRenderBuffer.clear(parsedColor as RGBA)\n this.requestRender()\n }\n\n public toggleDebugOverlay(): void {\n const willBeEnabled = !this.debugOverlay.enabled\n\n if (willBeEnabled && !this.memorySnapshotInterval) {\n this.memorySnapshotInterval = 3000\n this.startMemorySnapshotTimer()\n this.automaticMemorySnapshot = true\n } else if (!willBeEnabled && this.automaticMemorySnapshot) {\n this.stopMemorySnapshotTimer()\n this.memorySnapshotInterval = 0\n this.automaticMemorySnapshot = false\n }\n\n this.debugOverlay.enabled = !this.debugOverlay.enabled\n this.lib.setDebugOverlay(this.rendererPtr, this.debugOverlay.enabled, this.debugOverlay.corner)\n this.emit(CliRenderEvents.DEBUG_OVERLAY_TOGGLE, this.debugOverlay.enabled)\n this.requestRender()\n }\n\n public configureDebugOverlay(options: { enabled?: boolean; corner?: DebugOverlayCorner }): void {\n this.debugOverlay.enabled = options.enabled ?? this.debugOverlay.enabled\n this.debugOverlay.corner = options.corner ?? this.debugOverlay.corner\n this.lib.setDebugOverlay(this.rendererPtr, this.debugOverlay.enabled, this.debugOverlay.corner)\n this.requestRender()\n }\n\n public setTerminalTitle(title: string): void {\n this.lib.setTerminalTitle(this.rendererPtr, title)\n }\n\n /**\n * Reset the terminal background color to its default via OSC 111.\n * Called automatically by destroy() and suspend(), but exposed for\n * consumers that need explicit control (e.g. before SIGTSTP).\n */\n public resetTerminalBgColor(): void {\n this.writeOut(\"\\x1b]111\\x07\")\n }\n\n public copyToClipboardOSC52(text: string, target?: ClipboardTarget): boolean {\n return this.clipboard.copyToClipboardOSC52(text, target)\n }\n\n public clearClipboardOSC52(target?: ClipboardTarget): boolean {\n return this.clipboard.clearClipboardOSC52(target)\n }\n\n public isOsc52Supported(): boolean {\n return this._capabilities ? this._capabilities.osc52_support !== \"unsupported\" : this.clipboard.isOsc52Supported()\n }\n\n public dumpHitGrid(): void {\n this.lib.dumpHitGrid(this.rendererPtr)\n }\n\n public dumpBuffers(timestamp?: number): void {\n this.lib.dumpBuffers(this.rendererPtr, timestamp)\n }\n\n public dumpOutputBuffer(timestamp?: number): void {\n this.lib.dumpOutputBuffer(this.rendererPtr, timestamp)\n }\n\n public static setCursorPosition(renderer: CliRenderer, x: number, y: number, visible: boolean = true): void {\n const lib = resolveRenderLib()\n lib.setCursorPosition(renderer.rendererPtr, x, y, visible)\n }\n\n public static setCursorStyle(renderer: CliRenderer, options: CursorStyleOptions): void {\n const lib = resolveRenderLib()\n lib.setCursorStyleOptions(renderer.rendererPtr, options)\n if (options.cursor !== undefined) {\n renderer._currentMousePointerStyle = options.cursor\n }\n }\n\n public static setCursorColor(renderer: CliRenderer, color: RGBA): void {\n const lib = resolveRenderLib()\n lib.setCursorColor(renderer.rendererPtr, color)\n }\n\n public setCursorPosition(x: number, y: number, visible: boolean = true): void {\n this.lib.setCursorPosition(this.rendererPtr, x, y, visible)\n }\n\n public setCursorStyle(options: CursorStyleOptions): void {\n this.lib.setCursorStyleOptions(this.rendererPtr, options)\n if (options.cursor !== undefined) {\n this._currentMousePointerStyle = options.cursor\n }\n }\n\n public setCursorColor(color: RGBA): void {\n this.lib.setCursorColor(this.rendererPtr, color)\n }\n\n public getCursorState() {\n return this.lib.getCursorState(this.rendererPtr)\n }\n\n public addPostProcessFn(processFn: (buffer: OptimizedBuffer, deltaTime: number) => void): void {\n this.postProcessFns.push(processFn)\n }\n\n public removePostProcessFn(processFn: (buffer: OptimizedBuffer, deltaTime: number) => void): void {\n this.postProcessFns = this.postProcessFns.filter((fn) => fn !== processFn)\n }\n\n public clearPostProcessFns(): void {\n this.postProcessFns = []\n }\n\n public setFrameCallback(callback: (deltaTime: number) => Promise<void>): void {\n this.frameCallbacks.push(callback)\n }\n\n public removeFrameCallback(callback: (deltaTime: number) => Promise<void>): void {\n this.frameCallbacks = this.frameCallbacks.filter((cb) => cb !== callback)\n }\n\n public clearFrameCallbacks(): void {\n this.frameCallbacks = []\n }\n\n public requestLive(): void {\n this.liveRequestCounter++\n\n if (this._controlState === RendererControlState.IDLE && this.liveRequestCounter > 0) {\n this._controlState = RendererControlState.AUTO_STARTED\n this.internalStart()\n }\n }\n\n public dropLive(): void {\n this.liveRequestCounter = Math.max(0, this.liveRequestCounter - 1)\n\n if (this._controlState === RendererControlState.AUTO_STARTED && this.liveRequestCounter === 0) {\n this._controlState = RendererControlState.IDLE\n this.internalPause()\n }\n }\n\n public start(): void {\n this._controlState = RendererControlState.EXPLICIT_STARTED\n this.internalStart()\n }\n\n public auto(): void {\n this._controlState = this._isRunning ? RendererControlState.AUTO_STARTED : RendererControlState.IDLE\n }\n\n private internalStart(): void {\n if (!this._isRunning && !this._isDestroyed) {\n this._isRunning = true\n\n // Invalidate any queued idle one-shot frame.\n // start()/live/resume transition to the continuous loop, so queued\n // activateFrame callbacks must no-op via !updateScheduled.\n this.updateScheduled = false\n\n if (this.memorySnapshotInterval > 0) {\n this.startMemorySnapshotTimer()\n }\n\n this.startRenderLoop()\n }\n }\n\n public pause(): void {\n this._controlState = RendererControlState.EXPLICIT_PAUSED\n this.internalPause()\n }\n\n public suspend(): void {\n this._previousControlState = this._controlState\n\n this._controlState = RendererControlState.EXPLICIT_SUSPENDED\n this.updateScheduled = false\n this.internalPause()\n\n if (this._terminalIsSetup) {\n this.clearSplitStartupCursorSeed()\n this.flushPendingSplitOutputBeforeTransition(true, { allowSuspended: true })\n this.suspendedNonAltSurfacePreserved = this._screenMode !== \"alternate-screen\" && this.renderOffset > 0\n } else {\n this.suspendedNonAltSurfacePreserved = false\n }\n\n this._suspendedMouseEnabled = this._useMouse\n\n this.disableMouse()\n this.removeExitListeners()\n this.waitingForPixelResolution = false\n this.updateStdinParserProtocolContext({\n privateCapabilityRepliesActive: false,\n pixelResolutionQueryActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n })\n this.stdinParser?.reset()\n this.stdin.removeListener(\"data\", this.stdinListener)\n\n this.themeModeState.cancelRefresh()\n\n this.lib.suspendRenderer(this.rendererPtr)\n\n if (this.stdin.setRawMode) {\n this.stdin.setRawMode(false)\n }\n\n this.stdin.pause()\n }\n\n public resume(): void {\n if (this.stdin.setRawMode) {\n this.stdin.setRawMode(true)\n }\n\n // Drain any input buffered during suspension before registering the\n // listener. Adding a \"data\" listener can auto-resume a Readable, so the\n // drain must come first while the stream is still paused and read()\n // pulls from the internal buffer rather than being a flowing-mode no-op.\n while (this.stdin.read() !== null) {}\n this.stdin.on(\"data\", this.stdinListener)\n this.stdin.resume()\n this.addExitListeners()\n\n const resumePreservedNonAltSurface =\n this.pendingSuspendedTerminalSetup &&\n this._screenMode !== \"alternate-screen\" &&\n this.suspendedNonAltSurfacePreserved &&\n this.renderOffset > 0\n\n if (this.pendingSuspendedTerminalSetup) {\n this.pendingSuspendedTerminalSetup = false\n if (resumePreservedNonAltSurface) {\n this.lib.resumeRenderer(this.rendererPtr)\n } else {\n this.lib.setupTerminal(this.rendererPtr, this._screenMode === \"alternate-screen\")\n }\n } else {\n this.lib.resumeRenderer(this.rendererPtr)\n }\n\n this.suspendedNonAltSurfacePreserved = false\n\n this.flushPendingSplitOutputBeforeTransition(false, { allowSuspended: true, allowPassthrough: true })\n\n if (this._screenMode === \"split-footer\" && this._splitHeight > 0) {\n this.syncSplitFooterState()\n }\n\n if (this._suspendedMouseEnabled) {\n this.enableMouse()\n }\n\n this.forceFullRepaintRequested = true\n this._controlState = this._previousControlState\n\n if (\n this._previousControlState === RendererControlState.AUTO_STARTED ||\n this._previousControlState === RendererControlState.EXPLICIT_STARTED\n ) {\n this.internalStart()\n } else {\n this.requestRender()\n }\n }\n\n private internalPause(): void {\n this._isRunning = false\n\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n\n if (!this.rendering) {\n this.resolveIdleIfNeeded()\n }\n }\n\n public stop(): void {\n this._controlState = RendererControlState.EXPLICIT_STOPPED\n this.internalStop()\n }\n\n private internalStop(): void {\n if (this.isRunning && !this._isDestroyed) {\n this._isRunning = false\n\n if (this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n\n // If we're currently rendering, the frame will resolve idle when it completes\n // Otherwise, resolve immediately\n if (!this.rendering) {\n this.resolveIdleIfNeeded()\n }\n }\n }\n\n public destroy(): void {\n if (this._isDestroyed) return\n this._isDestroyed = true\n this._destroyPending = true\n this._palettePublishGeneration++\n\n if (this.rendering) {\n // Restore terminal/input state immediately, but defer full native teardown until the frame unwinds.\n this.prepareDestroyDuringRender()\n return\n }\n\n this.finalizeDestroy()\n }\n\n private cleanupBeforeDestroy(): void {\n if (this._destroyCleanupPrepared) return\n this._destroyCleanupPrepared = true\n\n if (this._usesProcessStdout) {\n process.removeListener(\"SIGWINCH\", this.sigwinchHandler)\n }\n process.removeListener(\"uncaughtException\", this.handleError)\n process.removeListener(\"unhandledRejection\", this.handleError)\n process.removeListener(\"warning\", this.warningHandler)\n process.removeListener(\"beforeExit\", this.exitHandler)\n this.removeExitListeners()\n\n if (this.resizeTimeoutId !== null) {\n this.clock.clearTimeout(this.resizeTimeoutId)\n this.resizeTimeoutId = null\n }\n\n if (this.capabilityTimeoutId !== null) {\n this.clock.clearTimeout(this.capabilityTimeoutId)\n this.capabilityTimeoutId = null\n }\n\n this.clearSplitStartupCursorSeed()\n\n if (this.memorySnapshotTimer) {\n this.clock.clearInterval(this.memorySnapshotTimer)\n this.memorySnapshotTimer = null\n }\n\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n\n this.themeModeState.cancelRefresh()\n\n this._isRunning = false\n this.waitingForPixelResolution = false\n this.updateStdinParserProtocolContext(\n {\n privateCapabilityRepliesActive: false,\n pixelResolutionQueryActive: false,\n explicitWidthCprActive: false,\n startupCursorCprActive: false,\n },\n true,\n )\n this._useMouse = false\n this.setCapturedRenderable(undefined)\n\n this.stdin.removeListener(\"data\", this.stdinListener)\n if (this.stdin.setRawMode) {\n try {\n this.stdin.setRawMode(false)\n } catch (e) {\n console.error(\"Error disabling raw mode during destroy:\", e)\n }\n }\n try {\n this.stdin.pause()\n } catch (e) {\n console.error(\"Error pausing stdin during destroy:\", e)\n }\n\n if (this._feed !== null && this._splitHeight > 0 && !this._terminalIsSetup) {\n this.flushPendingSplitOutputBeforeTransition(false, { allowSuspended: true, allowUnsetup: true })\n }\n\n this.externalOutputMode = \"passthrough\"\n\n if (this._splitHeight > 0) {\n this.flushStdoutCache(this._splitHeight, true)\n }\n }\n\n private prepareDestroyDuringRender(): void {\n this.cleanupBeforeDestroy()\n this.lib.suspendRenderer(this.rendererPtr)\n }\n\n private finalizeDestroy(): void {\n if (this._destroyFinalized) return\n\n this._destroyFinalized = true\n this._destroyPending = false\n\n this.cleanupBeforeDestroy()\n\n // Clean up palette detector\n if (this._paletteDetector) {\n this._paletteDetector.cleanup()\n this._paletteDetector = null\n }\n this._paletteCache.clear()\n this._paletteDetectionPromise = null\n this._paletteDetectionSize = 0\n this._nativePaletteSignature = null\n this._emittedPaletteSignature = null\n this._paletteEpoch = 0\n this.resolveXtVersionWaiters()\n\n this.themeModeState.dispose()\n\n this.emit(CliRenderEvents.DESTROY)\n\n try {\n this.root.destroyRecursively()\n } catch (e) {\n console.error(\"Error destroying root renderable:\", e instanceof Error ? e.stack : String(e))\n }\n\n this.stdinParser?.destroy()\n this.stdinParser = null\n this.oscSubscribers.clear()\n this._console.destroy()\n\n // Split-footer cleanup: flush pending output and reset offset before\n // tearing down the native renderer.\n if (\n this._splitHeight > 0 &&\n this._terminalIsSetup &&\n this._controlState !== RendererControlState.EXPLICIT_SUSPENDED\n ) {\n this.flushPendingSplitOutputBeforeTransition(true)\n this.renderOffset = 0\n if (this.clearOnShutdown) {\n this.lib.setRenderOffset(this.rendererPtr, 0)\n }\n }\n\n this._externalOutputMode = \"passthrough\"\n this.pendingExternalOutputMode = null\n this.stdout.write = this.realStdoutWrite\n this.externalOutputQueue.clear()\n\n // Teardown ordering for the feed backend is subtle and must satisfy two\n // invariants simultaneously:\n //\n // 1. The shutdown ANSI sequence emitted by `lib.destroyRenderer` via\n // FeedBackend.writeOut MUST reach the user's Writable. Otherwise the\n // remote terminal is left in alt-screen / mouse-tracking / kitty-\n // keyboard state at session close.\n //\n // 2. The data handler (which does `stdout.write`) must be detached\n // before `feed.close()`, otherwise `close()` will wait for any\n // in-flight writes that reference chunks about to be freed.\n //\n // The correct order is:\n // a) drain any frames already committed but not yet delivered\n // b) call lib.destroyRenderer — this commits shutdown bytes into the feed\n // c) drain again — this flushes those shutdown bytes through the handler\n // d) detach the handler now that no more data will flow\n // e) close the feed (releases chunk memory once async handlers settle)\n //\n // Memory-lifetime invariant: `lib.destroyRenderer` calls into Zig's\n // `FeedBackend.deinit`, which is a DOCUMENTED NO-OP — feed memory is\n // owned by the TS side and only released by `feed.close()` at step (e).\n // Consequently, step (c)'s drain operates on still-valid chunk memory;\n // there is no use-after-free window between (b) and (e).\n //\n // Caller note: `feed.close()` is queued as a microtask when async handlers\n // from the final drain are still pending. If the caller tears down the\n // underlying Writable synchronously right after `destroy()` returns (e.g.\n // `channel.close()` on the very next line, or `process.exit()`), the\n // shutdown bytes may not have flushed yet. For async teardown, allow one\n // microtask tick (e.g. `await new Promise(queueMicrotask)`) before closing\n // the transport.\n if (this._feed) {\n try {\n this._feed.drainAll()\n } catch (e) {\n console.error(\"Error draining NativeSpanFeed during destroy:\", e)\n }\n }\n\n try {\n this.lib.destroyRenderer(this.rendererPtr)\n } catch (e) {\n console.error(\"Error in lib.destroyRenderer during destroy:\", e)\n }\n rendererTracker.renderers.delete(this)\n if (rendererTracker.renderers.size === 0) {\n void destroyTreeSitterClient().catch((error) => {\n console.error(\"Failed to destroy tree-sitter client:\", error)\n })\n }\n\n if (this._feed) {\n try {\n this._feed.drainAll()\n } catch (e) {\n console.error(\"Error draining NativeSpanFeed shutdown frames:\", e)\n }\n this._detachFeed?.()\n this._detachFeed = null\n this._detachFeedError?.()\n this._detachFeedError = null\n this._feed.close()\n this._feed = null\n }\n\n if (this._streamLeaseAcquired) {\n if (rendererTracker.streamOwners.get(this.stdin) === this) rendererTracker.streamOwners.delete(this.stdin)\n if (rendererTracker.streamOwners.get(this.stdout) === this) rendererTracker.streamOwners.delete(this.stdout)\n this._streamLeaseAcquired = false\n }\n\n if (this._onDestroy) {\n try {\n this._onDestroy()\n } catch (e) {\n console.error(\"Error in onDestroy callback:\", e instanceof Error ? e.stack : String(e))\n }\n }\n\n // Resolve any pending idle() calls\n this.resolveIdleIfNeeded()\n }\n\n private startRenderLoop(): void {\n if (!this._isRunning) return\n\n this.lastTime = this.normalizeClockTime(this.clock.now(), 0)\n this.frameCount = 0\n this.lastFpsTime = this.lastTime\n this.currentFps = 0\n this.renderStats.fps = 0\n\n // Starting continuous mode must not bypass an existing feed-idle retry. Keep\n // _isRunning true, but let the idle callback schedule the first loop once the\n // feed is ready; a successful frame will then resume the normal cadence.\n if (this.feedIdleRenderScheduled) return\n\n this.loop()\n }\n\n private async loop(): Promise<void> {\n if (this.rendering || this._isDestroyed) return\n this.renderTimeout = null\n\n this.rendering = true\n if (this.renderTimeout) {\n this.clock.clearTimeout(this.renderTimeout)\n this.renderTimeout = null\n }\n try {\n // Bump before any work so all callers this iteration see the new id.\n this._frameId++\n\n const now = this.normalizeClockTime(this.clock.now(), this.lastTime)\n const elapsed = this.getElapsedMs(now, this.lastTime)\n\n const deltaTime = elapsed\n this.lastTime = now\n\n this.renderStats.frameCount++\n const overallStart = performance.now()\n\n const frameRequests = Array.from(this.animationRequest.values())\n this.animationRequest.clear()\n const animationRequestStart = performance.now()\n for (const callback of frameRequests) {\n callback(deltaTime)\n this.dropLive()\n }\n const animationRequestEnd = performance.now()\n const animationRequestTime = animationRequestEnd - animationRequestStart\n\n const start = performance.now()\n for (const frameCallback of this.frameCallbacks) {\n try {\n await frameCallback(deltaTime)\n } catch (error) {\n console.error(\"Error in frame callback:\", error)\n }\n }\n const end = performance.now()\n this.renderStats.frameCallbackTime = end - start\n\n this.root.render(this.nextRenderBuffer, deltaTime)\n\n for (const postProcessFn of this.postProcessFns) {\n postProcessFn(this.nextRenderBuffer, deltaTime)\n }\n\n this._console.renderToBuffer(this.nextRenderBuffer)\n\n // If destroy() was requested during this frame, skip native work and scheduling.\n if (!this._isDestroyed) {\n const nativeStatus = this.renderNative() ?? \"rendered\"\n if (nativeStatus === \"rendered\") this.frameCount++\n if (this.getElapsedMs(now, this.lastFpsTime) >= 1000) {\n this.currentFps = this.frameCount\n this.frameCount = 0\n this.lastFpsTime = now\n }\n this.renderStats.fps = this.currentFps\n\n if (nativeStatus === \"rendered\") {\n // Check if hit grid changed and recheck hover state if needed\n if (this._useMouse && this.lib.getHitGridDirty(this.rendererPtr)) {\n this.recheckHoverState()\n }\n\n const overallFrameTime = performance.now() - overallStart\n\n // TODO: Add animationRequestTime to stats\n this.lib.updateStats(\n this.rendererPtr,\n overallFrameTime,\n this.renderStats.fps,\n this.renderStats.frameCallbackTime,\n )\n\n if (this.listenerCount(CliRenderEvents.FRAME) > 0) {\n this.emit(CliRenderEvents.FRAME, {\n frameId: this.frameId,\n })\n }\n\n if (this.gatherStats) {\n this.collectStatSample(overallFrameTime)\n }\n\n if (this._isRunning || this.immediateRerenderRequested) {\n const targetFrameTime = this.immediateRerenderRequested ? this.minTargetFrameTime : this.targetFrameTime\n const delay = Math.max(1, targetFrameTime - Math.floor(overallFrameTime))\n this.immediateRerenderRequested = false\n this.renderTimeout = this.clock.setTimeout(() => {\n this.renderTimeout = null\n this.loop()\n }, delay)\n } else {\n this.clock.clearTimeout(this.renderTimeout!)\n this.renderTimeout = null\n }\n } else if (nativeStatus === \"blocked\") {\n const overallFrameTime = performance.now() - overallStart\n\n if (this._isRunning || this.immediateRerenderRequested) {\n const targetFrameTime = this.immediateRerenderRequested ? this.minTargetFrameTime : this.targetFrameTime\n const delay = Math.max(1, targetFrameTime - Math.floor(overallFrameTime))\n this.immediateRerenderRequested = false\n this.renderTimeout = this.clock.setTimeout(() => {\n this.renderTimeout = null\n this.loop()\n }, delay)\n } else {\n this.clock.clearTimeout(this.renderTimeout!)\n this.renderTimeout = null\n }\n } else if (nativeStatus === \"backpressured\") {\n this.scheduleRenderAfterBackpressure()\n } else if (nativeStatus === \"retryable-skip\") {\n this.immediateRerenderRequested = false\n this.renderTimeout = null\n } else if (nativeStatus === \"failed\") {\n this.immediateRerenderRequested = false\n this.renderTimeout = null\n }\n }\n } finally {\n this.rendering = false\n if (this._destroyPending) {\n this.finalizeDestroy()\n }\n this.resolveIdleIfNeeded()\n }\n }\n\n public intermediateRender(): void {\n this.immediateRerenderRequested = true\n this.loop()\n }\n\n private renderNative(): \"rendered\" | \"retryable-skip\" | \"failed\" | \"blocked\" | \"backpressured\" {\n if (this.renderingNative) {\n console.error(\"Rendering called concurrently\")\n throw new Error(\"Rendering called concurrently\")\n }\n\n this.renderingNative = true\n\n try {\n if (this.isSplitCursorSeedFrameBlocked()) {\n return \"blocked\"\n }\n\n if (this._splitHeight > 0 && this._externalOutputMode === \"capture-stdout\") {\n // forceFullRepaintRequested is a one-shot latch used when mode/geometry\n // transitions need a complete footer refresh. Consume it once so steady-state\n // capture path keeps using diff-based repainting.\n const forceSplitRepaint = this.forceFullRepaintRequested\n const status = this.flushPendingSplitCommits(\n forceSplitRepaint,\n this.pendingExternalOutputMode === \"passthrough\",\n )\n if (status === \"backpressured\") {\n return \"backpressured\"\n }\n if (status === \"failed\") {\n return \"failed\"\n }\n this.forceFullRepaintRequested = false\n this.pendingSplitFooterTransition = null\n return \"rendered\"\n }\n\n const force = this.forceFullRepaintRequested\n const nativeStatus = this.lib.render(this.rendererPtr, force)\n if (nativeStatus === NATIVE_RENDER_STATUS_SKIPPED || nativeStatus === NATIVE_RENDER_STATUS_FAILED) {\n return this.handleNativeRenderRejection(nativeStatus)\n }\n\n this.forceFullRepaintRequested = false\n this.pendingSplitFooterTransition = null\n // this.dumpOutputBuffer(Date.now())\n return \"rendered\"\n } finally {\n this.renderingNative = false\n }\n }\n\n private collectStatSample(frameTime: number): void {\n this.frameTimes.push(frameTime)\n if (this.frameTimes.length > this.maxStatSamples) {\n this.frameTimes.shift()\n }\n }\n\n public getNativeStats(): NativeRenderStats {\n return this.lib.getRenderStats(this.rendererPtr)\n }\n\n public getStats(): CliRendererStats {\n const nativeStats = this.getNativeStats()\n const frameTimes = [...this.frameTimes]\n const sum = frameTimes.reduce((acc, time) => acc + time, 0)\n const avg = frameTimes.length ? sum / frameTimes.length : 0\n const min = frameTimes.length ? Math.min(...frameTimes) : 0\n const max = frameTimes.length ? Math.max(...frameTimes) : 0\n\n return {\n ...nativeStats,\n fps: this.renderStats.fps,\n frameCount: this.renderStats.frameCount,\n frameTimes,\n averageFrameTime: avg,\n minFrameTime: min,\n maxFrameTime: max,\n frameCallbackTime: this.renderStats.frameCallbackTime,\n }\n }\n\n public resetStats(): void {\n this.frameTimes = []\n this.renderStats.frameCount = 0\n }\n\n public setGatherStats(enabled: boolean): void {\n this.gatherStats = enabled\n if (!enabled) {\n this.frameTimes = []\n }\n }\n\n public getSelection(): Selection | null {\n return this.currentSelection\n }\n\n public get hasSelection(): boolean {\n return !!this.currentSelection\n }\n\n public getSelectionContainer(): Renderable | null {\n return this.selectionContainers.length > 0 ? this.selectionContainers[this.selectionContainers.length - 1] : null\n }\n\n public clearSelection(): void {\n if (this.currentSelection) {\n for (const renderable of this.currentSelection.touchedRenderables) {\n if (renderable.selectable && !renderable.isDestroyed) {\n renderable.onSelectionChanged(null)\n }\n }\n this.currentSelection = null\n }\n this.selectionContainers = []\n }\n\n /**\n * Start a new selection at the given coordinates.\n * Used by both mouse and keyboard selection.\n */\n public startSelection(renderable: Renderable, x: number, y: number): void {\n if (!renderable.selectable) return\n\n this.clearSelection()\n this.selectionContainers.push(renderable.parent || this.root)\n this.currentSelection = new Selection(renderable, { x, y }, { x, y })\n this.currentSelection.isStart = true\n\n this.notifySelectablesOfSelectionChange()\n }\n\n public updateSelection(\n currentRenderable: Renderable | undefined,\n x: number,\n y: number,\n options?: { finishDragging?: boolean },\n ): void {\n if (this.currentSelection) {\n this.currentSelection.isStart = false\n this.currentSelection.focus = { x, y }\n\n if (options?.finishDragging) {\n this.currentSelection.isDragging = false\n }\n\n if (this.selectionContainers.length > 0) {\n const currentContainer = this.selectionContainers[this.selectionContainers.length - 1]\n\n if (!currentRenderable || !this.isWithinContainer(currentRenderable, currentContainer)) {\n const parentContainer = currentContainer.parent || this.root\n this.selectionContainers.push(parentContainer)\n } else if (currentRenderable && this.selectionContainers.length > 1) {\n let containerIndex = this.selectionContainers.indexOf(currentRenderable)\n\n if (containerIndex === -1) {\n const immediateParent = currentRenderable.parent || this.root\n containerIndex = this.selectionContainers.indexOf(immediateParent)\n }\n\n if (containerIndex !== -1 && containerIndex < this.selectionContainers.length - 1) {\n this.selectionContainers = this.selectionContainers.slice(0, containerIndex + 1)\n }\n }\n }\n\n this.notifySelectablesOfSelectionChange()\n }\n }\n\n public requestSelectionUpdate(): void {\n if (this.currentSelection?.isDragging) {\n const pointer = this._latestPointer\n\n const maybeRenderableId = this.hitTest(pointer.x, pointer.y)\n const maybeRenderable = Renderable.renderablesByNumber.get(maybeRenderableId)\n\n this.updateSelection(maybeRenderable, pointer.x, pointer.y)\n }\n }\n\n private isWithinContainer(renderable: Renderable, container: Renderable): boolean {\n let current: Renderable | null = renderable\n while (current) {\n if (current === container) return true\n current = current.parent\n }\n return false\n }\n\n private finishSelection(): void {\n if (this.currentSelection) {\n this.currentSelection.isDragging = false\n this.emit(CliRenderEvents.SELECTION, this.currentSelection)\n this.notifySelectablesOfSelectionChange()\n }\n }\n\n private notifySelectablesOfSelectionChange(): void {\n const selectedRenderables: Renderable[] = []\n const touchedRenderables: Renderable[] = []\n const currentContainer =\n this.selectionContainers.length > 0 ? this.selectionContainers[this.selectionContainers.length - 1] : this.root\n\n if (this.currentSelection) {\n this.walkSelectableRenderables(\n currentContainer,\n this.currentSelection.bounds,\n selectedRenderables,\n touchedRenderables,\n )\n\n for (const renderable of this.currentSelection.touchedRenderables) {\n if (!touchedRenderables.includes(renderable) && !renderable.isDestroyed) {\n renderable.onSelectionChanged(null)\n }\n }\n\n this.currentSelection.updateSelectedRenderables(selectedRenderables)\n this.currentSelection.updateTouchedRenderables(touchedRenderables)\n }\n }\n\n private walkSelectableRenderables(\n container: Renderable,\n selectionBounds: ViewportBounds,\n selectedRenderables: Renderable[],\n touchedRenderables: Renderable[],\n ): void {\n const children = getObjectsInViewport<Renderable>(\n selectionBounds,\n container.getChildrenSortedByPrimaryAxis(),\n container.primaryAxis,\n 0, // padding\n 0, // minTriggerSize - always perform overlap checks for selection\n )\n\n for (const child of children) {\n if (child.selectable) {\n const hasSelection = child.onSelectionChanged(this.currentSelection)\n if (hasSelection) {\n selectedRenderables.push(child)\n }\n touchedRenderables.push(child)\n }\n if (child.getChildrenCount() > 0) {\n this.walkSelectableRenderables(child, selectionBounds, selectedRenderables, touchedRenderables)\n }\n }\n }\n\n public get paletteDetectionStatus(): \"idle\" | \"detecting\" | \"cached\" {\n if (this._paletteDetectionPromise) return \"detecting\"\n if (this._paletteCache.size > 0) return \"cached\"\n return \"idle\"\n }\n\n private getCachedPaletteBySize(size: number): TerminalColors | null {\n const exactMatch = this._paletteCache.get(size)\n if (exactMatch) {\n return exactMatch\n }\n\n const largerSize = [...this._paletteCache.keys()].sort((a, b) => a - b).find((candidate) => candidate >= size)\n if (largerSize === undefined) {\n return null\n }\n\n const source = this._paletteCache.get(largerSize)\n if (!source) {\n return null\n }\n\n const projected = {\n ...source,\n palette: source.palette.slice(0, size),\n }\n\n this._paletteCache.set(size, projected)\n return projected\n }\n\n private ensurePaletteDetector(): TerminalPaletteDetector {\n if (!this._paletteDetector) {\n const isTmux = Boolean(\n this.capabilities?.multiplexer === \"tmux\" || this.capabilities?.terminal?.name?.toLowerCase()?.includes(\"tmux\"),\n )\n const isLegacyTmux =\n this.capabilities?.terminal?.name?.toLowerCase()?.includes(\"tmux\") &&\n this.capabilities?.terminal?.version?.localeCompare(\"3.6\") < 0\n this._paletteDetector = createTerminalPalette({\n stdin: this.stdin,\n stdout: this.stdout,\n writeFn: (data) => (this._isDestroyed ? false : this.writeOut(data)),\n isLegacyTmux,\n isTmux,\n oscSource: {\n subscribeOsc: this.subscribeOsc.bind(this),\n },\n clock: this.clock,\n })\n }\n\n return this._paletteDetector\n }\n\n private syncNativePaletteState(colors: TerminalColors | null): void {\n const signature = buildTerminalPaletteSignature(colors)\n if (this._nativePaletteSignature !== signature) {\n this._paletteEpoch = (this._paletteEpoch + 1) >>> 0\n }\n\n this._nativePaletteSignature = signature\n\n const normalized = normalizeTerminalPalette(colors)\n this.lib.rendererSetPaletteState(\n this.rendererPtr,\n normalized.palette,\n normalized.defaultForeground,\n normalized.defaultBackground,\n this._paletteEpoch,\n )\n }\n\n private emitPaletteChange(colors: TerminalColors): void {\n if (this.listenerCount(CliRenderEvents.PALETTE) === 0) return\n\n const signature = buildTerminalPaletteSignature(colors)\n if (this._emittedPaletteSignature === signature) return\n\n this._emittedPaletteSignature = signature\n this.emit(CliRenderEvents.PALETTE, colors)\n }\n\n private resolveXtVersionWaiters(): void {\n if (this.xtVersionWaiters.size === 0) return\n\n const resolvers = [...this.xtVersionWaiters]\n this.xtVersionWaiters.clear()\n for (const resolve of resolvers) {\n resolve()\n }\n }\n\n private waitForXtVersion(): Promise<void> {\n if (this.capabilityTimeoutId === null || this._capabilities?.terminal?.from_xtversion) {\n return Promise.resolve()\n }\n\n return new Promise((resolve) => {\n this.xtVersionWaiters.add(resolve)\n })\n }\n\n private shouldSyncNativePaletteState(): boolean {\n return Boolean(\n this._terminalIsSetup && !this._isDestroyed && this._capabilities?.ansi256 && !this._capabilities?.rgb,\n )\n }\n\n private refreshPalette(): void {\n const publishGeneration = this._palettePublishGeneration\n\n void this.getPalette({ size: NATIVE_PALETTE_QUERY_SIZE })\n .then(() => {\n if (this._isDestroyed) return\n if (this._palettePublishGeneration === publishGeneration) this.requestRender()\n })\n .catch(() => {})\n }\n\n public clearPaletteCache(): void {\n this._palettePublishGeneration++\n this._paletteCache.clear()\n }\n\n /**\n * Detects the terminal's color palette\n *\n * @returns Promise resolving to TerminalColors object containing palette and special colors\n * @throws Error if renderer is suspended\n */\n public async getPalette(options?: GetPaletteOptions): Promise<TerminalColors> {\n if (this._controlState === RendererControlState.EXPLICIT_SUSPENDED) {\n throw new Error(\"Cannot detect palette while renderer is suspended\")\n }\n\n const requestedSize = options?.size ?? 16\n const detectionTimeout = options?.timeout\n\n const cachedPalette = this.getCachedPaletteBySize(requestedSize)\n if (cachedPalette) {\n return cachedPalette\n }\n\n // tmux OSC 4 strategy depends on version. Env may provide it via\n // TERM_PROGRAM=tmux/TERM_PROGRAM_VERSION; otherwise wait for XTVERSION.\n const terminal = this._capabilities?.terminal\n const hasTmuxVersion = terminal?.name?.toLowerCase() === \"tmux\" && Boolean(terminal.version)\n if (this._capabilities?.multiplexer === \"tmux\" && !hasTmuxVersion) {\n await this.waitForXtVersion()\n\n // Another caller may have populated the cache while this call waited.\n const afterCapabilityWait = this.getCachedPaletteBySize(requestedSize)\n if (afterCapabilityWait) {\n return afterCapabilityWait\n }\n }\n\n if (this._paletteDetectionPromise) {\n if (this._paletteDetectionSize >= requestedSize) {\n return this._paletteDetectionPromise.then((palette) => {\n const cached = this.getCachedPaletteBySize(requestedSize)\n if (cached) {\n return cached\n }\n\n const projected = {\n ...palette,\n palette: palette.palette.slice(0, requestedSize),\n }\n this._paletteCache.set(requestedSize, projected)\n return projected\n })\n }\n\n await this._paletteDetectionPromise\n\n const afterWait = this.getCachedPaletteBySize(requestedSize)\n if (afterWait) {\n return afterWait\n }\n }\n\n const detector = this.ensurePaletteDetector()\n const publishGeneration = this._palettePublishGeneration\n this._paletteDetectionSize = requestedSize\n this._paletteDetectionPromise = detector\n .detect({ ...options, timeout: detectionTimeout })\n .then((result) => {\n this._paletteCache.set(result.palette.length, result)\n this._paletteDetectionPromise = null\n this._paletteDetectionSize = 0\n\n if (!this._isDestroyed && this._palettePublishGeneration === publishGeneration) {\n this.emitPaletteChange(result)\n if (this.shouldSyncNativePaletteState() && result.palette.length >= NATIVE_PALETTE_QUERY_SIZE) {\n this.syncNativePaletteState(result)\n } else if (this.shouldSyncNativePaletteState() && !this._paletteCache.has(NATIVE_PALETTE_QUERY_SIZE)) {\n this.refreshPalette()\n }\n }\n\n return result\n })\n .catch((error) => {\n this._paletteDetectionPromise = null\n this._paletteDetectionSize = 0\n throw error\n })\n\n const detected = await this._paletteDetectionPromise\n const finalPalette = this.getCachedPaletteBySize(requestedSize) ?? detected\n return finalPalette\n }\n}\n",
24
+ "import type { ViewportBounds } from \"../types.js\"\n\ninterface ViewportObject {\n screenX: number\n screenY: number\n width: number\n height: number\n zIndex: number\n}\n\n/**\n * Returns objects that overlap with the viewport bounds.\n *\n * @param viewport - The viewport bounds to check against\n * @param objects - Array of objects MUST be sorted by screen position (screenY for column, screenX for row direction)\n * @param direction - Primary scroll direction: \"column\" (vertical) or \"row\" (horizontal)\n * @param padding - Extra padding around viewport to include nearby objects\n * @param minTriggerSize - Minimum array size to use binary search optimization\n * @returns Array of visible objects sorted by zIndex\n *\n * @remarks\n * Objects must be pre-sorted by their start screen position (screenY for column direction, screenX for row direction).\n * Unsorted input will produce incorrect results.\n */\nexport function getObjectsInViewport<T extends ViewportObject>(\n viewport: ViewportBounds,\n objects: T[],\n direction: \"row\" | \"column\" = \"column\",\n padding: number = 10,\n minTriggerSize: number = 16,\n): T[] {\n if (viewport.width <= 0 || viewport.height <= 0) {\n return []\n }\n\n if (objects.length === 0) {\n return []\n }\n\n if (objects.length < minTriggerSize) {\n return objects\n }\n\n const viewportTop = viewport.y - padding\n const viewportBottom = viewport.y + viewport.height + padding\n const viewportLeft = viewport.x - padding\n const viewportRight = viewport.x + viewport.width + padding\n\n const isRow = direction === \"row\"\n\n const children = objects\n const totalChildren = children.length\n if (totalChildren === 0) return []\n\n const vpStart = isRow ? viewportLeft : viewportTop\n const vpEnd = isRow ? viewportRight : viewportBottom\n\n // Binary search to find any child that overlaps along the primary axis\n let lo = 0\n let hi = totalChildren - 1\n let candidate = -1\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n const c = children[mid]\n const start = isRow ? c.screenX : c.screenY\n const end = isRow ? c.screenX + c.width : c.screenY + c.height\n\n if (end < vpStart) {\n lo = mid + 1\n } else if (start > vpEnd) {\n hi = mid - 1\n } else {\n candidate = mid\n break\n }\n }\n\n const visibleChildren: T[] = []\n\n // If binary search found no candidate, the viewport might be in a gap between objects\n // Start from the position where the search ended\n if (candidate === -1) {\n // Binary search failed to find overlap - viewport is in a gap\n // We need to check objects before lo for any that extend into the viewport\n candidate = lo > 0 ? lo - 1 : 0\n }\n\n // Expand left to find all objects that overlap the viewport\n // To handle large objects that start early but extend far, we continue\n // checking even after finding objects that don't overlap, up to a limit\n // This handles cases where many small objects sit between a large object and the viewport\n // Real-world examples: background panels, large images, or spanning containers\n const maxLookBehind = 50\n let left = candidate\n let gapCount = 0\n\n while (left - 1 >= 0) {\n const prev = children[left - 1]\n const prevEnd = isRow ? prev.screenX + prev.width : prev.screenY + prev.height\n\n if (prevEnd <= vpStart) {\n gapCount++\n if (gapCount >= maxLookBehind) {\n break\n }\n } else {\n gapCount = 0\n }\n\n left--\n }\n\n // Expand right to find the rightmost overlapping object\n let right = candidate + 1\n while (right < totalChildren) {\n const next = children[right]\n if ((isRow ? next.screenX : next.screenY) >= vpEnd) break\n right++\n }\n\n // Collect candidates that also overlap on the cross axis\n for (let i = left; i < right; i++) {\n const child = children[i]\n const start = isRow ? child.screenX : child.screenY\n const end = isRow ? child.screenX + child.width : child.screenY + child.height\n\n // Check primary axis overlap (optimization: skip objects that don't overlap)\n if (end <= vpStart) continue\n if (start >= vpEnd) break\n\n // Check cross-axis overlap\n if (isRow) {\n const childBottom = child.screenY + child.height\n if (childBottom < viewportTop) continue\n const childTop = child.screenY\n if (childTop > viewportBottom) continue\n } else {\n const childRight = child.screenX + child.width\n if (childRight < viewportLeft) continue\n const childLeft = child.screenX\n if (childLeft > viewportRight) continue\n }\n\n visibleChildren.push(child)\n }\n\n // Sort by zIndex\n if (visibleChildren.length > 1) {\n visibleChildren.sort((a, b) => (a.zIndex > b.zIndex ? 1 : a.zIndex < b.zIndex ? -1 : 0))\n }\n\n return visibleChildren\n}\n",
25
+ "export type RenderGeometryScreenMode = \"alternate-screen\" | \"main-screen\" | \"split-footer\"\n\nexport interface RenderGeometry {\n effectiveFooterHeight: number\n renderOffset: number\n renderWidth: number\n renderHeight: number\n}\n\nexport function calculateRenderGeometry(\n screenMode: RenderGeometryScreenMode,\n terminalWidth: number,\n terminalHeight: number,\n footerHeight: number,\n): RenderGeometry {\n const safeTerminalWidth = Math.max(terminalWidth, 0)\n const safeTerminalHeight = Math.max(terminalHeight, 0)\n\n if (screenMode !== \"split-footer\") {\n return {\n effectiveFooterHeight: 0,\n renderOffset: 0,\n renderWidth: safeTerminalWidth,\n renderHeight: safeTerminalHeight,\n }\n }\n\n const effectiveFooterHeight = Math.min(footerHeight, safeTerminalHeight)\n\n return {\n effectiveFooterHeight,\n renderOffset: safeTerminalHeight - effectiveFooterHeight,\n renderWidth: safeTerminalWidth,\n renderHeight: effectiveFooterHeight,\n }\n}\n",
26
+ "/**\n * Terminal capability response detection utilities.\n *\n * Detects various terminal capability response sequences:\n * - DECRPM (DEC Request Mode): ESC[?...;N$y where N is 0,1,2,3,4\n * - CPR (Cursor Position Report): ESC[row;colR (used for width detection)\n * - XTVersion: ESC P >| ... ESC \\\n * - Kitty Graphics: ESC _ G ... ESC \\\n * - Kitty Keyboard Query: ESC[?Nu where N is 0,1,2,etc\n * - DA1 (Device Attributes): ESC[?...c\n * - Pixel Resolution: ESC[4;height;widtht\n * - OSC 99 notification capability query response\n * - iTerm2 OSC 1337 feature-reporting response\n */\n\n/**\n * Check if a sequence is a terminal capability response.\n * Returns true if the sequence matches any known capability response pattern.\n */\nexport function isCapabilityResponse(sequence: string): boolean {\n // DECRPM: ESC[?digits;digits$y\n if (/\\x1b\\[\\?\\d+(?:;\\d+)*\\$y/.test(sequence)) {\n return true\n }\n\n // CPR for explicit width/scaled text detection: ESC[1;NR where N >= 2\n // The column number tells us how many characters were rendered with width annotations\n // ESC[1;1R means no width support (cursor didn't move)\n // ESC[1;2R or higher means width support (cursor moved after rendering)\n // We accept any column >= 2 to handle cases where cursor wasn't at exact home position\n if (/\\x1b\\[1;(?!1R)\\d+R/.test(sequence)) {\n return true\n }\n\n // XTVersion: ESC P >| ... ESC \\\n if (/\\x1bP>\\|[\\s\\S]*?\\x1b\\\\/.test(sequence)) {\n return true\n }\n\n // XTGETTCAP Ms: consume replies to our query here; native parsing separately\n // validates whether a positive value is sufficient evidence of support.\n if (/\\x1bP(?:1\\+r4d73(?:=[^\\x1b]*)?|0\\+r(?:4d73)?)\\x1b\\\\/i.test(sequence)) {\n return true\n }\n\n // Kitty graphics response: ESC _ G ... ESC \\\n // Matches any graphics response including OK, errors, etc.\n // This is for filtering capability responses from user input\n if (/\\x1b_G[\\s\\S]*?\\x1b\\\\/.test(sequence)) {\n return true\n }\n\n // Kitty keyboard query response: ESC[?Nu or ESC[?N;Mu (progressive enhancement)\n if (/\\x1b\\[\\?\\d+(?:;\\d+)?u/.test(sequence)) {\n return true\n }\n\n // DA1 (Device Attributes): ESC[?...c\n if (/\\x1b\\[\\?[0-9;]*c/.test(sequence)) {\n return true\n }\n\n // Kitty desktop notification capability query response.\n if (/\\x1b\\]99;[^\\x07\\x1b]*i=opentui-notifications[^\\x07\\x1b]*p=\\?[\\s\\S]*?(?:\\x07|\\x1b\\\\)/.test(sequence)) {\n return true\n }\n\n // iTerm2 feature reporting response. The native parser decides whether the\n // feature string contains the Notifications feature code.\n if (/\\x1b\\]1337;Capabilities=[\\s\\S]*?(?:\\x07|\\x1b\\\\)/.test(sequence)) {\n return true\n }\n\n return false\n}\n\n/**\n * Check if a sequence is a pixel resolution response.\n * Format: ESC[4;height;widtht\n */\nexport function isPixelResolutionResponse(sequence: string): boolean {\n return /\\x1b\\[4;\\d+;\\d+t/.test(sequence)\n}\n\n/**\n * Parse pixel resolution from response sequence.\n * Returns { width, height } or null if not a valid resolution response.\n */\nexport function parsePixelResolution(sequence: string): { width: number; height: number } | null {\n const match = sequence.match(/\\x1b\\[4;(\\d+);(\\d+)t/)\n if (match) {\n return {\n width: parseInt(match[2]),\n height: parseInt(match[1]),\n }\n }\n return null\n}\n",
27
+ "import { parseColor } from \"./lib/RGBA.js\"\nimport { type Clock, type TimerHandle } from \"./lib/clock.js\"\nimport type { ThemeMode } from \"./types.js\"\n\nconst OSC_THEME_RESPONSE =\n /\\x1b](10|11);(?:(?:rgb:)([0-9a-fA-F]+)\\/([0-9a-fA-F]+)\\/([0-9a-fA-F]+)|#([0-9a-fA-F]{6}))(?:\\x07|\\x1b\\\\)/g\n\nfunction scaleOscThemeComponent(component: string): string {\n const value = parseInt(component, 16)\n const maxValue = (1 << (4 * component.length)) - 1\n return Math.round((value / maxValue) * 255)\n .toString(16)\n .padStart(2, \"0\")\n}\n\nfunction oscThemeColorToHex(r?: string, g?: string, b?: string, hex6?: string): string {\n if (hex6) {\n return `#${hex6.toLowerCase()}`\n }\n\n if (r && g && b) {\n return `#${scaleOscThemeComponent(r)}${scaleOscThemeComponent(g)}${scaleOscThemeComponent(b)}`\n }\n\n return \"#000000\"\n}\n\nfunction inferThemeModeFromBackgroundColor(color: string): ThemeMode {\n const [r, g, b] = parseColor(color).toInts()\n const brightness = (r * 299 + g * 587 + b * 114) / 1000\n return brightness > 128 ? \"light\" : \"dark\"\n}\n\nexport interface RendererThemeModeHost {\n queryThemeColors(): void\n}\n\ntype ThemeWaiter = {\n resolve: (mode: ThemeMode | null) => void\n timeoutHandle: TimerHandle | null\n}\n\nexport class RendererThemeMode {\n private static readonly QUERY_TIMEOUT_MS = 250\n\n private _themeMode: ThemeMode | null = null\n private themeQueryPending = true\n private themeOscForeground: string | null = null\n private themeOscBackground: string | null = null\n private themeRefreshTimeoutId: TimerHandle | null = null\n private waiters = new Set<ThemeWaiter>()\n\n constructor(\n private readonly host: RendererThemeModeHost,\n private readonly clock: Clock,\n ) {}\n\n public get themeMode(): ThemeMode | null {\n return this._themeMode\n }\n\n public waitForThemeMode(timeoutMs: number, isDestroyed: boolean): Promise<ThemeMode | null> {\n if (this._themeMode !== null || isDestroyed || timeoutMs === 0) {\n return Promise.resolve(this._themeMode)\n }\n\n return new Promise<ThemeMode | null>((resolve) => {\n const waiter: ThemeWaiter = {\n resolve,\n timeoutHandle: null,\n }\n\n if (timeoutMs > 0) {\n waiter.timeoutHandle = this.clock.setTimeout(() => {\n this.waiters.delete(waiter)\n waiter.timeoutHandle = null\n resolve(this._themeMode)\n }, timeoutMs)\n }\n\n this.waiters.add(waiter)\n })\n }\n\n public cancelRefresh(): void {\n if (this.themeRefreshTimeoutId === null) {\n return\n }\n\n this.clock.clearTimeout(this.themeRefreshTimeoutId)\n this.themeRefreshTimeoutId = null\n this.themeQueryPending = false\n }\n\n public dispose(): void {\n this.cancelRefresh()\n\n for (const waiter of this.waiters) {\n if (waiter.timeoutHandle !== null) {\n this.clock.clearTimeout(waiter.timeoutHandle)\n }\n waiter.resolve(this._themeMode)\n }\n\n this.waiters.clear()\n }\n\n public handleSequence(sequence: string): { handled: boolean; changedMode: ThemeMode | null } {\n if (sequence === \"\\x1b[?997;1n\" || sequence === \"\\x1b[?997;2n\") {\n this.requestThemeOscColors()\n return { handled: true, changedMode: null }\n }\n\n let handledOscThemeResponse = false\n let match: RegExpExecArray | null\n\n OSC_THEME_RESPONSE.lastIndex = 0\n while ((match = OSC_THEME_RESPONSE.exec(sequence))) {\n handledOscThemeResponse = true\n const color = oscThemeColorToHex(match[2], match[3], match[4], match[5])\n\n if (match[1] === \"10\") {\n this.themeOscForeground = color\n } else {\n this.themeOscBackground = color\n }\n }\n\n if (!handledOscThemeResponse) {\n return { handled: false, changedMode: null }\n }\n\n if (!this.themeQueryPending) {\n return { handled: true, changedMode: null }\n }\n\n if (!this.themeOscForeground || !this.themeOscBackground) {\n return { handled: true, changedMode: null }\n }\n\n const nextMode = inferThemeModeFromBackgroundColor(this.themeOscBackground)\n const changedMode = this.applyThemeMode(nextMode)\n this.completeThemeQuery()\n\n return { handled: true, changedMode }\n }\n\n private clearThemeRefreshTimeout(): void {\n if (this.themeRefreshTimeoutId === null) {\n return\n }\n\n this.clock.clearTimeout(this.themeRefreshTimeoutId)\n this.themeRefreshTimeoutId = null\n }\n\n private completeThemeQuery(): void {\n this.clearThemeRefreshTimeout()\n this.themeQueryPending = false\n }\n\n private requestThemeOscColors(): void {\n // Ignore repeated ?997 notifications while the current OSC refresh is\n // still in flight.\n if (this.themeRefreshTimeoutId !== null) {\n return\n }\n\n this.themeQueryPending = true\n this.themeOscForeground = null\n this.themeOscBackground = null\n\n this.host.queryThemeColors()\n\n this.clearThemeRefreshTimeout()\n this.themeRefreshTimeoutId = this.clock.setTimeout(() => {\n this.completeThemeQuery()\n }, RendererThemeMode.QUERY_TIMEOUT_MS)\n }\n\n private applyThemeMode(mode: ThemeMode): ThemeMode | null {\n const changed = this._themeMode !== mode\n this._themeMode = mode\n\n if (!changed) {\n return null\n }\n\n for (const waiter of this.waiters) {\n if (waiter.timeoutHandle !== null) {\n this.clock.clearTimeout(waiter.timeoutHandle)\n }\n waiter.resolve(mode)\n }\n\n this.waiters.clear()\n return mode\n }\n}\n"
28
+ ],
29
+ "mappings": "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",
30
+ "debugId": "9F3FCD78D0AED08D64756E2164756E21",
31
+ "names": []
32
+ }