@fairyhunter13/opentui-core 0.1.113 → 0.1.114
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.
- package/dev/keypress-debug-renderer.ts +148 -0
- package/dev/keypress-debug.ts +43 -0
- package/dev/print-env-vars.ts +32 -0
- package/dev/test-tmux-graphics-334.sh +68 -0
- package/dev/thai-debug-test.ts +68 -0
- package/docs/development.md +144 -0
- package/package.json +62 -53
- package/scripts/build.ts +400 -0
- package/scripts/publish.ts +60 -0
- package/src/3d/SpriteResourceManager.ts +286 -0
- package/src/3d/SpriteUtils.ts +70 -0
- package/src/3d/TextureUtils.ts +196 -0
- package/src/3d/ThreeRenderable.ts +197 -0
- package/src/3d/WGPURenderer.ts +294 -0
- package/src/3d/animation/ExplodingSpriteEffect.ts +513 -0
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +429 -0
- package/src/3d/animation/SpriteAnimator.ts +633 -0
- package/src/3d/animation/SpriteParticleGenerator.ts +435 -0
- package/src/3d/canvas.ts +464 -0
- package/src/3d/index.ts +12 -0
- package/src/3d/physics/PlanckPhysicsAdapter.ts +72 -0
- package/src/3d/physics/RapierPhysicsAdapter.ts +66 -0
- package/src/3d/physics/physics-interface.ts +31 -0
- package/src/3d/shaders/supersampling.wgsl +201 -0
- package/src/3d.ts +3 -0
- package/src/NativeSpanFeed.ts +300 -0
- package/src/Renderable.ts +1704 -0
- package/src/__snapshots__/buffer.test.ts.snap +28 -0
- package/src/animation/Timeline.test.ts +2709 -0
- package/src/animation/Timeline.ts +598 -0
- package/src/ansi.ts +18 -0
- package/src/benchmark/attenuation-benchmark.ts +81 -0
- package/src/benchmark/colormatrix-benchmark.ts +128 -0
- package/src/benchmark/gain-benchmark.ts +80 -0
- package/src/benchmark/latest-all-bench-run.json +707 -0
- package/src/benchmark/latest-async-bench-run.json +336 -0
- package/src/benchmark/latest-default-bench-run.json +657 -0
- package/src/benchmark/latest-large-bench-run.json +707 -0
- package/src/benchmark/latest-quick-bench-run.json +207 -0
- package/src/benchmark/markdown-benchmark.ts +1796 -0
- package/src/benchmark/native-span-feed-async-benchmark.ts +355 -0
- package/src/benchmark/native-span-feed-benchmark.md +56 -0
- package/src/benchmark/native-span-feed-benchmark.ts +596 -0
- package/src/benchmark/native-span-feed-compare.ts +280 -0
- package/src/benchmark/renderer-benchmark.ts +754 -0
- package/src/benchmark/text-table-benchmark.ts +948 -0
- package/src/buffer.test.ts +291 -0
- package/src/buffer.ts +554 -0
- package/src/console.test.ts +612 -0
- package/src/console.ts +1254 -0
- package/src/edit-buffer.test.ts +1769 -0
- package/src/edit-buffer.ts +411 -0
- package/src/editor-view.test.ts +1032 -0
- package/src/editor-view.ts +284 -0
- package/src/examples/ascii-font-selection-demo.ts +245 -0
- package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
- package/src/examples/assets/concrete.png +0 -0
- package/src/examples/assets/crate.png +0 -0
- package/src/examples/assets/crate_emissive.png +0 -0
- package/src/examples/assets/forrest_background.png +0 -0
- package/src/examples/assets/hast-example.json +1018 -0
- package/src/examples/assets/heart.png +0 -0
- package/src/examples/assets/main_char_heavy_attack.png +0 -0
- package/src/examples/assets/main_char_idle.png +0 -0
- package/src/examples/assets/main_char_jump_end.png +0 -0
- package/src/examples/assets/main_char_jump_landing.png +0 -0
- package/src/examples/assets/main_char_jump_start.png +0 -0
- package/src/examples/assets/main_char_run_loop.png +0 -0
- package/src/examples/assets/roughness_map.jpg +0 -0
- package/src/examples/build.ts +115 -0
- package/src/examples/code-demo.ts +924 -0
- package/src/examples/console-demo.ts +358 -0
- package/src/examples/core-plugin-slots-demo.ts +759 -0
- package/src/examples/diff-demo.ts +701 -0
- package/src/examples/draggable-three-demo.ts +259 -0
- package/src/examples/editor-demo.ts +322 -0
- package/src/examples/extmarks-demo.ts +196 -0
- package/src/examples/focus-restore-demo.ts +310 -0
- package/src/examples/fonts.ts +245 -0
- package/src/examples/fractal-shader-demo.ts +268 -0
- package/src/examples/framebuffer-demo.ts +674 -0
- package/src/examples/full-unicode-demo.ts +241 -0
- package/src/examples/golden-star-demo.ts +933 -0
- package/src/examples/grayscale-buffer-demo.ts +249 -0
- package/src/examples/hast-syntax-highlighting-demo.ts +129 -0
- package/src/examples/index.ts +926 -0
- package/src/examples/input-demo.ts +377 -0
- package/src/examples/input-select-layout-demo.ts +425 -0
- package/src/examples/install.sh +143 -0
- package/src/examples/keypress-debug-demo.ts +452 -0
- package/src/examples/lib/HexList.ts +122 -0
- package/src/examples/lib/PaletteGrid.ts +125 -0
- package/src/examples/lib/standalone-keys.ts +25 -0
- package/src/examples/lib/tab-controller.ts +243 -0
- package/src/examples/lights-phong-demo.ts +290 -0
- package/src/examples/link-demo.ts +220 -0
- package/src/examples/live-state-demo.ts +480 -0
- package/src/examples/markdown-demo.ts +725 -0
- package/src/examples/mouse-interaction-demo.ts +428 -0
- package/src/examples/nested-zindex-demo.ts +357 -0
- package/src/examples/opacity-example.ts +235 -0
- package/src/examples/opentui-demo.ts +1057 -0
- package/src/examples/physx-planck-2d-demo.ts +623 -0
- package/src/examples/physx-rapier-2d-demo.ts +655 -0
- package/src/examples/relative-positioning-demo.ts +323 -0
- package/src/examples/scroll-example.ts +214 -0
- package/src/examples/scrollbox-mouse-test.ts +112 -0
- package/src/examples/scrollbox-overlay-hit-test.ts +206 -0
- package/src/examples/select-demo.ts +237 -0
- package/src/examples/shader-cube-demo.ts +1015 -0
- package/src/examples/simple-layout-example.ts +591 -0
- package/src/examples/slider-demo.ts +617 -0
- package/src/examples/split-mode-demo.ts +453 -0
- package/src/examples/sprite-animation-demo.ts +443 -0
- package/src/examples/sprite-particle-generator-demo.ts +486 -0
- package/src/examples/static-sprite-demo.ts +193 -0
- package/src/examples/sticky-scroll-example.ts +308 -0
- package/src/examples/styled-text-demo.ts +282 -0
- package/src/examples/tab-select-demo.ts +219 -0
- package/src/examples/terminal-title.ts +29 -0
- package/src/examples/terminal.ts +305 -0
- package/src/examples/text-node-demo.ts +416 -0
- package/src/examples/text-selection-demo.ts +377 -0
- package/src/examples/text-table-demo.ts +503 -0
- package/src/examples/text-truncation-demo.ts +481 -0
- package/src/examples/text-wrap.ts +757 -0
- package/src/examples/texture-loading-demo.ts +259 -0
- package/src/examples/timeline-example.ts +670 -0
- package/src/examples/transparency-demo.ts +400 -0
- package/src/examples/vnode-composition-demo.ts +404 -0
- package/src/examples/wide-grapheme-overlay-demo.ts +280 -0
- package/src/index.ts +24 -0
- package/src/lib/KeyHandler.integration.test.ts +292 -0
- package/src/lib/KeyHandler.stopPropagation.test.ts +289 -0
- package/src/lib/KeyHandler.test.ts +662 -0
- package/src/lib/KeyHandler.ts +222 -0
- package/src/lib/RGBA.test.ts +984 -0
- package/src/lib/RGBA.ts +204 -0
- package/src/lib/ascii.font.ts +330 -0
- package/src/lib/border.test.ts +83 -0
- package/src/lib/border.ts +170 -0
- package/src/lib/bunfs.test.ts +27 -0
- package/src/lib/bunfs.ts +18 -0
- package/src/lib/clipboard.test.ts +41 -0
- package/src/lib/clipboard.ts +47 -0
- package/src/lib/clock.ts +35 -0
- package/src/lib/data-paths.test.ts +133 -0
- package/src/lib/data-paths.ts +109 -0
- package/src/lib/debounce.ts +106 -0
- package/src/lib/detect-links.test.ts +98 -0
- package/src/lib/detect-links.ts +56 -0
- package/src/lib/env.test.ts +228 -0
- package/src/lib/env.ts +209 -0
- package/src/lib/extmarks-history.ts +51 -0
- package/src/lib/extmarks-multiwidth.test.ts +322 -0
- package/src/lib/extmarks.test.ts +3457 -0
- package/src/lib/extmarks.ts +843 -0
- package/src/lib/fonts/block.json +405 -0
- package/src/lib/fonts/grid.json +265 -0
- package/src/lib/fonts/huge.json +741 -0
- package/src/lib/fonts/pallet.json +314 -0
- package/src/lib/fonts/shade.json +591 -0
- package/src/lib/fonts/slick.json +321 -0
- package/src/lib/fonts/tiny.json +69 -0
- package/src/lib/hast-styled-text.ts +59 -0
- package/src/lib/index.ts +21 -0
- package/src/lib/keymapping.test.ts +317 -0
- package/src/lib/keymapping.ts +115 -0
- package/src/lib/objects-in-viewport.test.ts +787 -0
- package/src/lib/objects-in-viewport.ts +153 -0
- package/src/lib/output.capture.ts +58 -0
- package/src/lib/parse.keypress-kitty.protocol.test.ts +340 -0
- package/src/lib/parse.keypress-kitty.test.ts +663 -0
- package/src/lib/parse.keypress-kitty.ts +439 -0
- package/src/lib/parse.keypress.test.ts +1849 -0
- package/src/lib/parse.keypress.ts +397 -0
- package/src/lib/parse.mouse.test.ts +552 -0
- package/src/lib/parse.mouse.ts +232 -0
- package/src/lib/paste.ts +16 -0
- package/src/lib/queue.ts +65 -0
- package/src/lib/renderable.validations.test.ts +87 -0
- package/src/lib/renderable.validations.ts +83 -0
- package/src/lib/scroll-acceleration.ts +98 -0
- package/src/lib/selection.ts +240 -0
- package/src/lib/singleton.ts +28 -0
- package/src/lib/stdin-parser.test.ts +2290 -0
- package/src/lib/stdin-parser.ts +1810 -0
- package/src/lib/styled-text.ts +178 -0
- package/src/lib/terminal-capability-detection.test.ts +202 -0
- package/src/lib/terminal-capability-detection.ts +79 -0
- package/src/lib/terminal-palette.test.ts +878 -0
- package/src/lib/terminal-palette.ts +383 -0
- package/src/lib/tree-sitter/assets/README.md +118 -0
- package/src/lib/tree-sitter/assets/update.ts +334 -0
- package/src/lib/tree-sitter/assets.d.ts +9 -0
- package/src/lib/tree-sitter/cache.test.ts +273 -0
- package/src/lib/tree-sitter/client.test.ts +1165 -0
- package/src/lib/tree-sitter/client.ts +607 -0
- package/src/lib/tree-sitter/default-parsers.ts +86 -0
- package/src/lib/tree-sitter/download-utils.ts +148 -0
- package/src/lib/tree-sitter/index.ts +28 -0
- package/src/lib/tree-sitter/parser.worker.ts +1042 -0
- package/src/lib/tree-sitter/parsers-config.ts +81 -0
- package/src/lib/tree-sitter/resolve-ft.test.ts +55 -0
- package/src/lib/tree-sitter/resolve-ft.ts +189 -0
- package/src/lib/tree-sitter/types.ts +82 -0
- package/src/lib/tree-sitter-styled-text.test.ts +1253 -0
- package/src/lib/tree-sitter-styled-text.ts +306 -0
- package/src/lib/validate-dir-name.ts +55 -0
- package/src/lib/yoga.options.test.ts +628 -0
- package/src/lib/yoga.options.ts +346 -0
- package/src/plugins/core-slot.ts +579 -0
- package/src/plugins/registry.ts +402 -0
- package/src/plugins/types.ts +46 -0
- package/src/post/effects.ts +930 -0
- package/src/post/filters.ts +489 -0
- package/src/post/matrices.ts +288 -0
- package/src/renderables/ASCIIFont.ts +219 -0
- package/src/renderables/Box.test.ts +205 -0
- package/src/renderables/Box.ts +326 -0
- package/src/renderables/Code.test.ts +2062 -0
- package/src/renderables/Code.ts +357 -0
- package/src/renderables/Diff.regression.test.ts +226 -0
- package/src/renderables/Diff.test.ts +3101 -0
- package/src/renderables/Diff.ts +1211 -0
- package/src/renderables/EditBufferRenderable.test.ts +288 -0
- package/src/renderables/EditBufferRenderable.ts +1166 -0
- package/src/renderables/FrameBuffer.ts +47 -0
- package/src/renderables/Input.test.ts +1228 -0
- package/src/renderables/Input.ts +247 -0
- package/src/renderables/LineNumberRenderable.ts +724 -0
- package/src/renderables/Markdown.ts +1393 -0
- package/src/renderables/ScrollBar.ts +422 -0
- package/src/renderables/ScrollBox.ts +883 -0
- package/src/renderables/Select.test.ts +1033 -0
- package/src/renderables/Select.ts +524 -0
- package/src/renderables/Slider.test.ts +456 -0
- package/src/renderables/Slider.ts +342 -0
- package/src/renderables/TabSelect.test.ts +197 -0
- package/src/renderables/TabSelect.ts +455 -0
- package/src/renderables/Text.selection-buffer.test.ts +123 -0
- package/src/renderables/Text.test.ts +2660 -0
- package/src/renderables/Text.ts +147 -0
- package/src/renderables/TextBufferRenderable.ts +518 -0
- package/src/renderables/TextNode.test.ts +1058 -0
- package/src/renderables/TextNode.ts +325 -0
- package/src/renderables/TextTable.test.ts +1421 -0
- package/src/renderables/TextTable.ts +1344 -0
- package/src/renderables/Textarea.ts +430 -0
- package/src/renderables/TimeToFirstDraw.ts +89 -0
- package/src/renderables/__snapshots__/Code.test.ts.snap +13 -0
- package/src/renderables/__snapshots__/Diff.test.ts.snap +785 -0
- package/src/renderables/__snapshots__/Text.test.ts.snap +421 -0
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +215 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +144 -0
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +816 -0
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +1865 -0
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +85 -0
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +242 -0
- package/src/renderables/__tests__/Markdown.test.ts +2518 -0
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +87 -0
- package/src/renderables/__tests__/Textarea.buffer.test.ts +682 -0
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +675 -0
- package/src/renderables/__tests__/Textarea.editing.test.ts +2041 -0
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +35 -0
- package/src/renderables/__tests__/Textarea.events.test.ts +738 -0
- package/src/renderables/__tests__/Textarea.highlights.test.ts +590 -0
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +3149 -0
- package/src/renderables/__tests__/Textarea.paste.test.ts +357 -0
- package/src/renderables/__tests__/Textarea.rendering.test.ts +1866 -0
- package/src/renderables/__tests__/Textarea.scroll.test.ts +733 -0
- package/src/renderables/__tests__/Textarea.selection.test.ts +1590 -0
- package/src/renderables/__tests__/Textarea.stress.test.ts +670 -0
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +383 -0
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +310 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +221 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +89 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +457 -0
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +158 -0
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +387 -0
- package/src/renderables/__tests__/markdown-parser.test.ts +217 -0
- package/src/renderables/__tests__/renderable-test-utils.ts +60 -0
- package/src/renderables/composition/README.md +8 -0
- package/src/renderables/composition/VRenderable.ts +32 -0
- package/src/renderables/composition/constructs.ts +127 -0
- package/src/renderables/composition/vnode.ts +289 -0
- package/src/renderables/index.ts +23 -0
- package/src/renderables/markdown-parser.ts +66 -0
- package/src/renderer.ts +2681 -0
- package/src/runtime-plugin-support.ts +39 -0
- package/src/runtime-plugin.ts +615 -0
- package/src/syntax-style.test.ts +841 -0
- package/src/syntax-style.ts +257 -0
- package/src/testing/README.md +210 -0
- package/src/testing/capture-spans.test.ts +194 -0
- package/src/testing/integration.test.ts +276 -0
- package/src/testing/manual-clock.ts +117 -0
- package/src/testing/mock-keys.test.ts +1378 -0
- package/src/testing/mock-keys.ts +457 -0
- package/src/testing/mock-mouse.test.ts +218 -0
- package/src/testing/mock-mouse.ts +247 -0
- package/src/testing/mock-tree-sitter-client.ts +73 -0
- package/src/testing/spy.ts +13 -0
- package/src/testing/test-recorder.test.ts +415 -0
- package/src/testing/test-recorder.ts +145 -0
- package/src/testing/test-renderer.ts +132 -0
- package/src/testing.ts +7 -0
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +481 -0
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +19 -0
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +29 -0
- package/src/tests/absolute-positioning.snapshot.test.ts +638 -0
- package/src/tests/allocator-stats.test.ts +38 -0
- package/src/tests/destroy-during-render.test.ts +200 -0
- package/src/tests/destroy-on-exit.fixture.ts +36 -0
- package/src/tests/destroy-on-exit.test.ts +41 -0
- package/src/tests/hover-cursor.test.ts +98 -0
- package/src/tests/native-span-feed-async.test.ts +173 -0
- package/src/tests/native-span-feed-close.test.ts +120 -0
- package/src/tests/native-span-feed-coverage.test.ts +227 -0
- package/src/tests/native-span-feed-edge-cases.test.ts +352 -0
- package/src/tests/native-span-feed-use-after-free.test.ts +45 -0
- package/src/tests/opacity.test.ts +123 -0
- package/src/tests/renderable.snapshot.test.ts +524 -0
- package/src/tests/renderable.test.ts +1281 -0
- package/src/tests/renderer.clock.test.ts +158 -0
- package/src/tests/renderer.console-startup.test.ts +185 -0
- package/src/tests/renderer.control.test.ts +425 -0
- package/src/tests/renderer.core-slot-binding.test.ts +952 -0
- package/src/tests/renderer.cursor.test.ts +26 -0
- package/src/tests/renderer.destroy-during-render.test.ts +147 -0
- package/src/tests/renderer.focus-restore.test.ts +257 -0
- package/src/tests/renderer.focus.test.ts +294 -0
- package/src/tests/renderer.idle.test.ts +219 -0
- package/src/tests/renderer.input.test.ts +2237 -0
- package/src/tests/renderer.kitty-flags.test.ts +195 -0
- package/src/tests/renderer.mouse.test.ts +1274 -0
- package/src/tests/renderer.palette.test.ts +629 -0
- package/src/tests/renderer.selection.test.ts +49 -0
- package/src/tests/renderer.slot-registry.test.ts +684 -0
- package/src/tests/renderer.useMouse.test.ts +47 -0
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +76 -0
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +43 -0
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +67 -0
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +72 -0
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +44 -0
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +85 -0
- package/src/tests/runtime-plugin-path-alias.fixture.ts +43 -0
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +65 -0
- package/src/tests/runtime-plugin-support.fixture.ts +11 -0
- package/src/tests/runtime-plugin-support.test.ts +19 -0
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +30 -0
- package/src/tests/runtime-plugin.fixture.ts +40 -0
- package/src/tests/runtime-plugin.test.ts +354 -0
- package/src/tests/scrollbox-culling-bug.test.ts +114 -0
- package/src/tests/scrollbox-hitgrid-resize.test.ts +136 -0
- package/src/tests/scrollbox-hitgrid.test.ts +909 -0
- package/src/tests/scrollbox.test.ts +1530 -0
- package/src/tests/wrap-resize-perf.test.ts +276 -0
- package/src/tests/yoga-setters.test.ts +921 -0
- package/src/text-buffer-view.test.ts +705 -0
- package/src/text-buffer-view.ts +189 -0
- package/src/text-buffer.test.ts +347 -0
- package/src/text-buffer.ts +250 -0
- package/src/types.ts +161 -0
- package/src/utils.ts +88 -0
- package/src/zig/ansi.zig +268 -0
- package/src/zig/bench/README.md +50 -0
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +887 -0
- package/src/zig/bench/edit-buffer_bench.zig +476 -0
- package/src/zig/bench/native-span-feed_bench.zig +100 -0
- package/src/zig/bench/rope-markers_bench.zig +713 -0
- package/src/zig/bench/rope_bench.zig +514 -0
- package/src/zig/bench/styled-text_bench.zig +470 -0
- package/src/zig/bench/text-buffer-coords_bench.zig +362 -0
- package/src/zig/bench/text-buffer-view_bench.zig +459 -0
- package/src/zig/bench/text-chunk-graphemes_bench.zig +273 -0
- package/src/zig/bench/utf8_bench.zig +799 -0
- package/src/zig/bench-utils.zig +431 -0
- package/src/zig/bench.zig +217 -0
- package/src/zig/buffer-methods.zig +211 -0
- package/src/zig/buffer.zig +2281 -0
- package/src/zig/build.zig +289 -0
- package/src/zig/build.zig.zon +16 -0
- package/src/zig/edit-buffer.zig +825 -0
- package/src/zig/editor-view.zig +802 -0
- package/src/zig/event-bus.zig +13 -0
- package/src/zig/event-emitter.zig +65 -0
- package/src/zig/file-logger.zig +92 -0
- package/src/zig/grapheme.zig +599 -0
- package/src/zig/lib.zig +1854 -0
- package/src/zig/link.zig +333 -0
- package/src/zig/logger.zig +43 -0
- package/src/zig/mem-registry.zig +125 -0
- package/src/zig/native-span-feed-bench-lib.zig +7 -0
- package/src/zig/native-span-feed.zig +708 -0
- package/src/zig/renderer.zig +1393 -0
- package/src/zig/rope.zig +1220 -0
- package/src/zig/syntax-style.zig +161 -0
- package/src/zig/terminal.zig +987 -0
- package/src/zig/test.zig +72 -0
- package/src/zig/tests/README.md +18 -0
- package/src/zig/tests/buffer-methods_test.zig +1109 -0
- package/src/zig/tests/buffer_test.zig +2557 -0
- package/src/zig/tests/edit-buffer-history_test.zig +271 -0
- package/src/zig/tests/edit-buffer_test.zig +1689 -0
- package/src/zig/tests/editor-view_test.zig +3299 -0
- package/src/zig/tests/event-emitter_test.zig +249 -0
- package/src/zig/tests/grapheme_test.zig +1304 -0
- package/src/zig/tests/link_test.zig +190 -0
- package/src/zig/tests/mem-registry_test.zig +473 -0
- package/src/zig/tests/memory_leak_regression_test.zig +159 -0
- package/src/zig/tests/native-span-feed_test.zig +1264 -0
- package/src/zig/tests/renderer_test.zig +1017 -0
- package/src/zig/tests/rope-nested_test.zig +712 -0
- package/src/zig/tests/rope_fuzz_test.zig +238 -0
- package/src/zig/tests/rope_test.zig +2362 -0
- package/src/zig/tests/segment-merge.test.zig +148 -0
- package/src/zig/tests/syntax-style_test.zig +557 -0
- package/src/zig/tests/terminal_test.zig +754 -0
- package/src/zig/tests/text-buffer-drawing_test.zig +3237 -0
- package/src/zig/tests/text-buffer-highlights_test.zig +666 -0
- package/src/zig/tests/text-buffer-iterators_test.zig +776 -0
- package/src/zig/tests/text-buffer-segment_test.zig +320 -0
- package/src/zig/tests/text-buffer-selection_test.zig +1035 -0
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +358 -0
- package/src/zig/tests/text-buffer-view_test.zig +3649 -0
- package/src/zig/tests/text-buffer_test.zig +2191 -0
- package/src/zig/tests/unicode-width-map.zon +3909 -0
- package/src/zig/tests/utf8_no_zwj_test.zig +260 -0
- package/src/zig/tests/utf8_test.zig +4057 -0
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +267 -0
- package/src/zig/tests/utf8_wcwidth_test.zig +357 -0
- package/src/zig/tests/word-wrap-editing_test.zig +498 -0
- package/src/zig/tests/wrap-cache-perf_test.zig +113 -0
- package/src/zig/text-buffer-iterators.zig +499 -0
- package/src/zig/text-buffer-segment.zig +404 -0
- package/src/zig/text-buffer-view.zig +1371 -0
- package/src/zig/text-buffer.zig +1180 -0
- package/src/zig/utf8.zig +1948 -0
- package/src/zig/utils.zig +9 -0
- package/src/zig-structs.ts +261 -0
- package/src/zig.ts +3884 -0
- package/tsconfig.build.json +24 -0
- package/tsconfig.json +27 -0
- package/3d/SpriteResourceManager.d.ts +0 -74
- package/3d/SpriteUtils.d.ts +0 -13
- package/3d/TextureUtils.d.ts +0 -24
- package/3d/ThreeRenderable.d.ts +0 -40
- package/3d/WGPURenderer.d.ts +0 -61
- package/3d/animation/ExplodingSpriteEffect.d.ts +0 -71
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +0 -76
- package/3d/animation/SpriteAnimator.d.ts +0 -124
- package/3d/animation/SpriteParticleGenerator.d.ts +0 -62
- package/3d/canvas.d.ts +0 -44
- package/3d/index.d.ts +0 -12
- package/3d/physics/PlanckPhysicsAdapter.d.ts +0 -19
- package/3d/physics/RapierPhysicsAdapter.d.ts +0 -19
- package/3d/physics/physics-interface.d.ts +0 -27
- package/3d.d.ts +0 -2
- package/3d.js +0 -34041
- package/3d.js.map +0 -155
- package/LICENSE +0 -21
- package/NativeSpanFeed.d.ts +0 -41
- package/Renderable.d.ts +0 -334
- package/animation/Timeline.d.ts +0 -126
- package/ansi.d.ts +0 -13
- package/buffer.d.ts +0 -111
- package/console.d.ts +0 -144
- package/edit-buffer.d.ts +0 -98
- package/editor-view.d.ts +0 -73
- package/index-9vwc3fg6.js +0 -12260
- package/index-9vwc3fg6.js.map +0 -42
- package/index-dcj62y8t.js +0 -20614
- package/index-dcj62y8t.js.map +0 -67
- package/index-f7n39gpy.js +0 -411
- package/index-f7n39gpy.js.map +0 -10
- package/index.d.ts +0 -23
- package/index.js +0 -478
- package/index.js.map +0 -9
- package/lib/KeyHandler.d.ts +0 -61
- package/lib/RGBA.d.ts +0 -25
- package/lib/ascii.font.d.ts +0 -508
- package/lib/border.d.ts +0 -51
- package/lib/bunfs.d.ts +0 -7
- package/lib/clipboard.d.ts +0 -17
- package/lib/clock.d.ts +0 -15
- package/lib/data-paths.d.ts +0 -26
- package/lib/debounce.d.ts +0 -42
- package/lib/detect-links.d.ts +0 -6
- package/lib/env.d.ts +0 -42
- package/lib/extmarks-history.d.ts +0 -17
- package/lib/extmarks.d.ts +0 -89
- package/lib/hast-styled-text.d.ts +0 -17
- package/lib/index.d.ts +0 -21
- package/lib/keymapping.d.ts +0 -25
- package/lib/objects-in-viewport.d.ts +0 -24
- package/lib/output.capture.d.ts +0 -24
- package/lib/parse.keypress-kitty.d.ts +0 -2
- package/lib/parse.keypress.d.ts +0 -26
- package/lib/parse.mouse.d.ts +0 -30
- package/lib/paste.d.ts +0 -7
- package/lib/queue.d.ts +0 -15
- package/lib/renderable.validations.d.ts +0 -12
- package/lib/scroll-acceleration.d.ts +0 -43
- package/lib/selection.d.ts +0 -63
- package/lib/singleton.d.ts +0 -7
- package/lib/stdin-parser.d.ts +0 -87
- package/lib/styled-text.d.ts +0 -63
- package/lib/terminal-capability-detection.d.ts +0 -30
- package/lib/terminal-palette.d.ts +0 -50
- package/lib/tree-sitter/assets/update.d.ts +0 -11
- package/lib/tree-sitter/client.d.ts +0 -47
- package/lib/tree-sitter/default-parsers.d.ts +0 -2
- package/lib/tree-sitter/download-utils.d.ts +0 -21
- package/lib/tree-sitter/index.d.ts +0 -8
- package/lib/tree-sitter/parser.worker.d.ts +0 -1
- package/lib/tree-sitter/parsers-config.d.ts +0 -53
- package/lib/tree-sitter/resolve-ft.d.ts +0 -5
- package/lib/tree-sitter/types.d.ts +0 -82
- package/lib/tree-sitter-styled-text.d.ts +0 -14
- package/lib/validate-dir-name.d.ts +0 -1
- package/lib/yoga.options.d.ts +0 -32
- package/parser.worker.js +0 -899
- package/parser.worker.js.map +0 -12
- package/plugins/core-slot.d.ts +0 -72
- package/plugins/registry.d.ts +0 -42
- package/plugins/types.d.ts +0 -34
- package/post/effects.d.ts +0 -147
- package/post/filters.d.ts +0 -65
- package/post/matrices.d.ts +0 -20
- package/renderables/ASCIIFont.d.ts +0 -52
- package/renderables/Box.d.ts +0 -81
- package/renderables/Code.d.ts +0 -78
- package/renderables/Diff.d.ts +0 -142
- package/renderables/EditBufferRenderable.d.ts +0 -237
- package/renderables/FrameBuffer.d.ts +0 -16
- package/renderables/Input.d.ts +0 -67
- package/renderables/LineNumberRenderable.d.ts +0 -78
- package/renderables/Markdown.d.ts +0 -185
- package/renderables/ScrollBar.d.ts +0 -77
- package/renderables/ScrollBox.d.ts +0 -124
- package/renderables/Select.d.ts +0 -115
- package/renderables/Slider.d.ts +0 -47
- package/renderables/TabSelect.d.ts +0 -96
- package/renderables/Text.d.ts +0 -36
- package/renderables/TextBufferRenderable.d.ts +0 -105
- package/renderables/TextNode.d.ts +0 -91
- package/renderables/TextTable.d.ts +0 -140
- package/renderables/Textarea.d.ts +0 -63
- package/renderables/TimeToFirstDraw.d.ts +0 -24
- package/renderables/__tests__/renderable-test-utils.d.ts +0 -12
- package/renderables/composition/VRenderable.d.ts +0 -16
- package/renderables/composition/constructs.d.ts +0 -35
- package/renderables/composition/vnode.d.ts +0 -46
- package/renderables/index.d.ts +0 -23
- package/renderables/markdown-parser.d.ts +0 -10
- package/renderer.d.ts +0 -419
- package/runtime-plugin-support.d.ts +0 -3
- package/runtime-plugin-support.js +0 -29
- package/runtime-plugin-support.js.map +0 -10
- package/runtime-plugin.d.ts +0 -16
- package/runtime-plugin.js +0 -16
- package/runtime-plugin.js.map +0 -9
- package/syntax-style.d.ts +0 -54
- package/testing/manual-clock.d.ts +0 -17
- package/testing/mock-keys.d.ts +0 -81
- package/testing/mock-mouse.d.ts +0 -38
- package/testing/mock-tree-sitter-client.d.ts +0 -23
- package/testing/spy.d.ts +0 -7
- package/testing/test-recorder.d.ts +0 -61
- package/testing/test-renderer.d.ts +0 -23
- package/testing.d.ts +0 -6
- package/testing.js +0 -697
- package/testing.js.map +0 -15
- package/text-buffer-view.d.ts +0 -42
- package/text-buffer.d.ts +0 -67
- package/types.d.ts +0 -139
- package/utils.d.ts +0 -14
- package/zig-structs.d.ts +0 -155
- package/zig.d.ts +0 -353
- /package/{assets → src/lib/tree-sitter/assets}/javascript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/injections.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/zig/highlights.scm +0 -0
- /package/{assets → src/lib/tree-sitter/assets}/zig/tree-sitter-zig.wasm +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Composition Exploration
|
|
2
|
+
|
|
3
|
+
This is a simple exploration of how to compose renderables into a tree.
|
|
4
|
+
|
|
5
|
+
It's not react and not reactive, it's just a way to compose renderables
|
|
6
|
+
and mount them into a parent container.
|
|
7
|
+
|
|
8
|
+
It's a work in progress and not in any way meant to be a replacement for react.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Renderable, type RenderableOptions } from "../../Renderable.js"
|
|
2
|
+
import type { OptimizedBuffer } from "../../buffer.js"
|
|
3
|
+
import type { RenderContext } from "../../types.js"
|
|
4
|
+
|
|
5
|
+
export interface VRenderableOptions extends RenderableOptions<VRenderable> {
|
|
6
|
+
render?: (
|
|
7
|
+
this: VRenderable | VRenderableOptions,
|
|
8
|
+
buffer: OptimizedBuffer,
|
|
9
|
+
deltaTime: number,
|
|
10
|
+
renderable: VRenderable,
|
|
11
|
+
) => void
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* A generic renderable that accepts a custom render function as a prop.
|
|
16
|
+
* This allows functional constructs to specify custom rendering behavior
|
|
17
|
+
* without needing to subclass Renderable.
|
|
18
|
+
*/
|
|
19
|
+
export class VRenderable extends Renderable {
|
|
20
|
+
private options: VRenderableOptions
|
|
21
|
+
|
|
22
|
+
constructor(ctx: RenderContext, options: VRenderableOptions) {
|
|
23
|
+
super(ctx, options)
|
|
24
|
+
this.options = options
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected override renderSelf(buffer: OptimizedBuffer, deltaTime: number): void {
|
|
28
|
+
if (this.options.render) {
|
|
29
|
+
this.options.render.call(this.options, buffer, deltaTime, this)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ASCIIFontRenderable,
|
|
3
|
+
BoxRenderable,
|
|
4
|
+
CodeRenderable,
|
|
5
|
+
InputRenderable,
|
|
6
|
+
ScrollBoxRenderable,
|
|
7
|
+
SelectRenderable,
|
|
8
|
+
TabSelectRenderable,
|
|
9
|
+
TextRenderable,
|
|
10
|
+
VRenderable,
|
|
11
|
+
FrameBufferRenderable,
|
|
12
|
+
type ASCIIFontOptions,
|
|
13
|
+
type BoxOptions,
|
|
14
|
+
type CodeOptions,
|
|
15
|
+
type TextOptions,
|
|
16
|
+
type VRenderableOptions,
|
|
17
|
+
type InputRenderableOptions,
|
|
18
|
+
type ScrollBoxOptions,
|
|
19
|
+
type SelectRenderableOptions,
|
|
20
|
+
type TabSelectRenderableOptions,
|
|
21
|
+
type FrameBufferOptions,
|
|
22
|
+
} from "..//index.js"
|
|
23
|
+
import { TextNodeRenderable, type TextNodeOptions } from "../TextNode.js"
|
|
24
|
+
import { h, type VChild } from "./vnode.js"
|
|
25
|
+
import { TextAttributes } from "../../types.js"
|
|
26
|
+
import type { RGBA } from "../../lib/RGBA.js"
|
|
27
|
+
|
|
28
|
+
export function Generic(props?: VRenderableOptions, ...children: VChild[]) {
|
|
29
|
+
return h(VRenderable, props || {}, ...children)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function Box(props?: BoxOptions, ...children: VChild[]) {
|
|
33
|
+
return h(BoxRenderable, props || {}, ...children)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function Text(props?: TextOptions & { content?: any }, ...children: VChild[] | TextNodeRenderable[]) {
|
|
37
|
+
return h(TextRenderable, props || {}, ...(children as VChild[]))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function ASCIIFont(props?: ASCIIFontOptions, ...children: VChild[]) {
|
|
41
|
+
return h(ASCIIFontRenderable, props || {}, ...children)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function Input(props?: InputRenderableOptions, ...children: VChild[]) {
|
|
45
|
+
return h(InputRenderable, props || {}, ...children)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function Select(props?: SelectRenderableOptions, ...children: VChild[]) {
|
|
49
|
+
return h(SelectRenderable, props || {}, ...children)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function TabSelect(props?: TabSelectRenderableOptions, ...children: VChild[]) {
|
|
53
|
+
return h(TabSelectRenderable, props || {}, ...children)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function FrameBuffer(props: FrameBufferOptions, ...children: VChild[]) {
|
|
57
|
+
return h(FrameBufferRenderable, props, ...children)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function Code(props: CodeOptions, ...children: VChild[]) {
|
|
61
|
+
return h(CodeRenderable, props, ...children)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function ScrollBox(props?: ScrollBoxOptions, ...children: VChild[]) {
|
|
65
|
+
return h(ScrollBoxRenderable, props || {}, ...children)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
interface StyledTextProps extends Omit<TextNodeOptions, "attributes"> {
|
|
69
|
+
attributes?: number
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function StyledText(props?: StyledTextProps, ...children: (string | TextNodeRenderable)[]): TextNodeRenderable {
|
|
73
|
+
const styledProps = props as StyledTextProps
|
|
74
|
+
const textNodeOptions: TextNodeOptions = {
|
|
75
|
+
...styledProps,
|
|
76
|
+
attributes: styledProps?.attributes ?? 0,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const textNode = new TextNodeRenderable(textNodeOptions)
|
|
80
|
+
|
|
81
|
+
for (const child of children) {
|
|
82
|
+
textNode.add(child)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return textNode
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Text styling convenience functions - these create TextNodeRenderable instances that can be nested and stacked
|
|
89
|
+
export const vstyles = {
|
|
90
|
+
// Basic text styles
|
|
91
|
+
bold: (...children: (string | TextNodeRenderable)[]) => StyledText({ attributes: TextAttributes.BOLD }, ...children),
|
|
92
|
+
italic: (...children: (string | TextNodeRenderable)[]) =>
|
|
93
|
+
StyledText({ attributes: TextAttributes.ITALIC }, ...children),
|
|
94
|
+
underline: (...children: (string | TextNodeRenderable)[]) =>
|
|
95
|
+
StyledText({ attributes: TextAttributes.UNDERLINE }, ...children),
|
|
96
|
+
dim: (...children: (string | TextNodeRenderable)[]) => StyledText({ attributes: TextAttributes.DIM }, ...children),
|
|
97
|
+
blink: (...children: (string | TextNodeRenderable)[]) =>
|
|
98
|
+
StyledText({ attributes: TextAttributes.BLINK }, ...children),
|
|
99
|
+
inverse: (...children: (string | TextNodeRenderable)[]) =>
|
|
100
|
+
StyledText({ attributes: TextAttributes.INVERSE }, ...children),
|
|
101
|
+
hidden: (...children: (string | TextNodeRenderable)[]) =>
|
|
102
|
+
StyledText({ attributes: TextAttributes.HIDDEN }, ...children),
|
|
103
|
+
strikethrough: (...children: (string | TextNodeRenderable)[]) =>
|
|
104
|
+
StyledText({ attributes: TextAttributes.STRIKETHROUGH }, ...children),
|
|
105
|
+
|
|
106
|
+
// Combined styles
|
|
107
|
+
boldItalic: (...children: (string | TextNodeRenderable)[]) =>
|
|
108
|
+
StyledText({ attributes: TextAttributes.BOLD | TextAttributes.ITALIC }, ...children),
|
|
109
|
+
boldUnderline: (...children: (string | TextNodeRenderable)[]) =>
|
|
110
|
+
StyledText({ attributes: TextAttributes.BOLD | TextAttributes.UNDERLINE }, ...children),
|
|
111
|
+
italicUnderline: (...children: (string | TextNodeRenderable)[]) =>
|
|
112
|
+
StyledText({ attributes: TextAttributes.ITALIC | TextAttributes.UNDERLINE }, ...children),
|
|
113
|
+
boldItalicUnderline: (...children: (string | TextNodeRenderable)[]) =>
|
|
114
|
+
StyledText({ attributes: TextAttributes.BOLD | TextAttributes.ITALIC | TextAttributes.UNDERLINE }, ...children),
|
|
115
|
+
|
|
116
|
+
// Color helpers
|
|
117
|
+
color: (color: string | RGBA, ...children: (string | TextNodeRenderable)[]) => StyledText({ fg: color }, ...children),
|
|
118
|
+
bgColor: (bgColor: string | RGBA, ...children: (string | TextNodeRenderable)[]) =>
|
|
119
|
+
StyledText({ bg: bgColor }, ...children),
|
|
120
|
+
fg: (color: string | RGBA, ...children: (string | TextNodeRenderable)[]) => StyledText({ fg: color }, ...children),
|
|
121
|
+
bg: (bgColor: string | RGBA, ...children: (string | TextNodeRenderable)[]) =>
|
|
122
|
+
StyledText({ bg: bgColor }, ...children),
|
|
123
|
+
|
|
124
|
+
// Custom styling function
|
|
125
|
+
styled: (attributes: number = 0, ...children: (string | TextNodeRenderable)[]) =>
|
|
126
|
+
StyledText({ attributes }, ...children),
|
|
127
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { isRenderable, Renderable, type RenderableOptions } from "../../Renderable.js"
|
|
2
|
+
import type { RenderContext } from "../../types.js"
|
|
3
|
+
import util from "node:util"
|
|
4
|
+
|
|
5
|
+
export type VChild = VNode | Renderable | VChild[] | null | undefined | false
|
|
6
|
+
|
|
7
|
+
export interface PendingCall {
|
|
8
|
+
method: string
|
|
9
|
+
args: any[]
|
|
10
|
+
isProperty?: boolean
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const BrandedVNode: unique symbol = Symbol.for("@opentui/core/VNode")
|
|
14
|
+
|
|
15
|
+
export interface VNode<P = any, C = VChild[]> {
|
|
16
|
+
[BrandedVNode]: true
|
|
17
|
+
type: Construct<P>
|
|
18
|
+
props?: P
|
|
19
|
+
children?: C
|
|
20
|
+
__delegateMap?: Record<string, string>
|
|
21
|
+
__pendingCalls?: PendingCall[]
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Type that represents a VNode with Renderable methods available for chaining
|
|
25
|
+
export type ProxiedVNode<TCtor extends RenderableConstructor<any>> = VNode<
|
|
26
|
+
TCtor extends RenderableConstructor<infer P> ? P : any
|
|
27
|
+
> & {
|
|
28
|
+
[K in keyof InstanceType<TCtor>]: InstanceType<TCtor>[K] extends (...args: infer Args) => any
|
|
29
|
+
? (...args: Args) => ProxiedVNode<TCtor>
|
|
30
|
+
: InstanceType<TCtor>[K]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface RenderableConstructor<P extends RenderableOptions<any> = RenderableOptions<any>> {
|
|
34
|
+
new (ctx: RenderContext, options: P): Renderable
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type FunctionalConstruct<P = any> = (props: P, children?: VChild[]) => VNode
|
|
38
|
+
|
|
39
|
+
export type Construct<P = any> =
|
|
40
|
+
| RenderableConstructor<P extends RenderableOptions<any> ? P : never>
|
|
41
|
+
| FunctionalConstruct<P>
|
|
42
|
+
|
|
43
|
+
function isRenderableConstructor<P extends RenderableOptions<any> = RenderableOptions<any>>(
|
|
44
|
+
value: any,
|
|
45
|
+
): value is RenderableConstructor<P> {
|
|
46
|
+
return typeof value === "function" && value.prototype && Renderable.prototype.isPrototypeOf(value.prototype)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function flattenChildren(children: VChild[]): VChild[] {
|
|
50
|
+
const result: VChild[] = []
|
|
51
|
+
for (const child of children) {
|
|
52
|
+
if (Array.isArray(child)) {
|
|
53
|
+
result.push(...flattenChildren(child))
|
|
54
|
+
} else if (child !== null && child !== undefined && child !== false) {
|
|
55
|
+
result.push(child)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return result
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Overloads for proper typing
|
|
62
|
+
export function h<TCtor extends RenderableConstructor<any>>(
|
|
63
|
+
type: TCtor,
|
|
64
|
+
props?: TCtor extends RenderableConstructor<infer P> ? P : never,
|
|
65
|
+
...children: VChild[]
|
|
66
|
+
): ProxiedVNode<TCtor>
|
|
67
|
+
export function h<P>(type: FunctionalConstruct<P>, props?: P, ...children: VChild[]): VNode<P>
|
|
68
|
+
export function h<P>(type: Construct<P>, props?: P, ...children: VChild[]): VNode<P> | ProxiedVNode<any>
|
|
69
|
+
export function h<P>(type: Construct<P>, props?: P, ...children: VChild[]): any {
|
|
70
|
+
if (typeof type !== "function") {
|
|
71
|
+
throw new TypeError("h() received an invalid vnode type")
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const vnode: VNode<P> = {
|
|
75
|
+
[BrandedVNode]: true,
|
|
76
|
+
type,
|
|
77
|
+
props,
|
|
78
|
+
children: flattenChildren(children),
|
|
79
|
+
__pendingCalls: [],
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (isRenderableConstructor(type)) {
|
|
83
|
+
return new Proxy(vnode, {
|
|
84
|
+
get(target, prop, receiver) {
|
|
85
|
+
// Return VNode properties directly
|
|
86
|
+
if (prop in target) {
|
|
87
|
+
return Reflect.get(target, prop, receiver)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (typeof prop === "string") {
|
|
91
|
+
const prototype = type.prototype
|
|
92
|
+
const hasMethod =
|
|
93
|
+
prototype &&
|
|
94
|
+
(typeof prototype[prop] === "function" ||
|
|
95
|
+
Object.getOwnPropertyDescriptor(prototype, prop) ||
|
|
96
|
+
Object.getOwnPropertyDescriptor(Object.getPrototypeOf(prototype), prop))
|
|
97
|
+
|
|
98
|
+
if (hasMethod) {
|
|
99
|
+
return (...args: any[]) => {
|
|
100
|
+
target.__pendingCalls = target.__pendingCalls || []
|
|
101
|
+
target.__pendingCalls.push({ method: prop, args })
|
|
102
|
+
return target
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return Reflect.get(target, prop, receiver)
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
set(target, prop, value, receiver) {
|
|
111
|
+
if (typeof prop === "string" && isRenderableConstructor(type)) {
|
|
112
|
+
const prototype = type.prototype
|
|
113
|
+
const descriptor =
|
|
114
|
+
Object.getOwnPropertyDescriptor(prototype, prop) ||
|
|
115
|
+
Object.getOwnPropertyDescriptor(Object.getPrototypeOf(prototype), prop)
|
|
116
|
+
|
|
117
|
+
if (descriptor && descriptor.set) {
|
|
118
|
+
target.__pendingCalls = target.__pendingCalls || []
|
|
119
|
+
target.__pendingCalls.push({ method: prop, args: [value], isProperty: true })
|
|
120
|
+
return true
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return Reflect.set(target, prop, value, receiver)
|
|
125
|
+
},
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return vnode
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function isVNode(node: any): node is VNode {
|
|
133
|
+
return node && node[BrandedVNode]
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function maybeMakeRenderable(
|
|
137
|
+
ctx: RenderContext,
|
|
138
|
+
node: Renderable | VNode<any, any[]> | unknown,
|
|
139
|
+
): Renderable | null {
|
|
140
|
+
if (isRenderable(node)) return node
|
|
141
|
+
if (isVNode(node)) return instantiate(ctx, node)
|
|
142
|
+
if (process.env.NODE_ENV !== "production") {
|
|
143
|
+
console.warn("maybeMakeRenderable received an invalid node", util.inspect(node, { depth: 2 }))
|
|
144
|
+
}
|
|
145
|
+
return null
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function wrapWithDelegates<T extends InstanceType<RenderableConstructor>>(
|
|
149
|
+
instance: T,
|
|
150
|
+
delegateMap: Record<string, string> | undefined,
|
|
151
|
+
): T {
|
|
152
|
+
if (!delegateMap || Object.keys(delegateMap).length === 0) return instance
|
|
153
|
+
|
|
154
|
+
const descendantCache = new Map<string, Renderable | undefined>()
|
|
155
|
+
|
|
156
|
+
const getDescendant = (id: string): Renderable | undefined => {
|
|
157
|
+
if (descendantCache.has(id)) {
|
|
158
|
+
const cached = descendantCache.get(id)
|
|
159
|
+
if (cached !== undefined) {
|
|
160
|
+
return cached
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const descendant = (instance as Renderable).findDescendantById(id)
|
|
164
|
+
if (descendant) {
|
|
165
|
+
descendantCache.set(id, descendant)
|
|
166
|
+
}
|
|
167
|
+
return descendant
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const proxy = new Proxy(instance as any, {
|
|
171
|
+
get(target, prop, receiver) {
|
|
172
|
+
if (typeof prop === "string" && delegateMap[prop]) {
|
|
173
|
+
const host = getDescendant(delegateMap[prop])
|
|
174
|
+
if (host) {
|
|
175
|
+
const value = (host as any)[prop]
|
|
176
|
+
if (typeof value === "function") {
|
|
177
|
+
return value.bind(host)
|
|
178
|
+
}
|
|
179
|
+
return value
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return Reflect.get(target, prop, receiver)
|
|
183
|
+
},
|
|
184
|
+
set(target, prop, value, receiver) {
|
|
185
|
+
if (typeof prop === "string" && delegateMap[prop]) {
|
|
186
|
+
const host = getDescendant(delegateMap[prop])
|
|
187
|
+
if (host) {
|
|
188
|
+
return Reflect.set(host as any, prop, value)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return Reflect.set(target, prop, value, receiver)
|
|
192
|
+
},
|
|
193
|
+
})
|
|
194
|
+
return proxy
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export type InstantiateFn<NodeType extends VNode | Renderable> = Renderable & { __node?: NodeType }
|
|
198
|
+
|
|
199
|
+
export function instantiate<NodeType extends VNode | Renderable>(
|
|
200
|
+
ctx: RenderContext,
|
|
201
|
+
node: NodeType,
|
|
202
|
+
): InstantiateFn<NodeType> {
|
|
203
|
+
if (isRenderable(node)) return node
|
|
204
|
+
|
|
205
|
+
if (!node || typeof node !== "object") {
|
|
206
|
+
throw new TypeError("mount() received an invalid vnode")
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const vnode = node as VNode
|
|
210
|
+
const { type, props } = vnode
|
|
211
|
+
const children = flattenChildren(vnode.children || [])
|
|
212
|
+
const delegateMap = (vnode as any).__delegateMap as Record<string, string> | undefined
|
|
213
|
+
|
|
214
|
+
if (isRenderableConstructor(type)) {
|
|
215
|
+
const instance = new type(ctx, (props || {}) as any)
|
|
216
|
+
|
|
217
|
+
for (const child of children) {
|
|
218
|
+
if (isRenderable(child)) {
|
|
219
|
+
instance.add(child)
|
|
220
|
+
} else {
|
|
221
|
+
const mounted = instantiate(ctx, child as NodeType)
|
|
222
|
+
instance.add(mounted)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const delegatedInstance = wrapWithDelegates(instance, delegateMap)
|
|
227
|
+
|
|
228
|
+
const pendingCalls = (vnode as any).__pendingCalls as PendingCall[] | undefined
|
|
229
|
+
if (pendingCalls) {
|
|
230
|
+
for (const call of pendingCalls) {
|
|
231
|
+
if (call.isProperty) {
|
|
232
|
+
;(delegatedInstance as any)[call.method] = call.args[0]
|
|
233
|
+
} else {
|
|
234
|
+
;(delegatedInstance as any)[call.method].apply(delegatedInstance, call.args)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return delegatedInstance
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Functional construct: resolve to a concrete vnode and mount it
|
|
243
|
+
const resolved = (type as FunctionalConstruct)(props || ({} as any), children)
|
|
244
|
+
const inst = instantiate(ctx, resolved)
|
|
245
|
+
|
|
246
|
+
return wrapWithDelegates(inst, delegateMap) as InstantiateFn<NodeType>
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
export type DelegateMap<T> = Partial<Record<keyof T, string>>
|
|
250
|
+
|
|
251
|
+
export type ValidateShape<Given, AllowedKeys> = {
|
|
252
|
+
[K in keyof Given]: K extends keyof AllowedKeys ? NonNullable<Given[K]> : never
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
type InferNode<T> = T extends InstantiateFn<infer U> ? U : never
|
|
256
|
+
|
|
257
|
+
export function delegate<
|
|
258
|
+
Factory extends InstantiateFn<any>,
|
|
259
|
+
InnerNode extends InferNode<Factory>,
|
|
260
|
+
TargetMap extends Record<keyof InnerNode, string>,
|
|
261
|
+
const Mapping extends Partial<TargetMap>,
|
|
262
|
+
>(mapping: ValidateShape<Mapping, TargetMap>, vnode: Factory): Renderable
|
|
263
|
+
|
|
264
|
+
export function delegate<
|
|
265
|
+
ConstructorType extends RenderableConstructor<any>,
|
|
266
|
+
TargetMap extends Record<keyof InstanceType<ConstructorType>, string>,
|
|
267
|
+
const Mapping extends Partial<TargetMap>,
|
|
268
|
+
>(mapping: ValidateShape<Mapping, TargetMap>, vnode: ProxiedVNode<ConstructorType>): ProxiedVNode<ConstructorType>
|
|
269
|
+
|
|
270
|
+
export function delegate<
|
|
271
|
+
ConstructorType extends RenderableConstructor<any>,
|
|
272
|
+
const Mapping extends DelegateMap<InstanceType<ConstructorType>>,
|
|
273
|
+
>(mapping: ValidateShape<Mapping, string>, vnode: VNode & { type: ConstructorType }): VNode
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Controlled delegation that routes selected properties/methods
|
|
277
|
+
* to a descendant renderable identified by ID.
|
|
278
|
+
*/
|
|
279
|
+
export function delegate<NodeType extends VNode | Renderable | InstantiateFn<any>>(
|
|
280
|
+
mapping: Record<string, string>,
|
|
281
|
+
vnode: NodeType,
|
|
282
|
+
): VNode | Renderable {
|
|
283
|
+
if (isRenderable(vnode)) {
|
|
284
|
+
return wrapWithDelegates(vnode, mapping)
|
|
285
|
+
}
|
|
286
|
+
if (!vnode || typeof vnode !== "object") return vnode
|
|
287
|
+
vnode.__delegateMap = { ...(vnode.__delegateMap || {}), ...mapping }
|
|
288
|
+
return vnode
|
|
289
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from "./ASCIIFont.js"
|
|
2
|
+
export * from "./Box.js"
|
|
3
|
+
export * from "./Code.js"
|
|
4
|
+
export * from "./composition/constructs.js"
|
|
5
|
+
export * from "./composition/VRenderable.js"
|
|
6
|
+
export * from "./composition/vnode.js"
|
|
7
|
+
export * from "./Diff.js"
|
|
8
|
+
export * from "./EditBufferRenderable.js"
|
|
9
|
+
export * from "./FrameBuffer.js"
|
|
10
|
+
export * from "./Input.js"
|
|
11
|
+
export * from "./LineNumberRenderable.js"
|
|
12
|
+
export * from "./Markdown.js"
|
|
13
|
+
export * from "./ScrollBar.js"
|
|
14
|
+
export * from "./ScrollBox.js"
|
|
15
|
+
export * from "./Select.js"
|
|
16
|
+
export * from "./Slider.js"
|
|
17
|
+
export * from "./TextTable.js"
|
|
18
|
+
export * from "./TabSelect.js"
|
|
19
|
+
export * from "./Text.js"
|
|
20
|
+
export * from "./TimeToFirstDraw.js"
|
|
21
|
+
export * from "./TextBufferRenderable.js"
|
|
22
|
+
export * from "./TextNode.js"
|
|
23
|
+
export * from "./Textarea.js"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { Lexer, type MarkedToken } from "marked"
|
|
2
|
+
|
|
3
|
+
export interface ParseState {
|
|
4
|
+
content: string
|
|
5
|
+
tokens: MarkedToken[]
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Incrementally parse markdown, reusing unchanged tokens from previous parse.
|
|
10
|
+
* Compares token.raw at each offset - matching tokens keep same object reference.
|
|
11
|
+
*/
|
|
12
|
+
export function parseMarkdownIncremental(
|
|
13
|
+
newContent: string,
|
|
14
|
+
prevState: ParseState | null,
|
|
15
|
+
trailingUnstable: number = 2,
|
|
16
|
+
): ParseState {
|
|
17
|
+
if (!prevState || prevState.tokens.length === 0) {
|
|
18
|
+
try {
|
|
19
|
+
const tokens = Lexer.lex(newContent, { gfm: true }) as MarkedToken[]
|
|
20
|
+
return { content: newContent, tokens }
|
|
21
|
+
} catch {
|
|
22
|
+
return { content: newContent, tokens: [] }
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Find how many tokens from start are unchanged
|
|
27
|
+
let offset = 0
|
|
28
|
+
let reuseCount = 0
|
|
29
|
+
|
|
30
|
+
for (const token of prevState.tokens) {
|
|
31
|
+
const tokenLength = token.raw.length
|
|
32
|
+
if (offset + tokenLength <= newContent.length && newContent.startsWith(token.raw, offset)) {
|
|
33
|
+
reuseCount++
|
|
34
|
+
offset += tokenLength
|
|
35
|
+
} else {
|
|
36
|
+
break
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Keep last N tokens unstable (e.g. "# Hello" might become "# Hello World")
|
|
41
|
+
reuseCount = Math.max(0, reuseCount - trailingUnstable)
|
|
42
|
+
|
|
43
|
+
offset = 0
|
|
44
|
+
for (let i = 0; i < reuseCount; i++) {
|
|
45
|
+
offset += prevState.tokens[i].raw.length
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const stableTokens = prevState.tokens.slice(0, reuseCount)
|
|
49
|
+
const remainingContent = newContent.slice(offset)
|
|
50
|
+
|
|
51
|
+
if (!remainingContent) {
|
|
52
|
+
return { content: newContent, tokens: stableTokens }
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const newTokens = Lexer.lex(remainingContent, { gfm: true }) as MarkedToken[]
|
|
57
|
+
return { content: newContent, tokens: [...stableTokens, ...newTokens] }
|
|
58
|
+
} catch {
|
|
59
|
+
try {
|
|
60
|
+
const fullTokens = Lexer.lex(newContent, { gfm: true }) as MarkedToken[]
|
|
61
|
+
return { content: newContent, tokens: fullTokens }
|
|
62
|
+
} catch {
|
|
63
|
+
return { content: newContent, tokens: [] }
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|