gitextract_ou224iei/ ├── .editorconfig ├── .github/ │ ├── CODEOWNERS │ └── workflows/ │ ├── build-core.yml │ ├── build-examples.yml │ ├── build-native.yml │ ├── build-react.yml │ ├── build-solid.yml │ ├── deploy.yml │ ├── npm-latest-release.yml │ ├── npm-release.yml │ ├── opencode.yml │ ├── pkg-pr-new.yml │ ├── prettier.yml │ ├── release.yml │ └── review.yml ├── .gitignore ├── .prettierignore ├── .zig-version ├── AGENTS.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── opentui.pc.in ├── package.json ├── packages/ │ ├── core/ │ │ ├── .gitignore │ │ ├── README.md │ │ ├── dev/ │ │ │ ├── keypress-debug-renderer.ts │ │ │ ├── keypress-debug.ts │ │ │ ├── print-env-vars.ts │ │ │ ├── test-tmux-graphics-334.sh │ │ │ └── thai-debug-test.ts │ │ ├── docs/ │ │ │ └── development.md │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── build.ts │ │ │ └── publish.ts │ │ ├── src/ │ │ │ ├── 3d/ │ │ │ │ ├── SpriteResourceManager.ts │ │ │ │ ├── SpriteUtils.ts │ │ │ │ ├── TextureUtils.ts │ │ │ │ ├── ThreeRenderable.ts │ │ │ │ ├── WGPURenderer.ts │ │ │ │ ├── animation/ │ │ │ │ │ ├── ExplodingSpriteEffect.ts │ │ │ │ │ ├── PhysicsExplodingSpriteEffect.ts │ │ │ │ │ ├── SpriteAnimator.ts │ │ │ │ │ └── SpriteParticleGenerator.ts │ │ │ │ ├── canvas.ts │ │ │ │ ├── index.ts │ │ │ │ ├── physics/ │ │ │ │ │ ├── PlanckPhysicsAdapter.ts │ │ │ │ │ ├── RapierPhysicsAdapter.ts │ │ │ │ │ └── physics-interface.ts │ │ │ │ └── shaders/ │ │ │ │ └── supersampling.wgsl │ │ │ ├── 3d.ts │ │ │ ├── NativeSpanFeed.ts │ │ │ ├── Renderable.ts │ │ │ ├── __snapshots__/ │ │ │ │ └── buffer.test.ts.snap │ │ │ ├── animation/ │ │ │ │ ├── Timeline.test.ts │ │ │ │ └── Timeline.ts │ │ │ ├── ansi.ts │ │ │ ├── benchmark/ │ │ │ │ ├── .gitignore │ │ │ │ ├── attenuation-benchmark.ts │ │ │ │ ├── colormatrix-benchmark.ts │ │ │ │ ├── gain-benchmark.ts │ │ │ │ ├── latest-all-bench-run.json │ │ │ │ ├── latest-async-bench-run.json │ │ │ │ ├── latest-default-bench-run.json │ │ │ │ ├── latest-large-bench-run.json │ │ │ │ ├── latest-quick-bench-run.json │ │ │ │ ├── markdown-benchmark.ts │ │ │ │ ├── native-span-feed-async-benchmark.ts │ │ │ │ ├── native-span-feed-benchmark.md │ │ │ │ ├── native-span-feed-benchmark.ts │ │ │ │ ├── native-span-feed-compare.ts │ │ │ │ ├── renderer-benchmark.ts │ │ │ │ └── text-table-benchmark.ts │ │ │ ├── buffer.test.ts │ │ │ ├── buffer.ts │ │ │ ├── console.test.ts │ │ │ ├── console.ts │ │ │ ├── edit-buffer.test.ts │ │ │ ├── edit-buffer.ts │ │ │ ├── editor-view.test.ts │ │ │ ├── editor-view.ts │ │ │ ├── examples/ │ │ │ │ ├── ascii-font-selection-demo.ts │ │ │ │ ├── assets/ │ │ │ │ │ └── hast-example.json │ │ │ │ ├── build.ts │ │ │ │ ├── code-demo.ts │ │ │ │ ├── console-demo.ts │ │ │ │ ├── core-plugin-slots-demo.ts │ │ │ │ ├── diff-demo.ts │ │ │ │ ├── draggable-three-demo.ts │ │ │ │ ├── editor-demo.ts │ │ │ │ ├── extmarks-demo.ts │ │ │ │ ├── focus-restore-demo.ts │ │ │ │ ├── fonts.ts │ │ │ │ ├── fractal-shader-demo.ts │ │ │ │ ├── framebuffer-demo.ts │ │ │ │ ├── full-unicode-demo.ts │ │ │ │ ├── golden-star-demo.ts │ │ │ │ ├── grayscale-buffer-demo.ts │ │ │ │ ├── hast-syntax-highlighting-demo.ts │ │ │ │ ├── index.ts │ │ │ │ ├── input-demo.ts │ │ │ │ ├── input-select-layout-demo.ts │ │ │ │ ├── install.sh │ │ │ │ ├── keypress-debug-demo.ts │ │ │ │ ├── lib/ │ │ │ │ │ ├── HexList.ts │ │ │ │ │ ├── PaletteGrid.ts │ │ │ │ │ ├── standalone-keys.ts │ │ │ │ │ └── tab-controller.ts │ │ │ │ ├── lights-phong-demo.ts │ │ │ │ ├── link-demo.ts │ │ │ │ ├── live-state-demo.ts │ │ │ │ ├── markdown-demo.ts │ │ │ │ ├── mouse-interaction-demo.ts │ │ │ │ ├── nested-zindex-demo.ts │ │ │ │ ├── opacity-example.ts │ │ │ │ ├── opentui-demo.ts │ │ │ │ ├── physx-planck-2d-demo.ts │ │ │ │ ├── physx-rapier-2d-demo.ts │ │ │ │ ├── relative-positioning-demo.ts │ │ │ │ ├── scroll-example.ts │ │ │ │ ├── scrollbox-mouse-test.ts │ │ │ │ ├── scrollbox-overlay-hit-test.ts │ │ │ │ ├── select-demo.ts │ │ │ │ ├── shader-cube-demo.ts │ │ │ │ ├── simple-layout-example.ts │ │ │ │ ├── slider-demo.ts │ │ │ │ ├── split-mode-demo.ts │ │ │ │ ├── sprite-animation-demo.ts │ │ │ │ ├── sprite-particle-generator-demo.ts │ │ │ │ ├── static-sprite-demo.ts │ │ │ │ ├── sticky-scroll-example.ts │ │ │ │ ├── styled-text-demo.ts │ │ │ │ ├── tab-select-demo.ts │ │ │ │ ├── terminal-title.ts │ │ │ │ ├── terminal.ts │ │ │ │ ├── text-node-demo.ts │ │ │ │ ├── text-selection-demo.ts │ │ │ │ ├── text-table-demo.ts │ │ │ │ ├── text-truncation-demo.ts │ │ │ │ ├── text-wrap.ts │ │ │ │ ├── texture-loading-demo.ts │ │ │ │ ├── timeline-example.ts │ │ │ │ ├── transparency-demo.ts │ │ │ │ └── vnode-composition-demo.ts │ │ │ ├── index.ts │ │ │ ├── lib/ │ │ │ │ ├── KeyHandler.integration.test.ts │ │ │ │ ├── KeyHandler.stopPropagation.test.ts │ │ │ │ ├── KeyHandler.test.ts │ │ │ │ ├── KeyHandler.ts │ │ │ │ ├── RGBA.test.ts │ │ │ │ ├── RGBA.ts │ │ │ │ ├── ascii.font.ts │ │ │ │ ├── border.test.ts │ │ │ │ ├── border.ts │ │ │ │ ├── bunfs.test.ts │ │ │ │ ├── bunfs.ts │ │ │ │ ├── clipboard.test.ts │ │ │ │ ├── clipboard.ts │ │ │ │ ├── clock.ts │ │ │ │ ├── data-paths.test.ts │ │ │ │ ├── data-paths.ts │ │ │ │ ├── debounce.ts │ │ │ │ ├── detect-links.test.ts │ │ │ │ ├── detect-links.ts │ │ │ │ ├── env.test.ts │ │ │ │ ├── env.ts │ │ │ │ ├── extmarks-history.ts │ │ │ │ ├── extmarks-multiwidth.test.ts │ │ │ │ ├── extmarks.test.ts │ │ │ │ ├── extmarks.ts │ │ │ │ ├── fonts/ │ │ │ │ │ ├── block.json │ │ │ │ │ ├── grid.json │ │ │ │ │ ├── huge.json │ │ │ │ │ ├── pallet.json │ │ │ │ │ ├── shade.json │ │ │ │ │ ├── slick.json │ │ │ │ │ └── tiny.json │ │ │ │ ├── hast-styled-text.ts │ │ │ │ ├── index.ts │ │ │ │ ├── keymapping.test.ts │ │ │ │ ├── keymapping.ts │ │ │ │ ├── objects-in-viewport.test.ts │ │ │ │ ├── objects-in-viewport.ts │ │ │ │ ├── output.capture.ts │ │ │ │ ├── parse.keypress-kitty.protocol.test.ts │ │ │ │ ├── parse.keypress-kitty.test.ts │ │ │ │ ├── parse.keypress-kitty.ts │ │ │ │ ├── parse.keypress.test.ts │ │ │ │ ├── parse.keypress.ts │ │ │ │ ├── parse.mouse.test.ts │ │ │ │ ├── parse.mouse.ts │ │ │ │ ├── paste.ts │ │ │ │ ├── queue.ts │ │ │ │ ├── renderable.validations.test.ts │ │ │ │ ├── renderable.validations.ts │ │ │ │ ├── scroll-acceleration.ts │ │ │ │ ├── selection.ts │ │ │ │ ├── singleton.ts │ │ │ │ ├── stdin-parser.test.ts │ │ │ │ ├── stdin-parser.ts │ │ │ │ ├── styled-text.ts │ │ │ │ ├── terminal-capability-detection.test.ts │ │ │ │ ├── terminal-capability-detection.ts │ │ │ │ ├── terminal-palette.test.ts │ │ │ │ ├── terminal-palette.ts │ │ │ │ ├── tree-sitter/ │ │ │ │ │ ├── assets/ │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── javascript/ │ │ │ │ │ │ │ ├── highlights.scm │ │ │ │ │ │ │ └── tree-sitter-javascript.wasm │ │ │ │ │ │ ├── markdown/ │ │ │ │ │ │ │ ├── highlights.scm │ │ │ │ │ │ │ ├── injections.scm │ │ │ │ │ │ │ └── tree-sitter-markdown.wasm │ │ │ │ │ │ ├── markdown_inline/ │ │ │ │ │ │ │ ├── highlights.scm │ │ │ │ │ │ │ └── tree-sitter-markdown_inline.wasm │ │ │ │ │ │ ├── typescript/ │ │ │ │ │ │ │ ├── highlights.scm │ │ │ │ │ │ │ └── tree-sitter-typescript.wasm │ │ │ │ │ │ ├── update.ts │ │ │ │ │ │ └── zig/ │ │ │ │ │ │ ├── highlights.scm │ │ │ │ │ │ └── tree-sitter-zig.wasm │ │ │ │ │ ├── assets.d.ts │ │ │ │ │ ├── cache.test.ts │ │ │ │ │ ├── client.test.ts │ │ │ │ │ ├── client.ts │ │ │ │ │ ├── default-parsers.ts │ │ │ │ │ ├── download-utils.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── parser.worker.ts │ │ │ │ │ ├── parsers-config.ts │ │ │ │ │ ├── resolve-ft.test.ts │ │ │ │ │ ├── resolve-ft.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── tree-sitter-styled-text.test.ts │ │ │ │ ├── tree-sitter-styled-text.ts │ │ │ │ ├── validate-dir-name.ts │ │ │ │ ├── yoga.options.test.ts │ │ │ │ └── yoga.options.ts │ │ │ ├── plugins/ │ │ │ │ ├── core-slot.ts │ │ │ │ ├── registry.ts │ │ │ │ └── types.ts │ │ │ ├── post/ │ │ │ │ ├── effects.ts │ │ │ │ ├── filters.ts │ │ │ │ └── matrices.ts │ │ │ ├── renderables/ │ │ │ │ ├── ASCIIFont.ts │ │ │ │ ├── Box.test.ts │ │ │ │ ├── Box.ts │ │ │ │ ├── Code.test.ts │ │ │ │ ├── Code.ts │ │ │ │ ├── Diff.regression.test.ts │ │ │ │ ├── Diff.test.ts │ │ │ │ ├── Diff.ts │ │ │ │ ├── EditBufferRenderable.ts │ │ │ │ ├── FrameBuffer.ts │ │ │ │ ├── Input.test.ts │ │ │ │ ├── Input.ts │ │ │ │ ├── LineNumberRenderable.ts │ │ │ │ ├── Markdown.ts │ │ │ │ ├── ScrollBar.ts │ │ │ │ ├── ScrollBox.ts │ │ │ │ ├── Select.test.ts │ │ │ │ ├── Select.ts │ │ │ │ ├── Slider.test.ts │ │ │ │ ├── Slider.ts │ │ │ │ ├── TabSelect.test.ts │ │ │ │ ├── TabSelect.ts │ │ │ │ ├── Text.selection-buffer.test.ts │ │ │ │ ├── Text.test.ts │ │ │ │ ├── Text.ts │ │ │ │ ├── TextBufferRenderable.ts │ │ │ │ ├── TextNode.test.ts │ │ │ │ ├── TextNode.ts │ │ │ │ ├── TextTable.test.ts │ │ │ │ ├── TextTable.ts │ │ │ │ ├── Textarea.ts │ │ │ │ ├── TimeToFirstDraw.ts │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── Code.test.ts.snap │ │ │ │ │ ├── Diff.test.ts.snap │ │ │ │ │ ├── Text.test.ts.snap │ │ │ │ │ └── TextTable.test.ts.snap │ │ │ │ ├── __tests__/ │ │ │ │ │ ├── LineNumberRenderable.scrollbox-simple.test.ts │ │ │ │ │ ├── LineNumberRenderable.scrollbox.test.ts │ │ │ │ │ ├── LineNumberRenderable.test.ts │ │ │ │ │ ├── LineNumberRenderable.wrapping.test.ts │ │ │ │ │ ├── Markdown.code-colors.test.ts │ │ │ │ │ ├── Markdown.test.ts │ │ │ │ │ ├── MultiRenderable.selection.test.ts │ │ │ │ │ ├── Textarea.buffer.test.ts │ │ │ │ │ ├── Textarea.destroyed-events.test.ts │ │ │ │ │ ├── Textarea.editing.test.ts │ │ │ │ │ ├── Textarea.error-handling.test.ts │ │ │ │ │ ├── Textarea.events.test.ts │ │ │ │ │ ├── Textarea.highlights.test.ts │ │ │ │ │ ├── Textarea.keybinding.test.ts │ │ │ │ │ ├── Textarea.paste.test.ts │ │ │ │ │ ├── Textarea.rendering.test.ts │ │ │ │ │ ├── Textarea.scroll.test.ts │ │ │ │ │ ├── Textarea.selection.test.ts │ │ │ │ │ ├── Textarea.stress.test.ts │ │ │ │ │ ├── Textarea.undo-redo.test.ts │ │ │ │ │ ├── Textarea.visual-lines.test.ts │ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ │ ├── LineNumberRenderable.code.test.ts.snap │ │ │ │ │ │ ├── LineNumberRenderable.scrollbox-simple.test.ts.snap │ │ │ │ │ │ ├── LineNumberRenderable.scrollbox.test.ts.snap │ │ │ │ │ │ ├── LineNumberRenderable.test.ts.snap │ │ │ │ │ │ └── Textarea.rendering.test.ts.snap │ │ │ │ │ ├── markdown-parser.test.ts │ │ │ │ │ └── renderable-test-utils.ts │ │ │ │ ├── composition/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── VRenderable.ts │ │ │ │ │ ├── constructs.ts │ │ │ │ │ └── vnode.ts │ │ │ │ ├── index.ts │ │ │ │ └── markdown-parser.ts │ │ │ ├── renderer.ts │ │ │ ├── runtime-plugin-support.ts │ │ │ ├── runtime-plugin.ts │ │ │ ├── syntax-style.test.ts │ │ │ ├── syntax-style.ts │ │ │ ├── testing/ │ │ │ │ ├── README.md │ │ │ │ ├── capture-spans.test.ts │ │ │ │ ├── integration.test.ts │ │ │ │ ├── manual-clock.ts │ │ │ │ ├── mock-keys.test.ts │ │ │ │ ├── mock-keys.ts │ │ │ │ ├── mock-mouse.test.ts │ │ │ │ ├── mock-mouse.ts │ │ │ │ ├── mock-tree-sitter-client.ts │ │ │ │ ├── spy.ts │ │ │ │ ├── test-recorder.test.ts │ │ │ │ ├── test-recorder.ts │ │ │ │ └── test-renderer.ts │ │ │ ├── testing.ts │ │ │ ├── tests/ │ │ │ │ ├── __snapshots__/ │ │ │ │ │ ├── absolute-positioning.snapshot.test.ts.snap │ │ │ │ │ ├── renderable.snapshot.test.ts.snap │ │ │ │ │ └── scrollbox.test.ts.snap │ │ │ │ ├── absolute-positioning.snapshot.test.ts │ │ │ │ ├── allocator-stats.test.ts │ │ │ │ ├── destroy-during-render.test.ts │ │ │ │ ├── hover-cursor.test.ts │ │ │ │ ├── native-span-feed-async.test.ts │ │ │ │ ├── native-span-feed-close.test.ts │ │ │ │ ├── native-span-feed-coverage.test.ts │ │ │ │ ├── native-span-feed-edge-cases.test.ts │ │ │ │ ├── native-span-feed-use-after-free.test.ts │ │ │ │ ├── opacity.test.ts │ │ │ │ ├── renderable.snapshot.test.ts │ │ │ │ ├── renderable.test.ts │ │ │ │ ├── renderer.clock.test.ts │ │ │ │ ├── renderer.console-startup.test.ts │ │ │ │ ├── renderer.control.test.ts │ │ │ │ ├── renderer.core-slot-binding.test.ts │ │ │ │ ├── renderer.cursor.test.ts │ │ │ │ ├── renderer.destroy-during-render.test.ts │ │ │ │ ├── renderer.focus-restore.test.ts │ │ │ │ ├── renderer.focus.test.ts │ │ │ │ ├── renderer.idle.test.ts │ │ │ │ ├── renderer.input.test.ts │ │ │ │ ├── renderer.kitty-flags.test.ts │ │ │ │ ├── renderer.mouse.test.ts │ │ │ │ ├── renderer.palette.test.ts │ │ │ │ ├── renderer.selection.test.ts │ │ │ │ ├── renderer.slot-registry.test.ts │ │ │ │ ├── renderer.useMouse.test.ts │ │ │ │ ├── runtime-plugin-resolve-roots.fixture.ts │ │ │ │ ├── runtime-plugin-support.fixture.ts │ │ │ │ ├── runtime-plugin-support.test.ts │ │ │ │ ├── runtime-plugin.fixture.ts │ │ │ │ ├── runtime-plugin.test.ts │ │ │ │ ├── scrollbox-culling-bug.test.ts │ │ │ │ ├── scrollbox-hitgrid-resize.test.ts │ │ │ │ ├── scrollbox-hitgrid.test.ts │ │ │ │ ├── scrollbox.test.ts │ │ │ │ ├── wrap-resize-perf.test.ts │ │ │ │ └── yoga-setters.test.ts │ │ │ ├── text-buffer-view.test.ts │ │ │ ├── text-buffer-view.ts │ │ │ ├── text-buffer.test.ts │ │ │ ├── text-buffer.ts │ │ │ ├── types.ts │ │ │ ├── utils.ts │ │ │ ├── zig/ │ │ │ │ ├── ansi.zig │ │ │ │ ├── bench/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── buffer-draw-text-buffer_bench.zig │ │ │ │ │ ├── edit-buffer_bench.zig │ │ │ │ │ ├── native-span-feed_bench.zig │ │ │ │ │ ├── rope-markers_bench.zig │ │ │ │ │ ├── rope_bench.zig │ │ │ │ │ ├── styled-text_bench.zig │ │ │ │ │ ├── text-buffer-coords_bench.zig │ │ │ │ │ ├── text-buffer-view_bench.zig │ │ │ │ │ ├── text-chunk-graphemes_bench.zig │ │ │ │ │ └── utf8_bench.zig │ │ │ │ ├── bench-utils.zig │ │ │ │ ├── bench.zig │ │ │ │ ├── buffer-methods.zig │ │ │ │ ├── buffer.zig │ │ │ │ ├── build.zig │ │ │ │ ├── build.zig.zon │ │ │ │ ├── edit-buffer.zig │ │ │ │ ├── editor-view.zig │ │ │ │ ├── event-bus.zig │ │ │ │ ├── event-emitter.zig │ │ │ │ ├── file-logger.zig │ │ │ │ ├── grapheme.zig │ │ │ │ ├── lib.zig │ │ │ │ ├── link.zig │ │ │ │ ├── logger.zig │ │ │ │ ├── mem-registry.zig │ │ │ │ ├── native-span-feed-bench-lib.zig │ │ │ │ ├── native-span-feed.zig │ │ │ │ ├── renderer.zig │ │ │ │ ├── rope.zig │ │ │ │ ├── syntax-style.zig │ │ │ │ ├── terminal.zig │ │ │ │ ├── test.zig │ │ │ │ ├── tests/ │ │ │ │ │ ├── README.md │ │ │ │ │ ├── buffer-methods_test.zig │ │ │ │ │ ├── buffer_test.zig │ │ │ │ │ ├── edit-buffer-history_test.zig │ │ │ │ │ ├── edit-buffer_test.zig │ │ │ │ │ ├── editor-view_test.zig │ │ │ │ │ ├── event-emitter_test.zig │ │ │ │ │ ├── grapheme_test.zig │ │ │ │ │ ├── link_test.zig │ │ │ │ │ ├── mem-registry_test.zig │ │ │ │ │ ├── memory_leak_regression_test.zig │ │ │ │ │ ├── native-span-feed_test.zig │ │ │ │ │ ├── renderer_test.zig │ │ │ │ │ ├── rope-nested_test.zig │ │ │ │ │ ├── rope_fuzz_test.zig │ │ │ │ │ ├── rope_test.zig │ │ │ │ │ ├── segment-merge.test.zig │ │ │ │ │ ├── syntax-style_test.zig │ │ │ │ │ ├── terminal_test.zig │ │ │ │ │ ├── text-buffer-drawing_test.zig │ │ │ │ │ ├── text-buffer-highlights_test.zig │ │ │ │ │ ├── text-buffer-iterators_test.zig │ │ │ │ │ ├── text-buffer-segment_test.zig │ │ │ │ │ ├── text-buffer-selection_test.zig │ │ │ │ │ ├── text-buffer-selection_viewport_test.zig │ │ │ │ │ ├── text-buffer-view_test.zig │ │ │ │ │ ├── text-buffer_test.zig │ │ │ │ │ ├── unicode-width-map.zon │ │ │ │ │ ├── utf8_no_zwj_test.zig │ │ │ │ │ ├── utf8_test.zig │ │ │ │ │ ├── utf8_wcwidth_cursor_test.zig │ │ │ │ │ ├── utf8_wcwidth_test.zig │ │ │ │ │ ├── word-wrap-editing_test.zig │ │ │ │ │ └── wrap-cache-perf_test.zig │ │ │ │ ├── text-buffer-iterators.zig │ │ │ │ ├── text-buffer-segment.zig │ │ │ │ ├── text-buffer-view.zig │ │ │ │ ├── text-buffer.zig │ │ │ │ ├── utf8.zig │ │ │ │ └── utils.zig │ │ │ ├── zig-structs.ts │ │ │ └── zig.ts │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── react/ │ │ ├── README.md │ │ ├── docs/ │ │ │ └── EXTEND.md │ │ ├── examples/ │ │ │ ├── .plugin/ │ │ │ │ ├── index.tsx │ │ │ │ └── slot-components.tsx │ │ │ ├── animation.tsx │ │ │ ├── ascii.tsx │ │ │ ├── basic.tsx │ │ │ ├── borders.tsx │ │ │ ├── box.tsx │ │ │ ├── build.ts │ │ │ ├── counter.tsx │ │ │ ├── diff.tsx │ │ │ ├── extend-example.tsx │ │ │ ├── external-plugin-slots-demo.tsx │ │ │ ├── flush-sync.tsx │ │ │ ├── index.tsx │ │ │ ├── line-number.tsx │ │ │ ├── opacity.tsx │ │ │ ├── plugin-slots-errors.tsx │ │ │ ├── scroll.tsx │ │ │ ├── text.tsx │ │ │ └── tsconfig.json │ │ ├── jsx-dev-runtime.d.ts │ │ ├── jsx-dev-runtime.js │ │ ├── jsx-namespace.d.ts │ │ ├── jsx-runtime.d.ts │ │ ├── jsx-runtime.js │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── build.ts │ │ │ ├── publish.ts │ │ │ └── runtime-plugin-support.ts │ │ ├── src/ │ │ │ ├── components/ │ │ │ │ ├── app.tsx │ │ │ │ ├── error-boundary.tsx │ │ │ │ ├── index.ts │ │ │ │ └── text.ts │ │ │ ├── hooks/ │ │ │ │ ├── index.ts │ │ │ │ ├── use-event.ts │ │ │ │ ├── use-keyboard.ts │ │ │ │ ├── use-renderer.ts │ │ │ │ ├── use-resize.ts │ │ │ │ ├── use-terminal-dimensions.ts │ │ │ │ └── use-timeline.ts │ │ │ ├── index.ts │ │ │ ├── plugins/ │ │ │ │ └── slot.tsx │ │ │ ├── reconciler/ │ │ │ │ ├── devtools-polyfill.ts │ │ │ │ ├── devtools.ts │ │ │ │ ├── host-config.ts │ │ │ │ ├── reconciler.ts │ │ │ │ └── renderer.ts │ │ │ ├── test-utils.ts │ │ │ ├── time-to-first-draw.tsx │ │ │ ├── types/ │ │ │ │ ├── components.ts │ │ │ │ └── host.ts │ │ │ └── utils/ │ │ │ ├── id.ts │ │ │ └── index.ts │ │ ├── tests/ │ │ │ ├── __snapshots__/ │ │ │ │ └── layout.test.tsx.snap │ │ │ ├── destroy-crash.test.tsx │ │ │ ├── layout.test.tsx │ │ │ ├── link.test.tsx │ │ │ ├── runtime-plugin-support.fixture.ts │ │ │ ├── runtime-plugin-support.test.ts │ │ │ └── slot.test.tsx │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ ├── solid/ │ │ ├── README.md │ │ ├── bunfig.toml │ │ ├── examples/ │ │ │ ├── .plugin/ │ │ │ │ ├── index.tsx │ │ │ │ ├── package.json │ │ │ │ └── slot-components.tsx │ │ │ ├── build.ts │ │ │ ├── components/ │ │ │ │ ├── ExampleSelector.tsx │ │ │ │ ├── animation-demo.tsx │ │ │ │ ├── autocomplete-demo.tsx │ │ │ │ ├── code-demo.tsx │ │ │ │ ├── custom-scroll-accel-demo.tsx │ │ │ │ ├── diff-demo.tsx │ │ │ │ ├── extend-demo.tsx │ │ │ │ ├── external-plugin-path.test.ts │ │ │ │ ├── external-plugin-path.ts │ │ │ │ ├── external-plugin-runtime.ts │ │ │ │ ├── external-plugin-slots-demo.tsx │ │ │ │ ├── input-demo.tsx │ │ │ │ ├── line-number-demo.tsx │ │ │ │ ├── mouse-demo.tsx │ │ │ │ ├── plugin-slots-demo.tsx │ │ │ │ ├── scroll-demo.tsx │ │ │ │ ├── tab-select-demo.tsx │ │ │ │ ├── text-selection-demo.tsx │ │ │ │ ├── text-style-demo.tsx │ │ │ │ ├── text-truncation-demo.tsx │ │ │ │ ├── textarea-demo.tsx │ │ │ │ ├── textarea-keybindings.ts │ │ │ │ └── textarea-minimal-demo.tsx │ │ │ ├── index.tsx │ │ │ ├── package.json │ │ │ ├── repro-empty-styled-text.tsx │ │ │ ├── repro-filter-list.tsx │ │ │ ├── repro-onSubmit.tsx │ │ │ ├── session.tsx │ │ │ └── tsconfig.json │ │ ├── index.ts │ │ ├── jsx-runtime.d.ts │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── build.ts │ │ │ ├── preload.ts │ │ │ ├── publish.ts │ │ │ ├── runtime-plugin-support.ts │ │ │ └── solid-plugin.ts │ │ ├── src/ │ │ │ ├── elements/ │ │ │ │ ├── extras.ts │ │ │ │ ├── hooks.ts │ │ │ │ ├── index.ts │ │ │ │ └── slot.ts │ │ │ ├── plugins/ │ │ │ │ └── slot.tsx │ │ │ ├── reconciler.ts │ │ │ ├── renderer/ │ │ │ │ ├── index.ts │ │ │ │ ├── universal.d.ts │ │ │ │ └── universal.js │ │ │ ├── time-to-first-draw.tsx │ │ │ ├── types/ │ │ │ │ └── elements.ts │ │ │ └── utils/ │ │ │ ├── id-counter.ts │ │ │ └── log.ts │ │ ├── tests/ │ │ │ ├── __snapshots__/ │ │ │ │ ├── control-flow.test.tsx.snap │ │ │ │ ├── dynamic-collections.test.tsx.snap │ │ │ │ ├── dynamic-portal.test.tsx.snap │ │ │ │ ├── layout.test.tsx.snap │ │ │ │ ├── line-number-debug.test.tsx.snap │ │ │ │ ├── line-number-scrollbox.test.tsx.snap │ │ │ │ └── textarea.test.tsx.snap │ │ │ ├── box.test.tsx │ │ │ ├── control-flow.test.tsx │ │ │ ├── cursor-behavior.test.tsx │ │ │ ├── destroy-crash.test.tsx │ │ │ ├── destroy-race-repro.test.ts │ │ │ ├── destroy-race.fixture.tsx │ │ │ ├── diff.test.tsx │ │ │ ├── dynamic-collections.test.tsx │ │ │ ├── dynamic-portal.test.tsx │ │ │ ├── events.test.tsx │ │ │ ├── layout.test.tsx │ │ │ ├── line-number-scrollbox.test.tsx │ │ │ ├── line-number.test.tsx │ │ │ ├── link.test.tsx │ │ │ ├── runtime-plugin-support-preload.fixture.ts │ │ │ ├── runtime-plugin-support-preload.test.ts │ │ │ ├── runtime-plugin-support.fixture.ts │ │ │ ├── runtime-plugin-support.test.ts │ │ │ ├── scrollbox-cleanchildren.test.tsx │ │ │ ├── scrollbox-content.test.tsx │ │ │ ├── slot.test.tsx │ │ │ ├── solid-plugin.fixture.ts │ │ │ ├── solid-plugin.test.ts │ │ │ ├── sticky-scroll.test.tsx │ │ │ └── textarea.test.tsx │ │ ├── tsconfig.build.json │ │ └── tsconfig.json │ └── web/ │ ├── .gitignore │ ├── astro.config.mjs │ ├── package.json │ ├── scripts/ │ │ ├── test-doc-examples.ts │ │ └── verify-doc-examples.ts │ ├── src/ │ │ ├── components/ │ │ │ └── TuiSurface.astro │ │ ├── content/ │ │ │ ├── config.ts │ │ │ └── docs/ │ │ │ ├── bindings/ │ │ │ │ ├── react.mdx │ │ │ │ └── solid.mdx │ │ │ ├── components/ │ │ │ │ ├── ascii-font.mdx │ │ │ │ ├── box.mdx │ │ │ │ ├── code.mdx │ │ │ │ ├── diff.mdx │ │ │ │ ├── frame-buffer.mdx │ │ │ │ ├── input.mdx │ │ │ │ ├── line-number.mdx │ │ │ │ ├── markdown.mdx │ │ │ │ ├── scrollbar.mdx │ │ │ │ ├── scrollbox.mdx │ │ │ │ ├── select.mdx │ │ │ │ ├── slider.mdx │ │ │ │ ├── tab-select.mdx │ │ │ │ ├── text.mdx │ │ │ │ └── textarea.mdx │ │ │ ├── core-concepts/ │ │ │ │ ├── colors.mdx │ │ │ │ ├── console.mdx │ │ │ │ ├── constructs.mdx │ │ │ │ ├── keyboard.mdx │ │ │ │ ├── layout.mdx │ │ │ │ ├── lifecycle.mdx │ │ │ │ ├── renderables-vs-constructs.mdx │ │ │ │ ├── renderables.mdx │ │ │ │ └── renderer.mdx │ │ │ ├── getting-started.mdx │ │ │ ├── plugins/ │ │ │ │ ├── core.mdx │ │ │ │ ├── react.mdx │ │ │ │ ├── slots.mdx │ │ │ │ └── solid.mdx │ │ │ └── reference/ │ │ │ ├── env-vars.mdx │ │ │ └── tree-sitter.mdx │ │ ├── layouts/ │ │ │ ├── Base.astro │ │ │ └── Docs.astro │ │ ├── pages/ │ │ │ ├── 404.astro │ │ │ ├── docs/ │ │ │ │ └── [...slug].astro │ │ │ └── index.astro │ │ └── styles/ │ │ └── global.css │ └── tsconfig.json └── scripts/ ├── create-snapshot.sh ├── link-opentui-dev.sh ├── pre-publish.ts └── prepare-release.ts