@opentuah/core 0.1.77

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.
Files changed (127) hide show
  1. package/3d/SpriteResourceManager.d.ts +74 -0
  2. package/3d/SpriteUtils.d.ts +13 -0
  3. package/3d/TextureUtils.d.ts +24 -0
  4. package/3d/ThreeRenderable.d.ts +40 -0
  5. package/3d/WGPURenderer.d.ts +61 -0
  6. package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
  7. package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
  8. package/3d/animation/SpriteAnimator.d.ts +124 -0
  9. package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
  10. package/3d/canvas.d.ts +44 -0
  11. package/3d/index.d.ts +12 -0
  12. package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
  13. package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
  14. package/3d/physics/physics-interface.d.ts +27 -0
  15. package/3d.d.ts +2 -0
  16. package/3d.js +2805 -0
  17. package/3d.js.map +22 -0
  18. package/LICENSE +21 -0
  19. package/README.md +59 -0
  20. package/Renderable.d.ts +334 -0
  21. package/animation/Timeline.d.ts +126 -0
  22. package/ansi.d.ts +13 -0
  23. package/assets/javascript/highlights.scm +205 -0
  24. package/assets/javascript/tree-sitter-javascript.wasm +0 -0
  25. package/assets/markdown/highlights.scm +150 -0
  26. package/assets/markdown/injections.scm +27 -0
  27. package/assets/markdown/tree-sitter-markdown.wasm +0 -0
  28. package/assets/markdown_inline/highlights.scm +115 -0
  29. package/assets/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
  30. package/assets/typescript/highlights.scm +604 -0
  31. package/assets/typescript/tree-sitter-typescript.wasm +0 -0
  32. package/assets/zig/highlights.scm +284 -0
  33. package/assets/zig/tree-sitter-zig.wasm +0 -0
  34. package/buffer.d.ts +98 -0
  35. package/console.d.ts +140 -0
  36. package/edit-buffer.d.ts +98 -0
  37. package/editor-view.d.ts +73 -0
  38. package/index-cgvb25mm.js +14921 -0
  39. package/index-cgvb25mm.js.map +56 -0
  40. package/index.d.ts +17 -0
  41. package/index.js +9331 -0
  42. package/index.js.map +37 -0
  43. package/lib/KeyHandler.d.ts +61 -0
  44. package/lib/RGBA.d.ts +27 -0
  45. package/lib/ascii.font.d.ts +508 -0
  46. package/lib/border.d.ts +49 -0
  47. package/lib/bunfs.d.ts +7 -0
  48. package/lib/clipboard.d.ts +17 -0
  49. package/lib/data-paths.d.ts +26 -0
  50. package/lib/debounce.d.ts +42 -0
  51. package/lib/env.d.ts +42 -0
  52. package/lib/extmarks-history.d.ts +17 -0
  53. package/lib/extmarks.d.ts +89 -0
  54. package/lib/hast-styled-text.d.ts +17 -0
  55. package/lib/index.d.ts +18 -0
  56. package/lib/keymapping.d.ts +25 -0
  57. package/lib/objects-in-viewport.d.ts +24 -0
  58. package/lib/output.capture.d.ts +24 -0
  59. package/lib/parse.keypress-kitty.d.ts +2 -0
  60. package/lib/parse.keypress.d.ts +26 -0
  61. package/lib/parse.mouse.d.ts +23 -0
  62. package/lib/queue.d.ts +15 -0
  63. package/lib/renderable.validations.d.ts +12 -0
  64. package/lib/scroll-acceleration.d.ts +43 -0
  65. package/lib/selection.d.ts +63 -0
  66. package/lib/singleton.d.ts +7 -0
  67. package/lib/stdin-buffer.d.ts +44 -0
  68. package/lib/styled-text.d.ts +63 -0
  69. package/lib/terminal-capability-detection.d.ts +30 -0
  70. package/lib/terminal-palette.d.ts +43 -0
  71. package/lib/tree-sitter/assets/update.d.ts +11 -0
  72. package/lib/tree-sitter/client.d.ts +47 -0
  73. package/lib/tree-sitter/default-parsers.d.ts +2 -0
  74. package/lib/tree-sitter/download-utils.d.ts +21 -0
  75. package/lib/tree-sitter/index.d.ts +8 -0
  76. package/lib/tree-sitter/parser.worker.d.ts +1 -0
  77. package/lib/tree-sitter/parsers-config.d.ts +38 -0
  78. package/lib/tree-sitter/resolve-ft.d.ts +2 -0
  79. package/lib/tree-sitter/types.d.ts +81 -0
  80. package/lib/tree-sitter-styled-text.d.ts +14 -0
  81. package/lib/validate-dir-name.d.ts +1 -0
  82. package/lib/yoga.options.d.ts +32 -0
  83. package/package.json +67 -0
  84. package/parser.worker.js +855 -0
  85. package/parser.worker.js.map +12 -0
  86. package/post/filters.d.ts +105 -0
  87. package/renderables/ASCIIFont.d.ts +52 -0
  88. package/renderables/Box.d.ts +72 -0
  89. package/renderables/Code.d.ts +66 -0
  90. package/renderables/Diff.d.ts +185 -0
  91. package/renderables/EditBufferRenderable.d.ts +162 -0
  92. package/renderables/FrameBuffer.d.ts +16 -0
  93. package/renderables/Input.d.ts +60 -0
  94. package/renderables/LineNumberRenderable.d.ts +111 -0
  95. package/renderables/Markdown.d.ts +98 -0
  96. package/renderables/ScrollBar.d.ts +77 -0
  97. package/renderables/ScrollBox.d.ts +116 -0
  98. package/renderables/Select.d.ts +115 -0
  99. package/renderables/Slider.d.ts +44 -0
  100. package/renderables/TabSelect.d.ts +96 -0
  101. package/renderables/Text.d.ts +36 -0
  102. package/renderables/TextBufferRenderable.d.ts +103 -0
  103. package/renderables/TextNode.d.ts +91 -0
  104. package/renderables/Textarea.d.ts +114 -0
  105. package/renderables/__tests__/renderable-test-utils.d.ts +7 -0
  106. package/renderables/composition/VRenderable.d.ts +16 -0
  107. package/renderables/composition/constructs.d.ts +35 -0
  108. package/renderables/composition/vnode.d.ts +46 -0
  109. package/renderables/index.d.ts +20 -0
  110. package/renderables/markdown-parser.d.ts +10 -0
  111. package/renderer.d.ts +370 -0
  112. package/syntax-style.d.ts +54 -0
  113. package/testing/mock-keys.d.ts +80 -0
  114. package/testing/mock-mouse.d.ts +38 -0
  115. package/testing/mock-tree-sitter-client.d.ts +23 -0
  116. package/testing/spy.d.ts +7 -0
  117. package/testing/test-recorder.d.ts +61 -0
  118. package/testing/test-renderer.d.ts +23 -0
  119. package/testing.d.ts +6 -0
  120. package/testing.js +670 -0
  121. package/testing.js.map +15 -0
  122. package/text-buffer-view.d.ts +42 -0
  123. package/text-buffer.d.ts +67 -0
  124. package/types.d.ts +120 -0
  125. package/utils.d.ts +14 -0
  126. package/zig-structs.d.ts +42 -0
  127. package/zig.d.ts +326 -0
package/index.js.map ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/text-buffer-view.ts", "../src/edit-buffer.ts", "../src/editor-view.ts", "../src/syntax-style.ts", "../src/post/filters.ts", "../src/animation/Timeline.ts", "../src/renderables/FrameBuffer.ts", "../src/renderables/ASCIIFont.ts", "../src/renderables/Box.ts", "../src/renderables/TextBufferRenderable.ts", "../src/renderables/Code.ts", "../src/renderables/TextNode.ts", "../src/renderables/composition/constructs.ts", "../src/renderables/composition/VRenderable.ts", "../src/renderables/LineNumberRenderable.ts", "../src/renderables/Diff.ts", "../src/renderables/Text.ts", "../src/renderables/EditBufferRenderable.ts", "../src/renderables/Textarea.ts", "../src/renderables/Input.ts", "../src/renderables/markdown-parser.ts", "../src/renderables/Markdown.ts", "../src/renderables/Slider.ts", "../src/renderables/ScrollBar.ts", "../src/renderables/ScrollBox.ts", "../src/renderables/Select.ts", "../src/renderables/TabSelect.ts", "../src/index.ts"],
4
+ "sourcesContent": [
5
+ "import { RGBA } from \"./lib/RGBA\"\nimport { resolveRenderLib, type LineInfo, type RenderLib } from \"./zig\"\nimport { type Pointer } from \"bun:ffi\"\nimport type { TextBuffer } from \"./text-buffer\"\n\nexport class TextBufferView {\n private lib: RenderLib\n private viewPtr: Pointer\n private textBuffer: TextBuffer\n private _destroyed: boolean = false\n\n constructor(lib: RenderLib, ptr: Pointer, 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(): Pointer {\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 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; maxWidth: 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",
6
+ "import { resolveRenderLib, type LogicalCursor, type RenderLib } from \"./zig\"\nimport { type Pointer } from \"bun:ffi\"\nimport { type WidthMethod, type Highlight } from \"./types\"\nimport { RGBA } from \"./lib/RGBA\"\nimport { EventEmitter } from \"events\"\nimport type { SyntaxStyle } from \"./syntax-style\"\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: Pointer\n private textBufferPtr: Pointer\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: Pointer) {\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(): Pointer {\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 this._syntaxStyle = style ?? undefined\n this.lib.textBufferSetSyntaxStyle(this.textBufferPtr, style?.ptr ?? null)\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",
7
+ "import { RGBA } from \"./lib/RGBA\"\nimport { resolveRenderLib, type RenderLib, type VisualCursor, type LineInfo } from \"./zig\"\nimport { type Pointer } from \"bun:ffi\"\nimport type { EditBuffer } from \"./edit-buffer\"\nimport { createExtmarksController } from \"./lib\"\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: Pointer\n private editBuffer: EditBuffer\n private _destroyed: boolean = false\n private _extmarksController?: any\n private _textBufferViewPtr?: Pointer\n\n constructor(lib: RenderLib, ptr: Pointer, 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(): Pointer {\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; maxWidth: 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",
8
+ "import { RGBA, parseColor, type ColorInput } from \"./lib/RGBA\"\nimport { resolveRenderLib, type RenderLib } from \"./zig\"\nimport { type Pointer } from \"bun:ffi\"\nimport { createTextAttributes } from \"./utils\"\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 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: Pointer\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: Pointer) {\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, StyleDefinition>): 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: StyleDefinition): 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 id = this.lib.syntaxStyleRegister(this.stylePtr, name, style.fg || null, style.bg || null, attributes)\n\n this.nameCache.set(name, id)\n this.styleDefs.set(name, style)\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(): Pointer {\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",
9
+ "import type { OptimizedBuffer } from \"../buffer\"\n\n/**\n * Applies a scanline effect by darkening every nth row.\n */\nexport function applyScanlines(buffer: OptimizedBuffer, strength: number = 0.8, step: number = 2): void {\n const width = buffer.width\n const height = buffer.height\n const bg = buffer.buffers.bg\n\n for (let y = 0; y < height; y += step) {\n for (let x = 0; x < width; x++) {\n const colorIndex = (y * width + x) * 4\n bg[colorIndex] *= strength // R\n bg[colorIndex + 1] *= strength // G\n bg[colorIndex + 2] *= strength // B\n // Keep Alpha the same\n }\n }\n}\n\n/**\n * Converts the buffer colors to grayscale.\n */\nexport function applyGrayscale(buffer: OptimizedBuffer): void {\n const size = buffer.width * buffer.height\n const fg = buffer.buffers.fg\n const bg = buffer.buffers.bg\n\n for (let i = 0; i < size; i++) {\n const colorIndex = i * 4\n\n // Grayscale foreground\n const fgR = fg[colorIndex]\n const fgG = fg[colorIndex + 1]\n const fgB = fg[colorIndex + 2]\n const fgLum = 0.299 * fgR + 0.587 * fgG + 0.114 * fgB\n fg[colorIndex] = fgLum\n fg[colorIndex + 1] = fgLum\n fg[colorIndex + 2] = fgLum\n\n // Grayscale background\n const bgR = bg[colorIndex]\n const bgG = bg[colorIndex + 1]\n const bgB = bg[colorIndex + 2]\n const bgLum = 0.299 * bgR + 0.587 * bgG + 0.114 * bgB\n bg[colorIndex] = bgLum\n bg[colorIndex + 1] = bgLum\n bg[colorIndex + 2] = bgLum\n }\n}\n\n/**\n * Applies a sepia tone to the buffer.\n */\nexport function applySepia(buffer: OptimizedBuffer): void {\n const size = buffer.width * buffer.height\n const fg = buffer.buffers.fg\n const bg = buffer.buffers.bg\n\n for (let i = 0; i < size; i++) {\n const colorIndex = i * 4\n\n // Sepia foreground\n let fgR = fg[colorIndex]\n let fgG = fg[colorIndex + 1]\n let fgB = fg[colorIndex + 2]\n let newFgR = Math.min(1.0, fgR * 0.393 + fgG * 0.769 + fgB * 0.189)\n let newFgG = Math.min(1.0, fgR * 0.349 + fgG * 0.686 + fgB * 0.168)\n let newFgB = Math.min(1.0, fgR * 0.272 + fgG * 0.534 + fgB * 0.131)\n fg[colorIndex] = newFgR\n fg[colorIndex + 1] = newFgG\n fg[colorIndex + 2] = newFgB\n\n // Sepia background\n let bgR = bg[colorIndex]\n let bgG = bg[colorIndex + 1]\n let bgB = bg[colorIndex + 2]\n let newBgR = Math.min(1.0, bgR * 0.393 + bgG * 0.769 + bgB * 0.189)\n let newBgG = Math.min(1.0, bgR * 0.349 + bgG * 0.686 + bgB * 0.168)\n let newBgB = Math.min(1.0, bgR * 0.272 + bgG * 0.534 + bgB * 0.131)\n bg[colorIndex] = newBgR\n bg[colorIndex + 1] = newBgG\n bg[colorIndex + 2] = newBgB\n }\n}\n\n/**\n * Inverts the colors in the buffer.\n */\nexport function applyInvert(buffer: OptimizedBuffer): void {\n const size = buffer.width * buffer.height\n const fg = buffer.buffers.fg\n const bg = buffer.buffers.bg\n\n for (let i = 0; i < size; i++) {\n const colorIndex = i * 4\n fg[colorIndex] = 1.0 - fg[colorIndex]\n fg[colorIndex + 1] = 1.0 - fg[colorIndex + 1]\n fg[colorIndex + 2] = 1.0 - fg[colorIndex + 2]\n\n bg[colorIndex] = 1.0 - bg[colorIndex]\n bg[colorIndex + 1] = 1.0 - bg[colorIndex + 1]\n bg[colorIndex + 2] = 1.0 - bg[colorIndex + 2]\n }\n}\n\n/**\n * Adds random noise to the buffer colors.\n */\nexport function applyNoise(buffer: OptimizedBuffer, strength: number = 0.1): void {\n const size = buffer.width * buffer.height\n const fg = buffer.buffers.fg\n const bg = buffer.buffers.bg\n\n for (let i = 0; i < size; i++) {\n const colorIndex = i * 4\n const noise = (Math.random() - 0.5) * strength\n\n fg[colorIndex] = Math.max(0, Math.min(1, fg[colorIndex] + noise))\n fg[colorIndex + 1] = Math.max(0, Math.min(1, fg[colorIndex + 1] + noise))\n fg[colorIndex + 2] = Math.max(0, Math.min(1, fg[colorIndex + 2] + noise))\n\n bg[colorIndex] = Math.max(0, Math.min(1, bg[colorIndex] + noise))\n bg[colorIndex + 1] = Math.max(0, Math.min(1, bg[colorIndex + 1] + noise))\n bg[colorIndex + 2] = Math.max(0, Math.min(1, bg[colorIndex + 2] + noise))\n }\n}\n\n/**\n * Applies a simplified chromatic aberration effect.\n */\nexport function applyChromaticAberration(buffer: OptimizedBuffer, strength: number = 1): void {\n const width = buffer.width\n const height = buffer.height\n const srcFg = Float32Array.from(buffer.buffers.fg) // Copy original fg data\n const destFg = buffer.buffers.fg\n const centerX = width / 2\n const centerY = height / 2\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const dx = x - centerX\n const dy = y - centerY\n const offset = Math.round((Math.sqrt(dx * dx + dy * dy) / Math.max(centerX, centerY)) * strength)\n\n const rX = Math.max(0, Math.min(width - 1, x - offset))\n const bX = Math.max(0, Math.min(width - 1, x + offset))\n\n const rIndex = (y * width + rX) * 4\n const gIndex = (y * width + x) * 4 // Green from original position\n const bIndex = (y * width + bX) * 4\n const destIndex = (y * width + x) * 4\n\n destFg[destIndex] = srcFg[rIndex] // Red from left offset\n destFg[destIndex + 1] = srcFg[gIndex + 1] // Green from center\n destFg[destIndex + 2] = srcFg[bIndex + 2] // Blue from right offset\n // Keep original Alpha\n }\n }\n}\n\n/**\n * Converts the buffer to ASCII art based on background brightness.\n */\nexport function applyAsciiArt(buffer: OptimizedBuffer, ramp: string = \" .:-=+*#%@\"): void {\n const width = buffer.width\n const height = buffer.height\n const chars = buffer.buffers.char\n const bg = buffer.buffers.bg\n const rampLength = ramp.length\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const index = y * width + x\n const colorIndex = index * 4\n const bgR = bg[colorIndex]\n const bgG = bg[colorIndex + 1]\n const bgB = bg[colorIndex + 2]\n const lum = 0.299 * bgR + 0.587 * bgG + 0.114 * bgB // Luminance\n const rampIndex = Math.min(rampLength - 1, Math.floor(lum * rampLength))\n chars[index] = ramp[rampIndex].charCodeAt(0)\n }\n }\n}\n\ninterface ActiveGlitch {\n y: number\n type: \"shift\" | \"flip\" | \"color\"\n amount: number\n}\n\nexport class DistortionEffect {\n // --- Configurable Parameters ---\n public glitchChancePerSecond: number = 0.5\n public maxGlitchLines: number = 3\n public minGlitchDuration: number = 0.05\n public maxGlitchDuration: number = 0.2\n public maxShiftAmount: number = 10\n public shiftFlipRatio: number = 0.6\n public colorGlitchChance: number = 0.2\n\n // --- Internal State ---\n private lastGlitchTime: number = 0\n private glitchDuration: number = 0\n private activeGlitches: ActiveGlitch[] = []\n\n constructor(options?: Partial<DistortionEffect>) {\n if (options) {\n Object.assign(this, options)\n }\n }\n\n /**\n * Applies the animated distortion/glitch effect to the buffer.\n */\n public apply(buffer: OptimizedBuffer, deltaTime: number): void {\n const width = buffer.width\n const height = buffer.height\n const buf = buffer.buffers\n // Note: Using internal timer based on deltaTime is more reliable than Date.now()\n\n // Update glitch timer\n this.lastGlitchTime += deltaTime\n\n // End current glitch if duration is over\n if (this.activeGlitches.length > 0 && this.lastGlitchTime >= this.glitchDuration) {\n this.activeGlitches = []\n this.glitchDuration = 0\n }\n\n // Chance to start a new glitch\n if (this.activeGlitches.length === 0 && Math.random() < this.glitchChancePerSecond * deltaTime) {\n this.lastGlitchTime = 0\n this.glitchDuration = this.minGlitchDuration + Math.random() * (this.maxGlitchDuration - this.minGlitchDuration)\n const numGlitches = 1 + Math.floor(Math.random() * this.maxGlitchLines)\n\n for (let i = 0; i < numGlitches; i++) {\n const y = Math.floor(Math.random() * height)\n let type: ActiveGlitch[\"type\"]\n let amount = 0\n\n const typeRoll = Math.random()\n if (typeRoll < this.colorGlitchChance) {\n type = \"color\"\n } else {\n // Determine shift or flip based on remaining probability\n const shiftRoll = (typeRoll - this.colorGlitchChance) / (1 - this.colorGlitchChance)\n if (shiftRoll < this.shiftFlipRatio) {\n type = \"shift\"\n amount = Math.floor((Math.random() - 0.5) * 2 * this.maxShiftAmount)\n } else {\n type = \"flip\"\n }\n }\n\n // Avoid glitching the same line twice in one burst\n if (!this.activeGlitches.some((g) => g.y === y)) {\n this.activeGlitches.push({ y, type, amount })\n }\n }\n }\n\n // Apply active glitches\n if (this.activeGlitches.length > 0) {\n // Create temporary arrays lazily if needed (minor optimization for shift/flip)\n let tempChar: Uint32Array | null = null\n let tempFg: Float32Array | null = null\n let tempBg: Float32Array | null = null\n let tempAttr: Uint8Array | null = null\n\n for (const glitch of this.activeGlitches) {\n const y = glitch.y\n // Ensure y is within bounds (safer)\n if (y < 0 || y >= height) continue\n const baseIndex = y * width\n\n if (glitch.type === \"shift\" || glitch.type === \"flip\") {\n // Lazily create temp buffers only when needed for shift/flip\n if (!tempChar) {\n tempChar = new Uint32Array(width)\n tempFg = new Float32Array(width * 4)\n tempBg = new Float32Array(width * 4)\n tempAttr = new Uint8Array(width)\n }\n\n // 1. Copy original row data to temp buffers\n try {\n tempChar.set(buf.char.subarray(baseIndex, baseIndex + width))\n tempFg!.set(buf.fg.subarray(baseIndex * 4, (baseIndex + width) * 4))\n tempBg!.set(buf.bg.subarray(baseIndex * 4, (baseIndex + width) * 4))\n tempAttr!.set(buf.attributes.subarray(baseIndex, baseIndex + width))\n } catch (e) {\n // Handle potential range errors if buffer size changes unexpectedly\n console.error(`Error copying row ${y} for distortion:`, e)\n continue\n }\n\n if (glitch.type === \"shift\") {\n const shift = glitch.amount\n for (let x = 0; x < width; x++) {\n const srcX = (x - shift + width) % width // Wrap around shift\n const destIndex = baseIndex + x\n const srcTempIndex = srcX\n\n buf.char[destIndex] = tempChar[srcTempIndex]\n buf.attributes[destIndex] = tempAttr![srcTempIndex]\n\n const destColorIndex = destIndex * 4\n const srcTempColorIndex = srcTempIndex * 4\n\n buf.fg.set(tempFg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)\n buf.bg.set(tempBg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)\n }\n } else {\n // type === 'flip'\n for (let x = 0; x < width; x++) {\n const srcX = width - 1 - x // Flipped index\n const destIndex = baseIndex + x\n const srcTempIndex = srcX\n\n buf.char[destIndex] = tempChar[srcTempIndex]\n buf.attributes[destIndex] = tempAttr![srcTempIndex]\n\n const destColorIndex = destIndex * 4\n const srcTempColorIndex = srcTempIndex * 4\n\n buf.fg.set(tempFg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)\n buf.bg.set(tempBg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)\n }\n }\n } else if (glitch.type === \"color\") {\n const glitchStart = Math.floor(Math.random() * width)\n // Make glitch length at least 1 pixel, up to the rest of the line\n const maxPossibleLength = width - glitchStart\n // Introduce more variability: sometimes short, sometimes long, but not always full width\n let glitchLength = Math.floor(Math.random() * maxPossibleLength) + 1\n if (Math.random() < 0.2) {\n // 20% chance of a shorter, more intense glitch segment\n glitchLength = Math.floor(Math.random() * (width / 4)) + 1\n }\n glitchLength = Math.min(glitchLength, maxPossibleLength)\n\n for (let x = glitchStart; x < glitchStart + glitchLength; x++) {\n if (x >= width) break // Boundary check\n\n const destIndex = baseIndex + x\n const destColorIndex = destIndex * 4\n\n let rFg, gFg, bFg, rBg, gBg, bBg\n\n // More varied and \"glitchy\" colors\n const colorMode = Math.random()\n if (colorMode < 0.33) {\n // Pure random\n rFg = Math.random()\n gFg = Math.random()\n bFg = Math.random()\n rBg = Math.random()\n gBg = Math.random()\n bBg = Math.random()\n } else if (colorMode < 0.66) {\n // Single channel emphasis or block color\n const emphasis = Math.random()\n if (emphasis < 0.25) {\n rFg = Math.random()\n gFg = 0\n bFg = 0\n } // Red\n else if (emphasis < 0.5) {\n rFg = 0\n gFg = Math.random()\n bFg = 0\n } // Green\n else if (emphasis < 0.75) {\n rFg = 0\n gFg = 0\n bFg = Math.random()\n } // Blue\n else {\n // Bright glitch color\n const glitchColorRoll = Math.random()\n if (glitchColorRoll < 0.33) {\n rFg = 1\n gFg = 0\n bFg = 1\n } // Magenta\n else if (glitchColorRoll < 0.66) {\n rFg = 0\n gFg = 1\n bFg = 1\n } // Cyan\n else {\n rFg = 1\n gFg = 1\n bFg = 0\n } // Yellow\n }\n // Background can be inverted or similar to FG\n if (Math.random() < 0.5) {\n rBg = 1 - rFg\n gBg = 1 - gFg\n bBg = 1 - bFg\n } else {\n rBg = rFg * (Math.random() * 0.5 + 0.2) // Darker shade of fg\n gBg = gFg * (Math.random() * 0.5 + 0.2)\n bBg = bFg * (Math.random() * 0.5 + 0.2)\n }\n } else {\n // Inverted or high contrast\n rFg = Math.random() > 0.5 ? 1 : 0\n gFg = Math.random() > 0.5 ? 1 : 0\n bFg = Math.random() > 0.5 ? 1 : 0\n rBg = 1 - rFg\n gBg = 1 - gFg\n bBg = 1 - bFg\n }\n\n buf.fg[destColorIndex] = rFg\n buf.fg[destColorIndex + 1] = gFg\n buf.fg[destColorIndex + 2] = bFg\n // Keep alpha buf.fg[destColorIndex + 3]\n\n buf.bg[destColorIndex] = rBg\n buf.bg[destColorIndex + 1] = gBg\n buf.bg[destColorIndex + 2] = bBg\n // Keep alpha buf.bg[destColorIndex + 3]\n }\n }\n }\n }\n }\n}\n\n/**\n * Applies a vignette effect by darkening the corners, optimized with precomputation.\n */\nexport class VignetteEffect {\n private _strength: number\n // Stores the base attenuation (0 at center, 1 at max distance) for each pixel\n private precomputedBaseAttenuation: Float32Array | null = null\n private cachedWidth: number = -1\n private cachedHeight: number = -1\n\n constructor(strength: number = 0.5) {\n this._strength = strength\n }\n\n public set strength(newStrength: number) {\n this._strength = Math.max(0, newStrength) // Ensure strength is non-negative\n }\n\n public get strength(): number {\n return this._strength\n }\n\n private _computeFactors(width: number, height: number): void {\n this.precomputedBaseAttenuation = new Float32Array(width * height)\n const centerX = width / 2\n const centerY = height / 2\n const maxDistSq = centerX * centerX + centerY * centerY\n const safeMaxDistSq = maxDistSq === 0 ? 1 : maxDistSq // Avoid division by zero\n\n for (let y = 0; y < height; y++) {\n const dy = y - centerY\n const dySq = dy * dy\n for (let x = 0; x < width; x++) {\n const dx = x - centerX\n const distSq = dx * dx + dySq\n // Calculate base attenuation (0 to 1 based on distance)\n const baseAttenuation = Math.min(1, distSq / safeMaxDistSq)\n const index = y * width + x\n this.precomputedBaseAttenuation[index] = baseAttenuation\n }\n }\n this.cachedWidth = width\n this.cachedHeight = height\n }\n\n /**\n * Applies the vignette effect using precomputed base attenuation and current strength.\n */\n public apply(buffer: OptimizedBuffer): void {\n const width = buffer.width\n const height = buffer.height\n const buf = buffer.buffers\n const size = width * height\n\n // Recompute base attenuation if dimensions changed or factors haven't been computed yet\n if (width !== this.cachedWidth || height !== this.cachedHeight || !this.precomputedBaseAttenuation) {\n this._computeFactors(width, height)\n }\n\n // Apply effect using precomputed base and current strength\n for (let i = 0; i < size; i++) {\n // Calculate the final factor dynamically\n const factor = Math.max(0, 1 - this.precomputedBaseAttenuation![i] * this._strength)\n const colorIndex = i * 4\n\n buf.fg[colorIndex] *= factor\n buf.fg[colorIndex + 1] *= factor\n buf.fg[colorIndex + 2] *= factor\n\n buf.bg[colorIndex] *= factor\n buf.bg[colorIndex + 1] *= factor\n buf.bg[colorIndex + 2] *= factor\n }\n }\n}\n\n/**\n * Adjusts the overall brightness of the buffer.\n */\nexport class BrightnessEffect {\n private _brightness: number\n\n constructor(brightness: number = 1.0) {\n this._brightness = Math.max(0, brightness) // Ensure brightness is non-negative\n }\n\n public set brightness(newBrightness: number) {\n this._brightness = Math.max(0, newBrightness)\n }\n\n public get brightness(): number {\n return this._brightness\n }\n\n /**\n * Applies the brightness adjustment to the buffer.\n */\n public apply(buffer: OptimizedBuffer): void {\n const size = buffer.width * buffer.height\n const fg = buffer.buffers.fg\n const bg = buffer.buffers.bg\n const factor = this._brightness\n\n // No need to process if brightness is 1 (no change)\n if (factor === 1.0) {\n return\n }\n\n for (let i = 0; i < size; i++) {\n const colorIndex = i * 4\n\n // Adjust foreground\n fg[colorIndex] = Math.min(1.0, fg[colorIndex] * factor)\n fg[colorIndex + 1] = Math.min(1.0, fg[colorIndex + 1] * factor)\n fg[colorIndex + 2] = Math.min(1.0, fg[colorIndex + 2] * factor)\n // Alpha fg[colorIndex + 3] remains unchanged\n\n // Adjust background\n bg[colorIndex] = Math.min(1.0, bg[colorIndex] * factor)\n bg[colorIndex + 1] = Math.min(1.0, bg[colorIndex + 1] * factor)\n bg[colorIndex + 2] = Math.min(1.0, bg[colorIndex + 2] * factor)\n // Alpha bg[colorIndex + 3] remains unchanged\n }\n }\n}\n\n/**\n * Applies a simple box blur. (Expensive and may look bad with text).\n */\nexport class BlurEffect {\n private _radius: number\n\n constructor(radius: number = 1) {\n this._radius = Math.max(0, Math.round(radius)) // Radius should be a non-negative integer\n }\n\n public set radius(newRadius: number) {\n this._radius = Math.max(0, Math.round(newRadius))\n }\n\n public get radius(): number {\n return this._radius\n }\n\n /**\n * Applies an optimized separable box blur using a moving average (sliding window).\n */\n public apply(buffer: OptimizedBuffer): void {\n const radius = this._radius\n if (radius <= 0) return // No blur if radius is 0 or less\n\n const width = buffer.width\n const height = buffer.height\n const buf = buffer.buffers // Get the full buffer object\n const srcFg = buf.fg\n const srcBg = buf.bg\n const destFg = buf.fg // We'll write back to the original buffer\n const destBg = buf.bg\n const chars = buf.char // Get reference to character buffer\n const size = width * height\n const numChannels = 4 // RGBA\n\n // Temporary buffer for the horizontal pass result\n const tempBufferFg = new Float32Array(size * numChannels)\n const tempBufferBg = new Float32Array(size * numChannels)\n\n const windowSize = radius * 2 + 1\n\n // --- Horizontal Pass --- Fg\n for (let y = 0; y < height; y++) {\n let sumR = 0,\n sumG = 0,\n sumB = 0,\n sumA = 0\n const baseRowIndex = y * width\n\n // Initialize sum for the first window\n for (let x = -radius; x <= radius; x++) {\n const sampleX = Math.max(0, Math.min(width - 1, x))\n const srcIndex = (baseRowIndex + sampleX) * numChannels\n sumR += srcFg[srcIndex]\n sumG += srcFg[srcIndex + 1]\n sumB += srcFg[srcIndex + 2]\n sumA += srcFg[srcIndex + 3]\n }\n\n // Slide the window across the row\n for (let x = 0; x < width; x++) {\n const destIndex = (baseRowIndex + x) * numChannels\n tempBufferFg[destIndex] = sumR / windowSize\n tempBufferFg[destIndex + 1] = sumG / windowSize\n tempBufferFg[destIndex + 2] = sumB / windowSize\n tempBufferFg[destIndex + 3] = sumA / windowSize\n\n // Subtract pixel leaving the window (left edge)\n const leavingX = Math.max(0, Math.min(width - 1, x - radius))\n const leavingIndex = (baseRowIndex + leavingX) * numChannels\n sumR -= srcFg[leavingIndex]\n sumG -= srcFg[leavingIndex + 1]\n sumB -= srcFg[leavingIndex + 2]\n sumA -= srcFg[leavingIndex + 3]\n\n // Add pixel entering the window (right edge)\n const enteringX = Math.max(0, Math.min(width - 1, x + radius + 1))\n const enteringIndex = (baseRowIndex + enteringX) * numChannels\n sumR += srcFg[enteringIndex]\n sumG += srcFg[enteringIndex + 1]\n sumB += srcFg[enteringIndex + 2]\n sumA += srcFg[enteringIndex + 3]\n }\n }\n\n // --- Horizontal Pass --- Bg\n for (let y = 0; y < height; y++) {\n let sumR = 0,\n sumG = 0,\n sumB = 0,\n sumA = 0\n const baseRowIndex = y * width\n for (let x = -radius; x <= radius; x++) {\n const sampleX = Math.max(0, Math.min(width - 1, x))\n const srcIndex = (baseRowIndex + sampleX) * numChannels\n sumR += srcBg[srcIndex]\n sumG += srcBg[srcIndex + 1]\n sumB += srcBg[srcIndex + 2]\n sumA += srcBg[srcIndex + 3]\n }\n for (let x = 0; x < width; x++) {\n const destIndex = (baseRowIndex + x) * numChannels\n tempBufferBg[destIndex] = sumR / windowSize\n tempBufferBg[destIndex + 1] = sumG / windowSize\n tempBufferBg[destIndex + 2] = sumB / windowSize\n tempBufferBg[destIndex + 3] = sumA / windowSize\n const leavingX = Math.max(0, Math.min(width - 1, x - radius))\n const leavingIndex = (baseRowIndex + leavingX) * numChannels\n sumR -= srcBg[leavingIndex]\n sumG -= srcBg[leavingIndex + 1]\n sumB -= srcBg[leavingIndex + 2]\n sumA -= srcBg[leavingIndex + 3]\n const enteringX = Math.max(0, Math.min(width - 1, x + radius + 1))\n const enteringIndex = (baseRowIndex + enteringX) * numChannels\n sumR += srcBg[enteringIndex]\n sumG += srcBg[enteringIndex + 1]\n sumB += srcBg[enteringIndex + 2]\n sumA += srcBg[enteringIndex + 3]\n }\n }\n\n // --- Vertical Pass --- Fg\n for (let x = 0; x < width; x++) {\n let sumR = 0,\n sumG = 0,\n sumB = 0,\n sumA = 0\n\n // Initialize sum for the first window\n for (let y = -radius; y <= radius; y++) {\n const sampleY = Math.max(0, Math.min(height - 1, y))\n const srcIndex = (sampleY * width + x) * numChannels\n sumR += tempBufferFg[srcIndex]\n sumG += tempBufferFg[srcIndex + 1]\n sumB += tempBufferFg[srcIndex + 2]\n sumA += tempBufferFg[srcIndex + 3]\n }\n\n // Slide the window down the column\n for (let y = 0; y < height; y++) {\n const destIndex = (y * width + x) * numChannels\n destFg[destIndex] = sumR / windowSize\n destFg[destIndex + 1] = sumG / windowSize\n destFg[destIndex + 2] = sumB / windowSize\n destFg[destIndex + 3] = sumA / windowSize\n\n // Subtract pixel leaving the window (top edge)\n const leavingY = Math.max(0, Math.min(height - 1, y - radius))\n const leavingIndex = (leavingY * width + x) * numChannels\n sumR -= tempBufferFg[leavingIndex]\n sumG -= tempBufferFg[leavingIndex + 1]\n sumB -= tempBufferFg[leavingIndex + 2]\n sumA -= tempBufferFg[leavingIndex + 3]\n\n // Add pixel entering the window (bottom edge)\n const enteringY = Math.max(0, Math.min(height - 1, y + radius + 1))\n const enteringIndex = (enteringY * width + x) * numChannels\n sumR += tempBufferFg[enteringIndex]\n sumG += tempBufferFg[enteringIndex + 1]\n sumB += tempBufferFg[enteringIndex + 2]\n sumA += tempBufferFg[enteringIndex + 3]\n }\n }\n\n // --- Vertical Pass --- Bg\n for (let x = 0; x < width; x++) {\n let sumR = 0,\n sumG = 0,\n sumB = 0,\n sumA = 0\n for (let y = -radius; y <= radius; y++) {\n const sampleY = Math.max(0, Math.min(height - 1, y))\n const srcIndex = (sampleY * width + x) * numChannels\n sumR += tempBufferBg[srcIndex]\n sumG += tempBufferBg[srcIndex + 1]\n sumB += tempBufferBg[srcIndex + 2]\n sumA += tempBufferBg[srcIndex + 3]\n }\n for (let y = 0; y < height; y++) {\n const destIndex = (y * width + x) * numChannels\n destBg[destIndex] = sumR / windowSize\n destBg[destIndex + 1] = sumG / windowSize\n destBg[destIndex + 2] = sumB / windowSize\n destBg[destIndex + 3] = sumA / windowSize\n const leavingY = Math.max(0, Math.min(height - 1, y - radius))\n const leavingIndex = (leavingY * width + x) * numChannels\n sumR -= tempBufferBg[leavingIndex]\n sumG -= tempBufferBg[leavingIndex + 1]\n sumB -= tempBufferBg[leavingIndex + 2]\n sumA -= tempBufferBg[leavingIndex + 3]\n const enteringY = Math.max(0, Math.min(height - 1, y + radius + 1))\n const enteringIndex = (enteringY * width + x) * numChannels\n sumR += tempBufferBg[enteringIndex]\n sumG += tempBufferBg[enteringIndex + 1]\n sumB += tempBufferBg[enteringIndex + 2]\n sumA += tempBufferBg[enteringIndex + 3]\n }\n }\n\n // --- Character Pass (Based on blurred FG Alpha) ---\n const charRamp = [\" \", \"░\", \"▒\", \"▓\", \" \"] // Space, Light, Medium, Dark, Full\n const rampLength = charRamp.length\n\n for (let i = 0; i < size; i++) {\n const alphaIndex = i * numChannels + 3\n const fgAlpha = destFg[alphaIndex] // Get the final blurred FG alpha\n\n // Clamp alpha just in case, although blur should keep it in [0, 1]\n const clampedAlpha = Math.max(0, Math.min(1, fgAlpha))\n\n // Map alpha to character ramp\n // Ensure index doesn't exceed ramp bounds if alpha is exactly 1.0\n const rampIndex = Math.min(rampLength - 1, Math.floor(clampedAlpha * rampLength))\n\n chars[i] = charRamp[rampIndex].charCodeAt(0)\n }\n }\n}\n\n/**\n * Applies a bloom effect based on bright areas (Simplified).\n */\nexport class BloomEffect {\n private _threshold: number\n private _strength: number\n private _radius: number\n\n constructor(threshold: number = 0.8, strength: number = 0.2, radius: number = 2) {\n this._threshold = Math.max(0, Math.min(1, threshold))\n this._strength = Math.max(0, strength)\n this._radius = Math.max(0, Math.round(radius))\n }\n\n public set threshold(newThreshold: number) {\n this._threshold = Math.max(0, Math.min(1, newThreshold))\n }\n public get threshold(): number {\n return this._threshold\n }\n\n public set strength(newStrength: number) {\n this._strength = Math.max(0, newStrength)\n }\n public get strength(): number {\n return this._strength\n }\n\n public set radius(newRadius: number) {\n this._radius = Math.max(0, Math.round(newRadius))\n }\n public get radius(): number {\n return this._radius\n }\n\n public apply(buffer: OptimizedBuffer): void {\n const threshold = this._threshold\n const strength = this._strength\n const radius = this._radius\n\n if (strength <= 0 || radius <= 0) return // No bloom if strength or radius is non-positive\n\n const width = buffer.width\n const height = buffer.height\n // Operate directly on the buffer's data for bloom, but need a source copy temporarily\n const srcFg = Float32Array.from(buffer.buffers.fg)\n const srcBg = Float32Array.from(buffer.buffers.bg)\n const destFg = buffer.buffers.fg\n const destBg = buffer.buffers.bg\n\n const brightPixels: { x: number; y: number; intensity: number }[] = []\n\n // 1. Find bright pixels based on original data\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const index = (y * width + x) * 4\n // Consider max component brightness, or luminance? Using luminance.\n const fgLum = 0.299 * srcFg[index] + 0.587 * srcFg[index + 1] + 0.114 * srcFg[index + 2]\n const bgLum = 0.299 * srcBg[index] + 0.587 * srcBg[index + 1] + 0.114 * srcBg[index + 2]\n const lum = Math.max(fgLum, bgLum)\n if (lum > threshold) {\n const intensity = (lum - threshold) / (1 - threshold + 1e-6) // Add epsilon to avoid div by zero\n brightPixels.push({ x, y, intensity: Math.max(0, intensity) })\n }\n }\n }\n\n // If no bright pixels found, exit early\n if (brightPixels.length === 0) return\n\n // Initialize destination buffers by copying original state before applying bloom\n // This prevents bloom from compounding on itself within one frame pass\n destFg.set(srcFg)\n destBg.set(srcBg)\n\n // 2. Apply bloom spread from bright pixels onto the destination buffers\n for (const bright of brightPixels) {\n for (let ky = -radius; ky <= radius; ky++) {\n for (let kx = -radius; kx <= radius; kx++) {\n if (kx === 0 && ky === 0) continue // Don't bloom self\n\n const sampleX = bright.x + kx\n const sampleY = bright.y + ky\n\n if (sampleX >= 0 && sampleX < width && sampleY >= 0 && sampleY < height) {\n const distSq = kx * kx + ky * ky // Use squared distance for falloff calculation\n const radiusSq = radius * radius\n if (distSq <= radiusSq) {\n // Simple linear falloff based on squared distance\n const falloff = 1 - distSq / radiusSq\n const bloomAmount = bright.intensity * strength * falloff\n const destIndex = (sampleY * width + sampleX) * 4\n\n // Add bloom to both fg and bg, clamping at 1.0\n destFg[destIndex] = Math.min(1.0, destFg[destIndex] + bloomAmount)\n destFg[destIndex + 1] = Math.min(1.0, destFg[destIndex + 1] + bloomAmount)\n destFg[destIndex + 2] = Math.min(1.0, destFg[destIndex + 2] + bloomAmount)\n\n destBg[destIndex] = Math.min(1.0, destBg[destIndex] + bloomAmount)\n destBg[destIndex + 1] = Math.min(1.0, destBg[destIndex + 1] + bloomAmount)\n destBg[destIndex + 2] = Math.min(1.0, destBg[destIndex + 2] + bloomAmount)\n }\n }\n }\n }\n }\n }\n}\n",
10
+ "import type { CliRenderer } from \"../renderer\"\n\nexport interface TimelineOptions {\n duration?: number\n loop?: boolean\n autoplay?: boolean\n onComplete?: () => void\n onPause?: () => void\n}\n\nexport interface AnimationOptions {\n duration: number\n ease?: EasingFunctions\n onUpdate?: (animation: JSAnimation) => void\n onComplete?: () => void\n onStart?: () => void\n onLoop?: () => void\n loop?: boolean | number\n loopDelay?: number\n alternate?: boolean\n once?: boolean\n [key: string]: any\n}\n\nexport interface JSAnimation {\n targets: any[]\n deltaTime: number\n progress: number\n currentTime: number\n}\n\ninterface TimelineItem {\n type: \"animation\" | \"callback\" | \"timeline\"\n startTime: number\n}\n\ninterface TimelineTimelineItem extends TimelineItem {\n type: \"timeline\"\n timeline: Timeline\n timelineStarted?: boolean\n}\n\ninterface TimelineCallbackItem extends TimelineItem {\n type: \"callback\"\n callback: () => void\n executed: boolean\n}\n\ninterface TimelineAnimationItem extends TimelineItem {\n type: \"animation\"\n\n target: any[]\n properties?: Record<string, number>\n initialValues?: Record<string, number>[]\n duration?: number\n ease?: keyof typeof easingFunctions\n loop?: boolean | number\n loopDelay?: number\n alternate?: boolean\n onUpdate?: (animation: JSAnimation) => void\n onComplete?: () => void\n onStart?: () => void\n onLoop?: () => void\n completed?: boolean\n started?: boolean\n currentLoop?: number\n once?: boolean\n}\n\nexport type EasingFunctions = keyof typeof easingFunctions\n\nconst easingFunctions = {\n linear: (t: number) => t,\n inQuad: (t: number) => t * t,\n outQuad: (t: number) => t * (2 - t),\n inOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n inExpo: (t: number) => (t === 0 ? 0 : Math.pow(2, 10 * (t - 1))),\n outExpo: (t: number) => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n inOutSine: (t: number) => -(Math.cos(Math.PI * t) - 1) / 2,\n outBounce: (t: number) => {\n const n1 = 7.5625\n const d1 = 2.75\n if (t < 1 / d1) {\n return n1 * t * t\n } else if (t < 2 / d1) {\n return n1 * (t -= 1.5 / d1) * t + 0.75\n } else if (t < 2.5 / d1) {\n return n1 * (t -= 2.25 / d1) * t + 0.9375\n } else {\n return n1 * (t -= 2.625 / d1) * t + 0.984375\n }\n },\n outElastic: (t: number) => {\n const c4 = (2 * Math.PI) / 3\n return t === 0 ? 0 : t === 1 ? 1 : Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1\n },\n inBounce: (t: number) => 1 - easingFunctions.outBounce(1 - t),\n inCirc: (t: number) => 1 - Math.sqrt(1 - t * t),\n outCirc: (t: number) => Math.sqrt(1 - Math.pow(t - 1, 2)),\n inOutCirc: (t: number) => {\n if ((t *= 2) < 1) return -0.5 * (Math.sqrt(1 - t * t) - 1)\n return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1)\n },\n inBack: (t: number, s: number = 1.70158) => t * t * ((s + 1) * t - s),\n outBack: (t: number, s: number = 1.70158) => --t * t * ((s + 1) * t + s) + 1,\n inOutBack: (t: number, s: number = 1.70158) => {\n s *= 1.525\n if ((t *= 2) < 1) return 0.5 * (t * t * ((s + 1) * t - s))\n return 0.5 * ((t -= 2) * t * ((s + 1) * t + s) + 2)\n },\n}\n\nfunction captureInitialValues(item: TimelineAnimationItem): void {\n if (!item.properties) return\n if (!item.initialValues || item.initialValues.length === 0) {\n const initialValues: Record<string, number>[] = []\n\n for (let i = 0; i < item.target.length; i++) {\n const target = item.target[i]\n const targetInitialValues: Record<string, number> = {}\n\n for (const key of Object.keys(item.properties)) {\n if (typeof target[key] === \"number\") {\n targetInitialValues[key] = target[key]\n }\n }\n\n initialValues.push(targetInitialValues)\n }\n\n item.initialValues = initialValues\n }\n}\n\nfunction applyAnimationAtProgress(\n item: TimelineAnimationItem,\n progress: number,\n reversed: boolean,\n timelineTime: number,\n deltaTime: number = 0,\n): void {\n if (!item.properties || !item.initialValues) return\n\n const easingFn = easingFunctions[item.ease || \"linear\"] || easingFunctions.linear\n const easedProgress = easingFn(Math.max(0, Math.min(1, progress)))\n const finalProgress = reversed ? 1 - easedProgress : easedProgress\n\n for (let i = 0; i < item.target.length; i++) {\n const target = item.target[i]\n const targetInitialValues = item.initialValues[i]\n\n if (!targetInitialValues) continue\n\n for (const [key, endValue] of Object.entries(item.properties)) {\n const startValue = targetInitialValues[key]\n const newValue = startValue + (endValue - startValue) * finalProgress\n target[key] = newValue\n }\n }\n\n if (item.onUpdate) {\n const animation: JSAnimation = {\n targets: item.target,\n progress: easedProgress,\n currentTime: timelineTime,\n deltaTime: deltaTime,\n }\n item.onUpdate(animation)\n }\n}\n\nfunction evaluateAnimation(item: TimelineAnimationItem, timelineTime: number, deltaTime: number = 0): void {\n if (timelineTime < item.startTime) {\n return\n }\n\n const animationTime = timelineTime - item.startTime\n const duration = item.duration || 0\n\n if (timelineTime >= item.startTime && !item.started) {\n captureInitialValues(item)\n if (item.onStart) {\n item.onStart()\n }\n item.started = true\n }\n\n if (duration === 0) {\n if (!item.completed) {\n applyAnimationAtProgress(item, 1, false, timelineTime, deltaTime)\n if (item.onComplete) {\n item.onComplete()\n }\n item.completed = true\n }\n return\n }\n\n // Unified looping logic - single execution is just maxLoops = 1\n const maxLoops = !item.loop || item.loop === 1 ? 1 : typeof item.loop === \"number\" ? item.loop : Infinity\n const loopDelay = item.loopDelay || 0\n const cycleTime = duration + loopDelay\n let currentCycle = Math.floor(animationTime / cycleTime)\n let timeInCycle = animationTime % cycleTime\n\n // Trigger onLoop if a loop cycle (not the final one) completes\n if (item.onLoop && item.currentLoop !== undefined && currentCycle > item.currentLoop && currentCycle < maxLoops) {\n item.onLoop()\n }\n item.currentLoop = currentCycle\n\n // Check if the animation part of the *final loop* has just completed\n if (item.onComplete && !item.completed && currentCycle === maxLoops - 1 && timeInCycle >= duration) {\n const finalLoopReversed = (item.alternate || false) && currentCycle % 2 === 1\n applyAnimationAtProgress(item, 1, finalLoopReversed, timelineTime, deltaTime)\n\n item.onComplete()\n item.completed = true\n return\n }\n\n if (currentCycle >= maxLoops) {\n if (!item.completed) {\n const finalReversed = (item.alternate || false) && (maxLoops - 1) % 2 === 1\n applyAnimationAtProgress(item, 1, finalReversed, timelineTime, deltaTime)\n\n if (item.onComplete) {\n item.onComplete()\n }\n item.completed = true\n }\n return\n }\n\n if (timeInCycle === 0 && animationTime > 0 && currentCycle < maxLoops) {\n currentCycle = currentCycle - 1\n timeInCycle = cycleTime\n }\n\n if (timeInCycle >= duration) {\n const isReversed = (item.alternate || false) && currentCycle % 2 === 1\n applyAnimationAtProgress(item, 1, isReversed, timelineTime, deltaTime)\n return\n }\n\n const progress = timeInCycle / duration\n const isReversed = (item.alternate || false) && currentCycle % 2 === 1\n applyAnimationAtProgress(item, progress, isReversed, timelineTime, deltaTime)\n}\n\nfunction evaluateCallback(item: TimelineCallbackItem, timelineTime: number): void {\n if (!item.executed && timelineTime >= item.startTime && item.callback) {\n item.callback()\n item.executed = true\n }\n}\n\nfunction evaluateTimelineSync(item: TimelineTimelineItem, timelineTime: number, deltaTime: number = 0): void {\n if (!item.timeline) return\n if (timelineTime < item.startTime) {\n return\n }\n\n if (!item.timelineStarted) {\n item.timelineStarted = true\n item.timeline.play()\n\n const overshoot = timelineTime - item.startTime\n item.timeline.update(overshoot)\n return\n }\n\n item.timeline.update(deltaTime)\n}\n\nfunction evaluateItem(item: TimelineItem, timelineTime: number, deltaTime: number = 0): void {\n if (item.type === \"animation\") {\n evaluateAnimation(item as TimelineAnimationItem, timelineTime, deltaTime)\n } else if (item.type === \"callback\") {\n evaluateCallback(item as TimelineCallbackItem, timelineTime)\n }\n}\n\nexport class Timeline {\n public items: (TimelineAnimationItem | TimelineCallbackItem)[] = []\n public subTimelines: TimelineTimelineItem[] = []\n public currentTime: number = 0\n public isPlaying: boolean = false\n public isComplete: boolean = false\n public duration: number\n public loop: boolean\n public synced: boolean = false\n private autoplay: boolean\n private onComplete?: () => void\n private onPause?: () => void\n private stateChangeListeners: ((timeline: Timeline) => void)[] = []\n\n constructor(options: TimelineOptions = {}) {\n this.duration = options.duration || 1000\n this.loop = options.loop === true\n this.autoplay = options.autoplay !== false\n this.onComplete = options.onComplete\n this.onPause = options.onPause\n }\n\n public addStateChangeListener(listener: (timeline: Timeline) => void): void {\n this.stateChangeListeners.push(listener)\n }\n\n public removeStateChangeListener(listener: (timeline: Timeline) => void): void {\n this.stateChangeListeners = this.stateChangeListeners.filter((l) => l !== listener)\n }\n\n private notifyStateChange(): void {\n for (const listener of this.stateChangeListeners) {\n listener(this)\n }\n }\n\n add(target: any, properties: AnimationOptions, startTime: number | string = 0): this {\n const resolvedStartTime = typeof startTime === \"string\" ? 0 : startTime\n\n const animationProperties: Record<string, number> = {}\n\n // Extract animation properties (don't capture initial values here)\n for (const key in properties) {\n if (\n ![\"duration\", \"ease\", \"onUpdate\", \"onComplete\", \"onStart\", \"onLoop\", \"loop\", \"loopDelay\", \"alternate\"].includes(\n key,\n )\n ) {\n if (typeof properties[key] === \"number\") {\n animationProperties[key] = properties[key]\n }\n }\n }\n\n this.items.push({\n type: \"animation\",\n startTime: resolvedStartTime,\n target: Array.isArray(target) ? target : [target],\n properties: animationProperties,\n initialValues: [], // Will be captured when animation starts\n duration: properties.duration !== undefined ? properties.duration : 1000,\n ease: properties.ease || \"linear\",\n loop: properties.loop,\n loopDelay: properties.loopDelay || 0,\n alternate: properties.alternate || false,\n onUpdate: properties.onUpdate,\n onComplete: properties.onComplete,\n onStart: properties.onStart,\n onLoop: properties.onLoop,\n completed: false,\n started: false,\n currentLoop: 0,\n once: properties.once ?? false,\n })\n\n return this\n }\n\n once(target: any, properties: AnimationOptions): this {\n this.add(\n target,\n {\n ...properties,\n once: true,\n },\n this.currentTime,\n )\n\n return this\n }\n\n call(callback: () => void, startTime: number | string = 0): this {\n const resolvedStartTime = typeof startTime === \"string\" ? 0 : startTime\n\n this.items.push({\n type: \"callback\",\n startTime: resolvedStartTime,\n callback,\n executed: false,\n })\n\n return this\n }\n\n sync(timeline: Timeline, startTime: number = 0): this {\n if (timeline.synced) {\n throw new Error(\"Timeline already synced\")\n }\n this.subTimelines.push({\n type: \"timeline\",\n startTime,\n timeline,\n })\n timeline.synced = true\n\n return this\n }\n\n play(): this {\n if (this.isComplete) {\n return this.restart()\n }\n this.subTimelines.forEach((subTimeline) => {\n if (subTimeline.timelineStarted) {\n subTimeline.timeline.play()\n }\n })\n this.isPlaying = true\n this.notifyStateChange()\n return this\n }\n\n pause(): this {\n this.subTimelines.forEach((subTimeline) => {\n subTimeline.timeline.pause()\n })\n this.isPlaying = false\n if (this.onPause) {\n this.onPause()\n }\n this.notifyStateChange()\n return this\n }\n\n resetItems() {\n this.items.forEach((item) => {\n if (item.type === \"callback\") {\n item.executed = false\n } else if (item.type === \"animation\") {\n item.completed = false\n item.started = false\n item.currentLoop = 0\n }\n })\n this.subTimelines.forEach((subTimeline) => {\n subTimeline.timelineStarted = false\n if (subTimeline.timeline) {\n subTimeline.timeline.restart()\n subTimeline.timeline.pause()\n }\n })\n }\n\n restart(): this {\n this.isComplete = false\n this.currentTime = 0\n this.isPlaying = true\n this.resetItems()\n this.notifyStateChange()\n\n return this\n }\n\n update(deltaTime: number): void {\n for (const subTimeline of this.subTimelines) {\n evaluateTimelineSync(subTimeline, this.currentTime + deltaTime, deltaTime)\n }\n\n if (!this.isPlaying) return\n\n this.currentTime += deltaTime\n\n for (const item of this.items) {\n evaluateItem(item, this.currentTime, deltaTime)\n }\n\n // Remove completed \"once\" items (iterate backwards to avoid index shifting)\n for (let i = this.items.length - 1; i >= 0; i--) {\n const item = this.items[i]\n if (item.type === \"animation\" && item.once && item.completed) {\n this.items.splice(i, 1)\n }\n }\n\n if (this.loop && this.currentTime >= this.duration) {\n const overshoot = this.currentTime % this.duration\n\n this.resetItems()\n this.currentTime = 0\n\n if (overshoot > 0) {\n this.update(overshoot)\n }\n } else if (!this.loop && this.currentTime >= this.duration) {\n this.currentTime = this.duration\n this.isPlaying = false\n this.isComplete = true\n\n if (this.onComplete) {\n this.onComplete()\n }\n this.notifyStateChange()\n }\n }\n}\n\nclass TimelineEngine {\n private timelines: Set<Timeline> = new Set()\n private renderer: CliRenderer | null = null\n private frameCallback: ((deltaTime: number) => Promise<void>) | null = null\n private isLive: boolean = false\n public defaults = {\n frameRate: 60,\n }\n\n attach(renderer: CliRenderer): void {\n if (this.renderer) {\n this.detach()\n }\n\n this.renderer = renderer\n this.frameCallback = async (deltaTime: number) => {\n this.update(deltaTime)\n }\n\n renderer.setFrameCallback(this.frameCallback)\n }\n\n detach(): void {\n if (this.renderer && this.frameCallback) {\n this.renderer.removeFrameCallback(this.frameCallback)\n if (this.isLive) {\n this.renderer.dropLive()\n this.isLive = false\n }\n }\n this.renderer = null\n this.frameCallback = null\n }\n\n private updateLiveState(): void {\n if (!this.renderer) return\n\n const hasRunningTimelines = Array.from(this.timelines).some(\n (timeline) => !timeline.synced && timeline.isPlaying && !timeline.isComplete,\n )\n\n if (hasRunningTimelines && !this.isLive) {\n this.renderer.requestLive()\n this.isLive = true\n } else if (!hasRunningTimelines && this.isLive) {\n this.renderer.dropLive()\n this.isLive = false\n }\n }\n\n private onTimelineStateChange = (timeline: Timeline): void => {\n this.updateLiveState()\n }\n\n register(timeline: Timeline): void {\n if (!this.timelines.has(timeline)) {\n this.timelines.add(timeline)\n timeline.addStateChangeListener(this.onTimelineStateChange)\n this.updateLiveState()\n }\n }\n\n unregister(timeline: Timeline): void {\n if (this.timelines.has(timeline)) {\n this.timelines.delete(timeline)\n timeline.removeStateChangeListener(this.onTimelineStateChange)\n this.updateLiveState()\n }\n }\n\n clear(): void {\n for (const timeline of this.timelines) {\n timeline.removeStateChangeListener(this.onTimelineStateChange)\n }\n this.timelines.clear()\n this.updateLiveState()\n }\n\n update(deltaTime: number): void {\n for (const timeline of this.timelines) {\n if (!timeline.synced) {\n timeline.update(deltaTime)\n }\n }\n }\n}\n\nexport const engine = new TimelineEngine()\n\nexport function createTimeline(options: TimelineOptions = {}): Timeline {\n const timeline = new Timeline(options)\n if (options.autoplay !== false) {\n timeline.play()\n }\n\n engine.register(timeline)\n\n return timeline\n}\n",
11
+ "import { type RenderableOptions, Renderable } from \"../Renderable\"\nimport { OptimizedBuffer } from \"../buffer\"\nimport type { RenderContext } from \"../types\"\n\nexport interface FrameBufferOptions extends RenderableOptions<FrameBufferRenderable> {\n width: number\n height: number\n respectAlpha?: boolean\n}\n\nexport class FrameBufferRenderable extends Renderable {\n public frameBuffer: OptimizedBuffer\n protected respectAlpha: boolean\n\n constructor(ctx: RenderContext, options: FrameBufferOptions) {\n super(ctx, options)\n this.respectAlpha = options.respectAlpha || false\n this.frameBuffer = OptimizedBuffer.create(options.width, options.height, this._ctx.widthMethod, {\n respectAlpha: this.respectAlpha,\n id: options.id || `framebufferrenderable-${this.id}`,\n })\n }\n\n protected onResize(width: number, height: number): void {\n if (width <= 0 || height <= 0) {\n throw new Error(`Invalid resize dimensions for FrameBufferRenderable ${this.id}: ${width}x${height}`)\n }\n\n this.frameBuffer.resize(width, height)\n super.onResize(width, height)\n this.requestRender()\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n if (!this.visible || this.isDestroyed) return\n buffer.drawFrameBuffer(this.x, this.y, this.frameBuffer)\n }\n\n protected destroySelf(): void {\n // TODO: framebuffer collides with buffered Renderable, which holds a framebuffer\n // and destroys it if it exists already. Maybe instead of extending FrameBufferRenderable,\n // subclasses can use the buffered option on the base renderable instead,\n // then this would become something that takes in an external framebuffer to bring it into layout.\n this.frameBuffer?.destroy()\n super.destroySelf()\n }\n}\n",
12
+ "import {\n getCharacterPositions,\n measureText,\n renderFontToFrameBuffer,\n type ASCIIFontName,\n type fonts,\n} from \"../lib/ascii.font\"\nimport { parseColor, type ColorInput } from \"../lib/RGBA\"\nimport {\n ASCIIFontSelectionHelper,\n convertGlobalToLocalSelection,\n Selection,\n type LocalSelectionBounds,\n} from \"../lib/selection\"\nimport type { RenderableOptions } from \"../Renderable\"\nimport type { RenderContext } from \"../types\"\nimport { FrameBufferRenderable, type FrameBufferOptions } from \"./FrameBuffer\"\n\nexport interface ASCIIFontOptions extends Omit<RenderableOptions<ASCIIFontRenderable>, \"width\" | \"height\"> {\n text?: string\n font?: ASCIIFontName\n color?: ColorInput | ColorInput[]\n backgroundColor?: ColorInput\n selectionBg?: ColorInput\n selectionFg?: ColorInput\n selectable?: boolean\n}\n\nexport class ASCIIFontRenderable extends FrameBufferRenderable {\n public selectable: boolean = true\n\n protected static readonly _defaultOptions = {\n text: \"\",\n font: \"tiny\",\n color: \"#FFFFFF\",\n backgroundColor: \"transparent\",\n selectionBg: undefined,\n selectionFg: undefined,\n selectable: true,\n } satisfies Partial<ASCIIFontOptions>\n\n protected _text: string\n protected _font: keyof typeof fonts\n protected _color: ColorInput | ColorInput[]\n protected _backgroundColor: ColorInput\n protected _selectionBg: ColorInput | undefined\n protected _selectionFg: ColorInput | undefined\n protected lastLocalSelection: LocalSelectionBounds | null = null\n\n private selectionHelper: ASCIIFontSelectionHelper\n\n constructor(ctx: RenderContext, options: ASCIIFontOptions) {\n const defaultOptions = ASCIIFontRenderable._defaultOptions\n const font = options.font || defaultOptions.font\n const text = options.text || defaultOptions.text\n const measurements = measureText({ text: text, font })\n\n super(ctx, {\n flexShrink: 0,\n ...options,\n width: measurements.width || 1,\n height: measurements.height || 1,\n respectAlpha: true,\n } as FrameBufferOptions)\n\n this._text = text\n this._font = font\n this._color = options.color || defaultOptions.color\n this._backgroundColor = options.backgroundColor || defaultOptions.backgroundColor\n this._selectionBg = options.selectionBg ? parseColor(options.selectionBg) : undefined\n this._selectionFg = options.selectionFg ? parseColor(options.selectionFg) : undefined\n this.selectable = options.selectable ?? true\n\n this.selectionHelper = new ASCIIFontSelectionHelper(\n () => this._text,\n () => this._font,\n )\n\n this.renderFontToBuffer()\n }\n\n get text(): string {\n return this._text\n }\n\n set text(value: string) {\n this._text = value\n this.updateDimensions()\n\n if (this.lastLocalSelection) {\n this.selectionHelper.onLocalSelectionChanged(this.lastLocalSelection, this.width, this.height)\n }\n\n this.renderFontToBuffer()\n this.requestRender()\n }\n\n get font(): keyof typeof fonts {\n return this._font\n }\n\n set font(value: keyof typeof fonts) {\n this._font = value\n this.updateDimensions()\n\n if (this.lastLocalSelection) {\n this.selectionHelper.onLocalSelectionChanged(this.lastLocalSelection, this.width, this.height)\n }\n\n this.renderFontToBuffer()\n this.requestRender()\n }\n\n get color(): ColorInput | ColorInput[] {\n return this._color\n }\n\n set color(value: ColorInput | ColorInput[]) {\n this._color = value\n this.renderFontToBuffer()\n this.requestRender()\n }\n\n get backgroundColor(): ColorInput {\n return this._backgroundColor\n }\n\n set backgroundColor(value: ColorInput) {\n this._backgroundColor = value\n this.renderFontToBuffer()\n this.requestRender()\n }\n\n private updateDimensions(): void {\n const measurements = measureText({ text: this._text, font: this._font })\n this.width = measurements.width\n this.height = measurements.height\n }\n\n shouldStartSelection(x: number, y: number): boolean {\n const localX = x - this.x\n const localY = y - this.y\n return this.selectionHelper.shouldStartSelection(localX, localY, this.width, this.height)\n }\n\n onSelectionChanged(selection: Selection | null): boolean {\n const localSelection = convertGlobalToLocalSelection(selection, this.x, this.y)\n this.lastLocalSelection = localSelection\n const changed = this.selectionHelper.onLocalSelectionChanged(localSelection, this.width, this.height)\n if (changed) {\n this.renderFontToBuffer()\n this.requestRender()\n }\n return changed\n }\n\n getSelectedText(): string {\n const selection = this.selectionHelper.getSelection()\n if (!selection) return \"\"\n return this._text.slice(selection.start, selection.end)\n }\n\n hasSelection(): boolean {\n return this.selectionHelper.hasSelection()\n }\n\n protected onResize(width: number, height: number): void {\n super.onResize(width, height)\n this.renderFontToBuffer()\n }\n\n private renderFontToBuffer(): void {\n if (this.isDestroyed) return\n this.frameBuffer.clear(parseColor(this._backgroundColor))\n\n renderFontToFrameBuffer(this.frameBuffer, {\n text: this._text,\n x: 0,\n y: 0,\n color: this.color,\n backgroundColor: this._backgroundColor,\n font: this._font,\n })\n\n const selection = this.selectionHelper.getSelection()\n if (selection && (this._selectionBg || this._selectionFg)) {\n this.renderSelectionHighlight(selection)\n }\n }\n\n private renderSelectionHighlight(selection: { start: number; end: number }): void {\n if (!this._selectionBg && !this._selectionFg) return\n\n const selectedText = this._text.slice(selection.start, selection.end)\n if (!selectedText) return\n\n const positions = getCharacterPositions(this._text, this._font)\n const startX = positions[selection.start] || 0\n const endX =\n selection.end < positions.length\n ? positions[selection.end]\n : measureText({ text: this._text, font: this._font }).width\n\n if (this._selectionBg) {\n this.frameBuffer.fillRect(startX, 0, endX - startX, this.height, parseColor(this._selectionBg))\n }\n\n if (this._selectionFg || this._selectionBg) {\n renderFontToFrameBuffer(this.frameBuffer, {\n text: selectedText,\n x: startX,\n y: 0,\n color: this._selectionFg ? this._selectionFg : this._color,\n backgroundColor: this._selectionBg ? this._selectionBg : this._backgroundColor,\n font: this._font,\n })\n }\n }\n}\n",
13
+ "import { Edge, Gutter } from \"yoga-layout\"\nimport { type RenderableOptions, Renderable } from \"../Renderable\"\nimport type { OptimizedBuffer } from \"../buffer\"\nimport {\n type BorderCharacters,\n type BorderSides,\n type BorderSidesConfig,\n type BorderStyle,\n borderCharsToArray,\n getBorderSides,\n parseBorderStyle,\n} from \"../lib\"\nimport { type ColorInput, RGBA, parseColor } from \"../lib/RGBA\"\nimport { isValidPercentage } from \"../lib/renderable.validations\"\nimport type { RenderContext } from \"../types\"\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 titleAlignment?: \"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 _titleAlignment: \"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 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._titleAlignment = options.titleAlignment || this._defaultOptions.titleAlignment\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 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 protected renderSelf(buffer: OptimizedBuffer): void {\n const currentBorderColor = this._focused ? this._focusedBorderColor : this._borderColor\n\n buffer.drawBox({\n x: this.x,\n y: this.y,\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 titleAlignment: this._titleAlignment,\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",
14
+ "import { Renderable, type RenderableOptions } from \"../Renderable\"\nimport { convertGlobalToLocalSelection, Selection, type LocalSelectionBounds } from \"../lib/selection\"\nimport { TextBuffer, type TextChunk } from \"../text-buffer\"\nimport { TextBufferView } from \"../text-buffer-view\"\nimport { RGBA, parseColor } from \"../lib/RGBA\"\nimport { type RenderContext, type LineInfoProvider } from \"../types\"\nimport type { OptimizedBuffer } from \"../buffer\"\nimport { MeasureMode } from \"yoga-layout\"\nimport type { LineInfo } from \"../zig\"\nimport { SyntaxStyle } from \"../syntax-style\"\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\n protected textBuffer: TextBuffer\n protected textBufferView: TextBufferView\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\n const style = SyntaxStyle.create()\n this.textBuffer.setSyntaxStyle(style)\n\n this.textBufferView.setWrapMode(this._wrapMode)\n this.setupMeasureFunc()\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.maxLineWidth\n }\n\n public get scrollHeight(): number {\n return this.lineInfo.lineStarts.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 // Undefined = 0,\n // Exactly = 1,\n // AtMost = 2\n private setupMeasureFunc(): void {\n const measureFunc = (\n width: number,\n widthMode: MeasureMode,\n height: number,\n heightMode: MeasureMode,\n ): { width: number; height: number } => {\n // When widthMode is Undefined, Yoga is asking for the intrinsic/natural width\n // Pass width=0 to measureForDimensions to signal we want max-content (no wrapping)\n // The Zig code treats width=0 with wrap_mode != none as null wrap_width,\n // which triggers no-wrap mode and returns iter_mod.getMaxLineWidth()\n let effectiveWidth: number\n if (widthMode === MeasureMode.Undefined || isNaN(width)) {\n effectiveWidth = 0\n } else {\n effectiveWidth = width\n }\n\n const effectiveHeight = isNaN(height) ? 1 : height\n\n const measureResult = this.textBufferView.measureForDimensions(\n Math.floor(effectiveWidth),\n Math.floor(effectiveHeight),\n )\n\n const measuredWidth = measureResult ? Math.max(1, measureResult.maxWidth) : 1\n const measuredHeight = measureResult ? Math.max(1, measureResult.lineCount) : 1\n\n if (widthMode === MeasureMode.AtMost && this._positionType !== \"absolute\") {\n return {\n width: Math.min(effectiveWidth, measuredWidth),\n height: Math.min(effectiveHeight, measuredHeight),\n }\n }\n\n // NOTE: Yoga may use these measurements or not.\n // If the yoga node settings and the parent allow this node to grow, it will.\n return {\n width: measuredWidth,\n height: measuredHeight,\n }\n }\n\n this.yogaNode.setMeasureFunc(measureFunc)\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\n this.markClean()\n this._ctx.addToHitGrid(this.x, this.y, this.width, this.height, this.num)\n\n this.renderSelf(buffer)\n\n if (this.buffered && this.frameBuffer) {\n buffer.drawFrameBuffer(this.x, this.y, this.frameBuffer)\n }\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n if (this.textBuffer.ptr) {\n buffer.drawTextBuffer(this.textBufferView, this.x, this.y)\n }\n }\n\n destroy(): void {\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",
15
+ "import { type RenderContext } from \"../types\"\nimport { StyledText } from \"../lib/styled-text\"\nimport { SyntaxStyle } from \"../syntax-style\"\nimport { getTreeSitterClient, treeSitterToStyledText, TreeSitterClient } from \"../lib/tree-sitter\"\nimport { TextBufferRenderable, type TextBufferOptions } from \"./TextBufferRenderable\"\nimport type { OptimizedBuffer } from \"../buffer\"\nimport type { SimpleHighlight } from \"../lib/tree-sitter/types\"\nimport { treeSitterToTextChunks } from \"../lib/tree-sitter-styled-text\"\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 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 onHighlight?: OnHighlightCallback\n}\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 _hadInitialContent: boolean = false\n private _lastHighlights: SimpleHighlight[] = []\n private _onHighlight?: OnHighlightCallback\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._onHighlight = options.onHighlight\n\n if (this._content.length > 0) {\n this.textBuffer.setText(this._content)\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._drawUnstyledText && this._filetype) {\n return\n }\n\n this.textBuffer.setText(value)\n this.updateTextInfo()\n }\n }\n\n get filetype(): string | undefined {\n return this._filetype\n }\n\n set filetype(value: string) {\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 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 set onHighlight(value: OnHighlightCallback | undefined) {\n if (this._onHighlight !== value) {\n this._onHighlight = value\n this._highlightsDirty = true\n }\n }\n\n get isHighlighting(): boolean {\n return this._isHighlighting\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 this.textBuffer.setText(content)\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 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 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 const chunks = treeSitterToTextChunks(content, highlights, this._syntaxStyle, {\n enabled: this._conceal,\n })\n const styledText = new StyledText(chunks)\n this.textBuffer.setStyledText(styledText)\n } else {\n this.textBuffer.setText(content)\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 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._shouldRenderTextBuffer = true\n this._isHighlighting = false\n this._highlightsDirty = false\n this.updateTextInfo()\n this.requestRender()\n }\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.startHighlight()\n }\n }\n\n if (!this._shouldRenderTextBuffer) return\n super.renderSelf(buffer)\n }\n}\n",
16
+ "import type { TextRenderable } from \".\"\nimport { BaseRenderable, type BaseRenderableOptions } from \"../Renderable\"\nimport { RGBA, parseColor } from \"../lib/RGBA\"\nimport { isStyledText, StyledText } from \"../lib/styled-text\"\nimport { type TextChunk } from \"../text-buffer\"\nimport type { RenderContext } from \"../types\"\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 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 if (index !== undefined) {\n this._children.splice(index, 0, obj)\n obj.parent = this\n this.requestRender()\n return index\n }\n\n const insertIndex = this._children.length\n this._children.push(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 public replace(obj: TextNodeRenderable | string, index: number) {\n this._children[index] = obj\n if (typeof obj !== \"string\") {\n obj.parent = this\n }\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 (typeof child === \"string\") {\n this._children.splice(anchorIndex, 0, child)\n } else if (isTextNodeRenderable(child)) {\n this._children.splice(anchorIndex, 0, child)\n child.parent = this\n } else if (child instanceof StyledText) {\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(id: string): this {\n const childIndex = this.getRenderableIndex(id)\n if (childIndex === -1) {\n throw new Error(\"Child not found in children\")\n }\n\n const child = this._children[childIndex] as TextNodeRenderable\n\n this._children.splice(childIndex, 1)\n child.parent = null\n this.requestRender()\n return this\n }\n\n public clear(): void {\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",
17
+ "import {\n ASCIIFontRenderable,\n BoxRenderable,\n CodeRenderable,\n InputRenderable,\n ScrollBoxRenderable,\n SelectRenderable,\n TabSelectRenderable,\n TextRenderable,\n VRenderable,\n FrameBufferRenderable,\n type ASCIIFontOptions,\n type BoxOptions,\n type CodeOptions,\n type TextOptions,\n type VRenderableOptions,\n type InputRenderableOptions,\n type ScrollBoxOptions,\n type SelectRenderableOptions,\n type TabSelectRenderableOptions,\n type FrameBufferOptions,\n} from \"../\"\nimport { TextNodeRenderable, type TextNodeOptions } from \"../TextNode\"\nimport { h, type VChild } from \"./vnode\"\nimport { TextAttributes } from \"../../types\"\nimport type { RGBA } from \"../../lib/RGBA\"\n\nexport function Generic(props?: VRenderableOptions, ...children: VChild[]) {\n return h(VRenderable, props || {}, ...children)\n}\n\nexport function Box(props?: BoxOptions, ...children: VChild[]) {\n return h(BoxRenderable, props || {}, ...children)\n}\n\nexport function Text(props?: TextOptions & { content?: any }, ...children: VChild[] | TextNodeRenderable[]) {\n return h(TextRenderable, props || {}, ...(children as VChild[]))\n}\n\nexport function ASCIIFont(props?: ASCIIFontOptions, ...children: VChild[]) {\n return h(ASCIIFontRenderable, props || {}, ...children)\n}\n\nexport function Input(props?: InputRenderableOptions, ...children: VChild[]) {\n return h(InputRenderable, props || {}, ...children)\n}\n\nexport function Select(props?: SelectRenderableOptions, ...children: VChild[]) {\n return h(SelectRenderable, props || {}, ...children)\n}\n\nexport function TabSelect(props?: TabSelectRenderableOptions, ...children: VChild[]) {\n return h(TabSelectRenderable, props || {}, ...children)\n}\n\nexport function FrameBuffer(props: FrameBufferOptions, ...children: VChild[]) {\n return h(FrameBufferRenderable, props, ...children)\n}\n\nexport function Code(props: CodeOptions, ...children: VChild[]) {\n return h(CodeRenderable, props, ...children)\n}\n\nexport function ScrollBox(props?: ScrollBoxOptions, ...children: VChild[]) {\n return h(ScrollBoxRenderable, props || {}, ...children)\n}\n\ninterface StyledTextProps extends Omit<TextNodeOptions, \"attributes\"> {\n attributes?: number\n}\n\nfunction StyledText(props?: StyledTextProps, ...children: (string | TextNodeRenderable)[]): TextNodeRenderable {\n const styledProps = props as StyledTextProps\n const textNodeOptions: TextNodeOptions = {\n ...styledProps,\n attributes: styledProps?.attributes ?? 0,\n }\n\n const textNode = new TextNodeRenderable(textNodeOptions)\n\n for (const child of children) {\n textNode.add(child)\n }\n\n return textNode\n}\n\n// Text styling convenience functions - these create TextNodeRenderable instances that can be nested and stacked\nexport const vstyles = {\n // Basic text styles\n bold: (...children: (string | TextNodeRenderable)[]) => StyledText({ attributes: TextAttributes.BOLD }, ...children),\n italic: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.ITALIC }, ...children),\n underline: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.UNDERLINE }, ...children),\n dim: (...children: (string | TextNodeRenderable)[]) => StyledText({ attributes: TextAttributes.DIM }, ...children),\n blink: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.BLINK }, ...children),\n inverse: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.INVERSE }, ...children),\n hidden: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.HIDDEN }, ...children),\n strikethrough: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.STRIKETHROUGH }, ...children),\n\n // Combined styles\n boldItalic: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.BOLD | TextAttributes.ITALIC }, ...children),\n boldUnderline: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.BOLD | TextAttributes.UNDERLINE }, ...children),\n italicUnderline: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.ITALIC | TextAttributes.UNDERLINE }, ...children),\n boldItalicUnderline: (...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes: TextAttributes.BOLD | TextAttributes.ITALIC | TextAttributes.UNDERLINE }, ...children),\n\n // Color helpers\n color: (color: string | RGBA, ...children: (string | TextNodeRenderable)[]) => StyledText({ fg: color }, ...children),\n bgColor: (bgColor: string | RGBA, ...children: (string | TextNodeRenderable)[]) =>\n StyledText({ bg: bgColor }, ...children),\n fg: (color: string | RGBA, ...children: (string | TextNodeRenderable)[]) => StyledText({ fg: color }, ...children),\n bg: (bgColor: string | RGBA, ...children: (string | TextNodeRenderable)[]) =>\n StyledText({ bg: bgColor }, ...children),\n\n // Custom styling function\n styled: (attributes: number = 0, ...children: (string | TextNodeRenderable)[]) =>\n StyledText({ attributes }, ...children),\n}\n",
18
+ "import { Renderable, type RenderableOptions } from \"../../Renderable\"\nimport type { OptimizedBuffer } from \"../../buffer\"\nimport type { RenderContext } from \"../../types\"\n\nexport interface VRenderableOptions extends RenderableOptions<VRenderable> {\n render?: (\n this: VRenderable | VRenderableOptions,\n buffer: OptimizedBuffer,\n deltaTime: number,\n renderable: VRenderable,\n ) => void\n}\n\n/**\n * A generic renderable that accepts a custom render function as a prop.\n * This allows functional constructs to specify custom rendering behavior\n * without needing to subclass Renderable.\n */\nexport class VRenderable extends Renderable {\n private options: VRenderableOptions\n\n constructor(ctx: RenderContext, options: VRenderableOptions) {\n super(ctx, options)\n this.options = options\n }\n\n protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {\n if (this.options.render) {\n this.options.render.call(this.options, buffer, deltaTime, this)\n }\n }\n}\n",
19
+ "import { Renderable, type RenderableOptions } from \"../Renderable\"\nimport { OptimizedBuffer } from \"../buffer\"\nimport type { RenderContext, LineInfoProvider } from \"../types\"\nimport { RGBA, parseColor } from \"../lib/RGBA\"\nimport { MeasureMode } from \"yoga-layout\"\n\nexport interface LineSign {\n before?: string\n beforeColor?: string | RGBA\n after?: string\n afterColor?: string | RGBA\n}\n\nexport interface LineColorConfig {\n gutter?: string | RGBA\n content?: string | RGBA\n}\n\n/**\n * Represents a highlighted span within a line for word-level diff highlighting.\n */\nexport interface LineInlineHighlight {\n /** Starting column (0-based, in display characters) */\n startCol: number\n /** Ending column (exclusive, in display characters) */\n endCol: number\n /** Background color for this highlight */\n bg: RGBA\n}\n\nexport interface LineNumberOptions extends RenderableOptions<LineNumberRenderable> {\n target?: Renderable & LineInfoProvider\n fg?: string | RGBA\n bg?: string | RGBA\n minWidth?: number\n paddingRight?: number\n lineColors?: Map<number, string | RGBA | LineColorConfig>\n lineSigns?: Map<number, LineSign>\n lineNumberOffset?: number\n hideLineNumbers?: Set<number>\n lineNumbers?: Map<number, number>\n showLineNumbers?: boolean\n /** Inline highlights for word-level diff highlighting (per logical line) */\n inlineHighlights?: Map<number, LineInlineHighlight[]>\n}\n\nclass GutterRenderable extends Renderable {\n private target: Renderable & LineInfoProvider\n private _fg: RGBA\n private _bg: RGBA\n private _minWidth: number\n private _paddingRight: number\n private _lineColorsGutter: Map<number, RGBA>\n private _lineColorsContent: Map<number, RGBA>\n private _lineSigns: Map<number, LineSign>\n private _lineNumberOffset: number\n private _hideLineNumbers: Set<number>\n private _lineNumbers: Map<number, number>\n private _maxBeforeWidth: number = 0\n private _maxAfterWidth: number = 0\n private _lastKnownLineCount: number = 0\n private _lastKnownScrollY: number = 0\n\n constructor(\n ctx: RenderContext,\n target: Renderable & LineInfoProvider,\n options: {\n fg: RGBA\n bg: RGBA\n minWidth: number\n paddingRight: number\n lineColorsGutter: Map<number, RGBA>\n lineColorsContent: Map<number, RGBA>\n lineSigns: Map<number, LineSign>\n lineNumberOffset: number\n hideLineNumbers: Set<number>\n lineNumbers?: Map<number, number>\n id?: string\n buffered?: boolean\n },\n ) {\n super(ctx, {\n id: options.id,\n width: \"auto\",\n height: \"auto\",\n flexGrow: 0,\n flexShrink: 0,\n buffered: options.buffered,\n })\n this.target = target\n this._fg = options.fg\n this._bg = options.bg\n this._minWidth = options.minWidth\n this._paddingRight = options.paddingRight\n this._lineColorsGutter = options.lineColorsGutter\n this._lineColorsContent = options.lineColorsContent\n this._lineSigns = options.lineSigns\n this._lineNumberOffset = options.lineNumberOffset\n this._hideLineNumbers = options.hideLineNumbers\n this._lineNumbers = options.lineNumbers ?? new Map()\n this._lastKnownLineCount = this.target.virtualLineCount\n this._lastKnownScrollY = this.target.scrollY\n this.calculateSignWidths()\n this.setupMeasureFunc()\n\n // Use lifecycle pass to detect line count changes BEFORE layout\n this.onLifecyclePass = () => {\n const currentLineCount = this.target.virtualLineCount\n if (currentLineCount !== this._lastKnownLineCount) {\n this._lastKnownLineCount = currentLineCount\n this.yogaNode.markDirty()\n this.requestRender()\n }\n }\n }\n\n private setupMeasureFunc(): void {\n const measureFunc = (\n width: number,\n widthMode: MeasureMode,\n height: number,\n heightMode: MeasureMode,\n ): { width: number; height: number } => {\n // Calculate the gutter width based on the target's line count\n const gutterWidth = this.calculateWidth()\n\n // Calculate gutter height based on target's actual virtual line count\n // The gutter should match the height of the content it's numbering\n const gutterHeight = this.target.virtualLineCount\n\n // Return calculated dimensions based on content, not parent constraints\n return {\n width: gutterWidth,\n height: gutterHeight,\n }\n }\n\n this.yogaNode.setMeasureFunc(measureFunc)\n }\n\n public remeasure(): void {\n // Mark the yoga node as dirty to trigger re-measurement\n this.yogaNode.markDirty()\n }\n\n public setLineNumberOffset(offset: number): void {\n if (this._lineNumberOffset !== offset) {\n this._lineNumberOffset = offset\n this.yogaNode.markDirty()\n this.requestRender()\n }\n }\n\n public setHideLineNumbers(hideLineNumbers: Set<number>): void {\n this._hideLineNumbers = hideLineNumbers\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n public setLineNumbers(lineNumbers: Map<number, number>): void {\n this._lineNumbers = lineNumbers\n this.yogaNode.markDirty()\n this.requestRender()\n }\n\n private calculateSignWidths(): void {\n this._maxBeforeWidth = 0\n this._maxAfterWidth = 0\n\n for (const sign of this._lineSigns.values()) {\n if (sign.before) {\n const width = Bun.stringWidth(sign.before)\n this._maxBeforeWidth = Math.max(this._maxBeforeWidth, width)\n }\n if (sign.after) {\n const width = Bun.stringWidth(sign.after)\n this._maxAfterWidth = Math.max(this._maxAfterWidth, width)\n }\n }\n }\n\n private calculateWidth(): number {\n const totalLines = this.target.virtualLineCount\n\n // Find max line number, considering both calculated and custom line numbers\n let maxLineNumber = totalLines + this._lineNumberOffset\n if (this._lineNumbers.size > 0) {\n for (const customLineNum of this._lineNumbers.values()) {\n maxLineNumber = Math.max(maxLineNumber, customLineNum)\n }\n }\n\n const digits = maxLineNumber > 0 ? Math.floor(Math.log10(maxLineNumber)) + 1 : 1\n const baseWidth = Math.max(this._minWidth, digits + this._paddingRight + 1) // +1 for left padding\n return baseWidth + this._maxBeforeWidth + this._maxAfterWidth\n }\n\n public setLineColors(lineColorsGutter: Map<number, RGBA>, lineColorsContent: Map<number, RGBA>): void {\n this._lineColorsGutter = lineColorsGutter\n this._lineColorsContent = lineColorsContent\n this.requestRender()\n }\n\n public getLineColors(): { gutter: Map<number, RGBA>; content: Map<number, RGBA> } {\n return {\n gutter: this._lineColorsGutter,\n content: this._lineColorsContent,\n }\n }\n\n public setLineSigns(lineSigns: Map<number, LineSign>): void {\n const oldMaxBefore = this._maxBeforeWidth\n const oldMaxAfter = this._maxAfterWidth\n\n this._lineSigns = lineSigns\n this.calculateSignWidths()\n\n // Mark dirty if sign widths changed - this will trigger remeasure\n if (this._maxBeforeWidth !== oldMaxBefore || this._maxAfterWidth !== oldMaxAfter) {\n this.yogaNode.markDirty()\n }\n\n // Always request render since signs themselves may have changed\n this.requestRender()\n }\n\n public getLineSigns(): Map<number, LineSign> {\n return this._lineSigns\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n // For buffered rendering, only re-render when dirty OR when scroll position changed\n const currentScrollY = this.target.scrollY\n const scrollChanged = currentScrollY !== this._lastKnownScrollY\n\n if (this.buffered && !this.isDirty && !scrollChanged) {\n return\n }\n\n this._lastKnownScrollY = currentScrollY\n this.refreshFrameBuffer(buffer)\n }\n\n private refreshFrameBuffer(buffer: OptimizedBuffer): void {\n const startX = this.buffered ? 0 : this.x\n const startY = this.buffered ? 0 : this.y\n\n if (this.buffered) {\n buffer.clear(this._bg)\n } else if (this._bg.a > 0) {\n // Fill background if not buffered and opaque (if buffered, clear handles it)\n // Note: this.height might be determined by parent (flex stretch)\n buffer.fillRect(startX, startY, this.width, this.height, this._bg)\n }\n\n const lineInfo = this.target.lineInfo\n if (!lineInfo || !lineInfo.lineSources) return\n\n const sources = lineInfo.lineSources\n let lastSource = -1\n\n // lineSources contains the logical line index for each visual line\n // We start iterating from the scroll offset (first visible line)\n const startLine = this.target.scrollY\n\n // If scrolled past content (shouldn't happen normally but good to be safe)\n if (startLine >= sources.length) return\n\n // Get the logical line index of the line *before* the first visible line\n // This helps determine if the first visible line is a wrapped continuation\n lastSource = startLine > 0 ? sources[startLine - 1] : -1\n\n for (let i = 0; i < this.height; i++) {\n const visualLineIndex = startLine + i\n if (visualLineIndex >= sources.length) break\n\n const logicalLine = sources[visualLineIndex]\n const lineBg = this._lineColorsGutter.get(logicalLine) ?? this._bg\n\n // Fill background for this line if it has a custom color\n if (lineBg !== this._bg) {\n buffer.fillRect(startX, startY + i, this.width, 1, lineBg)\n }\n\n // Draw line number only for the first visual line of a logical line (wrapping)\n if (logicalLine === lastSource) {\n // Continuation line, maybe draw a dot or nothing\n } else {\n let currentX = startX\n\n // Draw 'before' sign if present\n const sign = this._lineSigns.get(logicalLine)\n if (sign?.before) {\n const beforeWidth = Bun.stringWidth(sign.before)\n // Pad to max before width for alignment\n const padding = this._maxBeforeWidth - beforeWidth\n currentX += padding\n const beforeColor = sign.beforeColor ? parseColor(sign.beforeColor) : this._fg\n buffer.drawText(sign.before, currentX, startY + i, beforeColor, lineBg)\n currentX += beforeWidth\n } else if (this._maxBeforeWidth > 0) {\n currentX += this._maxBeforeWidth\n }\n\n // Draw line number (right-aligned in its space with left padding of 1)\n if (!this._hideLineNumbers.has(logicalLine)) {\n // Use custom line number if provided, otherwise use calculated line number\n const customLineNum = this._lineNumbers.get(logicalLine)\n const lineNum = customLineNum !== undefined ? customLineNum : logicalLine + 1 + this._lineNumberOffset\n const lineNumStr = lineNum.toString()\n const lineNumWidth = lineNumStr.length\n const availableSpace = this.width - this._maxBeforeWidth - this._maxAfterWidth - this._paddingRight\n const lineNumX = startX + this._maxBeforeWidth + 1 + availableSpace - lineNumWidth - 1\n\n if (lineNumX >= startX + this._maxBeforeWidth + 1) {\n buffer.drawText(lineNumStr, lineNumX, startY + i, this._fg, lineBg)\n }\n }\n\n // Draw 'after' sign if present\n if (sign?.after) {\n const afterX = startX + this.width - this._paddingRight - this._maxAfterWidth\n const afterColor = sign.afterColor ? parseColor(sign.afterColor) : this._fg\n buffer.drawText(sign.after, afterX, startY + i, afterColor, lineBg)\n }\n }\n\n lastSource = logicalLine\n }\n }\n}\n\n// Helper function to darken an RGBA color by 20%\nfunction darkenColor(color: RGBA): RGBA {\n return RGBA.fromValues(color.r * 0.8, color.g * 0.8, color.b * 0.8, color.a)\n}\n\nexport class LineNumberRenderable extends Renderable {\n private gutter: GutterRenderable | null = null\n private target: (Renderable & LineInfoProvider) | null = null\n private _lineColorsGutter: Map<number, RGBA>\n private _lineColorsContent: Map<number, RGBA>\n private _lineSigns: Map<number, LineSign>\n private _inlineHighlights: Map<number, LineInlineHighlight[]>\n private _fg: RGBA\n private _bg: RGBA\n private _minWidth: number\n private _paddingRight: number\n private _lineNumberOffset: number\n private _hideLineNumbers: Set<number>\n private _lineNumbers: Map<number, number>\n private _isDestroying: boolean = false\n private handleLineInfoChange = (): void => {\n // When line info changes in the target, remeasure the gutter\n this.gutter?.remeasure()\n this.requestRender()\n }\n\n private parseLineColor(line: number, color: string | RGBA | LineColorConfig): void {\n if (typeof color === \"object\" && \"gutter\" in color) {\n // LineColorConfig format\n const config = color as LineColorConfig\n if (config.gutter) {\n this._lineColorsGutter.set(line, parseColor(config.gutter))\n }\n if (config.content) {\n this._lineColorsContent.set(line, parseColor(config.content))\n } else if (config.gutter) {\n // If only gutter is specified, use a darker version for content\n this._lineColorsContent.set(line, darkenColor(parseColor(config.gutter)))\n }\n } else {\n // Simple format - same color for both, but content is darker\n const parsedColor = parseColor(color as string | RGBA)\n this._lineColorsGutter.set(line, parsedColor)\n this._lineColorsContent.set(line, darkenColor(parsedColor))\n }\n }\n\n constructor(ctx: RenderContext, options: LineNumberOptions) {\n super(ctx, {\n ...options,\n flexDirection: \"row\",\n // CRITICAL:\n // By forcing height=auto, we ensure the parent box properly accounts for our full height.\n height: \"auto\",\n })\n\n this._fg = parseColor(options.fg ?? \"#888888\")\n this._bg = parseColor(options.bg ?? \"transparent\")\n this._minWidth = options.minWidth ?? 3\n this._paddingRight = options.paddingRight ?? 1\n this._lineNumberOffset = options.lineNumberOffset ?? 0\n this._hideLineNumbers = options.hideLineNumbers ?? new Set()\n this._lineNumbers = options.lineNumbers ?? new Map()\n\n this._lineColorsGutter = new Map<number, RGBA>()\n this._lineColorsContent = new Map<number, RGBA>()\n if (options.lineColors) {\n for (const [line, color] of options.lineColors) {\n this.parseLineColor(line, color)\n }\n }\n\n this._lineSigns = new Map<number, LineSign>()\n if (options.lineSigns) {\n for (const [line, sign] of options.lineSigns) {\n this._lineSigns.set(line, sign)\n }\n }\n\n this._inlineHighlights = new Map<number, LineInlineHighlight[]>()\n if (options.inlineHighlights) {\n for (const [line, highlights] of options.inlineHighlights) {\n this._inlineHighlights.set(line, highlights)\n }\n }\n\n // If target is provided in constructor, set it up immediately\n if (options.target) {\n this.setTarget(options.target)\n }\n }\n\n private setTarget(target: Renderable & LineInfoProvider): void {\n if (this.target === target) return\n\n if (this.target) {\n // Remove event listener from old target\n this.target.off(\"line-info-change\", this.handleLineInfoChange)\n super.remove(this.target.id)\n }\n\n if (this.gutter) {\n super.remove(this.gutter.id)\n this.gutter = null\n }\n\n this.target = target\n\n // Listen for line info changes from target\n this.target.on(\"line-info-change\", this.handleLineInfoChange)\n\n this.gutter = new GutterRenderable(this.ctx, this.target, {\n fg: this._fg,\n bg: this._bg,\n minWidth: this._minWidth,\n paddingRight: this._paddingRight,\n lineColorsGutter: this._lineColorsGutter,\n lineColorsContent: this._lineColorsContent,\n lineSigns: this._lineSigns,\n lineNumberOffset: this._lineNumberOffset,\n hideLineNumbers: this._hideLineNumbers,\n lineNumbers: this._lineNumbers,\n id: this.id ? `${this.id}-gutter` : undefined,\n buffered: true,\n })\n\n super.add(this.gutter)\n super.add(this.target)\n }\n\n // Override add to intercept and set as target if it's a LineInfoProvider\n public override add(child: Renderable): number {\n // If this is a LineInfoProvider and we don't have a target yet, set it\n if (\n !this.target &&\n \"lineInfo\" in child &&\n \"lineCount\" in child &&\n \"virtualLineCount\" in child &&\n \"scrollY\" in child\n ) {\n this.setTarget(child as Renderable & LineInfoProvider)\n return this.getChildrenCount() - 1\n }\n // Otherwise ignore - SolidJS may try to add layout slots or other helpers\n return -1\n }\n\n // Override remove to prevent removing gutter/target directly\n public override remove(id: string): void {\n if (this._isDestroying) {\n super.remove(id)\n return\n }\n\n if (this.gutter && id === this.gutter.id) {\n throw new Error(\"LineNumberRenderable: Cannot remove gutter directly.\")\n }\n if (this.target && id === this.target.id) {\n throw new Error(\"LineNumberRenderable: Cannot remove target directly. Use clearTarget() instead.\")\n }\n super.remove(id)\n }\n\n // Override destroyRecursively to properly clean up internal components\n public override destroyRecursively(): void {\n this._isDestroying = true\n\n if (this.target) {\n this.target.off(\"line-info-change\", this.handleLineInfoChange)\n }\n\n super.destroyRecursively()\n\n this.gutter = null\n this.target = null\n }\n\n public clearTarget(): void {\n if (this.target) {\n this.target.off(\"line-info-change\", this.handleLineInfoChange)\n super.remove(this.target.id)\n this.target = null\n }\n if (this.gutter) {\n super.remove(this.gutter.id)\n this.gutter = null\n }\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n // Draw full-width line backgrounds before children render\n if (!this.target || !this.gutter) return\n\n const lineInfo = this.target.lineInfo\n if (!lineInfo || !lineInfo.lineSources) return\n\n const sources = lineInfo.lineSources\n const startLine = this.target.scrollY\n\n if (startLine >= sources.length) return\n\n // Calculate the area to fill: from after the gutter (if visible) to the end of our width\n const gutterWidth = this.gutter.visible ? this.gutter.width : 0\n const contentWidth = this.width - gutterWidth\n const contentStartX = this.x + gutterWidth\n\n // Draw full-width background colors for lines with custom colors\n for (let i = 0; i < this.height; i++) {\n const visualLineIndex = startLine + i\n if (visualLineIndex >= sources.length) break\n\n const logicalLine = sources[visualLineIndex]\n const lineBg = this._lineColorsContent.get(logicalLine)\n\n if (lineBg) {\n // Fill from after gutter to the end of the LineNumberRenderable\n buffer.fillRect(contentStartX, this.y + i, contentWidth, 1, lineBg)\n }\n\n const inlineHighlights = this._inlineHighlights.get(logicalLine)\n if (inlineHighlights && inlineHighlights.length > 0) {\n const scrollX = (this.target as any).scrollX ?? 0\n const wrapIndex = lineInfo.lineWraps?.[visualLineIndex] ?? 0\n\n // Sum widths of previous wrapped segments to get column offset\n let columnOffset = 0\n if (wrapIndex > 0 && lineInfo.lineWidths) {\n for (let j = visualLineIndex - 1; j >= 0 && sources[j] === logicalLine; j--) {\n columnOffset += lineInfo.lineWidths[j] ?? 0\n }\n }\n\n const thisLineWidth = lineInfo.lineWidths?.[visualLineIndex] ?? contentWidth\n\n for (const highlight of inlineHighlights) {\n if (highlight.endCol <= columnOffset || highlight.startCol >= columnOffset + thisLineWidth) {\n continue\n }\n\n const visibleStartCol = Math.max(highlight.startCol, columnOffset) - columnOffset\n const visibleEndCol = Math.min(highlight.endCol, columnOffset + thisLineWidth) - columnOffset\n const highlightStartX = contentStartX + visibleStartCol - scrollX\n const highlightWidth = visibleEndCol - visibleStartCol\n\n const clampedStartX = Math.max(highlightStartX, contentStartX)\n const clampedEndX = Math.min(highlightStartX + highlightWidth, contentStartX + contentWidth)\n const clampedWidth = clampedEndX - clampedStartX\n\n if (clampedWidth > 0) {\n buffer.fillRect(clampedStartX, this.y + i, clampedWidth, 1, highlight.bg)\n }\n }\n }\n }\n }\n\n public set showLineNumbers(value: boolean) {\n if (this.gutter) {\n this.gutter.visible = value\n }\n }\n\n public get showLineNumbers(): boolean {\n return this.gutter?.visible ?? false\n }\n\n public setLineColor(line: number, color: string | RGBA | LineColorConfig): void {\n this.parseLineColor(line, color)\n // Update gutter if it exists\n if (this.gutter) {\n this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)\n }\n }\n\n public clearLineColor(line: number): void {\n this._lineColorsGutter.delete(line)\n this._lineColorsContent.delete(line)\n if (this.gutter) {\n this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)\n }\n }\n\n public clearAllLineColors(): void {\n this._lineColorsGutter.clear()\n this._lineColorsContent.clear()\n if (this.gutter) {\n this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)\n }\n }\n\n public setLineColors(lineColors: Map<number, string | RGBA | LineColorConfig>): void {\n this._lineColorsGutter.clear()\n this._lineColorsContent.clear()\n for (const [line, color] of lineColors) {\n this.parseLineColor(line, color)\n }\n // Update gutter once after all colors are set\n if (this.gutter) {\n this.gutter.setLineColors(this._lineColorsGutter, this._lineColorsContent)\n }\n }\n\n public getLineColors(): { gutter: Map<number, RGBA>; content: Map<number, RGBA> } {\n return {\n gutter: this._lineColorsGutter,\n content: this._lineColorsContent,\n }\n }\n\n public setLineSign(line: number, sign: LineSign): void {\n this._lineSigns.set(line, sign)\n if (this.gutter) {\n this.gutter.setLineSigns(this._lineSigns)\n }\n }\n\n public clearLineSign(line: number): void {\n this._lineSigns.delete(line)\n if (this.gutter) {\n this.gutter.setLineSigns(this._lineSigns)\n }\n }\n\n public clearAllLineSigns(): void {\n this._lineSigns.clear()\n if (this.gutter) {\n this.gutter.setLineSigns(this._lineSigns)\n }\n }\n\n public setLineSigns(lineSigns: Map<number, LineSign>): void {\n this._lineSigns.clear()\n for (const [line, sign] of lineSigns) {\n this._lineSigns.set(line, sign)\n }\n if (this.gutter) {\n this.gutter.setLineSigns(this._lineSigns)\n }\n }\n\n public getLineSigns(): Map<number, LineSign> {\n return this._lineSigns\n }\n\n public set lineNumberOffset(value: number) {\n if (this._lineNumberOffset !== value) {\n this._lineNumberOffset = value\n if (this.gutter) {\n // Update the gutter's offset using its setter\n this.gutter.setLineNumberOffset(value)\n }\n }\n }\n\n public get lineNumberOffset(): number {\n return this._lineNumberOffset\n }\n\n public setHideLineNumbers(hideLineNumbers: Set<number>): void {\n this._hideLineNumbers = hideLineNumbers\n if (this.gutter) {\n // Update the gutter's hideLineNumbers using its setter\n this.gutter.setHideLineNumbers(hideLineNumbers)\n }\n }\n\n public getHideLineNumbers(): Set<number> {\n return this._hideLineNumbers\n }\n\n public setLineNumbers(lineNumbers: Map<number, number>): void {\n this._lineNumbers = lineNumbers\n if (this.gutter) {\n // Update the gutter's lineNumbers using its setter\n this.gutter.setLineNumbers(lineNumbers)\n }\n }\n\n public getLineNumbers(): Map<number, number> {\n return this._lineNumbers\n }\n\n /**\n * Sets inline highlights for word-level diff highlighting.\n *\n * @param inlineHighlights - Map from logical line index to array of highlights\n */\n public setInlineHighlights(inlineHighlights: Map<number, LineInlineHighlight[]>): void {\n this._inlineHighlights = inlineHighlights\n this.requestRender()\n }\n\n /**\n * Gets the current inline highlights.\n */\n public getInlineHighlights(): Map<number, LineInlineHighlight[]> {\n return this._inlineHighlights\n }\n\n /**\n * Clears all inline highlights.\n */\n public clearInlineHighlights(): void {\n this._inlineHighlights.clear()\n this.requestRender()\n }\n\n /**\n * Sets inline highlights for a specific line.\n *\n * @param line - Logical line index\n * @param highlights - Array of highlights for this line\n */\n public setLineInlineHighlights(line: number, highlights: LineInlineHighlight[]): void {\n this._inlineHighlights.set(line, highlights)\n this.requestRender()\n }\n\n /**\n * Clears inline highlights for a specific line.\n */\n public clearLineInlineHighlights(line: number): void {\n this._inlineHighlights.delete(line)\n this.requestRender()\n }\n}\n",
20
+ "import { Renderable, type RenderableOptions } from \"../Renderable\"\nimport type { RenderContext } from \"../types\"\nimport { CodeRenderable, type CodeOptions } from \"./Code\"\nimport {\n LineNumberRenderable,\n type LineSign,\n type LineColorConfig,\n type LineInlineHighlight,\n} from \"./LineNumberRenderable\"\nimport { RGBA, parseColor } from \"../lib/RGBA\"\nimport { SyntaxStyle } from \"../syntax-style\"\nimport { parsePatch, type StructuredPatch, type StructuredPatchHunk } from \"diff\"\nimport { TextRenderable } from \"./Text\"\nimport type { TreeSitterClient } from \"../lib/tree-sitter\"\n\n/** Represents a highlighted span within a line for word-level diff */\ninterface InlineHighlight {\n startCol: number\n endCol: number\n type: \"added-word\" | \"removed-word\"\n}\n\n/** Represents a range within a string */\ninterface IRange {\n location: number\n length: number\n}\n\n// Max line length for intra-line diff (matches GitHub.com)\nexport const MaxIntraLineDiffStringLength = 1024\n\n// Find changed region by removing common prefix/suffix (GitHub Desktop algorithm)\nexport function relativeChanges(stringA: string, stringB: string): { stringARange: IRange; stringBRange: IRange } {\n const lenA = stringA.length\n const lenB = stringB.length\n\n let prefixLen = 0\n const maxPrefix = Math.min(lenA, lenB)\n while (prefixLen < maxPrefix && stringA[prefixLen] === stringB[prefixLen]) {\n prefixLen++\n }\n\n let suffixLen = 0\n const maxSuffix = Math.min(lenA - prefixLen, lenB - prefixLen)\n while (suffixLen < maxSuffix && stringA[lenA - 1 - suffixLen] === stringB[lenB - 1 - suffixLen]) {\n suffixLen++\n }\n\n return {\n stringARange: { location: prefixLen, length: lenA - prefixLen - suffixLen },\n stringBRange: { location: prefixLen, length: lenB - prefixLen - suffixLen },\n }\n}\n\n// Convert char range to display columns (ASCII fast path, Unicode uses stringWidth)\nfunction toDisplayColumns(content: string, start: number, length: number): { startCol: number; endCol: number } {\n for (let i = 0; i < content.length; i++) {\n if (content.charCodeAt(i) > 127) {\n // Has Unicode - need stringWidth for correct column positions\n const prefixWidth = Bun.stringWidth(content.slice(0, start))\n const changedWidth = Bun.stringWidth(content.slice(start, start + length))\n return { startCol: prefixWidth, endCol: prefixWidth + changedWidth }\n }\n }\n return { startCol: start, endCol: start + length }\n}\n\n// Compute word-level highlights for a pair of changed lines\nexport function computeInlineHighlights(\n oldContent: string,\n newContent: string,\n): { oldHighlight: InlineHighlight | null; newHighlight: InlineHighlight | null } {\n if (oldContent === newContent) {\n return { oldHighlight: null, newHighlight: null }\n }\n\n const { stringARange, stringBRange } = relativeChanges(oldContent, newContent)\n\n const oldHighlight: InlineHighlight | null =\n stringARange.length > 0\n ? { ...toDisplayColumns(oldContent, stringARange.location, stringARange.length), type: \"removed-word\" }\n : null\n\n const newHighlight: InlineHighlight | null =\n stringBRange.length > 0\n ? { ...toDisplayColumns(newContent, stringBRange.location, stringBRange.length), type: \"added-word\" }\n : null\n\n return { oldHighlight, newHighlight }\n}\n\ninterface HunkWithContext extends StructuredPatchHunk {\n context?: string\n}\n\ninterface ParsedDiff extends Omit<StructuredPatch, \"hunks\"> {\n hunks: HunkWithContext[]\n}\n\ninterface LogicalLine {\n content: string\n lineNum?: number\n hideLineNumber?: boolean\n color?: string | RGBA\n sign?: LineSign\n type: \"context\" | \"add\" | \"remove\" | \"empty\" | \"hunk-header\"\n inlineHighlights?: InlineHighlight[]\n}\n\nexport interface DiffRenderableOptions extends RenderableOptions<DiffRenderable> {\n diff?: string\n view?: \"unified\" | \"split\"\n\n // CodeRenderable options\n fg?: string | RGBA\n filetype?: string\n syntaxStyle?: SyntaxStyle\n wrapMode?: \"word\" | \"char\" | \"none\"\n conceal?: boolean\n selectionBg?: string | RGBA\n selectionFg?: string | RGBA\n treeSitterClient?: TreeSitterClient\n\n // LineNumberRenderable options\n showLineNumbers?: boolean\n lineNumberFg?: string | RGBA\n lineNumberBg?: string | RGBA\n\n // Diff styling\n addedBg?: string | RGBA\n removedBg?: string | RGBA\n contextBg?: string | RGBA\n addedContentBg?: string | RGBA\n removedContentBg?: string | RGBA\n contextContentBg?: string | RGBA\n addedSignColor?: string | RGBA\n removedSignColor?: string | RGBA\n addedLineNumberBg?: string | RGBA\n removedLineNumberBg?: string | RGBA\n /**\n * Disable word-level highlighting within modified lines.\n * When false (default), individual words/characters that changed are highlighted.\n * @default false\n */\n disableWordHighlights?: boolean\n /**\n * Background color for added words within modified lines.\n * @default addedBg.brighten(1.15)\n */\n addedWordBg?: string | RGBA\n /**\n * Background color for removed words within modified lines.\n * @default removedBg.brighten(1.15)\n */\n removedWordBg?: string | RGBA\n\n hunkHeaderBg?: string | RGBA\n hunkHeaderFg?: string | RGBA\n}\n\nexport class DiffRenderable extends Renderable {\n private _diff: string\n private _view: \"unified\" | \"split\"\n private _parsedDiff: ParsedDiff | null = null\n private _parseError: Error | null = null\n\n // CodeRenderable options\n private _fg?: RGBA\n private _filetype?: string\n private _syntaxStyle?: SyntaxStyle\n private _wrapMode?: \"word\" | \"char\" | \"none\"\n private _conceal: boolean\n private _selectionBg?: RGBA\n private _selectionFg?: RGBA\n private _treeSitterClient?: TreeSitterClient\n\n // LineNumberRenderable options\n private _showLineNumbers: boolean\n private _lineNumberFg: RGBA\n private _lineNumberBg: RGBA\n\n // Diff styling\n private _addedBg: RGBA\n private _removedBg: RGBA\n private _contextBg: RGBA\n private _addedContentBg: RGBA | null\n private _removedContentBg: RGBA | null\n private _contextContentBg: RGBA | null\n private _addedSignColor: RGBA\n private _removedSignColor: RGBA\n private _addedLineNumberBg: RGBA\n private _removedLineNumberBg: RGBA\n private _disableWordHighlights: boolean\n private _addedWordBg: RGBA\n private _removedWordBg: RGBA\n private _hunkHeaderBg: RGBA\n private _hunkHeaderFg: RGBA\n\n private leftSide: LineNumberRenderable | null = null\n private rightSide: LineNumberRenderable | null = null\n\n private leftSideAdded: boolean = false\n private rightSideAdded: boolean = false\n\n private leftCodeRenderable: CodeRenderable | null = null\n private rightCodeRenderable: CodeRenderable | null = null\n\n private pendingRebuild: boolean = false\n private _lastWidth: number = 0\n\n private errorTextRenderable: TextRenderable | null = null\n private errorCodeRenderable: CodeRenderable | null = null\n\n private _waitingForHighlight: boolean = false\n private _lineInfoChangeHandler: (() => void) | null = null\n\n constructor(ctx: RenderContext, options: DiffRenderableOptions) {\n super(ctx, {\n ...options,\n flexDirection: options.view === \"split\" ? \"row\" : \"column\",\n })\n\n this._diff = options.diff ?? \"\"\n this._view = options.view ?? \"unified\"\n\n // CodeRenderable options\n this._fg = options.fg ? parseColor(options.fg) : undefined\n this._filetype = options.filetype\n this._syntaxStyle = options.syntaxStyle\n this._wrapMode = options.wrapMode\n this._conceal = options.conceal ?? false\n this._selectionBg = options.selectionBg ? parseColor(options.selectionBg) : undefined\n this._selectionFg = options.selectionFg ? parseColor(options.selectionFg) : undefined\n this._treeSitterClient = options.treeSitterClient\n\n // LineNumberRenderable options\n this._showLineNumbers = options.showLineNumbers ?? true\n this._lineNumberFg = parseColor(options.lineNumberFg ?? \"#888888\")\n this._lineNumberBg = parseColor(options.lineNumberBg ?? \"transparent\")\n\n // Diff styling\n this._addedBg = parseColor(options.addedBg ?? \"#1a4d1a\")\n this._removedBg = parseColor(options.removedBg ?? \"#4d1a1a\")\n this._contextBg = parseColor(options.contextBg ?? \"transparent\")\n this._addedContentBg = options.addedContentBg ? parseColor(options.addedContentBg) : null\n this._removedContentBg = options.removedContentBg ? parseColor(options.removedContentBg) : null\n this._contextContentBg = options.contextContentBg ? parseColor(options.contextContentBg) : null\n this._addedSignColor = parseColor(options.addedSignColor ?? \"#22c55e\")\n this._removedSignColor = parseColor(options.removedSignColor ?? \"#ef4444\")\n this._addedLineNumberBg = parseColor(options.addedLineNumberBg ?? \"transparent\")\n this._removedLineNumberBg = parseColor(options.removedLineNumberBg ?? \"transparent\")\n this._disableWordHighlights = options.disableWordHighlights ?? false\n // Small brightness increase (~10-15%) similar to GitHub Desktop's light theme contrast\n this._addedWordBg = options.addedWordBg ? parseColor(options.addedWordBg) : this._addedBg.brighten(1.15)\n this._removedWordBg = options.removedWordBg ? parseColor(options.removedWordBg) : this._removedBg.brighten(1.15)\n this._hunkHeaderBg = parseColor(options.hunkHeaderBg ?? \"#1a1a2e\")\n this._hunkHeaderFg = parseColor(options.hunkHeaderFg ?? \"#6688aa\")\n\n if (this._diff) {\n this.parseDiff()\n this.buildView()\n }\n }\n\n private toLineHighlights(highlights: InlineHighlight[], bg: RGBA): LineInlineHighlight[] {\n return highlights.map((h) => ({ startCol: h.startCol, endCol: h.endCol, bg }))\n }\n\n private processChangeBlockWithHighlights(\n removes: { content: string; lineNum: number }[],\n adds: { content: string; lineNum: number }[],\n ): { leftLines: LogicalLine[]; rightLines: LogicalLine[] } {\n const leftLines: LogicalLine[] = []\n const rightLines: LogicalLine[] = []\n\n const maxLength = Math.max(removes.length, adds.length)\n\n // To match the behavior of github.com, we only highlight differences between\n // lines on hunks that have the same number of added and deleted lines.\n const shouldDisplayDiffInChunk = !this._disableWordHighlights && adds.length === removes.length\n\n // Pre-compute diff tokens for paired lines (matching GitHub Desktop)\n const diffTokensBefore: (InlineHighlight | null)[] = []\n const diffTokensAfter: (InlineHighlight | null)[] = []\n\n if (shouldDisplayDiffInChunk) {\n for (let i = 0; i < removes.length; i++) {\n const remove = removes[i]\n const add = adds[i]\n\n if (remove.content.length < MaxIntraLineDiffStringLength && add.content.length < MaxIntraLineDiffStringLength) {\n const { oldHighlight, newHighlight } = computeInlineHighlights(remove.content, add.content)\n diffTokensBefore[i] = oldHighlight\n diffTokensAfter[i] = newHighlight\n } else {\n diffTokensBefore[i] = null\n diffTokensAfter[i] = null\n }\n }\n }\n\n for (let j = 0; j < maxLength; j++) {\n const remove = j < removes.length ? removes[j] : null\n const add = j < adds.length ? adds[j] : null\n\n const leftHighlight = shouldDisplayDiffInChunk && j < diffTokensBefore.length ? diffTokensBefore[j] : null\n const rightHighlight = shouldDisplayDiffInChunk && j < diffTokensAfter.length ? diffTokensAfter[j] : null\n\n if (remove) {\n leftLines.push({\n content: remove.content,\n lineNum: remove.lineNum,\n color: this._removedBg,\n sign: {\n after: \" -\",\n afterColor: this._removedSignColor,\n },\n type: \"remove\",\n inlineHighlights: leftHighlight ? [leftHighlight] : [],\n })\n } else {\n leftLines.push({\n content: \"\",\n hideLineNumber: true,\n type: \"empty\",\n })\n }\n\n if (add) {\n rightLines.push({\n content: add.content,\n lineNum: add.lineNum,\n color: this._addedBg,\n sign: {\n after: \" +\",\n afterColor: this._addedSignColor,\n },\n type: \"add\",\n inlineHighlights: rightHighlight ? [rightHighlight] : [],\n })\n } else {\n rightLines.push({\n content: \"\",\n hideLineNumber: true,\n type: \"empty\",\n })\n }\n }\n\n return { leftLines, rightLines }\n }\n\n private static readonly HUNK_HEADER_RE = /^@@\\s+-\\d+(?:,\\d+)?\\s+\\+\\d+(?:,\\d+)?\\s+@@(.*)/\n\n private parseDiff(): void {\n if (!this._diff) {\n this._parsedDiff = null\n this._parseError = null\n return\n }\n\n try {\n const patches = parsePatch(this._diff)\n\n if (patches.length === 0) {\n this._parsedDiff = null\n this._parseError = null\n return\n }\n\n const patch = patches[0]\n\n const contexts: string[] = []\n for (const line of this._diff.split(\"\\n\")) {\n const match = DiffRenderable.HUNK_HEADER_RE.exec(line)\n if (match) {\n contexts.push(match[1].trimStart())\n }\n }\n\n const hunks: HunkWithContext[] = patch.hunks.map((hunk, i) => ({\n ...hunk,\n context: contexts[i] || undefined,\n }))\n\n this._parsedDiff = { ...patch, hunks }\n this._parseError = null\n } catch (error) {\n this._parsedDiff = null\n this._parseError = error instanceof Error ? error : new Error(String(error))\n }\n }\n\n private buildView(): void {\n if (this._parseError) {\n this.buildErrorView()\n return\n }\n\n if (!this._parsedDiff || this._parsedDiff.hunks.length === 0) {\n return\n }\n\n if (this._view === \"unified\") {\n this.buildUnifiedView()\n } else {\n this.buildSplitView()\n }\n }\n\n protected override onResize(width: number, height: number): void {\n super.onResize(width, height)\n\n if (this._view === \"split\" && this._wrapMode !== \"none\" && this._wrapMode !== undefined) {\n if (this._lastWidth !== width) {\n this._lastWidth = width\n this.requestRebuild()\n }\n }\n }\n\n private requestRebuild(): void {\n if (this.pendingRebuild) {\n return\n }\n\n this.pendingRebuild = true\n queueMicrotask(() => {\n if (!this.isDestroyed && this.pendingRebuild) {\n this.pendingRebuild = false\n this.buildView()\n this.requestRender()\n }\n })\n }\n\n private rebuildView(): void {\n if (this._view === \"split\") {\n this.requestRebuild()\n } else {\n this.buildView()\n }\n }\n\n private handleLineInfoChange = (): void => {\n if (!this._waitingForHighlight) return\n if (!this.leftCodeRenderable || !this.rightCodeRenderable) return\n\n const leftIsHighlighting = this.leftCodeRenderable.isHighlighting\n const rightIsHighlighting = this.rightCodeRenderable.isHighlighting\n\n if (!leftIsHighlighting && !rightIsHighlighting) {\n this._waitingForHighlight = false\n this.requestRebuild()\n }\n }\n\n private attachLineInfoListeners(): void {\n if (this._lineInfoChangeHandler) return\n if (!this.leftCodeRenderable || !this.rightCodeRenderable) return\n\n this._lineInfoChangeHandler = this.handleLineInfoChange\n this.leftCodeRenderable.on(\"line-info-change\", this._lineInfoChangeHandler)\n this.rightCodeRenderable.on(\"line-info-change\", this._lineInfoChangeHandler)\n }\n\n private detachLineInfoListeners(): void {\n if (!this._lineInfoChangeHandler) return\n\n if (this.leftCodeRenderable) {\n this.leftCodeRenderable.off(\"line-info-change\", this._lineInfoChangeHandler)\n }\n if (this.rightCodeRenderable) {\n this.rightCodeRenderable.off(\"line-info-change\", this._lineInfoChangeHandler)\n }\n this._lineInfoChangeHandler = null\n }\n\n public override destroyRecursively(): void {\n this.detachLineInfoListeners()\n this.pendingRebuild = false\n this.leftSideAdded = false\n this.rightSideAdded = false\n super.destroyRecursively()\n }\n\n private buildErrorView(): void {\n this.flexDirection = \"column\"\n\n if (this.leftSide && this.leftSideAdded) {\n super.remove(this.leftSide.id)\n this.leftSideAdded = false\n }\n if (this.rightSide && this.rightSideAdded) {\n super.remove(this.rightSide.id)\n this.rightSideAdded = false\n }\n\n const errorMessage = `Error parsing diff: ${this._parseError?.message || \"Unknown error\"}\\n`\n if (!this.errorTextRenderable) {\n this.errorTextRenderable = new TextRenderable(this.ctx, {\n id: this.id ? `${this.id}-error-text` : undefined,\n content: errorMessage,\n fg: \"#ef4444\",\n width: \"100%\",\n flexShrink: 0,\n })\n super.add(this.errorTextRenderable)\n } else {\n this.errorTextRenderable.content = errorMessage\n const errorTextIndex = this.getChildren().indexOf(this.errorTextRenderable)\n if (errorTextIndex === -1) {\n super.add(this.errorTextRenderable)\n }\n }\n\n if (!this.errorCodeRenderable) {\n this.errorCodeRenderable = new CodeRenderable(this.ctx, {\n id: this.id ? `${this.id}-error-code` : undefined,\n content: this._diff,\n filetype: \"diff\",\n syntaxStyle: this._syntaxStyle ?? SyntaxStyle.create(),\n wrapMode: this._wrapMode,\n conceal: this._conceal,\n width: \"100%\",\n flexGrow: 1,\n flexShrink: 1,\n ...(this._treeSitterClient !== undefined && { treeSitterClient: this._treeSitterClient }),\n })\n super.add(this.errorCodeRenderable)\n } else {\n this.errorCodeRenderable.content = this._diff\n this.errorCodeRenderable.wrapMode = this._wrapMode ?? \"none\"\n if (this._syntaxStyle) {\n this.errorCodeRenderable.syntaxStyle = this._syntaxStyle\n }\n const errorCodeIndex = this.getChildren().indexOf(this.errorCodeRenderable)\n if (errorCodeIndex === -1) {\n super.add(this.errorCodeRenderable)\n }\n }\n }\n\n private createOrUpdateCodeRenderable(\n side: \"left\" | \"right\",\n content: string,\n wrapMode: \"word\" | \"char\" | \"none\" | undefined,\n drawUnstyledText?: boolean,\n ): CodeRenderable {\n const existingRenderable = side === \"left\" ? this.leftCodeRenderable : this.rightCodeRenderable\n\n if (!existingRenderable) {\n const codeOptions: CodeOptions = {\n id: this.id ? `${this.id}-${side}-code` : undefined,\n content,\n filetype: this._filetype,\n wrapMode,\n conceal: this._conceal,\n syntaxStyle: this._syntaxStyle ?? SyntaxStyle.create(),\n width: \"100%\",\n height: \"100%\",\n ...(this._fg !== undefined && { fg: this._fg }),\n ...(drawUnstyledText !== undefined && { drawUnstyledText }),\n ...(this._selectionBg !== undefined && { selectionBg: this._selectionBg }),\n ...(this._selectionFg !== undefined && { selectionFg: this._selectionFg }),\n ...(this._treeSitterClient !== undefined && { treeSitterClient: this._treeSitterClient }),\n }\n const newRenderable = new CodeRenderable(this.ctx, codeOptions)\n\n if (side === \"left\") {\n this.leftCodeRenderable = newRenderable\n } else {\n this.rightCodeRenderable = newRenderable\n }\n\n return newRenderable\n } else {\n existingRenderable.content = content\n existingRenderable.wrapMode = wrapMode ?? \"none\"\n existingRenderable.conceal = this._conceal\n if (drawUnstyledText !== undefined) {\n existingRenderable.drawUnstyledText = drawUnstyledText\n }\n if (this._filetype !== undefined) {\n existingRenderable.filetype = this._filetype\n }\n if (this._syntaxStyle !== undefined) {\n existingRenderable.syntaxStyle = this._syntaxStyle\n }\n if (this._selectionBg !== undefined) {\n existingRenderable.selectionBg = this._selectionBg\n }\n if (this._selectionFg !== undefined) {\n existingRenderable.selectionFg = this._selectionFg\n }\n if (this._fg !== undefined) {\n existingRenderable.fg = this._fg\n }\n\n return existingRenderable\n }\n }\n\n private createOrUpdateSide(\n side: \"left\" | \"right\",\n target: CodeRenderable,\n lineColors: Map<number, string | RGBA | LineColorConfig>,\n lineSigns: Map<number, LineSign>,\n lineNumbers: Map<number, number>,\n hideLineNumbers: Set<number>,\n width: \"50%\" | \"100%\",\n inlineHighlights?: Map<number, LineInlineHighlight[]>,\n ): void {\n const sideRef = side === \"left\" ? this.leftSide : this.rightSide\n const addedFlag = side === \"left\" ? this.leftSideAdded : this.rightSideAdded\n\n if (!sideRef) {\n const newSide = new LineNumberRenderable(this.ctx, {\n id: this.id ? `${this.id}-${side}` : undefined,\n target,\n fg: this._lineNumberFg,\n bg: this._lineNumberBg,\n lineColors,\n lineSigns,\n lineNumbers,\n lineNumberOffset: 0,\n hideLineNumbers,\n inlineHighlights,\n width,\n height: \"100%\",\n })\n newSide.showLineNumbers = this._showLineNumbers\n super.add(newSide)\n\n if (side === \"left\") {\n this.leftSide = newSide\n this.leftSideAdded = true\n } else {\n this.rightSide = newSide\n this.rightSideAdded = true\n }\n } else {\n sideRef.width = width\n sideRef.setLineColors(lineColors)\n sideRef.setLineSigns(lineSigns)\n sideRef.setLineNumbers(lineNumbers)\n sideRef.setHideLineNumbers(hideLineNumbers)\n if (inlineHighlights) {\n sideRef.setInlineHighlights(inlineHighlights)\n } else {\n sideRef.clearInlineHighlights()\n }\n\n if (!addedFlag) {\n super.add(sideRef)\n if (side === \"left\") {\n this.leftSideAdded = true\n } else {\n this.rightSideAdded = true\n }\n }\n }\n }\n\n private buildUnifiedView(): void {\n if (!this._parsedDiff) return\n\n this.flexDirection = \"column\"\n\n if (this.errorTextRenderable) {\n const errorTextIndex = this.getChildren().indexOf(this.errorTextRenderable)\n if (errorTextIndex !== -1) {\n super.remove(this.errorTextRenderable.id)\n }\n }\n if (this.errorCodeRenderable) {\n const errorCodeIndex = this.getChildren().indexOf(this.errorCodeRenderable)\n if (errorCodeIndex !== -1) {\n super.remove(this.errorCodeRenderable.id)\n }\n }\n\n const contentLines: string[] = []\n const lineColors = new Map<number, string | RGBA | LineColorConfig>()\n const lineSigns = new Map<number, LineSign>()\n const lineNumbers = new Map<number, number>()\n const inlineHighlights = new Map<number, LineInlineHighlight[]>()\n const hideLineNumbers = new Set<number>()\n\n let lineIndex = 0\n\n for (const hunk of this._parsedDiff.hunks) {\n if (hunk.context) {\n contentLines.push(hunk.context)\n const config: LineColorConfig = {\n gutter: this._lineNumberBg,\n }\n if (this._contextContentBg) {\n config.content = this._contextContentBg\n } else {\n config.content = this._contextBg\n }\n lineColors.set(lineIndex, config)\n lineSigns.set(lineIndex, { after: \" @\", afterColor: this._hunkHeaderFg })\n hideLineNumbers.add(lineIndex)\n lineIndex++\n }\n\n let oldLineNum = hunk.oldStart\n let newLineNum = hunk.newStart\n\n let i = 0\n while (i < hunk.lines.length) {\n const line = hunk.lines[i]\n const firstChar = line[0]\n const content = line.slice(1)\n\n if (firstChar === \" \") {\n // Context line\n contentLines.push(content)\n const config: LineColorConfig = {\n gutter: this._lineNumberBg,\n }\n if (this._contextContentBg) {\n config.content = this._contextContentBg\n } else {\n config.content = this._contextBg\n }\n lineColors.set(lineIndex, config)\n lineNumbers.set(lineIndex, newLineNum)\n oldLineNum++\n newLineNum++\n lineIndex++\n i++\n } else if (firstChar === \"\\\\\") {\n // Skip \"\\"\n i++\n } else {\n // Collect consecutive removes and adds as a block\n const removes: { content: string; lineNum: number }[] = []\n const adds: { content: string; lineNum: number }[] = []\n\n while (i < hunk.lines.length) {\n const currentLine = hunk.lines[i]\n const currentChar = currentLine[0]\n\n if (currentChar === \" \" || currentChar === \"\\\\\") {\n break\n }\n\n const currentContent = currentLine.slice(1)\n\n if (currentChar === \"-\") {\n removes.push({ content: currentContent, lineNum: oldLineNum })\n oldLineNum++\n } else if (currentChar === \"+\") {\n adds.push({ content: currentContent, lineNum: newLineNum })\n newLineNum++\n }\n i++\n }\n\n const processedBlock = this.processChangeBlockWithHighlights(removes, adds)\n\n for (const line of processedBlock.leftLines) {\n if (line.type === \"empty\") continue\n contentLines.push(line.content)\n lineColors.set(lineIndex, {\n gutter: this._removedLineNumberBg,\n content: this._removedContentBg ?? this._removedBg,\n })\n lineSigns.set(lineIndex, { after: \" -\", afterColor: this._removedSignColor })\n if (line.lineNum !== undefined) lineNumbers.set(lineIndex, line.lineNum)\n if (line.inlineHighlights?.length) {\n inlineHighlights.set(lineIndex, this.toLineHighlights(line.inlineHighlights, this._removedWordBg))\n }\n lineIndex++\n }\n\n for (const line of processedBlock.rightLines) {\n if (line.type === \"empty\") continue\n contentLines.push(line.content)\n lineColors.set(lineIndex, {\n gutter: this._addedLineNumberBg,\n content: this._addedContentBg ?? this._addedBg,\n })\n lineSigns.set(lineIndex, { after: \" +\", afterColor: this._addedSignColor })\n if (line.lineNum !== undefined) lineNumbers.set(lineIndex, line.lineNum)\n if (line.inlineHighlights?.length) {\n inlineHighlights.set(lineIndex, this.toLineHighlights(line.inlineHighlights, this._addedWordBg))\n }\n lineIndex++\n }\n }\n }\n }\n\n const content = contentLines.join(\"\\n\")\n\n const codeRenderable = this.createOrUpdateCodeRenderable(\"left\", content, this._wrapMode)\n\n // Create or update LineNumberRenderable (leftSide used for unified view)\n this.createOrUpdateSide(\n \"left\",\n codeRenderable,\n lineColors,\n lineSigns,\n lineNumbers,\n hideLineNumbers,\n \"100%\",\n inlineHighlights.size > 0 ? inlineHighlights : undefined,\n )\n\n if (this.rightSide && this.rightSideAdded) {\n super.remove(this.rightSide.id)\n this.rightSideAdded = false\n }\n }\n\n private buildSplitView(): void {\n if (!this._parsedDiff) return\n\n this.flexDirection = \"row\"\n\n if (this.errorTextRenderable) {\n const errorTextIndex = this.getChildren().indexOf(this.errorTextRenderable)\n if (errorTextIndex !== -1) {\n super.remove(this.errorTextRenderable.id)\n }\n }\n if (this.errorCodeRenderable) {\n const errorCodeIndex = this.getChildren().indexOf(this.errorCodeRenderable)\n if (errorCodeIndex !== -1) {\n super.remove(this.errorCodeRenderable.id)\n }\n }\n\n const leftLogicalLines: LogicalLine[] = []\n const rightLogicalLines: LogicalLine[] = []\n\n for (const hunk of this._parsedDiff.hunks) {\n if (hunk.context) {\n leftLogicalLines.push({\n content: hunk.context,\n hideLineNumber: true,\n sign: { after: \" @\", afterColor: this._hunkHeaderFg },\n type: \"hunk-header\",\n })\n rightLogicalLines.push({\n content: hunk.context,\n hideLineNumber: true,\n sign: { after: \" @\", afterColor: this._hunkHeaderFg },\n type: \"hunk-header\",\n })\n }\n\n let oldLineNum = hunk.oldStart\n let newLineNum = hunk.newStart\n\n let i = 0\n while (i < hunk.lines.length) {\n const line = hunk.lines[i]\n const firstChar = line[0]\n\n if (firstChar === \" \") {\n const content = line.slice(1)\n leftLogicalLines.push({\n content,\n lineNum: oldLineNum,\n color: this._contextBg,\n type: \"context\",\n })\n rightLogicalLines.push({\n content,\n lineNum: newLineNum,\n color: this._contextBg,\n type: \"context\",\n })\n oldLineNum++\n newLineNum++\n i++\n } else if (firstChar === \"\\\\\") {\n i++\n } else {\n const removes: { content: string; lineNum: number }[] = []\n const adds: { content: string; lineNum: number }[] = []\n\n while (i < hunk.lines.length) {\n const currentLine = hunk.lines[i]\n const currentChar = currentLine[0]\n\n if (currentChar === \" \" || currentChar === \"\\\\\") {\n break\n }\n\n const content = currentLine.slice(1)\n\n if (currentChar === \"-\") {\n removes.push({ content, lineNum: oldLineNum })\n oldLineNum++\n } else if (currentChar === \"+\") {\n adds.push({ content, lineNum: newLineNum })\n newLineNum++\n }\n i++\n }\n\n // Process the change block with word-level highlighting\n const processedBlock = this.processChangeBlockWithHighlights(removes, adds)\n\n // Add processed lines to output\n for (const leftLine of processedBlock.leftLines) {\n leftLogicalLines.push(leftLine)\n }\n for (const rightLine of processedBlock.rightLines) {\n rightLogicalLines.push(rightLine)\n }\n }\n }\n }\n\n const canDoWrapAlignment = this.width > 0 && (this._wrapMode === \"word\" || this._wrapMode === \"char\")\n\n const preLeftContent = leftLogicalLines.map((l) => l.content).join(\"\\n\")\n const preRightContent = rightLogicalLines.map((l) => l.content).join(\"\\n\")\n\n const needsConsistentConcealing =\n (this._wrapMode === \"word\" || this._wrapMode === \"char\") && this._conceal && this._filetype\n const drawUnstyledText = !needsConsistentConcealing\n const leftCodeRenderable = this.createOrUpdateCodeRenderable(\n \"left\",\n preLeftContent,\n this._wrapMode,\n drawUnstyledText,\n )\n const rightCodeRenderable = this.createOrUpdateCodeRenderable(\n \"right\",\n preRightContent,\n this._wrapMode,\n drawUnstyledText,\n )\n\n let finalLeftLines: LogicalLine[]\n let finalRightLines: LogicalLine[]\n\n const leftIsHighlighting = leftCodeRenderable.isHighlighting\n const rightIsHighlighting = rightCodeRenderable.isHighlighting\n const highlightingInProgress = needsConsistentConcealing && (leftIsHighlighting || rightIsHighlighting)\n\n if (highlightingInProgress) {\n this._waitingForHighlight = true\n this.attachLineInfoListeners()\n }\n\n const shouldDoAlignment = canDoWrapAlignment && !highlightingInProgress\n\n if (shouldDoAlignment) {\n const leftLineInfo = leftCodeRenderable.lineInfo\n const rightLineInfo = rightCodeRenderable.lineInfo\n\n const leftSources = leftLineInfo.lineSources || []\n const rightSources = rightLineInfo.lineSources || []\n\n const leftVisualCounts = new Map<number, number>()\n const rightVisualCounts = new Map<number, number>()\n\n for (const logicalLine of leftSources) {\n leftVisualCounts.set(logicalLine, (leftVisualCounts.get(logicalLine) || 0) + 1)\n }\n for (const logicalLine of rightSources) {\n rightVisualCounts.set(logicalLine, (rightVisualCounts.get(logicalLine) || 0) + 1)\n }\n\n finalLeftLines = []\n finalRightLines = []\n\n let leftVisualPos = 0\n let rightVisualPos = 0\n\n for (let i = 0; i < leftLogicalLines.length; i++) {\n const leftLine = leftLogicalLines[i]\n const rightLine = rightLogicalLines[i]\n\n const leftVisualCount = leftVisualCounts.get(i) || 1\n const rightVisualCount = rightVisualCounts.get(i) || 1\n\n if (leftVisualPos < rightVisualPos) {\n const pad = rightVisualPos - leftVisualPos\n for (let p = 0; p < pad; p++) {\n finalLeftLines.push({ content: \"\", hideLineNumber: true, type: \"empty\" })\n }\n leftVisualPos += pad\n } else if (rightVisualPos < leftVisualPos) {\n const pad = leftVisualPos - rightVisualPos\n for (let p = 0; p < pad; p++) {\n finalRightLines.push({ content: \"\", hideLineNumber: true, type: \"empty\" })\n }\n rightVisualPos += pad\n }\n\n finalLeftLines.push(leftLine)\n finalRightLines.push(rightLine)\n\n leftVisualPos += leftVisualCount\n rightVisualPos += rightVisualCount\n }\n\n if (leftVisualPos < rightVisualPos) {\n const pad = rightVisualPos - leftVisualPos\n for (let p = 0; p < pad; p++) {\n finalLeftLines.push({ content: \"\", hideLineNumber: true, type: \"empty\" })\n }\n } else if (rightVisualPos < leftVisualPos) {\n const pad = leftVisualPos - rightVisualPos\n for (let p = 0; p < pad; p++) {\n finalRightLines.push({ content: \"\", hideLineNumber: true, type: \"empty\" })\n }\n }\n } else {\n finalLeftLines = leftLogicalLines\n finalRightLines = rightLogicalLines\n }\n\n const leftLineColors = new Map<number, string | RGBA | LineColorConfig>()\n const rightLineColors = new Map<number, string | RGBA | LineColorConfig>()\n const leftLineSigns = new Map<number, LineSign>()\n const rightLineSigns = new Map<number, LineSign>()\n const leftHideLineNumbers = new Set<number>()\n const rightHideLineNumbers = new Set<number>()\n const leftLineNumbers = new Map<number, number>()\n const rightLineNumbers = new Map<number, number>()\n const leftInlineHighlights = new Map<number, LineInlineHighlight[]>()\n const rightInlineHighlights = new Map<number, LineInlineHighlight[]>()\n\n finalLeftLines.forEach((line, index) => {\n if (line.lineNum !== undefined) {\n leftLineNumbers.set(index, line.lineNum)\n }\n if (line.hideLineNumber) {\n leftHideLineNumbers.add(index)\n }\n if (line.type === \"remove\") {\n const config: LineColorConfig = {\n gutter: this._removedLineNumberBg,\n }\n if (this._removedContentBg) {\n config.content = this._removedContentBg\n } else {\n config.content = this._removedBg\n }\n leftLineColors.set(index, config)\n } else if (line.type === \"context\") {\n const config: LineColorConfig = {\n gutter: this._lineNumberBg,\n }\n if (this._contextContentBg) {\n config.content = this._contextContentBg\n } else {\n config.content = this._contextBg\n }\n leftLineColors.set(index, config)\n } else if (line.type === \"hunk-header\") {\n const config: LineColorConfig = {\n gutter: this._lineNumberBg,\n }\n if (this._contextContentBg) {\n config.content = this._contextContentBg\n } else {\n config.content = this._contextBg\n }\n leftLineColors.set(index, config)\n }\n if (line.sign) {\n leftLineSigns.set(index, line.sign)\n }\n if (line.inlineHighlights?.length) {\n leftInlineHighlights.set(index, this.toLineHighlights(line.inlineHighlights, this._removedWordBg))\n }\n })\n\n finalRightLines.forEach((line, index) => {\n if (line.lineNum !== undefined) {\n rightLineNumbers.set(index, line.lineNum)\n }\n if (line.hideLineNumber) {\n rightHideLineNumbers.add(index)\n }\n if (line.type === \"add\") {\n const config: LineColorConfig = {\n gutter: this._addedLineNumberBg,\n }\n if (this._addedContentBg) {\n config.content = this._addedContentBg\n } else {\n config.content = this._addedBg\n }\n rightLineColors.set(index, config)\n } else if (line.type === \"context\") {\n const config: LineColorConfig = {\n gutter: this._lineNumberBg,\n }\n if (this._contextContentBg) {\n config.content = this._contextContentBg\n } else {\n config.content = this._contextBg\n }\n rightLineColors.set(index, config)\n } else if (line.type === \"hunk-header\") {\n const config: LineColorConfig = {\n gutter: this._lineNumberBg,\n }\n if (this._contextContentBg) {\n config.content = this._contextContentBg\n } else {\n config.content = this._contextBg\n }\n rightLineColors.set(index, config)\n }\n if (line.sign) {\n rightLineSigns.set(index, line.sign)\n }\n if (line.inlineHighlights?.length) {\n rightInlineHighlights.set(index, this.toLineHighlights(line.inlineHighlights, this._addedWordBg))\n }\n })\n\n const leftContentFinal = finalLeftLines.map((l) => l.content).join(\"\\n\")\n const rightContentFinal = finalRightLines.map((l) => l.content).join(\"\\n\")\n\n leftCodeRenderable.content = leftContentFinal\n rightCodeRenderable.content = rightContentFinal\n\n this.createOrUpdateSide(\n \"left\",\n leftCodeRenderable,\n leftLineColors,\n leftLineSigns,\n leftLineNumbers,\n leftHideLineNumbers,\n \"50%\",\n leftInlineHighlights.size > 0 ? leftInlineHighlights : undefined,\n )\n this.createOrUpdateSide(\n \"right\",\n rightCodeRenderable,\n rightLineColors,\n rightLineSigns,\n rightLineNumbers,\n rightHideLineNumbers,\n \"50%\",\n rightInlineHighlights.size > 0 ? rightInlineHighlights : undefined,\n )\n }\n\n public get diff(): string {\n return this._diff\n }\n\n public set diff(value: string) {\n if (this._diff !== value) {\n this._diff = value\n this._waitingForHighlight = false\n this.parseDiff()\n this.rebuildView()\n }\n }\n\n public get view(): \"unified\" | \"split\" {\n return this._view\n }\n\n public set view(value: \"unified\" | \"split\") {\n if (this._view !== value) {\n this._view = value\n this.flexDirection = value === \"split\" ? \"row\" : \"column\"\n this.buildView()\n }\n }\n\n public get filetype(): string | undefined {\n return this._filetype\n }\n\n public set filetype(value: string | undefined) {\n if (this._filetype !== value) {\n this._filetype = value\n this.rebuildView()\n }\n }\n\n public get syntaxStyle(): SyntaxStyle | undefined {\n return this._syntaxStyle\n }\n\n public set syntaxStyle(value: SyntaxStyle | undefined) {\n if (this._syntaxStyle !== value) {\n this._syntaxStyle = value\n this.rebuildView()\n }\n }\n\n public get wrapMode(): \"word\" | \"char\" | \"none\" | undefined {\n return this._wrapMode\n }\n\n public set wrapMode(value: \"word\" | \"char\" | \"none\" | undefined) {\n if (this._wrapMode !== value) {\n this._wrapMode = value\n\n if (this._view === \"unified\" && this.leftCodeRenderable) {\n this.leftCodeRenderable.wrapMode = value ?? \"none\"\n } else if (this._view === \"split\") {\n this.requestRebuild()\n }\n }\n }\n\n public get showLineNumbers(): boolean {\n return this._showLineNumbers\n }\n\n public set showLineNumbers(value: boolean) {\n if (this._showLineNumbers !== value) {\n this._showLineNumbers = value\n if (this.leftSide) {\n this.leftSide.showLineNumbers = value\n }\n if (this.rightSide) {\n this.rightSide.showLineNumbers = value\n }\n }\n }\n\n public get addedBg(): RGBA {\n return this._addedBg\n }\n\n public set addedBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._addedBg !== parsed) {\n this._addedBg = parsed\n this.rebuildView()\n }\n }\n\n public get removedBg(): RGBA {\n return this._removedBg\n }\n\n public set removedBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._removedBg !== parsed) {\n this._removedBg = parsed\n this.rebuildView()\n }\n }\n\n public get contextBg(): RGBA {\n return this._contextBg\n }\n\n public set contextBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._contextBg !== parsed) {\n this._contextBg = parsed\n this.rebuildView()\n }\n }\n\n public get addedSignColor(): RGBA {\n return this._addedSignColor\n }\n\n public set addedSignColor(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._addedSignColor !== parsed) {\n this._addedSignColor = parsed\n this.rebuildView()\n }\n }\n\n public get removedSignColor(): RGBA {\n return this._removedSignColor\n }\n\n public set removedSignColor(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._removedSignColor !== parsed) {\n this._removedSignColor = parsed\n this.rebuildView()\n }\n }\n\n public get addedLineNumberBg(): RGBA {\n return this._addedLineNumberBg\n }\n\n public set addedLineNumberBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._addedLineNumberBg !== parsed) {\n this._addedLineNumberBg = parsed\n this.rebuildView()\n }\n }\n\n public get removedLineNumberBg(): RGBA {\n return this._removedLineNumberBg\n }\n\n public set removedLineNumberBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._removedLineNumberBg !== parsed) {\n this._removedLineNumberBg = parsed\n this.rebuildView()\n }\n }\n\n public get hunkHeaderBg(): RGBA {\n return this._hunkHeaderBg\n }\n\n public set hunkHeaderBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._hunkHeaderBg !== parsed) {\n this._hunkHeaderBg = parsed\n this.rebuildView()\n }\n }\n\n public get hunkHeaderFg(): RGBA {\n return this._hunkHeaderFg\n }\n\n public set hunkHeaderFg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._hunkHeaderFg !== parsed) {\n this._hunkHeaderFg = parsed\n this.rebuildView()\n }\n }\n\n public get lineNumberFg(): RGBA {\n return this._lineNumberFg\n }\n\n public set lineNumberFg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._lineNumberFg !== parsed) {\n this._lineNumberFg = parsed\n this.rebuildView()\n }\n }\n\n public get lineNumberBg(): RGBA {\n return this._lineNumberBg\n }\n\n public set lineNumberBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._lineNumberBg !== parsed) {\n this._lineNumberBg = parsed\n this.rebuildView()\n }\n }\n\n public get addedContentBg(): RGBA | null {\n return this._addedContentBg\n }\n\n public set addedContentBg(value: string | RGBA | null) {\n const parsed = value ? parseColor(value) : null\n if (this._addedContentBg !== parsed) {\n this._addedContentBg = parsed\n this.rebuildView()\n }\n }\n\n public get removedContentBg(): RGBA | null {\n return this._removedContentBg\n }\n\n public set removedContentBg(value: string | RGBA | null) {\n const parsed = value ? parseColor(value) : null\n if (this._removedContentBg !== parsed) {\n this._removedContentBg = parsed\n this.rebuildView()\n }\n }\n\n public get contextContentBg(): RGBA | null {\n return this._contextContentBg\n }\n\n public set contextContentBg(value: string | RGBA | null) {\n const parsed = value ? parseColor(value) : null\n if (this._contextContentBg !== parsed) {\n this._contextContentBg = parsed\n this.rebuildView()\n }\n }\n\n public get selectionBg(): RGBA | undefined {\n return this._selectionBg\n }\n\n public set selectionBg(value: string | RGBA | undefined) {\n const parsed = value ? parseColor(value) : undefined\n if (this._selectionBg !== parsed) {\n this._selectionBg = parsed\n if (this.leftCodeRenderable) {\n this.leftCodeRenderable.selectionBg = parsed\n }\n if (this.rightCodeRenderable) {\n this.rightCodeRenderable.selectionBg = parsed\n }\n }\n }\n\n public get selectionFg(): RGBA | undefined {\n return this._selectionFg\n }\n\n public set selectionFg(value: string | RGBA | undefined) {\n const parsed = value ? parseColor(value) : undefined\n if (this._selectionFg !== parsed) {\n this._selectionFg = parsed\n if (this.leftCodeRenderable) {\n this.leftCodeRenderable.selectionFg = parsed\n }\n if (this.rightCodeRenderable) {\n this.rightCodeRenderable.selectionFg = parsed\n }\n }\n }\n\n public get conceal(): boolean {\n return this._conceal\n }\n\n public set conceal(value: boolean) {\n if (this._conceal !== value) {\n this._conceal = value\n this.rebuildView()\n }\n }\n\n public get fg(): RGBA | undefined {\n return this._fg\n }\n\n public set fg(value: string | RGBA | undefined) {\n const parsed = value ? parseColor(value) : undefined\n if (this._fg !== parsed) {\n this._fg = parsed\n if (this.leftCodeRenderable) {\n this.leftCodeRenderable.fg = parsed\n }\n if (this.rightCodeRenderable) {\n this.rightCodeRenderable.fg = parsed\n }\n }\n }\n\n public get disableWordHighlights(): boolean {\n return this._disableWordHighlights\n }\n\n public set disableWordHighlights(value: boolean) {\n if (this._disableWordHighlights !== value) {\n this._disableWordHighlights = value\n this.rebuildView()\n }\n }\n\n public get addedWordBg(): RGBA {\n return this._addedWordBg\n }\n\n public set addedWordBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._addedWordBg !== parsed) {\n this._addedWordBg = parsed\n this.rebuildView()\n }\n }\n\n public get removedWordBg(): RGBA {\n return this._removedWordBg\n }\n\n public set removedWordBg(value: string | RGBA) {\n const parsed = parseColor(value)\n if (this._removedWordBg !== parsed) {\n this._removedWordBg = parsed\n this.rebuildView()\n }\n }\n}\n",
21
+ "import { BaseRenderable } from \"../Renderable\"\nimport { stringToStyledText, StyledText } from \"../lib/styled-text\"\nimport { type TextChunk } from \"../text-buffer\"\nimport { RGBA } from \"../lib/RGBA\"\nimport { type RenderContext } from \"../types\"\nimport { RootTextNodeRenderable, TextNodeRenderable } from \"./TextNode\"\nimport { TextBufferRenderable, type TextBufferOptions } from \"./TextBufferRenderable\"\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(id: string): void {\n this.rootTextNode.remove(id)\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",
22
+ "import { Renderable, type RenderableOptions } from \"../Renderable\"\nimport { convertGlobalToLocalSelection, Selection, type LocalSelectionBounds } from \"../lib/selection\"\nimport { EditBuffer, type LogicalCursor } from \"../edit-buffer\"\nimport { EditorView, type VisualCursor } from \"../editor-view\"\nimport { RGBA, parseColor } from \"../lib/RGBA\"\nimport type { RenderContext, Highlight, CursorStyleOptions, LineInfoProvider, LineInfo } from \"../types\"\nimport type { OptimizedBuffer } from \"../buffer\"\nimport { MeasureMode } from \"yoga-layout\"\nimport type { SyntaxStyle } from \"../syntax-style\"\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 protected _focusable: boolean = true\n public selectable: boolean = true\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\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.setupMeasureFunc()\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 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 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 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 // Undefined = 0,\n // Exactly = 1,\n // AtMost = 2\n private setupMeasureFunc(): void {\n const measureFunc = (\n width: number,\n widthMode: MeasureMode,\n height: number,\n heightMode: MeasureMode,\n ): { width: number; height: number } => {\n // When widthMode is Undefined, Yoga is asking for the intrinsic/natural width\n // Pass width=0 to measureForDimensions to signal we want max-content (no wrapping)\n // The Zig code treats width=0 with wrap_mode != none as null wrap_width,\n // which triggers no-wrap mode and returns the text's intrinsic width\n let effectiveWidth: number\n if (widthMode === MeasureMode.Undefined || isNaN(width)) {\n effectiveWidth = 0\n } else {\n effectiveWidth = width\n }\n\n const effectiveHeight = isNaN(height) ? 1 : height\n\n const measureResult = this.editorView.measureForDimensions(\n Math.floor(effectiveWidth),\n Math.floor(effectiveHeight),\n )\n\n const measuredWidth = measureResult ? Math.max(1, measureResult.maxWidth) : 1\n const measuredHeight = measureResult ? Math.max(1, measureResult.lineCount) : 1\n\n if (widthMode === MeasureMode.AtMost && this._positionType !== \"absolute\") {\n return {\n width: Math.min(effectiveWidth, measuredWidth),\n height: Math.min(effectiveHeight, measuredHeight),\n }\n }\n\n return {\n width: measuredWidth,\n height: measuredHeight,\n }\n }\n\n this.yogaNode.setMeasureFunc(measureFunc)\n }\n\n render(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible) return\n if (this.isDestroyed) return\n\n this.markClean()\n this._ctx.addToHitGrid(this.x, this.y, 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.x, this.y)\n }\n\n protected renderCursor(buffer: OptimizedBuffer): void {\n if (!this._showCursor || !this._focused) return\n\n const visualCursor = this.editorView.getVisualCursor()\n\n const cursorX = this.x + visualCursor.visualCol + 1 // +1 for 1-based terminal coords\n const cursorY = this.y + visualCursor.visualRow + 1 // +1 for 1-based terminal coords\n\n this._ctx.setCursorPosition(cursorX, cursorY, true)\n this._ctx.setCursorColor(this._cursorColor)\n this._ctx.setCursorStyle(this._cursorStyle.style, this._cursorStyle.blinking)\n }\n\n public focus(): void {\n super.focus()\n this._ctx.setCursorStyle(this._cursorStyle.style, this._cursorStyle.blinking)\n this._ctx.setCursorColor(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 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 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 insertText(text: string): void {\n this.editBuffer.insertText(text)\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",
23
+ "import { type RenderContext } from \"../types\"\nimport { EditBufferRenderable, type EditBufferOptions } from \"./EditBufferRenderable\"\nimport type { KeyEvent, PasteEvent } from \"../lib/KeyHandler\"\nimport { RGBA, parseColor, type ColorInput } from \"../lib/RGBA\"\nimport {\n type KeyBinding as BaseKeyBinding,\n mergeKeyBindings,\n getKeyBindingKey,\n buildKeyBindingsMap,\n type KeyAliasMap,\n defaultKeyAliases,\n mergeKeyAliases,\n} from \"../lib/keymapping\"\nimport { type StyledText, fg } from \"../lib/styled-text\"\nimport type { ExtmarksController } from \"../lib/extmarks\"\n\nexport type TextareaAction =\n | \"move-left\"\n | \"move-right\"\n | \"move-up\"\n | \"move-down\"\n | \"select-left\"\n | \"select-right\"\n | \"select-up\"\n | \"select-down\"\n | \"line-home\"\n | \"line-end\"\n | \"select-line-home\"\n | \"select-line-end\"\n | \"visual-line-home\"\n | \"visual-line-end\"\n | \"select-visual-line-home\"\n | \"select-visual-line-end\"\n | \"buffer-home\"\n | \"buffer-end\"\n | \"select-buffer-home\"\n | \"select-buffer-end\"\n | \"delete-line\"\n | \"delete-to-line-end\"\n | \"delete-to-line-start\"\n | \"backspace\"\n | \"delete\"\n | \"newline\"\n | \"undo\"\n | \"redo\"\n | \"word-forward\"\n | \"word-backward\"\n | \"select-word-forward\"\n | \"select-word-backward\"\n | \"delete-word-forward\"\n | \"delete-word-backward\"\n | \"select-all\"\n | \"submit\"\n\nexport type KeyBinding = BaseKeyBinding<TextareaAction>\n\nconst defaultTextareaKeybindings: KeyBinding[] = [\n { name: \"left\", action: \"move-left\" },\n { name: \"right\", action: \"move-right\" },\n { name: \"up\", action: \"move-up\" },\n { name: \"down\", action: \"move-down\" },\n { name: \"left\", shift: true, action: \"select-left\" },\n { name: \"right\", shift: true, action: \"select-right\" },\n { name: \"up\", shift: true, action: \"select-up\" },\n { name: \"down\", shift: true, action: \"select-down\" },\n { name: \"home\", action: \"buffer-home\" },\n { name: \"end\", action: \"buffer-end\" },\n { name: \"home\", shift: true, action: \"select-buffer-home\" },\n { name: \"end\", shift: true, action: \"select-buffer-end\" },\n { name: \"a\", ctrl: true, action: \"line-home\" },\n { name: \"e\", ctrl: true, action: \"line-end\" },\n { name: \"a\", ctrl: true, shift: true, action: \"select-line-home\" },\n { name: \"e\", ctrl: true, shift: true, action: \"select-line-end\" },\n { name: \"a\", meta: true, action: \"visual-line-home\" },\n { name: \"e\", meta: true, action: \"visual-line-end\" },\n { name: \"a\", meta: true, shift: true, action: \"select-visual-line-home\" },\n { name: \"e\", meta: true, shift: true, action: \"select-visual-line-end\" },\n { name: \"f\", ctrl: true, action: \"move-right\" },\n { name: \"b\", ctrl: true, action: \"move-left\" },\n { name: \"w\", ctrl: true, action: \"delete-word-backward\" },\n { name: \"backspace\", ctrl: true, action: \"delete-word-backward\" },\n { name: \"d\", meta: true, action: \"delete-word-forward\" },\n { name: \"delete\", meta: true, action: \"delete-word-forward\" },\n { name: \"delete\", ctrl: true, action: \"delete-word-forward\" },\n { name: \"d\", ctrl: true, shift: true, action: \"delete-line\" },\n { name: \"k\", ctrl: true, action: \"delete-to-line-end\" },\n { name: \"u\", ctrl: true, action: \"delete-to-line-start\" },\n { name: \"backspace\", action: \"backspace\" },\n { name: \"backspace\", shift: true, action: \"backspace\" },\n { name: \"d\", ctrl: true, action: \"delete\" },\n { name: \"delete\", action: \"delete\" },\n { name: \"delete\", shift: true, action: \"delete\" },\n { name: \"return\", action: \"newline\" },\n { name: \"linefeed\", action: \"newline\" },\n { name: \"return\", meta: true, action: \"submit\" },\n\n // undo/redo\n { name: \"-\", ctrl: true, action: \"undo\" },\n { name: \".\", ctrl: true, action: \"redo\" },\n { name: \"z\", super: true, action: \"undo\" },\n { name: \"z\", super: true, shift: true, action: \"redo\" },\n\n { name: \"f\", meta: true, action: \"word-forward\" },\n { name: \"b\", meta: true, action: \"word-backward\" },\n { name: \"right\", meta: true, action: \"word-forward\" },\n { name: \"left\", meta: true, action: \"word-backward\" },\n { name: \"right\", ctrl: true, action: \"word-forward\" },\n { name: \"left\", ctrl: true, action: \"word-backward\" },\n { name: \"f\", meta: true, shift: true, action: \"select-word-forward\" },\n { name: \"b\", meta: true, shift: true, action: \"select-word-backward\" },\n { name: \"right\", meta: true, shift: true, action: \"select-word-forward\" },\n { name: \"left\", meta: true, shift: true, action: \"select-word-backward\" },\n { name: \"backspace\", meta: true, action: \"delete-word-backward\" },\n\n // super (cmd/win) + arrow keys for Kitty Keyboard mode\n { name: \"left\", super: true, action: \"visual-line-home\" },\n { name: \"right\", super: true, action: \"visual-line-end\" },\n { name: \"up\", super: true, action: \"buffer-home\" },\n { name: \"down\", super: true, action: \"buffer-end\" },\n { name: \"left\", super: true, shift: true, action: \"select-visual-line-home\" },\n { name: \"right\", super: true, shift: true, action: \"select-visual-line-end\" },\n { name: \"up\", super: true, shift: true, action: \"select-buffer-home\" },\n { name: \"down\", super: true, shift: true, action: \"select-buffer-end\" },\n { name: \"a\", super: true, action: \"select-all\" },\n]\n\nexport interface SubmitEvent {}\n\nexport interface TextareaOptions extends EditBufferOptions {\n initialValue?: string\n backgroundColor?: ColorInput\n textColor?: ColorInput\n focusedBackgroundColor?: ColorInput\n focusedTextColor?: ColorInput\n placeholder?: StyledText | string | null\n placeholderColor?: ColorInput\n keyBindings?: KeyBinding[]\n keyAliasMap?: KeyAliasMap\n onSubmit?: (event: SubmitEvent) => void\n}\n\nexport class TextareaRenderable extends EditBufferRenderable {\n private _placeholder: StyledText | string | null\n private _placeholderColor: RGBA\n private _unfocusedBackgroundColor: RGBA\n private _unfocusedTextColor: RGBA\n private _focusedBackgroundColor: RGBA\n private _focusedTextColor: RGBA\n private _keyBindingsMap: Map<string, TextareaAction>\n private _keyAliasMap: KeyAliasMap\n private _keyBindings: KeyBinding[]\n private _actionHandlers: Map<TextareaAction, () => boolean>\n private _initialValueSet: boolean = false\n private _submitListener: ((event: SubmitEvent) => void) | undefined = undefined\n\n private static readonly defaults = {\n backgroundColor: \"transparent\",\n textColor: \"#FFFFFF\",\n focusedBackgroundColor: \"transparent\",\n focusedTextColor: \"#FFFFFF\",\n placeholder: null,\n placeholderColor: \"#666666\",\n } satisfies Partial<TextareaOptions>\n\n constructor(ctx: RenderContext, options: TextareaOptions) {\n const defaults = TextareaRenderable.defaults\n\n // Pass base colors to parent constructor (these become the unfocused colors)\n const baseOptions = {\n ...options,\n backgroundColor: options.backgroundColor || defaults.backgroundColor,\n textColor: options.textColor || defaults.textColor,\n }\n super(ctx, baseOptions)\n\n // Store unfocused colors separately (parent's properties get overwritten when focused)\n this._unfocusedBackgroundColor = parseColor(options.backgroundColor || defaults.backgroundColor)\n this._unfocusedTextColor = parseColor(options.textColor || defaults.textColor)\n this._focusedBackgroundColor = parseColor(\n options.focusedBackgroundColor || options.backgroundColor || defaults.focusedBackgroundColor,\n )\n this._focusedTextColor = parseColor(options.focusedTextColor || options.textColor || defaults.focusedTextColor)\n this._placeholder = options.placeholder ?? defaults.placeholder\n this._placeholderColor = parseColor(options.placeholderColor ?? defaults.placeholderColor)\n\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, options.keyAliasMap || {})\n this._keyBindings = options.keyBindings || []\n const mergedBindings = mergeKeyBindings(defaultTextareaKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n this._actionHandlers = this.buildActionHandlers()\n this._submitListener = options.onSubmit\n\n if (options.initialValue) {\n this.setText(options.initialValue)\n this._initialValueSet = true\n }\n this.updateColors()\n\n this.applyPlaceholder(this._placeholder)\n }\n\n private applyPlaceholder(placeholder: StyledText | string | null): void {\n if (placeholder === null) {\n this.editorView.setPlaceholderStyledText([])\n return\n }\n\n if (typeof placeholder === \"string\") {\n const colorStyle = fg(this._placeholderColor)\n const chunks = [colorStyle(placeholder)]\n this.editorView.setPlaceholderStyledText(chunks)\n } else {\n this.editorView.setPlaceholderStyledText(placeholder.chunks)\n }\n }\n\n private buildActionHandlers(): Map<TextareaAction, () => boolean> {\n return new Map([\n [\"move-left\", () => this.moveCursorLeft()],\n [\"move-right\", () => this.moveCursorRight()],\n [\"move-up\", () => this.moveCursorUp()],\n [\"move-down\", () => this.moveCursorDown()],\n [\"select-left\", () => this.moveCursorLeft({ select: true })],\n [\"select-right\", () => this.moveCursorRight({ select: true })],\n [\"select-up\", () => this.moveCursorUp({ select: true })],\n [\"select-down\", () => this.moveCursorDown({ select: true })],\n [\"line-home\", () => this.gotoLineHome()],\n [\"line-end\", () => this.gotoLineEnd()],\n [\"select-line-home\", () => this.gotoLineHome({ select: true })],\n [\"select-line-end\", () => this.gotoLineEnd({ select: true })],\n [\"visual-line-home\", () => this.gotoVisualLineHome()],\n [\"visual-line-end\", () => this.gotoVisualLineEnd()],\n [\"select-visual-line-home\", () => this.gotoVisualLineHome({ select: true })],\n [\"select-visual-line-end\", () => this.gotoVisualLineEnd({ select: true })],\n [\"select-buffer-home\", () => this.gotoBufferHome({ select: true })],\n [\"select-buffer-end\", () => this.gotoBufferEnd({ select: true })],\n [\"buffer-home\", () => this.gotoBufferHome()],\n [\"buffer-end\", () => this.gotoBufferEnd()],\n [\"delete-line\", () => this.deleteLine()],\n [\"delete-to-line-end\", () => this.deleteToLineEnd()],\n [\"delete-to-line-start\", () => this.deleteToLineStart()],\n [\"backspace\", () => this.deleteCharBackward()],\n [\"delete\", () => this.deleteChar()],\n [\"newline\", () => this.newLine()],\n [\"undo\", () => this.undo()],\n [\"redo\", () => this.redo()],\n [\"word-forward\", () => this.moveWordForward()],\n [\"word-backward\", () => this.moveWordBackward()],\n [\"select-word-forward\", () => this.moveWordForward({ select: true })],\n [\"select-word-backward\", () => this.moveWordBackward({ select: true })],\n [\"delete-word-forward\", () => this.deleteWordForward()],\n [\"delete-word-backward\", () => this.deleteWordBackward()],\n [\"select-all\", () => this.selectAll()],\n [\"submit\", () => this.submit()],\n ])\n }\n\n public handlePaste(event: PasteEvent): void {\n this.insertText(event.text)\n }\n\n public handleKeyPress(key: KeyEvent): boolean {\n const bindingKey = getKeyBindingKey({\n name: key.name,\n ctrl: key.ctrl,\n shift: key.shift,\n meta: key.meta,\n super: key.super,\n action: \"move-left\" as TextareaAction,\n })\n\n const action = this._keyBindingsMap.get(bindingKey)\n\n if (action) {\n const handler = this._actionHandlers.get(action)\n if (handler) {\n return handler()\n }\n }\n\n if (!key.ctrl && !key.meta && !key.super && !key.hyper) {\n if (key.name === \"space\") {\n this.insertText(\" \")\n return true\n }\n\n if (key.sequence) {\n const firstCharCode = key.sequence.charCodeAt(0)\n\n if (firstCharCode < 32) {\n return false\n }\n\n if (firstCharCode === 127) {\n return false\n }\n\n this.insertText(key.sequence)\n return true\n }\n }\n\n return false\n }\n\n private updateColors(): void {\n const effectiveBg = this._focused ? this._focusedBackgroundColor : this._unfocusedBackgroundColor\n const effectiveFg = this._focused ? this._focusedTextColor : this._unfocusedTextColor\n\n super.backgroundColor = effectiveBg\n super.textColor = effectiveFg\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 private deleteSelectedText(): void {\n this.editorView.deleteSelectedText()\n\n this._ctx.clearSelection()\n this.requestRender()\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 there's a selection and shift is not pressed,\n // move cursor to the start of the selection\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 there's a selection and shift is not pressed,\n // move cursor to the end of the selection\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 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\n const sol = this.editorView.getVisualSOL()\n this.editBuffer.setCursor(sol.logicalRow, sol.logicalCol)\n\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\n const eol = this.editorView.getVisualEOL()\n this.editBuffer.setCursor(eol.logicalRow, eol.logicalCol)\n\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 }\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 public focus(): void {\n super.focus()\n this.updateColors()\n }\n\n public blur(): void {\n super.blur()\n if (!this.isDestroyed) {\n this.updateColors()\n }\n }\n\n get placeholder(): StyledText | string | null {\n return this._placeholder\n }\n\n set placeholder(value: StyledText | string | null) {\n if (this._placeholder !== value) {\n this._placeholder = value\n this.applyPlaceholder(value)\n this.requestRender()\n }\n }\n\n get placeholderColor(): RGBA {\n return this._placeholderColor\n }\n\n set placeholderColor(value: ColorInput) {\n const newColor = parseColor(value ?? TextareaRenderable.defaults.placeholderColor)\n if (this._placeholderColor !== newColor) {\n this._placeholderColor = newColor\n this.applyPlaceholder(this._placeholder)\n this.requestRender()\n }\n }\n\n override get backgroundColor(): RGBA {\n return this._unfocusedBackgroundColor\n }\n\n override set backgroundColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? TextareaRenderable.defaults.backgroundColor)\n if (this._unfocusedBackgroundColor !== newColor) {\n this._unfocusedBackgroundColor = newColor\n this.updateColors()\n }\n }\n\n override get textColor(): RGBA {\n return this._unfocusedTextColor\n }\n\n override set textColor(value: RGBA | string | undefined) {\n const newColor = parseColor(value ?? TextareaRenderable.defaults.textColor)\n if (this._unfocusedTextColor !== newColor) {\n this._unfocusedTextColor = newColor\n this.updateColors()\n }\n }\n\n set focusedBackgroundColor(value: ColorInput) {\n const newColor = parseColor(value ?? TextareaRenderable.defaults.focusedBackgroundColor)\n if (this._focusedBackgroundColor !== newColor) {\n this._focusedBackgroundColor = newColor\n this.updateColors()\n }\n }\n\n set focusedTextColor(value: ColorInput) {\n const newColor = parseColor(value ?? TextareaRenderable.defaults.focusedTextColor)\n if (this._focusedTextColor !== newColor) {\n this._focusedTextColor = newColor\n this.updateColors()\n }\n }\n\n set initialValue(value: string) {\n if (!this._initialValueSet) {\n this.setText(value)\n this._initialValueSet = true\n }\n }\n\n public submit(): boolean {\n if (this._submitListener) {\n this._submitListener({})\n }\n return true\n }\n\n public set onSubmit(handler: ((event: SubmitEvent) => void) | undefined) {\n this._submitListener = handler\n }\n\n public get onSubmit(): ((event: SubmitEvent) => void) | undefined {\n return this._submitListener\n }\n\n public set keyBindings(bindings: KeyBinding[]) {\n this._keyBindings = bindings\n const mergedBindings = mergeKeyBindings(defaultTextareaKeybindings, bindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n }\n\n public set keyAliasMap(aliases: KeyAliasMap) {\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, aliases)\n const mergedBindings = mergeKeyBindings(defaultTextareaKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n }\n\n public get extmarks(): ExtmarksController {\n return this.editorView.extmarks\n }\n}\n",
24
+ "import type { PasteEvent } from \"../lib/KeyHandler\"\nimport type { RenderContext } from \"../types\"\nimport {\n TextareaRenderable,\n type TextareaOptions,\n type TextareaAction,\n type KeyBinding as TextareaKeyBinding,\n} from \"./Textarea\"\n\nexport type InputAction = TextareaAction\nexport type InputKeyBinding = TextareaKeyBinding\n\nexport interface InputRenderableOptions\n extends Omit<TextareaOptions, \"height\" | \"minHeight\" | \"maxHeight\" | \"initialValue\"> {\n /** Initial text value (newlines are stripped) */\n value?: string\n /** Maximum number of characters allowed */\n maxLength?: number\n /** Placeholder text (Input only supports string, not StyledText) */\n placeholder?: string\n}\n\n// TODO: make this just plain strings instead of an enum (same for other events)\nexport enum InputRenderableEvents {\n INPUT = \"input\",\n CHANGE = \"change\",\n ENTER = \"enter\",\n}\n\n/**\n * InputRenderable - A single-line text input component.\n *\n * Extends TextareaRenderable with single-line constraints:\n * - Height is always 1\n * - No text wrapping\n * - Newlines are stripped from input\n * - Enter key submits instead of inserting newline\n *\n * Inherits all keybindings from TextareaRenderable.\n */\nexport class InputRenderable extends TextareaRenderable {\n private _maxLength: number\n private _lastCommittedValue: string = \"\"\n\n // Only specify defaults that differ from TextareaRenderable/EditBufferRenderable\n private static readonly defaultOptions = {\n // Different from Textarea's null\n placeholder: \"\",\n // Input-specific\n maxLength: 1000,\n value: \"\",\n } satisfies Partial<InputRenderableOptions>\n\n constructor(ctx: RenderContext, options: InputRenderableOptions) {\n const defaults = InputRenderable.defaultOptions\n const maxLength = options.maxLength ?? defaults.maxLength\n // Sanitize initial value: strip newlines and enforce maxLength\n const rawValue = options.value ?? defaults.value\n const initialValue = rawValue.replace(/[\\n\\r]/g, \"\").substring(0, maxLength)\n\n super(ctx, {\n ...options,\n placeholder: options.placeholder ?? defaults.placeholder,\n initialValue,\n // Single-line constraints\n height: 1,\n wrapMode: \"none\",\n // Override return/linefeed to submit instead of newline\n keyBindings: [\n { name: \"return\", action: \"submit\" },\n { name: \"linefeed\", action: \"submit\" },\n ...(options.keyBindings || []),\n ],\n })\n\n this._maxLength = maxLength\n this._lastCommittedValue = this.plainText\n\n // Set cursor to end of initial value\n if (initialValue) {\n this.cursorOffset = initialValue.length\n }\n }\n\n /**\n * Prevent newlines in single-line input\n */\n public override newLine(): boolean {\n return false\n }\n\n /**\n * Handle paste - strip newlines and enforce maxLength\n */\n public override handlePaste(event: PasteEvent): void {\n const sanitized = event.text.replace(/[\\n\\r]/g, \"\")\n if (sanitized) {\n this.insertText(sanitized)\n }\n }\n\n /**\n * Insert text - strip newlines and enforce maxLength\n */\n public override insertText(text: string): void {\n const sanitized = text.replace(/[\\n\\r]/g, \"\")\n if (!sanitized) return\n\n const currentLength = this.plainText.length\n const remaining = this._maxLength - currentLength\n if (remaining <= 0) return\n\n const toInsert = sanitized.substring(0, remaining)\n super.insertText(toInsert)\n this.emit(InputRenderableEvents.INPUT, this.plainText)\n }\n\n public get value(): string {\n return this.plainText\n }\n\n public set value(value: string) {\n const newValue = value.substring(0, this._maxLength).replace(/[\\n\\r]/g, \"\")\n const currentValue = this.plainText\n if (currentValue !== newValue) {\n this.setText(newValue)\n this.cursorOffset = newValue.length\n this.emit(InputRenderableEvents.INPUT, newValue)\n }\n }\n\n public override focus(): void {\n super.focus()\n this._lastCommittedValue = this.plainText\n }\n\n public override blur(): void {\n if (!this.isDestroyed) {\n const currentValue = this.plainText\n if (currentValue !== this._lastCommittedValue) {\n this._lastCommittedValue = currentValue\n this.emit(InputRenderableEvents.CHANGE, currentValue)\n }\n }\n super.blur()\n }\n\n public override submit(): boolean {\n const currentValue = this.plainText\n if (currentValue !== this._lastCommittedValue) {\n this._lastCommittedValue = currentValue\n this.emit(InputRenderableEvents.CHANGE, currentValue)\n }\n this.emit(InputRenderableEvents.ENTER, currentValue)\n return true\n }\n\n public override deleteCharBackward(): boolean {\n const result = super.deleteCharBackward()\n this.emit(InputRenderableEvents.INPUT, this.plainText)\n return result\n }\n\n public override deleteChar(): boolean {\n const result = super.deleteChar()\n this.emit(InputRenderableEvents.INPUT, this.plainText)\n return result\n }\n\n public deleteCharacter(direction: \"backward\" | \"forward\"): void {\n if (direction === \"backward\") {\n this.deleteCharBackward()\n } else {\n this.deleteChar()\n }\n }\n\n public set maxLength(maxLength: number) {\n this._maxLength = maxLength\n const currentValue = this.plainText\n if (currentValue.length > maxLength) {\n this.setText(currentValue.substring(0, maxLength))\n }\n }\n\n public get maxLength(): number {\n return this._maxLength\n }\n\n public override set placeholder(placeholder: string) {\n super.placeholder = placeholder\n }\n\n public override get placeholder(): string {\n const p = super.placeholder\n return typeof p === \"string\" ? p : \"\"\n }\n\n public override set initialValue(value: string) {\n void 0\n }\n}\n",
25
+ "import { Lexer, type MarkedToken } from \"marked\"\n\nexport interface ParseState {\n content: string\n tokens: MarkedToken[]\n}\n\n/**\n * Incrementally parse markdown, reusing unchanged tokens from previous parse.\n * Compares token.raw at each offset - matching tokens keep same object reference.\n */\nexport function parseMarkdownIncremental(\n newContent: string,\n prevState: ParseState | null,\n trailingUnstable: number = 2,\n): ParseState {\n if (!prevState || prevState.tokens.length === 0) {\n try {\n const tokens = Lexer.lex(newContent, { gfm: true }) as MarkedToken[]\n return { content: newContent, tokens }\n } catch {\n return { content: newContent, tokens: [] }\n }\n }\n\n // Find how many tokens from start are unchanged\n let offset = 0\n let reuseCount = 0\n\n for (const token of prevState.tokens) {\n const tokenEnd = offset + token.raw.length\n if (tokenEnd <= newContent.length && newContent.slice(offset, tokenEnd) === token.raw) {\n reuseCount++\n offset = tokenEnd\n } else {\n break\n }\n }\n\n // Keep last N tokens unstable (e.g. \"# Hello\" might become \"# Hello World\")\n reuseCount = Math.max(0, reuseCount - trailingUnstable)\n\n offset = 0\n for (let i = 0; i < reuseCount; i++) {\n offset += prevState.tokens[i].raw.length\n }\n\n const stableTokens = prevState.tokens.slice(0, reuseCount)\n const remainingContent = newContent.slice(offset)\n\n if (!remainingContent) {\n return { content: newContent, tokens: stableTokens }\n }\n\n try {\n const newTokens = Lexer.lex(remainingContent, { gfm: true }) as MarkedToken[]\n return { content: newContent, tokens: [...stableTokens, ...newTokens] }\n } catch {\n return { content: newContent, tokens: stableTokens }\n }\n}\n",
26
+ "import { Renderable, type RenderableOptions } from \"../Renderable\"\nimport { type RenderContext } from \"../types\"\nimport { SyntaxStyle, type StyleDefinition } from \"../syntax-style\"\nimport { StyledText } from \"../lib/styled-text\"\nimport type { TextChunk } from \"../text-buffer\"\nimport { createTextAttributes } from \"../utils\"\nimport { Lexer, type MarkedToken, type Token, type Tokens } from \"marked\"\nimport { TextRenderable } from \"./Text\"\nimport { CodeRenderable } from \"./Code\"\nimport { BoxRenderable } from \"./Box\"\nimport type { TreeSitterClient } from \"../lib/tree-sitter\"\nimport { parseMarkdownIncremental, type ParseState } from \"./markdown-parser\"\nimport type { OptimizedBuffer } from \"../buffer\"\n\nexport interface MarkdownOptions extends RenderableOptions<MarkdownRenderable> {\n content?: string\n syntaxStyle: SyntaxStyle\n conceal?: boolean\n treeSitterClient?: TreeSitterClient\n /**\n * Enable streaming mode for incremental content updates.\n * When true, trailing tokens are kept unstable to handle incomplete content.\n */\n streaming?: boolean\n /**\n * Custom node renderer. Return a Renderable to override default rendering,\n * or undefined/null to use default rendering.\n */\n renderNode?: (token: Token, context: RenderNodeContext) => Renderable | undefined | null\n}\n\nexport interface RenderNodeContext {\n syntaxStyle: SyntaxStyle\n conceal: boolean\n treeSitterClient?: TreeSitterClient\n /** Creates default renderable for this token */\n defaultRender: () => Renderable | null\n}\n\nexport interface BlockState {\n token: MarkedToken\n tokenRaw: string // Cache raw for comparison\n renderable: Renderable\n}\n\nexport type { ParseState }\n\nexport class MarkdownRenderable extends Renderable {\n private _content: string = \"\"\n private _syntaxStyle: SyntaxStyle\n private _conceal: boolean\n private _treeSitterClient?: TreeSitterClient\n private _renderNode?: MarkdownOptions[\"renderNode\"]\n\n _parseState: ParseState | null = null\n private _streaming: boolean = false\n _blockStates: BlockState[] = []\n private _styleDirty: boolean = false\n\n protected _contentDefaultOptions = {\n content: \"\",\n conceal: true,\n streaming: false,\n } satisfies Partial<MarkdownOptions>\n\n constructor(ctx: RenderContext, options: MarkdownOptions) {\n super(ctx, {\n ...options,\n flexDirection: \"column\",\n flexShrink: options.flexShrink ?? 0,\n })\n\n this._syntaxStyle = options.syntaxStyle\n this._conceal = options.conceal ?? this._contentDefaultOptions.conceal\n this._content = options.content ?? this._contentDefaultOptions.content\n this._treeSitterClient = options.treeSitterClient\n this._renderNode = options.renderNode\n this._streaming = options.streaming ?? this._contentDefaultOptions.streaming\n\n this.updateBlocks()\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.updateBlocks()\n this.requestRender()\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 // Mark dirty - actual re-render happens in renderSelf\n this._styleDirty = 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 // Mark dirty - actual re-render happens in renderSelf\n this._styleDirty = true\n }\n }\n\n get streaming(): boolean {\n return this._streaming\n }\n\n set streaming(value: boolean) {\n if (this._streaming !== value) {\n this._streaming = value\n // Don't clear parseState - incremental parser handles streaming correctly\n this.updateBlocks()\n this.requestRender()\n }\n }\n\n private getStyle(group: string): StyleDefinition | undefined {\n // The solid reconciler applies props via setters in JSX declaration order.\n // If `content` is set before `syntaxStyle`, updateBlocks() runs before\n // _syntaxStyle is initialized.\n if (!this._syntaxStyle) return undefined\n let style = this._syntaxStyle.getStyle(group)\n if (!style && group.includes(\".\")) {\n const baseName = group.split(\".\")[0]\n style = this._syntaxStyle.getStyle(baseName)\n }\n return style\n }\n\n private createChunk(text: string, group: string, link?: { url: string }): TextChunk {\n const style = this.getStyle(group) || this.getStyle(\"default\")\n return {\n __isChunk: true,\n text,\n fg: style?.fg,\n bg: style?.bg,\n attributes: style\n ? createTextAttributes({\n bold: style.bold,\n italic: style.italic,\n underline: style.underline,\n dim: style.dim,\n })\n : 0,\n link,\n }\n }\n\n private createDefaultChunk(text: string): TextChunk {\n return this.createChunk(text, \"default\")\n }\n\n private renderInlineContent(tokens: Token[], chunks: TextChunk[]): void {\n for (const token of tokens) {\n this.renderInlineToken(token as MarkedToken, chunks)\n }\n }\n\n private renderInlineToken(token: MarkedToken, chunks: TextChunk[]): void {\n switch (token.type) {\n case \"text\":\n chunks.push(this.createDefaultChunk(token.text))\n break\n\n case \"escape\":\n chunks.push(this.createDefaultChunk(token.text))\n break\n\n case \"codespan\":\n if (this._conceal) {\n chunks.push(this.createChunk(token.text, \"markup.raw\"))\n } else {\n chunks.push(this.createChunk(\"`\", \"markup.raw\"))\n chunks.push(this.createChunk(token.text, \"markup.raw\"))\n chunks.push(this.createChunk(\"`\", \"markup.raw\"))\n }\n break\n\n case \"strong\":\n if (!this._conceal) {\n chunks.push(this.createChunk(\"**\", \"markup.strong\"))\n }\n for (const child of token.tokens) {\n this.renderInlineTokenWithStyle(child as MarkedToken, chunks, \"markup.strong\")\n }\n if (!this._conceal) {\n chunks.push(this.createChunk(\"**\", \"markup.strong\"))\n }\n break\n\n case \"em\":\n if (!this._conceal) {\n chunks.push(this.createChunk(\"*\", \"markup.italic\"))\n }\n for (const child of token.tokens) {\n this.renderInlineTokenWithStyle(child as MarkedToken, chunks, \"markup.italic\")\n }\n if (!this._conceal) {\n chunks.push(this.createChunk(\"*\", \"markup.italic\"))\n }\n break\n\n case \"del\":\n if (!this._conceal) {\n chunks.push(this.createChunk(\"~~\", \"markup.strikethrough\"))\n }\n for (const child of token.tokens) {\n this.renderInlineTokenWithStyle(child as MarkedToken, chunks, \"markup.strikethrough\")\n }\n if (!this._conceal) {\n chunks.push(this.createChunk(\"~~\", \"markup.strikethrough\"))\n }\n break\n\n case \"link\": {\n const linkHref = { url: token.href }\n if (this._conceal) {\n for (const child of token.tokens) {\n this.renderInlineTokenWithStyle(child as MarkedToken, chunks, \"markup.link.label\", linkHref)\n }\n chunks.push(this.createChunk(\" (\", \"markup.link\", linkHref))\n chunks.push(this.createChunk(token.href, \"markup.link.url\", linkHref))\n chunks.push(this.createChunk(\")\", \"markup.link\", linkHref))\n } else {\n chunks.push(this.createChunk(\"[\", \"markup.link\", linkHref))\n for (const child of token.tokens) {\n this.renderInlineTokenWithStyle(child as MarkedToken, chunks, \"markup.link.label\", linkHref)\n }\n chunks.push(this.createChunk(\"](\", \"markup.link\", linkHref))\n chunks.push(this.createChunk(token.href, \"markup.link.url\", linkHref))\n chunks.push(this.createChunk(\")\", \"markup.link\", linkHref))\n }\n break\n }\n\n case \"image\": {\n const imageHref = { url: token.href }\n if (this._conceal) {\n chunks.push(this.createChunk(token.text || \"image\", \"markup.link.label\", imageHref))\n } else {\n chunks.push(this.createChunk(\"![\", \"markup.link\", imageHref))\n chunks.push(this.createChunk(token.text || \"\", \"markup.link.label\", imageHref))\n chunks.push(this.createChunk(\"](\", \"markup.link\", imageHref))\n chunks.push(this.createChunk(token.href, \"markup.link.url\", imageHref))\n chunks.push(this.createChunk(\")\", \"markup.link\", imageHref))\n }\n break\n }\n\n case \"br\":\n chunks.push(this.createDefaultChunk(\"\\n\"))\n break\n\n default:\n if (\"tokens\" in token && Array.isArray(token.tokens)) {\n this.renderInlineContent(token.tokens, chunks)\n } else if (\"text\" in token && typeof token.text === \"string\") {\n chunks.push(this.createDefaultChunk(token.text))\n }\n break\n }\n }\n\n private renderInlineTokenWithStyle(\n token: MarkedToken,\n chunks: TextChunk[],\n styleGroup: string,\n link?: { url: string },\n ): void {\n switch (token.type) {\n case \"text\":\n chunks.push(this.createChunk(token.text, styleGroup, link))\n break\n\n case \"escape\":\n chunks.push(this.createChunk(token.text, styleGroup, link))\n break\n\n case \"codespan\":\n if (this._conceal) {\n chunks.push(this.createChunk(token.text, \"markup.raw\", link))\n } else {\n chunks.push(this.createChunk(\"`\", \"markup.raw\", link))\n chunks.push(this.createChunk(token.text, \"markup.raw\", link))\n chunks.push(this.createChunk(\"`\", \"markup.raw\", link))\n }\n break\n\n default:\n this.renderInlineToken(token, chunks)\n break\n }\n }\n\n private renderHeadingChunks(token: Tokens.Heading): TextChunk[] {\n const chunks: TextChunk[] = []\n const group = `markup.heading.${token.depth}`\n const marker = \"#\".repeat(token.depth) + \" \"\n\n if (!this._conceal) {\n chunks.push(this.createChunk(marker, group))\n }\n\n for (const child of token.tokens) {\n this.renderInlineTokenWithStyle(child as MarkedToken, chunks, group)\n }\n\n return chunks\n }\n\n private renderParagraphChunks(token: Tokens.Paragraph): TextChunk[] {\n const chunks: TextChunk[] = []\n this.renderInlineContent(token.tokens, chunks)\n return chunks\n }\n\n private renderThematicBreakChunks(): TextChunk[] {\n return [this.createChunk(\"---\", \"punctuation.special\")]\n }\n\n private renderTokenToChunks(token: MarkedToken): TextChunk[] {\n switch (token.type) {\n case \"heading\":\n return this.renderHeadingChunks(token)\n case \"paragraph\":\n return this.renderParagraphChunks(token)\n case \"blockquote\":\n return []\n case \"hr\":\n return this.renderThematicBreakChunks()\n case \"space\":\n return []\n default:\n if (\"raw\" in token && token.raw) {\n return [this.createDefaultChunk(token.raw)]\n }\n return []\n }\n }\n\n private createBlockRenderable(token: MarkedToken, id: string, marginBottom: number): Renderable | null {\n if (token.type === \"code\") {\n return this.createCodeRenderable(token as Tokens.Code, id, marginBottom)\n }\n\n if (token.type === \"table\") {\n return this.createTableRenderable(token as Tokens.Table, id, marginBottom)\n }\n\n if (token.type === \"list\") {\n return this.createListRenderable(token as Tokens.List, id, marginBottom)\n }\n\n if (token.type === \"blockquote\") {\n return this.createBlockquoteRenderable(token as Tokens.Blockquote, id, marginBottom)\n }\n\n if (token.type === \"space\") {\n return this.createTextRenderable([this.createDefaultChunk(\" \")], id, marginBottom)\n }\n\n const chunks = this.renderTokenToChunks(token)\n if (chunks.length === 0) {\n return null\n }\n\n return this.createTextRenderable(chunks, id, marginBottom)\n }\n\n private createTextRenderable(chunks: TextChunk[], id: string, marginBottom: number = 0): TextRenderable {\n return new TextRenderable(this.ctx, {\n id,\n content: new StyledText(chunks),\n width: \"100%\",\n marginBottom,\n })\n }\n\n private createCodeRenderable(token: Tokens.Code, id: string, marginBottom: number = 0): Renderable {\n return new CodeRenderable(this.ctx, {\n id,\n content: token.text,\n filetype: token.lang || undefined,\n syntaxStyle: this._syntaxStyle,\n conceal: this._conceal,\n treeSitterClient: this._treeSitterClient,\n width: \"100%\",\n marginBottom,\n })\n }\n\n private createListRenderable(token: Tokens.List, id: string, marginBottom: number = 0): Renderable {\n const listBox = new BoxRenderable(this.ctx, {\n id,\n width: \"100%\",\n flexDirection: \"column\",\n marginBottom,\n })\n\n let index = typeof token.start === \"number\" ? token.start : 1\n const nestedIndent = 2\n\n for (let itemIndex = 0; itemIndex < token.items.length; itemIndex++) {\n const item = token.items[itemIndex]\n const itemId = `${id}-item-${itemIndex}`\n const itemBox = new BoxRenderable(this.ctx, {\n id: `${itemId}-box`,\n width: \"100%\",\n flexDirection: \"column\",\n })\n\n const markerText = token.ordered ? `${index++}. ` : \"- \"\n const lineChunks: TextChunk[] = [this.createChunk(markerText, \"markup.list\")]\n\n if (item.task) {\n const checked = \"checked\" in item ? Boolean(item.checked) : false\n lineChunks.push(this.createChunk(`${checked ? \"[x]\" : \"[ ]\"} `, \"markup.list\"))\n }\n\n let inlineRendered = false\n const remainingTokens: MarkedToken[] = []\n\n for (const child of item.tokens) {\n if (child.type === \"checkbox\") {\n continue\n }\n\n if (child.type === \"space\") {\n continue\n }\n\n if (!inlineRendered && child.type === \"text\" && \"tokens\" in child && child.tokens) {\n this.renderInlineContent(child.tokens, lineChunks)\n inlineRendered = true\n continue\n }\n\n if (!inlineRendered && child.type === \"paragraph\") {\n this.renderInlineContent((child as Tokens.Paragraph).tokens, lineChunks)\n inlineRendered = true\n continue\n }\n\n remainingTokens.push(child as MarkedToken)\n }\n\n const lineRenderable = new TextRenderable(this.ctx, {\n id: `${itemId}-line`,\n content: new StyledText(lineChunks),\n width: \"100%\",\n })\n itemBox.add(lineRenderable)\n\n let childIndex = 0\n for (const child of remainingTokens) {\n const childId = `${itemId}-child-${childIndex}`\n childIndex++\n const childRenderable = this.createBlockRenderable(child as MarkedToken, childId, 0)\n if (childRenderable) {\n childRenderable.marginLeft = nestedIndent\n itemBox.add(childRenderable)\n }\n }\n\n listBox.add(itemBox)\n }\n\n return listBox\n }\n\n /**\n * Update an existing table renderable in-place for style/conceal changes.\n * Much faster than rebuilding the entire table structure.\n */\n private updateTableRenderable(tableBox: Renderable, table: Tokens.Table, marginBottom: number): void {\n tableBox.marginBottom = marginBottom\n const borderColor = this.getStyle(\"conceal\")?.fg ?? \"#888888\"\n const headingStyle = this.getStyle(\"markup.heading\") || this.getStyle(\"default\")\n\n const rowsToRender = this.getTableRowsToRender(table)\n const colCount = table.header.length\n\n // Traverse existing table structure: tableBox -> columnBoxes -> cells\n const columns = (tableBox as any)._childrenInLayoutOrder as Renderable[]\n for (let col = 0; col < colCount; col++) {\n const columnBox = columns[col]\n if (!columnBox) continue\n\n // Update column border colors\n if (columnBox instanceof BoxRenderable) {\n columnBox.borderColor = borderColor\n }\n\n const columnChildren = (columnBox as any)._childrenInLayoutOrder as Renderable[]\n\n // Update header (first child of column)\n const headerBox = columnChildren[0]\n if (headerBox instanceof BoxRenderable) {\n headerBox.borderColor = borderColor\n const headerChildren = (headerBox as any)._childrenInLayoutOrder as Renderable[]\n const headerText = headerChildren[0]\n if (headerText instanceof TextRenderable) {\n const headerCell = table.header[col]\n const headerChunks: TextChunk[] = []\n this.renderInlineContent(headerCell.tokens, headerChunks)\n const styledHeaderChunks = headerChunks.map((chunk) => ({\n ...chunk,\n fg: headingStyle?.fg ?? chunk.fg,\n bg: headingStyle?.bg ?? chunk.bg,\n attributes: headingStyle\n ? createTextAttributes({\n bold: headingStyle.bold,\n italic: headingStyle.italic,\n underline: headingStyle.underline,\n dim: headingStyle.dim,\n })\n : chunk.attributes,\n }))\n headerText.content = new StyledText(styledHeaderChunks)\n }\n }\n\n // Update data rows (remaining children)\n for (let row = 0; row < rowsToRender.length; row++) {\n const childIndex = row + 1 // +1 because header is first child\n const cellContainer = columnChildren[childIndex]\n\n let cellText: TextRenderable | undefined\n if (cellContainer instanceof BoxRenderable) {\n // Cell has a border box wrapper\n cellContainer.borderColor = borderColor\n const cellChildren = (cellContainer as any)._childrenInLayoutOrder as Renderable[]\n cellText = cellChildren[0] as TextRenderable\n } else if (cellContainer instanceof TextRenderable) {\n // Last row, no border box\n cellText = cellContainer\n }\n\n if (cellText) {\n const cell = rowsToRender[row][col]\n const cellChunks: TextChunk[] = []\n if (cell) {\n this.renderInlineContent(cell.tokens, cellChunks)\n }\n cellText.content = new StyledText(cellChunks.length > 0 ? cellChunks : [this.createDefaultChunk(\" \")])\n }\n }\n }\n }\n\n private createTableRenderable(table: Tokens.Table, id: string, marginBottom: number = 0): Renderable {\n const colCount = table.header.length\n\n const rowsToRender = this.getTableRowsToRender(table)\n\n if (colCount === 0 || rowsToRender.length === 0) {\n return this.createTextRenderable([this.createDefaultChunk(table.raw)], id, marginBottom)\n }\n\n const tableBox = new BoxRenderable(this.ctx, {\n id,\n flexDirection: \"row\",\n marginBottom,\n })\n\n const borderColor = this.getStyle(\"conceal\")?.fg ?? \"#888888\"\n\n for (let col = 0; col < colCount; col++) {\n const isFirstCol = col === 0\n const isLastCol = col === colCount - 1\n\n const columnBox = new BoxRenderable(this.ctx, {\n id: `${id}-col-${col}`,\n flexDirection: \"column\",\n border: isLastCol ? true : [\"top\", \"bottom\", \"left\"],\n borderColor,\n // Use T-joins for non-first columns to connect with previous column\n customBorderChars: isFirstCol\n ? undefined\n : {\n topLeft: \"┬\",\n topRight: \"┐\",\n bottomLeft: \"┴\",\n bottomRight: \"┘\",\n horizontal: \"─\",\n vertical: \"│\",\n topT: \"┬\",\n bottomT: \"┴\",\n leftT: \"├\",\n rightT: \"┤\",\n cross: \"┼\",\n },\n })\n\n const headerCell = table.header[col]\n const headerChunks: TextChunk[] = []\n this.renderInlineContent(headerCell.tokens, headerChunks)\n const headingStyle = this.getStyle(\"markup.heading\") || this.getStyle(\"default\")\n const styledHeaderChunks = headerChunks.map((chunk) => ({\n ...chunk,\n fg: headingStyle?.fg ?? chunk.fg,\n bg: headingStyle?.bg ?? chunk.bg,\n attributes: headingStyle\n ? createTextAttributes({\n bold: headingStyle.bold,\n italic: headingStyle.italic,\n underline: headingStyle.underline,\n dim: headingStyle.dim,\n })\n : chunk.attributes,\n }))\n\n const headerBox = new BoxRenderable(this.ctx, {\n id: `${id}-col-${col}-header-box`,\n border: [\"bottom\"],\n borderColor,\n })\n headerBox.add(\n new TextRenderable(this.ctx, {\n id: `${id}-col-${col}-header`,\n content: new StyledText(styledHeaderChunks),\n height: 1,\n overflow: \"hidden\",\n paddingLeft: 1,\n paddingRight: 1,\n }),\n )\n columnBox.add(headerBox)\n\n for (let row = 0; row < rowsToRender.length; row++) {\n const cell = rowsToRender[row][col]\n const cellChunks: TextChunk[] = []\n if (cell) {\n this.renderInlineContent(cell.tokens, cellChunks)\n }\n\n const isLastRow = row === rowsToRender.length - 1\n const cellText = new TextRenderable(this.ctx, {\n id: `${id}-col-${col}-row-${row}`,\n content: new StyledText(cellChunks.length > 0 ? cellChunks : [this.createDefaultChunk(\" \")]),\n height: 1,\n overflow: \"hidden\",\n paddingLeft: 1,\n paddingRight: 1,\n })\n\n if (isLastRow) {\n columnBox.add(cellText)\n } else {\n const cellBox = new BoxRenderable(this.ctx, {\n id: `${id}-col-${col}-row-${row}-box`,\n border: [\"bottom\"],\n borderColor,\n })\n cellBox.add(cellText)\n columnBox.add(cellBox)\n }\n }\n\n tableBox.add(columnBox)\n }\n\n return tableBox\n }\n\n private getBlockMarginBottom(hasNextToken: boolean): number {\n return hasNextToken ? 1 : 0\n }\n\n private getTableRowsToRender(table: Tokens.Table): Tokens.Table[\"rows\"] {\n if (!this._streaming) {\n return table.rows\n }\n if (table.rows.length === 0) {\n return table.rows\n }\n if (table.raw.endsWith(\"\\n\")) {\n return table.rows\n }\n return table.rows.slice(0, -1)\n }\n\n private getTableRenderableRowCount(table: Tokens.Table): number {\n return this.getTableRowsToRender(table).length\n }\n\n private createBlockquoteRenderable(token: Tokens.Blockquote, id: string, marginBottom: number): Renderable {\n const borderChars = {\n topLeft: \"\",\n topRight: \"\",\n bottomLeft: \"\",\n bottomRight: \"\",\n horizontal: \"\",\n vertical: \">\",\n topT: \"\",\n bottomT: \"\",\n leftT: \"\",\n rightT: \"\",\n cross: \"\",\n }\n const borderColor = this.getStyle(\"punctuation.special\")?.fg\n\n const box = new BoxRenderable(this.ctx, {\n id,\n width: \"100%\",\n flexDirection: \"column\",\n marginBottom,\n border: [\"left\"],\n customBorderChars: borderChars,\n borderColor: borderColor ?? \"#FFFFFF\",\n paddingLeft: 1,\n })\n\n this.addBlockquoteChildren(box, token, id)\n\n return box\n }\n\n private addBlockquoteChildren(box: BoxRenderable, token: Tokens.Blockquote, id: string): void {\n const childTokens = token.tokens as MarkedToken[]\n for (let i = 0; i < childTokens.length; i++) {\n const child = childTokens[i]\n const childId = `${id}-child-${i}`\n const childRenderable = this.createBlockRenderable(child, childId, 0)\n if (childRenderable) {\n box.add(childRenderable)\n }\n }\n }\n\n private updateBlockquoteRenderable(\n box: BoxRenderable,\n token: Tokens.Blockquote,\n id: string,\n marginBottom: number,\n ): void {\n box.marginBottom = marginBottom\n const borderColor = this.getStyle(\"punctuation.special\")?.fg\n if (borderColor) {\n box.borderColor = borderColor\n }\n\n const children = box.getChildren() as Renderable[]\n for (const child of children) {\n box.remove(child.id)\n }\n\n this.addBlockquoteChildren(box, token, id)\n }\n\n private createDefaultRenderable(token: MarkedToken, index: number, hasNextToken: boolean = false): Renderable | null {\n const id = `${this.id}-block-${index}`\n const marginBottom = this.getBlockMarginBottom(hasNextToken)\n\n const renderable = this.createBlockRenderable(token, id, marginBottom)\n if (!renderable || token.type === \"space\") {\n return null\n }\n\n return renderable\n }\n\n private updateBlockRenderable(state: BlockState, token: MarkedToken, index: number, hasNextToken: boolean): void {\n const marginBottom = this.getBlockMarginBottom(hasNextToken)\n\n if (token.type === \"code\") {\n const codeRenderable = state.renderable as CodeRenderable\n const codeToken = token as Tokens.Code\n codeRenderable.content = codeToken.text\n if (codeToken.lang) {\n codeRenderable.filetype = codeToken.lang\n }\n codeRenderable.marginBottom = marginBottom\n return\n }\n\n if (token.type === \"table\") {\n const prevTable = state.token as Tokens.Table\n const newTable = token as Tokens.Table\n\n // During streaming, only rebuild when complete row count changes (skip incomplete last row)\n if (this._streaming) {\n const prevCompleteRows = this.getTableRenderableRowCount(prevTable)\n const newCompleteRows = this.getTableRenderableRowCount(newTable)\n\n // Check if both previous and new are in raw fallback mode (no complete rows to render)\n const prevIsRawFallback = prevTable.header.length === 0 || prevCompleteRows === 0\n const newIsRawFallback = newTable.header.length === 0 || newCompleteRows === 0\n\n if (prevCompleteRows === newCompleteRows && prevTable.header.length === newTable.header.length) {\n // If both are in raw fallback mode and the raw content changed, update the TextRenderable\n if (prevIsRawFallback && newIsRawFallback && prevTable.raw !== newTable.raw) {\n const textRenderable = state.renderable as TextRenderable\n textRenderable.content = new StyledText([this.createDefaultChunk(newTable.raw)])\n textRenderable.marginBottom = marginBottom\n }\n return\n }\n }\n\n this.remove(state.renderable.id)\n const newRenderable = this.createTableRenderable(newTable, `${this.id}-block-${index}`, marginBottom)\n this.add(newRenderable)\n state.renderable = newRenderable\n return\n }\n\n if (token.type === \"list\") {\n const nextRenderable = this._blockStates[index + 1]?.renderable\n this.remove(state.renderable.id)\n const newRenderable = this.createListRenderable(token as Tokens.List, `${this.id}-block-${index}`, marginBottom)\n if (nextRenderable) {\n this.insertBefore(newRenderable, nextRenderable)\n } else {\n this.add(newRenderable)\n }\n state.renderable = newRenderable\n return\n }\n\n if (token.type === \"blockquote\") {\n this.updateBlockquoteRenderable(\n state.renderable as BoxRenderable,\n token as Tokens.Blockquote,\n `${this.id}-block-${index}`,\n marginBottom,\n )\n return\n }\n\n // Text-based renderables (paragraph, heading, list, hr)\n const textRenderable = state.renderable as TextRenderable\n const chunks = this.renderTokenToChunks(token)\n textRenderable.content = new StyledText(chunks)\n textRenderable.marginBottom = marginBottom\n }\n\n private updateBlocks(): void {\n if (!this._content) {\n for (const state of this._blockStates) {\n this.remove(state.renderable.id)\n }\n this._blockStates = []\n this._parseState = null\n return\n }\n\n const trailingUnstable = this._streaming ? 2 : 0\n this._parseState = parseMarkdownIncremental(this._content, this._parseState, trailingUnstable)\n\n const tokens = this._parseState.tokens\n\n // Parse failure fallback\n if (tokens.length === 0 && this._content.length > 0) {\n for (const state of this._blockStates) {\n this.remove(state.renderable.id)\n }\n const text = this.createTextRenderable([this.createDefaultChunk(this._content)], `${this.id}-fallback`)\n this.add(text)\n this._blockStates = [\n {\n token: { type: \"text\", raw: this._content, text: this._content } as MarkedToken,\n tokenRaw: this._content,\n renderable: text,\n },\n ]\n return\n }\n\n const blockTokens: Array<{ token: MarkedToken; originalIndex: number }> = []\n for (let i = 0; i < tokens.length; i++) {\n if (tokens[i].type !== \"space\") {\n blockTokens.push({ token: tokens[i], originalIndex: i })\n }\n }\n\n const lastBlockIndex = blockTokens.length - 1\n\n let blockIndex = 0\n for (let i = 0; i < blockTokens.length; i++) {\n const { token } = blockTokens[i]\n const hasNextToken = i < lastBlockIndex\n const existing = this._blockStates[blockIndex]\n const marginBottom = this.getBlockMarginBottom(hasNextToken)\n\n // Same token object reference means unchanged\n if (existing && existing.token === token) {\n existing.renderable.marginBottom = marginBottom\n blockIndex++\n continue\n }\n\n // Same content, update reference\n if (existing && existing.tokenRaw === token.raw && existing.token.type === token.type) {\n existing.token = token\n existing.renderable.marginBottom = marginBottom\n blockIndex++\n continue\n }\n\n // Same type, different content - update in place\n if (existing && existing.token.type === token.type) {\n this.updateBlockRenderable(existing, token, blockIndex, hasNextToken)\n existing.token = token\n existing.tokenRaw = token.raw\n blockIndex++\n continue\n }\n\n // Different type or new block\n if (existing) {\n this.remove(existing.renderable.id)\n }\n\n let renderable: Renderable | undefined\n\n if (this._renderNode) {\n const context: RenderNodeContext = {\n syntaxStyle: this._syntaxStyle,\n conceal: this._conceal,\n treeSitterClient: this._treeSitterClient,\n defaultRender: () => this.createDefaultRenderable(token, blockIndex, hasNextToken),\n }\n const custom = this._renderNode(token, context)\n if (custom) {\n renderable = custom\n }\n }\n\n if (!renderable) {\n renderable = this.createDefaultRenderable(token, blockIndex, hasNextToken) ?? undefined\n }\n\n if (renderable) {\n this.add(renderable)\n this._blockStates[blockIndex] = {\n token,\n tokenRaw: token.raw,\n renderable,\n }\n }\n blockIndex++\n }\n\n while (this._blockStates.length > blockIndex) {\n const removed = this._blockStates.pop()!\n this.remove(removed.renderable.id)\n }\n }\n\n private clearBlockStates(): void {\n for (const state of this._blockStates) {\n this.remove(state.renderable.id)\n }\n this._blockStates = []\n }\n\n /**\n * Re-render existing blocks without rebuilding the parse state or block structure.\n * Used when only style/conceal changes - much faster than full rebuild.\n */\n private rerenderBlocks(): void {\n for (let i = 0; i < this._blockStates.length; i++) {\n const state = this._blockStates[i]\n const hasNextToken = i < this._blockStates.length - 1\n\n if (state.token.type === \"code\") {\n // CodeRenderable handles style/conceal changes efficiently\n const codeRenderable = state.renderable as CodeRenderable\n codeRenderable.syntaxStyle = this._syntaxStyle\n codeRenderable.conceal = this._conceal\n } else if (state.token.type === \"table\") {\n // Tables - update in place for better performance\n const marginBottom = hasNextToken ? 1 : 0\n this.updateTableRenderable(state.renderable, state.token as Tokens.Table, marginBottom)\n } else if (state.token.type === \"list\") {\n const nextRenderable = this._blockStates[i + 1]?.renderable\n this.remove(state.renderable.id)\n const newRenderable = this.createListRenderable(\n state.token as Tokens.List,\n `${this.id}-block-${i}`,\n this.getBlockMarginBottom(hasNextToken),\n )\n if (nextRenderable) {\n this.insertBefore(newRenderable, nextRenderable)\n } else {\n this.add(newRenderable)\n }\n state.renderable = newRenderable\n } else {\n // TextRenderable blocks - regenerate chunks with new style/conceal\n if (state.token.type === \"blockquote\") {\n const nextRenderable = this._blockStates[i + 1]?.renderable\n this.remove(state.renderable.id)\n const newRenderable = this.createBlockquoteRenderable(\n state.token as Tokens.Blockquote,\n `${this.id}-block-${i}`,\n this.getBlockMarginBottom(hasNextToken),\n )\n if (nextRenderable) {\n this.insertBefore(newRenderable, nextRenderable)\n } else {\n this.add(newRenderable)\n }\n state.renderable = newRenderable\n } else {\n const textRenderable = state.renderable as TextRenderable\n const chunks = this.renderTokenToChunks(state.token)\n if (chunks.length > 0) {\n textRenderable.content = new StyledText(chunks)\n }\n }\n }\n }\n }\n\n public clearCache(): void {\n this._parseState = null\n this.clearBlockStates()\n this.updateBlocks()\n this.requestRender()\n }\n\n protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {\n // Check if style/conceal changed - re-render blocks before rendering\n if (this._styleDirty) {\n this._styleDirty = false\n this.rerenderBlocks()\n }\n super.renderSelf(buffer, deltaTime)\n }\n}\n",
27
+ "import {\n type ColorInput,\n OptimizedBuffer,\n parseColor,\n Renderable,\n type RenderableOptions,\n type RenderContext,\n RGBA,\n} from \"../index\"\n\nconst defaultThumbBackgroundColor = RGBA.fromHex(\"#9a9ea3\")\nconst defaultTrackBackgroundColor = RGBA.fromHex(\"#252527\")\n\nexport interface SliderOptions extends RenderableOptions<SliderRenderable> {\n orientation: \"vertical\" | \"horizontal\"\n value?: number\n min?: number\n max?: number\n viewPortSize?: number\n backgroundColor?: ColorInput\n foregroundColor?: ColorInput\n onChange?: (value: number) => void\n}\n\nexport class SliderRenderable extends Renderable {\n public readonly orientation: \"vertical\" | \"horizontal\"\n private _value: number\n private _min: number\n private _max: number\n private _viewPortSize: number\n private _backgroundColor: RGBA\n private _foregroundColor: RGBA\n private _onChange?: (value: number) => void\n\n constructor(ctx: RenderContext, options: SliderOptions) {\n super(ctx, { flexShrink: 0, ...options })\n this.orientation = options.orientation\n this._min = options.min ?? 0\n this._max = options.max ?? 100\n this._value = options.value ?? this._min\n this._viewPortSize = options.viewPortSize ?? Math.max(1, (this._max - this._min) * 0.1)\n this._onChange = options.onChange\n this._backgroundColor = options.backgroundColor ? parseColor(options.backgroundColor) : defaultTrackBackgroundColor\n this._foregroundColor = options.foregroundColor ? parseColor(options.foregroundColor) : defaultThumbBackgroundColor\n\n this.setupMouseHandling()\n }\n\n get value(): number {\n return this._value\n }\n\n set value(newValue: number) {\n const clamped = Math.max(this._min, Math.min(this._max, newValue))\n if (clamped !== this._value) {\n this._value = clamped\n this._onChange?.(clamped)\n this.emit(\"change\", { value: clamped })\n this.requestRender()\n }\n }\n\n get min(): number {\n return this._min\n }\n\n set min(newMin: number) {\n if (newMin !== this._min) {\n this._min = newMin\n if (this._value < newMin) {\n this.value = newMin\n }\n this.requestRender()\n }\n }\n\n get max(): number {\n return this._max\n }\n\n set max(newMax: number) {\n if (newMax !== this._max) {\n this._max = newMax\n if (this._value > newMax) {\n this.value = newMax\n }\n this.requestRender()\n }\n }\n\n set viewPortSize(size: number) {\n const clampedSize = Math.max(0.01, Math.min(size, this._max - this._min))\n if (clampedSize !== this._viewPortSize) {\n this._viewPortSize = clampedSize\n this.requestRender()\n }\n }\n\n get viewPortSize(): number {\n return this._viewPortSize\n }\n\n get backgroundColor(): RGBA {\n return this._backgroundColor\n }\n\n set backgroundColor(value: ColorInput) {\n this._backgroundColor = parseColor(value)\n this.requestRender()\n }\n\n get foregroundColor(): RGBA {\n return this._foregroundColor\n }\n\n set foregroundColor(value: ColorInput) {\n this._foregroundColor = parseColor(value)\n this.requestRender()\n }\n\n private calculateDragOffsetVirtual(event: any): number {\n const trackStart = this.orientation === \"vertical\" ? this.y : this.x\n const mousePos = (this.orientation === \"vertical\" ? event.y : event.x) - trackStart\n const virtualMousePos = Math.max(\n 0,\n Math.min((this.orientation === \"vertical\" ? this.height : this.width) * 2, mousePos * 2),\n )\n const virtualThumbStart = this.getVirtualThumbStart()\n const virtualThumbSize = this.getVirtualThumbSize()\n\n return Math.max(0, Math.min(virtualThumbSize, virtualMousePos - virtualThumbStart))\n }\n\n private setupMouseHandling(): void {\n let isDragging = false\n let dragOffsetVirtual = 0\n\n this.onMouseDown = (event) => {\n event.stopPropagation()\n event.preventDefault()\n\n const thumb = this.getThumbRect()\n const inThumb =\n event.x >= thumb.x && event.x < thumb.x + thumb.width && event.y >= thumb.y && event.y < thumb.y + thumb.height\n\n if (inThumb) {\n isDragging = true\n\n dragOffsetVirtual = this.calculateDragOffsetVirtual(event)\n } else {\n this.updateValueFromMouseDirect(event)\n isDragging = true\n\n dragOffsetVirtual = this.calculateDragOffsetVirtual(event)\n }\n }\n\n this.onMouseDrag = (event) => {\n if (!isDragging) return\n event.stopPropagation()\n this.updateValueFromMouseWithOffset(event, dragOffsetVirtual)\n }\n\n this.onMouseUp = (event) => {\n if (isDragging) {\n this.updateValueFromMouseWithOffset(event, dragOffsetVirtual)\n }\n isDragging = false\n }\n }\n\n private updateValueFromMouseDirect(event: any): void {\n const trackStart = this.orientation === \"vertical\" ? this.y : this.x\n const trackSize = this.orientation === \"vertical\" ? this.height : this.width\n const mousePos = this.orientation === \"vertical\" ? event.y : event.x\n\n const relativeMousePos = mousePos - trackStart\n const clampedMousePos = Math.max(0, Math.min(trackSize, relativeMousePos))\n const ratio = trackSize === 0 ? 0 : clampedMousePos / trackSize\n const range = this._max - this._min\n const newValue = this._min + ratio * range\n\n this.value = newValue\n }\n\n private updateValueFromMouseWithOffset(event: any, offsetVirtual: number): void {\n const trackStart = this.orientation === \"vertical\" ? this.y : this.x\n const trackSize = this.orientation === \"vertical\" ? this.height : this.width\n const mousePos = this.orientation === \"vertical\" ? event.y : event.x\n\n const virtualTrackSize = trackSize * 2\n const relativeMousePos = mousePos - trackStart\n const clampedMousePos = Math.max(0, Math.min(trackSize, relativeMousePos))\n const virtualMousePos = clampedMousePos * 2\n\n const virtualThumbSize = this.getVirtualThumbSize()\n const maxThumbStart = Math.max(0, virtualTrackSize - virtualThumbSize)\n\n let desiredThumbStart = virtualMousePos - offsetVirtual\n desiredThumbStart = Math.max(0, Math.min(maxThumbStart, desiredThumbStart))\n\n const ratio = maxThumbStart === 0 ? 0 : desiredThumbStart / maxThumbStart\n const range = this._max - this._min\n const newValue = this._min + ratio * range\n\n this.value = newValue\n }\n\n private getThumbRect(): { x: number; y: number; width: number; height: number } {\n const virtualThumbSize = this.getVirtualThumbSize()\n const virtualThumbStart = this.getVirtualThumbStart()\n\n const realThumbStart = Math.floor(virtualThumbStart / 2)\n const realThumbSize = Math.ceil((virtualThumbStart + virtualThumbSize) / 2) - realThumbStart\n\n if (this.orientation === \"vertical\") {\n return {\n x: this.x,\n y: this.y + realThumbStart,\n width: this.width,\n height: Math.max(1, realThumbSize),\n }\n } else {\n return {\n x: this.x + realThumbStart,\n y: this.y,\n width: Math.max(1, realThumbSize),\n height: this.height,\n }\n }\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n if (this.orientation === \"horizontal\") {\n this.renderHorizontal(buffer)\n } else {\n this.renderVertical(buffer)\n }\n }\n\n private renderHorizontal(buffer: OptimizedBuffer): void {\n const virtualThumbSize = this.getVirtualThumbSize()\n const virtualThumbStart = this.getVirtualThumbStart()\n const virtualThumbEnd = virtualThumbStart + virtualThumbSize\n\n buffer.fillRect(this.x, this.y, this.width, this.height, this._backgroundColor)\n\n const realStartCell = Math.floor(virtualThumbStart / 2)\n const realEndCell = Math.ceil(virtualThumbEnd / 2) - 1\n const startX = Math.max(0, realStartCell)\n const endX = Math.min(this.width - 1, realEndCell)\n\n for (let realX = startX; realX <= endX; realX++) {\n const virtualCellStart = realX * 2\n const virtualCellEnd = virtualCellStart + 2\n\n const thumbStartInCell = Math.max(virtualThumbStart, virtualCellStart)\n const thumbEndInCell = Math.min(virtualThumbEnd, virtualCellEnd)\n const coverage = thumbEndInCell - thumbStartInCell\n\n let char = \" \"\n\n if (coverage >= 2) {\n char = \"█\"\n } else {\n const isLeftHalf = thumbStartInCell === virtualCellStart\n if (isLeftHalf) {\n char = \"▌\"\n } else {\n char = \"▐\"\n }\n }\n\n for (let y = 0; y < this.height; y++) {\n buffer.setCellWithAlphaBlending(this.x + realX, this.y + y, char, this._foregroundColor, this._backgroundColor)\n }\n }\n }\n\n private renderVertical(buffer: OptimizedBuffer): void {\n const virtualThumbSize = this.getVirtualThumbSize()\n const virtualThumbStart = this.getVirtualThumbStart()\n const virtualThumbEnd = virtualThumbStart + virtualThumbSize\n\n buffer.fillRect(this.x, this.y, this.width, this.height, this._backgroundColor)\n\n const realStartCell = Math.floor(virtualThumbStart / 2)\n const realEndCell = Math.ceil(virtualThumbEnd / 2) - 1\n const startY = Math.max(0, realStartCell)\n const endY = Math.min(this.height - 1, realEndCell)\n\n for (let realY = startY; realY <= endY; realY++) {\n const virtualCellStart = realY * 2\n const virtualCellEnd = virtualCellStart + 2\n\n const thumbStartInCell = Math.max(virtualThumbStart, virtualCellStart)\n const thumbEndInCell = Math.min(virtualThumbEnd, virtualCellEnd)\n const coverage = thumbEndInCell - thumbStartInCell\n\n let char = \" \"\n\n if (coverage >= 2) {\n char = \"█\"\n } else if (coverage > 0) {\n const virtualPositionInCell = thumbStartInCell - virtualCellStart\n if (virtualPositionInCell === 0) {\n char = \"▀\"\n } else {\n char = \"▄\"\n }\n }\n\n for (let x = 0; x < this.width; x++) {\n buffer.setCellWithAlphaBlending(this.x + x, this.y + realY, char, this._foregroundColor, this._backgroundColor)\n }\n }\n }\n\n private getVirtualThumbSize(): number {\n const virtualTrackSize = this.orientation === \"vertical\" ? this.height * 2 : this.width * 2\n const range = this._max - this._min\n\n if (range === 0) return virtualTrackSize\n\n const viewportSize = Math.max(1, this._viewPortSize)\n const contentSize = range + viewportSize\n\n if (contentSize <= viewportSize) return virtualTrackSize\n\n const thumbRatio = viewportSize / contentSize\n const calculatedSize = Math.floor(virtualTrackSize * thumbRatio)\n\n return Math.max(1, Math.min(calculatedSize, virtualTrackSize))\n }\n\n private getVirtualThumbStart(): number {\n const virtualTrackSize = this.orientation === \"vertical\" ? this.height * 2 : this.width * 2\n const range = this._max - this._min\n\n if (range === 0) return 0\n\n const valueRatio = (this._value - this._min) / range\n const virtualThumbSize = this.getVirtualThumbSize()\n\n return Math.round(valueRatio * (virtualTrackSize - virtualThumbSize))\n }\n}\n",
28
+ "import type { OptimizedBuffer } from \"../buffer\"\nimport { parseColor, RGBA, type ColorInput } from \"../lib\"\nimport type { KeyEvent } from \"../lib/KeyHandler\"\nimport { Renderable, type RenderableOptions } from \"../Renderable\"\nimport type { RenderContext, Timeout } from \"../types\"\nimport { type BoxOptions } from \"./Box\"\nimport { SliderRenderable, type SliderOptions } from \"./Slider\"\n\nexport interface ScrollBarOptions extends RenderableOptions<ScrollBarRenderable> {\n orientation: \"vertical\" | \"horizontal\"\n showArrows?: boolean\n arrowOptions?: Omit<ArrowOptions, \"direction\">\n trackOptions?: Partial<SliderOptions>\n onChange?: (position: number) => void\n}\n\nexport type ScrollUnit = \"absolute\" | \"viewport\" | \"content\" | \"step\"\n\nexport class ScrollBarRenderable extends Renderable {\n public readonly slider: SliderRenderable\n public readonly startArrow: ArrowRenderable\n public readonly endArrow: ArrowRenderable\n public readonly orientation: \"vertical\" | \"horizontal\"\n\n protected _focusable: boolean = true\n\n private _scrollSize = 0\n private _scrollPosition = 0\n private _viewportSize = 0\n private _showArrows = false\n private _manualVisibility = false\n\n private _onChange: ((position: number) => void) | undefined\n\n scrollStep: number | undefined | null = null\n\n get visible(): boolean {\n return super.visible\n }\n\n set visible(value: boolean) {\n this._manualVisibility = true\n super.visible = value\n }\n\n public resetVisibilityControl(): void {\n this._manualVisibility = false\n this.recalculateVisibility()\n }\n\n get scrollSize(): number {\n return this._scrollSize\n }\n\n get scrollPosition(): number {\n return this._scrollPosition\n }\n\n get viewportSize(): number {\n return this._viewportSize\n }\n\n set scrollSize(value: number) {\n if (value === this.scrollSize) return\n this._scrollSize = value\n this.recalculateVisibility()\n this.updateSliderFromScrollState()\n this.scrollPosition = this.scrollPosition\n }\n\n set scrollPosition(value: number) {\n const newPosition = Math.round(Math.min(Math.max(0, value), this.scrollSize - this.viewportSize))\n if (newPosition !== this._scrollPosition) {\n this._scrollPosition = newPosition\n this.updateSliderFromScrollState()\n // Events are triggered by the slider change event\n // this._onChange?.(newPosition)\n // this.emit(\"change\", { position: newPosition })\n }\n }\n\n set viewportSize(value: number) {\n if (value === this.viewportSize) return\n this._viewportSize = value\n this.slider.viewPortSize = Math.max(1, this._viewportSize)\n this.recalculateVisibility()\n this.updateSliderFromScrollState()\n this.scrollPosition = this.scrollPosition\n }\n\n get showArrows(): boolean {\n return this._showArrows\n }\n\n set showArrows(value: boolean) {\n if (value === this._showArrows) return\n this._showArrows = value\n this.startArrow.visible = value\n this.endArrow.visible = value\n }\n\n constructor(\n ctx: RenderContext,\n { trackOptions, arrowOptions, orientation, showArrows = false, ...options }: ScrollBarOptions,\n ) {\n super(ctx, {\n flexDirection: orientation === \"vertical\" ? \"column\" : \"row\",\n alignSelf: \"stretch\",\n alignItems: \"stretch\",\n ...(options as BoxOptions),\n })\n\n this._onChange = options.onChange\n\n this.orientation = orientation\n this._showArrows = showArrows\n\n const scrollRange = Math.max(0, this._scrollSize - this._viewportSize)\n\n const defaultStepSize = Math.max(1, this._viewportSize)\n const stepSize = trackOptions?.viewPortSize ?? defaultStepSize\n\n this.slider = new SliderRenderable(ctx, {\n orientation,\n min: 0,\n max: scrollRange,\n value: this._scrollPosition,\n viewPortSize: stepSize,\n onChange: (value) => {\n this._scrollPosition = Math.round(value)\n this._onChange?.(this._scrollPosition)\n this.emit(\"change\", { position: this._scrollPosition })\n },\n ...(orientation === \"vertical\"\n ? {\n width: Math.max(1, Math.min(2, this.width)),\n height: \"100%\",\n marginLeft: \"auto\",\n }\n : {\n width: \"100%\",\n height: 1,\n marginTop: \"auto\",\n }),\n flexGrow: 1,\n flexShrink: 1,\n ...trackOptions,\n })\n\n this.updateSliderFromScrollState()\n\n const arrowOpts = arrowOptions\n ? {\n foregroundColor: arrowOptions.backgroundColor,\n backgroundColor: arrowOptions.backgroundColor,\n attributes: arrowOptions.attributes,\n ...arrowOptions,\n }\n : {}\n\n this.startArrow = new ArrowRenderable(ctx, {\n alignSelf: \"center\",\n visible: this.showArrows,\n direction: this.orientation === \"vertical\" ? \"up\" : \"left\",\n height: this.orientation === \"vertical\" ? 1 : 1,\n ...arrowOpts,\n })\n\n this.endArrow = new ArrowRenderable(ctx, {\n alignSelf: \"center\",\n visible: this.showArrows,\n direction: this.orientation === \"vertical\" ? \"down\" : \"right\",\n height: this.orientation === \"vertical\" ? 1 : 1,\n ...arrowOpts,\n })\n\n this.add(this.startArrow)\n this.add(this.slider)\n this.add(this.endArrow)\n\n let startArrowMouseTimeout = undefined as Timeout\n let endArrowMouseTimeout = undefined as Timeout\n\n this.startArrow.onMouseDown = (event) => {\n event.stopPropagation()\n event.preventDefault()\n\n this.scrollBy(-0.5, \"viewport\")\n\n startArrowMouseTimeout = setTimeout(() => {\n this.scrollBy(-0.5, \"viewport\")\n\n startArrowMouseTimeout = setInterval(() => {\n this.scrollBy(-0.2, \"viewport\")\n }, 200)\n }, 500)\n }\n\n this.startArrow.onMouseUp = (event) => {\n event.stopPropagation()\n clearInterval(startArrowMouseTimeout!)\n }\n\n this.endArrow.onMouseDown = (event) => {\n event.stopPropagation()\n event.preventDefault()\n\n this.scrollBy(0.5, \"viewport\")\n\n endArrowMouseTimeout = setTimeout(() => {\n this.scrollBy(0.5, \"viewport\")\n\n endArrowMouseTimeout = setInterval(() => {\n this.scrollBy(0.2, \"viewport\")\n }, 200)\n }, 500)\n }\n\n this.endArrow.onMouseUp = (event) => {\n event.stopPropagation()\n clearInterval(endArrowMouseTimeout!)\n }\n }\n\n public set arrowOptions(options: ScrollBarOptions[\"arrowOptions\"]) {\n Object.assign(this.startArrow, options)\n Object.assign(this.endArrow, options)\n this.requestRender()\n }\n\n public set trackOptions(options: ScrollBarOptions[\"trackOptions\"]) {\n Object.assign(this.slider, options)\n this.requestRender()\n }\n\n private updateSliderFromScrollState(): void {\n const scrollRange = Math.max(0, this._scrollSize - this._viewportSize)\n\n this.slider.min = 0\n this.slider.max = scrollRange\n\n this.slider.value = Math.min(this._scrollPosition, scrollRange)\n }\n\n public scrollBy(delta: number, unit: ScrollUnit = \"absolute\"): void {\n const multiplier =\n unit === \"viewport\"\n ? this.viewportSize\n : unit === \"content\"\n ? this.scrollSize\n : unit === \"step\"\n ? (this.scrollStep ?? 1)\n : 1\n\n const resolvedDelta = multiplier * delta\n this.scrollPosition += resolvedDelta\n }\n\n private recalculateVisibility(): void {\n if (!this._manualVisibility) {\n const sizeRatio = this.scrollSize <= this.viewportSize ? 1 : this.viewportSize / this.scrollSize\n super.visible = sizeRatio < 1\n }\n }\n\n public handleKeyPress(key: KeyEvent): boolean {\n switch (key.name) {\n case \"left\":\n case \"h\":\n if (this.orientation !== \"horizontal\") return false\n this.scrollBy(-1 / 5, \"viewport\")\n return true\n case \"right\":\n case \"l\":\n if (this.orientation !== \"horizontal\") return false\n this.scrollBy(1 / 5, \"viewport\")\n return true\n case \"up\":\n case \"k\":\n if (this.orientation !== \"vertical\") return false\n this.scrollBy(-1 / 5, \"viewport\")\n return true\n case \"down\":\n case \"j\":\n if (this.orientation !== \"vertical\") return false\n this.scrollBy(1 / 5, \"viewport\")\n return true\n case \"pageup\":\n this.scrollBy(-1 / 2, \"viewport\")\n return true\n case \"pagedown\":\n this.scrollBy(1 / 2, \"viewport\")\n return true\n case \"home\":\n this.scrollBy(-1, \"content\")\n return true\n case \"end\":\n this.scrollBy(1, \"content\")\n return true\n }\n\n return false\n }\n}\n\nexport interface ArrowOptions extends RenderableOptions<ArrowRenderable> {\n direction: \"up\" | \"down\" | \"left\" | \"right\"\n foregroundColor?: ColorInput\n backgroundColor?: ColorInput\n attributes?: number\n arrowChars?: {\n up?: string\n down?: string\n left?: string\n right?: string\n }\n}\n\nexport class ArrowRenderable extends Renderable {\n private _direction: \"up\" | \"down\" | \"left\" | \"right\"\n private _foregroundColor: RGBA\n private _backgroundColor: RGBA\n private _attributes: number\n private _arrowChars: {\n up: string\n down: string\n left: string\n right: string\n }\n\n constructor(ctx: RenderContext, options: ArrowOptions) {\n super(ctx, options)\n this._direction = options.direction\n this._foregroundColor = options.foregroundColor ? parseColor(options.foregroundColor) : RGBA.fromValues(1, 1, 1, 1)\n this._backgroundColor = options.backgroundColor ? parseColor(options.backgroundColor) : RGBA.fromValues(0, 0, 0, 0)\n this._attributes = options.attributes ?? 0\n\n this._arrowChars = {\n up: \"▲\",\n down: \"▼\",\n left: \"◀\",\n right: \"▶\",\n ...options.arrowChars,\n }\n\n if (!options.width) {\n this.width = Bun.stringWidth(this.getArrowChar())\n }\n }\n\n get direction(): \"up\" | \"down\" | \"left\" | \"right\" {\n return this._direction\n }\n\n set direction(value: \"up\" | \"down\" | \"left\" | \"right\") {\n if (this._direction !== value) {\n this._direction = value\n this.requestRender()\n }\n }\n\n get foregroundColor(): RGBA {\n return this._foregroundColor\n }\n\n set foregroundColor(value: ColorInput) {\n if (this._foregroundColor !== value) {\n this._foregroundColor = parseColor(value)\n this.requestRender()\n }\n }\n\n get backgroundColor(): RGBA {\n return this._backgroundColor\n }\n\n set backgroundColor(value: ColorInput) {\n if (this._backgroundColor !== value) {\n this._backgroundColor = parseColor(value)\n this.requestRender()\n }\n }\n\n get attributes(): number {\n return this._attributes\n }\n\n set attributes(value: number) {\n if (this._attributes !== value) {\n this._attributes = value\n this.requestRender()\n }\n }\n\n set arrowChars(value: ArrowOptions[\"arrowChars\"]) {\n this._arrowChars = {\n ...this._arrowChars,\n ...value,\n }\n this.requestRender()\n }\n\n protected renderSelf(buffer: OptimizedBuffer): void {\n const char = this.getArrowChar()\n buffer.drawText(char, this.x, this.y, this._foregroundColor, this._backgroundColor, this._attributes)\n }\n\n private getArrowChar(): string {\n switch (this._direction) {\n case \"up\":\n return this._arrowChars.up\n case \"down\":\n return this._arrowChars.down\n case \"left\":\n return this._arrowChars.left\n case \"right\":\n return this._arrowChars.right\n default:\n return \"?\"\n }\n }\n}\n",
29
+ "import { type KeyEvent } from \"../lib\"\nimport { getObjectsInViewport } from \"../lib/objects-in-viewport\"\nimport { LinearScrollAccel, MacOSScrollAccel, type ScrollAcceleration } from \"../lib/scroll-acceleration\"\nimport type { Renderable, RenderableOptions } from \"../Renderable\"\nimport type { MouseEvent } from \"../renderer\"\nimport type { RenderContext } from \"../types\"\nimport { BoxRenderable, type BoxOptions } from \"./Box\"\nimport type { VNode } from \"./composition/vnode\"\nimport { ScrollBarRenderable, type ScrollBarOptions, type ScrollUnit } from \"./ScrollBar\"\n\nclass ContentRenderable extends BoxRenderable {\n private viewport: BoxRenderable\n private _viewportCulling: boolean\n\n constructor(\n ctx: RenderContext,\n viewport: BoxRenderable,\n viewportCulling: boolean,\n options: RenderableOptions<BoxRenderable>,\n ) {\n super(ctx, options)\n this.viewport = viewport\n this._viewportCulling = viewportCulling\n }\n\n get viewportCulling(): boolean {\n return this._viewportCulling\n }\n\n set viewportCulling(value: boolean) {\n this._viewportCulling = value\n }\n\n protected _getVisibleChildren(): number[] {\n if (this._viewportCulling) {\n return getObjectsInViewport(this.viewport, this.getChildrenSortedByPrimaryAxis(), this.primaryAxis, 0).map(\n (child) => child.num,\n )\n }\n return this.getChildrenSortedByPrimaryAxis().map((child) => child.num)\n }\n}\n\nexport interface ScrollBoxOptions extends BoxOptions<ScrollBoxRenderable> {\n rootOptions?: BoxOptions\n wrapperOptions?: BoxOptions\n viewportOptions?: BoxOptions\n contentOptions?: BoxOptions\n scrollbarOptions?: Omit<ScrollBarOptions, \"orientation\">\n verticalScrollbarOptions?: Omit<ScrollBarOptions, \"orientation\">\n horizontalScrollbarOptions?: Omit<ScrollBarOptions, \"orientation\">\n stickyScroll?: boolean\n stickyStart?: \"bottom\" | \"top\" | \"left\" | \"right\"\n scrollX?: boolean\n scrollY?: boolean\n scrollAcceleration?: ScrollAcceleration\n viewportCulling?: boolean\n}\n\nexport class ScrollBoxRenderable extends BoxRenderable {\n static idCounter = 0\n private internalId = 0\n public readonly wrapper: BoxRenderable\n public readonly viewport: BoxRenderable\n public readonly content: ContentRenderable\n public readonly horizontalScrollBar: ScrollBarRenderable\n public readonly verticalScrollBar: ScrollBarRenderable\n\n protected _focusable: boolean = true\n private selectionListener?: () => void\n\n private autoScrollMouseX: number = 0\n private autoScrollMouseY: number = 0\n private readonly autoScrollThresholdVertical = 3\n private readonly autoScrollThresholdHorizontal = 3\n private readonly autoScrollSpeedSlow = 6\n private readonly autoScrollSpeedMedium = 36\n private readonly autoScrollSpeedFast = 72\n private isAutoScrolling: boolean = false\n private cachedAutoScrollSpeed: number = 3\n private autoScrollAccumulatorX: number = 0\n private autoScrollAccumulatorY: number = 0\n\n private scrollAccumulatorX: number = 0\n private scrollAccumulatorY: number = 0\n\n private _stickyScroll: boolean\n private _stickyScrollTop: boolean = false\n private _stickyScrollBottom: boolean = false\n private _stickyScrollLeft: boolean = false\n private _stickyScrollRight: boolean = false\n private _stickyStart?: \"bottom\" | \"top\" | \"left\" | \"right\"\n private _hasManualScroll: boolean = false\n private _isApplyingStickyScroll: boolean = false\n private scrollAccel: ScrollAcceleration\n\n get stickyScroll(): boolean {\n return this._stickyScroll\n }\n\n set stickyScroll(value: boolean) {\n this._stickyScroll = value\n this.updateStickyState()\n }\n\n get stickyStart(): \"bottom\" | \"top\" | \"left\" | \"right\" | undefined {\n return this._stickyStart\n }\n\n set stickyStart(value: \"bottom\" | \"top\" | \"left\" | \"right\" | undefined) {\n this._stickyStart = value\n this.updateStickyState()\n }\n\n get scrollTop(): number {\n return this.verticalScrollBar.scrollPosition\n }\n\n set scrollTop(value: number) {\n this.verticalScrollBar.scrollPosition = value\n if (!this._isApplyingStickyScroll) {\n // Only mark as manual scroll if:\n // 1. We're not at a sticky position after scrolling (prevents programmatic scrolls to sticky edges from disabling sticky)\n // 2. There's actually meaningful scrollable content (prevents accidental scrolls when content is smaller than viewport from disabling sticky)\n // Use a small threshold (>1) to account for rounding/layout quirks\n const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)\n if (!this.isAtStickyPosition() && maxScrollTop > 1) {\n this._hasManualScroll = true\n }\n }\n this.updateStickyState()\n }\n\n get scrollLeft(): number {\n return this.horizontalScrollBar.scrollPosition\n }\n\n set scrollLeft(value: number) {\n this.horizontalScrollBar.scrollPosition = value\n if (!this._isApplyingStickyScroll) {\n // Only mark as manual scroll if:\n // 1. We're not at a sticky position after scrolling (prevents programmatic scrolls to sticky edges from disabling sticky)\n // 2. There's actually meaningful scrollable content (prevents accidental scrolls when content is smaller than viewport from disabling sticky)\n // Use a small threshold (>1) to account for rounding/layout quirks\n const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)\n if (!this.isAtStickyPosition() && maxScrollLeft > 1) {\n this._hasManualScroll = true\n }\n }\n this.updateStickyState()\n }\n\n get scrollWidth(): number {\n return this.horizontalScrollBar.scrollSize\n }\n\n get scrollHeight(): number {\n return this.verticalScrollBar.scrollSize\n }\n\n private updateStickyState(): void {\n if (!this._stickyScroll) return\n\n const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)\n const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)\n\n if (this.scrollTop <= 0) {\n this._stickyScrollTop = true\n this._stickyScrollBottom = false\n if (this._stickyStart === \"top\" || (this._stickyStart === \"bottom\" && maxScrollTop === 0)) {\n this._hasManualScroll = false\n }\n } else if (this.scrollTop >= maxScrollTop) {\n this._stickyScrollTop = false\n this._stickyScrollBottom = true\n if (this._stickyStart === \"bottom\") {\n this._hasManualScroll = false\n }\n } else {\n this._stickyScrollTop = false\n this._stickyScrollBottom = false\n }\n\n if (this.scrollLeft <= 0) {\n this._stickyScrollLeft = true\n this._stickyScrollRight = false\n if (this._stickyStart === \"left\" || (this._stickyStart === \"right\" && maxScrollLeft === 0)) {\n this._hasManualScroll = false\n }\n } else if (this.scrollLeft >= maxScrollLeft) {\n this._stickyScrollLeft = false\n this._stickyScrollRight = true\n if (this._stickyStart === \"right\") {\n this._hasManualScroll = false\n }\n } else {\n this._stickyScrollLeft = false\n this._stickyScrollRight = false\n }\n }\n\n private applyStickyStart(stickyStart: \"bottom\" | \"top\" | \"left\" | \"right\"): void {\n this._isApplyingStickyScroll = true\n switch (stickyStart) {\n case \"top\":\n this._stickyScrollTop = true\n this._stickyScrollBottom = false\n this.verticalScrollBar.scrollPosition = 0\n break\n case \"bottom\":\n this._stickyScrollTop = false\n this._stickyScrollBottom = true\n this.verticalScrollBar.scrollPosition = Math.max(0, this.scrollHeight - this.viewport.height)\n break\n case \"left\":\n this._stickyScrollLeft = true\n this._stickyScrollRight = false\n this.horizontalScrollBar.scrollPosition = 0\n break\n case \"right\":\n this._stickyScrollLeft = false\n this._stickyScrollRight = true\n this.horizontalScrollBar.scrollPosition = Math.max(0, this.scrollWidth - this.viewport.width)\n break\n }\n this._isApplyingStickyScroll = false\n }\n\n constructor(\n ctx: RenderContext,\n {\n wrapperOptions,\n viewportOptions,\n contentOptions,\n rootOptions,\n scrollbarOptions,\n verticalScrollbarOptions,\n horizontalScrollbarOptions,\n stickyScroll = false,\n stickyStart,\n scrollX = false,\n scrollY = true,\n scrollAcceleration,\n viewportCulling = true,\n ...options\n }: ScrollBoxOptions,\n ) {\n // Root\n super(ctx, {\n flexDirection: \"row\",\n alignItems: \"stretch\",\n ...(options as BoxOptions),\n ...(rootOptions as BoxOptions),\n })\n\n this.internalId = ScrollBoxRenderable.idCounter++\n this._stickyScroll = stickyScroll\n this._stickyStart = stickyStart\n this.scrollAccel = scrollAcceleration ?? new LinearScrollAccel()\n\n this.wrapper = new BoxRenderable(ctx, {\n flexDirection: \"column\",\n flexGrow: 1,\n ...wrapperOptions,\n id: `scroll-box-wrapper-${this.internalId}`,\n })\n super.add(this.wrapper)\n\n this.viewport = new BoxRenderable(ctx, {\n flexDirection: \"column\",\n flexGrow: 1,\n // NOTE: Overflow scroll makes the content size behave weird\n // when the scrollbox is in a container with max-width/height\n overflow: \"hidden\",\n onSizeChange: () => {\n this.recalculateBarProps()\n },\n ...viewportOptions,\n id: `scroll-box-viewport-${this.internalId}`,\n })\n this.wrapper.add(this.viewport)\n\n this.content = new ContentRenderable(ctx, this.viewport, viewportCulling, {\n alignSelf: \"flex-start\",\n flexShrink: 0,\n ...(scrollX ? { minWidth: \"100%\" } : { minWidth: \"100%\", maxWidth: \"100%\" }),\n ...(scrollY ? { minHeight: \"100%\" } : { minHeight: \"100%\", maxHeight: \"100%\" }),\n onSizeChange: () => {\n this.recalculateBarProps()\n },\n ...contentOptions,\n id: `scroll-box-content-${this.internalId}`,\n })\n this.viewport.add(this.content)\n\n this.verticalScrollBar = new ScrollBarRenderable(ctx, {\n ...scrollbarOptions,\n ...verticalScrollbarOptions,\n arrowOptions: {\n ...scrollbarOptions?.arrowOptions,\n ...verticalScrollbarOptions?.arrowOptions,\n },\n id: `scroll-box-vertical-scrollbar-${this.internalId}`,\n orientation: \"vertical\",\n onChange: (position) => {\n this.content.translateY = -position\n if (!this._isApplyingStickyScroll) {\n // Only mark as manual scroll if we're not at a sticky position and there's meaningful scrollable content\n const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)\n if (!this.isAtStickyPosition() && maxScrollTop > 1) {\n this._hasManualScroll = true\n }\n }\n this.updateStickyState()\n },\n })\n super.add(this.verticalScrollBar)\n\n this.horizontalScrollBar = new ScrollBarRenderable(ctx, {\n ...scrollbarOptions,\n ...horizontalScrollbarOptions,\n arrowOptions: {\n ...scrollbarOptions?.arrowOptions,\n ...horizontalScrollbarOptions?.arrowOptions,\n },\n id: `scroll-box-horizontal-scrollbar-${this.internalId}`,\n orientation: \"horizontal\",\n onChange: (position) => {\n this.content.translateX = -position\n if (!this._isApplyingStickyScroll) {\n // Only mark as manual scroll if we're not at a sticky position and there's meaningful scrollable content\n const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)\n if (!this.isAtStickyPosition() && maxScrollLeft > 1) {\n this._hasManualScroll = true\n }\n }\n this.updateStickyState()\n },\n })\n this.wrapper.add(this.horizontalScrollBar)\n\n this.recalculateBarProps()\n\n if (stickyStart && stickyScroll) {\n this.applyStickyStart(stickyStart)\n }\n\n this.selectionListener = () => {\n const selection = this._ctx.getSelection()\n if (!selection || !selection.isDragging) {\n this.stopAutoScroll()\n }\n }\n this._ctx.on(\"selection\", this.selectionListener)\n }\n\n protected onUpdate(deltaTime: number): void {\n this.handleAutoScroll(deltaTime)\n }\n\n public scrollBy(delta: number | { x: number; y: number }, unit: ScrollUnit = \"absolute\"): void {\n if (typeof delta === \"number\") {\n this.verticalScrollBar.scrollBy(delta, unit)\n } else {\n this.verticalScrollBar.scrollBy(delta.y, unit)\n this.horizontalScrollBar.scrollBy(delta.x, unit)\n }\n // Note: scrollBy doesn't need to set _hasManualScroll here because the scrollbar\n // change will trigger the scrollTop setter which handles it\n }\n\n public scrollTo(position: number | { x: number; y: number }): void {\n if (typeof position === \"number\") {\n this.scrollTop = position\n } else {\n this.scrollTop = position.y\n this.scrollLeft = position.x\n }\n // Note: scrollTo doesn't need to set _hasManualScroll here because\n // the scrollTop/scrollLeft setters handle it\n }\n\n private isAtStickyPosition(): boolean {\n if (!this._stickyScroll || !this._stickyStart) {\n return false\n }\n\n const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)\n const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)\n\n switch (this._stickyStart) {\n case \"top\":\n return this.scrollTop === 0\n case \"bottom\":\n return this.scrollTop >= maxScrollTop\n case \"left\":\n return this.scrollLeft === 0\n case \"right\":\n return this.scrollLeft >= maxScrollLeft\n default:\n return false\n }\n }\n\n public add(obj: Renderable | VNode<any, any[]>, index?: number): number {\n return this.content.add(obj, index)\n }\n\n public insertBefore(obj: Renderable | VNode<any, any[]> | unknown, anchor?: Renderable | unknown): number {\n return this.content.insertBefore(obj, anchor)\n }\n\n public remove(id: string): void {\n this.content.remove(id)\n }\n\n public getChildren(): Renderable[] {\n return this.content.getChildren()\n }\n\n protected onMouseEvent(event: MouseEvent): void {\n if (event.type === \"scroll\") {\n let dir = event.scroll?.direction\n if (event.modifiers.shift)\n dir = dir === \"up\" ? \"left\" : dir === \"down\" ? \"right\" : dir === \"right\" ? \"down\" : \"up\"\n\n const baseDelta = event.scroll?.delta ?? 0\n const now = Date.now()\n const multiplier = this.scrollAccel.tick(now)\n const scrollAmount = baseDelta * multiplier\n\n if (dir === \"up\") {\n this.scrollAccumulatorY -= scrollAmount\n const integerScroll = Math.trunc(this.scrollAccumulatorY)\n if (integerScroll !== 0) {\n this.scrollTop += integerScroll\n this.scrollAccumulatorY -= integerScroll\n }\n } else if (dir === \"down\") {\n this.scrollAccumulatorY += scrollAmount\n const integerScroll = Math.trunc(this.scrollAccumulatorY)\n if (integerScroll !== 0) {\n this.scrollTop += integerScroll\n this.scrollAccumulatorY -= integerScroll\n }\n } else if (dir === \"left\") {\n this.scrollAccumulatorX -= scrollAmount\n const integerScroll = Math.trunc(this.scrollAccumulatorX)\n if (integerScroll !== 0) {\n this.scrollLeft += integerScroll\n this.scrollAccumulatorX -= integerScroll\n }\n } else if (dir === \"right\") {\n this.scrollAccumulatorX += scrollAmount\n const integerScroll = Math.trunc(this.scrollAccumulatorX)\n if (integerScroll !== 0) {\n this.scrollLeft += integerScroll\n this.scrollAccumulatorX -= integerScroll\n }\n }\n\n // Only mark as manual scroll if there's meaningful scrollable content\n const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)\n const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)\n if (maxScrollTop > 1 || maxScrollLeft > 1) {\n this._hasManualScroll = true\n }\n }\n\n if (event.type === \"drag\" && event.isDragging) {\n this.updateAutoScroll(event.x, event.y)\n } else if (event.type === \"up\") {\n this.stopAutoScroll()\n }\n }\n\n public handleKeyPress(key: KeyEvent): boolean {\n // Let scrollbars handle their own acceleration\n if (this.verticalScrollBar.handleKeyPress(key)) {\n this._hasManualScroll = true\n this.scrollAccel.reset()\n this.resetScrollAccumulators()\n return true\n }\n if (this.horizontalScrollBar.handleKeyPress(key)) {\n this._hasManualScroll = true\n this.scrollAccel.reset()\n this.resetScrollAccumulators()\n return true\n }\n return false\n }\n\n private resetScrollAccumulators(): void {\n this.scrollAccumulatorX = 0\n this.scrollAccumulatorY = 0\n }\n\n public startAutoScroll(mouseX: number, mouseY: number): void {\n this.stopAutoScroll()\n this.autoScrollMouseX = mouseX\n this.autoScrollMouseY = mouseY\n this.cachedAutoScrollSpeed = this.getAutoScrollSpeed(mouseX, mouseY)\n this.isAutoScrolling = true\n\n if (!this.live) {\n this.live = true\n }\n }\n\n public updateAutoScroll(mouseX: number, mouseY: number): void {\n this.autoScrollMouseX = mouseX\n this.autoScrollMouseY = mouseY\n\n // Cache the speed based on current mouse position\n this.cachedAutoScrollSpeed = this.getAutoScrollSpeed(mouseX, mouseY)\n\n const scrollX = this.getAutoScrollDirectionX(mouseX)\n const scrollY = this.getAutoScrollDirectionY(mouseY)\n\n if (scrollX === 0 && scrollY === 0) {\n this.stopAutoScroll()\n } else if (!this.isAutoScrolling) {\n this.startAutoScroll(mouseX, mouseY)\n }\n }\n\n public stopAutoScroll(): void {\n const wasAutoScrolling = this.isAutoScrolling\n this.isAutoScrolling = false\n this.autoScrollAccumulatorX = 0\n this.autoScrollAccumulatorY = 0\n\n // Only turn off live if no other features need it\n // For now, auto-scroll is the only feature using live, but this could be extended\n if (wasAutoScrolling && !this.hasOtherLiveReasons()) {\n this.live = false\n }\n }\n\n private hasOtherLiveReasons(): boolean {\n // Placeholder for future features that might need live mode\n // For now, always return false since auto-scroll is the only user\n return false\n }\n\n private handleAutoScroll(deltaTime: number): void {\n if (!this.isAutoScrolling) return\n\n const scrollX = this.getAutoScrollDirectionX(this.autoScrollMouseX)\n const scrollY = this.getAutoScrollDirectionY(this.autoScrollMouseY)\n const scrollAmount = this.cachedAutoScrollSpeed * (deltaTime / 1000)\n\n let scrolled = false\n\n if (scrollX !== 0) {\n this.autoScrollAccumulatorX += scrollX * scrollAmount\n const integerScrollX = Math.trunc(this.autoScrollAccumulatorX)\n if (integerScrollX !== 0) {\n this.scrollLeft += integerScrollX\n this.autoScrollAccumulatorX -= integerScrollX\n scrolled = true\n }\n }\n\n if (scrollY !== 0) {\n this.autoScrollAccumulatorY += scrollY * scrollAmount\n const integerScrollY = Math.trunc(this.autoScrollAccumulatorY)\n if (integerScrollY !== 0) {\n this.scrollTop += integerScrollY\n this.autoScrollAccumulatorY -= integerScrollY\n scrolled = true\n }\n }\n\n if (scrolled) {\n this._ctx.requestSelectionUpdate()\n }\n\n if (scrollX === 0 && scrollY === 0) {\n this.stopAutoScroll()\n }\n }\n\n private getAutoScrollDirectionX(mouseX: number): number {\n const relativeX = mouseX - this.x\n const distToLeft = relativeX\n const distToRight = this.width - relativeX\n\n if (distToLeft <= this.autoScrollThresholdHorizontal) {\n return this.scrollLeft > 0 ? -1 : 0\n } else if (distToRight <= this.autoScrollThresholdHorizontal) {\n const maxScrollLeft = this.scrollWidth - this.viewport.width\n return this.scrollLeft < maxScrollLeft ? 1 : 0\n }\n return 0\n }\n\n private getAutoScrollDirectionY(mouseY: number): number {\n const relativeY = mouseY - this.y\n const distToTop = relativeY\n const distToBottom = this.height - relativeY\n\n if (distToTop <= this.autoScrollThresholdVertical) {\n return this.scrollTop > 0 ? -1 : 0\n } else if (distToBottom <= this.autoScrollThresholdVertical) {\n const maxScrollTop = this.scrollHeight - this.viewport.height\n return this.scrollTop < maxScrollTop ? 1 : 0\n }\n return 0\n }\n\n private getAutoScrollSpeed(mouseX: number, mouseY: number): number {\n const relativeX = mouseX - this.x\n const relativeY = mouseY - this.y\n\n const distToLeft = relativeX\n const distToRight = this.width - relativeX\n const distToTop = relativeY\n const distToBottom = this.height - relativeY\n\n const minDistance = Math.min(distToLeft, distToRight, distToTop, distToBottom)\n\n if (minDistance <= 1) {\n return this.autoScrollSpeedFast\n } else if (minDistance <= 2) {\n return this.autoScrollSpeedMedium\n } else {\n return this.autoScrollSpeedSlow\n }\n }\n\n private recalculateBarProps(): void {\n // Wrap entire method to prevent scroll changes from being treated as manual\n const wasApplyingStickyScroll = this._isApplyingStickyScroll\n this._isApplyingStickyScroll = true\n\n this.verticalScrollBar.scrollSize = this.content.height\n this.verticalScrollBar.viewportSize = this.viewport.height\n this.horizontalScrollBar.scrollSize = this.content.width\n this.horizontalScrollBar.viewportSize = this.viewport.width\n\n if (this._stickyScroll) {\n const newMaxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)\n const newMaxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)\n\n if (this._stickyStart && !this._hasManualScroll) {\n this.applyStickyStart(this._stickyStart)\n } else {\n if (this._stickyScrollTop) {\n this.scrollTop = 0\n } else if (this._stickyScrollBottom && newMaxScrollTop > 0) {\n this.scrollTop = newMaxScrollTop\n }\n\n if (this._stickyScrollLeft) {\n this.scrollLeft = 0\n } else if (this._stickyScrollRight && newMaxScrollLeft > 0) {\n this.scrollLeft = newMaxScrollLeft\n }\n }\n }\n\n this._isApplyingStickyScroll = wasApplyingStickyScroll\n\n // NOTE: This is obviously a workaround for something,\n // which is that the bar props are recalculated when the viewport is resized,\n // which intially happens onUpdate but is the viewport does not have the correct dimensions yet,\n // then when it does, no update is triggered and when we do we are in the middle of a render,\n // which just ignores the request. ¯\\_(ツ)_/¯\n // TODO: Fix this properly. How? Move yoga to native, get all changes for elements in one go\n // and update all renderables in one go before rendering.\n // OR: Move this logic to the viewport. IMHO the wrapper and viewport are overkill and not necessary.\n // The Scrollbox can be the viewport, we are using translations on the content anyway.\n process.nextTick(() => {\n this.requestRender()\n })\n }\n\n // Setters for reactive properties\n public set rootOptions(options: ScrollBoxOptions[\"rootOptions\"]) {\n Object.assign(this, options)\n this.requestRender()\n }\n\n public set wrapperOptions(options: ScrollBoxOptions[\"wrapperOptions\"]) {\n Object.assign(this.wrapper, options)\n this.requestRender()\n }\n\n public set viewportOptions(options: ScrollBoxOptions[\"viewportOptions\"]) {\n Object.assign(this.viewport, options)\n this.requestRender()\n }\n\n public set contentOptions(options: ScrollBoxOptions[\"contentOptions\"]) {\n Object.assign(this.content, options)\n this.requestRender()\n }\n\n public set scrollbarOptions(options: ScrollBoxOptions[\"scrollbarOptions\"]) {\n Object.assign(this.verticalScrollBar, options)\n Object.assign(this.horizontalScrollBar, options)\n this.requestRender()\n }\n\n public set verticalScrollbarOptions(options: ScrollBoxOptions[\"verticalScrollbarOptions\"]) {\n Object.assign(this.verticalScrollBar, options)\n this.requestRender()\n }\n\n public set horizontalScrollbarOptions(options: ScrollBoxOptions[\"horizontalScrollbarOptions\"]) {\n Object.assign(this.horizontalScrollBar, options)\n this.requestRender()\n }\n\n public get scrollAcceleration(): ScrollAcceleration {\n return this.scrollAccel\n }\n\n public set scrollAcceleration(value: ScrollAcceleration) {\n this.scrollAccel = value\n }\n\n get viewportCulling(): boolean {\n return this.content.viewportCulling\n }\n\n set viewportCulling(value: boolean) {\n this.content.viewportCulling = value\n this.requestRender()\n }\n\n protected destroySelf(): void {\n if (this.selectionListener) {\n this._ctx.off(\"selection\", this.selectionListener)\n this.selectionListener = undefined\n }\n super.destroySelf()\n }\n}\n",
30
+ "import { OptimizedBuffer } from \"../buffer\"\nimport { fonts, measureText, renderFontToFrameBuffer } from \"../lib/ascii.font\"\nimport type { KeyEvent } from \"../lib/KeyHandler\"\nimport { RGBA, parseColor, type ColorInput } from \"../lib/RGBA\"\nimport { Renderable, type RenderableOptions } from \"../Renderable\"\nimport type { RenderContext } from \"../types\"\nimport {\n type KeyBinding as BaseKeyBinding,\n mergeKeyBindings,\n getKeyBindingKey,\n buildKeyBindingsMap,\n type KeyAliasMap,\n defaultKeyAliases,\n mergeKeyAliases,\n} from \"../lib/keymapping\"\n\nexport interface SelectOption {\n name: string\n description: string\n value?: any\n}\n\nexport type SelectAction = \"move-up\" | \"move-down\" | \"move-up-fast\" | \"move-down-fast\" | \"select-current\"\n\nexport type SelectKeyBinding = BaseKeyBinding<SelectAction>\n\nconst defaultSelectKeybindings: SelectKeyBinding[] = [\n { name: \"up\", action: \"move-up\" },\n { name: \"k\", action: \"move-up\" },\n { name: \"down\", action: \"move-down\" },\n { name: \"j\", action: \"move-down\" },\n { name: \"up\", shift: true, action: \"move-up-fast\" },\n { name: \"down\", shift: true, action: \"move-down-fast\" },\n { name: \"return\", action: \"select-current\" },\n { name: \"linefeed\", action: \"select-current\" },\n]\n\nexport interface SelectRenderableOptions extends RenderableOptions<SelectRenderable> {\n backgroundColor?: ColorInput\n textColor?: ColorInput\n focusedBackgroundColor?: ColorInput\n focusedTextColor?: ColorInput\n options?: SelectOption[]\n selectedIndex?: number\n selectedBackgroundColor?: ColorInput\n selectedTextColor?: ColorInput\n descriptionColor?: ColorInput\n selectedDescriptionColor?: ColorInput\n showScrollIndicator?: boolean\n wrapSelection?: boolean\n showDescription?: boolean\n font?: keyof typeof fonts\n itemSpacing?: number\n fastScrollStep?: number\n keyBindings?: SelectKeyBinding[]\n keyAliasMap?: KeyAliasMap\n}\n\nexport enum SelectRenderableEvents {\n SELECTION_CHANGED = \"selectionChanged\",\n ITEM_SELECTED = \"itemSelected\",\n}\n\nexport class SelectRenderable extends Renderable {\n protected _focusable: boolean = true\n\n private _options: SelectOption[] = []\n private _selectedIndex: number = 0\n private scrollOffset: number = 0\n private maxVisibleItems: number\n\n private _backgroundColor: RGBA\n private _textColor: RGBA\n private _focusedBackgroundColor: RGBA\n private _focusedTextColor: RGBA\n private _selectedBackgroundColor: RGBA\n private _selectedTextColor: RGBA\n private _descriptionColor: RGBA\n private _selectedDescriptionColor: RGBA\n private _showScrollIndicator: boolean\n private _wrapSelection: boolean\n private _showDescription: boolean\n private _font?: keyof typeof fonts\n private _itemSpacing: number\n private linesPerItem: number\n private fontHeight: number\n private _fastScrollStep: number\n private _keyBindingsMap: Map<string, SelectAction>\n private _keyAliasMap: KeyAliasMap\n private _keyBindings: SelectKeyBinding[]\n\n protected _defaultOptions = {\n backgroundColor: \"transparent\",\n textColor: \"#FFFFFF\",\n focusedBackgroundColor: \"#1a1a1a\",\n focusedTextColor: \"#FFFFFF\",\n selectedBackgroundColor: \"#334455\",\n selectedTextColor: \"#FFFF00\",\n selectedIndex: 0,\n descriptionColor: \"#888888\",\n selectedDescriptionColor: \"#CCCCCC\",\n showScrollIndicator: false,\n wrapSelection: false,\n showDescription: true,\n itemSpacing: 0,\n fastScrollStep: 5,\n } satisfies Partial<SelectRenderableOptions>\n\n constructor(ctx: RenderContext, options: SelectRenderableOptions) {\n super(ctx, { ...options, buffered: true })\n this._options = options.options || []\n const requestedIndex = options.selectedIndex ?? this._defaultOptions.selectedIndex\n this._selectedIndex = this._options.length > 0 ? Math.min(requestedIndex, this._options.length - 1) : 0\n this._backgroundColor = parseColor(options.backgroundColor || this._defaultOptions.backgroundColor)\n this._textColor = parseColor(options.textColor || this._defaultOptions.textColor)\n this._focusedBackgroundColor = parseColor(\n options.focusedBackgroundColor || this._defaultOptions.focusedBackgroundColor,\n )\n this._focusedTextColor = parseColor(options.focusedTextColor || this._defaultOptions.focusedTextColor)\n\n this._showScrollIndicator = options.showScrollIndicator ?? this._defaultOptions.showScrollIndicator\n this._wrapSelection = options.wrapSelection ?? this._defaultOptions.wrapSelection\n this._showDescription = options.showDescription ?? this._defaultOptions.showDescription\n this._font = options.font\n this._itemSpacing = options.itemSpacing || this._defaultOptions.itemSpacing\n\n this.fontHeight = this._font ? measureText({ text: \"A\", font: this._font }).height : 1\n this.linesPerItem = this._showDescription\n ? this._font\n ? this.fontHeight + 1\n : 2\n : this._font\n ? this.fontHeight\n : 1\n this.linesPerItem += this._itemSpacing\n\n this.maxVisibleItems = Math.max(1, Math.floor(this.height / this.linesPerItem))\n\n this._selectedBackgroundColor = parseColor(\n options.selectedBackgroundColor || this._defaultOptions.selectedBackgroundColor,\n )\n this._selectedTextColor = parseColor(options.selectedTextColor || this._defaultOptions.selectedTextColor)\n this._descriptionColor = parseColor(options.descriptionColor || this._defaultOptions.descriptionColor)\n this._selectedDescriptionColor = parseColor(\n options.selectedDescriptionColor || this._defaultOptions.selectedDescriptionColor,\n )\n this._fastScrollStep = options.fastScrollStep || this._defaultOptions.fastScrollStep\n\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, options.keyAliasMap || {})\n this._keyBindings = options.keyBindings || []\n const mergedBindings = mergeKeyBindings(defaultSelectKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n\n this.requestRender() // Initial render needed\n }\n\n protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible || !this.frameBuffer) return\n\n if (this.isDirty) {\n this.refreshFrameBuffer()\n }\n }\n\n private refreshFrameBuffer(): void {\n if (!this.frameBuffer || this._options.length === 0) return\n\n const bgColor = this._focused ? this._focusedBackgroundColor : this._backgroundColor\n this.frameBuffer.clear(bgColor)\n\n const contentX = 0\n const contentY = 0\n const contentWidth = this.width\n const contentHeight = this.height\n\n const visibleOptions = this._options.slice(this.scrollOffset, this.scrollOffset + this.maxVisibleItems)\n\n for (let i = 0; i < visibleOptions.length; i++) {\n const actualIndex = this.scrollOffset + i\n const option = visibleOptions[i]\n const isSelected = actualIndex === this._selectedIndex\n const itemY = contentY + i * this.linesPerItem\n\n if (itemY + this.linesPerItem - 1 >= contentY + contentHeight) break\n\n if (isSelected) {\n const contentHeight = this.linesPerItem - this._itemSpacing\n this.frameBuffer.fillRect(contentX, itemY, contentWidth, contentHeight, this._selectedBackgroundColor)\n }\n\n const nameContent = `${isSelected ? \"▶ \" : \" \"}${option.name}`\n const baseTextColor = this._focused ? this._focusedTextColor : this._textColor\n const nameColor = isSelected ? this._selectedTextColor : baseTextColor\n let descX = contentX + 3\n\n if (this._font) {\n const indicator = isSelected ? \"▶ \" : \" \"\n this.frameBuffer.drawText(indicator, contentX + 1, itemY, nameColor)\n\n const indicatorWidth = 2\n renderFontToFrameBuffer(this.frameBuffer, {\n text: option.name,\n x: contentX + 1 + indicatorWidth,\n y: itemY,\n color: nameColor,\n backgroundColor: isSelected ? this._selectedBackgroundColor : bgColor,\n font: this._font,\n })\n descX = contentX + 1 + indicatorWidth\n } else {\n this.frameBuffer.drawText(nameContent, contentX + 1, itemY, nameColor)\n }\n\n if (this._showDescription && itemY + this.fontHeight < contentY + contentHeight) {\n const descColor = isSelected ? this._selectedDescriptionColor : this._descriptionColor\n this.frameBuffer.drawText(option.description, descX, itemY + this.fontHeight, descColor)\n }\n }\n\n if (this._showScrollIndicator && this._options.length > this.maxVisibleItems) {\n this.renderScrollIndicatorToFrameBuffer(contentX, contentY, contentWidth, contentHeight)\n }\n }\n\n private renderScrollIndicatorToFrameBuffer(\n contentX: number,\n contentY: number,\n contentWidth: number,\n contentHeight: number,\n ): void {\n if (!this.frameBuffer) return\n\n const scrollPercent = this._selectedIndex / Math.max(1, this._options.length - 1)\n const indicatorHeight = Math.max(1, contentHeight - 2)\n const indicatorY = contentY + 1 + Math.floor(scrollPercent * indicatorHeight)\n const indicatorX = contentX + contentWidth - 1\n\n this.frameBuffer.drawText(\"█\", indicatorX, indicatorY, parseColor(\"#666666\"))\n }\n\n public get options(): SelectOption[] {\n return this._options\n }\n\n public set options(options: SelectOption[]) {\n this._options = options\n this._selectedIndex = Math.min(this._selectedIndex, Math.max(0, options.length - 1))\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public getSelectedOption(): SelectOption | null {\n return this._options[this._selectedIndex] || null\n }\n\n public getSelectedIndex(): number {\n return this._selectedIndex\n }\n\n public moveUp(steps: number = 1): void {\n const newIndex = this._selectedIndex - steps\n\n if (newIndex >= 0) {\n this._selectedIndex = newIndex\n } else if (this._wrapSelection && this._options.length > 0) {\n this._selectedIndex = this._options.length - 1\n } else {\n this._selectedIndex = 0\n }\n\n this.updateScrollOffset()\n this.requestRender()\n this.emit(SelectRenderableEvents.SELECTION_CHANGED, this._selectedIndex, this.getSelectedOption())\n }\n\n public moveDown(steps: number = 1): void {\n const newIndex = this._selectedIndex + steps\n\n if (newIndex < this._options.length) {\n this._selectedIndex = newIndex\n } else if (this._wrapSelection && this._options.length > 0) {\n this._selectedIndex = 0\n } else {\n this._selectedIndex = this._options.length - 1\n }\n\n this.updateScrollOffset()\n this.requestRender()\n this.emit(SelectRenderableEvents.SELECTION_CHANGED, this._selectedIndex, this.getSelectedOption())\n }\n\n public selectCurrent(): void {\n const selected = this.getSelectedOption()\n if (selected) {\n this.emit(SelectRenderableEvents.ITEM_SELECTED, this._selectedIndex, selected)\n }\n }\n\n public setSelectedIndex(index: number): void {\n if (index >= 0 && index < this._options.length) {\n this._selectedIndex = index\n this.updateScrollOffset()\n this.requestRender()\n this.emit(SelectRenderableEvents.SELECTION_CHANGED, this._selectedIndex, this.getSelectedOption())\n }\n }\n\n private updateScrollOffset(): void {\n if (!this._options) return\n\n const halfVisible = Math.floor(this.maxVisibleItems / 2)\n const newScrollOffset = Math.max(\n 0,\n Math.min(this._selectedIndex - halfVisible, this._options.length - this.maxVisibleItems),\n )\n\n if (newScrollOffset !== this.scrollOffset) {\n this.scrollOffset = newScrollOffset\n this.requestRender()\n }\n }\n\n protected onResize(width: number, height: number): void {\n this.maxVisibleItems = Math.max(1, Math.floor(height / this.linesPerItem))\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public handleKeyPress(key: KeyEvent): boolean {\n const bindingKey = getKeyBindingKey({\n name: key.name,\n ctrl: key.ctrl,\n shift: key.shift,\n meta: key.meta,\n super: key.super,\n action: \"move-up\" as SelectAction,\n })\n\n const action = this._keyBindingsMap.get(bindingKey)\n\n if (action) {\n switch (action) {\n case \"move-up\":\n this.moveUp(1)\n return true\n case \"move-down\":\n this.moveDown(1)\n return true\n case \"move-up-fast\":\n this.moveUp(this._fastScrollStep)\n return true\n case \"move-down-fast\":\n this.moveDown(this._fastScrollStep)\n return true\n case \"select-current\":\n this.selectCurrent()\n return true\n }\n }\n\n return false\n }\n\n public get showScrollIndicator(): boolean {\n return this._showScrollIndicator\n }\n\n public set showScrollIndicator(show: boolean) {\n this._showScrollIndicator = show\n this.requestRender()\n }\n\n public get showDescription(): boolean {\n return this._showDescription\n }\n\n public set showDescription(show: boolean) {\n if (this._showDescription !== show) {\n this._showDescription = show\n this.linesPerItem = this._showDescription\n ? this._font\n ? this.fontHeight + 1\n : 2\n : this._font\n ? this.fontHeight\n : 1\n this.linesPerItem += this._itemSpacing\n\n this.maxVisibleItems = Math.max(1, Math.floor(this.height / this.linesPerItem))\n this.updateScrollOffset()\n this.requestRender()\n }\n }\n\n public get wrapSelection(): boolean {\n return this._wrapSelection\n }\n\n public set wrapSelection(wrap: boolean) {\n this._wrapSelection = wrap\n }\n\n public set backgroundColor(value: ColorInput) {\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 set textColor(value: ColorInput) {\n const newColor = parseColor(value ?? this._defaultOptions.textColor)\n if (this._textColor !== newColor) {\n this._textColor = newColor\n this.requestRender()\n }\n }\n\n public set focusedBackgroundColor(value: ColorInput) {\n const newColor = parseColor(value ?? this._defaultOptions.focusedBackgroundColor)\n if (this._focusedBackgroundColor !== newColor) {\n this._focusedBackgroundColor = newColor\n this.requestRender()\n }\n }\n\n public set focusedTextColor(value: ColorInput) {\n const newColor = parseColor(value ?? this._defaultOptions.focusedTextColor)\n if (this._focusedTextColor !== newColor) {\n this._focusedTextColor = newColor\n this.requestRender()\n }\n }\n\n public set selectedBackgroundColor(value: ColorInput) {\n const newColor = parseColor(value ?? this._defaultOptions.selectedBackgroundColor)\n if (this._selectedBackgroundColor !== newColor) {\n this._selectedBackgroundColor = newColor\n this.requestRender()\n }\n }\n\n public set selectedTextColor(value: ColorInput) {\n const newColor = parseColor(value ?? this._defaultOptions.selectedTextColor)\n if (this._selectedTextColor !== newColor) {\n this._selectedTextColor = newColor\n this.requestRender()\n }\n }\n\n public set descriptionColor(value: ColorInput) {\n const newColor = parseColor(value ?? this._defaultOptions.descriptionColor)\n if (this._descriptionColor !== newColor) {\n this._descriptionColor = newColor\n this.requestRender()\n }\n }\n\n public set selectedDescriptionColor(value: ColorInput) {\n const newColor = parseColor(value ?? this._defaultOptions.selectedDescriptionColor)\n if (this._selectedDescriptionColor !== newColor) {\n this._selectedDescriptionColor = newColor\n this.requestRender()\n }\n }\n\n public set font(font: keyof typeof fonts) {\n this._font = font\n this.fontHeight = measureText({ text: \"A\", font: this._font }).height\n this.linesPerItem = this._showDescription\n ? this._font\n ? this.fontHeight + 1\n : 2\n : this._font\n ? this.fontHeight\n : 1\n this.linesPerItem += this._itemSpacing\n this.maxVisibleItems = Math.max(1, Math.floor(this.height / this.linesPerItem))\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public set itemSpacing(spacing: number) {\n this._itemSpacing = spacing\n this.linesPerItem = this._showDescription\n ? this._font\n ? this.fontHeight + 1\n : 2\n : this._font\n ? this.fontHeight\n : 1\n this.linesPerItem += this._itemSpacing\n this.maxVisibleItems = Math.max(1, Math.floor(this.height / this.linesPerItem))\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public set fastScrollStep(step: number) {\n this._fastScrollStep = step\n }\n\n public set keyBindings(bindings: SelectKeyBinding[]) {\n this._keyBindings = bindings\n const mergedBindings = mergeKeyBindings(defaultSelectKeybindings, bindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n }\n\n public set keyAliasMap(aliases: KeyAliasMap) {\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, aliases)\n const mergedBindings = mergeKeyBindings(defaultSelectKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n }\n\n public set selectedIndex(value: number) {\n const newIndex = value ?? this._defaultOptions.selectedIndex\n const clampedIndex = this._options.length > 0 ? Math.min(Math.max(0, newIndex), this._options.length - 1) : 0\n if (this._selectedIndex !== clampedIndex) {\n this._selectedIndex = clampedIndex\n this.updateScrollOffset()\n this.requestRender()\n }\n }\n}\n",
31
+ "import { Renderable, type RenderableOptions } from \"../Renderable\"\nimport { OptimizedBuffer } from \"../buffer\"\nimport { RGBA, parseColor, type ColorInput } from \"../lib/RGBA\"\nimport type { KeyEvent } from \"../lib/KeyHandler\"\nimport type { RenderContext } from \"../types\"\nimport {\n type KeyBinding as BaseKeyBinding,\n mergeKeyBindings,\n getKeyBindingKey,\n buildKeyBindingsMap,\n type KeyAliasMap,\n defaultKeyAliases,\n mergeKeyAliases,\n} from \"../lib/keymapping\"\n\nexport interface TabSelectOption {\n name: string\n description: string\n value?: any\n}\n\nexport type TabSelectAction = \"move-left\" | \"move-right\" | \"select-current\"\n\nexport type TabSelectKeyBinding = BaseKeyBinding<TabSelectAction>\n\nconst defaultTabSelectKeybindings: TabSelectKeyBinding[] = [\n { name: \"left\", action: \"move-left\" },\n { name: \"[\", action: \"move-left\" },\n { name: \"right\", action: \"move-right\" },\n { name: \"]\", action: \"move-right\" },\n { name: \"return\", action: \"select-current\" },\n { name: \"linefeed\", action: \"select-current\" },\n]\n\nexport interface TabSelectRenderableOptions extends Omit<RenderableOptions<TabSelectRenderable>, \"height\"> {\n height?: number\n options?: TabSelectOption[]\n tabWidth?: number\n backgroundColor?: ColorInput\n textColor?: ColorInput\n focusedBackgroundColor?: ColorInput\n focusedTextColor?: ColorInput\n selectedBackgroundColor?: ColorInput\n selectedTextColor?: ColorInput\n selectedDescriptionColor?: ColorInput\n showScrollArrows?: boolean\n showDescription?: boolean\n showUnderline?: boolean\n wrapSelection?: boolean\n keyBindings?: TabSelectKeyBinding[]\n keyAliasMap?: KeyAliasMap\n}\n\nexport enum TabSelectRenderableEvents {\n SELECTION_CHANGED = \"selectionChanged\",\n ITEM_SELECTED = \"itemSelected\",\n}\n\nfunction calculateDynamicHeight(showUnderline: boolean, showDescription: boolean): number {\n let height = 1\n\n if (showUnderline) {\n height += 1\n }\n\n if (showDescription) {\n height += 1\n }\n\n return height\n}\n\nexport class TabSelectRenderable extends Renderable {\n protected _focusable: boolean = true\n\n private _options: TabSelectOption[] = []\n private selectedIndex: number = 0\n private scrollOffset: number = 0\n private _tabWidth: number\n private maxVisibleTabs: number\n\n private _backgroundColor: RGBA\n private _textColor: RGBA\n private _focusedBackgroundColor: RGBA\n private _focusedTextColor: RGBA\n private _selectedBackgroundColor: RGBA\n private _selectedTextColor: RGBA\n private _selectedDescriptionColor: RGBA\n private _showScrollArrows: boolean\n private _showDescription: boolean\n private _showUnderline: boolean\n private _wrapSelection: boolean\n private _keyBindingsMap: Map<string, TabSelectAction>\n private _keyAliasMap: KeyAliasMap\n private _keyBindings: TabSelectKeyBinding[]\n\n constructor(ctx: RenderContext, options: TabSelectRenderableOptions) {\n const calculatedHeight = calculateDynamicHeight(options.showUnderline ?? true, options.showDescription ?? true)\n\n super(ctx, { ...options, height: calculatedHeight, buffered: true })\n\n this._backgroundColor = parseColor(options.backgroundColor || \"transparent\")\n this._textColor = parseColor(options.textColor || \"#FFFFFF\")\n this._focusedBackgroundColor = parseColor(options.focusedBackgroundColor || options.backgroundColor || \"#1a1a1a\")\n this._focusedTextColor = parseColor(options.focusedTextColor || options.textColor || \"#FFFFFF\")\n this._options = options.options || []\n this._tabWidth = options.tabWidth || 20\n this._showDescription = options.showDescription ?? true\n this._showUnderline = options.showUnderline ?? true\n this._showScrollArrows = options.showScrollArrows ?? true\n this._wrapSelection = options.wrapSelection ?? false\n\n this.maxVisibleTabs = Math.max(1, Math.floor(this.width / this._tabWidth))\n\n this._selectedBackgroundColor = parseColor(options.selectedBackgroundColor || \"#334455\")\n this._selectedTextColor = parseColor(options.selectedTextColor || \"#FFFF00\")\n this._selectedDescriptionColor = parseColor(options.selectedDescriptionColor || \"#CCCCCC\")\n\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, options.keyAliasMap || {})\n this._keyBindings = options.keyBindings || []\n const mergedBindings = mergeKeyBindings(defaultTabSelectKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n }\n\n private calculateDynamicHeight(): number {\n return calculateDynamicHeight(this._showUnderline, this._showDescription)\n }\n\n protected renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {\n if (!this.visible || !this.frameBuffer) return\n\n if (this.isDirty) {\n this.refreshFrameBuffer()\n }\n }\n\n private refreshFrameBuffer(): void {\n if (!this.frameBuffer) return\n // Use focused colors if focused\n const bgColor = this._focused ? this._focusedBackgroundColor : this._backgroundColor\n this.frameBuffer.clear(bgColor)\n if (this._options.length === 0) return\n\n const contentX = 0\n const contentY = 0\n const contentWidth = this.width\n const contentHeight = this.height\n\n const visibleOptions = this._options.slice(this.scrollOffset, this.scrollOffset + this.maxVisibleTabs)\n\n // Render tab names\n for (let i = 0; i < visibleOptions.length; i++) {\n const actualIndex = this.scrollOffset + i\n const option = visibleOptions[i]\n const isSelected = actualIndex === this.selectedIndex\n const tabX = contentX + i * this._tabWidth\n\n if (tabX >= contentX + contentWidth) break\n\n const actualTabWidth = Math.min(this._tabWidth, contentWidth - i * this._tabWidth)\n\n if (isSelected) {\n this.frameBuffer.fillRect(tabX, contentY, actualTabWidth, 1, this._selectedBackgroundColor)\n }\n\n const baseTextColor = this._focused ? this._focusedTextColor : this._textColor\n const nameColor = isSelected ? this._selectedTextColor : baseTextColor\n const nameContent = this.truncateText(option.name, actualTabWidth - 2)\n this.frameBuffer.drawText(nameContent, tabX + 1, contentY, nameColor)\n\n if (isSelected && this._showUnderline && contentHeight >= 2) {\n const underlineY = contentY + 1\n const underlineBg = isSelected ? this._selectedBackgroundColor : bgColor\n this.frameBuffer.drawText(\"▬\".repeat(actualTabWidth), tabX, underlineY, nameColor, underlineBg)\n }\n }\n\n if (this._showDescription && contentHeight >= (this._showUnderline ? 3 : 2)) {\n const selectedOption = this.getSelectedOption()\n if (selectedOption) {\n const descriptionY = contentY + (this._showUnderline ? 2 : 1)\n const descColor = this._selectedDescriptionColor\n const descContent = this.truncateText(selectedOption.description, contentWidth - 2)\n this.frameBuffer.drawText(descContent, contentX + 1, descriptionY, descColor)\n }\n }\n\n if (this._showScrollArrows && this._options.length > this.maxVisibleTabs) {\n this.renderScrollArrowsToFrameBuffer(contentX, contentY, contentWidth, contentHeight)\n }\n }\n\n private truncateText(text: string, maxWidth: number): string {\n if (text.length <= maxWidth) return text\n return text.substring(0, Math.max(0, maxWidth - 1)) + \"…\"\n }\n\n private renderScrollArrowsToFrameBuffer(\n contentX: number,\n contentY: number,\n contentWidth: number,\n contentHeight: number,\n ): void {\n if (!this.frameBuffer) return\n\n const hasMoreLeft = this.scrollOffset > 0\n const hasMoreRight = this.scrollOffset + this.maxVisibleTabs < this._options.length\n\n if (hasMoreLeft) {\n this.frameBuffer.drawText(\"‹\", contentX, contentY, parseColor(\"#AAAAAA\"))\n }\n\n if (hasMoreRight) {\n this.frameBuffer.drawText(\"›\", contentX + contentWidth - 1, contentY, parseColor(\"#AAAAAA\"))\n }\n }\n\n public setOptions(options: TabSelectOption[]): void {\n this._options = options\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, options.length - 1))\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public getSelectedOption(): TabSelectOption | null {\n return this._options[this.selectedIndex] || null\n }\n\n public getSelectedIndex(): number {\n return this.selectedIndex\n }\n\n public moveLeft(): void {\n if (this.selectedIndex > 0) {\n this.selectedIndex--\n } else if (this._wrapSelection && this._options.length > 0) {\n this.selectedIndex = this._options.length - 1\n } else {\n return\n }\n\n this.updateScrollOffset()\n this.requestRender()\n this.emit(TabSelectRenderableEvents.SELECTION_CHANGED, this.selectedIndex, this.getSelectedOption())\n }\n\n public moveRight(): void {\n if (this.selectedIndex < this._options.length - 1) {\n this.selectedIndex++\n } else if (this._wrapSelection && this._options.length > 0) {\n this.selectedIndex = 0\n } else {\n return\n }\n\n this.updateScrollOffset()\n this.requestRender()\n this.emit(TabSelectRenderableEvents.SELECTION_CHANGED, this.selectedIndex, this.getSelectedOption())\n }\n\n public selectCurrent(): void {\n const selected = this.getSelectedOption()\n if (selected) {\n this.emit(TabSelectRenderableEvents.ITEM_SELECTED, this.selectedIndex, selected)\n }\n }\n\n public setSelectedIndex(index: number): void {\n if (index >= 0 && index < this._options.length) {\n this.selectedIndex = index\n this.updateScrollOffset()\n this.requestRender()\n this.emit(TabSelectRenderableEvents.SELECTION_CHANGED, this.selectedIndex, this.getSelectedOption())\n }\n }\n\n private updateScrollOffset(): void {\n const halfVisible = Math.floor(this.maxVisibleTabs / 2)\n const newScrollOffset = Math.max(\n 0,\n Math.min(this.selectedIndex - halfVisible, this._options.length - this.maxVisibleTabs),\n )\n\n if (newScrollOffset !== this.scrollOffset) {\n this.scrollOffset = newScrollOffset\n this.requestRender()\n }\n }\n\n protected onResize(width: number, height: number): void {\n this.maxVisibleTabs = Math.max(1, Math.floor(width / this._tabWidth))\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public setTabWidth(tabWidth: number): void {\n if (this._tabWidth === tabWidth) return\n\n this._tabWidth = tabWidth\n this.maxVisibleTabs = Math.max(1, Math.floor(this.width / this._tabWidth))\n\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public getTabWidth(): number {\n return this._tabWidth\n }\n\n public handleKeyPress(key: KeyEvent): boolean {\n const bindingKey = getKeyBindingKey({\n name: key.name,\n ctrl: key.ctrl,\n shift: key.shift,\n meta: key.meta,\n super: key.super,\n action: \"move-left\" as TabSelectAction,\n })\n\n const action = this._keyBindingsMap.get(bindingKey)\n\n if (action) {\n switch (action) {\n case \"move-left\":\n this.moveLeft()\n return true\n case \"move-right\":\n this.moveRight()\n return true\n case \"select-current\":\n this.selectCurrent()\n return true\n }\n }\n\n return false\n }\n\n public get options(): TabSelectOption[] {\n return this._options\n }\n\n public set options(options: TabSelectOption[]) {\n this._options = options\n this.selectedIndex = Math.min(this.selectedIndex, Math.max(0, options.length - 1))\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public set backgroundColor(color: ColorInput) {\n this._backgroundColor = parseColor(color)\n this.requestRender()\n }\n\n public set textColor(color: ColorInput) {\n this._textColor = parseColor(color)\n this.requestRender()\n }\n\n public set focusedBackgroundColor(color: ColorInput) {\n this._focusedBackgroundColor = parseColor(color)\n this.requestRender()\n }\n\n public set focusedTextColor(color: ColorInput) {\n this._focusedTextColor = parseColor(color)\n this.requestRender()\n }\n\n public set selectedBackgroundColor(color: ColorInput) {\n this._selectedBackgroundColor = parseColor(color)\n this.requestRender()\n }\n\n public set selectedTextColor(color: ColorInput) {\n this._selectedTextColor = parseColor(color)\n this.requestRender()\n }\n\n public set selectedDescriptionColor(color: ColorInput) {\n this._selectedDescriptionColor = parseColor(color)\n this.requestRender()\n }\n\n public get showDescription(): boolean {\n return this._showDescription\n }\n\n public set showDescription(show: boolean) {\n if (this._showDescription !== show) {\n this._showDescription = show\n const newHeight = this.calculateDynamicHeight()\n this.height = newHeight\n this.requestRender()\n }\n }\n\n public get showUnderline(): boolean {\n return this._showUnderline\n }\n\n public set showUnderline(show: boolean) {\n if (this._showUnderline !== show) {\n this._showUnderline = show\n const newHeight = this.calculateDynamicHeight()\n this.height = newHeight\n this.requestRender()\n }\n }\n\n public get showScrollArrows(): boolean {\n return this._showScrollArrows\n }\n\n public set showScrollArrows(show: boolean) {\n if (this._showScrollArrows !== show) {\n this._showScrollArrows = show\n this.requestRender()\n }\n }\n\n public get wrapSelection(): boolean {\n return this._wrapSelection\n }\n\n public set wrapSelection(wrap: boolean) {\n this._wrapSelection = wrap\n }\n\n public get tabWidth(): number {\n return this._tabWidth\n }\n\n public set tabWidth(tabWidth: number) {\n if (this._tabWidth === tabWidth) return\n\n this._tabWidth = tabWidth\n this.maxVisibleTabs = Math.max(1, Math.floor(this.width / this._tabWidth))\n\n this.updateScrollOffset()\n this.requestRender()\n }\n\n public set keyBindings(bindings: TabSelectKeyBinding[]) {\n this._keyBindings = bindings\n const mergedBindings = mergeKeyBindings(defaultTabSelectKeybindings, bindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n }\n\n public set keyAliasMap(aliases: KeyAliasMap) {\n this._keyAliasMap = mergeKeyAliases(defaultKeyAliases, aliases)\n const mergedBindings = mergeKeyBindings(defaultTabSelectKeybindings, this._keyBindings)\n this._keyBindingsMap = buildKeyBindingsMap(mergedBindings, this._keyAliasMap)\n }\n}\n",
32
+ "// Core exports without 3D dependencies\nexport * from \"./Renderable\"\nexport * from \"./types\"\nexport * from \"./utils\"\nexport * from \"./buffer\"\nexport * from \"./text-buffer\"\nexport * from \"./text-buffer-view\"\nexport * from \"./edit-buffer\"\nexport * from \"./editor-view\"\nexport * from \"./syntax-style\"\nexport * from \"./post/filters\"\nexport * from \"./animation/Timeline\"\nexport * from \"./lib\"\nexport * from \"./renderer\"\nexport * from \"./renderables\"\nexport * from \"./zig\"\nexport * from \"./console\"\nexport * as Yoga from \"yoga-layout\"\n"
33
+ ],
34
+ "mappings": "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",
35
+ "debugId": "CCB9AFCC274DF9B164756E2164756E21",
36
+ "names": []
37
+ }